summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJames Bottomley <jejb@raven.il.steeleye.com>2003-05-01 01:45:23 -0500
committerJames Bottomley <jejb@raven.il.steeleye.com>2003-05-01 01:45:23 -0500
commit7cbecb83cd557a3eb3e28ceffe3516281833880d (patch)
tree2f7c91db9cdb43119140f5ec706d03c478714130 /drivers
parenteb0a5728e048e61e7802a0aa3e1dcd9d0353e78f (diff)
parenta950688a3255f8c466720b09d5a4f12930cc4da6 (diff)
Merge raven.il.steeleye.com:/home/jejb/BK/linux-2.5
into raven.il.steeleye.com:/home/jejb/BK/scsi-misc-2.5
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/scsi_ioctl.c10
-rw-r--r--drivers/scsi/BusLogic.c7
-rw-r--r--drivers/scsi/cpqfcTSinit.c9
-rw-r--r--drivers/scsi/dpt_i2o.c2
-rw-r--r--drivers/scsi/hosts.c18
-rw-r--r--drivers/scsi/hosts.h33
-rw-r--r--drivers/scsi/pcmcia/aha152x_stub.c43
-rw-r--r--drivers/scsi/pcmcia/fdomain_stub.c43
-rw-r--r--drivers/scsi/pcmcia/nsp_cs.c59
-rw-r--r--drivers/scsi/pcmcia/qlogic_stub.c46
-rw-r--r--drivers/scsi/pluto.c5
-rw-r--r--drivers/scsi/scsi.c9
-rw-r--r--drivers/scsi/scsi.h269
-rw-r--r--drivers/scsi/scsi_debug.c3
-rw-r--r--drivers/scsi/scsi_error.c30
-rw-r--r--drivers/scsi/scsi_ioctl.c2
-rw-r--r--drivers/scsi/scsi_lib.c92
-rw-r--r--drivers/scsi/scsi_logging.h117
-rw-r--r--drivers/scsi/scsi_priv.h146
-rw-r--r--drivers/scsi/scsi_proc.c105
-rw-r--r--drivers/scsi/scsi_scan.c7
-rw-r--r--drivers/scsi/scsi_syms.c3
-rw-r--r--drivers/scsi/scsi_sysfs.c1
-rw-r--r--drivers/scsi/sd.c6
-rw-r--r--drivers/scsi/sg.c2
-rw-r--r--drivers/scsi/sr.c1
-rw-r--r--drivers/scsi/sym53c8xx_2/sym_glue.c29
27 files changed, 378 insertions, 719 deletions
diff --git a/drivers/block/scsi_ioctl.c b/drivers/block/scsi_ioctl.c
index 78bbe1d6e1bc..fc3e3f7aaff8 100644
--- a/drivers/block/scsi_ioctl.c
+++ b/drivers/block/scsi_ioctl.c
@@ -299,13 +299,14 @@ static int sg_io(request_queue_t *q, struct block_device *bdev,
#define MOVE_MEDIUM_TIMEOUT (5 * 60 * HZ)
#define READ_ELEMENT_STATUS_TIMEOUT (5 * 60 * HZ)
#define READ_DEFECT_DATA_TIMEOUT (60 * HZ )
+#define OMAX_SB_LEN 16 /* For backward compatibility */
static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev,
Scsi_Ioctl_Command *sic)
{
struct request *rq;
int err, in_len, out_len, bytes, opcode, cmdlen;
- char *buffer = NULL, sense[24];
+ char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
/*
* get in an out lengths, verify they don't exceed a page worth of data
@@ -378,9 +379,12 @@ static int sg_scsi_ioctl(request_queue_t *q, struct block_device *bdev,
blk_do_rq(q, bdev, rq);
err = rq->errors & 0xff; /* only 8 bit SCSI status */
if (err) {
- if (rq->sense_len)
- if (copy_to_user(sic->data, rq->sense, rq->sense_len))
+ if (rq->sense_len && rq->sense) {
+ bytes = (OMAX_SB_LEN > rq->sense_len) ?
+ rq->sense_len : OMAX_SB_LEN;
+ if (copy_to_user(sic->data, rq->sense, bytes))
err = -EFAULT;
+ }
} else {
if (copy_to_user(sic->data, buffer, out_len))
err = -EFAULT;
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index 18dde208652d..9268bcb4c14e 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3213,6 +3213,7 @@ static void BusLogic_ProcessCompletedCCBs(BusLogic_HostAdapter_T *HostAdapter)
Place CCB back on the Host Adapter's free list.
*/
BusLogic_DeallocateCCB(CCB);
+#if 0 /* this needs to be redone different for new EH */
/*
Bus Device Reset CCBs have the Command field non-NULL only when a
Bus Device Reset was requested for a Command that did not have a
@@ -3228,6 +3229,7 @@ static void BusLogic_ProcessCompletedCCBs(BusLogic_HostAdapter_T *HostAdapter)
Command->scsi_done(Command);
Command = NextCommand;
}
+#endif
/*
Iterate over the CCBs for this Host Adapter performing completion
processing for any CCBs marked as Reset for this Target.
@@ -3948,6 +3950,7 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
{
Command = CCB->Command;
BusLogic_DeallocateCCB(CCB);
+#if 0 /* this needs to be redone different for new EH */
while (Command != NULL)
{
SCSI_Command_T *NextCommand = Command->reset_chain;
@@ -3956,6 +3959,7 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
Command->scsi_done(Command);
Command = NextCommand;
}
+#endif
}
for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++)
{
@@ -3967,7 +3971,7 @@ Done:
return Result;
}
-
+#if 0 /* old-style EH code references a dead struct scsi_cmnd member */
/*
BusLogic_SendBusDeviceReset sends a Bus Device Reset to the Target
Device associated with Command.
@@ -4204,6 +4208,7 @@ int BusLogic_ResetCommand(SCSI_Command_T *Command, unsigned int ResetFlags)
}
return SCSI_RESET_PUNT;
}
+#endif
/*
diff --git a/drivers/scsi/cpqfcTSinit.c b/drivers/scsi/cpqfcTSinit.c
index 553542e79b1a..29428e9a8e5e 100644
--- a/drivers/scsi/cpqfcTSinit.c
+++ b/drivers/scsi/cpqfcTSinit.c
@@ -677,11 +677,6 @@ int cpqfcTS_ioctl( Scsi_Device *ScsiDev, int Cmnd, void *arg)
scsi_release_request(ScsiPassThruReq); // "de-allocate"
ScsiPassThruReq = NULL;
- // if (!SDpnt->was_reset && SDpnt->scsi_request_fn)
- // (*SDpnt->scsi_request_fn)();
-
- wake_up(&SDpnt->scpnt_wait);
-
// need to pass data back to user (space)?
if( (vendor_cmd->rw_flag == VENDOR_READ_OPCODE) &&
vendor_cmd->len )
@@ -1656,10 +1651,6 @@ return -ENOTSUPP;
scsi_put_command(SCpnt);
SCpnt = NULL;
- // if (!SDpnt->was_reset && SDpnt->scsi_request_fn)
- // (*SDpnt->scsi_request_fn)();
-
- wake_up(&SDpnt->scpnt_wait);
// printk(" LEAVING cpqfcTS_TargetDeviceReset() - return SUCCESS \n");
return SUCCESS;
}
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index 61c55a71812c..c1e4a02925c1 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -2495,8 +2495,6 @@ static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
pDev->pScsi_dev->online = FALSE;
if (pDev->pScsi_dev->access_count) {
// A drive that was mounted is no longer there... bad!
- SCSI_LOG_ERROR_RECOVERY(1, printk ("%s:Rescan: Previously "
- "mounted drive not found!\n",pHba->name));
printk(KERN_WARNING"%s:Mounted drive taken offline\n",pHba->name);
}
}
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index a1b3da18f869..317491c6ced1 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -32,20 +32,20 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/mm.h>
-#include <linux/proc_fs.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/completion.h>
-
-#define __KERNEL_SYSCALLS__
-
#include <linux/unistd.h>
#include <asm/dma.h>
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
+
static LIST_HEAD(scsi_host_list);
static spinlock_t scsi_host_list_lock = SPIN_LOCK_UNLOCKED;
@@ -423,8 +423,14 @@ struct Scsi_Host * scsi_register(Scsi_Host_Template *shost_tp, int xtr_bytes)
shost->use_clustering = shost_tp->use_clustering;
if (!blk_nohighio)
shost->highmem_io = shost_tp->highmem_io;
-
- shost->max_sectors = shost_tp->max_sectors;
+ if (!shost_tp->max_sectors) {
+ /*
+ * Driver imposes no hard sector transfer limit.
+ * start at machine infinity initially.
+ */
+ shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS;
+ } else
+ shost->max_sectors = shost_tp->max_sectors;
shost->use_blk_tcq = shost_tp->use_blk_tcq;
spin_lock(&scsi_host_list_lock);
diff --git a/drivers/scsi/hosts.h b/drivers/scsi/hosts.h
index 23ab6f5da69e..3ef4d713cbe1 100644
--- a/drivers/scsi/hosts.h
+++ b/drivers/scsi/hosts.h
@@ -527,13 +527,6 @@ static inline struct device *scsi_get_device(struct Scsi_Host *shost)
return shost->host_gendev;
}
-/*
- * Prototypes for functions/data in scsi_scan.c
- */
-extern void scsi_scan_host(struct Scsi_Host *);
-extern void scsi_forget_host(struct Scsi_Host *);
-
-
struct Scsi_Device_Template
{
struct list_head list;
@@ -572,16 +565,8 @@ extern int scsi_remove_host(struct Scsi_Host *);
extern int scsi_register_host(Scsi_Host_Template *);
extern int scsi_unregister_host(Scsi_Host_Template *);
-extern struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *);
extern struct Scsi_Host *scsi_host_hn_get(unsigned short);
extern void scsi_host_put(struct Scsi_Host *);
-extern void scsi_host_init(void);
-
-/*
- * host_busy inc/dec/test functions
- */
-extern void scsi_host_busy_inc(struct Scsi_Host *, Scsi_Device *);
-extern void scsi_host_busy_dec_and_test(struct Scsi_Host *, Scsi_Device *);
/**
* scsi_find_device - find a device given the host
@@ -610,21 +595,3 @@ extern void scsi_upper_driver_unregister(struct Scsi_Device_Template *);
extern struct class shost_class;
#endif
-/*
- * Overrides for Emacs so that we follow Linus's tabbing style.
- * Emacs will notice this stuff at the end of the file and automatically
- * adjust the settings for this buffer only. This must remain at the end
- * of the file.
- * ---------------------------------------------------------------------------
- * Local variables:
- * c-indent-level: 4
- * c-brace-imaginary-offset: 0
- * c-brace-offset: -4
- * c-argdecl-indent: 4
- * c-label-offset: -4
- * c-continued-statement-offset: 4
- * c-continued-brace-offset: 0
- * indent-tabs-mode: nil
- * tab-width: 8
- * End:
- */
diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c
index 7f73b8b603dc..03a2acaf3d47 100644
--- a/drivers/scsi/pcmcia/aha152x_stub.c
+++ b/drivers/scsi/pcmcia/aha152x_stub.c
@@ -98,9 +98,8 @@ MODULE_LICENSE("Dual MPL/GPL");
typedef struct scsi_info_t {
dev_link_t link;
+ dev_node_t node;
struct Scsi_Host *host;
- int ndev;
- dev_node_t node[8];
} scsi_info_t;
static void aha152x_release_cs(u_long arg);
@@ -217,8 +216,6 @@ static void aha152x_config_cs(dev_link_t *link)
cisparse_t parse;
int i, last_ret, last_fn;
u_char tuple_data[64];
- struct scsi_device *dev;
- dev_node_t *node, **tail;
struct Scsi_Host *host;
DEBUG(0, "aha152x_config(0x%p)\n", link);
@@ -275,9 +272,6 @@ static void aha152x_config_cs(dev_link_t *link)
if (ext_trans)
s.ext_trans = ext_trans;
- tail = &link->dev;
- info->ndev = 0;
-
host = aha152x_probe_one(&s);
if (host == NULL) {
printk(KERN_INFO "aha152x_cs: no SCSI devices found\n");
@@ -286,39 +280,10 @@ static void aha152x_config_cs(dev_link_t *link)
scsi_add_host(host, NULL);
- list_for_each_entry(dev, &host->my_devices, siblings) {
- u_long arg[2], id;
- kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg);
- id = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) +
- ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000);
- node = &info->node[info->ndev];
- node->minor = 0;
- switch (dev->type) {
- case TYPE_TAPE:
- node->major = SCSI_TAPE_MAJOR;
- sprintf(node->dev_name, "st#%04lx", id);
- break;
- case TYPE_DISK:
- case TYPE_MOD:
- node->major = SCSI_DISK0_MAJOR;
- sprintf(node->dev_name, "sd#%04lx", id);
- break;
- case TYPE_ROM:
- case TYPE_WORM:
- node->major = SCSI_CDROM_MAJOR;
- sprintf(node->dev_name, "sr#%04lx", id);
- break;
- default:
- node->major = SCSI_GENERIC_MAJOR;
- sprintf(node->dev_name, "sg#%04lx", id);
- break;
- }
- *tail = node; tail = &node->next;
- info->ndev++;
- info->host = dev->host;
- }
+ sprintf(info->node.dev_name, "scsi%d", host->host_no);
+ link->dev = &info->node;
+ info->host = host;
- *tail = NULL;
link->state &= ~DEV_CONFIG_PENDING;
return;
diff --git a/drivers/scsi/pcmcia/fdomain_stub.c b/drivers/scsi/pcmcia/fdomain_stub.c
index 693c0c2c0bdc..4a428672adc1 100644
--- a/drivers/scsi/pcmcia/fdomain_stub.c
+++ b/drivers/scsi/pcmcia/fdomain_stub.c
@@ -81,9 +81,8 @@ static char *version =
typedef struct scsi_info_t {
dev_link_t link;
+ dev_node_t node;
struct Scsi_Host *host;
- int ndev;
- dev_node_t node[8];
} scsi_info_t;
extern Scsi_Host_Template fdomain_driver_template;
@@ -206,8 +205,6 @@ static void fdomain_config(dev_link_t *link)
cisparse_t parse;
int i, last_ret, last_fn, ints[3];
u_char tuple_data[64];
- Scsi_Device *dev;
- dev_node_t *node, **tail;
char str[16];
struct Scsi_Host *host;
@@ -259,42 +256,8 @@ static void fdomain_config(dev_link_t *link)
scsi_add_host(host, NULL);
- tail = &link->dev;
- info->ndev = 0;
-
- list_for_each_entry (dev, &host->my_devices, siblings) {
- u_long arg[2], id;
- kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg);
- id = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) +
- ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000);
- node = &info->node[info->ndev];
- node->minor = 0;
- switch (dev->type) {
- case TYPE_TAPE:
- node->major = SCSI_TAPE_MAJOR;
- sprintf(node->dev_name, "st#%04lx", id);
- break;
- case TYPE_DISK:
- case TYPE_MOD:
- node->major = SCSI_DISK0_MAJOR;
- sprintf(node->dev_name, "sd#%04lx", id);
- break;
- case TYPE_ROM:
- case TYPE_WORM:
- node->major = SCSI_CDROM_MAJOR;
- sprintf(node->dev_name, "sr#%04lx", id);
- break;
- default:
- node->major = SCSI_GENERIC_MAJOR;
- sprintf(node->dev_name, "sg#%04lx", id);
- break;
- }
- *tail = node; tail = &node->next;
- info->ndev++;
-
- }
-
- *tail = NULL;
+ sprintf(info->node.dev_name, "scsi%d", host->host_no);
+ link->dev = &info->node;
info->host = host;
link->state &= ~DEV_CONFIG_PENDING;
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c
index 8b42da5597fb..d40333670faf 100644
--- a/drivers/scsi/pcmcia/nsp_cs.c
+++ b/drivers/scsi/pcmcia/nsp_cs.c
@@ -88,9 +88,8 @@ static char *version = "$Id: nsp_cs.c,v 1.5 2002/11/05 12:06:29 elca Exp $";
typedef struct scsi_info_t {
dev_link_t link;
+ dev_node_t node;
struct Scsi_Host *host;
- int ndev;
- dev_node_t node[8];
int stop;
} scsi_info_t;
@@ -1621,8 +1620,6 @@ static void nsp_cs_config(dev_link_t *link)
memreq_t map;
cistpl_cftable_entry_t dflt = { 0 };
- Scsi_Device *dev;
- dev_node_t **tail, *node;
struct Scsi_Host *host;
nsp_hw_data *data = &nsp_data;
@@ -1762,58 +1759,13 @@ static void nsp_cs_config(dev_link_t *link)
goto cs_failed;
}
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,2))
host = __nsp_detect(&nsp_driver_template);
-#else
- scsi_register_module(MODULE_SCSI_HA, &nsp_driver_template);
- for (host = scsi_hostlist; host != NULL; host = host->next) {
- if (host->hostt == &nsp_driver_template)
- break;
-#endif
-
if (!host)
goto cs_failed;
- DEBUG(0, "GET_SCSI_INFO\n");
- tail = &link->dev;
- info->ndev = 0;
-
- list_for_each_entry (dev, &host->my_devices, siblings) {
- u_long arg[2], id;
- kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg);
- id = (arg[0]&0x0f) + ((arg[0]>>4)&0xf0) +
- ((arg[0]>>8)&0xf00) + ((arg[0]>>12)&0xf000);
- node = &info->node[info->ndev];
- node->minor = 0;
- switch (dev->type) {
- case TYPE_TAPE:
- node->major = SCSI_TAPE_MAJOR;
- sprintf(node->dev_name, "st#%04lx", id);
- break;
- case TYPE_DISK:
- case TYPE_MOD:
- node->major = SCSI_DISK0_MAJOR;
- sprintf(node->dev_name, "sd#%04lx", id);
- break;
- case TYPE_ROM:
- case TYPE_WORM:
- node->major = SCSI_CDROM_MAJOR;
- sprintf(node->dev_name, "sr#%04lx", id);
- break;
- default:
- node->major = SCSI_GENERIC_MAJOR;
- sprintf(node->dev_name, "sg#%04lx", id);
- break;
- }
- *tail = node; tail = &node->next;
- info->ndev++;
- info->host = dev->host;
- }
-
- *tail = NULL;
- if (info->ndev == 0) {
- printk(KERN_INFO "nsp_cs: no SCSI devices found\n");
- }
+ sprintf(info->node.dev_name, "scsi%d", host->host_no);
+ link->dev = &info->node;
+ info->host = host;
/* Finally, report what we've done */
printk(KERN_INFO "nsp_cs: index 0x%02x: Vcc %d.%d",
@@ -1837,10 +1789,7 @@ static void nsp_cs_config(dev_link_t *link)
req.Base+req.Size-1);
printk("\n");
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
scsi_add_host(host, NULL);
-#endif
-
link->state &= ~DEV_CONFIG_PENDING;
return;
diff --git a/drivers/scsi/pcmcia/qlogic_stub.c b/drivers/scsi/pcmcia/qlogic_stub.c
index 37a0fc27e7ca..e22d0d6d965d 100644
--- a/drivers/scsi/pcmcia/qlogic_stub.c
+++ b/drivers/scsi/pcmcia/qlogic_stub.c
@@ -85,10 +85,9 @@ MODULE_PARM(irq_list, "1-4i");
typedef struct scsi_info_t {
dev_link_t link;
+ dev_node_t node;
struct Scsi_Host *host;
unsigned short manf_id;
- int ndev;
- dev_node_t node[8];
} scsi_info_t;
static void qlogic_release(u_long arg);
@@ -205,8 +204,6 @@ static void qlogic_config(dev_link_t * link)
cisparse_t parse;
int i, last_ret, last_fn;
unsigned short tuple_data[32];
- Scsi_Device *dev;
- dev_node_t **tail, *node;
struct Scsi_Host *host;
DEBUG(0, "qlogic_config(0x%p)\n", link);
@@ -263,51 +260,18 @@ static void qlogic_config(dev_link_t * link)
else
qlogicfas_preset(link->io.BasePort1, link->irq.AssignedIRQ);
- tail = &link->dev;
- info->ndev = 0;
-
host = __qlogicfas_detect(&qlogicfas_driver_template);
if (!host) {
printk(KERN_INFO "qlogic_cs: no SCSI devices found\n");
goto out;
}
- scsi_add_host(host, NULL);
-
- list_for_each_entry(dev, &host->my_devices, siblings) {
- u_long arg[2], id;
- kernel_scsi_ioctl(dev, SCSI_IOCTL_GET_IDLUN, arg);
- id = (arg[0] & 0x0f) + ((arg[0] >> 4) & 0xf0) + ((arg[0] >> 8) & 0xf00) + ((arg[0] >> 12) & 0xf000);
- node = &info->node[info->ndev];
- node->minor = 0;
- switch (dev->type) {
- case TYPE_TAPE:
- node->major = SCSI_TAPE_MAJOR;
- sprintf(node->dev_name, "st#%04lx", id);
- break;
- case TYPE_DISK:
- case TYPE_MOD:
- node->major = SCSI_DISK0_MAJOR;
- sprintf(node->dev_name, "sd#%04lx", id);
- break;
- case TYPE_ROM:
- case TYPE_WORM:
- node->major = SCSI_CDROM_MAJOR;
- sprintf(node->dev_name, "sr#%04lx", id);
- break;
- default:
- node->major = SCSI_GENERIC_MAJOR;
- sprintf(node->dev_name, "sg#%04lx", id);
- break;
- }
- *tail = node;
- tail = &node->next;
- info->ndev++;
- }
-
- *tail = NULL;
+ sprintf(info->node.dev_name, "scsi%d", host->host_no);
+ link->dev = &info->node;
info->host = host;
+ scsi_add_host(host, NULL);
+
out:
link->state &= ~DEV_CONFIG_PENDING;
return;
diff --git a/drivers/scsi/pluto.c b/drivers/scsi/pluto.c
index 9019d5bb4aaf..3475e519d151 100644
--- a/drivers/scsi/pluto.c
+++ b/drivers/scsi/pluto.c
@@ -246,11 +246,6 @@ int __init pluto_detect(Scsi_Host_Template *tpnt)
host->max_channel = inq->channels;
host->irq = fc->irq;
-#ifdef __sparc_v9__
- host->unchecked_isa_dma = 1;
-#endif
-
-
fc->channels = inq->channels + 1;
fc->targets = inq->targets;
fc->ages = ages;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 9633809d41b6..e3eeea551676 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -56,6 +56,9 @@
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
/*
* Definitions and constants.
@@ -116,11 +119,6 @@ static const char * const spaces = " "; /* 16 of them */
static unsigned scsi_default_dev_flags;
LIST_HEAD(scsi_dev_info_list);
-/*
- * Function prototypes.
- */
-extern void scsi_times_out(struct scsi_cmnd *cmd);
-
MODULE_PARM(scsi_logging_level, "i");
MODULE_PARM_DESC(scsi_logging_level, "SCSI logging level; should be zero or nonzero");
@@ -534,7 +532,6 @@ void scsi_init_cmd_from_req(struct scsi_cmnd *cmd, struct scsi_request *sreq)
cmd->request = sreq->sr_request;
memcpy(cmd->data_cmnd, sreq->sr_cmnd, sizeof(cmd->data_cmnd));
- cmd->reset_chain = NULL;
cmd->serial_number = 0;
cmd->serial_number_at_timeout = 0;
cmd->bufflen = sreq->sr_bufflen;
diff --git a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h
index 87e75bb01976..0405efb168e7 100644
--- a/drivers/scsi/scsi.h
+++ b/drivers/scsi/scsi.h
@@ -18,7 +18,6 @@
#include <linux/config.h> /* for CONFIG_SCSI_LOGGING */
#include <scsi/scsi.h>
-
/*
* These are the values that the SCpnt->sc_data_direction and
* SRpnt->sr_data_direction can take. These need to be set
@@ -126,144 +125,11 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
#define SCSI_STATE_BHQUEUE 0x100a
#define SCSI_STATE_MLQUEUE 0x100b
-/*
- * These are the values that the owner field can take.
- * They are used as an indication of who the command belongs to.
- */
-#define SCSI_OWNER_HIGHLEVEL 0x100
-#define SCSI_OWNER_MIDLEVEL 0x101
-#define SCSI_OWNER_LOWLEVEL 0x102
-#define SCSI_OWNER_ERROR_HANDLER 0x103
-#define SCSI_OWNER_BH_HANDLER 0x104
-#define SCSI_OWNER_NOBODY 0x105
-
#define IDENTIFY_BASE 0x80
#define IDENTIFY(can_disconnect, lun) (IDENTIFY_BASE |\
((can_disconnect) ? 0x40 : 0) |\
((lun) & 0x07))
-
-/*
- * This defines the scsi logging feature. It is a means by which the
- * user can select how much information they get about various goings on,
- * and it can be really useful for fault tracing. The logging word is divided
- * into 8 nibbles, each of which describes a loglevel. The division of things
- * is somewhat arbitrary, and the division of the word could be changed if it
- * were really needed for any reason. The numbers below are the only place where these
- * are specified. For a first go-around, 3 bits is more than enough, since this
- * gives 8 levels of logging (really 7, since 0 is always off). Cutting to 2 bits
- * might be wise at some point.
- */
-
-#define SCSI_LOG_ERROR_SHIFT 0
-#define SCSI_LOG_TIMEOUT_SHIFT 3
-#define SCSI_LOG_SCAN_SHIFT 6
-#define SCSI_LOG_MLQUEUE_SHIFT 9
-#define SCSI_LOG_MLCOMPLETE_SHIFT 12
-#define SCSI_LOG_LLQUEUE_SHIFT 15
-#define SCSI_LOG_LLCOMPLETE_SHIFT 18
-#define SCSI_LOG_HLQUEUE_SHIFT 21
-#define SCSI_LOG_HLCOMPLETE_SHIFT 24
-#define SCSI_LOG_IOCTL_SHIFT 27
-
-#define SCSI_LOG_ERROR_BITS 3
-#define SCSI_LOG_TIMEOUT_BITS 3
-#define SCSI_LOG_SCAN_BITS 3
-#define SCSI_LOG_MLQUEUE_BITS 3
-#define SCSI_LOG_MLCOMPLETE_BITS 3
-#define SCSI_LOG_LLQUEUE_BITS 3
-#define SCSI_LOG_LLCOMPLETE_BITS 3
-#define SCSI_LOG_HLQUEUE_BITS 3
-#define SCSI_LOG_HLCOMPLETE_BITS 3
-#define SCSI_LOG_IOCTL_BITS 3
-
-#ifdef CONFIG_SCSI_LOGGING
-
-#define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD) \
-{ \
- unsigned int mask; \
- \
- mask = (1 << (BITS)) - 1; \
- if( ((scsi_logging_level >> (SHIFT)) & mask) > (LEVEL) ) \
- { \
- (CMD); \
- } \
-}
-
-#define SCSI_SET_LOGGING(SHIFT, BITS, LEVEL) \
-{ \
- unsigned int mask; \
- \
- mask = ((1 << (BITS)) - 1) << SHIFT; \
- scsi_logging_level = ((scsi_logging_level & ~mask) \
- | ((LEVEL << SHIFT) & mask)); \
-}
-
-
-
-#else
-
-/*
- * With no logging enabled, stub these out so they don't do anything.
- */
-#define SCSI_SET_LOGGING(SHIFT, BITS, LEVEL)
-
-#define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD)
-#endif
-
-/*
- * These are the macros that are actually used throughout the code to
- * log events. If logging isn't enabled, they are no-ops and will be
- * completely absent from the user's code.
- *
- * The 'set' versions of the macros are really intended to only be called
- * from the /proc filesystem, and in production kernels this will be about
- * all that is ever used. It could be useful in a debugging environment to
- * bump the logging level when certain strange events are detected, however.
- */
-#define SCSI_LOG_ERROR_RECOVERY(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_ERROR_SHIFT, SCSI_LOG_ERROR_BITS, LEVEL,CMD);
-#define SCSI_LOG_TIMEOUT(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_TIMEOUT_SHIFT, SCSI_LOG_TIMEOUT_BITS, LEVEL,CMD);
-#define SCSI_LOG_SCAN_BUS(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_SCAN_SHIFT, SCSI_LOG_SCAN_BITS, LEVEL,CMD);
-#define SCSI_LOG_MLQUEUE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_MLQUEUE_SHIFT, SCSI_LOG_MLQUEUE_BITS, LEVEL,CMD);
-#define SCSI_LOG_MLCOMPLETE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_MLCOMPLETE_SHIFT, SCSI_LOG_MLCOMPLETE_BITS, LEVEL,CMD);
-#define SCSI_LOG_LLQUEUE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_LLQUEUE_SHIFT, SCSI_LOG_LLQUEUE_BITS, LEVEL,CMD);
-#define SCSI_LOG_LLCOMPLETE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_LLCOMPLETE_SHIFT, SCSI_LOG_LLCOMPLETE_BITS, LEVEL,CMD);
-#define SCSI_LOG_HLQUEUE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_HLQUEUE_SHIFT, SCSI_LOG_HLQUEUE_BITS, LEVEL,CMD);
-#define SCSI_LOG_HLCOMPLETE(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_HLCOMPLETE_SHIFT, SCSI_LOG_HLCOMPLETE_BITS, LEVEL,CMD);
-#define SCSI_LOG_IOCTL(LEVEL,CMD) \
- SCSI_CHECK_LOGGING(SCSI_LOG_IOCTL_SHIFT, SCSI_LOG_IOCTL_BITS, LEVEL,CMD);
-
-
-#define SCSI_SET_ERROR_RECOVERY_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_ERROR_SHIFT, SCSI_LOG_ERROR_BITS, LEVEL);
-#define SCSI_SET_TIMEOUT_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_TIMEOUT_SHIFT, SCSI_LOG_TIMEOUT_BITS, LEVEL);
-#define SCSI_SET_SCAN_BUS_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_SCAN_SHIFT, SCSI_LOG_SCAN_BITS, LEVEL);
-#define SCSI_SET_MLQUEUE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_MLQUEUE_SHIFT, SCSI_LOG_MLQUEUE_BITS, LEVEL);
-#define SCSI_SET_MLCOMPLETE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_MLCOMPLETE_SHIFT, SCSI_LOG_MLCOMPLETE_BITS, LEVEL);
-#define SCSI_SET_LLQUEUE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_LLQUEUE_SHIFT, SCSI_LOG_LLQUEUE_BITS, LEVEL);
-#define SCSI_SET_LLCOMPLETE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_LLCOMPLETE_SHIFT, SCSI_LOG_LLCOMPLETE_BITS, LEVEL);
-#define SCSI_SET_HLQUEUE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_HLQUEUE_SHIFT, SCSI_LOG_HLQUEUE_BITS, LEVEL);
-#define SCSI_SET_HLCOMPLETE_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_HLCOMPLETE_SHIFT, SCSI_LOG_HLCOMPLETE_BITS, LEVEL);
-#define SCSI_SET_IOCTL_LOGGING(LEVEL) \
- SCSI_SET_LOGGING(SCSI_LOG_IOCTL_SHIFT, SCSI_LOG_IOCTL_BITS, LEVEL);
-
/* host byte codes */
#define DID_OK 0x00 /* NO error */
#define DID_NO_CONNECT 0x01 /* Couldn't connect before timeout period */
@@ -356,6 +222,7 @@ extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
* Forward-declaration of structs for prototypes.
*/
struct Scsi_Host;
+struct scsi_target;
struct scatterlist;
/*
@@ -365,24 +232,12 @@ typedef struct scsi_device Scsi_Device;
typedef struct scsi_cmnd Scsi_Cmnd;
typedef struct scsi_request Scsi_Request;
-#define SCSI_CMND_MAGIC 0xE25C23A5
-#define SCSI_REQ_MAGIC 0x75F6D354
-
-/*
- * Here is where we prototype most of the mid-layer.
- */
-
-extern unsigned int scsi_logging_level; /* What do we log? */
-
/*
* These are the error handling functions defined in scsi_error.c
*/
-extern void scsi_times_out(Scsi_Cmnd * SCpnt);
extern void scsi_add_timer(Scsi_Cmnd * SCset, int timeout,
void (*complete) (Scsi_Cmnd *));
extern int scsi_delete_timer(Scsi_Cmnd * SCset);
-extern void scsi_error_handler(void *host);
-extern int scsi_decide_disposition(Scsi_Cmnd * SCpnt);
extern int scsi_block_when_processing_errors(Scsi_Device *);
extern void scsi_sleep(int);
@@ -396,23 +251,12 @@ extern int scsi_partsize(unsigned char *buf, unsigned long capacity,
/*
* Prototypes for functions in scsi_lib.c
*/
-extern int scsi_maybe_unblock_host(Scsi_Device * SDpnt);
-extern void scsi_setup_cmd_retry(Scsi_Cmnd *SCpnt);
extern void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors,
int block_sectors);
-extern int scsi_queue_insert(struct scsi_cmnd *cmd, int reason);
-extern void scsi_queue_next_request(request_queue_t *q, struct scsi_cmnd *cmd);
-extern request_queue_t *scsi_alloc_queue(struct scsi_device *sdev);
-extern void scsi_free_queue(request_queue_t *q);
-extern int scsi_init_queue(void);
-extern void scsi_exit_queue(void);
/*
* Prototypes for functions in scsi.c
*/
-extern int scsi_dispatch_cmd(Scsi_Cmnd * SCpnt);
-extern int scsi_setup_command_freelist(struct Scsi_Host *shost);
-extern void scsi_destroy_command_freelist(struct Scsi_Host *shost);
extern struct scsi_cmnd *scsi_get_command(struct scsi_device *dev, int flags);
extern void scsi_put_command(struct scsi_cmnd *cmd);
extern void scsi_adjust_queue_depth(Scsi_Device *, int, int);
@@ -422,13 +266,6 @@ extern void scsi_slave_detach(struct scsi_device *);
extern int scsi_device_get(struct scsi_device *);
extern void scsi_device_put(struct scsi_device *);
extern void scsi_set_device_offline(struct scsi_device *);
-extern void scsi_done(Scsi_Cmnd * SCpnt);
-extern void scsi_finish_command(Scsi_Cmnd *);
-extern int scsi_retry_command(Scsi_Cmnd *);
-extern int scsi_attach_device(struct scsi_device *);
-extern void scsi_detach_device(struct scsi_device *);
-extern void scsi_rescan_device(struct scsi_device *);
-extern int scsi_get_device_flags(unsigned char *vendor, unsigned char *model);
/*
* Newer request-based interfaces.
@@ -438,30 +275,10 @@ extern void scsi_release_request(Scsi_Request *);
extern void scsi_wait_req(Scsi_Request *, const void *cmnd,
void *buffer, unsigned bufflen,
int timeout, int retries);
-
extern void scsi_do_req(Scsi_Request *, const void *cmnd,
void *buffer, unsigned bufflen,
void (*done) (struct scsi_cmnd *),
int timeout, int retries);
-extern int scsi_insert_special_req(Scsi_Request * SRpnt, int);
-extern void scsi_init_cmd_from_req(Scsi_Cmnd *, Scsi_Request *);
-
-/*
- * Prototypes for functions in scsi_proc.c
- */
-#ifdef CONFIG_PROC_FS
-extern int scsi_init_procfs(void);
-extern void scsi_exit_procfs(void);
-
-extern void scsi_proc_host_add(struct Scsi_Host *);
-extern void scsi_proc_host_rm(struct Scsi_Host *);
-#else
-static inline int scsi_init_procfs(void) { return 0; }
-static inline void scsi_exit_procfs(void) { ; }
-
-static inline void scsi_proc_host_add(struct Scsi_Host *);
-static inline void scsi_proc_host_rm(struct Scsi_Host *);
-#endif /* CONFIG_PROC_FS */
/*
* Prototypes for functions in scsi_scan.c
@@ -486,40 +303,6 @@ extern int print_msg(const unsigned char *);
extern const char *scsi_sense_key_string(unsigned char);
extern const char *scsi_extd_sense_format(unsigned char, unsigned char);
-/*
- * dev_info: for the black/white list in the old scsi_static_device_list
- */
-struct dev_info {
- char *vendor;
- char *model;
- char *revision; /* revision known to be bad, unused */
- unsigned flags;
-};
-
-extern struct dev_info scsi_static_device_list[];
-
-/*
- * scsi_dev_info_list: structure to hold black/white listed devices.
- */
-struct scsi_dev_info_list {
- struct list_head dev_info_list;
- char vendor[8];
- char model[16];
- unsigned flags;
- unsigned compatible; /* for use with scsi_static_device_list entries */
-};
-extern struct list_head scsi_dev_info_list;
-extern int scsi_dev_info_list_add_str(char *);
-
-/*
- * scsi_target: representation of a scsi target, for now, this is only
- * used for single_lun devices. If no one has active IO to the target,
- * starget_sdev_user is NULL, else it points to the active sdev.
- */
-struct scsi_target {
- struct scsi_device *starget_sdev_user;
- unsigned int starget_refcnt;
-};
/*
* The scsi_device struct contains what we know about each given scsi
@@ -540,8 +323,6 @@ struct scsi_device {
*/
struct list_head siblings; /* list of all devices on this host */
struct list_head same_target_siblings; /* just the devices sharing same target id */
- wait_queue_head_t scpnt_wait; /* Used to wait if
- device is busy */
struct Scsi_Host *host;
request_queue_t *request_queue;
volatile unsigned short device_busy; /* commands actually active on low-level */
@@ -619,9 +400,6 @@ struct scsi_device {
/* default value if the device doesn't override */
#define SCSI_DEFAULT_DEVICE_BLOCKED 3
-
- // Flag to allow revalidate to succeed in sd_open
- int allow_revalidate;
struct device sdev_driverfs_dev;
};
#define to_scsi_device(d) \
@@ -698,7 +476,6 @@ struct scsi_cmnd {
unsigned short state;
unsigned short owner;
Scsi_Request *sc_request;
- struct scsi_cmnd *reset_chain;
struct list_head list; /* scsi_cmnd participates in queue lists */
@@ -783,14 +560,6 @@ struct scsi_cmnd {
unsigned flags;
- /*
- * Used to indicate that a command which has timed out also
- * completed normally. Typically the completion function will
- * do nothing but set this flag in this instance because the
- * timeout handler is already running.
- */
- unsigned done_late:1;
-
/* Low-level done function - can be used by low-level driver to point
* to completion function. Not used by mid/upper level code. */
void (*scsi_done) (struct scsi_cmnd *);
@@ -817,11 +586,6 @@ struct scsi_cmnd {
};
/*
- * Flag bit for the internal_timeout array
- */
-#define NORMAL_TIMEOUT 0
-
-/*
* Definitions and prototypes used for scsi mid-level queue.
*/
#define SCSI_MLQUEUE_HOST_BUSY 0x1055
@@ -829,8 +593,7 @@ struct scsi_cmnd {
#define SCSI_MLQUEUE_EH_RETRY 0x1057
/*
- * old style reset request from external source
- * (private to sg.c and scsi_error.c, supplied by scsi_obsolete.c)
+ * Reset request from external source
*/
#define SCSI_TRY_RESET_DEVICE 1
#define SCSI_TRY_RESET_BUS 2
@@ -922,34 +685,6 @@ static inline Scsi_Cmnd *scsi_find_tag(Scsi_Device *SDpnt, int tag) {
return (Scsi_Cmnd *)req->special;
}
-#define scsi_eh_eflags_chk(scp, flags) (scp->eh_eflags & flags)
-
-#define scsi_eh_eflags_set(scp, flags) do { \
- scp->eh_eflags |= flags; \
- } while(0)
-
-#define scsi_eh_eflags_clr(scp, flags) do { \
- scp->eh_eflags &= ~flags; \
- } while(0)
-
-#define scsi_eh_eflags_clr_all(scp) (scp->eh_eflags = 0)
-
-/*
- * Scsi Error Handler Flags
- */
-#define SCSI_EH_CANCEL_CMD 0x0001 /* Cancel this cmd */
-#define SCSI_EH_REC_TIMEOUT 0x0002 /* EH retry timed out */
-
-#define SCSI_SENSE_VALID(scmd) ((scmd->sense_buffer[0] & 0x70) == 0x70)
-
-extern int scsi_eh_scmd_add(struct scsi_cmnd *, int);
-
int scsi_set_medium_removal(Scsi_Device *dev, char state);
-extern int scsi_device_register(struct scsi_device *);
-extern void scsi_device_unregister(struct scsi_device *);
-
-extern int scsi_sysfs_register(void);
-extern void scsi_sysfs_unregister(void);
-
#endif /* _SCSI_H */
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index d646babec874..ab7df5d851e7 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -52,6 +52,7 @@
#include <linux/version.h>
#endif
+#include "scsi_logging.h"
#include "scsi_debug.h"
static const char * scsi_debug_version_str = "Version: 1.69 (20030329)";
@@ -865,7 +866,7 @@ static int resp_report_luns(unsigned char * cmd, unsigned char * buff,
static void timer_intr_handler(unsigned long indx)
{
struct sdebug_queued_cmd * sqcp;
- unsigned int iflags;
+ unsigned long iflags;
if (indx >= SCSI_DEBUG_CANQUEUE) {
printk(KERN_ERR "scsi_debug:timer_intr_handler: indx too "
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 5581d2c55eb2..908aecb87e20 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -28,6 +28,9 @@
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
#ifdef DEBUG
#define SENSE_TIMEOUT SCSI_TIMEOUT
#else
@@ -916,7 +919,6 @@ static int scsi_eh_bus_device_reset(struct Scsi_Host *shost,
**/
static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
{
- struct scsi_device *sdev;
unsigned long flags;
int rtn;
@@ -934,16 +936,9 @@ static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
if (rtn == SUCCESS) {
scsi_sleep(BUS_RESET_SETTLE_TIME);
- /*
- * Mark all affected devices to expect a unit attention.
- */
- list_for_each_entry(sdev, &scmd->device->host->my_devices,
- siblings)
- if (scmd->device->channel == sdev->channel) {
- sdev->was_reset = 1;
- sdev->expecting_cc_ua = 1;
- }
+ scsi_report_bus_reset(scmd->device->host, scmd->device->channel);
}
+
return rtn;
}
@@ -953,7 +948,6 @@ static int scsi_try_bus_reset(struct scsi_cmnd *scmd)
**/
static int scsi_try_host_reset(struct scsi_cmnd *scmd)
{
- struct scsi_device *sdev;
unsigned long flags;
int rtn;
@@ -971,16 +965,9 @@ static int scsi_try_host_reset(struct scsi_cmnd *scmd)
if (rtn == SUCCESS) {
scsi_sleep(HOST_RESET_SETTLE_TIME);
- /*
- * Mark all affected devices to expect a unit attention.
- */
- list_for_each_entry(sdev, &scmd->device->host->my_devices,
- siblings)
- if (scmd->device->channel == sdev->channel) {
- sdev->was_reset = 1;
- sdev->expecting_cc_ua = 1;
- }
+ scsi_report_bus_reset(scmd->device->host, scmd->device->channel);
}
+
return rtn;
}
@@ -1674,13 +1661,10 @@ scsi_reset_provider(struct scsi_device *dev, int flag)
scmd->scsi_done = scsi_reset_provider_done_command;
scmd->done = NULL;
- scmd->reset_chain = NULL;
-
scmd->buffer = NULL;
scmd->bufflen = 0;
scmd->request_buffer = NULL;
scmd->request_bufflen = 0;
-
scmd->internal_timeout = NORMAL_TIMEOUT;
scmd->abort_reason = DID_ABORT;
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c
index 1308ffff5011..4843e64e25b4 100644
--- a/drivers/scsi/scsi_ioctl.c
+++ b/drivers/scsi/scsi_ioctl.c
@@ -23,6 +23,8 @@
#include "hosts.h"
#include <scsi/scsi_ioctl.h>
+#include "scsi_logging.h"
+
#define NORMAL_RETRIES 5
#define IOCTL_NORMAL_TIMEOUT (10 * HZ)
#define FORMAT_UNIT_TIMEOUT (2 * 60 * 60 * HZ)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index b04881546ed8..a9f53b4a2796 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -19,6 +19,9 @@
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
#define SG_MEMPOOL_NR 5
#define SG_MEMPOOL_SIZE 32
@@ -271,7 +274,6 @@ void scsi_wait_req(struct scsi_request *sreq, const void *cmnd, void *buffer,
static int scsi_init_cmd_errh(struct scsi_cmnd *cmd)
{
cmd->owner = SCSI_OWNER_MIDLEVEL;
- cmd->reset_chain = NULL;
cmd->serial_number = 0;
cmd->serial_number_at_timeout = 0;
cmd->flags = 0;
@@ -296,7 +298,6 @@ static int scsi_init_cmd_errh(struct scsi_cmnd *cmd)
memcpy(cmd->data_cmnd, cmd->cmnd, sizeof(cmd->cmnd));
cmd->buffer = cmd->request_buffer;
cmd->bufflen = cmd->request_bufflen;
- cmd->reset_chain = NULL;
cmd->internal_timeout = NORMAL_TIMEOUT;
cmd->abort_reason = 0;
@@ -1140,66 +1141,61 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
*
* Lock status: IO request lock assumed to be held when called.
*/
-static void scsi_request_fn(request_queue_t *q)
+static void scsi_request_fn(struct request_queue *q)
{
struct scsi_device *sdev = q->queuedata;
struct Scsi_Host *shost = sdev->host;
struct scsi_cmnd *cmd;
struct request *req;
- unsigned long flags;
/*
* To start with, we keep looping until the queue is empty, or until
* the host is no longer able to accept any more requests.
*/
- for (;;) {
- if (blk_queue_plugged(q))
- goto completed;
-
+ while (!blk_queue_plugged(q)) {
/*
* get next queueable request. We do this early to make sure
* that the request is fully prepared even if we cannot
* accept it.
*/
req = elv_next_request(q);
-
- if (!req)
- goto completed;
-
- if (!scsi_dev_queue_ready(q, sdev))
- goto completed;
+ if (!req || !scsi_dev_queue_ready(q, sdev))
+ break;
/*
* Remove the request from the request list.
*/
- if (!(blk_queue_tagged(q) && (blk_queue_start_tag(q, req) == 0)))
+ if (!(blk_queue_tagged(q) && !blk_queue_start_tag(q, req)))
blkdev_dequeue_request(req);
-
sdev->device_busy++;
- spin_unlock_irq(q->queue_lock);
- spin_lock_irqsave(shost->host_lock, flags);
- if (!scsi_host_queue_ready(q, shost, sdev))
- goto host_lock_held;
+ spin_unlock(q->queue_lock);
+ spin_lock(shost->host_lock);
+ if (!scsi_host_queue_ready(q, shost, sdev))
+ goto not_ready;
if (sdev->single_lun) {
if (sdev->sdev_target->starget_sdev_user &&
- (sdev->sdev_target->starget_sdev_user != sdev))
- goto host_lock_held;
- else
- sdev->sdev_target->starget_sdev_user = sdev;
+ sdev->sdev_target->starget_sdev_user != sdev)
+ goto not_ready;
+ sdev->sdev_target->starget_sdev_user = sdev;
}
-
shost->host_busy++;
- spin_unlock_irqrestore(shost->host_lock, flags);
-
- cmd = req->special;
/*
- * Should be impossible for a correctly prepared request
- * please mail the stack trace to linux-scsi@vger.kernel.org
+ * XXX(hch): This is rather suboptimal, scsi_dispatch_cmd will
+ * take the lock again.
*/
- BUG_ON(!cmd);
+ spin_unlock_irq(shost->host_lock);
+
+ cmd = req->special;
+ if (unlikely(cmd == NULL)) {
+ printk(KERN_CRIT "impossible request in %s.\n"
+ "please mail a stack trace to "
+ "linux-scsi@vger.kernel.org",
+ __FUNCTION__);
+ BUG();
+ }
/*
* Finally, initialize any error handling parameters, and set up
@@ -1211,18 +1207,14 @@ static void scsi_request_fn(request_queue_t *q)
* Dispatch the command to the low-level driver.
*/
scsi_dispatch_cmd(cmd);
-
- /*
- * Now we need to grab the lock again. We are about to mess
- * with the request queue and try to find another command.
- */
spin_lock_irq(q->queue_lock);
}
-completed:
+
return;
-host_lock_held:
- spin_unlock_irqrestore(shost->host_lock, flags);
+ not_ready:
+ spin_unlock_irq(shost->host_lock);
+
/*
* lock q, handle tag, requeue req, and decrement device_busy. We
* must return with queue_lock held.
@@ -1257,28 +1249,15 @@ u64 scsi_calculate_bounce_limit(struct Scsi_Host *shost)
return BLK_BOUNCE_HIGH;
}
-request_queue_t *scsi_alloc_queue(struct scsi_device *sdev)
+struct request_queue *scsi_alloc_queue(struct scsi_device *sdev)
{
- request_queue_t *q;
- struct Scsi_Host *shost;
+ struct Scsi_Host *shost = sdev->host;
+ struct request_queue *q = kmalloc(sizeof(*q), GFP_ATOMIC);
- q = kmalloc(sizeof(*q), GFP_ATOMIC);
if (!q)
return NULL;
memset(q, 0, sizeof(*q));
- /*
- * XXX move host code to scsi_register
- */
- shost = sdev->host;
- if (!shost->max_sectors) {
- /*
- * Driver imposes no hard sector transfer limit.
- * start at machine infinity initially.
- */
- shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS;
- }
-
blk_init_queue(q, scsi_request_fn, &sdev->sdev_lock);
blk_queue_prep_rq(q, scsi_prep_fn);
@@ -1289,11 +1268,10 @@ request_queue_t *scsi_alloc_queue(struct scsi_device *sdev)
if (!shost->use_clustering)
clear_bit(QUEUE_FLAG_CLUSTER, &q->queue_flags);
-
return q;
}
-void scsi_free_queue(request_queue_t *q)
+void scsi_free_queue(struct request_queue *q)
{
blk_cleanup_queue(q);
kfree(q);
diff --git a/drivers/scsi/scsi_logging.h b/drivers/scsi/scsi_logging.h
new file mode 100644
index 000000000000..a282c84c8ef5
--- /dev/null
+++ b/drivers/scsi/scsi_logging.h
@@ -0,0 +1,117 @@
+#ifndef _SCSI_LOGGING_H
+#define _SCSI_LOGGING_H
+
+#include <linux/config.h>
+
+/*
+ * This defines the scsi logging feature. It is a means by which the user
+ * can select how much information they get about various goings on, and it
+ * can be really useful for fault tracing. The logging word is divided into
+ * 8 nibbles, each of which describes a loglevel. The division of things is
+ * somewhat arbitrary, and the division of the word could be changed if it
+ * were really needed for any reason. The numbers below are the only place
+ * where these are specified. For a first go-around, 3 bits is more than
+ * enough, since this gives 8 levels of logging (really 7, since 0 is always
+ * off). Cutting to 2 bits might be wise at some point.
+ */
+
+#define SCSI_LOG_ERROR_SHIFT 0
+#define SCSI_LOG_TIMEOUT_SHIFT 3
+#define SCSI_LOG_SCAN_SHIFT 6
+#define SCSI_LOG_MLQUEUE_SHIFT 9
+#define SCSI_LOG_MLCOMPLETE_SHIFT 12
+#define SCSI_LOG_LLQUEUE_SHIFT 15
+#define SCSI_LOG_LLCOMPLETE_SHIFT 18
+#define SCSI_LOG_HLQUEUE_SHIFT 21
+#define SCSI_LOG_HLCOMPLETE_SHIFT 24
+#define SCSI_LOG_IOCTL_SHIFT 27
+
+#define SCSI_LOG_ERROR_BITS 3
+#define SCSI_LOG_TIMEOUT_BITS 3
+#define SCSI_LOG_SCAN_BITS 3
+#define SCSI_LOG_MLQUEUE_BITS 3
+#define SCSI_LOG_MLCOMPLETE_BITS 3
+#define SCSI_LOG_LLQUEUE_BITS 3
+#define SCSI_LOG_LLCOMPLETE_BITS 3
+#define SCSI_LOG_HLQUEUE_BITS 3
+#define SCSI_LOG_HLCOMPLETE_BITS 3
+#define SCSI_LOG_IOCTL_BITS 3
+
+
+#ifdef CONFIG_SCSI_LOGGING
+extern unsigned int scsi_logging_level;
+#define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD) \
+{ \
+ unsigned int mask = (1 << (BITS)) - 1; \
+ if (((scsi_logging_level >> (SHIFT)) & mask) > (LEVEL)) \
+ (CMD); \
+}
+
+#define SCSI_SET_LOGGING(SHIFT, BITS, LEVEL) \
+{ \
+ unsigned int mask = ((1 << (BITS)) - 1) << SHIFT; \
+ scsi_logging_level = ((scsi_logging_level & ~mask) \
+ | ((LEVEL << SHIFT) & mask)); \
+}
+#else
+/*
+ * With no logging enabled, stub these out so they don't do anything.
+ */
+#define SCSI_CHECK_LOGGING(SHIFT, BITS, LEVEL, CMD)
+#define SCSI_SET_LOGGING(SHIFT, BITS, LEVEL)
+#endif /* CONFIG_SCSI_LOGGING */
+
+/*
+ * These are the macros that are actually used throughout the code to
+ * log events. If logging isn't enabled, they are no-ops and will be
+ * completely absent from the user's code.
+ *
+ * The 'set' versions of the macros are really intended to only be called
+ * from the /proc filesystem, and in production kernels this will be about
+ * all that is ever used. It could be useful in a debugging environment to
+ * bump the logging level when certain strange events are detected, however.
+ */
+#define SCSI_LOG_ERROR_RECOVERY(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_ERROR_SHIFT, SCSI_LOG_ERROR_BITS, LEVEL,CMD);
+#define SCSI_LOG_TIMEOUT(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_TIMEOUT_SHIFT, SCSI_LOG_TIMEOUT_BITS, LEVEL,CMD);
+#define SCSI_LOG_SCAN_BUS(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_SCAN_SHIFT, SCSI_LOG_SCAN_BITS, LEVEL,CMD);
+#define SCSI_LOG_MLQUEUE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_MLQUEUE_SHIFT, SCSI_LOG_MLQUEUE_BITS, LEVEL,CMD);
+#define SCSI_LOG_MLCOMPLETE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_MLCOMPLETE_SHIFT, SCSI_LOG_MLCOMPLETE_BITS, LEVEL,CMD);
+#define SCSI_LOG_LLQUEUE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_LLQUEUE_SHIFT, SCSI_LOG_LLQUEUE_BITS, LEVEL,CMD);
+#define SCSI_LOG_LLCOMPLETE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_LLCOMPLETE_SHIFT, SCSI_LOG_LLCOMPLETE_BITS, LEVEL,CMD);
+#define SCSI_LOG_HLQUEUE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_HLQUEUE_SHIFT, SCSI_LOG_HLQUEUE_BITS, LEVEL,CMD);
+#define SCSI_LOG_HLCOMPLETE(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_HLCOMPLETE_SHIFT, SCSI_LOG_HLCOMPLETE_BITS, LEVEL,CMD);
+#define SCSI_LOG_IOCTL(LEVEL,CMD) \
+ SCSI_CHECK_LOGGING(SCSI_LOG_IOCTL_SHIFT, SCSI_LOG_IOCTL_BITS, LEVEL,CMD);
+
+
+#define SCSI_SET_ERROR_RECOVERY_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_ERROR_SHIFT, SCSI_LOG_ERROR_BITS, LEVEL);
+#define SCSI_SET_TIMEOUT_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_TIMEOUT_SHIFT, SCSI_LOG_TIMEOUT_BITS, LEVEL);
+#define SCSI_SET_SCAN_BUS_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_SCAN_SHIFT, SCSI_LOG_SCAN_BITS, LEVEL);
+#define SCSI_SET_MLQUEUE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_MLQUEUE_SHIFT, SCSI_LOG_MLQUEUE_BITS, LEVEL);
+#define SCSI_SET_MLCOMPLETE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_MLCOMPLETE_SHIFT, SCSI_LOG_MLCOMPLETE_BITS, LEVEL);
+#define SCSI_SET_LLQUEUE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_LLQUEUE_SHIFT, SCSI_LOG_LLQUEUE_BITS, LEVEL);
+#define SCSI_SET_LLCOMPLETE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_LLCOMPLETE_SHIFT, SCSI_LOG_LLCOMPLETE_BITS, LEVEL);
+#define SCSI_SET_HLQUEUE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_HLQUEUE_SHIFT, SCSI_LOG_HLQUEUE_BITS, LEVEL);
+#define SCSI_SET_HLCOMPLETE_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_HLCOMPLETE_SHIFT, SCSI_LOG_HLCOMPLETE_BITS, LEVEL);
+#define SCSI_SET_IOCTL_LOGGING(LEVEL) \
+ SCSI_SET_LOGGING(SCSI_LOG_IOCTL_SHIFT, SCSI_LOG_IOCTL_BITS, LEVEL);
+
+#endif /* _SCSI_LOGGING_H */
diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h
new file mode 100644
index 000000000000..d068cd1a22bb
--- /dev/null
+++ b/drivers/scsi/scsi_priv.h
@@ -0,0 +1,146 @@
+#ifndef _SCSI_PRIV_H
+#define _SCSI_PRIV_H
+
+/*
+ * These are the values that the owner field can take.
+ * They are used as an indication of who the command belongs to.
+ */
+#define SCSI_OWNER_HIGHLEVEL 0x100
+#define SCSI_OWNER_MIDLEVEL 0x101
+#define SCSI_OWNER_LOWLEVEL 0x102
+#define SCSI_OWNER_ERROR_HANDLER 0x103
+#define SCSI_OWNER_BH_HANDLER 0x104
+#define SCSI_OWNER_NOBODY 0x105
+
+/*
+ * Magic values for certain scsi structs. Shouldn't ever be used.
+ */
+#define SCSI_CMND_MAGIC 0xE25C23A5
+#define SCSI_REQ_MAGIC 0x75F6D354
+
+/*
+ * Flag bit for the internal_timeout array
+ */
+#define NORMAL_TIMEOUT 0
+
+/*
+ * Scsi Error Handler Flags
+ */
+#define scsi_eh_eflags_chk(scp, flags) \
+ ((scp)->eh_eflags & (flags))
+#define scsi_eh_eflags_set(scp, flags) \
+ do { (scp)->eh_eflags |= (flags); } while(0)
+#define scsi_eh_eflags_clr(scp, flags) \
+ do { (scp)->eh_eflags &= ~(flags); } while(0)
+#define scsi_eh_eflags_clr_all(scp) \
+ (scp->eh_eflags = 0)
+
+#define SCSI_EH_CANCEL_CMD 0x0001 /* Cancel this cmd */
+#define SCSI_EH_REC_TIMEOUT 0x0002 /* EH retry timed out */
+
+#define SCSI_SENSE_VALID(scmd) \
+ (((scmd)->sense_buffer[0] & 0x70) == 0x70)
+
+
+/*
+ * scsi_target: representation of a scsi target, for now, this is only
+ * used for single_lun devices. If no one has active IO to the target,
+ * starget_sdev_user is NULL, else it points to the active sdev.
+ */
+struct scsi_target {
+ struct scsi_device *starget_sdev_user;
+ unsigned int starget_refcnt;
+};
+
+
+/* hosts.c */
+extern void scsi_host_busy_inc(struct Scsi_Host *, Scsi_Device *);
+extern void scsi_host_busy_dec_and_test(struct Scsi_Host *, Scsi_Device *);
+extern struct Scsi_Host *scsi_host_get_next(struct Scsi_Host *);
+extern void scsi_host_init(void);
+
+/* scsi.c */
+extern int scsi_dispatch_cmd(struct scsi_cmnd *cmd);
+extern int scsi_setup_command_freelist(struct Scsi_Host *shost);
+extern void scsi_destroy_command_freelist(struct Scsi_Host *shost);
+extern void scsi_done(struct scsi_cmnd *cmd);
+extern void scsi_finish_command(struct scsi_cmnd *cmd);
+extern int scsi_retry_command(struct scsi_cmnd *cmd);
+extern int scsi_attach_device(struct scsi_device *sdev);
+extern void scsi_detach_device(struct scsi_device *sdev);
+extern void scsi_rescan_device(struct scsi_device *sdev);
+extern int scsi_get_device_flags(unsigned char *vendor, unsigned char *model);
+extern int scsi_insert_special_req(struct scsi_request *sreq, int);
+extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd,
+ struct scsi_request *sreq);
+
+/* scsi_error.c */
+extern void scsi_times_out(struct scsi_cmnd *cmd);
+extern void scsi_error_handler(void *host);
+extern int scsi_decide_disposition(struct scsi_cmnd *cmd);
+extern int scsi_eh_scmd_add(struct scsi_cmnd *, int);
+
+/* scsi_lib.c */
+extern int scsi_maybe_unblock_host(struct scsi_device *sdev);
+extern void scsi_setup_cmd_retry(struct scsi_cmnd *cmd);
+extern int scsi_queue_insert(struct scsi_cmnd *cmd, int reason);
+extern void scsi_queue_next_request(struct request_queue *q,
+ struct scsi_cmnd *cmd);
+extern struct request_queue *scsi_alloc_queue(struct scsi_device *sdev);
+extern void scsi_free_queue(struct request_queue *q);
+extern int scsi_init_queue(void);
+extern void scsi_exit_queue(void);
+
+/* scsi_proc.c */
+#ifdef CONFIG_PROC_FS
+extern void scsi_proc_host_add(struct Scsi_Host *);
+extern void scsi_proc_host_rm(struct Scsi_Host *);
+extern int scsi_init_procfs(void);
+extern void scsi_exit_procfs(void);
+#else
+# define scsi_proc_host_add(shost) do { } while (0)
+# define scsi_proc_host_rm(shost) do { } while (0)
+# define scsi_init_procfs() (0)
+# define scsi_exit_procfs do { } while (0)
+#endif /* CONFIG_PROC_FS */
+
+/* scsi_scan.c */
+extern void scsi_scan_host(struct Scsi_Host *shost);
+extern void scsi_forget_host(struct Scsi_Host *shost);
+
+/* scsi_sysfs.c */
+extern int scsi_device_register(struct scsi_device *);
+extern void scsi_device_unregister(struct scsi_device *);
+extern int scsi_upper_driver_register(struct Scsi_Device_Template *);
+extern void scsi_upper_driver_unregister(struct Scsi_Device_Template *);
+extern int scsi_sysfs_register(void);
+extern void scsi_sysfs_unregister(void);
+
+
+/*
+ * dev_info: for the black/white list in the old scsi_static_device_list
+ */
+struct dev_info {
+ char *vendor;
+ char *model;
+ char *revision; /* revision known to be bad, unused */
+ unsigned flags;
+};
+
+extern struct dev_info scsi_static_device_list[];
+
+/*
+ * scsi_dev_info_list: structure to hold black/white listed devices.
+ */
+struct scsi_dev_info_list {
+ struct list_head dev_info_list;
+ char vendor[8];
+ char model[16];
+ unsigned flags;
+ unsigned compatible; /* for use with scsi_static_device_list entries */
+};
+
+extern struct list_head scsi_dev_info_list;
+extern int scsi_dev_info_list_add_str(char *);
+
+#endif /* _SCSI_PRIV_H */
diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c
index 244c3ab9ae7d..bcb5d9799680 100644
--- a/drivers/scsi/scsi_proc.c
+++ b/drivers/scsi/scsi_proc.c
@@ -29,6 +29,10 @@
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
+
/* 4K page size, but our output routines, use some slack for overruns */
#define PROC_BLOCK_SIZE (3*1024)
@@ -312,91 +316,6 @@ stop_output:
return (len);
}
-#ifdef CONFIG_SCSI_LOGGING
-/*
- * Function: scsi_dump_status
- *
- * Purpose: Brain dump of scsi system, used for problem solving.
- *
- * Arguments: level - used to indicate level of detail.
- *
- * Notes: The level isn't used at all yet, but we need to find some
- * way of sensibly logging varying degrees of information.
- * A quick one-line display of each command, plus the status
- * would be most useful.
- *
- * This does depend upon CONFIG_SCSI_LOGGING - I do want some
- * way of turning it all off if the user wants a lean and mean
- * kernel. It would probably also be useful to allow the user
- * to specify one single host to be dumped. A second argument
- * to the function would be useful for that purpose.
- *
- * FIXME - some formatting of the output into tables would be
- * very handy.
- */
-static void scsi_dump_status(int level)
-{
- int i;
- struct Scsi_Host *shpnt;
- Scsi_Cmnd *SCpnt;
- Scsi_Device *SDpnt;
- printk(KERN_INFO "Dump of scsi host parameters:\n");
- i = 0;
- for (shpnt = scsi_host_get_next(NULL); shpnt;
- shpnt = scsi_host_get_next(shpnt)) {
- printk(KERN_INFO " %d %d : %d %d\n",
- shpnt->host_failed,
- shpnt->host_busy,
- shpnt->host_blocked,
- shpnt->host_self_blocked);
- }
-
- printk(KERN_INFO "\n\n");
- printk(KERN_INFO "Dump of scsi command parameters:\n");
- for (shpnt = scsi_host_get_next(NULL); shpnt;
- shpnt = scsi_host_get_next(shpnt)) {
- printk(KERN_INFO "h:c:t:l (dev sect nsect cnumsec sg) "
- "(ret all flg) (to/cmd to ito) cmd snse result\n");
- list_for_each_entry(SDpnt, &shpnt->my_devices, siblings) {
- unsigned long flags;
-
- spin_lock_irqsave(&SDpnt->list_lock, flags);
- list_for_each_entry(SCpnt, &SDpnt->cmd_list, list) {
- /* (0) h:c:t:l (dev sect nsect cnumsec sg) (ret all flg) (to/cmd to ito) cmd snse result %d %x */
- printk(KERN_INFO "(%3d) %2d:%1d:%2d:%2d (%6s %4llu %4ld %4ld %4x %1d) (%1d %1d 0x%2x) (%4d %4d %4d) 0x%2.2x 0x%2.2x 0x%8.8x\n",
- i++,
-
- SCpnt->device->host->host_no,
- SCpnt->device->channel,
- SCpnt->device->id,
- SCpnt->device->lun,
-
- SCpnt->request->rq_disk ?
- SCpnt->request->rq_disk->disk_name : "?",
- (unsigned long long)SCpnt->request->sector,
- SCpnt->request->nr_sectors,
- (long)SCpnt->request->current_nr_sectors,
- SCpnt->request->rq_status,
- SCpnt->use_sg,
-
- SCpnt->retries,
- SCpnt->allowed,
- SCpnt->flags,
-
- SCpnt->timeout_per_command,
- SCpnt->timeout,
- SCpnt->internal_timeout,
-
- SCpnt->cmnd[0],
- SCpnt->sense_buffer[2],
- SCpnt->result);
- }
- spin_unlock_irqrestore(&SDpnt->list_lock, flags);
- }
- }
-}
-#endif /* CONFIG_SCSI_LOGGING */
-
static int scsi_add_single_device(uint host, uint channel, uint id, uint lun)
{
struct Scsi_Host *shost;
@@ -471,22 +390,6 @@ static int proc_scsi_gen_write(struct file * file, const char * buf,
#ifdef CONFIG_SCSI_LOGGING
/*
- * Usage: echo "scsi dump #N" > /proc/scsi/scsi
- * to dump status of all scsi commands. The number is used to
- * specify the level of detail in the dump.
- */
- if (!strncmp("dump", buffer + 5, 4)) {
- unsigned int level;
-
- p = buffer + 10;
-
- if (*p == '\0')
- goto out;
-
- level = simple_strtoul(p, NULL, 0);
- scsi_dump_status(level);
- }
- /*
* Usage: echo "scsi log token #N" > /proc/scsi/scsi
* where token is one of [error,scan,mlqueue,mlcomplete,llqueue,
* llcomplete,hlqueue,hlcomplete]
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 60ff7bce3ded..0fb882f8f889 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -33,9 +33,9 @@
#include "scsi.h"
#include "hosts.h"
-#ifdef CONFIG_KMOD
-#include <linux/kmod.h>
-#endif
+#include "scsi_priv.h"
+#include "scsi_logging.h"
+
/*
* Flags for SCSI devices that need special treatment
@@ -429,7 +429,6 @@ static struct scsi_device *scsi_alloc_sdev(struct Scsi_Host *shost,
sdev->request_queue->queuedata = sdev;
scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
- init_waitqueue_head(&sdev->scpnt_wait);
if (shost->hostt->slave_alloc) {
if (shost->hostt->slave_alloc(sdev))
diff --git a/drivers/scsi/scsi_syms.c b/drivers/scsi/scsi_syms.c
index bdb1d9dfaf2d..062c99ee35ca 100644
--- a/drivers/scsi/scsi_syms.c
+++ b/drivers/scsi/scsi_syms.c
@@ -21,6 +21,7 @@
#include "scsi.h"
#include <scsi/scsi_ioctl.h>
#include "hosts.h"
+#include "scsi_logging.h"
#include <scsi/scsicam.h>
@@ -104,8 +105,6 @@ EXPORT_SYMBOL(scsi_calculate_bounce_limit);
/*
* Externalize timers so that HBAs can safely start/restart commands.
*/
-extern void scsi_add_timer(Scsi_Cmnd *, int, void ((*) (Scsi_Cmnd *)));
-extern int scsi_delete_timer(Scsi_Cmnd *);
EXPORT_SYMBOL(scsi_add_timer);
EXPORT_SYMBOL(scsi_delete_timer);
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 2fba46a79108..3b7ff60a2738 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -14,6 +14,7 @@
#include "scsi.h"
#include "hosts.h"
+#include "scsi_priv.h"
/*
* shost_show_function: macro to create an attr function that can be used to
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index fc4bd9338080..47a51fd4ef06 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -52,6 +52,9 @@
#include <scsi/scsi_ioctl.h>
#include <scsi/scsicam.h>
+#include "scsi_logging.h"
+
+
/*
* Remaining dev_t-handling stuff
*/
@@ -1502,7 +1505,8 @@ static int sd_synchronize_cache(struct scsi_disk *sdkp, int verbose)
printk("FAILED\n No memory for request\n");
return 0;
}
-
+
+ SRpnt->sr_data_direction = SCSI_DATA_NONE;
for(retries = 3; retries > 0; --retries) {
unsigned char cmd[10] = { 0 };
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 5cc11cb29c03..168193e0ae89 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -67,6 +67,8 @@ static int sg_version_num = 30528; /* 2 digits for each component */
#include <scsi/scsi_ioctl.h>
#include <scsi/sg.h>
+#include "scsi_logging.h"
+
#ifdef CONFIG_PROC_FS
#include <linux/proc_fs.h>
static int sg_proc_init(void);
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index ffb4478bef1e..3e087d7b321e 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -50,6 +50,7 @@
#include "hosts.h"
#include <scsi/scsi_ioctl.h> /* For the door lock/unlock commands */
+#include "scsi_logging.h"
#include "sr.h"
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c
index 2509a8a0c493..4348b77f478e 100644
--- a/drivers/scsi/sym53c8xx_2/sym_glue.c
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.c
@@ -2558,35 +2558,17 @@ sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, sym_device *device)
bcopy(chip, &device->chip, sizeof(device->chip));
device->chip.revision_id = revision;
+ if (pci_enable_device(pdev))
+ return -1;
+
+ pci_set_master(pdev);
+
/*
* Read additionnal info from the configuration space.
*/
- pci_read_config_word(pdev, PCI_COMMAND, &command);
pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &cache_line_size);
/*
- * Enable missing capabilities in the PCI COMMAND register.
- */
-#ifdef SYM_CONF_IOMAPPED
-#define PCI_COMMAND_BITS_TO_ENABLE (PCI_COMMAND_IO | \
- PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)
-#else
-#define PCI_COMMAND_BITS_TO_ENABLE \
- (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER | PCI_COMMAND_PARITY)
-#endif
- if ((command & PCI_COMMAND_BITS_TO_ENABLE)
- != PCI_COMMAND_BITS_TO_ENABLE) {
- printf_info("%s: setting%s%s%s%s...\n", sym_name(device),
- (command & PCI_COMMAND_IO) ? "" : " PCI_COMMAND_IO",
- (command & PCI_COMMAND_MEMORY) ? "" : " PCI_COMMAND_MEMORY",
- (command & PCI_COMMAND_MASTER) ? "" : " PCI_COMMAND_MASTER",
- (command & PCI_COMMAND_PARITY) ? "" : " PCI_COMMAND_PARITY");
- command |= PCI_COMMAND_BITS_TO_ENABLE;
- pci_write_config_word(pdev, PCI_COMMAND, command);
- }
-#undef PCI_COMMAND_BITS_TO_ENABLE
-
- /*
* If cache line size is not configured, suggest
* a value for well known CPUs.
*/
@@ -2625,6 +2607,7 @@ sym53c8xx_pci_init(Scsi_Host_Template *tpnt, pcidev_t pdev, sym_device *device)
sym_name(device), cache_line_size);
}
+ pci_read_config_word(pdev, PCI_COMMAND, &command);
if ((pci_fix_up & 2) && cache_line_size &&
(chip->features & FE_WRIE) && !(command & PCI_COMMAND_INVALIDATE)) {
printf_info("%s: setting PCI_COMMAND_INVALIDATE.\n",