Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (28 commits)
  [SCSI] mpt fusion: Changes in mptctl.c for logging support
  [SCSI] mpt fusion: Changes in mptfc.c mptlan.c mptsas.c and mptspi.c for logging support
  [SCSI] mpt fusion: Changes in mptscsih.c for logging support
  [SCSI] mpt fusion: Changes in mptbase.c for logging support
  [SCSI] mpt fusion: logging support in Kconfig, Makefile, mptbase.h and addition of mptdebug.h
  [SCSI] libsas: Fix potential NULL dereference in sas_smp_get_phy_events()
  [SCSI] bsg: Fix build for CONFIG_BLOCK=n
  [SCSI] aacraid: fix Sunrise Lake reset handling
  [SCSI] aacraid: add SCSI SYNCHONIZE_CACHE range checking
  [SCSI] add easyRAID to the no report luns blacklist
  [SCSI] advansys: lindent and other large, uninteresting changes
  [SCSI] aic79xx, aic7xxx: Fix incorrect width setting
  [SCSI] qla2xxx: fix to honor ignored parameters in sysfs attributes
  [SCSI] aacraid: draw line in sand, sundry cleanup and version update
  [SCSI] iscsi_tcp: Turn off bounce buffers
  [SCSI] libiscsi: fix cmd seqeunce number checking
  [SCSI] iscsi_tcp, ib_iser Enable module refcounting for iscsi host template
  [SCSI] libiscsi: make sure session is not blocked when removing host
  [SCSI] libsas: Remove PCI dependencies
  [SCSI] simscsi: convert to use the data buffer accessors
  ...
This commit is contained in:
Linus Torvalds 2007-07-29 17:22:03 -07:00
commit a6ce22a5f6
39 changed files with 15361 additions and 14331 deletions

View File

@ -121,49 +121,23 @@ simscsi_biosparam (struct scsi_device *sdev, struct block_device *n,
return 0; return 0;
} }
static void
simscsi_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset, unsigned long len)
{
struct disk_stat stat;
struct disk_req req;
req.addr = __pa(sc->request_buffer);
req.len = len; /* # of bytes to transfer */
if (sc->request_bufflen < req.len)
return;
stat.fd = desc[sc->device->id];
if (DBG)
printk("simscsi_%s @ %lx (off %lx)\n",
mode == SSC_READ ? "read":"write", req.addr, offset);
ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
if (stat.count == req.len) {
sc->result = GOOD;
} else {
sc->result = DID_ERROR << 16;
}
}
static void static void
simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset) simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
{ {
int list_len = sc->use_sg; int i;
struct scatterlist *sl = (struct scatterlist *)sc->request_buffer; struct scatterlist *sl;
struct disk_stat stat; struct disk_stat stat;
struct disk_req req; struct disk_req req;
stat.fd = desc[sc->device->id]; stat.fd = desc[sc->device->id];
while (list_len) { scsi_for_each_sg(sc, sl, scsi_sg_count(sc), i) {
req.addr = __pa(page_address(sl->page) + sl->offset); req.addr = __pa(page_address(sl->page) + sl->offset);
req.len = sl->length; req.len = sl->length;
if (DBG) if (DBG)
printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n", printk("simscsi_sg_%s @ %lx (off %lx) use_sg=%d len=%d\n",
mode == SSC_READ ? "read":"write", req.addr, offset, mode == SSC_READ ? "read":"write", req.addr, offset,
list_len, sl->length); scsi_sg_count(sc) - i, sl->length);
ia64_ssc(stat.fd, 1, __pa(&req), offset, mode); ia64_ssc(stat.fd, 1, __pa(&req), offset, mode);
ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION); ia64_ssc(__pa(&stat), 0, 0, 0, SSC_WAIT_COMPLETION);
@ -173,8 +147,6 @@ simscsi_sg_readwrite (struct scsi_cmnd *sc, int mode, unsigned long offset)
return; return;
} }
offset += sl->length; offset += sl->length;
sl++;
list_len--;
} }
sc->result = GOOD; sc->result = GOOD;
} }
@ -190,10 +162,7 @@ simscsi_readwrite6 (struct scsi_cmnd *sc, int mode)
unsigned long offset; unsigned long offset;
offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512; offset = (((sc->cmnd[1] & 0x1f) << 16) | (sc->cmnd[2] << 8) | sc->cmnd[3])*512;
if (sc->use_sg > 0) simscsi_sg_readwrite(sc, mode, offset);
simscsi_sg_readwrite(sc, mode, offset);
else
simscsi_readwrite(sc, mode, offset, sc->cmnd[4]*512);
} }
static size_t static size_t
@ -230,26 +199,21 @@ simscsi_readwrite10 (struct scsi_cmnd *sc, int mode)
| ((unsigned long)sc->cmnd[3] << 16) | ((unsigned long)sc->cmnd[3] << 16)
| ((unsigned long)sc->cmnd[4] << 8) | ((unsigned long)sc->cmnd[4] << 8)
| ((unsigned long)sc->cmnd[5] << 0))*512UL; | ((unsigned long)sc->cmnd[5] << 0))*512UL;
if (sc->use_sg > 0) simscsi_sg_readwrite(sc, mode, offset);
simscsi_sg_readwrite(sc, mode, offset);
else
simscsi_readwrite(sc, mode, offset, ((sc->cmnd[7] << 8) | sc->cmnd[8])*512);
} }
static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len) static void simscsi_fillresult(struct scsi_cmnd *sc, char *buf, unsigned len)
{ {
int scatterlen = sc->use_sg; int i;
unsigned thislen;
struct scatterlist *slp; struct scatterlist *slp;
if (scatterlen == 0) scsi_for_each_sg(sc, slp, scsi_sg_count(sc), i) {
memcpy(sc->request_buffer, buf, len); if (!len)
else for (slp = (struct scatterlist *)sc->request_buffer; break;
scatterlen-- > 0 && len > 0; slp++) { thislen = min(len, slp->length);
unsigned thislen = min(len, slp->length);
memcpy(page_address(slp->page) + slp->offset, buf, thislen); memcpy(page_address(slp->page) + slp->offset, buf, thislen);
slp++;
len -= thislen; len -= thislen;
} }
} }
@ -275,7 +239,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
if (target_id <= 15 && sc->device->lun == 0) { if (target_id <= 15 && sc->device->lun == 0) {
switch (sc->cmnd[0]) { switch (sc->cmnd[0]) {
case INQUIRY: case INQUIRY:
if (sc->request_bufflen < 35) { if (scsi_bufflen(sc) < 35) {
break; break;
} }
sprintf (fname, "%s%c", simscsi_root, 'a' + target_id); sprintf (fname, "%s%c", simscsi_root, 'a' + target_id);
@ -328,7 +292,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
break; break;
case READ_CAPACITY: case READ_CAPACITY:
if (desc[target_id] < 0 || sc->request_bufflen < 8) { if (desc[target_id] < 0 || scsi_bufflen(sc) < 8) {
break; break;
} }
buf = localbuf; buf = localbuf;
@ -350,7 +314,7 @@ simscsi_queuecommand (struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
case MODE_SENSE: case MODE_SENSE:
case MODE_SENSE_10: case MODE_SENSE_10:
/* sd.c uses this to determine whether disk does write-caching. */ /* sd.c uses this to determine whether disk does write-caching. */
simscsi_fillresult(sc, (char *)empty_zero_page, sc->request_bufflen); simscsi_fillresult(sc, (char *)empty_zero_page, scsi_bufflen(sc));
sc->result = GOOD; sc->result = GOOD;
break; break;

View File

@ -9,13 +9,6 @@
* archive for more details. * archive for more details.
* *
*/ */
/*
* TODO
* - Should this get merged, block/scsi_ioctl.c will be migrated into
* this file. To keep maintenance down, it's easier to have them
* seperated right now.
*
*/
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/file.h> #include <linux/file.h>
@ -24,6 +17,7 @@
#include <linux/cdev.h> #include <linux/cdev.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <linux/uio.h> #include <linux/uio.h>
#include <linux/idr.h>
#include <linux/bsg.h> #include <linux/bsg.h>
#include <scsi/scsi.h> #include <scsi/scsi.h>
@ -70,13 +64,12 @@ enum {
#endif #endif
static DEFINE_MUTEX(bsg_mutex); static DEFINE_MUTEX(bsg_mutex);
static int bsg_device_nr, bsg_minor_idx; static DEFINE_IDR(bsg_minor_idr);
#define BSG_LIST_ARRAY_SIZE 8 #define BSG_LIST_ARRAY_SIZE 8
static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE]; static struct hlist_head bsg_device_list[BSG_LIST_ARRAY_SIZE];
static struct class *bsg_class; static struct class *bsg_class;
static LIST_HEAD(bsg_class_list);
static int bsg_major; static int bsg_major;
static struct kmem_cache *bsg_cmd_cachep; static struct kmem_cache *bsg_cmd_cachep;
@ -92,7 +85,6 @@ struct bsg_command {
struct bio *bidi_bio; struct bio *bidi_bio;
int err; int err;
struct sg_io_v4 hdr; struct sg_io_v4 hdr;
struct sg_io_v4 __user *uhdr;
char sense[SCSI_SENSE_BUFFERSIZE]; char sense[SCSI_SENSE_BUFFERSIZE];
}; };
@ -620,7 +612,6 @@ static int __bsg_write(struct bsg_device *bd, const char __user *buf,
break; break;
} }
bc->uhdr = (struct sg_io_v4 __user *) buf;
if (copy_from_user(&bc->hdr, buf, sizeof(bc->hdr))) { if (copy_from_user(&bc->hdr, buf, sizeof(bc->hdr))) {
ret = -EFAULT; ret = -EFAULT;
break; break;
@ -781,23 +772,18 @@ static struct bsg_device *__bsg_get_device(int minor)
static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file) static struct bsg_device *bsg_get_device(struct inode *inode, struct file *file)
{ {
struct bsg_device *bd = __bsg_get_device(iminor(inode)); struct bsg_device *bd;
struct bsg_class_device *bcd, *__bcd; struct bsg_class_device *bcd;
bd = __bsg_get_device(iminor(inode));
if (bd) if (bd)
return bd; return bd;
/* /*
* find the class device * find the class device
*/ */
bcd = NULL;
mutex_lock(&bsg_mutex); mutex_lock(&bsg_mutex);
list_for_each_entry(__bcd, &bsg_class_list, list) { bcd = idr_find(&bsg_minor_idr, iminor(inode));
if (__bcd->minor == iminor(inode)) {
bcd = __bcd;
break;
}
}
mutex_unlock(&bsg_mutex); mutex_unlock(&bsg_mutex);
if (!bcd) if (!bcd)
@ -936,13 +922,12 @@ void bsg_unregister_queue(struct request_queue *q)
return; return;
mutex_lock(&bsg_mutex); mutex_lock(&bsg_mutex);
idr_remove(&bsg_minor_idr, bcd->minor);
sysfs_remove_link(&q->kobj, "bsg"); sysfs_remove_link(&q->kobj, "bsg");
class_device_unregister(bcd->class_dev); class_device_unregister(bcd->class_dev);
put_device(bcd->dev); put_device(bcd->dev);
bcd->class_dev = NULL; bcd->class_dev = NULL;
bcd->dev = NULL; bcd->dev = NULL;
list_del_init(&bcd->list);
bsg_device_nr--;
mutex_unlock(&bsg_mutex); mutex_unlock(&bsg_mutex);
} }
EXPORT_SYMBOL_GPL(bsg_unregister_queue); EXPORT_SYMBOL_GPL(bsg_unregister_queue);
@ -950,9 +935,9 @@ EXPORT_SYMBOL_GPL(bsg_unregister_queue);
int bsg_register_queue(struct request_queue *q, struct device *gdev, int bsg_register_queue(struct request_queue *q, struct device *gdev,
const char *name) const char *name)
{ {
struct bsg_class_device *bcd, *__bcd; struct bsg_class_device *bcd;
dev_t dev; dev_t dev;
int ret = -EMFILE; int ret, minor;
struct class_device *class_dev = NULL; struct class_device *class_dev = NULL;
const char *devname; const char *devname;
@ -969,28 +954,26 @@ int bsg_register_queue(struct request_queue *q, struct device *gdev,
bcd = &q->bsg_dev; bcd = &q->bsg_dev;
memset(bcd, 0, sizeof(*bcd)); memset(bcd, 0, sizeof(*bcd));
INIT_LIST_HEAD(&bcd->list);
mutex_lock(&bsg_mutex); mutex_lock(&bsg_mutex);
if (bsg_device_nr == BSG_MAX_DEVS) {
ret = idr_pre_get(&bsg_minor_idr, GFP_KERNEL);
if (!ret) {
ret = -ENOMEM;
goto unlock;
}
ret = idr_get_new(&bsg_minor_idr, bcd, &minor);
if (ret < 0)
goto unlock;
if (minor >= BSG_MAX_DEVS) {
printk(KERN_ERR "bsg: too many bsg devices\n"); printk(KERN_ERR "bsg: too many bsg devices\n");
goto err; ret = -EINVAL;
goto remove_idr;
} }
retry: bcd->minor = minor;
list_for_each_entry(__bcd, &bsg_class_list, list) {
if (__bcd->minor == bsg_minor_idx) {
bsg_minor_idx++;
if (bsg_minor_idx == BSG_MAX_DEVS)
bsg_minor_idx = 0;
goto retry;
}
}
bcd->minor = bsg_minor_idx++;
if (bsg_minor_idx == BSG_MAX_DEVS)
bsg_minor_idx = 0;
bcd->queue = q; bcd->queue = q;
bcd->dev = get_device(gdev); bcd->dev = get_device(gdev);
dev = MKDEV(bsg_major, bcd->minor); dev = MKDEV(bsg_major, bcd->minor);
@ -998,27 +981,26 @@ retry:
devname); devname);
if (IS_ERR(class_dev)) { if (IS_ERR(class_dev)) {
ret = PTR_ERR(class_dev); ret = PTR_ERR(class_dev);
goto err_put; goto put_dev;
} }
bcd->class_dev = class_dev; bcd->class_dev = class_dev;
if (q->kobj.sd) { if (q->kobj.sd) {
ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg"); ret = sysfs_create_link(&q->kobj, &bcd->class_dev->kobj, "bsg");
if (ret) if (ret)
goto err_unregister; goto unregister_class_dev;
} }
list_add_tail(&bcd->list, &bsg_class_list);
bsg_device_nr++;
mutex_unlock(&bsg_mutex); mutex_unlock(&bsg_mutex);
return 0; return 0;
err_unregister: unregister_class_dev:
class_device_unregister(class_dev); class_device_unregister(class_dev);
err_put: put_dev:
put_device(gdev); put_device(gdev);
err: remove_idr:
idr_remove(&bsg_minor_idr, minor);
unlock:
mutex_unlock(&bsg_mutex); mutex_unlock(&bsg_mutex);
return ret; return ret;
} }

View File

@ -548,6 +548,7 @@ iscsi_iser_ep_disconnect(__u64 ep_handle)
} }
static struct scsi_host_template iscsi_iser_sht = { static struct scsi_host_template iscsi_iser_sht = {
.module = THIS_MODULE,
.name = "iSCSI Initiator over iSER, v." DRV_VER, .name = "iSCSI Initiator over iSER, v." DRV_VER,
.queuecommand = iscsi_queuecommand, .queuecommand = iscsi_queuecommand,
.can_queue = ISCSI_DEF_XMIT_CMDS_MAX - 1, .can_queue = ISCSI_DEF_XMIT_CMDS_MAX - 1,

View File

@ -102,4 +102,18 @@ config FUSION_LAN
If unsure whether you really want or need this, say N. If unsure whether you really want or need this, say N.
config FUSION_LOGGING
bool "Fusion MPT logging facility"
depends on FUSION
---help---
This turns on a logging facility that can be used to debug a number
of Fusion MPT related problems.
The debug level can be programmed on the fly via SysFS (hex values)
echo [level] > /sys/class/scsi_host/host#/debug_level
There are various debug levels that an be found in the source:
file:drivers/message/fusion/mptdebug.h
endmenu endmenu

View File

@ -1,39 +1,8 @@
# Fusion MPT drivers; recognized debug defines... # Fusion MPT drivers; recognized debug defines...
# MPT general:
#EXTRA_CFLAGS += -DMPT_DEBUG
#EXTRA_CFLAGS += -DMPT_DEBUG_MSG_FRAME
#EXTRA_CFLAGS += -DMPT_DEBUG_SG
#EXTRA_CFLAGS += -DMPT_DEBUG_EVENTS
#EXTRA_CFLAGS += -DMPT_DEBUG_VERBOSE_EVENTS
#EXTRA_CFLAGS += -DMPT_DEBUG_INIT
#EXTRA_CFLAGS += -DMPT_DEBUG_EXIT
#EXTRA_CFLAGS += -DMPT_DEBUG_FAIL
#EXTRA_CFLAGS += -DMPT_DEBUG_DV
#EXTRA_CFLAGS += -DMPT_DEBUG_TM
#EXTRA_CFLAGS += -DMPT_DEBUG_REPLY
# # enable verbose logging
# driver/module specifics... # CONFIG_FUSION_LOGGING needs to be enabled in Kconfig
# #EXTRA_CFLAGS += -DMPT_DEBUG_VERBOSE
# For mptbase:
#CFLAGS_mptbase.o += -DMPT_DEBUG_HANDSHAKE
#CFLAGS_mptbase.o += -DMPT_DEBUG_CONFIG
#CFLAGS_mptbase.o += -DMPT_DEBUG_DL
#CFLAGS_mptbase.o += -DMPT_DEBUG_IRQ
#CFLAGS_mptbase.o += -DMPT_DEBUG_RESET
#
# For mptscsih:
#CFLAGS_mptscsih.o += -DMPT_DEBUG_SCSI
#
# For mptctl:
#CFLAGS_mptctl.o += -DMPT_DEBUG_IOCTL
#
# For mptfc:
#CFLAGS_mptfc.o += -DMPT_DEBUG_FC
# For mptsas:
#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS
#CFLAGS_mptsas.o += -DMPT_DEBUG_SAS_WIDE
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-} LSI_LOGIC #=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-} LSI_LOGIC

File diff suppressed because it is too large Load Diff

View File

@ -186,6 +186,7 @@
* MPT drivers. NOTE: Users of these macro defs must * MPT drivers. NOTE: Users of these macro defs must
* themselves define their own MYNAM. * themselves define their own MYNAM.
*/ */
#define MYIOC_s_DEBUG_FMT KERN_DEBUG MYNAM ": %s: "
#define MYIOC_s_INFO_FMT KERN_INFO MYNAM ": %s: " #define MYIOC_s_INFO_FMT KERN_INFO MYNAM ": %s: "
#define MYIOC_s_NOTE_FMT KERN_NOTICE MYNAM ": %s: " #define MYIOC_s_NOTE_FMT KERN_NOTICE MYNAM ": %s: "
#define MYIOC_s_WARN_FMT KERN_WARNING MYNAM ": %s: WARNING - " #define MYIOC_s_WARN_FMT KERN_WARNING MYNAM ": %s: WARNING - "
@ -543,6 +544,7 @@ typedef struct _MPT_ADAPTER
char board_tracer[16]; char board_tracer[16];
u16 nvdata_version_persistent; u16 nvdata_version_persistent;
u16 nvdata_version_default; u16 nvdata_version_default;
int debug_level;
u8 io_missing_delay; u8 io_missing_delay;
u8 device_missing_delay; u8 device_missing_delay;
SYSIF_REGS __iomem *chip; /* == c8817000 (mmap) */ SYSIF_REGS __iomem *chip; /* == c8817000 (mmap) */
@ -718,171 +720,7 @@ typedef struct _mpt_sge {
/* /*
* Funky (private) macros... * Funky (private) macros...
*/ */
#ifdef MPT_DEBUG #include "mptdebug.h"
#define dprintk(x) printk x
#else
#define dprintk(x)
#endif
#ifdef MPT_DEBUG_INIT
#define dinitprintk(x) printk x
#define DBG_DUMP_FW_REQUEST_FRAME(mfp) \
{ int i, n = 10; \
u32 *m = (u32 *)(mfp); \
printk(KERN_INFO " "); \
for (i=0; i<n; i++) \
printk(" %08x", le32_to_cpu(m[i])); \
printk("\n"); \
}
#else
#define dinitprintk(x)
#define DBG_DUMP_FW_REQUEST_FRAME(mfp)
#endif
#ifdef MPT_DEBUG_EXIT
#define dexitprintk(x) printk x
#else
#define dexitprintk(x)
#endif
#if defined MPT_DEBUG_FAIL || defined (MPT_DEBUG_SG)
#define dfailprintk(x) printk x
#else
#define dfailprintk(x)
#endif
#ifdef MPT_DEBUG_HANDSHAKE
#define dhsprintk(x) printk x
#else
#define dhsprintk(x)
#endif
#if defined(MPT_DEBUG_EVENTS) || defined(MPT_DEBUG_VERBOSE_EVENTS)
#define devtprintk(x) printk x
#else
#define devtprintk(x)
#endif
#ifdef MPT_DEBUG_VERBOSE_EVENTS
#define devtverboseprintk(x) printk x
#else
#define devtverboseprintk(x)
#endif
#ifdef MPT_DEBUG_RESET
#define drsprintk(x) printk x
#else
#define drsprintk(x)
#endif
//#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
#if defined(MPT_DEBUG_MSG_FRAME)
#define dmfprintk(x) printk x
#define DBG_DUMP_REQUEST_FRAME(mfp) \
{ int i, n = 24; \
u32 *m = (u32 *)(mfp); \
for (i=0; i<n; i++) { \
if (i && ((i%8)==0)) \
printk("\n"); \
printk("%08x ", le32_to_cpu(m[i])); \
} \
printk("\n"); \
}
#else
#define dmfprintk(x)
#define DBG_DUMP_REQUEST_FRAME(mfp)
#endif
#ifdef MPT_DEBUG_IRQ
#define dirqprintk(x) printk x
#else
#define dirqprintk(x)
#endif
#ifdef MPT_DEBUG_SG
#define dsgprintk(x) printk x
#else
#define dsgprintk(x)
#endif
#if defined(MPT_DEBUG_DL) || defined(MPT_DEBUG)
#define ddlprintk(x) printk x
#else
#define ddlprintk(x)
#endif
#ifdef MPT_DEBUG_DV
#define ddvprintk(x) printk x
#else
#define ddvprintk(x)
#endif
#if defined(MPT_DEBUG_DV) || defined(MPT_DEBUG_DV_TINY)
#define ddvtprintk(x) printk x
#else
#define ddvtprintk(x)
#endif
#ifdef MPT_DEBUG_IOCTL
#define dctlprintk(x) printk x
#else
#define dctlprintk(x)
#endif
#ifdef MPT_DEBUG_REPLY
#define dreplyprintk(x) printk x
#else
#define dreplyprintk(x)
#endif
#ifdef DMPT_DEBUG_FC
#define dfcprintk(x) printk x
#else
#define dfcprintk(x)
#endif
#ifdef MPT_DEBUG_TM
#define dtmprintk(x) printk x
#define DBG_DUMP_TM_REQUEST_FRAME(mfp) \
{ u32 *m = (u32 *)(mfp); \
int i, n = 13; \
printk("TM_REQUEST:\n"); \
for (i=0; i<n; i++) { \
if (i && ((i%8)==0)) \
printk("\n"); \
printk("%08x ", le32_to_cpu(m[i])); \
} \
printk("\n"); \
}
#define DBG_DUMP_TM_REPLY_FRAME(mfp) \
{ u32 *m = (u32 *)(mfp); \
int i, n = (le32_to_cpu(m[0]) & 0x00FF0000) >> 16; \
printk("TM_REPLY MessageLength=%d:\n", n); \
for (i=0; i<n; i++) { \
if (i && ((i%8)==0)) \
printk("\n"); \
printk(" %08x", le32_to_cpu(m[i])); \
} \
printk("\n"); \
}
#else
#define dtmprintk(x)
#define DBG_DUMP_TM_REQUEST_FRAME(mfp)
#define DBG_DUMP_TM_REPLY_FRAME(mfp)
#endif
#if defined(MPT_DEBUG_CONFIG) || defined(MPT_DEBUG)
#define dcprintk(x) printk x
#else
#define dcprintk(x)
#endif
#if defined(MPT_DEBUG_SCSI) || defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
#define dsprintk(x) printk x
#else
#define dsprintk(x)
#endif
#define MPT_INDEX_2_MFPTR(ioc,idx) \ #define MPT_INDEX_2_MFPTR(ioc,idx) \
(MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) ) (MPT_FRAME_HDR*)( (u8*)(ioc)->req_frames + (ioc)->req_sz * (idx) )
@ -893,36 +731,6 @@ typedef struct _mpt_sge {
#define MPT_INDEX_2_RFPTR(ioc,idx) \ #define MPT_INDEX_2_RFPTR(ioc,idx) \
(MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) ) (MPT_FRAME_HDR*)( (u8*)(ioc)->reply_frames + (ioc)->req_sz * (idx) )
#if defined(MPT_DEBUG) || defined(MPT_DEBUG_MSG_FRAME)
#define DBG_DUMP_REPLY_FRAME(mfp) \
{ u32 *m = (u32 *)(mfp); \
int i, n = (le32_to_cpu(m[0]) & 0x00FF0000) >> 16; \
printk(KERN_INFO " "); \
for (i=0; i<n; i++) \
printk(" %08x", le32_to_cpu(m[i])); \
printk("\n"); \
}
#define DBG_DUMP_REQUEST_FRAME_HDR(mfp) \
{ int i, n = 3; \
u32 *m = (u32 *)(mfp); \
printk(KERN_INFO " "); \
for (i=0; i<n; i++) \
printk(" %08x", le32_to_cpu(m[i])); \
printk("\n"); \
}
#else
#define DBG_DUMP_REPLY_FRAME(mfp)
#define DBG_DUMP_REQUEST_FRAME_HDR(mfp)
#endif
// debug sas wide ports
#ifdef MPT_DEBUG_SAS_WIDE
#define dsaswideprintk(x) printk x
#else
#define dsaswideprintk(x)
#endif
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#define SCSI_STD_SENSE_BYTES 18 #define SCSI_STD_SENSE_BYTES 18

View File

@ -181,7 +181,7 @@ static inline int
mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock) mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
{ {
int rc = 0; int rc = 0;
dctlprintk((KERN_INFO MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock)); // dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down(%p,%d) called\n", ioc, nonblock));
if (nonblock) { if (nonblock) {
if (!mutex_trylock(&ioc->ioctl->ioctl_mutex)) if (!mutex_trylock(&ioc->ioctl->ioctl_mutex))
@ -190,7 +190,7 @@ mptctl_syscall_down(MPT_ADAPTER *ioc, int nonblock)
if (mutex_lock_interruptible(&ioc->ioctl->ioctl_mutex)) if (mutex_lock_interruptible(&ioc->ioctl->ioctl_mutex))
rc = -ERESTARTSYS; rc = -ERESTARTSYS;
} }
dctlprintk((KERN_INFO MYNAM "::mptctl_syscall_down return %d\n", rc)); // dctlprintk(ioc, printk(KERN_DEBUG MYNAM "::mptctl_syscall_down return %d\n", rc));
return rc; return rc;
} }
@ -209,18 +209,19 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
u16 iocStatus; u16 iocStatus;
u8 cmd; u8 cmd;
dctlprintk(("mptctl_reply()!\n"));
if (req) if (req)
cmd = req->u.hdr.Function; cmd = req->u.hdr.Function;
else else
return 1; return 1;
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\tcompleting mpi function (0x%02X), req=%p, "
"reply=%p\n", ioc->name, req->u.hdr.Function, req, reply));
if (ioc->ioctl) { if (ioc->ioctl) {
if (reply==NULL) { if (reply==NULL) {
dctlprintk(("mptctl_reply() NULL Reply " dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_reply() NULL Reply "
"Function=%x!\n", cmd)); "Function=%x!\n", ioc->name, cmd));
ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD; ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD;
ioc->ioctl->reset &= ~MPTCTL_RESET_OK; ioc->ioctl->reset &= ~MPTCTL_RESET_OK;
@ -233,14 +234,9 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
} }
dctlprintk(("mptctl_reply() with req=%p "
"reply=%p Function=%x!\n", req, reply, cmd));
/* Copy the reply frame (which much exist /* Copy the reply frame (which much exist
* for non-SCSI I/O) to the IOC structure. * for non-SCSI I/O) to the IOC structure.
*/ */
dctlprintk(("Copying Reply Frame @%p to ioc%d!\n",
reply, ioc->id));
memcpy(ioc->ioctl->ReplyFrame, reply, memcpy(ioc->ioctl->ReplyFrame, reply,
min(ioc->reply_sz, 4*reply->u.reply.MsgLength)); min(ioc->reply_sz, 4*reply->u.reply.MsgLength));
ioc->ioctl->status |= MPT_IOCTL_STATUS_RF_VALID; ioc->ioctl->status |= MPT_IOCTL_STATUS_RF_VALID;
@ -252,8 +248,24 @@ mptctl_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply)
if (iocStatus == MPI_IOCSTATUS_SUCCESS) if (iocStatus == MPI_IOCSTATUS_SUCCESS)
ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD; ioc->ioctl->status |= MPT_IOCTL_STATUS_COMMAND_GOOD;
if (iocStatus || reply->u.reply.IOCLogInfo)
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\tiocstatus (0x%04X), "
"loginfo (0x%08X)\n", ioc->name,
iocStatus,
le32_to_cpu(reply->u.reply.IOCLogInfo)));
if ((cmd == MPI_FUNCTION_SCSI_IO_REQUEST) || if ((cmd == MPI_FUNCTION_SCSI_IO_REQUEST) ||
(cmd == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) { (cmd == MPI_FUNCTION_RAID_SCSI_IO_PASSTHROUGH)) {
if (reply->u.sreply.SCSIStatus || reply->u.sreply.SCSIState)
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"\tscsi_status (0x%02x), scsi_state (0x%02x), "
"tag = (0x%04x), transfer_count (0x%08x)\n", ioc->name,
reply->u.sreply.SCSIStatus,
reply->u.sreply.SCSIState,
le16_to_cpu(reply->u.sreply.TaskTag),
le32_to_cpu(reply->u.sreply.TransferCount)));
ioc->ioctl->reset &= ~MPTCTL_RESET_OK; ioc->ioctl->reset &= ~MPTCTL_RESET_OK;
if ((iocStatus == MPI_IOCSTATUS_SCSI_DATA_UNDERRUN) || if ((iocStatus == MPI_IOCSTATUS_SCSI_DATA_UNDERRUN) ||
@ -298,8 +310,8 @@ static void mptctl_timeout_expired (MPT_IOCTL *ioctl)
{ {
int rc = 1; int rc = 1;
dctlprintk((KERN_NOTICE MYNAM ": Timeout Expired! Host %d\n", dctlprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT ": Timeout Expired! Host %d\n",
ioctl->ioc->id)); ioctl->ioc->name, ioctl->ioc->id));
if (ioctl == NULL) if (ioctl == NULL)
return; return;
@ -311,7 +323,7 @@ static void mptctl_timeout_expired (MPT_IOCTL *ioctl)
/* Issue a reset for this device. /* Issue a reset for this device.
* The IOC is not responding. * The IOC is not responding.
*/ */
dctlprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n", dctlprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n",
ioctl->ioc->name)); ioctl->ioc->name));
mpt_HardResetHandler(ioctl->ioc, CAN_SLEEP); mpt_HardResetHandler(ioctl->ioc, CAN_SLEEP);
} }
@ -350,14 +362,14 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
/* Send request /* Send request
*/ */
if ((mf = mpt_get_msg_frame(mptctl_id, ioctl->ioc)) == NULL) { if ((mf = mpt_get_msg_frame(mptctl_id, ioctl->ioc)) == NULL) {
dctlprintk((MYIOC_s_WARN_FMT "IssueTaskMgmt, no msg frames!!\n", dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt, no msg frames!!\n",
ioctl->ioc->name)); ioctl->ioc->name));
mptctl_free_tm_flags(ioctl->ioc); mptctl_free_tm_flags(ioctl->ioc);
return -ENOMEM; return -ENOMEM;
} }
dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt request @ %p\n", dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n",
ioctl->ioc->name, mf)); ioctl->ioc->name, mf));
pScsiTm = (SCSITaskMgmt_t *) mf; pScsiTm = (SCSITaskMgmt_t *) mf;
@ -377,15 +389,15 @@ static int mptctl_bus_reset(MPT_IOCTL *ioctl)
pScsiTm->Reserved2[ii] = 0; pScsiTm->Reserved2[ii] = 0;
pScsiTm->TaskMsgContext = 0; pScsiTm->TaskMsgContext = 0;
dtmprintk((MYIOC_s_INFO_FMT dtmprintk(ioctl->ioc, printk(MYIOC_s_DEBUG_FMT
"mptctl_bus_reset: issued.\n", ioctl->ioc->name)); "mptctl_bus_reset: issued.\n", ioctl->ioc->name));
DBG_DUMP_TM_REQUEST_FRAME((u32 *)mf); DBG_DUMP_TM_REQUEST_FRAME(ioctl->ioc, (u32 *)mf);
ioctl->wait_done=0; ioctl->wait_done=0;
if ((retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc, if ((retval = mpt_send_handshake_request(mptctl_id, ioctl->ioc,
sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) { sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!" dfailprintk(ioctl->ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd, " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
hd->ioc, mf)); hd->ioc, mf));
goto mptctl_bus_reset_done; goto mptctl_bus_reset_done;
@ -456,7 +468,7 @@ static int
mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) mptctl_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
{ {
MPT_IOCTL *ioctl = ioc->ioctl; MPT_IOCTL *ioctl = ioc->ioctl;
dctlprintk((KERN_INFO MYNAM ": IOC %s_reset routed to IOCTL driver!\n", dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": IOC %s_reset routed to IOCTL driver!\n",ioc->name,
reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
@ -487,7 +499,8 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
event = le32_to_cpu(pEvReply->Event) & 0xFF; event = le32_to_cpu(pEvReply->Event) & 0xFF;
dctlprintk(("%s() called\n", __FUNCTION__)); dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s() called\n",
ioc->name, __FUNCTION__));
if(async_queue == NULL) if(async_queue == NULL)
return 1; return 1;
@ -497,8 +510,10 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
*/ */
if (event == 0x21 ) { if (event == 0x21 ) {
ioc->aen_event_read_flag=1; ioc->aen_event_read_flag=1;
dctlprintk(("Raised SIGIO to application\n")); dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Raised SIGIO to application\n",
devtverboseprintk(("Raised SIGIO to application\n")); ioc->name));
devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Raised SIGIO to application\n", ioc->name));
kill_fasync(&async_queue, SIGIO, POLL_IN); kill_fasync(&async_queue, SIGIO, POLL_IN);
return 1; return 1;
} }
@ -515,8 +530,10 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
*/ */
if (ioc->events && (ioc->eventTypes & ( 1 << event))) { if (ioc->events && (ioc->eventTypes & ( 1 << event))) {
ioc->aen_event_read_flag=1; ioc->aen_event_read_flag=1;
dctlprintk(("Raised SIGIO to application\n")); dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT
devtverboseprintk(("Raised SIGIO to application\n")); "Raised SIGIO to application\n", ioc->name));
devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Raised SIGIO to application\n", ioc->name));
kill_fasync(&async_queue, SIGIO, POLL_IN); kill_fasync(&async_queue, SIGIO, POLL_IN);
} }
return 1; return 1;
@ -530,14 +547,12 @@ mptctl_fasync(int fd, struct file *filep, int mode)
list_for_each_entry(ioc, &ioc_list, list) list_for_each_entry(ioc, &ioc_list, list)
ioc->aen_event_read_flag=0; ioc->aen_event_read_flag=0;
dctlprintk(("%s() called\n", __FUNCTION__));
return fasync_helper(fd, filep, mode, &async_queue); return fasync_helper(fd, filep, mode, &async_queue);
} }
static int static int
mptctl_release(struct inode *inode, struct file *filep) mptctl_release(struct inode *inode, struct file *filep)
{ {
dctlprintk(("%s() called\n", __FUNCTION__));
return fasync_helper(-1, filep, 0, &async_queue); return fasync_helper(-1, filep, 0, &async_queue);
} }
@ -558,8 +573,6 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
int ret; int ret;
MPT_ADAPTER *iocp = NULL; MPT_ADAPTER *iocp = NULL;
dctlprintk(("mptctl_ioctl() called\n"));
if (copy_from_user(&khdr, uhdr, sizeof(khdr))) { if (copy_from_user(&khdr, uhdr, sizeof(khdr))) {
printk(KERN_ERR "%s::mptctl_ioctl() @%d - " printk(KERN_ERR "%s::mptctl_ioctl() @%d - "
"Unable to copy mpt_ioctl_header data @ %p\n", "Unable to copy mpt_ioctl_header data @ %p\n",
@ -574,13 +587,13 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
iocnumX = khdr.iocnum & 0xFF; iocnumX = khdr.iocnum & 0xFF;
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
(iocp == NULL)) { (iocp == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_ioctl() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnumX)); __FILE__, __LINE__, iocnumX);
return -ENODEV; return -ENODEV;
} }
if (!iocp->active) { if (!iocp->active) {
printk(KERN_ERR "%s::mptctl_ioctl() @%d - Controller disabled.\n", printk(KERN_DEBUG "%s::mptctl_ioctl() @%d - Controller disabled.\n",
__FILE__, __LINE__); __FILE__, __LINE__);
return -EFAULT; return -EFAULT;
} }
@ -612,8 +625,6 @@ __mptctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0) if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
return ret; return ret;
dctlprintk((MYIOC_s_INFO_FMT ": mptctl_ioctl()\n", iocp->name));
if (cmd == MPTFWDOWNLOAD) if (cmd == MPTFWDOWNLOAD)
ret = mptctl_fw_download(arg); ret = mptctl_fw_download(arg);
else if (cmd == MPTCOMMAND) else if (cmd == MPTCOMMAND)
@ -648,8 +659,6 @@ static int mptctl_do_reset(unsigned long arg)
struct mpt_ioctl_diag_reset krinfo; struct mpt_ioctl_diag_reset krinfo;
MPT_ADAPTER *iocp; MPT_ADAPTER *iocp;
dctlprintk((KERN_INFO "mptctl_do_reset called.\n"));
if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) { if (copy_from_user(&krinfo, urinfo, sizeof(struct mpt_ioctl_diag_reset))) {
printk(KERN_ERR "%s@%d::mptctl_do_reset - " printk(KERN_ERR "%s@%d::mptctl_do_reset - "
"Unable to copy mpt_ioctl_diag_reset struct @ %p\n", "Unable to copy mpt_ioctl_diag_reset struct @ %p\n",
@ -658,11 +667,14 @@ static int mptctl_do_reset(unsigned long arg)
} }
if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) { if (mpt_verify_adapter(krinfo.hdr.iocnum, &iocp) < 0) {
dctlprintk((KERN_ERR "%s@%d::mptctl_do_reset - ioc%d not found!\n", printk(KERN_DEBUG "%s@%d::mptctl_do_reset - ioc%d not found!\n",
__FILE__, __LINE__, krinfo.hdr.iocnum)); __FILE__, __LINE__, krinfo.hdr.iocnum);
return -ENODEV; /* (-6) No such device or address */ return -ENODEV; /* (-6) No such device or address */
} }
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "mptctl_do_reset called.\n",
iocp->name));
if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) { if (mpt_HardResetHandler(iocp, CAN_SLEEP) != 0) {
printk (KERN_ERR "%s@%d::mptctl_do_reset - reset failed.\n", printk (KERN_ERR "%s@%d::mptctl_do_reset - reset failed.\n",
__FILE__, __LINE__); __FILE__, __LINE__);
@ -695,7 +707,6 @@ mptctl_fw_download(unsigned long arg)
struct mpt_fw_xfer __user *ufwdl = (void __user *) arg; struct mpt_fw_xfer __user *ufwdl = (void __user *) arg;
struct mpt_fw_xfer kfwdl; struct mpt_fw_xfer kfwdl;
dctlprintk((KERN_INFO "mptctl_fwdl called. mptctl_id = %xh\n", mptctl_id)); //tc
if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) { if (copy_from_user(&kfwdl, ufwdl, sizeof(struct mpt_fw_xfer))) {
printk(KERN_ERR "%s@%d::_ioctl_fwdl - " printk(KERN_ERR "%s@%d::_ioctl_fwdl - "
"Unable to copy mpt_fw_xfer struct @ %p\n", "Unable to copy mpt_fw_xfer struct @ %p\n",
@ -744,15 +755,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
u16 iocstat; u16 iocstat;
pFWDownloadReply_t ReplyMsg = NULL; pFWDownloadReply_t ReplyMsg = NULL;
dctlprintk(("mptctl_do_fwdl called. mptctl_id = %xh.\n", mptctl_id));
dctlprintk(("DbG: kfwdl.bufp = %p\n", ufwbuf));
dctlprintk(("DbG: kfwdl.fwlen = %d\n", (int)fwlen));
dctlprintk(("DbG: kfwdl.ioc = %04xh\n", ioc));
if (mpt_verify_adapter(ioc, &iocp) < 0) { if (mpt_verify_adapter(ioc, &iocp) < 0) {
dctlprintk(("ioctl_fwdl - ioc%d not found!\n", printk(KERN_DEBUG "ioctl_fwdl - ioc%d not found!\n", ioc);
ioc));
return -ENODEV; /* (-6) No such device or address */ return -ENODEV; /* (-6) No such device or address */
} else { } else {
@ -761,6 +765,16 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL) if ((mf = mpt_get_msg_frame(mptctl_id, iocp)) == NULL)
return -EAGAIN; return -EAGAIN;
} }
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT
"mptctl_do_fwdl called. mptctl_id = %xh.\n", iocp->name, mptctl_id));
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.bufp = %p\n",
iocp->name, ufwbuf));
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.fwlen = %d\n",
iocp->name, (int)fwlen));
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: kfwdl.ioc = %04xh\n",
iocp->name, ioc));
dlmsg = (FWDownload_t*) mf; dlmsg = (FWDownload_t*) mf;
ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL; ptsge = (FWDownloadTCSGE_t *) &dlmsg->SGL;
sgOut = (char *) (ptsge + 1); sgOut = (char *) (ptsge + 1);
@ -829,7 +843,8 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
goto fwdl_out; goto fwdl_out;
} }
dctlprintk(("DbG: sgl buffer = %p, sgfrags = %d\n", sgl, numfrags)); dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
iocp->name, sgl, numfrags));
/* /*
* Parse SG list, copying sgl itself, * Parse SG list, copying sgl itself,
@ -865,15 +880,7 @@ mptctl_do_fw_download(int ioc, char __user *ufwbuf, size_t fwlen)
sgOut += (sizeof(dma_addr_t) + sizeof(u32)); sgOut += (sizeof(dma_addr_t) + sizeof(u32));
} }
#ifdef MPT_DEBUG DBG_DUMP_FW_DOWNLOAD(iocp, (u32 *)mf, numfrags);
{
u32 *m = (u32 *)mf;
printk(KERN_INFO MYNAM ": F/W download request:\n" KERN_INFO " ");
for (i=0; i < 7+numfrags*2; i++)
printk(" %08x", le32_to_cpu(m[i]));
printk("\n");
}
#endif
/* /*
* Finally, perform firmware download. * Finally, perform firmware download.
@ -1049,13 +1056,11 @@ kbuf_alloc_2_sgl(int bytes, u32 sgdir, int sge_offset, int *frags,
*frags = numfrags; *frags = numfrags;
*blp = buflist; *blp = buflist;
dctlprintk((KERN_INFO MYNAM "-SG: kbuf_alloc_2_sgl() - " dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
"%d SG frags generated!\n", "%d SG frags generated!\n", ioc->name, numfrags));
numfrags));
dctlprintk((KERN_INFO MYNAM "-SG: kbuf_alloc_2_sgl() - " dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: kbuf_alloc_2_sgl() - "
"last (big) alloc_sz=%d\n", "last (big) alloc_sz=%d\n", ioc->name, alloc_sz));
alloc_sz));
return sglbuf; return sglbuf;
@ -1139,7 +1144,8 @@ kfree_sgl(MptSge_t *sgl, dma_addr_t sgl_dma, struct buflist *buflist, MPT_ADAPTE
pci_free_consistent(ioc->pcidev, MAX_SGL_BYTES, sgl, sgl_dma); pci_free_consistent(ioc->pcidev, MAX_SGL_BYTES, sgl, sgl_dma);
kfree(buflist); kfree(buflist);
dctlprintk((KERN_INFO MYNAM "-SG: Free'd 1 SGL buf + %d kbufs!\n", n)); dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "-SG: Free'd 1 SGL buf + %d kbufs!\n",
ioc->name, n));
} }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@ -1166,7 +1172,6 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
struct scsi_device *sdev; struct scsi_device *sdev;
VirtDevice *vdev; VirtDevice *vdev;
dctlprintk((": mptctl_getiocinfo called.\n"));
/* Add of PCI INFO results in unaligned access for /* Add of PCI INFO results in unaligned access for
* IA64 and Sparc. Reset long to int. Return no PCI * IA64 and Sparc. Reset long to int. Return no PCI
* data for obsolete format. * data for obsolete format.
@ -1199,8 +1204,8 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg->hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_getiocinfo() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
kfree(karg); kfree(karg);
return -ENODEV; return -ENODEV;
} }
@ -1214,6 +1219,9 @@ mptctl_getiocinfo (unsigned long arg, unsigned int data_size)
return -EFAULT; return -EFAULT;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_getiocinfo called.\n",
ioc->name));
/* Fill in the data and return the structure to the calling /* Fill in the data and return the structure to the calling
* program * program
*/ */
@ -1320,7 +1328,6 @@ mptctl_gettargetinfo (unsigned long arg)
u8 port; u8 port;
struct scsi_device *sdev; struct scsi_device *sdev;
dctlprintk(("mptctl_gettargetinfo called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_targetinfo))) {
printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - " printk(KERN_ERR "%s@%d::mptctl_gettargetinfo - "
"Unable to read in mpt_ioctl_targetinfo struct @ %p\n", "Unable to read in mpt_ioctl_targetinfo struct @ %p\n",
@ -1330,11 +1337,13 @@ mptctl_gettargetinfo (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_gettargetinfo() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_gettargetinfo called.\n",
ioc->name));
/* Get the port number and set the maximum number of bytes /* Get the port number and set the maximum number of bytes
* in the returned structure. * in the returned structure.
* Ignore the port setting. * Ignore the port setting.
@ -1434,7 +1443,6 @@ mptctl_readtest (unsigned long arg)
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
int iocnum; int iocnum;
dctlprintk(("mptctl_readtest called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_test))) {
printk(KERN_ERR "%s@%d::mptctl_readtest - " printk(KERN_ERR "%s@%d::mptctl_readtest - "
"Unable to read in mpt_ioctl_test struct @ %p\n", "Unable to read in mpt_ioctl_test struct @ %p\n",
@ -1444,11 +1452,13 @@ mptctl_readtest (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_readtest() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_readtest() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_readtest called.\n",
ioc->name));
/* Fill in the data and return the structure to the calling /* Fill in the data and return the structure to the calling
* program * program
*/ */
@ -1494,7 +1504,6 @@ mptctl_eventquery (unsigned long arg)
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
int iocnum; int iocnum;
dctlprintk(("mptctl_eventquery called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventquery))) {
printk(KERN_ERR "%s@%d::mptctl_eventquery - " printk(KERN_ERR "%s@%d::mptctl_eventquery - "
"Unable to read in mpt_ioctl_eventquery struct @ %p\n", "Unable to read in mpt_ioctl_eventquery struct @ %p\n",
@ -1504,11 +1513,13 @@ mptctl_eventquery (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_eventquery() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_eventquery() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventquery called.\n",
ioc->name));
karg.eventEntries = MPTCTL_EVENT_LOG_SIZE; karg.eventEntries = MPTCTL_EVENT_LOG_SIZE;
karg.eventTypes = ioc->eventTypes; karg.eventTypes = ioc->eventTypes;
@ -1532,7 +1543,6 @@ mptctl_eventenable (unsigned long arg)
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
int iocnum; int iocnum;
dctlprintk(("mptctl_eventenable called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventenable))) {
printk(KERN_ERR "%s@%d::mptctl_eventenable - " printk(KERN_ERR "%s@%d::mptctl_eventenable - "
"Unable to read in mpt_ioctl_eventenable struct @ %p\n", "Unable to read in mpt_ioctl_eventenable struct @ %p\n",
@ -1542,11 +1552,13 @@ mptctl_eventenable (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_eventenable() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_eventenable() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventenable called.\n",
ioc->name));
if (ioc->events == NULL) { if (ioc->events == NULL) {
/* Have not yet allocated memory - do so now. /* Have not yet allocated memory - do so now.
*/ */
@ -1579,7 +1591,6 @@ mptctl_eventreport (unsigned long arg)
int iocnum; int iocnum;
int numBytes, maxEvents, max; int numBytes, maxEvents, max;
dctlprintk(("mptctl_eventreport called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_eventreport))) {
printk(KERN_ERR "%s@%d::mptctl_eventreport - " printk(KERN_ERR "%s@%d::mptctl_eventreport - "
"Unable to read in mpt_ioctl_eventreport struct @ %p\n", "Unable to read in mpt_ioctl_eventreport struct @ %p\n",
@ -1589,10 +1600,12 @@ mptctl_eventreport (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_eventreport() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_eventreport() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_eventreport called.\n",
ioc->name));
numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header); numBytes = karg.hdr.maxDataSize - sizeof(mpt_ioctl_header);
maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS); maxEvents = numBytes/sizeof(MPT_IOCTL_EVENTS);
@ -1632,7 +1645,6 @@ mptctl_replace_fw (unsigned long arg)
int iocnum; int iocnum;
int newFwSize; int newFwSize;
dctlprintk(("mptctl_replace_fw called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_replace_fw))) {
printk(KERN_ERR "%s@%d::mptctl_replace_fw - " printk(KERN_ERR "%s@%d::mptctl_replace_fw - "
"Unable to read in mpt_ioctl_replace_fw struct @ %p\n", "Unable to read in mpt_ioctl_replace_fw struct @ %p\n",
@ -1642,11 +1654,13 @@ mptctl_replace_fw (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_replace_fw() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_replace_fw() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "mptctl_replace_fw called.\n",
ioc->name));
/* If caching FW, Free the old FW image /* If caching FW, Free the old FW image
*/ */
if (ioc->cached_fw == NULL) if (ioc->cached_fw == NULL)
@ -1704,7 +1718,6 @@ mptctl_mpt_command (unsigned long arg)
int iocnum; int iocnum;
int rc; int rc;
dctlprintk(("mptctl_command called.\n"));
if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) { if (copy_from_user(&karg, uarg, sizeof(struct mpt_ioctl_command))) {
printk(KERN_ERR "%s@%d::mptctl_mpt_command - " printk(KERN_ERR "%s@%d::mptctl_mpt_command - "
@ -1715,8 +1728,8 @@ mptctl_mpt_command (unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_mpt_command() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_mpt_command() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
@ -1756,13 +1769,12 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
ulong timeout; ulong timeout;
struct scsi_device *sdev; struct scsi_device *sdev;
dctlprintk(("mptctl_do_mpt_command called.\n"));
bufIn.kptr = bufOut.kptr = NULL; bufIn.kptr = bufOut.kptr = NULL;
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_do_mpt_command() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
if (!ioc->ioctl) { if (!ioc->ioctl) {
@ -1816,6 +1828,9 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
/* Verify that this request is allowed. /* Verify that this request is allowed.
*/ */
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sending mpi function (0x%02X), req=%p\n",
ioc->name, hdr->Function, mf));
switch (hdr->Function) { switch (hdr->Function) {
case MPI_FUNCTION_IOC_FACTS: case MPI_FUNCTION_IOC_FACTS:
case MPI_FUNCTION_PORT_FACTS: case MPI_FUNCTION_PORT_FACTS:
@ -1823,6 +1838,18 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
break; break;
case MPI_FUNCTION_CONFIG: case MPI_FUNCTION_CONFIG:
{
Config_t *config_frame;
config_frame = (Config_t *)mf;
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "\ttype=0x%02x ext_type=0x%02x "
"number=0x%02x action=0x%02x\n", ioc->name,
config_frame->Header.PageType,
config_frame->ExtPageType,
config_frame->Header.PageNumber,
config_frame->Action));
break;
}
case MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND: case MPI_FUNCTION_FC_COMMON_TRANSPORT_SEND:
case MPI_FUNCTION_FC_EX_LINK_SRVC_SEND: case MPI_FUNCTION_FC_EX_LINK_SRVC_SEND:
case MPI_FUNCTION_FW_UPLOAD: case MPI_FUNCTION_FW_UPLOAD:
@ -2158,12 +2185,12 @@ mptctl_do_mpt_command (struct mpt_ioctl_command karg, void __user *mfPtr)
ioc->ioctl->wait_done = 0; ioc->ioctl->wait_done = 0;
if (hdr->Function == MPI_FUNCTION_SCSI_TASK_MGMT) { if (hdr->Function == MPI_FUNCTION_SCSI_TASK_MGMT) {
DBG_DUMP_TM_REQUEST_FRAME((u32 *)mf); DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
if (mpt_send_handshake_request(mptctl_id, ioc, if (mpt_send_handshake_request(mptctl_id, ioc,
sizeof(SCSITaskMgmt_t), (u32*)mf, sizeof(SCSITaskMgmt_t), (u32*)mf,
CAN_SLEEP) != 0) { CAN_SLEEP) != 0) {
dfailprintk((MYIOC_s_ERR_FMT "_send_handshake FAILED!" dfailprintk(ioc, printk(MYIOC_s_ERR_FMT "_send_handshake FAILED!"
" (ioc %p, mf %p) \n", ioc->name, " (ioc %p, mf %p) \n", ioc->name,
ioc, mf)); ioc, mf));
mptctl_free_tm_flags(ioc); mptctl_free_tm_flags(ioc);
@ -2303,7 +2330,6 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
MPT_FRAME_HDR *mf = NULL; MPT_FRAME_HDR *mf = NULL;
MPIHeader_t *mpi_hdr; MPIHeader_t *mpi_hdr;
dctlprintk((": mptctl_hp_hostinfo called.\n"));
/* Reset long to int. Should affect IA64 and SPARC only /* Reset long to int. Should affect IA64 and SPARC only
*/ */
if (data_size == sizeof(hp_host_info_t)) if (data_size == sizeof(hp_host_info_t))
@ -2322,10 +2348,12 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_hp_hostinfo() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_hostinfo called.\n",
ioc->name));
/* Fill in the data and return the structure to the calling /* Fill in the data and return the structure to the calling
* program * program
@ -2441,7 +2469,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
* Gather ISTWI(Industry Standard Two Wire Interface) Data * Gather ISTWI(Industry Standard Two Wire Interface) Data
*/ */
if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) { if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL) {
dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
ioc->name,__FUNCTION__)); ioc->name,__FUNCTION__));
goto out; goto out;
} }
@ -2474,7 +2502,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
HZ*MPT_IOCTL_DEFAULT_TIMEOUT /* 10 sec */); HZ*MPT_IOCTL_DEFAULT_TIMEOUT /* 10 sec */);
if(rc <=0 && (ioc->ioctl->wait_done != 1 )) { if(rc <=0 && (ioc->ioctl->wait_done != 1 )) {
/* /*
* Now we need to reset the board * Now we need to reset the board
*/ */
mpt_free_msg_frame(ioc, mf); mpt_free_msg_frame(ioc, mf);
@ -2482,7 +2510,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
goto out; goto out;
} }
/* /*
*ISTWI Data Definition *ISTWI Data Definition
* pbuf[0] = FW_VERSION = 0x4 * pbuf[0] = FW_VERSION = 0x4
* pbuf[1] = Bay Count = 6 or 4 or 2, depending on * pbuf[1] = Bay Count = 6 or 4 or 2, depending on
@ -2538,7 +2566,6 @@ mptctl_hp_targetinfo(unsigned long arg)
ConfigPageHeader_t hdr; ConfigPageHeader_t hdr;
int tmp, np, rc = 0; int tmp, np, rc = 0;
dctlprintk((": mptctl_hp_targetinfo called.\n"));
if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) { if (copy_from_user(&karg, uarg, sizeof(hp_target_info_t))) {
printk(KERN_ERR "%s@%d::mptctl_hp_targetinfo - " printk(KERN_ERR "%s@%d::mptctl_hp_targetinfo - "
"Unable to read in hp_host_targetinfo struct @ %p\n", "Unable to read in hp_host_targetinfo struct @ %p\n",
@ -2548,10 +2575,12 @@ mptctl_hp_targetinfo(unsigned long arg)
if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) || if (((iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc)) < 0) ||
(ioc == NULL)) { (ioc == NULL)) {
dctlprintk((KERN_ERR "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n", printk(KERN_DEBUG "%s::mptctl_hp_targetinfo() @%d - ioc%d not found!\n",
__FILE__, __LINE__, iocnum)); __FILE__, __LINE__, iocnum);
return -ENODEV; return -ENODEV;
} }
dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT ": mptctl_hp_targetinfo called.\n",
ioc->name));
/* There is nothing to do for FCP parts. /* There is nothing to do for FCP parts.
*/ */
@ -2694,7 +2723,6 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
int nonblock = (filp->f_flags & O_NONBLOCK); int nonblock = (filp->f_flags & O_NONBLOCK);
int ret; int ret;
dctlprintk((KERN_INFO MYNAM "::compat_mptfwxfer_ioctl() called\n"));
if (copy_from_user(&kfw32, (char __user *)arg, sizeof(kfw32))) if (copy_from_user(&kfw32, (char __user *)arg, sizeof(kfw32)))
return -EFAULT; return -EFAULT;
@ -2703,14 +2731,16 @@ compat_mptfwxfer_ioctl(struct file *filp, unsigned int cmd,
iocnumX = kfw32.iocnum & 0xFF; iocnumX = kfw32.iocnum & 0xFF;
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
(iocp == NULL)) { (iocp == NULL)) {
dctlprintk((KERN_ERR MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n", printk(KERN_DEBUG MYNAM "::compat_mptfwxfer_ioctl @%d - ioc%d not found!\n",
__LINE__, iocnumX)); __LINE__, iocnumX);
return -ENODEV; return -ENODEV;
} }
if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0) if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
return ret; return ret;
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mptfwxfer_ioctl() called\n",
iocp->name));
kfw.iocnum = iocnum; kfw.iocnum = iocnum;
kfw.fwlen = kfw32.fwlen; kfw.fwlen = kfw32.fwlen;
kfw.bufp = compat_ptr(kfw32.bufp); kfw.bufp = compat_ptr(kfw32.bufp);
@ -2734,8 +2764,6 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
int nonblock = (filp->f_flags & O_NONBLOCK); int nonblock = (filp->f_flags & O_NONBLOCK);
int ret; int ret;
dctlprintk((KERN_INFO MYNAM "::compat_mpt_command() called\n"));
if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32))) if (copy_from_user(&karg32, (char __user *)arg, sizeof(karg32)))
return -EFAULT; return -EFAULT;
@ -2743,14 +2771,16 @@ compat_mpt_command(struct file *filp, unsigned int cmd,
iocnumX = karg32.hdr.iocnum & 0xFF; iocnumX = karg32.hdr.iocnum & 0xFF;
if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) || if (((iocnum = mpt_verify_adapter(iocnumX, &iocp)) < 0) ||
(iocp == NULL)) { (iocp == NULL)) {
dctlprintk((KERN_ERR MYNAM "::compat_mpt_command @%d - ioc%d not found!\n", printk(KERN_DEBUG MYNAM "::compat_mpt_command @%d - ioc%d not found!\n",
__LINE__, iocnumX)); __LINE__, iocnumX);
return -ENODEV; return -ENODEV;
} }
if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0) if ((ret = mptctl_syscall_down(iocp, nonblock)) != 0)
return ret; return ret;
dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "compat_mpt_command() called\n",
iocp->name));
/* Copy data to karg */ /* Copy data to karg */
karg.hdr.iocnum = karg32.hdr.iocnum; karg.hdr.iocnum = karg32.hdr.iocnum;
karg.hdr.port = karg32.hdr.port; karg.hdr.port = karg32.hdr.port;
@ -2878,11 +2908,7 @@ static int __init mptctl_init(void)
show_mptmod_ver(my_NAME, my_VERSION); show_mptmod_ver(my_NAME, my_VERSION);
if(mpt_device_driver_register(&mptctl_driver, mpt_device_driver_register(&mptctl_driver, MPTCTL_DRIVER);
MPTCTL_DRIVER) != 0 ) {
dprintk((KERN_INFO MYNAM
": failed to register dd callbacks\n"));
}
/* Register this device */ /* Register this device */
err = misc_register(&mptctl_miscdev); err = misc_register(&mptctl_miscdev);
@ -2905,16 +2931,8 @@ static int __init mptctl_init(void)
goto out_fail; goto out_fail;
} }
if (mpt_reset_register(mptctl_id, mptctl_ioc_reset) == 0) { mpt_reset_register(mptctl_id, mptctl_ioc_reset);
dprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n")); mpt_event_register(mptctl_id, mptctl_event_process);
} else {
/* FIXME! */
}
if (mpt_event_register(mptctl_id, mptctl_event_process) == 0) {
devtverboseprintk((KERN_INFO MYNAM
": Registered for IOC event notifications\n"));
}
return 0; return 0;
@ -2934,11 +2952,9 @@ static void mptctl_exit(void)
/* De-register reset handler from base module */ /* De-register reset handler from base module */
mpt_reset_deregister(mptctl_id); mpt_reset_deregister(mptctl_id);
dprintk((KERN_INFO MYNAM ": Deregistered for IOC reset notifications\n"));
/* De-register callback handler from base module */ /* De-register callback handler from base module */
mpt_deregister(mptctl_id); mpt_deregister(mptctl_id);
printk(KERN_INFO MYNAM ": Deregistered from Fusion MPT base driver\n");
mpt_device_driver_deregister(MPTCTL_DRIVER); mpt_device_driver_deregister(MPTCTL_DRIVER);

View File

@ -0,0 +1,288 @@
/*
* linux/drivers/message/fusion/mptdebug.h
* For use with LSI PCI chip/adapter(s)
* running LSI Fusion MPT (Message Passing Technology) firmware.
*
* Copyright (c) 1999-2007 LSI Corporation
* (mailto:DL-MPTFusionLinux@lsi.com)
*
*/
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
#ifndef MPTDEBUG_H_INCLUDED
#define MPTDEBUG_H_INCLUDED
/*
* debug level can be programmed on the fly via SysFS (hex values)
*
* Example: (programming for MPT_DEBUG_EVENTS on host 5)
*
* echo 8 > /sys/class/scsi_host/host5/debug_level
*
* --------------------------------------------------------
* mpt_debug_level - command line parameter
* this allow enabling debug at driver load time (for all iocs)
*
* Example (programming for MPT_DEBUG_EVENTS)
*
* insmod mptbase.ko mpt_debug_level=8
*
* --------------------------------------------------------
* CONFIG_FUSION_LOGGING - enables compiling debug into driver
* this can be enabled in the driver Makefile
*
*
* --------------------------------------------------------
* Please note most debug prints are set to logging priority = debug
* This is the lowest level, and most verbose. Please refer to manual
* pages for syslogd or syslogd-ng on how to configure this.
*/
#define MPT_DEBUG 0x00000001
#define MPT_DEBUG_MSG_FRAME 0x00000002
#define MPT_DEBUG_SG 0x00000004
#define MPT_DEBUG_EVENTS 0x00000008
#define MPT_DEBUG_VERBOSE_EVENTS 0x00000010
#define MPT_DEBUG_INIT 0x00000020
#define MPT_DEBUG_EXIT 0x00000040
#define MPT_DEBUG_FAIL 0x00000080
#define MPT_DEBUG_TM 0x00000100
#define MPT_DEBUG_DV 0x00000200
#define MPT_DEBUG_REPLY 0x00000400
#define MPT_DEBUG_HANDSHAKE 0x00000800
#define MPT_DEBUG_CONFIG 0x00001000
#define MPT_DEBUG_DL 0x00002000
#define MPT_DEBUG_RESET 0x00008000
#define MPT_DEBUG_SCSI 0x00010000
#define MPT_DEBUG_IOCTL 0x00020000
#define MPT_DEBUG_FC 0x00080000
#define MPT_DEBUG_SAS 0x00100000
#define MPT_DEBUG_SAS_WIDE 0x00200000
/*
* CONFIG_FUSION_LOGGING - enabled in Kconfig
*/
#ifdef CONFIG_FUSION_LOGGING
#define MPT_CHECK_LOGGING(IOC, CMD, BITS) \
{ \
if (IOC->debug_level & BITS) \
CMD; \
}
#else
#define MPT_CHECK_LOGGING(IOC, CMD, BITS)
#endif
/*
* debug macros
*/
#define dprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG)
#define dsgprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SG)
#define devtprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EVENTS)
#define devtverboseprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_VERBOSE_EVENTS)
#define dinitprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_INIT)
#define dexitprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_EXIT)
#define dfailprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FAIL)
#define dtmprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_TM)
#define ddvprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DV)
#define dreplyprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_REPLY)
#define dhsprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_HANDSHAKE)
#define dcprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_CONFIG)
#define ddlprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_DL)
#define drsprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_RESET)
#define dsprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SCSI)
#define dctlprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_IOCTL)
#define dfcprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_FC)
#define dsasprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS)
#define dsaswideprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_SAS_WIDE)
/*
* Verbose logging
*/
#if defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING)
static inline void
DBG_DUMP_FW_DOWNLOAD(MPT_ADAPTER *ioc, u32 *mfp, int numfrags)
{
int i;
if (!(ioc->debug_level & MPT_DEBUG))
return;
printk(KERN_DEBUG "F/W download request:\n");
for (i=0; i < 7+numfrags*2; i++)
printk(" %08x", le32_to_cpu(mfp[i]));
printk("\n");
}
static inline void
DBG_DUMP_PUT_MSG_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int ii, n;
if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
return;
printk(KERN_DEBUG "%s: About to Put msg frame @ %p:\n",
ioc->name, mfp);
n = ioc->req_sz/4 - 1;
while (mfp[n] == 0)
n--;
for (ii=0; ii<=n; ii++) {
if (ii && ((ii%8)==0))
printk("\n");
printk(" %08x", le32_to_cpu(mfp[ii]));
}
printk("\n");
}
static inline void
DBG_DUMP_FW_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
return;
n = 10;
printk(KERN_INFO " ");
for (i = 0; i < n; i++)
printk(" %08x", le32_to_cpu(mfp[i]));
printk("\n");
}
static inline void
DBG_DUMP_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
return;
n = 24;
for (i=0; i<n; i++) {
if (i && ((i%8)==0))
printk("\n");
printk("%08x ", le32_to_cpu(mfp[i]));
}
printk("\n");
}
static inline void
DBG_DUMP_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
return;
n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
printk(KERN_INFO " ");
for (i=0; i<n; i++)
printk(" %08x", le32_to_cpu(mfp[i]));
printk("\n");
}
static inline void
DBG_DUMP_REQUEST_FRAME_HDR(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_MSG_FRAME))
return;
n = 3;
printk(KERN_INFO " ");
for (i=0; i<n; i++)
printk(" %08x", le32_to_cpu(mfp[i]));
printk("\n");
}
static inline void
DBG_DUMP_TM_REQUEST_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_TM))
return;
n = 13;
printk(KERN_DEBUG "TM_REQUEST:\n");
for (i=0; i<n; i++) {
if (i && ((i%8)==0))
printk("\n");
printk("%08x ", le32_to_cpu(mfp[i]));
}
printk("\n");
}
static inline void
DBG_DUMP_TM_REPLY_FRAME(MPT_ADAPTER *ioc, u32 *mfp)
{
int i, n;
if (!(ioc->debug_level & MPT_DEBUG_TM))
return;
n = (le32_to_cpu(mfp[0]) & 0x00FF0000) >> 16;
printk(KERN_DEBUG "TM_REPLY MessageLength=%d:\n", n);
for (i=0; i<n; i++) {
if (i && ((i%8)==0))
printk("\n");
printk(" %08x", le32_to_cpu(mfp[i]));
}
printk("\n");
}
#define dmfprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
# else /* ifdef MPT_DEBUG_MF */
#define DBG_DUMP_FW_DOWNLOAD(IOC, mfp, numfrags)
#define DBG_DUMP_PUT_MSG_FRAME(IOC, mfp)
#define DBG_DUMP_FW_REQUEST_FRAME(IOC, mfp)
#define DBG_DUMP_REQUEST_FRAME(IOC, mfp)
#define DBG_DUMP_REPLY_FRAME(IOC, mfp)
#define DBG_DUMP_REQUEST_FRAME_HDR(IOC, mfp)
#define DBG_DUMP_TM_REQUEST_FRAME(IOC, mfp)
#define DBG_DUMP_TM_REPLY_FRAME(IOC, mfp)
#define dmfprintk(IOC, CMD) \
MPT_CHECK_LOGGING(IOC, CMD, MPT_DEBUG_MSG_FRAME)
#endif /* defined(MPT_DEBUG_VERBOSE) && defined(CONFIG_FUSION_LOGGING) */
#endif /* ifndef MPTDEBUG_H_INCLUDED */

View File

@ -188,16 +188,18 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
int (*func)(struct scsi_cmnd *SCpnt), int (*func)(struct scsi_cmnd *SCpnt),
const char *caller) const char *caller)
{ {
MPT_SCSI_HOST *hd;
struct scsi_device *sdev = SCpnt->device; struct scsi_device *sdev = SCpnt->device;
struct Scsi_Host *shost = sdev->host; struct Scsi_Host *shost = sdev->host;
struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); struct fc_rport *rport = starget_to_rport(scsi_target(sdev));
unsigned long flags; unsigned long flags;
int ready; int ready;
hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
spin_lock_irqsave(shost->host_lock, flags); spin_lock_irqsave(shost->host_lock, flags);
while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) {
spin_unlock_irqrestore(shost->host_lock, flags); spin_unlock_irqrestore(shost->host_lock, flags);
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
"mptfc_block_error_handler.%d: %d:%d, port status is " "mptfc_block_error_handler.%d: %d:%d, port status is "
"DID_IMM_RETRY, deferring %s recovery.\n", "DID_IMM_RETRY, deferring %s recovery.\n",
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
@ -209,7 +211,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
spin_unlock_irqrestore(shost->host_lock, flags); spin_unlock_irqrestore(shost->host_lock, flags);
if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) {
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
"%s.%d: %d:%d, failing recovery, " "%s.%d: %d:%d, failing recovery, "
"port state %d, vdev %p.\n", caller, "port state %d, vdev %p.\n", caller,
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
@ -218,7 +220,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt,
SCpnt->device->hostdata)); SCpnt->device->hostdata));
return FAILED; return FAILED;
} }
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT
"%s.%d: %d:%d, executing recovery.\n", caller, "%s.%d: %d:%d, executing recovery.\n", caller,
((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name,
((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no,
@ -483,7 +485,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0)
pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
"mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, " "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, "
"rport tid %d, tmo %d\n", "rport tid %d, tmo %d\n",
ioc->name, ioc->name,
@ -559,6 +561,35 @@ mptfc_target_alloc(struct scsi_target *starget)
return rc; return rc;
} }
/*
* mptfc_dump_lun_info
* @ioc
* @rport
* @sdev
*
*/
static void
mptfc_dump_lun_info(MPT_ADAPTER *ioc, struct fc_rport *rport, struct scsi_device *sdev,
VirtTarget *vtarget)
{
u64 nn, pn;
struct mptfc_rport_info *ri;
ri = *((struct mptfc_rport_info **)rport->dd_data);
pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
"mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, "
"CurrentTargetID %d, %x %llx %llx\n",
ioc->name,
sdev->host->host_no,
vtarget->num_luns,
sdev->id, ri->pg0.CurrentTargetID,
ri->pg0.PortIdentifier,
(unsigned long long)pn,
(unsigned long long)nn));
}
/* /*
* OS entry point to allow host driver to alloc memory * OS entry point to allow host driver to alloc memory
@ -606,25 +637,7 @@ mptfc_slave_alloc(struct scsi_device *sdev)
vtarget->num_luns++; vtarget->num_luns++;
#ifdef DMPT_DEBUG_FC mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget);
{
u64 nn, pn;
struct mptfc_rport_info *ri;
ri = *((struct mptfc_rport_info **)rport->dd_data);
pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low;
nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low;
dfcprintk ((MYIOC_s_INFO_FMT
"mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, "
"CurrentTargetID %d, %x %llx %llx\n",
hd->ioc->name,
sdev->host->host_no,
vtarget->num_luns,
sdev->id, ri->pg0.CurrentTargetID,
ri->pg0.PortIdentifier,
(unsigned long long)pn,
(unsigned long long)nn));
}
#endif
return 0; return 0;
} }
@ -653,27 +666,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
/* dd_data is null until finished adding target */ /* dd_data is null until finished adding target */
ri = *((struct mptfc_rport_info **)rport->dd_data); ri = *((struct mptfc_rport_info **)rport->dd_data);
if (unlikely(!ri)) { if (unlikely(!ri)) {
dfcprintk ((MYIOC_s_INFO_FMT
"mptfc_qcmd.%d: %d:%d, dd_data is null.\n",
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
SCpnt->device->id,SCpnt->device->lun));
SCpnt->result = DID_IMM_RETRY << 16; SCpnt->result = DID_IMM_RETRY << 16;
done(SCpnt); done(SCpnt);
return 0; return 0;
} }
err = mptscsih_qcmd(SCpnt,done); return mptscsih_qcmd(SCpnt,done);
#ifdef DMPT_DEBUG_FC
if (unlikely(err)) {
dfcprintk ((MYIOC_s_INFO_FMT
"mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n",
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name,
((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no,
SCpnt->device->id,SCpnt->device->lun,err));
}
#endif
return err;
} }
/* /*
@ -1041,7 +1039,7 @@ mptfc_setup_reset(struct work_struct *work)
pn = (u64)ri->pg0.WWPN.High << 32 | pn = (u64)ri->pg0.WWPN.High << 32 |
(u64)ri->pg0.WWPN.Low; (u64)ri->pg0.WWPN.Low;
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
"mptfc_setup_reset.%d: %llx deleted\n", "mptfc_setup_reset.%d: %llx deleted\n",
ioc->name, ioc->name,
ioc->sh->host_no, ioc->sh->host_no,
@ -1088,7 +1086,7 @@ mptfc_rescan_devices(struct work_struct *work)
pn = (u64)ri->pg0.WWPN.High << 32 | pn = (u64)ri->pg0.WWPN.High << 32 |
(u64)ri->pg0.WWPN.Low; (u64)ri->pg0.WWPN.Low;
dfcprintk ((MYIOC_s_INFO_FMT dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT
"mptfc_rescan.%d: %llx deleted\n", "mptfc_rescan.%d: %llx deleted\n",
ioc->name, ioc->name,
ioc->sh->host_no, ioc->sh->host_no,
@ -1212,7 +1210,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (numSGE < sh->sg_tablesize) { if (numSGE < sh->sg_tablesize) {
/* Reset this value */ /* Reset this value */
dprintk((MYIOC_s_INFO_FMT dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Resetting sg_tablesize to %d from %d\n", "Resetting sg_tablesize to %d from %d\n",
ioc->name, numSGE, sh->sg_tablesize)); ioc->name, numSGE, sh->sg_tablesize));
sh->sg_tablesize = numSGE; sh->sg_tablesize = numSGE;
@ -1232,7 +1230,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
goto out_mptfc_probe; goto out_mptfc_probe;
} }
dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, hd->ScsiLookup)); ioc->name, hd->ScsiLookup));
/* Clear the TM flags /* Clear the TM flags
@ -1264,7 +1262,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
sh->transportt = mptfc_transport_template; sh->transportt = mptfc_transport_template;
error = scsi_add_host (sh, &ioc->pcidev->dev); error = scsi_add_host (sh, &ioc->pcidev->dev);
if(error) { if(error) {
dprintk((KERN_ERR MYNAM dprintk(ioc, printk(KERN_ERR MYNAM
"scsi_add_host failed\n")); "scsi_add_host failed\n"));
goto out_mptfc_probe; goto out_mptfc_probe;
} }
@ -1323,7 +1321,7 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
unsigned long flags; unsigned long flags;
int rc=1; int rc=1;
devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
ioc->name, event)); ioc->name, event));
if (ioc->sh == NULL || if (ioc->sh == NULL ||
@ -1357,8 +1355,8 @@ mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
return rc; return rc;
dtmprintk((KERN_WARNING MYNAM dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
": IOC %s_reset routed to FC host driver!\n", ": IOC %s_reset routed to FC host driver!\n",ioc->name,
reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
@ -1413,15 +1411,8 @@ mptfc_init(void)
mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER); mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER);
mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER); mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER);
if (mpt_event_register(mptfcDoneCtx, mptfc_event_process) == 0) { mpt_event_register(mptfcDoneCtx, mptfc_event_process);
devtverboseprintk((KERN_INFO MYNAM mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset);
": Registered for IOC event notifications\n"));
}
if (mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset) == 0) {
dprintk((KERN_INFO MYNAM
": Registered for IOC reset notifications\n"));
}
error = pci_register_driver(&mptfc_driver); error = pci_register_driver(&mptfc_driver);
if (error) if (error)
@ -1486,12 +1477,7 @@ mptfc_exit(void)
fc_release_transport(mptfc_transport_template); fc_release_transport(mptfc_transport_template);
mpt_reset_deregister(mptfcDoneCtx); mpt_reset_deregister(mptfcDoneCtx);
dprintk((KERN_INFO MYNAM
": Deregistered for IOC reset notifications\n"));
mpt_event_deregister(mptfcDoneCtx); mpt_event_deregister(mptfcDoneCtx);
dprintk((KERN_INFO MYNAM
": Deregistered for IOC event notifications\n"));
mpt_deregister(mptfcInternalCtx); mpt_deregister(mptfcInternalCtx);
mpt_deregister(mptfcTaskCtx); mpt_deregister(mptfcTaskCtx);

View File

@ -1524,8 +1524,7 @@ static int __init mpt_lan_init (void)
dlprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n")); dlprintk((KERN_INFO MYNAM ": Registered for IOC reset notifications\n"));
if (mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER)) mpt_device_driver_register(&mptlan_driver, MPTLAN_DRIVER);
dprintk((KERN_INFO MYNAM ": failed to register dd callbacks\n"));
return 0; return 0;
} }

View File

@ -201,103 +201,91 @@ struct mptsas_enclosure {
u8 sep_channel; /* SEP channel logical channel id */ u8 sep_channel; /* SEP channel logical channel id */
}; };
#ifdef MPT_DEBUG_SAS static void mptsas_print_phy_data(MPT_ADAPTER *ioc,
static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) MPI_SAS_IO_UNIT0_PHY_DATA *phy_data)
{ {
printk("---- IO UNIT PAGE 0 ------------\n"); dsasprintk(ioc, printk(KERN_DEBUG "---- IO UNIT PAGE 0 ------------\n"));
printk("Handle=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n",
le16_to_cpu(phy_data->AttachedDeviceHandle)); le16_to_cpu(phy_data->AttachedDeviceHandle)));
printk("Controller Handle=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "Controller Handle=0x%X\n",
le16_to_cpu(phy_data->ControllerDevHandle)); le16_to_cpu(phy_data->ControllerDevHandle)));
printk("Port=0x%X\n", phy_data->Port); dsasprintk(ioc, printk(KERN_DEBUG "Port=0x%X\n", phy_data->Port));
printk("Port Flags=0x%X\n", phy_data->PortFlags); dsasprintk(ioc, printk(KERN_DEBUG "Port Flags=0x%X\n", phy_data->PortFlags));
printk("PHY Flags=0x%X\n", phy_data->PhyFlags); dsasprintk(ioc, printk(KERN_DEBUG "PHY Flags=0x%X\n", phy_data->PhyFlags));
printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate));
printk("Controller PHY Device Info=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "Controller PHY Device Info=0x%X\n",
le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); le32_to_cpu(phy_data->ControllerPhyDeviceInfo)));
printk("DiscoveryStatus=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "DiscoveryStatus=0x%X\n\n",
le32_to_cpu(phy_data->DiscoveryStatus)); le32_to_cpu(phy_data->DiscoveryStatus)));
printk("\n");
} }
static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) static void mptsas_print_phy_pg0(MPT_ADAPTER *ioc, SasPhyPage0_t *pg0)
{ {
__le64 sas_address; __le64 sas_address;
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
printk("---- SAS PHY PAGE 0 ------------\n"); dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 0 ------------\n"));
printk("Attached Device Handle=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n",
le16_to_cpu(pg0->AttachedDevHandle)); le16_to_cpu(pg0->AttachedDevHandle)));
printk("SAS Address=0x%llX\n", dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n",
(unsigned long long)le64_to_cpu(sas_address)); (unsigned long long)le64_to_cpu(sas_address)));
printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); dsasprintk(ioc, printk(KERN_DEBUG "Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier));
printk("Attached Device Info=0x%X\n", dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Info=0x%X\n",
le32_to_cpu(pg0->AttachedDeviceInfo)); le32_to_cpu(pg0->AttachedDeviceInfo)));
printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate));
printk("Change Count=0x%X\n", pg0->ChangeCount); dsasprintk(ioc, printk(KERN_DEBUG "Change Count=0x%X\n", pg0->ChangeCount));
printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); dsasprintk(ioc, printk(KERN_DEBUG "PHY Info=0x%X\n\n", le32_to_cpu(pg0->PhyInfo)));
printk("\n");
} }
static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1) static void mptsas_print_phy_pg1(MPT_ADAPTER *ioc, SasPhyPage1_t *pg1)
{ {
printk("---- SAS PHY PAGE 1 ------------\n"); dsasprintk(ioc, printk(KERN_DEBUG "---- SAS PHY PAGE 1 ------------\n"));
printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount); dsasprintk(ioc, printk(KERN_DEBUG "Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount));
printk("Running Disparity Error Count=0x%x\n", dsasprintk(ioc, printk(KERN_DEBUG "Running Disparity Error Count=0x%x\n",
pg1->RunningDisparityErrorCount); pg1->RunningDisparityErrorCount));
printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount); dsasprintk(ioc, printk(KERN_DEBUG "Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount));
printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount); dsasprintk(ioc, printk(KERN_DEBUG "PHY Reset Problem Count=0x%x\n\n", pg1->PhyResetProblemCount));
printk("\n");
} }
static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) static void mptsas_print_device_pg0(MPT_ADAPTER *ioc, SasDevicePage0_t *pg0)
{ {
__le64 sas_address; __le64 sas_address;
memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64));
printk("---- SAS DEVICE PAGE 0 ---------\n"); dsasprintk(ioc, printk(KERN_DEBUG "---- SAS DEVICE PAGE 0 ---------\n"));
printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); dsasprintk(ioc, printk(KERN_DEBUG "Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)));
printk("Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle)); dsasprintk(ioc, printk(KERN_DEBUG "Parent Handle=0x%X\n" ,le16_to_cpu(pg0->ParentDevHandle)));
printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); dsasprintk(ioc, printk(KERN_DEBUG "Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)));
printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); dsasprintk(ioc, printk(KERN_DEBUG "Slot=0x%X\n", le16_to_cpu(pg0->Slot)));
printk("SAS Address=0x%llX\n", (unsigned long long) dsasprintk(ioc, printk(KERN_DEBUG "SAS Address=0x%llX\n", (unsigned long long)
le64_to_cpu(sas_address)); le64_to_cpu(sas_address)));
printk("Target ID=0x%X\n", pg0->TargetID); dsasprintk(ioc, printk(KERN_DEBUG "Target ID=0x%X\n", pg0->TargetID));
printk("Bus=0x%X\n", pg0->Bus); dsasprintk(ioc, printk(KERN_DEBUG "Bus=0x%X\n", pg0->Bus));
/* The PhyNum field specifies the PHY number of the parent /* The PhyNum field specifies the PHY number of the parent
* device this device is linked to * device this device is linked to
*/ */
printk("Parent Phy Num=0x%X\n", pg0->PhyNum); dsasprintk(ioc, printk(KERN_DEBUG "Parent Phy Num=0x%X\n", pg0->PhyNum));
printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); dsasprintk(ioc, printk(KERN_DEBUG "Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)));
printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); dsasprintk(ioc, printk(KERN_DEBUG "Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)));
printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); dsasprintk(ioc, printk(KERN_DEBUG "Flags=0x%X\n", le16_to_cpu(pg0->Flags)));
printk("Physical Port=0x%X\n", pg0->PhysicalPort); dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n\n", pg0->PhysicalPort));
printk("\n");
} }
static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) static void mptsas_print_expander_pg1(MPT_ADAPTER *ioc, SasExpanderPage1_t *pg1)
{ {
printk("---- SAS EXPANDER PAGE 1 ------------\n"); dsasprintk(ioc, printk(KERN_DEBUG "---- SAS EXPANDER PAGE 1 ------------\n"));
dsasprintk(ioc, printk(KERN_DEBUG "Physical Port=0x%X\n", pg1->PhysicalPort));
printk("Physical Port=0x%X\n", pg1->PhysicalPort); dsasprintk(ioc, printk(KERN_DEBUG "PHY Identifier=0x%X\n", pg1->PhyIdentifier));
printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); dsasprintk(ioc, printk(KERN_DEBUG "Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate));
printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); dsasprintk(ioc, printk(KERN_DEBUG "Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate));
printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); dsasprintk(ioc, printk(KERN_DEBUG "Hardware Link Rate=0x%X\n", pg1->HwLinkRate));
printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); dsasprintk(ioc, printk(KERN_DEBUG "Owner Device Handle=0x%X\n",
printk("Owner Device Handle=0x%X\n", le16_to_cpu(pg1->OwnerDevHandle)));
le16_to_cpu(pg1->OwnerDevHandle)); dsasprintk(ioc, printk(KERN_DEBUG "Attached Device Handle=0x%X\n\n",
printk("Attached Device Handle=0x%X\n", le16_to_cpu(pg1->AttachedDevHandle)));
le16_to_cpu(pg1->AttachedDevHandle));
} }
#else
#define mptsas_print_phy_data(phy_data) do { } while (0)
#define mptsas_print_phy_pg0(pg0) do { } while (0)
#define mptsas_print_phy_pg1(pg1) do { } while (0)
#define mptsas_print_device_pg0(pg0) do { } while (0)
#define mptsas_print_expander_pg1(pg1) do { } while (0)
#endif
static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy)
{ {
@ -354,7 +342,7 @@ mptsas_is_end_device(struct mptsas_devinfo * attached)
/* no mutex */ /* no mutex */
static void static void
mptsas_port_delete(struct mptsas_portinfo_details * port_details) mptsas_port_delete(MPT_ADAPTER *ioc, struct mptsas_portinfo_details * port_details)
{ {
struct mptsas_portinfo *port_info; struct mptsas_portinfo *port_info;
struct mptsas_phyinfo *phy_info; struct mptsas_phyinfo *phy_info;
@ -366,7 +354,7 @@ mptsas_port_delete(struct mptsas_portinfo_details * port_details)
port_info = port_details->port_info; port_info = port_details->port_info;
phy_info = port_info->phy_info; phy_info = port_info->phy_info;
dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d " dsaswideprintk(ioc, printk(KERN_DEBUG "%s: [%p]: num_phys=%02d "
"bitmask=0x%016llX\n", __FUNCTION__, port_details, "bitmask=0x%016llX\n", __FUNCTION__, port_details,
port_details->num_phys, (unsigned long long) port_details->num_phys, (unsigned long long)
port_details->phy_bitmask)); port_details->phy_bitmask));
@ -390,20 +378,19 @@ mptsas_get_rphy(struct mptsas_phyinfo *phy_info)
} }
static inline void static inline void
mptsas_set_rphy(struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy) mptsas_set_rphy(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_rphy *rphy)
{ {
if (phy_info->port_details) { if (phy_info->port_details) {
phy_info->port_details->rphy = rphy; phy_info->port_details->rphy = rphy;
dsaswideprintk((KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy)); dsaswideprintk(ioc, printk(KERN_DEBUG "sas_rphy_add: rphy=%p\n", rphy));
} }
#ifdef MPT_DEBUG_SAS_WIDE
if (rphy) { if (rphy) {
dev_printk(KERN_DEBUG, &rphy->dev, "add:"); dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
printk("rphy=%p release=%p\n", &rphy->dev, "add:"));
rphy, rphy->dev.release); dsaswideprintk(ioc, printk(KERN_DEBUG "rphy=%p release=%p\n",
rphy, rphy->dev.release));
} }
#endif
} }
static inline struct sas_port * static inline struct sas_port *
@ -416,18 +403,17 @@ mptsas_get_port(struct mptsas_phyinfo *phy_info)
} }
static inline void static inline void
mptsas_set_port(struct mptsas_phyinfo *phy_info, struct sas_port *port) mptsas_set_port(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, struct sas_port *port)
{ {
if (phy_info->port_details) if (phy_info->port_details)
phy_info->port_details->port = port; phy_info->port_details->port = port;
#ifdef MPT_DEBUG_SAS_WIDE
if (port) { if (port) {
dev_printk(KERN_DEBUG, &port->dev, "add: "); dsaswideprintk(ioc, dev_printk(KERN_DEBUG,
printk("port=%p release=%p\n", &port->dev, "add:"));
port, port->dev.release); dsaswideprintk(ioc, printk(KERN_DEBUG "port=%p release=%p\n",
port, port->dev.release));
} }
#endif
} }
static inline struct scsi_target * static inline struct scsi_target *
@ -477,7 +463,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
* Removing a phy from a port, letting the last * Removing a phy from a port, letting the last
* phy be removed by firmware events. * phy be removed by firmware events.
*/ */
dsaswideprintk((KERN_DEBUG dsaswideprintk(ioc, printk(KERN_DEBUG
"%s: [%p]: deleting phy = %d\n", "%s: [%p]: deleting phy = %d\n",
__FUNCTION__, port_details, i)); __FUNCTION__, port_details, i));
port_details->num_phys--; port_details->num_phys--;
@ -493,7 +479,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
phy_info = port_info->phy_info; phy_info = port_info->phy_info;
for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) { for (i = 0 ; i < port_info->num_phys ; i++, phy_info++) {
sas_address = phy_info->attached.sas_address; sas_address = phy_info->attached.sas_address;
dsaswideprintk((KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n", dsaswideprintk(ioc, printk(KERN_DEBUG "phy_id=%d sas_address=0x%018llX\n",
i, (unsigned long long)sas_address)); i, (unsigned long long)sas_address));
if (!sas_address) if (!sas_address)
continue; continue;
@ -512,7 +498,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
port_details->phy_bitmask |= port_details->phy_bitmask |=
(1 << phy_info->phy_id); (1 << phy_info->phy_id);
phy_info->sas_port_add_phy=1; phy_info->sas_port_add_phy=1;
dsaswideprintk((KERN_DEBUG "\t\tForming port\n\t\t" dsaswideprintk(ioc, printk(KERN_DEBUG "\t\tForming port\n\t\t"
"phy_id=%d sas_address=0x%018llX\n", "phy_id=%d sas_address=0x%018llX\n",
i, (unsigned long long)sas_address)); i, (unsigned long long)sas_address));
phy_info->port_details = port_details; phy_info->port_details = port_details;
@ -529,7 +515,7 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
continue; continue;
if (phy_info_cmp->port_details == port_details ) if (phy_info_cmp->port_details == port_details )
continue; continue;
dsaswideprintk((KERN_DEBUG dsaswideprintk(ioc, printk(KERN_DEBUG
"\t\tphy_id=%d sas_address=0x%018llX\n", "\t\tphy_id=%d sas_address=0x%018llX\n",
j, (unsigned long long) j, (unsigned long long)
phy_info_cmp->attached.sas_address)); phy_info_cmp->attached.sas_address));
@ -559,21 +545,19 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
out: out:
#ifdef MPT_DEBUG_SAS_WIDE
for (i = 0; i < port_info->num_phys; i++) { for (i = 0; i < port_info->num_phys; i++) {
port_details = port_info->phy_info[i].port_details; port_details = port_info->phy_info[i].port_details;
if (!port_details) if (!port_details)
continue; continue;
dsaswideprintk((KERN_DEBUG dsaswideprintk(ioc, printk(KERN_DEBUG
"%s: [%p]: phy_id=%02d num_phys=%02d " "%s: [%p]: phy_id=%02d num_phys=%02d "
"bitmask=0x%016llX\n", __FUNCTION__, "bitmask=0x%016llX\n", __FUNCTION__,
port_details, i, port_details->num_phys, port_details, i, port_details->num_phys,
(unsigned long long)port_details->phy_bitmask)); (unsigned long long)port_details->phy_bitmask));
dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n", dsaswideprintk(ioc, printk(KERN_DEBUG"\t\tport = %p rphy=%p\n",
port_details->port, port_details->rphy)); port_details->port, port_details->rphy));
} }
dsaswideprintk((KERN_DEBUG"\n")); dsaswideprintk(ioc, printk(KERN_DEBUG"\n"));
#endif
mutex_unlock(&ioc->sas_topology_mutex); mutex_unlock(&ioc->sas_topology_mutex);
} }
@ -622,7 +606,7 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
SCSITaskMgmt_t *pScsiTm; SCSITaskMgmt_t *pScsiTm;
if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) { if ((mf = mpt_get_msg_frame(ioc->TaskCtx, ioc)) == NULL) {
dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, no msg frames @%d!!\n",
ioc->name,__FUNCTION__, __LINE__)); ioc->name,__FUNCTION__, __LINE__));
return 0; return 0;
} }
@ -637,12 +621,12 @@ mptsas_target_reset(MPT_ADAPTER *ioc, u8 channel, u8 id)
pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET; pScsiTm->TaskType = MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET;
pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION; pScsiTm->MsgFlags = MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION;
DBG_DUMP_TM_REQUEST_FRAME(mf); DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)mf);
if (mpt_send_handshake_request(ioc->TaskCtx, ioc, if (mpt_send_handshake_request(ioc->TaskCtx, ioc,
sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) { sizeof(SCSITaskMgmt_t), (u32 *)mf, NO_SLEEP)) {
mpt_free_msg_frame(ioc, mf); mpt_free_msg_frame(ioc, mf);
dfailprintk((MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, tm handshake failed @%d!!\n",
ioc->name,__FUNCTION__, __LINE__)); ioc->name,__FUNCTION__, __LINE__));
return 0; return 0;
} }
@ -681,7 +665,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc,
target_reset_list = kzalloc(sizeof(*target_reset_list), target_reset_list = kzalloc(sizeof(*target_reset_list),
GFP_ATOMIC); GFP_ATOMIC);
if (!target_reset_list) { if (!target_reset_list) {
dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
ioc->name,__FUNCTION__, __LINE__)); ioc->name,__FUNCTION__, __LINE__));
return; return;
} }
@ -748,7 +732,7 @@ mptsas_dev_reset_complete(MPT_ADAPTER *ioc)
ev = kzalloc(sizeof(*ev), GFP_ATOMIC); ev = kzalloc(sizeof(*ev), GFP_ATOMIC);
if (!ev) { if (!ev) {
dfailprintk((MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s, failed to allocate mem @%d..!!\n",
ioc->name,__FUNCTION__, __LINE__)); ioc->name,__FUNCTION__, __LINE__));
return; return;
} }
@ -1168,7 +1152,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy)
if (error) if (error)
goto out_free_consistent; goto out_free_consistent;
mptsas_print_phy_pg1(buffer); mptsas_print_phy_pg1(ioc, buffer);
phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount); phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount);
phy->running_disparity_error_count = phy->running_disparity_error_count =
@ -1397,7 +1381,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
le16_to_cpu(buffer->NvdataVersionDefault); le16_to_cpu(buffer->NvdataVersionDefault);
for (i = 0; i < port_info->num_phys; i++) { for (i = 0; i < port_info->num_phys; i++) {
mptsas_print_phy_data(&buffer->PhyData[i]); mptsas_print_phy_data(ioc, &buffer->PhyData[i]);
port_info->phy_info[i].phy_id = i; port_info->phy_info[i].phy_id = i;
port_info->phy_info[i].port_id = port_info->phy_info[i].port_id =
buffer->PhyData[i].Port; buffer->PhyData[i].Port;
@ -1522,7 +1506,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
if (error) if (error)
goto out_free_consistent; goto out_free_consistent;
mptsas_print_phy_pg0(buffer); mptsas_print_phy_pg0(ioc, buffer);
phy_info->hw_link_rate = buffer->HwLinkRate; phy_info->hw_link_rate = buffer->HwLinkRate;
phy_info->programmed_link_rate = buffer->ProgrammedLinkRate; phy_info->programmed_link_rate = buffer->ProgrammedLinkRate;
@ -1589,7 +1573,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
if (error) if (error)
goto out_free_consistent; goto out_free_consistent;
mptsas_print_device_pg0(buffer); mptsas_print_device_pg0(ioc, buffer);
device_info->handle = le16_to_cpu(buffer->DevHandle); device_info->handle = le16_to_cpu(buffer->DevHandle);
device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle); device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
@ -1737,7 +1721,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
goto out_free_consistent; goto out_free_consistent;
mptsas_print_expander_pg1(buffer); mptsas_print_expander_pg1(ioc, buffer);
/* save config data */ /* save config data */
phy_info->phy_id = buffer->PhyIdentifier; phy_info->phy_id = buffer->PhyIdentifier;
@ -1946,17 +1930,17 @@ static int mptsas_probe_one_phy(struct device *dev,
} }
error = sas_port_add(port); error = sas_port_add(port);
if (error) { if (error) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
goto out; goto out;
} }
mptsas_set_port(phy_info, port); mptsas_set_port(ioc, phy_info, port);
dsaswideprintk((KERN_DEBUG dsaswideprintk(ioc, printk(KERN_DEBUG
"sas_port_alloc: port=%p dev=%p port_id=%d\n", "sas_port_alloc: port=%p dev=%p port_id=%d\n",
port, dev, port->port_identifier)); port, dev, port->port_identifier));
} }
dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n", dsaswideprintk(ioc, printk(KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
phy_info->phy_id)); phy_info->phy_id));
sas_port_add_phy(port, phy_info->phy); sas_port_add_phy(port, phy_info->phy);
phy_info->sas_port_add_phy = 0; phy_info->sas_port_add_phy = 0;
@ -2017,7 +2001,7 @@ static int mptsas_probe_one_phy(struct device *dev,
break; break;
} }
if (!rphy) { if (!rphy) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
goto out; goto out;
@ -2026,13 +2010,13 @@ static int mptsas_probe_one_phy(struct device *dev,
rphy->identify = identify; rphy->identify = identify;
error = sas_rphy_add(rphy); error = sas_rphy_add(rphy);
if (error) { if (error) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
sas_rphy_free(rphy); sas_rphy_free(rphy);
goto out; goto out;
} }
mptsas_set_rphy(phy_info, rphy); mptsas_set_rphy(ioc, phy_info, rphy);
} }
out: out:
@ -2258,18 +2242,17 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
if (phy_info->attached.sas_address != if (phy_info->attached.sas_address !=
expander_sas_address) expander_sas_address)
continue; continue;
#ifdef MPT_DEBUG_SAS_WIDE dsaswideprintk(ioc,
dev_printk(KERN_DEBUG, &port->dev, dev_printk(KERN_DEBUG, &port->dev,
"delete port (%d)\n", port->port_identifier); "delete port (%d)\n", port->port_identifier));
#endif
sas_port_delete(port); sas_port_delete(port);
mptsas_port_delete(phy_info->port_details); mptsas_port_delete(ioc, phy_info->port_details);
} }
next_port: next_port:
phy_info = port_info->phy_info; phy_info = port_info->phy_info;
for (i = 0; i < port_info->num_phys; i++, phy_info++) for (i = 0; i < port_info->num_phys; i++, phy_info++)
mptsas_port_delete(phy_info->port_details); mptsas_port_delete(ioc, phy_info->port_details);
list_del(&port_info->list); list_del(&port_info->list);
kfree(port_info->phy_info); kfree(port_info->phy_info);
@ -2555,7 +2538,7 @@ mptsas_hotplug_work(struct work_struct *work)
(MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
MPI_SAS_DEVICE_PGAD_FORM_SHIFT), MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
(ev->channel << 8) + ev->id)) { (ev->channel << 8) + ev->id)) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2575,20 +2558,20 @@ mptsas_hotplug_work(struct work_struct *work)
* Sanity checks, for non-existing phys and remote rphys. * Sanity checks, for non-existing phys and remote rphys.
*/ */
if (!phy_info){ if (!phy_info){
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
} }
if (!phy_info->port_details) { if (!phy_info->port_details) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
} }
rphy = mptsas_get_rphy(phy_info); rphy = mptsas_get_rphy(phy_info);
if (!rphy) { if (!rphy) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2596,7 +2579,7 @@ mptsas_hotplug_work(struct work_struct *work)
port = mptsas_get_port(phy_info); port = mptsas_get_port(phy_info);
if (!port) { if (!port) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2607,7 +2590,7 @@ mptsas_hotplug_work(struct work_struct *work)
vtarget = starget->hostdata; vtarget = starget->hostdata;
if (!vtarget) { if (!vtarget) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2645,12 +2628,10 @@ mptsas_hotplug_work(struct work_struct *work)
printk(MYIOC_s_INFO_FMT printk(MYIOC_s_INFO_FMT
"removing %s device, channel %d, id %d, phy %d\n", "removing %s device, channel %d, id %d, phy %d\n",
ioc->name, ds, ev->channel, ev->id, phy_info->phy_id); ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
#ifdef MPT_DEBUG_SAS_WIDE
dev_printk(KERN_DEBUG, &port->dev, dev_printk(KERN_DEBUG, &port->dev,
"delete port (%d)\n", port->port_identifier); "delete port (%d)\n", port->port_identifier);
#endif
sas_port_delete(port); sas_port_delete(port);
mptsas_port_delete(phy_info->port_details); mptsas_port_delete(ioc, phy_info->port_details);
break; break;
case MPTSAS_ADD_DEVICE: case MPTSAS_ADD_DEVICE:
@ -2664,7 +2645,7 @@ mptsas_hotplug_work(struct work_struct *work)
(MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID << (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
MPI_SAS_DEVICE_PGAD_FORM_SHIFT), MPI_SAS_DEVICE_PGAD_FORM_SHIFT),
(ev->channel << 8) + ev->id)) { (ev->channel << 8) + ev->id)) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2676,7 +2657,7 @@ mptsas_hotplug_work(struct work_struct *work)
sas_device.sas_address); sas_device.sas_address);
if (!phy_info || !phy_info->port_details) { if (!phy_info || !phy_info->port_details) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2688,7 +2669,7 @@ mptsas_hotplug_work(struct work_struct *work)
vtarget = starget->hostdata; vtarget = starget->hostdata;
if (!vtarget) { if (!vtarget) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2711,7 +2692,7 @@ mptsas_hotplug_work(struct work_struct *work)
} }
if (mptsas_get_rphy(phy_info)) { if (mptsas_get_rphy(phy_info)) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
if (ev->channel) printk("%d\n", __LINE__); if (ev->channel) printk("%d\n", __LINE__);
@ -2720,7 +2701,7 @@ mptsas_hotplug_work(struct work_struct *work)
port = mptsas_get_port(phy_info); port = mptsas_get_port(phy_info);
if (!port) { if (!port) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; break;
@ -2745,7 +2726,7 @@ mptsas_hotplug_work(struct work_struct *work)
mptsas_parse_device_info(&identify, &phy_info->attached); mptsas_parse_device_info(&identify, &phy_info->attached);
rphy = sas_end_device_alloc(port); rphy = sas_end_device_alloc(port);
if (!rphy) { if (!rphy) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
break; /* non-fatal: an rphy can be added later */ break; /* non-fatal: an rphy can be added later */
@ -2753,13 +2734,13 @@ mptsas_hotplug_work(struct work_struct *work)
rphy->identify = identify; rphy->identify = identify;
if (sas_rphy_add(rphy)) { if (sas_rphy_add(rphy)) {
dfailprintk((MYIOC_s_ERR_FMT dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
"%s: exit at line=%d\n", ioc->name, "%s: exit at line=%d\n", ioc->name,
__FUNCTION__, __LINE__)); __FUNCTION__, __LINE__));
sas_rphy_free(rphy); sas_rphy_free(rphy);
break; break;
} }
mptsas_set_rphy(phy_info, rphy); mptsas_set_rphy(ioc, phy_info, rphy);
break; break;
case MPTSAS_ADD_RAID: case MPTSAS_ADD_RAID:
sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL, sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
@ -3175,7 +3156,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (numSGE < sh->sg_tablesize) { if (numSGE < sh->sg_tablesize) {
/* Reset this value */ /* Reset this value */
dprintk((MYIOC_s_INFO_FMT dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Resetting sg_tablesize to %d from %d\n", "Resetting sg_tablesize to %d from %d\n",
ioc->name, numSGE, sh->sg_tablesize)); ioc->name, numSGE, sh->sg_tablesize));
sh->sg_tablesize = numSGE; sh->sg_tablesize = numSGE;
@ -3193,7 +3174,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
goto out_mptsas_probe; goto out_mptsas_probe;
} }
dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, hd->ScsiLookup)); ioc->name, hd->ScsiLookup));
/* Clear the TM flags /* Clear the TM flags
@ -3233,7 +3214,7 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
error = scsi_add_host(sh, &ioc->pcidev->dev); error = scsi_add_host(sh, &ioc->pcidev->dev);
if (error) { if (error) {
dprintk((KERN_ERR MYNAM dprintk(ioc, printk(KERN_ERR MYNAM
"scsi_add_host failed\n")); "scsi_add_host failed\n"));
goto out_mptsas_probe; goto out_mptsas_probe;
} }
@ -3261,7 +3242,7 @@ static void __devexit mptsas_remove(struct pci_dev *pdev)
list_for_each_entry_safe(p, n, &ioc->sas_topology, list) { list_for_each_entry_safe(p, n, &ioc->sas_topology, list) {
list_del(&p->list); list_del(&p->list);
for (i = 0 ; i < p->num_phys ; i++) for (i = 0 ; i < p->num_phys ; i++)
mptsas_port_delete(p->phy_info[i].port_details); mptsas_port_delete(ioc, p->phy_info[i].port_details);
kfree(p->phy_info); kfree(p->phy_info);
kfree(p); kfree(p);
} }
@ -3316,15 +3297,8 @@ mptsas_init(void)
mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER); mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER);
mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER); mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER);
if (mpt_event_register(mptsasDoneCtx, mptsas_event_process) == 0) { mpt_event_register(mptsasDoneCtx, mptsas_event_process);
devtverboseprintk((KERN_INFO MYNAM mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset);
": Registered for IOC event notifications\n"));
}
if (mpt_reset_register(mptsasDoneCtx, mptsas_ioc_reset) == 0) {
dprintk((KERN_INFO MYNAM
": Registered for IOC reset notifications\n"));
}
error = pci_register_driver(&mptsas_driver); error = pci_register_driver(&mptsas_driver);
if (error) if (error)

View File

@ -191,7 +191,7 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)
int rc; int rc;
int chain_idx; int chain_idx;
dsgprintk((MYIOC_s_INFO_FMT "getFreeChainBuffer called\n", dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer called\n",
ioc->name)); ioc->name));
spin_lock_irqsave(&ioc->FreeQlock, flags); spin_lock_irqsave(&ioc->FreeQlock, flags);
if (!list_empty(&ioc->FreeChainQ)) { if (!list_empty(&ioc->FreeChainQ)) {
@ -203,12 +203,12 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER *ioc, int *retIndex)
offset = (u8 *)chainBuf - (u8 *)ioc->ChainBuffer; offset = (u8 *)chainBuf - (u8 *)ioc->ChainBuffer;
chain_idx = offset / ioc->req_sz; chain_idx = offset / ioc->req_sz;
rc = SUCCESS; rc = SUCCESS;
dsgprintk((MYIOC_s_ERR_FMT "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n", dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer chainBuf=%p ChainBuffer=%p offset=%d chain_idx=%d\n",
ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx)); ioc->name, chainBuf, ioc->ChainBuffer, offset, chain_idx));
} else { } else {
rc = FAILED; rc = FAILED;
chain_idx = MPT_HOST_NO_CHAIN; chain_idx = MPT_HOST_NO_CHAIN;
dfailprintk((MYIOC_s_INFO_FMT "getFreeChainBuffer failed\n", dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT "getFreeChainBuffer failed\n",
ioc->name)); ioc->name));
} }
spin_unlock_irqrestore(&ioc->FreeQlock, flags); spin_unlock_irqrestore(&ioc->FreeQlock, flags);
@ -337,7 +337,7 @@ nextSGEset:
*/ */
pReq->ChainOffset = 0; pReq->ChainOffset = 0;
RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor) + 1) & 0x03; RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor) + 1) & 0x03;
dsgprintk((MYIOC_s_INFO_FMT dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Single Buffer RequestNB=%x, sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset)); "Single Buffer RequestNB=%x, sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset));
ioc->RequestNB[req_idx] = RequestNB; ioc->RequestNB[req_idx] = RequestNB;
} }
@ -353,7 +353,7 @@ nextSGEset:
* Loop until done. * Loop until done.
*/ */
dsgprintk((MYIOC_s_INFO_FMT "SG: Chain Required! sg done %d\n", dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "SG: Chain Required! sg done %d\n",
ioc->name, sg_done)); ioc->name, sg_done));
/* Set LAST_ELEMENT flag for last non-chain element /* Set LAST_ELEMENT flag for last non-chain element
@ -386,7 +386,7 @@ nextSGEset:
*/ */
pReq->ChainOffset = (u8) (sgeOffset >> 2); pReq->ChainOffset = (u8) (sgeOffset >> 2);
RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor) + 1) & 0x03; RequestNB = (((sgeOffset - 1) >> ioc->NBShiftFactor) + 1) & 0x03;
dsgprintk((MYIOC_s_ERR_FMT "Chain Buffer Needed, RequestNB=%x sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset)); dsgprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Chain Buffer Needed, RequestNB=%x sgeOffset=%d\n", ioc->name, RequestNB, sgeOffset));
ioc->RequestNB[req_idx] = RequestNB; ioc->RequestNB[req_idx] = RequestNB;
} }
@ -397,7 +397,7 @@ nextSGEset:
* in current buffer. Get a chain buffer. * in current buffer. Get a chain buffer.
*/ */
if ((mptscsih_getFreeChainBuffer(ioc, &newIndex)) == FAILED) { if ((mptscsih_getFreeChainBuffer(ioc, &newIndex)) == FAILED) {
dfailprintk((MYIOC_s_INFO_FMT dfailprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"getFreeChainBuffer FAILED SCSI cmd=%02x (%p)\n", "getFreeChainBuffer FAILED SCSI cmd=%02x (%p)\n",
ioc->name, pReq->CDB[0], SCpnt)); ioc->name, pReq->CDB[0], SCpnt));
return FAILED; return FAILED;
@ -419,7 +419,7 @@ nextSGEset:
* out the Address and Flags fields. * out the Address and Flags fields.
*/ */
chainSge = (char *) psge; chainSge = (char *) psge;
dsgprintk((KERN_INFO " Current buff @ %p (index 0x%x)", dsgprintk(ioc, printk(KERN_DEBUG " Current buff @ %p (index 0x%x)",
psge, req_idx)); psge, req_idx));
/* Start the SGE for the next buffer /* Start the SGE for the next buffer
@ -428,7 +428,7 @@ nextSGEset:
sgeOffset = 0; sgeOffset = 0;
sg_done = 0; sg_done = 0;
dsgprintk((KERN_INFO " Chain buff @ %p (index 0x%x)\n", dsgprintk(ioc, printk(KERN_DEBUG " Chain buff @ %p (index 0x%x)\n",
psge, chain_idx)); psge, chain_idx));
/* Start the SGE for the next buffer /* Start the SGE for the next buffer
@ -456,7 +456,7 @@ mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
return; return;
if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) { if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) {
dfailprintk((MYIOC_s_WARN_FMT "%s: no msg frames!!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT "%s: no msg frames!!\n",
ioc->name,__FUNCTION__)); ioc->name,__FUNCTION__));
return; return;
} }
@ -467,93 +467,158 @@ mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
SEPMsg->TargetID = vtarget->id; SEPMsg->TargetID = vtarget->id;
SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS; SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS;
SEPMsg->SlotStatus = SlotStatus; SEPMsg->SlotStatus = SlotStatus;
devtverboseprintk((MYIOC_s_WARN_FMT devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Sending SEP cmd=%x channel=%d id=%d\n", "Sending SEP cmd=%x channel=%d id=%d\n",
ioc->name, SlotStatus, SEPMsg->Bus, SEPMsg->TargetID)); ioc->name, SlotStatus, SEPMsg->Bus, SEPMsg->TargetID));
mpt_put_msg_frame(ioc->DoneCtx, ioc, mf); mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
} }
#ifdef MPT_DEBUG_REPLY #ifdef CONFIG_FUSION_LOGGING
/** /**
* mptscsih_iocstatus_info_scsiio - IOCSTATUS information for SCSIIO * mptscsih_info_scsiio - debug print info on reply frame
* @ioc: Pointer to MPT_ADAPTER structure * @ioc: Pointer to MPT_ADAPTER structure
* @ioc_status: U32 IOCStatus word from IOC
* @scsi_status: U8 sam status from target
* @scsi_state: U8 scsi state
* @sc: original scsi cmnd pointer * @sc: original scsi cmnd pointer
* @mf: Pointer to MPT request frame * @pScsiReply: Pointer to MPT reply frame
*
* MPT_DEBUG_REPLY needs to be enabled to obtain this info
* *
* Refer to lsi/mpi.h. * Refer to lsi/mpi.h.
**/ **/
static void static void
mptscsih_iocstatus_info_scsiio(MPT_ADAPTER *ioc, u32 ioc_status, mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pScsiReply)
u8 scsi_status, u8 scsi_state, struct scsi_cmnd *sc)
{ {
char extend_desc[EVENT_DESCR_STR_SZ]; char *desc = NULL;
char *desc = NULL; char *desc1 = NULL;
u16 ioc_status;
u8 skey, asc, ascq;
ioc_status = le16_to_cpu(pScsiReply->IOCStatus) & MPI_IOCSTATUS_MASK;
switch (ioc_status) { switch (ioc_status) {
case MPI_IOCSTATUS_SCSI_INVALID_BUS: /* 0x0041 */ case MPI_IOCSTATUS_SUCCESS:
desc = "SCSI Invalid Bus"; desc = "success";
break; break;
case MPI_IOCSTATUS_SCSI_INVALID_BUS:
case MPI_IOCSTATUS_SCSI_INVALID_TARGETID: /* 0x0042 */ desc = "invalid bus";
desc = "SCSI Invalid TargetID";
break; break;
case MPI_IOCSTATUS_SCSI_INVALID_TARGETID:
case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE: /* 0x0043 */ desc = "invalid target_id";
/*
* Inquiry is issued for device scanning
*/
if (sc->cmnd[0] != 0x12)
desc = "SCSI Device Not There";
break; break;
case MPI_IOCSTATUS_SCSI_DEVICE_NOT_THERE:
case MPI_IOCSTATUS_SCSI_DATA_OVERRUN: /* 0x0044 */ desc = "device not there";
desc = "SCSI Data Overrun";
break; break;
case MPI_IOCSTATUS_SCSI_DATA_OVERRUN:
case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */ desc = "data overrun";
desc = "SCSI I/O Data Error";
break; break;
case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN:
case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR: /* 0x0047 */ desc = "data underrun";
desc = "SCSI Protocol Error";
break; break;
case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR:
case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */ desc = "I/O data error";
desc = "SCSI Task Terminated";
break; break;
case MPI_IOCSTATUS_SCSI_PROTOCOL_ERROR:
case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */ desc = "protocol error";
desc = "SCSI Residual Mismatch";
break; break;
case MPI_IOCSTATUS_SCSI_TASK_TERMINATED:
case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED: /* 0x004A */ desc = "task terminated";
desc = "SCSI Task Management Failed";
break; break;
case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH:
case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */ desc = "residual mismatch";
desc = "SCSI IOC Terminated";
break; break;
case MPI_IOCSTATUS_SCSI_TASK_MGMT_FAILED:
case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */ desc = "task management failed";
desc = "SCSI Ext Terminated"; break;
case MPI_IOCSTATUS_SCSI_IOC_TERMINATED:
desc = "IOC terminated";
break;
case MPI_IOCSTATUS_SCSI_EXT_TERMINATED:
desc = "ext terminated";
break;
default:
desc = "";
break; break;
} }
if (!desc) switch (pScsiReply->SCSIStatus)
return; {
snprintf(extend_desc, EVENT_DESCR_STR_SZ, case MPI_SCSI_STATUS_SUCCESS:
"[%d:%d:%d:%d] cmd=%02Xh, sam_status=%02Xh state=%02Xh", desc1 = "success";
sc->device->host->host_no, break;
sc->device->channel, sc->device->id, sc->device->lun, case MPI_SCSI_STATUS_CHECK_CONDITION:
sc->cmnd[0], scsi_status, scsi_state); desc1 = "check condition";
break;
case MPI_SCSI_STATUS_CONDITION_MET:
desc1 = "condition met";
break;
case MPI_SCSI_STATUS_BUSY:
desc1 = "busy";
break;
case MPI_SCSI_STATUS_INTERMEDIATE:
desc1 = "intermediate";
break;
case MPI_SCSI_STATUS_INTERMEDIATE_CONDMET:
desc1 = "intermediate condmet";
break;
case MPI_SCSI_STATUS_RESERVATION_CONFLICT:
desc1 = "reservation conflict";
break;
case MPI_SCSI_STATUS_COMMAND_TERMINATED:
desc1 = "command terminated";
break;
case MPI_SCSI_STATUS_TASK_SET_FULL:
desc1 = "task set full";
break;
case MPI_SCSI_STATUS_ACA_ACTIVE:
desc1 = "aca active";
break;
case MPI_SCSI_STATUS_FCPEXT_DEVICE_LOGGED_OUT:
desc1 = "fcpext device logged out";
break;
case MPI_SCSI_STATUS_FCPEXT_NO_LINK:
desc1 = "fcpext no link";
break;
case MPI_SCSI_STATUS_FCPEXT_UNASSIGNED:
desc1 = "fcpext unassigned";
break;
default:
desc1 = "";
break;
}
printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04X): %s: %s\n", scsi_print_command(sc);
ioc->name, ioc_status, desc, extend_desc); printk(KERN_DEBUG "\tfw_channel = %d, fw_id = %d\n",
pScsiReply->Bus, pScsiReply->TargetID);
printk(KERN_DEBUG "\trequest_len = %d, underflow = %d, resid = %d\n",
scsi_bufflen(sc), sc->underflow, scsi_get_resid(sc));
printk(KERN_DEBUG "\ttag = %d, transfer_count = %d, sc->result = %08X\n",
le16_to_cpu(pScsiReply->TaskTag),
le32_to_cpu(pScsiReply->TransferCount), sc->result);
printk(KERN_DEBUG "\tiocstatus = %s (0x%04x), "
"scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n",
desc, ioc_status,
desc1, pScsiReply->SCSIStatus,
pScsiReply->SCSIState);
if (pScsiReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_VALID) {
skey = sc->sense_buffer[2] & 0x0F;
asc = sc->sense_buffer[12];
ascq = sc->sense_buffer[13];
printk(KERN_DEBUG "\t[sense_key,asc,ascq]: "
"[0x%02x,0x%02x,0x%02x]\n",
skey, asc, ascq);
}
/*
* Look for + dump FCP ResponseInfo[]!
*/
if (pScsiReply->SCSIState & MPI_SCSI_STATE_RESPONSE_INFO_VALID &&
pScsiReply->ResponseInfo)
printk(KERN_DEBUG "response_info = %08xh\n",
le32_to_cpu(pScsiReply->ResponseInfo));
} }
#endif #endif
@ -627,11 +692,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
pScsiReply = (SCSIIOReply_t *) mr; pScsiReply = (SCSIIOReply_t *) mr;
if((ioc->facts.MsgVersion >= MPI_VERSION_01_05) && pScsiReply){ if((ioc->facts.MsgVersion >= MPI_VERSION_01_05) && pScsiReply){
dmfprintk((MYIOC_s_INFO_FMT dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d,task-tag=%d)\n", "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d,task-tag=%d)\n",
ioc->name, mf, mr, sc, req_idx, pScsiReply->TaskTag)); ioc->name, mf, mr, sc, req_idx, pScsiReply->TaskTag));
}else{ }else{
dmfprintk((MYIOC_s_INFO_FMT dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d)\n", "ScsiDone (mf=%p,mr=%p,sc=%p,idx=%d)\n",
ioc->name, mf, mr, sc, req_idx)); ioc->name, mf, mr, sc, req_idx));
} }
@ -759,7 +824,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
sc->result=DID_SOFT_ERROR << 16; sc->result=DID_SOFT_ERROR << 16;
else /* Sufficient data transfer occurred */ else /* Sufficient data transfer occurred */
sc->result = (DID_OK << 16) | scsi_status; sc->result = (DID_OK << 16) | scsi_status;
dreplyprintk((KERN_NOTICE dreplyprintk(ioc, printk(KERN_DEBUG
"RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n", "RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n",
sc->result, sc->device->channel, sc->device->id)); sc->result, sc->device->channel, sc->device->id));
break; break;
@ -792,9 +857,11 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
} }
} }
dreplyprintk((KERN_NOTICE " sc->underflow={report ERR if < %02xh bytes xfer'd}\n",
dreplyprintk(ioc, printk(KERN_DEBUG " sc->underflow={report ERR if < %02xh bytes xfer'd}\n",
sc->underflow)); sc->underflow));
dreplyprintk((KERN_NOTICE " ActBytesXferd=%02xh\n", xfer_cnt)); dreplyprintk(ioc, printk(KERN_DEBUG " ActBytesXferd=%02xh\n", xfer_cnt));
/* Report Queue Full /* Report Queue Full
*/ */
if (scsi_status == MPI_SCSI_STATUS_TASK_SET_FULL) if (scsi_status == MPI_SCSI_STATUS_TASK_SET_FULL)
@ -871,27 +938,9 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
} /* switch(status) */ } /* switch(status) */
#ifdef MPT_DEBUG_REPLY #ifdef CONFIG_FUSION_LOGGING
if (sc->result) { if (sc->result && (ioc->debug_level & MPT_DEBUG_REPLY))
mptscsih_info_scsiio(ioc, sc, pScsiReply);
mptscsih_iocstatus_info_scsiio(ioc, status,
scsi_status, scsi_state, sc);
dreplyprintk(("%s: [%d:%d:%d:%d] cmd=0x%02x "
"result=0x%08x\n\tiocstatus=0x%04X "
"scsi_state=0x%02X scsi_status=0x%02X "
"loginfo=0x%08X\n", __FUNCTION__,
sc->device->host->host_no, sc->device->channel, sc->device->id,
sc->device->lun, sc->cmnd[0], sc->result, status,
scsi_state, scsi_status, log_info));
dreplyprintk(("%s: [%d:%d:%d:%d] resid=%d "
"bufflen=%d xfer_cnt=%d\n", __FUNCTION__,
sc->device->host->host_no,
sc->device->channel, sc->device->id,
sc->device->lun, scsi_get_resid(sc),
scsi_bufflen(sc), xfer_cnt));
}
#endif #endif
} /* end of address reply case */ } /* end of address reply case */
@ -925,7 +974,7 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
int ii; int ii;
int max = ioc->req_depth; int max = ioc->req_depth;
dprintk((KERN_INFO MYNAM ": flush_ScsiLookup called\n")); dprintk(ioc, printk(KERN_DEBUG MYNAM ": flush_ScsiLookup called\n"));
for (ii= 0; ii < max; ii++) { for (ii= 0; ii < max; ii++) {
if ((SCpnt = hd->ScsiLookup[ii]) != NULL) { if ((SCpnt = hd->ScsiLookup[ii]) != NULL) {
@ -937,7 +986,7 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
hd->ScsiLookup[ii] = NULL; hd->ScsiLookup[ii] = NULL;
mf = MPT_INDEX_2_MFPTR(ioc, ii); mf = MPT_INDEX_2_MFPTR(ioc, ii);
dmfprintk(( "flush: ScsiDone (mf=%p,sc=%p)\n", dmfprintk(ioc, printk(KERN_DEBUG MYNAM ": flush: ScsiDone (mf=%p,sc=%p)\n",
mf, SCpnt)); mf, SCpnt));
/* Free Chain buffers */ /* Free Chain buffers */
@ -987,7 +1036,7 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
struct scsi_cmnd *sc; struct scsi_cmnd *sc;
struct scsi_lun lun; struct scsi_lun lun;
dsprintk((KERN_INFO MYNAM ": search_running channel %d id %d lun %d max %d\n", dsprintk(hd->ioc, printk(KERN_DEBUG MYNAM ": search_running channel %d id %d lun %d max %d\n",
vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, max)); vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun, max));
for (ii=0; ii < max; ii++) { for (ii=0; ii < max; ii++) {
@ -1020,9 +1069,9 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
scsi_dma_unmap(sc); scsi_dma_unmap(sc);
sc->host_scribble = NULL; sc->host_scribble = NULL;
sc->result = DID_NO_CONNECT << 16; sc->result = DID_NO_CONNECT << 16;
dsprintk(( "search_running: found (sc=%p, mf = %p) " sdev_printk(KERN_INFO, sc->device, "completing cmds: fw_channel %d,"
"channel %d id %d, lun %d \n", sc, mf, "fw_id %d, sc=%p, mf = %p, idx=%x\n", vdevice->vtarget->channel,
vdevice->vtarget->channel, vdevice->vtarget->id, vdevice->lun)); vdevice->vtarget->id, sc, mf, ii);
sc->scsi_done(sc); sc->scsi_done(sc);
} }
} }
@ -1057,7 +1106,7 @@ mptscsih_report_queue_full(struct scsi_cmnd *sc, SCSIIOReply_t *pScsiReply, SCSI
return; return;
if (time - hd->last_queue_full > 10 * HZ) { if (time - hd->last_queue_full > 10 * HZ) {
dprintk((MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n", dprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "Device (%d:%d:%d) reported QUEUE_FULL!\n",
hd->ioc->name, 0, sc->device->id, sc->device->lun)); hd->ioc->name, 0, sc->device->id, sc->device->lun));
hd->last_queue_full = time; hd->last_queue_full = time;
} }
@ -1098,7 +1147,7 @@ mptscsih_remove(struct pci_dev *pdev)
hd->ScsiLookup = NULL; hd->ScsiLookup = NULL;
} }
dprintk((MYIOC_s_INFO_FMT dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"Free'd ScsiLookup (%d) memory\n", "Free'd ScsiLookup (%d) memory\n",
hd->ioc->name, sz1)); hd->ioc->name, sz1));
@ -1317,17 +1366,19 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
u32 cmd_len; u32 cmd_len;
int my_idx; int my_idx;
int ii; int ii;
MPT_ADAPTER *ioc;
hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata;
ioc = hd->ioc;
lun = SCpnt->device->lun; lun = SCpnt->device->lun;
SCpnt->scsi_done = done; SCpnt->scsi_done = done;
dmfprintk((MYIOC_s_INFO_FMT "qcmd: SCpnt=%p, done()=%p\n", dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n",
(hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt, done)); ioc->name, SCpnt, done));
if (hd->resetPending) { if (hd->resetPending) {
dtmprintk((MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n", dtmprintk(ioc, printk(MYIOC_s_WARN_FMT "qcmd: SCpnt=%p timeout + 60HZ\n",
(hd && hd->ioc) ? hd->ioc->name : "ioc?", SCpnt)); ioc->name, SCpnt));
return SCSI_MLQUEUE_HOST_BUSY; return SCSI_MLQUEUE_HOST_BUSY;
} }
@ -1335,8 +1386,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
* Put together a MPT SCSI request... * Put together a MPT SCSI request...
*/ */
if ((mf = mpt_get_msg_frame(hd->ioc->DoneCtx, hd->ioc)) == NULL) { if ((mf = mpt_get_msg_frame(hd->ioc->DoneCtx, hd->ioc)) == NULL) {
dprintk((MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n", dprintk(ioc, printk(MYIOC_s_WARN_FMT "QueueCmd, no msg frames!!\n",
hd->ioc->name)); ioc->name));
return SCSI_MLQUEUE_HOST_BUSY; return SCSI_MLQUEUE_HOST_BUSY;
} }
@ -1422,9 +1473,9 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
hd->ScsiLookup[my_idx] = SCpnt; hd->ScsiLookup[my_idx] = SCpnt;
mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf); mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf);
dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n", dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
hd->ioc->name, SCpnt, mf, my_idx)); ioc->name, SCpnt, mf, my_idx));
DBG_DUMP_REQUEST_FRAME(mf) DBG_DUMP_REQUEST_FRAME(ioc, (u32 *)mf)
return 0; return 0;
fail: fail:
@ -1475,7 +1526,7 @@ mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx)
list_add_tail(&chain->u.frame.linkage.list, &ioc->FreeChainQ); list_add_tail(&chain->u.frame.linkage.list, &ioc->FreeChainQ);
spin_unlock_irqrestore(&ioc->FreeQlock, flags); spin_unlock_irqrestore(&ioc->FreeQlock, flags);
dmfprintk((MYIOC_s_INFO_FMT "FreeChainBuffers (index %d)\n", dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "FreeChainBuffers (index %d)\n",
ioc->name, chain_idx)); ioc->name, chain_idx));
/* handle next */ /* handle next */
@ -1519,7 +1570,7 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
unsigned long flags; unsigned long flags;
ioc = hd->ioc; ioc = hd->ioc;
dtmprintk((MYIOC_s_INFO_FMT "TMHandler Entered!\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TMHandler Entered!\n", ioc->name));
// SJR - CHECKME - Can we avoid this here? // SJR - CHECKME - Can we avoid this here?
// (mpt_HardResetHandler has this check...) // (mpt_HardResetHandler has this check...)
@ -1539,20 +1590,20 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
*/ */
if (mptscsih_tm_pending_wait(hd) == FAILED) { if (mptscsih_tm_pending_wait(hd) == FAILED) {
if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) { if (type == MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
dtmprintk((KERN_INFO MYNAM ": %s: TMHandler abort: " dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler abort: "
"Timed out waiting for last TM (%d) to complete! \n", "Timed out waiting for last TM (%d) to complete! \n",
hd->ioc->name, hd->tmPending)); ioc->name, hd->tmPending));
return FAILED; return FAILED;
} else if (type == MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET) { } else if (type == MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET) {
dtmprintk((KERN_INFO MYNAM ": %s: TMHandler target " dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler target "
"reset: Timed out waiting for last TM (%d) " "reset: Timed out waiting for last TM (%d) "
"to complete! \n", hd->ioc->name, "to complete! \n", ioc->name,
hd->tmPending)); hd->tmPending));
return FAILED; return FAILED;
} else if (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) { } else if (type == MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS) {
dtmprintk((KERN_INFO MYNAM ": %s: TMHandler bus reset: " dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: TMHandler bus reset: "
"Timed out waiting for last TM (%d) to complete! \n", "Timed out waiting for last TM (%d) to complete! \n",
hd->ioc->name, hd->tmPending)); ioc->name, hd->tmPending));
return FAILED; return FAILED;
} }
} else { } else {
@ -1591,12 +1642,13 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, int c
ctx2abort, timeout); ctx2abort, timeout);
if (rc) if (rc)
printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n", printk(MYIOC_s_INFO_FMT "Issue of TaskMgmt failed!\n",
hd->ioc->name); ioc->name);
else else
dtmprintk((MYIOC_s_INFO_FMT "Issue of TaskMgmt Successful!\n", dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Issue of TaskMgmt Successful!\n",
hd->ioc->name)); ioc->name));
dtmprintk((MYIOC_s_INFO_FMT "TMHandler rc = %d!\n", hd->ioc->name, rc)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"TMHandler rc = %d!\n", ioc->name, rc));
return rc; return rc;
} }
@ -1632,11 +1684,11 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i
/* Return Fail to calling function if no message frames available. /* Return Fail to calling function if no message frames available.
*/ */
if ((mf = mpt_get_msg_frame(hd->ioc->TaskCtx, hd->ioc)) == NULL) { if ((mf = mpt_get_msg_frame(hd->ioc->TaskCtx, hd->ioc)) == NULL) {
dfailprintk((MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n", dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "IssueTaskMgmt, no msg frames!!\n",
hd->ioc->name)); hd->ioc->name));
return FAILED; return FAILED;
} }
dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt request @ %p\n", dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt request @ %p\n",
hd->ioc->name, mf)); hd->ioc->name, mf));
/* Format the Request /* Format the Request
@ -1660,27 +1712,27 @@ mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id, int lun, i
pScsiTm->TaskMsgContext = ctx2abort; pScsiTm->TaskMsgContext = ctx2abort;
dtmprintk((MYIOC_s_INFO_FMT "IssueTaskMgmt: ctx2abort (0x%08x) " dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "IssueTaskMgmt: ctx2abort (0x%08x) "
"type=%d\n", hd->ioc->name, ctx2abort, type)); "type=%d\n", hd->ioc->name, ctx2abort, type));
DBG_DUMP_TM_REQUEST_FRAME((u32 *)pScsiTm); DBG_DUMP_TM_REQUEST_FRAME(ioc, (u32 *)pScsiTm);
if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc, if ((retval = mpt_send_handshake_request(hd->ioc->TaskCtx, hd->ioc,
sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) { sizeof(SCSITaskMgmt_t), (u32*)pScsiTm, CAN_SLEEP)) != 0) {
dfailprintk((MYIOC_s_ERR_FMT "send_handshake FAILED!" dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "send_handshake FAILED!"
" (hd %p, ioc %p, mf %p, rc=%d) \n", hd->ioc->name, hd, " (hd %p, ioc %p, mf %p, rc=%d) \n", hd->ioc->name, hd,
hd->ioc, mf, retval)); hd->ioc, mf, retval));
goto fail_out; goto fail_out;
} }
if(mptscsih_tm_wait_for_completion(hd, timeout) == FAILED) { if(mptscsih_tm_wait_for_completion(hd, timeout) == FAILED) {
dfailprintk((MYIOC_s_ERR_FMT "task management request TIMED OUT!" dfailprintk(hd->ioc, printk(MYIOC_s_ERR_FMT "task management request TIMED OUT!"
" (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd, " (hd %p, ioc %p, mf %p) \n", hd->ioc->name, hd,
hd->ioc, mf)); hd->ioc, mf));
dtmprintk((MYIOC_s_INFO_FMT "Calling HardReset! \n", dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Calling HardReset! \n",
hd->ioc->name)); hd->ioc->name));
retval = mpt_HardResetHandler(hd->ioc, CAN_SLEEP); retval = mpt_HardResetHandler(hd->ioc, CAN_SLEEP);
dtmprintk((MYIOC_s_INFO_FMT "rc=%d \n", dtmprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "rc=%d \n",
hd->ioc->name, retval)); hd->ioc->name, retval));
goto fail_out; goto fail_out;
} }
@ -1748,8 +1800,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL) { if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL) {
SCpnt->result = DID_RESET << 16; SCpnt->result = DID_RESET << 16;
SCpnt->scsi_done(SCpnt); SCpnt->scsi_done(SCpnt);
dfailprintk((KERN_INFO MYNAM ": mptscsih_abort: Can't locate " printk(KERN_DEBUG MYNAM ": mptscsih_abort: Can't locate "
"host! (sc=%p)\n", SCpnt)); "host! (sc=%p)\n", SCpnt);
return FAILED; return FAILED;
} }
@ -1760,7 +1812,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
vdevice = SCpnt->device->hostdata; vdevice = SCpnt->device->hostdata;
if (!vdevice || !vdevice->vtarget) { if (!vdevice || !vdevice->vtarget) {
dtmprintk((MYIOC_s_DEBUG_FMT "task abort: device has been " dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: device has been "
"deleted (sc=%p)\n", ioc->name, SCpnt)); "deleted (sc=%p)\n", ioc->name, SCpnt));
SCpnt->result = DID_NO_CONNECT << 16; SCpnt->result = DID_NO_CONNECT << 16;
SCpnt->scsi_done(SCpnt); SCpnt->scsi_done(SCpnt);
@ -1771,7 +1823,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
/* Task aborts are not supported for hidden raid components. /* Task aborts are not supported for hidden raid components.
*/ */
if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) { if (vdevice->vtarget->tflags & MPT_TARGET_FLAGS_RAID_COMPONENT) {
dtmprintk((MYIOC_s_DEBUG_FMT "task abort: hidden raid " dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "task abort: hidden raid "
"component (sc=%p)\n", ioc->name, SCpnt)); "component (sc=%p)\n", ioc->name, SCpnt));
SCpnt->result = DID_RESET << 16; SCpnt->result = DID_RESET << 16;
retval = FAILED; retval = FAILED;
@ -1785,7 +1837,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
* Do OS callback. * Do OS callback.
*/ */
SCpnt->result = DID_RESET << 16; SCpnt->result = DID_RESET << 16;
dtmprintk((KERN_INFO MYNAM ": %s: mptscsih_abort: " dtmprintk(ioc, printk(KERN_DEBUG MYNAM ": %s: mptscsih_abort: "
"Command not in the active list! (sc=%p)\n", ioc->name, "Command not in the active list! (sc=%p)\n", ioc->name,
SCpnt)); SCpnt));
retval = 0; retval = 0;
@ -1850,8 +1902,8 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
/* If we can't locate our host adapter structure, return FAILED status. /* If we can't locate our host adapter structure, return FAILED status.
*/ */
if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
dtmprintk((KERN_INFO MYNAM ": mptscsih_dev_reset: Can't " printk(KERN_DEBUG MYNAM ": mptscsih_dev_reset: Can't "
"locate host! (sc=%p)\n", SCpnt)); "locate host! (sc=%p)\n", SCpnt);
return FAILED; return FAILED;
} }
@ -1913,8 +1965,8 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
/* If we can't locate our host adapter structure, return FAILED status. /* If we can't locate our host adapter structure, return FAILED status.
*/ */
if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
dtmprintk((KERN_INFO MYNAM ": mptscsih_bus_reset: Can't " printk(KERN_DEBUG MYNAM ": mptscsih_bus_reset: Can't "
"locate host! (sc=%p)\n", SCpnt )); "locate host! (sc=%p)\n", SCpnt );
return FAILED; return FAILED;
} }
@ -1957,8 +2009,8 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
/* If we can't locate the host to reset, then we failed. */ /* If we can't locate the host to reset, then we failed. */
if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){ if ((hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata) == NULL){
dtmprintk( ( KERN_INFO MYNAM ": mptscsih_host_reset: Can't " printk( KERN_DEBUG MYNAM ": mptscsih_host_reset: Can't "
"locate host! (sc=%p)\n", SCpnt)); "locate host! (sc=%p)\n", SCpnt);
return FAILED; return FAILED;
} }
@ -2106,16 +2158,16 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
u8 tmType; u8 tmType;
u32 termination_count; u32 termination_count;
dtmprintk((MYIOC_s_WARN_FMT "TaskMgmt completed (mf=%p,mr=%p)\n", dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "TaskMgmt completed (mf=%p,mr=%p)\n",
ioc->name, mf, mr)); ioc->name, mf, mr));
if (!ioc->sh) { if (!ioc->sh) {
dtmprintk((MYIOC_s_WARN_FMT dtmprintk(ioc, printk(MYIOC_s_WARN_FMT
"TaskMgmt Complete: NULL Scsi Host Ptr\n", ioc->name)); "TaskMgmt Complete: NULL Scsi Host Ptr\n", ioc->name));
return 1; return 1;
} }
if (mr == NULL) { if (mr == NULL) {
dtmprintk((MYIOC_s_WARN_FMT dtmprintk(ioc, printk(MYIOC_s_WARN_FMT
"ERROR! TaskMgmt Reply: NULL Request %p\n", ioc->name, mf)); "ERROR! TaskMgmt Reply: NULL Request %p\n", ioc->name, mf));
return 1; return 1;
} }
@ -2131,19 +2183,21 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
pScsiTmReply->ResponseCode) pScsiTmReply->ResponseCode)
mptscsih_taskmgmt_response_code(ioc, mptscsih_taskmgmt_response_code(ioc,
pScsiTmReply->ResponseCode); pScsiTmReply->ResponseCode);
DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply); DBG_DUMP_TM_REPLY_FRAME(ioc, (u32 *)pScsiTmReply);
#if defined(MPT_DEBUG_REPLY) || defined(MPT_DEBUG_TM) #ifdef CONFIG_FUSION_LOGGING
printk("%s: ha=%d [%d:%d:0] task_type=0x%02X " if ((ioc->debug_level & MPT_DEBUG_REPLY) ||
"iocstatus=0x%04X\n\tloginfo=0x%08X response_code=0x%02X " (ioc->debug_level & MPT_DEBUG_TM ))
"term_cmnds=%d\n", __FUNCTION__, ioc->id, pScsiTmReply->Bus, printk("%s: ha=%d [%d:%d:0] task_type=0x%02X "
pScsiTmReply->TargetID, pScsiTmReq->TaskType, "iocstatus=0x%04X\n\tloginfo=0x%08X response_code=0x%02X "
le16_to_cpu(pScsiTmReply->IOCStatus), "term_cmnds=%d\n", __FUNCTION__, ioc->id, pScsiTmReply->Bus,
le32_to_cpu(pScsiTmReply->IOCLogInfo),pScsiTmReply->ResponseCode, pScsiTmReply->TargetID, pScsiTmReq->TaskType,
le32_to_cpu(pScsiTmReply->TerminationCount)); le16_to_cpu(pScsiTmReply->IOCStatus),
le32_to_cpu(pScsiTmReply->IOCLogInfo),pScsiTmReply->ResponseCode,
le32_to_cpu(pScsiTmReply->TerminationCount));
#endif #endif
if (!iocstatus) { if (!iocstatus) {
dtmprintk((MYIOC_s_WARN_FMT " TaskMgmt SUCCESS\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT " TaskMgmt SUCCESS\n", ioc->name));
hd->abortSCpnt = NULL; hd->abortSCpnt = NULL;
goto out; goto out;
} }
@ -2224,10 +2278,6 @@ mptscsih_bios_param(struct scsi_device * sdev, struct block_device *bdev,
geom[1] = sectors; geom[1] = sectors;
geom[2] = cylinders; geom[2] = cylinders;
dprintk((KERN_NOTICE
": bios_param: Id=%i Lun=%i Channel=%i CHS=%i/%i/%i\n",
sdev->id, sdev->lun, sdev->channel, (int)cylinders, heads, sectors));
return 0; return 0;
} }
@ -2393,11 +2443,11 @@ mptscsih_slave_configure(struct scsi_device *sdev)
vtarget = starget->hostdata; vtarget = starget->hostdata;
vdevice = sdev->hostdata; vdevice = sdev->hostdata;
dsprintk((MYIOC_s_INFO_FMT dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"device @ %p, channel=%d, id=%d, lun=%d\n", "device @ %p, channel=%d, id=%d, lun=%d\n",
hd->ioc->name, sdev, sdev->channel, sdev->id, sdev->lun)); hd->ioc->name, sdev, sdev->channel, sdev->id, sdev->lun));
if (hd->ioc->bus_type == SPI) if (hd->ioc->bus_type == SPI)
dsprintk((MYIOC_s_INFO_FMT dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"sdtr %d wdtr %d ppr %d inq length=%d\n", "sdtr %d wdtr %d ppr %d inq length=%d\n",
hd->ioc->name, sdev->sdtr, sdev->wdtr, hd->ioc->name, sdev->sdtr, sdev->wdtr,
sdev->ppr, sdev->inquiry_len)); sdev->ppr, sdev->inquiry_len));
@ -2411,19 +2461,19 @@ mptscsih_slave_configure(struct scsi_device *sdev)
vdevice->configured_lun = 1; vdevice->configured_lun = 1;
mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH); mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
dsprintk((MYIOC_s_INFO_FMT dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"Queue depth=%d, tflags=%x\n", "Queue depth=%d, tflags=%x\n",
hd->ioc->name, sdev->queue_depth, vtarget->tflags)); hd->ioc->name, sdev->queue_depth, vtarget->tflags));
if (hd->ioc->bus_type == SPI) if (hd->ioc->bus_type == SPI)
dsprintk((MYIOC_s_INFO_FMT dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"negoFlags=%x, maxOffset=%x, SyncFactor=%x\n", "negoFlags=%x, maxOffset=%x, SyncFactor=%x\n",
hd->ioc->name, vtarget->negoFlags, vtarget->maxOffset, hd->ioc->name, vtarget->negoFlags, vtarget->maxOffset,
vtarget->minSyncFactor)); vtarget->minSyncFactor));
slave_configure_exit: slave_configure_exit:
dsprintk((MYIOC_s_INFO_FMT dsprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT
"tagged %d, simple %d, ordered %d\n", "tagged %d, simple %d, ordered %d\n",
hd->ioc->name,sdev->tagged_supported, sdev->simple_tags, hd->ioc->name,sdev->tagged_supported, sdev->simple_tags,
sdev->ordered_tags)); sdev->ordered_tags));
@ -2490,7 +2540,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
} }
} }
} else { } else {
dprintk((MYIOC_s_INFO_FMT "Hmmm... SenseData len=0! (?)\n", dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Hmmm... SenseData len=0! (?)\n",
hd->ioc->name)); hd->ioc->name));
} }
} }
@ -2520,7 +2570,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
unsigned long flags; unsigned long flags;
int ii; int ii;
dtmprintk((KERN_WARNING MYNAM dtmprintk(ioc, printk(KERN_DEBUG MYNAM
": IOC %s_reset routed to SCSI host driver!\n", ": IOC %s_reset routed to SCSI host driver!\n",
reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( reset_phase==MPT_IOC_SETUP_RESET ? "setup" : (
reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post")));
@ -2535,7 +2585,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
hd = (MPT_SCSI_HOST *) ioc->sh->hostdata; hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
if (reset_phase == MPT_IOC_SETUP_RESET) { if (reset_phase == MPT_IOC_SETUP_RESET) {
dtmprintk((MYIOC_s_WARN_FMT "Setup-Diag Reset\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Setup-Diag Reset\n", ioc->name));
/* Clean Up: /* Clean Up:
* 1. Set Hard Reset Pending Flag * 1. Set Hard Reset Pending Flag
@ -2544,7 +2594,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
hd->resetPending = 1; hd->resetPending = 1;
} else if (reset_phase == MPT_IOC_PRE_RESET) { } else if (reset_phase == MPT_IOC_PRE_RESET) {
dtmprintk((MYIOC_s_WARN_FMT "Pre-Diag Reset\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Pre-Diag Reset\n", ioc->name));
/* 2. Flush running commands /* 2. Flush running commands
* Clean ScsiLookup (and associated memory) * Clean ScsiLookup (and associated memory)
@ -2564,10 +2614,10 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
mpt_free_msg_frame(ioc, hd->cmdPtr); mpt_free_msg_frame(ioc, hd->cmdPtr);
} }
dtmprintk((MYIOC_s_WARN_FMT "Pre-Reset complete.\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Pre-Reset complete.\n", ioc->name));
} else { } else {
dtmprintk((MYIOC_s_WARN_FMT "Post-Diag Reset\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Post-Diag Reset\n", ioc->name));
/* Once a FW reload begins, all new OS commands are /* Once a FW reload begins, all new OS commands are
* redirected to the doneQ w/ a reset status. * redirected to the doneQ w/ a reset status.
@ -2607,7 +2657,7 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
hd->cmdPtr = NULL; hd->cmdPtr = NULL;
} }
dtmprintk((MYIOC_s_WARN_FMT "Post-Reset complete.\n", ioc->name)); dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Post-Reset complete.\n", ioc->name));
} }
@ -2621,7 +2671,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
MPT_SCSI_HOST *hd; MPT_SCSI_HOST *hd;
u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n",
ioc->name, event)); ioc->name, event));
if (ioc->sh == NULL || if (ioc->sh == NULL ||
@ -2663,7 +2713,7 @@ mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
case MPI_EVENT_STATE_CHANGE: /* 02 */ case MPI_EVENT_STATE_CHANGE: /* 02 */
case MPI_EVENT_EVENT_CHANGE: /* 0A */ case MPI_EVENT_EVENT_CHANGE: /* 0A */
default: default:
dprintk((KERN_INFO " Ignoring event (=%02Xh)\n", event)); dprintk(ioc, printk(KERN_DEBUG MYNAM ": Ignoring event (=%02Xh)\n", event));
break; break;
} }
@ -2724,7 +2774,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
} }
hd->cmdPtr = NULL; hd->cmdPtr = NULL;
ddvprintk((MYIOC_s_INFO_FMT "ScanDvComplete (mf=%p,mr=%p,idx=%d)\n", ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScanDvComplete (mf=%p,mr=%p,idx=%d)\n",
hd->ioc->name, mf, mr, req_idx)); hd->ioc->name, mf, mr, req_idx));
hd->pLocal = &hd->localReply; hd->pLocal = &hd->localReply;
@ -2744,9 +2794,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
status = le16_to_cpu(pReply->IOCStatus) & MPI_IOCSTATUS_MASK; status = le16_to_cpu(pReply->IOCStatus) & MPI_IOCSTATUS_MASK;
scsi_status = pReply->SCSIStatus; scsi_status = pReply->SCSIStatus;
ddvtprintk((KERN_NOTICE " IOCStatus=%04xh, SCSIState=%02xh, SCSIStatus=%02xh, IOCLogInfo=%08xh\n",
status, pReply->SCSIState, scsi_status,
le32_to_cpu(pReply->IOCLogInfo)));
switch(status) { switch(status) {
@ -2799,7 +2846,7 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
SCSI_STD_SENSE_BYTES); SCSI_STD_SENSE_BYTES);
memcpy(hd->pLocal->sense, sense_data, sz); memcpy(hd->pLocal->sense, sense_data, sz);
ddvprintk((KERN_NOTICE " Check Condition, sense ptr %p\n", ddvprintk(ioc, printk(KERN_DEBUG " Check Condition, sense ptr %p\n",
sense_data)); sense_data));
} else if (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_FAILED) { } else if (pReply->SCSIState & MPI_SCSI_STATE_AUTOSENSE_FAILED) {
if (pReq->CDB[0] == INQUIRY) if (pReq->CDB[0] == INQUIRY)
@ -2830,8 +2877,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
} /* switch(status) */ } /* switch(status) */
ddvtprintk((KERN_NOTICE " completionCode set to %08xh\n",
completionCode));
} /* end of address reply case */ } /* end of address reply case */
hd->pLocal->completion = completionCode; hd->pLocal->completion = completionCode;
@ -2862,7 +2907,7 @@ mptscsih_timer_expired(unsigned long data)
{ {
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data; MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data;
ddvprintk((MYIOC_s_WARN_FMT "Timer Expired! Cmd %p\n", hd->ioc->name, hd->cmdPtr)); ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", hd->ioc->name, hd->cmdPtr));
if (hd->cmdPtr) { if (hd->cmdPtr) {
MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr; MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr;
@ -2874,7 +2919,6 @@ mptscsih_timer_expired(unsigned long data)
* If new eh code, do nothing. Wait for OS cmd timeout * If new eh code, do nothing. Wait for OS cmd timeout
* for bus reset. * for bus reset.
*/ */
ddvtprintk((MYIOC_s_NOTE_FMT "DV Cmd Timeout: NoOp\n", hd->ioc->name));
} else { } else {
/* Perform a FW reload */ /* Perform a FW reload */
if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0) { if (mpt_HardResetHandler(hd->ioc, NO_SLEEP) < 0) {
@ -2891,7 +2935,7 @@ mptscsih_timer_expired(unsigned long data)
* The FW will reply to all outstanding commands, callback will finish cleanup. * The FW will reply to all outstanding commands, callback will finish cleanup.
* Hard reset clean-up will free all resources. * Hard reset clean-up will free all resources.
*/ */
ddvprintk((MYIOC_s_WARN_FMT "Timer Expired Complete!\n", hd->ioc->name)); ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", hd->ioc->name));
return; return;
} }
@ -2932,7 +2976,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
in_isr = in_interrupt(); in_isr = in_interrupt();
if (in_isr) { if (in_isr) {
dprintk((MYIOC_s_WARN_FMT "Internal SCSI IO request not allowed in ISR context!\n", dprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Internal SCSI IO request not allowed in ISR context!\n",
hd->ioc->name)); hd->ioc->name));
return -EPERM; return -EPERM;
} }
@ -3035,7 +3079,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
/* Get and Populate a free Frame /* Get and Populate a free Frame
*/ */
if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
ddvprintk((MYIOC_s_WARN_FMT "No msg frames!\n", ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "No msg frames!\n",
hd->ioc->name)); hd->ioc->name));
return -EBUSY; return -EBUSY;
} }
@ -3075,7 +3119,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
if (cmd == REQUEST_SENSE) { if (cmd == REQUEST_SENSE) {
pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_UNTAGGED); pScsiReq->Control = cpu_to_le32(dir | MPI_SCSIIO_CONTROL_UNTAGGED);
ddvprintk((MYIOC_s_INFO_FMT "Untagged! 0x%2x\n", ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Untagged! 0x%2x\n",
hd->ioc->name, cmd)); hd->ioc->name, cmd));
} }
@ -3086,7 +3130,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
pScsiReq->SenseBufferLowAddr = cpu_to_le32(hd->ioc->sense_buf_low_dma pScsiReq->SenseBufferLowAddr = cpu_to_le32(hd->ioc->sense_buf_low_dma
+ (my_idx * MPT_SENSE_BUFFER_ALLOC)); + (my_idx * MPT_SENSE_BUFFER_ALLOC));
ddvprintk((MYIOC_s_INFO_FMT "Sending Command 0x%x for (%d:%d:%d)\n", ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "Sending Command 0x%x for (%d:%d:%d)\n",
hd->ioc->name, cmd, io->channel, io->id, io->lun)); hd->ioc->name, cmd, io->channel, io->id, io->lun));
if (dir == MPI_SCSIIO_CONTROL_READ) { if (dir == MPI_SCSIIO_CONTROL_READ) {
@ -3138,7 +3182,7 @@ mptscsih_do_cmd(MPT_SCSI_HOST *hd, INTERNAL_CMD *io)
} else { } else {
rc = -EFAULT; rc = -EFAULT;
/* This should never happen. */ /* This should never happen. */
ddvprintk((MYIOC_s_INFO_FMT "_do_cmd: Null pLocal!!!\n", ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "_do_cmd: Null pLocal!!!\n",
hd->ioc->name)); hd->ioc->name));
} }
@ -3324,6 +3368,35 @@ mptscsih_device_delay_show(struct class_device *cdev, char *buf)
static CLASS_DEVICE_ATTR(device_delay, S_IRUGO, static CLASS_DEVICE_ATTR(device_delay, S_IRUGO,
mptscsih_device_delay_show, NULL); mptscsih_device_delay_show, NULL);
static ssize_t
mptscsih_debug_level_show(struct class_device *cdev, char *buf)
{
struct Scsi_Host *host = class_to_shost(cdev);
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
MPT_ADAPTER *ioc = hd->ioc;
return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->debug_level);
}
static ssize_t
mptscsih_debug_level_store(struct class_device *cdev, const char *buf,
size_t count)
{
struct Scsi_Host *host = class_to_shost(cdev);
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
MPT_ADAPTER *ioc = hd->ioc;
int val = 0;
if (sscanf(buf, "%x", &val) != 1)
return -EINVAL;
ioc->debug_level = val;
printk(MYIOC_s_INFO_FMT "debug_level=%08xh\n",
ioc->name, ioc->debug_level);
return strlen(buf);
}
static CLASS_DEVICE_ATTR(debug_level, S_IRUGO | S_IWUSR,
mptscsih_debug_level_show, mptscsih_debug_level_store);
struct class_device_attribute *mptscsih_host_attrs[] = { struct class_device_attribute *mptscsih_host_attrs[] = {
&class_device_attr_version_fw, &class_device_attr_version_fw,
&class_device_attr_version_bios, &class_device_attr_version_bios,
@ -3336,6 +3409,7 @@ struct class_device_attribute *mptscsih_host_attrs[] = {
&class_device_attr_board_tracer, &class_device_attr_board_tracer,
&class_device_attr_io_delay, &class_device_attr_io_delay,
&class_device_attr_device_delay, &class_device_attr_device_delay,
&class_device_attr_debug_level,
NULL, NULL,
}; };
EXPORT_SYMBOL(mptscsih_host_attrs); EXPORT_SYMBOL(mptscsih_host_attrs);

View File

@ -138,7 +138,9 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
else { else {
factor = MPT_ULTRA320; factor = MPT_ULTRA320;
if (scsi_device_qas(sdev)) { if (scsi_device_qas(sdev)) {
ddvprintk((KERN_INFO "Enabling QAS due to byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id)); ddvprintk(hd->ioc,
printk(KERN_DEBUG "Enabling QAS due to "
"byte56=%02x on id=%d!\n", scsi_device_qas(sdev), id));
noQas = 0; noQas = 0;
} }
if (sdev->type == TYPE_TAPE && if (sdev->type == TYPE_TAPE &&
@ -225,7 +227,8 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST *hd, VirtTarget *target,
/* Disable QAS in a mixed configuration case /* Disable QAS in a mixed configuration case
*/ */
ddvprintk((KERN_INFO "Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id)); ddvprintk(hd->ioc, printk(KERN_DEBUG
"Disabling QAS due to noQas=%02x on id=%d!\n", noQas, id));
} }
} }
@ -256,8 +259,8 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
/* Get a MF for this command. /* Get a MF for this command.
*/ */
if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) { if ((mf = mpt_get_msg_frame(ioc->DoneCtx, ioc)) == NULL) {
dfailprintk((MYIOC_s_WARN_FMT "writeIOCPage4 : no msg frames!\n", dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
ioc->name)); "writeIOCPage4 : no msg frames!\n",ioc->name));
return -EAGAIN; return -EAGAIN;
} }
@ -297,7 +300,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, u8 channel , u8 id)
mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma); mpt_add_sge((char *)&pReq->PageBufferSGE, flagsLength, dataDma);
ddvprintk((MYIOC_s_INFO_FMT ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n", "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel)); ioc->name, IOCPage4Ptr->MaxSEP, IOCPage4Ptr->ActiveSEP, id, channel));
@ -422,7 +425,7 @@ static int mptspi_target_alloc(struct scsi_target *starget)
if (starget->channel == 0 && if (starget->channel == 0 &&
mptspi_is_raid(hd, starget->id)) { mptspi_is_raid(hd, starget->id)) {
vtarget->raidVolume = 1; vtarget->raidVolume = 1;
ddvprintk((KERN_INFO ddvprintk(hd->ioc, printk(KERN_DEBUG
"RAID Volume @ channel=%d id=%d\n", starget->channel, "RAID Volume @ channel=%d id=%d\n", starget->channel,
starget->id)); starget->id));
} }
@ -462,7 +465,7 @@ mptspi_target_destroy(struct scsi_target *starget)
static void static void
mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii) mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
{ {
ddvprintk((MYIOC_s_INFO_FMT "id=%d Requested = 0x%08x" ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Requested = 0x%08x"
" ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n", " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
hd->ioc->name, starget->id, ii, hd->ioc->name, starget->id, ii,
ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "", ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
@ -487,7 +490,7 @@ mptspi_print_write_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget,
static void static void
mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii) mptspi_print_read_nego(struct _MPT_SCSI_HOST *hd, struct scsi_target *starget, u32 ii)
{ {
ddvprintk((MYIOC_s_INFO_FMT "id=%d Read = 0x%08x" ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d Read = 0x%08x"
" ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n", " ( %s factor = 0x%02x @ offset = 0x%02x %s%s%s%s%s%s%s%s)\n",
hd->ioc->name, starget->id, ii, hd->ioc->name, starget->id, ii,
ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "", ii & MPI_SCSIDEVPAGE0_NP_WIDE ? "Wide ": "",
@ -613,7 +616,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
/* Get and Populate a free Frame /* Get and Populate a free Frame
*/ */
if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) { if ((mf = mpt_get_msg_frame(hd->ioc->InternalCtx, hd->ioc)) == NULL) {
ddvprintk((MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n", ddvprintk(hd->ioc, printk(MYIOC_s_WARN_FMT "_do_raid: no msg frames!\n",
hd->ioc->name)); hd->ioc->name));
return -EAGAIN; return -EAGAIN;
} }
@ -635,7 +638,7 @@ mptscsih_quiesce_raid(MPT_SCSI_HOST *hd, int quiesce, u8 channel, u8 id)
mpt_add_sge((char *)&pReq->ActionDataSGE, mpt_add_sge((char *)&pReq->ActionDataSGE,
MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1); MPT_SGE_FLAGS_SSIMPLE_READ | 0, (dma_addr_t) -1);
ddvprintk((MYIOC_s_INFO_FMT "RAID Volume action=%x channel=%d id=%d\n", ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "RAID Volume action=%x channel=%d id=%d\n",
hd->ioc->name, pReq->Action, channel, id)); hd->ioc->name, pReq->Action, channel, id));
hd->pLocal = NULL; hd->pLocal = NULL;
@ -735,7 +738,7 @@ static int mptspi_slave_configure(struct scsi_device *sdev)
if (ret) if (ret)
return ret; return ret;
ddvprintk((MYIOC_s_INFO_FMT "id=%d min_period=0x%02x" ddvprintk(hd->ioc, printk(MYIOC_s_DEBUG_FMT "id=%d min_period=0x%02x"
" max_offset=0x%02x max_width=%d\n", hd->ioc->name, " max_offset=0x%02x max_width=%d\n", hd->ioc->name,
sdev->id, spi_min_period(scsi_target(sdev)), sdev->id, spi_min_period(scsi_target(sdev)),
spi_max_offset(scsi_target(sdev)), spi_max_offset(scsi_target(sdev)),
@ -768,10 +771,8 @@ mptspi_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
return 0; return 0;
} }
#ifdef MPT_DEBUG_DV
if (spi_dv_pending(scsi_target(SCpnt->device))) if (spi_dv_pending(scsi_target(SCpnt->device)))
scsi_print_command(SCpnt); ddvprintk(hd->ioc, scsi_print_command(SCpnt));
#endif
return mptscsih_qcmd(SCpnt,done); return mptscsih_qcmd(SCpnt,done);
} }
@ -1415,7 +1416,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
if (numSGE < sh->sg_tablesize) { if (numSGE < sh->sg_tablesize) {
/* Reset this value */ /* Reset this value */
dprintk((MYIOC_s_INFO_FMT dprintk(ioc, printk(MYIOC_s_INFO_FMT
"Resetting sg_tablesize to %d from %d\n", "Resetting sg_tablesize to %d from %d\n",
ioc->name, numSGE, sh->sg_tablesize)); ioc->name, numSGE, sh->sg_tablesize));
sh->sg_tablesize = numSGE; sh->sg_tablesize = numSGE;
@ -1435,7 +1436,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
goto out_mptspi_probe; goto out_mptspi_probe;
} }
dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n", dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
ioc->name, hd->ScsiLookup)); ioc->name, hd->ScsiLookup));
/* Clear the TM flags /* Clear the TM flags
@ -1463,7 +1464,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
ioc->spi_data.Saf_Te = mpt_saf_te; ioc->spi_data.Saf_Te = mpt_saf_te;
hd->negoNvram = MPT_SCSICFG_USE_NVRAM; hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
ddvprintk((MYIOC_s_INFO_FMT ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"saf_te %x\n", "saf_te %x\n",
ioc->name, ioc->name,
mpt_saf_te)); mpt_saf_te));
@ -1481,7 +1482,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
error = scsi_add_host (sh, &ioc->pcidev->dev); error = scsi_add_host (sh, &ioc->pcidev->dev);
if(error) { if(error) {
dprintk((KERN_ERR MYNAM dprintk(ioc, printk(KERN_ERR MYNAM
"scsi_add_host failed\n")); "scsi_add_host failed\n"));
goto out_mptspi_probe; goto out_mptspi_probe;
} }
@ -1536,15 +1537,8 @@ mptspi_init(void)
mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER); mptspiTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSPI_DRIVER);
mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER); mptspiInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSPI_DRIVER);
if (mpt_event_register(mptspiDoneCtx, mptspi_event_process) == 0) { mpt_event_register(mptspiDoneCtx, mptspi_event_process);
devtverboseprintk((KERN_INFO MYNAM mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset);
": Registered for IOC event notifications\n"));
}
if (mpt_reset_register(mptspiDoneCtx, mptspi_ioc_reset) == 0) {
dprintk((KERN_INFO MYNAM
": Registered for IOC reset notifications\n"));
}
error = pci_register_driver(&mptspi_driver); error = pci_register_driver(&mptspi_driver);
if (error) if (error)
@ -1564,12 +1558,7 @@ mptspi_exit(void)
pci_unregister_driver(&mptspi_driver); pci_unregister_driver(&mptspi_driver);
mpt_reset_deregister(mptspiDoneCtx); mpt_reset_deregister(mptspiDoneCtx);
dprintk((KERN_INFO MYNAM
": Deregistered for IOC reset notifications\n"));
mpt_event_deregister(mptspiDoneCtx); mpt_event_deregister(mptspiDoneCtx);
dprintk((KERN_INFO MYNAM
": Deregistered for IOC event notifications\n"));
mpt_deregister(mptspiInternalCtx); mpt_deregister(mptspiInternalCtx);
mpt_deregister(mptspiTaskCtx); mpt_deregister(mptspiTaskCtx);

View File

@ -194,8 +194,7 @@ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
struct scsi_device *device; struct scsi_device *device;
if (unlikely(!scsicmd || !scsicmd->scsi_done )) { if (unlikely(!scsicmd || !scsicmd->scsi_done )) {
dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n")) dprintk((KERN_WARNING "aac_valid_context: scsi command corrupt\n"));
;
aac_fib_complete(fibptr); aac_fib_complete(fibptr);
aac_fib_free(fibptr); aac_fib_free(fibptr);
return 0; return 0;
@ -1689,23 +1688,23 @@ static void synchronize_callback(void *context, struct fib *fibptr)
if (!aac_valid_context(cmd, fibptr)) if (!aac_valid_context(cmd, fibptr))
return; return;
dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n", dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
smp_processor_id(), jiffies)); smp_processor_id(), jiffies));
BUG_ON(fibptr == NULL); BUG_ON(fibptr == NULL);
synchronizereply = fib_data(fibptr); synchronizereply = fib_data(fibptr);
if (le32_to_cpu(synchronizereply->status) == CT_OK) if (le32_to_cpu(synchronizereply->status) == CT_OK)
cmd->result = DID_OK << 16 | cmd->result = DID_OK << 16 |
COMMAND_COMPLETE << 8 | SAM_STAT_GOOD; COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
else { else {
struct scsi_device *sdev = cmd->device; struct scsi_device *sdev = cmd->device;
struct aac_dev *dev = fibptr->dev; struct aac_dev *dev = fibptr->dev;
u32 cid = sdev_id(sdev); u32 cid = sdev_id(sdev);
printk(KERN_WARNING printk(KERN_WARNING
"synchronize_callback: synchronize failed, status = %d\n", "synchronize_callback: synchronize failed, status = %d\n",
le32_to_cpu(synchronizereply->status)); le32_to_cpu(synchronizereply->status));
cmd->result = DID_OK << 16 | cmd->result = DID_OK << 16 |
COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION; COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
set_sense((u8 *)&dev->fsa_dev[cid].sense_data, set_sense((u8 *)&dev->fsa_dev[cid].sense_data,
HARDWARE_ERROR, HARDWARE_ERROR,
@ -1713,7 +1712,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0, ASENCODE_INTERNAL_TARGET_FAILURE, 0, 0,
0, 0); 0, 0);
memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data, memcpy(cmd->sense_buffer, &dev->fsa_dev[cid].sense_data,
min(sizeof(dev->fsa_dev[cid].sense_data), min(sizeof(dev->fsa_dev[cid].sense_data),
sizeof(cmd->sense_buffer))); sizeof(cmd->sense_buffer)));
} }
@ -1731,6 +1730,9 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
struct scsi_device *sdev = scsicmd->device; struct scsi_device *sdev = scsicmd->device;
int active = 0; int active = 0;
struct aac_dev *aac; struct aac_dev *aac;
u64 lba = ((u64)scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) |
(scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
u32 count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
unsigned long flags; unsigned long flags;
/* /*
@ -1739,7 +1741,51 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
*/ */
spin_lock_irqsave(&sdev->list_lock, flags); spin_lock_irqsave(&sdev->list_lock, flags);
list_for_each_entry(cmd, &sdev->cmd_list, list) list_for_each_entry(cmd, &sdev->cmd_list, list)
if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) { if (cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
u64 cmnd_lba;
u32 cmnd_count;
if (cmd->cmnd[0] == WRITE_6) {
cmnd_lba = ((cmd->cmnd[1] & 0x1F) << 16) |
(cmd->cmnd[2] << 8) |
cmd->cmnd[3];
cmnd_count = cmd->cmnd[4];
if (cmnd_count == 0)
cmnd_count = 256;
} else if (cmd->cmnd[0] == WRITE_16) {
cmnd_lba = ((u64)cmd->cmnd[2] << 56) |
((u64)cmd->cmnd[3] << 48) |
((u64)cmd->cmnd[4] << 40) |
((u64)cmd->cmnd[5] << 32) |
((u64)cmd->cmnd[6] << 24) |
(cmd->cmnd[7] << 16) |
(cmd->cmnd[8] << 8) |
cmd->cmnd[9];
cmnd_count = (cmd->cmnd[10] << 24) |
(cmd->cmnd[11] << 16) |
(cmd->cmnd[12] << 8) |
cmd->cmnd[13];
} else if (cmd->cmnd[0] == WRITE_12) {
cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
(cmd->cmnd[3] << 16) |
(cmd->cmnd[4] << 8) |
cmd->cmnd[5];
cmnd_count = (cmd->cmnd[6] << 24) |
(cmd->cmnd[7] << 16) |
(cmd->cmnd[8] << 8) |
cmd->cmnd[9];
} else if (cmd->cmnd[0] == WRITE_10) {
cmnd_lba = ((u64)cmd->cmnd[2] << 24) |
(cmd->cmnd[3] << 16) |
(cmd->cmnd[4] << 8) |
cmd->cmnd[5];
cmnd_count = (cmd->cmnd[7] << 8) |
cmd->cmnd[8];
} else
continue;
if (((cmnd_lba + cmnd_count) < lba) ||
(count && ((lba + count) < cmnd_lba)))
continue;
++active; ++active;
break; break;
} }
@ -1768,7 +1814,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
synchronizecmd->command = cpu_to_le32(VM_ContainerConfig); synchronizecmd->command = cpu_to_le32(VM_ContainerConfig);
synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE); synchronizecmd->type = cpu_to_le32(CT_FLUSH_CACHE);
synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd)); synchronizecmd->cid = cpu_to_le32(scmd_id(scsicmd));
synchronizecmd->count = synchronizecmd->count =
cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data)); cpu_to_le32(sizeof(((struct aac_synchronize_reply *)NULL)->data));
/* /*
@ -1790,7 +1836,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd)
return 0; return 0;
} }
printk(KERN_WARNING printk(KERN_WARNING
"aac_synchronize: aac_fib_send failed with status: %d.\n", status); "aac_synchronize: aac_fib_send failed with status: %d.\n", status);
aac_fib_complete(cmd_fibcontext); aac_fib_complete(cmd_fibcontext);
aac_fib_free(cmd_fibcontext); aac_fib_free(cmd_fibcontext);

View File

@ -12,7 +12,7 @@
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifndef AAC_DRIVER_BUILD #ifndef AAC_DRIVER_BUILD
# define AAC_DRIVER_BUILD 2447 # define AAC_DRIVER_BUILD 2449
# define AAC_DRIVER_BRANCH "-ms" # define AAC_DRIVER_BRANCH "-ms"
#endif #endif
#define MAXIMUM_NUM_CONTAINERS 32 #define MAXIMUM_NUM_CONTAINERS 32
@ -1807,10 +1807,10 @@ struct aac_aifcmd {
* accounting for the fact capacity could be a 64 bit value * accounting for the fact capacity could be a 64 bit value
* *
*/ */
static inline u32 cap_to_cyls(sector_t capacity, u32 divisor) static inline unsigned int cap_to_cyls(sector_t capacity, unsigned divisor)
{ {
sector_div(capacity, divisor); sector_div(capacity, divisor);
return (u32)capacity; return capacity;
} }
/* SCp.phase values */ /* SCp.phase values */

View File

@ -826,7 +826,7 @@ static ssize_t aac_show_reset_adapter(struct class_device *class_dev,
tmp = aac_adapter_check_health(dev); tmp = aac_adapter_check_health(dev);
if ((tmp == 0) && dev->in_reset) if ((tmp == 0) && dev->in_reset)
tmp = -EBUSY; tmp = -EBUSY;
len = snprintf(buf, PAGE_SIZE, "0x%x", tmp); len = snprintf(buf, PAGE_SIZE, "0x%x\n", tmp);
return len; return len;
} }
@ -1126,9 +1126,8 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
static void aac_shutdown(struct pci_dev *dev) static void aac_shutdown(struct pci_dev *dev)
{ {
struct Scsi_Host *shost = pci_get_drvdata(dev); struct Scsi_Host *shost = pci_get_drvdata(dev);
struct aac_dev *aac = (struct aac_dev *)shost->hostdata;
scsi_block_requests(shost); scsi_block_requests(shost);
__aac_shutdown(aac); __aac_shutdown((struct aac_dev *)shost->hostdata);
} }
static void __devexit aac_remove_one(struct pci_dev *pdev) static void __devexit aac_remove_one(struct pci_dev *pdev)

View File

@ -1,11 +1,10 @@
/* /*
* Adaptec AAC series RAID controller driver * Adaptec AAC series RAID controller driver
* (c) Copyright 2001 Red Hat Inc. <alan@redhat.com>
* *
* based on the old aacraid driver that is.. * based on the old aacraid driver that is..
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) * Copyright (c) 2006-2007 Adaptec, Inc. (aacraid@adaptec.com)
* *
* 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

View File

@ -5,7 +5,7 @@
* based on the old aacraid driver that is.. * based on the old aacraid driver that is..
* Adaptec aacraid device driver for Linux. * Adaptec aacraid device driver for Linux.
* *
* Copyright (c) 2000 Adaptec, Inc. (aacraid@adaptec.com) * Copyright (c) 2000-2007 Adaptec, Inc. (aacraid@adaptec.com)
* *
* 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

View File

@ -472,7 +472,7 @@ static int aac_rx_restart_adapter(struct aac_dev *dev, int bled)
else { else {
bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS,
0, 0, 0, 0, 0, 0, &var, NULL, NULL, NULL, NULL); 0, 0, 0, 0, 0, 0, &var, NULL, NULL, NULL, NULL);
if (!bled && (var != 0x00000001)) if (!bled && (var != 0x00000001) && (var != 0x3803000F))
bled = -EINVAL; bled = -EINVAL;
} }
if (bled && (bled != -ETIMEDOUT)) if (bled && (bled != -ETIMEDOUT))

File diff suppressed because it is too large Load Diff

View File

@ -2284,9 +2284,12 @@ static void ahd_linux_set_period(struct scsi_target *starget, int period)
if (period < 8) if (period < 8)
period = 8; period = 8;
if (period < 10) { if (period < 10) {
ppr_options |= MSG_EXT_PPR_DT_REQ; if (spi_max_width(starget)) {
if (period == 8) ppr_options |= MSG_EXT_PPR_DT_REQ;
ppr_options |= MSG_EXT_PPR_IU_REQ; if (period == 8)
ppr_options |= MSG_EXT_PPR_IU_REQ;
} else
period = 10;
} }
dt = ppr_options & MSG_EXT_PPR_DT_REQ; dt = ppr_options & MSG_EXT_PPR_DT_REQ;
@ -2365,7 +2368,7 @@ static void ahd_linux_set_dt(struct scsi_target *starget, int dt)
printf("%s: %s DT\n", ahd_name(ahd), printf("%s: %s DT\n", ahd_name(ahd),
dt ? "enabling" : "disabling"); dt ? "enabling" : "disabling");
#endif #endif
if (dt) { if (dt && spi_max_width(starget)) {
ppr_options |= MSG_EXT_PPR_DT_REQ; ppr_options |= MSG_EXT_PPR_DT_REQ;
if (!width) if (!width)
ahd_linux_set_width(starget, 1); ahd_linux_set_width(starget, 1);
@ -2447,7 +2450,7 @@ static void ahd_linux_set_iu(struct scsi_target *starget, int iu)
iu ? "enabling" : "disabling"); iu ? "enabling" : "disabling");
#endif #endif
if (iu) { if (iu && spi_max_width(starget)) {
ppr_options |= MSG_EXT_PPR_IU_REQ; ppr_options |= MSG_EXT_PPR_IU_REQ;
ppr_options |= MSG_EXT_PPR_DT_REQ; /* IU requires DT */ ppr_options |= MSG_EXT_PPR_DT_REQ; /* IU requires DT */
} }
@ -2487,7 +2490,7 @@ static void ahd_linux_set_rd_strm(struct scsi_target *starget, int rdstrm)
rdstrm ? "enabling" : "disabling"); rdstrm ? "enabling" : "disabling");
#endif #endif
if (rdstrm) if (rdstrm && spi_max_width(starget))
ppr_options |= MSG_EXT_PPR_RD_STRM; ppr_options |= MSG_EXT_PPR_RD_STRM;
ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@ -2523,7 +2526,7 @@ static void ahd_linux_set_wr_flow(struct scsi_target *starget, int wrflow)
wrflow ? "enabling" : "disabling"); wrflow ? "enabling" : "disabling");
#endif #endif
if (wrflow) if (wrflow && spi_max_width(starget))
ppr_options |= MSG_EXT_PPR_WR_FLOW; ppr_options |= MSG_EXT_PPR_WR_FLOW;
ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@ -2567,7 +2570,7 @@ static void ahd_linux_set_rti(struct scsi_target *starget, int rti)
rti ? "enabling" : "disabling"); rti ? "enabling" : "disabling");
#endif #endif
if (rti) if (rti && spi_max_width(starget))
ppr_options |= MSG_EXT_PPR_RTI; ppr_options |= MSG_EXT_PPR_RTI;
ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
@ -2603,7 +2606,7 @@ static void ahd_linux_set_pcomp_en(struct scsi_target *starget, int pcomp)
pcomp ? "Enable" : "Disable"); pcomp ? "Enable" : "Disable");
#endif #endif
if (pcomp) { if (pcomp && spi_max_width(starget)) {
uint8_t precomp; uint8_t precomp;
if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) { if (ahd->unit < ARRAY_SIZE(aic79xx_iocell_info)) {
@ -2647,7 +2650,7 @@ static void ahd_linux_set_hold_mcs(struct scsi_target *starget, int hold)
unsigned int dt = ppr_options & MSG_EXT_PPR_DT_REQ; unsigned int dt = ppr_options & MSG_EXT_PPR_DT_REQ;
unsigned long flags; unsigned long flags;
if (hold) if (hold && spi_max_width(starget))
ppr_options |= MSG_EXT_PPR_HOLD_MCS; ppr_options |= MSG_EXT_PPR_HOLD_MCS;
ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, ahd_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,

View File

@ -2317,8 +2317,13 @@ static void ahc_linux_set_period(struct scsi_target *starget, int period)
if (period < 9) if (period < 9)
period = 9; /* 12.5ns is our minimum */ period = 9; /* 12.5ns is our minimum */
if (period == 9) if (period == 9) {
ppr_options |= MSG_EXT_PPR_DT_REQ; if (spi_max_width(starget))
ppr_options |= MSG_EXT_PPR_DT_REQ;
else
/* need wide for DT and need DT for 12.5 ns */
period = 10;
}
ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0, ahc_compile_devinfo(&devinfo, shost->this_id, starget->id, 0,
starget->channel + 'A', ROLE_INITIATOR); starget->channel + 'A', ROLE_INITIATOR);
@ -2381,7 +2386,7 @@ static void ahc_linux_set_dt(struct scsi_target *starget, int dt)
unsigned long flags; unsigned long flags;
struct ahc_syncrate *syncrate; struct ahc_syncrate *syncrate;
if (dt) { if (dt && spi_max_width(starget)) {
ppr_options |= MSG_EXT_PPR_DT_REQ; ppr_options |= MSG_EXT_PPR_DT_REQ;
if (!width) if (!width)
ahc_linux_set_width(starget, 1); ahc_linux_set_width(starget, 1);

View File

@ -586,7 +586,7 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
goto Err; goto Err;
} }
asd_ha->pcidev = dev; asd_ha->pcidev = dev;
asd_ha->sas_ha.pcidev = asd_ha->pcidev; asd_ha->sas_ha.dev = &asd_ha->pcidev->dev;
asd_ha->sas_ha.lldd_ha = asd_ha; asd_ha->sas_ha.lldd_ha = asd_ha;
asd_ha->name = asd_dev->name; asd_ha->name = asd_dev->name;
@ -605,8 +605,6 @@ static int __devinit asd_pci_probe(struct pci_dev *dev,
goto Err_free; goto Err_free;
} }
err = asd_dev->setup(asd_ha); err = asd_dev->setup(asd_ha);
if (err) if (err)
goto Err_free; goto Err_free;

View File

@ -2216,11 +2216,13 @@ static void iscsi_tcp_session_destroy(struct iscsi_cls_session *cls_session)
static int iscsi_tcp_slave_configure(struct scsi_device *sdev) static int iscsi_tcp_slave_configure(struct scsi_device *sdev)
{ {
blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
blk_queue_dma_alignment(sdev->request_queue, 0); blk_queue_dma_alignment(sdev->request_queue, 0);
return 0; return 0;
} }
static struct scsi_host_template iscsi_sht = { static struct scsi_host_template iscsi_sht = {
.module = THIS_MODULE,
.name = "iSCSI Initiator over TCP/IP", .name = "iSCSI Initiator over TCP/IP",
.queuecommand = iscsi_queuecommand, .queuecommand = iscsi_queuecommand,
.change_queue_depth = iscsi_change_queue_depth, .change_queue_depth = iscsi_change_queue_depth,

View File

@ -596,9 +596,16 @@ static void iscsi_prep_mtask(struct iscsi_conn *conn,
nop->cmdsn = cpu_to_be32(session->cmdsn); nop->cmdsn = cpu_to_be32(session->cmdsn);
if (hdr->itt != RESERVED_ITT) { if (hdr->itt != RESERVED_ITT) {
hdr->itt = build_itt(mtask->itt, conn->id, session->age); hdr->itt = build_itt(mtask->itt, conn->id, session->age);
/*
* TODO: We always use immediate, so we never hit this.
* If we start to send tmfs or nops as non-immediate then
* we should start checking the cmdsn numbers for mgmt tasks.
*/
if (conn->c_stage == ISCSI_CONN_STARTED && if (conn->c_stage == ISCSI_CONN_STARTED &&
!(hdr->opcode & ISCSI_OP_IMMEDIATE)) !(hdr->opcode & ISCSI_OP_IMMEDIATE)) {
session->queued_cmdsn++;
session->cmdsn++; session->cmdsn++;
}
} }
if (session->tt->init_mgmt_task) if (session->tt->init_mgmt_task)
@ -641,9 +648,11 @@ static int iscsi_check_cmdsn_window_closed(struct iscsi_conn *conn)
/* /*
* Check for iSCSI window and take care of CmdSN wrap-around * Check for iSCSI window and take care of CmdSN wrap-around
*/ */
if (!iscsi_sna_lte(session->cmdsn, session->max_cmdsn)) { if (!iscsi_sna_lte(session->queued_cmdsn, session->max_cmdsn)) {
debug_scsi("iSCSI CmdSN closed. MaxCmdSN %u CmdSN %u\n", debug_scsi("iSCSI CmdSN closed. ExpCmdSn %u MaxCmdSN %u "
session->max_cmdsn, session->cmdsn); "CmdSN %u/%u\n", session->exp_cmdsn,
session->max_cmdsn, session->cmdsn,
session->queued_cmdsn);
return -ENOSPC; return -ENOSPC;
} }
return 0; return 0;
@ -722,11 +731,6 @@ check_mgmt:
/* process command queue */ /* process command queue */
while (!list_empty(&conn->xmitqueue)) { while (!list_empty(&conn->xmitqueue)) {
rc = iscsi_check_cmdsn_window_closed(conn);
if (rc) {
spin_unlock_bh(&conn->session->lock);
return rc;
}
/* /*
* iscsi tcp may readd the task to the xmitqueue to send * iscsi tcp may readd the task to the xmitqueue to send
* write data * write data
@ -834,12 +838,6 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
goto fault; goto fault;
} }
/*
* We check this here and in data xmit, because if we get to the point
* that this check is hitting the window then we have enough IO in
* flight and enough IO waiting to be transmitted it is better
* to let the scsi/block layer queue up.
*/
if (iscsi_check_cmdsn_window_closed(conn)) { if (iscsi_check_cmdsn_window_closed(conn)) {
reason = FAILURE_WINDOW_CLOSED; reason = FAILURE_WINDOW_CLOSED;
goto reject; goto reject;
@ -850,6 +848,8 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
reason = FAILURE_OOM; reason = FAILURE_OOM;
goto reject; goto reject;
} }
session->queued_cmdsn++;
sc->SCp.phase = session->age; sc->SCp.phase = session->age;
sc->SCp.ptr = (char *)ctask; sc->SCp.ptr = (char *)ctask;
@ -1140,7 +1140,13 @@ static void fail_command(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
if (!sc) if (!sc)
return; return;
if (ctask->state != ISCSI_TASK_PENDING) if (ctask->state == ISCSI_TASK_PENDING)
/*
* cmd never made it to the xmit thread, so we should not count
* the cmd in the sequencing
*/
conn->session->queued_cmdsn--;
else
conn->session->tt->cleanup_cmd_task(conn, ctask); conn->session->tt->cleanup_cmd_task(conn, ctask);
iscsi_ctask_mtask_cleanup(ctask); iscsi_ctask_mtask_cleanup(ctask);
@ -1392,7 +1398,7 @@ iscsi_session_setup(struct iscsi_transport *iscsit,
session->state = ISCSI_STATE_FREE; session->state = ISCSI_STATE_FREE;
session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX; session->mgmtpool_max = ISCSI_MGMT_CMDS_MAX;
session->cmds_max = cmds_max; session->cmds_max = cmds_max;
session->cmdsn = initial_cmdsn; session->queued_cmdsn = session->cmdsn = initial_cmdsn;
session->exp_cmdsn = initial_cmdsn + 1; session->exp_cmdsn = initial_cmdsn + 1;
session->max_cmdsn = initial_cmdsn + 1; session->max_cmdsn = initial_cmdsn + 1;
session->max_r2t = 1; session->max_r2t = 1;
@ -1473,6 +1479,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)
struct iscsi_session *session = iscsi_hostdata(shost->hostdata); struct iscsi_session *session = iscsi_hostdata(shost->hostdata);
struct module *owner = cls_session->transport->owner; struct module *owner = cls_session->transport->owner;
iscsi_unblock_session(cls_session);
scsi_remove_host(shost); scsi_remove_host(shost);
iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds); iscsi_pool_free(&session->mgmtpool, (void**)session->mgmt_cmds);
@ -1615,11 +1622,8 @@ void iscsi_conn_teardown(struct iscsi_cls_conn *cls_conn)
kfree(conn->persistent_address); kfree(conn->persistent_address);
__kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask, __kfifo_put(session->mgmtpool.queue, (void*)&conn->login_mtask,
sizeof(void*)); sizeof(void*));
if (session->leadconn == conn) { if (session->leadconn == conn)
session->leadconn = NULL; session->leadconn = NULL;
/* no connections exits.. reset sequencing */
session->cmdsn = session->max_cmdsn = session->exp_cmdsn = 1;
}
spin_unlock_bh(&session->lock); spin_unlock_bh(&session->lock);
kfifo_free(conn->mgmtqueue); kfifo_free(conn->mgmtqueue);
@ -1649,6 +1653,7 @@ int iscsi_conn_start(struct iscsi_cls_conn *cls_conn)
spin_lock_bh(&session->lock); spin_lock_bh(&session->lock);
conn->c_stage = ISCSI_CONN_STARTED; conn->c_stage = ISCSI_CONN_STARTED;
session->state = ISCSI_STATE_LOGGED_IN; session->state = ISCSI_STATE_LOGGED_IN;
session->queued_cmdsn = session->cmdsn;
switch(conn->stop_stage) { switch(conn->stop_stage) {
case STOP_CONN_RECOVER: case STOP_CONN_RECOVER:

View File

@ -382,7 +382,7 @@ int sas_ata_init_host_and_port(struct domain_device *found_dev,
struct ata_port *ap; struct ata_port *ap;
ata_host_init(&found_dev->sata_dev.ata_host, ata_host_init(&found_dev->sata_dev.ata_host,
&ha->pcidev->dev, ha->dev,
sata_port_info.flags, sata_port_info.flags,
&sas_sata_ops); &sas_sata_ops);
ap = ata_sas_port_alloc(&found_dev->sata_dev.ata_host, ap = ata_sas_port_alloc(&found_dev->sata_dev.ata_host,
@ -448,10 +448,10 @@ static void sas_disc_task_done(struct sas_task *task)
* @task: the task to be executed * @task: the task to be executed
* @buffer: pointer to buffer to do I/O * @buffer: pointer to buffer to do I/O
* @size: size of @buffer * @size: size of @buffer
* @pci_dma_dir: PCI_DMA_... * @dma_dir: DMA direction. DMA_xxx
*/ */
static int sas_execute_task(struct sas_task *task, void *buffer, int size, static int sas_execute_task(struct sas_task *task, void *buffer, int size,
int pci_dma_dir) enum dma_data_direction dma_dir)
{ {
int res = 0; int res = 0;
struct scatterlist *scatter = NULL; struct scatterlist *scatter = NULL;
@ -461,7 +461,7 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
struct sas_internal *i = struct sas_internal *i =
to_sas_internal(task->dev->port->ha->core.shost->transportt); to_sas_internal(task->dev->port->ha->core.shost->transportt);
if (pci_dma_dir != PCI_DMA_NONE) { if (dma_dir != DMA_NONE) {
scatter = kzalloc(sizeof(*scatter), GFP_KERNEL); scatter = kzalloc(sizeof(*scatter), GFP_KERNEL);
if (!scatter) if (!scatter)
goto out; goto out;
@ -474,11 +474,11 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
task->scatter = scatter; task->scatter = scatter;
task->num_scatter = num_scatter; task->num_scatter = num_scatter;
task->total_xfer_len = size; task->total_xfer_len = size;
task->data_dir = pci_dma_dir; task->data_dir = dma_dir;
task->task_done = sas_disc_task_done; task->task_done = sas_disc_task_done;
if (pci_dma_dir != PCI_DMA_NONE && if (dma_dir != DMA_NONE &&
sas_protocol_ata(task->task_proto)) { sas_protocol_ata(task->task_proto)) {
task->num_scatter = pci_map_sg(task->dev->port->ha->pcidev, task->num_scatter = dma_map_sg(task->dev->port->ha->dev,
task->scatter, task->scatter,
task->num_scatter, task->num_scatter,
task->data_dir); task->data_dir);
@ -565,9 +565,9 @@ static int sas_execute_task(struct sas_task *task, void *buffer, int size,
} }
} }
ex_err: ex_err:
if (pci_dma_dir != PCI_DMA_NONE) { if (dma_dir != DMA_NONE) {
if (sas_protocol_ata(task->task_proto)) if (sas_protocol_ata(task->task_proto))
pci_unmap_sg(task->dev->port->ha->pcidev, dma_unmap_sg(task->dev->port->ha->dev,
task->scatter, task->num_scatter, task->scatter, task->num_scatter,
task->data_dir); task->data_dir);
kfree(scatter); kfree(scatter);
@ -628,11 +628,11 @@ static void sas_get_ata_command_set(struct domain_device *dev)
* @features: the features register * @features: the features register
* @buffer: pointer to buffer to do I/O * @buffer: pointer to buffer to do I/O
* @size: size of @buffer * @size: size of @buffer
* @pci_dma_dir: PCI_DMA_... * @dma_dir: DMA direction. DMA_xxx
*/ */
static int sas_issue_ata_cmd(struct domain_device *dev, u8 command, static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,
u8 features, void *buffer, int size, u8 features, void *buffer, int size,
int pci_dma_dir) enum dma_data_direction dma_dir)
{ {
int res = 0; int res = 0;
struct sas_task *task; struct sas_task *task;
@ -652,7 +652,7 @@ static int sas_issue_ata_cmd(struct domain_device *dev, u8 command,
task->ata_task.fis.device = d2h_fis->device; task->ata_task.fis.device = d2h_fis->device;
task->ata_task.retry_count = 1; task->ata_task.retry_count = 1;
res = sas_execute_task(task, buffer, size, pci_dma_dir); res = sas_execute_task(task, buffer, size, dma_dir);
sas_free_task(task); sas_free_task(task);
out: out:
@ -707,7 +707,7 @@ static int sas_discover_sata_dev(struct domain_device *dev)
} }
res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512, res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
if (res) if (res)
goto out_err; goto out_err;
@ -720,13 +720,13 @@ static int sas_discover_sata_dev(struct domain_device *dev)
goto cont1; goto cont1;
res = sas_issue_ata_cmd(dev, ATA_SET_FEATURES, res = sas_issue_ata_cmd(dev, ATA_SET_FEATURES,
ATA_FEATURE_PUP_STBY_SPIN_UP, ATA_FEATURE_PUP_STBY_SPIN_UP,
NULL, 0, PCI_DMA_NONE); NULL, 0, DMA_NONE);
if (res) if (res)
goto cont1; goto cont1;
schedule_timeout_interruptible(5*HZ); /* More time? */ schedule_timeout_interruptible(5*HZ); /* More time? */
res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512, res = sas_issue_ata_cmd(dev, command, 0, identify_x, 512,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
if (res) if (res)
goto out_err; goto out_err;
} }

View File

@ -22,7 +22,6 @@
* *
*/ */
#include <linux/pci.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
@ -170,7 +169,7 @@ int sas_notify_lldd_dev_found(struct domain_device *dev)
if (res) { if (res) {
printk("sas: driver on pcidev %s cannot handle " printk("sas: driver on pcidev %s cannot handle "
"device %llx, error:%d\n", "device %llx, error:%d\n",
pci_name(sas_ha->pcidev), sas_ha->dev->bus_id,
SAS_ADDR(dev->sas_addr), res); SAS_ADDR(dev->sas_addr), res);
} }
} }

View File

@ -56,7 +56,7 @@ void sas_dprint_phye(int phyid, enum phy_event pe)
void sas_dprint_hae(struct sas_ha_struct *sas_ha, enum ha_event he) void sas_dprint_hae(struct sas_ha_struct *sas_ha, enum ha_event he)
{ {
SAS_DPRINTK("ha %s: %s event\n", pci_name(sas_ha->pcidev), SAS_DPRINTK("ha %s: %s event\n", sas_ha->dev->bus_id,
sas_hae_str[he]); sas_hae_str[he]);
} }

View File

@ -507,14 +507,21 @@ static int sas_dev_present_in_domain(struct asd_sas_port *port,
int sas_smp_get_phy_events(struct sas_phy *phy) int sas_smp_get_phy_events(struct sas_phy *phy)
{ {
int res; int res;
u8 *req;
u8 *resp;
struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent); struct sas_rphy *rphy = dev_to_rphy(phy->dev.parent);
struct domain_device *dev = sas_find_dev_by_rphy(rphy); struct domain_device *dev = sas_find_dev_by_rphy(rphy);
u8 *req = alloc_smp_req(RPEL_REQ_SIZE);
u8 *resp = kzalloc(RPEL_RESP_SIZE, GFP_KERNEL);
if (!resp) req = alloc_smp_req(RPEL_REQ_SIZE);
if (!req)
return -ENOMEM; return -ENOMEM;
resp = alloc_smp_resp(RPEL_RESP_SIZE);
if (!resp) {
kfree(req);
return -ENOMEM;
}
req[1] = SMP_REPORT_PHY_ERR_LOG; req[1] = SMP_REPORT_PHY_ERR_LOG;
req[9] = phy->number; req[9] = phy->number;
@ -1879,7 +1886,7 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
struct request *req) struct request *req)
{ {
struct domain_device *dev; struct domain_device *dev;
int ret, type = rphy->identify.device_type; int ret, type;
struct request *rsp = req->next_rq; struct request *rsp = req->next_rq;
if (!rsp) { if (!rsp) {
@ -1888,12 +1895,13 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
return -EINVAL; return -EINVAL;
} }
/* seems aic94xx doesn't support */ /* no rphy means no smp target support (ie aic94xx host) */
if (!rphy) { if (!rphy) {
printk("%s: can we send a smp request to a host?\n", printk("%s: can we send a smp request to a host?\n",
__FUNCTION__); __FUNCTION__);
return -EINVAL; return -EINVAL;
} }
type = rphy->identify.device_type;
if (type != SAS_EDGE_EXPANDER_DEVICE && if (type != SAS_EDGE_EXPANDER_DEVICE &&
type != SAS_FANOUT_EXPANDER_DEVICE) { type != SAS_FANOUT_EXPANDER_DEVICE) {

View File

@ -91,18 +91,20 @@ qla2x00_sysfs_read_nvram(struct kobject *kobj,
{ {
struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
struct device, kobj))); struct device, kobj)));
unsigned long flags; int size = ha->nvram_size;
char *nvram_cache = ha->nvram;
if (!capable(CAP_SYS_ADMIN) || off != 0) if (!capable(CAP_SYS_ADMIN) || off > size || count == 0)
return 0; return 0;
if (off + count > size) {
size -= off;
count = size;
}
/* Read NVRAM. */ /* Read NVRAM data from cache. */
spin_lock_irqsave(&ha->hardware_lock, flags); memcpy(buf, &nvram_cache[off], count);
ha->isp_ops->read_nvram(ha, (uint8_t *)buf, ha->nvram_base,
ha->nvram_size);
spin_unlock_irqrestore(&ha->hardware_lock, flags);
return ha->nvram_size; return count;
} }
static ssize_t static ssize_t
@ -144,6 +146,8 @@ qla2x00_sysfs_write_nvram(struct kobject *kobj,
/* Write NVRAM. */ /* Write NVRAM. */
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count); ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->nvram_base, count);
ha->isp_ops->read_nvram(ha, (uint8_t *)&ha->nvram, ha->nvram_base,
count);
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
@ -298,18 +302,20 @@ qla2x00_sysfs_read_vpd(struct kobject *kobj,
{ {
struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj, struct scsi_qla_host *ha = to_qla_host(dev_to_shost(container_of(kobj,
struct device, kobj))); struct device, kobj)));
unsigned long flags; int size = ha->vpd_size;
char *vpd_cache = ha->vpd;
if (!capable(CAP_SYS_ADMIN) || off != 0) if (!capable(CAP_SYS_ADMIN) || off > size || count == 0)
return 0; return 0;
if (off + count > size) {
size -= off;
count = size;
}
/* Read NVRAM. */ /* Read NVRAM data from cache. */
spin_lock_irqsave(&ha->hardware_lock, flags); memcpy(buf, &vpd_cache[off], count);
ha->isp_ops->read_nvram(ha, (uint8_t *)buf, ha->vpd_base,
ha->vpd_size);
spin_unlock_irqrestore(&ha->hardware_lock, flags);
return ha->vpd_size; return count;
} }
static ssize_t static ssize_t
@ -327,6 +333,7 @@ qla2x00_sysfs_write_vpd(struct kobject *kobj,
/* Write NVRAM. */ /* Write NVRAM. */
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count); ha->isp_ops->write_nvram(ha, (uint8_t *)buf, ha->vpd_base, count);
ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd, ha->vpd_base, count);
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
return count; return count;

View File

@ -2340,10 +2340,14 @@ typedef struct scsi_qla_host {
uint8_t serial2; uint8_t serial2;
/* NVRAM configuration data */ /* NVRAM configuration data */
#define MAX_NVRAM_SIZE 4096
#define VPD_OFFSET MAX_NVRAM_SIZE / 2
uint16_t nvram_size; uint16_t nvram_size;
uint16_t nvram_base; uint16_t nvram_base;
void *nvram;
uint16_t vpd_size; uint16_t vpd_size;
uint16_t vpd_base; uint16_t vpd_base;
void *vpd;
uint16_t loop_reset_delay; uint16_t loop_reset_delay;
uint8_t retry_count; uint8_t retry_count;

View File

@ -1461,8 +1461,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
uint16_t cnt; uint16_t cnt;
uint8_t *dptr1, *dptr2; uint8_t *dptr1, *dptr2;
init_cb_t *icb = ha->init_cb; init_cb_t *icb = ha->init_cb;
nvram_t *nv = (nvram_t *)ha->request_ring; nvram_t *nv = ha->nvram;
uint8_t *ptr = (uint8_t *)ha->request_ring; uint8_t *ptr = ha->nvram;
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp; struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
rval = QLA_SUCCESS; rval = QLA_SUCCESS;
@ -1480,8 +1480,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
chksum += *ptr++; chksum += *ptr++;
DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
DEBUG5(qla2x00_dump_buffer((uint8_t *)ha->request_ring, DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
ha->nvram_size));
/* Bad NVRAM data, set defaults parameters. */ /* Bad NVRAM data, set defaults parameters. */
if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' ||
@ -3500,7 +3499,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
rval = QLA_SUCCESS; rval = QLA_SUCCESS;
icb = (struct init_cb_24xx *)ha->init_cb; icb = (struct init_cb_24xx *)ha->init_cb;
nv = (struct nvram_24xx *)ha->request_ring; nv = ha->nvram;
/* Determine NVRAM starting address. */ /* Determine NVRAM starting address. */
ha->nvram_size = sizeof(struct nvram_24xx); ha->nvram_size = sizeof(struct nvram_24xx);
@ -3512,7 +3511,12 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
ha->vpd_base = FA_NVRAM_VPD1_ADDR; ha->vpd_base = FA_NVRAM_VPD1_ADDR;
} }
/* Get NVRAM data and calculate checksum. */ /* Get VPD data into cache */
ha->vpd = ha->nvram + VPD_OFFSET;
ha->isp_ops->read_nvram(ha, (uint8_t *)ha->vpd,
ha->nvram_base - FA_NVRAM_FUNC0_ADDR, FA_NVRAM_VPD_SIZE * 4);
/* Get NVRAM data into cache and calculate checksum. */
dptr = (uint32_t *)nv; dptr = (uint32_t *)nv;
ha->isp_ops->read_nvram(ha, (uint8_t *)dptr, ha->nvram_base, ha->isp_ops->read_nvram(ha, (uint8_t *)dptr, ha->nvram_base,
ha->nvram_size); ha->nvram_size);
@ -3520,8 +3524,7 @@ qla24xx_nvram_config(scsi_qla_host_t *ha)
chksum += le32_to_cpu(*dptr++); chksum += le32_to_cpu(*dptr++);
DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no)); DEBUG5(printk("scsi(%ld): Contents of NVRAM\n", ha->host_no));
DEBUG5(qla2x00_dump_buffer((uint8_t *)ha->request_ring, DEBUG5(qla2x00_dump_buffer((uint8_t *)nv, ha->nvram_size));
ha->nvram_size));
/* Bad NVRAM data, set defaults parameters. */ /* Bad NVRAM data, set defaults parameters. */
if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P' if (chksum || nv->id[0] != 'I' || nv->id[1] != 'S' || nv->id[2] != 'P'

View File

@ -1068,7 +1068,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
* values. * values.
*/ */
if (resid && if (resid &&
((unsigned)(cp->request_bufflen - resid) < ((unsigned)(scsi_bufflen(cp) - resid) <
cp->underflow)) { cp->underflow)) {
DEBUG2(qla_printk(KERN_INFO, ha, DEBUG2(qla_printk(KERN_INFO, ha,
"scsi(%ld:%d:%d:%d): Mid-layer underflow " "scsi(%ld:%d:%d:%d): Mid-layer underflow "
@ -1076,7 +1076,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
"error status.\n", ha->host_no, "error status.\n", ha->host_no,
cp->device->channel, cp->device->id, cp->device->channel, cp->device->id,
cp->device->lun, resid, cp->device->lun, resid,
cp->request_bufflen)); scsi_bufflen(cp)));
cp->result = DID_ERROR << 16 | lscsi_status; cp->result = DID_ERROR << 16 | lscsi_status;
} }

View File

@ -154,6 +154,9 @@ static struct {
{"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, {"EMC", "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
{"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN}, {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
{"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN}, {"EMULEX", "MD21/S2 ESDI", NULL, BLIST_SINGLELUN},
{"easyRAID", "16P", NULL, BLIST_NOREPORTLUN},
{"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN},
{"easyRAID", "F8", NULL, BLIST_NOREPORTLUN},
{"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN}, {"FSC", "CentricStor", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
{"Generic", "USB SD Reader", "1.00", BLIST_FORCELUN | BLIST_INQUIRY_36}, {"Generic", "USB SD Reader", "1.00", BLIST_FORCELUN | BLIST_INQUIRY_36},
{"Generic", "USB Storage-SMC", "0180", BLIST_FORCELUN | BLIST_INQUIRY_36}, {"Generic", "USB Storage-SMC", "0180", BLIST_FORCELUN | BLIST_INQUIRY_36},

View File

@ -2033,7 +2033,7 @@ static struct pci_device_id sym2_id_table[] __devinitdata = {
{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C875, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C875,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C1510, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_NCR_53C1510,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, /* new */ PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_STORAGE_SCSI<<8, 0xffff00, 0UL }, /* new */
{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C895A, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C895A,
PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL }, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0UL },
{ PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C875A, { PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_53C875A,

View File

@ -53,15 +53,19 @@ struct bsg_class_device {
struct class_device *class_dev; struct class_device *class_dev;
struct device *dev; struct device *dev;
int minor; int minor;
struct list_head list;
struct request_queue *queue; struct request_queue *queue;
}; };
extern int bsg_register_queue(struct request_queue *, struct device *, const char *); extern int bsg_register_queue(struct request_queue *, struct device *, const char *);
extern void bsg_unregister_queue(struct request_queue *); extern void bsg_unregister_queue(struct request_queue *);
#else #else
#define bsg_register_queue(disk, dev, name) (0) static inline int bsg_register_queue(struct request_queue * rq, struct device *dev, const char *name)
#define bsg_unregister_queue(disk) do { } while (0) {
return 0;
}
static inline void bsg_unregister_queue(struct request_queue *rq)
{
}
#endif #endif
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */

View File

@ -210,6 +210,9 @@ struct iscsi_session {
uint32_t exp_cmdsn; uint32_t exp_cmdsn;
uint32_t max_cmdsn; uint32_t max_cmdsn;
/* This tracks the reqs queued into the initiator */
uint32_t queued_cmdsn;
/* configuration */ /* configuration */
int initial_r2t_en; int initial_r2t_en;
unsigned max_r2t; unsigned max_r2t;

View File

@ -348,7 +348,7 @@ struct sas_ha_struct {
/* public: */ /* public: */
char *sas_ha_name; char *sas_ha_name;
struct pci_dev *pcidev; /* should be set */ struct device *dev; /* should be set */
struct module *lldd_module; /* should be set */ struct module *lldd_module; /* should be set */
u8 *sas_addr; /* must be set */ u8 *sas_addr; /* must be set */