Commit 39695224 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (209 commits)
  [SCSI] fix oops during scsi scanning
  [SCSI] libsrp: fix memory leak in srp_ring_free()
  [SCSI] libiscsi, bnx2i: make bound ep check common
  [SCSI] libiscsi: add completion function for drivers that do not need pdu processing
  [SCSI] scsi_dh_rdac: changes for rdac debug logging
  [SCSI] scsi_dh_rdac: changes to collect the rdac debug information during the initialization
  [SCSI] scsi_dh_rdac: move the init code from rdac_activate to rdac_bus_attach
  [SCSI] sg: fix oops in the error path in sg_build_indirect()
  [SCSI] mptsas : Bump version to 3.04.12
  [SCSI] mptsas : FW event thread and scsi mid layer deadlock in SYNCHRONIZE CACHE command
  [SCSI] mptsas : Send DID_NO_CONNECT for pending IOs of removed device
  [SCSI] mptsas : PAE Kernel more than 4 GB kernel panic
  [SCSI] mptsas : NULL pointer on big endian systems causing Expander not to tear off
  [SCSI] mptsas : Sanity check for phyinfo is added
  [SCSI] scsi_dh_rdac: Add support for Sun StorageTek ST2500, ST2510 and ST2530
  [SCSI] pmcraid: PMC-Sierra MaxRAID driver to support 6Gb/s SAS RAID controller
  [SCSI] qla2xxx: Update version number to 8.03.01-k6.
  [SCSI] qla2xxx: Properly delete rports attached to a vport.
  [SCSI] qla2xxx: Correct various NPIV issues.
  [SCSI] qla2xxx: Correct qla2x00_eh_wait_on_command() to wait correctly.
  ...
parents a9bbd210 ea038f63
...@@ -4009,6 +4009,14 @@ S: Maintained ...@@ -4009,6 +4009,14 @@ S: Maintained
F: drivers/block/pktcdvd.c F: drivers/block/pktcdvd.c
F: include/linux/pktcdvd.h F: include/linux/pktcdvd.h
PMC SIERRA MaxRAID DRIVER
P: Anil Ravindranath
M: anil_ravindranath@pmc-sierra.com
L: linux-scsi@vger.kernel.org
W: http://www.pmc-sierra.com/
S: Supported
F: drivers/scsi/pmcraid.*
POSIX CLOCKS and TIMERS POSIX CLOCKS and TIMERS
M: Thomas Gleixner <tglx@linutronix.de> M: Thomas Gleixner <tglx@linutronix.de>
S: Supported S: Supported
...@@ -4447,7 +4455,7 @@ F: drivers/scsi/sg.c ...@@ -4447,7 +4455,7 @@ F: drivers/scsi/sg.c
F: include/scsi/sg.h F: include/scsi/sg.h
SCSI SUBSYSTEM SCSI SUBSYSTEM
M: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> M: "James E.J. Bottomley" <James.Bottomley@suse.de>
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
......
...@@ -88,6 +88,14 @@ int get_sync_clock(unsigned long long *clock); ...@@ -88,6 +88,14 @@ int get_sync_clock(unsigned long long *clock);
void init_cpu_timer(void); void init_cpu_timer(void);
unsigned long long monotonic_clock(void); unsigned long long monotonic_clock(void);
void tod_to_timeval(__u64, struct timespec *);
static inline
void stck_to_timespec(unsigned long long stck, struct timespec *ts)
{
tod_to_timeval(stck - TOD_UNIX_EPOCH, ts);
}
extern u64 sched_clock_base_cc; extern u64 sched_clock_base_cc;
/** /**
......
...@@ -63,8 +63,6 @@ typedef struct ...@@ -63,8 +63,6 @@ typedef struct
} debug_sprintf_entry_t; } debug_sprintf_entry_t;
extern void tod_to_timeval(uint64_t todval, struct timespec *xtime);
/* internal function prototyes */ /* internal function prototyes */
static int debug_init(void); static int debug_init(void);
...@@ -1450,17 +1448,13 @@ debug_dflt_header_fn(debug_info_t * id, struct debug_view *view, ...@@ -1450,17 +1448,13 @@ debug_dflt_header_fn(debug_info_t * id, struct debug_view *view,
int area, debug_entry_t * entry, char *out_buf) int area, debug_entry_t * entry, char *out_buf)
{ {
struct timespec time_spec; struct timespec time_spec;
unsigned long long time;
char *except_str; char *except_str;
unsigned long caller; unsigned long caller;
int rc = 0; int rc = 0;
unsigned int level; unsigned int level;
level = entry->id.fields.level; level = entry->id.fields.level;
time = entry->id.stck; stck_to_timespec(entry->id.stck, &time_spec);
/* adjust todclock to 1970 */
time -= 0x8126d60e46000000LL - (0x3c26700LL * 1000000 * 4096);
tod_to_timeval(time, &time_spec);
if (entry->id.fields.exception) if (entry->id.fields.exception)
except_str = "*"; except_str = "*";
......
...@@ -91,6 +91,7 @@ void tod_to_timeval(__u64 todval, struct timespec *xtime) ...@@ -91,6 +91,7 @@ void tod_to_timeval(__u64 todval, struct timespec *xtime)
todval -= (sec * 1000000) << 12; todval -= (sec * 1000000) << 12;
xtime->tv_nsec = ((todval * 1000) >> 12); xtime->tv_nsec = ((todval * 1000) >> 12);
} }
EXPORT_SYMBOL(tod_to_timeval);
void clock_comparator_work(void) void clock_comparator_work(void)
{ {
......
...@@ -64,6 +64,7 @@ struct multipath { ...@@ -64,6 +64,7 @@ struct multipath {
spinlock_t lock; spinlock_t lock;
const char *hw_handler_name; const char *hw_handler_name;
char *hw_handler_params;
unsigned nr_priority_groups; unsigned nr_priority_groups;
struct list_head priority_groups; struct list_head priority_groups;
unsigned pg_init_required; /* pg_init needs calling? */ unsigned pg_init_required; /* pg_init needs calling? */
...@@ -219,6 +220,7 @@ static void free_multipath(struct multipath *m) ...@@ -219,6 +220,7 @@ static void free_multipath(struct multipath *m)
} }
kfree(m->hw_handler_name); kfree(m->hw_handler_name);
kfree(m->hw_handler_params);
mempool_destroy(m->mpio_pool); mempool_destroy(m->mpio_pool);
kfree(m); kfree(m);
} }
...@@ -615,6 +617,17 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps, ...@@ -615,6 +617,17 @@ static struct pgpath *parse_path(struct arg_set *as, struct path_selector *ps,
dm_put_device(ti, p->path.dev); dm_put_device(ti, p->path.dev);
goto bad; goto bad;
} }
if (m->hw_handler_params) {
r = scsi_dh_set_params(q, m->hw_handler_params);
if (r < 0) {
ti->error = "unable to set hardware "
"handler parameters";
scsi_dh_detach(q);
dm_put_device(ti, p->path.dev);
goto bad;
}
}
} }
r = ps->type->add_path(ps, &p->path, as->argc, as->argv, &ti->error); r = ps->type->add_path(ps, &p->path, as->argc, as->argv, &ti->error);
...@@ -705,6 +718,7 @@ static struct priority_group *parse_priority_group(struct arg_set *as, ...@@ -705,6 +718,7 @@ static struct priority_group *parse_priority_group(struct arg_set *as,
static int parse_hw_handler(struct arg_set *as, struct multipath *m) static int parse_hw_handler(struct arg_set *as, struct multipath *m)
{ {
unsigned hw_argc; unsigned hw_argc;
int ret;
struct dm_target *ti = m->ti; struct dm_target *ti = m->ti;
static struct param _params[] = { static struct param _params[] = {
...@@ -726,17 +740,33 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m) ...@@ -726,17 +740,33 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m)
request_module("scsi_dh_%s", m->hw_handler_name); request_module("scsi_dh_%s", m->hw_handler_name);
if (scsi_dh_handler_exist(m->hw_handler_name) == 0) { if (scsi_dh_handler_exist(m->hw_handler_name) == 0) {
ti->error = "unknown hardware handler type"; ti->error = "unknown hardware handler type";
kfree(m->hw_handler_name); ret = -EINVAL;
m->hw_handler_name = NULL; goto fail;
return -EINVAL;
} }
if (hw_argc > 1) if (hw_argc > 1) {
DMWARN("Ignoring user-specified arguments for " char *p;
"hardware handler \"%s\"", m->hw_handler_name); int i, j, len = 4;
for (i = 0; i <= hw_argc - 2; i++)
len += strlen(as->argv[i]) + 1;
p = m->hw_handler_params = kzalloc(len, GFP_KERNEL);
if (!p) {
ti->error = "memory allocation failed";
ret = -ENOMEM;
goto fail;
}
j = sprintf(p, "%d", hw_argc - 1);
for (i = 0, p+=j+1; i <= hw_argc - 2; i++, p+=j+1)
j = sprintf(p, "%s", as->argv[i]);
}
consume(as, hw_argc - 1); consume(as, hw_argc - 1);
return 0; return 0;
fail:
kfree(m->hw_handler_name);
m->hw_handler_name = NULL;
return ret;
} }
static int parse_features(struct arg_set *as, struct multipath *m) static int parse_features(struct arg_set *as, struct multipath *m)
......
...@@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr) ...@@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
{ {
SGESimple64_t *pSge = (SGESimple64_t *) pAddr; SGESimple64_t *pSge = (SGESimple64_t *) pAddr;
pSge->Address.Low = cpu_to_le32 pSge->Address.Low = cpu_to_le32
(lower_32_bits((unsigned long)(dma_addr))); (lower_32_bits(dma_addr));
pSge->Address.High = cpu_to_le32 pSge->Address.High = cpu_to_le32
(upper_32_bits((unsigned long)dma_addr)); (upper_32_bits(dma_addr));
pSge->FlagsLength = cpu_to_le32 pSge->FlagsLength = cpu_to_le32
((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING)); ((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING));
} }
...@@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr) ...@@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
u32 tmp; u32 tmp;
pSge->Address.Low = cpu_to_le32 pSge->Address.Low = cpu_to_le32
(lower_32_bits((unsigned long)(dma_addr))); (lower_32_bits(dma_addr));
tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); tmp = (u32)(upper_32_bits(dma_addr));
/* /*
* 1078 errata workaround for the 36GB limitation * 1078 errata workaround for the 36GB limitation
...@@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr) ...@@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr)
pChain->NextChainOffset = next; pChain->NextChainOffset = next;
pChain->Address.Low = cpu_to_le32(tmp); pChain->Address.Low = cpu_to_le32(tmp);
tmp = (u32)(upper_32_bits((unsigned long)dma_addr)); tmp = (u32)(upper_32_bits(dma_addr));
pChain->Address.High = cpu_to_le32(tmp); pChain->Address.High = cpu_to_le32(tmp);
} }
...@@ -1297,12 +1297,8 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init) ...@@ -1297,12 +1297,8 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init)
psge = (char *)&ioc_init->HostPageBufferSGE; psge = (char *)&ioc_init->HostPageBufferSGE;
flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT | flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
MPI_SGE_FLAGS_SYSTEM_ADDRESS | MPI_SGE_FLAGS_SYSTEM_ADDRESS |
MPI_SGE_FLAGS_32_BIT_ADDRESSING |
MPI_SGE_FLAGS_HOST_TO_IOC | MPI_SGE_FLAGS_HOST_TO_IOC |
MPI_SGE_FLAGS_END_OF_BUFFER; MPI_SGE_FLAGS_END_OF_BUFFER;
if (sizeof(dma_addr_t) == sizeof(u64)) {
flags_length |= MPI_SGE_FLAGS_64_BIT_ADDRESSING;
}
flags_length = flags_length << MPI_SGE_FLAGS_SHIFT; flags_length = flags_length << MPI_SGE_FLAGS_SHIFT;
flags_length |= ioc->HostPageBuffer_sz; flags_length |= ioc->HostPageBuffer_sz;
ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma); ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma);
...@@ -2224,8 +2220,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) ...@@ -2224,8 +2220,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
int hard; int hard;
int rc=0; int rc=0;
int ii; int ii;
u8 cb_idx;
int handlers;
int ret = 0; int ret = 0;
int reset_alt_ioc_active = 0; int reset_alt_ioc_active = 0;
int irq_allocated = 0; int irq_allocated = 0;
...@@ -2548,34 +2542,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) ...@@ -2548,34 +2542,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
mpt_get_manufacturing_pg_0(ioc); mpt_get_manufacturing_pg_0(ioc);
} }
/*
* Call each currently registered protocol IOC reset handler
* with post-reset indication.
* NOTE: If we're doing _IOC_BRINGUP, there can be no
* MptResetHandlers[] registered yet.
*/
if (hard_reset_done) {
rc = handlers = 0;
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
if ((ret == 0) && MptResetHandlers[cb_idx]) {
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Calling IOC post_reset handler #%d\n",
ioc->name, cb_idx));
rc += mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);
handlers++;
}
if (alt_ioc_ready && MptResetHandlers[cb_idx]) {
drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Calling IOC post_reset handler #%d\n",
ioc->alt_ioc->name, cb_idx));
rc += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET);
handlers++;
}
}
/* FIXME? Examine results here? */
}
out: out:
if ((ret != 0) && irq_allocated) { if ((ret != 0) && irq_allocated) {
free_irq(ioc->pci_irq, ioc); free_irq(ioc->pci_irq, ioc);
...@@ -3938,6 +3904,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) ...@@ -3938,6 +3904,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
int count = 0; int count = 0;
u32 diag1val = 0; u32 diag1val = 0;
MpiFwHeader_t *cached_fw; /* Pointer to FW */ MpiFwHeader_t *cached_fw; /* Pointer to FW */
u8 cb_idx;
/* Clear any existing interrupts */ /* Clear any existing interrupts */
CHIPREG_WRITE32(&ioc->chip->IntStatus, 0); CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
...@@ -3956,6 +3923,18 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) ...@@ -3956,6 +3923,18 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
else else
mdelay(1); mdelay(1);
/*
* Call each currently registered protocol IOC reset handler
* with pre-reset indication.
* NOTE: If we're doing _IOC_BRINGUP, there can be no
* MptResetHandlers[] registered yet.
*/
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
if (MptResetHandlers[cb_idx])
(*(MptResetHandlers[cb_idx]))(ioc,
MPT_IOC_PRE_RESET);
}
for (count = 0; count < 60; count ++) { for (count = 0; count < 60; count ++) {
doorbell = CHIPREG_READ32(&ioc->chip->Doorbell); doorbell = CHIPREG_READ32(&ioc->chip->Doorbell);
doorbell &= MPI_IOC_STATE_MASK; doorbell &= MPI_IOC_STATE_MASK;
...@@ -4052,25 +4031,15 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag) ...@@ -4052,25 +4031,15 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
* NOTE: If we're doing _IOC_BRINGUP, there can be no * NOTE: If we're doing _IOC_BRINGUP, there can be no
* MptResetHandlers[] registered yet. * MptResetHandlers[] registered yet.
*/ */
{ for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
u8 cb_idx; if (MptResetHandlers[cb_idx]) {
int r = 0; mpt_signal_reset(cb_idx,
ioc, MPT_IOC_PRE_RESET);
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) { if (ioc->alt_ioc) {
if (MptResetHandlers[cb_idx]) { mpt_signal_reset(cb_idx,
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT ioc->alt_ioc, MPT_IOC_PRE_RESET);
"Calling IOC pre_reset handler #%d\n",
ioc->name, cb_idx));
r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET);
if (ioc->alt_ioc) {
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Calling alt-%s pre_reset handler #%d\n",
ioc->name, ioc->alt_ioc->name, cb_idx));
r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET);
}
} }
} }
/* FIXME? Examine results here? */
} }
if (ioc->cached_fw) if (ioc->cached_fw)
...@@ -6956,7 +6925,7 @@ EXPORT_SYMBOL(mpt_halt_firmware); ...@@ -6956,7 +6925,7 @@ EXPORT_SYMBOL(mpt_halt_firmware);
int int
mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
{ {
int rc; int rc;
u8 cb_idx; u8 cb_idx;
unsigned long flags; unsigned long flags;
unsigned long time_count; unsigned long time_count;
...@@ -6982,8 +6951,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) ...@@ -6982,8 +6951,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
ioc->alt_ioc->ioc_reset_in_progress = 1; ioc->alt_ioc->ioc_reset_in_progress = 1;
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
/* FIXME: If do_ioc_recovery fails, repeat....
*/
/* The SCSI driver needs to adjust timeouts on all current /* The SCSI driver needs to adjust timeouts on all current
* commands prior to the diagnostic reset being issued. * commands prior to the diagnostic reset being issued.
...@@ -7020,6 +6987,15 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag) ...@@ -7020,6 +6987,15 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
} }
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags); spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
if (MptResetHandlers[cb_idx]) {
mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);
if (ioc->alt_ioc)
mpt_signal_reset(cb_idx,
ioc->alt_ioc, MPT_IOC_POST_RESET);
}
}
dtmprintk(ioc, dtmprintk(ioc,
printk(MYIOC_s_DEBUG_FMT printk(MYIOC_s_DEBUG_FMT
"HardResetHandler: completed (%d seconds): %s\n", ioc->name, "HardResetHandler: completed (%d seconds): %s\n", ioc->name,
......
...@@ -76,8 +76,8 @@ ...@@ -76,8 +76,8 @@
#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
#endif #endif
#define MPT_LINUX_VERSION_COMMON "3.04.10" #define MPT_LINUX_VERSION_COMMON "3.04.12"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.12"
#define WHAT_MAGIC_STRING "@" "(" "#" ")" #define WHAT_MAGIC_STRING "@" "(" "#" ")"
#define show_mptmod_ver(s,ver) \ #define show_mptmod_ver(s,ver) \
...@@ -157,8 +157,9 @@ ...@@ -157,8 +157,9 @@
/* /*
* Try to keep these at 2^N-1 * Try to keep these at 2^N-1
*/ */
#define MPT_FC_CAN_QUEUE 127 #define MPT_FC_CAN_QUEUE 1024
#define MPT_SCSI_CAN_QUEUE 127 #define MPT_SCSI_CAN_QUEUE 127
#define MPT_SAS_CAN_QUEUE 127
/* /*
* Set the MAX_SGE value based on user input. * Set the MAX_SGE value based on user input.
...@@ -879,23 +880,9 @@ typedef enum { ...@@ -879,23 +880,9 @@ typedef enum {
typedef struct _MPT_SCSI_HOST { typedef struct _MPT_SCSI_HOST {
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
int port;
u32 pad0;
MPT_LOCAL_REPLY *pLocal; /* used for internal commands */
struct timer_list timer;
/* Pool of memory for holding SCpnts before doing
* OS callbacks. freeQ is the free pool.
*/
u8 negoNvram; /* DV disabled, nego NVRAM */
u8 pad1;
u8 rsvd[2];
MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */
struct scsi_cmnd *abortSCpnt;
MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */
ushort sel_timeout[MPT_MAX_FC_DEVICES]; ushort sel_timeout[MPT_MAX_FC_DEVICES];
char *info_kbuf; char *info_kbuf;
long last_queue_full; long last_queue_full;
u16 tm_iocstatus;
u16 spi_pending; u16 spi_pending;
struct list_head target_reset_list; struct list_head target_reset_list;
} MPT_SCSI_HOST; } MPT_SCSI_HOST;
......
...@@ -1288,25 +1288,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1288,25 +1288,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, ioc->ScsiLookup)); ioc->name, ioc->ScsiLookup));
/* Clear the TM flags
*/
hd->abortSCpnt = NULL;
/* Clear the pointer used to store
* single-threaded commands, i.e., those
* issued during a bus scan, dv and
* configuration pages.
*/
hd->cmdPtr = NULL;
/* Initialize this SCSI Hosts' timers
* To use, set the timer expires field
* and add_timer
*/
init_timer(&hd->timer);
hd->timer.data = (unsigned long) hd;
hd->timer.function = mptscsih_timer_expired;
hd->last_queue_full = 0; hd->last_queue_full = 0;
sh->transportt = mptfc_transport_template; sh->transportt = mptfc_transport_template;
......
...@@ -72,6 +72,7 @@ ...@@ -72,6 +72,7 @@
*/ */
#define MPTSAS_RAID_CHANNEL 1 #define MPTSAS_RAID_CHANNEL 1
#define SAS_CONFIG_PAGE_TIMEOUT 30
MODULE_AUTHOR(MODULEAUTHOR); MODULE_AUTHOR(MODULEAUTHOR);
MODULE_DESCRIPTION(my_NAME); MODULE_DESCRIPTION(my_NAME);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -324,7 +325,6 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc) ...@@ -324,7 +325,6 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc)
{ {
struct fw_event_work *fw_event, *next; struct fw_event_work *fw_event, *next;
struct mptsas_target_reset_event *target_reset_list, *n; struct mptsas_target_reset_event *target_reset_list, *n;
u8 flush_q;
MPT_SCSI_HOST *hd = shost_priv(ioc->sh); MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
/* flush the target_reset_list */ /* flush the target_reset_list */
...@@ -344,15 +344,10 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc) ...@@ -344,15 +344,10 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc)
!ioc->fw_event_q || in_interrupt()) !ioc->fw_event_q || in_interrupt())
return; return;
flush_q = 0;
list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) { list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) {
if (cancel_delayed_work(&fw_event->work)) if (cancel_delayed_work(&fw_event->work))
mptsas_free_fw_event(ioc, fw_event); mptsas_free_fw_event(ioc, fw_event);
else
flush_q = 1;
} }
if (flush_q)
flush_workqueue(ioc->fw_event_q);
} }
...@@ -661,7 +656,7 @@ mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc, ...@@ -661,7 +656,7 @@ mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc,
cfg.pageAddr = starget->id; cfg.pageAddr = starget->id;
cfg.cfghdr.hdr = &hdr; cfg.cfghdr.hdr = &hdr;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
if (mpt_config(ioc, &cfg) != 0) if (mpt_config(ioc, &cfg) != 0)
goto out; goto out;
...@@ -851,7 +846,13 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) ...@@ -851,7 +846,13 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
port_details->num_phys--; port_details->num_phys--;
port_details->phy_bitmask &= ~ (1 << phy_info->phy_id); port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo)); memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
sas_port_delete_phy(port_details->port, phy_info->phy); if (phy_info->phy) {
devtprintk(ioc, dev_printk(KERN_DEBUG,
&phy_info->phy->dev, MYIOC_s_FMT
"delete phy %d, phy-obj (0x%p)\n", ioc->name,
phy_info->phy_id, phy_info->phy));
sas_port_delete_phy(port_details->port, phy_info->phy);
}
phy_info->port_details = NULL; phy_info->port_details = NULL;
} }
...@@ -1272,7 +1273,6 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) ...@@ -1272,7 +1273,6 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
} }
mptsas_cleanup_fw_event_q(ioc); mptsas_cleanup_fw_event_q(ioc);
mptsas_queue_rescan(ioc); mptsas_queue_rescan(ioc);
mptsas_fw_event_on(ioc);
break; break;
default: default:
break; break;
...@@ -1318,7 +1318,7 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure, ...@@ -1318,7 +1318,7 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
cfg.pageAddr = form + form_specific; cfg.pageAddr = form + form_specific;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
if (error) if (error)
...@@ -1592,6 +1592,7 @@ mptsas_firmware_event_work(struct work_struct *work) ...@@ -1592,6 +1592,7 @@ mptsas_firmware_event_work(struct work_struct *work)
mptsas_scan_sas_topology(ioc); mptsas_scan_sas_topology(ioc);
ioc->in_rescan = 0; ioc->in_rescan = 0;
mptsas_free_fw_event(ioc, fw_event); mptsas_free_fw_event(ioc, fw_event);
mptsas_fw_event_on(ioc);
return; return;
} }
...@@ -1891,7 +1892,7 @@ static struct scsi_host_template mptsas_driver_template = { ...@@ -1891,7 +1892,7 @@ static struct scsi_host_template mptsas_driver_template = {
.eh_bus_reset_handler = mptscsih_bus_reset, .eh_bus_reset_handler = mptscsih_bus_reset,
.eh_host_reset_handler = mptscsih_host_reset, .eh_host_reset_handler = mptscsih_host_reset,
.bios_param = mptscsih_bios_param, .bios_param = mptscsih_bios_param,
.can_queue = MPT_FC_CAN_QUEUE, .can_queue = MPT_SAS_CAN_QUEUE,
.this_id = -1, .this_id = -1,
.sg_tablesize = MPT_SCSI_SG_DEPTH, .sg_tablesize = MPT_SCSI_SG_DEPTH,
.max_sectors = 8192, .max_sectors = 8192,
...@@ -1926,7 +1927,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy) ...@@ -1926,7 +1927,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy)
cfg.pageAddr = phy->identify.phy_identifier; cfg.pageAddr = phy->identify.phy_identifier;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
if (error) if (error)
...@@ -2278,7 +2279,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) ...@@ -2278,7 +2279,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
cfg.pageAddr = 0; cfg.pageAddr = 0;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
if (error) if (error)
...@@ -2349,7 +2350,7 @@ mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc) ...@@ -2349,7 +2350,7 @@ mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc)
cfg.cfghdr.ehdr = &hdr; cfg.cfghdr.ehdr = &hdr;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED; cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT; cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION; cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION;
...@@ -2411,7 +2412,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, ...@@ -2411,7 +2412,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
cfg.cfghdr.ehdr = &hdr; cfg.cfghdr.ehdr = &hdr;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
/* Get Phy Pg 0 for each Phy. */ /* Get Phy Pg 0 for each Phy. */
cfg.physAddr = -1; cfg.physAddr = -1;
...@@ -2479,7 +2480,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, ...@@ -2479,7 +2480,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
cfg.physAddr = -1; cfg.physAddr = -1;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
memset(device_info, 0, sizeof(struct mptsas_devinfo)); memset(device_info, 0, sizeof(struct mptsas_devinfo));
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
...@@ -2554,7 +2555,7 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, ...@@ -2554,7 +2555,7 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
cfg.pageAddr = form + form_specific; cfg.pageAddr = form + form_specific;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
memset(port_info, 0, sizeof(struct mptsas_portinfo)); memset(port_info, 0, sizeof(struct mptsas_portinfo));
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
...@@ -2635,7 +2636,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, ...@@ -2635,7 +2636,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
cfg.pageAddr = form + form_specific; cfg.pageAddr = form + form_specific;
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
cfg.dir = 0; /* read */ cfg.dir = 0; /* read */
cfg.timeout = 10; cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
if (error) if (error)
...@@ -3307,6 +3308,7 @@ mptsas_send_expander_event(struct fw_event_work *fw_event) ...@@ -3307,6 +3308,7 @@ mptsas_send_expander_event(struct fw_event_work *fw_event)
expander_data = (MpiEventDataSasExpanderStatusChange_t *) expander_data = (MpiEventDataSasExpanderStatusChange_t *)
fw_event->event_data; fw_event->event_data;
memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64)); memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64));
sas_address = le64_to_cpu(sas_address);
port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address); port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address);
if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) { if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) {
...@@ -4760,10 +4762,9 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4760,10 +4762,9 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/* set 16 byte cdb's */ /* set 16 byte cdb's */
sh->max_cmd_len = 16; sh->max_cmd_len = 16;
sh->can_queue = min_t(int, ioc->req_depth - 10, sh->can_queue);
sh->max_id = ioc->pfacts[0].PortSCSIID; sh->max_id = -1;
sh->max_lun = max_lun; sh->max_lun = max_lun;
sh->transportt = mptsas_transport_template; sh->transportt = mptsas_transport_template;
/* Required entry. /* Required entry.
...@@ -4821,25 +4822,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -4821,25 +4822,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, ioc->ScsiLookup)); ioc->name, ioc->ScsiLookup));
/* Clear the TM flags
*/
hd->abortSCpnt = NULL;
/* Clear the pointer used to store
* single-threaded commands, i.e., those
* issued during a bus scan, dv and
* configuration pages.
*/
hd->cmdPtr = NULL;
/* Initialize this SCSI Hosts' timers
* To use, set the timer expires field
* and add_timer
*/
init_timer(&hd->timer);
hd->timer.data = (unsigned long) hd;
hd->timer.function = mptscsih_timer_expired;
ioc->sas_data.ptClear = mpt_pt_clear; ioc->sas_data.ptClear = mpt_pt_clear;
hd->last_queue_full = 0; hd->last_queue_full = 0;
......
...@@ -628,6 +628,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -628,6 +628,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
return 1; return 1;
} }
if (ioc->bus_type == SAS) {
VirtDevice *vdevice = sc->device->hostdata;
if (!vdevice || !vdevice->vtarget ||
vdevice->vtarget->deleted) {
sc->result = DID_NO_CONNECT << 16;
goto out;
}
}
sc->host_scribble = NULL; sc->host_scribble = NULL;
sc->result = DID_OK << 16; /* Set default reply as OK */ sc->result = DID_OK << 16; /* Set default reply as OK */
pScsiReq = (SCSIIORequest_t *) mf; pScsiReq = (SCSIIORequest_t *) mf;
...@@ -689,6 +699,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -689,6 +699,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
switch(status) { switch(status) {
case MPI_IOCSTATUS_BUSY: /* 0x0002 */ case MPI_IOCSTATUS_BUSY: /* 0x0002 */
case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */
/* CHECKME! /* CHECKME!
* Maybe: DRIVER_BUSY | SUGGEST_RETRY | DID_SOFT_ERROR (retry) * Maybe: DRIVER_BUSY | SUGGEST_RETRY | DID_SOFT_ERROR (retry)
* But not: DID_BUS_BUSY lest one risk * But not: DID_BUS_BUSY lest one risk
...@@ -872,7 +883,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -872,7 +883,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */ case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */
case MPI_IOCSTATUS_INTERNAL_ERROR: /* 0x0004 */ case MPI_IOCSTATUS_INTERNAL_ERROR: /* 0x0004 */
case MPI_IOCSTATUS_RESERVED: /* 0x0005 */ case MPI_IOCSTATUS_RESERVED: /* 0x0005 */
case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */
case MPI_IOCSTATUS_INVALID_FIELD: /* 0x0007 */ case MPI_IOCSTATUS_INVALID_FIELD: /* 0x0007 */
case MPI_IOCSTATUS_INVALID_STATE: /* 0x0008 */ case MPI_IOCSTATUS_INVALID_STATE: /* 0x0008 */
case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */ case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
...@@ -892,7 +902,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -892,7 +902,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
#endif #endif
} /* end of address reply case */ } /* end of address reply case */
out:
/* Unmap the DMA buffers, if any. */ /* Unmap the DMA buffers, if any. */
scsi_dma_unmap(sc); scsi_dma_unmap(sc);
...@@ -1729,9 +1739,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) ...@@ -1729,9 +1739,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
*/ */
mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx); mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx);
ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext; ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext;
hd->abortSCpnt = SCpnt;
retval = mptscsih_IssueTaskMgmt(hd, retval = mptscsih_IssueTaskMgmt(hd,
MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK, MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
vdevice->vtarget->channel, vdevice->vtarget->channel,
...@@ -2293,7 +2300,10 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth) ...@@ -2293,7 +2300,10 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
else else
max_depth = MPT_SCSI_CMD_PER_DEV_LOW; max_depth = MPT_SCSI_CMD_PER_DEV_LOW;
} else } else
max_depth = MPT_SCSI_CMD_PER_DEV_HIGH; max_depth = ioc->sh->can_queue;
if (!sdev->tagged_supported)
max_depth = 1;
if (qdepth > max_depth) if (qdepth > max_depth)
qdepth = max_depth; qdepth = max_depth;
...@@ -2627,50 +2637,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, ...@@ -2627,50 +2637,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
return 1; return 1;
} }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
/* mptscsih_timer_expired - Call back for timer process.
* Used only for dv functionality.
* @data: Pointer to MPT_SCSI_HOST recast as an unsigned long
*
*/
void
mptscsih_timer_expired(unsigned long data)
{
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data;
MPT_ADAPTER *ioc = hd->ioc;
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", ioc->name, hd->cmdPtr));
if (hd->cmdPtr) {
MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr;
if (cmd->Function == MPI_FUNCTION_SCSI_IO_REQUEST) {
/* Desire to issue a task management request here.
* TM requests MUST be single threaded.
* If old eh code and no TM current, issue request.
* If new eh code, do nothing. Wait for OS cmd timeout
* for bus reset.
*/
} else {
/* Perform a FW reload */
if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) {
printk(MYIOC_s_WARN_FMT "Firmware Reload FAILED!\n", ioc->name);
}
}
} else {
/* This should NEVER happen */
printk(MYIOC_s_WARN_FMT "Null cmdPtr!!!!\n", ioc->name);
}
/* No more processing.
* TM call will generate an interrupt for SCSI TM Management.
* The FW will reply to all outstanding commands, callback will finish cleanup.
* Hard reset clean-up will free all resources.
*/
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", ioc->name));
return;
}
/** /**
* mptscsih_get_completion_code - * mptscsih_get_completion_code -
...@@ -3265,6 +3231,5 @@ EXPORT_SYMBOL(mptscsih_scandv_complete); ...@@ -3265,6 +3231,5 @@ EXPORT_SYMBOL(mptscsih_scandv_complete);
EXPORT_SYMBOL(mptscsih_event_process); EXPORT_SYMBOL(mptscsih_event_process);
EXPORT_SYMBOL(mptscsih_ioc_reset); EXPORT_SYMBOL(mptscsih_ioc_reset);
EXPORT_SYMBOL(mptscsih_change_queue_depth); EXPORT_SYMBOL(mptscsih_change_queue_depth);
EXPORT_SYMBOL(mptscsih_timer_expired);
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
...@@ -129,7 +129,6 @@ extern int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRA ...@@ -129,7 +129,6 @@ extern int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRA
extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply); extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset); extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth); extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth);
extern void mptscsih_timer_expired(unsigned long data);
extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id); extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id);
extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id); extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id);
extern struct device_attribute *mptscsih_host_attrs[]; extern struct device_attribute *mptscsih_host_attrs[];
......
...@@ -1472,28 +1472,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1472,28 +1472,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, ioc->ScsiLookup)); ioc->name, ioc->ScsiLookup));
/* Clear the TM flags
*/
hd->abortSCpnt = NULL;
/* Clear the pointer used to store
* single-threaded commands, i.e., those
* issued during a bus scan, dv and
* configuration pages.
*/
hd->cmdPtr = NULL;
/* Initialize this SCSI Hosts' timers
* To use, set the timer expires field
* and add_timer
*/
init_timer(&hd->timer);
hd->timer.data = (unsigned long) hd;
hd->timer.function = mptscsih_timer_expired;
ioc->spi_data.Saf_Te = mpt_saf_te; ioc->spi_data.Saf_Te = mpt_saf_te;
hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"saf_te %x\n", "saf_te %x\n",
ioc->name, ioc->name,
......
...@@ -33,24 +33,44 @@ static DEFINE_MUTEX(container_list_lock); ...@@ -33,24 +33,44 @@ static DEFINE_MUTEX(container_list_lock);
static struct class enclosure_class; static struct class enclosure_class;
/** /**
* enclosure_find - find an enclosure given a device * enclosure_find - find an enclosure given a parent device
* @dev: the device to find for * @dev: the parent to match against
* @start: Optional enclosure device to start from (NULL if none)
* *
* Looks through the list of registered enclosures to see * Looks through the list of registered enclosures to find all those
* if it can find a match for a device. Returns NULL if no * with @dev as a parent. Returns NULL if no enclosure is
* enclosure is found. Obtains a reference to the enclosure class * found. @start can be used as a starting point to obtain multiple
* device which must be released with device_put(). * enclosures per parent (should begin with NULL and then be set to
* each returned enclosure device). Obtains a reference to the
* enclosure class device which must be released with device_put().
* If @start is not NULL, a reference must be taken on it which is
* released before returning (this allows a loop through all
* enclosures to exit with only the reference on the enclosure of
* interest held). Note that the @dev may correspond to the actual
* device housing the enclosure, in which case no iteration via @start
* is required.
*/ */
struct enclosure_device *enclosure_find(struct device *dev) struct enclosure_device *enclosure_find(struct device *dev,
struct enclosure_device *start)
{ {
struct enclosure_device *edev; struct enclosure_device *edev;
mutex_lock(&container_list_lock); mutex_lock(&container_list_lock);
list_for_each_entry(edev, &container_list, node) { edev = list_prepare_entry(start, &container_list, node);
if (edev->edev.parent == dev) { if (start)
get_device(&edev->edev); put_device(&start->edev);
mutex_unlock(&container_list_lock);
return edev; list_for_each_entry_continue(edev, &container_list, node) {
struct device *parent = edev->edev.parent;
/* parent might not be immediate, so iterate up to
* the root of the tree if necessary */
while (parent) {
if (parent == dev) {
get_device(&edev->edev);
mutex_unlock(&container_list_lock);
return edev;
}
parent = parent->parent;
} }
} }
mutex_unlock(&container_list_lock); mutex_unlock(&container_list_lock);
...@@ -295,6 +315,9 @@ int enclosure_add_device(struct enclosure_device *edev, int component, ...@@ -295,6 +315,9 @@ int enclosure_add_device(struct enclosure_device *edev, int component,
cdev = &edev->component[component]; cdev = &edev->component[component];
if (cdev->dev == dev)
return -EEXIST;
if (cdev->dev) if (cdev->dev)
enclosure_remove_links(cdev); enclosure_remove_links(cdev);
...@@ -312,19 +335,25 @@ EXPORT_SYMBOL_GPL(enclosure_add_device); ...@@ -312,19 +335,25 @@ EXPORT_SYMBOL_GPL(enclosure_add_device);
* Returns zero on success or an error. * Returns zero on success or an error.
* *
*/ */
int enclosure_remove_device(struct enclosure_device *edev, int component) int enclosure_remove_device(struct enclosure_device *edev, struct device *dev)
{ {
struct enclosure_component *cdev; struct enclosure_component *cdev;
int i;
if (!edev || component >= edev->components) if (!edev || !dev)
return -EINVAL; return -EINVAL;
cdev = &edev->component[component]; for (i = 0; i < edev->components; i++) {
cdev = &edev->component[i];
device_del(&cdev->cdev); if (cdev->dev == dev) {
put_device(cdev->dev); enclosure_remove_links(cdev);
cdev->dev = NULL; device_del(&cdev->cdev);
return device_add(&cdev->cdev); put_device(dev);
cdev->dev = NULL;
return device_add(&cdev->cdev);
}
}
return -ENODEV;
} }
EXPORT_SYMBOL_GPL(enclosure_remove_device); EXPORT_SYMBOL_GPL(enclosure_remove_device);
......
This diff is collapsed.
...@@ -18,12 +18,15 @@ static int zfcp_ccw_suspend(struct ccw_device *cdev) ...@@ -18,12 +18,15 @@ static int zfcp_ccw_suspend(struct ccw_device *cdev)
{ {
struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev); struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev);
down(&zfcp_data.config_sema); if (!adapter)
return 0;
mutex_lock(&zfcp_data.config_mutex);
zfcp_erp_adapter_shutdown(adapter, 0, "ccsusp1", NULL); zfcp_erp_adapter_shutdown(adapter, 0, "ccsusp1", NULL);
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
up(&zfcp_data.config_sema); mutex_unlock(&zfcp_data.config_mutex);
return 0; return 0;
} }
...@@ -33,6 +36,9 @@ static int zfcp_ccw_activate(struct ccw_device *cdev) ...@@ -33,6 +36,9 @@ static int zfcp_ccw_activate(struct ccw_device *cdev)
{ {
struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev); struct zfcp_adapter *adapter = dev_get_drvdata(&cdev->dev);
if (!adapter)
return 0;
zfcp_erp_modify_adapter_status(adapter, "ccresu1", NULL, zfcp_erp_modify_adapter_status(adapter, "ccresu1", NULL,
ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
...@@ -63,25 +69,14 @@ int zfcp_ccw_priv_sch(struct zfcp_adapter *adapter) ...@@ -63,25 +69,14 @@ int zfcp_ccw_priv_sch(struct zfcp_adapter *adapter)
* zfcp_ccw_probe - probe function of zfcp driver * zfcp_ccw_probe - probe function of zfcp driver
* @ccw_device: pointer to belonging ccw device * @ccw_device: pointer to belonging ccw device
* *
* This function gets called by the common i/o layer and sets up the initial * This function gets called by the common i/o layer for each FCP
* data structures for each fcp adapter, which was detected by the system. * device found on the current system. This is only a stub to make cio
* Also the sysfs files for this adapter will be created by this function. * work: To only allocate adapter resources for devices actually used,
* In addition the nameserver port will be added to the ports of the adapter * the allocation is deferred to the first call to ccw_set_online.
* and its sysfs representation will be created too.
*/ */
static int zfcp_ccw_probe(struct ccw_device *ccw_device) static int zfcp_ccw_probe(struct ccw_device *ccw_device)
{ {
int retval = 0; return 0;
down(&zfcp_data.config_sema);
if (zfcp_adapter_enqueue(ccw_device)) {
dev_err(&ccw_device->dev,
"Setting up data structures for the "
"FCP adapter failed\n");
retval = -EINVAL;
}
up(&zfcp_data.config_sema);
return retval;
} }
/** /**
...@@ -102,8 +97,11 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device) ...@@ -102,8 +97,11 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
LIST_HEAD(port_remove_lh); LIST_HEAD(port_remove_lh);
ccw_device_set_offline(ccw_device); ccw_device_set_offline(ccw_device);
down(&zfcp_data.config_sema);
mutex_lock(&zfcp_data.config_mutex);
adapter = dev_get_drvdata(&ccw_device->dev); adapter = dev_get_drvdata(&ccw_device->dev);
if (!adapter)
goto out;
write_lock_irq(&zfcp_data.config_lock); write_lock_irq(&zfcp_data.config_lock);
list_for_each_entry_safe(port, p, &adapter->port_list_head, list) { list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
...@@ -129,29 +127,41 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device) ...@@ -129,29 +127,41 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0); wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
zfcp_adapter_dequeue(adapter); zfcp_adapter_dequeue(adapter);
up(&zfcp_data.config_sema); out:
mutex_unlock(&zfcp_data.config_mutex);
} }
/** /**
* zfcp_ccw_set_online - set_online function of zfcp driver * zfcp_ccw_set_online - set_online function of zfcp driver
* @ccw_device: pointer to belonging ccw device * @ccw_device: pointer to belonging ccw device
* *
* This function gets called by the common i/o layer and sets an adapter * This function gets called by the common i/o layer and sets an
* into state online. Setting an fcp device online means that it will be * adapter into state online. The first call will allocate all
* registered with the SCSI stack, that the QDIO queues will be set up * adapter resources that will be retained until the device is removed
* and that the adapter will be opened (asynchronously). * via zfcp_ccw_remove.
*
* Setting an fcp device online means that it will be registered with
* the SCSI stack, that the QDIO queues will be set up and that the
* adapter will be opened.
*/ */
static int zfcp_ccw_set_online(struct ccw_device *ccw_device) static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
{ {
struct zfcp_adapter *adapter; struct zfcp_adapter *adapter;
int retval; int ret = 0;
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
adapter = dev_get_drvdata(&ccw_device->dev); adapter = dev_get_drvdata(&ccw_device->dev);
retval = zfcp_erp_thread_setup(adapter); if (!adapter) {
if (retval) ret = zfcp_adapter_enqueue(ccw_device);
goto out; if (ret) {
dev_err(&ccw_device->dev,
"Setting up data structures for the "
"FCP adapter failed\n");
goto out;
}
adapter = dev_get_drvdata(&ccw_device->dev);
}
/* initialize request counter */ /* initialize request counter */
BUG_ON(!zfcp_reqlist_isempty(adapter)); BUG_ON(!zfcp_reqlist_isempty(adapter));
...@@ -162,13 +172,11 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device) ...@@ -162,13 +172,11 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
"ccsonl2", NULL); "ccsonl2", NULL);
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
up(&zfcp_data.config_sema); out:
flush_work(&adapter->scan_work); mutex_unlock(&zfcp_data.config_mutex);
return 0; if (!ret)
flush_work(&adapter->scan_work);
out: return ret;
up(&zfcp_data.config_sema);
return retval;
} }
/** /**
...@@ -182,12 +190,15 @@ static int zfcp_ccw_set_offline(struct ccw_device *ccw_device) ...@@ -182,12 +190,15 @@ static int zfcp_ccw_set_offline(struct ccw_device *ccw_device)
{ {
struct zfcp_adapter *adapter; struct zfcp_adapter *adapter;
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
adapter = dev_get_drvdata(&ccw_device->dev); adapter = dev_get_drvdata(&ccw_device->dev);
if (!adapter)
goto out;
zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL); zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL);
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
zfcp_erp_thread_kill(adapter); mutex_unlock(&zfcp_data.config_mutex);
up(&zfcp_data.config_sema); out:
return 0; return 0;
} }
...@@ -240,11 +251,12 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev) ...@@ -240,11 +251,12 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev)
{ {
struct zfcp_adapter *adapter; struct zfcp_adapter *adapter;
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
adapter = dev_get_drvdata(&cdev->dev); adapter = dev_get_drvdata(&cdev->dev);
zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL); zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL);
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
up(&zfcp_data.config_sema); zfcp_erp_thread_kill(adapter);
mutex_unlock(&zfcp_data.config_mutex);
} }
static struct ccw_driver zfcp_ccw_driver = { static struct ccw_driver zfcp_ccw_driver = {
......
This diff is collapsed.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* This file is part of the zfcp device driver for * This file is part of the zfcp device driver for
* FCP adapters for IBM System z9 and zSeries. * FCP adapters for IBM System z9 and zSeries.
* *
* Copyright IBM Corp. 2008, 2008 * Copyright IBM Corp. 2008, 2009
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
#ifndef ZFCP_DBF_H #ifndef ZFCP_DBF_H
#define ZFCP_DBF_H #define ZFCP_DBF_H
#include "zfcp_ext.h"
#include "zfcp_fsf.h" #include "zfcp_fsf.h"
#include "zfcp_def.h"
#define ZFCP_DBF_TAG_SIZE 4 #define ZFCP_DBF_TAG_SIZE 4
#define ZFCP_DBF_ID_SIZE 7 #define ZFCP_DBF_ID_SIZE 7
...@@ -35,13 +37,13 @@ struct zfcp_dbf_dump { ...@@ -35,13 +37,13 @@ struct zfcp_dbf_dump {
u8 data[]; /* dump data */ u8 data[]; /* dump data */
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_rec_dbf_record_thread { struct zfcp_dbf_rec_record_thread {
u32 total; u32 total;
u32 ready; u32 ready;
u32 running; u32 running;
}; };
struct zfcp_rec_dbf_record_target { struct zfcp_dbf_rec_record_target {
u64 ref; u64 ref;
u32 status; u32 status;
u32 d_id; u32 d_id;
...@@ -50,7 +52,7 @@ struct zfcp_rec_dbf_record_target { ...@@ -50,7 +52,7 @@ struct zfcp_rec_dbf_record_target {
u32 erp_count; u32 erp_count;
}; };
struct zfcp_rec_dbf_record_trigger { struct zfcp_dbf_rec_record_trigger {
u8 want; u8 want;
u8 need; u8 need;
u32 as; u32 as;
...@@ -62,21 +64,21 @@ struct zfcp_rec_dbf_record_trigger { ...@@ -62,21 +64,21 @@ struct zfcp_rec_dbf_record_trigger {
u64 fcp_lun; u64 fcp_lun;
}; };
struct zfcp_rec_dbf_record_action { struct zfcp_dbf_rec_record_action {
u32 status; u32 status;
u32 step; u32 step;
u64 action; u64 action;
u64 fsf_req; u64 fsf_req;
}; };
struct zfcp_rec_dbf_record { struct zfcp_dbf_rec_record {
u8 id; u8 id;
char id2[7]; char id2[7];
union { union {
struct zfcp_rec_dbf_record_action action; struct zfcp_dbf_rec_record_action action;
struct zfcp_rec_dbf_record_thread thread; struct zfcp_dbf_rec_record_thread thread;
struct zfcp_rec_dbf_record_target target; struct zfcp_dbf_rec_record_target target;
struct zfcp_rec_dbf_record_trigger trigger; struct zfcp_dbf_rec_record_trigger trigger;
} u; } u;
}; };
...@@ -87,7 +89,7 @@ enum { ...@@ -87,7 +89,7 @@ enum {
ZFCP_REC_DBF_ID_TRIGGER, ZFCP_REC_DBF_ID_TRIGGER,
}; };
struct zfcp_hba_dbf_record_response { struct zfcp_dbf_hba_record_response {
u32 fsf_command; u32 fsf_command;
u64 fsf_reqid; u64 fsf_reqid;
u32 fsf_seqno; u32 fsf_seqno;
...@@ -125,7 +127,7 @@ struct zfcp_hba_dbf_record_response { ...@@ -125,7 +127,7 @@ struct zfcp_hba_dbf_record_response {
} u; } u;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_hba_dbf_record_status { struct zfcp_dbf_hba_record_status {
u8 failed; u8 failed;
u32 status_type; u32 status_type;
u32 status_subtype; u32 status_subtype;
...@@ -139,24 +141,24 @@ struct zfcp_hba_dbf_record_status { ...@@ -139,24 +141,24 @@ struct zfcp_hba_dbf_record_status {
u8 payload[ZFCP_DBF_UNSOL_PAYLOAD]; u8 payload[ZFCP_DBF_UNSOL_PAYLOAD];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_hba_dbf_record_qdio { struct zfcp_dbf_hba_record_qdio {
u32 qdio_error; u32 qdio_error;
u8 sbal_index; u8 sbal_index;
u8 sbal_count; u8 sbal_count;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_hba_dbf_record { struct zfcp_dbf_hba_record {
u8 tag[ZFCP_DBF_TAG_SIZE]; u8 tag[ZFCP_DBF_TAG_SIZE];
u8 tag2[ZFCP_DBF_TAG_SIZE]; u8 tag2[ZFCP_DBF_TAG_SIZE];
union { union {
struct zfcp_hba_dbf_record_response response; struct zfcp_dbf_hba_record_response response;
struct zfcp_hba_dbf_record_status status; struct zfcp_dbf_hba_record_status status;
struct zfcp_hba_dbf_record_qdio qdio; struct zfcp_dbf_hba_record_qdio qdio;
struct fsf_bit_error_payload berr; struct fsf_bit_error_payload berr;
} u; } u;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_san_dbf_record_ct_request { struct zfcp_dbf_san_record_ct_request {
u16 cmd_req_code; u16 cmd_req_code;
u8 revision; u8 revision;
u8 gs_type; u8 gs_type;
...@@ -166,7 +168,7 @@ struct zfcp_san_dbf_record_ct_request { ...@@ -166,7 +168,7 @@ struct zfcp_san_dbf_record_ct_request {
u32 len; u32 len;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_san_dbf_record_ct_response { struct zfcp_dbf_san_record_ct_response {
u16 cmd_rsp_code; u16 cmd_rsp_code;
u8 revision; u8 revision;
u8 reason_code; u8 reason_code;
...@@ -176,27 +178,27 @@ struct zfcp_san_dbf_record_ct_response { ...@@ -176,27 +178,27 @@ struct zfcp_san_dbf_record_ct_response {
u32 len; u32 len;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_san_dbf_record_els { struct zfcp_dbf_san_record_els {
u8 ls_code; u8 ls_code;
u32 len; u32 len;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_san_dbf_record { struct zfcp_dbf_san_record {
u8 tag[ZFCP_DBF_TAG_SIZE]; u8 tag[ZFCP_DBF_TAG_SIZE];
u64 fsf_reqid; u64 fsf_reqid;
u32 fsf_seqno; u32 fsf_seqno;
u32 s_id; u32 s_id;
u32 d_id; u32 d_id;
union { union {
struct zfcp_san_dbf_record_ct_request ct_req; struct zfcp_dbf_san_record_ct_request ct_req;
struct zfcp_san_dbf_record_ct_response ct_resp; struct zfcp_dbf_san_record_ct_response ct_resp;
struct zfcp_san_dbf_record_els els; struct zfcp_dbf_san_record_els els;
} u; } u;
#define ZFCP_DBF_SAN_MAX_PAYLOAD 1024 #define ZFCP_DBF_SAN_MAX_PAYLOAD 1024
u8 payload[32]; u8 payload[32];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_scsi_dbf_record { struct zfcp_dbf_scsi_record {
u8 tag[ZFCP_DBF_TAG_SIZE]; u8 tag[ZFCP_DBF_TAG_SIZE];
u8 tag2[ZFCP_DBF_TAG_SIZE]; u8 tag2[ZFCP_DBF_TAG_SIZE];
u32 scsi_id; u32 scsi_id;
...@@ -222,4 +224,127 @@ struct zfcp_scsi_dbf_record { ...@@ -222,4 +224,127 @@ struct zfcp_scsi_dbf_record {
u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO]; u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO];
} __attribute__ ((packed)); } __attribute__ ((packed));
struct zfcp_dbf {
debug_info_t *rec;
debug_info_t *hba;
debug_info_t *san;
debug_info_t *scsi;
spinlock_t rec_lock;
spinlock_t hba_lock;
spinlock_t san_lock;
spinlock_t scsi_lock;
struct zfcp_dbf_rec_record rec_buf;
struct zfcp_dbf_hba_record hba_buf;
struct zfcp_dbf_san_record san_buf;
struct zfcp_dbf_scsi_record scsi_buf;
struct zfcp_adapter *adapter;
};
static inline
void zfcp_dbf_hba_fsf_resp(const char *tag2, int level,
struct zfcp_fsf_req *req, struct zfcp_dbf *dbf)
{
if (level <= dbf->hba->level)
_zfcp_dbf_hba_fsf_response(tag2, level, req, dbf);
}
/**
* zfcp_dbf_hba_fsf_response - trace event for request completion
* @fsf_req: request that has been completed
*/
static inline void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req)
{
struct zfcp_dbf *dbf = req->adapter->dbf;
struct fsf_qtcb *qtcb = req->qtcb;
if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
(qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
zfcp_dbf_hba_fsf_resp("perr", 1, req, dbf);
} else if (qtcb->header.fsf_status != FSF_GOOD) {
zfcp_dbf_hba_fsf_resp("ferr", 1, req, dbf);
} else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
(req->fsf_command == FSF_QTCB_OPEN_LUN)) {
zfcp_dbf_hba_fsf_resp("open", 4, req, dbf);
} else if (qtcb->header.log_length) {
zfcp_dbf_hba_fsf_resp("qtcb", 5, req, dbf);
} else {
zfcp_dbf_hba_fsf_resp("norm", 6, req, dbf);
}
}
/**
* zfcp_dbf_hba_fsf_unsol - trace event for an unsolicited status buffer
* @tag: tag indicating which kind of unsolicited status has been received
* @dbf: reference to dbf structure
* @status_buffer: buffer containing payload of unsolicited status
*/
static inline
void zfcp_dbf_hba_fsf_unsol(const char *tag, struct zfcp_dbf *dbf,
struct fsf_status_read_buffer *buf)
{
int level = 2;
if (level <= dbf->hba->level)
_zfcp_dbf_hba_fsf_unsol(tag, level, dbf, buf);
}
static inline
void zfcp_dbf_scsi(const char *tag, const char *tag2, int level,
struct zfcp_dbf *dbf, struct scsi_cmnd *scmd,
struct zfcp_fsf_req *req, unsigned long old_id)
{
if (level <= dbf->scsi->level)
_zfcp_dbf_scsi(tag, tag2, level, dbf, scmd, req, old_id);
}
/**
* zfcp_dbf_scsi_result - trace event for SCSI command completion
* @tag: tag indicating success or failure of SCSI command
* @level: trace level applicable for this event
* @adapter: adapter that has been used to issue the SCSI command
* @scmd: SCSI command pointer
* @fsf_req: request used to issue SCSI command (might be NULL)
*/
static inline
void zfcp_dbf_scsi_result(const char *tag, int level, struct zfcp_dbf *dbf,
struct scsi_cmnd *scmd, struct zfcp_fsf_req *fsf_req)
{
zfcp_dbf_scsi("rslt", tag, level, dbf, scmd, fsf_req, 0);
}
/**
* zfcp_dbf_scsi_abort - trace event for SCSI command abort
* @tag: tag indicating success or failure of abort operation
* @adapter: adapter thas has been used to issue SCSI command to be aborted
* @scmd: SCSI command to be aborted
* @new_req: request containing abort (might be NULL)
* @old_id: identifier of request containg SCSI command to be aborted
*/
static inline
void zfcp_dbf_scsi_abort(const char *tag, struct zfcp_dbf *dbf,
struct scsi_cmnd *scmd, struct zfcp_fsf_req *new_req,
unsigned long old_id)
{
zfcp_dbf_scsi("abrt", tag, 1, dbf, scmd, new_req, old_id);
}
/**
* zfcp_dbf_scsi_devreset - trace event for Logical Unit or Target Reset
* @tag: tag indicating success or failure of reset operation
* @flag: indicates type of reset (Target Reset, Logical Unit Reset)
* @unit: unit that needs reset
* @scsi_cmnd: SCSI command which caused this error recovery
*/
static inline
void zfcp_dbf_scsi_devreset(const char *tag, u8 flag, struct zfcp_unit *unit,
struct scsi_cmnd *scsi_cmnd)
{
zfcp_dbf_scsi(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
unit->port->adapter->dbf, scsi_cmnd, NULL, 0);
}
#endif /* ZFCP_DBF_H */ #endif /* ZFCP_DBF_H */
This diff is collapsed.
This diff is collapsed.
...@@ -34,37 +34,31 @@ extern struct zfcp_adapter *zfcp_get_adapter_by_busid(char *); ...@@ -34,37 +34,31 @@ extern struct zfcp_adapter *zfcp_get_adapter_by_busid(char *);
extern struct miscdevice zfcp_cfdc_misc; extern struct miscdevice zfcp_cfdc_misc;
/* zfcp_dbf.c */ /* zfcp_dbf.c */
extern int zfcp_adapter_debug_register(struct zfcp_adapter *); extern int zfcp_dbf_adapter_register(struct zfcp_adapter *);
extern void zfcp_adapter_debug_unregister(struct zfcp_adapter *); extern void zfcp_dbf_adapter_unregister(struct zfcp_dbf *);
extern void zfcp_rec_dbf_event_thread(char *, struct zfcp_adapter *); extern void zfcp_dbf_rec_thread(char *, struct zfcp_dbf *);
extern void zfcp_rec_dbf_event_thread_lock(char *, struct zfcp_adapter *); extern void zfcp_dbf_rec_thread_lock(char *, struct zfcp_dbf *);
extern void zfcp_rec_dbf_event_adapter(char *, void *, struct zfcp_adapter *); extern void zfcp_dbf_rec_adapter(char *, void *, struct zfcp_dbf *);
extern void zfcp_rec_dbf_event_port(char *, void *, struct zfcp_port *); extern void zfcp_dbf_rec_port(char *, void *, struct zfcp_port *);
extern void zfcp_rec_dbf_event_unit(char *, void *, struct zfcp_unit *); extern void zfcp_dbf_rec_unit(char *, void *, struct zfcp_unit *);
extern void zfcp_rec_dbf_event_trigger(char *, void *, u8, u8, void *, extern void zfcp_dbf_rec_trigger(char *, void *, u8, u8, void *,
struct zfcp_adapter *, struct zfcp_adapter *, struct zfcp_port *,
struct zfcp_port *, struct zfcp_unit *); struct zfcp_unit *);
extern void zfcp_rec_dbf_event_action(char *, struct zfcp_erp_action *); extern void zfcp_dbf_rec_action(char *, struct zfcp_erp_action *);
extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *); extern void _zfcp_dbf_hba_fsf_response(const char *, int, struct zfcp_fsf_req *,
extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *, struct zfcp_dbf *);
struct fsf_status_read_buffer *); extern void _zfcp_dbf_hba_fsf_unsol(const char *, int level, struct zfcp_dbf *,
extern void zfcp_hba_dbf_event_qdio(struct zfcp_adapter *, unsigned int, int, struct fsf_status_read_buffer *);
int); extern void zfcp_dbf_hba_qdio(struct zfcp_dbf *, unsigned int, int, int);
extern void zfcp_hba_dbf_event_berr(struct zfcp_adapter *, extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *);
struct zfcp_fsf_req *); extern void zfcp_dbf_san_ct_request(struct zfcp_fsf_req *);
extern void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *); extern void zfcp_dbf_san_ct_response(struct zfcp_fsf_req *);
extern void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *); extern void zfcp_dbf_san_els_request(struct zfcp_fsf_req *);
extern void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *); extern void zfcp_dbf_san_els_response(struct zfcp_fsf_req *);
extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *); extern void zfcp_dbf_san_incoming_els(struct zfcp_fsf_req *);
extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *); extern void _zfcp_dbf_scsi(const char *, const char *, int, struct zfcp_dbf *,
extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *, struct scsi_cmnd *, struct zfcp_fsf_req *,
struct scsi_cmnd *, unsigned long);
struct zfcp_fsf_req *);
extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *,
struct scsi_cmnd *, struct zfcp_fsf_req *,
unsigned long);
extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *,
struct scsi_cmnd *);
/* zfcp_erp.c */ /* zfcp_erp.c */
extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, char *, extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, char *,
...@@ -96,22 +90,20 @@ extern void zfcp_erp_unit_access_denied(struct zfcp_unit *, char *, void *); ...@@ -96,22 +90,20 @@ extern void zfcp_erp_unit_access_denied(struct zfcp_unit *, char *, void *);
extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *, char *, extern void zfcp_erp_adapter_access_changed(struct zfcp_adapter *, char *,
void *); void *);
extern void zfcp_erp_timeout_handler(unsigned long); extern void zfcp_erp_timeout_handler(unsigned long);
extern void zfcp_erp_port_strategy_open_lookup(struct work_struct *);
/* zfcp_fc.c */ /* zfcp_fc.c */
extern int zfcp_scan_ports(struct zfcp_adapter *); extern int zfcp_fc_scan_ports(struct zfcp_adapter *);
extern void _zfcp_scan_ports_later(struct work_struct *); extern void _zfcp_fc_scan_ports_later(struct work_struct *);
extern void zfcp_fc_incoming_els(struct zfcp_fsf_req *); extern void zfcp_fc_incoming_els(struct zfcp_fsf_req *);
extern int zfcp_fc_ns_gid_pn(struct zfcp_erp_action *); extern void zfcp_fc_port_did_lookup(struct work_struct *);
extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *); extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *);
extern void zfcp_test_link(struct zfcp_port *); extern void zfcp_fc_test_link(struct zfcp_port *);
extern void zfcp_fc_link_test_work(struct work_struct *); extern void zfcp_fc_link_test_work(struct work_struct *);
extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *); extern void zfcp_fc_wka_ports_force_offline(struct zfcp_wka_ports *);
extern void zfcp_fc_wka_ports_init(struct zfcp_adapter *); extern int zfcp_fc_gs_setup(struct zfcp_adapter *);
extern void zfcp_fc_gs_destroy(struct zfcp_adapter *);
extern int zfcp_fc_execute_els_fc_job(struct fc_bsg_job *); extern int zfcp_fc_execute_els_fc_job(struct fc_bsg_job *);
extern int zfcp_fc_execute_ct_fc_job(struct fc_bsg_job *); extern int zfcp_fc_execute_ct_fc_job(struct fc_bsg_job *);
extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *);
/* zfcp_fsf.c */ /* zfcp_fsf.c */
extern int zfcp_fsf_open_port(struct zfcp_erp_action *); extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
...@@ -122,37 +114,39 @@ extern int zfcp_fsf_close_physical_port(struct zfcp_erp_action *); ...@@ -122,37 +114,39 @@ extern int zfcp_fsf_close_physical_port(struct zfcp_erp_action *);
extern int zfcp_fsf_open_unit(struct zfcp_erp_action *); extern int zfcp_fsf_open_unit(struct zfcp_erp_action *);
extern int zfcp_fsf_close_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_config_data(struct zfcp_erp_action *);
extern int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *, extern int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *,
struct fsf_qtcb_bottom_config *); struct fsf_qtcb_bottom_config *);
extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *); extern int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *);
extern int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *, extern int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *,
struct fsf_qtcb_bottom_port *); struct fsf_qtcb_bottom_port *);
extern struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *, extern struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *,
struct zfcp_fsf_cfdc *); struct zfcp_fsf_cfdc *);
extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *); extern void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *);
extern int zfcp_fsf_status_read(struct zfcp_adapter *); extern int zfcp_fsf_status_read(struct zfcp_qdio *);
extern int zfcp_status_read_refill(struct zfcp_adapter *adapter); extern int zfcp_status_read_refill(struct zfcp_adapter *adapter);
extern int zfcp_fsf_send_ct(struct zfcp_send_ct *, mempool_t *, extern int zfcp_fsf_send_ct(struct zfcp_send_ct *, mempool_t *);
struct zfcp_erp_action *);
extern int zfcp_fsf_send_els(struct zfcp_send_els *); extern int zfcp_fsf_send_els(struct zfcp_send_els *);
extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *, extern int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *,
struct scsi_cmnd *); struct scsi_cmnd *);
extern void zfcp_fsf_req_complete(struct zfcp_fsf_req *);
extern void zfcp_fsf_req_free(struct zfcp_fsf_req *); extern void zfcp_fsf_req_free(struct zfcp_fsf_req *);
extern struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *, u8); extern struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *, u8);
extern struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long, extern struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long,
struct zfcp_unit *); struct zfcp_unit *);
extern void zfcp_fsf_reqid_check(struct zfcp_qdio *, int);
/* zfcp_qdio.c */ /* zfcp_qdio.c */
extern int zfcp_qdio_allocate(struct zfcp_adapter *); extern int zfcp_qdio_setup(struct zfcp_adapter *);
extern void zfcp_qdio_free(struct zfcp_adapter *); extern void zfcp_qdio_destroy(struct zfcp_qdio *);
extern int zfcp_qdio_send(struct zfcp_fsf_req *); extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_queue_req *);
extern struct qdio_buffer_element *zfcp_qdio_sbale_req(struct zfcp_fsf_req *); extern struct qdio_buffer_element
extern struct qdio_buffer_element *zfcp_qdio_sbale_curr(struct zfcp_fsf_req *); *zfcp_qdio_sbale_req(struct zfcp_qdio *, struct zfcp_queue_req *);
extern int zfcp_qdio_sbals_from_sg(struct zfcp_fsf_req *, unsigned long, extern struct qdio_buffer_element
*zfcp_qdio_sbale_curr(struct zfcp_qdio *, struct zfcp_queue_req *);
extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *,
struct zfcp_queue_req *, unsigned long,
struct scatterlist *, int); struct scatterlist *, int);
extern int zfcp_qdio_open(struct zfcp_adapter *); extern int zfcp_qdio_open(struct zfcp_qdio *);
extern void zfcp_qdio_close(struct zfcp_adapter *); extern void zfcp_qdio_close(struct zfcp_qdio *);
/* zfcp_scsi.c */ /* zfcp_scsi.c */
extern struct zfcp_data zfcp_data; extern struct zfcp_data zfcp_data;
......
This diff is collapsed.
This diff is collapsed.
...@@ -3,13 +3,14 @@ ...@@ -3,13 +3,14 @@
* *
* Interface to the FSF support functions. * Interface to the FSF support functions.
* *
* Copyright IBM Corporation 2002, 2008 * Copyright IBM Corporation 2002, 2009
*/ */
#ifndef FSF_H #ifndef FSF_H
#define FSF_H #define FSF_H
#include <linux/pfn.h> #include <linux/pfn.h>
#include <linux/scatterlist.h>
#define FSF_QTCB_CURRENT_VERSION 0x00000001 #define FSF_QTCB_CURRENT_VERSION 0x00000001
......
This diff is collapsed.
...@@ -9,8 +9,9 @@ ...@@ -9,8 +9,9 @@
#define KMSG_COMPONENT "zfcp" #define KMSG_COMPONENT "zfcp"
#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
#include "zfcp_ext.h"
#include <asm/atomic.h> #include <asm/atomic.h>
#include "zfcp_ext.h"
#include "zfcp_dbf.h"
static unsigned int default_depth = 32; static unsigned int default_depth = 32;
module_param_named(queue_depth, default_depth, uint, 0600); module_param_named(queue_depth, default_depth, uint, 0600);
...@@ -52,11 +53,11 @@ static int zfcp_scsi_slave_configure(struct scsi_device *sdp) ...@@ -52,11 +53,11 @@ static int zfcp_scsi_slave_configure(struct scsi_device *sdp)
static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result)
{ {
struct zfcp_adapter *adapter =
(struct zfcp_adapter *) scpnt->device->host->hostdata[0];
set_host_byte(scpnt, result); set_host_byte(scpnt, result);
if ((scpnt->device != NULL) && (scpnt->device->host != NULL)) if ((scpnt->device != NULL) && (scpnt->device->host != NULL))
zfcp_scsi_dbf_event_result("fail", 4, zfcp_dbf_scsi_result("fail", 4, adapter->dbf, scpnt, NULL);
(struct zfcp_adapter*) scpnt->device->host->hostdata[0],
scpnt, NULL);
/* return directly */ /* return directly */
scpnt->scsi_done(scpnt); scpnt->scsi_done(scpnt);
} }
...@@ -92,7 +93,7 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt, ...@@ -92,7 +93,7 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt,
scsi_result = fc_remote_port_chkready(rport); scsi_result = fc_remote_port_chkready(rport);
if (unlikely(scsi_result)) { if (unlikely(scsi_result)) {
scpnt->result = scsi_result; scpnt->result = scsi_result;
zfcp_scsi_dbf_event_result("fail", 4, adapter, scpnt, NULL); zfcp_dbf_scsi_result("fail", 4, adapter->dbf, scpnt, NULL);
scpnt->scsi_done(scpnt); scpnt->scsi_done(scpnt);
return 0; return 0;
} }
...@@ -180,8 +181,8 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) ...@@ -180,8 +181,8 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
spin_unlock(&adapter->req_list_lock); spin_unlock(&adapter->req_list_lock);
if (!old_req) { if (!old_req) {
write_unlock_irqrestore(&adapter->abort_lock, flags); write_unlock_irqrestore(&adapter->abort_lock, flags);
zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL, zfcp_dbf_scsi_abort("lte1", adapter->dbf, scpnt, NULL,
old_reqid); old_reqid);
return FAILED; /* completion could be in progress */ return FAILED; /* completion could be in progress */
} }
old_req->data = NULL; old_req->data = NULL;
...@@ -197,16 +198,15 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) ...@@ -197,16 +198,15 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
if (!(atomic_read(&adapter->status) & if (!(atomic_read(&adapter->status) &
ZFCP_STATUS_COMMON_RUNNING)) { ZFCP_STATUS_COMMON_RUNNING)) {
zfcp_scsi_dbf_event_abort("nres", adapter, scpnt, NULL, zfcp_dbf_scsi_abort("nres", adapter->dbf, scpnt, NULL,
old_reqid); old_reqid);
return SUCCESS; return SUCCESS;
} }
} }
if (!abrt_req) if (!abrt_req)
return FAILED; return FAILED;
wait_event(abrt_req->completion_wq, wait_for_completion(&abrt_req->completion);
abrt_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED)
dbf_tag = "okay"; dbf_tag = "okay";
...@@ -216,7 +216,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) ...@@ -216,7 +216,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
dbf_tag = "fail"; dbf_tag = "fail";
retval = FAILED; retval = FAILED;
} }
zfcp_scsi_dbf_event_abort(dbf_tag, adapter, scpnt, abrt_req, old_reqid); zfcp_dbf_scsi_abort(dbf_tag, adapter->dbf, scpnt, abrt_req, old_reqid);
zfcp_fsf_req_free(abrt_req); zfcp_fsf_req_free(abrt_req);
return retval; return retval;
} }
...@@ -225,7 +225,7 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags) ...@@ -225,7 +225,7 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
{ {
struct zfcp_unit *unit = scpnt->device->hostdata; struct zfcp_unit *unit = scpnt->device->hostdata;
struct zfcp_adapter *adapter = unit->port->adapter; struct zfcp_adapter *adapter = unit->port->adapter;
struct zfcp_fsf_req *fsf_req; struct zfcp_fsf_req *fsf_req = NULL;
int retval = SUCCESS; int retval = SUCCESS;
int retry = 3; int retry = 3;
...@@ -237,25 +237,23 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags) ...@@ -237,25 +237,23 @@ static int zfcp_task_mgmt_function(struct scsi_cmnd *scpnt, u8 tm_flags)
zfcp_erp_wait(adapter); zfcp_erp_wait(adapter);
if (!(atomic_read(&adapter->status) & if (!(atomic_read(&adapter->status) &
ZFCP_STATUS_COMMON_RUNNING)) { ZFCP_STATUS_COMMON_RUNNING)) {
zfcp_scsi_dbf_event_devreset("nres", tm_flags, unit, zfcp_dbf_scsi_devreset("nres", tm_flags, unit, scpnt);
scpnt);
return SUCCESS; return SUCCESS;
} }
} }
if (!fsf_req) if (!fsf_req)
return FAILED; return FAILED;
wait_event(fsf_req->completion_wq, wait_for_completion(&fsf_req->completion);
fsf_req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) { if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCFAILED) {
zfcp_scsi_dbf_event_devreset("fail", tm_flags, unit, scpnt); zfcp_dbf_scsi_devreset("fail", tm_flags, unit, scpnt);
retval = FAILED; retval = FAILED;
} else if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP) { } else if (fsf_req->status & ZFCP_STATUS_FSFREQ_TMFUNCNOTSUPP) {
zfcp_scsi_dbf_event_devreset("nsup", tm_flags, unit, scpnt); zfcp_dbf_scsi_devreset("nsup", tm_flags, unit, scpnt);
retval = FAILED; retval = FAILED;
} else } else
zfcp_scsi_dbf_event_devreset("okay", tm_flags, unit, scpnt); zfcp_dbf_scsi_devreset("okay", tm_flags, unit, scpnt);
zfcp_fsf_req_free(fsf_req); zfcp_fsf_req_free(fsf_req);
return retval; return retval;
...@@ -430,7 +428,7 @@ static struct fc_host_statistics *zfcp_get_fc_host_stats(struct Scsi_Host *host) ...@@ -430,7 +428,7 @@ static struct fc_host_statistics *zfcp_get_fc_host_stats(struct Scsi_Host *host)
if (!data) if (!data)
return NULL; return NULL;
ret = zfcp_fsf_exchange_port_data_sync(adapter, data); ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data);
if (ret) { if (ret) {
kfree(data); kfree(data);
return NULL; return NULL;
...@@ -459,7 +457,7 @@ static void zfcp_reset_fc_host_stats(struct Scsi_Host *shost) ...@@ -459,7 +457,7 @@ static void zfcp_reset_fc_host_stats(struct Scsi_Host *shost)
if (!data) if (!data)
return; return;
ret = zfcp_fsf_exchange_port_data_sync(adapter, data); ret = zfcp_fsf_exchange_port_data_sync(adapter->qdio, data);
if (ret) if (ret)
kfree(data); kfree(data);
else { else {
...@@ -492,21 +490,6 @@ static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout) ...@@ -492,21 +490,6 @@ static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
rport->dev_loss_tmo = timeout; rport->dev_loss_tmo = timeout;
} }
/**
* zfcp_scsi_dev_loss_tmo_callbk - Free any reference to rport
* @rport: The rport that is about to be deleted.
*/
static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport)
{
struct zfcp_port *port;
write_lock_irq(&zfcp_data.config_lock);
port = rport->dd_data;
if (port)
port->rport = NULL;
write_unlock_irq(&zfcp_data.config_lock);
}
/** /**
* zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport * zfcp_scsi_terminate_rport_io - Terminate all I/O on a rport
* @rport: The FC rport where to teminate I/O * @rport: The FC rport where to teminate I/O
...@@ -518,9 +501,12 @@ static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport) ...@@ -518,9 +501,12 @@ static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport)
static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport) static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport)
{ {
struct zfcp_port *port; struct zfcp_port *port;
struct Scsi_Host *shost = rport_to_shost(rport);
struct zfcp_adapter *adapter =
(struct zfcp_adapter *)shost->hostdata[0];
write_lock_irq(&zfcp_data.config_lock); write_lock_irq(&zfcp_data.config_lock);
port = rport->dd_data; port = zfcp_get_port_by_wwpn(adapter, rport->port_name);
if (port) if (port)
zfcp_port_get(port); zfcp_port_get(port);
write_unlock_irq(&zfcp_data.config_lock); write_unlock_irq(&zfcp_data.config_lock);
...@@ -552,7 +538,6 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port) ...@@ -552,7 +538,6 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port)
return; return;
} }
rport->dd_data = port;
rport->maxframe_size = port->maxframe_size; rport->maxframe_size = port->maxframe_size;
rport->supported_classes = port->supported_classes; rport->supported_classes = port->supported_classes;
port->rport = rport; port->rport = rport;
...@@ -573,7 +558,7 @@ void zfcp_scsi_schedule_rport_register(struct zfcp_port *port) ...@@ -573,7 +558,7 @@ void zfcp_scsi_schedule_rport_register(struct zfcp_port *port)
zfcp_port_get(port); zfcp_port_get(port);
port->rport_task = RPORT_ADD; port->rport_task = RPORT_ADD;
if (!queue_work(zfcp_data.work_queue, &port->rport_work)) if (!queue_work(port->adapter->work_queue, &port->rport_work))
zfcp_port_put(port); zfcp_port_put(port);
} }
...@@ -582,8 +567,11 @@ void zfcp_scsi_schedule_rport_block(struct zfcp_port *port) ...@@ -582,8 +567,11 @@ void zfcp_scsi_schedule_rport_block(struct zfcp_port *port)
zfcp_port_get(port); zfcp_port_get(port);
port->rport_task = RPORT_DEL; port->rport_task = RPORT_DEL;
if (!queue_work(zfcp_data.work_queue, &port->rport_work)) if (port->rport && queue_work(port->adapter->work_queue,
zfcp_port_put(port); &port->rport_work))
return;
zfcp_port_put(port);
} }
void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *adapter) void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *adapter)
...@@ -662,7 +650,6 @@ struct fc_function_template zfcp_transport_functions = { ...@@ -662,7 +650,6 @@ struct fc_function_template zfcp_transport_functions = {
.reset_fc_host_stats = zfcp_reset_fc_host_stats, .reset_fc_host_stats = zfcp_reset_fc_host_stats,
.set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo, .set_rport_dev_loss_tmo = zfcp_set_rport_dev_loss_tmo,
.get_host_port_state = zfcp_get_host_port_state, .get_host_port_state = zfcp_get_host_port_state,
.dev_loss_tmo_callbk = zfcp_scsi_dev_loss_tmo_callbk,
.terminate_rport_io = zfcp_scsi_terminate_rport_io, .terminate_rport_io = zfcp_scsi_terminate_rport_io,
.show_host_port_state = 1, .show_host_port_state = 1,
.bsg_request = zfcp_execute_fc_job, .bsg_request = zfcp_execute_fc_job,
......
...@@ -88,7 +88,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \ ...@@ -88,7 +88,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \
unsigned long val; \ unsigned long val; \
int retval = 0; \ int retval = 0; \
\ \
down(&zfcp_data.config_sema); \ mutex_lock(&zfcp_data.config_mutex); \
if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_REMOVE) { \ if (atomic_read(&_feat->status) & ZFCP_STATUS_COMMON_REMOVE) { \
retval = -EBUSY; \ retval = -EBUSY; \
goto out; \ goto out; \
...@@ -105,7 +105,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \ ...@@ -105,7 +105,7 @@ static ssize_t zfcp_sysfs_##_feat##_failed_store(struct device *dev, \
_reopen_id, NULL); \ _reopen_id, NULL); \
zfcp_erp_wait(_adapter); \ zfcp_erp_wait(_adapter); \
out: \ out: \
up(&zfcp_data.config_sema); \ mutex_unlock(&zfcp_data.config_mutex); \
return retval ? retval : (ssize_t) count; \ return retval ? retval : (ssize_t) count; \
} \ } \
static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO, \ static ZFCP_DEV_ATTR(_feat, failed, S_IWUSR | S_IRUGO, \
...@@ -126,7 +126,7 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, ...@@ -126,7 +126,7 @@ static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev,
if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE)
return -EBUSY; return -EBUSY;
ret = zfcp_scan_ports(adapter); ret = zfcp_fc_scan_ports(adapter);
return ret ? ret : (ssize_t) count; return ret ? ret : (ssize_t) count;
} }
static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL, static ZFCP_DEV_ATTR(adapter, port_rescan, S_IWUSR, NULL,
...@@ -142,7 +142,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, ...@@ -142,7 +142,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
int retval = 0; int retval = 0;
LIST_HEAD(port_remove_lh); LIST_HEAD(port_remove_lh);
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) { if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
retval = -EBUSY; retval = -EBUSY;
goto out; goto out;
...@@ -173,7 +173,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, ...@@ -173,7 +173,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
zfcp_port_put(port); zfcp_port_put(port);
zfcp_port_dequeue(port); zfcp_port_dequeue(port);
out: out:
up(&zfcp_data.config_sema); mutex_unlock(&zfcp_data.config_mutex);
return retval ? retval : (ssize_t) count; return retval ? retval : (ssize_t) count;
} }
static ZFCP_DEV_ATTR(adapter, port_remove, S_IWUSR, NULL, static ZFCP_DEV_ATTR(adapter, port_remove, S_IWUSR, NULL,
...@@ -207,7 +207,7 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, ...@@ -207,7 +207,7 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
u64 fcp_lun; u64 fcp_lun;
int retval = -EINVAL; int retval = -EINVAL;
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
retval = -EBUSY; retval = -EBUSY;
goto out; goto out;
...@@ -226,7 +226,7 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, ...@@ -226,7 +226,7 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev,
zfcp_erp_wait(unit->port->adapter); zfcp_erp_wait(unit->port->adapter);
zfcp_unit_put(unit); zfcp_unit_put(unit);
out: out:
up(&zfcp_data.config_sema); mutex_unlock(&zfcp_data.config_mutex);
return retval ? retval : (ssize_t) count; return retval ? retval : (ssize_t) count;
} }
static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store); static DEVICE_ATTR(unit_add, S_IWUSR, NULL, zfcp_sysfs_unit_add_store);
...@@ -241,7 +241,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, ...@@ -241,7 +241,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
int retval = 0; int retval = 0;
LIST_HEAD(unit_remove_lh); LIST_HEAD(unit_remove_lh);
down(&zfcp_data.config_sema); mutex_lock(&zfcp_data.config_mutex);
if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) { if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
retval = -EBUSY; retval = -EBUSY;
goto out; goto out;
...@@ -282,7 +282,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev, ...@@ -282,7 +282,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
zfcp_unit_put(unit); zfcp_unit_put(unit);
zfcp_unit_dequeue(unit); zfcp_unit_dequeue(unit);
out: out:
up(&zfcp_data.config_sema); mutex_unlock(&zfcp_data.config_mutex);
return retval ? retval : (ssize_t) count; return retval ? retval : (ssize_t) count;
} }
static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store);
...@@ -425,7 +425,7 @@ static ssize_t zfcp_sysfs_adapter_util_show(struct device *dev, ...@@ -425,7 +425,7 @@ static ssize_t zfcp_sysfs_adapter_util_show(struct device *dev,
if (!qtcb_port) if (!qtcb_port)
return -ENOMEM; return -ENOMEM;
retval = zfcp_fsf_exchange_port_data_sync(adapter, qtcb_port); retval = zfcp_fsf_exchange_port_data_sync(adapter->qdio, qtcb_port);
if (!retval) if (!retval)
retval = sprintf(buf, "%u %u %u\n", qtcb_port->cp_util, retval = sprintf(buf, "%u %u %u\n", qtcb_port->cp_util,
qtcb_port->cb_util, qtcb_port->a_util); qtcb_port->cb_util, qtcb_port->a_util);
...@@ -451,7 +451,7 @@ static int zfcp_sysfs_adapter_ex_config(struct device *dev, ...@@ -451,7 +451,7 @@ static int zfcp_sysfs_adapter_ex_config(struct device *dev,
if (!qtcb_config) if (!qtcb_config)
return -ENOMEM; return -ENOMEM;
retval = zfcp_fsf_exchange_config_data_sync(adapter, qtcb_config); retval = zfcp_fsf_exchange_config_data_sync(adapter->qdio, qtcb_config);
if (!retval) if (!retval)
*stat_inf = qtcb_config->stat_info; *stat_inf = qtcb_config->stat_info;
...@@ -492,15 +492,15 @@ static ssize_t zfcp_sysfs_adapter_q_full_show(struct device *dev, ...@@ -492,15 +492,15 @@ static ssize_t zfcp_sysfs_adapter_q_full_show(struct device *dev,
char *buf) char *buf)
{ {
struct Scsi_Host *scsi_host = class_to_shost(dev); struct Scsi_Host *scsi_host = class_to_shost(dev);
struct zfcp_adapter *adapter = struct zfcp_qdio *qdio =
(struct zfcp_adapter *) scsi_host->hostdata[0]; ((struct zfcp_adapter *) scsi_host->hostdata[0])->qdio;
u64 util; u64 util;
spin_lock_bh(&adapter->qdio_stat_lock); spin_lock_bh(&qdio->stat_lock);
util = adapter->req_q_util; util = qdio->req_q_util;
spin_unlock_bh(&adapter->qdio_stat_lock); spin_unlock_bh(&qdio->stat_lock);
return sprintf(buf, "%d %llu\n", atomic_read(&adapter->qdio_outb_full), return sprintf(buf, "%d %llu\n", atomic_read(&qdio->req_q_full),
(unsigned long long)util); (unsigned long long)util);
} }
static DEVICE_ATTR(queue_full, S_IRUGO, zfcp_sysfs_adapter_q_full_show, NULL); static DEVICE_ATTR(queue_full, S_IRUGO, zfcp_sysfs_adapter_q_full_show, NULL);
......
...@@ -1811,6 +1811,12 @@ config ZFCP ...@@ -1811,6 +1811,12 @@ config ZFCP
called zfcp. If you want to compile it as a module, say M here called zfcp. If you want to compile it as a module, say M here
and read <file:Documentation/kbuild/modules.txt>. and read <file:Documentation/kbuild/modules.txt>.
config SCSI_PMCRAID
tristate "PMC SIERRA Linux MaxRAID adapter support"
depends on PCI && SCSI
---help---
This driver supports the PMC SIERRA MaxRAID adapters.
config SCSI_SRP config SCSI_SRP
tristate "SCSI RDMA Protocol helper library" tristate "SCSI RDMA Protocol helper library"
depends on SCSI && PCI depends on SCSI && PCI
......
...@@ -130,6 +130,7 @@ obj-$(CONFIG_SCSI_MVSAS) += mvsas/ ...@@ -130,6 +130,7 @@ obj-$(CONFIG_SCSI_MVSAS) += mvsas/
obj-$(CONFIG_PS3_ROM) += ps3rom.o obj-$(CONFIG_PS3_ROM) += ps3rom.o
obj-$(CONFIG_SCSI_CXGB3_ISCSI) += libiscsi.o libiscsi_tcp.o cxgb3i/ obj-$(CONFIG_SCSI_CXGB3_ISCSI) += libiscsi.o libiscsi_tcp.o cxgb3i/
obj-$(CONFIG_SCSI_BNX2_ISCSI) += libiscsi.o bnx2i/ obj-$(CONFIG_SCSI_BNX2_ISCSI) += libiscsi.o bnx2i/
obj-$(CONFIG_SCSI_PMCRAID) += pmcraid.o
obj-$(CONFIG_ARM) += arm/ obj-$(CONFIG_ARM) += arm/
......
This diff is collapsed.
...@@ -387,6 +387,7 @@ static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba) ...@@ -387,6 +387,7 @@ static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)
bnx2i_ep = ep->dd_data; bnx2i_ep = ep->dd_data;
INIT_LIST_HEAD(&bnx2i_ep->link); INIT_LIST_HEAD(&bnx2i_ep->link);
bnx2i_ep->state = EP_STATE_IDLE; bnx2i_ep->state = EP_STATE_IDLE;
bnx2i_ep->ep_iscsi_cid = (u16) -1;
bnx2i_ep->hba = hba; bnx2i_ep->hba = hba;
bnx2i_ep->hba_age = hba->age; bnx2i_ep->hba_age = hba->age;
hba->ofld_conns_active++; hba->ofld_conns_active++;
...@@ -1160,9 +1161,6 @@ static int bnx2i_task_xmit(struct iscsi_task *task) ...@@ -1160,9 +1161,6 @@ static int bnx2i_task_xmit(struct iscsi_task *task)
struct bnx2i_cmd *cmd = task->dd_data; struct bnx2i_cmd *cmd = task->dd_data;
struct iscsi_cmd *hdr = (struct iscsi_cmd *) task->hdr; struct iscsi_cmd *hdr = (struct iscsi_cmd *) task->hdr;
if (test_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state))
return -ENOTCONN;
if (!bnx2i_conn->is_bound) if (!bnx2i_conn->is_bound)
return -ENOTCONN; return -ENOTCONN;
...@@ -1653,15 +1651,18 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost, ...@@ -1653,15 +1651,18 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost,
struct iscsi_endpoint *ep; struct iscsi_endpoint *ep;
int rc = 0; int rc = 0;
if (shost) if (shost) {
/* driver is given scsi host to work with */ /* driver is given scsi host to work with */
hba = iscsi_host_priv(shost); hba = iscsi_host_priv(shost);
else /* Register the device with cnic if not already done so */
bnx2i_register_device(hba);
} else
/* /*
* check if the given destination can be reached through * check if the given destination can be reached through
* a iscsi capable NetXtreme2 device * a iscsi capable NetXtreme2 device
*/ */
hba = bnx2i_check_route(dst_addr); hba = bnx2i_check_route(dst_addr);
if (!hba) { if (!hba) {
rc = -ENOMEM; rc = -ENOMEM;
goto check_busy; goto check_busy;
...@@ -1681,8 +1682,6 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost, ...@@ -1681,8 +1682,6 @@ static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost,
goto net_if_down; goto net_if_down;
} }
bnx2i_ep->state = EP_STATE_IDLE;
bnx2i_ep->ep_iscsi_cid = (u16) -1;
bnx2i_ep->num_active_cmds = 0; bnx2i_ep->num_active_cmds = 0;
iscsi_cid = bnx2i_alloc_iscsi_cid(hba); iscsi_cid = bnx2i_alloc_iscsi_cid(hba);
if (iscsi_cid == -1) { if (iscsi_cid == -1) {
......
...@@ -353,6 +353,12 @@ ch_readconfig(scsi_changer *ch) ...@@ -353,6 +353,12 @@ ch_readconfig(scsi_changer *ch)
/* look up the devices of the data transfer elements */ /* look up the devices of the data transfer elements */
ch->dt = kmalloc(ch->counts[CHET_DT]*sizeof(struct scsi_device), ch->dt = kmalloc(ch->counts[CHET_DT]*sizeof(struct scsi_device),
GFP_KERNEL); GFP_KERNEL);
if (!ch->dt) {
kfree(buffer);
return -ENOMEM;
}
for (elem = 0; elem < ch->counts[CHET_DT]; elem++) { for (elem = 0; elem < ch->counts[CHET_DT]; elem++) {
id = -1; id = -1;
lun = 0; lun = 0;
......
This diff is collapsed.
This diff is collapsed.
...@@ -663,7 +663,7 @@ static int alua_activate(struct scsi_device *sdev) ...@@ -663,7 +663,7 @@ static int alua_activate(struct scsi_device *sdev)
goto out; goto out;
} }
if (h->tpgs == TPGS_MODE_EXPLICIT && h->state != TPGS_STATE_OPTIMIZED) if (h->tpgs & TPGS_MODE_EXPLICIT && h->state != TPGS_STATE_OPTIMIZED)
err = alua_stpg(sdev, TPGS_STATE_OPTIMIZED, h); err = alua_stpg(sdev, TPGS_STATE_OPTIMIZED, h);
out: out:
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -115,7 +115,7 @@ void fnic_handle_frame(struct work_struct *work) ...@@ -115,7 +115,7 @@ void fnic_handle_frame(struct work_struct *work)
} }
spin_unlock_irqrestore(&fnic->fnic_lock, flags); spin_unlock_irqrestore(&fnic->fnic_lock, flags);
fc_exch_recv(lp, lp->emp, fp); fc_exch_recv(lp, fp);
} }
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -124,6 +124,7 @@ static void srp_ring_free(struct device *dev, struct srp_buf **ring, size_t max, ...@@ -124,6 +124,7 @@ static void srp_ring_free(struct device *dev, struct srp_buf **ring, size_t max,
dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma); dma_free_coherent(dev, size, ring[i]->buf, ring[i]->dma);
kfree(ring[i]); kfree(ring[i]);
} }
kfree(ring);
} }
int srp_target_alloc(struct srp_target *target, struct device *dev, int srp_target_alloc(struct srp_target *target, struct device *dev,
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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