You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge ../scsi-rc-fixes-2.6
Conflicts: include/scsi/scsi_devinfo.h Same number for two BLIST flags: BLIST_MAX_512 and BLIST_ATTACH_PQ3 Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
+72
-29
@@ -350,16 +350,51 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* sg_scsi_ioctl -- handle deprecated SCSI_IOCTL_SEND_COMMAND ioctl
|
||||
* @file: file this ioctl operates on (optional)
|
||||
* @q: request queue to send scsi commands down
|
||||
* @disk: gendisk to operate on (option)
|
||||
* @sic: userspace structure describing the command to perform
|
||||
*
|
||||
* Send down the scsi command described by @sic to the device below
|
||||
* the request queue @q. If @file is non-NULL it's used to perform
|
||||
* fine-grained permission checks that allow users to send down
|
||||
* non-destructive SCSI commands. If the caller has a struct gendisk
|
||||
* available it should be passed in as @disk to allow the low level
|
||||
* driver to use the information contained in it. A non-NULL @disk
|
||||
* is only allowed if the caller knows that the low level driver doesn't
|
||||
* need it (e.g. in the scsi subsystem).
|
||||
*
|
||||
* Notes:
|
||||
* - This interface is deprecated - users should use the SG_IO
|
||||
* interface instead, as this is a more flexible approach to
|
||||
* performing SCSI commands on a device.
|
||||
* - The SCSI command length is determined by examining the 1st byte
|
||||
* of the given command. There is no way to override this.
|
||||
* - Data transfers are limited to PAGE_SIZE
|
||||
* - The length (x + y) must be at least OMAX_SB_LEN bytes long to
|
||||
* accommodate the sense buffer when an error occurs.
|
||||
* The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that
|
||||
* old code will not be surprised.
|
||||
* - If a Unix error occurs (e.g. ENOMEM) then the user will receive
|
||||
* a negative return and the Unix error code in 'errno'.
|
||||
* If the SCSI command succeeds then 0 is returned.
|
||||
* Positive numbers returned are the compacted SCSI error codes (4
|
||||
* bytes in one int) where the lowest byte is the SCSI status.
|
||||
*/
|
||||
#define OMAX_SB_LEN 16 /* For backward compatibility */
|
||||
|
||||
static int sg_scsi_ioctl(struct file *file, request_queue_t *q,
|
||||
struct gendisk *bd_disk, Scsi_Ioctl_Command __user *sic)
|
||||
int sg_scsi_ioctl(struct file *file, struct request_queue *q,
|
||||
struct gendisk *disk, struct scsi_ioctl_command __user *sic)
|
||||
{
|
||||
struct request *rq;
|
||||
int err;
|
||||
unsigned int in_len, out_len, bytes, opcode, cmdlen;
|
||||
char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
|
||||
|
||||
if (!sic)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* get in an out lengths, verify they don't exceed a page worth of data
|
||||
*/
|
||||
@@ -393,45 +428,53 @@ static int sg_scsi_ioctl(struct file *file, request_queue_t *q,
|
||||
if (copy_from_user(rq->cmd, sic->data, cmdlen))
|
||||
goto error;
|
||||
|
||||
if (copy_from_user(buffer, sic->data + cmdlen, in_len))
|
||||
if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len))
|
||||
goto error;
|
||||
|
||||
err = verify_command(file, rq->cmd);
|
||||
if (err)
|
||||
goto error;
|
||||
|
||||
/* default. possible overriden later */
|
||||
rq->retries = 5;
|
||||
|
||||
switch (opcode) {
|
||||
case SEND_DIAGNOSTIC:
|
||||
case FORMAT_UNIT:
|
||||
rq->timeout = FORMAT_UNIT_TIMEOUT;
|
||||
break;
|
||||
case START_STOP:
|
||||
rq->timeout = START_STOP_TIMEOUT;
|
||||
break;
|
||||
case MOVE_MEDIUM:
|
||||
rq->timeout = MOVE_MEDIUM_TIMEOUT;
|
||||
break;
|
||||
case READ_ELEMENT_STATUS:
|
||||
rq->timeout = READ_ELEMENT_STATUS_TIMEOUT;
|
||||
break;
|
||||
case READ_DEFECT_DATA:
|
||||
rq->timeout = READ_DEFECT_DATA_TIMEOUT;
|
||||
break;
|
||||
default:
|
||||
rq->timeout = BLK_DEFAULT_TIMEOUT;
|
||||
break;
|
||||
case SEND_DIAGNOSTIC:
|
||||
case FORMAT_UNIT:
|
||||
rq->timeout = FORMAT_UNIT_TIMEOUT;
|
||||
rq->retries = 1;
|
||||
break;
|
||||
case START_STOP:
|
||||
rq->timeout = START_STOP_TIMEOUT;
|
||||
break;
|
||||
case MOVE_MEDIUM:
|
||||
rq->timeout = MOVE_MEDIUM_TIMEOUT;
|
||||
break;
|
||||
case READ_ELEMENT_STATUS:
|
||||
rq->timeout = READ_ELEMENT_STATUS_TIMEOUT;
|
||||
break;
|
||||
case READ_DEFECT_DATA:
|
||||
rq->timeout = READ_DEFECT_DATA_TIMEOUT;
|
||||
rq->retries = 1;
|
||||
break;
|
||||
default:
|
||||
rq->timeout = BLK_DEFAULT_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
|
||||
if (bytes && blk_rq_map_kern(q, rq, buffer, bytes, __GFP_WAIT)) {
|
||||
err = DRIVER_ERROR << 24;
|
||||
goto out;
|
||||
}
|
||||
|
||||
memset(sense, 0, sizeof(sense));
|
||||
rq->sense = sense;
|
||||
rq->sense_len = 0;
|
||||
|
||||
rq->data = buffer;
|
||||
rq->data_len = bytes;
|
||||
rq->flags |= REQ_BLOCK_PC;
|
||||
rq->retries = 0;
|
||||
|
||||
blk_execute_rq(q, bd_disk, rq, 0);
|
||||
blk_execute_rq(q, disk, rq, 0);
|
||||
|
||||
out:
|
||||
err = rq->errors & 0xff; /* only 8 bit SCSI status */
|
||||
if (err) {
|
||||
if (rq->sense_len && rq->sense) {
|
||||
@@ -450,7 +493,7 @@ error:
|
||||
blk_put_request(rq);
|
||||
return err;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(sg_scsi_ioctl);
|
||||
|
||||
/* Send basic block requests */
|
||||
static int __blk_send_generic(request_queue_t *q, struct gendisk *bd_disk, int cmd, int data)
|
||||
|
||||
@@ -366,7 +366,15 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
|
||||
static int
|
||||
mptsas_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
sas_read_port_mode_page(sdev);
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
|
||||
/*
|
||||
* RAID volumes placed beyond the last expected port.
|
||||
* Ignore sending sas mode pages in that case..
|
||||
*/
|
||||
if (sdev->channel < hd->ioc->num_ports)
|
||||
sas_read_port_mode_page(sdev);
|
||||
|
||||
return mptscsih_slave_configure(sdev);
|
||||
}
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
2.26.02.005 - Fix use_sg == 0 mapping on systems with 4GB or higher.
|
||||
2.26.02.006 - Fix 9550SX pchip reset timeout.
|
||||
Add big endian support.
|
||||
2.26.02.007 - Disable local interrupts during kmap/unmap_atomic().
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -88,7 +89,7 @@
|
||||
#include "3w-9xxx.h"
|
||||
|
||||
/* Globals */
|
||||
#define TW_DRIVER_VERSION "2.26.02.006"
|
||||
#define TW_DRIVER_VERSION "2.26.02.007"
|
||||
static TW_Device_Extension *twa_device_extension_list[TW_MAX_SLOT];
|
||||
static unsigned int twa_device_extension_count;
|
||||
static int twa_major = -1;
|
||||
@@ -1942,9 +1943,13 @@ static void twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re
|
||||
}
|
||||
if (tw_dev->srb[request_id]->use_sg == 1) {
|
||||
struct scatterlist *sg = (struct scatterlist *)tw_dev->srb[request_id]->request_buffer;
|
||||
char *buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
|
||||
char *buf;
|
||||
unsigned long flags = 0;
|
||||
local_irq_save(flags);
|
||||
buf = kmap_atomic(sg->page, KM_IRQ0) + sg->offset;
|
||||
memcpy(buf, tw_dev->generic_buffer_virt[request_id], sg->length);
|
||||
kunmap_atomic(buf - sg->offset, KM_IRQ0);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
}
|
||||
} /* End twa_scsiop_execute_scsi_complete() */
|
||||
|
||||
+8
-16
@@ -1079,7 +1079,7 @@ config SCSI_SYM53C8XX_DMA_ADDRESSING_MODE
|
||||
memory using PCI DAC cycles.
|
||||
|
||||
config SCSI_SYM53C8XX_DEFAULT_TAGS
|
||||
int "default tagged command queue depth"
|
||||
int "Default tagged command queue depth"
|
||||
depends on SCSI_SYM53C8XX_2
|
||||
default "16"
|
||||
help
|
||||
@@ -1090,7 +1090,7 @@ config SCSI_SYM53C8XX_DEFAULT_TAGS
|
||||
exceed CONFIG_SCSI_SYM53C8XX_MAX_TAGS.
|
||||
|
||||
config SCSI_SYM53C8XX_MAX_TAGS
|
||||
int "maximum number of queued commands"
|
||||
int "Maximum number of queued commands"
|
||||
depends on SCSI_SYM53C8XX_2
|
||||
default "64"
|
||||
help
|
||||
@@ -1099,13 +1099,14 @@ config SCSI_SYM53C8XX_MAX_TAGS
|
||||
possible. The driver supports up to 256 queued commands per device.
|
||||
This value is used as a compiled-in hard limit.
|
||||
|
||||
config SCSI_SYM53C8XX_IOMAPPED
|
||||
bool "use port IO"
|
||||
config SCSI_SYM53C8XX_MMIO
|
||||
bool "Use memory mapped IO"
|
||||
depends on SCSI_SYM53C8XX_2
|
||||
default y
|
||||
help
|
||||
If you say Y here, the driver will use port IO to access
|
||||
the card. This is significantly slower then using memory
|
||||
mapped IO. Most people should answer N.
|
||||
Memory mapped IO is faster than Port IO. Most people should
|
||||
answer Y here, but some machines may have problems. If you have
|
||||
to answer N here, please report the problem to the maintainer.
|
||||
|
||||
config SCSI_IPR
|
||||
tristate "IBM Power Linux RAID adapter support"
|
||||
@@ -1309,15 +1310,6 @@ config SCSI_QLOGIC_FAS
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called qlogicfas.
|
||||
|
||||
config SCSI_QLOGIC_FC
|
||||
tristate "Qlogic ISP FC SCSI support"
|
||||
depends on PCI && SCSI
|
||||
help
|
||||
This is a driver for the QLogic ISP2100 SCSI-FCP host adapter.
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called qlogicfc.
|
||||
|
||||
config SCSI_QLOGIC_FC_FIRMWARE
|
||||
bool "Include loadable firmware in driver"
|
||||
depends on SCSI_QLOGIC_FC
|
||||
|
||||
@@ -78,7 +78,6 @@ obj-$(CONFIG_SCSI_NCR_Q720) += NCR_Q720_mod.o
|
||||
obj-$(CONFIG_SCSI_SYM53C416) += sym53c416.o
|
||||
obj-$(CONFIG_SCSI_QLOGIC_FAS) += qlogicfas408.o qlogicfas.o
|
||||
obj-$(CONFIG_PCMCIA_QLOGIC) += qlogicfas408.o
|
||||
obj-$(CONFIG_SCSI_QLOGIC_FC) += qlogicfc.o
|
||||
obj-$(CONFIG_SCSI_QLOGIC_1280) += qla1280.o
|
||||
obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx/
|
||||
obj-$(CONFIG_SCSI_LPFC) += lpfc/
|
||||
|
||||
@@ -149,20 +149,20 @@ static int dacmode = -1;
|
||||
|
||||
static int commit = -1;
|
||||
|
||||
module_param(nondasd, int, 0);
|
||||
module_param(nondasd, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(nondasd, "Control scanning of hba for nondasd devices. 0=off, 1=on");
|
||||
module_param(dacmode, int, 0);
|
||||
module_param(dacmode, int, S_IRUGO|S_IWUSR);
|
||||
MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC. 0=off, 1=on");
|
||||
module_param(commit, int, 0);
|
||||
module_param(commit, int, S_IRUGO|S_IWUSR);
|
||||
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.");
|
||||
MODULE_PARM_DESC(numacb, "Request a limit to the number of adapter control blocks (FIB) allocated. Valid values 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.");
|
||||
MODULE_PARM_DESC(acbsize, "Request a specific adapter control block (FIB) size. Valid values are 512, 2048, 4096 and 8192. Default is to use suggestion from Firmware.");
|
||||
/**
|
||||
* aac_get_config_status - check the adapter configuration
|
||||
* @common: adapter to query
|
||||
@@ -387,6 +387,7 @@ static void get_container_name_callback(void *context, struct fib * fibptr)
|
||||
struct scsi_cmnd * scsicmd;
|
||||
|
||||
scsicmd = (struct scsi_cmnd *) context;
|
||||
scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
|
||||
|
||||
dprintk((KERN_DEBUG "get_container_name_callback[cpu %d]: t = %ld.\n", smp_processor_id(), jiffies));
|
||||
if (fibptr == NULL)
|
||||
@@ -453,8 +454,10 @@ static int aac_get_container_name(struct scsi_cmnd * scsicmd, int cid)
|
||||
/*
|
||||
* Check that the command queued to the controller
|
||||
*/
|
||||
if (status == -EINPROGRESS)
|
||||
if (status == -EINPROGRESS) {
|
||||
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printk(KERN_WARNING "aac_get_container_name: aac_fib_send failed with status: %d.\n", status);
|
||||
aac_fib_complete(cmd_fibcontext);
|
||||
@@ -907,9 +910,10 @@ static void io_callback(void *context, struct fib * fibptr)
|
||||
u32 cid;
|
||||
|
||||
scsicmd = (struct scsi_cmnd *) context;
|
||||
scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
|
||||
|
||||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun);
|
||||
cid = scmd_id(scsicmd);
|
||||
|
||||
if (nblank(dprintk(x))) {
|
||||
u64 lba;
|
||||
@@ -1151,8 +1155,10 @@ static int aac_read(struct scsi_cmnd * scsicmd, int cid)
|
||||
/*
|
||||
* Check that the command queued to the controller
|
||||
*/
|
||||
if (status == -EINPROGRESS)
|
||||
if (status == -EINPROGRESS) {
|
||||
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printk(KERN_WARNING "aac_read: aac_fib_send failed with status: %d.\n", status);
|
||||
/*
|
||||
@@ -1318,8 +1324,8 @@ static int aac_write(struct scsi_cmnd * scsicmd, int cid)
|
||||
/*
|
||||
* Check that the command queued to the controller
|
||||
*/
|
||||
if (status == -EINPROGRESS)
|
||||
{
|
||||
if (status == -EINPROGRESS) {
|
||||
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1341,6 +1347,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
|
||||
struct scsi_cmnd *cmd;
|
||||
|
||||
cmd = context;
|
||||
cmd->SCp.phase = AAC_OWNER_MIDLEVEL;
|
||||
|
||||
dprintk((KERN_DEBUG "synchronize_callback[cpu %d]: t = %ld.\n",
|
||||
smp_processor_id(), jiffies));
|
||||
@@ -1354,7 +1361,7 @@ static void synchronize_callback(void *context, struct fib *fibptr)
|
||||
else {
|
||||
struct scsi_device *sdev = cmd->device;
|
||||
struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
|
||||
u32 cid = ID_LUN_TO_CONTAINER(sdev->id, sdev->lun);
|
||||
u32 cid = sdev_id(sdev);
|
||||
printk(KERN_WARNING
|
||||
"synchronize_callback: synchronize failed, status = %d\n",
|
||||
le32_to_cpu(synchronizereply->status));
|
||||
@@ -1386,12 +1393,12 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
|
||||
unsigned long flags;
|
||||
|
||||
/*
|
||||
* Wait for all commands to complete to this specific
|
||||
* target (block).
|
||||
* Wait for all outstanding queued commands to complete to this
|
||||
* specific target (block).
|
||||
*/
|
||||
spin_lock_irqsave(&sdev->list_lock, flags);
|
||||
list_for_each_entry(cmd, &sdev->cmd_list, list)
|
||||
if (cmd != scsicmd && cmd->serial_number != 0) {
|
||||
if (cmd != scsicmd && cmd->SCp.phase == AAC_OWNER_FIRMWARE) {
|
||||
++active;
|
||||
break;
|
||||
}
|
||||
@@ -1434,8 +1441,10 @@ static int aac_synchronize(struct scsi_cmnd *scsicmd, int cid)
|
||||
/*
|
||||
* Check that the command queued to the controller
|
||||
*/
|
||||
if (status == -EINPROGRESS)
|
||||
if (status == -EINPROGRESS) {
|
||||
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
printk(KERN_WARNING
|
||||
"aac_synchronize: aac_fib_send failed with status: %d.\n", status);
|
||||
@@ -1458,7 +1467,6 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||
struct Scsi_Host *host = scsicmd->device->host;
|
||||
struct aac_dev *dev = (struct aac_dev *)host->hostdata;
|
||||
struct fsa_dev_info *fsa_dev_ptr = dev->fsa_dev;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* If the bus, id or lun is out of range, return fail
|
||||
@@ -1466,13 +1474,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||
* itself.
|
||||
*/
|
||||
if (scmd_id(scsicmd) != host->this_id) {
|
||||
if ((scsicmd->device->channel == CONTAINER_CHANNEL)) {
|
||||
if( (scsicmd->device->id >= dev->maximum_num_containers) || (scsicmd->device->lun != 0)){
|
||||
if ((scmd_channel(scsicmd) == CONTAINER_CHANNEL)) {
|
||||
if((scmd_id(scsicmd) >= dev->maximum_num_containers) ||
|
||||
(scsicmd->device->lun != 0)) {
|
||||
scsicmd->result = DID_NO_CONNECT << 16;
|
||||
scsicmd->scsi_done(scsicmd);
|
||||
return 0;
|
||||
}
|
||||
cid = ID_LUN_TO_CONTAINER(scsicmd->device->id, scsicmd->device->lun);
|
||||
cid = scmd_id(scsicmd);
|
||||
|
||||
/*
|
||||
* If the target container doesn't exist, it may have
|
||||
@@ -1548,7 +1557,7 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||
{
|
||||
struct inquiry_data inq_data;
|
||||
|
||||
dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scsicmd->device->id));
|
||||
dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", scmd_id(scsicmd)));
|
||||
memset(&inq_data, 0, sizeof (struct inquiry_data));
|
||||
|
||||
inq_data.inqd_ver = 2; /* claim compliance to SCSI-2 */
|
||||
@@ -1598,13 +1607,14 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||
cp[11] = 0;
|
||||
cp[12] = 0;
|
||||
aac_internal_transfer(scsicmd, cp, 0,
|
||||
min((unsigned int)scsicmd->cmnd[13], sizeof(cp)));
|
||||
min_t(size_t, scsicmd->cmnd[13], sizeof(cp)));
|
||||
if (sizeof(cp) < scsicmd->cmnd[13]) {
|
||||
unsigned int len, offset = sizeof(cp);
|
||||
|
||||
memset(cp, 0, offset);
|
||||
do {
|
||||
len = min(scsicmd->cmnd[13]-offset, sizeof(cp));
|
||||
len = min_t(size_t, scsicmd->cmnd[13] - offset,
|
||||
sizeof(cp));
|
||||
aac_internal_transfer(scsicmd, cp, offset, len);
|
||||
} while ((offset += len) < scsicmd->cmnd[13]);
|
||||
}
|
||||
@@ -1728,24 +1738,19 @@ int aac_scsi_cmd(struct scsi_cmnd * scsicmd)
|
||||
* containers to /dev/sd device names
|
||||
*/
|
||||
|
||||
spin_unlock_irq(host->host_lock);
|
||||
if (scsicmd->request->rq_disk)
|
||||
strlcpy(fsa_dev_ptr[cid].devname,
|
||||
scsicmd->request->rq_disk->disk_name,
|
||||
min(sizeof(fsa_dev_ptr[cid].devname),
|
||||
sizeof(scsicmd->request->rq_disk->disk_name) + 1));
|
||||
ret = aac_read(scsicmd, cid);
|
||||
spin_lock_irq(host->host_lock);
|
||||
return ret;
|
||||
|
||||
return aac_read(scsicmd, cid);
|
||||
|
||||
case WRITE_6:
|
||||
case WRITE_10:
|
||||
case WRITE_12:
|
||||
case WRITE_16:
|
||||
spin_unlock_irq(host->host_lock);
|
||||
ret = aac_write(scsicmd, cid);
|
||||
spin_lock_irq(host->host_lock);
|
||||
return ret;
|
||||
return aac_write(scsicmd, cid);
|
||||
|
||||
case SYNCHRONIZE_CACHE:
|
||||
/* Issue FIB to tell Firmware to flush it's cache */
|
||||
@@ -1778,7 +1783,7 @@ static int query_disk(struct aac_dev *dev, void __user *arg)
|
||||
if (copy_from_user(&qd, arg, sizeof (struct aac_query_disk)))
|
||||
return -EFAULT;
|
||||
if (qd.cnum == -1)
|
||||
qd.cnum = ID_LUN_TO_CONTAINER(qd.id, qd.lun);
|
||||
qd.cnum = qd.id;
|
||||
else if ((qd.bus == -1) && (qd.id == -1) && (qd.lun == -1))
|
||||
{
|
||||
if (qd.cnum < 0 || qd.cnum >= dev->maximum_num_containers)
|
||||
@@ -1890,6 +1895,7 @@ static void aac_srb_callback(void *context, struct fib * fibptr)
|
||||
struct scsi_cmnd *scsicmd;
|
||||
|
||||
scsicmd = (struct scsi_cmnd *) context;
|
||||
scsicmd->SCp.phase = AAC_OWNER_MIDLEVEL;
|
||||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
|
||||
if (fibptr == NULL)
|
||||
@@ -2068,14 +2074,13 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
||||
u32 timeout;
|
||||
|
||||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
if (scsicmd->device->id >= dev->maximum_num_physicals ||
|
||||
if (scmd_id(scsicmd) >= dev->maximum_num_physicals ||
|
||||
scsicmd->device->lun > 7) {
|
||||
scsicmd->result = DID_NO_CONNECT << 16;
|
||||
scsicmd->scsi_done(scsicmd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev = (struct aac_dev *)scsicmd->device->host->hostdata;
|
||||
switch(scsicmd->sc_data_direction){
|
||||
case DMA_TO_DEVICE:
|
||||
flag = SRB_DataOut;
|
||||
@@ -2103,8 +2108,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
||||
|
||||
srbcmd = (struct aac_srb*) fib_data(cmd_fibcontext);
|
||||
srbcmd->function = cpu_to_le32(SRBF_ExecuteScsi);
|
||||
srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scsicmd->device->channel));
|
||||
srbcmd->id = cpu_to_le32(scsicmd->device->id);
|
||||
srbcmd->channel = cpu_to_le32(aac_logical_to_phys(scmd_channel(scsicmd)));
|
||||
srbcmd->id = cpu_to_le32(scmd_id(scsicmd));
|
||||
srbcmd->lun = cpu_to_le32(scsicmd->device->lun);
|
||||
srbcmd->flags = cpu_to_le32(flag);
|
||||
timeout = scsicmd->timeout_per_command/HZ;
|
||||
@@ -2161,7 +2166,8 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
|
||||
/*
|
||||
* Check that the command queued to the controller
|
||||
*/
|
||||
if (status == -EINPROGRESS){
|
||||
if (status == -EINPROGRESS) {
|
||||
scsicmd->SCp.phase = AAC_OWNER_FIRMWARE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2192,8 +2198,6 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
|
||||
scsicmd->sc_data_direction);
|
||||
psg->count = cpu_to_le32(sg_count);
|
||||
|
||||
byte_count = 0;
|
||||
|
||||
for (i = 0; i < sg_count; i++) {
|
||||
psg->sg[i].addr = cpu_to_le32(sg_dma_address(sg));
|
||||
psg->sg[i].count = cpu_to_le32(sg_dma_len(sg));
|
||||
@@ -2249,18 +2253,17 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
|
||||
|
||||
sg_count = pci_map_sg(dev->pdev, sg, scsicmd->use_sg,
|
||||
scsicmd->sc_data_direction);
|
||||
psg->count = cpu_to_le32(sg_count);
|
||||
|
||||
byte_count = 0;
|
||||
|
||||
for (i = 0; i < sg_count; i++) {
|
||||
int count = sg_dma_len(sg);
|
||||
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);
|
||||
psg->sg[i].count = cpu_to_le32(count);
|
||||
byte_count += count;
|
||||
sg++;
|
||||
}
|
||||
psg->count = cpu_to_le32(sg_count);
|
||||
/* hba wants the size to be exact */
|
||||
if(byte_count > scsicmd->request_bufflen){
|
||||
u32 temp = le32_to_cpu(psg->sg[i-1].count) -
|
||||
@@ -2275,16 +2278,15 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
|
||||
}
|
||||
}
|
||||
else if(scsicmd->request_bufflen) {
|
||||
u64 addr;
|
||||
addr = pci_map_single(dev->pdev,
|
||||
scsicmd->SCp.dma_handle = pci_map_single(dev->pdev,
|
||||
scsicmd->request_buffer,
|
||||
scsicmd->request_bufflen,
|
||||
scsicmd->sc_data_direction);
|
||||
addr = scsicmd->SCp.dma_handle;
|
||||
psg->count = cpu_to_le32(1);
|
||||
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;
|
||||
}
|
||||
return byte_count;
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
* D E F I N E S
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef AAC_DRIVER_BUILD
|
||||
# define AAC_DRIVER_BUILD 2409
|
||||
# define AAC_DRIVER_BRANCH "-mh1"
|
||||
#endif
|
||||
#define MAXIMUM_NUM_CONTAINERS 32
|
||||
|
||||
#define AAC_NUM_MGT_FIB 8
|
||||
@@ -25,7 +29,6 @@
|
||||
* These macros convert from physical channels to virtual channels
|
||||
*/
|
||||
#define CONTAINER_CHANNEL (0)
|
||||
#define ID_LUN_TO_CONTAINER(id, lun) (id)
|
||||
#define CONTAINER_TO_CHANNEL(cont) (CONTAINER_CHANNEL)
|
||||
#define CONTAINER_TO_ID(cont) (cont)
|
||||
#define CONTAINER_TO_LUN(cont) (0)
|
||||
@@ -789,6 +792,7 @@ struct fsa_dev_info {
|
||||
u64 size;
|
||||
u32 type;
|
||||
u32 config_waiting_on;
|
||||
unsigned long config_waiting_stamp;
|
||||
u16 queue_depth;
|
||||
u8 config_needed;
|
||||
u8 valid;
|
||||
@@ -1771,6 +1775,11 @@ static inline u32 cap_to_cyls(sector_t capacity, u32 divisor)
|
||||
}
|
||||
|
||||
struct scsi_cmnd;
|
||||
/* SCp.phase values */
|
||||
#define AAC_OWNER_MIDLEVEL 0x101
|
||||
#define AAC_OWNER_LOWLEVEL 0x102
|
||||
#define AAC_OWNER_ERROR_HANDLER 0x103
|
||||
#define AAC_OWNER_FIRMWARE 0x106
|
||||
|
||||
const char *aac_driverinfo(struct Scsi_Host *);
|
||||
struct fib *aac_fib_alloc(struct aac_dev *dev);
|
||||
|
||||
@@ -38,6 +38,8 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
@@ -293,6 +295,16 @@ return_fib:
|
||||
status = 0;
|
||||
} else {
|
||||
spin_unlock_irqrestore(&dev->fib_lock, flags);
|
||||
/* If someone killed the AIF aacraid thread, restart it */
|
||||
status = !dev->aif_thread;
|
||||
if (status && dev->queues && dev->fsa_dev) {
|
||||
/* Be paranoid, be very paranoid! */
|
||||
kthread_stop(dev->thread);
|
||||
ssleep(1);
|
||||
dev->aif_thread = 0;
|
||||
dev->thread = kthread_run(aac_command_thread, dev, dev->name);
|
||||
ssleep(1);
|
||||
}
|
||||
if (f.wait) {
|
||||
if(down_interruptible(&fibctx->wait_sem) < 0) {
|
||||
status = -EINTR;
|
||||
|
||||
@@ -767,9 +767,9 @@ void aac_printf(struct aac_dev *dev, u32 val)
|
||||
if (cp[length] != 0)
|
||||
cp[length] = 0;
|
||||
if (level == LOG_AAC_HIGH_ERROR)
|
||||
printk(KERN_WARNING "aacraid:%s", cp);
|
||||
printk(KERN_WARNING "%s:%s", dev->name, cp);
|
||||
else
|
||||
printk(KERN_INFO "aacraid:%s", cp);
|
||||
printk(KERN_INFO "%s:%s", dev->name, cp);
|
||||
}
|
||||
memset(cp, 0, 256);
|
||||
}
|
||||
@@ -784,6 +784,7 @@ void aac_printf(struct aac_dev *dev, u32 val)
|
||||
* dispatches it to the appropriate routine for handling.
|
||||
*/
|
||||
|
||||
#define AIF_SNIFF_TIMEOUT (30*HZ)
|
||||
static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
{
|
||||
struct hw_fib * hw_fib = fibptr->hw_fib;
|
||||
@@ -837,6 +838,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
if (device) {
|
||||
dev->fsa_dev[container].config_needed = CHANGE;
|
||||
dev->fsa_dev[container].config_waiting_on = AifEnConfigChange;
|
||||
dev->fsa_dev[container].config_waiting_stamp = jiffies;
|
||||
scsi_device_put(device);
|
||||
}
|
||||
}
|
||||
@@ -849,13 +851,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
if (container != (u32)-1) {
|
||||
if (container >= dev->maximum_num_containers)
|
||||
break;
|
||||
if (dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data))
|
||||
if ((dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data)) &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
|
||||
dev->fsa_dev[container].config_waiting_on = 0;
|
||||
} else for (container = 0;
|
||||
container < dev->maximum_num_containers; ++container) {
|
||||
if (dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data))
|
||||
if ((dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data)) &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
|
||||
dev->fsa_dev[container].config_waiting_on = 0;
|
||||
}
|
||||
break;
|
||||
@@ -872,6 +876,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
dev->fsa_dev[container].config_needed = ADD;
|
||||
dev->fsa_dev[container].config_waiting_on =
|
||||
AifEnConfigChange;
|
||||
dev->fsa_dev[container].config_waiting_stamp = jiffies;
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -884,6 +889,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
dev->fsa_dev[container].config_needed = DELETE;
|
||||
dev->fsa_dev[container].config_waiting_on =
|
||||
AifEnConfigChange;
|
||||
dev->fsa_dev[container].config_waiting_stamp = jiffies;
|
||||
break;
|
||||
|
||||
/*
|
||||
@@ -894,11 +900,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
container = le32_to_cpu(((u32 *)aifcmd->data)[1]);
|
||||
if (container >= dev->maximum_num_containers)
|
||||
break;
|
||||
if (dev->fsa_dev[container].config_waiting_on)
|
||||
if (dev->fsa_dev[container].config_waiting_on &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
|
||||
break;
|
||||
dev->fsa_dev[container].config_needed = CHANGE;
|
||||
dev->fsa_dev[container].config_waiting_on =
|
||||
AifEnConfigChange;
|
||||
dev->fsa_dev[container].config_waiting_stamp = jiffies;
|
||||
break;
|
||||
|
||||
case AifEnConfigChange:
|
||||
@@ -913,13 +921,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
if (container != (u32)-1) {
|
||||
if (container >= dev->maximum_num_containers)
|
||||
break;
|
||||
if (dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data))
|
||||
if ((dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data)) &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
|
||||
dev->fsa_dev[container].config_waiting_on = 0;
|
||||
} else for (container = 0;
|
||||
container < dev->maximum_num_containers; ++container) {
|
||||
if (dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data))
|
||||
if ((dev->fsa_dev[container].config_waiting_on ==
|
||||
le32_to_cpu(*(u32 *)aifcmd->data)) &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
|
||||
dev->fsa_dev[container].config_waiting_on = 0;
|
||||
}
|
||||
break;
|
||||
@@ -946,6 +956,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
dev->fsa_dev[container].config_waiting_on =
|
||||
AifEnContainerChange;
|
||||
dev->fsa_dev[container].config_needed = ADD;
|
||||
dev->fsa_dev[container].config_waiting_stamp =
|
||||
jiffies;
|
||||
}
|
||||
}
|
||||
if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero))
|
||||
@@ -961,6 +973,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
dev->fsa_dev[container].config_waiting_on =
|
||||
AifEnContainerChange;
|
||||
dev->fsa_dev[container].config_needed = DELETE;
|
||||
dev->fsa_dev[container].config_waiting_stamp =
|
||||
jiffies;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -969,8 +983,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
|
||||
device_config_needed = NOTHING;
|
||||
for (container = 0; container < dev->maximum_num_containers;
|
||||
++container) {
|
||||
if ((dev->fsa_dev[container].config_waiting_on == 0)
|
||||
&& (dev->fsa_dev[container].config_needed != NOTHING)) {
|
||||
if ((dev->fsa_dev[container].config_waiting_on == 0) &&
|
||||
(dev->fsa_dev[container].config_needed != NOTHING) &&
|
||||
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) {
|
||||
device_config_needed =
|
||||
dev->fsa_dev[container].config_needed;
|
||||
dev->fsa_dev[container].config_needed = NOTHING;
|
||||
|
||||
@@ -27,12 +27,6 @@
|
||||
* Abstract: Linux Driver entry module for Adaptec RAID Array Controller
|
||||
*/
|
||||
|
||||
#define AAC_DRIVER_VERSION "1.1-4"
|
||||
#ifndef AAC_DRIVER_BRANCH
|
||||
#define AAC_DRIVER_BRANCH ""
|
||||
#endif
|
||||
#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__
|
||||
#define AAC_DRIVERNAME "aacraid"
|
||||
|
||||
#include <linux/compat.h>
|
||||
#include <linux/blkdev.h>
|
||||
@@ -62,6 +56,13 @@
|
||||
|
||||
#include "aacraid.h"
|
||||
|
||||
#define AAC_DRIVER_VERSION "1.1-5"
|
||||
#ifndef AAC_DRIVER_BRANCH
|
||||
#define AAC_DRIVER_BRANCH ""
|
||||
#endif
|
||||
#define AAC_DRIVER_BUILD_DATE __DATE__ " " __TIME__
|
||||
#define AAC_DRIVERNAME "aacraid"
|
||||
|
||||
#ifdef AAC_DRIVER_BUILD
|
||||
#define _str(x) #x
|
||||
#define str(x) _str(x)
|
||||
@@ -73,7 +74,7 @@
|
||||
MODULE_AUTHOR("Red Hat Inc and Adaptec");
|
||||
MODULE_DESCRIPTION("Dell PERC2, 2/Si, 3/Si, 3/Di, "
|
||||
"Adaptec Advanced Raid Products, "
|
||||
"and HP NetRAID-4M SCSI driver");
|
||||
"HP NetRAID-4M, IBM ServeRAID & ICP SCSI driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(AAC_DRIVER_FULL_VERSION);
|
||||
|
||||
@@ -243,6 +244,7 @@ static struct aac_driver_ident aac_drivers[] = {
|
||||
static int aac_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
|
||||
{
|
||||
cmd->scsi_done = done;
|
||||
cmd->SCp.phase = AAC_OWNER_LOWLEVEL;
|
||||
return (aac_scsi_cmd(cmd) ? FAILED : 0);
|
||||
}
|
||||
|
||||
@@ -471,7 +473,8 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
|
||||
__shost_for_each_device(dev, host) {
|
||||
spin_lock_irqsave(&dev->list_lock, flags);
|
||||
list_for_each_entry(command, &dev->cmd_list, list) {
|
||||
if (command->serial_number) {
|
||||
if ((command != cmd) &&
|
||||
(command->SCp.phase == AAC_OWNER_FIRMWARE)) {
|
||||
active++;
|
||||
break;
|
||||
}
|
||||
@@ -569,12 +572,12 @@ static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned long
|
||||
|
||||
f = compat_alloc_user_space(sizeof(*f));
|
||||
ret = 0;
|
||||
if (clear_user(f, sizeof(*f) != sizeof(*f)))
|
||||
if (clear_user(f, sizeof(*f)) != sizeof(*f))
|
||||
ret = -EFAULT;
|
||||
if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - sizeof(u32)))
|
||||
ret = -EFAULT;
|
||||
if (!ret)
|
||||
ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
|
||||
ret = aac_do_ioctl(dev, cmd, f);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -687,6 +690,18 @@ static ssize_t aac_show_serial_number(struct class_device *class_dev,
|
||||
return len;
|
||||
}
|
||||
|
||||
static ssize_t aac_show_max_channel(struct class_device *class_dev, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
class_to_shost(class_dev)->max_channel);
|
||||
}
|
||||
|
||||
static ssize_t aac_show_max_id(struct class_device *class_dev, char *buf)
|
||||
{
|
||||
return snprintf(buf, PAGE_SIZE, "%d\n",
|
||||
class_to_shost(class_dev)->max_id);
|
||||
}
|
||||
|
||||
|
||||
static struct class_device_attribute aac_model = {
|
||||
.attr = {
|
||||
@@ -730,6 +745,20 @@ static struct class_device_attribute aac_serial_number = {
|
||||
},
|
||||
.show = aac_show_serial_number,
|
||||
};
|
||||
static struct class_device_attribute aac_max_channel = {
|
||||
.attr = {
|
||||
.name = "max_channel",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_max_channel,
|
||||
};
|
||||
static struct class_device_attribute aac_max_id = {
|
||||
.attr = {
|
||||
.name = "max_id",
|
||||
.mode = S_IRUGO,
|
||||
},
|
||||
.show = aac_show_max_id,
|
||||
};
|
||||
|
||||
static struct class_device_attribute *aac_attrs[] = {
|
||||
&aac_model,
|
||||
@@ -738,6 +767,8 @@ static struct class_device_attribute *aac_attrs[] = {
|
||||
&aac_monitor_version,
|
||||
&aac_bios_version,
|
||||
&aac_serial_number,
|
||||
&aac_max_channel,
|
||||
&aac_max_id,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -775,6 +806,7 @@ static struct scsi_host_template aac_driver_template = {
|
||||
.cmd_per_lun = AAC_NUM_IO_FIB,
|
||||
#endif
|
||||
.use_clustering = ENABLE_CLUSTERING,
|
||||
.emulated = 1,
|
||||
};
|
||||
|
||||
|
||||
@@ -798,10 +830,11 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
|
||||
error = pci_enable_device(pdev);
|
||||
if (error)
|
||||
goto out;
|
||||
error = -ENODEV;
|
||||
|
||||
if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
|
||||
pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK))
|
||||
goto out;
|
||||
goto out_disable_pdev;
|
||||
/*
|
||||
* If the quirk31 bit is set, the adapter needs adapter
|
||||
* to driver communication memory to be allocated below 2gig
|
||||
@@ -809,7 +842,7 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
|
||||
if (aac_drivers[index].quirks & AAC_QUIRK_31BIT)
|
||||
if (pci_set_dma_mask(pdev, DMA_31BIT_MASK) ||
|
||||
pci_set_consistent_dma_mask(pdev, DMA_31BIT_MASK))
|
||||
goto out;
|
||||
goto out_disable_pdev;
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
@@ -904,9 +937,9 @@ static int __devinit aac_probe_one(struct pci_dev *pdev,
|
||||
* physical channels are address by their actual physical number+1
|
||||
*/
|
||||
if (aac->nondasd_support == 1)
|
||||
shost->max_channel = aac->maximum_num_channels + 1;
|
||||
shost->max_channel = aac->maximum_num_channels;
|
||||
else
|
||||
shost->max_channel = 1;
|
||||
shost->max_channel = 0;
|
||||
|
||||
aac_get_config_status(aac);
|
||||
aac_get_containers(aac);
|
||||
@@ -1020,7 +1053,8 @@ static int __init aac_init(void)
|
||||
|
||||
static void __exit aac_exit(void)
|
||||
{
|
||||
unregister_chrdev(aac_cfg_major, "aac");
|
||||
if (aac_cfg_major > -1)
|
||||
unregister_chrdev(aac_cfg_major, "aac");
|
||||
pci_unregister_driver(&aac_pci_driver);
|
||||
}
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ static int rkt_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
/*
|
||||
* Yield the processor in case we are slow
|
||||
*/
|
||||
schedule_timeout_uninterruptible(1);
|
||||
msleep(1);
|
||||
}
|
||||
if (ok != 1) {
|
||||
/*
|
||||
@@ -343,7 +343,7 @@ static int aac_rkt_check_health(struct aac_dev *dev)
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
|
||||
post, paddr);
|
||||
if ((buffer[0] == '0') && (buffer[1] == 'x')) {
|
||||
if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) {
|
||||
ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10);
|
||||
ret <<= 4;
|
||||
ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10);
|
||||
|
||||
@@ -183,7 +183,7 @@ static int rx_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
/*
|
||||
* Yield the processor in case we are slow
|
||||
*/
|
||||
schedule_timeout_uninterruptible(1);
|
||||
msleep(1);
|
||||
}
|
||||
if (ok != 1) {
|
||||
/*
|
||||
@@ -342,7 +342,7 @@ static int aac_rx_check_health(struct aac_dev *dev)
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
pci_free_consistent(dev->pdev, sizeof(struct POSTSTATUS),
|
||||
post, paddr);
|
||||
if ((buffer[0] == '0') && (buffer[1] == 'x')) {
|
||||
if ((buffer[0] == '0') && ((buffer[1] == 'x') || (buffer[1] == 'X'))) {
|
||||
ret = (buffer[2] <= '9') ? (buffer[2] - '0') : (buffer[2] - 'A' + 10);
|
||||
ret <<= 4;
|
||||
ret += (buffer[3] <= '9') ? (buffer[3] - '0') : (buffer[3] - 'A' + 10);
|
||||
|
||||
@@ -189,7 +189,7 @@ static int sa_sync_cmd(struct aac_dev *dev, u32 command,
|
||||
ok = 1;
|
||||
break;
|
||||
}
|
||||
schedule_timeout_uninterruptible(1);
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
if (ok != 1)
|
||||
|
||||
@@ -372,7 +372,7 @@ typedef enum {
|
||||
AHD_CURRENT_SENSING = 0x40000,
|
||||
AHD_SCB_CONFIG_USED = 0x80000,/* No SEEPROM but SCB had info. */
|
||||
AHD_HP_BOARD = 0x100000,
|
||||
AHD_RESET_POLL_ACTIVE = 0x200000,
|
||||
AHD_BUS_RESET_ACTIVE = 0x200000,
|
||||
AHD_UPDATE_PEND_CMDS = 0x400000,
|
||||
AHD_RUNNING_QOUTFIFO = 0x800000,
|
||||
AHD_HAD_FIRST_SEL = 0x1000000
|
||||
@@ -589,7 +589,7 @@ typedef enum {
|
||||
SCB_PACKETIZED = 0x00800,
|
||||
SCB_EXPECT_PPR_BUSFREE = 0x01000,
|
||||
SCB_PKT_SENSE = 0x02000,
|
||||
SCB_CMDPHASE_ABORT = 0x04000,
|
||||
SCB_EXTERNAL_RESET = 0x04000,/* Device was reset externally */
|
||||
SCB_ON_COL_LIST = 0x08000,
|
||||
SCB_SILENT = 0x10000 /*
|
||||
* Be quiet about transmission type
|
||||
|
||||
@@ -207,7 +207,6 @@ static void ahd_add_scb_to_free_list(struct ahd_softc *ahd,
|
||||
static u_int ahd_rem_wscb(struct ahd_softc *ahd, u_int scbid,
|
||||
u_int prev, u_int next, u_int tid);
|
||||
static void ahd_reset_current_bus(struct ahd_softc *ahd);
|
||||
static ahd_callback_t ahd_reset_poll;
|
||||
static ahd_callback_t ahd_stat_timer;
|
||||
#ifdef AHD_DUMP_SEQ
|
||||
static void ahd_dumpseq(struct ahd_softc *ahd);
|
||||
@@ -1054,12 +1053,10 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
* If a target takes us into the command phase
|
||||
* assume that it has been externally reset and
|
||||
* has thus lost our previous packetized negotiation
|
||||
* agreement. Since we have not sent an identify
|
||||
* message and may not have fully qualified the
|
||||
* connection, we change our command to TUR, assert
|
||||
* ATN and ABORT the task when we go to message in
|
||||
* phase. The OSM will see the REQUEUE_REQUEST
|
||||
* status and retry the command.
|
||||
* agreement.
|
||||
* Revert to async/narrow transfers until we
|
||||
* can renegotiate with the device and notify
|
||||
* the OSM about the reset.
|
||||
*/
|
||||
scbid = ahd_get_scbptr(ahd);
|
||||
scb = ahd_lookup_scb(ahd, scbid);
|
||||
@@ -1086,31 +1083,15 @@ ahd_handle_seqint(struct ahd_softc *ahd, u_int intstat)
|
||||
ahd_set_syncrate(ahd, &devinfo, /*period*/0,
|
||||
/*offset*/0, /*ppr_options*/0,
|
||||
AHD_TRANS_ACTIVE, /*paused*/TRUE);
|
||||
ahd_outb(ahd, SCB_CDB_STORE, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+1, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+2, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+3, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+4, 0);
|
||||
ahd_outb(ahd, SCB_CDB_STORE+5, 0);
|
||||
ahd_outb(ahd, SCB_CDB_LEN, 6);
|
||||
scb->hscb->control &= ~(TAG_ENB|SCB_TAG_TYPE);
|
||||
scb->hscb->control |= MK_MESSAGE;
|
||||
ahd_outb(ahd, SCB_CONTROL, scb->hscb->control);
|
||||
ahd_outb(ahd, MSG_OUT, HOST_MSG);
|
||||
ahd_outb(ahd, SAVED_SCSIID, scb->hscb->scsiid);
|
||||
/*
|
||||
* The lun is 0, regardless of the SCB's lun
|
||||
* as we have not sent an identify message.
|
||||
*/
|
||||
ahd_outb(ahd, SAVED_LUN, 0);
|
||||
ahd_outb(ahd, SEQ_FLAGS, 0);
|
||||
ahd_assert_atn(ahd);
|
||||
scb->flags &= ~SCB_PACKETIZED;
|
||||
scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT;
|
||||
scb->flags |= SCB_EXTERNAL_RESET;
|
||||
ahd_freeze_devq(ahd, scb);
|
||||
ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
|
||||
ahd_freeze_scb(scb);
|
||||
|
||||
/* Notify XPT */
|
||||
ahd_send_async(ahd, devinfo.channel, devinfo.target,
|
||||
CAM_LUN_WILDCARD, AC_SENT_BDR, NULL);
|
||||
|
||||
/*
|
||||
* Allow the sequencer to continue with
|
||||
* non-pack processing.
|
||||
@@ -1534,6 +1515,18 @@ ahd_handle_scsiint(struct ahd_softc *ahd, u_int intstat)
|
||||
lqistat1 = ahd_inb(ahd, LQISTAT1);
|
||||
lqostat0 = ahd_inb(ahd, LQOSTAT0);
|
||||
busfreetime = ahd_inb(ahd, SSTAT2) & BUSFREETIME;
|
||||
|
||||
/*
|
||||
* Ignore external resets after a bus reset.
|
||||
*/
|
||||
if (((status & SCSIRSTI) != 0) && (ahd->flags & AHD_BUS_RESET_ACTIVE))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Clear bus reset flag
|
||||
*/
|
||||
ahd->flags &= ~AHD_BUS_RESET_ACTIVE;
|
||||
|
||||
if ((status0 & (SELDI|SELDO)) != 0) {
|
||||
u_int simode0;
|
||||
|
||||
@@ -2207,22 +2200,6 @@ ahd_handle_nonpkt_busfree(struct ahd_softc *ahd)
|
||||
if (sent_msg == MSG_ABORT_TAG)
|
||||
tag = SCB_GET_TAG(scb);
|
||||
|
||||
if ((scb->flags & SCB_CMDPHASE_ABORT) != 0) {
|
||||
/*
|
||||
* This abort is in response to an
|
||||
* unexpected switch to command phase
|
||||
* for a packetized connection. Since
|
||||
* the identify message was never sent,
|
||||
* "saved lun" is 0. We really want to
|
||||
* abort only the SCB that encountered
|
||||
* this error, which could have a different
|
||||
* lun. The SCB will be retried so the OS
|
||||
* will see the UA after renegotiating to
|
||||
* packetized.
|
||||
*/
|
||||
tag = SCB_GET_TAG(scb);
|
||||
saved_lun = scb->hscb->lun;
|
||||
}
|
||||
found = ahd_abort_scbs(ahd, target, 'A', saved_lun,
|
||||
tag, ROLE_INITIATOR,
|
||||
CAM_REQ_ABORTED);
|
||||
@@ -7847,6 +7824,17 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
int found;
|
||||
u_int fifo;
|
||||
u_int next_fifo;
|
||||
uint8_t scsiseq;
|
||||
|
||||
/*
|
||||
* Check if the last bus reset is cleared
|
||||
*/
|
||||
if (ahd->flags & AHD_BUS_RESET_ACTIVE) {
|
||||
printf("%s: bus reset still active\n",
|
||||
ahd_name(ahd));
|
||||
return 0;
|
||||
}
|
||||
ahd->flags |= AHD_BUS_RESET_ACTIVE;
|
||||
|
||||
ahd->pending_device = NULL;
|
||||
|
||||
@@ -7860,6 +7848,12 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
/* Make sure the sequencer is in a safe location. */
|
||||
ahd_clear_critical_section(ahd);
|
||||
|
||||
/*
|
||||
* Run our command complete fifos to ensure that we perform
|
||||
* completion processing on any commands that 'completed'
|
||||
* before the reset occurred.
|
||||
*/
|
||||
ahd_run_qoutfifo(ahd);
|
||||
#ifdef AHD_TARGET_MODE
|
||||
if ((ahd->flags & AHD_TARGETROLE) != 0) {
|
||||
ahd_run_tqinfifo(ahd, /*paused*/TRUE);
|
||||
@@ -7924,30 +7918,14 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
ahd_clear_fifo(ahd, 1);
|
||||
|
||||
/*
|
||||
* Revert to async/narrow transfers until we renegotiate.
|
||||
* Reenable selections
|
||||
*/
|
||||
ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST);
|
||||
scsiseq = ahd_inb(ahd, SCSISEQ_TEMPLATE);
|
||||
ahd_outb(ahd, SCSISEQ1, scsiseq & (ENSELI|ENRSELI|ENAUTOATNP));
|
||||
|
||||
max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7;
|
||||
for (target = 0; target <= max_scsiid; target++) {
|
||||
|
||||
if (ahd->enabled_targets[target] == NULL)
|
||||
continue;
|
||||
for (initiator = 0; initiator <= max_scsiid; initiator++) {
|
||||
struct ahd_devinfo devinfo;
|
||||
|
||||
ahd_compile_devinfo(&devinfo, target, initiator,
|
||||
CAM_LUN_WILDCARD,
|
||||
'A', ROLE_UNKNOWN);
|
||||
ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
|
||||
AHD_TRANS_CUR, /*paused*/TRUE);
|
||||
ahd_set_syncrate(ahd, &devinfo, /*period*/0,
|
||||
/*offset*/0, /*ppr_options*/0,
|
||||
AHD_TRANS_CUR, /*paused*/TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef AHD_TARGET_MODE
|
||||
max_scsiid = (ahd->features & AHD_WIDE) ? 15 : 7;
|
||||
|
||||
/*
|
||||
* Send an immediate notify ccb to all target more peripheral
|
||||
* drivers affected by this action.
|
||||
@@ -7975,53 +7953,33 @@ ahd_reset_channel(struct ahd_softc *ahd, char channel, int initiate_reset)
|
||||
/* Notify the XPT that a bus reset occurred */
|
||||
ahd_send_async(ahd, devinfo.channel, CAM_TARGET_WILDCARD,
|
||||
CAM_LUN_WILDCARD, AC_BUS_RESET, NULL);
|
||||
ahd_restart(ahd);
|
||||
|
||||
/*
|
||||
* Freeze the SIMQ until our poller can determine that
|
||||
* the bus reset has really gone away. We set the initial
|
||||
* timer to 0 to have the check performed as soon as possible
|
||||
* from the timer context.
|
||||
* Revert to async/narrow transfers until we renegotiate.
|
||||
*/
|
||||
if ((ahd->flags & AHD_RESET_POLL_ACTIVE) == 0) {
|
||||
ahd->flags |= AHD_RESET_POLL_ACTIVE;
|
||||
ahd_freeze_simq(ahd);
|
||||
ahd_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd);
|
||||
for (target = 0; target <= max_scsiid; target++) {
|
||||
|
||||
if (ahd->enabled_targets[target] == NULL)
|
||||
continue;
|
||||
for (initiator = 0; initiator <= max_scsiid; initiator++) {
|
||||
struct ahd_devinfo devinfo;
|
||||
|
||||
ahd_compile_devinfo(&devinfo, target, initiator,
|
||||
CAM_LUN_WILDCARD,
|
||||
'A', ROLE_UNKNOWN);
|
||||
ahd_set_width(ahd, &devinfo, MSG_EXT_WDTR_BUS_8_BIT,
|
||||
AHD_TRANS_CUR, /*paused*/TRUE);
|
||||
ahd_set_syncrate(ahd, &devinfo, /*period*/0,
|
||||
/*offset*/0, /*ppr_options*/0,
|
||||
AHD_TRANS_CUR, /*paused*/TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
ahd_restart(ahd);
|
||||
|
||||
return (found);
|
||||
}
|
||||
|
||||
|
||||
#define AHD_RESET_POLL_US 1000
|
||||
static void
|
||||
ahd_reset_poll(void *arg)
|
||||
{
|
||||
struct ahd_softc *ahd = arg;
|
||||
u_int scsiseq1;
|
||||
u_long s;
|
||||
|
||||
ahd_lock(ahd, &s);
|
||||
ahd_pause(ahd);
|
||||
ahd_update_modes(ahd);
|
||||
ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
|
||||
ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
|
||||
if ((ahd_inb(ahd, SSTAT1) & SCSIRSTI) != 0) {
|
||||
ahd_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US,
|
||||
ahd_reset_poll, ahd);
|
||||
ahd_unpause(ahd);
|
||||
ahd_unlock(ahd, &s);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reset is now low. Complete chip reinitialization. */
|
||||
ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) | ENSCSIRST);
|
||||
scsiseq1 = ahd_inb(ahd, SCSISEQ_TEMPLATE);
|
||||
ahd_outb(ahd, SCSISEQ1, scsiseq1 & (ENSELI|ENRSELI|ENAUTOATNP));
|
||||
ahd_unpause(ahd);
|
||||
ahd->flags &= ~AHD_RESET_POLL_ACTIVE;
|
||||
ahd_unlock(ahd, &s);
|
||||
ahd_release_simq(ahd);
|
||||
}
|
||||
|
||||
/**************************** Statistics Processing ***************************/
|
||||
static void
|
||||
ahd_stat_timer(void *arg)
|
||||
|
||||
@@ -782,6 +782,7 @@ ahd_linux_bus_reset(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct ahd_softc *ahd;
|
||||
int found;
|
||||
unsigned long flags;
|
||||
|
||||
ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
|
||||
#ifdef AHD_DEBUG
|
||||
@@ -789,8 +790,11 @@ ahd_linux_bus_reset(struct scsi_cmnd *cmd)
|
||||
printf("%s: Bus reset called for cmd %p\n",
|
||||
ahd_name(ahd), cmd);
|
||||
#endif
|
||||
ahd_lock(ahd, &flags);
|
||||
|
||||
found = ahd_reset_channel(ahd, scmd_channel(cmd) + 'A',
|
||||
/*initiate reset*/TRUE);
|
||||
ahd_unlock(ahd, &flags);
|
||||
|
||||
if (bootverbose)
|
||||
printf("%s: SCSI bus reset delivered. "
|
||||
|
||||
+128
-123
File diff suppressed because it is too large
Load Diff
@@ -68,7 +68,7 @@ struct srp_event_struct {
|
||||
void (*cmnd_done) (struct scsi_cmnd *);
|
||||
struct completion comp;
|
||||
union viosrp_iu *sync_srp;
|
||||
struct memory_descriptor *ext_list;
|
||||
struct srp_direct_buf *ext_list;
|
||||
dma_addr_t ext_list_token;
|
||||
};
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include "ibmvscsi.h"
|
||||
#include "srp.h"
|
||||
|
||||
static char partition_name[97] = "UNKNOWN";
|
||||
static unsigned int partition_number = -1;
|
||||
|
||||
@@ -1,227 +0,0 @@
|
||||
/*****************************************************************************/
|
||||
/* srp.h -- SCSI RDMA Protocol definitions */
|
||||
/* */
|
||||
/* Written By: Colin Devilbis, IBM Corporation */
|
||||
/* */
|
||||
/* Copyright (C) 2003 IBM Corporation */
|
||||
/* */
|
||||
/* This program is free software; you can redistribute it and/or modify */
|
||||
/* it under the terms of the GNU General Public License as published by */
|
||||
/* the Free Software Foundation; either version 2 of the License, or */
|
||||
/* (at your option) any later version. */
|
||||
/* */
|
||||
/* This program is distributed in the hope that it will be useful, */
|
||||
/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
|
||||
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
|
||||
/* GNU General Public License for more details. */
|
||||
/* */
|
||||
/* You should have received a copy of the GNU General Public License */
|
||||
/* along with this program; if not, write to the Free Software */
|
||||
/* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
/* */
|
||||
/* */
|
||||
/* This file contains structures and definitions for the SCSI RDMA Protocol */
|
||||
/* (SRP) as defined in the T10 standard available at www.t10.org. This */
|
||||
/* file was based on the 16a version of the standard */
|
||||
/* */
|
||||
/*****************************************************************************/
|
||||
#ifndef SRP_H
|
||||
#define SRP_H
|
||||
|
||||
#define SRP_VERSION "16.a"
|
||||
|
||||
#define PACKED __attribute__((packed))
|
||||
|
||||
enum srp_types {
|
||||
SRP_LOGIN_REQ_TYPE = 0x00,
|
||||
SRP_LOGIN_RSP_TYPE = 0xC0,
|
||||
SRP_LOGIN_REJ_TYPE = 0xC2,
|
||||
SRP_I_LOGOUT_TYPE = 0x03,
|
||||
SRP_T_LOGOUT_TYPE = 0x80,
|
||||
SRP_TSK_MGMT_TYPE = 0x01,
|
||||
SRP_CMD_TYPE = 0x02,
|
||||
SRP_RSP_TYPE = 0xC1,
|
||||
SRP_CRED_REQ_TYPE = 0x81,
|
||||
SRP_CRED_RSP_TYPE = 0x41,
|
||||
SRP_AER_REQ_TYPE = 0x82,
|
||||
SRP_AER_RSP_TYPE = 0x42
|
||||
};
|
||||
|
||||
enum srp_descriptor_formats {
|
||||
SRP_NO_BUFFER = 0x00,
|
||||
SRP_DIRECT_BUFFER = 0x01,
|
||||
SRP_INDIRECT_BUFFER = 0x02
|
||||
};
|
||||
|
||||
struct memory_descriptor {
|
||||
u64 virtual_address;
|
||||
u32 memory_handle;
|
||||
u32 length;
|
||||
};
|
||||
|
||||
struct indirect_descriptor {
|
||||
struct memory_descriptor head;
|
||||
u32 total_length;
|
||||
struct memory_descriptor list[1] PACKED;
|
||||
};
|
||||
|
||||
struct srp_generic {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_login_req {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
u32 max_requested_initiator_to_target_iulen;
|
||||
u32 reserved2;
|
||||
u16 required_buffer_formats;
|
||||
u8 reserved3:6;
|
||||
u8 multi_channel_action:2;
|
||||
u8 reserved4;
|
||||
u32 reserved5;
|
||||
u8 initiator_port_identifier[16];
|
||||
u8 target_port_identifier[16];
|
||||
};
|
||||
|
||||
struct srp_login_rsp {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 request_limit_delta;
|
||||
u64 tag;
|
||||
u32 max_initiator_to_target_iulen;
|
||||
u32 max_target_to_initiator_iulen;
|
||||
u16 supported_buffer_formats;
|
||||
u8 reserved2:6;
|
||||
u8 multi_channel_result:2;
|
||||
u8 reserved3;
|
||||
u8 reserved4[24];
|
||||
};
|
||||
|
||||
struct srp_login_rej {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 reason;
|
||||
u64 tag;
|
||||
u64 reserved2;
|
||||
u16 supported_buffer_formats;
|
||||
u8 reserved3[6];
|
||||
};
|
||||
|
||||
struct srp_i_logout {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_t_logout {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 reason;
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_tsk_mgmt {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
u32 reserved2;
|
||||
u64 lun PACKED;
|
||||
u8 reserved3;
|
||||
u8 reserved4;
|
||||
u8 task_mgmt_flags;
|
||||
u8 reserved5;
|
||||
u64 managed_task_tag;
|
||||
u64 reserved6;
|
||||
};
|
||||
|
||||
struct srp_cmd {
|
||||
u8 type;
|
||||
u32 reserved1 PACKED;
|
||||
u8 data_out_format:4;
|
||||
u8 data_in_format:4;
|
||||
u8 data_out_count;
|
||||
u8 data_in_count;
|
||||
u64 tag;
|
||||
u32 reserved2;
|
||||
u64 lun PACKED;
|
||||
u8 reserved3;
|
||||
u8 reserved4:5;
|
||||
u8 task_attribute:3;
|
||||
u8 reserved5;
|
||||
u8 additional_cdb_len;
|
||||
u8 cdb[16];
|
||||
u8 additional_data[0x100 - 0x30];
|
||||
};
|
||||
|
||||
struct srp_rsp {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 request_limit_delta;
|
||||
u64 tag;
|
||||
u16 reserved2;
|
||||
u8 reserved3:2;
|
||||
u8 diunder:1;
|
||||
u8 diover:1;
|
||||
u8 dounder:1;
|
||||
u8 doover:1;
|
||||
u8 snsvalid:1;
|
||||
u8 rspvalid:1;
|
||||
u8 status;
|
||||
u32 data_in_residual_count;
|
||||
u32 data_out_residual_count;
|
||||
u32 sense_data_list_length;
|
||||
u32 response_data_list_length;
|
||||
u8 sense_and_response_data[18];
|
||||
};
|
||||
|
||||
struct srp_cred_req {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 request_limit_delta;
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_cred_rsp {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
struct srp_aer_req {
|
||||
u8 type;
|
||||
u8 reserved1[3];
|
||||
u32 request_limit_delta;
|
||||
u64 tag;
|
||||
u32 reserved2;
|
||||
u64 lun;
|
||||
u32 sense_data_list_length;
|
||||
u32 reserved3;
|
||||
u8 sense_data[20];
|
||||
};
|
||||
|
||||
struct srp_aer_rsp {
|
||||
u8 type;
|
||||
u8 reserved1[7];
|
||||
u64 tag;
|
||||
};
|
||||
|
||||
union srp_iu {
|
||||
struct srp_generic generic;
|
||||
struct srp_login_req login_req;
|
||||
struct srp_login_rsp login_rsp;
|
||||
struct srp_login_rej login_rej;
|
||||
struct srp_i_logout i_logout;
|
||||
struct srp_t_logout t_logout;
|
||||
struct srp_tsk_mgmt tsk_mgmt;
|
||||
struct srp_cmd cmd;
|
||||
struct srp_rsp rsp;
|
||||
struct srp_cred_req cred_req;
|
||||
struct srp_cred_rsp cred_rsp;
|
||||
struct srp_aer_req aer_req;
|
||||
struct srp_aer_rsp aer_rsp;
|
||||
};
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user