mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
merge by hand (fix up qla_os.c merge error)
This commit is contained in:
commit
3237ee78fc
188 changed files with 13496 additions and 19274 deletions
|
|
@ -1695,8 +1695,6 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
|
|||
|
||||
tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
|
||||
|
||||
spin_unlock_irq(tw_dev->host->host_lock);
|
||||
|
||||
tw_dev->num_resets++;
|
||||
|
||||
printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]);
|
||||
|
|
@ -1709,7 +1707,6 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt)
|
|||
|
||||
retval = SUCCESS;
|
||||
out:
|
||||
spin_lock_irq(tw_dev->host->host_lock);
|
||||
return retval;
|
||||
} /* End twa_scsi_eh_reset() */
|
||||
|
||||
|
|
|
|||
|
|
@ -1430,8 +1430,6 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt)
|
|||
|
||||
tw_dev = (TW_Device_Extension *)SCpnt->device->host->hostdata;
|
||||
|
||||
spin_unlock_irq(tw_dev->host->host_lock);
|
||||
|
||||
tw_dev->num_resets++;
|
||||
|
||||
printk(KERN_WARNING "3w-xxxx: scsi%d: WARNING: Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, SCpnt->device->id, SCpnt->cmnd[0]);
|
||||
|
|
@ -1444,7 +1442,6 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt)
|
|||
|
||||
retval = SUCCESS;
|
||||
out:
|
||||
spin_lock_irq(tw_dev->host->host_lock);
|
||||
return retval;
|
||||
} /* End tw_scsi_eh_reset() */
|
||||
|
||||
|
|
|
|||
|
|
@ -170,7 +170,6 @@ MODULE_LICENSE("GPL");
|
|||
STATIC int NCR_700_queuecommand(struct scsi_cmnd *, void (*done)(struct scsi_cmnd *));
|
||||
STATIC int NCR_700_abort(struct scsi_cmnd * SCpnt);
|
||||
STATIC int NCR_700_bus_reset(struct scsi_cmnd * SCpnt);
|
||||
STATIC int NCR_700_dev_reset(struct scsi_cmnd * SCpnt);
|
||||
STATIC int NCR_700_host_reset(struct scsi_cmnd * SCpnt);
|
||||
STATIC void NCR_700_chip_setup(struct Scsi_Host *host);
|
||||
STATIC void NCR_700_chip_reset(struct Scsi_Host *host);
|
||||
|
|
@ -330,7 +329,6 @@ NCR_700_detect(struct scsi_host_template *tpnt,
|
|||
/* Fill in the missing routines from the host template */
|
||||
tpnt->queuecommand = NCR_700_queuecommand;
|
||||
tpnt->eh_abort_handler = NCR_700_abort;
|
||||
tpnt->eh_device_reset_handler = NCR_700_dev_reset;
|
||||
tpnt->eh_bus_reset_handler = NCR_700_bus_reset;
|
||||
tpnt->eh_host_reset_handler = NCR_700_host_reset;
|
||||
tpnt->can_queue = NCR_700_COMMAND_SLOTS_PER_HOST;
|
||||
|
|
@ -1959,34 +1957,31 @@ NCR_700_bus_reset(struct scsi_cmnd * SCp)
|
|||
printk(KERN_INFO "scsi%d (%d:%d) New error handler wants BUS reset, cmd %p\n\t",
|
||||
SCp->device->host->host_no, SCp->device->id, SCp->device->lun, SCp);
|
||||
scsi_print_command(SCp);
|
||||
|
||||
/* In theory, eh_complete should always be null because the
|
||||
* eh is single threaded, but just in case we're handling a
|
||||
* reset via sg or something */
|
||||
while(hostdata->eh_complete != NULL) {
|
||||
spin_lock_irq(SCp->device->host->host_lock);
|
||||
while (hostdata->eh_complete != NULL) {
|
||||
spin_unlock_irq(SCp->device->host->host_lock);
|
||||
msleep_interruptible(100);
|
||||
spin_lock_irq(SCp->device->host->host_lock);
|
||||
}
|
||||
|
||||
hostdata->eh_complete = &complete;
|
||||
NCR_700_internal_bus_reset(SCp->device->host);
|
||||
|
||||
spin_unlock_irq(SCp->device->host->host_lock);
|
||||
wait_for_completion(&complete);
|
||||
spin_lock_irq(SCp->device->host->host_lock);
|
||||
|
||||
hostdata->eh_complete = NULL;
|
||||
/* Revalidate the transport parameters of the failing device */
|
||||
if(hostdata->fast)
|
||||
spi_schedule_dv_device(SCp->device);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
NCR_700_dev_reset(struct scsi_cmnd * SCp)
|
||||
{
|
||||
printk(KERN_INFO "scsi%d (%d:%d) New error handler wants device reset\n\t",
|
||||
SCp->device->host->host_no, SCp->device->id, SCp->device->lun);
|
||||
scsi_print_command(SCp);
|
||||
|
||||
return FAILED;
|
||||
spin_unlock_irq(SCp->device->host->host_lock);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
STATIC int
|
||||
|
|
@ -1996,8 +1991,13 @@ NCR_700_host_reset(struct scsi_cmnd * SCp)
|
|||
SCp->device->host->host_no, SCp->device->id, SCp->device->lun);
|
||||
scsi_print_command(SCp);
|
||||
|
||||
spin_lock_irq(SCp->device->host->host_lock);
|
||||
|
||||
NCR_700_internal_bus_reset(SCp->device->host);
|
||||
NCR_700_chip_reset(SCp->device->host);
|
||||
|
||||
spin_unlock_irq(SCp->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2746,9 +2746,15 @@ static int BusLogic_host_reset(struct scsi_cmnd * SCpnt)
|
|||
|
||||
unsigned int id = SCpnt->device->id;
|
||||
struct BusLogic_TargetStatistics *stats = &HostAdapter->TargetStatistics[id];
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
BusLogic_IncrementErrorCounter(&stats->HostAdapterResetsRequested);
|
||||
|
||||
return BusLogic_ResetHostAdapter(HostAdapter, false);
|
||||
rc = BusLogic_ResetHostAdapter(HostAdapter, false);
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -137,6 +137,24 @@ config CHR_DEV_SG
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config CHR_DEV_SCH
|
||||
tristate "SCSI media changer support"
|
||||
depends on SCSI
|
||||
---help---
|
||||
This is a driver for SCSI media changers. Most common devices are
|
||||
tape libraries and MOD/CDROM jukeboxes. *Real* jukeboxes, you
|
||||
don't need this for those tiny 6-slot cdrom changers. Media
|
||||
changers are listed as "Type: Medium Changer" in /proc/scsi/scsi.
|
||||
If you have such hardware and want to use it with linux, say Y
|
||||
here. Check <file:Documentation/scsi-changer.txt> for details.
|
||||
|
||||
If you want to compile this as a module ( = code which can be
|
||||
inserted in and removed from the running kernel whenever you want),
|
||||
say M here and read <file:Documentation/modules.txt> and
|
||||
<file:Documentation/scsi.txt>. The module will be called ch.o.
|
||||
If unsure, say N.
|
||||
|
||||
|
||||
comment "Some SCSI devices (e.g. CD jukebox) support multiple LUNs"
|
||||
depends on SCSI
|
||||
|
||||
|
|
@ -1192,28 +1210,6 @@ config SCSI_PAS16
|
|||
To compile this driver as a module, choose M here: the
|
||||
module will be called pas16.
|
||||
|
||||
config SCSI_PCI2000
|
||||
tristate "PCI2000 support"
|
||||
depends on PCI && SCSI && BROKEN
|
||||
help
|
||||
This is support for the PCI2000I EIDE interface card which acts as a
|
||||
SCSI host adapter. Please read the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pci2000.
|
||||
|
||||
config SCSI_PCI2220I
|
||||
tristate "PCI2220i support"
|
||||
depends on PCI && SCSI && BROKEN
|
||||
help
|
||||
This is support for the PCI2220i EIDE interface card which acts as a
|
||||
SCSI host adapter. Please read the SCSI-HOWTO, available from
|
||||
<http://www.tldp.org/docs.html#howto>.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called pci2220i.
|
||||
|
||||
config SCSI_PSI240I
|
||||
tristate "PSI240i support"
|
||||
depends on ISA && SCSI
|
||||
|
|
|
|||
|
|
@ -50,8 +50,6 @@ obj-$(CONFIG_MVME16x_SCSI) += mvme16x.o 53c7xx.o
|
|||
obj-$(CONFIG_BVME6000_SCSI) += bvme6000.o 53c7xx.o
|
||||
obj-$(CONFIG_SCSI_SIM710) += 53c700.o sim710.o
|
||||
obj-$(CONFIG_SCSI_ADVANSYS) += advansys.o
|
||||
obj-$(CONFIG_SCSI_PCI2000) += pci2000.o
|
||||
obj-$(CONFIG_SCSI_PCI2220I) += pci2220i.o
|
||||
obj-$(CONFIG_SCSI_PSI240I) += psi240i.o
|
||||
obj-$(CONFIG_SCSI_BUSLOGIC) += BusLogic.o
|
||||
obj-$(CONFIG_SCSI_DPT_I2O) += dpt_i2o.o
|
||||
|
|
@ -142,6 +140,7 @@ obj-$(CONFIG_CHR_DEV_OSST) += osst.o
|
|||
obj-$(CONFIG_BLK_DEV_SD) += sd_mod.o
|
||||
obj-$(CONFIG_BLK_DEV_SR) += sr_mod.o
|
||||
obj-$(CONFIG_CHR_DEV_SG) += sg.o
|
||||
obj-$(CONFIG_CHR_DEV_SCH) += ch.o
|
||||
|
||||
scsi_mod-y += scsi.o hosts.o scsi_ioctl.o constants.o \
|
||||
scsicam.o scsi_error.o scsi_lib.o \
|
||||
|
|
|
|||
|
|
@ -2825,39 +2825,17 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
|
|||
* Locks: host lock taken by caller
|
||||
*/
|
||||
|
||||
static int NCR5380_bus_reset(Scsi_Cmnd * cmd) {
|
||||
NCR5380_local_declare();
|
||||
NCR5380_setup(cmd->device->host);
|
||||
static int NCR5380_bus_reset(Scsi_Cmnd * cmd)
|
||||
{
|
||||
struct Scsi_Host *instance = cmd->device->host;
|
||||
|
||||
NCR5380_local_declare();
|
||||
NCR5380_setup(instance);
|
||||
NCR5380_print_status(instance);
|
||||
|
||||
spin_lock_irq(instance->host_lock);
|
||||
do_reset(instance);
|
||||
spin_unlock_irq(instance->host_lock);
|
||||
|
||||
NCR5380_print_status(cmd->device->host);
|
||||
do_reset(cmd->device->host);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_device_reset (Scsi_Cmnd *cmd)
|
||||
*
|
||||
* Purpose : reset a SCSI device
|
||||
*
|
||||
* Returns : FAILED
|
||||
*
|
||||
* Locks: io_request_lock held by caller
|
||||
*/
|
||||
|
||||
static int NCR5380_device_reset(Scsi_Cmnd * cmd) {
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function : int NCR5380_host_reset (Scsi_Cmnd *cmd)
|
||||
*
|
||||
* Purpose : reset a SCSI device
|
||||
*
|
||||
* Returns : FAILED
|
||||
*
|
||||
* Locks: io_request_lock held by caller
|
||||
*/
|
||||
|
||||
static int NCR5380_host_reset(Scsi_Cmnd * cmd) {
|
||||
return FAILED;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,8 +306,6 @@ static void NCR5380_print(struct Scsi_Host *instance);
|
|||
#endif
|
||||
static int NCR5380_abort(Scsi_Cmnd * cmd);
|
||||
static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
|
||||
static int NCR5380_host_reset(Scsi_Cmnd * cmd);
|
||||
static int NCR5380_device_reset(Scsi_Cmnd * cmd);
|
||||
static int NCR5380_queue_command(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *));
|
||||
static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
|
||||
off_t offset, int length, int inout);
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ enum {
|
|||
};
|
||||
|
||||
/* The master ring of all esp hosts we are managing in this driver. */
|
||||
struct NCR_ESP *espchain;
|
||||
static struct NCR_ESP *espchain;
|
||||
int nesps = 0, esps_in_use = 0, esps_running = 0;
|
||||
|
||||
irqreturn_t esp_intr(int irq, void *dev_id, struct pt_regs *pregs);
|
||||
|
|
@ -1467,14 +1467,12 @@ int esp_reset(Scsi_Cmnd *SCptr)
|
|||
{
|
||||
struct NCR_ESP *esp = (struct NCR_ESP *) SCptr->device->host->hostdata;
|
||||
|
||||
spin_lock_irq(esp->ehost->host_lock);
|
||||
(void) esp_do_resetbus(esp, esp->eregs);
|
||||
|
||||
spin_unlock_irq(esp->ehost->host_lock);
|
||||
|
||||
wait_event(esp->reset_queue, (esp->resetting_bus == 0));
|
||||
|
||||
spin_lock_irq(esp->ehost->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -722,15 +722,12 @@ static int NCR53c406a_queue(Scsi_Cmnd * SCpnt, void (*done) (Scsi_Cmnd *))
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int NCR53c406a_abort(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
DEB(printk("NCR53c406a_abort called\n"));
|
||||
return FAILED; /* Don't know how to abort */
|
||||
}
|
||||
|
||||
static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
DEB(printk("NCR53c406a_reset called\n"));
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
outb(C4_IMG, CONFIG4); /* Select reg set 0 */
|
||||
outb(CHIP_RESET, CMD_REG);
|
||||
outb(SCSI_NOP, CMD_REG); /* required after reset */
|
||||
|
|
@ -738,19 +735,12 @@ static int NCR53c406a_host_reset(Scsi_Cmnd * SCpnt)
|
|||
chip_init();
|
||||
|
||||
rtrc(2);
|
||||
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int NCR53c406a_device_reset(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int NCR53c406a_bus_reset(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int NCR53c406a_biosparm(struct scsi_device *disk,
|
||||
struct block_device *dev,
|
||||
sector_t capacity, int *info_array)
|
||||
|
|
@ -1075,9 +1065,6 @@ static Scsi_Host_Template driver_template =
|
|||
.release = NCR53c406a_release,
|
||||
.info = NCR53c406a_info /* info */,
|
||||
.queuecommand = NCR53c406a_queue /* queuecommand */,
|
||||
.eh_abort_handler = NCR53c406a_abort /* abort */,
|
||||
.eh_bus_reset_handler = NCR53c406a_bus_reset /* reset */,
|
||||
.eh_device_reset_handler = NCR53c406a_device_reset /* reset */,
|
||||
.eh_host_reset_handler = NCR53c406a_host_reset /* reset */,
|
||||
.bios_param = NCR53c406a_biosparm /* biosparm */,
|
||||
.can_queue = 1 /* can_queue */,
|
||||
|
|
|
|||
|
|
@ -221,7 +221,14 @@ int __init a2091_detect(Scsi_Host_Template *tpnt)
|
|||
static int a2091_bus_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
/* FIXME perform bus-specific reset */
|
||||
|
||||
/* FIXME 2: kill this function, and let midlayer fall back
|
||||
to the same action, calling wd33c93_host_reset() */
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
wd33c93_host_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -208,7 +208,14 @@ fail_register:
|
|||
static int a3000_bus_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
/* FIXME perform bus-specific reset */
|
||||
|
||||
/* FIXME 2: kill this entire function, which should
|
||||
cause mid-layer to call wd33c93_host_reset anyway? */
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
wd33c93_host_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,10 +53,6 @@
|
|||
#define INQD_PDT_DMASK 0x1F /* Peripheral Device Type Mask */
|
||||
#define INQD_PDT_QMASK 0xE0 /* Peripheral Device Qualifer Mask */
|
||||
|
||||
#define MAX_FIB_DATA (sizeof(struct hw_fib) - sizeof(FIB_HEADER))
|
||||
|
||||
#define MAX_DRIVER_SG_SEGMENT_COUNT 17
|
||||
|
||||
/*
|
||||
* Sense codes
|
||||
*/
|
||||
|
|
@ -158,6 +154,13 @@ MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0
|
|||
module_param(commit, int, 0);
|
||||
MODULE_PARM_DESC(commit, "Control whether a COMMIT_CONFIG is issued to the adapter for foreign arrays.\nThis is typically needed in systems that do not have a BIOS. 0=off, 1=on");
|
||||
|
||||
int numacb = -1;
|
||||
module_param(numacb, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid\nvalues are 512 and down. Default is to use suggestion from Firmware.");
|
||||
|
||||
int acbsize = -1;
|
||||
module_param(acbsize, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512,\n2048, 4096 and 8192. Default is to use suggestion from Firmware.");
|
||||
/**
|
||||
* aac_get_config_status - check the adapter configuration
|
||||
* @common: adapter to query
|
||||
|
|
@ -462,7 +465,7 @@ static int probe_container(struct aac_dev *dev, int cid)
|
|||
1, 1,
|
||||
NULL, NULL);
|
||||
if (status < 0) {
|
||||
printk(KERN_WARNING "aacraid: probe_containers query failed.\n");
|
||||
printk(KERN_WARNING "aacraid: probe_container query failed.\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
|
|
@ -562,10 +565,10 @@ static void setinqstr(int devtype, void *data, int tindex)
|
|||
inqstrcpy ("V1.0", str->prl);
|
||||
}
|
||||
|
||||
void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
|
||||
u8 a_sense_code, u8 incorrect_length,
|
||||
u8 bit_pointer, u16 field_pointer,
|
||||
u32 residue)
|
||||
static void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
|
||||
u8 a_sense_code, u8 incorrect_length,
|
||||
u8 bit_pointer, u16 field_pointer,
|
||||
u32 residue)
|
||||
{
|
||||
sense_buf[0] = 0xF0; /* Sense data valid, err code 70h (current error) */
|
||||
sense_buf[1] = 0; /* Segment number, always zero */
|
||||
|
|
@ -605,35 +608,63 @@ void set_sense(u8 *sense_buf, u8 sense_key, u8 sense_code,
|
|||
int aac_get_adapter_info(struct aac_dev* dev)
|
||||
{
|
||||
struct fib* fibptr;
|
||||
struct aac_adapter_info* info;
|
||||
int rcode;
|
||||
u32 tmp;
|
||||
struct aac_adapter_info * info;
|
||||
|
||||
if (!(fibptr = fib_alloc(dev)))
|
||||
return -ENOMEM;
|
||||
|
||||
fib_init(fibptr);
|
||||
info = (struct aac_adapter_info*) fib_data(fibptr);
|
||||
|
||||
memset(info,0,sizeof(struct aac_adapter_info));
|
||||
info = (struct aac_adapter_info *) fib_data(fibptr);
|
||||
memset(info,0,sizeof(*info));
|
||||
|
||||
rcode = fib_send(RequestAdapterInfo,
|
||||
fibptr,
|
||||
sizeof(struct aac_adapter_info),
|
||||
FsaNormal,
|
||||
1, 1,
|
||||
NULL,
|
||||
NULL);
|
||||
fibptr,
|
||||
sizeof(*info),
|
||||
FsaNormal,
|
||||
1, 1,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
memcpy(&dev->adapter_info, info, sizeof(struct aac_adapter_info));
|
||||
if (rcode < 0) {
|
||||
fib_complete(fibptr);
|
||||
fib_free(fibptr);
|
||||
return rcode;
|
||||
}
|
||||
memcpy(&dev->adapter_info, info, sizeof(*info));
|
||||
|
||||
if (dev->adapter_info.options & AAC_OPT_SUPPLEMENT_ADAPTER_INFO) {
|
||||
struct aac_supplement_adapter_info * info;
|
||||
|
||||
fib_init(fibptr);
|
||||
|
||||
info = (struct aac_supplement_adapter_info *) fib_data(fibptr);
|
||||
|
||||
memset(info,0,sizeof(*info));
|
||||
|
||||
rcode = fib_send(RequestSupplementAdapterInfo,
|
||||
fibptr,
|
||||
sizeof(*info),
|
||||
FsaNormal,
|
||||
1, 1,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
if (rcode >= 0)
|
||||
memcpy(&dev->supplement_adapter_info, info, sizeof(*info));
|
||||
}
|
||||
|
||||
tmp = le32_to_cpu(dev->adapter_info.kernelrev);
|
||||
printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d]\n",
|
||||
printk(KERN_INFO "%s%d: kernel %d.%d-%d[%d] %.*s\n",
|
||||
dev->name,
|
||||
dev->id,
|
||||
tmp>>24,
|
||||
(tmp>>16)&0xff,
|
||||
tmp&0xff,
|
||||
le32_to_cpu(dev->adapter_info.kernelbuild));
|
||||
le32_to_cpu(dev->adapter_info.kernelbuild),
|
||||
(int)sizeof(dev->supplement_adapter_info.BuildDate),
|
||||
dev->supplement_adapter_info.BuildDate);
|
||||
tmp = le32_to_cpu(dev->adapter_info.monitorrev);
|
||||
printk(KERN_INFO "%s%d: monitor %d.%d-%d[%d]\n",
|
||||
dev->name, dev->id,
|
||||
|
|
@ -707,6 +738,38 @@ int aac_get_adapter_info(struct aac_dev* dev)
|
|||
rcode = -ENOMEM;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* 57 scatter gather elements
|
||||
*/
|
||||
dev->scsi_host_ptr->sg_tablesize = (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr) -
|
||||
sizeof(struct aac_write) + sizeof(struct sgmap)) /
|
||||
sizeof(struct sgmap);
|
||||
if (dev->dac_support) {
|
||||
/*
|
||||
* 38 scatter gather elements
|
||||
*/
|
||||
dev->scsi_host_ptr->sg_tablesize =
|
||||
(dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr) -
|
||||
sizeof(struct aac_write64) +
|
||||
sizeof(struct sgmap64)) /
|
||||
sizeof(struct sgmap64);
|
||||
}
|
||||
dev->scsi_host_ptr->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
|
||||
if(!(dev->adapter_info.options & AAC_OPT_NEW_COMM)) {
|
||||
/*
|
||||
* Worst case size that could cause sg overflow when
|
||||
* we break up SG elements that are larger than 64KB.
|
||||
* Would be nice if we could tell the SCSI layer what
|
||||
* the maximum SG element size can be. Worst case is
|
||||
* (sg_tablesize-1) 4KB elements with one 64KB
|
||||
* element.
|
||||
* 32bit -> 468 or 238KB 64bit -> 424 or 212KB
|
||||
*/
|
||||
dev->scsi_host_ptr->max_sectors =
|
||||
(dev->scsi_host_ptr->sg_tablesize * 8) + 112;
|
||||
}
|
||||
|
||||
fib_complete(fibptr);
|
||||
fib_free(fibptr);
|
||||
|
|
@ -747,8 +810,10 @@ static void read_callback(void *context, struct fib * fibptr)
|
|||
if (le32_to_cpu(readreply->status) == ST_OK)
|
||||
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
|
||||
else {
|
||||
printk(KERN_WARNING "read_callback: read failed, status = %d\n",
|
||||
le32_to_cpu(readreply->status));
|
||||
#ifdef AAC_DETAILED_STATUS_INFO
|
||||
printk(KERN_WARNING "read_callback: io failed, status = %d\n",
|
||||
le32_to_cpu(readreply->status));
|
||||
#endif
|
||||
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
||||
HARDWARE_ERROR,
|
||||
|
|
@ -813,7 +878,7 @@ static void write_callback(void *context, struct fib * fibptr)
|
|||
aac_io_done(scsicmd);
|
||||
}
|
||||
|
||||
int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
||||
static int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
||||
{
|
||||
u32 lba;
|
||||
u32 count;
|
||||
|
|
@ -842,7 +907,8 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
|||
lba = (scsicmd->cmnd[2] << 24) | (scsicmd->cmnd[3] << 16) | (scsicmd->cmnd[4] << 8) | scsicmd->cmnd[5];
|
||||
count = (scsicmd->cmnd[7] << 8) | scsicmd->cmnd[8];
|
||||
}
|
||||
dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %u, t = %ld.\n", smp_processor_id(), lba, jiffies));
|
||||
dprintk((KERN_DEBUG "aac_read[cpu %d]: lba = %u, t = %ld.\n",
|
||||
smp_processor_id(), (unsigned long long)lba, jiffies));
|
||||
/*
|
||||
* Alocate and initialize a Fib
|
||||
*/
|
||||
|
|
@ -852,7 +918,7 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
|||
|
||||
fib_init(cmd_fibcontext);
|
||||
|
||||
if(dev->dac_support == 1) {
|
||||
if (dev->dac_support == 1) {
|
||||
struct aac_read64 *readcmd;
|
||||
readcmd = (struct aac_read64 *) fib_data(cmd_fibcontext);
|
||||
readcmd->command = cpu_to_le32(VM_CtHostRead64);
|
||||
|
|
@ -886,14 +952,11 @@ int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
|||
readcmd->block = cpu_to_le32(lba);
|
||||
readcmd->count = cpu_to_le32(count * 512);
|
||||
|
||||
if (count * 512 > (64 * 1024))
|
||||
BUG();
|
||||
|
||||
aac_build_sg(scsicmd, &readcmd->sg);
|
||||
fibsize = sizeof(struct aac_read) +
|
||||
((le32_to_cpu(readcmd->sg.count) - 1) *
|
||||
sizeof (struct sgentry));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
/*
|
||||
* Now send the Fib to the adapter
|
||||
|
|
@ -976,7 +1039,7 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
|
|||
fibsize = sizeof(struct aac_write64) +
|
||||
((le32_to_cpu(writecmd->sg.count) - 1) *
|
||||
sizeof (struct sgentry64));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
/*
|
||||
* Now send the Fib to the adapter
|
||||
|
|
@ -998,15 +1061,11 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
|
|||
writecmd->sg.count = cpu_to_le32(1);
|
||||
/* ->stable is not used - it did mean which type of write */
|
||||
|
||||
if (count * 512 > (64 * 1024)) {
|
||||
BUG();
|
||||
}
|
||||
|
||||
aac_build_sg(scsicmd, &writecmd->sg);
|
||||
fibsize = sizeof(struct aac_write) +
|
||||
((le32_to_cpu(writecmd->sg.count) - 1) *
|
||||
sizeof (struct sgentry));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
/*
|
||||
* Now send the Fib to the adapter
|
||||
|
|
@ -1025,7 +1084,6 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
|
|||
*/
|
||||
if (status == -EINPROGRESS)
|
||||
{
|
||||
dprintk("write queued.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1111,7 +1169,7 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
|
|||
return SCSI_MLQUEUE_DEVICE_BUSY;
|
||||
|
||||
/*
|
||||
* Alocate and initialize a Fib
|
||||
* Allocate and initialize a Fib
|
||||
*/
|
||||
if (!(cmd_fibcontext =
|
||||
fib_alloc((struct aac_dev *)scsicmd->device->host->hostdata)))
|
||||
|
|
@ -1403,7 +1461,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
|||
/*
|
||||
* Unhandled commands
|
||||
*/
|
||||
printk(KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]);
|
||||
dprintk((KERN_WARNING "Unhandled SCSI Command: 0x%x.\n", scsicmd->cmnd[0]));
|
||||
scsicmd->result = DID_OK << 16 | COMMAND_COMPLETE << 8 | SAM_STAT_CHECK_CONDITION;
|
||||
set_sense((u8 *) &dev->fsa_dev[cid].sense_data,
|
||||
ILLEGAL_REQUEST, SENCODE_INVALID_COMMAND,
|
||||
|
|
@ -1818,7 +1876,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
|||
fibsize = sizeof (struct aac_srb) - sizeof (struct sgentry) +
|
||||
((le32_to_cpu(srbcmd->sg.count) & 0xff) *
|
||||
sizeof (struct sgentry64));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
|
||||
/*
|
||||
|
|
@ -1840,7 +1898,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
|||
fibsize = sizeof (struct aac_srb) +
|
||||
(((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
|
||||
sizeof (struct sgentry));
|
||||
BUG_ON (fibsize > (sizeof(struct hw_fib) -
|
||||
BUG_ON (fibsize > (dev->max_fib_size -
|
||||
sizeof(struct aac_fibhdr)));
|
||||
|
||||
/*
|
||||
|
|
@ -1893,7 +1951,9 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
|
|||
}
|
||||
/* hba wants the size to be exact */
|
||||
if(byte_count > scsicmd->request_bufflen){
|
||||
psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
|
||||
u32 temp = le32_to_cpu(psg->sg[i-1].count) -
|
||||
(byte_count - scsicmd->request_bufflen);
|
||||
psg->sg[i-1].count = cpu_to_le32(temp);
|
||||
byte_count = scsicmd->request_bufflen;
|
||||
}
|
||||
/* Check for command underflow */
|
||||
|
|
@ -1922,7 +1982,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
|
|||
{
|
||||
struct aac_dev *dev;
|
||||
unsigned long byte_count = 0;
|
||||
u64 le_addr;
|
||||
u64 addr;
|
||||
|
||||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
// Get rid of old data
|
||||
|
|
@ -1943,16 +2003,18 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
|
|||
byte_count = 0;
|
||||
|
||||
for (i = 0; i < sg_count; i++) {
|
||||
le_addr = cpu_to_le64(sg_dma_address(sg));
|
||||
psg->sg[i].addr[1] = (u32)(le_addr>>32);
|
||||
psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
|
||||
addr = sg_dma_address(sg);
|
||||
psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
|
||||
psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
|
||||
byte_count += sg_dma_len(sg);
|
||||
sg++;
|
||||
}
|
||||
/* hba wants the size to be exact */
|
||||
if(byte_count > scsicmd->request_bufflen){
|
||||
psg->sg[i-1].count -= (byte_count - scsicmd->request_bufflen);
|
||||
u32 temp = le32_to_cpu(psg->sg[i-1].count) -
|
||||
(byte_count - scsicmd->request_bufflen);
|
||||
psg->sg[i-1].count = cpu_to_le32(temp);
|
||||
byte_count = scsicmd->request_bufflen;
|
||||
}
|
||||
/* Check for command underflow */
|
||||
|
|
@ -1962,15 +2024,14 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
|
|||
}
|
||||
}
|
||||
else if(scsicmd->request_bufflen) {
|
||||
dma_addr_t addr;
|
||||
u64 addr;
|
||||
addr = pci_map_single(dev->pdev,
|
||||
scsicmd->request_buffer,
|
||||
scsicmd->request_bufflen,
|
||||
scsicmd->sc_data_direction);
|
||||
psg->count = cpu_to_le32(1);
|
||||
le_addr = cpu_to_le64(addr);
|
||||
psg->sg[0].addr[1] = (u32)(le_addr>>32);
|
||||
psg->sg[0].addr[0] = (u32)(le_addr & 0xffffffff);
|
||||
psg->sg[0].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[0].addr[1] = cpu_to_le32(addr >> 32);
|
||||
psg->sg[0].count = cpu_to_le32(scsicmd->request_bufflen);
|
||||
scsicmd->SCp.dma_handle = addr;
|
||||
byte_count = scsicmd->request_bufflen;
|
||||
|
|
|
|||
|
|
@ -8,12 +8,18 @@
|
|||
|
||||
#define MAXIMUM_NUM_CONTAINERS 32
|
||||
|
||||
#define AAC_NUM_FIB (256 + 64)
|
||||
#define AAC_NUM_IO_FIB 100
|
||||
#define AAC_NUM_MGT_FIB 8
|
||||
#define AAC_NUM_IO_FIB (512 - AAC_NUM_MGT_FIB)
|
||||
#define AAC_NUM_FIB (AAC_NUM_IO_FIB + AAC_NUM_MGT_FIB)
|
||||
|
||||
#define AAC_MAX_LUN (8)
|
||||
|
||||
#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
|
||||
/*
|
||||
* max_sectors is an unsigned short, otherwise limit is 0x100000000 / 512
|
||||
* Linux has starvation problems if we permit larger than 4MB I/O ...
|
||||
*/
|
||||
#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)8192)
|
||||
|
||||
/*
|
||||
* These macros convert from physical channels to virtual channels
|
||||
|
|
@ -89,11 +95,21 @@ struct diskparm
|
|||
* on 64 bit systems not all cards support the 64 bit version
|
||||
*/
|
||||
struct sgentry {
|
||||
__le32 addr; /* 32-bit address. */
|
||||
__le32 count; /* Length. */
|
||||
};
|
||||
|
||||
struct user_sgentry {
|
||||
u32 addr; /* 32-bit address. */
|
||||
u32 count; /* Length. */
|
||||
};
|
||||
|
||||
struct sgentry64 {
|
||||
__le32 addr[2]; /* 64-bit addr. 2 pieces for data alignment */
|
||||
__le32 count; /* Length. */
|
||||
};
|
||||
|
||||
struct user_sgentry64 {
|
||||
u32 addr[2]; /* 64-bit addr. 2 pieces for data alignment */
|
||||
u32 count; /* Length. */
|
||||
};
|
||||
|
|
@ -106,15 +122,25 @@ struct sgentry64 {
|
|||
*/
|
||||
|
||||
struct sgmap {
|
||||
u32 count;
|
||||
__le32 count;
|
||||
struct sgentry sg[1];
|
||||
};
|
||||
|
||||
struct sgmap64 {
|
||||
struct user_sgmap {
|
||||
u32 count;
|
||||
struct user_sgentry sg[1];
|
||||
};
|
||||
|
||||
struct sgmap64 {
|
||||
__le32 count;
|
||||
struct sgentry64 sg[1];
|
||||
};
|
||||
|
||||
struct user_sgmap64 {
|
||||
u32 count;
|
||||
struct user_sgentry64 sg[1];
|
||||
};
|
||||
|
||||
struct creation_info
|
||||
{
|
||||
u8 buildnum; /* e.g., 588 */
|
||||
|
|
@ -123,14 +149,14 @@ struct creation_info
|
|||
* 2 = API
|
||||
*/
|
||||
u8 year; /* e.g., 1997 = 97 */
|
||||
u32 date; /*
|
||||
__le32 date; /*
|
||||
* unsigned Month :4; // 1 - 12
|
||||
* unsigned Day :6; // 1 - 32
|
||||
* unsigned Hour :6; // 0 - 23
|
||||
* unsigned Minute :6; // 0 - 60
|
||||
* unsigned Second :6; // 0 - 60
|
||||
*/
|
||||
u32 serial[2]; /* e.g., 0x1DEADB0BFAFAF001 */
|
||||
__le32 serial[2]; /* e.g., 0x1DEADB0BFAFAF001 */
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -175,8 +201,8 @@ struct creation_info
|
|||
*/
|
||||
|
||||
struct aac_entry {
|
||||
u32 size; /* Size in bytes of Fib which this QE points to */
|
||||
u32 addr; /* Receiver address of the FIB */
|
||||
__le32 size; /* Size in bytes of Fib which this QE points to */
|
||||
__le32 addr; /* Receiver address of the FIB */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -185,9 +211,10 @@ struct aac_entry {
|
|||
*/
|
||||
|
||||
struct aac_qhdr {
|
||||
u64 header_addr; /* Address to hand the adapter to access to this queue head */
|
||||
u32 *producer; /* The producer index for this queue (host address) */
|
||||
u32 *consumer; /* The consumer index for this queue (host address) */
|
||||
__le64 header_addr;/* Address to hand the adapter to access
|
||||
to this queue head */
|
||||
__le32 *producer; /* The producer index for this queue (host address) */
|
||||
__le32 *consumer; /* The consumer index for this queue (host address) */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -261,29 +288,30 @@ enum aac_queue_types {
|
|||
*/
|
||||
|
||||
struct aac_fibhdr {
|
||||
u32 XferState; // Current transfer state for this CCB
|
||||
u16 Command; // Routing information for the destination
|
||||
u8 StructType; // Type FIB
|
||||
u8 Flags; // Flags for FIB
|
||||
u16 Size; // Size of this FIB in bytes
|
||||
u16 SenderSize; // Size of the FIB in the sender (for response sizing)
|
||||
u32 SenderFibAddress; // Host defined data in the FIB
|
||||
u32 ReceiverFibAddress; // Logical address of this FIB for the adapter
|
||||
u32 SenderData; // Place holder for the sender to store data
|
||||
__le32 XferState; /* Current transfer state for this CCB */
|
||||
__le16 Command; /* Routing information for the destination */
|
||||
u8 StructType; /* Type FIB */
|
||||
u8 Flags; /* Flags for FIB */
|
||||
__le16 Size; /* Size of this FIB in bytes */
|
||||
__le16 SenderSize; /* Size of the FIB in the sender
|
||||
(for response sizing) */
|
||||
__le32 SenderFibAddress; /* Host defined data in the FIB */
|
||||
__le32 ReceiverFibAddress;/* Logical address of this FIB for
|
||||
the adapter */
|
||||
u32 SenderData; /* Place holder for the sender to store data */
|
||||
union {
|
||||
struct {
|
||||
u32 _ReceiverTimeStart; // Timestamp for receipt of fib
|
||||
u32 _ReceiverTimeDone; // Timestamp for completion of fib
|
||||
__le32 _ReceiverTimeStart; /* Timestamp for
|
||||
receipt of fib */
|
||||
__le32 _ReceiverTimeDone; /* Timestamp for
|
||||
completion of fib */
|
||||
} _s;
|
||||
} _u;
|
||||
};
|
||||
|
||||
#define FIB_DATA_SIZE_IN_BYTES (512 - sizeof(struct aac_fibhdr))
|
||||
|
||||
|
||||
struct hw_fib {
|
||||
struct aac_fibhdr header;
|
||||
u8 data[FIB_DATA_SIZE_IN_BYTES]; // Command specific data
|
||||
u8 data[512-sizeof(struct aac_fibhdr)]; // Command specific data
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -345,11 +373,12 @@ struct hw_fib {
|
|||
#define RequestAdapterInfo 703
|
||||
#define IsAdapterPaused 704
|
||||
#define SendHostTime 705
|
||||
#define LastMiscCommand 706
|
||||
#define RequestSupplementAdapterInfo 706
|
||||
#define LastMiscCommand 707
|
||||
|
||||
//
|
||||
// Commands that will target the failover level on the FSA adapter
|
||||
//
|
||||
/*
|
||||
* Commands that will target the failover level on the FSA adapter
|
||||
*/
|
||||
|
||||
enum fib_xfer_state {
|
||||
HostOwned = (1<<0),
|
||||
|
|
@ -382,22 +411,32 @@ enum fib_xfer_state {
|
|||
*/
|
||||
|
||||
#define ADAPTER_INIT_STRUCT_REVISION 3
|
||||
#define ADAPTER_INIT_STRUCT_REVISION_4 4 // rocket science
|
||||
|
||||
struct aac_init
|
||||
{
|
||||
u32 InitStructRevision;
|
||||
u32 MiniPortRevision;
|
||||
u32 fsrev;
|
||||
u32 CommHeaderAddress;
|
||||
u32 FastIoCommAreaAddress;
|
||||
u32 AdapterFibsPhysicalAddress;
|
||||
u32 AdapterFibsVirtualAddress;
|
||||
u32 AdapterFibsSize;
|
||||
u32 AdapterFibAlign;
|
||||
u32 printfbuf;
|
||||
u32 printfbufsiz;
|
||||
u32 HostPhysMemPages; // number of 4k pages of host physical memory
|
||||
u32 HostElapsedSeconds; // number of seconds since 1970.
|
||||
__le32 InitStructRevision;
|
||||
__le32 MiniPortRevision;
|
||||
__le32 fsrev;
|
||||
__le32 CommHeaderAddress;
|
||||
__le32 FastIoCommAreaAddress;
|
||||
__le32 AdapterFibsPhysicalAddress;
|
||||
__le32 AdapterFibsVirtualAddress;
|
||||
__le32 AdapterFibsSize;
|
||||
__le32 AdapterFibAlign;
|
||||
__le32 printfbuf;
|
||||
__le32 printfbufsiz;
|
||||
__le32 HostPhysMemPages; /* number of 4k pages of host
|
||||
physical memory */
|
||||
__le32 HostElapsedSeconds; /* number of seconds since 1970. */
|
||||
/*
|
||||
* ADAPTER_INIT_STRUCT_REVISION_4 begins here
|
||||
*/
|
||||
__le32 InitFlags; /* flags for supported features */
|
||||
#define INITFLAGS_NEW_COMM_SUPPORTED 0x00000001
|
||||
__le32 MaxIoCommands; /* max outstanding commands */
|
||||
__le32 MaxIoSize; /* largest I/O command */
|
||||
__le32 MaxFibSize; /* largest FIB to adapter */
|
||||
};
|
||||
|
||||
enum aac_log_level {
|
||||
|
|
@ -421,7 +460,7 @@ struct adapter_ops
|
|||
{
|
||||
void (*adapter_interrupt)(struct aac_dev *dev);
|
||||
void (*adapter_notify)(struct aac_dev *dev, u32 event);
|
||||
int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 *status);
|
||||
int (*adapter_sync_cmd)(struct aac_dev *dev, u32 command, u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6, u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4);
|
||||
int (*adapter_check_health)(struct aac_dev *dev);
|
||||
};
|
||||
|
||||
|
|
@ -541,6 +580,7 @@ struct sa_drawbridge_CSR {
|
|||
#define Mailbox3 SaDbCSR.MAILBOX3
|
||||
#define Mailbox4 SaDbCSR.MAILBOX4
|
||||
#define Mailbox5 SaDbCSR.MAILBOX5
|
||||
#define Mailbox6 SaDbCSR.MAILBOX6
|
||||
#define Mailbox7 SaDbCSR.MAILBOX7
|
||||
|
||||
#define DoorbellReg_p SaDbCSR.PRISETIRQ
|
||||
|
|
@ -763,29 +803,48 @@ struct fib {
|
|||
|
||||
struct aac_adapter_info
|
||||
{
|
||||
u32 platform;
|
||||
u32 cpu;
|
||||
u32 subcpu;
|
||||
u32 clock;
|
||||
u32 execmem;
|
||||
u32 buffermem;
|
||||
u32 totalmem;
|
||||
u32 kernelrev;
|
||||
u32 kernelbuild;
|
||||
u32 monitorrev;
|
||||
u32 monitorbuild;
|
||||
u32 hwrev;
|
||||
u32 hwbuild;
|
||||
u32 biosrev;
|
||||
u32 biosbuild;
|
||||
u32 cluster;
|
||||
u32 clusterchannelmask;
|
||||
u32 serial[2];
|
||||
u32 battery;
|
||||
u32 options;
|
||||
u32 OEM;
|
||||
__le32 platform;
|
||||
__le32 cpu;
|
||||
__le32 subcpu;
|
||||
__le32 clock;
|
||||
__le32 execmem;
|
||||
__le32 buffermem;
|
||||
__le32 totalmem;
|
||||
__le32 kernelrev;
|
||||
__le32 kernelbuild;
|
||||
__le32 monitorrev;
|
||||
__le32 monitorbuild;
|
||||
__le32 hwrev;
|
||||
__le32 hwbuild;
|
||||
__le32 biosrev;
|
||||
__le32 biosbuild;
|
||||
__le32 cluster;
|
||||
__le32 clusterchannelmask;
|
||||
__le32 serial[2];
|
||||
__le32 battery;
|
||||
__le32 options;
|
||||
__le32 OEM;
|
||||
};
|
||||
|
||||
struct aac_supplement_adapter_info
|
||||
{
|
||||
u8 AdapterTypeText[17+1];
|
||||
u8 Pad[2];
|
||||
__le32 FlashMemoryByteSize;
|
||||
__le32 FlashImageId;
|
||||
__le32 MaxNumberPorts;
|
||||
__le32 Version;
|
||||
__le32 FeatureBits;
|
||||
u8 SlotNumber;
|
||||
u8 ReservedPad0[0];
|
||||
u8 BuildDate[12];
|
||||
__le32 CurrentNumberPorts;
|
||||
__le32 ReservedGrowth[24];
|
||||
};
|
||||
#define AAC_FEATURE_FALCON 0x00000010
|
||||
#define AAC_SIS_VERSION_V3 3
|
||||
#define AAC_SIS_SLOT_UNKNOWN 0xFF
|
||||
|
||||
/*
|
||||
* Battery platforms
|
||||
*/
|
||||
|
|
@ -830,6 +889,12 @@ struct aac_dev
|
|||
int id;
|
||||
|
||||
u16 irq_mask;
|
||||
/*
|
||||
* negotiated FIB settings
|
||||
*/
|
||||
unsigned max_fib_size;
|
||||
unsigned sg_tablesize;
|
||||
|
||||
/*
|
||||
* Map for 128 fib objects (64k)
|
||||
*/
|
||||
|
|
@ -889,12 +954,14 @@ struct aac_dev
|
|||
u32 aif_thread;
|
||||
struct completion aif_completion;
|
||||
struct aac_adapter_info adapter_info;
|
||||
struct aac_supplement_adapter_info supplement_adapter_info;
|
||||
/* These are in adapter info but they are in the io flow so
|
||||
* lets break them out so we don't have to do an AND to check them
|
||||
*/
|
||||
u8 nondasd_support;
|
||||
u8 dac_support;
|
||||
u8 raid_scsi_mode;
|
||||
u8 printf_enabled;
|
||||
};
|
||||
|
||||
#define aac_adapter_interrupt(dev) \
|
||||
|
|
@ -903,6 +970,8 @@ struct aac_dev
|
|||
#define aac_adapter_notify(dev, event) \
|
||||
(dev)->a_ops.adapter_notify(dev, event)
|
||||
|
||||
#define aac_adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4) \
|
||||
(dev)->a_ops.adapter_sync_cmd(dev, command, p1, p2, p3, p4, p5, p6, status, r1, r2, r3, r4)
|
||||
|
||||
#define aac_adapter_check_health(dev) \
|
||||
(dev)->a_ops.adapter_check_health(dev)
|
||||
|
|
@ -1016,82 +1085,101 @@ struct aac_dev
|
|||
|
||||
struct aac_read
|
||||
{
|
||||
u32 command;
|
||||
u32 cid;
|
||||
u32 block;
|
||||
u32 count;
|
||||
__le32 command;
|
||||
__le32 cid;
|
||||
__le32 block;
|
||||
__le32 count;
|
||||
struct sgmap sg; // Must be last in struct because it is variable
|
||||
};
|
||||
|
||||
struct aac_read64
|
||||
{
|
||||
u32 command;
|
||||
u16 cid;
|
||||
u16 sector_count;
|
||||
u32 block;
|
||||
u16 pad;
|
||||
u16 flags;
|
||||
__le32 command;
|
||||
__le16 cid;
|
||||
__le16 sector_count;
|
||||
__le32 block;
|
||||
__le16 pad;
|
||||
__le16 flags;
|
||||
struct sgmap64 sg; // Must be last in struct because it is variable
|
||||
};
|
||||
|
||||
struct aac_read_reply
|
||||
{
|
||||
u32 status;
|
||||
u32 count;
|
||||
__le32 status;
|
||||
__le32 count;
|
||||
};
|
||||
|
||||
struct aac_write
|
||||
{
|
||||
u32 command;
|
||||
u32 cid;
|
||||
u32 block;
|
||||
u32 count;
|
||||
u32 stable; // Not used
|
||||
__le32 command;
|
||||
__le32 cid;
|
||||
__le32 block;
|
||||
__le32 count;
|
||||
__le32 stable; // Not used
|
||||
struct sgmap sg; // Must be last in struct because it is variable
|
||||
};
|
||||
|
||||
struct aac_write64
|
||||
{
|
||||
u32 command;
|
||||
u16 cid;
|
||||
u16 sector_count;
|
||||
u32 block;
|
||||
u16 pad;
|
||||
u16 flags;
|
||||
__le32 command;
|
||||
__le16 cid;
|
||||
__le16 sector_count;
|
||||
__le32 block;
|
||||
__le16 pad;
|
||||
__le16 flags;
|
||||
struct sgmap64 sg; // Must be last in struct because it is variable
|
||||
};
|
||||
struct aac_write_reply
|
||||
{
|
||||
u32 status;
|
||||
u32 count;
|
||||
u32 committed;
|
||||
__le32 status;
|
||||
__le32 count;
|
||||
__le32 committed;
|
||||
};
|
||||
|
||||
#define CT_FLUSH_CACHE 129
|
||||
struct aac_synchronize {
|
||||
u32 command; /* VM_ContainerConfig */
|
||||
u32 type; /* CT_FLUSH_CACHE */
|
||||
u32 cid;
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 count; /* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
|
||||
__le32 command; /* VM_ContainerConfig */
|
||||
__le32 type; /* CT_FLUSH_CACHE */
|
||||
__le32 cid;
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 count; /* sizeof(((struct aac_synchronize_reply *)NULL)->data) */
|
||||
};
|
||||
|
||||
struct aac_synchronize_reply {
|
||||
u32 dummy0;
|
||||
u32 dummy1;
|
||||
u32 status; /* CT_OK */
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 parm5;
|
||||
__le32 dummy0;
|
||||
__le32 dummy1;
|
||||
__le32 status; /* CT_OK */
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 parm5;
|
||||
u8 data[16];
|
||||
};
|
||||
|
||||
struct aac_srb
|
||||
{
|
||||
__le32 function;
|
||||
__le32 channel;
|
||||
__le32 id;
|
||||
__le32 lun;
|
||||
__le32 timeout;
|
||||
__le32 flags;
|
||||
__le32 count; // Data xfer size
|
||||
__le32 retry_limit;
|
||||
__le32 cdb_size;
|
||||
u8 cdb[16];
|
||||
struct sgmap sg;
|
||||
};
|
||||
|
||||
/*
|
||||
* This and assocated data structs are used by the
|
||||
* ioctl caller and are in cpu order.
|
||||
*/
|
||||
struct user_aac_srb
|
||||
{
|
||||
u32 function;
|
||||
u32 channel;
|
||||
|
|
@ -1103,20 +1191,18 @@ struct aac_srb
|
|||
u32 retry_limit;
|
||||
u32 cdb_size;
|
||||
u8 cdb[16];
|
||||
struct sgmap sg;
|
||||
struct user_sgmap sg;
|
||||
};
|
||||
|
||||
|
||||
|
||||
#define AAC_SENSE_BUFFERSIZE 30
|
||||
|
||||
struct aac_srb_reply
|
||||
{
|
||||
u32 status;
|
||||
u32 srb_status;
|
||||
u32 scsi_status;
|
||||
u32 data_xfer_length;
|
||||
u32 sense_data_size;
|
||||
__le32 status;
|
||||
__le32 srb_status;
|
||||
__le32 scsi_status;
|
||||
__le32 data_xfer_length;
|
||||
__le32 sense_data_size;
|
||||
u8 sense_data[AAC_SENSE_BUFFERSIZE]; // Can this be SCSI_SENSE_BUFFERSIZE
|
||||
};
|
||||
/*
|
||||
|
|
@ -1223,14 +1309,14 @@ struct aac_srb_reply
|
|||
*/
|
||||
|
||||
struct aac_fsinfo {
|
||||
u32 fsTotalSize; /* Consumed by fs, incl. metadata */
|
||||
u32 fsBlockSize;
|
||||
u32 fsFragSize;
|
||||
u32 fsMaxExtendSize;
|
||||
u32 fsSpaceUnits;
|
||||
u32 fsMaxNumFiles;
|
||||
u32 fsNumFreeFiles;
|
||||
u32 fsInodeDensity;
|
||||
__le32 fsTotalSize; /* Consumed by fs, incl. metadata */
|
||||
__le32 fsBlockSize;
|
||||
__le32 fsFragSize;
|
||||
__le32 fsMaxExtendSize;
|
||||
__le32 fsSpaceUnits;
|
||||
__le32 fsMaxNumFiles;
|
||||
__le32 fsNumFreeFiles;
|
||||
__le32 fsInodeDensity;
|
||||
}; /* valid iff ObjType == FT_FILESYS && !(ContentState & FSCS_NOTCLEAN) */
|
||||
|
||||
union aac_contentinfo {
|
||||
|
|
@ -1243,32 +1329,32 @@ union aac_contentinfo {
|
|||
|
||||
#define CT_GET_CONFIG_STATUS 147
|
||||
struct aac_get_config_status {
|
||||
u32 command; /* VM_ContainerConfig */
|
||||
u32 type; /* CT_GET_CONFIG_STATUS */
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 parm5;
|
||||
u32 count; /* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
|
||||
__le32 command; /* VM_ContainerConfig */
|
||||
__le32 type; /* CT_GET_CONFIG_STATUS */
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 parm5;
|
||||
__le32 count; /* sizeof(((struct aac_get_config_status_resp *)NULL)->data) */
|
||||
};
|
||||
|
||||
#define CFACT_CONTINUE 0
|
||||
#define CFACT_PAUSE 1
|
||||
#define CFACT_ABORT 2
|
||||
struct aac_get_config_status_resp {
|
||||
u32 response; /* ST_OK */
|
||||
u32 dummy0;
|
||||
u32 status; /* CT_OK */
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 parm5;
|
||||
__le32 response; /* ST_OK */
|
||||
__le32 dummy0;
|
||||
__le32 status; /* CT_OK */
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 parm5;
|
||||
struct {
|
||||
u32 action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
|
||||
u16 flags;
|
||||
s16 count;
|
||||
__le32 action; /* CFACT_CONTINUE, CFACT_PAUSE or CFACT_ABORT */
|
||||
__le16 flags;
|
||||
__le16 count;
|
||||
} data;
|
||||
};
|
||||
|
||||
|
|
@ -1279,26 +1365,26 @@ struct aac_get_config_status_resp {
|
|||
#define CT_COMMIT_CONFIG 152
|
||||
|
||||
struct aac_commit_config {
|
||||
u32 command; /* VM_ContainerConfig */
|
||||
u32 type; /* CT_COMMIT_CONFIG */
|
||||
__le32 command; /* VM_ContainerConfig */
|
||||
__le32 type; /* CT_COMMIT_CONFIG */
|
||||
};
|
||||
|
||||
/*
|
||||
* Query for Container Configuration Count
|
||||
* Query for Container Configuration Status
|
||||
*/
|
||||
|
||||
#define CT_GET_CONTAINER_COUNT 4
|
||||
struct aac_get_container_count {
|
||||
u32 command; /* VM_ContainerConfig */
|
||||
u32 type; /* CT_GET_CONTAINER_COUNT */
|
||||
__le32 command; /* VM_ContainerConfig */
|
||||
__le32 type; /* CT_GET_CONTAINER_COUNT */
|
||||
};
|
||||
|
||||
struct aac_get_container_count_resp {
|
||||
u32 response; /* ST_OK */
|
||||
u32 dummy0;
|
||||
u32 MaxContainers;
|
||||
u32 ContainerSwitchEntries;
|
||||
u32 MaxPartitions;
|
||||
__le32 response; /* ST_OK */
|
||||
__le32 dummy0;
|
||||
__le32 MaxContainers;
|
||||
__le32 ContainerSwitchEntries;
|
||||
__le32 MaxPartitions;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1308,15 +1394,19 @@ struct aac_get_container_count_resp {
|
|||
*/
|
||||
|
||||
struct aac_mntent {
|
||||
u32 oid;
|
||||
u8 name[16]; // if applicable
|
||||
struct creation_info create_info; // if applicable
|
||||
u32 capacity;
|
||||
u32 vol; // substrate structure
|
||||
u32 obj; // FT_FILESYS, FT_DATABASE, etc.
|
||||
u32 state; // unready for mounting, readonly, etc.
|
||||
union aac_contentinfo fileinfo; // Info specific to content manager (eg, filesystem)
|
||||
u32 altoid; // != oid <==> snapshot or broken mirror exists
|
||||
__le32 oid;
|
||||
u8 name[16]; /* if applicable */
|
||||
struct creation_info create_info; /* if applicable */
|
||||
__le32 capacity;
|
||||
__le32 vol; /* substrate structure */
|
||||
__le32 obj; /* FT_FILESYS,
|
||||
FT_DATABASE, etc. */
|
||||
__le32 state; /* unready for mounting,
|
||||
readonly, etc. */
|
||||
union aac_contentinfo fileinfo; /* Info specific to content
|
||||
manager (eg, filesystem) */
|
||||
__le32 altoid; /* != oid <==> snapshot or
|
||||
broken mirror exists */
|
||||
};
|
||||
|
||||
#define FSCS_NOTCLEAN 0x0001 /* fsck is neccessary before mounting */
|
||||
|
|
@ -1324,40 +1414,40 @@ struct aac_mntent {
|
|||
#define FSCS_HIDDEN 0x0004 /* should be ignored - set during a clear */
|
||||
|
||||
struct aac_query_mount {
|
||||
u32 command;
|
||||
u32 type;
|
||||
u32 count;
|
||||
__le32 command;
|
||||
__le32 type;
|
||||
__le32 count;
|
||||
};
|
||||
|
||||
struct aac_mount {
|
||||
u32 status;
|
||||
u32 type; /* should be same as that requested */
|
||||
u32 count;
|
||||
__le32 status;
|
||||
__le32 type; /* should be same as that requested */
|
||||
__le32 count;
|
||||
struct aac_mntent mnt[1];
|
||||
};
|
||||
|
||||
#define CT_READ_NAME 130
|
||||
struct aac_get_name {
|
||||
u32 command; /* VM_ContainerConfig */
|
||||
u32 type; /* CT_READ_NAME */
|
||||
u32 cid;
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 count; /* sizeof(((struct aac_get_name_resp *)NULL)->data) */
|
||||
__le32 command; /* VM_ContainerConfig */
|
||||
__le32 type; /* CT_READ_NAME */
|
||||
__le32 cid;
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 count; /* sizeof(((struct aac_get_name_resp *)NULL)->data) */
|
||||
};
|
||||
|
||||
#define CT_OK 218
|
||||
struct aac_get_name_resp {
|
||||
u32 dummy0;
|
||||
u32 dummy1;
|
||||
u32 status; /* CT_OK */
|
||||
u32 parm1;
|
||||
u32 parm2;
|
||||
u32 parm3;
|
||||
u32 parm4;
|
||||
u32 parm5;
|
||||
__le32 dummy0;
|
||||
__le32 dummy1;
|
||||
__le32 status; /* CT_OK */
|
||||
__le32 parm1;
|
||||
__le32 parm2;
|
||||
__le32 parm3;
|
||||
__le32 parm4;
|
||||
__le32 parm5;
|
||||
u8 data[16];
|
||||
};
|
||||
|
||||
|
|
@ -1366,8 +1456,8 @@ struct aac_get_name_resp {
|
|||
*/
|
||||
|
||||
struct aac_close {
|
||||
u32 command;
|
||||
u32 cid;
|
||||
__le32 command;
|
||||
__le32 cid;
|
||||
};
|
||||
|
||||
struct aac_query_disk
|
||||
|
|
@ -1434,6 +1524,7 @@ struct revision
|
|||
#define FSACTL_GET_PCI_INFO CTL_CODE(2119, METHOD_BUFFERED)
|
||||
#define FSACTL_FORCE_DELETE_DISK CTL_CODE(2120, METHOD_NEITHER)
|
||||
#define FSACTL_GET_CONTAINERS 2131
|
||||
#define FSACTL_SEND_LARGE_FIB CTL_CODE(2138, METHOD_BUFFERED)
|
||||
|
||||
|
||||
struct aac_common
|
||||
|
|
@ -1573,8 +1664,8 @@ extern struct aac_common aac_config;
|
|||
*/
|
||||
|
||||
struct aac_aifcmd {
|
||||
u32 command; /* Tell host what type of notify this is */
|
||||
u32 seqnum; /* To allow ordering of reports (if necessary) */
|
||||
__le32 command; /* Tell host what type of notify this is */
|
||||
__le32 seqnum; /* To allow ordering of reports (if necessary) */
|
||||
u8 data[1]; /* Undefined length (from kernel viewpoint) */
|
||||
};
|
||||
|
||||
|
|
@ -1597,7 +1688,6 @@ int fib_setup(struct aac_dev *dev);
|
|||
void fib_map_free(struct aac_dev *dev);
|
||||
void fib_free(struct fib * context);
|
||||
void fib_init(struct fib * context);
|
||||
void fib_dealloc(struct fib * context);
|
||||
void aac_printf(struct aac_dev *dev, u32 val);
|
||||
int fib_send(u16 command, struct fib * context, unsigned long size, int priority, int wait, int reply, fib_callback callback, void *ctxt);
|
||||
int aac_consumer_get(struct aac_dev * dev, struct aac_queue * q, struct aac_entry **entry);
|
||||
|
|
@ -1621,3 +1711,5 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size);
|
|||
struct aac_driver_ident* aac_get_driver_ident(int devtype);
|
||||
int aac_get_adapter_info(struct aac_dev* dev);
|
||||
int aac_send_shutdown(struct aac_dev *dev);
|
||||
extern int numacb;
|
||||
extern int acbsize;
|
||||
|
|
|
|||
|
|
@ -51,15 +51,22 @@
|
|||
* This routine sends a fib to the adapter on behalf of a user level
|
||||
* program.
|
||||
*/
|
||||
# define AAC_DEBUG_PREAMBLE KERN_INFO
|
||||
# define AAC_DEBUG_POSTAMBLE
|
||||
|
||||
static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
||||
{
|
||||
struct hw_fib * kfib;
|
||||
struct fib *fibptr;
|
||||
struct hw_fib * hw_fib = (struct hw_fib *)0;
|
||||
dma_addr_t hw_fib_pa = (dma_addr_t)0LL;
|
||||
unsigned size;
|
||||
int retval;
|
||||
|
||||
fibptr = fib_alloc(dev);
|
||||
if(fibptr == NULL)
|
||||
if(fibptr == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
kfib = fibptr->hw_fib;
|
||||
/*
|
||||
|
|
@ -74,19 +81,24 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
|||
* will not overrun the buffer when we copy the memory. Return
|
||||
* an error if we would.
|
||||
*/
|
||||
if (le16_to_cpu(kfib->header.Size) >
|
||||
sizeof(struct hw_fib) - sizeof(struct aac_fibhdr)) {
|
||||
fib_free(fibptr);
|
||||
return -EINVAL;
|
||||
size = le16_to_cpu(kfib->header.Size) + sizeof(struct aac_fibhdr);
|
||||
if (size < le16_to_cpu(kfib->header.SenderSize))
|
||||
size = le16_to_cpu(kfib->header.SenderSize);
|
||||
if (size > dev->max_fib_size) {
|
||||
/* Highjack the hw_fib */
|
||||
hw_fib = fibptr->hw_fib;
|
||||
hw_fib_pa = fibptr->hw_fib_pa;
|
||||
fibptr->hw_fib = kfib = pci_alloc_consistent(dev->pdev, size, &fibptr->hw_fib_pa);
|
||||
memset(((char *)kfib) + dev->max_fib_size, 0, size - dev->max_fib_size);
|
||||
memcpy(kfib, hw_fib, dev->max_fib_size);
|
||||
}
|
||||
|
||||
if (copy_from_user(kfib, arg, le16_to_cpu(kfib->header.Size) +
|
||||
sizeof(struct aac_fibhdr))) {
|
||||
fib_free(fibptr);
|
||||
return -EFAULT;
|
||||
if (copy_from_user(kfib, arg, size)) {
|
||||
retval = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (kfib->header.Command == cpu_to_le32(TakeABreakPt)) {
|
||||
if (kfib->header.Command == cpu_to_le16(TakeABreakPt)) {
|
||||
aac_adapter_interrupt(dev);
|
||||
/*
|
||||
* Since we didn't really send a fib, zero out the state to allow
|
||||
|
|
@ -94,16 +106,15 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
|||
*/
|
||||
kfib->header.XferState = 0;
|
||||
} else {
|
||||
int retval = fib_send(kfib->header.Command, fibptr,
|
||||
retval = fib_send(le16_to_cpu(kfib->header.Command), fibptr,
|
||||
le16_to_cpu(kfib->header.Size) , FsaNormal,
|
||||
1, 1, NULL, NULL);
|
||||
if (retval) {
|
||||
fib_free(fibptr);
|
||||
return retval;
|
||||
goto cleanup;
|
||||
}
|
||||
if (fib_complete(fibptr) != 0) {
|
||||
fib_free(fibptr);
|
||||
return -EINVAL;
|
||||
retval = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
/*
|
||||
|
|
@ -114,12 +125,17 @@ static int ioctl_send_fib(struct aac_dev * dev, void __user *arg)
|
|||
* was already included by the adapter.)
|
||||
*/
|
||||
|
||||
if (copy_to_user(arg, (void *)kfib, kfib->header.Size)) {
|
||||
fib_free(fibptr);
|
||||
return -EFAULT;
|
||||
retval = 0;
|
||||
if (copy_to_user(arg, (void *)kfib, size))
|
||||
retval = -EFAULT;
|
||||
cleanup:
|
||||
if (hw_fib) {
|
||||
pci_free_consistent(dev->pdev, size, kfib, fibptr->hw_fib_pa);
|
||||
fibptr->hw_fib_pa = hw_fib_pa;
|
||||
fibptr->hw_fib = hw_fib;
|
||||
}
|
||||
fib_free(fibptr);
|
||||
return 0;
|
||||
return retval;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -391,26 +407,28 @@ static int check_revision(struct aac_dev *dev, void __user *arg)
|
|||
struct revision response;
|
||||
|
||||
response.compat = 1;
|
||||
response.version = dev->adapter_info.kernelrev;
|
||||
response.build = dev->adapter_info.kernelbuild;
|
||||
response.version = le32_to_cpu(dev->adapter_info.kernelrev);
|
||||
response.build = le32_to_cpu(dev->adapter_info.kernelbuild);
|
||||
|
||||
if (copy_to_user(arg, &response, sizeof(response)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* aac_send_raw_scb
|
||||
*
|
||||
*/
|
||||
|
||||
int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
static int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
||||
{
|
||||
struct fib* srbfib;
|
||||
int status;
|
||||
struct aac_srb *srbcmd;
|
||||
struct aac_srb __user *user_srb = arg;
|
||||
struct aac_srb *srbcmd = NULL;
|
||||
struct user_aac_srb *user_srbcmd = NULL;
|
||||
struct user_aac_srb __user *user_srb = arg;
|
||||
struct aac_srb_reply __user *user_reply;
|
||||
struct aac_srb_reply* reply;
|
||||
u32 fibsize = 0;
|
||||
|
|
@ -426,7 +444,7 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
|||
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN)){
|
||||
printk(KERN_DEBUG"aacraid: No permission to send raw srb\n");
|
||||
dprintk((KERN_DEBUG"aacraid: No permission to send raw srb\n"));
|
||||
return -EPERM;
|
||||
}
|
||||
/*
|
||||
|
|
@ -439,37 +457,45 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
|||
|
||||
srbcmd = (struct aac_srb*) fib_data(srbfib);
|
||||
|
||||
memset(sg_list, 0, sizeof(sg_list)); /* cleanup may take issue */
|
||||
if(copy_from_user(&fibsize, &user_srb->count,sizeof(u32))){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy data size from user\n");
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy data size from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (fibsize > FIB_DATA_SIZE_IN_BYTES) {
|
||||
if (fibsize > (dev->max_fib_size - sizeof(struct aac_fibhdr))) {
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if(copy_from_user(srbcmd, user_srb,fibsize)){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy srb from user\n");
|
||||
user_srbcmd = kmalloc(GFP_KERNEL, fibsize);
|
||||
if (!user_srbcmd) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not make a copy of the srb\n"));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
if(copy_from_user(user_srbcmd, user_srb,fibsize)){
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy srb from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
user_reply = arg+fibsize;
|
||||
|
||||
flags = srbcmd->flags;
|
||||
flags = user_srbcmd->flags; /* from user in cpu order */
|
||||
// Fix up srb for endian and force some values
|
||||
|
||||
srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi); // Force this
|
||||
srbcmd->channel = cpu_to_le32(srbcmd->channel);
|
||||
srbcmd->id = cpu_to_le32(srbcmd->id);
|
||||
srbcmd->lun = cpu_to_le32(srbcmd->lun);
|
||||
srbcmd->flags = cpu_to_le32(srbcmd->flags);
|
||||
srbcmd->timeout = cpu_to_le32(srbcmd->timeout);
|
||||
srbcmd->channel = cpu_to_le32(user_srbcmd->channel);
|
||||
srbcmd->id = cpu_to_le32(user_srbcmd->id);
|
||||
srbcmd->lun = cpu_to_le32(user_srbcmd->lun);
|
||||
srbcmd->flags = cpu_to_le32(flags);
|
||||
srbcmd->timeout = cpu_to_le32(user_srbcmd->timeout);
|
||||
srbcmd->retry_limit =cpu_to_le32(0); // Obsolete parameter
|
||||
srbcmd->cdb_size = cpu_to_le32(srbcmd->cdb_size);
|
||||
srbcmd->cdb_size = cpu_to_le32(user_srbcmd->cdb_size);
|
||||
|
||||
switch (srbcmd->flags & (SRB_DataIn | SRB_DataOut)) {
|
||||
switch (flags & (SRB_DataIn | SRB_DataOut)) {
|
||||
case SRB_DataOut:
|
||||
data_dir = DMA_TO_DEVICE;
|
||||
break;
|
||||
|
|
@ -482,118 +508,148 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
|||
default:
|
||||
data_dir = DMA_NONE;
|
||||
}
|
||||
if (le32_to_cpu(srbcmd->sg.count) > (sizeof(sg_list)/sizeof(sg_list[0]))) {
|
||||
dprintk((KERN_DEBUG"aacraid: too many sg entries %d\n",
|
||||
le32_to_cpu(srbcmd->sg.count)));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if (dev->dac_support == 1) {
|
||||
struct sgmap64* psg = (struct sgmap64*)&srbcmd->sg;
|
||||
struct user_sgmap64* upsg = (struct user_sgmap64*)&user_srbcmd->sg;
|
||||
struct sgmap64* psg = (struct sgmap64*)&user_srbcmd->sg;
|
||||
struct user_sgmap* usg;
|
||||
byte_count = 0;
|
||||
|
||||
/*
|
||||
* This should also catch if user used the 32 bit sgmap
|
||||
*/
|
||||
actual_fibsize = sizeof(struct aac_srb) -
|
||||
sizeof(struct sgentry) + ((srbcmd->sg.count & 0xff) *
|
||||
sizeof(struct sgentry64));
|
||||
sizeof(struct sgentry) +
|
||||
((upsg->count & 0xff) *
|
||||
sizeof(struct sgentry));
|
||||
if(actual_fibsize != fibsize){ // User made a mistake - should not continue
|
||||
printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n");
|
||||
dprintk((KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((data_dir == DMA_NONE) && psg->count) {
|
||||
printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
|
||||
usg = kmalloc(actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap), GFP_KERNEL);
|
||||
if (!usg) {
|
||||
dprintk((KERN_DEBUG"aacraid: Allocation error in Raw SRB command\n"));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
memcpy (usg, upsg, actual_fibsize - sizeof(struct aac_srb)
|
||||
+ sizeof(struct sgmap));
|
||||
actual_fibsize = sizeof(struct aac_srb) -
|
||||
sizeof(struct sgentry) + ((usg->count & 0xff) *
|
||||
sizeof(struct sgentry64));
|
||||
if ((data_dir == DMA_NONE) && upsg->count) {
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
for (i = 0; i < psg->count; i++) {
|
||||
dma_addr_t addr;
|
||||
u64 le_addr;
|
||||
for (i = 0; i < usg->count; i++) {
|
||||
u64 addr;
|
||||
void* p;
|
||||
p = kmalloc(psg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
/* Does this really need to be GFP_DMA? */
|
||||
p = kmalloc(usg->sg[i].count,GFP_KERNEL|__GFP_DMA);
|
||||
if(p == 0) {
|
||||
printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
psg->sg[i].count,i,psg->count);
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
usg->sg[i].count,i,usg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)psg->sg[i].addr;
|
||||
sg_user[i] = (void __user *)usg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n");
|
||||
if(copy_from_user(p,sg_user[i],upsg->sg[i].count)){
|
||||
kfree (usg);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
|
||||
addr = pci_map_single(dev->pdev, p, usg->sg[i].count, data_dir);
|
||||
|
||||
le_addr = cpu_to_le64(addr);
|
||||
psg->sg[i].addr[1] = (u32)(le_addr>>32);
|
||||
psg->sg[i].addr[0] = (u32)(le_addr & 0xffffffff);
|
||||
psg->sg[i].count = cpu_to_le32(psg->sg[i].count);
|
||||
byte_count += psg->sg[i].count;
|
||||
psg->sg[i].addr[0] = cpu_to_le32(addr & 0xffffffff);
|
||||
psg->sg[i].addr[1] = cpu_to_le32(addr>>32);
|
||||
psg->sg[i].count = cpu_to_le32(usg->sg[i].count);
|
||||
byte_count += usg->sg[i].count;
|
||||
}
|
||||
kfree (usg);
|
||||
|
||||
srbcmd->count = cpu_to_le32(byte_count);
|
||||
psg->count = cpu_to_le32(sg_indx+1);
|
||||
status = fib_send(ScsiPortCommand64, srbfib, actual_fibsize, FsaNormal, 1, 1,NULL,NULL);
|
||||
} else {
|
||||
struct user_sgmap* upsg = &user_srbcmd->sg;
|
||||
struct sgmap* psg = &srbcmd->sg;
|
||||
byte_count = 0;
|
||||
|
||||
actual_fibsize = sizeof (struct aac_srb) +
|
||||
(((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) *
|
||||
sizeof (struct sgentry));
|
||||
actual_fibsize = sizeof (struct aac_srb) + (((le32_to_cpu(srbcmd->sg.count) & 0xff) - 1) * sizeof (struct sgentry));
|
||||
if(actual_fibsize != fibsize){ // User made a mistake - should not continue
|
||||
printk(KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n");
|
||||
dprintk((KERN_DEBUG"aacraid: Bad Size specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((data_dir == DMA_NONE) && psg->count) {
|
||||
printk(KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n");
|
||||
if ((data_dir == DMA_NONE) && upsg->count) {
|
||||
dprintk((KERN_DEBUG"aacraid: SG with no direction specified in Raw SRB command\n"));
|
||||
rcode = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
for (i = 0; i < psg->count; i++) {
|
||||
for (i = 0; i < upsg->count; i++) {
|
||||
dma_addr_t addr;
|
||||
void* p;
|
||||
p = kmalloc(psg->sg[i].count,GFP_KERNEL);
|
||||
p = kmalloc(upsg->sg[i].count, GFP_KERNEL);
|
||||
if(p == 0) {
|
||||
printk(KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
psg->sg[i].count,i,psg->count);
|
||||
dprintk((KERN_DEBUG"aacraid: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
|
||||
upsg->sg[i].count, i, upsg->count));
|
||||
rcode = -ENOMEM;
|
||||
goto cleanup;
|
||||
}
|
||||
sg_user[i] = (void __user *)(psg->sg[i].addr);
|
||||
sg_user[i] = (void __user *)upsg->sg[i].addr;
|
||||
sg_list[i] = p; // save so we can clean up later
|
||||
sg_indx = i;
|
||||
|
||||
if( flags & SRB_DataOut ){
|
||||
if(copy_from_user(p,sg_user[i],psg->sg[i].count)){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy sg data from user\n");
|
||||
if(copy_from_user(p, sg_user[i],
|
||||
upsg->sg[i].count)) {
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data from user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
addr = pci_map_single(dev->pdev, p, psg->sg[i].count, data_dir);
|
||||
addr = pci_map_single(dev->pdev, p,
|
||||
upsg->sg[i].count, data_dir);
|
||||
|
||||
psg->sg[i].addr = cpu_to_le32(addr);
|
||||
psg->sg[i].count = cpu_to_le32(psg->sg[i].count);
|
||||
byte_count += psg->sg[i].count;
|
||||
psg->sg[i].count = cpu_to_le32(upsg->sg[i].count);
|
||||
byte_count += upsg->sg[i].count;
|
||||
}
|
||||
srbcmd->count = cpu_to_le32(byte_count);
|
||||
psg->count = cpu_to_le32(sg_indx+1);
|
||||
status = fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
|
||||
}
|
||||
|
||||
if (status != 0){
|
||||
printk(KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n");
|
||||
dprintk((KERN_DEBUG"aacraid: Could not send raw srb fib to hba\n"));
|
||||
rcode = -1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if( flags & SRB_DataIn ) {
|
||||
for(i = 0 ; i <= sg_indx; i++){
|
||||
if(copy_to_user(sg_user[i],sg_list[i],le32_to_cpu(srbcmd->sg.sg[i].count))){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy sg data to user\n");
|
||||
byte_count = le32_to_cpu((dev->dac_support == 1)
|
||||
? ((struct sgmap64*)&srbcmd->sg)->sg[i].count
|
||||
: srbcmd->sg.sg[i].count);
|
||||
if(copy_to_user(sg_user[i], sg_list[i], byte_count)){
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy sg data to user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
|
||||
|
|
@ -603,12 +659,13 @@ int aac_send_raw_srb(struct aac_dev* dev, void __user * arg)
|
|||
|
||||
reply = (struct aac_srb_reply *) fib_data(srbfib);
|
||||
if(copy_to_user(user_reply,reply,sizeof(struct aac_srb_reply))){
|
||||
printk(KERN_DEBUG"aacraid: Could not copy reply to user\n");
|
||||
dprintk((KERN_DEBUG"aacraid: Could not copy reply to user\n"));
|
||||
rcode = -EFAULT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
kfree(user_srbcmd);
|
||||
for(i=0; i <= sg_indx; i++){
|
||||
kfree(sg_list[i]);
|
||||
}
|
||||
|
|
@ -618,14 +675,13 @@ cleanup:
|
|||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
struct aac_pci_info {
|
||||
u32 bus;
|
||||
u32 slot;
|
||||
};
|
||||
|
||||
|
||||
int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
|
||||
static int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
|
||||
{
|
||||
struct aac_pci_info pci_info;
|
||||
|
||||
|
|
@ -633,11 +689,11 @@ int aac_get_pci_info(struct aac_dev* dev, void __user *arg)
|
|||
pci_info.slot = PCI_SLOT(dev->pdev->devfn);
|
||||
|
||||
if (copy_to_user(arg, &pci_info, sizeof(struct aac_pci_info))) {
|
||||
printk(KERN_DEBUG "aacraid: Could not copy pci info\n");
|
||||
dprintk((KERN_DEBUG "aacraid: Could not copy pci info\n"));
|
||||
return -EFAULT;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
|
||||
|
|
@ -656,6 +712,7 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
|
|||
case FSACTL_MINIPORT_REV_CHECK:
|
||||
status = check_revision(dev, arg);
|
||||
break;
|
||||
case FSACTL_SEND_LARGE_FIB:
|
||||
case FSACTL_SENDFIB:
|
||||
status = ioctl_send_fib(dev, arg);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/mm.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
#include "aacraid.h"
|
||||
|
|
@ -49,8 +50,8 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
|
|||
{
|
||||
unsigned char *base;
|
||||
unsigned long size, align;
|
||||
unsigned long fibsize = 4096;
|
||||
unsigned long printfbufsiz = 256;
|
||||
const unsigned long fibsize = 4096;
|
||||
const unsigned long printfbufsiz = 256;
|
||||
struct aac_init *init;
|
||||
dma_addr_t phys;
|
||||
|
||||
|
|
@ -74,6 +75,8 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
|
|||
init = dev->init;
|
||||
|
||||
init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION);
|
||||
if (dev->max_fib_size != sizeof(struct hw_fib))
|
||||
init->InitStructRevision = cpu_to_le32(ADAPTER_INIT_STRUCT_REVISION_4);
|
||||
init->MiniPortRevision = cpu_to_le32(Sa_MINIPORT_REVISION);
|
||||
init->fsrev = cpu_to_le32(dev->fsrev);
|
||||
|
||||
|
|
@ -110,6 +113,10 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
|
|||
init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
|
||||
}
|
||||
|
||||
init->InitFlags = 0;
|
||||
init->MaxIoCommands = cpu_to_le32(dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB);
|
||||
init->MaxIoSize = cpu_to_le32(dev->scsi_host_ptr->max_sectors << 9);
|
||||
init->MaxFibSize = cpu_to_le32(dev->max_fib_size);
|
||||
|
||||
/*
|
||||
* Increment the base address by the amount already used
|
||||
|
|
@ -152,8 +159,8 @@ static void aac_queue_init(struct aac_dev * dev, struct aac_queue * q, u32 *mem,
|
|||
init_waitqueue_head(&q->qfull);
|
||||
spin_lock_init(&q->lockdata);
|
||||
q->lock = &q->lockdata;
|
||||
q->headers.producer = mem;
|
||||
q->headers.consumer = mem+1;
|
||||
q->headers.producer = (__le32 *)mem;
|
||||
q->headers.consumer = (__le32 *)(mem+1);
|
||||
*(q->headers.producer) = cpu_to_le32(qsize);
|
||||
*(q->headers.consumer) = cpu_to_le32(qsize);
|
||||
q->entries = qsize;
|
||||
|
|
@ -173,6 +180,8 @@ int aac_send_shutdown(struct aac_dev * dev)
|
|||
int status;
|
||||
|
||||
fibctx = fib_alloc(dev);
|
||||
if (!fibctx)
|
||||
return -ENOMEM;
|
||||
fib_init(fibctx);
|
||||
|
||||
cmd = (struct aac_close *) fib_data(fibctx);
|
||||
|
|
@ -204,7 +213,7 @@ int aac_send_shutdown(struct aac_dev * dev)
|
|||
* 0 - If there were errors initing. This is a fatal error.
|
||||
*/
|
||||
|
||||
int aac_comm_init(struct aac_dev * dev)
|
||||
static int aac_comm_init(struct aac_dev * dev)
|
||||
{
|
||||
unsigned long hdrsize = (sizeof(u32) * NUMBER_OF_COMM_QUEUES) * 2;
|
||||
unsigned long queuesize = sizeof(struct aac_entry) * TOTAL_QUEUE_ENTRIES;
|
||||
|
|
@ -293,6 +302,79 @@ int aac_comm_init(struct aac_dev * dev)
|
|||
|
||||
struct aac_dev *aac_init_adapter(struct aac_dev *dev)
|
||||
{
|
||||
u32 status[5];
|
||||
struct Scsi_Host * host = dev->scsi_host_ptr;
|
||||
|
||||
/*
|
||||
* Check the preferred comm settings, defaults from template.
|
||||
*/
|
||||
dev->max_fib_size = sizeof(struct hw_fib);
|
||||
dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
|
||||
- sizeof(struct aac_fibhdr)
|
||||
- sizeof(struct aac_write) + sizeof(struct sgmap))
|
||||
/ sizeof(struct sgmap);
|
||||
if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS,
|
||||
0, 0, 0, 0, 0, 0,
|
||||
status+0, status+1, status+2, status+3, status+4))
|
||||
&& (status[0] == 0x00000001)) {
|
||||
/*
|
||||
* status[1] >> 16 maximum command size in KB
|
||||
* status[1] & 0xFFFF maximum FIB size
|
||||
* status[2] >> 16 maximum SG elements to driver
|
||||
* status[2] & 0xFFFF maximum SG elements from driver
|
||||
* status[3] & 0xFFFF maximum number FIBs outstanding
|
||||
*/
|
||||
host->max_sectors = (status[1] >> 16) << 1;
|
||||
dev->max_fib_size = status[1] & 0xFFFF;
|
||||
host->sg_tablesize = status[2] >> 16;
|
||||
dev->sg_tablesize = status[2] & 0xFFFF;
|
||||
host->can_queue = (status[3] & 0xFFFF) - AAC_NUM_MGT_FIB;
|
||||
/*
|
||||
* NOTE:
|
||||
* All these overrides are based on a fixed internal
|
||||
* knowledge and understanding of existing adapters,
|
||||
* acbsize should be set with caution.
|
||||
*/
|
||||
if (acbsize == 512) {
|
||||
host->max_sectors = AAC_MAX_32BIT_SGBCOUNT;
|
||||
dev->max_fib_size = 512;
|
||||
dev->sg_tablesize = host->sg_tablesize
|
||||
= (512 - sizeof(struct aac_fibhdr)
|
||||
- sizeof(struct aac_write) + sizeof(struct sgmap))
|
||||
/ sizeof(struct sgmap);
|
||||
host->can_queue = AAC_NUM_IO_FIB;
|
||||
} else if (acbsize == 2048) {
|
||||
host->max_sectors = 512;
|
||||
dev->max_fib_size = 2048;
|
||||
host->sg_tablesize = 65;
|
||||
dev->sg_tablesize = 81;
|
||||
host->can_queue = 512 - AAC_NUM_MGT_FIB;
|
||||
} else if (acbsize == 4096) {
|
||||
host->max_sectors = 1024;
|
||||
dev->max_fib_size = 4096;
|
||||
host->sg_tablesize = 129;
|
||||
dev->sg_tablesize = 166;
|
||||
host->can_queue = 256 - AAC_NUM_MGT_FIB;
|
||||
} else if (acbsize == 8192) {
|
||||
host->max_sectors = 2048;
|
||||
dev->max_fib_size = 8192;
|
||||
host->sg_tablesize = 257;
|
||||
dev->sg_tablesize = 337;
|
||||
host->can_queue = 128 - AAC_NUM_MGT_FIB;
|
||||
} else if (acbsize > 0) {
|
||||
printk("Illegal acbsize=%d ignored\n", acbsize);
|
||||
}
|
||||
}
|
||||
{
|
||||
|
||||
if (numacb > 0) {
|
||||
if (numacb < host->can_queue)
|
||||
host->can_queue = numacb;
|
||||
else
|
||||
printk("numacb=%d ignored\n", numacb);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Ok now init the communication subsystem
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@
|
|||
* commsup.c
|
||||
*
|
||||
* Abstract: Contain all routines that are required for FSA host/adapter
|
||||
* commuication.
|
||||
* communication.
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
@ -38,6 +38,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
||||
#include "aacraid.h"
|
||||
|
|
@ -52,7 +53,13 @@
|
|||
|
||||
static int fib_map_alloc(struct aac_dev *dev)
|
||||
{
|
||||
if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, sizeof(struct hw_fib) * AAC_NUM_FIB, &dev->hw_fib_pa))==NULL)
|
||||
dprintk((KERN_INFO
|
||||
"allocate hardware fibs pci_alloc_consistent(%p, %d * (%d + %d), %p)\n",
|
||||
dev->pdev, dev->max_fib_size, dev->scsi_host_ptr->can_queue,
|
||||
AAC_NUM_MGT_FIB, &dev->hw_fib_pa));
|
||||
if((dev->hw_fib_va = pci_alloc_consistent(dev->pdev, dev->max_fib_size
|
||||
* (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB),
|
||||
&dev->hw_fib_pa))==NULL)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -67,7 +74,7 @@ static int fib_map_alloc(struct aac_dev *dev)
|
|||
|
||||
void fib_map_free(struct aac_dev *dev)
|
||||
{
|
||||
pci_free_consistent(dev->pdev, sizeof(struct hw_fib) * AAC_NUM_FIB, dev->hw_fib_va, dev->hw_fib_pa);
|
||||
pci_free_consistent(dev->pdev, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB), dev->hw_fib_va, dev->hw_fib_pa);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -84,17 +91,22 @@ int fib_setup(struct aac_dev * dev)
|
|||
struct hw_fib *hw_fib_va;
|
||||
dma_addr_t hw_fib_pa;
|
||||
int i;
|
||||
|
||||
if(fib_map_alloc(dev)<0)
|
||||
|
||||
while (((i = fib_map_alloc(dev)) == -ENOMEM)
|
||||
&& (dev->scsi_host_ptr->can_queue > (64 - AAC_NUM_MGT_FIB))) {
|
||||
dev->init->MaxIoCommands = cpu_to_le32((dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB) >> 1);
|
||||
dev->scsi_host_ptr->can_queue = le32_to_cpu(dev->init->MaxIoCommands) - AAC_NUM_MGT_FIB;
|
||||
}
|
||||
if (i<0)
|
||||
return -ENOMEM;
|
||||
|
||||
hw_fib_va = dev->hw_fib_va;
|
||||
hw_fib_pa = dev->hw_fib_pa;
|
||||
memset(hw_fib_va, 0, sizeof(struct hw_fib) * AAC_NUM_FIB);
|
||||
memset(hw_fib_va, 0, dev->max_fib_size * (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB));
|
||||
/*
|
||||
* Initialise the fibs
|
||||
*/
|
||||
for (i = 0, fibptr = &dev->fibs[i]; i < AAC_NUM_FIB; i++, fibptr++)
|
||||
for (i = 0, fibptr = &dev->fibs[i]; i < (dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB); i++, fibptr++)
|
||||
{
|
||||
fibptr->dev = dev;
|
||||
fibptr->hw_fib = hw_fib_va;
|
||||
|
|
@ -102,16 +114,16 @@ int fib_setup(struct aac_dev * dev)
|
|||
fibptr->next = fibptr+1; /* Forward chain the fibs */
|
||||
init_MUTEX_LOCKED(&fibptr->event_wait);
|
||||
spin_lock_init(&fibptr->event_lock);
|
||||
hw_fib_va->header.XferState = 0xffffffff;
|
||||
hw_fib_va->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib));
|
||||
hw_fib_va->header.XferState = cpu_to_le32(0xffffffff);
|
||||
hw_fib_va->header.SenderSize = cpu_to_le16(dev->max_fib_size);
|
||||
fibptr->hw_fib_pa = hw_fib_pa;
|
||||
hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + sizeof(struct hw_fib));
|
||||
hw_fib_pa = hw_fib_pa + sizeof(struct hw_fib);
|
||||
hw_fib_va = (struct hw_fib *)((unsigned char *)hw_fib_va + dev->max_fib_size);
|
||||
hw_fib_pa = hw_fib_pa + dev->max_fib_size;
|
||||
}
|
||||
/*
|
||||
* Add the fib chain to the free list
|
||||
*/
|
||||
dev->fibs[AAC_NUM_FIB-1].next = NULL;
|
||||
dev->fibs[dev->scsi_host_ptr->can_queue + AAC_NUM_MGT_FIB - 1].next = NULL;
|
||||
/*
|
||||
* Enable this to debug out of queue space
|
||||
*/
|
||||
|
|
@ -124,7 +136,7 @@ int fib_setup(struct aac_dev * dev)
|
|||
* @dev: Adapter to allocate the fib for
|
||||
*
|
||||
* Allocate a fib from the adapter fib pool. If the pool is empty we
|
||||
* wait for fibs to become free.
|
||||
* return NULL.
|
||||
*/
|
||||
|
||||
struct fib * fib_alloc(struct aac_dev *dev)
|
||||
|
|
@ -133,10 +145,10 @@ struct fib * fib_alloc(struct aac_dev *dev)
|
|||
unsigned long flags;
|
||||
spin_lock_irqsave(&dev->fib_lock, flags);
|
||||
fibptr = dev->free_fib;
|
||||
/* Cannot sleep here or you get hangs. Instead we did the
|
||||
maths at compile time. */
|
||||
if(!fibptr)
|
||||
BUG();
|
||||
if(!fibptr){
|
||||
spin_unlock_irqrestore(&dev->fib_lock, flags);
|
||||
return fibptr;
|
||||
}
|
||||
dev->free_fib = fibptr->next;
|
||||
spin_unlock_irqrestore(&dev->fib_lock, flags);
|
||||
/*
|
||||
|
|
@ -196,11 +208,11 @@ void fib_init(struct fib *fibptr)
|
|||
struct hw_fib *hw_fib = fibptr->hw_fib;
|
||||
|
||||
hw_fib->header.StructType = FIB_MAGIC;
|
||||
hw_fib->header.Size = cpu_to_le16(sizeof(struct hw_fib));
|
||||
hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable);
|
||||
hw_fib->header.Size = cpu_to_le16(fibptr->dev->max_fib_size);
|
||||
hw_fib->header.XferState = cpu_to_le32(HostOwned | FibInitialized | FibEmpty | FastResponseCapable);
|
||||
hw_fib->header.SenderFibAddress = cpu_to_le32(fibptr->hw_fib_pa);
|
||||
hw_fib->header.ReceiverFibAddress = cpu_to_le32(fibptr->hw_fib_pa);
|
||||
hw_fib->header.SenderSize = cpu_to_le16(sizeof(struct hw_fib));
|
||||
hw_fib->header.SenderSize = cpu_to_le16(fibptr->dev->max_fib_size);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -211,7 +223,7 @@ void fib_init(struct fib *fibptr)
|
|||
* caller.
|
||||
*/
|
||||
|
||||
void fib_dealloc(struct fib * fibptr)
|
||||
static void fib_dealloc(struct fib * fibptr)
|
||||
{
|
||||
struct hw_fib *hw_fib = fibptr->hw_fib;
|
||||
if(hw_fib->header.StructType != FIB_MAGIC)
|
||||
|
|
@ -279,7 +291,7 @@ static int aac_get_entry (struct aac_dev * dev, u32 qid, struct aac_entry **entr
|
|||
}
|
||||
|
||||
if ((*index + 1) == le32_to_cpu(*(q->headers.consumer))) { /* Queue is full */
|
||||
printk(KERN_WARNING "Queue %d full, %d outstanding.\n",
|
||||
printk(KERN_WARNING "Queue %d full, %u outstanding.\n",
|
||||
qid, q->numpending);
|
||||
return 0;
|
||||
} else {
|
||||
|
|
@ -658,9 +670,8 @@ int fib_adapter_complete(struct fib * fibptr, unsigned short size)
|
|||
}
|
||||
if (aac_insert_entry(dev, index, AdapHighRespQueue, (nointr & (int)aac_config.irq_mod)) != 0) {
|
||||
}
|
||||
}
|
||||
else if (hw_fib->header.XferState & NormalPriority)
|
||||
{
|
||||
} else if (hw_fib->header.XferState &
|
||||
cpu_to_le32(NormalPriority)) {
|
||||
u32 index;
|
||||
|
||||
if (size) {
|
||||
|
|
@ -744,22 +755,25 @@ int fib_complete(struct fib * fibptr)
|
|||
|
||||
void aac_printf(struct aac_dev *dev, u32 val)
|
||||
{
|
||||
int length = val & 0xffff;
|
||||
int level = (val >> 16) & 0xffff;
|
||||
char *cp = dev->printfbuf;
|
||||
|
||||
/*
|
||||
* The size of the printfbuf is set in port.c
|
||||
* There is no variable or define for it
|
||||
*/
|
||||
if (length > 255)
|
||||
length = 255;
|
||||
if (cp[length] != 0)
|
||||
cp[length] = 0;
|
||||
if (level == LOG_AAC_HIGH_ERROR)
|
||||
printk(KERN_WARNING "aacraid:%s", cp);
|
||||
else
|
||||
printk(KERN_INFO "aacraid:%s", cp);
|
||||
if (dev->printf_enabled)
|
||||
{
|
||||
int length = val & 0xffff;
|
||||
int level = (val >> 16) & 0xffff;
|
||||
|
||||
/*
|
||||
* The size of the printfbuf is set in port.c
|
||||
* There is no variable or define for it
|
||||
*/
|
||||
if (length > 255)
|
||||
length = 255;
|
||||
if (cp[length] != 0)
|
||||
cp[length] = 0;
|
||||
if (level == LOG_AAC_HIGH_ERROR)
|
||||
printk(KERN_WARNING "aacraid:%s", cp);
|
||||
else
|
||||
printk(KERN_INFO "aacraid:%s", cp);
|
||||
}
|
||||
memset(cp, 0, 256);
|
||||
}
|
||||
|
||||
|
|
@ -832,8 +846,8 @@ int aac_command_thread(struct aac_dev * dev)
|
|||
aifcmd = (struct aac_aifcmd *) hw_fib->data;
|
||||
if (aifcmd->command == cpu_to_le32(AifCmdDriverNotify)) {
|
||||
/* Handle Driver Notify Events */
|
||||
*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
fib_adapter_complete(fib, sizeof(u32));
|
||||
*(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
fib_adapter_complete(fib, (u16)sizeof(u32));
|
||||
} else {
|
||||
struct list_head *entry;
|
||||
/* The u32 here is important and intended. We are using
|
||||
|
|
@ -916,7 +930,7 @@ int aac_command_thread(struct aac_dev * dev)
|
|||
/*
|
||||
* Set the status of this FIB
|
||||
*/
|
||||
*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
*(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
fib_adapter_complete(fib, sizeof(u32));
|
||||
spin_unlock_irqrestore(&dev->fib_lock, flagv);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -99,7 +99,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
|
|||
/*
|
||||
* Doctor the fib
|
||||
*/
|
||||
*(u32 *)hwfib->data = cpu_to_le32(ST_OK);
|
||||
*(__le32 *)hwfib->data = cpu_to_le32(ST_OK);
|
||||
hwfib->header.XferState |= cpu_to_le32(AdapterProcessed);
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ unsigned int aac_response_normal(struct aac_queue * q)
|
|||
|
||||
if (hwfib->header.Command == cpu_to_le16(NuFileSystem))
|
||||
{
|
||||
u32 *pstatus = (u32 *)hwfib->data;
|
||||
__le32 *pstatus = (__le32 *)hwfib->data;
|
||||
if (*pstatus & cpu_to_le32(0xffff0000))
|
||||
*pstatus = cpu_to_le32(ST_OK);
|
||||
}
|
||||
|
|
@ -205,7 +205,7 @@ unsigned int aac_command_normal(struct aac_queue *q)
|
|||
/*
|
||||
* Set the status of this FIB
|
||||
*/
|
||||
*(u32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
*(__le32 *)hw_fib->data = cpu_to_le32(ST_OK);
|
||||
fib_adapter_complete(fib, sizeof(u32));
|
||||
spin_lock_irqsave(q->lock, flags);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -215,7 +215,7 @@ static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd
|
|||
* Returns a static string describing the device in question
|
||||
*/
|
||||
|
||||
const char *aac_info(struct Scsi_Host *shost)
|
||||
static const char *aac_info(struct Scsi_Host *shost)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev *)shost->hostdata;
|
||||
return aac_drivers[dev->cardtype].name;
|
||||
|
|
@ -288,7 +288,7 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
|
|||
* translations ( 64/32, 128/32, 255/63 ).
|
||||
*/
|
||||
buf = scsi_bios_ptable(bdev);
|
||||
if(*(unsigned short *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
|
||||
if(*(__le16 *)(buf + 0x40) == cpu_to_le16(0xaa55)) {
|
||||
struct partition *first = (struct partition * )buf;
|
||||
struct partition *entry = first;
|
||||
int saved_cylinders = param->cylinders;
|
||||
|
|
@ -347,10 +347,16 @@ static int aac_biosparm(struct scsi_device *sdev, struct block_device *bdev,
|
|||
|
||||
static int aac_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
|
||||
if (sdev->tagged_supported)
|
||||
scsi_adjust_queue_depth(sdev, MSG_ORDERED_TAG, 128);
|
||||
else
|
||||
scsi_adjust_queue_depth(sdev, 0, 1);
|
||||
|
||||
if (host->max_sectors < AAC_MAX_32BIT_SGBCOUNT)
|
||||
blk_queue_max_segment_size(sdev->request_queue, 65536);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -360,14 +366,6 @@ static int aac_ioctl(struct scsi_device *sdev, int cmd, void __user * arg)
|
|||
return aac_do_ioctl(dev, cmd, arg);
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX: does aac really need no error handling??
|
||||
*/
|
||||
static int aac_eh_abort(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
* aac_eh_reset - Reset command handling
|
||||
* @scsi_cmd: SCSI command block causing the reset
|
||||
|
|
@ -386,10 +384,13 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
|
|||
AAC_DRIVERNAME);
|
||||
|
||||
|
||||
spin_lock_irq(host->host_lock);
|
||||
|
||||
aac = (struct aac_dev *)host->hostdata;
|
||||
if (aac_adapter_check_health(aac)) {
|
||||
printk(KERN_ERR "%s: Host adapter appears dead\n",
|
||||
AAC_DRIVERNAME);
|
||||
spin_unlock_irq(host->host_lock);
|
||||
return -ENODEV;
|
||||
}
|
||||
/*
|
||||
|
|
@ -420,6 +421,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
|
|||
ssleep(1);
|
||||
spin_lock_irq(host->host_lock);
|
||||
}
|
||||
spin_unlock_irq(host->host_lock);
|
||||
printk(KERN_ERR "%s: SCSI bus appears hung\n", AAC_DRIVERNAME);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
|
@ -439,11 +441,11 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
|
|||
static int aac_cfg_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct aac_dev *aac;
|
||||
unsigned minor = iminor(inode);
|
||||
unsigned minor_number = iminor(inode);
|
||||
int err = -ENODEV;
|
||||
|
||||
list_for_each_entry(aac, &aac_devices, entry) {
|
||||
if (aac->id == minor) {
|
||||
if (aac->id == minor_number) {
|
||||
file->private_data = aac;
|
||||
err = 0;
|
||||
break;
|
||||
|
|
@ -489,6 +491,7 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long
|
|||
case FSACTL_DELETE_DISK:
|
||||
case FSACTL_FORCE_DELETE_DISK:
|
||||
case FSACTL_GET_CONTAINERS:
|
||||
case FSACTL_SEND_LARGE_FIB:
|
||||
ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
|
||||
break;
|
||||
|
||||
|
|
@ -526,6 +529,134 @@ static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long
|
|||
}
|
||||
#endif
|
||||
|
||||
static ssize_t aac_show_model(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len;
|
||||
|
||||
len = snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
aac_drivers[dev->cardtype].model);
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_vendor(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len;
|
||||
|
||||
len = snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
aac_drivers[dev->cardtype].vname);
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_kernel_version(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len, tmp;
|
||||
|
||||
tmp = le32_to_cpu(dev->adapter_info.kernelrev);
|
||||
len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
|
||||
tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
|
||||
le32_to_cpu(dev->adapter_info.kernelbuild));
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_monitor_version(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len, tmp;
|
||||
|
||||
tmp = le32_to_cpu(dev->adapter_info.monitorrev);
|
||||
len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
|
||||
tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
|
||||
le32_to_cpu(dev->adapter_info.monitorbuild));
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_bios_version(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len, tmp;
|
||||
|
||||
tmp = le32_to_cpu(dev->adapter_info.biosrev);
|
||||
len = snprintf(buf, PAGE_SIZE, "%d.%d-%d[%d]\n",
|
||||
tmp >> 24, (tmp >> 16) & 0xff, tmp & 0xff,
|
||||
le32_to_cpu(dev->adapter_info.biosbuild));
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_serial_number(struct class_device *class_dev,
|
||||
char *buf)
|
||||
{
|
||||
struct aac_dev *dev = (struct aac_dev*)class_to_shost(class_dev)->hostdata;
|
||||
int len = 0;
|
||||
|
||||
if (le32_to_cpu(dev->adapter_info.serial[0]) != 0xBAD0)
|
||||
len = snprintf(buf, PAGE_SIZE, "%x\n",
|
||||
le32_to_cpu(dev->adapter_info.serial[0]));
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
static struct class_device_attribute aac_model = {
|
||||
.attr = {
|
||||
.name = "model",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_model,
|
||||
};
|
||||
static struct class_device_attribute aac_vendor = {
|
||||
.attr = {
|
||||
.name = "vendor",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_vendor,
|
||||
};
|
||||
static struct class_device_attribute aac_kernel_version = {
|
||||
.attr = {
|
||||
.name = "hba_kernel_version",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_kernel_version,
|
||||
};
|
||||
static struct class_device_attribute aac_monitor_version = {
|
||||
.attr = {
|
||||
.name = "hba_monitor_version",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_monitor_version,
|
||||
};
|
||||
static struct class_device_attribute aac_bios_version = {
|
||||
.attr = {
|
||||
.name = "hba_bios_version",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_bios_version,
|
||||
};
|
||||
static struct class_device_attribute aac_serial_number = {
|
||||
.attr = {
|
||||
.name = "serial_number",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_serial_number,
|
||||
};
|
||||
|
||||
static struct class_device_attribute *aac_attrs[] = {
|
||||
&aac_model,
|
||||
&aac_vendor,
|
||||
&aac_kernel_version,
|
||||
&aac_monitor_version,
|
||||
&aac_bios_version,
|
||||
&aac_serial_number,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
static struct file_operations aac_cfg_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.ioctl = aac_cfg_ioctl,
|
||||
|
|
@ -538,7 +669,7 @@ static struct file_operations aac_cfg_fops = {
|
|||
static struct scsi_host_template aac_driver_template = {
|
||||
.module = THIS_MODULE,
|
||||
.name = "AAC",
|
||||
.proc_name = "aacraid",
|
||||
.proc_name = AAC_DRIVERNAME,
|
||||
.info = aac_info,
|
||||
.ioctl = aac_ioctl,
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
|
@ -546,8 +677,8 @@ static struct scsi_host_template aac_driver_template = {
|
|||
#endif
|
||||
.queuecommand = aac_queuecommand,
|
||||
.bios_param = aac_biosparm,
|
||||
.shost_attrs = aac_attrs,
|
||||
.slave_configure = aac_slave_configure,
|
||||
.eh_abort_handler = aac_eh_abort,
|
||||
.eh_host_reset_handler = aac_eh_reset,
|
||||
.can_queue = AAC_NUM_IO_FIB,
|
||||
.this_id = 16,
|
||||
|
|
@ -612,7 +743,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
|
|||
aac->cardtype = index;
|
||||
INIT_LIST_HEAD(&aac->entry);
|
||||
|
||||
aac->fibs = kmalloc(sizeof(struct fib) * AAC_NUM_FIB, GFP_KERNEL);
|
||||
aac->fibs = kmalloc(sizeof(struct fib) * (shost->can_queue + AAC_NUM_MGT_FIB), GFP_KERNEL);
|
||||
if (!aac->fibs)
|
||||
goto out_free_host;
|
||||
spin_lock_init(&aac->fib_lock);
|
||||
|
|
@ -632,6 +763,24 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
|
|||
aac_get_adapter_info(aac);
|
||||
|
||||
/*
|
||||
* Lets override negotiations and drop the maximum SG limit to 34
|
||||
*/
|
||||
if ((aac_drivers[index].quirks & AAC_QUIRK_34SG) &&
|
||||
(aac->scsi_host_ptr->sg_tablesize > 34)) {
|
||||
aac->scsi_host_ptr->sg_tablesize = 34;
|
||||
aac->scsi_host_ptr->max_sectors
|
||||
= (aac->scsi_host_ptr->sg_tablesize * 8) + 112;
|
||||
}
|
||||
|
||||
/*
|
||||
* Firware printf works only with older firmware.
|
||||
*/
|
||||
if (aac_drivers[index].quirks & AAC_QUIRK_34SG)
|
||||
aac->printf_enabled = 1;
|
||||
else
|
||||
aac->printf_enabled = 0;
|
||||
|
||||
/*
|
||||
* max channel will be the physical channels plus 1 virtual channel
|
||||
* all containers are on the virtual channel 0
|
||||
* physical channels are address by their actual physical number+1
|
||||
|
|
|
|||
|
|
@ -98,7 +98,9 @@ static irqreturn_t aac_rkt_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
* for its completion.
|
||||
*/
|
||||
|
||||
static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
||||
static int rkt_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
|
||||
u32 *status, u32 *r1, u32 *r2, u32 *r3, u32 *r4)
|
||||
{
|
||||
unsigned long start;
|
||||
int ok;
|
||||
|
|
@ -107,12 +109,12 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
*/
|
||||
rkt_writel(dev, InboundMailbox0, command);
|
||||
/*
|
||||
* Write the parameters into Mailboxes 1 - 4
|
||||
* Write the parameters into Mailboxes 1 - 6
|
||||
*/
|
||||
rkt_writel(dev, InboundMailbox1, p1);
|
||||
rkt_writel(dev, InboundMailbox2, 0);
|
||||
rkt_writel(dev, InboundMailbox3, 0);
|
||||
rkt_writel(dev, InboundMailbox4, 0);
|
||||
rkt_writel(dev, InboundMailbox2, p2);
|
||||
rkt_writel(dev, InboundMailbox3, p3);
|
||||
rkt_writel(dev, InboundMailbox4, p4);
|
||||
/*
|
||||
* Clear the synch command doorbell to start on a clean slate.
|
||||
*/
|
||||
|
|
@ -169,6 +171,14 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
*/
|
||||
if (status)
|
||||
*status = rkt_readl(dev, IndexRegs.Mailbox[0]);
|
||||
if (r1)
|
||||
*r1 = rkt_readl(dev, IndexRegs.Mailbox[1]);
|
||||
if (r2)
|
||||
*r2 = rkt_readl(dev, IndexRegs.Mailbox[2]);
|
||||
if (r3)
|
||||
*r3 = rkt_readl(dev, IndexRegs.Mailbox[3]);
|
||||
if (r4)
|
||||
*r4 = rkt_readl(dev, IndexRegs.Mailbox[4]);
|
||||
/*
|
||||
* Clear the synch command doorbell.
|
||||
*/
|
||||
|
|
@ -190,8 +200,8 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
|
||||
static void aac_rkt_interrupt_adapter(struct aac_dev *dev)
|
||||
{
|
||||
u32 ret;
|
||||
rkt_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
|
||||
rkt_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -220,7 +230,8 @@ static void aac_rkt_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
rkt_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3);
|
||||
break;
|
||||
case HostShutdown:
|
||||
// rkt_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, &ret);
|
||||
// rkt_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
|
||||
// NULL, NULL, NULL, NULL, NULL);
|
||||
break;
|
||||
case FastIo:
|
||||
rkt_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6);
|
||||
|
|
@ -243,16 +254,10 @@ static void aac_rkt_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
|
||||
static void aac_rkt_start_adapter(struct aac_dev *dev)
|
||||
{
|
||||
u32 status;
|
||||
struct aac_init *init;
|
||||
|
||||
init = dev->init;
|
||||
init->HostElapsedSeconds = cpu_to_le32(get_seconds());
|
||||
/*
|
||||
* Tell the adapter we are back and up and running so it will scan
|
||||
* its command queues and enable our interrupts
|
||||
*/
|
||||
dev->irq_mask = (DoorBellPrintfReady | OUTBOUNDDOORBELL_1 | OUTBOUNDDOORBELL_2 | OUTBOUNDDOORBELL_3 | OUTBOUNDDOORBELL_4);
|
||||
/*
|
||||
* First clear out all interrupts. Then enable the one's that we
|
||||
* can handle.
|
||||
|
|
@ -263,7 +268,8 @@ static void aac_rkt_start_adapter(struct aac_dev *dev)
|
|||
rkt_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
|
||||
|
||||
// We can only use a 32 bit address here
|
||||
rkt_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &status);
|
||||
rkt_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
|
||||
0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -288,8 +294,8 @@ static int aac_rkt_check_health(struct aac_dev *dev)
|
|||
if (status & KERNEL_PANIC) {
|
||||
char * buffer;
|
||||
struct POSTSTATUS {
|
||||
u32 Post_Command;
|
||||
u32 Post_Address;
|
||||
__le32 Post_Command;
|
||||
__le32 Post_Address;
|
||||
} * post;
|
||||
dma_addr_t paddr, baddr;
|
||||
int ret;
|
||||
|
|
@ -310,7 +316,8 @@ static int aac_rkt_check_health(struct aac_dev *dev)
|
|||
post->Post_Command = cpu_to_le32(COMMAND_POST_RESULTS);
|
||||
post->Post_Address = cpu_to_le32(baddr);
|
||||
rkt_writel(dev, MUnit.IMRx[0], paddr);
|
||||
rkt_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, &status);
|
||||
rkt_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, 0, 0, 0, 0, 0,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
|
||||
post, paddr);
|
||||
if ((buffer[0] == '0') && (buffer[1] == 'x')) {
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ static irqreturn_t aac_rx_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
{
|
||||
bellbits = rx_readl(dev, OutboundDoorbellReg);
|
||||
if (bellbits & DoorBellPrintfReady) {
|
||||
aac_printf(dev, le32_to_cpu(rx_readl (dev, IndexRegs.Mailbox[5])));
|
||||
aac_printf(dev, rx_readl(dev, IndexRegs.Mailbox[5]));
|
||||
rx_writel(dev, MUnit.ODR,DoorBellPrintfReady);
|
||||
rx_writel(dev, InboundDoorbellReg,DoorBellPrintfDone);
|
||||
}
|
||||
|
|
@ -98,7 +98,9 @@ static irqreturn_t aac_rx_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
* for its completion.
|
||||
*/
|
||||
|
||||
static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
||||
static int rx_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
|
||||
u32 *status, u32 * r1, u32 * r2, u32 * r3, u32 * r4)
|
||||
{
|
||||
unsigned long start;
|
||||
int ok;
|
||||
|
|
@ -107,12 +109,12 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
*/
|
||||
rx_writel(dev, InboundMailbox0, command);
|
||||
/*
|
||||
* Write the parameters into Mailboxes 1 - 4
|
||||
* Write the parameters into Mailboxes 1 - 6
|
||||
*/
|
||||
rx_writel(dev, InboundMailbox1, p1);
|
||||
rx_writel(dev, InboundMailbox2, 0);
|
||||
rx_writel(dev, InboundMailbox3, 0);
|
||||
rx_writel(dev, InboundMailbox4, 0);
|
||||
rx_writel(dev, InboundMailbox2, p2);
|
||||
rx_writel(dev, InboundMailbox3, p3);
|
||||
rx_writel(dev, InboundMailbox4, p4);
|
||||
/*
|
||||
* Clear the synch command doorbell to start on a clean slate.
|
||||
*/
|
||||
|
|
@ -120,7 +122,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
/*
|
||||
* Disable doorbell interrupts
|
||||
*/
|
||||
rx_writeb(dev, MUnit.OIMR, dev->OIMR |= 0x04);
|
||||
rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xff);
|
||||
/*
|
||||
* Force the completion of the mask register write before issuing
|
||||
* the interrupt.
|
||||
|
|
@ -169,6 +171,14 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
*/
|
||||
if (status)
|
||||
*status = rx_readl(dev, IndexRegs.Mailbox[0]);
|
||||
if (r1)
|
||||
*r1 = rx_readl(dev, IndexRegs.Mailbox[1]);
|
||||
if (r2)
|
||||
*r2 = rx_readl(dev, IndexRegs.Mailbox[2]);
|
||||
if (r3)
|
||||
*r3 = rx_readl(dev, IndexRegs.Mailbox[3]);
|
||||
if (r4)
|
||||
*r4 = rx_readl(dev, IndexRegs.Mailbox[4]);
|
||||
/*
|
||||
* Clear the synch command doorbell.
|
||||
*/
|
||||
|
|
@ -190,8 +200,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *status)
|
|||
|
||||
static void aac_rx_interrupt_adapter(struct aac_dev *dev)
|
||||
{
|
||||
u32 ret;
|
||||
rx_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
|
||||
rx_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -220,7 +229,8 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_3);
|
||||
break;
|
||||
case HostShutdown:
|
||||
// rx_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, &ret);
|
||||
// rx_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
|
||||
// NULL, NULL, NULL, NULL, NULL);
|
||||
break;
|
||||
case FastIo:
|
||||
rx_writel(dev, MUnit.IDR,INBOUNDDOORBELL_6);
|
||||
|
|
@ -243,16 +253,10 @@ static void aac_rx_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
|
||||
static void aac_rx_start_adapter(struct aac_dev *dev)
|
||||
{
|
||||
u32 status;
|
||||
struct aac_init *init;
|
||||
|
||||
init = dev->init;
|
||||
init->HostElapsedSeconds = cpu_to_le32(get_seconds());
|
||||
/*
|
||||
* Tell the adapter we are back and up and running so it will scan
|
||||
* its command queues and enable our interrupts
|
||||
*/
|
||||
dev->irq_mask = (DoorBellPrintfReady | OUTBOUNDDOORBELL_1 | OUTBOUNDDOORBELL_2 | OUTBOUNDDOORBELL_3 | OUTBOUNDDOORBELL_4);
|
||||
/*
|
||||
* First clear out all interrupts. Then enable the one's that we
|
||||
* can handle.
|
||||
|
|
@ -263,7 +267,8 @@ static void aac_rx_start_adapter(struct aac_dev *dev)
|
|||
rx_writeb(dev, MUnit.OIMR, dev->OIMR = 0xfb);
|
||||
|
||||
// We can only use a 32 bit address here
|
||||
rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &status);
|
||||
rx_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa,
|
||||
0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -288,8 +293,8 @@ static int aac_rx_check_health(struct aac_dev *dev)
|
|||
if (status & KERNEL_PANIC) {
|
||||
char * buffer;
|
||||
struct POSTSTATUS {
|
||||
u32 Post_Command;
|
||||
u32 Post_Address;
|
||||
__le32 Post_Command;
|
||||
__le32 Post_Address;
|
||||
} * post;
|
||||
dma_addr_t paddr, baddr;
|
||||
int ret;
|
||||
|
|
@ -310,7 +315,8 @@ static int aac_rx_check_health(struct aac_dev *dev)
|
|||
post->Post_Command = cpu_to_le32(COMMAND_POST_RESULTS);
|
||||
post->Post_Address = cpu_to_le32(baddr);
|
||||
rx_writel(dev, MUnit.IMRx[0], paddr);
|
||||
rx_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, &status);
|
||||
rx_sync_cmd(dev, COMMAND_POST_RESULTS, baddr, 0, 0, 0, 0, 0,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
|
||||
post, paddr);
|
||||
if ((buffer[0] == '0') && (buffer[1] == 'x')) {
|
||||
|
|
|
|||
|
|
@ -89,7 +89,7 @@ static irqreturn_t aac_sa_intr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
* Notify the adapter of an event
|
||||
*/
|
||||
|
||||
void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
|
||||
static void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
|
||||
{
|
||||
switch (event) {
|
||||
|
||||
|
|
@ -106,7 +106,10 @@ void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
sa_writew(dev, DoorbellReg_s,DOORBELL_3);
|
||||
break;
|
||||
case HostShutdown:
|
||||
//sa_sync_cmd(dev, HOST_CRASHING, 0, &ret);
|
||||
/*
|
||||
sa_sync_cmd(dev, HOST_CRASHING, 0, 0, 0, 0, 0, 0,
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
*/
|
||||
break;
|
||||
case FastIo:
|
||||
sa_writew(dev, DoorbellReg_s,DOORBELL_6);
|
||||
|
|
@ -132,7 +135,9 @@ void aac_sa_notify_adapter(struct aac_dev *dev, u32 event)
|
|||
* for its completion.
|
||||
*/
|
||||
|
||||
static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
|
||||
static int sa_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
u32 p1, u32 p2, u32 p3, u32 p4, u32 p5, u32 p6,
|
||||
u32 *ret, u32 *r1, u32 *r2, u32 *r3, u32 *r4)
|
||||
{
|
||||
unsigned long start;
|
||||
int ok;
|
||||
|
|
@ -144,9 +149,10 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
|
|||
* Write the parameters into Mailboxes 1 - 4
|
||||
*/
|
||||
sa_writel(dev, Mailbox1, p1);
|
||||
sa_writel(dev, Mailbox2, 0);
|
||||
sa_writel(dev, Mailbox3, 0);
|
||||
sa_writel(dev, Mailbox4, 0);
|
||||
sa_writel(dev, Mailbox2, p2);
|
||||
sa_writel(dev, Mailbox3, p3);
|
||||
sa_writel(dev, Mailbox4, p4);
|
||||
|
||||
/*
|
||||
* Clear the synch command doorbell to start on a clean slate.
|
||||
*/
|
||||
|
|
@ -188,6 +194,14 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
|
|||
*/
|
||||
if (ret)
|
||||
*ret = sa_readl(dev, Mailbox0);
|
||||
if (r1)
|
||||
*r1 = sa_readl(dev, Mailbox1);
|
||||
if (r2)
|
||||
*r2 = sa_readl(dev, Mailbox2);
|
||||
if (r3)
|
||||
*r3 = sa_readl(dev, Mailbox3);
|
||||
if (r4)
|
||||
*r4 = sa_readl(dev, Mailbox4);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -201,7 +215,8 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command, u32 p1, u32 *ret)
|
|||
static void aac_sa_interrupt_adapter (struct aac_dev *dev)
|
||||
{
|
||||
u32 ret;
|
||||
sa_sync_cmd(dev, BREAKPOINT_REQUEST, 0, &ret);
|
||||
sa_sync_cmd(dev, BREAKPOINT_REQUEST, 0, 0, 0, 0, 0, 0,
|
||||
&ret, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -230,10 +245,12 @@ static void aac_sa_start_adapter(struct aac_dev *dev)
|
|||
* First clear out all interrupts. Then enable the one's that
|
||||
* we can handle.
|
||||
*/
|
||||
sa_writew(dev, SaDbCSR.PRISETIRQMASK, cpu_to_le16(0xffff));
|
||||
sa_writew(dev, SaDbCSR.PRISETIRQMASK, 0xffff);
|
||||
sa_writew(dev, SaDbCSR.PRICLEARIRQMASK, (PrintfReady | DOORBELL_1 | DOORBELL_2 | DOORBELL_3 | DOORBELL_4));
|
||||
/* We can only use a 32 bit address here */
|
||||
sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, &ret);
|
||||
sa_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS,
|
||||
(u32)(ulong)dev->init_pa, 0, 0, 0, 0, 0,
|
||||
&ret, NULL, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -1225,8 +1225,6 @@ static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
|
|||
}
|
||||
|
||||
DO_UNLOCK(flags);
|
||||
|
||||
spin_lock_irq(shpnt->host_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1348,20 +1348,6 @@ static int aha1542_restart(struct Scsi_Host *shost)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int aha1542_abort(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
|
||||
/*
|
||||
* The abort command does not leave the device in a clean state where
|
||||
* it is available to be used again. Until this gets worked out, we
|
||||
* will leave it commented out.
|
||||
*/
|
||||
|
||||
printk(KERN_ERR "aha1542.c: Unable to abort command for target %d\n",
|
||||
SCpnt->device->id);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a device reset. This is handled by sending a special command
|
||||
* to the device.
|
||||
|
|
@ -1478,8 +1464,8 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
|
|||
* check for timeout, and if we are doing something like this
|
||||
* we are pretty desperate anyways.
|
||||
*/
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
ssleep(4);
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
WAIT(STATUS(SCpnt->device->host->io_port),
|
||||
|
|
@ -1517,9 +1503,11 @@ static int aha1542_bus_reset(Scsi_Cmnd * SCpnt)
|
|||
}
|
||||
}
|
||||
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return SUCCESS;
|
||||
|
||||
fail:
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -1542,7 +1530,6 @@ static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
|
|||
* check for timeout, and if we are doing something like this
|
||||
* we are pretty desperate anyways.
|
||||
*/
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
ssleep(4);
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
|
|
@ -1586,9 +1573,11 @@ static int aha1542_host_reset(Scsi_Cmnd * SCpnt)
|
|||
}
|
||||
}
|
||||
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return SUCCESS;
|
||||
|
||||
fail:
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -1817,7 +1806,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.detect = aha1542_detect,
|
||||
.release = aha1542_release,
|
||||
.queuecommand = aha1542_queuecommand,
|
||||
.eh_abort_handler = aha1542_abort,
|
||||
.eh_device_reset_handler= aha1542_dev_reset,
|
||||
.eh_bus_reset_handler = aha1542_bus_reset,
|
||||
.eh_host_reset_handler = aha1542_host_reset,
|
||||
|
|
|
|||
|
|
@ -133,7 +133,6 @@ struct ccb { /* Command Control Block 5.3 */
|
|||
|
||||
static int aha1542_detect(Scsi_Host_Template *);
|
||||
static int aha1542_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
||||
static int aha1542_abort(Scsi_Cmnd * SCpnt);
|
||||
static int aha1542_bus_reset(Scsi_Cmnd * SCpnt);
|
||||
static int aha1542_dev_reset(Scsi_Cmnd * SCpnt);
|
||||
static int aha1542_host_reset(Scsi_Cmnd * SCpnt);
|
||||
|
|
|
|||
|
|
@ -44,109 +44,6 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/eisa.h>
|
||||
|
||||
#define EISA_MFCTR_CHAR0(ID) (char)(((ID>>26) & 0x1F) | '@') /* Bits 26-30 */
|
||||
#define EISA_MFCTR_CHAR1(ID) (char)(((ID>>21) & 0x1F) | '@') /* Bits 21-25 */
|
||||
#define EISA_MFCTR_CHAR2(ID) (char)(((ID>>16) & 0x1F) | '@') /* Bits 16-20 */
|
||||
#define EISA_PRODUCT_ID(ID) (short)((ID>>4) & 0xFFF) /* Bits 4-15 */
|
||||
#define EISA_REVISION_ID(ID) (uint8_t)(ID & 0x0F) /* Bits 0-3 */
|
||||
|
||||
static int aic7770_eisa_dev_probe(struct device *dev);
|
||||
static int aic7770_eisa_dev_remove(struct device *dev);
|
||||
static struct eisa_driver aic7770_driver = {
|
||||
.driver = {
|
||||
.name = "aic7xxx",
|
||||
.probe = aic7770_eisa_dev_probe,
|
||||
.remove = aic7770_eisa_dev_remove,
|
||||
}
|
||||
};
|
||||
|
||||
typedef struct device *aic7770_dev_t;
|
||||
|
||||
static int aic7770_linux_config(struct aic7770_identity *entry,
|
||||
aic7770_dev_t dev, u_int eisaBase);
|
||||
|
||||
int
|
||||
ahc_linux_eisa_init(void)
|
||||
{
|
||||
struct eisa_device_id *eid;
|
||||
struct aic7770_identity *id;
|
||||
int i;
|
||||
|
||||
if (aic7xxx_probe_eisa_vl == 0)
|
||||
return -ENODEV;
|
||||
|
||||
/*
|
||||
* Linux requires the EISA IDs to be specified in
|
||||
* the EISA ID string format. Perform the conversion
|
||||
* and setup a table with a NUL terminal entry.
|
||||
*/
|
||||
aic7770_driver.id_table = malloc(sizeof(struct eisa_device_id) *
|
||||
(ahc_num_aic7770_devs + 1),
|
||||
M_DEVBUF, M_NOWAIT);
|
||||
if (aic7770_driver.id_table == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
for (eid = (struct eisa_device_id *)aic7770_driver.id_table,
|
||||
id = aic7770_ident_table, i = 0;
|
||||
i < ahc_num_aic7770_devs; eid++, id++, i++) {
|
||||
|
||||
sprintf(eid->sig, "%c%c%c%03X%01X",
|
||||
EISA_MFCTR_CHAR0(id->full_id),
|
||||
EISA_MFCTR_CHAR1(id->full_id),
|
||||
EISA_MFCTR_CHAR2(id->full_id),
|
||||
EISA_PRODUCT_ID(id->full_id),
|
||||
EISA_REVISION_ID(id->full_id));
|
||||
eid->driver_data = i;
|
||||
}
|
||||
eid->sig[0] = 0;
|
||||
|
||||
return eisa_driver_register(&aic7770_driver);
|
||||
}
|
||||
|
||||
void
|
||||
ahc_linux_eisa_exit(void)
|
||||
{
|
||||
if(aic7xxx_probe_eisa_vl != 0 && aic7770_driver.id_table != NULL) {
|
||||
eisa_driver_unregister(&aic7770_driver);
|
||||
free(aic7770_driver.id_table, M_DEVBUF);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
aic7770_linux_config(struct aic7770_identity *entry, aic7770_dev_t dev,
|
||||
u_int eisaBase)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
char buf[80];
|
||||
char *name;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Allocate a softc for this card and
|
||||
* set it up for attachment by our
|
||||
* common detect routine.
|
||||
*/
|
||||
sprintf(buf, "ahc_eisa:%d", eisaBase >> 12);
|
||||
name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
|
||||
if (name == NULL)
|
||||
return (ENOMEM);
|
||||
strcpy(name, buf);
|
||||
ahc = ahc_alloc(&aic7xxx_driver_template, name);
|
||||
if (ahc == NULL)
|
||||
return (ENOMEM);
|
||||
error = aic7770_config(ahc, entry, eisaBase);
|
||||
if (error != 0) {
|
||||
ahc->bsh.ioport = 0;
|
||||
ahc_free(ahc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
dev->driver_data = (void *)ahc;
|
||||
if (aic7xxx_detect_complete)
|
||||
error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
|
||||
return (error);
|
||||
}
|
||||
|
||||
int
|
||||
aic7770_map_registers(struct ahc_softc *ahc, u_int port)
|
||||
{
|
||||
|
|
@ -178,37 +75,79 @@ aic7770_map_int(struct ahc_softc *ahc, u_int irq)
|
|||
}
|
||||
|
||||
static int
|
||||
aic7770_eisa_dev_probe(struct device *dev)
|
||||
aic7770_probe(struct device *dev)
|
||||
{
|
||||
struct eisa_device *edev;
|
||||
struct eisa_device *edev = to_eisa_device(dev);
|
||||
u_int eisaBase = edev->base_addr+AHC_EISA_SLOT_OFFSET;
|
||||
struct ahc_softc *ahc;
|
||||
char buf[80];
|
||||
char *name;
|
||||
int error;
|
||||
|
||||
edev = to_eisa_device(dev);
|
||||
return (aic7770_linux_config(aic7770_ident_table + edev->id.driver_data,
|
||||
dev, edev->base_addr+AHC_EISA_SLOT_OFFSET));
|
||||
sprintf(buf, "ahc_eisa:%d", eisaBase >> 12);
|
||||
name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
|
||||
if (name == NULL)
|
||||
return (ENOMEM);
|
||||
strcpy(name, buf);
|
||||
ahc = ahc_alloc(&aic7xxx_driver_template, name);
|
||||
if (ahc == NULL)
|
||||
return (ENOMEM);
|
||||
error = aic7770_config(ahc, aic7770_ident_table + edev->id.driver_data,
|
||||
eisaBase);
|
||||
if (error != 0) {
|
||||
ahc->bsh.ioport = 0;
|
||||
ahc_free(ahc);
|
||||
return (error);
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, ahc);
|
||||
|
||||
if (aic7xxx_detect_complete)
|
||||
error = ahc_linux_register_host(ahc, &aic7xxx_driver_template);
|
||||
return (error);
|
||||
}
|
||||
|
||||
static int
|
||||
aic7770_eisa_dev_remove(struct device *dev)
|
||||
aic7770_remove(struct device *dev)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
u_long l;
|
||||
struct ahc_softc *ahc = dev_get_drvdata(dev);
|
||||
u_long s;
|
||||
|
||||
/*
|
||||
* We should be able to just perform
|
||||
* the free directly, but check our
|
||||
* list for extra sanity.
|
||||
*/
|
||||
ahc_list_lock(&l);
|
||||
ahc = ahc_find_softc((struct ahc_softc *)dev->driver_data);
|
||||
if (ahc != NULL) {
|
||||
u_long s;
|
||||
ahc_lock(ahc, &s);
|
||||
ahc_intr_enable(ahc, FALSE);
|
||||
ahc_unlock(ahc, &s);
|
||||
|
||||
ahc_lock(ahc, &s);
|
||||
ahc_intr_enable(ahc, FALSE);
|
||||
ahc_unlock(ahc, &s);
|
||||
ahc_free(ahc);
|
||||
}
|
||||
ahc_list_unlock(&l);
|
||||
|
||||
return (0);
|
||||
ahc_free(ahc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct eisa_device_id aic7770_ids[] = {
|
||||
{ "ADP7771", 0 }, /* AHA 274x */
|
||||
{ "ADP7756", 1 }, /* AHA 284x BIOS enabled */
|
||||
{ "ADP7757", 2 }, /* AHA 284x BIOS disabled */
|
||||
{ "ADP7782", 3 }, /* AHA 274x Olivetti OEM */
|
||||
{ "ADP7783", 4 }, /* AHA 274x Olivetti OEM (Differential) */
|
||||
{ "ADP7770", 5 }, /* AIC7770 generic */
|
||||
{ "" }
|
||||
};
|
||||
|
||||
static struct eisa_driver aic7770_driver = {
|
||||
.id_table = aic7770_ids,
|
||||
.driver = {
|
||||
.name = "aic7xxx",
|
||||
.probe = aic7770_probe,
|
||||
.remove = aic7770_remove,
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
ahc_linux_eisa_init(void)
|
||||
{
|
||||
return eisa_driver_register(&aic7770_driver);
|
||||
}
|
||||
|
||||
void
|
||||
ahc_linux_eisa_exit(void)
|
||||
{
|
||||
eisa_driver_unregister(&aic7770_driver);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -941,7 +941,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
|
|||
*/
|
||||
cmd->scsi_done = scsi_done;
|
||||
|
||||
ahd_midlayer_entrypoint_lock(ahd, &flags);
|
||||
ahd_lock(ahd, &flags);
|
||||
|
||||
/*
|
||||
* Close the race of a command that was in the process of
|
||||
|
|
@ -955,7 +955,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
|
|||
ahd_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
|
||||
ahd_linux_queue_cmd_complete(ahd, cmd);
|
||||
ahd_schedule_completeq(ahd);
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &flags);
|
||||
ahd_unlock(ahd, &flags);
|
||||
return (0);
|
||||
}
|
||||
dev = ahd_linux_get_device(ahd, cmd->device->channel,
|
||||
|
|
@ -965,7 +965,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
|
|||
ahd_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
|
||||
ahd_linux_queue_cmd_complete(ahd, cmd);
|
||||
ahd_schedule_completeq(ahd);
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &flags);
|
||||
ahd_unlock(ahd, &flags);
|
||||
printf("%s: aic79xx_linux_queue - Unable to allocate device!\n",
|
||||
ahd_name(ahd));
|
||||
return (0);
|
||||
|
|
@ -979,7 +979,7 @@ ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
|
|||
dev->flags |= AHD_DEV_ON_RUN_LIST;
|
||||
ahd_linux_run_device_queues(ahd);
|
||||
}
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &flags);
|
||||
ahd_unlock(ahd, &flags);
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
@ -1511,17 +1511,17 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
|
|||
ahd_name(ahd), cmd->device->channel, cmd->device->id,
|
||||
cmd->device->lun, cmd);
|
||||
#endif
|
||||
ahd_midlayer_entrypoint_lock(ahd, &s);
|
||||
ahd_lock(ahd, &s);
|
||||
|
||||
dev = ahd_linux_get_device(ahd, cmd->device->channel, cmd->device->id,
|
||||
cmd->device->lun, /*alloc*/FALSE);
|
||||
if (dev == NULL) {
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &s);
|
||||
ahd_unlock(ahd, &s);
|
||||
kfree(recovery_cmd);
|
||||
return (FAILED);
|
||||
}
|
||||
if ((scb = ahd_get_scb(ahd, AHD_NEVER_COL_IDX)) == NULL) {
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &s);
|
||||
ahd_unlock(ahd, &s);
|
||||
kfree(recovery_cmd);
|
||||
return (FAILED);
|
||||
}
|
||||
|
|
@ -1570,7 +1570,7 @@ ahd_linux_dev_reset(Scsi_Cmnd *cmd)
|
|||
spin_lock_irq(&ahd->platform_data->spin_lock);
|
||||
ahd_schedule_runq(ahd);
|
||||
ahd_linux_run_complete_queue(ahd);
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &s);
|
||||
ahd_unlock(ahd, &s);
|
||||
printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval);
|
||||
return (retval);
|
||||
}
|
||||
|
|
@ -1591,11 +1591,11 @@ ahd_linux_bus_reset(Scsi_Cmnd *cmd)
|
|||
printf("%s: Bus reset called for cmd %p\n",
|
||||
ahd_name(ahd), cmd);
|
||||
#endif
|
||||
ahd_midlayer_entrypoint_lock(ahd, &s);
|
||||
ahd_lock(ahd, &s);
|
||||
found = ahd_reset_channel(ahd, cmd->device->channel + 'A',
|
||||
/*initiate reset*/TRUE);
|
||||
ahd_linux_run_complete_queue(ahd);
|
||||
ahd_midlayer_entrypoint_unlock(ahd, &s);
|
||||
ahd_unlock(ahd, &s);
|
||||
|
||||
if (bootverbose)
|
||||
printf("%s: SCSI bus reset delivered. "
|
||||
|
|
|
|||
|
|
@ -112,23 +112,6 @@ typedef Scsi_Cmnd *ahd_io_ctx_t;
|
|||
#define ahd_le32toh(x) le32_to_cpu(x)
|
||||
#define ahd_le64toh(x) le64_to_cpu(x)
|
||||
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
|
||||
#ifndef BYTE_ORDER
|
||||
#if defined(__BIG_ENDIAN)
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#endif
|
||||
#if defined(__LITTLE_ENDIAN)
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
/************************* Configuration Data *********************************/
|
||||
extern uint32_t aic79xx_allow_memio;
|
||||
extern int aic79xx_detect_complete;
|
||||
|
|
|
|||
|
|
@ -346,7 +346,6 @@ typedef enum {
|
|||
* controller.
|
||||
*/
|
||||
AHC_NEWEEPROM_FMT = 0x4000,
|
||||
AHC_RESOURCE_SHORTAGE = 0x8000,
|
||||
AHC_TQINFIFO_BLOCKED = 0x10000, /* Blocked waiting for ATIOs */
|
||||
AHC_INT50_SPEEDFLEX = 0x20000, /*
|
||||
* Internal 50pin connector
|
||||
|
|
@ -1200,7 +1199,6 @@ void ahc_pause_and_flushwork(struct ahc_softc *ahc);
|
|||
int ahc_suspend(struct ahc_softc *ahc);
|
||||
int ahc_resume(struct ahc_softc *ahc);
|
||||
void ahc_softc_insert(struct ahc_softc *);
|
||||
struct ahc_softc *ahc_find_softc(struct ahc_softc *ahc);
|
||||
void ahc_set_unit(struct ahc_softc *, int);
|
||||
void ahc_set_name(struct ahc_softc *, char *);
|
||||
void ahc_alloc_scbs(struct ahc_softc *ahc);
|
||||
|
|
|
|||
|
|
@ -3934,22 +3934,6 @@ ahc_softc_insert(struct ahc_softc *ahc)
|
|||
ahc->init_level++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that the passed in softc pointer is for a
|
||||
* controller that is still configured.
|
||||
*/
|
||||
struct ahc_softc *
|
||||
ahc_find_softc(struct ahc_softc *ahc)
|
||||
{
|
||||
struct ahc_softc *list_ahc;
|
||||
|
||||
TAILQ_FOREACH(list_ahc, &ahc_tailq, links) {
|
||||
if (list_ahc == ahc)
|
||||
return (ahc);
|
||||
}
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
void
|
||||
ahc_set_unit(struct ahc_softc *ahc, int unit)
|
||||
{
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -79,6 +79,8 @@
|
|||
#include <scsi/scsi_device.h>
|
||||
#include <scsi/scsi_host.h>
|
||||
#include <scsi/scsi_tcq.h>
|
||||
#include <scsi/scsi_transport.h>
|
||||
#include <scsi/scsi_transport_spi.h>
|
||||
|
||||
/* Core SCSI definitions */
|
||||
#define AIC_LIB_PREFIX ahc
|
||||
|
|
@ -127,23 +129,6 @@ typedef struct scsi_cmnd *ahc_io_ctx_t;
|
|||
#define ahc_le32toh(x) le32_to_cpu(x)
|
||||
#define ahc_le64toh(x) le64_to_cpu(x)
|
||||
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
|
||||
#ifndef BYTE_ORDER
|
||||
#if defined(__BIG_ENDIAN)
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#endif
|
||||
#if defined(__LITTLE_ENDIAN)
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
/************************* Configuration Data *********************************/
|
||||
extern u_int aic7xxx_no_probe;
|
||||
extern u_int aic7xxx_allow_memio;
|
||||
|
|
@ -283,35 +268,6 @@ ahc_scb_timer_reset(struct scb *scb, u_int usec)
|
|||
|
||||
#define AIC7XXX_DRIVER_VERSION "6.2.36"
|
||||
|
||||
/**************************** Front End Queues ********************************/
|
||||
/*
|
||||
* Data structure used to cast the Linux struct scsi_cmnd to something
|
||||
* that allows us to use the queue macros. The linux structure has
|
||||
* plenty of space to hold the links fields as required by the queue
|
||||
* macros, but the queue macors require them to have the correct type.
|
||||
*/
|
||||
struct ahc_cmd_internal {
|
||||
/* Area owned by the Linux scsi layer. */
|
||||
uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
|
||||
union {
|
||||
STAILQ_ENTRY(ahc_cmd) ste;
|
||||
LIST_ENTRY(ahc_cmd) le;
|
||||
TAILQ_ENTRY(ahc_cmd) tqe;
|
||||
} links;
|
||||
uint32_t end;
|
||||
};
|
||||
|
||||
struct ahc_cmd {
|
||||
union {
|
||||
struct ahc_cmd_internal icmd;
|
||||
struct scsi_cmnd scsi_cmd;
|
||||
} un;
|
||||
};
|
||||
|
||||
#define acmd_icmd(cmd) ((cmd)->un.icmd)
|
||||
#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
|
||||
#define acmd_links un.icmd.links
|
||||
|
||||
/*************************** Device Data Structures ***************************/
|
||||
/*
|
||||
* A per probed device structure used to deal with some error recovery
|
||||
|
|
@ -320,7 +276,6 @@ struct ahc_cmd {
|
|||
* after a successfully completed inquiry command to the target when
|
||||
* that inquiry data indicates a lun is present.
|
||||
*/
|
||||
TAILQ_HEAD(ahc_busyq, ahc_cmd);
|
||||
typedef enum {
|
||||
AHC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
|
||||
AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
|
||||
|
|
@ -330,8 +285,6 @@ typedef enum {
|
|||
|
||||
struct ahc_linux_target;
|
||||
struct ahc_linux_device {
|
||||
TAILQ_ENTRY(ahc_linux_device) links;
|
||||
|
||||
/*
|
||||
* The number of transactions currently
|
||||
* queued to the device.
|
||||
|
|
@ -401,17 +354,10 @@ struct ahc_linux_device {
|
|||
*/
|
||||
u_int commands_since_idle_or_otag;
|
||||
#define AHC_OTAG_THRESH 500
|
||||
|
||||
int lun;
|
||||
struct scsi_device *scsi_device;
|
||||
struct ahc_linux_target *target;
|
||||
};
|
||||
|
||||
struct ahc_linux_target {
|
||||
struct ahc_linux_device *devices[AHC_NUM_LUNS];
|
||||
int channel;
|
||||
int target;
|
||||
int refcount;
|
||||
struct scsi_device *sdev[AHC_NUM_LUNS];
|
||||
struct ahc_transinfo last_tinfo;
|
||||
struct ahc_softc *ahc;
|
||||
};
|
||||
|
|
@ -445,7 +391,7 @@ struct ahc_platform_data {
|
|||
/*
|
||||
* Fields accessed from interrupt context.
|
||||
*/
|
||||
struct ahc_linux_target *targets[AHC_NUM_TARGETS];
|
||||
struct scsi_target *starget[AHC_NUM_TARGETS];
|
||||
|
||||
spinlock_t spin_lock;
|
||||
u_int qfrozen;
|
||||
|
|
@ -659,7 +605,6 @@ typedef enum
|
|||
|
||||
/**************************** VL/EISA Routines ********************************/
|
||||
#ifdef CONFIG_EISA
|
||||
extern uint32_t aic7xxx_probe_eisa_vl;
|
||||
int ahc_linux_eisa_init(void);
|
||||
void ahc_linux_eisa_exit(void);
|
||||
int aic7770_map_registers(struct ahc_softc *ahc,
|
||||
|
|
@ -924,7 +869,6 @@ ahc_notify_xfer_settings_change(struct ahc_softc *ahc,
|
|||
static __inline void
|
||||
ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
|
||||
{
|
||||
ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
|
||||
}
|
||||
|
||||
int ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
|
||||
|
|
|
|||
|
|
@ -140,27 +140,17 @@ struct pci_driver aic7xxx_pci_driver = {
|
|||
static void
|
||||
ahc_linux_pci_dev_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
u_long l;
|
||||
struct ahc_softc *ahc = pci_get_drvdata(pdev);
|
||||
u_long s;
|
||||
|
||||
/*
|
||||
* We should be able to just perform
|
||||
* the free directly, but check our
|
||||
* list for extra sanity.
|
||||
*/
|
||||
ahc_list_lock(&l);
|
||||
ahc = ahc_find_softc((struct ahc_softc *)pci_get_drvdata(pdev));
|
||||
if (ahc != NULL) {
|
||||
u_long s;
|
||||
ahc_list_lock(&s);
|
||||
TAILQ_REMOVE(&ahc_tailq, ahc, links);
|
||||
ahc_list_unlock(&s);
|
||||
|
||||
TAILQ_REMOVE(&ahc_tailq, ahc, links);
|
||||
ahc_list_unlock(&l);
|
||||
ahc_lock(ahc, &s);
|
||||
ahc_intr_enable(ahc, FALSE);
|
||||
ahc_unlock(ahc, &s);
|
||||
ahc_free(ahc);
|
||||
} else
|
||||
ahc_list_unlock(&l);
|
||||
ahc_lock(ahc, &s);
|
||||
ahc_intr_enable(ahc, FALSE);
|
||||
ahc_unlock(ahc, &s);
|
||||
ahc_free(ahc);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -174,22 +164,6 @@ ahc_linux_pci_dev_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
char *name;
|
||||
int error;
|
||||
|
||||
/*
|
||||
* Some BIOSen report the same device multiple times.
|
||||
*/
|
||||
TAILQ_FOREACH(ahc, &ahc_tailq, links) {
|
||||
struct pci_dev *probed_pdev;
|
||||
|
||||
probed_pdev = ahc->dev_softc;
|
||||
if (probed_pdev->bus->number == pdev->bus->number
|
||||
&& probed_pdev->devfn == pdev->devfn)
|
||||
break;
|
||||
}
|
||||
if (ahc != NULL) {
|
||||
/* Skip duplicate. */
|
||||
return (-ENODEV);
|
||||
}
|
||||
|
||||
pci = pdev;
|
||||
entry = ahc_find_pci_device(pci);
|
||||
if (entry == NULL)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ static void ahc_dump_target_state(struct ahc_softc *ahc,
|
|||
u_int our_id, char channel,
|
||||
u_int target_id, u_int target_offset);
|
||||
static void ahc_dump_device_state(struct info_str *info,
|
||||
struct ahc_linux_device *dev);
|
||||
struct scsi_device *dev);
|
||||
static int ahc_proc_write_seeprom(struct ahc_softc *ahc,
|
||||
char *buffer, int length);
|
||||
|
||||
|
|
@ -142,6 +142,7 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
|||
u_int target_offset)
|
||||
{
|
||||
struct ahc_linux_target *targ;
|
||||
struct scsi_target *starget;
|
||||
struct ahc_initiator_tinfo *tinfo;
|
||||
struct ahc_tmode_tstate *tstate;
|
||||
int lun;
|
||||
|
|
@ -153,7 +154,8 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
|||
copy_info(info, "Target %d Negotiation Settings\n", target_id);
|
||||
copy_info(info, "\tUser: ");
|
||||
ahc_format_transinfo(info, &tinfo->user);
|
||||
targ = ahc->platform_data->targets[target_offset];
|
||||
starget = ahc->platform_data->starget[target_offset];
|
||||
targ = scsi_transport_target_data(starget);
|
||||
if (targ == NULL)
|
||||
return;
|
||||
|
||||
|
|
@ -163,22 +165,25 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
|
|||
ahc_format_transinfo(info, &tinfo->curr);
|
||||
|
||||
for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
|
||||
struct ahc_linux_device *dev;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
dev = targ->devices[lun];
|
||||
sdev = targ->sdev[lun];
|
||||
|
||||
if (dev == NULL)
|
||||
if (sdev == NULL)
|
||||
continue;
|
||||
|
||||
ahc_dump_device_state(info, dev);
|
||||
ahc_dump_device_state(info, sdev);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ahc_dump_device_state(struct info_str *info, struct ahc_linux_device *dev)
|
||||
ahc_dump_device_state(struct info_str *info, struct scsi_device *sdev)
|
||||
{
|
||||
struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
|
||||
|
||||
copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
|
||||
dev->target->channel + 'A', dev->target->target, dev->lun);
|
||||
sdev->sdev_target->channel + 'A',
|
||||
sdev->sdev_target->id, sdev->lun);
|
||||
|
||||
copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued);
|
||||
copy_info(info, "\t\tCommands Active %d\n", dev->active);
|
||||
|
|
@ -292,20 +297,13 @@ int
|
|||
ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
|
||||
off_t offset, int length, int inout)
|
||||
{
|
||||
struct ahc_softc *ahc;
|
||||
struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;
|
||||
struct info_str info;
|
||||
char ahc_info[256];
|
||||
u_long s;
|
||||
u_int max_targ;
|
||||
u_int i;
|
||||
int retval;
|
||||
|
||||
retval = -EINVAL;
|
||||
ahc_list_lock(&s);
|
||||
ahc = ahc_find_softc(*(struct ahc_softc **)shost->hostdata);
|
||||
if (ahc == NULL)
|
||||
goto done;
|
||||
|
||||
/* Has data been written to the file? */
|
||||
if (inout == TRUE) {
|
||||
retval = ahc_proc_write_seeprom(ahc, buffer, length);
|
||||
|
|
@ -367,6 +365,5 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
|
|||
}
|
||||
retval = info.pos > info.offset ? info.pos - info.offset : 0;
|
||||
done:
|
||||
ahc_list_unlock(&s);
|
||||
return (retval);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10358,7 +10358,7 @@ aic7xxx_queue(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *))
|
|||
* Returns an enumerated type that indicates the status of the operation.
|
||||
*-F*************************************************************************/
|
||||
static int
|
||||
aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
|
||||
__aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
struct aic7xxx_host *p;
|
||||
struct aic7xxx_scb *scb;
|
||||
|
|
@ -10551,6 +10551,18 @@ aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
aic7xxx_bus_device_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __aic7xxx_bus_device_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*+F*************************************************************************
|
||||
* Function:
|
||||
|
|
@ -10585,7 +10597,7 @@ aic7xxx_panic_abort(struct aic7xxx_host *p, Scsi_Cmnd *cmd)
|
|||
* Abort the current SCSI command(s).
|
||||
*-F*************************************************************************/
|
||||
static int
|
||||
aic7xxx_abort(Scsi_Cmnd *cmd)
|
||||
__aic7xxx_abort(Scsi_Cmnd *cmd)
|
||||
{
|
||||
struct aic7xxx_scb *scb = NULL;
|
||||
struct aic7xxx_host *p;
|
||||
|
|
@ -10802,6 +10814,19 @@ success:
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int
|
||||
aic7xxx_abort(Scsi_Cmnd *cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __aic7xxx_abort(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*+F*************************************************************************
|
||||
* Function:
|
||||
* aic7xxx_reset
|
||||
|
|
@ -10820,6 +10845,8 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
|
|||
struct aic_dev_data *aic_dev;
|
||||
|
||||
p = (struct aic7xxx_host *) cmd->device->host->hostdata;
|
||||
spin_lock_irq(p->host->host_lock);
|
||||
|
||||
aic_dev = AIC_DEV(cmd);
|
||||
if(aic7xxx_position(cmd) < p->scb_data->numscbs)
|
||||
{
|
||||
|
|
@ -10859,6 +10886,7 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
|
|||
* longer have it.
|
||||
*/
|
||||
unpause_sequencer(p, FALSE);
|
||||
spin_unlock_irq(p->host->host_lock);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -10882,7 +10910,6 @@ aic7xxx_reset(Scsi_Cmnd *cmd)
|
|||
unpause_sequencer(p, FALSE);
|
||||
spin_unlock_irq(p->host->host_lock);
|
||||
ssleep(2);
|
||||
spin_lock_irq(p->host->host_lock);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -244,9 +244,7 @@ static Scsi_Host_Template cumanascsi_template = {
|
|||
.info = cumanascsi_info,
|
||||
.queuecommand = cumanascsi_queue_command,
|
||||
.eh_abort_handler = NCR5380_abort,
|
||||
.eh_device_reset_handler= NCR5380_device_reset,
|
||||
.eh_bus_reset_handler = NCR5380_bus_reset,
|
||||
.eh_host_reset_handler = NCR5380_host_reset,
|
||||
.can_queue = 16,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
|||
|
|
@ -162,9 +162,7 @@ static Scsi_Host_Template ecoscsi_template = {
|
|||
.info = ecoscsi_info,
|
||||
.queuecommand = ecoscsi_queue_command,
|
||||
.eh_abort_handler = NCR5380_abort,
|
||||
.eh_device_reset_handler= NCR5380_device_reset,
|
||||
.eh_bus_reset_handler = NCR5380_bus_reset,
|
||||
.eh_host_reset_handler = NCR5380_host_reset,
|
||||
.can_queue = 16,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
|||
|
|
@ -2659,6 +2659,8 @@ int fas216_eh_host_reset(Scsi_Cmnd *SCpnt)
|
|||
{
|
||||
FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
|
||||
|
||||
spin_lock_irq(info->host->host_lock);
|
||||
|
||||
fas216_checkmagic(info);
|
||||
|
||||
printk("scsi%d.%c: %s: resetting host\n",
|
||||
|
|
@ -2686,6 +2688,7 @@ int fas216_eh_host_reset(Scsi_Cmnd *SCpnt)
|
|||
|
||||
fas216_init_chip(info);
|
||||
|
||||
spin_unlock_irq(info->host->host_lock);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -118,9 +118,7 @@ static Scsi_Host_Template oakscsi_template = {
|
|||
.info = oakscsi_info,
|
||||
.queuecommand = oakscsi_queue_command,
|
||||
.eh_abort_handler = NCR5380_abort,
|
||||
.eh_device_reset_handler= NCR5380_device_reset,
|
||||
.eh_bus_reset_handler = NCR5380_bus_reset,
|
||||
.eh_host_reset_handler = NCR5380_host_reset,
|
||||
.can_queue = 16,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
|||
|
|
@ -3146,8 +3146,8 @@ static const char *atp870u_info(struct Scsi_Host *notused)
|
|||
}
|
||||
|
||||
#define BLS buffer + len + size
|
||||
int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer,
|
||||
char **start, off_t offset, int length, int inout)
|
||||
static int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer,
|
||||
char **start, off_t offset, int length, int inout)
|
||||
{
|
||||
static u8 buff[512];
|
||||
int size = 0;
|
||||
|
|
|
|||
1026
drivers/scsi/ch.c
Normal file
1026
drivers/scsi/ch.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1310,7 +1310,7 @@ static void reset_dev_param(struct AdapterCtlBlk *acb)
|
|||
* @cmd - some command for this host (for fetching hooks)
|
||||
* Returns: SUCCESS (0x2002) on success, else FAILED (0x2003).
|
||||
*/
|
||||
static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
|
||||
static int __dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct AdapterCtlBlk *acb =
|
||||
(struct AdapterCtlBlk *)cmd->device->host->hostdata;
|
||||
|
|
@ -1356,6 +1356,16 @@ static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __dc395x_eh_bus_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* abort an errant SCSI command
|
||||
|
|
|
|||
|
|
@ -61,8 +61,6 @@ static struct scsi_host_template dmx3191d_driver_template = {
|
|||
.queuecommand = NCR5380_queue_command,
|
||||
.eh_abort_handler = NCR5380_abort,
|
||||
.eh_bus_reset_handler = NCR5380_bus_reset,
|
||||
.eh_device_reset_handler= NCR5380_device_reset,
|
||||
.eh_host_reset_handler = NCR5380_host_reset,
|
||||
.can_queue = 32,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
|||
|
|
@ -113,7 +113,6 @@ static struct i2o_sys_tbl *sys_tbl = NULL;
|
|||
static int sys_tbl_ind = 0;
|
||||
static int sys_tbl_len = 0;
|
||||
|
||||
static adpt_hba* hbas[DPTI_MAX_HBA];
|
||||
static adpt_hba* hba_chain = NULL;
|
||||
static int hba_count = 0;
|
||||
|
||||
|
|
@ -691,7 +690,7 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
|
|||
u32 msg[4];
|
||||
u32 rcode;
|
||||
int old_state;
|
||||
struct adpt_device* d = (void*) cmd->device->hostdata;
|
||||
struct adpt_device* d = cmd->device->hostdata;
|
||||
|
||||
pHba = (void*) cmd->device->host->hostdata[0];
|
||||
printk(KERN_INFO"%s: Trying to reset device\n",pHba->name);
|
||||
|
|
@ -707,7 +706,7 @@ static int adpt_device_reset(struct scsi_cmnd* cmd)
|
|||
|
||||
old_state = d->state;
|
||||
d->state |= DPTI_DEV_RESET;
|
||||
if( (rcode = adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER)) ){
|
||||
if( (rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER)) ){
|
||||
d->state = old_state;
|
||||
if(rcode == -EOPNOTSUPP ){
|
||||
printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
|
||||
|
|
@ -737,7 +736,7 @@ static int adpt_bus_reset(struct scsi_cmnd* cmd)
|
|||
msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid);
|
||||
msg[2] = 0;
|
||||
msg[3] = 0;
|
||||
if(adpt_i2o_post_wait(pHba, (void*)msg,sizeof(msg), FOREVER) ){
|
||||
if(adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER) ){
|
||||
printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
|
||||
return FAILED;
|
||||
} else {
|
||||
|
|
@ -747,7 +746,7 @@ static int adpt_bus_reset(struct scsi_cmnd* cmd)
|
|||
}
|
||||
|
||||
// This version of reset is called by the eh_error_handler
|
||||
static int adpt_reset(struct scsi_cmnd* cmd)
|
||||
static int __adpt_reset(struct scsi_cmnd* cmd)
|
||||
{
|
||||
adpt_hba* pHba;
|
||||
int rcode;
|
||||
|
|
@ -763,6 +762,17 @@ static int adpt_reset(struct scsi_cmnd* cmd)
|
|||
}
|
||||
}
|
||||
|
||||
static int adpt_reset(struct scsi_cmnd* cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __adpt_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
// This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
|
||||
static int adpt_hba_reset(adpt_hba* pHba)
|
||||
{
|
||||
|
|
@ -875,7 +885,6 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
void __iomem *msg_addr_virt = NULL;
|
||||
|
||||
int raptorFlag = FALSE;
|
||||
int i;
|
||||
|
||||
if(pci_enable_device(pDev)) {
|
||||
return -EINVAL;
|
||||
|
|
@ -935,12 +944,6 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
memset(pHba, 0, sizeof(adpt_hba));
|
||||
|
||||
down(&adpt_configuration_lock);
|
||||
for(i=0;i<DPTI_MAX_HBA;i++) {
|
||||
if(hbas[i]==NULL) {
|
||||
hbas[i]=pHba;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(hba_chain != NULL){
|
||||
for(p = hba_chain; p->next; p = p->next);
|
||||
|
|
@ -950,7 +953,7 @@ static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev
|
|||
}
|
||||
pHba->next = NULL;
|
||||
pHba->unit = hba_count;
|
||||
sprintf(pHba->name, "dpti%d", i);
|
||||
sprintf(pHba->name, "dpti%d", hba_count);
|
||||
hba_count++;
|
||||
|
||||
up(&adpt_configuration_lock);
|
||||
|
|
@ -1015,11 +1018,6 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
|
|||
if(pHba->host){
|
||||
free_irq(pHba->host->irq, pHba);
|
||||
}
|
||||
for(i=0;i<DPTI_MAX_HBA;i++) {
|
||||
if(hbas[i]==pHba) {
|
||||
hbas[i] = NULL;
|
||||
}
|
||||
}
|
||||
p2 = NULL;
|
||||
for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
|
||||
if(p1 == pHba) {
|
||||
|
|
@ -1076,12 +1074,7 @@ static void adpt_i2o_delete_hba(adpt_hba* pHba)
|
|||
|
||||
static int adpt_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
|
||||
for (i = 0; i < DPTI_MAX_HBA; i++) {
|
||||
hbas[i] = NULL;
|
||||
}
|
||||
#ifdef REBOOT_NOTIFIER
|
||||
register_reboot_notifier(&adpt_reboot_notifier);
|
||||
#endif
|
||||
|
|
@ -1454,7 +1447,7 @@ static int adpt_i2o_parse_lct(adpt_hba* pHba)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
d->controller = (void*)pHba;
|
||||
d->controller = pHba;
|
||||
d->next = NULL;
|
||||
|
||||
memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
|
||||
|
|
@ -2000,7 +1993,7 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
struct scsi_cmnd* cmd;
|
||||
adpt_hba* pHba = dev_id;
|
||||
u32 m;
|
||||
ulong reply;
|
||||
void __iomem *reply;
|
||||
u32 status=0;
|
||||
u32 context;
|
||||
ulong flags = 0;
|
||||
|
|
@ -2025,11 +2018,11 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
goto out;
|
||||
}
|
||||
}
|
||||
reply = (ulong)bus_to_virt(m);
|
||||
reply = bus_to_virt(m);
|
||||
|
||||
if (readl(reply) & MSG_FAIL) {
|
||||
u32 old_m = readl(reply+28);
|
||||
ulong msg;
|
||||
void __iomem *msg;
|
||||
u32 old_context;
|
||||
PDEBUG("%s: Failed message\n",pHba->name);
|
||||
if(old_m >= 0x100000){
|
||||
|
|
@ -2038,16 +2031,16 @@ static irqreturn_t adpt_isr(int irq, void *dev_id, struct pt_regs *regs)
|
|||
continue;
|
||||
}
|
||||
// Transaction context is 0 in failed reply frame
|
||||
msg = (ulong)(pHba->msg_addr_virt + old_m);
|
||||
msg = pHba->msg_addr_virt + old_m;
|
||||
old_context = readl(msg+12);
|
||||
writel(old_context, reply+12);
|
||||
adpt_send_nop(pHba, old_m);
|
||||
}
|
||||
context = readl(reply+8);
|
||||
if(context & 0x40000000){ // IOCTL
|
||||
ulong p = (ulong)(readl(reply+12));
|
||||
if( p != 0) {
|
||||
memcpy((void*)p, (void*)reply, REPLY_FRAME_SIZE * 4);
|
||||
void *p = (void *)readl(reply+12);
|
||||
if( p != NULL) {
|
||||
memcpy_fromio(p, reply, REPLY_FRAME_SIZE * 4);
|
||||
}
|
||||
// All IOCTLs will also be post wait
|
||||
}
|
||||
|
|
@ -2231,7 +2224,7 @@ static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht)
|
|||
}
|
||||
|
||||
|
||||
static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd)
|
||||
static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
|
||||
{
|
||||
adpt_hba* pHba;
|
||||
u32 hba_status;
|
||||
|
|
@ -2323,7 +2316,7 @@ static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd)
|
|||
u32 len = sizeof(cmd->sense_buffer);
|
||||
len = (len > 40) ? 40 : len;
|
||||
// Copy over the sense data
|
||||
memcpy(cmd->sense_buffer, (void*)(reply+28) , len);
|
||||
memcpy_fromio(cmd->sense_buffer, (reply+28) , len);
|
||||
if(cmd->sense_buffer[0] == 0x70 /* class 7 */ &&
|
||||
cmd->sense_buffer[2] == DATA_PROTECT ){
|
||||
/* This is to handle an array failed */
|
||||
|
|
@ -2438,7 +2431,7 @@ static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
d->controller = (void*)pHba;
|
||||
d->controller = pHba;
|
||||
d->next = NULL;
|
||||
|
||||
memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
|
||||
|
|
@ -2985,8 +2978,8 @@ static int adpt_i2o_build_sys_table(void)
|
|||
sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
|
||||
sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
|
||||
sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
|
||||
sys_tbl->iops[count].inbound_low = (u32)virt_to_bus((void*)pHba->post_port);
|
||||
sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus((void*)pHba->post_port)>>32);
|
||||
sys_tbl->iops[count].inbound_low = (u32)virt_to_bus(pHba->post_port);
|
||||
sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus(pHba->post_port)>>32);
|
||||
|
||||
count++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -296,7 +296,7 @@ static s32 adpt_i2o_status_get(adpt_hba* pHba);
|
|||
static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba);
|
||||
static s32 adpt_i2o_hrt_get(adpt_hba* pHba);
|
||||
static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* dptdevice);
|
||||
static s32 adpt_i2o_to_scsi(ulong reply, struct scsi_cmnd* cmd);
|
||||
static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd);
|
||||
static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht);
|
||||
static s32 adpt_hba_reset(adpt_hba* pHba);
|
||||
static s32 adpt_i2o_reset_hba(adpt_hba* pHba);
|
||||
|
|
|
|||
|
|
@ -482,8 +482,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = dtc_queue_command,
|
||||
.eh_abort_handler = dtc_abort,
|
||||
.eh_bus_reset_handler = dtc_bus_reset,
|
||||
.eh_device_reset_handler = dtc_device_reset,
|
||||
.eh_host_reset_handler = dtc_host_reset,
|
||||
.bios_param = dtc_biosparam,
|
||||
.can_queue = CAN_QUEUE,
|
||||
.this_id = 7,
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@ static int dtc_biosparam(struct scsi_device *, struct block_device *,
|
|||
static int dtc_detect(Scsi_Host_Template *);
|
||||
static int dtc_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
||||
static int dtc_bus_reset(Scsi_Cmnd *);
|
||||
static int dtc_device_reset(Scsi_Cmnd *);
|
||||
static int dtc_host_reset(Scsi_Cmnd *);
|
||||
|
||||
#ifndef CMD_PER_LUN
|
||||
#define CMD_PER_LUN 2
|
||||
|
|
@ -86,8 +84,6 @@ static int dtc_host_reset(Scsi_Cmnd *);
|
|||
#define NCR5380_queue_command dtc_queue_command
|
||||
#define NCR5380_abort dtc_abort
|
||||
#define NCR5380_bus_reset dtc_bus_reset
|
||||
#define NCR5380_device_reset dtc_device_reset
|
||||
#define NCR5380_host_reset dtc_host_reset
|
||||
#define NCR5380_proc_info dtc_proc_info
|
||||
|
||||
/* 15 12 11 10
|
||||
|
|
|
|||
|
|
@ -518,8 +518,6 @@ static struct scsi_host_template driver_template = {
|
|||
.release = eata2x_release,
|
||||
.queuecommand = eata2x_queuecommand,
|
||||
.eh_abort_handler = eata2x_eh_abort,
|
||||
.eh_device_reset_handler = NULL,
|
||||
.eh_bus_reset_handler = NULL,
|
||||
.eh_host_reset_handler = eata2x_eh_host_reset,
|
||||
.bios_param = eata2x_bios_param,
|
||||
.slave_configure = eata2x_slave_configure,
|
||||
|
|
@ -1950,16 +1948,20 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
|
|||
ha->board_name, SCarg->device->channel, SCarg->device->id,
|
||||
SCarg->device->lun, SCarg->pid);
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
|
||||
if (SCarg->host_scribble == NULL)
|
||||
printk("%s: reset, pid %ld inactive.\n", ha->board_name, SCarg->pid);
|
||||
|
||||
if (ha->in_reset) {
|
||||
printk("%s: reset, exit, already in reset.\n", ha->board_name);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
if (wait_on_busy(shost->io_port, MAXLOOP)) {
|
||||
printk("%s: reset, exit, timeout error.\n", ha->board_name);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -2014,6 +2016,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
|
|||
|
||||
if (do_dma(shost->io_port, 0, RESET_PIO)) {
|
||||
printk("%s: reset, cannot reset, timeout error.\n", ha->board_name);
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -2026,9 +2029,12 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
|
|||
ha->in_reset = 1;
|
||||
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
|
||||
/* FIXME: use a sleep instead */
|
||||
time = jiffies;
|
||||
while ((jiffies - time) < (10 * HZ) && limit++ < 200000)
|
||||
udelay(100L);
|
||||
|
||||
spin_lock_irq(shost->host_lock);
|
||||
|
||||
printk("%s: reset, interrupts disabled, loops %d.\n", ha->board_name, limit);
|
||||
|
|
@ -2078,6 +2084,7 @@ static int eata2x_eh_host_reset(struct scsi_cmnd *SCarg)
|
|||
else
|
||||
printk("%s: reset, exit.\n", ha->board_name);
|
||||
|
||||
spin_unlock_irq(shost->host_lock);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -486,8 +486,11 @@ static int eata_pio_host_reset(struct scsi_cmnd *cmd)
|
|||
|
||||
DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset called pid:%ld target:" " %x lun: %x reason %x\n", cmd->pid, cmd->device->id, cmd->device->lun, cmd->abort_reason));
|
||||
|
||||
spin_lock_irq(host->host_lock);
|
||||
|
||||
if (HD(cmd)->state == RESET) {
|
||||
printk(KERN_WARNING "eata_pio_reset: exit, already in reset.\n");
|
||||
spin_unlock_irq(host->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -536,6 +539,8 @@ static int eata_pio_host_reset(struct scsi_cmnd *cmd)
|
|||
|
||||
HD(cmd)->state = 0;
|
||||
|
||||
spin_unlock_irq(host->host_lock);
|
||||
|
||||
if (success) { /* hmmm... */
|
||||
DBG(DBG_ABNORM, printk(KERN_WARNING "eata_pio_reset: exit, success.\n"));
|
||||
return SUCCESS;
|
||||
|
|
|
|||
|
|
@ -311,7 +311,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.eh_abort_handler = fcp_scsi_abort,
|
||||
.eh_device_reset_handler = fcp_scsi_dev_reset,
|
||||
.eh_bus_reset_handler = fcp_scsi_bus_reset,
|
||||
.eh_host_reset_handler = fcp_scsi_host_reset,
|
||||
};
|
||||
#include "scsi_module.c"
|
||||
|
|
|
|||
|
|
@ -1241,18 +1241,9 @@ static int fd_mcs_abort(Scsi_Cmnd * SCpnt)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int fd_mcs_host_reset(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int fd_mcs_device_reset(Scsi_Cmnd * SCpnt)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
|
||||
struct Scsi_Host *shpnt = SCpnt->device->host;
|
||||
unsigned long flags;
|
||||
|
||||
#if DEBUG_RESET
|
||||
static int called_once = 0;
|
||||
|
|
@ -1269,6 +1260,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
|
|||
called_once = 1;
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(shpnt->host_lock, flags);
|
||||
|
||||
outb(1, SCSI_Cntl_port);
|
||||
do_pause(2);
|
||||
outb(0, SCSI_Cntl_port);
|
||||
|
|
@ -1276,6 +1269,8 @@ static int fd_mcs_bus_reset(Scsi_Cmnd * SCpnt) {
|
|||
outb(0, SCSI_Mode_Cntl_port);
|
||||
outb(PARITY_MASK, TMC_Cntl_port);
|
||||
|
||||
spin_unlock_irqrestore(shpnt->host_lock, flags);
|
||||
|
||||
/* Unless this is the very first call (i.e., SCPnt == NULL), everything
|
||||
is probably hosed at this point. We will, however, try to keep
|
||||
things going by informing the high-level code that we need help. */
|
||||
|
|
@ -1357,8 +1352,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = fd_mcs_queue,
|
||||
.eh_abort_handler = fd_mcs_abort,
|
||||
.eh_bus_reset_handler = fd_mcs_bus_reset,
|
||||
.eh_host_reset_handler = fd_mcs_host_reset,
|
||||
.eh_device_reset_handler = fd_mcs_device_reset,
|
||||
.bios_param = fd_mcs_biosparam,
|
||||
.can_queue = 1,
|
||||
.this_id = 7,
|
||||
|
|
|
|||
|
|
@ -1543,12 +1543,18 @@ static int fdomain_16x0_abort(struct scsi_cmnd *SCpnt)
|
|||
|
||||
int fdomain_16x0_bus_reset(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
outb(1, port_base + SCSI_Cntl);
|
||||
do_pause( 2 );
|
||||
outb(0, port_base + SCSI_Cntl);
|
||||
do_pause( 115 );
|
||||
outb(0, port_base + SCSI_Mode_Cntl);
|
||||
outb(PARITY_MASK, port_base + TMC_Cntl);
|
||||
|
||||
local_irq_restore(flags);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -908,8 +908,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = generic_NCR5380_queue_command,
|
||||
.eh_abort_handler = generic_NCR5380_abort,
|
||||
.eh_bus_reset_handler = generic_NCR5380_bus_reset,
|
||||
.eh_device_reset_handler = generic_NCR5380_device_reset,
|
||||
.eh_host_reset_handler = generic_NCR5380_host_reset,
|
||||
.bios_param = NCR5380_BIOSPARAM,
|
||||
.can_queue = CAN_QUEUE,
|
||||
.this_id = 7,
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ static int generic_NCR5380_detect(Scsi_Host_Template *);
|
|||
static int generic_NCR5380_release_resources(struct Scsi_Host *);
|
||||
static int generic_NCR5380_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
||||
static int generic_NCR5380_bus_reset(Scsi_Cmnd *);
|
||||
static int generic_NCR5380_host_reset(Scsi_Cmnd *);
|
||||
static int generic_NCR5380_device_reset(Scsi_Cmnd *);
|
||||
static const char* generic_NCR5380_info(struct Scsi_Host *);
|
||||
|
||||
#ifndef CMD_PER_LUN
|
||||
|
|
@ -114,8 +112,6 @@ static const char* generic_NCR5380_info(struct Scsi_Host *);
|
|||
#define NCR5380_queue_command generic_NCR5380_queue_command
|
||||
#define NCR5380_abort generic_NCR5380_abort
|
||||
#define NCR5380_bus_reset generic_NCR5380_bus_reset
|
||||
#define NCR5380_device_reset generic_NCR5380_device_reset
|
||||
#define NCR5380_host_reset generic_NCR5380_host_reset
|
||||
#define NCR5380_pread generic_NCR5380_pread
|
||||
#define NCR5380_pwrite generic_NCR5380_pwrite
|
||||
#define NCR5380_proc_info notyet_generic_proc_info
|
||||
|
|
|
|||
|
|
@ -4703,19 +4703,6 @@ static const char *gdth_info(struct Scsi_Host *shp)
|
|||
return ((const char *)ha->binfo.type_string);
|
||||
}
|
||||
|
||||
/* new error handling */
|
||||
static int gdth_eh_abort(Scsi_Cmnd *scp)
|
||||
{
|
||||
TRACE2(("gdth_eh_abort()\n"));
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int gdth_eh_device_reset(Scsi_Cmnd *scp)
|
||||
{
|
||||
TRACE2(("gdth_eh_device_reset()\n"));
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
|
||||
{
|
||||
int i, hanum;
|
||||
|
|
@ -4770,13 +4757,6 @@ static int gdth_eh_bus_reset(Scsi_Cmnd *scp)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int gdth_eh_host_reset(Scsi_Cmnd *scp)
|
||||
{
|
||||
TRACE2(("gdth_eh_host_reset()\n"));
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
|
||||
static int gdth_bios_param(struct scsi_device *sdev,struct block_device *bdev,sector_t cap,int *ip)
|
||||
#else
|
||||
|
|
@ -5713,10 +5693,7 @@ static Scsi_Host_Template driver_template = {
|
|||
.release = gdth_release,
|
||||
.info = gdth_info,
|
||||
.queuecommand = gdth_queuecommand,
|
||||
.eh_abort_handler = gdth_eh_abort,
|
||||
.eh_device_reset_handler = gdth_eh_device_reset,
|
||||
.eh_bus_reset_handler = gdth_eh_bus_reset,
|
||||
.eh_host_reset_handler = gdth_eh_host_reset,
|
||||
.bios_param = gdth_bios_param,
|
||||
.can_queue = GDTH_MAXCMDS,
|
||||
.this_id = -1,
|
||||
|
|
|
|||
|
|
@ -345,7 +345,15 @@ release:
|
|||
static int gvp11_bus_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
/* FIXME perform bus-specific reset */
|
||||
|
||||
/* FIXME 2: shouldn't we no-op this function (return
|
||||
FAILED), and fall back to host reset function,
|
||||
wd33c93_host_reset ? */
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
wd33c93_host_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2118,7 +2118,7 @@ static int ibmmca_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ibmmca_abort(Scsi_Cmnd * cmd)
|
||||
static int __ibmmca_abort(Scsi_Cmnd * cmd)
|
||||
{
|
||||
/* Abort does not work, as the adapter never generates an interrupt on
|
||||
* whatever situation is simulated, even when really pending commands
|
||||
|
|
@ -2225,7 +2225,19 @@ static int ibmmca_abort(Scsi_Cmnd * cmd)
|
|||
}
|
||||
}
|
||||
|
||||
static int ibmmca_host_reset(Scsi_Cmnd * cmd)
|
||||
static int ibmmca_abort(Scsi_Cmnd * cmd)
|
||||
{
|
||||
struct Scsi_Host *shpnt = cmd->device->host;
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(shpnt->host_lock);
|
||||
rc = __ibmmca_abort(cmd);
|
||||
spin_unlock_irq(shpnt->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int __ibmmca_host_reset(Scsi_Cmnd * cmd)
|
||||
{
|
||||
struct Scsi_Host *shpnt;
|
||||
Scsi_Cmnd *cmd_aid;
|
||||
|
|
@ -2312,6 +2324,18 @@ static int ibmmca_host_reset(Scsi_Cmnd * cmd)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int ibmmca_host_reset(Scsi_Cmnd * cmd)
|
||||
{
|
||||
struct Scsi_Host *shpnt = cmd->device->host;
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(shpnt->host_lock);
|
||||
rc = __ibmmca_host_reset(cmd);
|
||||
spin_unlock_irq(shpnt->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ibmmca_biosparam(struct scsi_device *sdev, struct block_device *bdev, sector_t capacity, int *info)
|
||||
{
|
||||
int size = capacity;
|
||||
|
|
|
|||
|
|
@ -874,9 +874,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
|
|||
return FAILED;
|
||||
}
|
||||
|
||||
spin_unlock_irq(hostdata->host->host_lock);
|
||||
wait_for_completion(&evt->comp);
|
||||
spin_lock_irq(hostdata->host->host_lock);
|
||||
|
||||
/* make sure we got a good response */
|
||||
if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
|
||||
|
|
@ -978,9 +976,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
|
|||
return FAILED;
|
||||
}
|
||||
|
||||
spin_unlock_irq(hostdata->host->host_lock);
|
||||
wait_for_completion(&evt->comp);
|
||||
spin_lock_irq(hostdata->host->host_lock);
|
||||
|
||||
/* make sure we got a good response */
|
||||
if (unlikely(srp_rsp.srp.generic.type != SRP_RSP_TYPE)) {
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/ide.h>
|
||||
#include <linux/scatterlist.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/bitops.h>
|
||||
|
|
@ -1026,11 +1027,13 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|||
return FAILED;
|
||||
}
|
||||
|
||||
spin_lock_irq(&ide_lock);
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
spin_lock(&ide_lock);
|
||||
|
||||
if (!scsi->pc || (req = scsi->pc->rq) != HWGROUP(drive)->rq || !HWGROUP(drive)->handler) {
|
||||
printk (KERN_WARNING "ide-scsi: No active request in idescsi_eh_reset\n");
|
||||
spin_unlock(&ide_lock);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
|
@ -1052,16 +1055,15 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|||
HWGROUP(drive)->rq = NULL;
|
||||
HWGROUP(drive)->handler = NULL;
|
||||
HWGROUP(drive)->busy = 1; /* will set this to zero when ide reset finished */
|
||||
spin_unlock_irq(&ide_lock);
|
||||
spin_unlock(&ide_lock);
|
||||
|
||||
ide_do_reset(drive);
|
||||
|
||||
/* ide_do_reset starts a polling handler which restarts itself every 50ms until the reset finishes */
|
||||
|
||||
do {
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
schedule_timeout(HZ/20);
|
||||
msleep(50);
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
} while ( HWGROUP(drive)->handler );
|
||||
|
||||
|
|
@ -1072,6 +1074,7 @@ static int idescsi_eh_reset (struct scsi_cmnd *cmd)
|
|||
ret = FAILED;
|
||||
}
|
||||
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/parport.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
|
|
@ -610,9 +611,9 @@ static int imm_init(imm_struct *dev)
|
|||
if (imm_connect(dev, 0) != 1)
|
||||
return -EIO;
|
||||
imm_reset_pulse(dev->base);
|
||||
udelay(1000); /* Delay to allow devices to settle */
|
||||
mdelay(1); /* Delay to allow devices to settle */
|
||||
imm_disconnect(dev);
|
||||
udelay(1000); /* Another delay to allow devices to settle */
|
||||
mdelay(1); /* Another delay to allow devices to settle */
|
||||
return device_check(dev);
|
||||
}
|
||||
|
||||
|
|
@ -1026,9 +1027,9 @@ static int imm_reset(struct scsi_cmnd *cmd)
|
|||
|
||||
imm_connect(dev, CONNECT_NORMAL);
|
||||
imm_reset_pulse(dev->base);
|
||||
udelay(1000); /* device settle delay */
|
||||
mdelay(1); /* device settle delay */
|
||||
imm_disconnect(dev);
|
||||
udelay(1000); /* device settle delay */
|
||||
mdelay(1); /* device settle delay */
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1644,14 +1644,16 @@ static int in2000_bus_reset(Scsi_Cmnd * cmd)
|
|||
struct Scsi_Host *instance;
|
||||
struct IN2000_hostdata *hostdata;
|
||||
int x;
|
||||
unsigned long flags;
|
||||
|
||||
instance = cmd->device->host;
|
||||
hostdata = (struct IN2000_hostdata *) instance->hostdata;
|
||||
|
||||
printk(KERN_WARNING "scsi%d: Reset. ", instance->host_no);
|
||||
|
||||
/* do scsi-reset here */
|
||||
spin_lock_irqsave(instance->host_lock, flags);
|
||||
|
||||
/* do scsi-reset here */
|
||||
reset_hardware(instance, RESET_CARD_AND_BUS);
|
||||
for (x = 0; x < 8; x++) {
|
||||
hostdata->busy[x] = 0;
|
||||
|
|
@ -1668,21 +1670,12 @@ static int in2000_bus_reset(Scsi_Cmnd * cmd)
|
|||
hostdata->outgoing_len = 0;
|
||||
|
||||
cmd->result = DID_RESET << 16;
|
||||
|
||||
spin_unlock_irqrestore(instance->host_lock, flags);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int in2000_host_reset(Scsi_Cmnd * cmd)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int in2000_device_reset(Scsi_Cmnd * cmd)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
|
||||
static int in2000_abort(Scsi_Cmnd * cmd)
|
||||
static int __in2000_abort(Scsi_Cmnd * cmd)
|
||||
{
|
||||
struct Scsi_Host *instance;
|
||||
struct IN2000_hostdata *hostdata;
|
||||
|
|
@ -1803,6 +1796,16 @@ static int in2000_abort(Scsi_Cmnd * cmd)
|
|||
return SUCCESS;
|
||||
}
|
||||
|
||||
static int in2000_abort(Scsi_Cmnd * cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __in2000_abort(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
#define MAX_IN2000_HOSTS 3
|
||||
|
|
@ -2311,8 +2314,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = in2000_queuecommand,
|
||||
.eh_abort_handler = in2000_abort,
|
||||
.eh_bus_reset_handler = in2000_bus_reset,
|
||||
.eh_device_reset_handler = in2000_device_reset,
|
||||
.eh_host_reset_handler = in2000_host_reset,
|
||||
.bios_param = in2000_biosparam,
|
||||
.can_queue = IN2000_CAN_Q,
|
||||
.this_id = IN2000_HOST_ID,
|
||||
|
|
|
|||
|
|
@ -401,9 +401,7 @@ static int in2000_abort(Scsi_Cmnd *);
|
|||
static void in2000_setup(char *, int *) in2000__INIT;
|
||||
static int in2000_biosparam(struct scsi_device *, struct block_device *,
|
||||
sector_t, int *);
|
||||
static int in2000_host_reset(Scsi_Cmnd *);
|
||||
static int in2000_bus_reset(Scsi_Cmnd *);
|
||||
static int in2000_device_reset(Scsi_Cmnd *);
|
||||
|
||||
|
||||
#define IN2000_CAN_Q 16
|
||||
|
|
|
|||
|
|
@ -3014,7 +3014,11 @@ static int i91u_bus_reset(struct scsi_cmnd * SCpnt)
|
|||
HCS *pHCB;
|
||||
|
||||
pHCB = (HCS *) SCpnt->device->host->base;
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
tul_reset_scsi(pHCB, 0);
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1053,7 +1053,7 @@ static void ipr_log_array_error(struct ipr_ioa_cfg *ioa_cfg,
|
|||
array_entry->dev_res_addr.lun);
|
||||
}
|
||||
|
||||
if (array_entry->dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
|
||||
if (array_entry->expected_dev_res_addr.bus >= IPR_MAX_NUM_BUSES) {
|
||||
ipr_err("Expected Location: unknown\n");
|
||||
} else {
|
||||
ipr_err("Expected Location: %d:%d:%d:%d\n",
|
||||
|
|
@ -2885,7 +2885,7 @@ static int ipr_slave_alloc(struct scsi_device *sdev)
|
|||
* Return value:
|
||||
* SUCCESS / FAILED
|
||||
**/
|
||||
static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
|
||||
static int __ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
int rc;
|
||||
|
|
@ -2905,6 +2905,17 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int ipr_eh_host_reset(struct scsi_cmnd * cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __ipr_eh_host_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* ipr_eh_dev_reset - Reset the device
|
||||
* @scsi_cmd: scsi command struct
|
||||
|
|
@ -2916,7 +2927,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd * scsi_cmd)
|
|||
* Return value:
|
||||
* SUCCESS / FAILED
|
||||
**/
|
||||
static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
|
||||
static int __ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
|
||||
{
|
||||
struct ipr_cmnd *ipr_cmd;
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
|
|
@ -2970,6 +2981,17 @@ static int ipr_eh_dev_reset(struct scsi_cmnd * scsi_cmd)
|
|||
return (IPR_IOASC_SENSE_KEY(ioasc) ? FAILED : SUCCESS);
|
||||
}
|
||||
|
||||
static int ipr_eh_dev_reset(struct scsi_cmnd * cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __ipr_eh_dev_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* ipr_bus_reset_done - Op done function for bus reset.
|
||||
* @ipr_cmd: ipr command struct
|
||||
|
|
@ -3068,6 +3090,12 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
|
|||
ioa_cfg = (struct ipr_ioa_cfg *)scsi_cmd->device->host->hostdata;
|
||||
res = scsi_cmd->device->hostdata;
|
||||
|
||||
/* If we are currently going through reset/reload, return failed.
|
||||
* This will force the mid-layer to call ipr_eh_host_reset,
|
||||
* which will then go to sleep and wait for the reset to complete
|
||||
*/
|
||||
if (ioa_cfg->in_reset_reload || ioa_cfg->ioa_is_dead)
|
||||
return FAILED;
|
||||
if (!res || (!ipr_is_gscsi(res) && !ipr_is_vset_device(res)))
|
||||
return FAILED;
|
||||
|
||||
|
|
@ -3118,23 +3146,17 @@ static int ipr_cancel_op(struct scsi_cmnd * scsi_cmd)
|
|||
**/
|
||||
static int ipr_eh_abort(struct scsi_cmnd * scsi_cmd)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg;
|
||||
unsigned long flags;
|
||||
int rc;
|
||||
|
||||
ENTER;
|
||||
ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
|
||||
|
||||
/* If we are currently going through reset/reload, return failed. This will force the
|
||||
mid-layer to call ipr_eh_host_reset, which will then go to sleep and wait for the
|
||||
reset to complete */
|
||||
if (ioa_cfg->in_reset_reload)
|
||||
return FAILED;
|
||||
if (ioa_cfg->ioa_is_dead)
|
||||
return FAILED;
|
||||
if (!scsi_cmd->device->hostdata)
|
||||
return FAILED;
|
||||
spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags);
|
||||
rc = ipr_cancel_op(scsi_cmd);
|
||||
spin_unlock_irqrestore(scsi_cmd->device->host->host_lock, flags);
|
||||
|
||||
LEAVE;
|
||||
return ipr_cancel_op(scsi_cmd);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -5886,6 +5908,7 @@ static void __ipr_remove(struct pci_dev *pdev)
|
|||
|
||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
|
||||
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
|
||||
flush_scheduled_work();
|
||||
spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
|
||||
|
||||
spin_lock(&ipr_driver_lock);
|
||||
|
|
@ -5916,8 +5939,6 @@ static void ipr_remove(struct pci_dev *pdev)
|
|||
|
||||
ENTER;
|
||||
|
||||
ioa_cfg->allow_cmds = 0;
|
||||
flush_scheduled_work();
|
||||
ipr_remove_trace_file(&ioa_cfg->host->shost_classdev.kobj,
|
||||
&ipr_trace_attr);
|
||||
ipr_remove_dump_file(&ioa_cfg->host->shost_classdev.kobj,
|
||||
|
|
|
|||
|
|
@ -36,8 +36,8 @@
|
|||
/*
|
||||
* Literals
|
||||
*/
|
||||
#define IPR_DRIVER_VERSION "2.0.13"
|
||||
#define IPR_DRIVER_DATE "(February 21, 2005)"
|
||||
#define IPR_DRIVER_VERSION "2.0.14"
|
||||
#define IPR_DRIVER_DATE "(May 2, 2005)"
|
||||
|
||||
/*
|
||||
* IPR_DBG_TRACE: Setting this to 1 will turn on some general function tracing
|
||||
|
|
|
|||
|
|
@ -819,12 +819,15 @@ ips_eh_abort(Scsi_Cmnd * SC)
|
|||
ips_ha_t *ha;
|
||||
ips_copp_wait_item_t *item;
|
||||
int ret;
|
||||
unsigned long cpu_flags;
|
||||
struct Scsi_Host *host;
|
||||
|
||||
METHOD_TRACE("ips_eh_abort", 1);
|
||||
|
||||
if (!SC)
|
||||
return (FAILED);
|
||||
|
||||
host = SC->device->host;
|
||||
ha = (ips_ha_t *) SC->device->host->hostdata;
|
||||
|
||||
if (!ha)
|
||||
|
|
@ -833,6 +836,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
|
|||
if (!ha->active)
|
||||
return (FAILED);
|
||||
|
||||
IPS_LOCK_SAVE(host->host_lock, cpu_flags);
|
||||
|
||||
/* See if the command is on the copp queue */
|
||||
item = ha->copp_waitlist.head;
|
||||
while ((item) && (item->scsi_cmd != SC))
|
||||
|
|
@ -851,6 +856,8 @@ ips_eh_abort(Scsi_Cmnd * SC)
|
|||
/* command must have already been sent */
|
||||
ret = (FAILED);
|
||||
}
|
||||
|
||||
IPS_UNLOCK_RESTORE(host->host_lock, cpu_flags);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -866,7 +873,7 @@ ips_eh_abort(Scsi_Cmnd * SC)
|
|||
/* */
|
||||
/****************************************************************************/
|
||||
static int
|
||||
ips_eh_reset(Scsi_Cmnd * SC)
|
||||
__ips_eh_reset(Scsi_Cmnd * SC)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
|
|
@ -1053,6 +1060,18 @@ ips_eh_reset(Scsi_Cmnd * SC)
|
|||
|
||||
}
|
||||
|
||||
static int
|
||||
ips_eh_reset(Scsi_Cmnd * SC)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(SC->device->host->host_lock);
|
||||
rc = __ips_eh_reset(SC);
|
||||
spin_unlock_irq(SC->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* */
|
||||
/* Routine Name: ips_queue */
|
||||
|
|
|
|||
|
|
@ -798,7 +798,7 @@ lpfc_queuecommand(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd *))
|
|||
}
|
||||
|
||||
static int
|
||||
lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
||||
__lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
struct lpfc_hba *phba =
|
||||
(struct lpfc_hba *)cmnd->device->host->hostdata[0];
|
||||
|
|
@ -918,7 +918,17 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
|||
}
|
||||
|
||||
static int
|
||||
lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
|
||||
lpfc_abort_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
int rc;
|
||||
spin_lock_irq(cmnd->device->host->host_lock);
|
||||
rc = __lpfc_abort_handler(cmnd);
|
||||
spin_unlock_irq(cmnd->device->host->host_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
__lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
struct Scsi_Host *shost = cmnd->device->host;
|
||||
struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
|
||||
|
|
@ -1030,11 +1040,21 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
lpfc_reset_lun_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
int rc;
|
||||
spin_lock_irq(cmnd->device->host->host_lock);
|
||||
rc = __lpfc_reset_lun_handler(cmnd);
|
||||
spin_unlock_irq(cmnd->device->host->host_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: midlayer calls this function with the host_lock held
|
||||
*/
|
||||
static int
|
||||
lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
|
||||
__lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
struct Scsi_Host *shost = cmnd->device->host;
|
||||
struct lpfc_hba *phba = (struct lpfc_hba *)shost->hostdata[0];
|
||||
|
|
@ -1123,6 +1143,16 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
lpfc_reset_bus_handler(struct scsi_cmnd *cmnd)
|
||||
{
|
||||
int rc;
|
||||
spin_lock_irq(cmnd->device->host->host_lock);
|
||||
rc = __lpfc_reset_bus_handler(cmnd);
|
||||
spin_unlock_irq(cmnd->device->host->host_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
lpfc_slave_alloc(struct scsi_device *sdev)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -98,16 +98,14 @@ static int mac53c94_queue(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mac53c94_abort(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
|
||||
static int mac53c94_host_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct fsc_state *state = (struct fsc_state *) cmd->device->host->hostdata;
|
||||
struct mac53c94_regs __iomem *regs = state->regs;
|
||||
struct dbdma_regs __iomem *dma = state->dma;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(cmd->device->host->host_lock, flags);
|
||||
|
||||
writel((RUN|PAUSE|FLUSH|WAKE) << 16, &dma->control);
|
||||
writeb(CMD_SCSI_RESET, ®s->command); /* assert RST */
|
||||
|
|
@ -116,6 +114,8 @@ static int mac53c94_host_reset(struct scsi_cmnd *cmd)
|
|||
udelay(20);
|
||||
mac53c94_init(state);
|
||||
writeb(CMD_NOP, ®s->command);
|
||||
|
||||
spin_unlock_irqrestore(cmd->device->host->host_lock, flags);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
@ -416,7 +416,6 @@ static struct scsi_host_template mac53c94_template = {
|
|||
.proc_name = "53c94",
|
||||
.name = "53C94",
|
||||
.queuecommand = mac53c94_queue,
|
||||
.eh_abort_handler = mac53c94_abort,
|
||||
.eh_host_reset_handler = mac53c94_host_reset,
|
||||
.can_queue = 1,
|
||||
.this_id = 7,
|
||||
|
|
|
|||
|
|
@ -591,8 +591,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = macscsi_queue_command,
|
||||
.eh_abort_handler = macscsi_abort,
|
||||
.eh_bus_reset_handler = macscsi_bus_reset,
|
||||
.eh_device_reset_handler = macscsi_device_reset,
|
||||
.eh_host_reset_handler = macscsi_host_reset,
|
||||
.can_queue = CAN_QUEUE,
|
||||
.this_id = 7,
|
||||
.sg_tablesize = SG_ALL,
|
||||
|
|
|
|||
|
|
@ -72,8 +72,6 @@
|
|||
#define NCR5380_queue_command macscsi_queue_command
|
||||
#define NCR5380_abort macscsi_abort
|
||||
#define NCR5380_bus_reset macscsi_bus_reset
|
||||
#define NCR5380_device_reset macscsi_device_reset
|
||||
#define NCR5380_host_reset macscsi_host_reset
|
||||
#define NCR5380_proc_info macscsi_proc_info
|
||||
|
||||
#define BOARD_NORMAL 0
|
||||
|
|
|
|||
|
|
@ -1938,7 +1938,7 @@ megaraid_abort(Scsi_Cmnd *cmd)
|
|||
|
||||
|
||||
static int
|
||||
megaraid_reset(Scsi_Cmnd *cmd)
|
||||
__megaraid_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
adapter_t *adapter;
|
||||
megacmd_t mc;
|
||||
|
|
@ -1972,6 +1972,18 @@ megaraid_reset(Scsi_Cmnd *cmd)
|
|||
return rval;
|
||||
}
|
||||
|
||||
static int
|
||||
megaraid_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
adapter = (adapter_t *)cmd->device->host->hostdata;
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(&adapter->lock);
|
||||
rc = __megaraid_reset(cmd);
|
||||
spin_unlock_irq(&adapter->lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FILE : megaraid_mbox.c
|
||||
* Version : v2.20.4.5 (Feb 03 2005)
|
||||
* Version : v2.20.4.6 (Mar 07 2005)
|
||||
*
|
||||
* Authors:
|
||||
* Atul Mukker <Atul.Mukker@lsil.com>
|
||||
|
|
@ -202,7 +202,7 @@ MODULE_PARM_DESC(debug_level, "Debug level for driver (default=0)");
|
|||
* ### global data ###
|
||||
*/
|
||||
static uint8_t megaraid_mbox_version[8] =
|
||||
{ 0x02, 0x20, 0x04, 0x05, 2, 3, 20, 5 };
|
||||
{ 0x02, 0x20, 0x04, 0x06, 3, 7, 20, 5 };
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -229,9 +229,9 @@ static struct pci_device_id pci_id_table_g[] = {
|
|||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_PERC4_QC,
|
||||
PCI_VENDOR_ID_DELL,
|
||||
PCI_SUBSYS_ID_PERC4_QC,
|
||||
PCI_DEVICE_ID_VERDE,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_DELL,
|
||||
|
|
@ -271,15 +271,9 @@ static struct pci_device_id pci_id_table_g[] = {
|
|||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_PERC4E_DC_320_2E,
|
||||
PCI_VENDOR_ID_DELL,
|
||||
PCI_SUBSYS_ID_PERC4E_DC_320_2E,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_PERC4E_SC_320_1E,
|
||||
PCI_VENDOR_ID_DELL,
|
||||
PCI_SUBSYS_ID_PERC4E_SC_320_1E,
|
||||
PCI_DEVICE_ID_DOBSON,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_AMI,
|
||||
|
|
@ -329,36 +323,6 @@ static struct pci_device_id pci_id_table_g[] = {
|
|||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_2,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SCSI_320_0x,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_0x,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SCSI_320_2x,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_2x,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SCSI_320_4x,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_4x,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SCSI_320_1E,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_1E,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SCSI_320_2E,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SCSI_320_2E,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_I4_133_RAID,
|
||||
|
|
@ -379,21 +343,9 @@ static struct pci_device_id pci_id_table_g[] = {
|
|||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SATA_300_4x,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SATA_300_4x,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_SATA_300_8x,
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_SUBSYS_ID_MEGARAID_SATA_300_8x,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SRCU42X,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCU42X,
|
||||
PCI_DEVICE_ID_LINDSAY,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
|
|
@ -401,60 +353,12 @@ static struct pci_device_id pci_id_table_g[] = {
|
|||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCS16,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SRCU42E,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCU42E,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SRCZCRX,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCZCRX,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SRCS28X,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCS28X,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_ALIEF,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_ALIEF,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_HARWICH,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_HARWICH,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
|
||||
PCI_SUBSYS_ID_FSC,
|
||||
PCI_SUBSYS_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_ACER_ROMB_2E,
|
||||
PCI_VENDOR_ID_AI,
|
||||
PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E,
|
||||
},
|
||||
{
|
||||
PCI_VENDOR_ID_LSI_LOGIC,
|
||||
PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E,
|
||||
PCI_VENDOR_ID_NEC,
|
||||
PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E,
|
||||
},
|
||||
{0} /* Terminating entry */
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pci_id_table_g);
|
||||
|
|
@ -539,7 +443,8 @@ megaraid_init(void)
|
|||
|
||||
|
||||
// register as a PCI hot-plug driver module
|
||||
if ((rval = pci_module_init(&megaraid_pci_driver_g))) {
|
||||
rval = pci_register_driver(&megaraid_pci_driver_g);
|
||||
if (rval < 0) {
|
||||
con_log(CL_ANN, (KERN_WARNING
|
||||
"megaraid: could not register hotplug support.\n"));
|
||||
}
|
||||
|
|
@ -619,7 +524,7 @@ megaraid_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
|
||||
// Setup the default DMA mask. This would be changed later on
|
||||
// depending on hardware capabilities
|
||||
if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFF) != 0) {
|
||||
if (pci_set_dma_mask(adapter->pdev, DMA_32BIT_MASK) != 0) {
|
||||
|
||||
con_log(CL_ANN, (KERN_WARNING
|
||||
"megaraid: pci_set_dma_mask failed:%d\n", __LINE__));
|
||||
|
|
@ -1031,7 +936,7 @@ megaraid_init_mbox(adapter_t *adapter)
|
|||
|
||||
// Set the DMA mask to 64-bit. All supported controllers as capable of
|
||||
// DMA in this range
|
||||
if (pci_set_dma_mask(adapter->pdev, 0xFFFFFFFFFFFFFFFFULL) != 0) {
|
||||
if (pci_set_dma_mask(adapter->pdev, DMA_64BIT_MASK) != 0) {
|
||||
|
||||
con_log(CL_ANN, (KERN_WARNING
|
||||
"megaraid: could not set DMA mask for 64-bit.\n"));
|
||||
|
|
@ -2661,7 +2566,7 @@ megaraid_mbox_dpc(unsigned long devp)
|
|||
* aborted. All the commands issued to the F/W must complete.
|
||||
**/
|
||||
static int
|
||||
megaraid_abort_handler(struct scsi_cmnd *scp)
|
||||
__megaraid_abort_handler(struct scsi_cmnd *scp)
|
||||
{
|
||||
adapter_t *adapter;
|
||||
mraid_device_t *raid_dev;
|
||||
|
|
@ -2794,6 +2699,21 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
|
|||
return FAILED;
|
||||
}
|
||||
|
||||
static int
|
||||
megaraid_abort_handler(struct scsi_cmnd *scp)
|
||||
{
|
||||
adapter_t *adapter;
|
||||
int rc;
|
||||
|
||||
adapter = SCP2ADAPTER(scp);
|
||||
|
||||
spin_lock_irq(adapter->host_lock);
|
||||
rc = __megaraid_abort_handler(scp);
|
||||
spin_unlock_irq(adapter->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* megaraid_reset_handler - device reset hadler for mailbox based driver
|
||||
|
|
@ -2806,7 +2726,7 @@ megaraid_abort_handler(struct scsi_cmnd *scp)
|
|||
* host
|
||||
**/
|
||||
static int
|
||||
megaraid_reset_handler(struct scsi_cmnd *scp)
|
||||
__megaraid_reset_handler(struct scsi_cmnd *scp)
|
||||
{
|
||||
adapter_t *adapter;
|
||||
scb_t *scb;
|
||||
|
|
@ -2927,6 +2847,18 @@ megaraid_reset_handler(struct scsi_cmnd *scp)
|
|||
return rval;
|
||||
}
|
||||
|
||||
static int
|
||||
megaraid_reset_handler(struct scsi_cmnd *cmd)
|
||||
{
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = __megaraid_reset_handler(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* START: internal commands library
|
||||
|
|
|
|||
|
|
@ -21,8 +21,8 @@
|
|||
#include "megaraid_ioctl.h"
|
||||
|
||||
|
||||
#define MEGARAID_VERSION "2.20.4.5"
|
||||
#define MEGARAID_EXT_VERSION "(Release Date: Thu Feb 03 12:27:22 EST 2005)"
|
||||
#define MEGARAID_VERSION "2.20.4.6"
|
||||
#define MEGARAID_EXT_VERSION "(Release Date: Mon Mar 07 12:27:22 EST 2005)"
|
||||
|
||||
|
||||
/*
|
||||
|
|
@ -37,8 +37,7 @@
|
|||
#define PCI_DEVICE_ID_PERC4_DC 0x1960
|
||||
#define PCI_SUBSYS_ID_PERC4_DC 0x0518
|
||||
|
||||
#define PCI_DEVICE_ID_PERC4_QC 0x0407
|
||||
#define PCI_SUBSYS_ID_PERC4_QC 0x0531
|
||||
#define PCI_DEVICE_ID_VERDE 0x0407
|
||||
|
||||
#define PCI_DEVICE_ID_PERC4_DI_EVERGLADES 0x000F
|
||||
#define PCI_SUBSYS_ID_PERC4_DI_EVERGLADES 0x014A
|
||||
|
|
@ -58,11 +57,7 @@
|
|||
#define PCI_DEVICE_ID_PERC4E_DI_GUADALUPE 0x0013
|
||||
#define PCI_SUBSYS_ID_PERC4E_DI_GUADALUPE 0x0170
|
||||
|
||||
#define PCI_DEVICE_ID_PERC4E_DC_320_2E 0x0408
|
||||
#define PCI_SUBSYS_ID_PERC4E_DC_320_2E 0x0002
|
||||
|
||||
#define PCI_DEVICE_ID_PERC4E_SC_320_1E 0x0408
|
||||
#define PCI_SUBSYS_ID_PERC4E_SC_320_1E 0x0001
|
||||
#define PCI_DEVICE_ID_DOBSON 0x0408
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_0 0x1960
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_0 0xA520
|
||||
|
|
@ -73,21 +68,6 @@
|
|||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2 0x1960
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2 0x0518
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_0x 0x0407
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_0x 0x0530
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2x 0x0407
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2x 0x0532
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_4x 0x0407
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_4x 0x0531
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_1E 0x0408
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_1E 0x0001
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SCSI_320_2E 0x0408
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SCSI_320_2E 0x0002
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_I4_133_RAID 0x1960
|
||||
#define PCI_SUBSYS_ID_MEGARAID_I4_133_RAID 0x0522
|
||||
|
||||
|
|
@ -97,52 +77,18 @@
|
|||
#define PCI_DEVICE_ID_MEGARAID_SATA_150_6 0x1960
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SATA_150_6 0x0523
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SATA_300_4x 0x0409
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SATA_300_4x 0x3004
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_SATA_300_8x 0x0409
|
||||
#define PCI_SUBSYS_ID_MEGARAID_SATA_300_8x 0x3008
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCU42X 0x0407
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCU42X 0x0532
|
||||
#define PCI_DEVICE_ID_LINDSAY 0x0409
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCS16 0x1960
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCS16 0x0523
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCU42E 0x0408
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCU42E 0x0002
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCZCRX 0x0407
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCZCRX 0x0530
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCS28X 0x0409
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCS28X 0x3008
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_ALIEF 0x0408
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_ALIEF 0x3431
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SROMBU42E_HARWICH 0x0408
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SROMBU42E_HARWICH 0x3499
|
||||
|
||||
#define PCI_DEVICE_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK 0x1960
|
||||
#define PCI_SUBSYS_ID_INTEL_RAID_SRCU41L_LAKE_SHETEK 0x0520
|
||||
|
||||
#define PCI_DEVICE_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB 0x0408
|
||||
#define PCI_SUBSYS_ID_FSC_MEGARAID_PCI_EXPRESS_ROMB 0x1065
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_ACER_ROMB_2E 0x0408
|
||||
#define PCI_SUBSYS_ID_MEGARAID_ACER_ROMB_2E 0x004D
|
||||
|
||||
#define PCI_SUBSYS_ID_PERC3_QC 0x0471
|
||||
#define PCI_SUBSYS_ID_PERC3_DC 0x0493
|
||||
#define PCI_SUBSYS_ID_PERC3_SC 0x0475
|
||||
|
||||
#define PCI_DEVICE_ID_MEGARAID_NEC_ROMB_2E 0x0408
|
||||
#define PCI_SUBSYS_ID_MEGARAID_NEC_ROMB_2E 0x8287
|
||||
|
||||
#ifndef PCI_SUBSYS_ID_FSC
|
||||
#define PCI_SUBSYS_ID_FSC 0x1734
|
||||
#endif
|
||||
|
||||
#define MBOX_MAX_SCSI_CMDS 128 // number of cmds reserved for kernel
|
||||
#define MBOX_MAX_USER_CMDS 32 // number of cmds for applications
|
||||
|
|
|
|||
|
|
@ -10,13 +10,12 @@
|
|||
* 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FILE : megaraid_mm.c
|
||||
* Version : v2.20.2.5 (Jan 21 2005)
|
||||
* Version : v2.20.2.6 (Mar 7 2005)
|
||||
*
|
||||
* Common management module
|
||||
*/
|
||||
|
||||
#include "megaraid_mm.h"
|
||||
#include <linux/smp_lock.h>
|
||||
|
||||
|
||||
// Entry points for char node driver
|
||||
|
|
@ -61,7 +60,7 @@ EXPORT_SYMBOL(mraid_mm_unregister_adp);
|
|||
EXPORT_SYMBOL(mraid_mm_adapter_app_handle);
|
||||
|
||||
static int majorno;
|
||||
static uint32_t drvr_ver = 0x02200201;
|
||||
static uint32_t drvr_ver = 0x02200206;
|
||||
|
||||
static int adapters_count_g;
|
||||
static struct list_head adapters_list_g;
|
||||
|
|
@ -1231,9 +1230,9 @@ mraid_mm_compat_ioctl(struct file *filep, unsigned int cmd,
|
|||
unsigned long arg)
|
||||
{
|
||||
int err;
|
||||
lock_kernel();
|
||||
|
||||
err = mraid_mm_ioctl(NULL, filep, cmd, arg);
|
||||
unlock_kernel();
|
||||
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -29,9 +29,9 @@
|
|||
#include "megaraid_ioctl.h"
|
||||
|
||||
|
||||
#define LSI_COMMON_MOD_VERSION "2.20.2.5"
|
||||
#define LSI_COMMON_MOD_VERSION "2.20.2.6"
|
||||
#define LSI_COMMON_MOD_EXT_VERSION \
|
||||
"(Release Date: Fri Jan 21 00:01:03 EST 2005)"
|
||||
"(Release Date: Mon Mar 7 00:01:03 EST 2005)"
|
||||
|
||||
|
||||
#define LSI_DBGLVL dbglevel
|
||||
|
|
|
|||
|
|
@ -1715,9 +1715,12 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
|
|||
struct mesh_state *ms = (struct mesh_state *) cmd->device->host->hostdata;
|
||||
volatile struct mesh_regs __iomem *mr = ms->mesh;
|
||||
volatile struct dbdma_regs __iomem *md = ms->dma;
|
||||
unsigned long flags;
|
||||
|
||||
printk(KERN_DEBUG "mesh_host_reset\n");
|
||||
|
||||
spin_lock_irqsave(ms->host->host_lock, flags);
|
||||
|
||||
/* Reset the controller & dbdma channel */
|
||||
out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16); /* stop dma */
|
||||
out_8(&mr->exception, 0xff); /* clear all exception bits */
|
||||
|
|
@ -1739,6 +1742,7 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
|
|||
/* Complete pending commands */
|
||||
handle_reset(ms);
|
||||
|
||||
spin_unlock_irqrestore(ms->host->host_lock, flags);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -116,7 +116,14 @@ int mvme147_detect(Scsi_Host_Template *tpnt)
|
|||
static int mvme147_bus_reset(Scsi_Cmnd *cmd)
|
||||
{
|
||||
/* FIXME perform bus-specific reset */
|
||||
|
||||
/* FIXME 2: kill this function, and let midlayer fallback to
|
||||
the same result, calling wd33c93_host_reset() */
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
wd33c93_host_reset(cmd);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -294,7 +294,6 @@ static struct scsi_host_template nsp32_template = {
|
|||
.this_id = NSP32_HOST_SCSIID,
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
.eh_abort_handler = nsp32_eh_abort,
|
||||
/* .eh_device_reset_handler = NULL, */
|
||||
.eh_bus_reset_handler = nsp32_eh_bus_reset,
|
||||
.eh_host_reset_handler = nsp32_eh_host_reset,
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74))
|
||||
|
|
@ -2988,6 +2987,8 @@ static int nsp32_eh_bus_reset(struct scsi_cmnd *SCpnt)
|
|||
nsp32_hw_data *data = (nsp32_hw_data *)SCpnt->device->host->hostdata;
|
||||
unsigned int base = SCpnt->device->host->io_port;
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
nsp32_msg(KERN_INFO, "Bus Reset");
|
||||
nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt);
|
||||
|
||||
|
|
@ -2995,6 +2996,7 @@ static int nsp32_eh_bus_reset(struct scsi_cmnd *SCpnt)
|
|||
nsp32_do_bus_reset(data);
|
||||
nsp32_write2(base, IRQ_CONTROL, 0);
|
||||
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return SUCCESS; /* SCSI bus reset is succeeded at any time. */
|
||||
}
|
||||
|
||||
|
|
@ -3049,11 +3051,14 @@ static int nsp32_eh_host_reset(struct scsi_cmnd *SCpnt)
|
|||
nsp32_msg(KERN_INFO, "Host Reset");
|
||||
nsp32_dbg(NSP32_DEBUG_BUSRESET, "SCpnt=0x%x", SCpnt);
|
||||
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
nsp32hw_init(data);
|
||||
nsp32_write2(base, IRQ_CONTROL, IRQ_CONTROL_ALL_IRQ_MASK);
|
||||
nsp32_do_bus_reset(data);
|
||||
nsp32_write2(base, IRQ_CONTROL, 0);
|
||||
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
return SUCCESS; /* Host reset is succeeded at any time. */
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -621,8 +621,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.queuecommand = pas16_queue_command,
|
||||
.eh_abort_handler = pas16_abort,
|
||||
.eh_bus_reset_handler = pas16_bus_reset,
|
||||
.eh_device_reset_handler = pas16_device_reset,
|
||||
.eh_host_reset_handler = pas16_host_reset,
|
||||
.bios_param = pas16_biosparam,
|
||||
.can_queue = CAN_QUEUE,
|
||||
.this_id = 7,
|
||||
|
|
|
|||
|
|
@ -120,8 +120,6 @@ static int pas16_biosparam(struct scsi_device *, struct block_device *,
|
|||
static int pas16_detect(Scsi_Host_Template *);
|
||||
static int pas16_queue_command(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
|
||||
static int pas16_bus_reset(Scsi_Cmnd *);
|
||||
static int pas16_host_reset(Scsi_Cmnd *);
|
||||
static int pas16_device_reset(Scsi_Cmnd *);
|
||||
|
||||
#ifndef CMD_PER_LUN
|
||||
#define CMD_PER_LUN 2
|
||||
|
|
@ -164,9 +162,7 @@ static int pas16_device_reset(Scsi_Cmnd *);
|
|||
#define do_NCR5380_intr do_pas16_intr
|
||||
#define NCR5380_queue_command pas16_queue_command
|
||||
#define NCR5380_abort pas16_abort
|
||||
#define NCR5380_device_reset pas16_device_reset
|
||||
#define NCR5380_bus_reset pas16_bus_reset
|
||||
#define NCR5380_host_reset pas16_host_reset
|
||||
#define NCR5380_proc_info pas16_proc_info
|
||||
|
||||
/* 15 14 12 10 7 5 3
|
||||
|
|
|
|||
|
|
@ -1,836 +0,0 @@
|
|||
/****************************************************************************
|
||||
* Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
|
||||
*
|
||||
* pci2000.c - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
|
||||
*
|
||||
* Copyright (c) 1997-1999 Perceptive Solutions, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that redistributions of source
|
||||
* code retain the above copyright notice and this comment without
|
||||
* modification.
|
||||
*
|
||||
* Technical updates and product information at:
|
||||
* http://www.psidisk.com
|
||||
*
|
||||
* Please send questions, comments, bug reports to:
|
||||
* tech@psidisk.com Technical Support
|
||||
*
|
||||
*
|
||||
* Revisions 1.10 Jan-21-1999
|
||||
* - Fixed sign on message to reflect proper controller name.
|
||||
* - Added support for RAID status monitoring and control.
|
||||
*
|
||||
* Revisions 1.11 Mar-22-1999
|
||||
* - Fixed control timeout to not lock up the entire system if
|
||||
* controller goes offline completely.
|
||||
*
|
||||
* Revisions 1.12 Mar-26-1999
|
||||
* - Fixed spinlock and PCI configuration.
|
||||
*
|
||||
* Revisions 1.20 Mar-27-2000
|
||||
* - Added support for dynamic DMA
|
||||
*
|
||||
****************************************************************************/
|
||||
#define PCI2000_VERSION "1.20"
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/stat.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/dma.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "scsi.h"
|
||||
#include <scsi/scsi_host.h>
|
||||
#include "pci2000.h"
|
||||
#include "psi_roy.h"
|
||||
|
||||
|
||||
//#define DEBUG 1
|
||||
|
||||
#ifdef DEBUG
|
||||
#define DEB(x) x
|
||||
#define STOP_HERE {int st;for(st=0;st<100;st++){st=1;}}
|
||||
#else
|
||||
#define DEB(x)
|
||||
#define STOP_HERE
|
||||
#endif
|
||||
|
||||
typedef struct
|
||||
{
|
||||
unsigned int address;
|
||||
unsigned int length;
|
||||
} SCATGATH, *PSCATGATH;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Scsi_Cmnd *SCpnt;
|
||||
PSCATGATH scatGath;
|
||||
dma_addr_t scatGathDma;
|
||||
UCHAR *cdb;
|
||||
dma_addr_t cdbDma;
|
||||
UCHAR tag;
|
||||
} DEV2000, *PDEV2000;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
ULONG basePort;
|
||||
ULONG mb0;
|
||||
ULONG mb1;
|
||||
ULONG mb2;
|
||||
ULONG mb3;
|
||||
ULONG mb4;
|
||||
ULONG cmd;
|
||||
ULONG tag;
|
||||
ULONG irqOwned;
|
||||
struct pci_dev *pdev;
|
||||
DEV2000 dev[MAX_BUS][MAX_UNITS];
|
||||
} ADAPTER2000, *PADAPTER2000;
|
||||
|
||||
#define HOSTDATA(host) ((PADAPTER2000)&host->hostdata)
|
||||
#define consistentLen (MAX_BUS * MAX_UNITS * (16 * sizeof (SCATGATH) + MAX_COMMAND_SIZE))
|
||||
|
||||
|
||||
static struct Scsi_Host *PsiHost[MAXADAPTER] = {NULL,}; // One for each adapter
|
||||
static int NumAdapters = 0;
|
||||
/****************************************************************
|
||||
* Name: WaitReady :LOCAL
|
||||
*
|
||||
* Description: Wait for controller ready.
|
||||
*
|
||||
* Parameters: padapter - Pointer adapter data structure.
|
||||
*
|
||||
* Returns: TRUE on not ready.
|
||||
*
|
||||
****************************************************************/
|
||||
static int WaitReady (PADAPTER2000 padapter)
|
||||
{
|
||||
ULONG z;
|
||||
|
||||
for ( z = 0; z < (TIMEOUT_COMMAND * 4); z++ )
|
||||
{
|
||||
if ( !inb_p (padapter->cmd) )
|
||||
return FALSE;
|
||||
udelay (250);
|
||||
};
|
||||
return TRUE;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: WaitReadyLong :LOCAL
|
||||
*
|
||||
* Description: Wait for controller ready.
|
||||
*
|
||||
* Parameters: padapter - Pointer adapter data structure.
|
||||
*
|
||||
* Returns: TRUE on not ready.
|
||||
*
|
||||
****************************************************************/
|
||||
static int WaitReadyLong (PADAPTER2000 padapter)
|
||||
{
|
||||
ULONG z;
|
||||
|
||||
for ( z = 0; z < (5000 * 4); z++ )
|
||||
{
|
||||
if ( !inb_p (padapter->cmd) )
|
||||
return FALSE;
|
||||
udelay (250);
|
||||
};
|
||||
return TRUE;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: OpDone :LOCAL
|
||||
*
|
||||
* Description: Clean up operation and issue done to caller.
|
||||
*
|
||||
* Parameters: SCpnt - Pointer to SCSI command structure.
|
||||
* status - Caller status.
|
||||
*
|
||||
* Returns: Nothing.
|
||||
*
|
||||
****************************************************************/
|
||||
static void OpDone (Scsi_Cmnd *SCpnt, ULONG status)
|
||||
{
|
||||
SCpnt->result = status;
|
||||
SCpnt->scsi_done (SCpnt);
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Command :LOCAL
|
||||
*
|
||||
* Description: Issue queued command to the PCI-2000.
|
||||
*
|
||||
* Parameters: padapter - Pointer to adapter information structure.
|
||||
* cmd - PCI-2000 command byte.
|
||||
*
|
||||
* Returns: Non-zero command tag if operation is accepted.
|
||||
*
|
||||
****************************************************************/
|
||||
static UCHAR Command (PADAPTER2000 padapter, UCHAR cmd)
|
||||
{
|
||||
outb_p (cmd, padapter->cmd);
|
||||
if ( WaitReady (padapter) )
|
||||
return 0;
|
||||
|
||||
if ( inw_p (padapter->mb0) )
|
||||
return 0;
|
||||
|
||||
return inb_p (padapter->mb1);
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: BuildSgList :LOCAL
|
||||
*
|
||||
* Description: Build the scatter gather list for controller.
|
||||
*
|
||||
* Parameters: SCpnt - Pointer to SCSI command structure.
|
||||
* padapter - Pointer to adapter information structure.
|
||||
* pdev - Pointer to adapter device structure.
|
||||
*
|
||||
* Returns: Non-zero in not scatter gather.
|
||||
*
|
||||
****************************************************************/
|
||||
static int BuildSgList (Scsi_Cmnd *SCpnt, PADAPTER2000 padapter, PDEV2000 pdev)
|
||||
{
|
||||
int z;
|
||||
int zc;
|
||||
struct scatterlist *sg;
|
||||
|
||||
if ( SCpnt->use_sg )
|
||||
{
|
||||
sg = (struct scatterlist *)SCpnt->request_buffer;
|
||||
zc = pci_map_sg (padapter->pdev, sg, SCpnt->use_sg, SCpnt->sc_data_direction);
|
||||
for ( z = 0; z < zc; z++ )
|
||||
{
|
||||
pdev->scatGath[z].address = cpu_to_le32 (sg_dma_address (sg));
|
||||
pdev->scatGath[z].length = cpu_to_le32 (sg_dma_len (sg++));
|
||||
}
|
||||
outl (pdev->scatGathDma, padapter->mb2);
|
||||
outl ((zc << 24) | SCpnt->request_bufflen, padapter->mb3);
|
||||
return FALSE;
|
||||
}
|
||||
if ( !SCpnt->request_bufflen)
|
||||
{
|
||||
outl (0, padapter->mb2);
|
||||
outl (0, padapter->mb3);
|
||||
return TRUE;
|
||||
}
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
|
||||
SCpnt->request_buffer, SCpnt->request_bufflen,
|
||||
SCpnt->sc_data_direction);
|
||||
outl (SCpnt->SCp.have_data_in, padapter->mb2);
|
||||
outl (SCpnt->request_bufflen, padapter->mb3);
|
||||
return TRUE;
|
||||
}
|
||||
/*********************************************************************
|
||||
* Name: PsiRaidCmd
|
||||
*
|
||||
* Description: Execute a simple command.
|
||||
*
|
||||
* Parameters: padapter - Pointer to adapter control structure.
|
||||
* cmd - Roy command byte.
|
||||
*
|
||||
* Returns: Return error status.
|
||||
*
|
||||
********************************************************************/
|
||||
static int PsiRaidCmd (PADAPTER2000 padapter, char cmd)
|
||||
{
|
||||
if ( WaitReady (padapter) ) // test for command register ready
|
||||
return DID_TIME_OUT;
|
||||
outb_p (cmd, padapter->cmd); // issue command
|
||||
if ( WaitReadyLong (padapter) ) // wait for adapter ready
|
||||
return DID_TIME_OUT;
|
||||
return DID_OK;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Irq_Handler :LOCAL
|
||||
*
|
||||
* Description: Interrupt handler.
|
||||
*
|
||||
* Parameters: irq - Hardware IRQ number.
|
||||
* dev_id -
|
||||
* regs -
|
||||
*
|
||||
* Returns: TRUE if drive is not ready in time.
|
||||
*
|
||||
****************************************************************/
|
||||
static irqreturn_t Irq_Handler (int irq, void *dev_id, struct pt_regs *regs)
|
||||
{
|
||||
struct Scsi_Host *shost = NULL; // Pointer to host data block
|
||||
PADAPTER2000 padapter; // Pointer to adapter control structure
|
||||
PDEV2000 pdev;
|
||||
Scsi_Cmnd *SCpnt;
|
||||
UCHAR tag = 0;
|
||||
UCHAR tag0;
|
||||
ULONG error;
|
||||
int pun;
|
||||
int bus;
|
||||
int z;
|
||||
unsigned long flags;
|
||||
int handled = 0;
|
||||
|
||||
DEB(printk ("\npci2000 received interrupt "));
|
||||
for ( z = 0; z < NumAdapters; z++ ) // scan for interrupt to process
|
||||
{
|
||||
if ( PsiHost[z]->irq == (UCHAR)(irq & 0xFF) )
|
||||
{
|
||||
tag = inb_p (HOSTDATA(PsiHost[z])->tag);
|
||||
if ( tag )
|
||||
{
|
||||
shost = PsiHost[z];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !shost )
|
||||
{
|
||||
DEB (printk ("\npci2000: not my interrupt"));
|
||||
goto out;
|
||||
}
|
||||
|
||||
handled = 1;
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
padapter = HOSTDATA(shost);
|
||||
|
||||
tag0 = tag & 0x7F; // mask off the error bit
|
||||
for ( bus = 0; bus < MAX_BUS; bus++ ) // scan the busses
|
||||
{
|
||||
for ( pun = 0; pun < MAX_UNITS; pun++ ) // scan the targets
|
||||
{
|
||||
pdev = &padapter->dev[bus][pun];
|
||||
if ( !pdev->tag )
|
||||
continue;
|
||||
if ( pdev->tag == tag0 ) // is this it?
|
||||
{
|
||||
pdev->tag = 0;
|
||||
SCpnt = pdev->SCpnt;
|
||||
goto unmapProceed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
outb_p (0xFF, padapter->tag); // clear the op interrupt
|
||||
outb_p (CMD_DONE, padapter->cmd); // complete the op
|
||||
goto irq_return; // done, but, with what?
|
||||
|
||||
unmapProceed:;
|
||||
if ( !bus )
|
||||
{
|
||||
switch ( SCpnt->cmnd[0] )
|
||||
{
|
||||
case SCSIOP_TEST_UNIT_READY:
|
||||
pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
|
||||
goto irqProceed;
|
||||
case SCSIOP_READ_CAPACITY:
|
||||
pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, 8, PCI_DMA_FROMDEVICE);
|
||||
goto irqProceed;
|
||||
case SCSIOP_VERIFY:
|
||||
case SCSIOP_START_STOP_UNIT:
|
||||
case SCSIOP_MEDIUM_REMOVAL:
|
||||
goto irqProceed;
|
||||
}
|
||||
}
|
||||
if ( SCpnt->SCp.have_data_in )
|
||||
pci_unmap_single (padapter->pdev, SCpnt->SCp.have_data_in, SCpnt->request_bufflen, SCpnt->sc_data_direction);
|
||||
else
|
||||
{
|
||||
if ( SCpnt->use_sg )
|
||||
pci_unmap_sg (padapter->pdev, (struct scatterlist *)SCpnt->request_buffer, SCpnt->use_sg, SCpnt->sc_data_direction);
|
||||
}
|
||||
|
||||
irqProceed:;
|
||||
if ( tag & ERR08_TAGGED ) // is there an error here?
|
||||
{
|
||||
if ( WaitReady (padapter) )
|
||||
{
|
||||
OpDone (SCpnt, DID_TIME_OUT << 16);
|
||||
goto irq_return;
|
||||
}
|
||||
|
||||
outb_p (tag0, padapter->mb0); // get real error code
|
||||
outb_p (CMD_ERROR, padapter->cmd);
|
||||
if ( WaitReady (padapter) ) // wait for controller to suck up the op
|
||||
{
|
||||
OpDone (SCpnt, DID_TIME_OUT << 16);
|
||||
goto irq_return;
|
||||
}
|
||||
|
||||
error = inl (padapter->mb0); // get error data
|
||||
outb_p (0xFF, padapter->tag); // clear the op interrupt
|
||||
outb_p (CMD_DONE, padapter->cmd); // complete the op
|
||||
|
||||
DEB (printk ("status: %lX ", error));
|
||||
if ( error == 0x00020002 ) // is this error a check condition?
|
||||
{
|
||||
if ( bus ) // are we doint SCSI commands?
|
||||
{
|
||||
OpDone (SCpnt, (DID_OK << 16) | 2);
|
||||
goto irq_return;
|
||||
}
|
||||
if ( *SCpnt->cmnd == SCSIOP_TEST_UNIT_READY )
|
||||
OpDone (SCpnt, (DRIVER_SENSE << 24) | (DID_OK << 16) | 2); // test caller we have sense data too
|
||||
else
|
||||
OpDone (SCpnt, DID_ERROR << 16);
|
||||
goto irq_return;
|
||||
}
|
||||
OpDone (SCpnt, DID_ERROR << 16);
|
||||
goto irq_return;
|
||||
}
|
||||
|
||||
outb_p (0xFF, padapter->tag); // clear the op interrupt
|
||||
outb_p (CMD_DONE, padapter->cmd); // complete the op
|
||||
OpDone (SCpnt, DID_OK << 16);
|
||||
|
||||
irq_return:
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
out:
|
||||
return IRQ_RETVAL(handled);
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Pci2000_QueueCommand
|
||||
*
|
||||
* Description: Process a queued command from the SCSI manager.
|
||||
*
|
||||
* Parameters: SCpnt - Pointer to SCSI command structure.
|
||||
* done - Pointer to done function to call.
|
||||
*
|
||||
* Returns: Status code.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
|
||||
{
|
||||
UCHAR *cdb = (UCHAR *)SCpnt->cmnd; // Pointer to SCSI CDB
|
||||
PADAPTER2000 padapter = HOSTDATA(SCpnt->device->host); // Pointer to adapter control structure
|
||||
int rc = -1; // command return code
|
||||
UCHAR bus = SCpnt->device->channel;
|
||||
UCHAR pun = SCpnt->device->id;
|
||||
UCHAR lun = SCpnt->device->lun;
|
||||
UCHAR cmd;
|
||||
PDEV2000 pdev = &padapter->dev[bus][pun];
|
||||
|
||||
if ( !done )
|
||||
{
|
||||
printk("pci2000_queuecommand: %02X: done can't be NULL\n", *cdb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
SCpnt->scsi_done = done;
|
||||
SCpnt->SCp.have_data_in = 0;
|
||||
pdev->SCpnt = SCpnt; // Save this command data
|
||||
|
||||
if ( WaitReady (padapter) )
|
||||
{
|
||||
rc = DID_ERROR;
|
||||
goto finished;
|
||||
}
|
||||
|
||||
outw_p (pun | (lun << 8), padapter->mb0);
|
||||
|
||||
if ( bus )
|
||||
{
|
||||
DEB (if(*cdb) printk ("\nCDB: %X- %X %X %X %X %X %X %X %X %X %X ", SCpnt->cmd_len, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9]));
|
||||
DEB (if(*cdb) printk ("\ntimeout_per_command: %d, timeout_total: %d, timeout: %d", SCpnt->timeout_per_command,
|
||||
SCpnt->timeout_total, SCpnt->timeout));
|
||||
outl (SCpnt->timeout_per_command, padapter->mb1);
|
||||
outb_p (CMD_SCSI_TIMEOUT, padapter->cmd);
|
||||
if ( WaitReady (padapter) )
|
||||
{
|
||||
rc = DID_ERROR;
|
||||
goto finished;
|
||||
}
|
||||
|
||||
outw_p (pun | (lun << 8), padapter->mb0);
|
||||
outw_p (SCpnt->cmd_len << 8, padapter->mb0 + 2);
|
||||
memcpy (pdev->cdb, cdb, MAX_COMMAND_SIZE);
|
||||
|
||||
outl (pdev->cdbDma, padapter->mb1);
|
||||
if ( BuildSgList (SCpnt, padapter, pdev) )
|
||||
cmd = CMD_SCSI_THRU;
|
||||
else
|
||||
cmd = CMD_SCSI_THRU_SG;
|
||||
if ( (pdev->tag = Command (padapter, cmd)) == 0 )
|
||||
rc = DID_TIME_OUT;
|
||||
goto finished;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( lun )
|
||||
{
|
||||
rc = DID_BAD_TARGET;
|
||||
goto finished;
|
||||
}
|
||||
}
|
||||
|
||||
switch ( *cdb )
|
||||
{
|
||||
case SCSIOP_INQUIRY: // inquiry CDB
|
||||
if ( cdb[2] == SC_MY_RAID )
|
||||
{
|
||||
switch ( cdb[3] )
|
||||
{
|
||||
case MY_SCSI_REBUILD:
|
||||
OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_REBUILD) << 16);
|
||||
return 0;
|
||||
case MY_SCSI_ALARMMUTE:
|
||||
OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_MUTE) << 16);
|
||||
return 0;
|
||||
case MY_SCSI_DEMOFAIL:
|
||||
OpDone (SCpnt, PsiRaidCmd (padapter, CMD_RAID_FAIL) << 16);
|
||||
return 0;
|
||||
default:
|
||||
if ( SCpnt->use_sg )
|
||||
{
|
||||
rc = DID_ERROR;
|
||||
goto finished;
|
||||
}
|
||||
else
|
||||
{
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, SCpnt->request_bufflen,
|
||||
SCpnt->sc_data_direction);
|
||||
outl (SCpnt->SCp.have_data_in, padapter->mb2);
|
||||
}
|
||||
outl (cdb[5], padapter->mb0);
|
||||
outl (cdb[3], padapter->mb3);
|
||||
cmd = CMD_DASD_RAID_RQ;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ( SCpnt->use_sg )
|
||||
{
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev,
|
||||
((struct scatterlist *)SCpnt->request_buffer)->address,
|
||||
SCpnt->request_bufflen,
|
||||
SCpnt->sc_data_direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer,
|
||||
SCpnt->request_bufflen,
|
||||
SCpnt->sc_data_direction);
|
||||
}
|
||||
outl (SCpnt->SCp.have_data_in, padapter->mb2);
|
||||
outl (SCpnt->request_bufflen, padapter->mb3);
|
||||
cmd = CMD_DASD_SCSI_INQ;
|
||||
break;
|
||||
|
||||
case SCSIOP_TEST_UNIT_READY: // test unit ready CDB
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->sense_buffer, sizeof (SCpnt->sense_buffer), PCI_DMA_FROMDEVICE);
|
||||
outl (SCpnt->SCp.have_data_in, padapter->mb2);
|
||||
outl (sizeof (SCpnt->sense_buffer), padapter->mb3);
|
||||
cmd = CMD_TEST_READY;
|
||||
break;
|
||||
|
||||
case SCSIOP_READ_CAPACITY: // read capacity CDB
|
||||
if ( SCpnt->use_sg )
|
||||
{
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, ((struct scatterlist *)(SCpnt->request_buffer))->address,
|
||||
8, PCI_DMA_FROMDEVICE);
|
||||
}
|
||||
else
|
||||
SCpnt->SCp.have_data_in = pci_map_single (padapter->pdev, SCpnt->request_buffer, 8, PCI_DMA_FROMDEVICE);
|
||||
outl (SCpnt->SCp.have_data_in, padapter->mb2);
|
||||
outl (8, padapter->mb3);
|
||||
cmd = CMD_DASD_CAP;
|
||||
break;
|
||||
case SCSIOP_VERIFY: // verify CDB
|
||||
outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
|
||||
outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
|
||||
cmd = CMD_READ_SG;
|
||||
break;
|
||||
case SCSIOP_READ: // read10 CDB
|
||||
outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
|
||||
outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
|
||||
if ( BuildSgList (SCpnt, padapter, pdev) )
|
||||
cmd = CMD_READ;
|
||||
else
|
||||
cmd = CMD_READ_SG;
|
||||
break;
|
||||
case SCSIOP_READ6: // read6 CDB
|
||||
outw_p (cdb[4], padapter->mb0 + 2);
|
||||
outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
|
||||
if ( BuildSgList (SCpnt, padapter, pdev) )
|
||||
cmd = CMD_READ;
|
||||
else
|
||||
cmd = CMD_READ_SG;
|
||||
break;
|
||||
case SCSIOP_WRITE: // write10 CDB
|
||||
outw_p ((USHORT)cdb[8] | ((USHORT)cdb[7] << 8), padapter->mb0 + 2);
|
||||
outl (XSCSI2LONG (&cdb[2]), padapter->mb1);
|
||||
if ( BuildSgList (SCpnt, padapter, pdev) )
|
||||
cmd = CMD_WRITE;
|
||||
else
|
||||
cmd = CMD_WRITE_SG;
|
||||
break;
|
||||
case SCSIOP_WRITE6: // write6 CDB
|
||||
outw_p (cdb[4], padapter->mb0 + 2);
|
||||
outl ((SCSI2LONG (&cdb[1])) & 0x001FFFFF, padapter->mb1);
|
||||
if ( BuildSgList (SCpnt, padapter, pdev) )
|
||||
cmd = CMD_WRITE;
|
||||
else
|
||||
cmd = CMD_WRITE_SG;
|
||||
break;
|
||||
case SCSIOP_START_STOP_UNIT:
|
||||
cmd = CMD_EJECT_MEDIA;
|
||||
break;
|
||||
case SCSIOP_MEDIUM_REMOVAL:
|
||||
switch ( cdb[4] )
|
||||
{
|
||||
case 0:
|
||||
cmd = CMD_UNLOCK_DOOR;
|
||||
break;
|
||||
case 1:
|
||||
cmd = CMD_LOCK_DOOR;
|
||||
break;
|
||||
default:
|
||||
cmd = 0;
|
||||
break;
|
||||
}
|
||||
if ( cmd )
|
||||
break;
|
||||
default:
|
||||
DEB (printk ("pci2000_queuecommand: Unsupported command %02X\n", *cdb));
|
||||
OpDone (SCpnt, DID_ERROR << 16);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ( (pdev->tag = Command (padapter, cmd)) == 0 )
|
||||
rc = DID_TIME_OUT;
|
||||
finished:;
|
||||
if ( rc != -1 )
|
||||
OpDone (SCpnt, rc << 16);
|
||||
return 0;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Pci2000_Detect
|
||||
*
|
||||
* Description: Detect and initialize our boards.
|
||||
*
|
||||
* Parameters: tpnt - Pointer to SCSI host template structure.
|
||||
*
|
||||
* Returns: Number of adapters installed.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_Detect (Scsi_Host_Template *tpnt)
|
||||
{
|
||||
int found = 0;
|
||||
int installed = 0;
|
||||
struct Scsi_Host *pshost;
|
||||
PADAPTER2000 padapter;
|
||||
int z, zz;
|
||||
int setirq;
|
||||
struct pci_dev *pdev = NULL;
|
||||
UCHAR *consistent;
|
||||
dma_addr_t consistentDma;
|
||||
|
||||
while ( (pdev = pci_find_device (VENDOR_PSI, DEVICE_ROY_1, pdev)) != NULL )
|
||||
{
|
||||
if (pci_enable_device(pdev))
|
||||
continue;
|
||||
pshost = scsi_register (tpnt, sizeof(ADAPTER2000));
|
||||
if(pshost == NULL)
|
||||
continue;
|
||||
padapter = HOSTDATA(pshost);
|
||||
|
||||
padapter->basePort = pci_resource_start (pdev, 1);
|
||||
DEB (printk ("\nBase Regs = %#04X", padapter->basePort)); // get the base I/O port address
|
||||
padapter->mb0 = padapter->basePort + RTR_MAILBOX; // get the 32 bit mail boxes
|
||||
padapter->mb1 = padapter->basePort + RTR_MAILBOX + 4;
|
||||
padapter->mb2 = padapter->basePort + RTR_MAILBOX + 8;
|
||||
padapter->mb3 = padapter->basePort + RTR_MAILBOX + 12;
|
||||
padapter->mb4 = padapter->basePort + RTR_MAILBOX + 16;
|
||||
padapter->cmd = padapter->basePort + RTR_LOCAL_DOORBELL; // command register
|
||||
padapter->tag = padapter->basePort + RTR_PCI_DOORBELL; // tag/response register
|
||||
padapter->pdev = pdev;
|
||||
|
||||
if ( WaitReady (padapter) )
|
||||
goto unregister;
|
||||
outb_p (0x84, padapter->mb0);
|
||||
outb_p (CMD_SPECIFY, padapter->cmd);
|
||||
if ( WaitReady (padapter) )
|
||||
goto unregister;
|
||||
|
||||
consistent = pci_alloc_consistent (pdev, consistentLen, &consistentDma);
|
||||
if ( !consistent )
|
||||
{
|
||||
printk ("Unable to allocate DMA memory for PCI-2000 controller.\n");
|
||||
goto unregister;
|
||||
}
|
||||
|
||||
scsi_set_device(pshost, &pdev->dev);
|
||||
pshost->irq = pdev->irq;
|
||||
setirq = 1;
|
||||
padapter->irqOwned = 0;
|
||||
for ( z = 0; z < installed; z++ ) // scan for shared interrupts
|
||||
{
|
||||
if ( PsiHost[z]->irq == pshost->irq ) // if shared then, don't posses
|
||||
setirq = 0;
|
||||
}
|
||||
if ( setirq ) // if not shared, posses
|
||||
{
|
||||
if ( request_irq (pshost->irq, Irq_Handler, SA_SHIRQ, "pci2000", padapter) < 0 )
|
||||
{
|
||||
if ( request_irq (pshost->irq, Irq_Handler, SA_INTERRUPT | SA_SHIRQ, "pci2000", padapter) < 0 )
|
||||
{
|
||||
printk ("Unable to allocate IRQ for PCI-2000 controller.\n");
|
||||
pci_free_consistent (pdev, consistentLen, consistent, consistentDma);
|
||||
goto unregister;
|
||||
}
|
||||
}
|
||||
padapter->irqOwned = pshost->irq; // set IRQ as owned
|
||||
}
|
||||
PsiHost[installed] = pshost; // save SCSI_HOST pointer
|
||||
|
||||
pshost->io_port = padapter->basePort;
|
||||
pshost->n_io_port = 0xFF;
|
||||
pshost->unique_id = padapter->basePort;
|
||||
pshost->max_id = 16;
|
||||
pshost->max_channel = 1;
|
||||
|
||||
for ( zz = 0; zz < MAX_BUS; zz++ )
|
||||
for ( z = 0; z < MAX_UNITS; z++ )
|
||||
{
|
||||
padapter->dev[zz][z].tag = 0;
|
||||
padapter->dev[zz][z].scatGath = (PSCATGATH)consistent;
|
||||
padapter->dev[zz][z].scatGathDma = consistentDma;
|
||||
consistent += 16 * sizeof (SCATGATH);
|
||||
consistentDma += 16 * sizeof (SCATGATH);
|
||||
padapter->dev[zz][z].cdb = (UCHAR *)consistent;
|
||||
padapter->dev[zz][z].cdbDma = consistentDma;
|
||||
consistent += MAX_COMMAND_SIZE;
|
||||
consistentDma += MAX_COMMAND_SIZE;
|
||||
}
|
||||
|
||||
printk("\nPSI-2000 Intelligent Storage SCSI CONTROLLER: at I/O = %lX IRQ = %d\n", padapter->basePort, pshost->irq);
|
||||
printk("Version %s, Compiled %s %s\n\n", PCI2000_VERSION, __DATE__, __TIME__);
|
||||
found++;
|
||||
if ( ++installed < MAXADAPTER )
|
||||
continue;
|
||||
break;
|
||||
unregister:;
|
||||
scsi_unregister (pshost);
|
||||
found++;
|
||||
}
|
||||
NumAdapters = installed;
|
||||
return installed;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Pci2000_Abort
|
||||
*
|
||||
* Description: Process the Abort command from the SCSI manager.
|
||||
*
|
||||
* Parameters: SCpnt - Pointer to SCSI command structure.
|
||||
*
|
||||
* Returns: Allways snooze.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_Abort (Scsi_Cmnd *SCpnt)
|
||||
{
|
||||
DEB (printk ("pci2000_abort\n"));
|
||||
return SCSI_ABORT_SNOOZE;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Pci2000_Reset
|
||||
*
|
||||
* Description: Process the Reset command from the SCSI manager.
|
||||
*
|
||||
* Parameters: SCpnt - Pointer to SCSI command structure.
|
||||
* flags - Flags about the reset command
|
||||
*
|
||||
* Returns: No active command at this time, so this means
|
||||
* that each time we got some kind of response the
|
||||
* last time through. Tell the mid-level code to
|
||||
* request sense information in order to decide what
|
||||
* to do next.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_Reset (Scsi_Cmnd *SCpnt, unsigned int reset_flags)
|
||||
{
|
||||
return SCSI_RESET_PUNT;
|
||||
}
|
||||
/****************************************************************
|
||||
* Name: Pci2000_Release
|
||||
*
|
||||
* Description: Release resources allocated for a single each adapter.
|
||||
*
|
||||
* Parameters: pshost - Pointer to SCSI command structure.
|
||||
*
|
||||
* Returns: zero.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_Release (struct Scsi_Host *pshost)
|
||||
{
|
||||
PADAPTER2000 padapter = HOSTDATA (pshost);
|
||||
|
||||
if ( padapter->irqOwned )
|
||||
free_irq (pshost->irq, padapter);
|
||||
pci_free_consistent (padapter->pdev, consistentLen, padapter->dev[0][0].scatGath, padapter->dev[0][0].scatGathDma);
|
||||
release_region (pshost->io_port, pshost->n_io_port);
|
||||
scsi_unregister(pshost);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************
|
||||
* Name: Pci2000_BiosParam
|
||||
*
|
||||
* Description: Process the biosparam request from the SCSI manager to
|
||||
* return C/H/S data.
|
||||
*
|
||||
* Parameters: disk - Pointer to SCSI disk structure.
|
||||
* dev - Major/minor number from kernel.
|
||||
* geom - Pointer to integer array to place geometry data.
|
||||
*
|
||||
* Returns: zero.
|
||||
*
|
||||
****************************************************************/
|
||||
int Pci2000_BiosParam (struct scsi_device *sdev, struct block_device *dev,
|
||||
sector_t capacity, int geom[])
|
||||
{
|
||||
PADAPTER2000 padapter;
|
||||
|
||||
padapter = HOSTDATA(sdev->host);
|
||||
|
||||
if ( WaitReady (padapter) )
|
||||
return 0;
|
||||
outb_p (sdev->id, padapter->mb0);
|
||||
outb_p (CMD_GET_PARMS, padapter->cmd);
|
||||
if ( WaitReady (padapter) )
|
||||
return 0;
|
||||
|
||||
geom[0] = inb_p (padapter->mb2 + 3);
|
||||
geom[1] = inb_p (padapter->mb2 + 2);
|
||||
geom[2] = inw_p (padapter->mb2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
||||
static Scsi_Host_Template driver_template = {
|
||||
.proc_name = "pci2000",
|
||||
.name = "PCI-2000 SCSI Intelligent Disk Controller",
|
||||
.detect = Pci2000_Detect,
|
||||
.release = Pci2000_Release,
|
||||
.queuecommand = Pci2000_QueueCommand,
|
||||
.abort = Pci2000_Abort,
|
||||
.reset = Pci2000_Reset,
|
||||
.bios_param = Pci2000_BiosParam,
|
||||
.can_queue = 16,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = 16,
|
||||
.cmd_per_lun = 1,
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
};
|
||||
#include "scsi_module.c"
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,39 +0,0 @@
|
|||
/****************************************************************************
|
||||
* Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
|
||||
*
|
||||
* pci2220i.h - Linux Host Driver for PCI-2220i EIDE Adapters
|
||||
*
|
||||
* Copyright (c) 1997-1999 Perceptive Solutions, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that redistributions of source
|
||||
* code retain the above copyright notice and this comment without
|
||||
* modification.
|
||||
*
|
||||
* Technical updates and product information at:
|
||||
* http://www.psidisk.com
|
||||
*
|
||||
* Please send questions, comments, bug reports to:
|
||||
* tech@psidisk.com Technical Support
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef _PCI2220I_H
|
||||
#define _PCI2220I_H
|
||||
|
||||
#ifndef LINUX_VERSION_CODE
|
||||
#include <linux/version.h>
|
||||
#endif
|
||||
#define LINUXVERSION(v,p,s) (((v)<<16) + ((p)<<8) + (s))
|
||||
|
||||
// function prototypes
|
||||
int Pci2220i_Detect (Scsi_Host_Template *tpnt);
|
||||
int Pci2220i_Command (Scsi_Cmnd *SCpnt);
|
||||
int Pci2220i_QueueCommand (Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
|
||||
int Pci2220i_Abort (Scsi_Cmnd *SCpnt);
|
||||
int Pci2220i_Reset (Scsi_Cmnd *SCpnt, unsigned int flags);
|
||||
int Pci2220i_Release (struct Scsi_Host *pshost);
|
||||
int Pci2220i_BiosParam (struct scsi_device *sdev,
|
||||
struct block_device *dev,
|
||||
sector_t capacity, int geom[]);
|
||||
#endif
|
||||
|
|
@ -92,9 +92,7 @@ static Scsi_Host_Template nsp_driver_template = {
|
|||
#endif
|
||||
.info = nsp_info,
|
||||
.queuecommand = nsp_queuecommand,
|
||||
/* .eh_strategy_handler = nsp_eh_strategy,*/
|
||||
/* .eh_abort_handler = nsp_eh_abort,*/
|
||||
/* .eh_device_reset_handler = nsp_eh_device_reset,*/
|
||||
.eh_bus_reset_handler = nsp_eh_bus_reset,
|
||||
.eh_host_reset_handler = nsp_eh_host_reset,
|
||||
.can_queue = 1,
|
||||
|
|
@ -1536,11 +1534,6 @@ nsp_proc_info(
|
|||
/* error handler */
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
/*static int nsp_eh_strategy(struct Scsi_Host *Shost)
|
||||
{
|
||||
return FAILED;
|
||||
}*/
|
||||
|
||||
/*
|
||||
static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
|
||||
{
|
||||
|
|
@ -1549,14 +1542,6 @@ static int nsp_eh_abort(Scsi_Cmnd *SCpnt)
|
|||
return nsp_eh_bus_reset(SCpnt);
|
||||
}*/
|
||||
|
||||
/*
|
||||
static int nsp_eh_device_reset(Scsi_Cmnd *SCpnt)
|
||||
{
|
||||
nsp_dbg(NSP_DEBUG_BUSRESET, "%s: SCpnt=0x%p", SCpnt);
|
||||
|
||||
return FAILED;
|
||||
}*/
|
||||
|
||||
static int nsp_bus_reset(nsp_hw_data *data)
|
||||
{
|
||||
unsigned int base = data->BaseAddress;
|
||||
|
|
|
|||
|
|
@ -81,8 +81,6 @@ static Scsi_Host_Template qlogicfas_driver_template = {
|
|||
.queuecommand = qlogicfas408_queuecommand,
|
||||
.eh_abort_handler = qlogicfas408_abort,
|
||||
.eh_bus_reset_handler = qlogicfas408_bus_reset,
|
||||
.eh_device_reset_handler= qlogicfas408_device_reset,
|
||||
.eh_host_reset_handler = qlogicfas408_host_reset,
|
||||
.bios_param = qlogicfas408_biosparam,
|
||||
.can_queue = 1,
|
||||
.this_id = -1,
|
||||
|
|
|
|||
|
|
@ -627,7 +627,9 @@ SYM53C500_host_reset(struct scsi_cmnd *SCpnt)
|
|||
int port_base = SCpnt->device->host->io_port;
|
||||
|
||||
DEB(printk("SYM53C500_host_reset called\n"));
|
||||
spin_lock_irq(SCpnt->device->host->host_lock);
|
||||
SYM53C500_int_host_reset(port_base);
|
||||
spin_unlock_irq(SCpnt->device->host->host_lock);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -354,7 +354,6 @@ static Scsi_Host_Template driver_template = {
|
|||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.eh_abort_handler = fcp_scsi_abort,
|
||||
.eh_device_reset_handler = fcp_scsi_dev_reset,
|
||||
.eh_bus_reset_handler = fcp_scsi_bus_reset,
|
||||
.eh_host_reset_handler = fcp_scsi_host_reset,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/blkdev.h>
|
||||
#include <linux/parport.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/delay.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
|
|
@ -891,9 +892,9 @@ static int ppa_reset(struct scsi_cmnd *cmd)
|
|||
|
||||
ppa_connect(dev, CONNECT_NORMAL);
|
||||
ppa_reset_pulse(dev->base);
|
||||
udelay(1000); /* device settle delay */
|
||||
mdelay(1); /* device settle delay */
|
||||
ppa_disconnect(dev);
|
||||
udelay(1000); /* device settle delay */
|
||||
mdelay(1); /* device settle delay */
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,564 +0,0 @@
|
|||
/****************************************************************************
|
||||
* Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
|
||||
*
|
||||
* psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
|
||||
*
|
||||
* Copyright (c) 1997-1999 Perceptive Solutions, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that redistributions of source
|
||||
* code retain the above copyright notice and this comment without
|
||||
* modification.
|
||||
*
|
||||
* Technical updates and product information at:
|
||||
* http://www.psidisk.com
|
||||
*
|
||||
* Please send questions, comments, bug reports to:
|
||||
* tech@psidisk.com Technical Support
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/************************************************/
|
||||
/* Some defines that we like */
|
||||
/************************************************/
|
||||
#define CHAR char
|
||||
#define UCHAR unsigned char
|
||||
#define SHORT short
|
||||
#define USHORT unsigned short
|
||||
#define BOOL unsigned short
|
||||
#define LONG long
|
||||
#define ULONG unsigned long
|
||||
#define VOID void
|
||||
|
||||
/************************************************/
|
||||
/* Dale PCI setup */
|
||||
/************************************************/
|
||||
#define VENDOR_PSI 0x1256
|
||||
#define DEVICE_DALE_1 0x4401 /* 'D1' */
|
||||
#define DEVICE_BIGD_1 0x4201 /* 'B1' */
|
||||
#define DEVICE_BIGD_2 0x4202 /* 'B2' */
|
||||
|
||||
/************************************************/
|
||||
/* Misc konstants */
|
||||
/************************************************/
|
||||
#define DALE_MAXDRIVES 4
|
||||
#define BIGD_MAXDRIVES 8
|
||||
#define SECTORSXFER 8
|
||||
#define ATAPI_TRANSFER 8192
|
||||
#define BYTES_PER_SECTOR 512
|
||||
#define DEFAULT_TIMING_MODE 5
|
||||
|
||||
/************************************************/
|
||||
/* EEPROM locations */
|
||||
/************************************************/
|
||||
#define DALE_FLASH_PAGE_SIZE 128 // number of bytes per page
|
||||
#define DALE_FLASH_SIZE 65536L
|
||||
|
||||
#define DALE_FLASH_BIOS 0x00080000L // BIOS base address
|
||||
#define DALE_FLASH_SETUP 0x00088000L // SETUP PROGRAM base address offset from BIOS
|
||||
#define DALE_FLASH_RAID 0x00088400L // RAID signature storage
|
||||
#define DALE_FLASH_FACTORY 0x00089000L // FACTORY data base address offset from BIOS
|
||||
|
||||
#define DALE_FLASH_BIOS_SIZE 32768U // size of FLASH BIOS REGION
|
||||
|
||||
/************************************************/
|
||||
/* DALE Register address offsets */
|
||||
/************************************************/
|
||||
#define REG_DATA 0x80
|
||||
#define REG_ERROR 0x84
|
||||
#define REG_SECTOR_COUNT 0x88
|
||||
#define REG_LBA_0 0x8C
|
||||
#define REG_LBA_8 0x90
|
||||
#define REG_LBA_16 0x94
|
||||
#define REG_LBA_24 0x98
|
||||
#define REG_STAT_CMD 0x9C
|
||||
#define REG_STAT_SEL 0xA0
|
||||
#define REG_FAIL 0xB0
|
||||
#define REG_ALT_STAT 0xB8
|
||||
#define REG_DRIVE_ADRS 0xBC
|
||||
|
||||
#define DALE_DATA_SLOW 0x00040000L
|
||||
#define DALE_DATA_MODE2 0x00040000L
|
||||
#define DALE_DATA_MODE3 0x00050000L
|
||||
#define DALE_DATA_MODE4 0x00060000L
|
||||
#define DALE_DATA_MODE5 0x00070000L
|
||||
|
||||
#define BIGD_DATA_SLOW 0x00000000L
|
||||
#define BIGD_DATA_MODE0 0x00000000L
|
||||
#define BIGD_DATA_MODE2 0x00000000L
|
||||
#define BIGD_DATA_MODE3 0x00000008L
|
||||
#define BIGD_DATA_MODE4 0x00000010L
|
||||
#define BIGD_DATA_MODE5 0x00000020L
|
||||
|
||||
#define RTR_LOCAL_RANGE 0x000
|
||||
#define RTR_LOCAL_REMAP 0x004
|
||||
#define RTR_EXP_RANGE 0x010
|
||||
#define RTR_EXP_REMAP 0x014
|
||||
#define RTR_REGIONS 0x018
|
||||
#define RTR_DM_MASK 0x01C
|
||||
#define RTR_DM_LOCAL_BASE 0x020
|
||||
#define RTR_DM_IO_BASE 0x024
|
||||
#define RTR_DM_PCI_REMAP 0x028
|
||||
#define RTR_DM_IO_CONFIG 0x02C
|
||||
#define RTR_MAILBOX 0x040
|
||||
#define RTR_LOCAL_DOORBELL 0x060
|
||||
#define RTR_PCI_DOORBELL 0x064
|
||||
#define RTR_INT_CONTROL_STATUS 0x068
|
||||
#define RTR_EEPROM_CONTROL_STATUS 0x06C
|
||||
|
||||
#define RTR_DMA0_MODE 0x0080
|
||||
#define RTR_DMA0_PCI_ADDR 0x0084
|
||||
#define RTR_DMA0_LOCAL_ADDR 0x0088
|
||||
#define RTR_DMA0_COUNT 0x008C
|
||||
#define RTR_DMA0_DESC_PTR 0x0090
|
||||
#define RTR_DMA1_MODE 0x0094
|
||||
#define RTR_DMA1_PCI_ADDR 0x0098
|
||||
#define RTR_DMA1_LOCAL_ADDR 0x009C
|
||||
#define RTR_DMA1_COUNT 0x00A0
|
||||
#define RTR_DMA1_DESC_PTR 0x00A4
|
||||
#define RTR_DMA_COMMAND_STATUS 0x00A8
|
||||
#define RTR_DMA_ARB0 0x00AC
|
||||
#define RTR_DMA_ARB1 0x00B0
|
||||
|
||||
#define RTL_DMA0_MODE 0x00
|
||||
#define RTL_DMA0_PCI_ADDR 0x04
|
||||
#define RTL_DMA0_LOCAL_ADDR 0x08
|
||||
#define RTL_DMA0_COUNT 0x0C
|
||||
#define RTL_DMA0_DESC_PTR 0x10
|
||||
#define RTL_DMA1_MODE 0x14
|
||||
#define RTL_DMA1_PCI_ADDR 0x18
|
||||
#define RTL_DMA1_LOCAL_ADDR 0x1C
|
||||
#define RTL_DMA1_COUNT 0x20
|
||||
#define RTL_DMA1_DESC_PTR 0x24
|
||||
#define RTL_DMA_COMMAND_STATUS 0x28
|
||||
#define RTL_DMA_ARB0 0x2C
|
||||
#define RTL_DMA_ARB1 0x30
|
||||
|
||||
/************************************************/
|
||||
/* Dale Scratchpad locations */
|
||||
/************************************************/
|
||||
#define DALE_CHANNEL_DEVICE_0 0 // device channel locations
|
||||
#define DALE_CHANNEL_DEVICE_1 1
|
||||
#define DALE_CHANNEL_DEVICE_2 2
|
||||
#define DALE_CHANNEL_DEVICE_3 3
|
||||
|
||||
#define DALE_SCRATCH_DEVICE_0 4 // device type codes
|
||||
#define DALE_SCRATCH_DEVICE_1 5
|
||||
#define DALE_SCRATCH_DEVICE_2 6
|
||||
#define DALE_SCRATCH_DEVICE_3 7
|
||||
|
||||
#define DALE_RAID_0_STATUS 8
|
||||
#define DALE_RAID_1_STATUS 9
|
||||
|
||||
#define DALE_TIMING_MODE 12 // bus master timing mode (2, 3, 4, 5)
|
||||
#define DALE_NUM_DRIVES 13 // number of addressable drives on this board
|
||||
#define DALE_RAID_ON 14 // RAID status On
|
||||
#define DALE_LAST_ERROR 15 // Last error code from BIOS
|
||||
|
||||
/************************************************/
|
||||
/* BigD Scratchpad locations */
|
||||
/************************************************/
|
||||
#define BIGD_DEVICE_0 0 // device channel locations
|
||||
#define BIGD_DEVICE_1 1
|
||||
#define BIGD_DEVICE_2 2
|
||||
#define BIGD_DEVICE_3 3
|
||||
|
||||
#define BIGD_DEVICE_4 4 // device type codes
|
||||
#define BIGD_DEVICE_5 5
|
||||
#define BIGD_DEVICE_6 6
|
||||
#define BIGD_DEVICE_7 7
|
||||
|
||||
#define BIGD_ALARM_IMAGE 11 // ~image of alarm fail register
|
||||
#define BIGD_TIMING_MODE 12 // bus master timing mode (2, 3, 4, 5)
|
||||
#define BIGD_NUM_DRIVES 13 // number of addressable drives on this board
|
||||
#define BIGD_RAID_ON 14 // RAID status is on for the whole board
|
||||
#define BIGD_LAST_ERROR 15 // Last error code from BIOS
|
||||
|
||||
#define BIGD_RAID_0_STATUS 16
|
||||
#define BIGD_RAID_1_STATUS 17
|
||||
#define BIGD_RAID_2_STATUS 18
|
||||
#define BIGD_RAID_3_STATUS 19
|
||||
#define BIGD_RAID_4_STATUS 20
|
||||
#define BIGD_RAID_5_STATUS 21
|
||||
#define BIGD_RAID_6_STATUS 22
|
||||
#define BIGD_RAID_7_STATUS 23
|
||||
|
||||
/************************************************/
|
||||
/* Dale cable select bits */
|
||||
/************************************************/
|
||||
#define SEL_NONE 0x00
|
||||
#define SEL_1 0x01
|
||||
#define SEL_2 0x02
|
||||
#define SEL_3 0x04
|
||||
#define SEL_4 0x08
|
||||
#define SEL_NEW_SPEED_1 0x20
|
||||
#define SEL_COPY 0x40
|
||||
#define SEL_IRQ_OFF 0x80
|
||||
|
||||
/************************************************/
|
||||
/* Device/Geometry controls */
|
||||
/************************************************/
|
||||
#define GEOMETRY_NONE 0x0 // No device
|
||||
#define GEOMETRY_SET 0x1 // Geometry set
|
||||
#define GEOMETRY_LBA 0x2 // Geometry set in default LBA mode
|
||||
#define GEOMETRY_PHOENIX 0x3 // Geometry set in Pheonix BIOS compatibility mode
|
||||
|
||||
#define DEVICE_NONE 0x0 // No device present
|
||||
#define DEVICE_INACTIVE 0x1 // device present but not registered active
|
||||
#define DEVICE_ATAPI 0x2 // ATAPI device (CD_ROM, Tape, Etc...)
|
||||
#define DEVICE_DASD_NONLBA 0x3 // Non LBA incompatible device
|
||||
#define DEVICE_DASD_LBA 0x4 // LBA compatible device
|
||||
|
||||
/************************************************/
|
||||
/* BigD fail register bits */
|
||||
/************************************************/
|
||||
#define FAIL_NONE 0x00
|
||||
#define FAIL_0 0x01
|
||||
#define FAIL_1 0x02
|
||||
#define FAIL_2 0x04
|
||||
#define FAIL_MULTIPLE 0x08
|
||||
#define FAIL_GOOD 0x20
|
||||
#define FAIL_AUDIBLE 0x40
|
||||
#define FAIL_ANY 0x80
|
||||
|
||||
/************************************************/
|
||||
/* Setup Structure Definitions */
|
||||
/************************************************/
|
||||
typedef struct // device setup parameters
|
||||
{
|
||||
UCHAR geometryControl; // geometry control flags
|
||||
UCHAR device; // device code
|
||||
USHORT sectors; // number of sectors per track
|
||||
USHORT heads; // number of heads
|
||||
USHORT cylinders; // number of cylinders for this device
|
||||
ULONG blocks; // number of blocks on device
|
||||
ULONG realCapacity; // number of real blocks on this device for drive changed testing
|
||||
} SETUP_DEVICE, *PSETUP_DEVICE;
|
||||
|
||||
typedef struct // master setup structure
|
||||
{
|
||||
USHORT startupDelay;
|
||||
BOOL promptBIOS;
|
||||
BOOL fastFormat;
|
||||
BOOL shareInterrupt;
|
||||
BOOL rebootRebuild;
|
||||
USHORT timingMode;
|
||||
USHORT spare5;
|
||||
USHORT spare6;
|
||||
SETUP_DEVICE setupDevice[BIGD_MAXDRIVES];
|
||||
} SETUP, *PSETUP;
|
||||
|
||||
/************************************************/
|
||||
/* RAID Structure Definitions */
|
||||
/************************************************/
|
||||
typedef struct
|
||||
{
|
||||
UCHAR signature; // 0x55 our mirror signature
|
||||
UCHAR status; // current status bits
|
||||
UCHAR pairIdentifier; // unique identifier for pair
|
||||
ULONG reconstructPoint; // recontruction point for hot reconstruct
|
||||
} DISK_MIRROR;
|
||||
|
||||
typedef struct DEVICE_RAID1
|
||||
{
|
||||
long TotalSectors;
|
||||
DISK_MIRROR DiskRaid1;
|
||||
} DEVICE_RAID1, *PDEVICE_RAID1;
|
||||
|
||||
#define DISK_MIRROR_POSITION 0x01A8
|
||||
#define SIGNATURE 0x55
|
||||
|
||||
#define MASK_SERIAL_NUMBER 0x0FFE // mask for serial number matching
|
||||
#define MASK_SERIAL_UNIT 0x0001 // mask for unit portion of serial number
|
||||
|
||||
// Status bits
|
||||
#define UCBF_MIRRORED 0x0010 // drive has a pair
|
||||
#define UCBF_MATCHED 0x0020 // drive pair is matched
|
||||
#define UCBF_SURVIVOR 0x0040 // this unit is a survivor of a pair
|
||||
#define UCBF_REBUILD 0x0080 // rebuild in progress on this device
|
||||
|
||||
// SCSI controls for RAID
|
||||
#define SC_MY_RAID 0xBF // our special CDB command byte for Win95... interface
|
||||
#define MY_SCSI_QUERY1 0x32 // byte 1 subcommand to query driver for RAID 1 informatation
|
||||
#define MY_SCSI_REBUILD 0x40 // byte 1 subcommand to reconstruct a mirrored pair
|
||||
#define MY_SCSI_DEMOFAIL 0x54 // byte 1 subcommand for RAID failure demonstration
|
||||
#define MY_SCSI_ALARMMUTE 0x60 // byte 1 subcommand to mute any alarm currently on
|
||||
|
||||
/************************************************/
|
||||
/* Timeout konstants */
|
||||
/************************************************/
|
||||
#define TIMEOUT_READY 100 // 100 mSec
|
||||
#define TIMEOUT_DRQ 300 // 300 mSec
|
||||
#define TIMEOUT_DATA (3 * HZ) // 3 seconds
|
||||
|
||||
/************************************************/
|
||||
/* Misc. macros */
|
||||
/************************************************/
|
||||
#define ANY2SCSI(up, p) \
|
||||
((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
|
||||
((UCHAR *)up)[1] = ((ULONG)(p));
|
||||
|
||||
#define SCSI2LONG(up) \
|
||||
( (((long)*(((UCHAR *)up))) << 16) \
|
||||
+ (((long)(((UCHAR *)up)[1])) << 8) \
|
||||
+ ((long)(((UCHAR *)up)[2])) )
|
||||
|
||||
#define XANY2SCSI(up, p) \
|
||||
((UCHAR *)up)[0] = ((long)(p)) >> 24; \
|
||||
((UCHAR *)up)[1] = ((long)(p)) >> 16; \
|
||||
((UCHAR *)up)[2] = ((long)(p)) >> 8; \
|
||||
((UCHAR *)up)[3] = ((long)(p));
|
||||
|
||||
#define XSCSI2LONG(up) \
|
||||
( (((long)(((UCHAR *)up)[0])) << 24) \
|
||||
+ (((long)(((UCHAR *)up)[1])) << 16) \
|
||||
+ (((long)(((UCHAR *)up)[2])) << 8) \
|
||||
+ ((long)(((UCHAR *)up)[3])) )
|
||||
|
||||
#define SelectSpigot(padapter,spigot) outb_p (spigot, padapter->regStatSel)
|
||||
#define WriteCommand(padapter,cmd) outb_p (cmd, padapter->regStatCmd)
|
||||
#define AtapiDevice(padapter,b) outb_p (b, padapter->regLba24);
|
||||
#define AtapiCountLo(padapter,b) outb_p (b, padapter->regLba8)
|
||||
#define AtapiCountHi(padapter,b) outb_p (b, padapter->regLba16)
|
||||
|
||||
/************************************************/
|
||||
/* SCSI CDB operation codes */
|
||||
/************************************************/
|
||||
#define SCSIOP_TEST_UNIT_READY 0x00
|
||||
#define SCSIOP_REZERO_UNIT 0x01
|
||||
#define SCSIOP_REWIND 0x01
|
||||
#define SCSIOP_REQUEST_BLOCK_ADDR 0x02
|
||||
#define SCSIOP_REQUEST_SENSE 0x03
|
||||
#define SCSIOP_FORMAT_UNIT 0x04
|
||||
#define SCSIOP_READ_BLOCK_LIMITS 0x05
|
||||
#define SCSIOP_REASSIGN_BLOCKS 0x07
|
||||
#define SCSIOP_READ6 0x08
|
||||
#define SCSIOP_RECEIVE 0x08
|
||||
#define SCSIOP_WRITE6 0x0A
|
||||
#define SCSIOP_PRINT 0x0A
|
||||
#define SCSIOP_SEND 0x0A
|
||||
#define SCSIOP_SEEK6 0x0B
|
||||
#define SCSIOP_TRACK_SELECT 0x0B
|
||||
#define SCSIOP_SLEW_PRINT 0x0B
|
||||
#define SCSIOP_SEEK_BLOCK 0x0C
|
||||
#define SCSIOP_PARTITION 0x0D
|
||||
#define SCSIOP_READ_REVERSE 0x0F
|
||||
#define SCSIOP_WRITE_FILEMARKS 0x10
|
||||
#define SCSIOP_FLUSH_BUFFER 0x10
|
||||
#define SCSIOP_SPACE 0x11
|
||||
#define SCSIOP_INQUIRY 0x12
|
||||
#define SCSIOP_VERIFY6 0x13
|
||||
#define SCSIOP_RECOVER_BUF_DATA 0x14
|
||||
#define SCSIOP_MODE_SELECT 0x15
|
||||
#define SCSIOP_RESERVE_UNIT 0x16
|
||||
#define SCSIOP_RELEASE_UNIT 0x17
|
||||
#define SCSIOP_COPY 0x18
|
||||
#define SCSIOP_ERASE 0x19
|
||||
#define SCSIOP_MODE_SENSE 0x1A
|
||||
#define SCSIOP_START_STOP_UNIT 0x1B
|
||||
#define SCSIOP_STOP_PRINT 0x1B
|
||||
#define SCSIOP_LOAD_UNLOAD 0x1B
|
||||
#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
|
||||
#define SCSIOP_SEND_DIAGNOSTIC 0x1D
|
||||
#define SCSIOP_MEDIUM_REMOVAL 0x1E
|
||||
#define SCSIOP_READ_CAPACITY 0x25
|
||||
#define SCSIOP_READ 0x28
|
||||
#define SCSIOP_WRITE 0x2A
|
||||
#define SCSIOP_SEEK 0x2B
|
||||
#define SCSIOP_LOCATE 0x2B
|
||||
#define SCSIOP_WRITE_VERIFY 0x2E
|
||||
#define SCSIOP_VERIFY 0x2F
|
||||
#define SCSIOP_SEARCH_DATA_HIGH 0x30
|
||||
#define SCSIOP_SEARCH_DATA_EQUAL 0x31
|
||||
#define SCSIOP_SEARCH_DATA_LOW 0x32
|
||||
#define SCSIOP_SET_LIMITS 0x33
|
||||
#define SCSIOP_READ_POSITION 0x34
|
||||
#define SCSIOP_SYNCHRONIZE_CACHE 0x35
|
||||
#define SCSIOP_COMPARE 0x39
|
||||
#define SCSIOP_COPY_COMPARE 0x3A
|
||||
#define SCSIOP_WRITE_DATA_BUFF 0x3B
|
||||
#define SCSIOP_READ_DATA_BUFF 0x3C
|
||||
#define SCSIOP_CHANGE_DEFINITION 0x40
|
||||
#define SCSIOP_READ_SUB_CHANNEL 0x42
|
||||
#define SCSIOP_READ_TOC 0x43
|
||||
#define SCSIOP_READ_HEADER 0x44
|
||||
#define SCSIOP_PLAY_AUDIO 0x45
|
||||
#define SCSIOP_PLAY_AUDIO_MSF 0x47
|
||||
#define SCSIOP_PLAY_TRACK_INDEX 0x48
|
||||
#define SCSIOP_PLAY_TRACK_RELATIVE 0x49
|
||||
#define SCSIOP_PAUSE_RESUME 0x4B
|
||||
#define SCSIOP_LOG_SELECT 0x4C
|
||||
#define SCSIOP_LOG_SENSE 0x4D
|
||||
#define SCSIOP_MODE_SELECT10 0x55
|
||||
#define SCSIOP_MODE_SENSE10 0x5A
|
||||
#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
|
||||
#define SCSIOP_MECHANISM_STATUS 0xBD
|
||||
#define SCSIOP_READ_CD 0xBE
|
||||
|
||||
// IDE command definitions
|
||||
#define IDE_COMMAND_ATAPI_RESET 0x08
|
||||
#define IDE_COMMAND_READ 0x20
|
||||
#define IDE_COMMAND_WRITE 0x30
|
||||
#define IDE_COMMAND_RECALIBRATE 0x10
|
||||
#define IDE_COMMAND_SEEK 0x70
|
||||
#define IDE_COMMAND_SET_PARAMETERS 0x91
|
||||
#define IDE_COMMAND_VERIFY 0x40
|
||||
#define IDE_COMMAND_ATAPI_PACKET 0xA0
|
||||
#define IDE_COMMAND_ATAPI_IDENTIFY 0xA1
|
||||
#define IDE_CMD_READ_MULTIPLE 0xC4
|
||||
#define IDE_CMD_WRITE_MULTIPLE 0xC5
|
||||
#define IDE_CMD_SET_MULTIPLE 0xC6
|
||||
#define IDE_COMMAND_IDENTIFY 0xEC
|
||||
|
||||
// IDE status definitions
|
||||
#define IDE_STATUS_ERROR 0x01
|
||||
#define IDE_STATUS_INDEX 0x02
|
||||
#define IDE_STATUS_CORRECTED_ERROR 0x04
|
||||
#define IDE_STATUS_DRQ 0x08
|
||||
#define IDE_STATUS_DSC 0x10
|
||||
#define IDE_STATUS_WRITE_FAULT 0x20
|
||||
#define IDE_STATUS_DRDY 0x40
|
||||
#define IDE_STATUS_BUSY 0x80
|
||||
|
||||
typedef struct _ATAPI_STATUS
|
||||
{
|
||||
CHAR check :1;
|
||||
CHAR reserved1 :1;
|
||||
CHAR corr :1;
|
||||
CHAR drq :1;
|
||||
CHAR dsc :1;
|
||||
CHAR reserved2 :1;
|
||||
CHAR drdy :1;
|
||||
CHAR bsy :1;
|
||||
} ATAPI_STATUS;
|
||||
|
||||
typedef struct _ATAPI_REASON
|
||||
{
|
||||
CHAR cod :1;
|
||||
CHAR io :1;
|
||||
CHAR reserved1 :6;
|
||||
} ATAPI_REASON;
|
||||
|
||||
typedef struct _ATAPI_ERROR
|
||||
{
|
||||
CHAR ili :1;
|
||||
CHAR eom :1;
|
||||
CHAR abort :1;
|
||||
CHAR mcr :1;
|
||||
CHAR senseKey :4;
|
||||
} ATAPI_ERROR;
|
||||
|
||||
// IDE error definitions
|
||||
#define IDE_ERROR_AMNF 0x01
|
||||
#define IDE_ERROR_TKONF 0x02
|
||||
#define IDE_ERROR_ABRT 0x04
|
||||
#define IDE_ERROR_MCR 0x08
|
||||
#define IDE_ERROR_IDFN 0x10
|
||||
#define IDE_ERROR_MC 0x20
|
||||
#define IDE_ERROR_UNC 0x40
|
||||
#define IDE_ERROR_BBK 0x80
|
||||
|
||||
// SCSI read capacity structure
|
||||
typedef struct _READ_CAPACITY_DATA
|
||||
{
|
||||
ULONG blks; /* total blocks (converted to little endian) */
|
||||
ULONG blksiz; /* size of each (converted to little endian) */
|
||||
} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
|
||||
|
||||
// SCSI inquiry data
|
||||
typedef struct _INQUIRYDATA
|
||||
{
|
||||
UCHAR DeviceType :5;
|
||||
UCHAR DeviceTypeQualifier :3;
|
||||
UCHAR DeviceTypeModifier :7;
|
||||
UCHAR RemovableMedia :1;
|
||||
UCHAR Versions;
|
||||
UCHAR ResponseDataFormat;
|
||||
UCHAR AdditionalLength;
|
||||
UCHAR Reserved[2];
|
||||
UCHAR SoftReset :1;
|
||||
UCHAR CommandQueue :1;
|
||||
UCHAR Reserved2 :1;
|
||||
UCHAR LinkedCommands :1;
|
||||
UCHAR Synchronous :1;
|
||||
UCHAR Wide16Bit :1;
|
||||
UCHAR Wide32Bit :1;
|
||||
UCHAR RelativeAddressing :1;
|
||||
UCHAR VendorId[8];
|
||||
UCHAR ProductId[16];
|
||||
UCHAR ProductRevisionLevel[4];
|
||||
UCHAR VendorSpecific[20];
|
||||
UCHAR Reserved3[40];
|
||||
} INQUIRYDATA, *PINQUIRYDATA;
|
||||
|
||||
// IDE IDENTIFY data
|
||||
#pragma pack (1)
|
||||
typedef struct _IDENTIFY_DATA
|
||||
{
|
||||
USHORT GeneralConfiguration; // 0
|
||||
USHORT NumberOfCylinders; // 1
|
||||
USHORT Reserved1; // 2
|
||||
USHORT NumberOfHeads; // 3
|
||||
USHORT UnformattedBytesPerTrack; // 4
|
||||
USHORT UnformattedBytesPerSector; // 5
|
||||
USHORT SectorsPerTrack; // 6
|
||||
USHORT NumBytesISG; // 7 Byte Len - inter-sector gap
|
||||
USHORT NumBytesSync; // 8 - sync field
|
||||
USHORT NumWordsVUS; // 9 Len - Vendor Unique Info
|
||||
USHORT SerialNumber[10]; // 10
|
||||
USHORT BufferType; // 20
|
||||
USHORT BufferSectorSize; // 21
|
||||
USHORT NumberOfEccBytes; // 22
|
||||
USHORT FirmwareRevision[4]; // 23
|
||||
USHORT ModelNumber[20]; // 27
|
||||
USHORT NumSectorsPerInt :8; // 47 Multiple Mode - Sec/Blk
|
||||
USHORT Reserved2 :8; // 47
|
||||
USHORT DoubleWordMode; // 48 flag for double word mode capable
|
||||
USHORT VendorUnique1 :8; // 49
|
||||
USHORT SupportDMA :1; // 49 DMA supported
|
||||
USHORT SupportLBA :1; // 49 LBA supported
|
||||
USHORT SupportIORDYDisable :1; // 49 IORDY can be disabled
|
||||
USHORT SupportIORDY :1; // 49 IORDY supported
|
||||
USHORT ReservedPsuedoDMA :1; // 49 reserved for pseudo DMA mode support
|
||||
USHORT Reserved3 :3; // 49
|
||||
USHORT Reserved4; // 50
|
||||
USHORT Reserved5 :8; // 51 Transfer Cycle Timing - PIO
|
||||
USHORT PIOCycleTime :8; // 51 Transfer Cycle Timing - PIO
|
||||
USHORT Reserved6 :8; // 52 - DMA
|
||||
USHORT DMACycleTime :8; // 52 - DMA
|
||||
USHORT Valid_54_58 :1; // 53 words 54 - 58 are valid
|
||||
USHORT Valid_64_70 :1; // 53 words 64 - 70 are valid
|
||||
USHORT Reserved7 :14; // 53
|
||||
USHORT LogNumCyl; // 54 Current Translation - Num Cyl
|
||||
USHORT LogNumHeads; // 55 Num Heads
|
||||
USHORT LogSectorsPerTrack; // 56 Sec/Trk
|
||||
ULONG LogTotalSectors; // 57 Total Sec
|
||||
USHORT CurrentNumSecPerInt :8; // 59 current setting for number of sectors per interrupt
|
||||
USHORT ValidNumSecPerInt :1; // 59 Current setting is valid for number of sectors per interrupt
|
||||
USHORT Reserved8 :7; // 59
|
||||
ULONG LBATotalSectors; // 60 LBA Mode - Sectors
|
||||
USHORT DMASWordFlags; // 62
|
||||
USHORT DMAMWordFlags; // 63
|
||||
USHORT AdvancedPIOSupport :8; // 64 Flow control PIO transfer modes supported
|
||||
USHORT Reserved9 :8; // 64
|
||||
USHORT MinMultiDMACycle; // 65 minimum multiword DMA transfer cycle time per word
|
||||
USHORT RecomendDMACycle; // 66 Manufacturer's recommende multiword DMA transfer cycle time
|
||||
USHORT MinPIOCycleWithoutFlow; // 67 Minimum PIO transfer cycle time without flow control
|
||||
USHORT MinPIOCylceWithFlow; // 68 Minimum PIO transfer cycle time with IORDY flow control
|
||||
USHORT ReservedSpace[256-69]; // 69
|
||||
} IDENTIFY_DATA, *PIDENTIFY_DATA;
|
||||
|
||||
// ATAPI configuration bits
|
||||
typedef struct _ATAPI_GENERAL_0
|
||||
{
|
||||
USHORT CmdPacketSize :2; // Command packet size
|
||||
USHORT Reserved1 :3;
|
||||
USHORT CmdDrqType :2;
|
||||
USHORT Removable :1;
|
||||
USHORT DeviceType :5;
|
||||
USHORT Reserved2 :1;
|
||||
USHORT ProtocolType :2;
|
||||
} ATAPI_GENERAL_0;
|
||||
|
||||
#pragma pack ()
|
||||
|
|
@ -1,331 +0,0 @@
|
|||
/****************************************************************************
|
||||
* Perceptive Solutions, Inc. PCI-2000 device driver for Linux.
|
||||
*
|
||||
* psi_roy.h - Linux Host Driver for PCI-2000 IntelliCache SCSI Adapters
|
||||
*
|
||||
* Copyright (c) 1997-1999 Perceptive Solutions, Inc.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that redistributions of source
|
||||
* code retain the above copyright notice and this comment without
|
||||
* modification.
|
||||
*
|
||||
* Technical updates and product information at:
|
||||
* http://www.psidisk.com
|
||||
*
|
||||
* Please send questions, comments, bug reports to:
|
||||
* tech@psidisk.com Technical Support
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ROY_HOST
|
||||
#define ROY_HOST
|
||||
|
||||
/************************************************/
|
||||
/* PCI setup */
|
||||
/************************************************/
|
||||
#define VENDOR_PSI 0x1256
|
||||
#define DEVICE_ROY_1 0x5201 /* 'R1' */
|
||||
|
||||
/************************************************/
|
||||
/* controller constants */
|
||||
/************************************************/
|
||||
#define MAXADAPTER 4 // Increase this and the sizes of the arrays below, if you need more.
|
||||
#define MAX_BUS 2
|
||||
#define MAX_UNITS 16
|
||||
#define TIMEOUT_COMMAND 400 // number of milliSecondos for command busy timeout
|
||||
|
||||
/************************************************/
|
||||
/* I/O address offsets */
|
||||
/************************************************/
|
||||
#define RTR_MAILBOX 0x040
|
||||
#define RTR_LOCAL_DOORBELL 0x060
|
||||
#define RTR_PCI_DOORBELL 0x064
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* Host command codes */
|
||||
/* */
|
||||
/************************************************/
|
||||
#define CMD_READ_CHS 0x01 /* read sectors as specified (CHS mode) */
|
||||
#define CMD_READ 0x02 /* read sectors as specified (RBA mode) */
|
||||
#define CMD_READ_SG 0x03 /* read sectors using scatter/gather list */
|
||||
#define CMD_WRITE_CHS 0x04 /* write sectors as specified (CHS mode) */
|
||||
#define CMD_WRITE 0x05 /* write sectors as specified (RBA mode) */
|
||||
#define CMD_WRITE_SG 0x06 /* write sectors using scatter/gather list (LBA mode) */
|
||||
#define CMD_READ_CHS_SG 0x07 /* read sectors using scatter/gather list (CHS mode) */
|
||||
#define CMD_WRITE_CHS_SG 0x08 /* write sectors using scatter/gather list (CHS mode) */
|
||||
#define CMD_VERIFY_CHS 0x09 /* verify data on sectors as specified (CHS mode) */
|
||||
#define CMD_VERIFY 0x0A /* verify data on sectors as specified (RBA mode) */
|
||||
#define CMD_DASD_CDB 0x0B /* process CDB for a DASD device */
|
||||
#define CMD_DASD_CDB_SG 0x0C /* process CDB for a DASD device with scatter/gather */
|
||||
|
||||
#define CMD_READ_ABS 0x10 /* read absolute disk */
|
||||
#define CMD_WRITE_ABS 0x11 /* write absolute disk */
|
||||
#define CMD_VERIFY_ABS 0x12 /* verify absolute disk */
|
||||
#define CMD_TEST_READY 0x13 /* test unit ready and return status code */
|
||||
#define CMD_LOCK_DOOR 0x14 /* lock device door */
|
||||
#define CMD_UNLOCK_DOOR 0x15 /* unlock device door */
|
||||
#define CMD_EJECT_MEDIA 0x16 /* eject the media */
|
||||
#define CMD_UPDATE_CAP 0x17 /* update capacity information */
|
||||
#define CMD_TEST_PRIV 0x18 /* test and setup private format media */
|
||||
|
||||
|
||||
#define CMD_SCSI_THRU 0x30 /* SCSI pass through CDB */
|
||||
#define CMD_SCSI_THRU_SG 0x31 /* SCSI pass through CDB with scatter/gather */
|
||||
#define CMD_SCSI_REQ_SENSE 0x32 /* SCSI pass through request sense after check condition */
|
||||
|
||||
#define CMD_DASD_RAID_RQ 0x35 /* request DASD RAID drive data */
|
||||
#define CMD_DASD_RAID_RQ0 0x31 /* byte 1 subcommand to query for RAID 0 informatation */
|
||||
#define CMD_DASD_RAID_RQ1 0x32 /* byte 1 subcommand to query for RAID 1 informatation */
|
||||
#define CMD_DASD_RAID_RQ5 0x33 /* byte 1 subcommand to query for RAID 5 informatation */
|
||||
|
||||
#define CMD_DASD_SCSI_INQ 0x36 /* do DASD inquire and return in SCSI format */
|
||||
#define CMD_DASD_CAP 0x37 /* read DASD capacity */
|
||||
#define CMD_DASD_INQ 0x38 /* do DASD inquire for type data and return SCSI/EIDE inquiry */
|
||||
#define CMD_SCSI_INQ 0x39 /* do SCSI inquire */
|
||||
#define CMD_READ_SETUP 0x3A /* Get setup structures from controller */
|
||||
#define CMD_WRITE_SETUP 0x3B /* Put setup structures in controller and burn in flash */
|
||||
#define CMD_READ_CONFIG 0x3C /* Get the entire configuration and setup structures */
|
||||
#define CMD_WRITE_CONFIG 0x3D /* Put the entire configuration and setup structures in flash */
|
||||
|
||||
#define CMD_TEXT_DEVICE 0x3E /* obtain device text */
|
||||
#define CMD_TEXT_SIGNON 0x3F /* get sign on banner */
|
||||
|
||||
#define CMD_QUEUE 0x40 /* any command below this generates a queue tag interrupt to host*/
|
||||
|
||||
#define CMD_PREFETCH 0x40 /* prefetch sectors as specified */
|
||||
#define CMD_TEST_WRITE 0x41 /* Test a device for write protect */
|
||||
#define CMD_LAST_STATUS 0x42 /* get last command status and error data*/
|
||||
#define CMD_ABORT 0x43 /* abort command as specified */
|
||||
#define CMD_ERROR 0x44 /* fetch error code from a tagged op */
|
||||
#define CMD_DONE 0x45 /* done with operation */
|
||||
#define CMD_DIAGNOSTICS 0x46 /* execute controller diagnostics and wait for results */
|
||||
#define CMD_FEATURE_MODE 0x47 /* feature mode control word */
|
||||
#define CMD_DASD_INQUIRE 0x48 /* inquire as to DASD SCSI device (32 possible) */
|
||||
#define CMD_FEATURE_QUERY 0x49 /* query the feature control word */
|
||||
#define CMD_DASD_EJECT 0x4A /* Eject removable media for DASD type */
|
||||
#define CMD_DASD_LOCK 0x4B /* Lock removable media for DASD type */
|
||||
#define CMD_DASD_TYPE 0x4C /* obtain DASD device type */
|
||||
#define CMD_NUM_DEV 0x4D /* obtain the number of devices connected to the controller */
|
||||
#define CMD_GET_PARMS 0x4E /* obtain device parameters */
|
||||
#define CMD_SPECIFY 0x4F /* specify operating system for scatter/gather operations */
|
||||
|
||||
#define CMD_RAID_GET_DEV 0x50 /* read RAID device geometry */
|
||||
#define CMD_RAID_READ 0x51 /* read RAID 1 parameter block */
|
||||
#define CMD_RAID_WRITE 0x52 /* write RAID 1 parameter block */
|
||||
#define CMD_RAID_LITEUP 0x53 /* Light up the drive light for identification */
|
||||
#define CMD_RAID_REBUILD 0x54 /* issue a RAID 1 pair rebuild */
|
||||
#define CMD_RAID_MUTE 0x55 /* mute RAID failure alarm */
|
||||
#define CMD_RAID_FAIL 0x56 /* induce a RAID failure */
|
||||
#define CMD_RAID_STATUS 0x57 /* get status of RAID pair */
|
||||
#define CMD_RAID_STOP 0x58 /* stop any reconstruct in progress */
|
||||
#define CMD_RAID_START 0x59 /* start reconstruct */
|
||||
#define CMD_RAID0_READ 0x5A /* read RAID 0 parameter block */
|
||||
#define CMD_RAID0_WRITE 0x5B /* write RAID 0 parameter block */
|
||||
#define CMD_RAID5_READ 0x5C /* read RAID 5 parameter block */
|
||||
#define CMD_RAID5_WRITE 0x5D /* write RAID 5 parameter block */
|
||||
|
||||
#define CMD_ERASE_TABLES 0x5F /* erase partition table and RAID signatutures */
|
||||
|
||||
#define CMD_SCSI_GET 0x60 /* get SCSI pass through devices */
|
||||
#define CMD_SCSI_TIMEOUT 0x61 /* set SCSI pass through timeout */
|
||||
#define CMD_SCSI_ERROR 0x62 /* get SCSI pass through request sense length and residual data count */
|
||||
#define CMD_GET_SPARMS 0x63 /* get SCSI bus and user parms */
|
||||
#define CMD_SCSI_ABORT 0x64 /* abort by setting time-out to zero */
|
||||
|
||||
#define CMD_CHIRP_CHIRP 0x77 /* make a chirp chirp sound */
|
||||
#define CMD_GET_LAST_DONE 0x78 /* get tag of last done in progress */
|
||||
#define CMD_GET_FEATURES 0x79 /* get feature code and ESN */
|
||||
#define CMD_CLEAR_CACHE 0x7A /* Clear cache on specified device */
|
||||
#define CMD_BIOS_TEST 0x7B /* Test whether or not to load BIOS */
|
||||
#define CMD_WAIT_FLUSH 0x7C /* wait for cache flushed and invalidate read cache */
|
||||
#define CMD_RESET_BUS 0x7D /* reset the SCSI bus */
|
||||
#define CMD_STARTUP_QRY 0x7E /* startup in progress query */
|
||||
#define CMD_RESET 0x7F /* reset the controller */
|
||||
|
||||
#define CMD_RESTART_RESET 0x80 /* reload and restart the controller at any reset issued */
|
||||
#define CMD_SOFT_RESET 0x81 /* do a soft reset NOW! */
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* Host return errors */
|
||||
/* */
|
||||
/************************************************/
|
||||
#define ERR08_TAGGED 0x80 /* doorbell error ored with tag */
|
||||
|
||||
#define ERR16_NONE 0x0000 /* no errors */
|
||||
#define ERR16_SC_COND_MET 0x0004 /* SCSI status - Condition Met */
|
||||
#define ERR16_CMD 0x0101 /* command error */
|
||||
#define ERR16_SC_CHECK_COND 0x0002 /* SCSI status - Check Condition */
|
||||
#define ERR16_CMD_NOT 0x0201 /* command not supported */
|
||||
#define ERR16_NO_DEVICE 0x0301 /* invalid device selection */
|
||||
#define ERR16_SECTOR 0x0202 /* bad sector */
|
||||
#define ERR16_PROTECT 0x0303 /* write protected */
|
||||
#define ERR16_NOSECTOR 0x0404 /* sector not found */
|
||||
#define ERR16_MEDIA 0x0C0C /* invalid media */
|
||||
#define ERR16_CONTROL 0x2020 /* controller error */
|
||||
#define ERR16_CONTROL_DMA 0x2120 /* controller DMA engine error */
|
||||
#define ERR16_NO_ALARM 0x2220 /* alarm is not active */
|
||||
#define ERR16_OP_BUSY 0x2320 /* operation busy */
|
||||
#define ERR16_SEEK 0x4040 /* seek failure */
|
||||
#define ERR16_DEVICE_FAIL 0x4140 /* device has failed */
|
||||
#define ERR16_TIMEOUT 0x8080 /* timeout error */
|
||||
#define ERR16_DEV_NOT_READY 0xAAAA /* drive not ready */
|
||||
#define ERR16_UNDEFINED 0xBBBB /* undefined error */
|
||||
#define ERR16_WRITE_FAULT 0xCCCC /* write fault */
|
||||
#define ERR16_INVALID_DEV 0x4001 /* invalid device access */
|
||||
#define ERR16_DEVICE_BUSY 0x4002 /* device is busy */
|
||||
#define ERR16_MEMORY 0x4003 /* device pass thru requires too much memory */
|
||||
#define ERR16_NO_FEATURE 0x40FA /* feature no implemented */
|
||||
#define ERR16_NOTAG 0x40FD /* no tag space available */
|
||||
#define ERR16_NOT_READY 0x40FE /* controller not ready error */
|
||||
#define ERR16_SETUP_FLASH 0x5050 /* error when writing setup to flash memory */
|
||||
#define ERR16_SETUP_SIZE 0x5051 /* setup block size error */
|
||||
#define ERR16_SENSE 0xFFFF /* sense opereration failed */
|
||||
#define ERR16_SC_BUSY 0x0008 /* SCSI status - Busy */
|
||||
#define ERR16_SC_RES_CONFL 0x0018 /* SCSI status - Reservation Conflict */
|
||||
#define ERR16_SC_CMD_TERM 0x0022 /* SCSI status - Command Terminated */
|
||||
#define ERR16_SC_OTHER 0x00FF /* SCSI status - not recognized (any value masked) */
|
||||
#define ERR16_MEDIA_CHANGED 0x8001 /* devices media has been changed */
|
||||
|
||||
#define ERR32_NONE 0x00000000 /* no errors */
|
||||
#define ERR32_SC_COND_MET 0x00000004 /* SCSI status - Condition Met */
|
||||
#define ERR32_CMD 0x00010101 /* command error */
|
||||
#define ERR32_SC_CHECK_COND 0x00020002 /* SCSI status - Check Condition */
|
||||
#define ERR32_CMD_NOT 0x00030201 /* command not supported */
|
||||
#define ERR32_NO_DEVICE 0x00040301 /* invalid device selection */
|
||||
#define ERR32_SECTOR 0x00050202 /* bad sector */
|
||||
#define ERR32_PROTECT 0x00060303 /* write protected */
|
||||
#define ERR32_NOSECTOR 0x00070404 /* sector not found */
|
||||
#define ERR32_MEDIA 0x00080C0C /* invalid media */
|
||||
#define ERR32_CONTROL 0x00092020 /* controller error */
|
||||
#define ERR32_CONTROL_DMA 0x000A2120 /* Controller DMA error */
|
||||
#define ERR32_NO_ALARM 0x000B2220 /* alarm is not active */
|
||||
#define ERR32_OP_BUSY 0x000C2320 /* operation busy */
|
||||
#define ERR32_SEEK 0x000D4040 /* seek failure */
|
||||
#define ERR32_DEVICE_FAIL 0x000E4140 /* device has failed */
|
||||
#define ERR32_TIMEOUT 0x000F8080 /* timeout error */
|
||||
#define ERR32_DEV_NOT_READY 0x0010AAAA /* drive not ready */
|
||||
#define ERR32_UNDEFINED 0x0011BBBB /* undefined error */
|
||||
#define ERR32_WRITE_FAULT 0x0012CCCC /* write fault */
|
||||
#define ERR32_INVALID_DEV 0x00134001 /* invalid device access */
|
||||
#define ERR32_DEVICE_BUSY 0x00144002 /* device is busy */
|
||||
#define ERR32_MEMORY 0x00154003 /* device pass thru requires too much memory */
|
||||
#define ERR32_NO_FEATURE 0x001640FA /* feature no implemented */
|
||||
#define ERR32_NOTAG 0x001740FD /* no tag space available */
|
||||
#define ERR32_NOT_READY 0x001840FE /* controller not ready error */
|
||||
#define ERR32_SETUP_FLASH 0x00195050 /* error when writing setup to flash memory */
|
||||
#define ERR32_SETUP_SIZE 0x001A5051 /* setup block size error */
|
||||
#define ERR32_SENSE 0x001BFFFF /* sense opereration failed */
|
||||
#define ERR32_SC_BUSY 0x001C0008 /* SCSI status - Busy */
|
||||
#define ERR32_SC_RES_CONFL 0x001D0018 /* SCSI status - Reservation Conflict */
|
||||
#define ERR32_SC_CMD_TERM 0x001E0022 /* SCSI status - Command Terminated */
|
||||
#define ERR32_SC_OTHER 0x001F00FF /* SCSI status - not recognized (any value masked) */
|
||||
#define ERR32_MEDIA_CHANGED 0x00208001 /* devices media has been changed */
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* Host Operating System specification codes */
|
||||
/* */
|
||||
/************************************************/
|
||||
#define SPEC_INTERRUPT 0x80 /* specification requires host interrupt */
|
||||
#define SPEC_BACKWARD_SG 0x40 /* specification requires scatter/gather items reversed */
|
||||
#define SPEC_DOS_BLOCK 0x01 /* DOS DASD blocking on pass through */
|
||||
#define SPEC_OS2_V3 0x02 /* OS/2 Warp */
|
||||
#define SPCE_SCO_3242 0x04 /* SCO 3.4.2.2 */
|
||||
#define SPEC_QNX_4X 0x05 /* QNX 4.XX */
|
||||
#define SPEC_NOVELL_NWPA 0x08 /* Novell NWPA scatter/gather support */
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* Inquire structures */
|
||||
/* */
|
||||
/************************************************/
|
||||
typedef struct _CNT_SCSI_INQ
|
||||
{
|
||||
UCHAR devt; /* 00: device type */
|
||||
UCHAR devtm; /* 01: device type modifier */
|
||||
UCHAR svers; /* 02: SCSI version */
|
||||
UCHAR rfmt; /* 03: response data format */
|
||||
UCHAR adlen; /* 04: additional length of data */
|
||||
UCHAR res1; /* 05: */
|
||||
UCHAR res2; /* 06: */
|
||||
UCHAR fncs; /* 07: functional capabilities */
|
||||
UCHAR vid[8]; /* 08: vendor ID */
|
||||
UCHAR pid[16]; /* 10: product ID */
|
||||
UCHAR rev[4]; /* 20: product revision */
|
||||
} CNT_SCSI_INQ;
|
||||
|
||||
typedef struct _CNT_IDE_INQ
|
||||
{
|
||||
USHORT GeneralConfiguration; /* 00 */
|
||||
USHORT NumberOfCylinders; /* 02 */
|
||||
USHORT Reserved1; /* 04 */
|
||||
USHORT NumberOfHeads; /* 06 */
|
||||
USHORT UnformattedBytesPerTrack; /* 08 */
|
||||
USHORT UnformattedBytesPerSector; /* 0A */
|
||||
USHORT SectorsPerTrack; /* 0C */
|
||||
USHORT VendorUnique1[3]; /* 0E */
|
||||
USHORT SerialNumber[10]; /* 14 */
|
||||
USHORT BufferType; /* 28 */
|
||||
USHORT BufferSectorSize; /* 2A */
|
||||
USHORT NumberOfEccBytes; /* 2C */
|
||||
USHORT FirmwareRevision[4]; /* 2E */
|
||||
USHORT ModelNumber[20]; /* 36 */
|
||||
UCHAR MaximumBlockTransfer; /* 5E */
|
||||
UCHAR VendorUnique2; /* 5F */
|
||||
USHORT DoubleWordIo; /* 60 */
|
||||
USHORT Capabilities; /* 62 */
|
||||
USHORT Reserved2; /* 64 */
|
||||
UCHAR VendorUnique3; /* 66 */
|
||||
UCHAR PioCycleTimingMode; /* 67 */
|
||||
UCHAR VendorUnique4; /* 68 */
|
||||
UCHAR DmaCycleTimingMode; /* 69 */
|
||||
USHORT TranslationFieldsValid; /* 6A */
|
||||
USHORT NumberOfCurrentCylinders; /* 6C */
|
||||
USHORT NumberOfCurrentHeads; /* 6E */
|
||||
USHORT CurrentSectorsPerTrack; /* 70 */
|
||||
ULONG CurrentSectorCapacity; /* 72 */
|
||||
} CNT_IDE_INQ;
|
||||
|
||||
typedef struct _DASD_INQUIRE
|
||||
{
|
||||
ULONG type; /* 0 = SCSI, 1 = IDE */
|
||||
union
|
||||
{
|
||||
CNT_SCSI_INQ scsi; /* SCSI inquire data */
|
||||
CNT_IDE_INQ ide; /* IDE inquire data */
|
||||
} inq;
|
||||
} DASD_INQUIRE;
|
||||
|
||||
/************************************************/
|
||||
/* */
|
||||
/* Device Codes */
|
||||
/* */
|
||||
/************************************************/
|
||||
#define DEVC_DASD 0x00 /* Direct-access Storage Device */
|
||||
#define DEVC_SEQACESS 0x01 /* Sequential-access device */
|
||||
#define DEVC_PRINTER 0x02 /* Printer device */
|
||||
#define DEVC_PROCESSOR 0x03 /* Processor device */
|
||||
#define DEVC_WRITEONCE 0x04 /* Write-once device */
|
||||
#define DEVC_CDROM 0x05 /* CD-ROM device */
|
||||
#define DEVC_SCANNER 0x06 /* Scanner device */
|
||||
#define DEVC_OPTICAL 0x07 /* Optical memory device */
|
||||
#define DEVC_MEDCHGR 0x08 /* Medium changer device */
|
||||
#define DEVC_DASD_REMOVABLE 0x80 /* Direct-access storage device, Removable */
|
||||
#define DEVC_NONE 0xFF /* no device */
|
||||
|
||||
// SCSI controls for RAID
|
||||
#define SC_MY_RAID 0xBF // our special CDB command byte for Win95... interface
|
||||
#define MY_SCSI_QUERY0 0x31 // byte 1 subcommand to query driver for RAID 0 informatation
|
||||
#define MY_SCSI_QUERY1 0x32 // byte 1 subcommand to query driver for RAID 1 informatation
|
||||
#define MY_SCSI_QUERY5 0x33 // byte 1 subcommand to query driver for RAID 5 informatation
|
||||
#define MY_SCSI_REBUILD 0x40 // byte 1 subcommand to reconstruct a mirrored pair
|
||||
#define MY_SCSI_DEMOFAIL 0x54 // byte 1 subcommand for RAID failure demonstration
|
||||
#define MY_SCSI_ALARMMUTE 0x60 // byte 1 subcommand to mute any alarm currently on
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1098,7 +1098,13 @@ qla1280_error_action(struct scsi_cmnd *cmd, enum action action)
|
|||
static int
|
||||
qla1280_eh_abort(struct scsi_cmnd * cmd)
|
||||
{
|
||||
return qla1280_error_action(cmd, ABORT_COMMAND);
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = qla1280_error_action(cmd, ABORT_COMMAND);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
@ -1108,7 +1114,13 @@ qla1280_eh_abort(struct scsi_cmnd * cmd)
|
|||
static int
|
||||
qla1280_eh_device_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return qla1280_error_action(cmd, DEVICE_RESET);
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = qla1280_error_action(cmd, DEVICE_RESET);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
@ -1118,7 +1130,13 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd)
|
|||
static int
|
||||
qla1280_eh_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return qla1280_error_action(cmd, BUS_RESET);
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = qla1280_error_action(cmd, BUS_RESET);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
|
|
@ -1128,7 +1146,13 @@ qla1280_eh_bus_reset(struct scsi_cmnd *cmd)
|
|||
static int
|
||||
qla1280_eh_adapter_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
return qla1280_error_action(cmd, ADAPTER_RESET);
|
||||
int rc;
|
||||
|
||||
spin_lock_irq(cmd->device->host->host_lock);
|
||||
rc = qla1280_error_action(cmd, ADAPTER_RESET);
|
||||
spin_unlock_irq(cmd->device->host->host_lock);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
@ -4038,11 +4062,10 @@ qla1280_status_entry(struct scsi_qla_host *ha, struct response *pkt,
|
|||
scsi_status, handle);
|
||||
}
|
||||
|
||||
/* Target busy */
|
||||
if (scsi_status & SS_BUSY_CONDITION &&
|
||||
scsi_status != SS_RESERVE_CONFLICT) {
|
||||
CMD_RESULT(cmd) =
|
||||
DID_BUS_BUSY << 16 | (scsi_status & 0xff);
|
||||
/* Target busy or queue full */
|
||||
if ((scsi_status & 0xFF) == SAM_STAT_TASK_SET_FULL ||
|
||||
(scsi_status & 0xFF) == SAM_STAT_BUSY) {
|
||||
CMD_RESULT(cmd) = scsi_status & 0xff;
|
||||
} else {
|
||||
|
||||
/* Save ISP completion status */
|
||||
|
|
|
|||
|
|
@ -1063,8 +1063,7 @@ qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
|
|||
return;
|
||||
|
||||
printk(" sp flags=0x%x\n", sp->flags);
|
||||
printk(" r_start=0x%lx, u_start=0x%lx, f_start=0x%lx, state=%d\n",
|
||||
sp->r_start, sp->u_start, sp->f_start, sp->state);
|
||||
printk(" state=%d\n", sp->state);
|
||||
}
|
||||
|
||||
#if defined(QL_DEBUG_ROUTINES)
|
||||
|
|
|
|||
|
|
@ -252,31 +252,12 @@ typedef struct srb {
|
|||
/* Request state */
|
||||
uint16_t state;
|
||||
|
||||
/* Timing counts. */
|
||||
unsigned long e_start; /* Start of extend timeout */
|
||||
unsigned long r_start; /* Start of request */
|
||||
unsigned long u_start; /* When sent to RISC */
|
||||
unsigned long f_start; /* When placed in FO queue*/
|
||||
|
||||
/* Single transfer DMA context */
|
||||
dma_addr_t dma_handle;
|
||||
|
||||
uint32_t request_sense_length;
|
||||
uint8_t *request_sense_ptr;
|
||||
|
||||
int ext_history;
|
||||
|
||||
/* Suspend delay */
|
||||
int delay;
|
||||
|
||||
/* Raw completion info for use by failover ? */
|
||||
uint8_t fo_retry_cnt; /* Retry count this request */
|
||||
uint8_t err_id; /* error id */
|
||||
#define SRB_ERR_PORT 1 /* Request failed -- "port down" */
|
||||
#define SRB_ERR_LOOP 2 /* Request failed -- "loop down" */
|
||||
#define SRB_ERR_DEVICE 3 /* Request failed -- "device error" */
|
||||
#define SRB_ERR_OTHER 4
|
||||
|
||||
/* SRB magic number */
|
||||
uint16_t magic;
|
||||
#define SRB_MAGIC 0x10CB
|
||||
|
|
@ -2082,23 +2063,8 @@ typedef struct scsi_qla_host {
|
|||
uint32_t current_outstanding_cmd;
|
||||
srb_t *status_srb; /* Status continuation entry. */
|
||||
|
||||
unsigned long last_irq_cpu; /* cpu where we got our last irq */
|
||||
|
||||
uint16_t revision;
|
||||
uint8_t ports;
|
||||
u_long actthreads;
|
||||
u_long ipreq_cnt;
|
||||
u_long qthreads;
|
||||
|
||||
uint32_t total_isr_cnt; /* Interrupt count */
|
||||
uint32_t total_isp_aborts; /* controller err cnt */
|
||||
uint32_t total_lip_cnt; /* LIP cnt */
|
||||
uint32_t total_dev_errs; /* device error cnt */
|
||||
uint32_t total_ios; /* IO cnt */
|
||||
uint64_t total_bytes; /* xfr byte cnt */
|
||||
uint32_t total_mbx_timeout; /* mailbox timeout cnt */
|
||||
uint32_t total_loop_resync; /* loop resyn cnt */
|
||||
uint32_t dropped_frame_error_cnt;
|
||||
|
||||
/* ISP configuration data. */
|
||||
uint16_t loop_id; /* Host adapter loop id */
|
||||
|
|
@ -2124,8 +2090,6 @@ typedef struct scsi_qla_host {
|
|||
#define P2P_LOOP 3
|
||||
|
||||
uint8_t marker_needed;
|
||||
uint8_t sns_retry_cnt;
|
||||
uint8_t mem_err;
|
||||
|
||||
uint8_t interrupts_on;
|
||||
|
||||
|
|
@ -2138,16 +2102,11 @@ typedef struct scsi_qla_host {
|
|||
uint16_t nvram_base;
|
||||
|
||||
uint16_t loop_reset_delay;
|
||||
uint16_t minimum_timeout;
|
||||
uint8_t retry_count;
|
||||
uint8_t login_timeout;
|
||||
uint16_t r_a_tov;
|
||||
int port_down_retry_count;
|
||||
uint8_t loop_down_timeout;
|
||||
uint8_t mbx_count;
|
||||
uint16_t max_probe_luns;
|
||||
uint16_t max_luns;
|
||||
uint16_t max_targets;
|
||||
uint16_t last_loop_id;
|
||||
|
||||
uint32_t login_retry_count;
|
||||
|
|
@ -2181,7 +2140,6 @@ typedef struct scsi_qla_host {
|
|||
uint8_t dpc_active; /* DPC routine is active */
|
||||
|
||||
/* Timeout timers. */
|
||||
uint8_t queue_restart_timer;
|
||||
uint8_t loop_down_abort_time; /* port down timer */
|
||||
atomic_t loop_down_timer; /* loop down timer */
|
||||
uint8_t link_down_timeout; /* link down timeout */
|
||||
|
|
@ -2230,18 +2188,6 @@ typedef struct scsi_qla_host {
|
|||
|
||||
mbx_cmd_t mc;
|
||||
|
||||
uint8_t *cmdline;
|
||||
|
||||
uint32_t failover_type;
|
||||
uint32_t failback_delay;
|
||||
unsigned long cfg_flags;
|
||||
#define CFG_ACTIVE 0 /* CFG during a failover, event update, or ioctl */
|
||||
#define CFG_FAILOVER 1 /* CFG during path change */
|
||||
|
||||
uint32_t binding_type;
|
||||
#define BIND_BY_PORT_NAME 0
|
||||
#define BIND_BY_PORT_ID 1
|
||||
|
||||
/* Basic firmware related information. */
|
||||
struct qla_board_info *brd_info;
|
||||
uint16_t fw_major_version;
|
||||
|
|
@ -2274,12 +2220,6 @@ typedef struct scsi_qla_host {
|
|||
uint8_t nvram_version;
|
||||
uint32_t isp_abort_cnt;
|
||||
|
||||
/* Adapter I/O statistics for failover */
|
||||
uint64_t IosRequested;
|
||||
uint64_t BytesRequested;
|
||||
uint64_t IosExecuted;
|
||||
uint64_t BytesExecuted;
|
||||
|
||||
/* Needed for BEACON */
|
||||
uint16_t beacon_blink_led;
|
||||
uint16_t beacon_green_on;
|
||||
|
|
|
|||
|
|
@ -53,27 +53,13 @@ extern void qla2x00_reg_remote_port(scsi_qla_host_t *, fc_port_t *);
|
|||
*/
|
||||
extern char qla2x00_version_str[];
|
||||
|
||||
extern int num_hosts;
|
||||
extern int apiHBAInstance;
|
||||
|
||||
extern struct _qla2x00stats qla2x00_stats;
|
||||
extern int ql2xretrycount;
|
||||
extern int ql2xlogintimeout;
|
||||
extern int qlport_down_retry;
|
||||
extern int ql2xmaxqdepth;
|
||||
extern int displayConfig;
|
||||
extern int ql2xplogiabsentdevice;
|
||||
extern int ql2xenablezio;
|
||||
extern int ql2xintrdelaytimer;
|
||||
extern int ql2xloginretrycount;
|
||||
|
||||
extern int ConfigRequired;
|
||||
|
||||
extern int Bind;
|
||||
extern int ql2xsuspendcount;
|
||||
#if defined(MODULE)
|
||||
extern char *ql2xopts;
|
||||
#endif
|
||||
extern void qla2x00_sp_compl(scsi_qla_host_t *, srb_t *);
|
||||
|
||||
extern char *qla2x00_get_fw_version_str(struct scsi_qla_host *, char *);
|
||||
|
|
|
|||
|
|
@ -85,9 +85,7 @@ qla2x00_initialize_adapter(scsi_qla_host_t *ha)
|
|||
atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME);
|
||||
atomic_set(&ha->loop_state, LOOP_DOWN);
|
||||
ha->device_flags = 0;
|
||||
ha->sns_retry_cnt = 0;
|
||||
ha->dpc_flags = 0;
|
||||
ha->failback_delay = 0;
|
||||
ha->flags.management_server_logged_in = 0;
|
||||
ha->marker_needed = 0;
|
||||
ha->mbx_flags = 0;
|
||||
|
|
@ -171,8 +169,6 @@ check_fw_ready_again:
|
|||
|
||||
if (wait_time == 0)
|
||||
rval = QLA_FUNCTION_FAILED;
|
||||
if (ha->mem_err)
|
||||
restart_risc = 1;
|
||||
} else if (ha->device_flags & DFLG_NO_CABLE)
|
||||
/* If no cable, then all is good. */
|
||||
rval = QLA_SUCCESS;
|
||||
|
|
@ -1410,13 +1406,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
|
|||
/* Set minimum RATOV to 200 tenths of a second. */
|
||||
ha->r_a_tov = 200;
|
||||
|
||||
ha->minimum_timeout =
|
||||
(ha->login_timeout * ha->retry_count) + nv->port_down_retry_count;
|
||||
ha->loop_reset_delay = nv->reset_delay;
|
||||
|
||||
/* Will get the value from NVRAM. */
|
||||
ha->loop_down_timeout = LOOP_DOWN_TIMEOUT;
|
||||
|
||||
/* Link Down Timeout = 0:
|
||||
*
|
||||
* When Port Down timer expires we will start returning
|
||||
|
|
@ -1429,18 +1420,13 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
|
|||
*/
|
||||
if (nv->link_down_timeout == 0) {
|
||||
ha->loop_down_abort_time =
|
||||
(LOOP_DOWN_TIME - ha->loop_down_timeout);
|
||||
(LOOP_DOWN_TIME - LOOP_DOWN_TIMEOUT);
|
||||
} else {
|
||||
ha->link_down_timeout = nv->link_down_timeout;
|
||||
ha->loop_down_abort_time =
|
||||
(LOOP_DOWN_TIME - ha->link_down_timeout);
|
||||
}
|
||||
|
||||
ha->max_luns = MAX_LUNS;
|
||||
ha->max_probe_luns = le16_to_cpu(nv->max_luns_per_target);
|
||||
if (ha->max_probe_luns == 0)
|
||||
ha->max_probe_luns = MIN_LUNS;
|
||||
|
||||
/*
|
||||
* Need enough time to try and get the port back.
|
||||
*/
|
||||
|
|
@ -1457,16 +1443,6 @@ qla2x00_nvram_config(scsi_qla_host_t *ha)
|
|||
if (ql2xloginretrycount)
|
||||
ha->login_retry_count = ql2xloginretrycount;
|
||||
|
||||
ha->binding_type = Bind;
|
||||
if (ha->binding_type != BIND_BY_PORT_NAME &&
|
||||
ha->binding_type != BIND_BY_PORT_ID) {
|
||||
qla_printk(KERN_WARNING, ha,
|
||||
"Invalid binding type specified (%d), "
|
||||
"defaulting to BIND_BY_PORT_NAME!!!\n", ha->binding_type);
|
||||
|
||||
ha->binding_type = BIND_BY_PORT_NAME;
|
||||
}
|
||||
|
||||
icb->lun_enables = __constant_cpu_to_le16(0);
|
||||
icb->command_resource_count = 0;
|
||||
icb->immediate_notify_resource_count = 0;
|
||||
|
|
@ -1578,7 +1554,6 @@ qla2x00_configure_loop(scsi_qla_host_t *ha)
|
|||
*/
|
||||
clear_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags);
|
||||
clear_bit(RSCN_UPDATE, &ha->dpc_flags);
|
||||
ha->mem_err = 0 ;
|
||||
|
||||
/* Determine what we need to do */
|
||||
if (ha->current_topology == ISP_CFG_FL &&
|
||||
|
|
@ -2707,7 +2682,6 @@ qla2x00_loop_resync(scsi_qla_host_t *ha)
|
|||
rval = QLA_SUCCESS;
|
||||
|
||||
atomic_set(&ha->loop_state, LOOP_UPDATE);
|
||||
qla2x00_stats.loop_resync++;
|
||||
clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags);
|
||||
if (ha->flags.online) {
|
||||
if (!(rval = qla2x00_fw_ready(ha))) {
|
||||
|
|
@ -2786,9 +2760,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
|
|||
if (ha->flags.online) {
|
||||
ha->flags.online = 0;
|
||||
clear_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
|
||||
qla2x00_stats.ispAbort++;
|
||||
ha->total_isp_aborts++; /* used by ioctl */
|
||||
ha->sns_retry_cnt = 0;
|
||||
|
||||
qla_printk(KERN_INFO, ha,
|
||||
"Performing ISP error recovery - ha= %p.\n", ha);
|
||||
|
|
@ -2810,8 +2781,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha)
|
|||
sp = ha->outstanding_cmds[cnt];
|
||||
if (sp) {
|
||||
ha->outstanding_cmds[cnt] = NULL;
|
||||
if (ha->actthreads)
|
||||
ha->actthreads--;
|
||||
sp->flags = 0;
|
||||
sp->cmd->result = DID_RESET << 16;
|
||||
sp->cmd->host_scribble = (unsigned char *)NULL;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue