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:
commit
a6ce22a5f6
|
@ -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;
|
||||||
|
|
||||||
|
|
80
block/bsg.c
80
block/bsg.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
27083
drivers/scsi/advansys.c
27083
drivers/scsi/advansys.c
File diff suppressed because it is too large
Load Diff
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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'
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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},
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue