summaryrefslogtreecommitdiff
path: root/drivers/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/3w-9xxx.c20
-rw-r--r--drivers/scsi/3w-sas.c28
-rw-r--r--drivers/scsi/3w-xxxx.c27
-rw-r--r--drivers/scsi/53c700.c16
-rw-r--r--drivers/scsi/BusLogic.c20
-rw-r--r--drivers/scsi/a100u2w.c4
-rw-r--r--drivers/scsi/a2091.c4
-rw-r--r--drivers/scsi/a3000.c4
-rw-r--r--drivers/scsi/aacraid/commsup.c8
-rw-r--r--drivers/scsi/advansys.c8
-rw-r--r--drivers/scsi/aha1542.c20
-rw-r--r--drivers/scsi/aha1740.c12
-rw-r--r--drivers/scsi/arm/eesox.c8
-rw-r--r--drivers/scsi/arm/fas216.c20
-rw-r--r--drivers/scsi/atp870u.c12
-rw-r--r--drivers/scsi/bfa/bfa_fcs.c88
-rw-r--r--drivers/scsi/bfa/bfad_bsg.c4
-rw-r--r--drivers/scsi/ch.c84
-rw-r--r--drivers/scsi/constants.c61
-rw-r--r--drivers/scsi/csiostor/csio_attr.c4
-rw-r--r--drivers/scsi/csiostor/csio_scsi.c4
-rw-r--r--drivers/scsi/dc395x.c18
-rw-r--r--drivers/scsi/device_handler/scsi_dh_alua.c55
-rw-r--r--drivers/scsi/device_handler/scsi_dh_emc.c28
-rw-r--r--drivers/scsi/device_handler/scsi_dh_hp_sw.c29
-rw-r--r--drivers/scsi/device_handler/scsi_dh_rdac.c55
-rw-r--r--drivers/scsi/esp_scsi.c32
-rw-r--r--drivers/scsi/fcoe/fcoe.c4
-rw-r--r--drivers/scsi/fdomain.c16
-rw-r--r--drivers/scsi/gvp11.c4
-rw-r--r--drivers/scsi/hosts.c17
-rw-r--r--drivers/scsi/hpsa.c71
-rw-r--r--drivers/scsi/hpsa_cmd.h23
-rw-r--r--drivers/scsi/hptiop.c8
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc-core.c262
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc-nvme.c8
-rw-r--r--drivers/scsi/ibmvscsi/ibmvscsi.c86
-rw-r--r--drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c5
-rw-r--r--drivers/scsi/imm.c4
-rw-r--r--drivers/scsi/initio.c8
-rw-r--r--drivers/scsi/ipr.c324
-rw-r--r--drivers/scsi/ips.c26
-rw-r--r--drivers/scsi/leapraid/leapraid_func.h7
-rw-r--r--drivers/scsi/leapraid/leapraid_os.c15
-rw-r--r--drivers/scsi/libfc/fc_fcp.c8
-rw-r--r--drivers/scsi/libiscsi.c17
-rw-r--r--drivers/scsi/libsas/sas_expander.c14
-rw-r--r--drivers/scsi/libsas/sas_scsi_host.c10
-rw-r--r--drivers/scsi/lpfc/lpfc_els.c30
-rw-r--r--drivers/scsi/lpfc/lpfc_hbadisc.c44
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c16
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c26
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c49
-rw-r--r--drivers/scsi/mac53c94.c8
-rw-r--r--drivers/scsi/megaraid.c8
-rw-r--r--drivers/scsi/megaraid/mega_common.h2
-rw-r--r--drivers/scsi/megaraid/megaraid_mbox.c12
-rw-r--r--drivers/scsi/megaraid/megaraid_sas_base.c18
-rw-r--r--drivers/scsi/mesh.c24
-rw-r--r--drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h77
-rw-r--r--drivers/scsi/mpi3mr/mpi/mpi30_image.h7
-rw-r--r--drivers/scsi/mpi3mr/mpi/mpi30_ioc.h15
-rw-r--r--drivers/scsi/mpi3mr/mpi/mpi30_transport.h2
-rw-r--r--drivers/scsi/mpi3mr/mpi3mr.h13
-rw-r--r--drivers/scsi/mpi3mr/mpi3mr_app.c89
-rw-r--r--drivers/scsi/mpi3mr/mpi3mr_fw.c223
-rw-r--r--drivers/scsi/mpi3mr/mpi3mr_os.c320
-rw-r--r--drivers/scsi/mpi3mr/mpi3mr_transport.c104
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_scsih.c69
-rw-r--r--drivers/scsi/mvumi.c28
-rw-r--r--drivers/scsi/myrb.c67
-rw-r--r--drivers/scsi/myrs.c23
-rw-r--r--drivers/scsi/nsp32.c8
-rw-r--r--drivers/scsi/pcmcia/sym53c500_cs.c8
-rw-r--r--drivers/scsi/pm8001/pm8001_defs.h98
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.c2
-rw-r--r--drivers/scsi/pm8001/pm8001_hwi.h4
-rw-r--r--drivers/scsi/pm8001/pm80xx_hwi.c2
-rw-r--r--drivers/scsi/pm8001/pm80xx_hwi.h100
-rw-r--r--drivers/scsi/pmcraid.c84
-rw-r--r--drivers/scsi/ps3rom.c5
-rw-r--r--drivers/scsi/qedi/qedi_main.c3
-rw-r--r--drivers/scsi/qla1280.c44
-rw-r--r--drivers/scsi/qla2xxx/qla_attr.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c9
-rw-r--r--drivers/scsi/qla2xxx/qla_target.c99
-rw-r--r--drivers/scsi/qla2xxx/qla_target.h3
-rw-r--r--drivers/scsi/qlogicfas408.c8
-rw-r--r--drivers/scsi/qlogicpti.c20
-rw-r--r--drivers/scsi/scsi.c15
-rw-r--r--drivers/scsi/scsi_common.c24
-rw-r--r--drivers/scsi/scsi_debug.c647
-rw-r--r--drivers/scsi/scsi_debugfs.c2
-rw-r--r--drivers/scsi/scsi_devinfo.c5
-rw-r--r--drivers/scsi/scsi_error.c165
-rw-r--r--drivers/scsi/scsi_ioctl.c3
-rw-r--r--drivers/scsi/scsi_lib.c182
-rw-r--r--drivers/scsi/scsi_lib_test.c95
-rw-r--r--drivers/scsi/scsi_logging.c22
-rw-r--r--drivers/scsi/scsi_proc.c9
-rw-r--r--drivers/scsi/scsi_scan.c38
-rw-r--r--drivers/scsi/scsi_sysfs.c28
-rw-r--r--drivers/scsi/scsi_transport_fc.c142
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c2
-rw-r--r--drivers/scsi/scsi_transport_sas.c18
-rw-r--r--drivers/scsi/scsi_transport_spi.c12
-rw-r--r--drivers/scsi/sd.c126
-rw-r--r--drivers/scsi/sd_zbc.c2
-rw-r--r--drivers/scsi/sense_codes.h2496
-rw-r--r--drivers/scsi/ses.c23
-rw-r--r--drivers/scsi/sgiwd93.c4
-rw-r--r--drivers/scsi/smartpqi/smartpqi_init.c31
-rw-r--r--drivers/scsi/snic/snic_disc.c16
-rw-r--r--drivers/scsi/sr.c3
-rw-r--r--drivers/scsi/sr_ioctl.c29
-rw-r--r--drivers/scsi/st.c150
-rw-r--r--drivers/scsi/st.h2
-rw-r--r--drivers/scsi/stex.c51
-rw-r--r--drivers/scsi/storvsc_drv.c15
-rw-r--r--drivers/scsi/sym53c8xx_2/sym_glue.c56
-rw-r--r--drivers/scsi/sym53c8xx_2/sym_hipd.h4
-rw-r--r--drivers/scsi/wd33c93.c4
-rw-r--r--drivers/scsi/wd719x.c24
-rw-r--r--drivers/scsi/xen-scsifront.c43
-rw-r--r--drivers/scsi/zorro7xx.c31
126 files changed, 4740 insertions, 3168 deletions
diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
index 9b93a2440af8..e6694f242ebe 100644
--- a/drivers/scsi/3w-9xxx.c
+++ b/drivers/scsi/3w-9xxx.c
@@ -160,7 +160,7 @@ static ssize_t twa_show_stats(struct device *dev,
unsigned long flags = 0;
ssize_t len;
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
len = sysfs_emit(buf, "3w-9xxx Driver version: %s\n"
"Current commands posted: %4d\n"
"Max commands posted: %4d\n"
@@ -183,7 +183,7 @@ static ssize_t twa_show_stats(struct device *dev,
tw_dev->max_sector_count,
tw_dev->num_resets,
tw_dev->aen_count);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
return len;
} /* End twa_show_stats() */
@@ -694,7 +694,7 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
/* See which ioctl we are doing */
switch (cmd) {
case TW_IOCTL_FIRMWARE_PASS_THROUGH:
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
twa_get_request_id(tw_dev, &request_id);
/* Flag internal command */
@@ -712,7 +712,7 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
/* Now post the command packet to the controller */
twa_post_command_packet(tw_dev, request_id, 1);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
@@ -734,11 +734,11 @@ static long twa_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
/* Now complete the io */
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
tw_dev->posted_request_count--;
tw_dev->state[request_id] = TW_S_COMPLETED;
twa_free_request_id(tw_dev, request_id);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
break;
case TW_IOCTL_GET_COMPATIBILITY_INFO:
tw_ioctl->driver_command.status = 0;
@@ -1223,7 +1223,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
int handled = 0;
/* Get the per adapter lock */
- spin_lock(tw_dev->host->host_lock);
+ spin_lock(&tw_dev->host->host_lock);
/* Read the registers */
status_reg_value = readl(TW_STATUS_REG_ADDR(tw_dev));
@@ -1372,7 +1372,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
}
twa_interrupt_bail:
- spin_unlock(tw_dev->host->host_lock);
+ spin_unlock(&tw_dev->host->host_lock);
return IRQ_RETVAL(handled);
} /* End twa_interrupt() */
@@ -1585,7 +1585,7 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
set_bit(TW_IN_RESET, &tw_dev->flags);
TW_DISABLE_INTERRUPTS(tw_dev);
TW_MASK_COMMAND_INTERRUPT(tw_dev);
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
/* Abort all requests that are in progress */
for (i = 0; i < TW_Q_LENGTH; i++) {
@@ -1616,7 +1616,7 @@ static int twa_reset_device_extension(TW_Device_Extension *tw_dev)
tw_dev->pending_tail = TW_Q_START;
tw_dev->reset_print = 0;
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
if (twa_reset_sequence(tw_dev, 1))
goto out;
diff --git a/drivers/scsi/3w-sas.c b/drivers/scsi/3w-sas.c
index 52dc1aa639f7..060f97805319 100644
--- a/drivers/scsi/3w-sas.c
+++ b/drivers/scsi/3w-sas.c
@@ -108,9 +108,9 @@ static ssize_t twl_sysfs_aen_read(struct file *filp, struct kobject *kobj,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
ret = memory_read_from_buffer(outbuf, count, &offset, tw_dev->event_queue[0], sizeof(TW_Event) * TW_Q_LENGTH);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
return ret;
} /* End twl_sysfs_aen_read() */
@@ -139,9 +139,9 @@ static ssize_t twl_sysfs_compat_info(struct file *filp, struct kobject *kobj,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
ret = memory_read_from_buffer(outbuf, count, &offset, &tw_dev->tw_compat_info, sizeof(TW_Compatibility_Info));
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
return ret;
} /* End twl_sysfs_compat_info() */
@@ -165,7 +165,7 @@ static ssize_t twl_show_stats(struct device *dev,
unsigned long flags = 0;
ssize_t len;
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
len = sysfs_emit(buf, "3w-sas Driver version: %s\n"
"Current commands posted: %4d\n"
"Max commands posted: %4d\n"
@@ -184,7 +184,7 @@ static ssize_t twl_show_stats(struct device *dev,
tw_dev->max_sector_count,
tw_dev->num_resets,
tw_dev->aen_count);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
return len;
} /* End twl_show_stats() */
@@ -763,7 +763,7 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
/* See which ioctl we are doing */
switch (cmd) {
case TW_IOCTL_FIRMWARE_PASS_THROUGH:
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
twl_get_request_id(tw_dev, &request_id);
/* Flag internal command */
@@ -781,7 +781,7 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
/* Now post the command packet to the controller */
twl_post_command_packet(tw_dev, request_id);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
@@ -803,11 +803,11 @@ static long twl_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long
memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virt[request_id], sizeof(TW_Command_Full));
/* Now complete the io */
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
tw_dev->posted_request_count--;
tw_dev->state[request_id] = TW_S_COMPLETED;
twl_free_request_id(tw_dev, request_id);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
break;
default:
retval = -ENOTTY;
@@ -1125,7 +1125,7 @@ static irqreturn_t twl_interrupt(int irq, void *dev_instance)
struct scsi_cmnd *cmd;
TW_Command_Full *full_command_packet;
- spin_lock(tw_dev->host->host_lock);
+ spin_lock(&tw_dev->host->host_lock);
/* Read host interrupt status */
reg = readl(TWL_HISTAT_REG_ADDR(tw_dev));
@@ -1229,7 +1229,7 @@ static irqreturn_t twl_interrupt(int irq, void *dev_instance)
}
twl_interrupt_bail:
- spin_unlock(tw_dev->host->host_lock);
+ spin_unlock(&tw_dev->host->host_lock);
return IRQ_RETVAL(handled);
} /* End twl_interrupt() */
@@ -1360,7 +1360,7 @@ static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res
TWL_MASK_INTERRUPTS(tw_dev);
TWL_CLEAR_DB_INTERRUPT(tw_dev);
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
/* Abort all requests that are in progress */
for (i = 0; i < TW_Q_LENGTH; i++) {
@@ -1386,7 +1386,7 @@ static int twl_reset_device_extension(TW_Device_Extension *tw_dev, int ioctl_res
tw_dev->free_tail = TW_Q_START;
tw_dev->posted_request_count = 0;
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
if (twl_reset_sequence(tw_dev, 1))
goto out;
diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
index c68678fa72c1..11326465abb6 100644
--- a/drivers/scsi/3w-xxxx.c
+++ b/drivers/scsi/3w-xxxx.c
@@ -495,7 +495,7 @@ static ssize_t tw_show_stats(struct device *dev, struct device_attribute *attr,
unsigned long flags = 0;
ssize_t len;
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
len = sysfs_emit(buf, "3w-xxxx Driver version: %s\n"
"Current commands posted: %4d\n"
"Max commands posted: %4d\n"
@@ -518,7 +518,7 @@ static ssize_t tw_show_stats(struct device *dev, struct device_attribute *attr,
tw_dev->max_sector_count,
tw_dev->num_resets,
tw_dev->aen_count);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
return len;
} /* End tw_show_stats() */
@@ -935,7 +935,7 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a
dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): caught TW_AEN_LISTEN.\n");
memset(tw_ioctl->data_buffer, 0, data_buffer_length);
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
if (tw_dev->aen_head == tw_dev->aen_tail) {
tw_aen_code = TW_AEN_QUEUE_EMPTY;
} else {
@@ -946,12 +946,12 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a
tw_dev->aen_head = tw_dev->aen_head + 1;
}
}
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
memcpy(tw_ioctl->data_buffer, &tw_aen_code, sizeof(tw_aen_code));
break;
case TW_CMD_PACKET_WITH_DATA:
dprintk(KERN_WARNING "3w-xxxx: tw_chrdev_ioctl(): caught TW_CMD_PACKET_WITH_DATA.\n");
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
tw_state_request_start(tw_dev, &request_id);
@@ -983,7 +983,7 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a
/* Now post the command packet to the controller */
tw_post_command_packet(tw_dev, request_id);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
timeout = TW_IOCTL_CHRDEV_TIMEOUT*HZ;
@@ -1005,11 +1005,11 @@ static long tw_chrdev_ioctl(struct file *file, unsigned int cmd, unsigned long a
memcpy(&(tw_ioctl->firmware_command), tw_dev->command_packet_virtual_address[request_id], sizeof(TW_Command));
/* Now complete the io */
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
tw_dev->posted_request_count--;
tw_dev->state[request_id] = TW_S_COMPLETED;
tw_state_request_finish(tw_dev, request_id);
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
break;
default:
retval = -ENOTTY;
@@ -1296,7 +1296,7 @@ static int tw_reset_device_extension(TW_Device_Extension *tw_dev)
set_bit(TW_IN_RESET, &tw_dev->flags);
TW_DISABLE_INTERRUPTS(tw_dev);
TW_MASK_COMMAND_INTERRUPT(tw_dev);
- spin_lock_irqsave(tw_dev->host->host_lock, flags);
+ spin_lock_irqsave(&tw_dev->host->host_lock, flags);
/* Abort all requests that are in progress */
for (i=0;i<TW_Q_LENGTH;i++) {
@@ -1325,7 +1325,7 @@ static int tw_reset_device_extension(TW_Device_Extension *tw_dev)
tw_dev->pending_tail = TW_Q_START;
tw_dev->reset_print = 0;
- spin_unlock_irqrestore(tw_dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&tw_dev->host->host_lock, flags);
if (tw_reset_sequence(tw_dev)) {
printk(KERN_WARNING "3w-xxxx: scsi%d: Reset sequence failed.\n", tw_dev->host->host_no);
@@ -1977,7 +1977,8 @@ static enum scsi_qc_status tw_scsi_queue_lck(struct scsi_cmnd *SCpnt)
printk(KERN_NOTICE "3w-xxxx: scsi%d: Unknown scsi opcode: 0x%x\n", tw_dev->host->host_no, *command);
tw_dev->state[request_id] = TW_S_COMPLETED;
tw_state_request_finish(tw_dev, request_id);
- scsi_build_sense(SCpnt, 1, ILLEGAL_REQUEST, 0x20, 0);
+ scsi_set_sense(SCpnt, 1, ILLEGAL_REQUEST,
+ INVALID_COMMAND_OP_CODE);
done(SCpnt);
retval = 0;
}
@@ -2005,7 +2006,7 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance)
int handled = 0;
/* Get the host lock for io completions */
- spin_lock(tw_dev->host->host_lock);
+ spin_lock(&tw_dev->host->host_lock);
/* Read the registers */
status_reg_value = inl(TW_STATUS_REG_ADDR(tw_dev));
@@ -2185,7 +2186,7 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance)
}
tw_interrupt_bail:
- spin_unlock(tw_dev->host->host_lock);
+ spin_unlock(&tw_dev->host->host_lock);
return IRQ_RETVAL(handled);
} /* End tw_interrupt() */
diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
index c78f74b8f45c..eb3a69dff1e7 100644
--- a/drivers/scsi/53c700.c
+++ b/drivers/scsi/53c700.c
@@ -1499,7 +1499,7 @@ NCR_700_intr(int irq, void *dev_id)
* lock to enter the done routines. When that happens, we
* need to ensure that for this driver, the host lock and the
* queue lock point to the same thing. */
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
if((istat = NCR_700_readb(host, ISTAT_REG))
& (SCSI_INT_PENDING | DMA_INT_PENDING)) {
__u32 dsps;
@@ -1747,7 +1747,7 @@ NCR_700_intr(int irq, void *dev_id)
}
}
out_unlock:
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return IRQ_RETVAL(handled);
}
@@ -1948,27 +1948,27 @@ NCR_700_host_reset(struct scsi_cmnd * 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 */
- spin_lock_irq(SCp->device->host->host_lock);
+ spin_lock_irq(&SCp->device->host->host_lock);
while (hostdata->eh_complete != NULL) {
- spin_unlock_irq(SCp->device->host->host_lock);
+ spin_unlock_irq(&SCp->device->host->host_lock);
msleep_interruptible(100);
- spin_lock_irq(SCp->device->host->host_lock);
+ spin_lock_irq(&SCp->device->host->host_lock);
}
hostdata->eh_complete = &complete;
NCR_700_internal_bus_reset(SCp->device->host);
NCR_700_chip_reset(SCp->device->host);
- spin_unlock_irq(SCp->device->host->host_lock);
+ spin_unlock_irq(&SCp->device->host->host_lock);
wait_for_completion(&complete);
- spin_lock_irq(SCp->device->host->host_lock);
+ 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);
- spin_unlock_irq(SCp->device->host->host_lock);
+ spin_unlock_irq(&SCp->device->host->host_lock);
return SUCCESS;
}
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index 5304d2febd63..27b446c0c5d0 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -2744,7 +2744,7 @@ static irqreturn_t blogic_inthandler(int irq_ch, void *devid)
/*
Acquire exclusive access to Host Adapter.
*/
- spin_lock_irqsave(adapter->scsi_host->host_lock, processor_flag);
+ spin_lock_irqsave(&adapter->scsi_host->host_lock, processor_flag);
/*
Handle Interrupts appropriately for each Host Adapter type.
*/
@@ -2812,7 +2812,7 @@ static irqreturn_t blogic_inthandler(int irq_ch, void *devid)
/*
Release exclusive access to Host Adapter.
*/
- spin_unlock_irqrestore(adapter->scsi_host->host_lock, processor_flag);
+ spin_unlock_irqrestore(&adapter->scsi_host->host_lock, processor_flag);
return IRQ_HANDLED;
}
@@ -2864,12 +2864,12 @@ static int blogic_hostreset(struct scsi_cmnd *SCpnt)
struct blogic_tgt_stats *stats = &adapter->tgt_stats[id];
int rc;
- spin_lock_irq(SCpnt->device->host->host_lock);
+ spin_lock_irq(&SCpnt->device->host->host_lock);
blogic_inc_count(&stats->adapter_reset_req);
rc = blogic_resetadapter(adapter, false);
- spin_unlock_irq(SCpnt->device->host->host_lock);
+ spin_unlock_irq(&SCpnt->device->host->host_lock);
return rc;
}
@@ -2915,9 +2915,9 @@ static enum scsi_qc_status blogic_qcmd_lck(struct scsi_cmnd *command)
*/
ccb = blogic_alloc_ccb(adapter);
if (ccb == NULL) {
- spin_unlock_irq(adapter->scsi_host->host_lock);
+ spin_unlock_irq(&adapter->scsi_host->host_lock);
blogic_delay(1);
- spin_lock_irq(adapter->scsi_host->host_lock);
+ spin_lock_irq(&adapter->scsi_host->host_lock);
ccb = blogic_alloc_ccb(adapter);
if (ccb == NULL) {
command->result = DID_ERROR << 16;
@@ -3062,10 +3062,10 @@ static enum scsi_qc_status blogic_qcmd_lck(struct scsi_cmnd *command)
be initiated soon.
*/
if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START, ccb)) {
- spin_unlock_irq(adapter->scsi_host->host_lock);
+ spin_unlock_irq(&adapter->scsi_host->host_lock);
blogic_warn("Unable to write Outgoing Mailbox - Pausing for 1 second\n", adapter);
blogic_delay(1);
- spin_lock_irq(adapter->scsi_host->host_lock);
+ spin_lock_irq(&adapter->scsi_host->host_lock);
if (!blogic_write_outbox(adapter, BLOGIC_MBOX_START,
ccb)) {
blogic_warn("Still unable to write Outgoing Mailbox - Host Adapter Dead?\n", adapter);
@@ -3212,9 +3212,9 @@ static int blogic_resetadapter(struct blogic_adapter *adapter, bool hard_reset)
*/
if (hard_reset) {
- spin_unlock_irq(adapter->scsi_host->host_lock);
+ spin_unlock_irq(&adapter->scsi_host->host_lock);
blogic_delay(adapter->bus_settle_time);
- spin_lock_irq(adapter->scsi_host->host_lock);
+ spin_lock_irq(&adapter->scsi_host->host_lock);
}
for (tgt_id = 0; tgt_id < adapter->maxdev; tgt_id++) {
diff --git a/drivers/scsi/a100u2w.c b/drivers/scsi/a100u2w.c
index 4365b896f5c4..7e6776325d9b 100644
--- a/drivers/scsi/a100u2w.c
+++ b/drivers/scsi/a100u2w.c
@@ -1058,9 +1058,9 @@ static irqreturn_t inia100_intr(int irqno, void *devid)
unsigned long flags;
irqreturn_t res;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
res = orc_interrupt(host);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return res;
}
diff --git a/drivers/scsi/a2091.c b/drivers/scsi/a2091.c
index f81e53b53e20..223065529654 100644
--- a/drivers/scsi/a2091.c
+++ b/drivers/scsi/a2091.c
@@ -39,9 +39,9 @@ static irqreturn_t a2091_intr(int irq, void *data)
if (!(status & (ISTR_INT_F | ISTR_INT_P)) || !(status & ISTR_INTS))
return IRQ_NONE;
- spin_lock_irqsave(instance->host_lock, flags);
+ spin_lock_irqsave(&instance->host_lock, flags);
wd33c93_intr(instance);
- spin_unlock_irqrestore(instance->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/a3000.c b/drivers/scsi/a3000.c
index bf054dd7682b..dd0924572c0e 100644
--- a/drivers/scsi/a3000.c
+++ b/drivers/scsi/a3000.c
@@ -41,9 +41,9 @@ static irqreturn_t a3000_intr(int irq, void *data)
if (!(status & ISTR_INT_P))
return IRQ_NONE;
if (status & ISTR_INTS) {
- spin_lock_irqsave(instance->host_lock, flags);
+ spin_lock_irqsave(&instance->host_lock, flags);
wd33c93_intr(instance);
- spin_unlock_irqrestore(instance->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host_lock, flags);
return IRQ_HANDLED;
}
pr_warn("Non-serviced A3000 SCSI-interrupt? ISTR = %02x\n", status);
diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
index c4485629f792..347d480a39b0 100644
--- a/drivers/scsi/aacraid/commsup.c
+++ b/drivers/scsi/aacraid/commsup.c
@@ -1487,7 +1487,7 @@ static int _aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
*/
aac_adapter_disable_int(aac);
if (aac->thread && aac->thread->pid != current->pid) {
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
kthread_stop(aac->thread);
aac->thread = NULL;
jafo = 1;
@@ -1612,7 +1612,7 @@ out:
}
if (jafo) {
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
}
return retval;
}
@@ -1644,11 +1644,11 @@ int aac_reset_adapter(struct aac_dev *aac, int forced, u8 reset_type)
/* Quiesce build, flush cache, write through mode */
if (forced < 2)
aac_send_shutdown(aac);
- spin_lock_irqsave(host->host_lock, flagv);
+ spin_lock_irqsave(&host->host_lock, flagv);
bled = forced ? forced :
(aac_check_reset != 0 && aac_check_reset != 1);
retval = _aac_reset_adapter(aac, bled, reset_type);
- spin_unlock_irqrestore(host->host_lock, flagv);
+ spin_unlock_irqrestore(&host->host_lock, flagv);
unblock_retval = scsi_host_unblock(host, SDEV_RUNNING);
if (!retval)
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index 5cdbf2bdb13d..e6fa05ffc024 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -7072,9 +7072,9 @@ static int advansys_reset(struct scsi_cmnd *scp)
ret = FAILED;
break;
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
AdvISR(adv_dvc);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
ASC_DBG(1, "ret %d\n", ret);
@@ -7138,7 +7138,7 @@ static irqreturn_t advansys_interrupt(int irq, void *dev_id)
unsigned long flags;
ASC_DBG(2, "boardp 0x%p\n", boardp);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (ASC_NARROW_BOARD(boardp)) {
if (AscIsIntPending(shost->io_port)) {
result = IRQ_HANDLED;
@@ -7153,7 +7153,7 @@ static irqreturn_t advansys_interrupt(int irq, void *dev_id)
ASC_STATS(shost, interrupt);
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
ASC_DBG(1, "end\n");
return result;
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 93dab19c1cb9..7ea38d509072 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -306,7 +306,7 @@ static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
#endif
number_serviced = 0;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
while (1) {
flag = inb(INTRFLAGS(sh->io_port));
@@ -339,7 +339,7 @@ static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
} while (mbi != aha1542->aha1542_last_mbi_used);
if (mb[mbi].status == 0) {
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
/* Hmm, no mail. Must have read it the last time around */
if (!number_serviced)
shost_printk(KERN_WARNING, sh, "interrupt received, but no mail.\n");
@@ -367,7 +367,7 @@ static irqreturn_t aha1542_interrupt(int irq, void *dev_id)
tmp_cmd = aha1542->int_cmds[mbo];
if (!tmp_cmd) {
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
shost_printk(KERN_WARNING, sh, "Unexpected interrupt\n");
shost_printk(KERN_WARNING, sh, "tarstat=%x, hastat=%x idlun=%x ccb#=%d\n", ccb[mbo].tarstat,
ccb[mbo].hastat, ccb[mbo].idlun, mbo);
@@ -461,7 +461,7 @@ static enum scsi_qc_status aha1542_queuecommand(struct Scsi_Host *sh,
* is how the host adapter will scan for them
*/
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
mbo = aha1542->aha1542_last_mbo_used + 1;
if (mbo >= AHA1542_MAILBOXES)
mbo = 0;
@@ -518,7 +518,7 @@ static enum scsi_qc_status aha1542_queuecommand(struct Scsi_Host *sh,
#endif
mb[mbo].status = 1;
aha1542_outb(cmd->device->host->io_port, CMD_START_SCSI);
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return 0;
}
@@ -873,7 +873,7 @@ static int aha1542_dev_reset(struct scsi_cmnd *cmd)
int mbo;
struct ccb *ccb = aha1542->ccb;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
mbo = aha1542->aha1542_last_mbo_used + 1;
if (mbo >= AHA1542_MAILBOXES)
mbo = 0;
@@ -913,7 +913,7 @@ static int aha1542_dev_reset(struct scsi_cmnd *cmd)
* target
*/
aha1542_outb(sh->io_port, CMD_START_SCSI);
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
scmd_printk(KERN_WARNING, cmd,
"Trying device reset for target\n");
@@ -928,7 +928,7 @@ static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
unsigned long flags;
int i;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
/*
* This does a scsi reset for all devices on the bus.
* In principle, we could also reset the 1542 - should
@@ -939,7 +939,7 @@ static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
if (!wait_mask(STATUS(cmd->device->host->io_port),
STATMASK, IDLE, STST | DIAGF | INVDCMD | DF | CDF, 0)) {
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return FAILED;
}
@@ -978,7 +978,7 @@ static int aha1542_reset(struct scsi_cmnd *cmd, u8 reset_cmd)
}
}
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return SUCCESS;
}
diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c
index c435769359f2..b01701d139b9 100644
--- a/drivers/scsi/aha1740.c
+++ b/drivers/scsi/aha1740.c
@@ -225,7 +225,7 @@ static irqreturn_t aha1740_intr_handle(int irq, void *dev_id)
if (!host)
panic("aha1740.c: Irq from unknown host!\n");
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
base = host->io_port;
number_serviced = 0;
edev = HOSTDATA(host)->edev;
@@ -315,7 +315,7 @@ static irqreturn_t aha1740_intr_handle(int irq, void *dev_id)
number_serviced++;
}
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return IRQ_RETVAL(handled);
}
@@ -353,7 +353,7 @@ static enum scsi_qc_status aha1740_queuecommand_lck(struct scsi_cmnd *SCpnt)
#endif
/* locate an available ecb */
- spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+ spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
ecbno = host->last_ecb_used + 1; /* An optimization */
if (ecbno >= AHA1740_ECBS)
ecbno = 0;
@@ -372,7 +372,7 @@ static enum scsi_qc_status aha1740_queuecommand_lck(struct scsi_cmnd *SCpnt)
doubles as reserved flag */
host->last_ecb_used = ecbno;
- spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+ spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
#ifdef DEBUG
printk("Sending command (%d %x)...", ecbno, done);
@@ -465,7 +465,7 @@ static enum scsi_qc_status aha1740_queuecommand_lck(struct scsi_cmnd *SCpnt)
unsigned int base = SCpnt->device->host->io_port;
DEB(printk("aha1740[%d] critical section\n",ecbno));
- spin_lock_irqsave(SCpnt->device->host->host_lock, flags);
+ spin_lock_irqsave(&SCpnt->device->host->host_lock, flags);
for (loopcnt = 0; ; loopcnt++) {
if (inb(G2STAT(base)) & G2STAT_MBXOUT) break;
if (loopcnt == LOOPCNT_WARN) {
@@ -485,7 +485,7 @@ static enum scsi_qc_status aha1740_queuecommand_lck(struct scsi_cmnd *SCpnt)
panic("aha1740.c: attn wait failed!\n");
}
outb(ATTN_START | (target & 7), ATTN(base)); /* Start it up */
- spin_unlock_irqrestore(SCpnt->device->host->host_lock, flags);
+ spin_unlock_irqrestore(&SCpnt->device->host->host_lock, flags);
DEB(printk("aha1740[%d] request queued.\n",ecbno));
} else
printk(KERN_ALERT "aha1740_queuecommand: done can't be NULL\n");
diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c
index 99be9da8757f..0cb1308eda4e 100644
--- a/drivers/scsi/arm/eesox.c
+++ b/drivers/scsi/arm/eesox.c
@@ -124,14 +124,14 @@ eesoxscsi_terminator_ctl(struct Scsi_Host *host, int on_off)
struct eesoxscsi_info *info = (struct eesoxscsi_info *)host->hostdata;
unsigned long flags;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
if (on_off)
info->control |= EESOX_TERM_ENABLE;
else
info->control &= ~EESOX_TERM_ENABLE;
writeb(info->control, info->ctl_port);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
}
/* Prototype: void eesoxscsi_intr(irq, *dev_id, *regs)
@@ -457,14 +457,14 @@ static ssize_t eesoxscsi_store_term(struct device *dev, struct device_attribute
unsigned long flags;
if (len > 1) {
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
if (buf[0] != '0') {
info->control |= EESOX_TERM_ENABLE;
} else {
info->control &= ~EESOX_TERM_ENABLE;
}
writeb(info->control, info->ctl_port);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
}
return len;
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c
index fccfacaaf1d5..d0752c0bf425 100644
--- a/drivers/scsi/arm/fas216.c
+++ b/drivers/scsi/arm/fas216.c
@@ -2295,7 +2295,7 @@ static enum scsi_qc_status fas216_noqueue_command_lck(struct scsi_cmnd *SCpnt)
* However, we must re-enable interrupts, or else we'll be
* waiting forever.
*/
- spin_unlock_irq(info->host->host_lock);
+ spin_unlock_irq(&info->host->host_lock);
while (!info->internal_done) {
/*
@@ -2307,13 +2307,13 @@ static enum scsi_qc_status fas216_noqueue_command_lck(struct scsi_cmnd *SCpnt)
* to be some time (eg, disconnected).
*/
if (fas216_readb(info, REG_STAT) & STAT_INT) {
- spin_lock_irq(info->host->host_lock);
+ spin_lock_irq(&info->host->host_lock);
fas216_intr(info);
- spin_unlock_irq(info->host->host_lock);
+ spin_unlock_irq(&info->host->host_lock);
}
}
- spin_lock_irq(info->host->host_lock);
+ spin_lock_irq(&info->host->host_lock);
scsi_done(SCpnt);
@@ -2662,7 +2662,7 @@ int fas216_eh_host_reset(struct scsi_cmnd *SCpnt)
{
FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
- spin_lock_irq(info->host->host_lock);
+ spin_lock_irq(&info->host->host_lock);
fas216_checkmagic(info);
@@ -2679,9 +2679,9 @@ int fas216_eh_host_reset(struct scsi_cmnd *SCpnt)
* IRQs if we sleep, but we must relock and disable
* IRQs after the sleep.
*/
- spin_unlock_irq(info->host->host_lock);
+ spin_unlock_irq(&info->host->host_lock);
msleep(50 * 1000/100);
- spin_lock_irq(info->host->host_lock);
+ spin_lock_irq(&info->host->host_lock);
/*
* Release the SCSI reset.
@@ -2690,7 +2690,7 @@ int fas216_eh_host_reset(struct scsi_cmnd *SCpnt)
fas216_init_chip(info);
- spin_unlock_irq(info->host->host_lock);
+ spin_unlock_irq(&info->host->host_lock);
return SUCCESS;
}
@@ -2917,9 +2917,9 @@ int fas216_add(struct Scsi_Host *host, struct device *dev)
/*
* scsi standard says wait 250ms
*/
- spin_unlock_irq(info->host->host_lock);
+ spin_unlock_irq(&info->host->host_lock);
msleep(100*1000/100);
- spin_lock_irq(info->host->host_lock);
+ spin_lock_irq(&info->host->host_lock);
fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
fas216_readb(info, REG_INST);
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
index 67459d81f479..c608d22ad2c6 100644
--- a/drivers/scsi/atp870u.c
+++ b/drivers/scsi/atp870u.c
@@ -225,7 +225,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
/*
* Issue more commands
*/
- spin_lock_irqsave(dev->host->host_lock, flags);
+ spin_lock_irqsave(&dev->host->host_lock, flags);
if (((dev->quhd[c] != dev->quend[c]) ||
(dev->last_cmd[c] != 0xff)) &&
(dev->in_snd[c] == 0)) {
@@ -234,7 +234,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
#endif
send_s870(dev,c);
}
- spin_unlock_irqrestore(dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host->host_lock, flags);
/*
* Done
*/
@@ -511,7 +511,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
*/
scsi_dma_unmap(workreq);
- spin_lock_irqsave(dev->host->host_lock, flags);
+ spin_lock_irqsave(&dev->host->host_lock, flags);
scsi_done(workreq);
#ifdef ED_DBGP
printk("workreq->scsi_done\n");
@@ -521,7 +521,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
*/
dev->id[c][target_id].curr_req = NULL;
dev->working[c]--;
- spin_unlock_irqrestore(dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host->host_lock, flags);
/*
* Take it back wide
*/
@@ -533,7 +533,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
/*
* If there is stuff to send and nothing going then send it
*/
- spin_lock_irqsave(dev->host->host_lock, flags);
+ spin_lock_irqsave(&dev->host->host_lock, flags);
if (((dev->last_cmd[c] != 0xff) ||
(dev->quhd[c] != dev->quend[c])) &&
(dev->in_snd[c] == 0)) {
@@ -542,7 +542,7 @@ static irqreturn_t atp870u_intr_handle(int irq, void *dev_id)
#endif
send_s870(dev,c);
}
- spin_unlock_irqrestore(dev->host->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host->host_lock, flags);
dev->in_int[c] = 0;
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/bfa/bfa_fcs.c b/drivers/scsi/bfa/bfa_fcs.c
index 9b57312f43f5..3e5d3a141f32 100644
--- a/drivers/scsi/bfa/bfa_fcs.c
+++ b/drivers/scsi/bfa/bfa_fcs.c
@@ -760,53 +760,16 @@ bfa_fcs_fabric_psymb_init(struct bfa_fcs_fabric_s *fabric)
bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
- /* Model name/number */
- strscpy(port_cfg->sym_name.symname, model,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* Driver Version */
- strlcat(port_cfg->sym_name.symname, driver_info->version,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* Host machine name */
- strlcat(port_cfg->sym_name.symname,
- driver_info->host_machine_name,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->sym_name.symname, BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /*
- * Host OS Info :
- * If OS Patch Info is not there, do not truncate any bytes from the
- * OS name string and instead copy the entire OS info string (64 bytes).
- */
- if (driver_info->host_os_patch[0] == '\0') {
- strlcat(port_cfg->sym_name.symname,
- driver_info->host_os_name,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->sym_name.symname,
- BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
- } else {
- strlcat(port_cfg->sym_name.symname,
- driver_info->host_os_name,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->sym_name.symname,
- BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* Append host OS Patch Info */
- strlcat(port_cfg->sym_name.symname,
- driver_info->host_os_patch,
- BFA_SYMNAME_MAXLEN);
- }
-
- /* null terminate */
- port_cfg->sym_name.symname[BFA_SYMNAME_MAXLEN - 1] = 0;
+ snprintf(port_cfg->sym_name.symname, BFA_SYMNAME_MAXLEN,
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s",
+ model, driver_info->version,
+ driver_info->host_machine_name,
+ driver_info->host_os_name,
+ driver_info->host_os_patch);
}
/*
@@ -821,30 +784,13 @@ bfa_fcs_fabric_nsymb_init(struct bfa_fcs_fabric_s *fabric)
bfa_ioc_get_adapter_model(&fabric->fcs->bfa->ioc, model);
- /* Model name/number */
- strscpy(port_cfg->node_sym_name.symname, model,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->node_sym_name.symname,
- BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* Driver Version */
- strlcat(port_cfg->node_sym_name.symname, (char *)driver_info->version,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->node_sym_name.symname,
- BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* Host machine name */
- strlcat(port_cfg->node_sym_name.symname,
- driver_info->host_machine_name,
- BFA_SYMNAME_MAXLEN);
- strlcat(port_cfg->node_sym_name.symname,
- BFA_FCS_PORT_SYMBNAME_SEPARATOR,
- BFA_SYMNAME_MAXLEN);
-
- /* null terminate */
- port_cfg->node_sym_name.symname[BFA_SYMNAME_MAXLEN - 1] = 0;
+ /* Model name/number, Driver Version, Host machine name */
+ snprintf(port_cfg->node_sym_name.symname, BFA_SYMNAME_MAXLEN,
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR
+ "%s" BFA_FCS_PORT_SYMBNAME_SEPARATOR,
+ model, (char *)driver_info->version,
+ driver_info->host_machine_name);
}
/*
diff --git a/drivers/scsi/bfa/bfad_bsg.c b/drivers/scsi/bfa/bfad_bsg.c
index 292bc9aa43f1..143a3913c650 100644
--- a/drivers/scsi/bfa/bfad_bsg.c
+++ b/drivers/scsi/bfa/bfad_bsg.c
@@ -2552,7 +2552,7 @@ static void bfad_reset_sdev_bflags(struct bfad_im_port_s *im_port,
struct scsi_device *sdev;
unsigned long flags;
- spin_lock_irqsave(im_port->shost->host_lock, flags);
+ spin_lock_irqsave(&im_port->shost->host_lock, flags);
list_for_each_entry(itnim, &im_port->itnim_mapped_list, list_entry) {
sdev = __scsi_device_lookup(im_port->shost, itnim->channel,
itnim->scsi_tgt_id, 0);
@@ -2563,7 +2563,7 @@ static void bfad_reset_sdev_bflags(struct bfad_im_port_s *im_port,
sdev->sdev_bflags &= ~scan_flags;
}
}
- spin_unlock_irqrestore(im_port->shost->host_lock, flags);
+ spin_unlock_irqrestore(&im_port->shost->host_lock, flags);
}
/* Function to reset the LUN SCAN mode */
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 4010fdbf813c..b2c9fb71c9e0 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -112,7 +112,6 @@ typedef struct {
int minor;
char name[8];
struct scsi_device *device;
- struct scsi_device **dt; /* ptrs to data transfer elements */
u_int firsts[CH_TYPES];
u_int counts[CH_TYPES];
u_int voltags;
@@ -123,38 +122,32 @@ static DEFINE_IDR(ch_index_idr);
static DEFINE_SPINLOCK(ch_index_lock);
static const struct {
- unsigned char sense;
- unsigned char asc;
- unsigned char ascq;
- int errno;
+ u8 sense_key;
+ u16 sense_code;
+ int errno;
} ch_err[] = {
/* Just filled in what looks right. Hav'nt checked any standard paper for
these errno assignments, so they may be wrong... */
{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x21,
- .ascq = 0x01,
- .errno = EBADSLT, /* Invalid element address */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = INVALID_ELEMENT_ADDRESS,
+ .errno = EBADSLT,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x28,
- .ascq = 0x01,
- .errno = EBADE, /* Import or export element accessed */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = IMPORT_OR_EXPORT_ELEMENT_ACCESSED,
+ .errno = EBADE,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x3B,
- .ascq = 0x0D,
- .errno = EXFULL, /* Medium destination element full */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = MEDIUM_DESTINATION_ELEMENT_FULL,
+ .errno = EXFULL,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x3B,
- .ascq = 0x0E,
- .errno = EBADE, /* Medium source element empty */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = MEDIUM_SOURCE_ELEMENT_EMPTY,
+ .errno = EBADE,
},{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x20,
- .ascq = 0x00,
- .errno = EBADRQC, /* Invalid command operation code */
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = INVALID_COMMAND_OP_CODE,
+ .errno = EBADRQC,
},{
/* end of list */
}
@@ -167,12 +160,10 @@ static int ch_find_errno(struct scsi_sense_hdr *sshdr)
int i,errno = 0;
/* Check to see if additional sense information is available */
- if (scsi_sense_valid(sshdr) &&
- sshdr->asc != 0) {
+ if (scsi_sense_valid(sshdr) && scsi_sense_asc(sshdr) != 0) {
for (i = 0; ch_err[i].errno != 0; i++) {
- if (ch_err[i].sense == sshdr->sense_key &&
- ch_err[i].asc == sshdr->asc &&
- ch_err[i].ascq == sshdr->ascq) {
+ if (ch_err[i].sense_key == sshdr->sense_key &&
+ ch_err[i].sense_code == sshdr->sense_code) {
errno = -ch_err[i].errno;
break;
}
@@ -191,9 +182,8 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd, int cmd_len,
struct scsi_sense_hdr sshdr;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 3,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -363,15 +353,10 @@ ch_readconfig(scsi_changer *ch)
vendor_labels[i]);
}
- /* look up the devices of the data transfer elements */
- ch->dt = kzalloc_objs(*ch->dt, ch->counts[CHET_DT]);
-
- if (!ch->dt) {
- kfree(buffer);
- return -ENOMEM;
- }
-
+ /* report the devices of the data transfer elements */
for (elem = 0; elem < ch->counts[CHET_DT]; elem++) {
+ struct scsi_device *sdev;
+
id = -1;
lun = 0;
if (elem < CH_DT_MAX && -1 != dt_id[elem]) {
@@ -387,10 +372,8 @@ ch_readconfig(scsi_changer *ch)
VPRINTK(KERN_INFO, "dt 0x%x: ",elem+ch->firsts[CHET_DT]);
if (data[6] & 0x80) {
VPRINTK(KERN_CONT, "not this SCSI bus\n");
- ch->dt[elem] = NULL;
} else if (0 == (data[6] & 0x30)) {
VPRINTK(KERN_CONT, "ID/LUN unknown\n");
- ch->dt[elem] = NULL;
} else {
id = ch->device->id;
lun = 0;
@@ -400,18 +383,16 @@ ch_readconfig(scsi_changer *ch)
}
if (-1 != id) {
VPRINTK(KERN_CONT, "ID %i, LUN %i, ",id,lun);
- ch->dt[elem] =
- scsi_device_lookup(ch->device->host,
- ch->device->channel,
- id,lun);
- if (!ch->dt[elem]) {
+ sdev = scsi_device_lookup(ch->device->host,
+ ch->device->channel,
+ id, lun);
+ if (!sdev) {
/* should not happen */
VPRINTK(KERN_CONT, "Huh? device not found!\n");
} else {
VPRINTK(KERN_CONT, "name: %8.8s %16.16s %4.4s\n",
- ch->dt[elem]->vendor,
- ch->dt[elem]->model,
- ch->dt[elem]->rev);
+ sdev->vendor, sdev->model, sdev->rev);
+ scsi_device_put(sdev);
}
}
}
@@ -575,7 +556,6 @@ static void ch_destroy(struct kref *ref)
scsi_changer *ch = container_of(ref, scsi_changer, ref);
ch->device = NULL;
- kfree(ch->dt);
kfree(ch);
}
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c
index 340785536998..767631835c81 100644
--- a/drivers/scsi/constants.c
+++ b/drivers/scsi/constants.c
@@ -292,7 +292,7 @@ bool scsi_opcode_sa_name(int opcode, int service_action,
}
struct error_info {
- unsigned short code12; /* 0x0302 looks better than 0x03,0x02 */
+ unsigned short code; /* 0x0302 looks better than 0x03,0x02 */
unsigned short size;
};
@@ -318,20 +318,46 @@ static const char *additional_text =
;
struct error_info2 {
- unsigned char code1, code2_min, code2_max;
- const char * str;
- const char * fmt;
+ u8 asc;
+ u8 ascq_min;
+ u8 ascq_max;
+ const char *str;
+ const char *fmt;
};
static const struct error_info2 additional2[] =
{
- {0x40, 0x00, 0x7f, "Ram failure", ""},
- {0x40, 0x80, 0xff, "Diagnostic failure on component", ""},
- {0x41, 0x00, 0xff, "Data path failure", ""},
- {0x42, 0x00, 0xff, "Power-on or self-test failure", ""},
- {0x4D, 0x00, 0xff, "Tagged overlapped commands", "task tag "},
- {0x70, 0x00, 0xff, "Decompression exception", "short algorithm id of "},
- {0, 0, 0, NULL, NULL}
+ {
+ ASC_RAM_FAILURE,
+ 0x00, 0x7f,
+ "Ram failure", ""
+ },
+ {
+ ASC_RAM_FAILURE,
+ 0x80, 0xff,
+ "Diagnostic failure on component", ""
+ },
+ {
+ ASC_DATA_PATH_FAILURE,
+ 0x00, 0xff,
+ "Data path failure", ""
+ },
+ {
+ ASC_POWER_ON_OR_SELFTEST_FAILURE,
+ 0x00, 0xff,
+ "Power-on or self-test failure", ""
+ },
+ {
+ ASC_TAGGED_OVERLAPPED_COMMANDS,
+ 0x00, 0xff,
+ "Tagged overlapped commands", "task tag "
+ },
+ {
+ ASC_DECOMPRESSION_EXCEPTION_SHORT_ALGORITHM_ID,
+ 0x00, 0xff,
+ "Decompression exception", "short algorithm id of "
+ },
+ { 0, 0, 0, NULL, NULL }
};
/* description of the sense key values */
@@ -375,22 +401,21 @@ EXPORT_SYMBOL(scsi_sense_key_string);
* This string may contain a "%x" and should be printed with ascq as arg.
*/
const char *
-scsi_extd_sense_format(unsigned char asc, unsigned char ascq, const char **fmt)
+scsi_extd_sense_format(const struct scsi_sense_hdr *sshdr, const char **fmt)
{
- int i;
- unsigned short code = ((asc << 8) | ascq);
unsigned offset = 0;
+ int i;
*fmt = NULL;
for (i = 0; i < ARRAY_SIZE(additional); i++) {
- if (additional[i].code12 == code)
+ if (additional[i].code == sshdr->sense_code)
return additional_text + offset;
offset += additional[i].size;
}
for (i = 0; additional2[i].fmt; i++) {
- if (additional2[i].code1 == asc &&
- ascq >= additional2[i].code2_min &&
- ascq <= additional2[i].code2_max) {
+ if (additional2[i].asc == scsi_sense_asc(sshdr) &&
+ scsi_sense_ascq(sshdr) >= additional2[i].ascq_min &&
+ scsi_sense_ascq(sshdr) <= additional2[i].ascq_max) {
*fmt = additional2[i].fmt;
return additional2[i].str;
}
diff --git a/drivers/scsi/csiostor/csio_attr.c b/drivers/scsi/csiostor/csio_attr.c
index 200e50089711..9f021a7f78bd 100644
--- a/drivers/scsi/csiostor/csio_attr.c
+++ b/drivers/scsi/csiostor/csio_attr.c
@@ -84,9 +84,9 @@ csio_reg_rnode(struct csio_rnode *rn)
ln->num_reg_rnodes++;
rport = rn->rport;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
*((struct csio_rnode **)rport->dd_data) = rn;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
sp = &rn->rn_sparm;
rport->maxframe_size = ntohs(sp->csp.sp_bb_data);
diff --git a/drivers/scsi/csiostor/csio_scsi.c b/drivers/scsi/csiostor/csio_scsi.c
index b1de615cf316..0114e70e9884 100644
--- a/drivers/scsi/csiostor/csio_scsi.c
+++ b/drivers/scsi/csiostor/csio_scsi.c
@@ -2256,14 +2256,14 @@ csio_scan_finished(struct Scsi_Host *shost, unsigned long time)
struct csio_lnode *ln = shost_priv(shost);
int rv = 1;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (!ln->hwp || csio_list_deleted(&ln->sm.sm_list))
goto out;
rv = csio_scan_done(ln, jiffies, time, csio_max_scan_tmo * HZ,
csio_delta_scan_tmo * HZ);
out:
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return rv;
}
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c
index ba490174a417..5a4f2713dcfa 100644
--- a/drivers/scsi/dc395x.c
+++ b/drivers/scsi/dc395x.c
@@ -91,8 +91,8 @@
#endif
-#define DC395x_LOCK_IO(dev,flags) spin_lock_irqsave(((struct Scsi_Host *)dev)->host_lock, flags)
-#define DC395x_UNLOCK_IO(dev,flags) spin_unlock_irqrestore(((struct Scsi_Host *)dev)->host_lock, flags)
+#define DC395x_LOCK_IO(dev,flags) spin_lock_irqsave(&((struct Scsi_Host *)dev)->host_lock, flags)
+#define DC395x_UNLOCK_IO(dev,flags) spin_unlock_irqrestore(&((struct Scsi_Host *)dev)->host_lock, flags)
#define DC395x_read8(acb,address) (u8)(inb(acb->io_port_base + (address)))
#define DC395x_read16(acb,address) (u16)(inw(acb->io_port_base + (address)))
@@ -1016,9 +1016,9 @@ static int dc395x_eh_bus_reset(struct scsi_cmnd *cmd)
{
int rc;
- spin_lock_irq(cmd->device->host->host_lock);
+ spin_lock_irq(&cmd->device->host->host_lock);
rc = __dc395x_eh_bus_reset(cmd);
- spin_unlock_irq(cmd->device->host->host_lock);
+ spin_unlock_irq(&cmd->device->host->host_lock);
return rc;
}
@@ -3808,13 +3808,11 @@ static void adapter_uninit_chip(struct AdapterCtlBlk *acb)
static void adapter_uninit(struct AdapterCtlBlk *acb)
{
unsigned long flags;
- DC395x_LOCK_IO(acb->scsi_host, flags);
- /* remove timers */
- if (timer_pending(&acb->waiting_timer))
- timer_delete(&acb->waiting_timer);
- if (timer_pending(&acb->selto_timer))
- timer_delete(&acb->selto_timer);
+ /* Drain the self-rearming timer; must not run under host_lock. */
+ timer_shutdown_sync(&acb->waiting_timer);
+
+ DC395x_LOCK_IO(acb->scsi_host, flags);
adapter_uninit_chip(acb);
adapter_remove_and_free_all_devices(acb);
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index d81ec47a7140..87ac0a6d63e5 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -433,61 +433,43 @@ static enum scsi_disposition alua_check_sense(struct scsi_device *sdev,
{
switch (sense_hdr->sense_key) {
case NOT_READY:
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) {
- /*
- * LUN Not Accessible - ALUA state transition
- */
+ if (sense_hdr->sense_code ==
+ LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION) {
alua_handle_state_transition(sdev);
return NEEDS_RETRY;
}
break;
case UNIT_ATTENTION:
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) {
- /*
- * LUN Not Accessible - ALUA state transition
- */
+ if (sense_hdr->sense_code ==
+ LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION) {
alua_handle_state_transition(sdev);
return NEEDS_RETRY;
}
- if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) {
+ if (sense_hdr->sense_code ==
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED) {
/*
- * Power On, Reset, or Bus Device Reset.
* Might have obscured a state transition,
* so schedule a recheck.
*/
alua_check(sdev, true);
return ADD_TO_MLQUEUE;
}
- if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x04)
- /*
- * Device internal reset
- */
+ if (sense_hdr->sense_code == DEVICE_INTERNAL_RESET)
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x01)
- /*
- * Mode Parameters Changed
- */
+ if (sense_hdr->sense_code == MODE_PARAMETERS_CHANGED)
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) {
- /*
- * ALUA state changed
- */
+ if (sense_hdr->sense_code == ASYMMETRIC_ACCESS_STATE_CHANGED) {
alua_check(sdev, true);
return ADD_TO_MLQUEUE;
}
- if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) {
- /*
- * Implicit ALUA state transition failed
- */
+ if (sense_hdr->sense_code ==
+ IMPLICIT_ASYMMETRIC_ACCESS_STATE_TRANSITION_FAILED) {
alua_check(sdev, true);
return ADD_TO_MLQUEUE;
}
- if (sense_hdr->asc == 0x3f && sense_hdr->ascq == 0x03)
- /*
- * Inquiry data has changed
- */
+ if (sense_hdr->sense_code == INQUIRY_DATA_HAS_CHANGED)
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0x3f && sense_hdr->ascq == 0x0e)
+ if (sense_hdr->sense_code == REPORTED_LUNS_DATA_HAS_CHANGED)
/*
* REPORTED_LUNS_DATA_HAS_CHANGED is reported
* when switching controllers on targets like
@@ -517,12 +499,12 @@ static int alua_tur(struct scsi_device *sdev)
ALUA_FAILOVER_RETRIES, &sense_hdr);
if ((sense_hdr.sense_key == NOT_READY ||
sense_hdr.sense_key == UNIT_ATTENTION) &&
- sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a)
+ sense_hdr.sense_code ==
+ LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION)
return SCSI_DH_RETRY;
- else if (retval)
+ if (retval)
return SCSI_DH_IO;
- else
- return SCSI_DH_OK;
+ return SCSI_DH_OK;
}
/*
@@ -619,7 +601,8 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
* transition. So set the state to 'transitioning' directly.
*/
if (sense_hdr.sense_key == NOT_READY &&
- sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) {
+ sense_hdr.sense_code ==
+ LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION) {
transitioning_sense = true;
goto skip_rtpg;
}
diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c
index ff41b51ef462..4b0ea6045ba3 100644
--- a/drivers/scsi/device_handler/scsi_dh_emc.c
+++ b/drivers/scsi/device_handler/scsi_dh_emc.c
@@ -105,10 +105,10 @@ static int trespass_endio(struct scsi_device *sdev,
sdev_printk(KERN_ERR, sdev, "%s: Found valid sense data 0x%2x, "
"0x%2x, 0x%2x while sending CLARiiON trespass "
"command.\n", CLARIION_NAME, sshdr->sense_key,
- sshdr->asc, sshdr->ascq);
+ scsi_sense_asc(sshdr), scsi_sense_ascq(sshdr));
- if (sshdr->sense_key == 0x05 && sshdr->asc == 0x04 &&
- sshdr->ascq == 0x00) {
+ if (sshdr->sense_key == ILLEGAL_REQUEST &&
+ sshdr->sense_code == LU_NOT_READY) {
/*
* Array based copy in progress -- do not send
* mode_select or copy will be aborted mid-stream.
@@ -117,18 +117,18 @@ static int trespass_endio(struct scsi_device *sdev,
"progress while sending CLARiiON trespass "
"command.\n", CLARIION_NAME);
err = SCSI_DH_DEV_TEMP_BUSY;
- } else if (sshdr->sense_key == 0x02 && sshdr->asc == 0x04 &&
- sshdr->ascq == 0x03) {
- /*
- * LUN Not Ready - Manual Intervention Required
- * indicates in-progress ucode upgrade (NDU).
- */
+ } else if (sshdr->sense_key == NOT_READY &&
+ sshdr->sense_code ==
+ LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED) {
+ /* Indicates in-progress ucode upgrade (NDU). */
sdev_printk(KERN_INFO, sdev, "%s: Detected in-progress "
"ucode upgrade NDU operation while sending "
"CLARiiON trespass command.\n", CLARIION_NAME);
err = SCSI_DH_DEV_TEMP_BUSY;
- } else
+ } else {
err = SCSI_DH_DEV_FAILED;
+ }
+
return err;
}
@@ -288,7 +288,8 @@ static enum scsi_disposition clariion_check_sense(struct scsi_device *sdev,
{
switch (sense_hdr->sense_key) {
case NOT_READY:
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x03)
+ if (sense_hdr->sense_code ==
+ LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED)
/*
* LUN Not Ready - Manual Intervention Required
* indicates this is a passive path.
@@ -305,7 +306,7 @@ static enum scsi_disposition clariion_check_sense(struct scsi_device *sdev,
return SUCCESS;
break;
case ILLEGAL_REQUEST:
- if (sense_hdr->asc == 0x25 && sense_hdr->ascq == 0x01)
+ if (sense_hdr->sense_code == scsi_sense_code(0x25, 0x01))
/*
* An array based copy is in progress. Do not
* fail the path, do not bypass to another PG,
@@ -319,7 +320,8 @@ static enum scsi_disposition clariion_check_sense(struct scsi_device *sdev,
return SUCCESS;
break;
case UNIT_ATTENTION:
- if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
+ if (sense_hdr->sense_code ==
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
/*
* Unit Attention Code. This is the first IO
* to the new path, so just retry.
diff --git a/drivers/scsi/device_handler/scsi_dh_hp_sw.c b/drivers/scsi/device_handler/scsi_dh_hp_sw.c
index 6e8849d7f0a3..d8653452ed2b 100644
--- a/drivers/scsi/device_handler/scsi_dh_hp_sw.c
+++ b/drivers/scsi/device_handler/scsi_dh_hp_sw.c
@@ -47,7 +47,8 @@ static int tur_done(struct scsi_device *sdev, struct hp_sw_dh_data *h,
switch (sshdr->sense_key) {
case NOT_READY:
- if (sshdr->asc == 0x04 && sshdr->ascq == 2) {
+ if (sshdr->sense_code ==
+ LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED) {
/*
* LUN not ready - Initialization command required
*
@@ -61,8 +62,8 @@ static int tur_done(struct scsi_device *sdev, struct hp_sw_dh_data *h,
default:
sdev_printk(KERN_WARNING, sdev,
"%s: sending tur failed, sense %x/%x/%x\n",
- HP_SW_NAME, sshdr->sense_key, sshdr->asc,
- sshdr->ascq);
+ HP_SW_NAME, sshdr->sense_key,
+ scsi_sense_asc(sshdr), scsi_sense_ascq(sshdr));
break;
}
return ret;
@@ -84,9 +85,8 @@ static int hp_sw_tur(struct scsi_device *sdev, struct hp_sw_dh_data *h)
REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = SCMD_FAILURE_NO_LIMIT,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -133,14 +133,9 @@ static int hp_sw_start_stop(struct hp_sw_dh_data *h)
REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER;
struct scsi_failure failure_defs[] = {
{
- /*
- * LUN not ready - manual intervention required
- *
- * Switch-over in progress, retry.
- */
- .sense = NOT_READY,
- .asc = 0x04,
- .ascq = 0x03,
+ /* Switch-over in progress, retry. */
+ .sense_key = NOT_READY,
+ .sense_code = LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED,
.allowed = HP_SW_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -167,7 +162,8 @@ static int hp_sw_start_stop(struct hp_sw_dh_data *h)
switch (sshdr.sense_key) {
case NOT_READY:
- if (sshdr.asc == 0x04 && sshdr.ascq == 3) {
+ if (sshdr.sense_code ==
+ LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED) {
rc = SCSI_DH_RETRY;
break;
}
@@ -176,7 +172,8 @@ static int hp_sw_start_stop(struct hp_sw_dh_data *h)
sdev_printk(KERN_WARNING, sdev,
"%s: sending start_stop_unit failed, "
"sense %x/%x/%x\n", HP_SW_NAME,
- sshdr.sense_key, sshdr.asc, sshdr.ascq);
+ sshdr.sense_key, scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
rc = SCSI_DH_IO;
}
diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
index 88c8e36b221e..742534c99386 100644
--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
+++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
@@ -493,7 +493,8 @@ static int mode_select_handle_sense(struct scsi_device *sdev,
RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
"MODE_SELECT returned with sense %02x/%02x/%02x",
(char *) h->ctlr->array_name, h->ctlr->index,
- sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
+ sense_hdr->sense_key, scsi_sense_asc(sense_hdr),
+ scsi_sense_ascq(sense_hdr));
return SCSI_DH_IO;
}
@@ -514,35 +515,29 @@ static void send_mode_select(struct work_struct *work)
REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER;
struct scsi_failure failure_defs[] = {
{
- .sense = NO_SENSE,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = NO_SENSE,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = ABORTED_COMMAND,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = ABORTED_COMMAND,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
- /* LUN Not Ready and is in the Process of Becoming Ready */
{
- .sense = NOT_READY,
- .asc = 0x04,
- .ascq = 0x01,
+ .sense_key = NOT_READY,
+ .sense_code = LU_IS_IN_PROCESS_OF_BECOMING_READY,
.result = SAM_STAT_CHECK_CONDITION,
},
- /* Command Lock contention */
+ /* Command Lock contention (not a standard sense code) */
{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x91,
- .ascq = 0x36,
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = scsi_sense_code(0x91, 0x36),
.allowed = SCMD_FAILURE_NO_LIMIT,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -674,33 +669,34 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
{
struct rdac_dh_data *h = sdev->handler_data;
- RDAC_LOG(RDAC_LOG_SENSE, sdev, "array %s, ctlr %d, "
- "I/O returned with sense %02x/%02x/%02x",
- (char *) h->ctlr->array_name, h->ctlr->index,
- sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
+ RDAC_LOG(RDAC_LOG_SENSE, sdev,
+ "array %s, ctlr %d, I/O returned with sense %02x/%02x/%02x",
+ (char *) h->ctlr->array_name, h->ctlr->index,
+ sense_hdr->sense_key, scsi_sense_asc(sense_hdr),
+ scsi_sense_ascq(sense_hdr));
switch (sense_hdr->sense_key) {
case NOT_READY:
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01)
+ if (sense_hdr->sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY)
/* LUN Not Ready - Logical Unit Not Ready and is in
* the process of becoming ready
* Just retry.
*/
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x81)
+ if (sense_hdr->sense_code == scsi_sense_code(0x04, 0x81))
/* LUN Not Ready - Storage firmware incompatible
* Manual code synchonisation required.
*
* Nothing we can do here. Try to bypass the path.
*/
return SUCCESS;
- if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0xA1)
+ if (sense_hdr->sense_code == scsi_sense_code(0x04, 0xA1))
/* LUN Not Ready - Quiescense in progress
*
* Just retry and wait.
*/
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0xA1 && sense_hdr->ascq == 0x02)
+ if (sense_hdr->sense_code == scsi_sense_code(0xA1, 0x02))
/* LUN Not Ready - Quiescense in progress
* or has been achieved
* Just retry.
@@ -708,7 +704,7 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
return ADD_TO_MLQUEUE;
break;
case ILLEGAL_REQUEST:
- if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) {
+ if (sense_hdr->sense_code == scsi_sense_code(0x94, 0x01)) {
/* Invalid Request - Current Logical Unit Ownership.
* Controller is not the current owner of the LUN,
* Fail the path, so that the other path be used.
@@ -718,12 +714,13 @@ static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
}
break;
case UNIT_ATTENTION:
- if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
+ if (sense_hdr->sense_code ==
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
/*
* Power On, Reset, or Bus Device Reset, just retry.
*/
return ADD_TO_MLQUEUE;
- if (sense_hdr->asc == 0x8b && sense_hdr->ascq == 0x02)
+ if (sense_hdr->sense_code == scsi_sense_code(0x8b, 0x02))
/*
* Quiescence in progress , just retry.
*/
diff --git a/drivers/scsi/esp_scsi.c b/drivers/scsi/esp_scsi.c
index 897a01d3e303..9993b0ae9c4f 100644
--- a/drivers/scsi/esp_scsi.c
+++ b/drivers/scsi/esp_scsi.c
@@ -2174,7 +2174,7 @@ irqreturn_t scsi_esp_intr(int irq, void *dev_id)
unsigned long flags;
irqreturn_t ret;
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
ret = IRQ_NONE;
if (esp->ops->irq_pending(esp)) {
ret = IRQ_HANDLED;
@@ -2194,7 +2194,7 @@ irqreturn_t scsi_esp_intr(int irq, void *dev_id)
break;
}
}
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
return ret;
}
@@ -2497,7 +2497,7 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
/* XXX This helps a lot with debugging but might be a bit
* XXX much for the final driver.
*/
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
shost_printk(KERN_ERR, esp->host, "Aborting command [%p:%02x]\n",
cmd, cmd->cmnd[0]);
ent = esp->active_cmd;
@@ -2514,9 +2514,9 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
ent->cmd, ent->cmd->cmnd[0]);
}
esp_dump_cmd_log(esp);
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
ent = NULL;
list_for_each_entry(tmp, &esp->queued_cmds, list) {
@@ -2579,12 +2579,12 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
goto out_failure;
}
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
if (!wait_for_completion_timeout(&eh_done, 5 * HZ)) {
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
ent->eh_done = NULL;
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
return FAILED;
}
@@ -2592,7 +2592,7 @@ static int esp_eh_abort_handler(struct scsi_cmnd *cmd)
return SUCCESS;
out_success:
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
return SUCCESS;
out_failure:
@@ -2600,7 +2600,7 @@ out_failure:
* XXX since we know which target/lun in particular is
* XXX causing trouble.
*/
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
return FAILED;
}
@@ -2612,7 +2612,7 @@ static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd)
init_completion(&eh_reset);
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
esp->eh_reset = &eh_reset;
@@ -2624,14 +2624,14 @@ static int esp_eh_bus_reset_handler(struct scsi_cmnd *cmd)
esp->flags |= ESP_FLAG_RESETTING;
scsi_esp_cmd(esp, ESP_CMD_RS);
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
ssleep(esp_bus_reset_settle);
if (!wait_for_completion_timeout(&eh_reset, 5 * HZ)) {
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
esp->eh_reset = NULL;
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
return FAILED;
}
@@ -2645,10 +2645,10 @@ static int esp_eh_host_reset_handler(struct scsi_cmnd *cmd)
struct esp *esp = shost_priv(cmd->device->host);
unsigned long flags;
- spin_lock_irqsave(esp->host->host_lock, flags);
+ spin_lock_irqsave(&esp->host->host_lock, flags);
esp_bootup_reset(esp);
esp_reset_cleanup(esp);
- spin_unlock_irqrestore(esp->host->host_lock, flags);
+ spin_unlock_irqrestore(&esp->host->host_lock, flags);
ssleep(esp_bus_reset_settle);
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 438ac7c3a9e3..a2cf65fac297 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -2705,7 +2705,7 @@ static void fcoe_vport_remove(struct fc_lport *lport)
fc_host = shost_to_fc_host(shost);
/* Loop through all the vports and mark them for deletion */
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry_safe(vport, next_vport, &fc_host->vports, peers) {
if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) {
continue;
@@ -2715,7 +2715,7 @@ static void fcoe_vport_remove(struct fc_lport *lport)
&vport->vport_delete_work);
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
flush_workqueue(fc_host_work_q(shost));
}
diff --git a/drivers/scsi/fdomain.c b/drivers/scsi/fdomain.c
index 22fbb0222f07..b5766f752cdd 100644
--- a/drivers/scsi/fdomain.c
+++ b/drivers/scsi/fdomain.c
@@ -273,7 +273,7 @@ static void fdomain_work(struct work_struct *work)
int status;
int done = 0;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
if (scsi_pointer->phase & in_arbitration) {
status = inb(fd->base + REG_ASTAT);
@@ -380,7 +380,7 @@ static void fdomain_work(struct work_struct *work)
fd->base + REG_ICTL);
}
out:
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
}
static irqreturn_t fdomain_irq(int irq, void *dev_id)
@@ -416,7 +416,7 @@ static enum scsi_qc_status fdomain_queue(struct Scsi_Host *sh,
scsi_pointer->phase = in_arbitration;
scsi_set_resid(cmd, scsi_bufflen(cmd));
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
fd->cur_cmd = cmd;
@@ -431,7 +431,7 @@ static enum scsi_qc_status fdomain_queue(struct Scsi_Host *sh,
/* Start arbitration */
outb(ACTL_ARB | ACTL_IRQEN | PARITY_MASK, fd->base + REG_ACTL);
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return 0;
}
@@ -445,7 +445,7 @@ static int fdomain_abort(struct scsi_cmnd *cmd)
if (!fd->cur_cmd)
return FAILED;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
fdomain_make_bus_idle(fd);
fdomain_scsi_pointer(fd->cur_cmd)->phase |= aborted;
@@ -453,7 +453,7 @@ static int fdomain_abort(struct scsi_cmnd *cmd)
/* Aborts are not done well. . . */
set_host_byte(fd->cur_cmd, DID_ABORT);
fdomain_finish_cmd(fd);
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return SUCCESS;
}
@@ -463,9 +463,9 @@ static int fdomain_host_reset(struct scsi_cmnd *cmd)
struct fdomain *fd = shost_priv(sh);
unsigned long flags;
- spin_lock_irqsave(sh->host_lock, flags);
+ spin_lock_irqsave(&sh->host_lock, flags);
fdomain_reset(fd->base);
- spin_unlock_irqrestore(sh->host_lock, flags);
+ spin_unlock_irqrestore(&sh->host_lock, flags);
return SUCCESS;
}
diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c
index 79bd64e12adc..a29457f5adfb 100644
--- a/drivers/scsi/gvp11.c
+++ b/drivers/scsi/gvp11.c
@@ -42,9 +42,9 @@ static irqreturn_t gvp11_intr(int irq, void *data)
if (!(status & GVP11_DMAC_INT_PENDING))
return IRQ_NONE;
- spin_lock_irqsave(instance->host_lock, flags);
+ spin_lock_irqsave(&instance->host_lock, flags);
wd33c93_intr(instance);
- spin_unlock_irqrestore(instance->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index e72055c1ebbb..e8361ba65564 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -73,7 +73,7 @@ static struct class shost_class = {
* transition is illegal.
**/
int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state)
- __must_hold(shost->host_lock)
+ __must_hold(&shost->host_lock)
{
enum scsi_host_state oldstate = READ_ONCE(shost->shost_state);
@@ -168,14 +168,14 @@ void scsi_remove_host(struct Scsi_Host *shost)
unsigned long flags;
mutex_lock(&shost->scan_mutex);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_set_state(shost, SHOST_CANCEL))
if (scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
mutex_unlock(&shost->scan_mutex);
return;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_autopm_get_host(shost);
flush_workqueue(shost->tmf_work_q);
@@ -193,10 +193,10 @@ void scsi_remove_host(struct Scsi_Host *shost)
kref_put(&shost->tagset_refcnt, scsi_mq_free_tags);
wait_for_completion(&shost->tagset_freed);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_set_state(shost, SHOST_DEL))
BUG_ON(scsi_host_set_state(shost, SHOST_DEL_RECOVERY));
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
transport_unregister_device(&shost->shost_gendev);
device_unregister(&shost->shost_dev);
@@ -277,7 +277,7 @@ int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
if (error)
goto out_disable_runtime_pm;
- scoped_guard(spinlock_irq, shost->host_lock)
+ scoped_guard(spinlock_irq, &shost->host_lock)
scsi_host_set_state(shost, SHOST_RUNNING);
get_device(shost->shost_gendev.parent);
@@ -414,8 +414,7 @@ struct Scsi_Host *scsi_host_alloc(const struct scsi_host_template *sht, int priv
if (!shost)
return NULL;
- shost->host_lock = &shost->default_lock;
- scoped_guard(spinlock_init, shost->host_lock)
+ scoped_guard(spinlock_init, &shost->host_lock)
shost->shost_state = SHOST_CREATED;
INIT_LIST_HEAD(&shost->__devices);
INIT_LIST_HEAD(&shost->__targets);
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index 8edad1830abe..4009edcfd2b1 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -353,14 +353,13 @@ static inline bool hpsa_is_cmd_idle(struct CommandList *c)
/* extract sense key, asc, and ascq from sense data. -1 means invalid. */
static void decode_sense_data(const u8 *sense_data, int sense_data_len,
- u8 *sense_key, u8 *asc, u8 *ascq)
+ u8 *sense_key, u16 *sense_code)
{
struct scsi_sense_hdr sshdr;
bool rc;
*sense_key = -1;
- *asc = -1;
- *ascq = -1;
+ *sense_code = -1;
if (sense_data_len < 1)
return;
@@ -368,15 +367,15 @@ static void decode_sense_data(const u8 *sense_data, int sense_data_len,
rc = scsi_normalize_sense(sense_data, sense_data_len, &sshdr);
if (rc) {
*sense_key = sshdr.sense_key;
- *asc = sshdr.asc;
- *ascq = sshdr.ascq;
+ *sense_code = sshdr.sense_code;
}
}
static int check_for_unit_attention(struct ctlr_info *h,
struct CommandList *c)
{
- u8 sense_key, asc, ascq;
+ u8 sense_key;
+ u16 sense_code;
int sense_len;
if (c->err_info->SenseLen > sizeof(c->err_info->SenseInfo))
@@ -385,34 +384,35 @@ static int check_for_unit_attention(struct ctlr_info *h,
sense_len = c->err_info->SenseLen;
decode_sense_data(c->err_info->SenseInfo, sense_len,
- &sense_key, &asc, &ascq);
- if (sense_key != UNIT_ATTENTION || asc == 0xff)
+ &sense_key, &sense_code);
+ if (sense_key != UNIT_ATTENTION ||
+ scsi_sense_code_asc(sense_code) == 0xff)
return 0;
- switch (asc) {
- case STATE_CHANGED:
+ switch (scsi_sense_code_asc(sense_code)) {
+ case ASC_PARAMETERS_CHANGED:
dev_warn(&h->pdev->dev,
"%s: a state change detected, command retried\n",
h->devname);
break;
- case LUN_FAILED:
+ case ASC_LU_HAS_NOT_SELF_CONFIGURED_YET:
dev_warn(&h->pdev->dev,
"%s: LUN failure detected\n", h->devname);
break;
- case REPORT_LUNS_CHANGED:
+ case ASC_TARGET_OPERATING_CONDITIONS_HAVE_CHANGED:
dev_warn(&h->pdev->dev,
"%s: report LUN data changed\n", h->devname);
/*
- * Note: this REPORT_LUNS_CHANGED condition only occurs on the external
- * target (array) devices.
+ * Note: this ASC_TARGET_OPERATING_CONDITIONS_HAVE_CHANGED condition
+ * only occurs on the external target (array) devices.
*/
break;
- case POWER_OR_RESET:
+ case ASC_POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED:
dev_warn(&h->pdev->dev,
"%s: a power on or device reset detected\n",
h->devname);
break;
- case UNIT_ATTENTION_CLEARED:
+ case ASC_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR:
dev_warn(&h->pdev->dev,
"%s: unit attention cleared by another initiator\n",
h->devname);
@@ -2562,10 +2562,8 @@ static void complete_scsi_command(struct CommandList *cp)
struct ErrorInfo *ei;
struct hpsa_scsi_dev_t *dev;
struct io_accel2_cmd *c2;
-
u8 sense_key;
- u8 asc; /* additional sense code */
- u8 ascq; /* additional sense code qualifier */
+ u16 sense_code;
unsigned long sense_data_size;
ei = cp->err_info;
@@ -2666,18 +2664,19 @@ static void complete_scsi_command(struct CommandList *cp)
memcpy(cmd->sense_buffer, ei->SenseInfo, sense_data_size);
if (ei->ScsiStatus)
decode_sense_data(ei->SenseInfo, sense_data_size,
- &sense_key, &asc, &ascq);
+ &sense_key, &sense_code);
if (ei->ScsiStatus == SAM_STAT_CHECK_CONDITION) {
switch (sense_key) {
case ABORTED_COMMAND:
cmd->result |= DID_SOFT_ERROR << 16;
break;
case UNIT_ATTENTION:
- if (asc == 0x3F && ascq == 0x0E)
+ if (sense_code ==
+ REPORTED_LUNS_DATA_HAS_CHANGED)
h->drv_req_rescan = 1;
break;
case ILLEGAL_REQUEST:
- if (asc == 0x25 && ascq == 0x00) {
+ if (sense_code == LU_NOT_SUPPORTED) {
dev->removed = 1;
cmd->result = DID_NO_CONNECT << 16;
}
@@ -2693,7 +2692,9 @@ static void complete_scsi_command(struct CommandList *cp)
"Sense: 0x%x, ASC: 0x%x, ASCQ: 0x%x, "
"Returning result: 0x%x\n",
cp, ei->ScsiStatus,
- sense_key, asc, ascq,
+ sense_key,
+ scsi_sense_code_asc(sense_code),
+ scsi_sense_code_ascq(sense_code),
cmd->result);
} else { /* scsi status is zero??? How??? */
dev_warn(&h->pdev->dev, "cp %p SCSI status was 0. "
@@ -2919,7 +2920,8 @@ static void hpsa_scsi_interpret_error(struct ctlr_info *h,
{
const struct ErrorInfo *ei = cp->err_info;
struct device *d = &cp->h->pdev->dev;
- u8 sense_key, asc, ascq;
+ u8 sense_key;
+ u16 sense_code;
int sense_len;
switch (ei->CommandStatus) {
@@ -2928,12 +2930,13 @@ static void hpsa_scsi_interpret_error(struct ctlr_info *h,
sense_len = sizeof(ei->SenseInfo);
else
sense_len = ei->SenseLen;
- decode_sense_data(ei->SenseInfo, sense_len,
- &sense_key, &asc, &ascq);
+ decode_sense_data(ei->SenseInfo, sense_len, &sense_key,
+ &sense_code);
hpsa_print_cmd(h, "SCSI status", cp);
if (ei->ScsiStatus == SAM_STAT_CHECK_CONDITION)
dev_warn(d, "SCSI Status = 02, Sense key = 0x%02x, ASC = 0x%02x, ASCQ = 0x%02x\n",
- sense_key, asc, ascq);
+ sense_key, scsi_sense_code_asc(sense_code),
+ scsi_sense_code_ascq(sense_code));
else
dev_warn(d, "SCSI Status = 0x%02x\n", ei->ScsiStatus);
if (ei->ScsiStatus == 0)
@@ -3868,12 +3871,10 @@ static unsigned char hpsa_volume_offline(struct ctlr_info *h,
{
struct CommandList *c;
unsigned char *sense;
- u8 sense_key, asc, ascq;
+ u8 sense_key;
+ u16 sense_code;
int sense_len;
int rc, ldstat = 0;
-#define ASC_LUN_NOT_READY 0x04
-#define ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS 0x04
-#define ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ 0x02
c = cmd_alloc(h);
@@ -3889,7 +3890,7 @@ static unsigned char hpsa_volume_offline(struct ctlr_info *h,
sense_len = sizeof(c->err_info->SenseInfo);
else
sense_len = c->err_info->SenseLen;
- decode_sense_data(sense, sense_len, &sense_key, &asc, &ascq);
+ decode_sense_data(sense, sense_len, &sense_key, &sense_code);
cmd_free(h, c);
/* Determine the reason for not ready state */
@@ -3912,8 +3913,8 @@ static unsigned char hpsa_volume_offline(struct ctlr_info *h,
/* If VPD status page isn't available,
* use ASC/ASCQ to determine state
*/
- if ((ascq == ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS) ||
- (ascq == ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ))
+ if (sense_code == LU_NOT_READY_FORMAT_IN_PROGRESS ||
+ sense_code == LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED)
return ldstat;
break;
default:
@@ -6499,7 +6500,7 @@ static int hpsa_big_passthru_ioctl(struct ctlr_info *h,
return -EINVAL;
if (ioc->buf_size > ioc->malloc_size * SG_ENTRIES_IN_CMD)
return -EINVAL;
- buff = kcalloc(SG_ENTRIES_IN_CMD, sizeof(char *), GFP_KERNEL);
+ buff = kcalloc(SG_ENTRIES_IN_CMD, sizeof(*buff), GFP_KERNEL);
if (!buff) {
status = -ENOMEM;
goto cleanup1;
diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h
index ba6a3aa8d954..0dbfbec37ce2 100644
--- a/drivers/scsi/hpsa_cmd.h
+++ b/drivers/scsi/hpsa_cmd.h
@@ -63,29 +63,6 @@
#define CISS_TMF_WRONG_LUN 0x09
#define CISS_TMF_OVERLAPPED_TAG 0x0a
-/* Unit Attentions ASC's as defined for the MSA2012sa */
-#define POWER_OR_RESET 0x29
-#define STATE_CHANGED 0x2a
-#define UNIT_ATTENTION_CLEARED 0x2f
-#define LUN_FAILED 0x3e
-#define REPORT_LUNS_CHANGED 0x3f
-
-/* Unit Attentions ASCQ's as defined for the MSA2012sa */
-
- /* These ASCQ's defined for ASC = POWER_OR_RESET */
-#define POWER_ON_RESET 0x00
-#define POWER_ON_REBOOT 0x01
-#define SCSI_BUS_RESET 0x02
-#define MSA_TARGET_RESET 0x03
-#define CONTROLLER_FAILOVER 0x04
-#define TRANSCEIVER_SE 0x05
-#define TRANSCEIVER_LVD 0x06
-
- /* These ASCQ's defined for ASC = STATE_CHANGED */
-#define RESERVATION_PREEMPTED 0x03
-#define ASYM_ACCESS_CHANGED 0x06
-#define LUN_CAPACITY_CHANGED 0x09
-
/* transfer direction */
#define XFER_NONE 0x00
#define XFER_WRITE 0x01
diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
index 7083c14c5302..a3afb3446bbb 100644
--- a/drivers/scsi/hptiop.c
+++ b/drivers/scsi/hptiop.c
@@ -385,9 +385,9 @@ static int iop_send_sync_msg(struct hptiop_hba *hba, u32 msg, u32 millisec)
hba->ops->post_msg(hba, msg);
for (i = 0; i < millisec; i++) {
- spin_lock_irq(hba->host->host_lock);
+ spin_lock_irq(&hba->host->host_lock);
hba->ops->iop_intr(hba);
- spin_unlock_irq(hba->host->host_lock);
+ spin_unlock_irq(&hba->host->host_lock);
if (hba->msg_done)
break;
msleep(1);
@@ -836,9 +836,9 @@ static irqreturn_t hptiop_intr(int irq, void *dev_id)
int handled;
unsigned long flags;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
handled = hba->ops->iop_intr(hba);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return handled;
}
diff --git a/drivers/scsi/ibmvscsi/ibmvfc-core.c b/drivers/scsi/ibmvscsi/ibmvfc-core.c
index 3534ac45e9b8..aa7ae81df41b 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc-core.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-core.c
@@ -974,14 +974,14 @@ static int ibmvfc_reenable_crq_queue(struct ibmvfc_host *vhost)
if (rc)
dev_err(vhost->dev, "Error enabling adapter (rc=%d)\n", rc);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
spin_lock(vhost->crq.q_lock);
vhost->do_enquiry = 1;
vhost->using_channels = 0;
vhost->do_scsi_login = 0;
vhost->do_nvme_login = 0;
spin_unlock(vhost->crq.q_lock);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_reg_sub_crqs(vhost, &vhost->scsi_scrqs);
ibmvfc_reg_sub_crqs(vhost, &vhost->nvme_scrqs);
@@ -1013,7 +1013,7 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
} while (rc == H_BUSY || H_IS_LONG_BUSY(rc));
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
spin_lock(vhost->crq.q_lock);
vhost->state = IBMVFC_NO_CRQ;
vhost->logged_in = 0;
@@ -1037,7 +1037,7 @@ static int ibmvfc_reset_crq(struct ibmvfc_host *vhost)
dev_warn(vhost->dev, "Couldn't register crq (rc=%d)\n", rc);
spin_unlock(vhost->crq.q_lock);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_reg_sub_crqs(vhost, &vhost->scsi_scrqs);
ibmvfc_reg_sub_crqs(vhost, &vhost->nvme_scrqs);
@@ -1250,9 +1250,9 @@ static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
{
unsigned long flags;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
__ibmvfc_reset_host(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -1318,9 +1318,9 @@ static struct ibmvfc_target *ibmvfc_get_target(struct scsi_target *starget)
struct ibmvfc_target *tgt;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
tgt = __ibmvfc_get_target(starget);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return tgt;
}
@@ -1336,7 +1336,7 @@ static void ibmvfc_get_host_speed(struct Scsi_Host *shost)
struct ibmvfc_host *vhost = shost_priv(shost);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (vhost->state == IBMVFC_ACTIVE) {
switch (be64_to_cpu(vhost->login_buf->resp.link_speed) / 100) {
case 1:
@@ -1365,7 +1365,7 @@ static void ibmvfc_get_host_speed(struct Scsi_Host *shost)
}
} else
fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -1380,7 +1380,7 @@ static void ibmvfc_get_host_port_state(struct Scsi_Host *shost)
struct ibmvfc_host *vhost = shost_priv(shost);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
switch (vhost->state) {
case IBMVFC_INITIALIZING:
case IBMVFC_ACTIVE:
@@ -1404,7 +1404,7 @@ static void ibmvfc_get_host_port_state(struct Scsi_Host *shost)
fc_host_port_state(shost) = FC_PORTSTATE_UNKNOWN;
break;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -1642,9 +1642,9 @@ static void ibmvfc_locked_done(struct ibmvfc_event *evt)
{
unsigned long flags;
- spin_lock_irqsave(evt->vhost->host->host_lock, flags);
+ spin_lock_irqsave(&evt->vhost->host->host_lock, flags);
evt->_done(evt);
- spin_unlock_irqrestore(evt->vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&evt->vhost->host->host_lock, flags);
}
/**
@@ -1905,7 +1905,7 @@ static void ibmvfc_scsi_relogin(struct scsi_device *sdev)
struct ibmvfc_target *tgt;
unsigned long flags;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
list_for_each_entry(tgt, &vhost->scsi_scrqs.targets, queue) {
if (rport == tgt->rport) {
ibmvfc_del_tgt(tgt);
@@ -1914,7 +1914,7 @@ static void ibmvfc_scsi_relogin(struct scsi_device *sdev)
}
ibmvfc_reinit_host(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -2147,17 +2147,17 @@ static int ibmvfc_bsg_timeout(struct bsg_job *job)
int rc;
ENTER;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (vhost->aborting_passthru || vhost->state != IBMVFC_ACTIVE) {
__ibmvfc_reset_host(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return 0;
}
vhost->aborting_passthru = 1;
evt = ibmvfc_get_reserved_event(&vhost->crq);
if (!evt) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return -ENOMEM;
}
@@ -2181,7 +2181,7 @@ static int ibmvfc_bsg_timeout(struct bsg_job *job)
dev_info(vhost->dev, "Cancelling passthru command to port id 0x%lx\n",
port_id);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
LEAVE;
return rc;
@@ -2205,7 +2205,7 @@ static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id)
int rc = 0, issue_login = 1;
ENTER;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
list_for_each_entry(tgt, &vhost->scsi_scrqs.targets, queue) {
if (tgt->scsi_id == port_id) {
issue_login = 0;
@@ -2234,7 +2234,7 @@ static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id)
init_completion(&evt->comp);
rc = ibmvfc_send_event(evt, vhost, default_timeout);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rc)
return -EIO;
@@ -2244,10 +2244,10 @@ static int ibmvfc_bsg_plogi(struct ibmvfc_host *vhost, unsigned int port_id)
if (rsp_iu.plogi.common.status)
rc = -EIO;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
unlock_out:
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
LEAVE;
return rc;
}
@@ -2332,17 +2332,17 @@ static int ibmvfc_bsg_request(struct bsg_job *job)
if (issue_login)
rc = ibmvfc_bsg_plogi(vhost, port_id);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (unlikely(rc || (rport && (rc = fc_remote_port_chkready(rport)))) ||
unlikely((rc = ibmvfc_host_chkready(vhost)))) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
goto out;
}
evt = ibmvfc_get_reserved_event(&vhost->crq);
if (!evt) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
rc = -ENOMEM;
goto out;
}
@@ -2374,7 +2374,7 @@ static int ibmvfc_bsg_request(struct bsg_job *job)
evt->sync_iu = &rsp_iu;
init_completion(&evt->comp);
rc = ibmvfc_send_event(evt, vhost, 0);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rc) {
rc = -EIO;
@@ -2388,9 +2388,9 @@ static int ibmvfc_bsg_request(struct bsg_job *job)
else
bsg_reply->reply_payload_rcv_len = rsp_len;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
bsg_reply->result = rc;
bsg_job_done(job, bsg_reply->result,
bsg_reply->reply_payload_rcv_len);
@@ -2427,7 +2427,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
unsigned long flags;
int rsp_code = 0;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (vhost->state == IBMVFC_ACTIVE) {
if (vhost->using_channels)
evt = ibmvfc_get_event(&vhost->scsi_scrqs.scrqs[0]);
@@ -2435,7 +2435,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
evt = ibmvfc_get_event(&vhost->crq);
if (!evt) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return -ENOMEM;
}
@@ -2452,7 +2452,7 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
init_completion(&evt->comp);
rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rsp_rc != 0) {
sdev_printk(KERN_ERR, sdev, "Failed to send %s reset event. rc=%d\n",
@@ -2479,9 +2479,9 @@ static int ibmvfc_reset_device(struct scsi_device *sdev, int type, char *desc)
} else
sdev_printk(KERN_INFO, sdev, "%s reset successful\n", desc);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return rsp_rc;
}
@@ -2583,7 +2583,7 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device,
do {
wait = 0;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
for (q_index = 0; q_index < q_size; q_index++) {
spin_lock(&queues[q_index].l_lock);
for (i = 0; i < queues[q_index].evt_pool.size; i++) {
@@ -2597,14 +2597,14 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device,
}
spin_unlock(&queues[q_index].l_lock);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (wait) {
timeout = wait_for_completion_timeout(&comp, timeout);
if (!timeout) {
wait = 0;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
for (q_index = 0; q_index < q_size; q_index++) {
spin_lock(&queues[q_index].l_lock);
for (i = 0; i < queues[q_index].evt_pool.size; i++) {
@@ -2618,7 +2618,7 @@ static int ibmvfc_wait_for_ops(struct ibmvfc_host *vhost, void *device,
}
spin_unlock(&queues[q_index].l_lock);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (wait)
dev_err(vhost->dev, "Timed out waiting for aborted commands\n");
LEAVE;
@@ -2684,7 +2684,7 @@ static int ibmvfc_cancel_all_mq(struct scsi_device *sdev, int type)
u16 status;
ENTER;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
num_hwq = vhost->scsi_scrqs.active_queues;
for (i = 0; i < num_hwq; i++) {
spin_lock(queues[i].q_lock);
@@ -2702,7 +2702,7 @@ static int ibmvfc_cancel_all_mq(struct scsi_device *sdev, int type)
evt = ibmvfc_init_tmf(&queues[i], sdev, type);
if (!evt) {
spin_unlock(queues[i].q_lock);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return -ENOMEM;
}
evt->sync_iu = &queues[i].cancel_rsp;
@@ -2712,7 +2712,7 @@ static int ibmvfc_cancel_all_mq(struct scsi_device *sdev, int type)
spin_unlock(queues[i].q_lock);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (list_empty(&cancelq)) {
if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
@@ -2763,7 +2763,7 @@ static int ibmvfc_cancel_all_sq(struct scsi_device *sdev, int type)
ENTER;
found_evt = NULL;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
spin_lock(&vhost->crq.l_lock);
list_for_each_entry(evt, &vhost->crq.sent, queue_list) {
if (evt->cmnd && evt->cmnd->device == sdev) {
@@ -2776,7 +2776,7 @@ static int ibmvfc_cancel_all_sq(struct scsi_device *sdev, int type)
if (!found_evt) {
if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
sdev_printk(KERN_INFO, sdev, "No events found to cancel\n");
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return 0;
}
@@ -2786,7 +2786,7 @@ static int ibmvfc_cancel_all_sq(struct scsi_device *sdev, int type)
rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rsp_rc != 0) {
sdev_printk(KERN_ERR, sdev, "Failed to send cancel event. rc=%d\n", rsp_rc);
@@ -2800,9 +2800,9 @@ static int ibmvfc_cancel_all_sq(struct scsi_device *sdev, int type)
wait_for_completion(&evt->comp);
status = be16_to_cpu(rsp.mad_common.status);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (status != IBMVFC_MAD_SUCCESS) {
sdev_printk(KERN_WARNING, sdev, "Cancel failed with rc=%x\n", status);
@@ -2899,7 +2899,7 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
int rsp_code = 0;
found_evt = NULL;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
spin_lock(&vhost->crq.l_lock);
list_for_each_entry(evt, &vhost->crq.sent, queue_list) {
if (evt->cmnd && evt->cmnd->device == sdev) {
@@ -2912,14 +2912,14 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
if (!found_evt) {
if (vhost->log_level > IBMVFC_DEFAULT_LOG_LEVEL)
sdev_printk(KERN_INFO, sdev, "No events found to abort\n");
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return 0;
}
if (vhost->state == IBMVFC_ACTIVE) {
evt = ibmvfc_get_event(&vhost->crq);
if (!evt) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return -ENOMEM;
}
ibmvfc_init_event(evt, ibmvfc_sync_completion, IBMVFC_CMD_FORMAT);
@@ -2938,7 +2938,7 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
rsp_rc = ibmvfc_send_event(evt, vhost, default_timeout);
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rsp_rc != 0) {
sdev_printk(KERN_ERR, sdev, "Failed to send abort. rc=%d\n", rsp_rc);
@@ -2967,9 +2967,9 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
rc = ibmvfc_wait_for_ops(vhost, evt, ibmvfc_match_evt);
if (rc != SUCCESS) {
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_hard_reset_host(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
rsp_rc = 0;
}
@@ -2994,9 +2994,9 @@ static int ibmvfc_abort_task_set(struct scsi_device *sdev)
sdev_printk(KERN_INFO, sdev, "Abort successful\n");
out:
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return rsp_rc;
}
@@ -3176,7 +3176,7 @@ static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
if (rc == FAILED)
ibmvfc_issue_fc_host_lip(shost);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
found = 0;
list_for_each_entry(tgt, &vhost->scsi_scrqs.targets, queue) {
if (tgt->scsi_id == rport->port_id) {
@@ -3195,7 +3195,7 @@ static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
ibmvfc_reinit_host(vhost);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
LEAVE;
}
@@ -3468,7 +3468,7 @@ static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
struct ibmvfc_host *vhost = shost_priv(shost);
int done = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (!vhost->scan_timeout)
done = 1;
else if (time >= (vhost->scan_timeout * HZ)) {
@@ -3481,7 +3481,7 @@ static int ibmvfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
vhost->scan_timeout = init_timeout;
done = 1;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return done;
}
@@ -3505,9 +3505,9 @@ static int ibmvfc_sdev_init(struct scsi_device *sdev)
if (!rport || fc_remote_port_chkready(rport))
return -ENXIO;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
sdev->hostdata = (void *)(unsigned long)vhost->task_set++;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return 0;
}
@@ -3527,9 +3527,9 @@ static int ibmvfc_target_alloc(struct scsi_target *starget)
struct ibmvfc_host *vhost = shost_priv(shost);
unsigned long flags = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
starget->hostdata = (void *)(unsigned long)vhost->task_set++;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return 0;
}
@@ -3550,12 +3550,12 @@ static int ibmvfc_sdev_configure(struct scsi_device *sdev,
struct Scsi_Host *shost = sdev->host;
unsigned long flags = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (sdev->type == TYPE_DISK) {
sdev->allow_restart = 1;
blk_queue_rq_timeout(sdev->request_queue, 120 * HZ);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return 0;
}
@@ -3646,9 +3646,9 @@ static ssize_t ibmvfc_show_log_level(struct device *dev,
unsigned long flags = 0;
int len;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
len = sysfs_emit(buf, "%d\n", vhost->log_level);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return len;
}
@@ -3670,9 +3670,9 @@ static ssize_t ibmvfc_store_log_level(struct device *dev,
struct ibmvfc_host *vhost = shost_priv(shost);
unsigned long flags = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
vhost->log_level = simple_strtoul(buf, NULL, 10);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return strlen(buf);
}
@@ -3685,9 +3685,9 @@ static ssize_t ibmvfc_show_scsi_channels(struct device *dev,
unsigned long flags = 0;
int len;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
len = sysfs_emit(buf, "%d\n", scsi->desired_queues);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return len;
}
@@ -3701,11 +3701,11 @@ static ssize_t ibmvfc_store_scsi_channels(struct device *dev,
unsigned long flags = 0;
unsigned int channels;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
channels = simple_strtoul(buf, NULL, 10);
scsi->desired_queues = min(channels, shost->nr_hw_queues);
ibmvfc_hard_reset_host(vhost);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return strlen(buf);
}
@@ -3751,9 +3751,9 @@ static ssize_t ibmvfc_read_trace(struct file *filp, struct kobject *kobj,
count = size;
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
memcpy(buf, &src[off], count);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return count;
}
@@ -3864,10 +3864,10 @@ static irqreturn_t ibmvfc_interrupt(int irq, void *dev_instance)
struct ibmvfc_host *vhost = (struct ibmvfc_host *)dev_instance;
unsigned long flags;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
vio_disable_interrupts(to_vio_dev(vhost->dev));
tasklet_schedule(&vhost->tasklet);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return IRQ_HANDLED;
}
@@ -3889,7 +3889,7 @@ static void ibmvfc_tasklet(void *data)
int done = 0;
LIST_HEAD(evt_doneq);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
spin_lock(vhost->crq.q_lock);
while (!done) {
/* Pull all the valid messages off the async CRQ */
@@ -3922,7 +3922,7 @@ static void ibmvfc_tasklet(void *data)
}
spin_unlock(vhost->crq.q_lock);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
list_for_each_entry_safe(evt, temp, &evt_doneq, queue_list) {
timer_delete(&evt->timer);
@@ -4776,12 +4776,12 @@ static void ibmvfc_adisc_timeout(struct timer_list *t)
int rc;
tgt_dbg(tgt, "ADISC timeout\n");
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (vhost->abort_threads >= disc_threads ||
tgt->action != IBMVFC_TGT_ACTION_INIT_WAIT ||
vhost->state != IBMVFC_INITIALIZING ||
vhost->action != IBMVFC_HOST_ACTION_QUERY_TGTS) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return;
}
@@ -4793,7 +4793,7 @@ static void ibmvfc_adisc_timeout(struct timer_list *t)
vhost->abort_threads--;
kref_put(&tgt->kref, ibmvfc_release_tgt);
__ibmvfc_reset_host(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return;
}
ibmvfc_init_event(evt, ibmvfc_tgt_adisc_cancel_done, IBMVFC_MAD_FORMAT);
@@ -4821,7 +4821,7 @@ static void ibmvfc_adisc_timeout(struct timer_list *t)
__ibmvfc_reset_host(vhost);
} else
tgt_dbg(tgt, "Attempting to cancel ADISC\n");
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -5010,7 +5010,7 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost,
channels = &vhost->nvme_scrqs;
/* Look to see if we already have a target allocated for this SCSI ID or WWPN */
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
list_for_each_entry(tgt, &channels->targets, queue) {
if (tgt->wwpn == wwpn) {
wtgt = tgt;
@@ -5062,7 +5062,7 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost,
ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
goto unlock_out;
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
tgt = mempool_alloc(vhost->tgt_pool, GFP_NOIO);
memset(tgt, 0, sizeof(*tgt));
@@ -5074,12 +5074,12 @@ static int ibmvfc_alloc_target(struct ibmvfc_host *vhost,
timer_setup(&tgt->timer, ibmvfc_adisc_timeout, 0);
kref_init(&tgt->kref);
ibmvfc_init_tgt(tgt, ibmvfc_tgt_implicit_logout);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
tgt->cancel_key = vhost->task_set++;
list_add_tail(&tgt->queue, &channels->targets);
unlock_out:
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return 0;
}
@@ -5853,9 +5853,9 @@ static int ibmvfc_work_to_do(struct ibmvfc_host *vhost)
unsigned long flags;
int rc;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
rc = __ibmvfc_work_to_do(vhost);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return rc;
}
@@ -5890,14 +5890,14 @@ static void ibmvfc_tgt_add_nvme_rport(struct ibmvfc_target *tgt)
tgt_dbg(tgt, "Adding NVMe rport\n");
ibmvfc_nvme_register_remoteport(tgt);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
rport = tgt->nvme_remote_port;
if (rport && tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
tgt_dbg(tgt, "Deleting NVMe rport\n");
list_del(&tgt->queue);
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_nvme_unregister_remoteport(tgt);
timer_delete_sync(&tgt->timer);
kref_put(&tgt->kref, ibmvfc_release_tgt);
@@ -5906,11 +5906,11 @@ static void ibmvfc_tgt_add_nvme_rport(struct ibmvfc_target *tgt)
tgt_dbg(tgt, "Deleting NVMe rport with outstanding I/O\n");
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT);
tgt->init_retries = 0;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_nvme_unregister_remoteport(tgt);
return;
} else if (rport && tgt->action == IBMVFC_TGT_ACTION_DELETED_RPORT) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return;
}
@@ -5919,7 +5919,7 @@ static void ibmvfc_tgt_add_nvme_rport(struct ibmvfc_target *tgt)
tgt->target_id = tgt->nvme_remote_port->port_id;
} else
tgt_dbg(tgt, "NVMe rport add failed\n");
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -5935,13 +5935,13 @@ static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
tgt_dbg(tgt, "Adding rport\n");
rport = fc_remote_port_add(vhost->host, 0, &tgt->ids);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (rport && tgt->action == IBMVFC_TGT_ACTION_DEL_RPORT) {
tgt_dbg(tgt, "Deleting rport\n");
list_del(&tgt->queue);
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
fc_remote_port_delete(rport);
timer_delete_sync(&tgt->timer);
kref_put(&tgt->kref, ibmvfc_release_tgt);
@@ -5951,11 +5951,11 @@ static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT);
tgt->rport = NULL;
tgt->init_retries = 0;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
fc_remote_port_delete(rport);
return;
} else if (rport && tgt->action == IBMVFC_TGT_ACTION_DELETED_RPORT) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return;
}
@@ -5973,7 +5973,7 @@ static void ibmvfc_tgt_add_rport(struct ibmvfc_target *tgt)
rport->supported_classes |= FC_COS_CLASS3;
} else
tgt_dbg(tgt, "rport add failed\n");
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -5991,7 +5991,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
int rc;
ibmvfc_log_ae(vhost, vhost->events_to_log);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
vhost->events_to_log = 0;
switch (vhost->action) {
case IBMVFC_HOST_ACTION_NONE:
@@ -6000,12 +6000,12 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
break;
case IBMVFC_HOST_ACTION_RESET:
list_splice_init(&vhost->purge, &purge);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_complete_purge(&purge);
ibmvfc_nvme_unregister(vhost);
rc = ibmvfc_reset_crq(vhost);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (!rc || rc == H_CLOSED)
vio_enable_interrupts(to_vio_dev(vhost->dev));
if (vhost->action == IBMVFC_HOST_ACTION_RESET) {
@@ -6026,11 +6026,11 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
break;
case IBMVFC_HOST_ACTION_REENABLE:
list_splice_init(&vhost->purge, &purge);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_complete_purge(&purge);
rc = ibmvfc_reenable_crq_queue(vhost);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
if (vhost->action == IBMVFC_HOST_ACTION_REENABLE) {
/*
* The only action we could have changed to would have
@@ -6052,7 +6052,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
BUG_ON(vhost->state != IBMVFC_INITIALIZING);
if (vhost->delay_init) {
vhost->delay_init = 0;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ssleep(15);
return;
} else
@@ -6098,7 +6098,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
}
if (ibmvfc_dev_logo_to_do(vhost)) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return;
}
@@ -6109,7 +6109,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
tgt->rport = NULL;
list_del(&tgt->queue);
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rport)
fc_remote_port_delete(rport);
timer_delete_sync(&tgt->timer);
@@ -6133,7 +6133,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
*/
if (rport && rport->fast_io_fail_tmo == -1)
tgt->move_login = 1;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (rport)
fc_remote_port_delete(rport);
return;
@@ -6146,7 +6146,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
nvme_rport = tgt->nvme_remote_port;
list_del(&tgt->queue);
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DELETED_RPORT);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (nvme_rport)
ibmvfc_nvme_unregister_remoteport(tgt);
timer_delete_sync(&tgt->timer);
@@ -6157,7 +6157,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
nvme_rport = tgt->nvme_remote_port;
ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_LOGOUT_DELETED_RPORT);
tgt->init_retries = 0;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (nvme_rport)
ibmvfc_nvme_unregister_remoteport(tgt);
return;
@@ -6170,14 +6170,14 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
vhost->reinit = 0;
scsi_block_requests(vhost->host);
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
} else {
ibmvfc_set_host_state(vhost, IBMVFC_ACTIVE);
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
wake_up(&vhost->init_wait_q);
schedule_work(&vhost->rport_add_work_q);
vhost->init_retries = 0;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
scsi_unblock_requests(vhost->host);
}
@@ -6188,7 +6188,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
}
} else {
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
scsi_unblock_requests(vhost->host);
wake_up(&vhost->init_wait_q);
return;
@@ -6196,9 +6196,9 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
break;
case IBMVFC_HOST_ACTION_ALLOC_TGTS:
ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_TGT_INIT);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_alloc_targets(vhost);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
break;
case IBMVFC_HOST_ACTION_TGT_INIT:
list_for_each_entry(tgt, &vhost->scsi_scrqs.targets, queue) {
@@ -6221,7 +6221,7 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
break;
}
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
/**
@@ -6754,7 +6754,7 @@ static void ibmvfc_rport_add_thread(struct work_struct *work)
int did_work;
ENTER;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
do {
did_work = 0;
if (vhost->state != IBMVFC_ACTIVE)
@@ -6767,19 +6767,19 @@ static void ibmvfc_rport_add_thread(struct work_struct *work)
kref_get(&tgt->kref);
rport = tgt->rport;
if (!rport) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_tgt_add_rport(tgt);
} else if (get_device(&rport->dev)) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
tgt_dbg(tgt, "Setting rport roles\n");
fc_remote_port_rolechg(rport, tgt->ids.roles);
put_device(&rport->dev);
} else {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
}
kref_put(&tgt->kref, ibmvfc_release_tgt);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
break;
}
}
@@ -6791,16 +6791,16 @@ static void ibmvfc_rport_add_thread(struct work_struct *work)
kref_get(&tgt->kref);
nvme_rport = tgt->nvme_remote_port;
if (!nvme_rport) {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_tgt_add_nvme_rport(tgt);
} else {
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
if (IS_ENABLED(CONFIG_NVME_FC))
nvme_fc_rescan_remoteport(nvme_rport);
}
kref_put(&tgt->kref, ibmvfc_release_tgt);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
break;
}
}
@@ -6808,7 +6808,7 @@ static void ibmvfc_rport_add_thread(struct work_struct *work)
if (vhost->state == IBMVFC_ACTIVE)
vhost->scan_complete = 1;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
LEAVE;
}
@@ -6946,9 +6946,9 @@ static void ibmvfc_remove(struct vio_dev *vdev)
ENTER;
ibmvfc_remove_trace_file(&vhost->host->shost_dev.kobj, &ibmvfc_trace_attr);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_wait_while_resetting(vhost);
kthread_stop(vhost->work_thread);
@@ -6956,10 +6956,10 @@ static void ibmvfc_remove(struct vio_dev *vdev)
fc_remove_host(vhost->host);
scsi_remove_host(vhost->host);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_purge_requests(vhost, DID_ERROR);
list_splice_init(&vhost->purge, &purge);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_complete_purge(&purge);
ibmvfc_release_sub_crqs(vhost);
ibmvfc_release_crq_queue(vhost);
@@ -6986,10 +6986,10 @@ static int ibmvfc_resume(struct device *dev)
struct ibmvfc_host *vhost = dev_get_drvdata(dev);
struct vio_dev *vdev = to_vio_dev(dev);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
vio_disable_interrupts(vdev);
tasklet_schedule(&vhost->tasklet);
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
return 0;
}
diff --git a/drivers/scsi/ibmvscsi/ibmvfc-nvme.c b/drivers/scsi/ibmvscsi/ibmvfc-nvme.c
index 54f80b6265d4..9ac2671a3567 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc-nvme.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc-nvme.c
@@ -208,7 +208,7 @@ static void ibmvfc_nvme_ls_abort(struct nvme_fc_local_port *lport,
if (!vhost->logged_in || !evt)
return;
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
kref_get(&tgt->kref);
ibmvfc_init_event(evt, ibmvfc_sync_nvme_completion, IBMVFC_MAD_FORMAT);
ibmvfc_init_ls_abort(evt, ls_abort);
@@ -217,14 +217,14 @@ static void ibmvfc_nvme_ls_abort(struct nvme_fc_local_port *lport,
if (ibmvfc_send_event(evt, vhost, default_timeout))
goto out;
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
wait_for_completion(&evt->comp);
status = be16_to_cpu(rsp.mad_common.status);
- spin_lock_irqsave(vhost->host->host_lock, flags);
+ spin_lock_irqsave(&vhost->host->host_lock, flags);
ibmvfc_free_event(evt);
out:
- spin_unlock_irqrestore(vhost->host->host_lock, flags);
+ spin_unlock_irqrestore(&vhost->host->host_lock, flags);
ibmvfc_dbg(vhost, "ls_abort: cancel failed with rc=%x\n", status);
kref_put(&tgt->kref, ibmvfc_release_tgt);
}
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index 609bda730b3a..4ecd3db08875 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -785,13 +785,13 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
struct srp_event_struct *evt;
unsigned long flags;
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
while (!list_empty(&hostdata->sent)) {
evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list);
list_del(&evt->list);
timer_delete(&evt->timer);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
if (evt->cmnd) {
evt->cmnd->result = (error_code << 16);
unmap_cmd_data(&evt->iu.srp.cmd, evt,
@@ -802,9 +802,9 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
evt->done(evt);
free_event_struct(&evt->hostdata->pool, evt);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
}
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
}
/**
@@ -818,9 +818,9 @@ static void ibmvscsi_set_request_limit(struct ibmvscsi_host_data *hostdata, int
{
unsigned long flags;
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
atomic_set(&hostdata->request_limit, limit);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
}
/**
@@ -1221,9 +1221,9 @@ static int send_srp_login(struct ibmvscsi_host_data *hostdata)
*/
ibmvscsi_set_request_limit(hostdata, 0);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
dev_info(hostdata->dev, "sent SRP login\n");
return rc;
};
@@ -1317,10 +1317,10 @@ static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata)
req->common.length = cpu_to_be16(sizeof(hostdata->caps) -
sizeof(hostdata->caps.reserve));
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n");
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
};
/**
@@ -1373,9 +1373,9 @@ static int enable_fast_fail(struct ibmvscsi_host_data *hostdata)
fast_fail_mad->common.type = cpu_to_be32(VIOSRP_ENABLE_FAST_FAIL);
fast_fail_mad->common.length = cpu_to_be16(sizeof(*fast_fail_mad));
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
return rc;
}
@@ -1454,10 +1454,10 @@ static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
req->common.length = cpu_to_be16(sizeof(hostdata->madapter_info));
req->buffer = cpu_to_be64(hostdata->adapter_info_addr);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n");
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
};
/*
@@ -1502,7 +1502,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
/* First, find this command in our sent list so we can figure
* out the correct tag
*/
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
wait_switch = jiffies + (init_timeout * HZ);
do {
found_evt = NULL;
@@ -1514,13 +1514,13 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
}
if (!found_evt) {
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
return SUCCESS;
}
evt = get_event_struct(&hostdata->pool);
if (evt == NULL) {
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
sdev_printk(KERN_ERR, cmd->device,
"failed to allocate abort event\n");
return FAILED;
@@ -1548,12 +1548,12 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
if (rsp_rc != SCSI_MLQUEUE_HOST_BUSY)
break;
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
msleep(10);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
} while (time_before(jiffies, wait_switch));
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
if (rsp_rc != 0) {
sdev_printk(KERN_ERR, cmd->device,
@@ -1592,7 +1592,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
* The event is no longer in our list. Make sure it didn't
* complete while we were aborting
*/
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
found_evt = NULL;
list_for_each_entry(tmp_evt, &hostdata->sent, list) {
if (tmp_evt->cmnd == cmd) {
@@ -1602,7 +1602,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
}
if (found_evt == NULL) {
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
sdev_printk(KERN_INFO, cmd->device, "aborted task tag 0x%llx completed\n",
tsk_mgmt->task_tag);
return SUCCESS;
@@ -1616,7 +1616,7 @@ static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
unmap_cmd_data(&found_evt->iu.srp.cmd, found_evt,
found_evt->hostdata->dev);
free_event_struct(&found_evt->hostdata->pool, found_evt);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
atomic_inc(&hostdata->request_limit);
return SUCCESS;
}
@@ -1638,12 +1638,12 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
u16 lun = lun_from_dev(cmd->device);
unsigned long wait_switch = 0;
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
wait_switch = jiffies + (init_timeout * HZ);
do {
evt = get_event_struct(&hostdata->pool);
if (evt == NULL) {
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
sdev_printk(KERN_ERR, cmd->device,
"failed to allocate reset event\n");
return FAILED;
@@ -1670,12 +1670,12 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
if (rsp_rc != SCSI_MLQUEUE_HOST_BUSY)
break;
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
msleep(10);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
} while (time_before(jiffies, wait_switch));
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
if (rsp_rc != 0) {
sdev_printk(KERN_ERR, cmd->device,
@@ -1712,7 +1712,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
/* We need to find all commands for this LUN that have not yet been
* responded to, and fail them with DID_RESET
*/
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) {
if ((tmp_evt->cmnd) && (tmp_evt->cmnd->device == cmd->device)) {
if (tmp_evt->cmnd)
@@ -1729,7 +1729,7 @@ static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
tmp_evt->done(tmp_evt);
}
}
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
return SUCCESS;
}
@@ -1855,10 +1855,10 @@ static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
* Lock the host_lock before messing with these structures, since we
* are running in a task context
*/
- spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&evt_struct->hostdata->host->host_lock, flags);
list_del(&evt_struct->list);
free_event_struct(&evt_struct->hostdata->pool, evt_struct);
- spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&evt_struct->hostdata->host->host_lock, flags);
}
/**
@@ -1876,12 +1876,12 @@ static int ibmvscsi_sdev_configure(struct scsi_device *sdev,
struct Scsi_Host *shost = sdev->host;
unsigned long lock_flags = 0;
- spin_lock_irqsave(shost->host_lock, lock_flags);
+ spin_lock_irqsave(&shost->host_lock, lock_flags);
if (sdev->type == TYPE_DISK) {
sdev->allow_restart = 1;
blk_queue_rq_timeout(sdev->request_queue, 120 * HZ);
}
- spin_unlock_irqrestore(shost->host_lock, lock_flags);
+ spin_unlock_irqrestore(&shost->host_lock, lock_flags);
return 0;
}
@@ -2131,35 +2131,35 @@ static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata)
int rc;
char *action = "reset";
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
switch (hostdata->action) {
case IBMVSCSI_HOST_ACTION_UNBLOCK:
rc = 0;
break;
case IBMVSCSI_HOST_ACTION_RESET:
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
rc = ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
if (!rc)
rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0);
vio_enable_interrupts(to_vio_dev(hostdata->dev));
break;
case IBMVSCSI_HOST_ACTION_REENABLE:
action = "enable";
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
rc = ibmvscsi_reenable_crq_queue(&hostdata->queue, hostdata);
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
if (!rc)
rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0);
break;
case IBMVSCSI_HOST_ACTION_NONE:
default:
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
return;
}
hostdata->action = IBMVSCSI_HOST_ACTION_NONE;
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
if (rc) {
ibmvscsi_set_request_limit(hostdata, -1);
@@ -2191,9 +2191,9 @@ static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata)
unsigned long flags;
int rc;
- spin_lock_irqsave(hostdata->host->host_lock, flags);
+ spin_lock_irqsave(&hostdata->host->host_lock, flags);
rc = __ibmvscsi_work_to_do(hostdata);
- spin_unlock_irqrestore(hostdata->host->host_lock, flags);
+ spin_unlock_irqrestore(&hostdata->host->host_lock, flags);
return rc;
}
diff --git a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
index 61f682800765..e2af90b6da39 100644
--- a/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
+++ b/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.c
@@ -3757,9 +3757,8 @@ static int ibmvscsis_queue_data_in(struct se_cmd *se_cmd)
dev_err(&vscsi->dev, "srp_transfer_data failed: %d\n", rc);
se_cmd->scsi_sense_length = 18;
memset(se_cmd->sense_buffer, 0, se_cmd->scsi_sense_length);
- /* Logical Unit Communication Time-out asc/ascq = 0x0801 */
- scsi_build_sense_buffer(0, se_cmd->sense_buffer, MEDIUM_ERROR,
- 0x08, 0x01);
+ scsi_set_sense_buffer(0, se_cmd->sense_buffer, MEDIUM_ERROR,
+ LU_COMMUNICATION_TIMEOUT);
}
srp_build_response(vscsi, cmd, &len);
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c
index 0535252e77e3..680399bc866d 100644
--- a/drivers/scsi/imm.c
+++ b/drivers/scsi/imm.c
@@ -781,10 +781,10 @@ static void imm_interrupt(struct work_struct *work)
imm_pb_dismiss(dev);
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
dev->cur_cmd = NULL;
scsi_done(cmd);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return;
}
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 06fbe85dccfa..da2670cd7edf 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -2507,9 +2507,9 @@ static irqreturn_t i91u_intr(int irqno, void *dev_id)
unsigned long flags;
int r;
- spin_lock_irqsave(dev->host_lock, flags);
+ spin_lock_irqsave(&dev->host_lock, flags);
r = initio_isr((struct initio_host *)dev->hostdata);
- spin_unlock_irqrestore(dev->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host_lock, flags);
if (r)
return IRQ_HANDLED;
else
@@ -2635,9 +2635,9 @@ static int i91u_bus_reset(struct scsi_cmnd * cmnd)
host = (struct initio_host *) cmnd->device->host->hostdata;
- spin_lock_irq(cmnd->device->host->host_lock);
+ spin_lock_irq(&cmnd->device->host->host_lock);
initio_reset_scsi(host, 0);
- spin_unlock_irq(cmnd->device->host->host_lock);
+ spin_unlock_irq(&cmnd->device->host->host_lock);
return SUCCESS;
}
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index d207e5e81afe..1c74eec3a0c0 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -612,9 +612,9 @@ static void ipr_lock_and_done(struct ipr_cmnd *ipr_cmd)
unsigned long lock_flags;
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ipr_cmd->done(ipr_cmd);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
}
/**
@@ -1022,9 +1022,9 @@ static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
init_completion(&ipr_cmd->completion);
ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout);
- spin_unlock_irq(ioa_cfg->host->host_lock);
+ spin_unlock_irq(&ioa_cfg->host->host_lock);
wait_for_completion(&ipr_cmd->completion);
- spin_lock_irq(ioa_cfg->host->host_lock);
+ spin_lock_irq(&ioa_cfg->host->host_lock);
}
static int ipr_get_hrrq_index(struct ipr_ioa_cfg *ioa_cfg)
@@ -2594,7 +2594,7 @@ static void ipr_timeout(struct timer_list *t)
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->errors_logged++;
dev_err(&ioa_cfg->pdev->dev,
@@ -2606,7 +2606,7 @@ static void ipr_timeout(struct timer_list *t)
if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
}
@@ -2627,7 +2627,7 @@ static void ipr_oper_timeout(struct timer_list *t)
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->errors_logged++;
dev_err(&ioa_cfg->pdev->dev,
@@ -2642,7 +2642,7 @@ static void ipr_oper_timeout(struct timer_list *t)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
}
@@ -2893,7 +2893,7 @@ static int ipr_sdt_copy(struct ipr_ioa_cfg *ioa_cfg,
(ioa_dump->hdr.len + bytes_copied) < max_dump_size) {
if (ioa_dump->page_offset >= PAGE_SIZE ||
ioa_dump->page_offset == 0) {
- page = (__be32 *)__get_free_page(GFP_ATOMIC);
+ page = kmalloc(PAGE_SIZE, GFP_NOIO);
if (!page) {
ipr_trace;
@@ -2910,7 +2910,7 @@ static int ipr_sdt_copy(struct ipr_ioa_cfg *ioa_cfg,
rem_page_len = PAGE_SIZE - ioa_dump->page_offset;
cur_len = min(rem_len, rem_page_len);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->sdt_state == ABORT_DUMP) {
rc = -EIO;
} else {
@@ -2919,7 +2919,7 @@ static int ipr_sdt_copy(struct ipr_ioa_cfg *ioa_cfg,
&page[ioa_dump->page_offset / 4],
(cur_len / sizeof(u32)));
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
if (!rc) {
ioa_dump->page_offset += cur_len;
@@ -3060,17 +3060,17 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump)
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->sdt_state != READ_DUMP) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
if (ioa_cfg->sis64) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
ssleep(IPR_DUMP_DELAY_SECONDS);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
}
start_addr = readl(ioa_cfg->ioa_mailbox);
@@ -3078,7 +3078,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump)
if (!ioa_cfg->sis64 && !ipr_sdt_is_fmt2(start_addr)) {
dev_err(&ioa_cfg->pdev->dev,
"Invalid dump table format: %lx\n", start_addr);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
@@ -3135,7 +3135,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump)
rc, be32_to_cpu(sdt->hdr.state));
driver_dump->hdr.status = IPR_DUMP_STATUS_FAILED;
ioa_cfg->sdt_state = DUMP_OBTAINED;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
@@ -3151,7 +3151,7 @@ static void ipr_get_ioa_dump(struct ipr_ioa_cfg *ioa_cfg, struct ipr_dump *dump)
else
dump->driver_dump.hdr.len += max_num_entries * sizeof(struct ipr_sdt_entry);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
for (i = 0; i < num_entries; i++) {
if (ioa_dump->hdr.len > max_dump_size) {
@@ -3220,13 +3220,13 @@ static void ipr_release_dump(struct kref *kref)
int i;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->dump = NULL;
ioa_cfg->sdt_state = INACTIVE;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
for (i = 0; i < dump->ioa_dump.next_page_index; i++)
- free_page((unsigned long) dump->ioa_dump.ioa_data[i]);
+ kfree(dump->ioa_dump.ioa_data[i]);
vfree(dump->ioa_dump.ioa_data);
kfree(dump);
@@ -3244,13 +3244,13 @@ static void ipr_add_remove_thread(struct work_struct *work)
int did_work;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
restart:
do {
did_work = 0;
if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
@@ -3263,10 +3263,10 @@ restart:
list_move_tail(&res->queue, &ioa_cfg->free_res_q);
else
res->del_from_ml = 0;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
scsi_remove_device(sdev);
scsi_device_put(sdev);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
}
break;
}
@@ -3279,15 +3279,15 @@ restart:
target = res->target;
lun = res->lun;
res->add_to_ml = 0;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
scsi_add_device(ioa_cfg->host, bus, target, lun);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
goto restart;
}
}
ioa_cfg->scan_done = 1;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
kobject_uevent(&ioa_cfg->host->shost_dev.kobj, KOBJ_CHANGE);
LEAVE;
}
@@ -3311,44 +3311,44 @@ static void ipr_worker_thread(struct work_struct *work)
container_of(work, struct ipr_ioa_cfg, work_q);
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->sdt_state == READ_DUMP) {
dump = ioa_cfg->dump;
if (!dump) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
kref_get(&dump->kref);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
ipr_get_ioa_dump(ioa_cfg, dump);
kref_put(&dump->kref, ipr_release_dump);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->sdt_state == DUMP_OBTAINED && !ioa_cfg->dump_timeout)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
if (ioa_cfg->scsi_unblock) {
ioa_cfg->scsi_unblock = 0;
ioa_cfg->scsi_blocked = 0;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
scsi_unblock_requests(ioa_cfg->host);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->scsi_blocked)
scsi_block_requests(ioa_cfg->host);
}
if (!ioa_cfg->scan_enabled) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
schedule_work(&ioa_cfg->scsi_add_work_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
}
@@ -3375,10 +3375,10 @@ static ssize_t ipr_read_trace(struct file *filp, struct kobject *kobj,
unsigned long lock_flags = 0;
ssize_t ret;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ret = memory_read_from_buffer(buf, count, &off, ioa_cfg->trace,
IPR_TRACE_SIZE);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return ret;
}
@@ -3411,12 +3411,12 @@ static ssize_t ipr_show_fw_version(struct device *dev,
unsigned long lock_flags = 0;
int len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
len = snprintf(buf, PAGE_SIZE, "%02X%02X%02X%02X\n",
ucode_vpd->major_release, ucode_vpd->card_type,
ucode_vpd->minor_release[0],
ucode_vpd->minor_release[1]);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -3445,9 +3445,9 @@ static ssize_t ipr_show_log_level(struct device *dev,
unsigned long lock_flags = 0;
int len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->log_level);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -3469,9 +3469,9 @@ static ssize_t ipr_store_log_level(struct device *dev,
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
unsigned long lock_flags = 0;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->log_level = simple_strtoul(buf, NULL, 10);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return strlen(buf);
}
@@ -3509,31 +3509,31 @@ static ssize_t ipr_store_diagnostics(struct device *dev,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
while (ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
}
ioa_cfg->errors_logged = 0;
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
if (ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
/* Wait for a second for any errors to be logged */
msleep(1000);
} else {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return -EIO;
}
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->in_reset_reload || ioa_cfg->errors_logged)
rc = -EIO;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return rc;
}
@@ -3563,12 +3563,12 @@ static ssize_t ipr_show_adapter_state(struct device *dev,
unsigned long lock_flags = 0;
int len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead)
len = snprintf(buf, PAGE_SIZE, "offline\n");
else
len = snprintf(buf, PAGE_SIZE, "online\n");
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -3596,7 +3596,7 @@ static ssize_t ipr_store_adapter_state(struct device *dev,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead &&
!strncmp(buf, "online", 6)) {
for (i = 0; i < ioa_cfg->hrrq_num; i++) {
@@ -3609,7 +3609,7 @@ static ssize_t ipr_store_adapter_state(struct device *dev,
ioa_cfg->in_ioa_bringdown = 0;
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
return result;
@@ -3648,10 +3648,10 @@ static ssize_t ipr_store_reset_adapter(struct device *dev,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (!ioa_cfg->in_reset_reload)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
return result;
@@ -3683,9 +3683,9 @@ static ssize_t ipr_show_iopoll_weight(struct device *dev,
unsigned long lock_flags = 0;
int len;
- spin_lock_irqsave(shost->host_lock, lock_flags);
+ spin_lock_irqsave(&shost->host_lock, lock_flags);
len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->iopoll_weight);
- spin_unlock_irqrestore(shost->host_lock, lock_flags);
+ spin_unlock_irqrestore(&shost->host_lock, lock_flags);
return len;
}
@@ -3732,7 +3732,7 @@ static ssize_t ipr_store_iopoll_weight(struct device *dev,
irq_poll_disable(&ioa_cfg->hrrq[i].iopoll);
}
- spin_lock_irqsave(shost->host_lock, lock_flags);
+ spin_lock_irqsave(&shost->host_lock, lock_flags);
ioa_cfg->iopoll_weight = user_iopoll_weight;
if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) {
for (i = 1; i < ioa_cfg->hrrq_num; i++) {
@@ -3740,7 +3740,7 @@ static ssize_t ipr_store_iopoll_weight(struct device *dev,
ioa_cfg->iopoll_weight, ipr_iopoll);
}
}
- spin_unlock_irqrestore(shost->host_lock, lock_flags);
+ spin_unlock_irqrestore(&shost->host_lock, lock_flags);
return strlen(buf);
}
@@ -3939,15 +3939,15 @@ static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
{
unsigned long lock_flags;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
while (ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
}
if (ioa_cfg->ucode_sglist) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
dev_err(&ioa_cfg->pdev->dev,
"Microcode download already in progress\n");
return -EIO;
@@ -3958,7 +3958,7 @@ static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
DMA_TO_DEVICE);
if (!sglist->num_dma_sg) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
dev_err(&ioa_cfg->pdev->dev,
"Failed to map microcode download buffer!\n");
return -EIO;
@@ -3966,12 +3966,12 @@ static int ipr_update_ioa_ucode(struct ipr_ioa_cfg *ioa_cfg,
ioa_cfg->ucode_sglist = sglist;
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NORMAL);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->ucode_sglist = NULL;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
@@ -4072,9 +4072,9 @@ static ssize_t ipr_show_fw_type(struct device *dev,
unsigned long lock_flags = 0;
int len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->sis64);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4097,16 +4097,16 @@ static ssize_t ipr_read_async_err_log(struct file *filep, struct kobject *kobj,
unsigned long lock_flags = 0;
int ret;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q,
struct ipr_hostrcb, queue);
if (!hostrcb) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
ret = memory_read_from_buffer(buf, count, &off, &hostrcb->hcam,
sizeof(hostrcb->hcam));
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return ret;
}
@@ -4120,17 +4120,17 @@ static ssize_t ipr_next_async_err_log(struct file *filep, struct kobject *kobj,
struct ipr_hostrcb *hostrcb;
unsigned long lock_flags = 0;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
hostrcb = list_first_entry_or_null(&ioa_cfg->hostrcb_report_q,
struct ipr_hostrcb, queue);
if (!hostrcb) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return count;
}
/* Reclaim hostrcb before exit */
list_move_tail(&hostrcb->queue, &ioa_cfg->hostrcb_free_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return count;
}
@@ -4187,15 +4187,15 @@ static ssize_t ipr_read_dump(struct file *filp, struct kobject *kobj,
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
dump = ioa_cfg->dump;
if (ioa_cfg->sdt_state != DUMP_OBTAINED || !dump) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
kref_get(&dump->kref);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
if (off > dump->driver_dump.hdr.len) {
kref_put(&dump->kref, ipr_release_dump);
@@ -4298,10 +4298,10 @@ static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg)
kref_init(&dump->kref);
dump->ioa_cfg = ioa_cfg;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (INACTIVE != ioa_cfg->sdt_state) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
vfree(dump->ioa_dump.ioa_data);
kfree(dump);
return 0;
@@ -4313,7 +4313,7 @@ static int ipr_alloc_dump(struct ipr_ioa_cfg *ioa_cfg)
ioa_cfg->dump_taken = 1;
schedule_work(&ioa_cfg->work_q);
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
@@ -4332,15 +4332,15 @@ static int ipr_free_dump(struct ipr_ioa_cfg *ioa_cfg)
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
dump = ioa_cfg->dump;
if (!dump) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
ioa_cfg->dump = NULL;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
kref_put(&dump->kref, ipr_release_dump);
@@ -4429,11 +4429,11 @@ static ssize_t ipr_show_adapter_handle(struct device *dev, struct device_attribu
unsigned long lock_flags = 0;
ssize_t len = -ENXIO;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res)
len = snprintf(buf, PAGE_SIZE, "%08X\n", res->res_handle);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4464,7 +4464,7 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut
ssize_t len = -ENXIO;
char buffer[IPR_MAX_RES_PATH_LENGTH];
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res && ioa_cfg->sis64)
len = snprintf(buf, PAGE_SIZE, "%s\n",
@@ -4474,7 +4474,7 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut
len = snprintf(buf, PAGE_SIZE, "%d:%d:%d:%d\n", ioa_cfg->host->host_no,
res->bus, res->target, res->lun);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4503,14 +4503,14 @@ static ssize_t ipr_show_device_id(struct device *dev, struct device_attribute *a
unsigned long lock_flags = 0;
ssize_t len = -ENXIO;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res && ioa_cfg->sis64)
len = snprintf(buf, PAGE_SIZE, "0x%llx\n", be64_to_cpu(res->dev_id));
else if (res)
len = snprintf(buf, PAGE_SIZE, "0x%llx\n", res->lun_wwn);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4539,13 +4539,13 @@ static ssize_t ipr_show_resource_type(struct device *dev, struct device_attribut
unsigned long lock_flags = 0;
ssize_t len = -ENXIO;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res)
len = snprintf(buf, PAGE_SIZE, "%x\n", res->type);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4575,13 +4575,13 @@ static ssize_t ipr_show_raw_mode(struct device *dev,
unsigned long lock_flags = 0;
ssize_t len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res)
len = snprintf(buf, PAGE_SIZE, "%d\n", res->raw_mode);
else
len = -ENXIO;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4605,7 +4605,7 @@ static ssize_t ipr_store_raw_mode(struct device *dev,
unsigned long lock_flags = 0;
ssize_t len;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;
if (res) {
if (ipr_is_af_dasd_device(res)) {
@@ -4618,7 +4618,7 @@ static ssize_t ipr_store_raw_mode(struct device *dev,
len = -EINVAL;
} else
len = -ENXIO;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return len;
}
@@ -4759,13 +4759,13 @@ static void ipr_sdev_destroy(struct scsi_device *sdev)
ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *) sdev->hostdata;
if (res) {
sdev->hostdata = NULL;
res->sdev = NULL;
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
}
/**
@@ -4786,7 +4786,7 @@ static int ipr_sdev_configure(struct scsi_device *sdev,
unsigned long lock_flags = 0;
char buffer[IPR_MAX_RES_PATH_LENGTH];
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = sdev->hostdata;
if (res) {
if (ipr_is_af_dasd_device(res))
@@ -4802,7 +4802,7 @@ static int ipr_sdev_configure(struct scsi_device *sdev,
IPR_VSET_RW_TIMEOUT);
lim->max_hw_sectors = IPR_VSET_MAX_SECTORS;
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->sis64)
sdev_printk(KERN_INFO, sdev, "Resource path: %s\n",
@@ -4810,7 +4810,7 @@ static int ipr_sdev_configure(struct scsi_device *sdev,
res->res_path, buffer, sizeof(buffer)));
return 0;
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return 0;
}
@@ -4835,7 +4835,7 @@ static int ipr_sdev_init(struct scsi_device *sdev)
sdev->hostdata = NULL;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
res = ipr_find_sdev(sdev);
if (res) {
@@ -4849,12 +4849,12 @@ static int ipr_sdev_init(struct scsi_device *sdev)
if (ipr_is_gata(res)) {
sdev_printk(KERN_ERR, sdev, "SATA devices are no longer "
"supported by this driver. Skipping device.\n");
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return -ENXIO;
}
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return rc;
}
@@ -4970,7 +4970,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd *cmd)
ENTER;
ioa_cfg = (struct ipr_ioa_cfg *) cmd->device->host->hostdata;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (!ioa_cfg->in_reset_reload && !ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead) {
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_ABBREV);
@@ -4981,9 +4981,9 @@ static int ipr_eh_host_reset(struct scsi_cmnd *cmd)
ioa_cfg->sdt_state = GET_DUMP;
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
/* If we got hit with a host reset while we were already resetting
the adapter for some reason, and the reset failed. */
@@ -4992,7 +4992,7 @@ static int ipr_eh_host_reset(struct scsi_cmnd *cmd)
rc = FAILED;
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
return rc;
}
@@ -5092,9 +5092,9 @@ static int ipr_eh_dev_reset(struct scsi_cmnd *cmd)
if (!res)
return FAILED;
- spin_lock_irq(cmd->device->host->host_lock);
+ spin_lock_irq(&cmd->device->host->host_lock);
rc = __ipr_eh_dev_reset(cmd);
- spin_unlock_irq(cmd->device->host->host_lock);
+ spin_unlock_irq(&cmd->device->host->host_lock);
if (rc == SUCCESS)
rc = ipr_wait_for_ops(ioa_cfg, cmd->device, ipr_match_lun);
@@ -5158,9 +5158,9 @@ static void ipr_abort_timeout(struct timer_list *t)
unsigned long lock_flags = 0;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return;
}
@@ -5175,7 +5175,7 @@ static void ipr_abort_timeout(struct timer_list *t)
cmd_pkt->cdb[2] = IPR_RESET_TYPE_SELECT | IPR_BUS_RESET;
ipr_do_req(reset_cmd, ipr_bus_reset_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
}
@@ -5281,12 +5281,12 @@ static int ipr_scan_finished(struct Scsi_Host *shost, unsigned long elapsed_time
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) shost->hostdata;
int rc = 0;
- spin_lock_irqsave(shost->host_lock, lock_flags);
+ spin_lock_irqsave(&shost->host_lock, lock_flags);
if (ioa_cfg->hrrq[IPR_INIT_HRRQ].ioa_is_dead || ioa_cfg->scan_done)
rc = 1;
if ((elapsed_time/HZ) > (ioa_cfg->transop_timeout * 2))
rc = 1;
- spin_unlock_irqrestore(shost->host_lock, lock_flags);
+ spin_unlock_irqrestore(&shost->host_lock, lock_flags);
return rc;
}
@@ -5307,9 +5307,9 @@ static int ipr_eh_abort(struct scsi_cmnd *scsi_cmd)
ioa_cfg = (struct ipr_ioa_cfg *) scsi_cmd->device->host->hostdata;
- spin_lock_irqsave(scsi_cmd->device->host->host_lock, flags);
+ 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);
+ spin_unlock_irqrestore(&scsi_cmd->device->host->host_lock, flags);
if (rc == SUCCESS)
rc = ipr_wait_for_ops(ioa_cfg, scsi_cmd->device, ipr_match_lun);
@@ -6222,11 +6222,11 @@ static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
} else {
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
spin_lock(&ipr_cmd->hrrq->_lock);
ipr_erp_start(ioa_cfg, ipr_cmd);
spin_unlock(&ipr_cmd->hrrq->_lock);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
}
}
@@ -6383,9 +6383,9 @@ static const char *ipr_ioa_info(struct Scsi_Host *host)
ioa_cfg = (struct ipr_ioa_cfg *) host->hostdata;
- spin_lock_irqsave(host->host_lock, lock_flags);
+ spin_lock_irqsave(&host->host_lock, lock_flags);
sprintf(buffer, "IBM %X Storage Adapter", ioa_cfg->type);
- spin_unlock_irqrestore(host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&host->host_lock, lock_flags);
return buffer;
}
@@ -7480,14 +7480,14 @@ static void ipr_reset_timer_done(struct timer_list *t)
struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
unsigned long lock_flags = 0;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->reset_cmd == ipr_cmd) {
list_del(&ipr_cmd->queue);
ipr_cmd->done(ipr_cmd);
}
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
}
/**
@@ -8023,10 +8023,10 @@ static void ipr_reset_reset_work(struct work_struct *work)
msleep(jiffies_to_msecs(IPR_PCI_RESET_TIMEOUT));
pci_set_pcie_reset_state(pdev, pcie_deassert_reset);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->reset_cmd == ipr_cmd)
ipr_reset_ioa_job(ipr_cmd);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
LEAVE;
}
@@ -8588,10 +8588,10 @@ static pci_ers_result_t ipr_pci_mmio_enabled(struct pci_dev *pdev)
unsigned long flags = 0;
struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
if (!ioa_cfg->probe_done)
pci_save_state(pdev);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
return PCI_ERS_RESULT_NEED_RESET;
}
@@ -8608,10 +8608,10 @@ static void ipr_pci_frozen(struct pci_dev *pdev)
unsigned long flags = 0;
struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
if (ioa_cfg->probe_done)
_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_freeze, IPR_SHUTDOWN_NONE);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
}
/**
@@ -8627,7 +8627,7 @@ static pci_ers_result_t ipr_pci_slot_reset(struct pci_dev *pdev)
unsigned long flags = 0;
struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
if (ioa_cfg->probe_done) {
if (ioa_cfg->needs_warm_reset)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
@@ -8636,7 +8636,7 @@ static pci_ers_result_t ipr_pci_slot_reset(struct pci_dev *pdev)
IPR_SHUTDOWN_NONE);
} else
wake_up_all(&ioa_cfg->eeh_wait_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
return PCI_ERS_RESULT_RECOVERED;
}
@@ -8653,7 +8653,7 @@ static void ipr_pci_perm_failure(struct pci_dev *pdev)
struct ipr_ioa_cfg *ioa_cfg = pci_get_drvdata(pdev);
int i;
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
if (ioa_cfg->probe_done) {
if (ioa_cfg->sdt_state == WAIT_FOR_DUMP)
ioa_cfg->sdt_state = ABORT_DUMP;
@@ -8668,7 +8668,7 @@ static void ipr_pci_perm_failure(struct pci_dev *pdev)
ipr_initiate_ioa_reset(ioa_cfg, IPR_SHUTDOWN_NONE);
} else
wake_up_all(&ioa_cfg->eeh_wait_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
}
/**
@@ -8712,7 +8712,7 @@ static void ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
unsigned long host_lock_flags = 0;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, host_lock_flags);
dev_dbg(&ioa_cfg->pdev->dev, "ioa_cfg adx: 0x%p\n", ioa_cfg);
ioa_cfg->probe_done = 1;
if (ioa_cfg->needs_hard_reset) {
@@ -8721,7 +8721,7 @@ static void ipr_probe_ioa_part2(struct ipr_ioa_cfg *ioa_cfg)
} else
_ipr_initiate_ioa_reset(ioa_cfg, ipr_reset_enable_ioa,
IPR_SHUTDOWN_NONE);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, host_lock_flags);
LEAVE;
}
@@ -9196,7 +9196,7 @@ static void ipr_init_ioa_cfg(struct ipr_ioa_cfg *ioa_cfg,
INIT_LIST_HEAD(&ioa_cfg->hrrq[i].hrrq_pending_q);
spin_lock_init(&ioa_cfg->hrrq[i]._lock);
if (i == 0)
- ioa_cfg->hrrq[i].lock = ioa_cfg->host->host_lock;
+ ioa_cfg->hrrq[i].lock = &ioa_cfg->host->host_lock;
else
ioa_cfg->hrrq[i].lock = &ioa_cfg->hrrq[i]._lock;
}
@@ -9291,12 +9291,12 @@ static irqreturn_t ipr_test_intr(int irq, void *devp)
unsigned long lock_flags = 0;
dev_info(&ioa_cfg->pdev->dev, "Received IRQ : %d\n", irq);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ioa_cfg->msi_received = 1;
wake_up(&ioa_cfg->msi_wait_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
return IRQ_HANDLED;
}
@@ -9320,13 +9320,13 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
init_waitqueue_head(&ioa_cfg->msi_wait_q);
ioa_cfg->msi_received = 0;
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.clr_interrupt_mask_reg32);
readl(ioa_cfg->regs.sense_interrupt_mask_reg);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
rc = request_irq(irq, ipr_test_intr, 0, IPR_NAME, ioa_cfg);
if (rc) {
@@ -9338,7 +9338,7 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
writel(IPR_PCII_IO_DEBUG_ACKNOWLEDGE, ioa_cfg->regs.sense_interrupt_reg32);
readl(ioa_cfg->regs.sense_interrupt_reg);
wait_event_timeout(ioa_cfg->msi_wait_q, ioa_cfg->msi_received, HZ);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
if (!ioa_cfg->msi_received) {
@@ -9348,7 +9348,7 @@ static int ipr_test_msi(struct ipr_ioa_cfg *ioa_cfg, struct pci_dev *pdev)
} else if (ipr_debug)
dev_info(&pdev->dev, "MSI test succeeded.\n");
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
free_irq(irq, ioa_cfg);
@@ -9573,9 +9573,9 @@ static int ipr_probe_ioa(struct pci_dev *pdev,
if (interrupts & IPR_PCII_IOA_UNIT_CHECKED)
ioa_cfg->ioa_unit_checked = 1;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
ipr_mask_and_clear_interrupts(ioa_cfg, ~IPR_PCII_IOA_TRANS_TO_OPER);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
if (pdev->msi_enabled || pdev->msix_enabled) {
name_msi_vectors(ioa_cfg);
@@ -9680,11 +9680,11 @@ static void __ipr_remove(struct pci_dev *pdev)
unsigned long driver_lock_flags;
ENTER;
- spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, host_lock_flags);
while (ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, host_lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, host_lock_flags);
}
for (i = 0; i < ioa_cfg->hrrq_num; i++) {
@@ -9695,13 +9695,13 @@ static void __ipr_remove(struct pci_dev *pdev)
wmb();
ipr_initiate_ioa_bringdown(ioa_cfg, IPR_SHUTDOWN_NORMAL);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, host_lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
flush_work(&ioa_cfg->work_q);
if (ioa_cfg->reset_work_q)
flush_workqueue(ioa_cfg->reset_work_q);
INIT_LIST_HEAD(&ioa_cfg->used_res_q);
- spin_lock_irqsave(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, host_lock_flags);
spin_lock_irqsave(&ipr_driver_lock, driver_lock_flags);
list_del(&ioa_cfg->queue);
@@ -9709,7 +9709,7 @@ static void __ipr_remove(struct pci_dev *pdev)
if (ioa_cfg->sdt_state == ABORT_DUMP)
ioa_cfg->sdt_state = WAIT_FOR_DUMP;
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, host_lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, host_lock_flags);
ipr_free_all_resources(ioa_cfg);
@@ -9807,10 +9807,10 @@ static int ipr_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
__ipr_remove(pdev);
return rc;
}
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
ioa_cfg->scan_enabled = 1;
schedule_work(&ioa_cfg->work_q);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
ioa_cfg->iopoll_weight = ioa_cfg->chip_cfg->iopoll_weight;
@@ -9843,7 +9843,7 @@ static void ipr_shutdown(struct pci_dev *pdev)
enum ipr_shutdown_type shutdown_type = IPR_SHUTDOWN_NORMAL;
int i;
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
if (ioa_cfg->iopoll_weight && ioa_cfg->sis64 && ioa_cfg->nvectors > 1) {
ioa_cfg->iopoll_weight = 0;
for (i = 1; i < ioa_cfg->hrrq_num; i++)
@@ -9851,16 +9851,16 @@ static void ipr_shutdown(struct pci_dev *pdev)
}
while (ioa_cfg->in_reset_reload) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
- spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, lock_flags);
}
if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64)
shutdown_type = IPR_SHUTDOWN_QUIESCE;
ipr_initiate_ioa_bringdown(ioa_cfg, shutdown_type);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, lock_flags);
wait_event(ioa_cfg->reset_wait_q, !ioa_cfg->in_reset_reload);
if (ipr_fast_reboot && system_state == SYSTEM_RESTART && ioa_cfg->sis64) {
ipr_free_irqs(ioa_cfg);
@@ -10030,10 +10030,10 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf)
spin_lock_irqsave(&ipr_driver_lock, driver_lock_flags);
list_for_each_entry(ioa_cfg, &ipr_ioa_head, queue) {
- spin_lock_irqsave(ioa_cfg->host->host_lock, flags);
+ spin_lock_irqsave(&ioa_cfg->host->host_lock, flags);
if (!ioa_cfg->hrrq[IPR_INIT_HRRQ].allow_cmds ||
(ipr_fast_reboot && event == SYS_RESTART && ioa_cfg->sis64)) {
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
continue;
}
@@ -10044,7 +10044,7 @@ static int ipr_halt(struct notifier_block *nb, ulong event, void *buf)
ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
- spin_unlock_irqrestore(ioa_cfg->host->host_lock, flags);
+ spin_unlock_irqrestore(&ioa_cfg->host->host_lock, flags);
}
spin_unlock_irqrestore(&ipr_driver_lock, driver_lock_flags);
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
index 41ed73966a48..45c5b9acb664 100644
--- a/drivers/scsi/ips.c
+++ b/drivers/scsi/ips.c
@@ -794,7 +794,7 @@ int ips_eh_abort(struct scsi_cmnd *SC)
if (!ha->active)
return (FAILED);
- spin_lock(host->host_lock);
+ spin_lock(&host->host_lock);
/* See if the command is on the copp queue */
item = ha->copp_waitlist.head;
@@ -815,7 +815,7 @@ int ips_eh_abort(struct scsi_cmnd *SC)
ret = (FAILED);
}
- spin_unlock(host->host_lock);
+ spin_unlock(&host->host_lock);
return ret;
}
@@ -999,9 +999,9 @@ static int ips_eh_reset(struct scsi_cmnd *SC)
{
int rc;
- spin_lock_irq(SC->device->host->host_lock);
+ spin_lock_irq(&SC->device->host->host_lock);
rc = __ips_eh_reset(SC);
- spin_unlock_irq(SC->device->host->host_lock);
+ spin_unlock_irq(&SC->device->host->host_lock);
return rc;
}
@@ -1221,16 +1221,16 @@ do_ipsintr(int irq, void *dev_id)
return IRQ_HANDLED;
}
- spin_lock(host->host_lock);
+ spin_lock(&host->host_lock);
if (!ha->active) {
- spin_unlock(host->host_lock);
+ spin_unlock(&host->host_lock);
return IRQ_HANDLED;
}
irqstatus = (*ha->func.intr) (ha);
- spin_unlock(host->host_lock);
+ spin_unlock(&host->host_lock);
/* start the next command */
ips_next(ha, IPS_INTR_ON);
@@ -2524,7 +2524,7 @@ ips_next(ips_ha_t * ha, int intr)
* this command won't time out
*/
if (intr == IPS_INTR_ON)
- spin_lock(host->host_lock);
+ spin_lock(&host->host_lock);
if ((ha->subsys->param[3] & 0x300000)
&& (ha->scb_activelist.count == 0)) {
@@ -2548,14 +2548,14 @@ ips_next(ips_ha_t * ha, int intr)
item = ips_removeq_copp_head(&ha->copp_waitlist);
ha->num_ioctl++;
if (intr == IPS_INTR_ON)
- spin_unlock(host->host_lock);
+ spin_unlock(&host->host_lock);
scb->scsi_cmd = item->scsi_cmd;
kfree(item);
ret = ips_make_passthru(ha, scb->scsi_cmd, scb, intr);
if (intr == IPS_INTR_ON)
- spin_lock(host->host_lock);
+ spin_lock(&host->host_lock);
switch (ret) {
case IPS_FAILURE:
if (scb->scsi_cmd) {
@@ -2625,7 +2625,7 @@ ips_next(ips_ha_t * ha, int intr)
SC = ips_removeq_wait(&ha->scb_waitlist, q);
if (intr == IPS_INTR_ON)
- spin_unlock(host->host_lock); /* Unlock HA after command is taken off queue */
+ spin_unlock(&host->host_lock); /* Unlock HA after command is taken off queue */
SC->result = DID_OK;
SC->host_scribble = NULL;
@@ -2682,7 +2682,7 @@ ips_next(ips_ha_t * ha, int intr)
scb->dcdb.transfer_length = 0;
}
if (intr == IPS_INTR_ON)
- spin_lock(host->host_lock);
+ spin_lock(&host->host_lock);
ret = ips_send_cmd(ha, scb);
@@ -2721,7 +2721,7 @@ ips_next(ips_ha_t * ha, int intr)
} /* end while */
if (intr == IPS_INTR_ON)
- spin_unlock(host->host_lock);
+ spin_unlock(&host->host_lock);
}
/****************************************************************************/
diff --git a/drivers/scsi/leapraid/leapraid_func.h b/drivers/scsi/leapraid/leapraid_func.h
index e8a0815bf95f..a16390a71662 100644
--- a/drivers/scsi/leapraid/leapraid_func.h
+++ b/drivers/scsi/leapraid/leapraid_func.h
@@ -113,7 +113,6 @@
#define DESC_FORMAT_THRESHOLD 0x72
#define SENSE_KEY_MASK 0x0F
#define SCSI_SENSE_RESPONSE_CODE_MASK 0x7F
-#define ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5D
#define LEAPRAID_LARGE_DISK_THRESHOLD 0x200000UL
#define LEAPRAID_LARGE_DISK_HEADS 255
#define LEAPRAID_LARGE_DISK_SECTORS 63
@@ -126,12 +125,6 @@
#define LEAPRAID_SCSI_HOST_SHIFT 16
#define LEAPRAID_SCSI_DRIVER_SHIFT 24
-/* SCSI ASC/ASCQ definitions. */
-#define LEAPRAID_SCSI_ASCQ_DEFAULT 0x00
-#define LEAPRAID_SCSI_ASC_POWER_ON_RESET 0x29
-#define LEAPRAID_SCSI_ASC_INVALID_CMD_CODE 0x20
-#define LEAPRAID_SCSI_ASCQ_POWER_ON_RESET 0x07
-
/* VPD Page 0x89 (ATA Information). */
#define LEAPRAID_VPD_PAGE_ATA_INFO 0x89
#define LEAPRAID_VPD_PG89_MAX_LEN 255
diff --git a/drivers/scsi/leapraid/leapraid_os.c b/drivers/scsi/leapraid/leapraid_os.c
index 507f11862276..da597eb99377 100644
--- a/drivers/scsi/leapraid/leapraid_os.c
+++ b/drivers/scsi/leapraid/leapraid_os.c
@@ -382,9 +382,8 @@ static void leapraid_handle_data_underrun(
} else if (!xfer_cnt && scmd->cmnd[0] == REPORT_LUNS) {
scsiio_rep->scsi_state = LEAPRAID_SCSI_STATE_AUTOSENSE_VALID;
scsiio_rep->scsi_status = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST,
- LEAPRAID_SCSI_ASC_INVALID_CMD_CODE,
- LEAPRAID_SCSI_ASCQ_DEFAULT);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_COMMAND_OP_CODE);
}
}
@@ -515,8 +514,9 @@ static void leapraid_scsiio_done_dispatch(
&sshdr))
dev_warn(&adapter->pdev->dev,
"Sense: key=0x%x asc=0x%x ascq=0x%x\n",
- sshdr.sense_key, sshdr.asc,
- sshdr.ascq);
+ sshdr.sense_key,
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
else
dev_warn(&adapter->pdev->dev,
"Sense: Invalid sense data\n");
@@ -810,9 +810,8 @@ static bool leapraid_should_queuecommand(struct leapraid_adapter *adapter,
if (sdev_priv->block &&
scsi_get_host_state(scmd->device->host) == SHOST_RECOVERY &&
scmd->cmnd[0] == TEST_UNIT_READY) {
- scsi_build_sense(scmd, 0, UNIT_ATTENTION,
- LEAPRAID_SCSI_ASC_POWER_ON_RESET,
- LEAPRAID_SCSI_ASCQ_POWER_ON_RESET);
+ scsi_set_sense(scmd, 0, UNIT_ATTENTION,
+ I_T_NEXUS_LOSS_OCCURRED);
goto scsiio_done;
}
diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
index a5139e43ca4c..60a675aa5a99 100644
--- a/drivers/scsi/libfc/fc_fcp.c
+++ b/drivers/scsi/libfc/fc_fcp.c
@@ -358,7 +358,7 @@ static void fc_fcp_can_queue_ramp_up(struct fc_lport *lport)
unsigned long flags;
int can_queue;
- spin_lock_irqsave(lport->host->host_lock, flags);
+ spin_lock_irqsave(&lport->host->host_lock, flags);
if (si->last_can_queue_ramp_up_time &&
(time_before(jiffies, si->last_can_queue_ramp_up_time +
@@ -381,7 +381,7 @@ static void fc_fcp_can_queue_ramp_up(struct fc_lport *lport)
"can_queue to %d.\n", can_queue);
unlock:
- spin_unlock_irqrestore(lport->host->host_lock, flags);
+ spin_unlock_irqrestore(&lport->host->host_lock, flags);
}
/**
@@ -401,7 +401,7 @@ static bool fc_fcp_can_queue_ramp_down(struct fc_lport *lport)
int can_queue;
bool changed = false;
- spin_lock_irqsave(lport->host->host_lock, flags);
+ spin_lock_irqsave(&lport->host->host_lock, flags);
if (si->last_can_queue_ramp_down_time &&
(time_before(jiffies, si->last_can_queue_ramp_down_time +
@@ -418,7 +418,7 @@ static bool fc_fcp_can_queue_ramp_down(struct fc_lport *lport)
changed = true;
unlock:
- spin_unlock_irqrestore(lport->host->host_lock, flags);
+ spin_unlock_irqrestore(&lport->host->host_lock, flags);
return changed;
}
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index 5cbc51899de0..2ab55d1e6652 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -892,7 +892,8 @@ static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
ascq = session->tt->check_protection(task, &sector);
if (ascq) {
- scsi_build_sense(sc, 1, ILLEGAL_REQUEST, 0x10, ascq);
+ scsi_set_sense(sc, 1, ILLEGAL_REQUEST,
+ scsi_sense_code(ASC_ID_CRC_OR_ECC_ERROR, ascq));
scsi_set_sense_information(sc->sense_buffer,
SCSI_SENSE_BUFFERSIZE,
sector);
@@ -1142,13 +1143,15 @@ static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
spin_unlock(&conn->session->frwd_lock);
spin_lock(&conn->session->back_lock);
} else {
- struct iscsi_task *task;
+ struct iscsi_task *task = NULL;
/*
* Our nop as ping got dropped. We know the target
* and transport are ok so just clean up
*/
- task = iscsi_itt_to_task(conn, rejected_pdu.itt);
- if (!task) {
+ if (!iscsi_verify_itt(conn, rejected_pdu.itt))
+ task = iscsi_itt_to_task(conn, rejected_pdu.itt);
+ if (!task || task->state == ISCSI_TASK_FREE ||
+ task->sc) {
iscsi_conn_printk(KERN_ERR, conn,
"Invalid pdu reject. Could "
"not lookup rejected task.\n");
@@ -1191,7 +1194,7 @@ struct iscsi_task *iscsi_itt_to_task(struct iscsi_conn *conn, itt_t itt)
session->tt->parse_pdu_itt(conn, itt, &i, NULL);
else
i = get_itt(itt);
- if (i >= session->cmds_max)
+ if (i < 0 || i >= session->cmds_max)
return NULL;
return session->cmds[i];
@@ -1284,7 +1287,7 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
case ISCSI_OP_SCSI_TMFUNC_RSP:
case ISCSI_OP_NOOP_IN:
task = iscsi_itt_to_task(conn, hdr->itt);
- if (!task)
+ if (!task || task->state == ISCSI_TASK_FREE || task->sc)
return ISCSI_ERR_BAD_ITT;
break;
default:
@@ -1384,7 +1387,7 @@ int iscsi_verify_itt(struct iscsi_conn *conn, itt_t itt)
return ISCSI_ERR_BAD_ITT;
}
- if (i >= session->cmds_max) {
+ if (i < 0 || i >= session->cmds_max) {
iscsi_conn_printk(KERN_ERR, conn,
"received invalid itt index %u (max cmds "
"%u.\n", i, session->cmds_max);
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
index 811c9eb4fef1..26c2099c28b9 100644
--- a/drivers/scsi/libsas/sas_expander.c
+++ b/drivers/scsi/libsas/sas_expander.c
@@ -62,7 +62,11 @@ static int smp_execute_task_sg(struct domain_device *dev,
to_sas_internal(dev->port->ha->shost->transportt);
struct sas_ha_struct *ha = dev->port->ha;
- pm_runtime_get_sync(ha->dev);
+ /*
+ * Non-blocking: a sync resume here would deadlock against
+ * sas_drain_work() during HA resume.
+ */
+ pm_runtime_get_noresume(ha->dev);
mutex_lock(&dev->ex_dev.cmd_mutex);
for (retry = 0; retry < 3; retry++) {
if (test_bit(SAS_DEV_GONE, &dev->state)) {
@@ -135,7 +139,7 @@ static int smp_execute_task_sg(struct domain_device *dev,
}
}
mutex_unlock(&dev->ex_dev.cmd_mutex);
- pm_runtime_put_sync(ha->dev);
+ pm_runtime_put(ha->dev);
BUG_ON(retry == 3 && task != NULL);
sas_free_task(task);
@@ -2222,6 +2226,11 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
goto out;
}
+ /* The host may have autosuspended, resume it here. */
+ ret = pm_runtime_resume_and_get(dev->port->ha->dev);
+ if (ret)
+ goto out;
+
ret = smp_execute_task_sg(dev, job->request_payload.sg_list,
job->reply_payload.sg_list);
if (ret >= 0) {
@@ -2229,6 +2238,7 @@ void sas_smp_handler(struct bsg_job *job, struct Scsi_Host *shost,
rcvlen = job->reply_payload.payload_len - ret;
ret = 0;
}
+ pm_runtime_put(dev->port->ha->dev);
out:
bsg_job_done(job, ret, rcvlen);
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
index 97ac3db5dccb..76517c8f0684 100644
--- a/drivers/scsi/libsas/sas_scsi_host.c
+++ b/drivers/scsi/libsas/sas_scsi_host.c
@@ -436,13 +436,13 @@ int sas_eh_abort_handler(struct scsi_cmnd *cmd)
if (!i->dft->lldd_abort_task)
return FAILED;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
/* We cannot do async aborts for SATA devices */
if (dev_is_sata(dev) && !host->host_eh_scheduled) {
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return FAILED;
}
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
if (task)
res = i->dft->lldd_abort_task(task);
@@ -714,9 +714,9 @@ void sas_scsi_recover_host(struct Scsi_Host *shost)
retry:
tries++;
retry = true;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
list_splice_init(&shost->eh_cmd_q, &eh_work_q);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
pr_notice("Enter %s busy: %d failed: %d\n",
__func__, scsi_host_busy(shost), shost->host_failed);
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
index 52fc5058976d..6f6394a0047c 100644
--- a/drivers/scsi/lpfc/lpfc_els.c
+++ b/drivers/scsi/lpfc/lpfc_els.c
@@ -7917,15 +7917,15 @@ lpfc_els_flush_rscn(struct lpfc_vport *vport)
struct lpfc_hba *phba = vport->phba;
int i;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (vport->fc_rscn_flush) {
/* Another thread is walking fc_rscn_id_list on this vport */
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return;
}
/* Indicate we are walking lpfc_els_flush_rscn on this vport */
vport->fc_rscn_flush = 1;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
lpfc_in_buf_free(phba, vport->fc_rscn_id_list[i]);
@@ -7933,9 +7933,9 @@ lpfc_els_flush_rscn(struct lpfc_vport *vport)
}
clear_bit(FC_RSCN_MODE, &vport->fc_flag);
clear_bit(FC_RSCN_DISCOVERY, &vport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->fc_rscn_id_cnt = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
lpfc_can_disctmo(vport);
/* Indicate we are done walking this fc_rscn_id_list */
vport->fc_rscn_flush = 0;
@@ -7972,15 +7972,15 @@ lpfc_rscn_payload_check(struct lpfc_vport *vport, uint32_t did)
if (test_bit(FC_RSCN_DISCOVERY, &vport->fc_flag))
return did;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (vport->fc_rscn_flush) {
/* Another thread is walking fc_rscn_id_list on this vport */
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return 0;
}
/* Indicate we are walking fc_rscn_id_list on this vport */
vport->fc_rscn_flush = 1;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
for (i = 0; i < vport->fc_rscn_id_cnt; i++) {
lp = vport->fc_rscn_id_list[i]->virt;
payload_len = be32_to_cpu(*lp++ & ~ELS_CMD_MASK);
@@ -8234,10 +8234,10 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
}
}
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (vport->fc_rscn_flush) {
/* Another thread is walking fc_rscn_id_list on this vport */
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_RSCN_DISCOVERY, &vport->fc_flag);
/* Send back ACC */
lpfc_els_rsp_acc(vport, ELS_CMD_ACC, cmdiocb, ndlp, NULL);
@@ -8245,7 +8245,7 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
}
/* Indicate we are walking fc_rscn_id_list on this vport */
vport->fc_rscn_flush = 1;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
/* Get the array count after successfully have the token */
rscn_cnt = vport->fc_rscn_id_cnt;
/* If we are already processing an RSCN, save the received
@@ -8538,14 +8538,14 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
* The vport state should go to LPFC_FLOGI only
* AFTER we issue a FLOGI, not receive one.
*/
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
fc_flag = vport->fc_flag;
port_state = vport->port_state;
/* Acking an unsol FLOGI. Count 1 for link bounce
* work-around.
*/
vport->rcv_flogi_cnt++;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_PT2PT, &vport->fc_flag);
clear_bit(FC_FABRIC, &vport->fc_flag);
clear_bit(FC_PUBLIC_LOOP, &vport->fc_flag);
@@ -11190,9 +11190,9 @@ lpfc_cmpl_reg_new_vport(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
break;
}
} else {
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->vpi_state |= LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
if (vport == phba->pport) {
if (phba->sli_rev < LPFC_SLI_REV4)
lpfc_issue_fabric_reglogin(vport);
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index c9b02d2c6305..4c673dffa671 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -1340,9 +1340,9 @@ lpfc_linkdown(struct lpfc_hba *phba)
}
clear_bit(FC_PT2PT, &phba->pport->fc_flag);
clear_bit(FC_PT2PT_PLOGI, &phba->pport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
phba->pport->rcv_flogi_cnt = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
return 0;
}
@@ -1406,9 +1406,9 @@ lpfc_linkup_port(struct lpfc_vport *vport)
}
set_bit(FC_NDISC_ACTIVE, &vport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->fc_ns_retry = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
lpfc_setup_fdmi_mask(vport);
lpfc_linkup_cleanup_nodes(vport);
@@ -1437,9 +1437,9 @@ lpfc_linkup(struct lpfc_hba *phba)
* absorbed without an ACQE. No lock here - in worker thread
* and discovery is synchronized.
*/
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
phba->pport->rcv_flogi_cnt = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return 0;
}
@@ -3400,9 +3400,9 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
set_bit(FC_VFI_REGISTERED, &vport->fc_flag);
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
clear_bit(FC_VPORT_NEEDS_INIT_VPI, &vport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->vpi_state |= LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
/* In case SLI4 FC loopback test, we are ready */
if ((phba->sli_rev == LPFC_SLI_REV4) &&
@@ -3943,9 +3943,9 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
}
set_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->vpi_state &= ~LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
mempool_free(pmb, phba->mbox_mem_pool);
lpfc_cleanup_vports_rrqs(vport, NULL);
/*
@@ -4010,9 +4010,9 @@ lpfc_mbx_cmpl_reg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
}
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->vpi_state |= LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
vport->num_disc_nodes = 0;
/* go thru NPR list and issue ELS PLOGIs */
if (atomic_read(&vport->fc_npr_cnt))
@@ -5620,9 +5620,9 @@ lpfc_findnode_did(struct lpfc_vport *vport, uint32_t did)
struct lpfc_nodelist *ndlp;
unsigned long iflags;
- spin_lock_irqsave(shost->host_lock, iflags);
+ spin_lock_irqsave(&shost->host_lock, iflags);
ndlp = __lpfc_findnode_did(vport, did);
- spin_unlock_irqrestore(shost->host_lock, iflags);
+ spin_unlock_irqrestore(&shost->host_lock, iflags);
return ndlp;
}
@@ -6426,9 +6426,9 @@ lpfc_findnode_wwpn(struct lpfc_vport *vport, struct lpfc_name *wwpn)
struct Scsi_Host *shost = lpfc_shost_from_vport(vport);
struct lpfc_nodelist *ndlp;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
ndlp = __lpfc_find_node(vport, lpfc_filter_by_wwpn, wwpn);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return ndlp;
}
@@ -6444,9 +6444,9 @@ lpfc_findnode_rpi(struct lpfc_vport *vport, uint16_t rpi)
struct lpfc_nodelist *ndlp;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
ndlp = __lpfc_findnode_rpi(vport, rpi);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return ndlp;
}
@@ -6786,9 +6786,9 @@ lpfc_unregister_fcf_prep(struct lpfc_hba *phba)
lpfc_sli4_unreg_all_rpis(vports[i]);
lpfc_mbx_unreg_vpi(vports[i]);
shost = lpfc_shost_from_vport(vports[i]);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_VPORT_NEEDS_INIT_VPI, &vports[i]->fc_flag);
}
lpfc_destroy_vport_work_array(phba, vports);
@@ -6801,9 +6801,9 @@ lpfc_unregister_fcf_prep(struct lpfc_hba *phba)
lpfc_sli4_unreg_all_rpis(phba->pport);
lpfc_mbx_unreg_vpi(phba->pport);
shost = lpfc_shost_from_vport(phba->pport);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
phba->pport->vpi_state &= ~LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_VPORT_NEEDS_INIT_VPI, &phba->pport->fc_flag);
}
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 23355f12fbff..6460127bcc7b 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -3833,9 +3833,9 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)
if (test_bit(FC_UNLOADING, &vports[i]->load_flag))
continue;
shost = lpfc_shost_from_vport(vports[i]);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vports[i]->vpi_state &= ~LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_VPORT_NEEDS_REG_VPI, &vports[i]->fc_flag);
clear_bit(FC_VFI_REGISTERED, &vports[i]->fc_flag);
@@ -3926,9 +3926,9 @@ lpfc_offline(struct lpfc_hba *phba)
if (vports != NULL)
for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) {
shost = lpfc_shost_from_vport(vports[i]);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vports[i]->work_port_events = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
set_bit(FC_OFFLINE_MODE, &vports[i]->fc_flag);
}
lpfc_destroy_vport_work_array(phba, vports);
@@ -4930,7 +4930,7 @@ int lpfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
struct lpfc_hba *phba = vport->phba;
int stat = 0;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (test_bit(FC_UNLOADING, &vport->load_flag)) {
stat = 1;
@@ -4965,7 +4965,7 @@ int lpfc_scan_finished(struct Scsi_Host *shost, unsigned long time)
stat = 1;
finished:
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return stat;
}
@@ -9226,9 +9226,9 @@ lpfc_post_init_setup(struct lpfc_hba *phba)
lpfc_host_attrib_init(shost);
if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
lpfc_poll_start_timer(phba);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 8a795c65e3c3..8dd876a1a78d 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -2848,7 +2848,8 @@ skipit:
}
out:
if (err_type == BGS_GUARD_ERR_MASK) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x1);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_guard_err_cnt++;
lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
@@ -2857,7 +2858,8 @@ out:
sum, guard_tag);
} else if (err_type == BGS_REFTAG_ERR_MASK) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x3);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_reftag_err_cnt++;
@@ -2867,7 +2869,8 @@ out:
ref_tag, start_ref_tag);
} else if (err_type == BGS_APPTAG_ERR_MASK) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x2);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_apptag_err_cnt++;
@@ -2970,7 +2973,8 @@ lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd,
if (lpfc_bgs_get_guard_err(bgstat)) {
ret = 1;
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x1);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_guard_err_cnt++;
lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
@@ -2983,7 +2987,8 @@ lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd,
if (lpfc_bgs_get_reftag_err(bgstat)) {
ret = 1;
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x3);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_reftag_err_cnt++;
lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
@@ -2996,7 +3001,8 @@ lpfc_parse_bg_err(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd,
if (lpfc_bgs_get_apptag_err(bgstat)) {
ret = 1;
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x2);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
phba->bg_apptag_err_cnt++;
lpfc_printf_log(phba, KERN_WARNING, LOG_FCP | LOG_BG,
@@ -4272,7 +4278,7 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
if (vport->cfg_max_scsicmpl_time &&
time_after(jiffies, lpfc_cmd->start_time +
msecs_to_jiffies(vport->cfg_max_scsicmpl_time))) {
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (ndlp) {
if (ndlp->cmd_qdepth >
atomic_read(&ndlp->cmd_pending) &&
@@ -4285,7 +4291,7 @@ lpfc_fcp_io_cmd_wqe_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pwqeIn,
ndlp->last_change_time = jiffies;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
@@ -4552,7 +4558,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
if (vport->cfg_max_scsicmpl_time &&
time_after(jiffies, lpfc_cmd->start_time +
msecs_to_jiffies(vport->cfg_max_scsicmpl_time))) {
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (pnode) {
if (pnode->cmd_qdepth >
atomic_read(&pnode->cmd_pending) &&
@@ -4565,7 +4571,7 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
pnode->last_change_time = jiffies;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
lpfc_scsi_unprep_dma_buf(phba, lpfc_cmd);
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index cfa4371169f1..a167ad96d2a6 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -2886,9 +2886,9 @@ lpfc_sli_def_mbox_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
!test_bit(FC_UNLOADING, &phba->pport->load_flag) &&
!pmb->u.mb.mbxStatus) {
shost = lpfc_shost_from_vport(vport);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
vport->vpi_state |= LPFC_VPI_REGISTERED;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
clear_bit(FC_VPORT_NEEDS_REG_VPI, &vport->fc_flag);
}
@@ -8108,7 +8108,6 @@ u32 lpfc_rx_monitor_report(struct lpfc_hba *phba,
spinlock_t *ring_lock = &rx_monitor->lock;
u32 ring_size = rx_monitor->entries;
u32 cnt = 0;
- char tmp[DBG_LOG_STR_SZ] = {0};
bool log_to_kmsg = (!buf || !buf_len) ? true : false;
struct seq_buf s;
@@ -8133,27 +8132,37 @@ u32 lpfc_rx_monitor_report(struct lpfc_hba *phba,
/* Read out this entry's data. */
if (!log_to_kmsg) {
+ unsigned int len;
+
+ /* A header that did not fit leaves no room. */
+ if (seq_buf_has_overflowed(&s))
+ break;
+ len = seq_buf_used(&s);
+
+ seq_buf_printf(&s,
+ "%03d:\t%-16llu%-16llu%-16llu%-16llu%-8llu%-8llu%-8llu%-8u%-8u%-8u%u(%u)\n",
+ *head_idx,
+ entry->max_bytes_per_interval,
+ entry->cmf_bytes,
+ entry->total_bytes,
+ entry->rcv_bytes,
+ entry->avg_io_latency,
+ entry->avg_io_size,
+ entry->max_read_cnt,
+ entry->cmf_busy, entry->io_cnt,
+ entry->cmf_info,
+ entry->timer_utilization,
+ entry->timer_interval);
+
/*
* Drop a record whole if it does not fit, without
- * consuming its ring entry.
+ * consuming its ring entry: the reader takes the
+ * string up to its NUL.
*/
- scnprintf(tmp, sizeof(tmp),
- "%03d:\t%-16llu%-16llu%-16llu%-16llu%-8llu%-8llu%-8llu%-8u%-8u%-8u%u(%u)\n",
- *head_idx,
- entry->max_bytes_per_interval,
- entry->cmf_bytes,
- entry->total_bytes,
- entry->rcv_bytes,
- entry->avg_io_latency,
- entry->avg_io_size,
- entry->max_read_cnt,
- entry->cmf_busy, entry->io_cnt,
- entry->cmf_info,
- entry->timer_utilization,
- entry->timer_interval);
-
- if (seq_buf_puts(&s, tmp) < 0)
+ if (seq_buf_has_overflowed(&s)) {
+ buf[len] = '\0';
break;
+ }
} else {
lpfc_printf_log(phba, KERN_INFO, LOG_CGN_MGMT,
"4410 %02u: MBPI %llu Xmit %llu "
diff --git a/drivers/scsi/mac53c94.c b/drivers/scsi/mac53c94.c
index de2bd860b9d7..613bb204b6af 100644
--- a/drivers/scsi/mac53c94.c
+++ b/drivers/scsi/mac53c94.c
@@ -107,7 +107,7 @@ static int mac53c94_host_reset(struct scsi_cmnd *cmd)
struct dbdma_regs __iomem *dma = state->dma;
unsigned long flags;
- spin_lock_irqsave(cmd->device->host->host_lock, flags);
+ spin_lock_irqsave(&cmd->device->host->host_lock, flags);
writel((RUN|PAUSE|FLUSH|WAKE) << 16, &dma->control);
writeb(CMD_SCSI_RESET, &regs->command); /* assert RST */
@@ -117,7 +117,7 @@ static int mac53c94_host_reset(struct scsi_cmnd *cmd)
mac53c94_init(state);
writeb(CMD_NOP, &regs->command);
- spin_unlock_irqrestore(cmd->device->host->host_lock, flags);
+ spin_unlock_irqrestore(&cmd->device->host->host_lock, flags);
return SUCCESS;
}
@@ -182,9 +182,9 @@ static irqreturn_t do_mac53c94_interrupt(int irq, void *dev_id)
unsigned long flags;
struct Scsi_Host *dev = ((struct fsc_state *) dev_id)->current_req->device->host;
- spin_lock_irqsave(dev->host_lock, flags);
+ spin_lock_irqsave(&dev->host_lock, flags);
mac53c94_interrupt(irq, dev_id);
- spin_unlock_irqrestore(dev->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 9476a0d2c72d..a4079866f747 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -1592,9 +1592,11 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
epthru->reqsensearea, 14);
cmd->result = SAM_STAT_CHECK_CONDITION;
- } else
- scsi_build_sense(cmd, 0,
- ABORTED_COMMAND, 0, 0);
+ } else {
+ scsi_set_sense(cmd, 0,
+ ABORTED_COMMAND,
+ NO_ADDITIONAL_SENSE_INFORMATION);
+ }
}
break;
diff --git a/drivers/scsi/megaraid/mega_common.h b/drivers/scsi/megaraid/mega_common.h
index 2ad0aa2f837d..8e58599d5685 100644
--- a/drivers/scsi/megaraid/mega_common.h
+++ b/drivers/scsi/megaraid/mega_common.h
@@ -37,8 +37,6 @@
#define PCI_CONF_AMISIG64 0xa4
#define MEGA_SCSI_INQ_EVPD 1
-#define MEGA_INVALID_FIELD_IN_CDB 0x24
-
/**
* scb_t - scsi command control block
diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c
index ce89032a5a74..b7319282e3c5 100644
--- a/drivers/scsi/megaraid/megaraid_mbox.c
+++ b/drivers/scsi/megaraid/megaraid_mbox.c
@@ -1577,8 +1577,8 @@ megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp,
}
if (scp->cmnd[1] & MEGA_SCSI_INQ_EVPD) {
- scsi_build_sense(scp, 0, ILLEGAL_REQUEST,
- MEGA_INVALID_FIELD_IN_CDB, 0);
+ scsi_set_sense(scp, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
return NULL;
}
@@ -2311,9 +2311,11 @@ megaraid_mbox_dpc(unsigned long devp)
epthru->reqsensearea, 14);
scp->result = SAM_STAT_CHECK_CONDITION;
- } else
- scsi_build_sense(scp, 0,
- ABORTED_COMMAND, 0, 0);
+ } else {
+ scsi_set_sense(scp, 0,
+ ABORTED_COMMAND,
+ NO_ADDITIONAL_SENSE_INFORMATION);
+ }
}
break;
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index 4f9a53769966..1064c5baae8e 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2274,11 +2274,11 @@ megasas_check_and_restore_queue_depth(struct megasas_instance *instance)
&& atomic_read(&instance->fw_outstanding) <
instance->throttlequeuedepth + 1) {
- spin_lock_irqsave(instance->host->host_lock, flags);
+ spin_lock_irqsave(&instance->host->host_lock, flags);
instance->flag &= ~MEGASAS_FW_BUSY;
instance->host->can_queue = instance->cur_can_queue;
- spin_unlock_irqrestore(instance->host->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host->host_lock, flags);
}
}
@@ -2955,13 +2955,13 @@ static enum scsi_timeout_action megasas_reset_timer(struct scsi_cmnd *scmd)
instance = (struct megasas_instance *)scmd->device->host->hostdata;
if (!(instance->flag & MEGASAS_FW_BUSY)) {
/* FW is busy, throttle IO */
- spin_lock_irqsave(instance->host->host_lock, flags);
+ spin_lock_irqsave(&instance->host->host_lock, flags);
instance->host->can_queue = instance->throttlequeuedepth;
instance->last_time = jiffies;
instance->flag |= MEGASAS_FW_BUSY;
- spin_unlock_irqrestore(instance->host->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host->host_lock, flags);
}
return SCSI_EH_RESET_TIMER;
}
@@ -3727,7 +3727,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
if ((opcode == MR_DCMD_LD_MAP_GET_INFO)
&& (cmd->frame->dcmd.mbox.b[1] == 1)) {
fusion->fast_path_io = 0;
- spin_lock_irqsave(instance->host->host_lock, flags);
+ spin_lock_irqsave(&instance->host->host_lock, flags);
status = cmd->frame->hdr.cmd_status;
instance->map_update_cmd = NULL;
if (status != MFI_STAT_OK) {
@@ -3737,7 +3737,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
else {
megasas_return_cmd(instance, cmd);
spin_unlock_irqrestore(
- instance->host->host_lock,
+ &instance->host->host_lock,
flags);
break;
}
@@ -3762,7 +3762,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
megasas_set_ld_removed_by_fw(instance);
megasas_sync_map_info(instance);
- spin_unlock_irqrestore(instance->host->host_lock,
+ spin_unlock_irqrestore(&instance->host->host_lock,
flags);
break;
@@ -3778,7 +3778,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
if ((opcode == MR_DCMD_SYSTEM_PD_MAP_GET_INFO) &&
(cmd->frame->dcmd.mbox.b[0] == 1)) {
- spin_lock_irqsave(instance->host->host_lock, flags);
+ spin_lock_irqsave(&instance->host->host_lock, flags);
status = cmd->frame->hdr.cmd_status;
instance->jbod_seq_cmd = NULL;
megasas_return_cmd(instance, cmd);
@@ -3791,7 +3791,7 @@ megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
} else
instance->use_seqnum_jbod_fp = false;
- spin_unlock_irqrestore(instance->host->host_lock, flags);
+ spin_unlock_irqrestore(&instance->host->host_lock, flags);
break;
}
diff --git a/drivers/scsi/mesh.c b/drivers/scsi/mesh.c
index dc1402b321da..1883ba08af7d 100644
--- a/drivers/scsi/mesh.c
+++ b/drivers/scsi/mesh.c
@@ -1016,9 +1016,9 @@ static irqreturn_t do_mesh_interrupt(int irq, void *dev_id)
struct mesh_state *ms = dev_id;
struct Scsi_Host *dev = ms->host;
- spin_lock_irqsave(dev->host_lock, flags);
+ spin_lock_irqsave(&dev->host_lock, flags);
mesh_interrupt(ms);
- spin_unlock_irqrestore(dev->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host_lock, flags);
return IRQ_HANDLED;
}
@@ -1708,7 +1708,7 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
printk(KERN_DEBUG "mesh_host_reset\n");
- spin_lock_irqsave(ms->host->host_lock, flags);
+ spin_lock_irqsave(&ms->host->host_lock, flags);
if (ms->dma_started)
halt_dma(ms);
@@ -1734,7 +1734,7 @@ static int mesh_host_reset(struct scsi_cmnd *cmd)
/* Complete pending commands */
handle_reset(ms);
- spin_unlock_irqrestore(ms->host->host_lock, flags);
+ spin_unlock_irqrestore(&ms->host->host_lock, flags);
return SUCCESS;
}
@@ -1771,14 +1771,14 @@ static int mesh_suspend(struct macio_dev *mdev, pm_message_t mesg)
return 0;
scsi_block_requests(ms->host);
- spin_lock_irqsave(ms->host->host_lock, flags);
+ spin_lock_irqsave(&ms->host->host_lock, flags);
while(ms->phase != idle) {
- spin_unlock_irqrestore(ms->host->host_lock, flags);
+ spin_unlock_irqrestore(&ms->host->host_lock, flags);
msleep(10);
- spin_lock_irqsave(ms->host->host_lock, flags);
+ spin_lock_irqsave(&ms->host->host_lock, flags);
}
ms->phase = sleeping;
- spin_unlock_irqrestore(ms->host->host_lock, flags);
+ spin_unlock_irqrestore(&ms->host->host_lock, flags);
disable_irq(ms->meshintr);
set_mesh_power(ms, 0);
@@ -1795,9 +1795,9 @@ static int mesh_resume(struct macio_dev *mdev)
set_mesh_power(ms, 1);
mesh_init(ms);
- spin_lock_irqsave(ms->host->host_lock, flags);
+ spin_lock_irqsave(&ms->host->host_lock, flags);
mesh_start(ms);
- spin_unlock_irqrestore(ms->host->host_lock, flags);
+ spin_unlock_irqrestore(&ms->host->host_lock, flags);
enable_irq(ms->meshintr);
scsi_unblock_requests(ms->host);
@@ -1818,7 +1818,7 @@ static int mesh_shutdown(struct macio_dev *mdev)
unsigned long flags;
printk(KERN_INFO "resetting MESH scsi bus(es)\n");
- spin_lock_irqsave(ms->host->host_lock, flags);
+ spin_lock_irqsave(&ms->host->host_lock, flags);
mr = ms->mesh;
out_8(&mr->intr_mask, 0);
out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);
@@ -1826,7 +1826,7 @@ static int mesh_shutdown(struct macio_dev *mdev)
mesh_flush_io(mr);
udelay(30);
out_8(&mr->bus_status1, 0);
- spin_unlock_irqrestore(ms->host->host_lock, flags);
+ spin_unlock_irqrestore(&ms->host->host_lock, flags);
return 0;
}
diff --git a/drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h b/drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h
index 33dd303c97bb..7cf16a5c15b7 100644
--- a/drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h
+++ b/drivers/scsi/mpi3mr/mpi/mpi30_cnfg.h
@@ -72,6 +72,12 @@
#define MPI3_SECURITY_PGAD_SLOT_GROUP_SHIFT (8)
#define MPI3_SECURITY_PGAD_SLOT_MASK (0x000000ff)
#define MPI3_INSTANCE_PGAD_INSTANCE_MASK (0x0000ffff)
+#define MPI3_INSTANCE_PGAD_INSTANCE_SHIFT (0)
+#define MPI3_INTERFACE_PGAD_INTERFACE_MASK (0x0000000f)
+#define MPI3_INTERFACE_PGAD_INTERFACE_SHIFT (0)
+#define MPI3_INTERFACE_PGAD_INTERFACE_MPI (0)
+#define MPI3_INTERFACE_PGAD_INTERFACE_NVME_VD (1)
+#define MPI3_INTERFACE_PGAD_INTERFACE_NVME_PD (2)
struct mpi3_config_request {
__le16 host_tag;
u8 ioc_use_only02;
@@ -492,10 +498,31 @@ struct mpi3_man10_istwi_ctrlr_entry {
};
#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_MASK (0x000c)
-#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_100K (0x0000)
-#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_400K (0x0004)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_100_KHZ (0x0000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_400_KHZ (0x0004)
#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_TARGET_ENABLED (0x0002)
#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_INITIATOR_ENABLED (0x0001)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_MASK (0xc000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_SHIFT (14)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_50_NS (0x0000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_10_NS (0x4000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_5_NS (0x8000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I2C_GLITCH_FLTR_0_NS (0xc000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_TYPE_MASK (0x3000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_TYPE_SHIFT (12)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_TYPE_I2C (0x0000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_TYPE_I3C (0x1000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_TYPE_AUTO (0x2000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_MASK (0x0e00)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_SHIFT (9)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_12_5_MHZ (0x0000)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_8_MHZ (0x0200)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_6_MHZ (0x0400)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_4_MHZ (0x0600)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_I3C_MAX_DATA_RATE_2_MHZ (0x0800)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_MASK (0x000c)
+#define MPI3_MAN10_ISTWI_CTRLR_FLAGS_BUS_SPEED_SHIFT (0)
+
#ifndef MPI3_MAN10_ISTWI_CTRLR_MAX
#define MPI3_MAN10_ISTWI_CTRLR_MAX (1)
#endif
@@ -1027,6 +1054,16 @@ struct mpi3_io_unit_page5 {
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SWITCH_ATTACHED (0x02)
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_DIRECT_AND_EXPANDER (0x03)
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_DIRECT_AND_SWITCH (0x03)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_HDD_SPINDOWN_MASK (0xc000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_HDD_SPINDOWN_NONE (0x0000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_HDD_SPINDOWN_ALL (0x4000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_HDD_SPINDOWN_FILTERED (0x8000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_HDD_SPINDOWN_RESERVED (0xc000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SYNC_CACHE_MASK (0x3000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SYNC_CACHE_ALL (0x0000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SYNC_CACHE_FILTERED (0x1000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SYNC_CACHE_NONE (0x2000)
+#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SYNC_CACHE_RESERVED (0x3000)
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SATA_HDD_MASK (0x0300)
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SATA_HDD_SHIFT (8)
#define MPI3_IOUNIT5_DEVICE_SHUTDOWN_SAS_HDD_MASK (0x00c0)
@@ -1069,7 +1106,8 @@ struct mpi3_io_unit_page8 {
struct mpi3_config_page_header header;
u8 sb_mode;
u8 sb_state;
- __le16 reserved0a;
+ u8 flags;
+ u8 reserved0b;
u8 num_slots;
u8 slots_available;
u8 current_key_encryption_algo;
@@ -1088,6 +1126,8 @@ struct mpi3_io_unit_page8 {
#define MPI3_IOUNIT8_SBSTATE_SVN_UPDATE_PENDING (0x04)
#define MPI3_IOUNIT8_SBSTATE_KEY_UPDATE_PENDING (0x02)
#define MPI3_IOUNIT8_SBSTATE_SECURE_BOOT_ENABLED (0x01)
+#define MPI3_IOUNIT8_FLAGS_FWQR_CAPABLE (0x80)
+#define MPI3_IOUNIT8_FLAGS_FWQR_SECURED (0x40)
#define MPI3_IOUNIT8_SBMODE_CURRENT_KEY_IOUNIT17 (0x10)
#define MPI3_IOUNIT8_SBMODE_HARD_SECURE_RECERTIFIED (0x08)
struct mpi3_io_unit_page9 {
@@ -1174,10 +1214,16 @@ struct mpi3_io_unit_page12 {
#define MPI3_IOUNIT12_FLAGS_NUMPASSES_32 (0x00000200)
#define MPI3_IOUNIT12_FLAGS_NUMPASSES_64 (0x00000300)
#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_MASK (0x00000003)
+#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_SHIFT (0)
#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_DISABLED (0x00000000)
#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_500US (0x00000001)
#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_1MS (0x00000002)
#define MPI3_IOUNIT12_FLAGS_PASSPERIOD_2MS (0x00000003)
+#define MPI3_IOUNIT12_FLAGS_INTERFACE_MASK (0x0000000c)
+#define MPI3_IOUNIT12_FLAGS_INTERFACE_SHIFT (2)
+#define MPI3_IOUNIT12_FLAGS_INTERFACE_MPI (0x00000000)
+#define MPI3_IOUNIT12_FLAGS_INTERFACE_NVME_VD (0x00000004)
+#define MPI3_IOUNIT12_FLAGS_INTERFACE_NVME_PD (0x00000008)
#ifndef MPI3_IOUNIT13_FUNC_MAX
#define MPI3_IOUNIT13_FUNC_MAX (1)
#endif
@@ -1238,6 +1284,7 @@ struct mpi3_io_unit_page15 {
#define MPI3_IOUNIT15_PAGEVERSION (0x00)
#define MPI3_IOUNIT15_FLAGS_EPRINIT_INITREQUIRED (0x04)
#define MPI3_IOUNIT15_FLAGS_EPRSUPPORT_MASK (0x03)
+#define MPI3_IOUNIT15_FLAGS_EPRSUPPORT_SHIFT (0)
#define MPI3_IOUNIT15_FLAGS_EPRSUPPORT_NOT_SUPPORTED (0x00)
#define MPI3_IOUNIT15_FLAGS_EPRSUPPORT_WITHOUT_POWER_BRAKE_GPIO (0x01)
#define MPI3_IOUNIT15_FLAGS_EPRSUPPORT_WITH_POWER_BRAKE_GPIO (0x02)
@@ -1255,6 +1302,9 @@ struct mpi3_io_unit_page17 {
__le32 current_key[];
};
#define MPI3_IOUNIT17_PAGEVERSION (0x00)
+#define MPI3_IOUNIT17_FLAGS_KEYROOT_MASK (0x01)
+#define MPI3_IOUNIT17_FLAGS_KEYROOT_HW (0x00)
+#define MPI3_IOUNIT17_FLAGS_KEYROOT_FW (0x01)
struct mpi3_io_unit_page18 {
struct mpi3_config_page_header header;
u8 flags;
@@ -1640,11 +1690,28 @@ struct mpi3_security_page3 {
};
#define MPI3_SECURITY3_PAGEVERSION (0x00)
-#define MPI3_SECURITY3_FLAGS_TYPE_MASK (0x0f)
+#define MPI3_SECURITY3_FLAGS_TYPE_MASK (0x1f)
#define MPI3_SECURITY3_FLAGS_TYPE_SHIFT (0)
#define MPI3_SECURITY3_FLAGS_TYPE_NOT_VALID (0)
#define MPI3_SECURITY3_FLAGS_TYPE_MLDSA_PRIVATE (1)
#define MPI3_SECURITY3_FLAGS_TYPE_MLDSA_PUBLIC (2)
+union mpi3_security_digest {
+ __le32 dword[16];
+ __le16 word[32];
+ u8 byte[64];
+};
+struct mpi3_security_page4 {
+ struct mpi3_config_page_header header;
+ __le32 reserved08[2];
+ union mpi3_security_mac mac;
+ union mpi3_security_nonce nonce;
+ u8 num_digests;
+ u8 hash_algorithm;
+ __le16 reserved92;
+ __le32 reserved94[3];
+ union mpi3_security_digest digest[];
+};
+#define MPI3_SECURITY4_PAGEVERSION (0x00)
struct mpi3_security_page10 {
struct mpi3_config_page_header header;
__le32 reserved08[2];
@@ -2074,7 +2141,7 @@ struct mpi3_sas_phy3_phy_event_config {
#define MPI3_SASPHY3_EVENT_CODE_LCCONN_TIME (0xd5)
#define MPI3_SASPHY3_EVENT_CODE_SSP_TX_START_TRANSMIT (0xd6)
#define MPI3_SASPHY3_EVENT_CODE_SATA_TX_START (0xd7)
-#define MPI3_SASPHY3_EVENT_CODE_SMP_TX_START_TRANSMT (0xd8)
+#define MPI3_SASPHY3_EVENT_CODE_SMP_TX_START_TRANSMIT (0xd8)
#define MPI3_SASPHY3_EVENT_CODE_TX_SMP_BREAK_CONN (0xd9)
#define MPI3_SASPHY3_EVENT_CODE_SSP_RX_START_RECEIVE (0xda)
#define MPI3_SASPHY3_EVENT_CODE_SATA_RX_START_RECEIVE (0xdb)
diff --git a/drivers/scsi/mpi3mr/mpi/mpi30_image.h b/drivers/scsi/mpi3mr/mpi/mpi30_image.h
index 62ddf094d46c..5fa09fa79358 100644
--- a/drivers/scsi/mpi3mr/mpi/mpi30_image.h
+++ b/drivers/scsi/mpi3mr/mpi/mpi30_image.h
@@ -18,7 +18,7 @@ struct mpi3_hash_exclusion_format {
__le32 size;
};
-#define MPI3_IMAGE_HASH_EXCUSION_NUM (4)
+#define MPI3_IMAGE_HASH_EXCLUSION_NUM (4)
struct mpi3_component_image_header {
__le32 signature0;
__le32 load_address;
@@ -42,7 +42,7 @@ struct mpi3_component_image_header {
union mpi3_version_union rmc_interface_version;
union mpi3_version_union etp_interface_version;
struct mpi3_comp_image_version component_image_version;
- struct mpi3_hash_exclusion_format hash_exclusion[MPI3_IMAGE_HASH_EXCUSION_NUM];
+ struct mpi3_hash_exclusion_format hash_exclusion[MPI3_IMAGE_HASH_EXCLUSION_NUM];
__le32 next_image_header_offset;
union mpi3_version_union security_version;
__le32 reserved84[31];
@@ -347,7 +347,8 @@ struct mpi3_encrypted_hash_entry {
struct mpi3_encrypted_hash_data {
u8 image_version;
u8 num_hash;
- __le16 reserved02;
+ u8 fw_num_hash;
+ u8 reserved03;
__le32 reserved04;
struct mpi3_encrypted_hash_entry encrypted_hash_entry[MPI3_ENCRYPTED_HASH_ENTRY_MAX];
};
diff --git a/drivers/scsi/mpi3mr/mpi/mpi30_ioc.h b/drivers/scsi/mpi3mr/mpi/mpi30_ioc.h
index 68efa0d51345..aa42fba7f930 100644
--- a/drivers/scsi/mpi3mr/mpi/mpi30_ioc.h
+++ b/drivers/scsi/mpi3mr/mpi/mpi30_ioc.h
@@ -428,10 +428,10 @@ struct mpi3_event_data_sas_discovery {
#define MPI3_EVENT_SAS_DISC_FLAGS_IN_PROGRESS (0x01)
#define MPI3_EVENT_SAS_DISC_RC_STARTED (0x01)
#define MPI3_EVENT_SAS_DISC_RC_COMPLETED (0x02)
-#define MPI3_SAS_DISC_STATUS_MAX_ENCLOSURES_EXCEED (0x80000000)
-#define MPI3_SAS_DISC_STATUS_MAX_EXPANDERS_EXCEED (0x40000000)
-#define MPI3_SAS_DISC_STATUS_MAX_DEVICES_EXCEED (0x20000000)
-#define MPI3_SAS_DISC_STATUS_MAX_TOPO_PHYS_EXCEED (0x10000000)
+#define MPI3_SAS_DISC_STATUS_MAX_ENCLOSURES_EXCEEDED (0x80000000)
+#define MPI3_SAS_DISC_STATUS_MAX_EXPANDERS_EXCEEDED (0x40000000)
+#define MPI3_SAS_DISC_STATUS_MAX_DEVICES_EXCEEDED (0x20000000)
+#define MPI3_SAS_DISC_STATUS_MAX_TOPO_PHYS_EXCEEDED (0x10000000)
#define MPI3_SAS_DISC_STATUS_INVALID_CEI (0x00010000)
#define MPI3_SAS_DISC_STATUS_FECEI_MISMATCH (0x00008000)
#define MPI3_SAS_DISC_STATUS_MULTIPLE_DEVICES_IN_SLOT (0x00004000)
@@ -965,7 +965,7 @@ struct mpi3_ci_download_reply {
u8 flags;
u8 cache_dirty;
u8 pending_count;
- u8 reserved13;
+ u8 additional_flags;
};
#define MPI3_CI_DOWNLOAD_FLAGS_DOWNLOAD_IN_PROGRESS (0x80)
@@ -979,6 +979,11 @@ struct mpi3_ci_download_reply {
#define MPI3_CI_DOWNLOAD_FLAGS_ACTIVATION_STATUS_ONLINE_PENDING (0x04)
#define MPI3_CI_DOWNLOAD_FLAGS_ACTIVATION_STATUS_OFFLINE_PENDING (0x06)
#define MPI3_CI_DOWNLOAD_FLAGS_COMPATIBLE (0x01)
+#define MPI3_CI_DOWNLOAD_ADDITIONALFLAGS_REDUNDANCYRESTORATION_MASK (0x03)
+#define MPI3_CI_DOWNLOAD_ADDITIONALFLAGS_REDUNDANCYRESTORATION_SHIFT (0)
+#define MPI3_CI_DOWNLOAD_ADDITIONALFLAGS_REDUNDANCYRESTORATION_NONE (0x00)
+#define MPI3_CI_DOWNLOAD_ADDITIONALFLAGS_REDUNDANCYRESTORATION_PRIMARY (0x01)
+#define MPI3_CI_DOWNLOAD_ADDITIONALFLAGS_REDUNDANCYRESTORATION_SECONDARY (0x02)
struct mpi3_ci_upload_request {
__le16 host_tag;
u8 ioc_use_only02;
diff --git a/drivers/scsi/mpi3mr/mpi/mpi30_transport.h b/drivers/scsi/mpi3mr/mpi/mpi30_transport.h
index 290a1f5c2924..794ecc778945 100644
--- a/drivers/scsi/mpi3mr/mpi/mpi30_transport.h
+++ b/drivers/scsi/mpi3mr/mpi/mpi30_transport.h
@@ -18,7 +18,7 @@ union mpi3_version_union {
#define MPI3_VERSION_MAJOR (3)
#define MPI3_VERSION_MINOR (0)
-#define MPI3_VERSION_UNIT (39)
+#define MPI3_VERSION_UNIT (41)
#define MPI3_VERSION_DEV (0)
#define MPI3_DEVHANDLE_INVALID (0xffff)
struct mpi3_sysif_oper_queue_indexes {
diff --git a/drivers/scsi/mpi3mr/mpi3mr.h b/drivers/scsi/mpi3mr/mpi3mr.h
index c25525fe0671..d6e16707fd97 100644
--- a/drivers/scsi/mpi3mr/mpi3mr.h
+++ b/drivers/scsi/mpi3mr/mpi3mr.h
@@ -56,8 +56,8 @@ extern struct list_head mrioc_list;
extern int prot_mask;
extern atomic64_t event_counter;
-#define MPI3MR_DRIVER_VERSION "8.17.0.3.50"
-#define MPI3MR_DRIVER_RELDATE "09-January-2026"
+#define MPI3MR_DRIVER_VERSION "8.18.0.8.50"
+#define MPI3MR_DRIVER_RELDATE "26-June-2026"
#define MPI3MR_DRIVER_NAME "mpi3mr"
#define MPI3MR_DRIVER_LICENSE "GPL"
@@ -125,6 +125,7 @@ extern atomic64_t event_counter;
#define MPI3MR_RESETTM_TIMEOUT 60
#define MPI3MR_RESET_HOST_IOWAIT_TIMEOUT 5
#define MPI3MR_TSUPDATE_INTERVAL 900
+#define MPI3MR_EARLY_TSUPDATE_SECONDS 60
#define MPI3MR_DEFAULT_SHUTDOWN_TIME 120
#define MPI3MR_RAID_ERRREC_RESET_TIMEOUT 180
#define MPI3MR_PREPARE_FOR_RESET_TIMEOUT 180
@@ -168,6 +169,7 @@ extern atomic64_t event_counter;
#define MPI3MR_DEFAULT_MDTS (128 * 1024)
#define MPI3MR_DEFAULT_PGSZEXP (12)
+#define MPI3MR_MAX_PGSZEXP (27)
/* Command retry count definitions */
#define MPI3MR_DEV_RMHS_RETRY_COUNT 3
@@ -177,7 +179,7 @@ extern atomic64_t event_counter;
#define MPI3MR_DEFAULT_SDEV_QD 32
/* Definitions for Threaded IRQ poll*/
-#define MPI3MR_IRQ_POLL_SLEEP 20
+#define MPI3MR_IRQ_POLL_SLEEP 2
#define MPI3MR_IRQ_POLL_TRIGGER_IOCOUNT 8
/* Definitions for the controller security status*/
@@ -1118,6 +1120,7 @@ struct scmd_priv {
* @evtack_cmds_bitmap: Event Ack bitmap
* @delayed_evtack_cmds_list: Delayed event acknowledgment list
* @ts_update_counter: Timestamp update counter
+ * @early_ts_sync_done: Early (1 min) timestamp sync completed after load
* @ts_update_interval: Timestamp update interval
* @reset_in_progress: Reset in progress flag
* @unrecoverable: Controller unrecoverable flag
@@ -1318,6 +1321,7 @@ struct mpi3mr_ioc {
struct list_head delayed_evtack_cmds_list;
u16 ts_update_counter;
+ u8 early_ts_sync_done;
u16 ts_update_interval;
u8 reset_in_progress;
u8 unrecoverable;
@@ -1410,6 +1414,9 @@ struct mpi3mr_ioc {
struct dma_pool *trace_buf_pool;
struct segments *trace_buf;
u8 invalid_io_comp;
+ bool is_unload;
+ bool skip_dev_shutdown_on_unload;
+
};
diff --git a/drivers/scsi/mpi3mr/mpi3mr_app.c b/drivers/scsi/mpi3mr/mpi3mr_app.c
index 1353a8ff9c85..eadad89bfcfb 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_app.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_app.c
@@ -141,25 +141,27 @@ void mpi3mr_alloc_diag_bufs(struct mpi3mr_ioc *mrioc)
trace_min_size = fw_min_size = MPI3MR_DEFAULT_HDB_MIN_SZ;
} else {
- trace_size = driver_pg1.host_diag_trace_max_size * 1024;
- trace_dec_size = driver_pg1.host_diag_trace_decrement_size
+ trace_size = le16_to_cpu(driver_pg1.host_diag_trace_max_size) * 1024;
+ trace_dec_size = le16_to_cpu(driver_pg1.host_diag_trace_decrement_size)
* 1024;
- trace_min_size = driver_pg1.host_diag_trace_min_size * 1024;
- fw_size = driver_pg1.host_diag_fw_max_size * 1024;
- fw_dec_size = driver_pg1.host_diag_fw_decrement_size * 1024;
- fw_min_size = driver_pg1.host_diag_fw_min_size * 1024;
+ trace_min_size = le16_to_cpu(driver_pg1.host_diag_trace_min_size) * 1024;
+ fw_size = le16_to_cpu(driver_pg1.host_diag_fw_max_size) * 1024;
+ fw_dec_size = le16_to_cpu(driver_pg1.host_diag_fw_decrement_size) * 1024;
+ fw_min_size = le16_to_cpu(driver_pg1.host_diag_fw_min_size) * 1024;
dprint_init(mrioc,
"%s:trace diag buffer sizes read from driver\n"
"page1: maximum size = %dKB, decrement size = %dKB\n"
- ", minimum size = %dKB\n", __func__, driver_pg1.host_diag_trace_max_size,
- driver_pg1.host_diag_trace_decrement_size,
- driver_pg1.host_diag_trace_min_size);
+ ", minimum size = %dKB\n", __func__,
+ le16_to_cpu(driver_pg1.host_diag_trace_max_size),
+ le16_to_cpu(driver_pg1.host_diag_trace_decrement_size),
+ le16_to_cpu(driver_pg1.host_diag_trace_min_size));
dprint_init(mrioc,
"%s:firmware diag buffer sizes read from driver\n"
"page1: maximum size = %dKB, decrement size = %dKB\n"
- ", minimum size = %dKB\n", __func__, driver_pg1.host_diag_fw_max_size,
- driver_pg1.host_diag_fw_decrement_size,
- driver_pg1.host_diag_fw_min_size);
+ ", minimum size = %dKB\n", __func__,
+ le16_to_cpu(driver_pg1.host_diag_fw_max_size),
+ le16_to_cpu(driver_pg1.host_diag_fw_decrement_size),
+ le16_to_cpu(driver_pg1.host_diag_fw_min_size));
if ((trace_size == 0) && (fw_size == 0))
return;
}
@@ -179,6 +181,12 @@ retry_trace:
mpi3mr_alloc_trace_buffer(mrioc, trace_size)) {
retry = true;
+
+ if (!trace_dec_size || trace_dec_size > trace_size) {
+ retry = false;
+ goto retry_fw;
+ }
+
trace_size -= trace_dec_size;
dprint_init(mrioc, "trace diag buffer allocation failed\n"
"retrying smaller size %dKB\n", trace_size / 1024);
@@ -211,11 +219,13 @@ retry_fw:
diag_buffer->size = fw_size;
} else {
retry = true;
- fw_size -= fw_dec_size;
- dprint_init(mrioc, "%s:trace diag buffer allocation failed,\n"
- "retrying smaller size %dKB\n",
- __func__, fw_size / 1024);
- goto retry_fw;
+ if (fw_dec_size && fw_dec_size <= fw_size) {
+ fw_size -= fw_dec_size;
+ dprint_init(mrioc, "%s:trace diag buffer allocation failed,\n"
+ "retrying smaller size %dKB\n",
+ __func__, fw_size / 1024);
+ goto retry_fw;
+ }
}
}
}
@@ -1244,7 +1254,7 @@ static long mpi3mr_bsg_query_hdb(struct mpi3mr_ioc *mrioc,
length = (sizeof(*hbd_status) + ((MPI3MR_MAX_NUM_HDB - 1) *
sizeof(*hbd_status_entry)));
- hbd_status = kmalloc(length, GFP_KERNEL);
+ hbd_status = kzalloc(length, GFP_KERNEL);
if (!hbd_status)
return -ENOMEM;
hbd_status_entry = &hbd_status->entry[0];
@@ -1466,7 +1476,8 @@ out:
static long mpi3mr_get_all_tgt_info(struct mpi3mr_ioc *mrioc,
struct bsg_job *job)
{
- u16 num_devices = 0, i = 0, size;
+ u16 num_devices = 0, i = 0;
+ size_t size;
unsigned long flags;
struct mpi3mr_tgt_dev *tgtdev;
struct mpi3mr_device_map_info *devmap_info = NULL;
@@ -1492,8 +1503,8 @@ static long mpi3mr_get_all_tgt_info(struct mpi3mr_ioc *mrioc,
return 0;
}
- kern_entrylen = num_devices * sizeof(*devmap_info);
- size = sizeof(u64) + kern_entrylen;
+ kern_entrylen = (uint32_t)num_devices * sizeof(*devmap_info);
+ size = sizeof(u64) + (size_t)kern_entrylen;
alltgt_info = kzalloc(size, GFP_KERNEL);
if (!alltgt_info)
return -ENOMEM;
@@ -2384,7 +2395,7 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
long rval = -EINVAL;
struct mpi3mr_ioc *mrioc = NULL;
u8 *mpi_req = NULL, *sense_buff_k = NULL;
- u8 mpi_msg_size = 0;
+ u32 mpi_msg_size = 0;
struct mpi3mr_bsg_packet *bsg_req = NULL;
struct mpi3mr_bsg_mptcmd *karg;
struct mpi3mr_buf_entry *buf_entries = NULL;
@@ -2538,7 +2549,15 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
rval = -EINVAL;
goto out;
}
- memcpy(mpi_req, sgl_iter, buf_entries->buf_len);
+ if (sgl_iter + mpi_msg_size >
+ dout_buf + job->request_payload.payload_len) {
+ dprint_bsg_err(mrioc, "%s: MPI request buf exceeds dout_buf\n",
+ __func__);
+ mutex_unlock(&mrioc->bsg_cmds.mutex);
+ rval = -EINVAL;
+ goto out;
+ }
+ memcpy(mpi_req, sgl_iter, mpi_msg_size);
break;
default:
invalid_be = 1;
@@ -2737,10 +2756,12 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
}
if (block_io) {
tgtdev = mpi3mr_get_tgtdev_by_handle(mrioc, dev_handle);
- if (tgtdev && tgtdev->starget && tgtdev->starget->hostdata) {
- stgt_priv = (struct mpi3mr_stgt_priv_data *)
- tgtdev->starget->hostdata;
- atomic_inc(&stgt_priv->block_io);
+ if (tgtdev) {
+ if (tgtdev->starget && tgtdev->starget->hostdata) {
+ stgt_priv = (struct mpi3mr_stgt_priv_data *)
+ tgtdev->starget->hostdata;
+ atomic_inc(&stgt_priv->block_io);
+ }
mpi3mr_tgtdev_put(tgtdev);
}
}
@@ -2774,6 +2795,8 @@ static long mpi3mr_bsg_process_mpt_cmds(struct bsg_job *job)
dprint_bsg_err(mrioc,
"%s: posting bsg request is failed\n", __func__);
rval = -EAGAIN;
+ if (block_io && stgt_priv)
+ atomic_dec(&stgt_priv->block_io);
goto out_unlock;
}
wait_for_completion_timeout(&mrioc->bsg_cmds.done,
@@ -2935,7 +2958,8 @@ out:
void mpi3mr_app_save_logdata_th(struct mpi3mr_ioc *mrioc, char *event_data,
u16 event_data_size)
{
- u32 index = mrioc->logdata_buf_idx, sz;
+ u32 index = mrioc->logdata_buf_idx;
+ size_t entry_payload_len, sz;
struct mpi3mr_logdata_entry *entry;
if (!(mrioc->logdata_buf))
@@ -2944,7 +2968,12 @@ void mpi3mr_app_save_logdata_th(struct mpi3mr_ioc *mrioc, char *event_data,
entry = (struct mpi3mr_logdata_entry *)
(mrioc->logdata_buf + (index * mrioc->logdata_entry_sz));
entry->valid_entry = 1;
- sz = min(mrioc->logdata_entry_sz, event_data_size);
+ if (mrioc->logdata_entry_sz > MPI3MR_BSG_LOGDATA_ENTRY_HEADER_SZ)
+ entry_payload_len = (size_t)mrioc->logdata_entry_sz -
+ MPI3MR_BSG_LOGDATA_ENTRY_HEADER_SZ;
+ else
+ entry_payload_len = 0;
+ sz = min_t(size_t, entry_payload_len, event_data_size);
memcpy(entry->data, event_data, sz);
mrioc->logdata_buf_idx =
((++index) % MPI3MR_BSG_LOGDATA_MAX_ENTRIES);
@@ -3053,7 +3082,7 @@ void mpi3mr_bsg_init(struct mpi3mr_ioc *mrioc)
}
q = bsg_setup_queue(bsg_dev, dev_name(bsg_dev), &lim,
- mpi3mr_bsg_request, NULL, 0);
+ mpi3mr_bsg_request, NULL, 0, SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q)) {
ioc_err(mrioc, "%s: bsg registration failed\n",
dev_name(bsg_dev));
diff --git a/drivers/scsi/mpi3mr/mpi3mr_fw.c b/drivers/scsi/mpi3mr/mpi3mr_fw.c
index 681868716ebd..f0d3cd398dd0 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_fw.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_fw.c
@@ -124,11 +124,16 @@ void mpi3mr_build_zero_len_sge(void *paddr)
void *mpi3mr_get_reply_virt_addr(struct mpi3mr_ioc *mrioc,
dma_addr_t phys_addr)
{
+ u64 offset;
+
if (!phys_addr)
return NULL;
+ offset = phys_addr - mrioc->reply_buf_dma;
+
if ((phys_addr < mrioc->reply_buf_dma) ||
- (phys_addr > mrioc->reply_buf_dma_max_address))
+ (phys_addr > mrioc->reply_buf_dma_max_address - mrioc->reply_sz) ||
+ do_div(offset, mrioc->reply_sz))
return NULL;
return mrioc->reply_buf + (phys_addr - mrioc->reply_buf_dma);
@@ -137,9 +142,19 @@ void *mpi3mr_get_reply_virt_addr(struct mpi3mr_ioc *mrioc,
void *mpi3mr_get_sensebuf_virt_addr(struct mpi3mr_ioc *mrioc,
dma_addr_t phys_addr)
{
+ u64 offset;
+
if (!phys_addr)
return NULL;
+ offset = phys_addr - mrioc->sense_buf_dma;
+
+ if (phys_addr < mrioc->sense_buf_dma ||
+ (phys_addr > mrioc->sense_buf_dma +
+ (mrioc->num_sense_bufs * MPI3MR_SENSE_BUF_SZ) - MPI3MR_SENSE_BUF_SZ) ||
+ do_div(offset, MPI3MR_SENSE_BUF_SZ))
+ return NULL;
+
return mrioc->sense_buf + (phys_addr - mrioc->sense_buf_dma);
}
@@ -404,7 +419,8 @@ static void mpi3mr_process_admin_reply_desc(struct mpi3mr_ioc *mrioc,
scsi_normalize_sense(sense_buf, sense_count,
&sshdr);
mpi3mr_scsisense_trigger(mrioc, sshdr.sense_key,
- sshdr.asc, sshdr.ascq);
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
}
}
mpi3mr_reply_trigger(mrioc, masked_ioc_status, ioc_loginfo);
@@ -474,6 +490,12 @@ int mpi3mr_process_admin_reply_q(struct mpi3mr_ioc *mrioc)
return 0;
}
+ /*
+ * Ensure that the descriptor payload is read only after
+ * the phase bit check is complete.
+ */
+ dma_rmb();
+
do {
if (mrioc->unrecoverable || mrioc->io_admin_reset_sync)
break;
@@ -494,6 +516,13 @@ int mpi3mr_process_admin_reply_q(struct mpi3mr_ioc *mrioc)
if ((le16_to_cpu(reply_desc->reply_flags) &
MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) != exp_phase)
break;
+
+ /*
+ * Ensure that the descriptor payload is read only after
+ * the phase bit check is complete.
+ */
+ dma_rmb();
+
if (threshold_comps == MPI3MR_THRESHOLD_REPLY_COUNT) {
writel(admin_reply_ci,
&mrioc->sysif_regs->admin_reply_queue_ci);
@@ -554,6 +583,9 @@ int mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc,
struct mpi3_default_reply_descriptor *reply_desc;
u16 req_q_idx = 0, reply_qidx, threshold_comps = 0;
+ if (!op_reply_q)
+ return 0;
+
reply_qidx = op_reply_q->qid - 1;
if (!atomic_add_unless(&op_reply_q->in_use, 1, 1))
@@ -565,15 +597,33 @@ int mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc,
reply_desc = mpi3mr_get_reply_desc(op_reply_q, reply_ci);
if ((le16_to_cpu(reply_desc->reply_flags) &
MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) != exp_phase) {
+ /* Recheck under in_use before releasing, to avoid a reclaim race */
+ dma_rmb();
+ if ((le16_to_cpu(reply_desc->reply_flags) &
+ MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) == exp_phase)
+ goto process_desc;
atomic_dec(&op_reply_q->in_use);
return 0;
}
+process_desc:
+ /*
+ * Ensure that the descriptor payload is read only after
+ * the phase bit check is complete.
+ */
+ dma_rmb();
do {
if (mrioc->unrecoverable || mrioc->io_admin_reset_sync)
break;
req_q_idx = le16_to_cpu(reply_desc->request_queue_id) - 1;
+
+ if (unlikely(req_q_idx >= mrioc->num_op_req_q)) {
+ ioc_err(mrioc, "Invalid request queue id %d, skipping reply\n",
+ req_q_idx + 1);
+ goto next_reply;
+ }
+
op_req_q = &mrioc->req_qinfo[req_q_idx];
WRITE_ONCE(op_req_q->ci, le16_to_cpu(reply_desc->request_queue_ci));
@@ -582,8 +632,9 @@ int mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc,
if (reply_dma)
mpi3mr_repost_reply_buf(mrioc, reply_dma);
- num_op_reply++;
threshold_comps++;
+next_reply:
+ num_op_reply++;
if (++reply_ci == op_reply_q->num_replies) {
reply_ci = 0;
@@ -593,8 +644,19 @@ int mpi3mr_process_op_reply_q(struct mpi3mr_ioc *mrioc,
reply_desc = mpi3mr_get_reply_desc(op_reply_q, reply_ci);
if ((le16_to_cpu(reply_desc->reply_flags) &
- MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) != exp_phase)
+ MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) != exp_phase) {
+ dma_rmb();
+ if ((le16_to_cpu(reply_desc->reply_flags) &
+ MPI3_REPLY_DESCRIPT_FLAGS_PHASE_MASK) == exp_phase)
+ goto reply_ready;
break;
+ }
+reply_ready:
+ /*
+ * Ensure that the descriptor payload is read only after
+ * the phase bit check is complete.
+ */
+ dma_rmb();
#ifndef CONFIG_PREEMPT_RT
/*
* Exit completion loop to avoid CPU lockup
@@ -656,6 +718,7 @@ static irqreturn_t mpi3mr_isr_primary(int irq, void *privdata)
{
struct mpi3mr_intr_info *intr_info = privdata;
struct mpi3mr_ioc *mrioc;
+ struct op_reply_qinfo *op_reply_q;
u16 midx;
u32 num_admin_replies = 0, num_op_reply = 0;
@@ -671,9 +734,9 @@ static irqreturn_t mpi3mr_isr_primary(int irq, void *privdata)
if (!midx)
num_admin_replies = mpi3mr_process_admin_reply_q(mrioc);
- if (intr_info->op_reply_q)
- num_op_reply = mpi3mr_process_op_reply_q(mrioc,
- intr_info->op_reply_q);
+ op_reply_q = READ_ONCE(intr_info->op_reply_q);
+ if (op_reply_q)
+ num_op_reply = mpi3mr_process_op_reply_q(mrioc, op_reply_q);
if (num_admin_replies || num_op_reply)
return IRQ_HANDLED;
@@ -686,6 +749,7 @@ static irqreturn_t mpi3mr_isr_primary(int irq, void *privdata)
static irqreturn_t mpi3mr_isr(int irq, void *privdata)
{
struct mpi3mr_intr_info *intr_info = privdata;
+ struct op_reply_qinfo *op_reply_q;
int ret;
if (!intr_info)
@@ -698,11 +762,12 @@ static irqreturn_t mpi3mr_isr(int irq, void *privdata)
* If more IOs are expected, schedule IRQ polling thread.
* Otherwise exit from ISR.
*/
- if ((threaded_isr_poll == false) || !intr_info->op_reply_q)
+ op_reply_q = READ_ONCE(intr_info->op_reply_q);
+ if ((threaded_isr_poll == false) || !op_reply_q)
return ret;
- if (!intr_info->op_reply_q->enable_irq_poll ||
- !atomic_read(&intr_info->op_reply_q->pend_ios))
+ if (!op_reply_q->enable_irq_poll ||
+ !atomic_read(&op_reply_q->pend_ios))
return ret;
disable_irq_nosync(intr_info->os_irq);
@@ -724,12 +789,19 @@ static irqreturn_t mpi3mr_isr_poll(int irq, void *privdata)
{
struct mpi3mr_intr_info *intr_info = privdata;
struct mpi3mr_ioc *mrioc;
+ struct op_reply_qinfo *op_reply_q;
u16 midx;
u32 num_op_reply = 0;
- if (!intr_info || !intr_info->op_reply_q)
+ if (!intr_info)
return IRQ_NONE;
+ op_reply_q = READ_ONCE(intr_info->op_reply_q);
+ if (!op_reply_q) {
+ enable_irq(intr_info->os_irq);
+ return IRQ_HANDLED;
+ }
+
mrioc = intr_info->mrioc;
midx = intr_info->msix_index;
@@ -738,19 +810,23 @@ static irqreturn_t mpi3mr_isr_poll(int irq, void *privdata)
if (!mrioc->intr_enabled || mrioc->unrecoverable)
break;
+ op_reply_q = READ_ONCE(intr_info->op_reply_q);
+ if (!op_reply_q)
+ break;
+
if (!midx)
mpi3mr_process_admin_reply_q(mrioc);
- if (intr_info->op_reply_q)
- num_op_reply +=
- mpi3mr_process_op_reply_q(mrioc,
- intr_info->op_reply_q);
+ num_op_reply +=
+ mpi3mr_process_op_reply_q(mrioc, op_reply_q);
+ if (!atomic_read(&op_reply_q->pend_ios))
+ break;
- usleep_range(MPI3MR_IRQ_POLL_SLEEP, MPI3MR_IRQ_POLL_SLEEP + 1);
+ usleep_range(MPI3MR_IRQ_POLL_SLEEP, 10 * MPI3MR_IRQ_POLL_SLEEP);
- } while (atomic_read(&intr_info->op_reply_q->pend_ios) &&
- (num_op_reply < mrioc->max_host_ios));
+ } while (num_op_reply < mrioc->max_host_ios);
- intr_info->op_reply_q->enable_irq_poll = false;
+ if (op_reply_q)
+ op_reply_q->enable_irq_poll = false;
enable_irq(intr_info->os_irq);
return IRQ_HANDLED;
@@ -1934,10 +2010,6 @@ static void mpi3mr_free_op_req_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx)
int size;
struct segments *segments;
- segments = mrioc->req_qinfo[q_idx].q_segments;
- if (!segments)
- return;
-
if (mrioc->enable_segqueue) {
size = MPI3MR_OP_REQ_Q_SEG_SIZE;
if (mrioc->req_qinfo[q_idx].q_segment_list) {
@@ -1951,6 +2023,10 @@ static void mpi3mr_free_op_req_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx)
size = mrioc->req_qinfo[q_idx].segment_qd *
mrioc->facts.op_req_sz;
+ segments = mrioc->req_qinfo[q_idx].q_segments;
+ if (!segments)
+ return;
+
for (j = 0; j < mrioc->req_qinfo[q_idx].num_segments; j++) {
if (!segments[j].segment)
continue;
@@ -1977,10 +2053,17 @@ static void mpi3mr_free_op_reply_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx)
u16 j;
int size;
struct segments *segments;
+ u16 midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(q_idx, mrioc->op_reply_q_offset);
- segments = mrioc->op_reply_qinfo[q_idx].q_segments;
- if (!segments)
- return;
+ /*
+ * Stop the ISR/poll thread from picking up this queue before its
+ * segments are freed below, and wait for any in-flight handler
+ * that already has the old pointer to finish using it.
+ */
+ if (midx < mrioc->intr_info_count) {
+ WRITE_ONCE(mrioc->intr_info[midx].op_reply_q, NULL);
+ synchronize_irq(pci_irq_vector(mrioc->pdev, midx));
+ }
if (mrioc->enable_segqueue) {
size = MPI3MR_OP_REP_Q_SEG_SIZE;
@@ -1995,6 +2078,10 @@ static void mpi3mr_free_op_reply_q_segments(struct mpi3mr_ioc *mrioc, u16 q_idx)
size = mrioc->op_reply_qinfo[q_idx].segment_qd *
mrioc->op_reply_desc_sz;
+ segments = mrioc->op_reply_qinfo[q_idx].q_segments;
+ if (!segments)
+ return;
+
for (j = 0; j < mrioc->op_reply_qinfo[q_idx].num_segments; j++) {
if (!segments[j].segment)
continue;
@@ -2461,7 +2548,7 @@ out:
static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
{
int retval = 0;
- u16 num_queues = 0, i = 0, msix_count_op_q = 1;
+ u16 num_queues = 0, i = 0, j = 0, msix_count_op_q = 1;
u32 ioc_status;
enum mpi3mr_iocstate ioc_state;
@@ -2513,6 +2600,13 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
}
}
+ if (i < num_queues) {
+ for (j = i; j < num_queues; j++) {
+ mpi3mr_free_op_req_q_segments(mrioc, j);
+ mpi3mr_free_op_reply_q_segments(mrioc, j);
+ }
+ }
+
if (i == 0) {
/* Not even one queue is created successfully*/
retval = -1;
@@ -2534,11 +2628,19 @@ static int mpi3mr_create_op_queues(struct mpi3mr_ioc *mrioc)
return retval;
out_failed:
- kfree(mrioc->req_qinfo);
- mrioc->req_qinfo = NULL;
+ if (mrioc->req_qinfo) {
+ for (j = 0; j < i; j++) {
+ mpi3mr_free_op_req_q_segments(mrioc, j);
+ mpi3mr_free_op_reply_q_segments(mrioc, j);
+ }
+ kfree(mrioc->req_qinfo);
+ mrioc->req_qinfo = NULL;
+ }
+ mrioc->num_op_req_q = 0;
kfree(mrioc->op_reply_qinfo);
mrioc->op_reply_qinfo = NULL;
+ mrioc->num_op_reply_q = 0;
return retval;
}
@@ -2582,7 +2684,8 @@ int mpi3mr_op_request_post(struct mpi3mr_ioc *mrioc,
if (mpi3mr_check_req_qfull(op_req_q)) {
midx = REPLY_QUEUE_IDX_TO_MSIX_IDX(
reply_qidx, mrioc->op_reply_q_offset);
- mpi3mr_process_op_reply_q(mrioc, mrioc->intr_info[midx].op_reply_q);
+ mpi3mr_process_op_reply_q(mrioc,
+ READ_ONCE(mrioc->intr_info[midx].op_reply_q));
if (mpi3mr_check_req_qfull(op_req_q)) {
@@ -2875,8 +2978,9 @@ out:
* @work: work struct
*
* Watch dog work periodically executed (1 second interval) to
- * monitor firmware fault and to issue periodic timer sync to
- * the firmware.
+ * monitor firmware fault and perform timestamp synchronization
+ * to firmware, with an early sync 1 minute after load followed
+ * by periodic updates at ts_update_interval seconds (default 15 minutes).
*
* Return: Nothing.
*/
@@ -2922,11 +3026,23 @@ static void mpi3mr_watchdog_work(struct work_struct *work)
}
if (!(mrioc->facts.ioc_capabilities &
- MPI3_IOCFACTS_CAPABILITY_NON_SUPERVISOR_IOC) &&
- (mrioc->ts_update_counter++ >= mrioc->ts_update_interval)) {
+ MPI3_IOCFACTS_CAPABILITY_NON_SUPERVISOR_IOC)) {
+ if (!mrioc->early_ts_sync_done) {
+ /*
+ * Send time sync 1 min after load
+ */
+ if (mrioc->ts_update_counter++ >=
+ MPI3MR_EARLY_TSUPDATE_SECONDS) {
+ mrioc->early_ts_sync_done = 1;
+ mrioc->ts_update_counter = 0;
+ mpi3mr_sync_timestamp(mrioc);
+ }
+ } else if (mrioc->ts_update_counter++ >=
+ mrioc->ts_update_interval) {
+ mrioc->ts_update_counter = 0;
+ mpi3mr_sync_timestamp(mrioc);
+ }
- mrioc->ts_update_counter = 0;
- mpi3mr_sync_timestamp(mrioc);
}
if ((mrioc->prepare_for_reset) &&
@@ -4112,26 +4228,35 @@ static int mpi3mr_repost_diag_bufs(struct mpi3mr_ioc *mrioc)
}
/**
- * mpi3mr_read_tsu_interval - Update time stamp interval
+ * mpi3mr_read_driver_page1 - Read Driver Page 1 parameters
* @mrioc: Adapter instance reference
*
- * Update time stamp interval if its defined in driver page 1,
- * otherwise use default value.
+ * Reads and caches Driver Page 1 parameters such as
+ * timestamp update interval and driver behavior flags.
*
* Return: Nothing
*/
static void
-mpi3mr_read_tsu_interval(struct mpi3mr_ioc *mrioc)
+mpi3mr_read_driver_page1(struct mpi3mr_ioc *mrioc)
{
struct mpi3_driver_page1 driver_pg1;
u16 pg_sz = sizeof(driver_pg1);
int retval = 0;
mrioc->ts_update_interval = MPI3MR_TSUPDATE_INTERVAL;
+ mrioc->skip_dev_shutdown_on_unload = 0;
retval = mpi3mr_cfg_get_driver_pg1(mrioc, &driver_pg1, pg_sz);
- if (!retval && driver_pg1.time_stamp_update)
+
+ if (retval)
+ return;
+
+ if (driver_pg1.time_stamp_update)
mrioc->ts_update_interval = (driver_pg1.time_stamp_update * 60);
+
+ mrioc->skip_dev_shutdown_on_unload =
+ (le32_to_cpu(driver_pg1.flags) &
+ MPI3_DRIVER1_FLAGS_DEVICE_SHUTDOWN_ON_UNLOAD_DISABLE) ? 1 : 0;
}
/**
@@ -4437,7 +4562,7 @@ retry_init:
goto out_failed_noretry;
}
- mpi3mr_read_tsu_interval(mrioc);
+ mpi3mr_read_driver_page1(mrioc);
mpi3mr_print_ioc_info(mrioc);
dprint_init(mrioc, "allocating host diag buffers\n");
@@ -4609,7 +4734,7 @@ retry_init:
goto out_failed_noretry;
}
- mpi3mr_read_tsu_interval(mrioc);
+ mpi3mr_read_driver_page1(mrioc);
mpi3mr_print_ioc_info(mrioc);
if (is_resume) {
@@ -5094,8 +5219,16 @@ static void mpi3mr_issue_ioc_shutdown(struct mpi3mr_ioc *mrioc)
return;
}
- shutdown_action = MPI3_SYSIF_IOC_CONFIG_SHUTDOWN_NORMAL |
- MPI3_SYSIF_IOC_CONFIG_DEVICE_SHUTDOWN_SEND_REQ;
+ shutdown_action = MPI3_SYSIF_IOC_CONFIG_SHUTDOWN_NORMAL;
+
+ if (!(mrioc->is_unload && mrioc->skip_dev_shutdown_on_unload))
+ shutdown_action |=
+ MPI3_SYSIF_IOC_CONFIG_DEVICE_SHUTDOWN_SEND_REQ;
+ else
+ ioc_info(mrioc,
+ "The shutdown request is issued without the device shutdown bit set\n"
+ "as indicated by the controller configuration\n");
+
ioc_config = readl(&mrioc->sysif_regs->ioc_configuration);
ioc_config |= shutdown_action;
diff --git a/drivers/scsi/mpi3mr/mpi3mr_os.c b/drivers/scsi/mpi3mr/mpi3mr_os.c
index 0f7380448718..6b0156e54d45 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_os.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_os.c
@@ -233,10 +233,11 @@ static void mpi3mr_fwevt_add_to_list(struct mpi3mr_ioc *mrioc,
{
unsigned long flags;
- if (!mrioc->fwevt_worker_thread)
- return;
-
spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (!mrioc->fwevt_worker_thread) {
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ return;
+ }
/* get fwevt reference count while adding it to fwevt_list */
mpi3mr_fwevt_get(fwevt);
INIT_LIST_HEAD(&fwevt->list);
@@ -283,32 +284,6 @@ void mpi3mr_hdb_trigger_data_event(struct mpi3mr_ioc *mrioc,
}
/**
- * mpi3mr_fwevt_del_from_list - Delete firmware event from list
- * @mrioc: Adapter instance reference
- * @fwevt: Firmware event reference
- *
- * Delete the given firmware event from the firmware event list.
- *
- * Return: Nothing.
- */
-static void mpi3mr_fwevt_del_from_list(struct mpi3mr_ioc *mrioc,
- struct mpi3mr_fwevt *fwevt)
-{
- unsigned long flags;
-
- spin_lock_irqsave(&mrioc->fwevt_lock, flags);
- if (!list_empty(&fwevt->list)) {
- list_del_init(&fwevt->list);
- /*
- * Put fwevt reference count after
- * removing it from fwevt_list
- */
- mpi3mr_fwevt_put(fwevt);
- }
- spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
-}
-
-/**
* mpi3mr_dequeue_fwevt - Dequeue firmware event from the list
* @mrioc: Adapter instance reference
*
@@ -327,11 +302,7 @@ static struct mpi3mr_fwevt *mpi3mr_dequeue_fwevt(
fwevt = list_first_entry(&mrioc->fwevt_list,
struct mpi3mr_fwevt, list);
list_del_init(&fwevt->list);
- /*
- * Put fwevt reference count after
- * removing it from fwevt_list
- */
- mpi3mr_fwevt_put(fwevt);
+
}
spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
@@ -365,6 +336,11 @@ static void mpi3mr_cancel_work(struct mpi3mr_fwevt *fwevt)
*/
mpi3mr_fwevt_put(fwevt);
}
+
+ /*
+ * Drop the reference count that was acquired by the caller.
+ */
+ mpi3mr_fwevt_put(fwevt);
}
/**
@@ -379,17 +355,44 @@ static void mpi3mr_cancel_work(struct mpi3mr_fwevt *fwevt)
void mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc)
{
struct mpi3mr_fwevt *fwevt = NULL;
+ unsigned long flags;
+ /*
+ * Safely read current_event under lock to prevent TOCTOU race
+ * with the firmware event worker thread.
+ */
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if ((list_empty(&mrioc->fwevt_list) && !mrioc->current_event) ||
- !mrioc->fwevt_worker_thread)
+ !mrioc->fwevt_worker_thread) {
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
return;
+ }
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
while ((fwevt = mpi3mr_dequeue_fwevt(mrioc)))
mpi3mr_cancel_work(fwevt);
- if (mrioc->current_event) {
- fwevt = mrioc->current_event;
+ /*
+ * Safely read current_event under lock to prevent TOCTOU race
+ * with the firmware event worker thread.
+ */
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ fwevt = mrioc->current_event;
+ if (fwevt) {
+ /*
+ * Take a reference to ensure the event is not freed by the
+ * worker thread while we are evaluating or cancelling it.
+ */
+ mpi3mr_fwevt_get(fwevt);
+ }
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+
+ if (fwevt) {
+ bool pending_at_sml;
+
/*
+ * Read pending_at_sml under lock to avoid a stale value.
+ *
* Don't call cancel_work_sync() API for the
* fwevt work if the controller reset is
* get called as part of processing the
@@ -397,8 +400,13 @@ void mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc)
* waiting for device add/remove APIs to complete.
* Otherwise we will see deadlock.
*/
- if (current_work() == &fwevt->work || fwevt->pending_at_sml) {
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ pending_at_sml = fwevt->pending_at_sml;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+
+ if (current_work() == &fwevt->work || pending_at_sml) {
fwevt->discard = 1;
+ mpi3mr_fwevt_put(fwevt);
return;
}
@@ -912,6 +920,8 @@ void mpi3mr_remove_tgtdev_from_host(struct mpi3mr_ioc *mrioc,
struct mpi3mr_tgt_dev *tgtdev)
{
struct mpi3mr_stgt_priv_data *tgt_priv;
+ unsigned long flags;
+ bool discard = false;
ioc_info(mrioc, "%s :Removing handle(0x%04x), wwid(0x%016llx)\n",
__func__, tgtdev->dev_handle, (unsigned long long)tgtdev->wwid);
@@ -924,17 +934,27 @@ void mpi3mr_remove_tgtdev_from_host(struct mpi3mr_ioc *mrioc,
if (!mrioc->sas_transport_enabled || (tgtdev->dev_type !=
MPI3_DEVICE_DEVFORM_SAS_SATA) || tgtdev->non_stl) {
if (tgtdev->starget) {
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (mrioc->stop_drv_processing ||
+ mrioc->reset_in_progress) {
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ return;
+ }
if (mrioc->current_event)
mrioc->current_event->pending_at_sml = 1;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
scsi_remove_target(&tgtdev->starget->dev);
tgtdev->host_exposed = 0;
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if (mrioc->current_event) {
mrioc->current_event->pending_at_sml = 0;
- if (mrioc->current_event->discard) {
- mpi3mr_print_device_event_notice(mrioc,
- false);
- return;
- }
+ discard = mrioc->current_event->discard;
+ }
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ if (discard) {
+ mpi3mr_print_device_event_notice(mrioc,
+ false);
+ return;
}
}
} else
@@ -962,6 +982,8 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc,
{
int retval = 0;
struct mpi3mr_tgt_dev *tgtdev;
+ unsigned long flags;
+ bool discard = false;
if (mrioc->reset_in_progress || mrioc->pci_err_recovery)
return -1;
@@ -978,19 +1000,29 @@ static int mpi3mr_report_tgtdev_to_host(struct mpi3mr_ioc *mrioc,
if (!mrioc->sas_transport_enabled || (tgtdev->dev_type !=
MPI3_DEVICE_DEVFORM_SAS_SATA) || tgtdev->non_stl){
tgtdev->host_exposed = 1;
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (mrioc->stop_drv_processing || mrioc->reset_in_progress) {
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ tgtdev->host_exposed = 0;
+ goto out;
+ }
if (mrioc->current_event)
mrioc->current_event->pending_at_sml = 1;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
scsi_scan_target(&mrioc->shost->shost_gendev,
mrioc->scsi_device_channel, tgtdev->perst_id,
SCAN_WILD_CARD, SCSI_SCAN_INITIAL);
if (!tgtdev->starget)
tgtdev->host_exposed = 0;
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if (mrioc->current_event) {
mrioc->current_event->pending_at_sml = 0;
- if (mrioc->current_event->discard) {
- mpi3mr_print_device_event_notice(mrioc, true);
- goto out;
- }
+ discard = mrioc->current_event->discard;
+ }
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ if (discard) {
+ mpi3mr_print_device_event_notice(mrioc, true);
+ goto out;
}
dprint_event_bh(mrioc,
"exposed target device with handle(0x%04x), perst_id(%d)\n",
@@ -1363,24 +1395,32 @@ static void mpi3mr_update_tgtdev(struct mpi3mr_ioc *mrioc,
struct mpi3_device0_pcie_format *pcieinf =
&dev_pg0->device_specific.pcie_format;
u16 dev_info = le16_to_cpu(pcieinf->device_info);
+ u8 pgsz = MPI3MR_DEFAULT_PGSZEXP;
+ u8 reset_to = MPI3MR_INTADMCMD_TIMEOUT;
+ u8 abort_to = MPI3MR_INTADMCMD_TIMEOUT;
+ u8 fw_pgsz = READ_ONCE(pcieinf->page_size);
tgtdev->dev_spec.pcie_inf.dev_info = dev_info;
tgtdev->dev_spec.pcie_inf.capb =
le32_to_cpu(pcieinf->capabilities);
tgtdev->dev_spec.pcie_inf.mdts = MPI3MR_DEFAULT_MDTS;
- /* 2^12 = 4096 */
- tgtdev->dev_spec.pcie_inf.pgsz = 12;
+ /* Validate firmware page size to prevent undefined shift behavior */
+ if (fw_pgsz >= MPI3MR_DEFAULT_PGSZEXP && fw_pgsz <= MPI3MR_MAX_PGSZEXP)
+ pgsz = fw_pgsz;
+
if (dev_pg0->access_status == MPI3_DEVICE0_ASTATUS_NO_ERRORS) {
tgtdev->dev_spec.pcie_inf.mdts =
le32_to_cpu(pcieinf->maximum_data_transfer_size);
- tgtdev->dev_spec.pcie_inf.pgsz = pcieinf->page_size;
- tgtdev->dev_spec.pcie_inf.reset_to =
- max_t(u8, pcieinf->controller_reset_to,
- MPI3MR_INTADMCMD_TIMEOUT);
- tgtdev->dev_spec.pcie_inf.abort_to =
- max_t(u8, pcieinf->nvme_abort_to,
+ reset_to = max_t(u8, pcieinf->controller_reset_to,
+ MPI3MR_INTADMCMD_TIMEOUT);
+ abort_to = max_t(u8, pcieinf->nvme_abort_to,
MPI3MR_INTADMCMD_TIMEOUT);
}
+
+ tgtdev->dev_spec.pcie_inf.pgsz = pgsz;
+ tgtdev->dev_spec.pcie_inf.reset_to = reset_to;
+ tgtdev->dev_spec.pcie_inf.abort_to = abort_to;
+
if (tgtdev->dev_spec.pcie_inf.mdts > (1024 * 1024))
tgtdev->dev_spec.pcie_inf.mdts = (1024 * 1024);
if (((dev_info & MPI3_DEVICE0_PCIE_DEVICE_INFO_TYPE_MASK) !=
@@ -2150,13 +2190,25 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
u16 perst_id, handle, dev_info;
struct mpi3_device0_sas_sata_format *sasinf = NULL;
unsigned int timeout;
+ unsigned long flags;
- mpi3mr_fwevt_del_from_list(mrioc, fwevt);
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (!list_empty(&fwevt->list)) {
+ list_del_init(&fwevt->list);
+ /*
+ * Put fwevt reference count after
+ * removing it from fwevt_list
+ */
+ mpi3mr_fwevt_put(fwevt);
+ }
mrioc->current_event = fwevt;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
- if (mrioc->stop_drv_processing) {
- dprint_event_bh(mrioc, "ignoring event(0x%02x) in the bottom half handler\n"
- "due to stop_drv_processing\n", fwevt->event_id);
+ if (mrioc->stop_drv_processing || mrioc->pci_err_recovery) {
+ dprint_event_bh(mrioc,
+ "ignoring event(0x%02x) in the bottom half handler\n"
+ "due to stop_drv_processing or pci_err_recovery\n",
+ fwevt->event_id);
goto out;
}
@@ -2285,9 +2337,12 @@ evt_ack:
mpi3mr_process_event_ack(mrioc, fwevt->event_id,
fwevt->evt_ctx);
out:
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ mrioc->current_event = NULL;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+
/* Put fwevt reference count to neutralize kref_init increment */
mpi3mr_fwevt_put(fwevt);
- mrioc->current_event = NULL;
}
/**
@@ -2426,7 +2481,8 @@ static void mpi3mr_dev_rmhs_complete_iou(struct mpi3mr_ioc *mrioc,
ioc_info(mrioc,
"%s :dev removal handshake completed successfully: handle(0x%04x)\n",
__func__, drv_cmd->dev_handle);
- clear_bit(drv_cmd->dev_handle, mrioc->removepend_bitmap);
+ if (drv_cmd->dev_handle < mrioc->facts.max_devhandle)
+ clear_bit(drv_cmd->dev_handle, mrioc->removepend_bitmap);
}
if (!list_empty(&mrioc->delayed_rmhs_list)) {
@@ -2540,12 +2596,29 @@ static void mpi3mr_dev_rmhs_send_tm(struct mpi3mr_ioc *mrioc, u16 handle,
struct mpi3mr_tgt_dev *tgtdev = NULL;
unsigned long flags;
+ if (handle >= mrioc->facts.max_devhandle) {
+ ioc_err(mrioc, "dev_remove_hs: handle(0x%04x) >= max_devhandle(0x%04x)\n",
+ handle, mrioc->facts.max_devhandle);
+ if (drv_cmd) {
+ cmd_idx = drv_cmd->host_tag - MPI3MR_HOSTTAG_DEVRMCMD_MIN;
+ drv_cmd->state = MPI3MR_CMD_NOTUSED;
+ drv_cmd->callback = NULL;
+ drv_cmd->dev_handle = MPI3MR_INVALID_DEV_HANDLE;
+ drv_cmd->retry_count = 0;
+ clear_bit(cmd_idx, mrioc->devrem_bitmap);
+ }
+ return;
+ }
+
spin_lock_irqsave(&mrioc->tgtdev_lock, flags);
tgtdev = __mpi3mr_get_tgtdev_by_handle(mrioc, handle);
if (tgtdev && (iou_rc == MPI3_CTRL_OP_REMOVE_DEVICE))
tgtdev->state = MPI3MR_DEV_REMOVE_HS_STARTED;
spin_unlock_irqrestore(&mrioc->tgtdev_lock, flags);
+ if (tgtdev)
+ mpi3mr_tgtdev_put(tgtdev);
+
if (drv_cmd)
goto issue_cmd;
do {
@@ -2768,12 +2841,28 @@ static void mpi3mr_pcietopochg_evt_th(struct mpi3mr_ioc *mrioc,
struct mpi3_event_data_pcie_topology_change_list *topo_evt =
(struct mpi3_event_data_pcie_topology_change_list *)event_reply->event_data;
int i;
- u16 handle;
- u8 reason_code;
+ u16 handle, avail_len;
+ u8 reason_code, max_entries, num_entries;
struct mpi3mr_tgt_dev *tgtdev = NULL;
struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL;
- for (i = 0; i < topo_evt->num_entries; i++) {
+ avail_len = event_reply->event_data_length * 4;
+ if (avail_len < offsetof(struct mpi3_event_data_pcie_topology_change_list, port_entry)) {
+ ioc_err(mrioc, "PCIe topology event: event data too small (%u bytes)\n",
+ avail_len);
+ return;
+ }
+ max_entries = (avail_len -
+ offsetof(struct mpi3_event_data_pcie_topology_change_list, port_entry)) /
+ sizeof(struct mpi3_event_pcie_topo_port_entry);
+ num_entries = topo_evt->num_entries;
+ if (num_entries > max_entries) {
+ ioc_err(mrioc, "PCIe topology event: num_entries(%d) exceeds max(%d)\n",
+ num_entries, max_entries);
+ return;
+ }
+
+ for (i = 0; i < num_entries; i++) {
handle = le16_to_cpu(topo_evt->port_entry[i].attached_dev_handle);
if (!handle)
continue;
@@ -2834,12 +2923,28 @@ static void mpi3mr_sastopochg_evt_th(struct mpi3mr_ioc *mrioc,
struct mpi3_event_data_sas_topology_change_list *topo_evt =
(struct mpi3_event_data_sas_topology_change_list *)event_reply->event_data;
int i;
- u16 handle;
- u8 reason_code;
+ u16 handle, avail_len;
+ u8 reason_code, max_entries, num_entries;
struct mpi3mr_tgt_dev *tgtdev = NULL;
struct mpi3mr_stgt_priv_data *scsi_tgt_priv_data = NULL;
- for (i = 0; i < topo_evt->num_entries; i++) {
+ avail_len = event_reply->event_data_length * 4;
+ if (avail_len < offsetof(struct mpi3_event_data_sas_topology_change_list, phy_entry)) {
+ ioc_err(mrioc, "SAS topology event: event data too small (%u bytes)\n",
+ avail_len);
+ return;
+ }
+ max_entries = (avail_len -
+ offsetof(struct mpi3_event_data_sas_topology_change_list, phy_entry)) /
+ sizeof(struct mpi3_event_sas_topo_phy_entry);
+ num_entries = topo_evt->num_entries;
+ if (num_entries > max_entries) {
+ ioc_err(mrioc, "SAS topology event: num_entries(%d) exceeds max(%d)\n",
+ num_entries, max_entries);
+ return;
+ }
+
+ for (i = 0; i < num_entries; i++) {
handle = le16_to_cpu(topo_evt->phy_entry[i].attached_dev_handle);
if (!handle)
continue;
@@ -3109,7 +3214,7 @@ void mpi3mr_add_event_wait_for_device_refresh(struct mpi3mr_ioc *mrioc)
void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
struct mpi3_event_notification_reply *event_reply)
{
- u16 evt_type, sz;
+ u16 evt_type, sz, avail_reply_room;
struct mpi3mr_fwevt *fwevt = NULL;
bool ack_req = 0, process_evt_bh = 0;
@@ -3170,7 +3275,12 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
case MPI3_EVENT_DEVICE_INFO_CHANGED:
case MPI3_EVENT_LOG_DATA:
- sz = event_reply->event_data_length * 4;
+ if (mrioc->reply_sz > offsetof(struct mpi3_event_notification_reply, event_data))
+ avail_reply_room = mrioc->reply_sz -
+ offsetof(struct mpi3_event_notification_reply, event_data);
+ else
+ avail_reply_room = 0;
+ sz = min_t(u16, event_reply->event_data_length * 4, avail_reply_room);
mpi3mr_app_save_logdata_th(mrioc,
(char *)event_reply->event_data, sz);
break;
@@ -3204,7 +3314,12 @@ void mpi3mr_os_handle_events(struct mpi3mr_ioc *mrioc,
dprint_event_th(mrioc,
"scheduling bottom half handler for event(0x%02x) - (0x%08x), ack_required=%d\n",
evt_type, le32_to_cpu(event_reply->event_context), ack_req);
- sz = event_reply->event_data_length * 4;
+ if (mrioc->reply_sz > offsetof(struct mpi3_event_notification_reply, event_data))
+ avail_reply_room = mrioc->reply_sz -
+ offsetof(struct mpi3_event_notification_reply, event_data);
+ else
+ avail_reply_room = 0;
+ sz = min_t(u16, event_reply->event_data_length * 4, avail_reply_room);
fwevt = mpi3mr_alloc_fwevt(sz);
if (!fwevt) {
dprint_event_th(mrioc,
@@ -3329,8 +3444,7 @@ static void mpi3mr_setup_eedp(struct mpi3mr_ioc *mrioc,
* @desc: Sense type
* @buf: Sense buffer to populate
* @key: Sense key
- * @asc: Additional sense code
- * @ascq: Additional sense code qualifier
+ * @code: Additional sense code and its qualifier
*
* Maps the given sense information into either descriptor or
* fixed format sense data.
@@ -3338,20 +3452,20 @@ static void mpi3mr_setup_eedp(struct mpi3mr_ioc *mrioc,
* Return: Nothing
*/
static inline void mpi3mr_build_sense_buffer(int desc, u8 *buf, u8 key,
- u8 asc, u8 ascq)
+ u16 code)
{
if (desc) {
buf[0] = 0x72; /* descriptor, current */
buf[1] = key;
- buf[2] = asc;
- buf[3] = ascq;
+ buf[2] = scsi_sense_code_asc(code);
+ buf[3] = scsi_sense_code_ascq(code);
buf[7] = 0;
} else {
buf[0] = 0x70; /* fixed, current */
buf[2] = key;
buf[7] = 0xa;
- buf[12] = asc;
- buf[13] = ascq;
+ buf[12] = scsi_sense_code_asc(code);
+ buf[13] = scsi_sense_code_ascq(code);
}
}
@@ -3368,25 +3482,25 @@ static inline void mpi3mr_build_sense_buffer(int desc, u8 *buf, u8 key,
static void mpi3mr_map_eedp_error(struct scsi_cmnd *scmd,
u16 ioc_status)
{
- u8 ascq = 0;
+ u16 sense_code;
switch (ioc_status) {
case MPI3_IOCSTATUS_EEDP_GUARD_ERROR:
- ascq = 0x01;
+ sense_code = LOGICAL_BLOCK_GUARD_CHECK_FAILED;
break;
case MPI3_IOCSTATUS_EEDP_APP_TAG_ERROR:
- ascq = 0x02;
+ sense_code = LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED;
break;
case MPI3_IOCSTATUS_EEDP_REF_TAG_ERROR:
- ascq = 0x03;
+ sense_code = LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED;
break;
default:
- ascq = 0x00;
+ sense_code = ID_CRC_OR_ECC_ERROR;
break;
}
mpi3mr_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
- 0x10, ascq);
+ sense_code);
scmd->result = (DID_ABORT << 16) | SAM_STAT_CHECK_CONDITION;
}
@@ -3447,8 +3561,12 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
scsi_reply = mpi3mr_get_reply_virt_addr(mrioc,
*reply_dma);
if (!scsi_reply) {
- panic("%s: scsi_reply is NULL, this shouldn't happen\n",
- mrioc->name);
+ ioc_err(mrioc, "scsi_reply is NULL, invalid reply_frame_address\n");
+ /*
+ * Do not let the caller repost an address that
+ * failed virt-addr lookup back to the hardware.
+ */
+ *reply_dma = 0;
goto out;
}
host_tag = le16_to_cpu(scsi_reply->host_tag);
@@ -3471,7 +3589,8 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
if (sense_buf) {
scsi_normalize_sense(sense_buf, sense_count, &sshdr);
mpi3mr_scsisense_trigger(mrioc, sshdr.sense_key,
- sshdr.asc, sshdr.ascq);
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
}
mpi3mr_reply_trigger(mrioc, ioc_status, ioc_loginfo);
break;
@@ -3658,7 +3777,8 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
ioc_info(mrioc,
"%s :sense_count 0x%x, sense_key 0x%x ASC 0x%x, ASCQ 0x%x\n",
__func__, sense_count, sshdr.sense_key,
- sshdr.asc, sshdr.ascq);
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
}
}
out_success:
@@ -3943,7 +4063,7 @@ inline void mpi3mr_poll_pend_io_completions(struct mpi3mr_ioc *mrioc)
for (i = mrioc->op_reply_q_offset; i < num_of_reply_queues; i++)
mpi3mr_process_op_reply_q(mrioc,
- mrioc->intr_info[i].op_reply_q);
+ READ_ONCE(mrioc->intr_info[i].op_reply_q));
}
/**
@@ -5065,8 +5185,8 @@ static bool mpi3mr_check_return_unmap(struct mpi3mr_ioc *mrioc,
__func__, param_len);
scsi_print_command(scmd);
scmd->result = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
- 0x1A, 0);
+ scsi_set_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
+ PARAMETER_LIST_LENGTH_ERROR);
scsi_done(scmd);
return true;
}
@@ -5076,8 +5196,8 @@ static bool mpi3mr_check_return_unmap(struct mpi3mr_ioc *mrioc,
__func__, param_len, scsi_bufflen(scmd));
scsi_print_command(scmd);
scmd->result = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
- 0x1A, 0);
+ scsi_set_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
+ PARAMETER_LIST_LENGTH_ERROR);
scsi_done(scmd);
return true;
}
@@ -5085,8 +5205,8 @@ static bool mpi3mr_check_return_unmap(struct mpi3mr_ioc *mrioc,
if (!buf) {
scsi_print_command(scmd);
scmd->result = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
- 0x55, 0x03);
+ scsi_set_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
+ INSUFFICIENT_RESOURCES);
scsi_done(scmd);
return true;
}
@@ -5099,8 +5219,8 @@ static bool mpi3mr_check_return_unmap(struct mpi3mr_ioc *mrioc,
__func__, desc_len);
scsi_print_command(scmd);
scmd->result = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
- 0x26, 0);
+ scsi_set_sense_buffer(0, scmd->sense_buffer, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_PARAMETER_LIST);
scsi_done(scmd);
kfree(buf);
return true;
@@ -5200,7 +5320,8 @@ static enum scsi_qc_status mpi3mr_qcmd(struct Scsi_Host *shost,
if (scsi_get_host_state(scmd->device->host) == SHOST_RECOVERY &&
scmd->cmnd[0] == TEST_UNIT_READY &&
(stgt_priv_data->dev_removed || (dev_handle == MPI3MR_INVALID_DEV_HANDLE))) {
- scsi_build_sense(scmd, 0, UNIT_ATTENTION, 0x29, 0x07);
+ scsi_set_sense(scmd, 0, UNIT_ATTENTION,
+ I_T_NEXUS_LOSS_OCCURRED);
scsi_done(scmd);
goto out;
}
@@ -5690,6 +5811,8 @@ static void mpi3mr_remove(struct pci_dev *pdev)
return;
mrioc = shost_priv(shost);
+ mrioc->is_unload = true;
+
while (mrioc->reset_in_progress || mrioc->is_driver_loading)
ssleep(1);
@@ -5822,6 +5945,9 @@ mpi3mr_suspend(struct device *dev)
ssleep(1);
mrioc->stop_drv_processing = 1;
mpi3mr_cleanup_fwevt_list(mrioc);
+ /* Flush any pending discarded event before unmapping PCI resources below. */
+ if (mrioc->fwevt_worker_thread)
+ flush_workqueue(mrioc->fwevt_worker_thread);
scsi_block_requests(shost);
mpi3mr_stop_watchdog(mrioc);
mpi3mr_cleanup_ioc(mrioc);
diff --git a/drivers/scsi/mpi3mr/mpi3mr_transport.c b/drivers/scsi/mpi3mr/mpi3mr_transport.c
index 232af978d737..f1e34329f5a2 100644
--- a/drivers/scsi/mpi3mr/mpi3mr_transport.c
+++ b/drivers/scsi/mpi3mr/mpi3mr_transport.c
@@ -1090,6 +1090,13 @@ void mpi3mr_update_links(struct mpi3mr_ioc *mrioc,
return;
}
+ if (phy_number >= mr_sas_node->num_phys) {
+ spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
+ ioc_err(mrioc, "%s: phy_number(%d) >= num_phys(%d)\n",
+ __func__, phy_number, mr_sas_node->num_phys);
+ return;
+ }
+
mr_sas_phy = &mr_sas_node->phy[phy_number];
mr_sas_phy->attached_handle = handle;
spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
@@ -1216,13 +1223,14 @@ void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
}
num_phys = sas_io_unit_pg0->num_phys;
kfree(sas_io_unit_pg0);
+ sas_io_unit_pg0 = NULL;
mrioc->sas_hba.host_node = 1;
INIT_LIST_HEAD(&mrioc->sas_hba.sas_port_list);
mrioc->sas_hba.parent_dev = &mrioc->shost->shost_gendev;
mrioc->sas_hba.phy = kzalloc_objs(struct mpi3mr_sas_phy, num_phys);
if (!mrioc->sas_hba.phy)
- return;
+ goto out;
mrioc->sas_hba.num_phys = num_phys;
@@ -1230,12 +1238,12 @@ void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
(num_phys * sizeof(struct mpi3_sas_io_unit0_phy_data));
sas_io_unit_pg0 = kzalloc(sz, GFP_KERNEL);
if (!sas_io_unit_pg0)
- return;
+ goto out_free_phy;
if (mpi3mr_cfg_get_sas_io_unit_pg0(mrioc, sas_io_unit_pg0, sz)) {
ioc_err(mrioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
- goto out;
+ goto out_free_phy;
}
mrioc->sas_hba.handle = 0;
@@ -1249,12 +1257,12 @@ void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
MPI3_SAS_PHY_PGAD_FORM_PHY_NUMBER, i)) {
ioc_err(mrioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
- goto out;
+ goto out_free_phy;
}
if (ioc_status != MPI3_IOCSTATUS_SUCCESS) {
ioc_err(mrioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
- goto out;
+ goto out_free_phy;
}
if (!mrioc->sas_hba.handle)
@@ -1264,26 +1272,27 @@ void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
if (!(mpi3mr_get_hba_port_by_id(mrioc, port_id)))
if (!mpi3mr_alloc_hba_port(mrioc, port_id))
- goto out;
+ goto out_free_phy;
mrioc->sas_hba.phy[i].handle = mrioc->sas_hba.handle;
mrioc->sas_hba.phy[i].phy_id = i;
mrioc->sas_hba.phy[i].hba_port =
mpi3mr_get_hba_port_by_id(mrioc, port_id);
- mpi3mr_add_host_phy(mrioc, &mrioc->sas_hba.phy[i],
- phy_pg0, mrioc->sas_hba.parent_dev);
+ if (mpi3mr_add_host_phy(mrioc, &mrioc->sas_hba.phy[i],
+ phy_pg0, mrioc->sas_hba.parent_dev))
+ goto out_free_phy;
}
if ((mpi3mr_cfg_get_dev_pg0(mrioc, &ioc_status, &dev_pg0,
sizeof(dev_pg0), MPI3_DEVICE_PGAD_FORM_HANDLE,
mrioc->sas_hba.handle))) {
ioc_err(mrioc, "%s: device page0 read failed\n", __func__);
- goto out;
+ goto out_free_phy;
}
if (ioc_status != MPI3_IOCSTATUS_SUCCESS) {
ioc_err(mrioc, "device page read failed for handle(0x%04x), with ioc_status(0x%04x) failure at %s:%d/%s()!\n",
mrioc->sas_hba.handle, ioc_status, __FILE__, __LINE__,
__func__);
- goto out;
+ goto out_free_phy;
}
mrioc->sas_hba.enclosure_handle =
le16_to_cpu(dev_pg0.enclosure_handle);
@@ -1306,6 +1315,17 @@ void mpi3mr_sas_host_add(struct mpi3mr_ioc *mrioc)
le64_to_cpu(encl_pg0.enclosure_logical_id);
}
+ goto out;
+
+out_free_phy:
+ for (i = 0; i < mrioc->sas_hba.num_phys; i++) {
+ if (mrioc->sas_hba.phy[i].phy)
+ sas_phy_delete(mrioc->sas_hba.phy[i].phy);
+ }
+ kfree(mrioc->sas_hba.phy);
+ mrioc->sas_hba.phy = NULL;
+ mrioc->sas_hba.num_phys = 0;
+
out:
kfree(sas_io_unit_pg0);
}
@@ -1330,6 +1350,7 @@ static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
struct mpi3mr_sas_phy *mr_sas_phy, *next;
struct mpi3mr_sas_port *mr_sas_port;
unsigned long flags;
+ bool discard = false;
struct mpi3mr_sas_node *mr_sas_node;
struct sas_rphy *rphy;
struct mpi3mr_tgt_dev *tgtdev = NULL;
@@ -1429,7 +1450,7 @@ static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
port = sas_port_alloc_num(mr_sas_node->parent_dev);
if (!port) {
- ioc_err(mrioc, "failure at %s:%d/%s()!\n",
+ ioc_err(mrioc, "failure at %s:%d/%s() (sas_port_alloc)!\n",
__FILE__, __LINE__, __func__);
goto out_fail;
}
@@ -1456,19 +1477,51 @@ static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
mr_sas_port->port = port;
if (mr_sas_port->remote_identify.device_type == SAS_END_DEVICE) {
rphy = sas_end_device_alloc(port);
+ if (!rphy) {
+ ioc_err(mrioc, "failure at %s:%d/%s() (sas_end_device_alloc)!\n",
+ __FILE__, __LINE__, __func__);
+ sas_port_delete(port);
+ goto out_fail;
+ }
tgtdev->dev_spec.sas_sata_inf.rphy = rphy;
} else {
rphy = sas_expander_alloc(port,
mr_sas_port->remote_identify.device_type);
+ if (!rphy) {
+ ioc_err(mrioc, "failure at %s:%d/%s() (sas_expander_alloc)!\n",
+ __FILE__, __LINE__, __func__);
+ sas_port_delete(port);
+ goto out_fail;
+ }
}
rphy->identify = mr_sas_port->remote_identify;
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (mrioc->stop_drv_processing || mrioc->reset_in_progress) {
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ sas_rphy_free(rphy);
+ sas_port_delete(port);
+ goto out_fail;
+ }
if (mrioc->current_event)
mrioc->current_event->pending_at_sml = 1;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
if ((sas_rphy_add(rphy))) {
ioc_err(mrioc, "failure at %s:%d/%s()!\n",
__FILE__, __LINE__, __func__);
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
+ if (mrioc->current_event) {
+ mrioc->current_event->pending_at_sml = 0;
+ discard = mrioc->current_event->discard;
+ }
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ if (discard)
+ mpi3mr_print_device_event_notice(mrioc, true);
+ sas_rphy_unlink(rphy);
+ sas_rphy_free(rphy);
+ sas_port_delete(port);
+ goto out_fail;
}
if (mr_sas_port->remote_identify.device_type == SAS_END_DEVICE) {
tgtdev->dev_spec.sas_sata_inf.pend_sas_rphy_add = 0;
@@ -1486,11 +1539,14 @@ static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
list_add_tail(&mr_sas_port->port_list, &mr_sas_node->sas_port_list);
spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if (mrioc->current_event) {
mrioc->current_event->pending_at_sml = 0;
- if (mrioc->current_event->discard)
- mpi3mr_print_device_event_notice(mrioc, true);
+ discard = mrioc->current_event->discard;
}
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ if (discard)
+ mpi3mr_print_device_event_notice(mrioc, true);
/* fill in report manufacture */
if (mr_sas_port->remote_identify.device_type ==
@@ -1504,11 +1560,17 @@ static struct mpi3mr_sas_port *mpi3mr_sas_port_add(struct mpi3mr_ioc *mrioc,
return mr_sas_port;
out_fail:
+ if (tgtdev) {
+ tgtdev->dev_spec.sas_sata_inf.pend_sas_rphy_add = 0;
+ tgtdev->dev_spec.sas_sata_inf.rphy = NULL;
+ mpi3mr_tgtdev_put(tgtdev);
+ }
+
list_for_each_entry_safe(mr_sas_phy, next, &mr_sas_port->phy_list,
- port_siblings)
+ port_siblings) {
+ mr_sas_phy->phy_belongs_to_port = 0;
list_del(&mr_sas_phy->port_siblings);
- if (tgtdev)
- mpi3mr_tgtdev_put(tgtdev);
+ }
kfree(mr_sas_port);
return NULL;
}
@@ -1530,6 +1592,7 @@ static void mpi3mr_sas_port_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
{
int i;
unsigned long flags;
+ bool discard = false;
struct mpi3mr_sas_port *mr_sas_port, *next;
struct mpi3mr_sas_node *mr_sas_node;
u8 found = 0;
@@ -1586,8 +1649,10 @@ static void mpi3mr_sas_port_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
spin_unlock_irqrestore(&mrioc->sas_node_lock, flags);
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if (mrioc->current_event)
mrioc->current_event->pending_at_sml = 1;
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
list_for_each_entry_safe(mr_sas_phy, next_phy,
&mr_sas_port->phy_list, port_siblings) {
@@ -1609,11 +1674,14 @@ static void mpi3mr_sas_port_remove(struct mpi3mr_ioc *mrioc, u64 sas_address,
ioc_info(mrioc, "%s: removed sas_address(0x%016llx)\n",
__func__, (unsigned long long)sas_address);
+ spin_lock_irqsave(&mrioc->fwevt_lock, flags);
if (mrioc->current_event) {
mrioc->current_event->pending_at_sml = 0;
- if (mrioc->current_event->discard)
- mpi3mr_print_device_event_notice(mrioc, false);
+ discard = mrioc->current_event->discard;
}
+ spin_unlock_irqrestore(&mrioc->fwevt_lock, flags);
+ if (discard)
+ mpi3mr_print_device_event_notice(mrioc, false);
kfree(mr_sas_port);
}
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 0e12009a87f6..085d4672db85 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -5401,23 +5401,23 @@ _scsih_setup_eedp(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
static void
_scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
{
- u8 ascq;
+ u16 sense_code;
switch (ioc_status) {
case MPI2_IOCSTATUS_EEDP_GUARD_ERROR:
- ascq = 0x01;
+ sense_code = LOGICAL_BLOCK_GUARD_CHECK_FAILED;
break;
case MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR:
- ascq = 0x02;
+ sense_code = LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED;
break;
case MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR:
- ascq = 0x03;
+ sense_code = LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED;
break;
default:
- ascq = 0x00;
+ sense_code = ID_CRC_OR_ECC_ERROR;
break;
}
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x10, ascq);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST, sense_code);
set_host_byte(scmd, DID_ABORT);
}
@@ -5474,7 +5474,8 @@ static enum scsi_qc_status scsih_qcmd(struct Scsi_Host *shost,
if (handle == MPT3SAS_INVALID_DEVICE_HANDLE || sas_device_priv_data->block) {
if (scsi_get_host_state(scmd->device->host) == SHOST_RECOVERY &&
scmd->cmnd[0] == TEST_UNIT_READY) {
- scsi_build_sense(scmd, 0, UNIT_ATTENTION, 0x29, 0x07);
+ scsi_set_sense(scmd, 0, UNIT_ATTENTION,
+ I_T_NEXUS_LOSS_OCCURRED);
scsi_done(scmd);
return 0;
}
@@ -5986,7 +5987,7 @@ _scsih_smart_predicted_fault(struct MPT3SAS_ADAPTER *ioc, u16 handle)
event_data = (Mpi2EventDataSasDeviceStatusChange_t *)
event_reply->EventData;
event_data->ReasonCode = MPI2_EVENT_SAS_DEV_STAT_RC_SMART_DATA;
- event_data->ASC = 0x5D;
+ event_data->ASC = ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED;
event_data->DevHandle = cpu_to_le16(handle);
event_data->SASAddress = cpu_to_le64(sas_target_priv_data->sas_address);
mpt3sas_ctl_add_to_event_log(ioc, event_reply);
@@ -6109,8 +6110,7 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
le32_to_cpu(mpi_reply->SenseCount));
memcpy(scmd->sense_buffer, sense_data, sz);
_scsih_normalize_sense(scmd->sense_buffer, &data);
- /* failure prediction threshold exceeded */
- if (data.asc == 0x5D)
+ if (data.asc == ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED)
_scsih_smart_predicted_fault(ioc,
le16_to_cpu(mpi_reply->DevHandle));
mpt3sas_trigger_scsi(ioc, data.skey, data.asc, data.ascq);
@@ -6199,8 +6199,8 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
else if (!xfer_cnt && scmd->cmnd[0] == REPORT_LUNS) {
mpi_reply->SCSIState = MPI2_SCSI_STATE_AUTOSENSE_VALID;
mpi_reply->SCSIStatus = SAM_STAT_CHECK_CONDITION;
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST,
- 0x20, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_COMMAND_OP_CODE);
}
break;
@@ -7691,38 +7691,41 @@ _scsih_determine_disposition(struct MPT3SAS_ADAPTER *ioc,
if (check_sense) {
_scsih_normalize_sense(transfer_packet->sense, &sense_info);
- if (sense_info.skey == UNIT_ATTENTION)
+ if (sense_info.skey == UNIT_ATTENTION) {
rc = DEVICE_RETRY_UA;
- else if (sense_info.skey == NOT_READY) {
- /* medium isn't present */
- if (sense_info.asc == 0x3a)
+ } else if (sense_info.skey == NOT_READY) {
+ if (sense_info.asc == ASC_MEDIUM_NOT_PRESENT) {
rc = DEVICE_READY;
- /* LOGICAL UNIT NOT READY */
- else if (sense_info.asc == 0x04) {
- if (sense_info.ascq == 0x03 ||
- sense_info.ascq == 0x0b ||
- sense_info.ascq == 0x0c) {
+ } else if (sense_info.asc == ASC_LU_NOT_READY) {
+ u16 scode = scsi_sense_code(sense_info.asc,
+ sense_info.ascq);
+
+ if (scode ==
+ LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED ||
+ scode ==
+ LU_NOT_ACCESSIBLE_TARGET_PORT_IN_STANDBY_STATE ||
+ scode ==
+ LU_NOT_ACCESSIBLE_TARGET_PORT_IN_UNAVAILABLE_STATE)
rc = DEVICE_ERROR;
- } else
+ else
rc = DEVICE_START_UNIT;
- }
- /* LOGICAL UNIT HAS NOT SELF-CONFIGURED YET */
- else if (sense_info.asc == 0x3e && !sense_info.ascq)
+ } else if (sense_info.asc ==
+ ASC_LU_HAS_NOT_SELF_CONFIGURED_YET &&
+ !sense_info.ascq) {
rc = DEVICE_START_UNIT;
+ }
} else if (sense_info.skey == ILLEGAL_REQUEST &&
- transfer_packet->cdb[0] == REPORT_LUNS) {
+ transfer_packet->cdb[0] == REPORT_LUNS) {
rc = DEVICE_READY;
} else if (sense_info.skey == MEDIUM_ERROR) {
-
- /* medium is corrupt, lets add the device so
- * users can collect some info as needed
+ /*
+ * medium is corrupt, lets add the device so users can
+ * collect some info as needed
*/
-
- if (sense_info.asc == 0x31)
+ if (sense_info.asc == ASC_MEDIUM_FORMAT_CORRUPTED)
rc = DEVICE_READY;
} else if (sense_info.skey == HARDWARE_ERROR) {
- /* Defect List Error, still add the device */
- if (sense_info.asc == 0x19)
+ if (sense_info.asc == ASC_DEFECT_LIST_ERROR)
rc = DEVICE_READY;
}
}
diff --git a/drivers/scsi/mvumi.c b/drivers/scsi/mvumi.c
index e70d336b4ab3..91c2db697c69 100644
--- a/drivers/scsi/mvumi.c
+++ b/drivers/scsi/mvumi.c
@@ -722,9 +722,9 @@ static int mvumi_issue_blocked_cmd(struct mvumi_hba *mhba,
return -1;
}
atomic_inc(&cmd->sync_cmd);
- spin_lock_irqsave(mhba->shost->host_lock, flags);
+ spin_lock_irqsave(&mhba->shost->host_lock, flags);
mhba->instancet->fire_cmd(mhba, cmd);
- spin_unlock_irqrestore(mhba->shost->host_lock, flags);
+ spin_unlock_irqrestore(&mhba->shost->host_lock, flags);
wait_event_timeout(mhba->int_cmd_wait_q,
(cmd->cmd_status != REQ_STATUS_PENDING),
@@ -732,7 +732,7 @@ static int mvumi_issue_blocked_cmd(struct mvumi_hba *mhba,
/* command timeout */
if (atomic_read(&cmd->sync_cmd)) {
- spin_lock_irqsave(mhba->shost->host_lock, flags);
+ spin_lock_irqsave(&mhba->shost->host_lock, flags);
atomic_dec(&cmd->sync_cmd);
if (mhba->tag_cmd[cmd->frame->tag]) {
mhba->tag_cmd[cmd->frame->tag] = NULL;
@@ -747,7 +747,7 @@ static int mvumi_issue_blocked_cmd(struct mvumi_hba *mhba,
} else
atomic_dec(&mhba->fw_outstanding);
- spin_unlock_irqrestore(mhba->shost->host_lock, flags);
+ spin_unlock_irqrestore(&mhba->shost->host_lock, flags);
}
return 0;
}
@@ -1791,9 +1791,9 @@ static irqreturn_t mvumi_isr_handler(int irq, void *devp)
struct mvumi_hba *mhba = (struct mvumi_hba *) devp;
unsigned long flags;
- spin_lock_irqsave(mhba->shost->host_lock, flags);
+ spin_lock_irqsave(&mhba->shost->host_lock, flags);
if (unlikely(mhba->instancet->clear_intr(mhba) || !mhba->global_isr)) {
- spin_unlock_irqrestore(mhba->shost->host_lock, flags);
+ spin_unlock_irqrestore(&mhba->shost->host_lock, flags);
return IRQ_NONE;
}
@@ -1814,7 +1814,7 @@ static irqreturn_t mvumi_isr_handler(int irq, void *devp)
mhba->isr_status = 0;
if (mhba->fw_state == FW_STATE_STARTED)
mvumi_handle_clob(mhba);
- spin_unlock_irqrestore(mhba->shost->host_lock, flags);
+ spin_unlock_irqrestore(&mhba->shost->host_lock, flags);
return IRQ_HANDLED;
}
@@ -2067,7 +2067,7 @@ static unsigned char mvumi_build_frame(struct mvumi_hba *mhba,
return 0;
error:
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return -1;
}
@@ -2083,13 +2083,13 @@ static enum scsi_qc_status mvumi_queue_command(struct Scsi_Host *shost,
struct mvumi_hba *mhba;
unsigned long irq_flags;
- spin_lock_irqsave(shost->host_lock, irq_flags);
+ spin_lock_irqsave(&shost->host_lock, irq_flags);
mhba = (struct mvumi_hba *) shost->hostdata;
scmd->result = 0;
cmd = mvumi_get_cmd(mhba);
if (unlikely(!cmd)) {
- spin_unlock_irqrestore(shost->host_lock, irq_flags);
+ spin_unlock_irqrestore(&shost->host_lock, irq_flags);
return SCSI_MLQUEUE_HOST_BUSY;
}
@@ -2099,13 +2099,13 @@ static enum scsi_qc_status mvumi_queue_command(struct Scsi_Host *shost,
cmd->scmd = scmd;
mvumi_priv(scmd)->cmd_priv = cmd;
mhba->instancet->fire_cmd(mhba, cmd);
- spin_unlock_irqrestore(shost->host_lock, irq_flags);
+ spin_unlock_irqrestore(&shost->host_lock, irq_flags);
return 0;
out_return_cmd:
mvumi_return_cmd(mhba, cmd);
scsi_done(scmd);
- spin_unlock_irqrestore(shost->host_lock, irq_flags);
+ spin_unlock_irqrestore(&shost->host_lock, irq_flags);
return 0;
}
@@ -2116,7 +2116,7 @@ static enum scsi_timeout_action mvumi_timed_out(struct scsi_cmnd *scmd)
struct mvumi_hba *mhba = shost_priv(host);
unsigned long flags;
- spin_lock_irqsave(mhba->shost->host_lock, flags);
+ spin_lock_irqsave(&mhba->shost->host_lock, flags);
if (mhba->tag_cmd[cmd->frame->tag]) {
mhba->tag_cmd[cmd->frame->tag] = NULL;
@@ -2135,7 +2135,7 @@ static enum scsi_timeout_action mvumi_timed_out(struct scsi_cmnd *scmd)
scmd->sc_data_direction);
}
mvumi_return_cmd(mhba, cmd);
- spin_unlock_irqrestore(mhba->shost->host_lock, flags);
+ spin_unlock_irqrestore(&mhba->shost->host_lock, flags);
return SCSI_EH_NOT_HANDLED;
}
diff --git a/drivers/scsi/myrb.c b/drivers/scsi/myrb.c
index 3678b66310ed..95df6e5345f7 100644
--- a/drivers/scsi/myrb.c
+++ b/drivers/scsi/myrb.c
@@ -314,17 +314,19 @@ static void myrb_get_event(struct myrb_hba *cb, unsigned int event)
scsi_normalize_sense(ev_buf->sense, 32, &sshdr);
if (sshdr.sense_key == VENDOR_SPECIFIC &&
- sshdr.asc == 0x80 &&
- sshdr.ascq < ARRAY_SIZE(myrb_event_msg))
+ scsi_sense_asc(&sshdr) == 0x80 &&
+ scsi_sense_ascq(&sshdr) < ARRAY_SIZE(myrb_event_msg))
shost_printk(KERN_CRIT, cb->host,
"Physical drive %d:%d: %s\n",
ev_buf->channel, ev_buf->target,
- myrb_event_msg[sshdr.ascq]);
+ myrb_event_msg[scsi_sense_ascq(&sshdr)]);
else
shost_printk(KERN_CRIT, cb->host,
"Physical drive %d:%d: Sense: %X/%02X/%02X\n",
ev_buf->channel, ev_buf->target,
- sshdr.sense_key, sshdr.asc, sshdr.ascq);
+ sshdr.sense_key,
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
}
dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry),
@@ -1398,7 +1400,7 @@ myrb_mode_sense(struct myrb_hba *cb, struct scsi_cmnd *scmd,
static void myrb_request_sense(struct myrb_hba *cb,
struct scsi_cmnd *scmd)
{
- scsi_build_sense(scmd, 0, NO_SENSE, 0, 0);
+ scsi_set_sense(scmd, 0, NO_SENSE, NO_ADDITIONAL_SENSE_INFORMATION);
scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer,
SCSI_SENSE_BUFFERSIZE);
}
@@ -1446,8 +1448,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
return 0;
case INQUIRY:
if (scmd->cmnd[1] & 1) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
} else {
myrb_inquiry(cb, scmd);
scmd->result = (DID_OK << 16);
@@ -1461,8 +1463,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
case MODE_SENSE:
if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
(scmd->cmnd[2] & 0x3F) != 0x08) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
} else {
myrb_mode_sense(cb, scmd, ldev_info);
scmd->result = (DID_OK << 16);
@@ -1472,15 +1474,15 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
case READ_CAPACITY:
if ((scmd->cmnd[1] & 1) ||
(scmd->cmnd[8] & 1)) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
scsi_done(scmd);
return 0;
}
lba = get_unaligned_be32(&scmd->cmnd[2]);
if (lba) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
scsi_done(scmd);
return 0;
}
@@ -1493,8 +1495,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
return 0;
case SEND_DIAGNOSTIC:
if (scmd->cmnd[1] != 0x04) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
} else {
/* Assume good status */
scmd->result = (DID_OK << 16);
@@ -1503,8 +1505,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
return 0;
case READ_6:
if (ldev_info->state == MYRB_DEVICE_WO) {
- /* Data protect, attempt to read invalid data */
- scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
+ scsi_set_sense(scmd, 0, DATA_PROTECT,
+ ATTEMPT_TO_READ_INVALID_DATA);
scsi_done(scmd);
return 0;
}
@@ -1517,8 +1519,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
break;
case READ_10:
if (ldev_info->state == MYRB_DEVICE_WO) {
- /* Data protect, attempt to read invalid data */
- scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
+ scsi_set_sense(scmd, 0, DATA_PROTECT,
+ ATTEMPT_TO_READ_INVALID_DATA);
scsi_done(scmd);
return 0;
}
@@ -1531,8 +1533,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
break;
case READ_12:
if (ldev_info->state == MYRB_DEVICE_WO) {
- /* Data protect, attempt to read invalid data */
- scsi_build_sense(scmd, 0, DATA_PROTECT, 0x21, 0x06);
+ scsi_set_sense(scmd, 0, DATA_PROTECT,
+ ATTEMPT_TO_READ_INVALID_DATA);
scsi_done(scmd);
return 0;
}
@@ -1544,8 +1546,8 @@ static enum scsi_qc_status myrb_ldev_queuecommand(struct Scsi_Host *shost,
block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
break;
default:
- /* Illegal request, invalid opcode */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x20, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_COMMAND_OP_CODE);
scsi_done(scmd);
return 0;
}
@@ -2328,20 +2330,19 @@ static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
dev_dbg(&scmd->device->sdev_gendev,
"Bad Data Encountered\n");
if (scmd->sc_data_direction == DMA_FROM_DEVICE)
- /* Unrecovered read error */
- scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0);
+ scsi_set_sense(scmd, 0, MEDIUM_ERROR,
+ UNRECOVERED_READ_ERROR);
else
- /* Write error */
- scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0);
+ scsi_set_sense(scmd, 0, MEDIUM_ERROR, SSC_WRITE_ERROR);
break;
case MYRB_STATUS_IRRECOVERABLE_DATA_ERROR:
scmd_printk(KERN_ERR, scmd, "Irrecoverable Data Error\n");
if (scmd->sc_data_direction == DMA_FROM_DEVICE)
- /* Unrecovered read error, auto-reallocation failed */
- scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x11, 0x04);
+ scsi_set_sense(scmd, 0, MEDIUM_ERROR,
+ UNRECOVERED_READ_ERROR_AUTO_REALLOCATE_FAILED);
else
- /* Write error, auto-reallocation failed */
- scsi_build_sense(scmd, 0, MEDIUM_ERROR, 0x0C, 0x02);
+ scsi_set_sense(scmd, 0, MEDIUM_ERROR,
+ WRITE_ERROR_AUTO_REALLOCATION_FAILED);
break;
case MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE:
dev_dbg(&scmd->device->sdev_gendev,
@@ -2351,8 +2352,8 @@ static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
case MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV:
dev_dbg(&scmd->device->sdev_gendev,
"Attempt to Access Beyond End of Logical Drive");
- /* Logical block address out of range */
- scsi_build_sense(scmd, 0, NOT_READY, 0x21, 0);
+ scsi_set_sense(scmd, 0, NOT_READY,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
break;
case MYRB_STATUS_DEVICE_NONRESPONSIVE:
dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n");
diff --git a/drivers/scsi/myrs.c b/drivers/scsi/myrs.c
index afd68225221a..1192b01fab8e 100644
--- a/drivers/scsi/myrs.c
+++ b/drivers/scsi/myrs.c
@@ -816,7 +816,7 @@ static void myrs_log_event(struct myrs_hba *cs, struct myrs_event *ev)
struct Scsi_Host *shost = cs->host;
struct scsi_device *sdev;
struct scsi_sense_hdr sshdr = {0};
- unsigned char sense_info[4];
+ unsigned char asc, sense_info[4];
unsigned char cmd_specific[4];
if (ev->ev_code == 0x1C) {
@@ -829,9 +829,11 @@ static void myrs_log_event(struct myrs_hba *cs, struct myrs_event *ev)
memcpy(cmd_specific, &ev->sense_data[7], 4);
}
}
+ asc = scsi_sense_asc(&sshdr);
if (sshdr.sense_key == VENDOR_SPECIFIC &&
- (sshdr.asc == 0x80 || sshdr.asc == 0x81))
- ev->ev_code = ((sshdr.asc - 0x80) << 8 | sshdr.ascq);
+ (asc == 0x80 || asc == 0x81))
+ ev->ev_code = scsi_sense_code(asc - 0x80,
+ scsi_sense_ascq(&sshdr));
while (true) {
ev_code = myrs_ev_list[ev_idx].ev_code;
if (ev_code == ev->ev_code || ev_code == 0)
@@ -891,8 +893,9 @@ static void myrs_log_event(struct myrs_hba *cs, struct myrs_event *ev)
case 'S':
if (sshdr.sense_key == NO_SENSE ||
(sshdr.sense_key == NOT_READY &&
- sshdr.asc == 0x04 && (sshdr.ascq == 0x01 ||
- sshdr.ascq == 0x02)))
+ (sshdr.sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY ||
+ sshdr.sense_code ==
+ LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED)))
break;
shost_printk(KERN_INFO, shost,
"event %d: Physical Device %d:%d %s\n",
@@ -900,7 +903,8 @@ static void myrs_log_event(struct myrs_hba *cs, struct myrs_event *ev)
shost_printk(KERN_INFO, shost,
"Physical Device %d:%d Sense Key = %X, ASC = %02X, ASCQ = %02X\n",
ev->channel, ev->target,
- sshdr.sense_key, sshdr.asc, sshdr.ascq);
+ sshdr.sense_key, scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
shost_printk(KERN_INFO, shost,
"Physical Device %d:%d Sense Information = %02X%02X%02X%02X %02X%02X%02X%02X\n",
ev->channel, ev->target,
@@ -1603,7 +1607,8 @@ static enum scsi_qc_status myrs_queuecommand(struct Scsi_Host *shost,
switch (scmd->cmnd[0]) {
case REPORT_LUNS:
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x20, 0x0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_COMMAND_OP_CODE);
scsi_done(scmd);
return 0;
case MODE_SENSE:
@@ -1612,8 +1617,8 @@ static enum scsi_qc_status myrs_queuecommand(struct Scsi_Host *shost,
if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
(scmd->cmnd[2] & 0x3F) != 0x08) {
- /* Illegal request, invalid field in CDB */
- scsi_build_sense(scmd, 0, ILLEGAL_REQUEST, 0x24, 0);
+ scsi_set_sense(scmd, 0, ILLEGAL_REQUEST,
+ INVALID_FIELD_IN_CDB);
} else {
myrs_mode_sense(cs, scmd, ldev_info);
scmd->result = (DID_OK << 16);
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c
index 9c9281222a0a..98550c73d8a0 100644
--- a/drivers/scsi/nsp32.c
+++ b/drivers/scsi/nsp32.c
@@ -1166,7 +1166,7 @@ static irqreturn_t do_nsp32_isr(int irq, void *dev_id)
int handled = 0;
struct Scsi_Host *host = data->Host;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
/*
* IRQ check, then enable IRQ mask
@@ -1433,7 +1433,7 @@ static irqreturn_t do_nsp32_isr(int irq, void *dev_id)
nsp32_write2(base, IRQ_CONTROL, 0);
out2:
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
nsp32_dbg(NSP32_DEBUG_INTR, "exit");
@@ -2886,14 +2886,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);
+ 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);
+ spin_unlock_irq(&SCpnt->device->host->host_lock);
return SUCCESS; /* Host reset is succeeded at any time. */
}
diff --git a/drivers/scsi/pcmcia/sym53c500_cs.c b/drivers/scsi/pcmcia/sym53c500_cs.c
index 1530c1ad5d36..aeae5c16e406 100644
--- a/drivers/scsi/pcmcia/sym53c500_cs.c
+++ b/drivers/scsi/pcmcia/sym53c500_cs.c
@@ -360,7 +360,7 @@ SYM53C500_intr(int irq, void *dev_id)
struct sym53c500_cmd_priv *scp = scsi_cmd_priv(curSC);
int fast_pio = data->fast_pio;
- spin_lock_irqsave(dev->host_lock, flags);
+ spin_lock_irqsave(&dev->host_lock, flags);
VDEB(printk("SYM53C500_intr called\n"));
@@ -494,7 +494,7 @@ SYM53C500_intr(int irq, void *dev_id)
break;
}
out:
- spin_unlock_irqrestore(dev->host_lock, flags);
+ spin_unlock_irqrestore(&dev->host_lock, flags);
return IRQ_HANDLED;
idle_out:
@@ -588,9 +588,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);
+ spin_lock_irq(&SCpnt->device->host->host_lock);
SYM53C500_int_host_reset(port_base);
- spin_unlock_irq(SCpnt->device->host->host_lock);
+ spin_unlock_irq(&SCpnt->device->host->host_lock);
return SUCCESS;
}
diff --git a/drivers/scsi/pm8001/pm8001_defs.h b/drivers/scsi/pm8001/pm8001_defs.h
index 4e19d61dffbb..a9605ca317f3 100644
--- a/drivers/scsi/pm8001/pm8001_defs.h
+++ b/drivers/scsi/pm8001/pm8001_defs.h
@@ -41,6 +41,104 @@
#ifndef _PM8001_DEFS_H_
#define _PM8001_DEFS_H_
+#include <scsi/sas.h>
+
+#ifdef __LITTLE_ENDIAN_BITFIELD
+struct sas_identify_frame_local {
+ /* Byte 0 */
+ u8 frame_type:4;
+ u8 dev_type:3;
+ u8 _un0:1;
+
+ /* Byte 1 */
+ u8 _un1;
+
+ /* Byte 2 */
+ union {
+ struct {
+ u8 _un20:1;
+ u8 smp_iport:1;
+ u8 stp_iport:1;
+ u8 ssp_iport:1;
+ u8 _un247:4;
+ };
+ u8 initiator_bits;
+ };
+
+ /* Byte 3 */
+ union {
+ struct {
+ u8 _un30:1;
+ u8 smp_tport:1;
+ u8 stp_tport:1;
+ u8 ssp_tport:1;
+ u8 _un347:4;
+ };
+ u8 target_bits;
+ };
+
+ /* Byte 4 - 11 */
+ u8 _un4_11[8];
+
+ /* Byte 12 - 19 */
+ u8 sas_addr[SAS_ADDR_SIZE];
+
+ /* Byte 20 */
+ u8 phy_id;
+
+ u8 _un21_27[7];
+
+} __packed;
+
+#elif defined(__BIG_ENDIAN_BITFIELD)
+struct sas_identify_frame_local {
+ /* Byte 0 */
+ u8 _un0:1;
+ u8 dev_type:3;
+ u8 frame_type:4;
+
+ /* Byte 1 */
+ u8 _un1;
+
+ /* Byte 2 */
+ union {
+ struct {
+ u8 _un247:4;
+ u8 ssp_iport:1;
+ u8 stp_iport:1;
+ u8 smp_iport:1;
+ u8 _un20:1;
+ };
+ u8 initiator_bits;
+ };
+
+ /* Byte 3 */
+ union {
+ struct {
+ u8 _un347:4;
+ u8 ssp_tport:1;
+ u8 stp_tport:1;
+ u8 smp_tport:1;
+ u8 _un30:1;
+ };
+ u8 target_bits;
+ };
+
+ /* Byte 4 - 11 */
+ u8 _un4_11[8];
+
+ /* Byte 12 - 19 */
+ u8 sas_addr[SAS_ADDR_SIZE];
+
+ /* Byte 20 */
+ u8 phy_id;
+
+ u8 _un21_27[7];
+} __packed;
+#else
+#error "Bitfield order not defined!"
+#endif
+
enum chip_flavors {
chip_8001,
chip_8008,
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index fff8d877abb9..55a01e533fd1 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -3208,7 +3208,7 @@ hw_event_sata_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
phy->sas_phy.oob_mode = SATA_OOB_MODE;
sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC);
spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags);
- memcpy(phy->frame_rcvd, ((u8 *)&pPayload->sata_fis - 4),
+ memcpy(phy->frame_rcvd, &pPayload->sata_fis,
sizeof(struct dev_to_host_fis));
phy->frame_rcvd_size = sizeof(struct dev_to_host_fis);
phy->identify.target_port_protocols = SAS_PROTOCOL_SATA;
diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h
index f1ce8df082b0..a21b1b37a8ea 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.h
+++ b/drivers/scsi/pm8001/pm8001_hwi.h
@@ -42,6 +42,7 @@
#include <linux/types.h>
#include <scsi/libsas.h>
+#include "pm8001_defs.h"
/* for Request Opcode of IOMB */
@@ -229,8 +230,9 @@ struct hw_event_resp {
__le32 lr_evt_status_phyid_portid;
__le32 evt_param;
__le32 npip_portstate;
- struct sas_identify_frame sas_identify;
+ struct sas_identify_frame_local sas_identify;
struct dev_to_host_fis sata_fis;
+ u32 _r_a;
} __attribute__((packed, aligned(4)));
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 2c0fa7ab33d2..659dbd603a03 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -3296,7 +3296,7 @@ hw_event_sata_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
phy->sas_phy.oob_mode = SATA_OOB_MODE;
sas_notify_phy_event(&phy->sas_phy, PHYE_OOB_DONE, GFP_ATOMIC);
spin_lock_irqsave(&phy->sas_phy.frame_rcvd_lock, flags);
- memcpy(phy->frame_rcvd, ((u8 *)&pPayload->sata_fis - 4),
+ memcpy(phy->frame_rcvd, &pPayload->sata_fis,
sizeof(struct dev_to_host_fis));
phy->frame_rcvd_size = sizeof(struct dev_to_host_fis);
phy->identify.target_port_protocols = SAS_PROTOCOL_SATA;
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index d8a63b7fed6a..d6796ba40df9 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -43,6 +43,7 @@
#include <linux/types.h>
#include <scsi/libsas.h>
+#include "pm8001_defs.h"
/* for Request Opcode of IOMB */
#define OPC_INB_ECHO 1 /* 0x000 */
@@ -236,102 +237,6 @@
/* Port recovery timeout, 10000 ms for PM8006 controller */
#define CHIP_8006_PORT_RECOVERY_TIMEOUT 0x640000
-#ifdef __LITTLE_ENDIAN_BITFIELD
-struct sas_identify_frame_local {
- /* Byte 0 */
- u8 frame_type:4;
- u8 dev_type:3;
- u8 _un0:1;
-
- /* Byte 1 */
- u8 _un1;
-
- /* Byte 2 */
- union {
- struct {
- u8 _un20:1;
- u8 smp_iport:1;
- u8 stp_iport:1;
- u8 ssp_iport:1;
- u8 _un247:4;
- };
- u8 initiator_bits;
- };
-
- /* Byte 3 */
- union {
- struct {
- u8 _un30:1;
- u8 smp_tport:1;
- u8 stp_tport:1;
- u8 ssp_tport:1;
- u8 _un347:4;
- };
- u8 target_bits;
- };
-
- /* Byte 4 - 11 */
- u8 _un4_11[8];
-
- /* Byte 12 - 19 */
- u8 sas_addr[SAS_ADDR_SIZE];
-
- /* Byte 20 */
- u8 phy_id;
-
- u8 _un21_27[7];
-
-} __packed;
-
-#elif defined(__BIG_ENDIAN_BITFIELD)
-struct sas_identify_frame_local {
- /* Byte 0 */
- u8 _un0:1;
- u8 dev_type:3;
- u8 frame_type:4;
-
- /* Byte 1 */
- u8 _un1;
-
- /* Byte 2 */
- union {
- struct {
- u8 _un247:4;
- u8 ssp_iport:1;
- u8 stp_iport:1;
- u8 smp_iport:1;
- u8 _un20:1;
- };
- u8 initiator_bits;
- };
-
- /* Byte 3 */
- union {
- struct {
- u8 _un347:4;
- u8 ssp_tport:1;
- u8 stp_tport:1;
- u8 smp_tport:1;
- u8 _un30:1;
- };
- u8 target_bits;
- };
-
- /* Byte 4 - 11 */
- u8 _un4_11[8];
-
- /* Byte 12 - 19 */
- u8 sas_addr[SAS_ADDR_SIZE];
-
- /* Byte 20 */
- u8 phy_id;
-
- u8 _un21_27[7];
-} __packed;
-#else
-#error "Bitfield order not defined!"
-#endif
-
struct mpi_msg_hdr {
__le32 header; /* Bits [11:0] - Message operation code */
/* Bits [15:12] - Message Category */
@@ -427,8 +332,9 @@ struct hw_event_resp {
__le32 lr_status_evt_portid;
__le32 evt_param;
__le32 phyid_npip_portstate;
- struct sas_identify_frame sas_identify;
+ struct sas_identify_frame_local sas_identify;
struct dev_to_host_fis sata_fis;
+ u32 _r_a;
} __attribute__((packed, aligned(4)));
/*
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index 942a99393204..b68f6460207c 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -497,10 +497,10 @@ static void pmcraid_clr_trans_op(
if (pinstance->reset_cmd != NULL) {
timer_delete(&pinstance->reset_cmd->timer);
spin_lock_irqsave(
- pinstance->host->host_lock, lock_flags);
+ &pinstance->host->host_lock, lock_flags);
pinstance->reset_cmd->cmd_done(pinstance->reset_cmd);
spin_unlock_irqrestore(
- pinstance->host->host_lock, lock_flags);
+ &pinstance->host->host_lock, lock_flags);
}
}
@@ -562,9 +562,9 @@ static void pmcraid_bist_done(struct timer_list *t)
} else {
cmd->time_left = 0;
pmcraid_info("BIST is complete, proceeding with reset\n");
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pmcraid_ioa_reset(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
}
}
@@ -613,9 +613,9 @@ static void pmcraid_reset_alert_done(struct timer_list *t)
if (((status & INTRS_CRITICAL_OP_IN_PROGRESS) == 0) ||
cmd->time_left <= 0) {
pmcraid_info("critical op is reset proceeding with reset\n");
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pmcraid_ioa_reset(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
} else {
pmcraid_info("critical op is not yet reset waiting again\n");
/* restart timer if some more time is available to wait */
@@ -699,7 +699,7 @@ static void pmcraid_timeout_handler(struct timer_list *t)
* reset is in progress. Otherwise fail this command and get a free
* command block to restart the reset sequence.
*/
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
if (!pinstance->ioa_reset_in_progress) {
pinstance->ioa_reset_attempts = 0;
cmd = pmcraid_get_free_cmd(pinstance);
@@ -708,7 +708,7 @@ static void pmcraid_timeout_handler(struct timer_list *t)
* Some other command's timeout handler can do the reset job
*/
if (cmd == NULL) {
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
lock_flags);
pmcraid_err("no free cmnd block for timeout handler\n");
return;
@@ -745,7 +745,7 @@ static void pmcraid_timeout_handler(struct timer_list *t)
pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;
scsi_block_requests(pinstance->host);
pmcraid_reset_alert(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
}
/**
@@ -921,9 +921,9 @@ static void pmcraid_ioa_shutdown_done(struct pmcraid_cmd *cmd)
struct pmcraid_instance *pinstance = cmd->drv_inst;
unsigned long lock_flags;
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pmcraid_ioa_reset(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
}
/**
@@ -982,10 +982,10 @@ static void pmcraid_get_fwversion_done(struct pmcraid_cmd *cmd)
*/
if (ioasc) {
pmcraid_err("IOA Inquiry failed with %x\n", ioasc);
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pinstance->ioa_state = IOA_STATE_IN_RESET_ALERT;
pmcraid_reset_alert(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
} else {
pmcraid_querycfg(cmd);
}
@@ -1596,11 +1596,11 @@ static void pmcraid_handle_config_change(struct pmcraid_instance *pinstance)
spin_unlock_irqrestore(&pinstance->resource_lock,
lock_flags);
pmcraid_err("too many resources attached\n");
- spin_lock_irqsave(pinstance->host->host_lock,
+ spin_lock_irqsave(&pinstance->host->host_lock,
host_lock_flags);
pmcraid_send_hcam(pinstance,
PMCRAID_HCAM_CODE_CONFIG_CHANGE);
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
host_lock_flags);
return;
}
@@ -1760,9 +1760,9 @@ static void pmcraid_process_ccn(struct pmcraid_cmd *cmd)
} else if (ioasc) {
dev_info(&pinstance->pdev->dev,
"Host RCB (CCN) failed with IOASC: 0x%08X\n", ioasc);
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pmcraid_send_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
} else {
pmcraid_handle_config_change(pinstance);
}
@@ -1800,10 +1800,10 @@ static void pmcraid_process_ldn(struct pmcraid_cmd *cmd)
} else if (!ioasc) {
pmcraid_handle_error_log(pinstance);
if (fd_ioasc == PMCRAID_IOASC_NR_IOA_RESET_REQUIRED) {
- spin_lock_irqsave(pinstance->host->host_lock,
+ spin_lock_irqsave(&pinstance->host->host_lock,
lock_flags);
pmcraid_initiate_reset(pinstance);
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
lock_flags);
return;
}
@@ -2322,17 +2322,17 @@ static int pmcraid_reset_reload(
unsigned long lock_flags;
int reset = 1;
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
if (pinstance->ioa_reset_in_progress) {
pmcraid_info("reset_reload: reset is already in progress\n");
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
wait_event(pinstance->reset_wait_q,
!pinstance->ioa_reset_in_progress);
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
if (pinstance->ioa_state == IOA_STATE_DEAD) {
pmcraid_info("reset_reload: IOA is dead\n");
@@ -2361,7 +2361,7 @@ static int pmcraid_reset_reload(
pinstance->force_ioa_reset = reset;
pmcraid_info("reset_reload: initiating reset\n");
pmcraid_ioa_reset(reset_cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
pmcraid_info("reset_reload: waiting for reset to complete\n");
wait_event(pinstance->reset_wait_q,
!pinstance->ioa_reset_in_progress);
@@ -2371,7 +2371,7 @@ static int pmcraid_reset_reload(
return pinstance->ioa_state != target_state;
out_unlock:
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
return reset;
}
@@ -2719,10 +2719,10 @@ static int pmcraid_reset_device(
* This will force the mid-layer to call _eh_bus/host reset, which
* will then go to sleep and wait for the reset to complete
*/
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
if (pinstance->ioa_reset_in_progress ||
pinstance->ioa_state == IOA_STATE_DEAD) {
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
return FAILED;
}
@@ -2736,7 +2736,7 @@ static int pmcraid_reset_device(
cmd = pmcraid_get_free_cmd(pinstance);
if (cmd == NULL) {
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
pmcraid_err("%s: no cmd blocks are available\n", __func__);
return FAILED;
}
@@ -2765,7 +2765,7 @@ static int pmcraid_reset_device(
timeout,
pmcraid_timeout_handler);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
/* RESET_DEVICE command completes after all pending IOARCBs are
* completed. Once this command is completed, pmcraind_internal_done
@@ -2960,11 +2960,11 @@ static int pmcraid_eh_abort_handler(struct scsi_cmnd *scsi_cmd)
* pmcraid_eh_host_reset which will then go to sleep and wait for the
* reset to complete
*/
- spin_lock_irqsave(pinstance->host->host_lock, host_lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, host_lock_flags);
if (pinstance->ioa_reset_in_progress ||
pinstance->ioa_state == IOA_STATE_DEAD) {
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
host_lock_flags);
return rc;
}
@@ -2992,7 +2992,7 @@ static int pmcraid_eh_abort_handler(struct scsi_cmnd *scsi_cmd)
if (cmd_found)
cancel_cmd = pmcraid_abort_cmd(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
host_lock_flags);
if (cancel_cmd) {
@@ -3720,11 +3720,11 @@ static irqreturn_t pmcraid_isr_msix(int irq, void *dev_id)
pmcraid_err("ISR: error interrupts: %x \
initiating reset\n", intrs_val);
- spin_lock_irqsave(pinstance->host->host_lock,
+ spin_lock_irqsave(&pinstance->host->host_lock,
lock_flags);
pmcraid_initiate_reset(pinstance);
spin_unlock_irqrestore(
- pinstance->host->host_lock,
+ &pinstance->host->host_lock,
lock_flags);
}
/* If interrupt was as part of the ioa initialization,
@@ -3798,9 +3798,9 @@ static irqreturn_t pmcraid_isr(int irq, void *dev_id)
intrs);
intrs = ioread32(
pinstance->int_regs.ioa_host_interrupt_clr_reg);
- spin_lock_irqsave(pinstance->host->host_lock, lock_flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, lock_flags);
pmcraid_initiate_reset(pinstance);
- spin_unlock_irqrestore(pinstance->host->host_lock, lock_flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, lock_flags);
} else {
/* If interrupt was as part of the ioa initialization,
* clear. Delete the timer and wakeup the
@@ -3859,11 +3859,11 @@ static void pmcraid_worker_function(struct work_struct *workp)
/* host_lock must be held before calling
* scsi_device_get
*/
- spin_lock_irqsave(pinstance->host->host_lock,
+ spin_lock_irqsave(&pinstance->host->host_lock,
host_lock_flags);
if (!scsi_device_get(sdev)) {
spin_unlock_irqrestore(
- pinstance->host->host_lock,
+ &pinstance->host->host_lock,
host_lock_flags);
pmcraid_info("deleting %x from midlayer\n",
res->cfg_entry.resource_address);
@@ -3879,7 +3879,7 @@ static void pmcraid_worker_function(struct work_struct *workp)
res->change_detected = 0;
} else {
spin_unlock_irqrestore(
- pinstance->host->host_lock,
+ &pinstance->host->host_lock,
host_lock_flags);
}
}
@@ -3986,10 +3986,10 @@ static void pmcraid_tasklet_function(unsigned long instance)
atomic_dec(&pinstance->outstanding_cmds);
if (cmd->cmd_done == pmcraid_ioa_reset) {
- spin_lock_irqsave(pinstance->host->host_lock,
+ spin_lock_irqsave(&pinstance->host->host_lock,
host_lock_flags);
cmd->cmd_done(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock,
+ spin_unlock_irqrestore(&pinstance->host->host_lock,
host_lock_flags);
} else if (cmd->cmd_done != NULL) {
cmd->cmd_done(cmd);
@@ -4880,9 +4880,9 @@ static void pmcraid_complete_ioa_reset(struct pmcraid_cmd *cmd)
struct pmcraid_instance *pinstance = cmd->drv_inst;
unsigned long flags;
- spin_lock_irqsave(pinstance->host->host_lock, flags);
+ spin_lock_irqsave(&pinstance->host->host_lock, flags);
pmcraid_ioa_reset(cmd);
- spin_unlock_irqrestore(pinstance->host->host_lock, flags);
+ spin_unlock_irqrestore(&pinstance->host->host_lock, flags);
scsi_unblock_requests(pinstance->host);
schedule_work(&pinstance->worker_q);
}
diff --git a/drivers/scsi/ps3rom.c b/drivers/scsi/ps3rom.c
index a9c727d22931..c63c581b493c 100644
--- a/drivers/scsi/ps3rom.c
+++ b/drivers/scsi/ps3rom.c
@@ -233,7 +233,8 @@ static enum scsi_qc_status ps3rom_queuecommand_lck(struct scsi_cmnd *cmd)
}
if (res) {
- scsi_build_sense(cmd, 0, ILLEGAL_REQUEST, 0, 0);
+ scsi_set_sense(cmd, 0, ILLEGAL_REQUEST,
+ NO_ADDITIONAL_SENSE_INFORMATION);
cmd->result = res;
priv->curr_cmd = NULL;
scsi_done(cmd);
@@ -316,7 +317,7 @@ static irqreturn_t ps3rom_interrupt(int irq, void *data)
goto done;
}
- scsi_build_sense(cmd, 0, sense_key, asc, ascq);
+ scsi_set_sense(cmd, 0, sense_key, scsi_sense_code(asc, ascq));
done:
priv->curr_cmd = NULL;
diff --git a/drivers/scsi/qedi/qedi_main.c b/drivers/scsi/qedi/qedi_main.c
index 227ff7bd1bdc..f394fcbb97e7 100644
--- a/drivers/scsi/qedi/qedi_main.c
+++ b/drivers/scsi/qedi/qedi_main.c
@@ -2652,8 +2652,6 @@ retry_probe:
snprintf(host_buf, sizeof(host_buf), "host_%d", qedi->shost->host_no);
qedi_ops->common->set_name(qedi->cdev, host_buf);
- qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
-
memset(&params, 0, sizeof(params));
params.mtu = DEF_PATH_MTU + IPV6_HDR_LEN + TCP_HDR_LEN;
qedi->ll2_mtu = DEF_PATH_MTU;
@@ -2670,6 +2668,7 @@ retry_probe:
spin_lock_init(&qedi->task_idx_lock);
mutex_init(&qedi->stats_lock);
}
+ qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
qedi_ops->ll2->start(qedi->cdev, &params);
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
index cdd6fe002c32..348c59a99cc5 100644
--- a/drivers/scsi/qla1280.c
+++ b/drivers/scsi/qla1280.c
@@ -741,9 +741,9 @@ _qla1280_wait_for_single_command(struct scsi_qla_host *ha, struct srb *sp,
int status = FAILED;
struct scsi_cmnd *cmd = sp->cmd;
- spin_unlock_irq(ha->host->host_lock);
+ spin_unlock_irq(&ha->host->host_lock);
wait_for_completion_timeout(wait, 4*HZ);
- spin_lock_irq(ha->host->host_lock);
+ spin_lock_irq(&ha->host->host_lock);
sp->wait = NULL;
if(CMD_HANDLE(cmd) == COMPLETED_HANDLE) {
status = SUCCESS;
@@ -953,9 +953,9 @@ qla1280_eh_abort(struct scsi_cmnd * cmd)
{
int rc;
- spin_lock_irq(cmd->device->host->host_lock);
+ spin_lock_irq(&cmd->device->host->host_lock);
rc = qla1280_error_action(cmd, ABORT_COMMAND);
- spin_unlock_irq(cmd->device->host->host_lock);
+ spin_unlock_irq(&cmd->device->host->host_lock);
return rc;
}
@@ -969,9 +969,9 @@ qla1280_eh_device_reset(struct scsi_cmnd *cmd)
{
int rc;
- spin_lock_irq(cmd->device->host->host_lock);
+ spin_lock_irq(&cmd->device->host->host_lock);
rc = qla1280_error_action(cmd, DEVICE_RESET);
- spin_unlock_irq(cmd->device->host->host_lock);
+ spin_unlock_irq(&cmd->device->host->host_lock);
return rc;
}
@@ -985,9 +985,9 @@ qla1280_eh_bus_reset(struct scsi_cmnd *cmd)
{
int rc;
- spin_lock_irq(cmd->device->host->host_lock);
+ spin_lock_irq(&cmd->device->host->host_lock);
rc = qla1280_error_action(cmd, BUS_RESET);
- spin_unlock_irq(cmd->device->host->host_lock);
+ spin_unlock_irq(&cmd->device->host->host_lock);
return rc;
}
@@ -1003,7 +1003,7 @@ qla1280_eh_adapter_reset(struct scsi_cmnd *cmd)
struct Scsi_Host *shost = cmd->device->host;
struct scsi_qla_host *ha = (struct scsi_qla_host *)shost->hostdata;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (qla1280_verbose) {
printk(KERN_INFO
"scsi(%ld): Issued ADAPTER RESET\n",
@@ -1019,7 +1019,7 @@ qla1280_eh_adapter_reset(struct scsi_cmnd *cmd)
ha->flags.reset_active = 0;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return rc;
}
@@ -1080,7 +1080,7 @@ qla1280_intr_handler(int irq, void *dev_id)
ENTER_INTR ("qla1280_intr_handler");
ha = (struct scsi_qla_host *)dev_id;
- spin_lock(ha->host->host_lock);
+ spin_lock(&ha->host->host_lock);
ha->isr_count++;
reg = ha->iobase;
@@ -1096,7 +1096,7 @@ qla1280_intr_handler(int irq, void *dev_id)
if (!list_empty(&ha->done_q))
qla1280_done(ha);
- spin_unlock(ha->host->host_lock);
+ spin_unlock(&ha->host->host_lock);
qla1280_enable_intrs(ha);
@@ -1214,11 +1214,11 @@ qla1280_sdev_configure(struct scsi_device *device, struct queue_limits *lim)
nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 0;
}
- spin_lock_irqsave(ha->host->host_lock, flags);
+ spin_lock_irqsave(&ha->host->host_lock, flags);
if (nv->bus[bus].target[target].parameter.enable_sync)
status = qla1280_set_target_parameters(ha, bus, target);
qla1280_get_target_parameters(ha, device);
- spin_unlock_irqrestore(ha->host->host_lock, flags);
+ spin_unlock_irqrestore(&ha->host->host_lock, flags);
return status;
}
@@ -1435,7 +1435,7 @@ qla1280_initialize_adapter(struct scsi_qla_host *ha)
* needs to be able to drop the lock unconditionally to wait
* for completion.
*/
- spin_lock_irqsave(ha->host->host_lock, flags);
+ spin_lock_irqsave(&ha->host->host_lock, flags);
status = qla1280_load_firmware(ha);
if (status) {
@@ -1467,7 +1467,7 @@ qla1280_initialize_adapter(struct scsi_qla_host *ha)
ha->flags.online = 1;
out:
- spin_unlock_irqrestore(ha->host->host_lock, flags);
+ spin_unlock_irqrestore(&ha->host->host_lock, flags);
if (status)
dprintk(2, "qla1280_initialize_adapter: **** FAILED ****\n");
@@ -1496,7 +1496,7 @@ qla1280_request_firmware(struct scsi_qla_host *ha)
int index;
char *fwname;
- spin_unlock_irq(ha->host->host_lock);
+ spin_unlock_irq(&ha->host->host_lock);
mutex_lock(&qla1280_firmware_mutex);
index = ql1280_board_tbl[ha->devnum].fw_index;
@@ -1529,7 +1529,7 @@ qla1280_request_firmware(struct scsi_qla_host *ha)
ha->fwver3 = fw->data[2];
unlock:
mutex_unlock(&qla1280_firmware_mutex);
- spin_lock_irq(ha->host->host_lock);
+ spin_lock_irq(&ha->host->host_lock);
return fw;
}
@@ -2451,14 +2451,14 @@ qla1280_mailbox_command(struct scsi_qla_host *ha, uint8_t mr, uint16_t *mb)
timer_setup(&ha->mailbox_timer, qla1280_mailbox_timeout, 0);
mod_timer(&ha->mailbox_timer, jiffies + 20 * HZ);
- spin_unlock_irq(ha->host->host_lock);
+ spin_unlock_irq(&ha->host->host_lock);
WRT_REG_WORD(&reg->host_cmd, HC_SET_HOST_INT);
qla1280_debounce_register(&reg->istatus);
wait_for_completion(&wait);
timer_delete_sync(&ha->mailbox_timer);
- spin_lock_irq(ha->host->host_lock);
+ spin_lock_irq(&ha->host->host_lock);
ha->mailbox_wait = NULL;
@@ -2560,9 +2560,9 @@ qla1280_bus_reset(struct scsi_qla_host *ha, int bus)
ha->bus_settings[bus].scsi_bus_dead = 1;
ha->bus_settings[bus].failed_reset_count++;
} else {
- spin_unlock_irq(ha->host->host_lock);
+ spin_unlock_irq(&ha->host->host_lock);
ssleep(reset_delay);
- spin_lock_irq(ha->host->host_lock);
+ spin_lock_irq(&ha->host->host_lock);
ha->bus_settings[bus].scsi_bus_dead = 0;
ha->bus_settings[bus].failed_reset_count = 0;
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c
index a4ca22024ede..781149497ff8 100644
--- a/drivers/scsi/qla2xxx/qla_attr.c
+++ b/drivers/scsi/qla2xxx/qla_attr.c
@@ -2814,13 +2814,13 @@ qla2x00_dev_loss_tmo_callbk(struct fc_rport *rport)
* Transport has effectively 'deleted' the rport, clear
* all local references.
*/
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
/* Confirm port has not reappeared before clearing pointers. */
if (rport->port_state != FC_PORTSTATE_ONLINE) {
fcport->rport = NULL;
*((fc_port_t **)rport->dd_data) = NULL;
}
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
if (test_bit(ABORT_ISP_ACTIVE, &fcport->vha->dpc_flags))
return;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index bb0cc71de37b..ccb039d97353 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -6247,9 +6247,9 @@ qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
return;
}
- spin_lock_irqsave(fcport->vha->host->host_lock, flags);
+ spin_lock_irqsave(&fcport->vha->host->host_lock, flags);
*((fc_port_t **)rport->dd_data) = fcport;
- spin_unlock_irqrestore(fcport->vha->host->host_lock, flags);
+ spin_unlock_irqrestore(&fcport->vha->host->host_lock, flags);
fcport->dev_loss_tmo = rport->dev_loss_tmo;
rport->supported_classes = fcport->supported_classes;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index 63b70d4abbf0..89c2af3fee4f 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -3263,21 +3263,24 @@ qla2x00_handle_dif_error(srb_t *sp, void *pkt)
/* check guard */
if (e_guard != a_guard) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x1);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
return 1;
}
/* check ref tag */
if (e_ref_tag != a_ref_tag) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x3);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
return 1;
}
/* check appl tag */
if (e_app_tag != a_app_tag) {
- scsi_build_sense(cmd, 1, ILLEGAL_REQUEST, 0x10, 0x2);
+ scsi_set_sense(cmd, 1, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED);
set_host_byte(cmd, DID_ABORT);
return 1;
}
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 53a505df8da0..431a59d499b3 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -2243,18 +2243,20 @@ void qlt_free_ul_mcmd(struct qla_hw_data *ha, struct qla_tgt_mgmt_cmd *mcmd)
* ha->hardware_lock supposed to be held on entry. Might drop it, then
* reacquire
*/
-void qlt_send_resp_ctio(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
- uint8_t scsi_status, uint8_t sense_key, uint8_t asc, uint8_t ascq)
+static void qlt_send_resp_ctio(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
+ uint8_t scsi_status, uint8_t sense_key, uint16_t sense_code)
{
struct atio_from_isp *atio = &cmd->atio;
struct ctio7_to_24xx *ctio;
uint16_t temp;
struct scsi_qla_host *vha = cmd->vha;
+ uint8_t asc = scsi_sense_code_asc(sense_code);
+ uint8_t ascq = scsi_sense_code_ascq(sense_code);
ql_dbg(ql_dbg_tgt_dif, vha, 0x3066,
"Sending response CTIO7 (vha=%p, atio=%p, scsi_status=%02x, "
"sense_key=%02x, asc=%02x, ascq=%02x",
- vha, atio, scsi_status, sense_key, asc, ascq);
+ vha, atio, scsi_status, sense_key, asc, ascq);
ctio = (struct ctio7_to_24xx *)qla2x00_alloc_iocbs(vha, NULL);
if (!ctio) {
@@ -2677,44 +2679,47 @@ static void qlt_print_dif_err(struct qla_tgt_prm *prm)
{
struct qla_tgt_cmd *cmd;
struct scsi_qla_host *vha;
+ u16 scode;
/* asc 0x10=dif error */
- if (prm->sense_buffer && (prm->sense_buffer[12] == 0x10)) {
- cmd = prm->cmd;
- vha = cmd->vha;
- /* ASCQ */
- switch (prm->sense_buffer[13]) {
- case 1:
- ql_dbg(ql_dbg_tgt_dif, vha, 0xe00b,
- "BE detected Guard TAG ERR: lba[0x%llx|%lld] len[0x%x] "
- "se_cmd=%p tag[%x]",
- cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
- cmd->atio.u.isp24.exchange_addr);
- break;
- case 2:
- ql_dbg(ql_dbg_tgt_dif, vha, 0xe00c,
- "BE detected APP TAG ERR: lba[0x%llx|%lld] len[0x%x] "
- "se_cmd=%p tag[%x]",
- cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
- cmd->atio.u.isp24.exchange_addr);
- break;
- case 3:
- ql_dbg(ql_dbg_tgt_dif, vha, 0xe00f,
- "BE detected REF TAG ERR: lba[0x%llx|%lld] len[0x%x] "
- "se_cmd=%p tag[%x]",
- cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
- cmd->atio.u.isp24.exchange_addr);
- break;
- default:
- ql_dbg(ql_dbg_tgt_dif, vha, 0xe010,
- "BE detected Dif ERR: lba[%llx|%lld] len[%x] "
- "se_cmd=%p tag[%x]",
- cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
- cmd->atio.u.isp24.exchange_addr);
- break;
- }
- ql_dump_buffer(ql_dbg_tgt_dif, vha, 0xe011, cmd->cdb, 16);
+ if (!prm->sense_buffer ||
+ prm->sense_buffer[12] != ASC_ID_CRC_OR_ECC_ERROR)
+ return;
+
+ cmd = prm->cmd;
+ vha = cmd->vha;
+ scode = scsi_sense_code(prm->sense_buffer[12], prm->sense_buffer[13]);
+ switch (scode) {
+ case LOGICAL_BLOCK_GUARD_CHECK_FAILED:
+ ql_dbg(ql_dbg_tgt_dif, vha, 0xe00b,
+ "BE detected Guard TAG ERR: lba[0x%llx|%lld] len[0x%x] "
+ "se_cmd=%p tag[%x]",
+ cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
+ cmd->atio.u.isp24.exchange_addr);
+ break;
+ case LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED:
+ ql_dbg(ql_dbg_tgt_dif, vha, 0xe00c,
+ "BE detected APP TAG ERR: lba[0x%llx|%lld] len[0x%x] "
+ "se_cmd=%p tag[%x]",
+ cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
+ cmd->atio.u.isp24.exchange_addr);
+ break;
+ case LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED:
+ ql_dbg(ql_dbg_tgt_dif, vha, 0xe00f,
+ "BE detected REF TAG ERR: lba[0x%llx|%lld] len[0x%x] "
+ "se_cmd=%p tag[%x]",
+ cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
+ cmd->atio.u.isp24.exchange_addr);
+ break;
+ default:
+ ql_dbg(ql_dbg_tgt_dif, vha, 0xe010,
+ "BE detected Dif ERR: lba[%llx|%lld] len[%x] "
+ "se_cmd=%p tag[%x]",
+ cmd->lba, cmd->lba, cmd->num_blks, &cmd->se_cmd,
+ cmd->atio.u.isp24.exchange_addr);
+ break;
}
+ ql_dump_buffer(ql_dbg_tgt_dif, vha, 0xe011, cmd->cdb, 16);
}
/*
@@ -3467,7 +3472,8 @@ qlt_handle_dif_error(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
uint8_t *ap = &sts->actual_dif[0];
uint8_t *ep = &sts->expected_dif[0];
uint64_t lba = cmd->se_cmd.t_task_lba;
- uint8_t scsi_status, sense_key, asc, ascq;
+ uint8_t scsi_status, sense_key;
+ uint16_t sense_code = 0;
struct scsi_qla_host *vha = cmd->vha;
cmd->trc_flags |= TRC_DIF_ERR;
@@ -3483,7 +3489,7 @@ qlt_handle_dif_error(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
ql_dbg(ql_dbg_tgt_dif, vha, 0xf075,
"%s: aborted %d state %d\n", __func__, cmd->aborted, cmd->state);
- scsi_status = sense_key = asc = ascq = 0;
+ scsi_status = sense_key = 0;
/* check appl tag */
if (cmd->e_app_tag != cmd->a_app_tag) {
@@ -3497,8 +3503,7 @@ qlt_handle_dif_error(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
cmd->dif_err_code = DIF_ERR_APP;
scsi_status = SAM_STAT_CHECK_CONDITION;
sense_key = ABORTED_COMMAND;
- asc = 0x10;
- ascq = 0x2;
+ sense_code = LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED;
}
/* check ref tag */
@@ -3513,8 +3518,7 @@ qlt_handle_dif_error(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
cmd->dif_err_code = DIF_ERR_REF;
scsi_status = SAM_STAT_CHECK_CONDITION;
sense_key = ABORTED_COMMAND;
- asc = 0x10;
- ascq = 0x3;
+ sense_code = LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED;
goto out;
}
@@ -3530,8 +3534,7 @@ qlt_handle_dif_error(struct qla_qpair *qpair, struct qla_tgt_cmd *cmd,
cmd->dif_err_code = DIF_ERR_GRD;
scsi_status = SAM_STAT_CHECK_CONDITION;
sense_key = ABORTED_COMMAND;
- asc = 0x10;
- ascq = 0x1;
+ sense_code = LOGICAL_BLOCK_GUARD_CHECK_FAILED;
}
out:
switch (cmd->state) {
@@ -3547,8 +3550,8 @@ out:
break;
}
- qlt_send_resp_ctio(qpair, cmd, scsi_status, sense_key, asc,
- ascq);
+ qlt_send_resp_ctio(qpair, cmd, scsi_status, sense_key,
+ sense_code);
/* assume scsi status gets out on the wire.
* Will not wait for completion.
*/
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index 61072fb41b29..71bc1affb1bc 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -1178,7 +1178,4 @@ extern irqreturn_t qla83xx_msix_atio_q(int, void *);
extern void qlt_logo_completion_handler(fc_port_t *, int);
extern void qlt_do_generation_tick(struct scsi_qla_host *, int *);
-void qlt_send_resp_ctio(struct qla_qpair *, struct qla_tgt_cmd *, uint8_t,
- uint8_t, uint8_t, uint8_t);
-
#endif /* __QLA_TARGET_H */
diff --git a/drivers/scsi/qlogicfas408.c b/drivers/scsi/qlogicfas408.c
index d36293bc2717..af6f6eb51636 100644
--- a/drivers/scsi/qlogicfas408.c
+++ b/drivers/scsi/qlogicfas408.c
@@ -454,9 +454,9 @@ irqreturn_t qlogicfas408_ihandl(int irq, void *dev_id)
unsigned long flags;
struct Scsi_Host *host = dev_id;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
ql_ihandl(dev_id);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return IRQ_HANDLED;
}
@@ -536,9 +536,9 @@ int qlogicfas408_host_reset(struct scsi_cmnd *cmd)
priv->qabort = 2;
- spin_lock_irqsave(cmd->device->host->host_lock, flags);
+ spin_lock_irqsave(&cmd->device->host->host_lock, flags);
ql_zap(priv);
- spin_unlock_irqrestore(cmd->device->host->host_lock, flags);
+ spin_unlock_irqrestore(&cmd->device->host->host_lock, flags);
return SUCCESS;
}
diff --git a/drivers/scsi/qlogicpti.c b/drivers/scsi/qlogicpti.c
index ea0a2b5a0a42..098916061835 100644
--- a/drivers/scsi/qlogicpti.c
+++ b/drivers/scsi/qlogicpti.c
@@ -333,7 +333,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
risc_code_addr = 0x1000; /* all load addresses are at 0x1000 */
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
sbus_writew(HCCTRL_PAUSE, qpti->qregs + HCCTRL);
@@ -382,7 +382,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if (qlogicpti_mbox_command(qpti, param, 1)) {
printk(KERN_EMERG "qlogicpti%d: Cannot execute ISP firmware.\n",
qpti->qpti_id);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return 1;
}
@@ -393,7 +393,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
(param[0] != MBOX_COMMAND_COMPLETE)) {
printk(KERN_EMERG "qlogicpti%d: Cannot set initiator SCSI ID.\n",
qpti->qpti_id);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return 1;
}
@@ -408,7 +408,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if (qlogicpti_mbox_command(qpti, param, 1)) {
printk(KERN_EMERG "qlogicpti%d: Cannot init response queue.\n",
qpti->qpti_id);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return 1;
}
@@ -420,7 +420,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
if (qlogicpti_mbox_command(qpti, param, 1)) {
printk(KERN_EMERG "qlogicpti%d: Cannot init request queue.\n",
qpti->qpti_id);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return 1;
}
@@ -466,7 +466,7 @@ static int qlogicpti_reset_hardware(struct Scsi_Host *host)
qlogicpti_mbox_command(qpti, param, 0);
qpti->send_marker = 1;
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return 0;
}
@@ -501,7 +501,7 @@ static int qlogicpti_load_firmware(struct qlogicpti *qpti)
risc_code_addr = 0x1000; /* all f/w modules load at 0x1000 */
risc_code_length = fw->size / 2;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
/* Verify the checksum twice, one before loading it, and once
* afterwards via the mailbox commands.
@@ -642,7 +642,7 @@ static int qlogicpti_load_firmware(struct qlogicpti *qpti)
}
out:
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
outfirm:
release_firmware(fw);
return err;
@@ -1207,7 +1207,7 @@ static irqreturn_t qpti_intr(int irq, void *dev_id)
unsigned long flags;
struct scsi_cmnd *dq;
- spin_lock_irqsave(qpti->qhost->host_lock, flags);
+ spin_lock_irqsave(&qpti->qhost->host_lock, flags);
dq = qlogicpti_intr_handler(qpti);
if (dq != NULL) {
@@ -1219,7 +1219,7 @@ static irqreturn_t qpti_intr(int irq, void *dev_id)
dq = next;
} while (dq != NULL);
}
- spin_unlock_irqrestore(qpti->qhost->host_lock, flags);
+ spin_unlock_irqrestore(&qpti->qhost->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index f285521d9de6..05232ab6366f 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -606,7 +606,8 @@ int scsi_report_opcode(struct scsi_device *sdev, unsigned char *buffer,
return result;
if (result && scsi_sense_valid(&sshdr) &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- (sshdr.asc == 0x20 || sshdr.asc == 0x24) && sshdr.ascq == 0x00)
+ (sshdr.sense_code == INVALID_COMMAND_OP_CODE ||
+ sshdr.sense_code == INVALID_FIELD_IN_CDB))
return -EINVAL;
if ((buffer[1] & 3) == 3) /* Command supported */
@@ -842,7 +843,7 @@ struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
struct scsi_device *next = NULL;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
while (list->next != &shost->__devices) {
next = list_entry(list->next, struct scsi_device, siblings);
/*
@@ -854,7 +855,7 @@ struct scsi_device *__scsi_iterate_devices(struct Scsi_Host *shost,
next = NULL;
list = list->next;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (prev)
scsi_device_put(prev);
@@ -961,11 +962,11 @@ struct scsi_device *scsi_device_lookup_by_target(struct scsi_target *starget,
struct Scsi_Host *shost = dev_to_shost(starget->dev.parent);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
sdev = __scsi_device_lookup_by_target(starget, lun);
if (sdev && scsi_device_get(sdev))
sdev = NULL;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return sdev;
}
@@ -1021,11 +1022,11 @@ struct scsi_device *scsi_device_lookup(struct Scsi_Host *shost,
struct scsi_device *sdev;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
sdev = __scsi_device_lookup(shost, channel, id, lun);
if (sdev && scsi_device_get(sdev))
sdev = NULL;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return sdev;
}
diff --git a/drivers/scsi/scsi_common.c b/drivers/scsi/scsi_common.c
index e1a2a62b6910..94b160336247 100644
--- a/drivers/scsi/scsi_common.c
+++ b/drivers/scsi/scsi_common.c
@@ -191,6 +191,8 @@ EXPORT_SYMBOL(int_to_scsilun);
bool scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
struct scsi_sense_hdr *sshdr)
{
+ u8 asc = 0, ascq = 0;
+
memset(sshdr, 0, sizeof(struct scsi_sense_hdr));
if (!sense_buffer || !sb_len)
@@ -208,9 +210,9 @@ bool scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
if (sb_len > 1)
sshdr->sense_key = (sense_buffer[1] & 0xf);
if (sb_len > 2)
- sshdr->asc = sense_buffer[2];
+ asc = sense_buffer[2];
if (sb_len > 3)
- sshdr->ascq = sense_buffer[3];
+ ascq = sense_buffer[3];
if (sb_len > 7)
sshdr->additional_length = sense_buffer[7];
} else {
@@ -222,12 +224,14 @@ bool scsi_normalize_sense(const u8 *sense_buffer, int sb_len,
if (sb_len > 7) {
sb_len = min(sb_len, sense_buffer[7] + 8);
if (sb_len > 12)
- sshdr->asc = sense_buffer[12];
+ asc = sense_buffer[12];
if (sb_len > 13)
- sshdr->ascq = sense_buffer[13];
+ ascq = sense_buffer[13];
}
}
+ sshdr->sense_code = scsi_sense_code(asc, ascq);
+
return true;
}
EXPORT_SYMBOL(scsi_normalize_sense);
@@ -272,17 +276,19 @@ const u8 * scsi_sense_desc_find(const u8 * sense_buffer, int sb_len,
EXPORT_SYMBOL(scsi_sense_desc_find);
/**
- * scsi_build_sense_buffer - build sense data in a buffer
+ * scsi_set_sense_buffer - build sense data in a buffer
* @desc: Sense format (non-zero == descriptor format,
* 0 == fixed format)
* @buf: Where to build sense data
* @key: Sense key
- * @asc: Additional sense code
- * @ascq: Additional sense code qualifier
+ * @code: Additional sense code and sense code qualifier
*
**/
-void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
+void scsi_set_sense_buffer(int desc, u8 *buf, u8 key, u16 code)
{
+ u8 asc = scsi_sense_code_asc(code);
+ u8 ascq = scsi_sense_code_ascq(code);
+
if (desc) {
buf[0] = 0x72; /* descriptor, current */
buf[1] = key;
@@ -297,7 +303,7 @@ void scsi_build_sense_buffer(int desc, u8 *buf, u8 key, u8 asc, u8 ascq)
buf[13] = ascq;
}
}
-EXPORT_SYMBOL(scsi_build_sense_buffer);
+EXPORT_SYMBOL(scsi_set_sense_buffer);
/**
* scsi_set_sense_information - set the information field in a
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 3346562275f8..e679df1993aa 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -44,6 +44,7 @@
#include <linux/debugfs.h>
#include <linux/async.h>
#include <linux/cleanup.h>
+#include <linux/parser.h>
#include <net/checksum.h>
@@ -67,9 +68,6 @@ static const char *sdebug_version_date = "20210520";
#define MY_NAME "scsi_debug"
-/* Additional Sense Code Qualifier (ASCQ) */
-#define ACK_NAK_TO 0x3
-
/* Default values for driver parameters */
#define DEF_NUM_HOST 1
#define DEF_NUM_TGTS 1
@@ -79,7 +77,7 @@ static const char *sdebug_version_date = "20210520";
*/
#define DEF_ATO 1
#define DEF_CDB_LEN 10
-#define DEF_JDELAY 1 /* if > 0 unit is a jiffy */
+#define DEF_JDELAY 0 /* if > 0 unit is a jiffy */
#define DEF_DEV_SIZE_PRE_INIT 0
#define DEF_DEV_SIZE_MB 8
#define DEF_ZBC_DEV_SIZE_MB 128
@@ -106,6 +104,7 @@ static const char *sdebug_version_date = "20210520";
#define DEF_PTYPE TYPE_DISK
#define DEF_RANDOM false
#define DEF_REMOVABLE false
+#define DEF_CLUSTERING true
#define DEF_SCSI_LEVEL 7 /* INQUIRY, byte2 [6->SPC-4; 7->SPC-5] */
#define DEF_SECTOR_SIZE 512
#define DEF_UNMAP_ALIGNMENT 0
@@ -217,8 +216,7 @@ struct tape_block {
* /sys/class/scsi_device/<h:c:t:l>/device/queue_depth
* but cannot exceed SDEBUG_CANQUEUE .
*/
-#define SDEBUG_CANQUEUE_WORDS 3 /* a WORD is bits in a long */
-#define SDEBUG_CANQUEUE (SDEBUG_CANQUEUE_WORDS * BITS_PER_LONG)
+#define SDEBUG_CANQUEUE (4096)
#define DEF_CMD_PER_LUN SDEBUG_CANQUEUE
/* UA - Unit Attention; SA - Service Action; SSU - Start Stop Unit */
@@ -850,7 +848,7 @@ static int sdebug_num_hosts;
static int sdebug_add_host = DEF_NUM_HOST; /* in sysfs this is relative */
static int sdebug_ato = DEF_ATO;
static int sdebug_cdb_len = DEF_CDB_LEN;
-static int sdebug_jdelay = DEF_JDELAY; /* if > 0 then unit is jiffies */
+static int sdebug_jdelay = DEF_JDELAY;
static int sdebug_dev_size_mb = DEF_DEV_SIZE_PRE_INIT;
static int sdebug_dif = DEF_DIF;
static int sdebug_dix = DEF_DIX;
@@ -899,7 +897,7 @@ static int sdebug_uuid_ctl = DEF_UUID_CTL;
static bool sdebug_random = DEF_RANDOM;
static bool sdebug_per_host_store = DEF_PER_HOST_STORE;
static bool sdebug_removable = DEF_REMOVABLE;
-static bool sdebug_clustering;
+static bool sdebug_clustering = DEF_CLUSTERING;
static bool sdebug_host_lock = DEF_HOST_LOCK;
static bool sdebug_strict = DEF_STRICT;
static bool sdebug_no_rwlock;
@@ -1168,6 +1166,95 @@ static const struct file_operations sdebug_error_fops = {
.release = single_release,
};
+enum corrupt_options {
+ Opt_lba = (1u << 0),
+ Opt_num = (1u << 1),
+ Opt_bit_errors = (1u << 2),
+ Opt_reftag_adjust = (1u << 3),
+
+ Opt_invalid,
+};
+
+static const match_table_t corrupt_tokens = {
+ { Opt_lba, "lba=%u" },
+ { Opt_num, "num=%u" },
+ { Opt_bit_errors, "bit_errors=%u" },
+ { Opt_reftag_adjust, "reftag_adjust=%d" },
+ { Opt_invalid, NULL, },
+};
+
+static int corrupt_lbas(struct sdebug_dev_info *devip, u64 lba, u32 num,
+ u32 nr_bit_errors, s32 reftag_adjust);
+static ssize_t sdebug_corrupt_write(struct file *file, const char __user *ubuf,
+ size_t count, loff_t *ppos)
+{
+ struct scsi_device *sdev = file->f_inode->i_private;
+ struct sdebug_dev_info *devip = sdev->hostdata;
+ substring_t args[MAX_OPT_ARGS];
+ char *buf, *options, *p;
+ int error = 0;
+ u64 lba = 0;
+ u32 num = 1;
+ u32 nr_bit_errors = 0;
+ s32 reftag_adjust = 0;
+
+ buf = memdup_user_nul(ubuf, count);
+ if (IS_ERR(buf))
+ return PTR_ERR(buf);
+
+ options = buf;
+ while ((p = strsep(&options, ",\n")) != NULL) {
+ if (!*p)
+ continue;
+ switch (match_token(p, corrupt_tokens, args)) {
+ case Opt_lba:
+ error = match_u64(args, &lba);
+ break;
+ case Opt_num:
+ error = match_uint(args, &num);
+ break;
+ case Opt_bit_errors:
+ error = match_uint(args, &nr_bit_errors);
+ break;
+ case Opt_reftag_adjust:
+ error = match_int(args, &reftag_adjust);
+ break;
+ default:
+ pr_warn("unknown parameter or missing value '%s'\n", p);
+ error = -EINVAL;
+ }
+ if (error)
+ goto out_free_buf;
+ }
+
+ if (num == 0) {
+ pr_warn("invalid number of logical blocks: %u\n", num);
+ error = -EINVAL;
+ goto out_free_buf;
+ }
+
+ if (reftag_adjust &&
+ (!sdebug_dix ||
+ (sdebug_dif != T10_PI_TYPE1_PROTECTION &&
+ sdebug_dif != T10_PI_TYPE2_PROTECTION))) {
+ pr_warn("reftag adjust requires type 1 or type 2 PI with DIX\n");
+ error = -EINVAL;
+ goto out_free_buf;
+ }
+
+ error = corrupt_lbas(devip, lba, num, nr_bit_errors, reftag_adjust);
+
+out_free_buf:
+ kfree(buf);
+ if (error)
+ return error;
+ return count;
+}
+
+static const struct file_operations sdebug_corrupt_fops = {
+ .write = sdebug_corrupt_write,
+};
+
static int sdebug_target_reset_fail_show(struct seq_file *m, void *p)
{
struct scsi_target *starget = (struct scsi_target *)m->private;
@@ -1320,9 +1407,13 @@ static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
sdev_printk(KERN_ERR, scp->device, "sense_buffer is NULL\n");
return;
}
- asc = c_d ? INVALID_FIELD_IN_CDB : INVALID_FIELD_IN_PARAM_LIST;
+ if (c_d)
+ asc = ASC_INVALID_FIELD_IN_CDB;
+ else
+ asc = ASC_INVALID_FIELD_IN_PARAMETER_LIST;
memset(sbuff, 0, SCSI_SENSE_BUFFERSIZE);
- scsi_build_sense(scp, sdebug_dsense, ILLEGAL_REQUEST, asc, 0);
+ scsi_set_sense(scp, sdebug_dsense, ILLEGAL_REQUEST,
+ scsi_sense_code(asc, 0));
memset(sks, 0, sizeof(sks));
sks[0] = 0x80;
if (c_d)
@@ -1346,7 +1437,7 @@ static void mk_sense_invalid_fld(struct scsi_cmnd *scp,
my_name, asc, c_d ? 'C' : 'D', in_byte, in_bit);
}
-static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
+static void mk_sense_buffer(struct scsi_cmnd *scp, u8 key, u16 code)
{
if (!scp->sense_buffer) {
sdev_printk(KERN_ERR, scp->device, "sense_buffer is NULL\n");
@@ -1354,16 +1445,16 @@ static void mk_sense_buffer(struct scsi_cmnd *scp, int key, int asc, int asq)
}
memset(scp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
- scsi_build_sense(scp, sdebug_dsense, key, asc, asq);
+ scsi_set_sense(scp, sdebug_dsense, key, code);
if (sdebug_verbose)
sdev_printk(KERN_INFO, scp->device,
- "%s: [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
- my_name, key, asc, asq);
+ "%s: [sense_key,sense_code]: [0x%02x,0x%04x]\n",
+ my_name, key, code);
}
/* Sense data that has information fields for tapes */
-static void mk_sense_info_tape(struct scsi_cmnd *scp, int key, int asc, int asq,
+static void mk_sense_info_tape(struct scsi_cmnd *scp, u8 key, u16 code,
unsigned int information, unsigned char tape_flags)
{
if (!scp->sense_buffer) {
@@ -1372,7 +1463,7 @@ static void mk_sense_info_tape(struct scsi_cmnd *scp, int key, int asc, int asq,
}
memset(scp->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
- scsi_build_sense(scp, /* sdebug_dsense */ 0, key, asc, asq);
+ scsi_set_sense(scp, /* sdebug_dsense */ 0, key, code);
/* only fixed format so far */
scp->sense_buffer[0] |= 0x80; /* valid */
@@ -1381,13 +1472,13 @@ static void mk_sense_info_tape(struct scsi_cmnd *scp, int key, int asc, int asq,
if (sdebug_verbose)
sdev_printk(KERN_INFO, scp->device,
- "%s: [sense_key,asc,ascq]: [0x%x,0x%x,0x%x]\n",
- my_name, key, asc, asq);
+ "%s: [sense_key,sense_code]: [0x%02x,0x%04x]\n",
+ my_name, key, code);
}
static void mk_sense_invalid_opcode(struct scsi_cmnd *scp)
{
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_OPCODE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_COMMAND_OP_CODE);
}
static int scsi_debug_ioctl(struct scsi_device *dev, unsigned int cmd,
@@ -1484,46 +1575,43 @@ static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
switch (k) {
case SDEBUG_UA_POR:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
- POWER_ON_RESET_ASCQ);
+ mk_sense_buffer(scp, UNIT_ATTENTION,
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED);
if (sdebug_verbose)
cp = "power on reset";
break;
case SDEBUG_UA_POOCCUR:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
- POWER_ON_OCCURRED_ASCQ);
+ mk_sense_buffer(scp, UNIT_ATTENTION, POWER_ON_OCCURRED);
if (sdebug_verbose)
cp = "power on occurred";
break;
case SDEBUG_UA_BUS_RESET:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_RESET_ASC,
- BUS_RESET_ASCQ);
+ mk_sense_buffer(scp, UNIT_ATTENTION,
+ SCSI_BUS_RESET_OCCURRED);
if (sdebug_verbose)
cp = "bus reset";
break;
case SDEBUG_UA_MODE_CHANGED:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
- MODE_CHANGED_ASCQ);
+ mk_sense_buffer(scp, UNIT_ATTENTION,
+ MODE_PARAMETERS_CHANGED);
if (sdebug_verbose)
cp = "mode parameters changed";
break;
case SDEBUG_UA_CAPACITY_CHANGED:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_CHANGED_ASC,
- CAPACITY_CHANGED_ASCQ);
+ mk_sense_buffer(scp, UNIT_ATTENTION,
+ CAPACITY_DATA_HAS_CHANGED);
if (sdebug_verbose)
cp = "capacity data changed";
break;
case SDEBUG_UA_MICROCODE_CHANGED:
mk_sense_buffer(scp, UNIT_ATTENTION,
- TARGET_CHANGED_ASC,
- MICROCODE_CHANGED_ASCQ);
+ MICROCODE_HAS_BEEN_CHANGED);
if (sdebug_verbose)
cp = "microcode has been changed";
break;
case SDEBUG_UA_MICROCODE_CHANGED_WO_RESET:
mk_sense_buffer(scp, UNIT_ATTENTION,
- TARGET_CHANGED_ASC,
- MICROCODE_CHANGED_WO_RESET_ASCQ);
+ MICROCODE_HAS_BEEN_CHANGED_WITHOUT_RESET);
if (sdebug_verbose)
cp = "microcode has been changed without reset";
break;
@@ -1539,14 +1627,13 @@ static int make_ua(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
if (sdebug_scsi_level >= 6) /* SPC-4 and above */
clear_luns_changed_on_target(devip);
mk_sense_buffer(scp, UNIT_ATTENTION,
- TARGET_CHANGED_ASC,
- LUNS_CHANGED_ASCQ);
+ REPORTED_LUNS_DATA_HAS_CHANGED);
if (sdebug_verbose)
cp = "reported luns data has changed";
break;
case SDEBUG_UA_NOT_READY_TO_READY:
- mk_sense_buffer(scp, UNIT_ATTENTION, UA_READY_ASC,
- 0);
+ mk_sense_buffer(scp, UNIT_ATTENTION,
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED);
if (sdebug_verbose)
cp = "not ready to ready transition/media change";
break;
@@ -2184,14 +2271,14 @@ static int resp_requests(struct scsi_cmnd *scp,
if (dsense) {
arr[0] = 0x72;
arr[1] = NOT_READY;
- arr[2] = LOGICAL_UNIT_NOT_READY;
+ arr[2] = ASC_LU_NOT_READY;
arr[3] = (stopped_state == 2) ? 0x1 : 0x2;
len = 8;
} else {
arr[0] = 0x70;
arr[2] = NOT_READY; /* NO_SENSE in sense_key */
arr[7] = 0xa; /* 18 byte sense buffer */
- arr[12] = LOGICAL_UNIT_NOT_READY;
+ arr[12] = ASC_LU_NOT_READY;
arr[13] = (stopped_state == 2) ? 0x1 : 0x2;
}
} else if ((iec_m_pg[2] & 0x4) && (6 == (iec_m_pg[3] & 0xf))) {
@@ -2199,14 +2286,14 @@ static int resp_requests(struct scsi_cmnd *scp,
if (dsense) {
arr[0] = 0x72;
arr[1] = 0x0; /* NO_SENSE in sense_key */
- arr[2] = THRESHOLD_EXCEEDED;
+ arr[2] = ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED;
arr[3] = 0xff; /* Failure prediction(false) */
len = 8;
} else {
arr[0] = 0x70;
arr[2] = 0x0; /* NO_SENSE in sense_key */
arr[7] = 0xa; /* 18 byte sense buffer */
- arr[12] = THRESHOLD_EXCEEDED;
+ arr[12] = ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED;
arr[13] = 0xff; /* Failure prediction(false) */
}
} else { /* nothing to report */
@@ -2457,8 +2544,7 @@ static int resp_rsup_opcodes(struct scsi_cmnd *scp,
a_len = alloc_len;
arr = kzalloc((a_len < 256) ? 320 : a_len + 64, GFP_ATOMIC);
if (NULL == arr) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
- INSUFF_RES_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFFICIENT_RESOURCES);
return check_condition_result;
}
switch (reporting_opts) {
@@ -2924,8 +3010,9 @@ static int resp_mode_sense(struct scsi_cmnd *scp,
else
bd_len = 0;
alloc_len = msense_6 ? cmd[4] : get_unaligned_be16(cmd + 7);
- if (0x3 == pcontrol) { /* Saving values not supported */
- mk_sense_buffer(scp, ILLEGAL_REQUEST, SAVING_PARAMS_UNSUP, 0);
+ if (0x3 == pcontrol) {
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ SAVING_PARAMETERS_NOT_SUPPORTED);
return check_condition_result;
}
target_dev_id = ((devip->sdbg_host->shost->host_no + 1) * 2000) +
@@ -3174,7 +3261,7 @@ static int resp_mode_select(struct scsi_cmnd *scp,
(arr[off + 1] + 2);
if ((pg_len + off) > param_len) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- PARAMETER_LIST_LENGTH_ERR, 0);
+ PARAMETER_LIST_LENGTH_ERROR);
return check_condition_result;
}
switch (mpage) {
@@ -3256,7 +3343,7 @@ static int resp_ie_l_pg(unsigned char *arr)
memcpy(arr, ie_l_pg, sizeof(ie_l_pg));
if (iec_m_pg[2] & 0x4) { /* TEST bit set */
- arr[4] = THRESHOLD_EXCEEDED;
+ arr[4] = ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED;
arr[5] = 0xff;
}
return sizeof(ie_l_pg);
@@ -3413,7 +3500,8 @@ static int resp_locate(struct scsi_cmnd *scp,
break;
if (i < pos) {
devip->tape_location[partition] = i;
- mk_sense_buffer(scp, BLANK_CHECK, 0x05, 0);
+ mk_sense_buffer(scp, BLANK_CHECK,
+ LU_DOES_NOT_RESPOND_TO_SELECTION);
return check_condition_result;
}
devip->tape_location[partition] = pos;
@@ -3438,8 +3526,9 @@ static int resp_write_filemarks(struct scsi_cmnd *scp,
for (i = 0, pos = devip->tape_location[partition]; i < count; i++, pos++) {
if (pos >= devip->tape_eop[partition] - 1) { /* don't overwrite EOD */
devip->tape_location[partition] = devip->tape_eop[partition] - 1;
- mk_sense_info_tape(scp, VOLUME_OVERFLOW, NO_ADDITIONAL_SENSE,
- EOP_EOM_DETECTED_ASCQ, count, SENSE_FLAG_EOM);
+ mk_sense_info_tape(scp, VOLUME_OVERFLOW,
+ END_OF_PARTITION_MEDIUM_DETECTED,
+ count, SENSE_FLAG_EOM);
return check_condition_result;
}
(devip->tape_blocks[partition] + pos)->fl_size = data;
@@ -3540,31 +3629,28 @@ static int resp_space(struct scsi_cmnd *scp,
is_fm:
devip->tape_location[partition] = pos;
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- FILEMARK_DETECTED_ASCQ, count - i,
- SENSE_FLAG_FILEMARK);
+ mk_sense_info_tape(scp, NO_SENSE, FILEMARK_DETECTED,
+ count - i, SENSE_FLAG_FILEMARK);
return check_condition_result;
is_eod:
devip->tape_location[partition] = pos;
- mk_sense_info_tape(scp, BLANK_CHECK, NO_ADDITIONAL_SENSE,
- EOD_DETECTED_ASCQ, count - i,
- 0);
+ mk_sense_info_tape(scp, BLANK_CHECK, END_OF_DATA_DETECTED,
+ count - i, 0);
return check_condition_result;
is_bop:
devip->tape_location[partition] = 0;
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- BEGINNING_OF_P_M_DETECTED_ASCQ, count - i,
- SENSE_FLAG_EOM);
+ mk_sense_info_tape(scp, NO_SENSE,
+ BEGINNING_OF_PARTITION_MEDIUM_DETECTED,
+ count - i, SENSE_FLAG_EOM);
devip->tape_location[partition] = 0;
return check_condition_result;
is_eop:
devip->tape_location[partition] = devip->tape_eop[partition] - 1;
- mk_sense_info_tape(scp, MEDIUM_ERROR, NO_ADDITIONAL_SENSE,
- EOP_EOM_DETECTED_ASCQ, (unsigned int)i,
- SENSE_FLAG_EOM);
+ mk_sense_info_tape(scp, MEDIUM_ERROR, END_OF_PARTITION_MEDIUM_DETECTED,
+ (unsigned int)i, SENSE_FLAG_EOM);
return check_condition_result;
}
@@ -3852,8 +3938,7 @@ static int check_zbc_access_params(struct scsi_cmnd *scp,
/* For host-managed, reads cannot cross zone types boundaries */
if (zsp->z_type != zsp_end->z_type) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- LBA_OUT_OF_RANGE,
- READ_INVDATA_ASCQ);
+ ATTEMPT_TO_READ_INVALID_DATA);
return check_condition_result;
}
return 0;
@@ -3861,8 +3946,8 @@ static int check_zbc_access_params(struct scsi_cmnd *scp,
/* Writing into a gap zone is not allowed */
if (zbc_zone_is_gap(zsp)) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE,
- ATTEMPT_ACCESS_GAP);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ ATTEMPT_TO_ACCESS_GAP_ZONE);
return check_condition_result;
}
@@ -3870,8 +3955,7 @@ static int check_zbc_access_params(struct scsi_cmnd *scp,
if (zbc_zone_is_conv(zsp)) {
if (!zbc_zone_is_conv(zsp_end)) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- LBA_OUT_OF_RANGE,
- WRITE_BOUNDARY_ASCQ);
+ WRITE_BOUNDARY_VIOLATION);
return check_condition_result;
}
return 0;
@@ -3881,21 +3965,29 @@ static int check_zbc_access_params(struct scsi_cmnd *scp,
/* Writes cannot cross sequential zone boundaries */
if (zsp_end != zsp) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- LBA_OUT_OF_RANGE,
- WRITE_BOUNDARY_ASCQ);
+ WRITE_BOUNDARY_VIOLATION);
return check_condition_result;
}
/* Cannot write full zones */
if (zsp->z_cond == ZC5_FULL) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- INVALID_FIELD_IN_CDB, 0);
+ INVALID_FIELD_IN_CDB);
return check_condition_result;
}
/* Writes must be aligned to the zone WP */
if (lba != zsp->z_wp) {
mk_sense_buffer(scp, ILLEGAL_REQUEST,
- LBA_OUT_OF_RANGE,
- UNALIGNED_WRITE_ASCQ);
+ UNALIGNED_WRITE_COMMAND);
+ return check_condition_result;
+ }
+ /*
+ * Writes must end on a physical block boundary, that is, the
+ * transfer length must be a multiple of the physical block
+ * size.
+ */
+ if (!IS_ALIGNED(lba + num, 1U << sdebug_physblk_exp)) {
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ UNALIGNED_WRITE_COMMAND);
return check_condition_result;
}
}
@@ -3905,8 +3997,7 @@ static int check_zbc_access_params(struct scsi_cmnd *scp,
if (devip->max_open &&
devip->nr_exp_open >= devip->max_open) {
mk_sense_buffer(scp, DATA_PROTECT,
- INSUFF_RES_ASC,
- INSUFF_ZONE_ASCQ);
+ INSUFFICIENT_ZONE_RESOURCES);
return check_condition_result;
}
zbc_open_zone(devip, zsp, false);
@@ -3923,17 +4014,18 @@ static inline int check_device_access_params
struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
if (lba + num > sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
return check_condition_result;
}
/* transfer length excessive (tie in to block limits VPD page) */
if (num > sdebug_store_sectors) {
/* needs work to find which cdb byte 'num' comes from */
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return check_condition_result;
}
if (write && unlikely(sdebug_wp)) {
- mk_sense_buffer(scp, DATA_PROTECT, WRITE_PROTECTED, 0x2);
+ mk_sense_buffer(scp, DATA_PROTECT, LU_SOFTWARE_WRITE_PROTECTED);
return check_condition_result;
}
if (sdebug_dev_is_zoned(devip))
@@ -4181,6 +4273,8 @@ static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
u64 block;
enum dma_data_direction dir;
struct scsi_data_buffer *sdb = &scp->sdb;
+ struct scsi_device *sdp = scp->device;
+ struct sdebug_dev_info *devip = (struct sdebug_dev_info *)sdp->hostdata;
u8 *fsp;
int i, total = 0;
@@ -4208,6 +4302,25 @@ static int do_device_access(struct sdeb_store_info *sip, struct scsi_cmnd *scp,
fsp = sip->storep;
+ /*
+ * A write to a sequential write required zone has to end on a physical
+ * block boundary, so if the data-out buffer does not hold all of the
+ * data that the command asks for, write up to the last whole physical
+ * block that it does hold. What is left over is reported as part of
+ * the residual.
+ */
+ if (do_write && sdebug_dev_is_zoned(devip)) {
+ struct sdeb_zone_state *zsp = zbc_zone(devip, lba);
+
+ if (zsp->z_type == ZBC_ZTYPE_SWR) {
+ u32 avail = (sdb->length - sg_skip)
+ >> ilog2(sdebug_sector_size);
+
+ if (avail < num)
+ num = round_down(avail, 1U << sdebug_physblk_exp);
+ }
+ }
+
block = do_div(lba, sdebug_store_sectors);
/* Only allow 1x atomic write or multiple non-atomic writes at any given time */
@@ -4442,17 +4555,17 @@ static int resp_read_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
i++, pos++, blp++) {
devip->tape_location[partition] = pos + 1;
if (IS_TAPE_BLOCK_FM(blp->fl_size)) {
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- FILEMARK_DETECTED_ASCQ, fixed ? num - i : size,
- SENSE_FLAG_FILEMARK);
+ mk_sense_info_tape(scp, NO_SENSE, FILEMARK_DETECTED,
+ fixed ? num - i : size,
+ SENSE_FLAG_FILEMARK);
scsi_set_resid(scp, (num - i) * size);
return check_condition_result;
}
/* Assume no REW */
if (IS_TAPE_BLOCK_EOD(blp->fl_size)) {
- mk_sense_info_tape(scp, BLANK_CHECK, NO_ADDITIONAL_SENSE,
- EOD_DETECTED_ASCQ, fixed ? num - i : size,
- 0);
+ mk_sense_info_tape(scp, BLANK_CHECK,
+ END_OF_DATA_DETECTED,
+ fixed ? num - i : size, 0);
devip->tape_location[partition] = pos;
scsi_set_resid(scp, (num - i) * size);
return check_condition_result;
@@ -4464,9 +4577,9 @@ static int resp_read_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
if (fixed) {
if (blp->fl_size != devip->tape_blksize) {
scsi_set_resid(scp, (num - i) * size);
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- 0, num - i,
- SENSE_FLAG_ILI);
+ mk_sense_info_tape(scp, NO_SENSE,
+ NO_ADDITIONAL_SENSE_INFORMATION,
+ num - i, SENSE_FLAG_ILI);
return check_condition_result;
}
} else {
@@ -4474,18 +4587,19 @@ static int resp_read_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
if (blp->fl_size < size)
scsi_set_resid(scp, size - blp->fl_size);
if (!sili) {
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- 0, size - blp->fl_size,
- SENSE_FLAG_ILI);
+ mk_sense_info_tape(scp, NO_SENSE,
+ NO_ADDITIONAL_SENSE_INFORMATION,
+ size - blp->fl_size,
+ SENSE_FLAG_ILI);
return check_condition_result;
}
}
}
}
if (pos >= devip->tape_eop[partition]) {
- mk_sense_info_tape(scp, NO_SENSE, NO_ADDITIONAL_SENSE,
- EOP_EOM_DETECTED_ASCQ, fixed ? num - i : size,
- SENSE_FLAG_EOM);
+ mk_sense_info_tape(scp, NO_SENSE,
+ END_OF_PARTITION_MEDIUM_DETECTED,
+ fixed ? num - i : size, SENSE_FLAG_EOM);
devip->tape_location[partition] = pos - 1;
return check_condition_result;
}
@@ -4572,8 +4686,7 @@ static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
if (unlikely((SDEBUG_OPT_MEDIUM_ERR & sdebug_opts) &&
(lba <= (sdebug_medium_error_start + sdebug_medium_error_count - 1)) &&
((lba + num) > sdebug_medium_error_start))) {
- /* claim unrecoverable read error */
- mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERR, 0);
+ mk_sense_buffer(scp, MEDIUM_ERROR, UNRECOVERED_READ_ERROR);
/* set info field and valid bit for fixed descriptor */
if (0x70 == (scp->sense_buffer[0] & 0x7f)) {
scp->sense_buffer[0] |= 0x80; /* Valid bit */
@@ -4597,22 +4710,26 @@ static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
case 1: /* Guard tag error */
if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
sdeb_meta_read_unlock(sip);
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
return check_condition_result;
} else if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
sdeb_meta_read_unlock(sip);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
return illegal_condition_result;
}
break;
case 3: /* Reference tag error */
if (cmd[1] >> 5 != 3) { /* RDPROTECT != 3 */
sdeb_meta_read_unlock(sip);
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
return check_condition_result;
} else if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
sdeb_meta_read_unlock(sip);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
return illegal_condition_result;
}
break;
@@ -4630,16 +4747,18 @@ static int resp_read_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
atomic_read(&sdeb_inject_pending))) {
if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
- mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
+ mk_sense_buffer(scp, RECOVERED_ERROR,
+ FAILURE_PREDICTION_THRESHOLD_EXCEEDED);
atomic_set(&sdeb_inject_pending, 0);
return check_condition_result;
} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
- /* Logical block guard check failed */
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
return illegal_condition_result;
} else if (SDEBUG_OPT_DIX_ERR & sdebug_opts) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
return illegal_condition_result;
}
@@ -4757,6 +4876,11 @@ static unsigned int map_state(struct sdeb_store_info *sip, sector_t lba,
return mapped;
}
+/*
+ * Callers may map the whole range of a write without checking how much of
+ * it was written. SBC-6 4.7.4.6.2 allows a deallocated LBA to become mapped
+ * at any time, and only requires an LBA that was written to be mapped.
+ */
static void map_region(struct sdeb_store_info *sip, sector_t lba,
unsigned int len)
{
@@ -4846,22 +4970,94 @@ static int resp_write_tape(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
blp->fl_size = TAPE_BLOCK_EOD_FLAG;
if (pos >= devip->tape_eop[partition] - 1) {
mk_sense_info_tape(scp, VOLUME_OVERFLOW,
- NO_ADDITIONAL_SENSE, EOP_EOM_DETECTED_ASCQ,
- fixed ? num - i : transfer,
- SENSE_FLAG_EOM);
+ END_OF_PARTITION_MEDIUM_DETECTED,
+ fixed ? num - i : transfer, SENSE_FLAG_EOM);
return check_condition_result;
}
if (ew) { /* early warning */
mk_sense_info_tape(scp, NO_SENSE,
- NO_ADDITIONAL_SENSE, EOP_EOM_DETECTED_ASCQ,
- fixed ? num - i : transfer,
- SENSE_FLAG_EOM);
+ END_OF_PARTITION_MEDIUM_DETECTED,
+ fixed ? num - i : transfer, SENSE_FLAG_EOM);
return check_condition_result;
}
return 0;
}
+static int corrupt_lbas(struct sdebug_dev_info *devip, u64 lba, u32 num,
+ u32 nr_bit_errors, s32 reftag_adjust)
+{
+ struct sdeb_store_info *sip = devip2sip(devip, false);
+ bool meta_data_locked = false;
+ bool lbp = scsi_debug_lbp();
+ u32 block, num_mapped, b, i;
+ int error = 0;
+
+ if (sdebug_dev_is_zoned(devip) || sdebug_dix || lbp) {
+ sdeb_meta_write_lock(sip);
+ meta_data_locked = true;
+ }
+
+ if (!sip) {
+ pr_err("can't corrupt with fake_rw\n");
+ error = -EINVAL;
+ goto out_unlock;
+ }
+
+ if (num > sdebug_capacity || lba > sdebug_capacity - num) {
+ pr_err("logical blocks out of bounds: %llu:%u", lba, num);
+ error = -EINVAL;
+ goto out_unlock;
+ }
+
+ if (lbp && (!map_state(sip, lba, &num_mapped) || num > num_mapped)) {
+ pr_err("can't modify unmapped logical blocks: %llu:%u",
+ lba, num);
+ error = -EINVAL;
+ goto out_unlock;
+ }
+
+ /*
+ * For each possible bit error, flip the same bit in each corrupted
+ * block to simulate repeated patterns like errors in cables.
+ */
+ sdeb_data_lock(sip, false);
+ for (b = 0; b < nr_bit_errors; b++) {
+ unsigned int bit;
+
+ bit = get_random_u32_below(sdebug_sector_size * BITS_PER_BYTE);
+ pr_info("flipping bit %u in LBAs %llu:%llu\n",
+ bit, lba, lba + num - 1);
+
+ div_u64_rem(lba, sdebug_store_sectors, &block);
+ for (i = 0; i < num; i++) {
+ u8 *p = sip->storep + (block * sdebug_sector_size);
+
+ sdeb_data_sector_lock(sip, true);
+ p[bit / BITS_PER_BYTE] ^= (1 << (bit % BITS_PER_BYTE));
+ sdeb_data_sector_unlock(sip, true);
+ if (++block >= sdebug_store_sectors)
+ block = 0;
+ }
+ }
+
+ if (reftag_adjust) {
+ pr_info("adjusting reftag by %d sectors for LBAs %llu:%llu\n",
+ reftag_adjust, lba, lba + num - 1);
+ for (i = 0; i < num; i++) {
+ struct t10_pi_tuple *sdt = dif_store(sip, lba + i);
+
+ be32_add_cpu(&sdt->ref_tag, reftag_adjust);
+ }
+ }
+ sdeb_data_unlock(sip, false);
+
+out_unlock:
+ if (meta_data_locked)
+ sdeb_meta_write_unlock(sip);
+ return error;
+}
+
static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
{
bool check_prot;
@@ -4873,12 +5069,12 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
struct sdeb_store_info *sip = devip2sip(devip, true);
u8 *cmd = scp->cmnd;
bool meta_data_locked = false;
+ bool lbp = scsi_debug_lbp();
if (unlikely(sdebug_opts & SDEBUG_OPT_UNALIGNED_WRITE &&
atomic_read(&sdeb_inject_pending))) {
atomic_set(&sdeb_inject_pending, 0);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE,
- UNALIGNED_WRITE_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, UNALIGNED_WRITE_COMMAND);
return check_condition_result;
}
@@ -4940,8 +5136,7 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
}
if (sdebug_dev_is_zoned(devip) ||
- (sdebug_dix && scsi_prot_sg_count(scp)) ||
- scsi_debug_lbp()) {
+ (sdebug_dix && scsi_prot_sg_count(scp)) || lbp) {
sdeb_meta_write_lock(sip);
meta_data_locked = true;
}
@@ -4959,22 +5154,26 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
case 1: /* Guard tag error */
if (scp->prot_flags & SCSI_PROT_GUARD_CHECK) {
sdeb_meta_write_unlock(sip);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
return illegal_condition_result;
} else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
sdeb_meta_write_unlock(sip);
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
return check_condition_result;
}
break;
case 3: /* Reference tag error */
if (scp->prot_flags & SCSI_PROT_REF_CHECK) {
sdeb_meta_write_unlock(sip);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 3);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
return illegal_condition_result;
} else if (scp->cmnd[1] >> 5 != 3) { /* WRPROTECT != 3 */
sdeb_meta_write_unlock(sip);
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 3);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED);
return check_condition_result;
}
break;
@@ -4982,12 +5181,12 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
}
ret = do_device_access(sip, scp, 0, lba, num, group, true, false);
- if (unlikely(scsi_debug_lbp()))
+ if (unlikely(lbp))
map_region(sip, lba, num);
- /* If ZBC zone then bump its write pointer */
- if (sdebug_dev_is_zoned(devip))
- zbc_inc_wp(devip, lba, num);
+ /* If ZBC zone then bump its write pointer over the data written */
+ if (sdebug_dev_is_zoned(devip) && ret > 0)
+ zbc_inc_wp(devip, lba, ret >> ilog2(sdebug_sector_size));
if (meta_data_locked)
sdeb_meta_write_unlock(sip);
@@ -4999,19 +5198,24 @@ static int resp_write_dt0(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
"%s: write: cdb indicated=%u, IO sent=%d bytes\n",
my_name, num * sdebug_sector_size, ret);
+ if (ret < scsi_bufflen(scp))
+ scsi_set_resid(scp, scsi_bufflen(scp) - ret);
+
if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
atomic_read(&sdeb_inject_pending))) {
if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
- mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
+ mk_sense_buffer(scp, RECOVERED_ERROR,
+ FAILURE_PREDICTION_THRESHOLD_EXCEEDED);
atomic_set(&sdeb_inject_pending, 0);
return check_condition_result;
} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
- /* Logical block guard check failed */
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
return illegal_condition_result;
} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
return illegal_condition_result;
}
@@ -5032,7 +5236,8 @@ static int resp_write_scat(struct scsi_cmnd *scp,
struct sdeb_store_info *sip = devip2sip(devip, true);
u8 wrprotect;
u16 lbdof, num_lrd, k;
- u32 num, num_by, bt_len, lbdof_blen, sg_off, cum_lb;
+ u32 num, bt_len, lbdof_blen, cum_lb;
+ u64 num_by, sg_off;
u32 lb_size = sdebug_sector_size;
u32 ei_lba;
u64 lba;
@@ -5068,13 +5273,15 @@ static int resp_write_scat(struct scsi_cmnd *scp,
"Unprotected WR to DIF device\n");
}
}
- if ((num_lrd == 0) || (bt_len == 0))
+ if (num_lrd == 0 || bt_len == 0) {
+ scsi_set_resid(scp, scsi_bufflen(scp));
return 0; /* T10 says these do-nothings are not errors */
+ }
if (lbdof == 0) {
if (sdebug_verbose)
sdev_printk(KERN_INFO, scp->device,
"%s: LB Data Offset field bad\n", my_name);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return illegal_condition_result;
}
lbdof_blen = lbdof * lb_size;
@@ -5082,7 +5289,7 @@ static int resp_write_scat(struct scsi_cmnd *scp,
if (sdebug_verbose)
sdev_printk(KERN_INFO, scp->device,
"%s: LBA range descriptors don't fit\n", my_name);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return illegal_condition_result;
}
lrdp = kzalloc(lbdof_blen, GFP_ATOMIC | __GFP_NOWARN);
@@ -5108,14 +5315,14 @@ static int resp_write_scat(struct scsi_cmnd *scp,
num = get_unaligned_be32(up + 8);
if (sdebug_verbose)
sdev_printk(KERN_INFO, scp->device,
- "%s: k=%d LBA=0x%llx num=%u sg_off=%u\n",
+ "%s: k=%d LBA=0x%llx num=%u sg_off=%llu\n",
my_name, k, lba, num, sg_off);
if (num == 0)
continue;
ret = check_device_access_params(scp, lba, num, true);
if (ret)
goto err_out_unlock;
- num_by = num * lb_size;
+ num_by = (u64)num * lb_size;
ei_lba = is_16 ? 0 : get_unaligned_be32(up + 12);
if ((cum_lb + num) > bt_len) {
@@ -5123,8 +5330,7 @@ static int resp_write_scat(struct scsi_cmnd *scp,
sdev_printk(KERN_INFO, scp->device,
"%s: sum of blocks > data provided\n",
my_name);
- mk_sense_buffer(scp, ILLEGAL_REQUEST, WRITE_ERROR_ASC,
- 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, SSC_WRITE_ERROR);
ret = illegal_condition_result;
goto err_out_unlock;
}
@@ -5135,8 +5341,9 @@ static int resp_write_scat(struct scsi_cmnd *scp,
ei_lba);
if (prot_ret) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10,
- prot_ret);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ scsi_sense_code(ASC_ID_CRC_OR_ECC_ERROR,
+ prot_ret));
ret = illegal_condition_result;
goto err_out_unlock;
}
@@ -5146,10 +5353,13 @@ static int resp_write_scat(struct scsi_cmnd *scp,
* Write ranges atomically to keep as close to pre-atomic
* writes behaviour as possible.
*/
- ret = do_device_access(sip, scp, sg_off, lba, num, group, true, true);
- /* If ZBC zone then bump its write pointer */
- if (sdebug_dev_is_zoned(devip))
- zbc_inc_wp(devip, lba, num);
+ ret = do_device_access(sip, scp,
+ min_t(u64, sg_off, scsi_bufflen(scp)),
+ lba, num, group, true, true);
+ /* If ZBC zone then bump its write pointer over the data written */
+ if (sdebug_dev_is_zoned(devip) && ret > 0)
+ zbc_inc_wp(devip, lba,
+ ret >> ilog2(sdebug_sector_size));
if (unlikely(scsi_debug_lbp()))
map_region(sip, lba, num);
if (unlikely(-1 == ret)) {
@@ -5157,24 +5367,28 @@ static int resp_write_scat(struct scsi_cmnd *scp,
goto err_out_unlock;
} else if (unlikely(sdebug_verbose && (ret < num_by)))
sdev_printk(KERN_INFO, scp->device,
- "%s: write: cdb indicated=%u, IO sent=%d bytes\n",
+ "%s: write: cdb indicated=%llu, IO sent=%d bytes\n",
my_name, num_by, ret);
if (unlikely((sdebug_opts & SDEBUG_OPT_RECOV_DIF_DIX) &&
atomic_read(&sdeb_inject_pending))) {
+ /* This range has been written */
+ sg_off += num_by;
if (sdebug_opts & SDEBUG_OPT_RECOVERED_ERR) {
- mk_sense_buffer(scp, RECOVERED_ERROR, THRESHOLD_EXCEEDED, 0);
+ mk_sense_buffer(scp, RECOVERED_ERROR,
+ FAILURE_PREDICTION_THRESHOLD_EXCEEDED);
atomic_set(&sdeb_inject_pending, 0);
ret = check_condition_result;
goto err_out_unlock;
} else if (sdebug_opts & SDEBUG_OPT_DIF_ERR) {
- /* Logical block guard check failed */
- mk_sense_buffer(scp, ABORTED_COMMAND, 0x10, 1);
+ mk_sense_buffer(scp, ABORTED_COMMAND,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
ret = illegal_condition_result;
goto err_out_unlock;
} else if (sdebug_opts & SDEBUG_OPT_DIX_ERR) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, 0x10, 1);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_GUARD_CHECK_FAILED);
atomic_set(&sdeb_inject_pending, 0);
ret = illegal_condition_result;
goto err_out_unlock;
@@ -5185,6 +5399,13 @@ static int resp_write_scat(struct scsi_cmnd *scp,
}
ret = 0;
err_out_unlock:
+ /*
+ * sg_off counts what the command asked for, which can exceed the
+ * buffer: lbdof is not validated against it, and a range is counted
+ * in full even if do_device_access() copied less.
+ */
+ if (scsi_bufflen(scp) > sg_off)
+ scsi_set_resid(scp, scsi_bufflen(scp) - sg_off);
sdeb_meta_write_unlock(sip);
err_out:
kfree(lrdp);
@@ -5205,8 +5426,9 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
u8 *fs1p;
u8 *fsp;
bool meta_data_locked = false;
+ bool lbp = scsi_debug_lbp();
- if (sdebug_dev_is_zoned(devip) || scsi_debug_lbp()) {
+ if (sdebug_dev_is_zoned(devip) || lbp) {
sdeb_meta_write_lock(sip);
meta_data_locked = true;
}
@@ -5215,7 +5437,7 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
if (ret)
goto out;
- if (unmap && scsi_debug_lbp()) {
+ if (unmap && lbp) {
unmap_region(sip, lba, num);
goto out;
}
@@ -5245,7 +5467,7 @@ static int resp_write_same(struct scsi_cmnd *scp, u64 lba, u32 num,
block = do_div(lbaa, sdebug_store_sectors);
memmove(fsp + (block * lb_size), fs1p, lb_size);
}
- if (scsi_debug_lbp())
+ if (lbp)
map_region(sip, lba, num);
/* If ZBC zone then bump its write pointer */
if (sdebug_dev_is_zoned(devip))
@@ -5393,8 +5615,7 @@ static int resp_comp_write(struct scsi_cmnd *scp,
dnum = 2 * num;
arr = kcalloc(lb_size, dnum, GFP_ATOMIC);
if (NULL == arr) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
- INSUFF_RES_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFFICIENT_RESOURCES);
return check_condition_result;
}
@@ -5407,20 +5628,21 @@ static int resp_comp_write(struct scsi_cmnd *scp,
"indicated=%u, IO sent=%d bytes\n", my_name,
dnum * lb_size, ret);
- sdeb_data_write_lock(sip);
sdeb_meta_write_lock(sip);
+ sdeb_data_write_lock(sip);
if (!comp_write_worker(sip, lba, num, arr, false)) {
- mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
+ mk_sense_buffer(scp, MISCOMPARE,
+ MISCOMPARE_DURING_VERIFY_OPERATION);
retval = check_condition_result;
goto cleanup_unlock;
}
- /* Cover sip->map_storep (which map_region()) sets with data lock */
+ /* Cover sip->map_storep (which map_region() sets) with the meta lock */
if (scsi_debug_lbp())
map_region(sip, lba, num);
cleanup_unlock:
- sdeb_meta_write_unlock(sip);
sdeb_data_write_unlock(sip);
+ sdeb_meta_write_unlock(sip);
cleanup_free:
kfree(arr);
return retval;
@@ -5453,8 +5675,7 @@ static int resp_unmap(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
buf = kzalloc(scsi_bufflen(scp), GFP_ATOMIC);
if (!buf) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
- INSUFF_RES_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFFICIENT_RESOURCES);
return check_condition_result;
}
@@ -5592,7 +5813,8 @@ static int resp_sync_cache(struct scsi_cmnd *scp,
num_blocks = get_unaligned_be32(cmd + 10);
}
if (lba + num_blocks > sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
return check_condition_result;
}
if (!write_since_sync || (cmd[1] & 0x2))
@@ -5630,7 +5852,8 @@ static int resp_pre_fetch(struct scsi_cmnd *scp,
nblks = get_unaligned_be32(cmd + 10);
}
if (lba + nblks > sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
return check_condition_result;
}
if (!fsp)
@@ -5801,8 +6024,7 @@ static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
arr = kcalloc(lb_size, vnum, GFP_ATOMIC | __GFP_NOWARN);
if (!arr) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
- INSUFF_RES_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFFICIENT_RESOURCES);
return check_condition_result;
}
/* Not changing store, so only need read access */
@@ -5823,7 +6045,8 @@ static int resp_verify(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
}
ret = 0;
if (!comp_write_worker(sip, lba, vnum, arr, true)) {
- mk_sense_buffer(scp, MISCOMPARE, MISCOMPARE_VERIFY_ASC, 0);
+ mk_sense_buffer(scp, MISCOMPARE,
+ MISCOMPARE_DURING_VERIFY_OPERATION);
ret = check_condition_result;
goto cleanup;
}
@@ -5862,7 +6085,8 @@ static int resp_report_zones(struct scsi_cmnd *scp,
partial = cmd[14] & 0x80;
if (zs_lba >= sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
return check_condition_result;
}
@@ -5873,8 +6097,8 @@ static int resp_report_zones(struct scsi_cmnd *scp,
arr = kzalloc(arr_len, GFP_ATOMIC | __GFP_NOWARN);
if (!arr) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INSUFF_RES_ASC,
- INSUFF_RES_ASCQ);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ INSUFFICIENT_RESOURCES);
return check_condition_result;
}
@@ -5939,8 +6163,7 @@ static int resp_report_zones(struct scsi_cmnd *scp,
continue;
break;
default:
- mk_sense_buffer(scp, ILLEGAL_REQUEST,
- INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
ret = check_condition_result;
goto fini;
}
@@ -5988,6 +6211,7 @@ static int resp_atomic_write(struct scsi_cmnd *scp,
u8 *cmd = scp->cmnd;
u16 boundary, len;
u64 lba, lba_tmp;
+ bool lbp = scsi_debug_lbp();
int ret;
if (!scsi_debug_atomic_write()) {
@@ -6005,13 +6229,13 @@ static int resp_atomic_write(struct scsi_cmnd *scp,
if (sdebug_atomic_wr_align &&
do_div(lba_tmp, sdebug_atomic_wr_align)) {
/* Does not meet alignment requirement */
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return check_condition_result;
}
if (sdebug_atomic_wr_gran && len % sdebug_atomic_wr_gran) {
/* Does not meet alignment requirement */
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
return check_condition_result;
}
@@ -6032,11 +6256,34 @@ static int resp_atomic_write(struct scsi_cmnd *scp,
}
}
+ ret = check_device_access_params(scp, lba, len, true);
+ if (ret)
+ return ret;
+
+ /*
+ * Short atomic writes are not allowed: SBC-6 4.28.2 requires an
+ * atomic write that cannot complete to leave its LBAs unaltered, and
+ * do_device_access() would already have written part of it.
+ */
+ if (scsi_bufflen(scp) < len * sdebug_sector_size)
+ return DID_ERROR << 16;
+
+ if (lbp)
+ sdeb_meta_write_lock(sip);
+
ret = do_device_access(sip, scp, 0, lba, len, 0, true, true);
+ if (lbp) {
+ map_region(sip, lba, len);
+ sdeb_meta_write_unlock(sip);
+ }
+
if (unlikely(ret == -1))
return DID_ERROR << 16;
if (unlikely(ret != len * sdebug_sector_size))
return DID_ERROR << 16;
+
+ if (ret < scsi_bufflen(scp))
+ scsi_set_resid(scp, scsi_bufflen(scp) - ret);
return 0;
}
@@ -6072,8 +6319,8 @@ static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
/* Check if all closed zones can be open */
if (devip->max_open &&
devip->nr_exp_open + devip->nr_closed > devip->max_open) {
- mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
- INSUFF_ZONE_ASCQ);
+ mk_sense_buffer(scp, DATA_PROTECT,
+ INSUFFICIENT_ZONE_RESOURCES);
res = check_condition_result;
goto fini;
}
@@ -6085,19 +6332,20 @@ static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
/* Open the specified zone */
z_id = get_unaligned_be64(cmd + 2);
if (z_id >= sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
res = check_condition_result;
goto fini;
}
zsp = zbc_zone(devip, z_id);
if (z_id != zsp->z_start) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
if (zbc_zone_is_conv(zsp)) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
@@ -6107,8 +6355,7 @@ static int resp_open_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
goto fini;
if (devip->max_open && devip->nr_exp_open >= devip->max_open) {
- mk_sense_buffer(scp, DATA_PROTECT, INSUFF_RES_ASC,
- INSUFF_ZONE_ASCQ);
+ mk_sense_buffer(scp, DATA_PROTECT, INSUFFICIENT_ZONE_RESOURCES);
res = check_condition_result;
goto fini;
}
@@ -6152,19 +6399,20 @@ static int resp_close_zone(struct scsi_cmnd *scp,
/* Close specified zone */
z_id = get_unaligned_be64(cmd + 2);
if (z_id >= sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
res = check_condition_result;
goto fini;
}
zsp = zbc_zone(devip, z_id);
if (z_id != zsp->z_start) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
if (zbc_zone_is_conv(zsp)) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
@@ -6224,19 +6472,20 @@ static int resp_finish_zone(struct scsi_cmnd *scp,
/* Finish the specified zone */
z_id = get_unaligned_be64(cmd + 2);
if (z_id >= sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
res = check_condition_result;
goto fini;
}
zsp = zbc_zone(devip, z_id);
if (z_id != zsp->z_start) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
if (zbc_zone_is_conv(zsp)) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
@@ -6303,19 +6552,20 @@ static int resp_rwp_zone(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
z_id = get_unaligned_be64(cmd + 2);
if (z_id >= sdebug_capacity) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, LBA_OUT_OF_RANGE, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST,
+ LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE);
res = check_condition_result;
goto fini;
}
zsp = zbc_zone(devip, z_id);
if (z_id != zsp->z_start) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
if (zbc_zone_is_conv(zsp)) {
- mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB, 0);
+ mk_sense_buffer(scp, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
res = check_condition_result;
goto fini;
}
@@ -6628,6 +6878,8 @@ static int scsi_debug_sdev_configure(struct scsi_device *sdp,
if (IS_ERR_OR_NULL(dentry))
pr_info("failed to create error file for device %s\n",
dev_name(&sdp->sdev_gendev));
+ debugfs_create_file("corrupt", 0600, devip->debugfs_entry, sdp,
+ &sdebug_corrupt_fops);
return 0;
}
@@ -7186,7 +7438,7 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
cmnd->result = scsi_result;
if (cmnd->result == 0 && unlikely(sdebug_opts & SDEBUG_OPT_TRANSPORT_ERR)) {
if (atomic_read(&sdeb_inject_pending)) {
- mk_sense_buffer(cmnd, ABORTED_COMMAND, TRANSPORT_PROBLEM, ACK_NAK_TO);
+ mk_sense_buffer(cmnd, ABORTED_COMMAND, ACK_NAK_TIMEOUT);
atomic_set(&sdeb_inject_pending, 0);
cmnd->result = check_condition_result;
}
@@ -7373,8 +7625,8 @@ MODULE_VERSION(SDEBUG_VERSION);
MODULE_PARM_DESC(add_host, "add n hosts, in sysfs if negative remove host(s) (def=1)");
MODULE_PARM_DESC(ato, "application tag ownership: 0=disk 1=host (def=1)");
MODULE_PARM_DESC(cdb_len, "suggest CDB lengths to drivers (def=10)");
-MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=0)");
-MODULE_PARM_DESC(delay, "response delay (def=1 jiffy); 0:imm, -1,-2:tiny");
+MODULE_PARM_DESC(clustering, "when set enables larger transfers (def=1)");
+MODULE_PARM_DESC(delay, "response delay (def=0 jiffy); 0:imm, -1,-2:tiny");
MODULE_PARM_DESC(dev_size_mb, "size in MiB of ram shared by devs(def=8)");
MODULE_PARM_DESC(dif, "data integrity field type: 0-3 (def=0)");
MODULE_PARM_DESC(dix, "data integrity extensions mask (def=0)");
@@ -8481,8 +8733,8 @@ static int __init scsi_debug_init(void)
return -EINVAL;
}
- if (sdebug_physblk_exp > 15) {
- pr_err("invalid physblk_exp %u\n", sdebug_physblk_exp);
+ if (sdebug_physblk_exp < 0 || sdebug_physblk_exp > 15) {
+ pr_err("invalid physblk_exp %d\n", sdebug_physblk_exp);
return -EINVAL;
}
@@ -8559,6 +8811,16 @@ static int __init scsi_debug_init(void)
sdebug_dev_size_mb = DEF_ZBC_DEV_SIZE_MB;
}
+ if (sdeb_zbc_in_use && sdebug_lowest_aligned) {
+ pr_err("lowest_aligned is not supported by a zoned device\n");
+ return -EINVAL;
+ }
+
+ if (sdeb_zbc_in_use && sdebug_atomic_wr) {
+ pr_err("atomic_wr is not supported by a zoned device\n");
+ return -EINVAL;
+ }
+
if (sdebug_dev_size_mb == DEF_DEV_SIZE_PRE_INIT)
sdebug_dev_size_mb = DEF_DEV_SIZE_MB;
if (sdebug_dev_size_mb < 1)
@@ -8979,7 +9241,8 @@ static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
return 0;
}
}
- mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x1);
+ mk_sense_buffer(scp, NOT_READY,
+ LU_IS_IN_PROCESS_OF_BECOMING_READY);
if (sdebug_verbose)
sdev_printk(KERN_INFO, sdp,
"%s: Not ready: in process of becoming ready\n", my_name);
@@ -8997,7 +9260,8 @@ static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
return check_condition_result;
}
}
- mk_sense_buffer(scp, NOT_READY, LOGICAL_UNIT_NOT_READY, 0x2);
+ mk_sense_buffer(scp, NOT_READY,
+ LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED);
if (sdebug_verbose)
sdev_printk(KERN_INFO, sdp, "%s: Not ready: initializing command required\n",
my_name);
@@ -9194,7 +9458,8 @@ static int sdebug_fail_cmd(struct scsi_cmnd *cmnd, int *retval,
out_handle:
if (err->cnt < 0)
err->cnt++;
- mk_sense_buffer(cmnd, err->sense_key, err->asc, err->asq);
+ mk_sense_buffer(cmnd, err->sense_key,
+ scsi_sense_code(err->asc, err->asq));
result = err->status_byte | err->host_byte << 16 | err->driver_byte << 24;
*info = *err;
*retval = schedule_resp(cmnd, devip, result, NULL, 0, 0);
diff --git a/drivers/scsi/scsi_debugfs.c b/drivers/scsi/scsi_debugfs.c
index eb52e39f37c9..54d8824250b1 100644
--- a/drivers/scsi/scsi_debugfs.c
+++ b/drivers/scsi/scsi_debugfs.c
@@ -38,7 +38,7 @@ static const char *scsi_cmd_list_info(struct scsi_cmnd *cmd)
struct Scsi_Host *shost = cmd->device->host;
struct scsi_cmnd *cmd2;
- guard(spinlock_irq)(shost->host_lock);
+ guard(spinlock_irq)(&shost->host_lock);
list_for_each_entry(cmd2, &shost->eh_abort_list, eh_entry)
if (cmd == cmd2)
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
index 88a911b35c94..cfc259fd0141 100644
--- a/drivers/scsi/scsi_devinfo.c
+++ b/drivers/scsi/scsi_devinfo.c
@@ -691,7 +691,8 @@ static ssize_t proc_scsi_devinfo_write(struct file *file,
if (!buf || length>PAGE_SIZE)
return -EINVAL;
- if (!(buffer = (char *) __get_free_page(GFP_KERNEL)))
+ buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
+ if (!buffer)
return -ENOMEM;
if (copy_from_user(buffer, buf, length)) {
err =-EFAULT;
@@ -708,7 +709,7 @@ static ssize_t proc_scsi_devinfo_write(struct file *file,
scsi_dev_info_list_add_str(buffer);
out:
- free_page((unsigned long)buffer);
+ kfree(buffer);
return err;
}
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index b729407348f7..75442d60c30e 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -63,7 +63,7 @@ static enum scsi_disposition scsi_try_to_abort_cmd(const struct scsi_host_templa
void scsi_eh_wakeup(struct Scsi_Host *shost, unsigned int busy)
{
- lockdep_assert_held(shost->host_lock);
+ lockdep_assert_held(&shost->host_lock);
if (busy == shost->host_failed) {
trace_scsi_eh_wakeup(shost);
@@ -88,9 +88,9 @@ void scsi_rcu_eh_wakeup(struct work_struct *work)
busy = scsi_host_busy(shost);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
scsi_eh_wakeup(shost, busy);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -103,7 +103,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)
{
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_set_state(shost, SHOST_RECOVERY) == 0 ||
scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY) == 0) {
@@ -111,7 +111,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)
queue_work(shost->tmf_work_q, &shost->eh_work);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
EXPORT_SYMBOL_GPL(scsi_schedule_eh);
@@ -201,7 +201,7 @@ scmd_eh_abort_handler(struct work_struct *work)
goto out;
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_del_init(&scmd->eh_entry);
/*
@@ -213,7 +213,7 @@ scmd_eh_abort_handler(struct work_struct *work)
if (shost->eh_deadline != -1)
shost->last_reset = 0;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (!scsi_noretry_cmd(scmd) &&
scsi_cmd_retry_allowed(scmd) &&
@@ -231,9 +231,9 @@ scmd_eh_abort_handler(struct work_struct *work)
return;
out:
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_del_init(&scmd->eh_entry);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_eh_scmd_add(scmd);
}
@@ -267,12 +267,11 @@ scsi_abort_command(struct scsi_cmnd *scmd)
return FAILED;
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (shost->eh_deadline != -1 && !shost->last_reset)
shost->last_reset = jiffies;
- BUG_ON(!list_empty(&scmd->eh_entry));
list_add_tail(&scmd->eh_entry, &shost->eh_abort_list);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scmd->eh_eflags |= SCSI_EH_ABORT_SCHEDULED;
SCSI_LOG_ERROR_RECOVERY(3,
@@ -305,9 +304,9 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
unsigned int busy;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
shost->host_failed++;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* The counting of busy requests needs to occur after adding to
* host_failed or after the lock acquire for adding to host_failed
@@ -315,9 +314,9 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
*/
busy = scsi_host_busy(shost);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
scsi_eh_wakeup(shost, busy);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -333,7 +332,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)
WARN_ON_ONCE(!shost->ehandler);
WARN_ON_ONCE(!test_bit(SCMD_STATE_INFLIGHT, &scmd->state));
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_set_state(shost, SHOST_RECOVERY)) {
ret = scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY);
WARN_ON_ONCE(ret);
@@ -343,7 +342,7 @@ void scsi_eh_scmd_add(struct scsi_cmnd *scmd)
scsi_eh_reset(scmd);
list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* Ensure that all tasks observe the host state change before the
* host_failed change.
@@ -490,24 +489,27 @@ static void scsi_report_sense(struct scsi_device *sdev,
enum scsi_device_event evt_type = SDEV_EVT_MAXBITS; /* i.e. none */
if (sshdr->sense_key == UNIT_ATTENTION) {
- if (sshdr->asc == 0x3f && sshdr->ascq == 0x03) {
+ if (sshdr->sense_code == INQUIRY_DATA_HAS_CHANGED) {
evt_type = SDEV_EVT_INQUIRY_CHANGE_REPORTED;
sdev_printk(KERN_WARNING, sdev,
"Inquiry data has changed");
- } else if (sshdr->asc == 0x3f && sshdr->ascq == 0x0e) {
+ } else if (sshdr->sense_code == REPORTED_LUNS_DATA_HAS_CHANGED) {
evt_type = SDEV_EVT_LUN_CHANGE_REPORTED;
scsi_report_lun_change(sdev);
sdev_printk(KERN_WARNING, sdev,
"LUN assignments on this target have "
"changed. The Linux SCSI layer does not "
"automatically remap LUN assignments.\n");
- } else if (sshdr->asc == 0x3f)
+ } else if (scsi_sense_asc(sshdr) ==
+ ASC_TARGET_OPERATING_CONDITIONS_HAVE_CHANGED) {
sdev_printk(KERN_WARNING, sdev,
"Operating parameters on this target have "
"changed. The Linux SCSI layer does not "
"automatically adjust these parameters.\n");
+ }
- if (sshdr->asc == 0x38 && sshdr->ascq == 0x07) {
+ if (sshdr->sense_code ==
+ THIN_PROVISIONING_SOFT_THRESHOLD_REACHED) {
evt_type = SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED;
sdev_printk(KERN_WARNING, sdev,
"Warning! Received an indication that the "
@@ -515,7 +517,8 @@ static void scsi_report_sense(struct scsi_device *sdev,
"threshold.\n");
}
- if (sshdr->asc == 0x29) {
+ if (scsi_sense_asc(sshdr) ==
+ ASC_POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED) {
evt_type = SDEV_EVT_POWER_ON_RESET_OCCURRED;
/*
* Do not print message if it is an expected side-effect
@@ -526,21 +529,22 @@ static void scsi_report_sense(struct scsi_device *sdev,
"Power-on or device reset occurred\n");
}
- if (sshdr->asc == 0x2a && sshdr->ascq == 0x01) {
+ if (sshdr->sense_code == MODE_PARAMETERS_CHANGED) {
evt_type = SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED;
sdev_printk(KERN_WARNING, sdev,
"Mode parameters changed");
- } else if (sshdr->asc == 0x2a && sshdr->ascq == 0x06) {
+ } else if (sshdr->sense_code == ASYMMETRIC_ACCESS_STATE_CHANGED) {
evt_type = SDEV_EVT_ALUA_STATE_CHANGE_REPORTED;
sdev_printk(KERN_WARNING, sdev,
"Asymmetric access state changed");
- } else if (sshdr->asc == 0x2a && sshdr->ascq == 0x09) {
+ } else if (sshdr->sense_code == CAPACITY_DATA_HAS_CHANGED) {
evt_type = SDEV_EVT_CAPACITY_CHANGE_REPORTED;
sdev_printk(KERN_WARNING, sdev,
"Capacity data has changed");
- } else if (sshdr->asc == 0x2a)
+ } else if (scsi_sense_asc(sshdr) == ASC_PARAMETERS_CHANGED) {
sdev_printk(KERN_WARNING, sdev,
"Parameters changed");
+ }
}
if (evt_type != SDEV_EVT_MAXBITS) {
@@ -582,9 +586,11 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
* that all ULDs interested in these can see that those have
* happened, even if someone else gets the sense data.
*/
- if (sshdr.asc == 0x28)
+ if (scsi_sense_asc(&sshdr) ==
+ ASC_NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED)
atomic_inc(&sdev->ua_new_media_ctr);
- else if (sshdr.asc == 0x29)
+ else if (scsi_sense_asc(&sshdr) ==
+ ASC_POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
atomic_inc(&sdev->ua_por_ctr);
}
@@ -636,7 +642,8 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
return /* soft_error */ SUCCESS;
case ABORTED_COMMAND:
- if (sshdr.asc == 0x10) /* DIF */
+ if (scsi_sense_asc(&sshdr) == ASC_ID_CRC_OR_ECC_ERROR)
+ /* DIF */
return SUCCESS;
/*
@@ -647,18 +654,20 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
* COMMAND TIMEOUT DURING PROCESSING DUE TO ERROR RECOVERY
* additional sense code qualifiers.
*/
- if (sshdr.asc == 0x2e &&
- sshdr.ascq >= 0x01 && sshdr.ascq <= 0x03) {
+ if (sshdr.sense_code >= COMMAND_TIMEOUT_BEFORE_PROCESSING &&
+ sshdr.sense_code <=
+ COMMAND_TIMEOUT_DURING_PROCESSING_DUE_TO_ERROR_RECOVERY) {
set_scsi_ml_byte(scmd, SCSIML_STAT_DL_TIMEOUT);
req->cmd_flags |= REQ_FAILFAST_DEV;
req->rq_flags |= RQF_QUIET;
return SUCCESS;
}
- if (sshdr.asc == 0x44 && sdev->sdev_bflags & BLIST_RETRY_ITF)
+ if ((sdev->sdev_bflags & BLIST_RETRY_ITF) &&
+ scsi_sense_asc(&sshdr) == ASC_INTERNAL_TARGET_FAILURE)
return ADD_TO_MLQUEUE;
- if (sshdr.asc == 0xc1 && sshdr.ascq == 0x01 &&
- sdev->sdev_bflags & BLIST_RETRY_ASC_C1)
+ if ((sdev->sdev_bflags & BLIST_RETRY_ASC_C1) &&
+ sshdr.sense_code == scsi_sense_code(0xc1, 0x01))
return ADD_TO_MLQUEUE;
return NEEDS_RETRY;
@@ -672,12 +681,13 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
*/
if (scmd->device->expecting_cc_ua) {
/*
- * Because some device does not queue unit
- * attentions correctly, we carefully check
- * additional sense code and qualifier so as
- * not to squash media change unit attention.
+ * Because some devices do not queue unit attentions
+ * correctly, we carefully check additional sense code
+ * and qualifier so as not to squash media change unit
+ * attention.
*/
- if (sshdr.asc != 0x28 || sshdr.ascq != 0x00) {
+ if (sshdr.sense_code !=
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED) {
scmd->device->expecting_cc_ua = 0;
return NEEDS_RETRY;
}
@@ -688,21 +698,23 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
* REPORTED LUNS DATA HAS CHANGED.
*/
if (scmd->device->sdev_target->expecting_lun_change &&
- sshdr.asc == 0x3f && sshdr.ascq == 0x0e)
+ sshdr.sense_code == REPORTED_LUNS_DATA_HAS_CHANGED)
return NEEDS_RETRY;
/*
* if the device is in the process of becoming ready, we
* should retry.
*/
- if ((sshdr.asc == 0x04) &&
- (sshdr.ascq == 0x01 || sshdr.ascq == 0x0a))
+ if (sshdr.sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY ||
+ sshdr.sense_code ==
+ LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION)
return NEEDS_RETRY;
/*
* if the device is not started, we need to wake
* the error handler to start the motor
*/
if (scmd->device->allow_restart &&
- (sshdr.asc == 0x04) && (sshdr.ascq == 0x02))
+ sshdr.sense_code ==
+ LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED)
return FAILED;
/*
* Pass the UA upwards for a determination in the completion
@@ -712,7 +724,7 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
/* these are not supported */
case DATA_PROTECT:
- if (sshdr.asc == 0x27 && sshdr.ascq == 0x07) {
+ if (sshdr.sense_code == SPACE_ALLOCATION_FAILED_WRITE_PROTECT) {
/* Thin provisioning hard threshold reached */
set_scsi_ml_byte(scmd, SCSIML_STAT_NOSPC);
return SUCCESS;
@@ -726,11 +738,14 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
return SUCCESS;
case MEDIUM_ERROR:
- if (sshdr.asc == 0x11 || /* UNRECOVERED READ ERR */
- sshdr.asc == 0x13 || /* AMNF DATA FIELD */
- sshdr.asc == 0x14) { /* RECORD NOT FOUND */
+ switch (scsi_sense_asc(&sshdr)) {
+ case ASC_UNRECOVERED_READ_ERROR:
+ case ASC_ADDRESS_MARK_NOT_FOUND_FOR_DATA_FIELD:
+ case ASC_RECORDED_ENTITY_NOT_FOUND:
set_scsi_ml_byte(scmd, SCSIML_STAT_MED_ERROR);
return SUCCESS;
+ default:
+ break;
}
return NEEDS_RETRY;
@@ -742,13 +757,17 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
fallthrough;
case ILLEGAL_REQUEST:
- if (sshdr.asc == 0x20 || /* Invalid command operation code */
- sshdr.asc == 0x21 || /* Logical block address out of range */
- sshdr.asc == 0x22 || /* Invalid function */
- sshdr.asc == 0x24 || /* Invalid field in cdb */
- sshdr.asc == 0x26 || /* Parameter value invalid */
- sshdr.asc == 0x27) { /* Write protected */
+ switch (scsi_sense_asc(&sshdr)) {
+ case ASC_INVALID_COMMAND_OP_CODE:
+ case ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE:
+ case ASC_ILLEGAL_FUNCTION:
+ case ASC_INVALID_FIELD_IN_CDB:
+ case ASC_INVALID_FIELD_IN_PARAMETER_LIST:
+ case ASC_WRITE_PROTECTED:
set_scsi_ml_byte(scmd, SCSIML_STAT_TGT_FAILURE);
+ break;
+ default:
+ break;
}
return SUCCESS;
@@ -760,7 +779,7 @@ enum scsi_disposition scsi_check_sense(struct scsi_cmnd *scmd)
* that the command was in fact aborted because it exceeded its
* duration limit. Never retry these commands.
*/
- if (sshdr.asc == 0x55 && sshdr.ascq == 0x0a) {
+ if (sshdr.sense_code == DATA_CURRENTLY_UNAVAILABLE) {
set_scsi_ml_byte(scmd, SCSIML_STAT_DL_TIMEOUT);
req->cmd_flags |= REQ_FAILFAST_DEV;
req->rq_flags |= RQF_QUIET;
@@ -940,9 +959,9 @@ static enum scsi_disposition scsi_try_host_reset(struct scsi_cmnd *scmd)
if (rtn == SUCCESS) {
if (!hostt->skip_settle_delay)
ssleep(HOST_RESET_SETTLE_TIME);
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
scsi_report_bus_reset(host, scmd_channel(scmd));
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
}
return rtn;
@@ -970,9 +989,9 @@ static enum scsi_disposition scsi_try_bus_reset(struct scsi_cmnd *scmd)
if (rtn == SUCCESS) {
if (!hostt->skip_settle_delay)
ssleep(BUS_RESET_SETTLE_TIME);
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
scsi_report_bus_reset(host, scmd_channel(scmd));
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
}
return rtn;
@@ -1006,10 +1025,10 @@ static enum scsi_disposition scsi_try_target_reset(struct scsi_cmnd *scmd)
rtn = hostt->eh_target_reset_handler(scmd);
if (rtn == SUCCESS) {
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
__starget_for_each_device(scsi_target(scmd->device), NULL,
__scsi_report_device_reset);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
}
return rtn;
@@ -2215,11 +2234,11 @@ static void scsi_restart_operations(struct Scsi_Host *shost)
SCSI_LOG_ERROR_RECOVERY(3,
shost_printk(KERN_INFO, shost, "waking up host to restart\n"));
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_set_state(shost, SHOST_RUNNING))
if (scsi_host_set_state(shost, SHOST_CANCEL))
BUG_ON(scsi_host_set_state(shost, SHOST_DEL));
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
wake_up(&shost->host_wait);
@@ -2239,11 +2258,11 @@ static void scsi_restart_operations(struct Scsi_Host *shost)
* recovery or scsi_device_unbusy() will wake us again when these
* pending commands complete.
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (shost->host_eh_scheduled)
if (scsi_host_set_state(shost, SHOST_RECOVERY))
WARN_ON(scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY));
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -2335,19 +2354,19 @@ static void scsi_unjam_host(struct Scsi_Host *shost)
LIST_HEAD(eh_work_q);
LIST_HEAD(eh_done_q);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_splice_init(&shost->eh_cmd_q, &eh_work_q);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
SCSI_LOG_ERROR_RECOVERY(1, scsi_eh_prt_fail_stats(shost, &eh_work_q));
if (!scsi_eh_get_sense(&eh_work_q, &eh_done_q))
scsi_eh_ready_devs(shost, &eh_work_q, &eh_done_q);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (shost->eh_deadline != -1)
shost->last_reset = 0;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_eh_flush_done_q(&eh_done_q);
}
@@ -2551,9 +2570,9 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg)
scmd->sc_data_direction = DMA_BIDIRECTIONAL;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
shost->tmf_in_progress = 1;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
switch (val & ~SG_SCSI_RESET_NO_ESCALATE) {
case SG_SCSI_RESET_NOTHING:
@@ -2586,9 +2605,9 @@ scsi_ioctl_reset(struct scsi_device *dev, int __user *arg)
error = (rtn == SUCCESS) ? 0 : -EIO;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
shost->tmf_in_progress = 0;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* be sure to wake up anyone who was sleeping or had their queue
diff --git a/drivers/scsi/scsi_ioctl.c b/drivers/scsi/scsi_ioctl.c
index c14f81403a09..122403ec3ab8 100644
--- a/drivers/scsi/scsi_ioctl.c
+++ b/drivers/scsi/scsi_ioctl.c
@@ -96,7 +96,8 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
"ioctl_internal_command: "
"ILLEGAL REQUEST "
"asc=0x%x ascq=0x%x\n",
- sshdr.asc, sshdr.ascq);
+ scsi_sense_asc(&sshdr),
+ scsi_sense_ascq(&sshdr));
break;
case NOT_READY: /* This happens if there is no disc in drive */
if (sdev->removable)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index af27fd3df8d4..f695a6605815 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -243,23 +243,23 @@ static int scsi_check_passthrough(struct scsi_cmnd *scmd,
continue;
if (status_byte(failure->result) != SAM_STAT_CHECK_CONDITION ||
- failure->sense == SCMD_FAILURE_SENSE_ANY)
+ failure->sense_key == SCMD_FAILURE_SENSE_KEY_ANY)
goto maybe_retry;
if (!scsi_command_normalize_sense(scmd, &sshdr))
return 0;
- if (failure->sense != sshdr.sense_key)
+ if (failure->sense_key != sshdr.sense_key)
continue;
- if (failure->asc == SCMD_FAILURE_ASC_ANY)
+ if (scsi_failure_asc(failure) == SCMD_FAILURE_ASC_ANY)
goto maybe_retry;
- if (failure->asc != sshdr.asc)
+ if (scsi_failure_asc(failure) != scsi_sense_asc(&sshdr))
continue;
- if (failure->ascq == SCMD_FAILURE_ASCQ_ANY ||
- failure->ascq == sshdr.ascq)
+ if (scsi_failure_ascq(failure) == SCMD_FAILURE_ASCQ_ANY ||
+ scsi_failure_ascq(failure) == scsi_sense_ascq(&sshdr))
goto maybe_retry;
}
@@ -388,10 +388,10 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
unsigned int busy = scsi_host_busy(shost);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (shost->host_failed || shost->host_eh_scheduled)
scsi_eh_wakeup(shost, busy);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
rcu_read_unlock();
}
@@ -436,9 +436,9 @@ static void scsi_single_lun_run(struct scsi_device *current_sdev)
struct scsi_target *starget = scsi_target(current_sdev);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
starget->starget_sdev_user = NULL;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* Call blk_run_queue for all LUNs on the target, starting with
@@ -449,11 +449,11 @@ static void scsi_single_lun_run(struct scsi_device *current_sdev)
blk_mq_run_hw_queues(current_sdev->request_queue,
shost->queuecommand_may_block);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (!starget->starget_sdev_user)
__starget_for_each_device(starget, current_sdev,
scsi_kick_sdev_queue);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
static inline bool scsi_device_is_busy(struct scsi_device *sdev)
@@ -491,7 +491,7 @@ static void scsi_starved_list_run(struct Scsi_Host *shost)
struct scsi_device *sdev;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_splice_init(&shost->starved_list, &starved_list);
while (!list_empty(&starved_list)) {
@@ -532,16 +532,16 @@ static void scsi_starved_list_run(struct Scsi_Host *shost)
slq = sdev->request_queue;
if (!blk_get_queue(slq))
continue;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
blk_mq_run_hw_queues(slq, false);
blk_put_queue(slq);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
}
/* put any unprocessed entries back */
list_splice(&starved_list, &shost->starved_list);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -578,7 +578,7 @@ void scsi_run_host_queues(struct Scsi_Host *shost)
struct scsi_device *sdev, *prev = NULL;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
__shost_for_each_device(sdev, shost) {
/*
* Only skip devices so deep into removal they will never need
@@ -589,7 +589,7 @@ void scsi_run_host_queues(struct Scsi_Host *shost)
if (sdev->sdev_state == SDEV_DEL ||
!get_device(&sdev->sdev_gendev))
continue;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (prev)
put_device(&prev->sdev_gendev);
@@ -597,9 +597,9 @@ void scsi_run_host_queues(struct Scsi_Host *shost)
prev = sdev;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (prev)
put_device(&prev->sdev_gendev);
}
@@ -839,6 +839,8 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
*/
action = ACTION_RETRY;
} else if (sense_valid && sense_current) {
+ u8 asc = scsi_sense_asc(&sshdr);
+
switch (sshdr.sense_key) {
case UNIT_ATTENTION:
if (cmd->device->removable) {
@@ -865,64 +867,72 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
* where READ CAPACITY failed, we may have
* read past the end of the disk.
*/
- if ((cmd->device->use_10_for_rw &&
- sshdr.asc == 0x20 && sshdr.ascq == 0x00) &&
+ if (cmd->device->use_10_for_rw &&
+ sshdr.sense_code == INVALID_COMMAND_OP_CODE &&
(cmd->cmnd[0] == READ_10 ||
cmd->cmnd[0] == WRITE_10)) {
/* This will issue a new 6-byte command. */
cmd->device->use_10_for_rw = 0;
action = ACTION_REPREP;
- } else if (sshdr.asc == 0x10) /* DIX */ {
+ break;
+ }
+ if (asc == ASC_ID_CRC_OR_ECC_ERROR) {
+ /* DIX */
action = ACTION_FAIL;
blk_stat = BLK_STS_PROTECTION;
- /* INVALID COMMAND OPCODE or INVALID FIELD IN CDB */
- } else if (sshdr.asc == 0x20 || sshdr.asc == 0x24) {
+ break;
+ }
+ if (asc == ASC_INVALID_COMMAND_OP_CODE ||
+ asc == ASC_INVALID_FIELD_IN_CDB) {
action = ACTION_FAIL;
blk_stat = BLK_STS_TARGET;
- } else
- action = ACTION_FAIL;
+ break;
+ }
+ action = ACTION_FAIL;
break;
case ABORTED_COMMAND:
action = ACTION_FAIL;
- if (sshdr.asc == 0x10) /* DIF */
+ if (asc == ASC_ID_CRC_OR_ECC_ERROR) /* DIF */
blk_stat = BLK_STS_PROTECTION;
break;
case NOT_READY:
/* If the device is in the process of becoming
* ready, or has a temporary blockage, retry.
*/
- if (sshdr.asc == 0x04) {
- switch (sshdr.ascq) {
- case 0x01: /* becoming ready */
- case 0x04: /* format in progress */
- case 0x05: /* rebuild in progress */
- case 0x06: /* recalculation in progress */
- case 0x07: /* operation in progress */
- case 0x08: /* Long write in progress */
- case 0x09: /* self test in progress */
- case 0x11: /* notify (enable spinup) required */
- case 0x14: /* space allocation in progress */
- case 0x1a: /* start stop unit in progress */
- case 0x1b: /* sanitize in progress */
- case 0x1d: /* configuration in progress */
- action = ACTION_DELAYED_RETRY;
- break;
- case 0x0a: /* ALUA state transition */
- action = ACTION_DELAYED_REPREP;
- break;
- /*
- * Depopulation might take many hours,
- * thus it is not worthwhile to retry.
- */
- case 0x24: /* depopulation in progress */
- case 0x25: /* depopulation restore in progress */
- fallthrough;
- default:
- action = ACTION_FAIL;
- break;
- }
- } else
+ if (asc != ASC_LU_NOT_READY) {
action = ACTION_FAIL;
+ break;
+ }
+
+ switch (sshdr.sense_code) {
+ case LU_IS_IN_PROCESS_OF_BECOMING_READY:
+ case LU_NOT_READY_FORMAT_IN_PROGRESS:
+ case LU_NOT_READY_REBUILD_IN_PROGRESS:
+ case LU_NOT_READY_RECALCULATION_IN_PROGRESS:
+ case LU_NOT_READY_OP_IN_PROGRESS:
+ case LU_NOT_READY_LONG_WRITE_IN_PROGRESS:
+ case LU_NOT_READY_SELFTEST_IN_PROGRESS:
+ case LU_NOT_READY_NOTIFY_REQUIRED:
+ case LU_NOT_READY_SPACE_ALLOCATION_IN_PROGRESS:
+ case LU_NOT_READY_START_STOP_UNIT_COMMAND_IN_PROGRESS:
+ case LU_NOT_READY_SANITIZE_IN_PROGRESS:
+ case LU_NOT_READY_CONFIG_IN_PROGRESS:
+ action = ACTION_DELAYED_RETRY;
+ break;
+ case LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION:
+ action = ACTION_DELAYED_REPREP;
+ break;
+ /*
+ * Depopulation might take many hours, thus it is not
+ * worthwhile to retry.
+ */
+ case DEPOPULATION_IN_PROGRESS:
+ case DEPOPULATION_RESTORATION_IN_PROGRESS:
+ fallthrough;
+ default:
+ action = ACTION_FAIL;
+ break;
+ }
break;
case VOLUME_OVERFLOW:
/* See SSC3rXX or current. */
@@ -930,11 +940,14 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
break;
case DATA_PROTECT:
action = ACTION_FAIL;
- if ((sshdr.asc == 0x0C && sshdr.ascq == 0x12) ||
- (sshdr.asc == 0x55 &&
- (sshdr.ascq == 0x0E || sshdr.ascq == 0x0F))) {
- /* Insufficient zone resources */
+ switch (sshdr.sense_code) {
+ case WRITE_ERROR_INSUFFICIENT_ZONE_RESOURCES:
+ case INSUFFICIENT_ZONE_RESOURCES:
+ case INSUFFICIENT_ZONE_RESOURCES_TO_COMPLETE_WRITE:
blk_stat = BLK_STS_ZONE_OPEN_RESOURCE;
+ break;
+ default:
+ break;
}
break;
case COMPLETED:
@@ -1041,7 +1054,7 @@ static int scsi_io_completion_nz_result(struct scsi_cmnd *cmd, int result,
* skip print since caller wants ATA registers. Only occurs
* on SCSI ATA PASS_THROUGH commands when CK_COND=1
*/
- if ((sshdr.asc == 0x0) && (sshdr.ascq == 0x1d))
+ if (sshdr.sense_code == ATA_PASS_THROUGH_INFORMATION_AVAILABLE)
do_print = false;
else if (req->rq_flags & RQF_QUIET)
do_print = false;
@@ -1309,7 +1322,6 @@ void scsi_init_command(struct scsi_device *dev, struct scsi_cmnd *cmd)
}
cmd->device = dev;
- INIT_LIST_HEAD(&cmd->eh_entry);
INIT_DELAYED_WORK(&cmd->abort_work, scmd_eh_abort_handler);
}
@@ -1433,14 +1445,14 @@ static inline int scsi_target_queue_ready(struct Scsi_Host *shost,
unsigned int busy;
if (starget->single_lun) {
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (starget->starget_sdev_user &&
starget->starget_sdev_user != sdev) {
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
return 0;
}
starget->starget_sdev_user = sdev;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
if (starget->can_queue <= 0)
@@ -1467,9 +1479,9 @@ static inline int scsi_target_queue_ready(struct Scsi_Host *shost,
return 1;
starved:
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
list_move_tail(&sdev->starved_entry, &shost->starved_list);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
out_dec:
if (starget->can_queue > 0)
atomic_dec(&starget->target_busy);
@@ -1506,10 +1518,10 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
/* We're OK to process the command, so we can't be starved */
if (!list_empty(&sdev->starved_entry)) {
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (!list_empty(&sdev->starved_entry))
list_del_init(&sdev->starved_entry);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
__set_bit(SCMD_STATE_INFLIGHT, &cmd->state);
@@ -1517,10 +1529,10 @@ static inline int scsi_host_queue_ready(struct request_queue *q,
return 1;
starved:
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (list_empty(&sdev->starved_entry))
list_add_tail(&sdev->starved_entry, &shost->starved_list);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
out_dec:
scsi_dec_host_busy(shost, cmd);
return 0;
@@ -1577,8 +1589,6 @@ static void scsi_complete(struct request *rq)
return;
}
- INIT_LIST_HEAD(&cmd->eh_entry);
-
atomic_inc(&cmd->device->iodone_cnt);
if (cmd->result)
atomic_inc(&cmd->device->ioerr_cnt);
@@ -2372,9 +2382,8 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, int subpage,
struct scsi_sense_hdr my_sshdr;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = retries,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -2432,8 +2441,8 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage, int subpage,
if (!scsi_status_is_good(result)) {
if (scsi_sense_valid(sshdr)) {
- if ((sshdr->sense_key == ILLEGAL_REQUEST) &&
- (sshdr->asc == 0x20) && (sshdr->ascq == 0)) {
+ if (sshdr->sense_key == ILLEGAL_REQUEST &&
+ sshdr->sense_code == INVALID_COMMAND_OP_CODE) {
/*
* Invalid command operation code: retry using
* MODE SENSE(6) if this was a MODE SENSE(10)
@@ -3573,21 +3582,20 @@ int scsi_vpd_tpg_id(struct scsi_device *sdev, int *rel_id)
EXPORT_SYMBOL(scsi_vpd_tpg_id);
/**
- * scsi_build_sense - build sense data for a command
+ * scsi_set_sense - build sense data for a command
* @scmd: scsi command for which the sense should be formatted
* @desc: Sense format (non-zero == descriptor format,
* 0 == fixed format)
* @key: Sense key
- * @asc: Additional sense code
- * @ascq: Additional sense code qualifier
+ * @code: Additional sense code and sense code qualifier
*
**/
-void scsi_build_sense(struct scsi_cmnd *scmd, int desc, u8 key, u8 asc, u8 ascq)
+void scsi_set_sense(struct scsi_cmnd *scmd, int desc, u8 key, u16 code)
{
- scsi_build_sense_buffer(desc, scmd->sense_buffer, key, asc, ascq);
+ scsi_set_sense_buffer(desc, scmd->sense_buffer, key, code);
scmd->result = SAM_STAT_CHECK_CONDITION;
}
-EXPORT_SYMBOL_GPL(scsi_build_sense);
+EXPORT_SYMBOL_GPL(scsi_set_sense);
#ifdef CONFIG_SCSI_LIB_KUNIT_TEST
#include "scsi_lib_test.c"
diff --git a/drivers/scsi/scsi_lib_test.c b/drivers/scsi/scsi_lib_test.c
index ae8af0e0047a..dfd8eefe57e1 100644
--- a/drivers/scsi/scsi_lib_test.c
+++ b/drivers/scsi/scsi_lib_test.c
@@ -17,42 +17,43 @@ static void scsi_lib_test_multiple_sense(struct kunit *test)
{
struct scsi_failure multiple_sense_failure_defs[] = {
{
- .sense = DATA_PROTECT,
- .asc = 0x1,
- .ascq = 0x1,
+ .sense_key = DATA_PROTECT,
+ .sense_code =
+ scsi_sense_code(ASC_NO_INDEX_SECTOR_SIGNAL,
+ 0x1),
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = UNIT_ATTENTION,
- .asc = 0x11,
- .ascq = 0x0,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = UNRECOVERED_READ_ERROR,
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = NOT_READY,
- .asc = 0x11,
- .ascq = 0x22,
+ .sense_key = NOT_READY,
+ .sense_code =
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR,
+ 0x22),
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = ABORTED_COMMAND,
- .asc = 0x11,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = ABORTED_COMMAND,
+ .sense_code =
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR,
+ SCMD_FAILURE_ASCQ_ANY),
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = HARDWARE_ERROR,
- .asc = SCMD_FAILURE_ASC_ANY,
+ .sense_key = HARDWARE_ERROR,
+ .sense_code = scsi_sense_code(SCMD_FAILURE_ASC_ANY, 0),
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = ILLEGAL_REQUEST,
- .asc = 0x91,
- .ascq = 0x36,
+ .sense_key = ILLEGAL_REQUEST,
+ .sense_code = scsi_sense_code(0x91, 0x36),
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -72,32 +73,36 @@ static void scsi_lib_test_multiple_sense(struct kunit *test)
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, NULL));
/* Command failed but caller did not pass in a failures array */
- scsi_build_sense(&sc, 0, ILLEGAL_REQUEST, 0x91, 0x36);
+ scsi_set_sense(&sc, 0, ILLEGAL_REQUEST, scsi_sense_code(0x91, 0x36));
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, NULL));
/* Match end of array */
- scsi_build_sense(&sc, 0, ILLEGAL_REQUEST, 0x91, 0x36);
+ scsi_set_sense(&sc, 0, ILLEGAL_REQUEST, scsi_sense_code(0x91, 0x36));
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
/* Basic match in array */
- scsi_build_sense(&sc, 0, UNIT_ATTENTION, 0x11, 0x0);
+ scsi_set_sense(&sc, 0, UNIT_ATTENTION, UNRECOVERED_READ_ERROR);
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
/* No matching sense entry */
- scsi_build_sense(&sc, 0, MISCOMPARE, 0x11, 0x11);
+ scsi_set_sense(&sc, 0, MISCOMPARE, READ_ERROR_LOSS_OF_STREAMING);
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
/* Match using SCMD_FAILURE_ASCQ_ANY */
- scsi_build_sense(&sc, 0, ABORTED_COMMAND, 0x11, 0x22);
+ scsi_set_sense(&sc, 0, ABORTED_COMMAND,
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR, 0x22));
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
/* Fail to match */
- scsi_build_sense(&sc, 0, ABORTED_COMMAND, 0x22, 0x22);
+ scsi_set_sense(&sc, 0, ABORTED_COMMAND,
+ scsi_sense_code(ASC_ILLEGAL_FUNCTION, 0x22));
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
/* Match using SCMD_FAILURE_ASC_ANY */
- scsi_build_sense(&sc, 0, HARDWARE_ERROR, 0x11, 0x22);
+ scsi_set_sense(&sc, 0, HARDWARE_ERROR,
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR, 0x22));
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
/* No matching status entry */
sc.result = SAM_STAT_RESERVATION_CONFLICT;
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
/* Test hitting allowed limit */
- scsi_build_sense(&sc, 0, NOT_READY, 0x11, 0x22);
+ scsi_set_sense(&sc, 0, NOT_READY,
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR, 0x22));
for (i = 0; i < SCSI_LIB_TEST_MAX_ALLOWED; i++)
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc,
&failures));
@@ -108,7 +113,8 @@ static void scsi_lib_test_multiple_sense(struct kunit *test)
scsi_failures_reset_retries(&failures);
/* Test no retries allowed */
- scsi_build_sense(&sc, 0, DATA_PROTECT, 0x1, 0x1);
+ scsi_set_sense(&sc, 0, DATA_PROTECT,
+ scsi_sense_code(ASC_NO_INDEX_SECTOR_SIGNAL, 0x1));
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
}
@@ -116,8 +122,9 @@ static void scsi_lib_test_any_sense(struct kunit *test)
{
struct scsi_failure any_sense_failure_defs[] = {
{
- .result = SCMD_FAILURE_SENSE_ANY,
+ .sense_key = SCMD_FAILURE_SENSE_KEY_ANY,
.allowed = SCSI_LIB_TEST_MAX_ALLOWED,
+ .result = SAM_STAT_CHECK_CONDITION,
},
{}
};
@@ -129,9 +136,10 @@ static void scsi_lib_test_any_sense(struct kunit *test)
.sense_buffer = sense,
};
- /* Match using SCMD_FAILURE_SENSE_ANY */
+ /* Match using SCMD_FAILURE_SENSE_KEY_ANY */
failures.failure_definitions = any_sense_failure_defs;
- scsi_build_sense(&sc, 0, MEDIUM_ERROR, 0x11, 0x22);
+ scsi_set_sense(&sc, 0, MEDIUM_ERROR,
+ scsi_sense_code(ASC_UNRECOVERED_READ_ERROR, 0x22));
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
}
@@ -215,14 +223,13 @@ static void scsi_lib_test_total_allowed(struct kunit *test)
{
struct scsi_failure total_allowed_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Fail all CCs except the UA above */
{
- .sense = SCMD_FAILURE_SENSE_ANY,
+ .sense_key = SCMD_FAILURE_SENSE_KEY_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Retry any other errors not listed above */
@@ -245,7 +252,8 @@ static void scsi_lib_test_total_allowed(struct kunit *test)
scsi_failures_reset_retries(&failures);
failures.total_allowed = SCSI_LIB_TEST_TOTAL_MAX_ALLOWED;
- scsi_build_sense(&sc, 0, UNIT_ATTENTION, 0x28, 0x0);
+ scsi_set_sense(&sc, 0, UNIT_ATTENTION,
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED);
for (i = 0; i < SCSI_LIB_TEST_TOTAL_MAX_ALLOWED; i++)
/* Retry since we under the total_allowed limit */
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc,
@@ -259,13 +267,15 @@ static void scsi_lib_test_mixed_total(struct kunit *test)
{
struct scsi_failure mixed_total_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = 0x28,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code =
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code =
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
@@ -291,7 +301,8 @@ static void scsi_lib_test_mixed_total(struct kunit *test)
scsi_failures_reset_retries(&failures);
failures.total_allowed = SCSI_LIB_TEST_TOTAL_MAX_ALLOWED;
- scsi_build_sense(&sc, 0, UNIT_ATTENTION, 0x28, 0x0);
+ scsi_set_sense(&sc, 0, UNIT_ATTENTION,
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED);
for (i = 0; i < SCSI_LIB_TEST_TOTAL_MAX_ALLOWED; i++)
/* Retry since we under the total_allowed limit */
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc,
@@ -300,7 +311,8 @@ static void scsi_lib_test_mixed_total(struct kunit *test)
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
scsi_failures_reset_retries(&failures);
- scsi_build_sense(&sc, 0, UNIT_ATTENTION, 0x28, 0x0);
+ scsi_set_sense(&sc, 0, UNIT_ATTENTION,
+ NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED);
for (i = 0; i < SCSI_LIB_TEST_TOTAL_MAX_ALLOWED; i++)
/* Retry since we under the total_allowed limit */
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc,
@@ -308,7 +320,8 @@ static void scsi_lib_test_mixed_total(struct kunit *test)
sc.result = DID_TIME_OUT << 16;
/* Retry because this failure has a per failure limit */
KUNIT_EXPECT_EQ(test, -EAGAIN, scsi_check_passthrough(&sc, &failures));
- scsi_build_sense(&sc, 0, UNIT_ATTENTION, 0x29, 0x0);
+ scsi_set_sense(&sc, 0, UNIT_ATTENTION,
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED);
/* total_allowed is now hit so no more retries */
KUNIT_EXPECT_EQ(test, 0, scsi_check_passthrough(&sc, &failures));
}
diff --git a/drivers/scsi/scsi_logging.c b/drivers/scsi/scsi_logging.c
index 3cd0d3074085..0a9a2f7c1966 100644
--- a/drivers/scsi/scsi_logging.c
+++ b/drivers/scsi/scsi_logging.c
@@ -238,29 +238,32 @@ EXPORT_SYMBOL(scsi_print_command);
static size_t
scsi_format_extd_sense(char *buffer, size_t buf_len,
- unsigned char asc, unsigned char ascq)
+ const struct scsi_sense_hdr *sshdr)
{
size_t off = 0;
const char *extd_sense_fmt = NULL;
- const char *extd_sense_str = scsi_extd_sense_format(asc, ascq,
- &extd_sense_fmt);
+ const char *extd_sense_str =
+ scsi_extd_sense_format(sshdr, &extd_sense_fmt);
if (extd_sense_str) {
off = scnprintf(buffer, buf_len, "Add. Sense: %s",
extd_sense_str);
if (extd_sense_fmt)
off += scnprintf(buffer + off, buf_len - off,
- "(%s%x)", extd_sense_fmt, ascq);
+ "(%s%x)", extd_sense_fmt,
+ scsi_sense_ascq(sshdr));
} else {
- if (asc >= 0x80)
+ if (scsi_sense_asc(sshdr) >= 0x80)
off = scnprintf(buffer, buf_len, "<<vendor>>");
off += scnprintf(buffer + off, buf_len - off,
- "ASC=0x%x ", asc);
- if (ascq >= 0x80)
+ "ASC=0x%x ",
+ scsi_sense_asc(sshdr));
+ if (scsi_sense_ascq(sshdr) >= 0x80)
off += scnprintf(buffer + off, buf_len - off,
"<<vendor>>");
off += scnprintf(buffer + off, buf_len - off,
- "ASCQ=0x%x ", ascq);
+ "ASCQ=0x%x ",
+ scsi_sense_ascq(sshdr));
}
return off;
}
@@ -333,8 +336,7 @@ scsi_log_print_sense_hdr(const struct scsi_device *sdev, const char *name,
if (!logbuf)
return;
off = sdev_format_header(logbuf, logbuf_len, name, tag);
- off += scsi_format_extd_sense(logbuf + off, logbuf_len - off,
- sshdr->asc, sshdr->ascq);
+ off += scsi_format_extd_sense(logbuf + off, logbuf_len - off, sshdr);
dev_printk(KERN_INFO, &sdev->sdev_gendev, "%s", logbuf);
scsi_log_release_buffer(logbuf);
}
diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c
index 1799dcae775c..fdc355d783da 100644
--- a/drivers/scsi/scsi_proc.c
+++ b/drivers/scsi/scsi_proc.c
@@ -28,6 +28,7 @@
#include <linux/mutex.h>
#include <linux/gfp.h>
#include <linux/uaccess.h>
+#include <linux/slab.h>
#include <scsi/scsi.h>
#include <scsi/scsi_device.h>
@@ -74,7 +75,7 @@ static ssize_t proc_scsi_host_write(struct file *file, const char __user *buf,
if (!shost->hostt->write_info)
return -EINVAL;
- page = (char *)__get_free_page(GFP_KERNEL);
+ page = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (page) {
ret = -EFAULT;
if (copy_from_user(page, buf, count))
@@ -82,7 +83,7 @@ static ssize_t proc_scsi_host_write(struct file *file, const char __user *buf,
ret = shost->hostt->write_info(shost, page, count);
}
out:
- free_page((unsigned long)page);
+ kfree(page);
return ret;
}
@@ -412,7 +413,7 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf,
if (!buf || length > PAGE_SIZE)
return -EINVAL;
- buffer = (char *)__get_free_page(GFP_KERNEL);
+ buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
@@ -467,7 +468,7 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf,
err = length;
out:
- free_page((unsigned long)buffer);
+ kfree(buffer);
return err;
}
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index 0f0f243c2561..8aae12fd38f3 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -397,11 +397,11 @@ static void scsi_target_destroy(struct scsi_target *starget)
BUG_ON(starget->state == STARGET_DEL);
starget->state = STARGET_DEL;
transport_destroy_device(dev);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (shost->hostt->target_destroy)
shost->hostt->target_destroy(starget);
list_del_init(&starget->siblings);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
put_device(dev);
}
@@ -524,14 +524,14 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
starget->scsi_level = SCSI_2;
starget->max_target_blocked = SCSI_DEFAULT_TARGET_BLOCKED;
retry:
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
found_target = __scsi_find_target(parent, channel, id);
if (found_target)
goto found;
list_add_tail(&starget->siblings, &shost->__targets);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* allocate and add */
transport_setup_device(dev);
if (shost->hostt->target_alloc) {
@@ -558,7 +558,7 @@ static struct scsi_target *scsi_alloc_target(struct device *parent,
*/
ref_got = kref_get_unless_zero(&found_target->reap_ref);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (ref_got) {
put_device(dev);
return found_target;
@@ -652,19 +652,18 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
int pass, count, result, resid;
struct scsi_failure failure_defs[] = {
/*
- * not-ready to ready transition [asc/ascq=0x28/0x0] or
- * power-on, reset [asc/ascq=0x29/0x0], continue. INQUIRY
- * should not yield UNIT_ATTENTION but many buggy devices do
- * so anyway.
+ * not-ready to ready transition or power-on, reset, continue.
+ * INQUIRY should not yield UNIT_ATTENTION but many buggy
+ * devices do so anyway.
*/
{
- .sense = UNIT_ATTENTION,
- .asc = 0x28,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
@@ -1457,14 +1456,13 @@ static int scsi_report_lun_scan(struct Scsi_Host *shost,
struct scsi_device *sdev;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Fail all CCs except the UA above */
{
- .sense = SCMD_FAILURE_SENSE_ANY,
+ .sense_key = SCMD_FAILURE_SENSE_KEY_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Retry any other errors not listed above */
@@ -2106,16 +2104,16 @@ void scsi_forget_host(struct Scsi_Host *shost)
unsigned long flags;
restart:
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(sdev, &shost->__devices, siblings) {
if (scsi_device_is_pseudo_dev(sdev) ||
sdev->sdev_state == SDEV_DEL)
continue;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
__scsi_remove_device(sdev);
goto restart;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* Remove the pseudo device last since it may be needed during removal
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
index 9480432f650b..fe54792ed69e 100644
--- a/drivers/scsi/scsi_sysfs.c
+++ b/drivers/scsi/scsi_sysfs.c
@@ -214,7 +214,7 @@ store_shost_state(struct device *dev, struct device_attribute *attr,
if (!state)
return -EINVAL;
- scoped_guard(spinlock_irq, shost->host_lock)
+ scoped_guard(spinlock_irq, &shost->host_lock)
if (scsi_host_set_state(shost, state))
return -EINVAL;
return count;
@@ -352,7 +352,7 @@ store_shost_eh_deadline(struct device *dev, struct device_attribute *attr,
return -EINVAL;
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsi_host_in_recovery(shost))
ret = -EBUSY;
else {
@@ -363,7 +363,7 @@ store_shost_eh_deadline(struct device *dev, struct device_attribute *attr,
ret = count;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return ret;
}
@@ -459,11 +459,11 @@ static void scsi_device_dev_release(struct device *dev)
parent = sdev->sdev_gendev.parent;
- spin_lock_irqsave(sdev->host->host_lock, flags);
+ spin_lock_irqsave(&sdev->host->host_lock, flags);
list_del(&sdev->siblings);
list_del(&sdev->same_target_siblings);
list_del(&sdev->starved_entry);
- spin_unlock_irqrestore(sdev->host->host_lock, flags);
+ spin_unlock_irqrestore(&sdev->host->host_lock, flags);
cancel_work_sync(&sdev->event_work);
@@ -1547,7 +1547,7 @@ static void __scsi_remove_target(struct scsi_target *starget)
unsigned long flags;
struct scsi_device *sdev;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
restart:
list_for_each_entry(sdev, &shost->__devices, siblings) {
/*
@@ -1563,13 +1563,13 @@ static void __scsi_remove_target(struct scsi_target *starget)
sdev->sdev_state == SDEV_CANCEL ||
!get_device(&sdev->sdev_gendev))
continue;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_remove_device(sdev);
put_device(&sdev->sdev_gendev);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
goto restart;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -1587,7 +1587,7 @@ void scsi_remove_target(struct device *dev)
unsigned long flags;
restart:
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(starget, &shost->__targets, siblings) {
if (starget->state == STARGET_DEL ||
starget->state == STARGET_REMOVE ||
@@ -1599,13 +1599,13 @@ restart:
starget->state = STARGET_CREATED_REMOVE;
else
starget->state = STARGET_REMOVE;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
__scsi_remove_target(starget);
scsi_target_reap(starget);
goto restart;
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
EXPORT_SYMBOL(scsi_remove_target);
@@ -1710,10 +1710,10 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev)
sdev->lun_in_cdb = 1;
transport_setup_device(&sdev->sdev_gendev);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_add_tail(&sdev->same_target_siblings, &starget->devices);
list_add_tail(&sdev->siblings, &shost->__devices);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* device can now only be removed via __scsi_remove_device() so hold
* the target. Target will be held in CREATED state until something
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c
index 173ed6373f04..bec6ca38375b 100644
--- a/drivers/scsi/scsi_transport_fc.c
+++ b/drivers/scsi/scsi_transport_fc.c
@@ -645,19 +645,19 @@ fc_find_rport_by_wwpn(struct Scsi_Host *shost, u64 wwpn)
struct fc_rport *rport;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(rport, &fc_host_rports(shost), peers) {
if (rport->port_state != FC_PORTSTATE_ONLINE)
continue;
if (rport->port_name == wwpn) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return rport;
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return NULL;
}
EXPORT_SYMBOL(fc_find_rport_by_wwpn);
@@ -1718,13 +1718,13 @@ store_fc_vport_delete(struct device *dev, struct device_attribute *attr,
struct Scsi_Host *shost = vport_to_shost(vport);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return -EBUSY;
}
vport->flags |= FC_VPORT_DELETING;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
fc_queue_work(shost, &vport->vport_delete_work);
return count;
@@ -2052,7 +2052,7 @@ store_fc_private_host_tgtid_bind_type(struct device *dev,
/* if changing bind type, purge all unused consistent bindings */
if (val != fc_host_tgtid_bind_type(shost)) {
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
while (!list_empty(&fc_host_rport_bindings(shost))) {
get_list_head_entry(rport,
&fc_host_rport_bindings(shost), peers);
@@ -2060,7 +2060,7 @@ store_fc_private_host_tgtid_bind_type(struct device *dev,
rport->port_state = FC_PORTSTATE_DELETED;
fc_queue_work(shost, &rport->rport_delete_work);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
fc_host_tgtid_bind_type(shost) = val;
@@ -2107,10 +2107,10 @@ store_fc_private_host_dev_loss_tmo(struct device *dev,
return rc;
fc_host_dev_loss_tmo(shost) = val;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(rport, &fc_host->rports, peers)
fc_rport_set_dev_loss_tmo(rport, val);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return count;
}
@@ -2417,7 +2417,7 @@ store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr,
if (stat)
return stat;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
match = 0;
/* we only allow support on Channel 0 !!! */
list_for_each_entry(vport, &fc_host->vports, peers) {
@@ -2430,7 +2430,7 @@ store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr,
break;
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (!match)
return -ENODEV;
@@ -2590,7 +2590,7 @@ fc_user_scan_tgt(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
struct fc_rport *rport;
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(rport, &fc_host_rports(shost), peers) {
if (rport->scsi_target_id == -1)
@@ -2602,14 +2602,14 @@ fc_user_scan_tgt(struct Scsi_Host *shost, uint channel, uint id, u64 lun)
if ((channel == rport->channel) &&
(id == rport->scsi_target_id)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_scan_target(&rport->dev, channel, id, lun,
SCSI_SCAN_MANUAL);
return;
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/*
@@ -2922,7 +2922,7 @@ fc_remove_host(struct Scsi_Host *shost)
struct fc_host_attrs *fc_host = shost_to_fc_host(shost);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
/* Remove any vports */
list_for_each_entry_safe(vport, next_vport, &fc_host->vports, peers) {
@@ -2945,7 +2945,7 @@ fc_remove_host(struct Scsi_Host *shost)
fc_queue_work(shost, &rport->rport_delete_work);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* flush all scan work items */
scsi_flush_work(shost);
@@ -3021,18 +3021,18 @@ fc_rport_final_delete(struct work_struct *work)
* only when rmmod'ing the LLDD and we're asking for
* immediate termination of the rports
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (rport->flags & FC_RPORT_DEVLOSS_PENDING) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (!cancel_delayed_work(&rport->fail_io_work))
fc_flush_devloss(shost, rport);
if (!cancel_delayed_work(&rport->dev_loss_work))
fc_flush_devloss(shost, rport);
cancel_work_sync(&rport->scan_work);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags &= ~FC_RPORT_DEVLOSS_PENDING;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* Delete SCSI target and sdevs */
if (rport->scsi_target_id != -1)
@@ -3045,13 +3045,13 @@ fc_rport_final_delete(struct work_struct *work)
* Avoid this call if we already called it when we preserved the
* rport for the binding.
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (!(rport->flags & FC_RPORT_DEVLOSS_CALLBK_DONE) &&
(i->f->dev_loss_tmo_callbk)) {
rport->flags |= FC_RPORT_DEVLOSS_CALLBK_DONE;
do_callback = 1;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (do_callback)
i->f->dev_loss_tmo_callbk(rport);
@@ -3123,7 +3123,7 @@ fc_remote_port_create(struct Scsi_Host *shost, int channel,
INIT_WORK(&rport->stgt_delete_work, fc_starget_delete);
INIT_WORK(&rport->rport_delete_work, fc_rport_final_delete);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->number = fc_host->next_rport_number++;
if ((rport->roles & FC_PORT_ROLE_FCP_TARGET) ||
@@ -3134,7 +3134,7 @@ fc_remote_port_create(struct Scsi_Host *shost, int channel,
list_add_tail(&rport->peers, &fc_host->rports);
scsi_host_get(shost); /* for fc_host->rport list */
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
rport->devloss_work_q = alloc_workqueue("fc_dl_%d_%d", WQ_PERCPU, 0,
shost->host_no, rport->number);
@@ -3144,10 +3144,10 @@ fc_remote_port_create(struct Scsi_Host *shost, int channel,
* Note that we have not yet called device_initialize() / get_device()
* Cannot reclaim incremented rport->number because we released host_lock
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_del(&rport->peers);
scsi_host_put(shost); /* for fc_host->rport list */
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
kfree(rport);
return NULL;
}
@@ -3181,10 +3181,10 @@ fc_remote_port_create(struct Scsi_Host *shost, int channel,
delete_rport:
transport_destroy_device(dev);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_del(&rport->peers);
scsi_host_put(shost); /* for fc_host->rport list */
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
put_device(dev->parent);
kfree(rport);
return NULL;
@@ -3246,7 +3246,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
* deleted, but we've held off the real delete while the target
* is in a "blocked" state.
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_for_each_entry(rport, &fc_host->rports, peers) {
@@ -3281,7 +3281,7 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
rport->port_state = FC_PORTSTATE_ONLINE;
rport->roles = ids->roles;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (fci->f->dd_fcrport_size)
memset(rport->dd_data, 0,
@@ -3318,24 +3318,24 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
if (!cancel_delayed_work(&rport->dev_loss_work))
fc_flush_devloss(shost, rport);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags &= ~(FC_RPORT_FAST_FAIL_TIMEDOUT |
FC_RPORT_DEVLOSS_PENDING |
FC_RPORT_DEVLOSS_CALLBK_DONE);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* if target, initiate a scan */
if (rport->scsi_target_id != -1) {
scsi_target_unblock(&rport->dev,
SDEV_RUNNING);
- spin_lock_irqsave(shost->host_lock,
+ spin_lock_irqsave(&shost->host_lock,
flags);
rport->flags |= FC_RPORT_SCAN_PENDING;
scsi_queue_work(shost,
&rport->scan_work);
- spin_unlock_irqrestore(shost->host_lock,
+ spin_unlock_irqrestore(&shost->host_lock,
flags);
}
@@ -3394,14 +3394,14 @@ fc_remote_port_add(struct Scsi_Host *shost, int channel,
if (fci->f->dd_fcrport_size)
memset(rport->dd_data, 0,
fci->f->dd_fcrport_size);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
fc_remote_port_rolechg(rport, ids->roles);
return rport;
}
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* No consistent binding found - create new remote port entry */
rport = fc_remote_port_create(shost, channel, ids);
@@ -3478,11 +3478,11 @@ fc_remote_port_delete(struct fc_rport *rport)
* there's still a scan pending.
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if ((rport->port_state != FC_PORTSTATE_ONLINE) &&
(rport->port_state != FC_PORTSTATE_MARGINAL)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return;
}
@@ -3503,7 +3503,7 @@ fc_remote_port_delete(struct fc_rport *rport)
rport->flags |= FC_RPORT_DEVLOSS_PENDING;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_block_targets(shost, &rport->dev);
@@ -3547,7 +3547,7 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles)
unsigned long flags;
int create = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (roles & FC_PORT_ROLE_FCP_TARGET) {
if (rport->scsi_target_id == -1) {
rport->scsi_target_id = fc_host->next_target_id++;
@@ -3558,7 +3558,7 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles)
rport->roles = roles;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (create) {
/*
@@ -3578,21 +3578,21 @@ fc_remote_port_rolechg(struct fc_rport *rport, u32 roles)
if (!cancel_delayed_work(&rport->dev_loss_work))
fc_flush_devloss(shost, rport);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags &= ~(FC_RPORT_FAST_FAIL_TIMEDOUT |
FC_RPORT_DEVLOSS_PENDING |
FC_RPORT_DEVLOSS_CALLBK_DONE);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/* ensure any stgt delete functions are done */
fc_flush_work(shost);
scsi_target_unblock(&rport->dev, SDEV_RUNNING);
/* initiate a scan of the target */
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags |= FC_RPORT_SCAN_PENDING;
scsi_queue_work(shost, &rport->scan_work);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
}
EXPORT_SYMBOL(fc_remote_port_rolechg);
@@ -3615,7 +3615,7 @@ fc_timeout_deleted_rport(struct work_struct *work)
unsigned long flags;
int do_callback = 0;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags &= ~FC_RPORT_DEVLOSS_PENDING;
@@ -3631,7 +3631,7 @@ fc_timeout_deleted_rport(struct work_struct *work)
dev_printk(KERN_ERR, &rport->dev,
"blocked FC remote port time out: no longer"
" a FCP target, removing starget\n");
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
scsi_target_unblock(&rport->dev, SDEV_TRANSPORT_OFFLINE);
fc_queue_work(shost, &rport->stgt_delete_work);
return;
@@ -3639,7 +3639,7 @@ fc_timeout_deleted_rport(struct work_struct *work)
/* NOOP state - we're flushing workq's */
if (rport->port_state != FC_PORTSTATE_BLOCKED) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
dev_printk(KERN_ERR, &rport->dev,
"blocked FC remote port time out: leaving"
" rport%s alone\n",
@@ -3656,7 +3656,7 @@ fc_timeout_deleted_rport(struct work_struct *work)
" rport%s\n",
(rport->scsi_target_id != -1) ? " and starget" : "");
fc_queue_work(shost, &rport->rport_delete_work);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return;
}
@@ -3686,10 +3686,10 @@ fc_timeout_deleted_rport(struct work_struct *work)
* item to teardown the starget. (FCOE libFC folks prefer this
* and to have the rport_port_id still set when it's done).
*/
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
fc_terminate_rport_io(rport);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (rport->port_state == FC_PORTSTATE_NOTPRESENT) { /* still missing */
@@ -3722,7 +3722,7 @@ fc_timeout_deleted_rport(struct work_struct *work)
do_callback = 1;
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
/*
* Notify the driver that the rport is now dead. The LLDD will
@@ -3777,9 +3777,9 @@ fc_scsi_scan_rport(struct work_struct *work)
SCSI_SCAN_RESCAN);
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
rport->flags &= ~FC_RPORT_SCAN_PENDING;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
/**
@@ -3801,14 +3801,14 @@ int fc_block_rport(struct fc_rport *rport)
struct Scsi_Host *shost = rport_to_shost(rport);
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
while (rport->port_state == FC_PORTSTATE_BLOCKED &&
!(rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
msleep(1000);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
return FAST_IO_FAIL;
@@ -3916,10 +3916,10 @@ fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
vport->flags = FC_VPORT_CREATING;
INIT_WORK(&vport->vport_delete_work, fc_vport_sched_delete);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (fc_host->npiv_vports_inuse >= fc_host->max_npiv_vports) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
kfree(vport);
return -ENOSPC;
}
@@ -3928,7 +3928,7 @@ fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
list_add_tail(&vport->peers, &fc_host->vports);
scsi_host_get(shost); /* for fc_host->vport list */
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
dev = &vport->dev;
device_initialize(dev); /* takes self reference */
@@ -3965,9 +3965,9 @@ fc_vport_setup(struct Scsi_Host *shost, int channel, struct device *pdev,
"%s, err=%d\n",
__func__, dev_name(dev), error);
}
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
vport->flags &= ~FC_VPORT_CREATING;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
dev_printk(KERN_NOTICE, pdev,
"%s created via shost%d channel %d\n", dev_name(dev),
@@ -3982,11 +3982,11 @@ delete_vport_all:
device_del(dev);
delete_vport:
transport_destroy_device(dev);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
list_del(&vport->peers);
scsi_host_put(shost); /* for fc_host->vport list */
fc_host->npiv_vports_inuse--;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
put_device(dev->parent);
kfree(vport);
@@ -4041,7 +4041,7 @@ fc_vport_terminate(struct fc_vport *vport)
else
stat = -ENOENT;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
vport->flags &= ~FC_VPORT_DELETING;
if (!stat) {
vport->flags |= FC_VPORT_DELETED;
@@ -4049,7 +4049,7 @@ fc_vport_terminate(struct fc_vport *vport)
fc_host->npiv_vports_inuse--;
scsi_host_put(shost); /* for fc_host->vport list */
}
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (stat)
return stat;
@@ -4345,7 +4345,8 @@ fc_bsg_hostadd(struct Scsi_Host *shost, struct fc_host_attrs *fc_host)
scsi_init_limits(shost, &lim);
lim.max_segments = min_not_zero(lim.max_segments, i->f->max_bsg_segments);
q = bsg_setup_queue(dev, bsg_name, &lim, fc_bsg_dispatch,
- fc_bsg_job_timeout, i->f->dd_bsg_size);
+ fc_bsg_job_timeout, i->f->dd_bsg_size,
+ SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q)) {
dev_err(dev,
"fc_host%d: bsg interface failed to initialize - setup queue\n",
@@ -4378,7 +4379,8 @@ fc_bsg_rportadd(struct Scsi_Host *shost, struct fc_rport *rport)
scsi_init_limits(shost, &lim);
lim.max_segments = min_not_zero(lim.max_segments, i->f->max_bsg_segments);
q = bsg_setup_queue(dev, dev_name(dev), &lim, fc_bsg_dispatch_prep,
- fc_bsg_job_timeout, i->f->dd_bsg_size);
+ fc_bsg_job_timeout, i->f->dd_bsg_size,
+ SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q)) {
dev_err(dev, "failed to setup bsg queue\n");
return PTR_ERR(q);
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c
index 8aa76f813bcd..b50ff8a1d0a9 100644
--- a/drivers/scsi/scsi_transport_iscsi.c
+++ b/drivers/scsi/scsi_transport_iscsi.c
@@ -1545,7 +1545,7 @@ iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
scsi_init_limits(shost, &lim);
q = bsg_setup_queue(dev, bsg_name, &lim, iscsi_bsg_host_dispatch, NULL,
- 0);
+ 0, SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q)) {
shost_printk(KERN_ERR, shost, "bsg interface failed to "
"initialize - no request queue\n");
diff --git a/drivers/scsi/scsi_transport_sas.c b/drivers/scsi/scsi_transport_sas.c
index d689b9ed08a6..50ecce7ef9cd 100644
--- a/drivers/scsi/scsi_transport_sas.c
+++ b/drivers/scsi/scsi_transport_sas.c
@@ -199,7 +199,8 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
if (rphy) {
q = bsg_setup_queue(&rphy->dev, dev_name(&rphy->dev), NULL,
- sas_smp_dispatch, NULL, 0);
+ sas_smp_dispatch, NULL, 0,
+ SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q))
return PTR_ERR(q);
rphy->q = q;
@@ -208,7 +209,8 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
snprintf(name, sizeof(name), "sas_host%d", shost->host_no);
q = bsg_setup_queue(&shost->shost_gendev, name, NULL,
- sas_smp_dispatch, NULL, 0);
+ sas_smp_dispatch, NULL, 0,
+ SCSI_SENSE_BUFFERSIZE);
if (IS_ERR(q))
return PTR_ERR(q);
to_sas_host_attrs(shost)->q = q;
@@ -223,8 +225,8 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
/*
* Set shost->opt_sectors from the DMA optimal mapping size, but only
- * when dma_opt_mapping_size() is strictly less than dma_max_mapping_size(),
- * indicating a genuine optimization hint from an IOMMU or DMA backend.
+ * when dma_max_opt_mapping_size() is strictly less than
+ * dma_max_mapping_size(), indicating a genuine optimization hint.
* When the two are equal (e.g. IOMMU disabled / passthrough), no real
* hint exists, so leave opt_sectors at 0 to avoid bogus optimal_io_size
* values that break filesystem geometry (e.g. mkfs.xfs stripe alignment).
@@ -232,16 +234,16 @@ static int sas_bsg_initialize(struct Scsi_Host *shost, struct sas_rphy *rphy)
static void sas_dma_setup_opt_sectors(struct Scsi_Host *shost)
{
struct device *dma_dev = shost->dma_dev;
- size_t opt = dma_opt_mapping_size(dma_dev);
+ size_t max_opt = dma_max_opt_mapping_size(dma_dev);
size_t max = dma_max_mapping_size(dma_dev);
unsigned int opt_sectors;
- /* opt >= max means no real hint was provided by the DMA layer */
- if (opt >= max)
+ /* max_opt >= max means no real hint was provided by the DMA layer */
+ if (max_opt >= max)
return;
/* Clamp to max_sectors to avoid overflow in sector arithmetic */
- opt_sectors = min_t(unsigned int, opt >> SECTOR_SHIFT,
+ opt_sectors = min_t(unsigned int, max_opt >> SECTOR_SHIFT,
shost->max_sectors);
/* Guard against zero before rounddown_pow_of_two() */
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
index 3e3da8c2ff26..bd049d549244 100644
--- a/drivers/scsi/scsi_transport_spi.c
+++ b/drivers/scsi/scsi_transport_spi.c
@@ -112,9 +112,8 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd,
REQ_FAILFAST_DRIVER;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = DV_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -680,10 +679,9 @@ spi_dv_device_echo_buffer(struct scsi_device *sdev, u8 *buffer,
if (result || !scsi_device_online(sdev)) {
scsi_device_set_state(sdev, SDEV_QUIESCE);
- if (result > 0 && scsi_sense_valid(&sshdr)
- && sshdr.sense_key == ILLEGAL_REQUEST
- /* INVALID FIELD IN CDB */
- && sshdr.asc == 0x24 && sshdr.ascq == 0x00)
+ if (result > 0 && scsi_sense_valid(&sshdr) &&
+ sshdr.sense_key == ILLEGAL_REQUEST &&
+ sshdr.sense_code == INVALID_FIELD_IN_CDB)
/* This would mean that the drive lied
* to us about supporting an echo
* buffer (unfortunately some Western
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index a1b21ea14e54..b0d2542fd317 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -1786,8 +1786,7 @@ static int media_not_present(struct scsi_disk *sdkp,
switch (sshdr->sense_key) {
case UNIT_ATTENTION:
case NOT_READY:
- /* medium not present */
- if (sshdr->asc == 0x3A) {
+ if (scsi_sense_asc(sshdr) == ASC_MEDIUM_NOT_PRESENT) {
set_media_not_present(sdkp);
return 1;
}
@@ -1911,12 +1910,14 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
if (scsi_status_is_check_condition(res) &&
scsi_sense_valid(&sshdr)) {
+ u8 asc = scsi_sense_asc(&sshdr);
+
sd_print_sense_hdr(sdkp, &sshdr);
/* we need to evaluate the error return */
- if (sshdr.asc == 0x3a || /* medium not present */
- sshdr.asc == 0x20 || /* invalid command */
- (sshdr.asc == 0x74 && sshdr.ascq == 0x71)) /* drive is password locked */
+ if (asc == ASC_MEDIUM_NOT_PRESENT ||
+ asc == ASC_INVALID_COMMAND_OP_CODE ||
+ sshdr.sense_code == LU_ACCESS_NOT_AUTHORIZED)
/* this is no error here */
return 0;
@@ -1926,8 +1927,8 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
* this is called during shutdown or suspend so just
* return success so those operations can proceed.
*/
- if ((sshdr.asc == 0x04 && sshdr.ascq == 0x04) ||
- sshdr.sense_key == ILLEGAL_REQUEST)
+ if (sshdr.sense_key == ILLEGAL_REQUEST ||
+ sshdr.sense_code == LU_NOT_READY_FORMAT_IN_PROGRESS)
return 0;
}
@@ -2015,7 +2016,9 @@ static int sd_scsi_to_pr_err(struct scsi_sense_hdr *sshdr, int result)
return PR_STS_IOERR;
if (sshdr->sense_key == ILLEGAL_REQUEST &&
- (sshdr->asc == 0x26 || sshdr->asc == 0x24))
+ (scsi_sense_asc(sshdr) ==
+ ASC_INVALID_FIELD_IN_PARAMETER_LIST ||
+ scsi_sense_asc(sshdr) == ASC_INVALID_FIELD_IN_CDB))
return -EINVAL;
fallthrough;
@@ -2033,9 +2036,8 @@ static int sd_pr_in_command(struct block_device *bdev, u8 sa,
u8 cmd[10] = { PERSISTENT_RESERVE_IN, sa };
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 5,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -2145,9 +2147,8 @@ static int sd_pr_out_command(struct block_device *bdev, u8 sa, u64 key,
struct scsi_sense_hdr sshdr;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = 5,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -2440,16 +2441,17 @@ static int sd_done(struct scsi_cmnd *SCpnt)
memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
break;
case ABORTED_COMMAND:
- if (sshdr.asc == 0x10) /* DIF: Target detected corruption */
+ if (scsi_sense_asc(&sshdr) == ASC_ID_CRC_OR_ECC_ERROR) /* DIF */
good_bytes = sd_completed_bytes(SCpnt);
break;
case ILLEGAL_REQUEST:
- switch (sshdr.asc) {
- case 0x10: /* DIX: Host detected corruption */
+ switch (scsi_sense_asc(&sshdr)) {
+ case ASC_ID_CRC_OR_ECC_ERROR:
+ /* DIX */
good_bytes = sd_completed_bytes(SCpnt);
break;
- case 0x20: /* INVALID COMMAND OPCODE */
- case 0x24: /* INVALID FIELD IN CDB */
+ case ASC_INVALID_COMMAND_OP_CODE:
+ case ASC_INVALID_FIELD_IN_CDB:
switch (SCpnt->cmnd[0]) {
case UNMAP:
sd_disable_discard(sdkp);
@@ -2494,15 +2496,15 @@ sd_spinup_disk(struct scsi_disk *sdkp)
struct scsi_failure failure_defs[] = {
/* Do not retry Medium Not Present */
{
- .sense = UNIT_ATTENTION,
- .asc = 0x3A,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code =
+ MEDIUM_NOT_PRESENT | SCMD_FAILURE_ASCQ_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = NOT_READY,
- .asc = 0x3A,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = NOT_READY,
+ .sense_code =
+ MEDIUM_NOT_PRESENT | SCMD_FAILURE_ASCQ_ANY,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Retry when scsi_status_is_good would return false 3 times */
@@ -2566,18 +2568,18 @@ sd_spinup_disk(struct scsi_disk *sdkp)
break;
if (sense_valid && sshdr.sense_key == NOT_READY) {
- if (sshdr.asc == 4 && sshdr.ascq == 3)
- break; /* manual intervention required */
- if (sshdr.asc == 4 && sshdr.ascq == 0xb)
- break; /* standby */
- if (sshdr.asc == 4 && sshdr.ascq == 0xc)
- break; /* unavailable */
- if (sshdr.asc == 4 && sshdr.ascq == 0x1b)
- break; /* sanitize in progress */
- if (sshdr.asc == 4 && sshdr.ascq == 0x24)
- break; /* depopulation in progress */
- if (sshdr.asc == 4 && sshdr.ascq == 0x25)
- break; /* depopulation restoration in progress */
+ switch (sshdr.sense_code) {
+ case LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED:
+ case LU_NOT_ACCESSIBLE_TARGET_PORT_IN_STANDBY_STATE:
+ case LU_NOT_ACCESSIBLE_TARGET_PORT_IN_UNAVAILABLE_STATE:
+ case LU_NOT_READY_SANITIZE_IN_PROGRESS:
+ case DEPOPULATION_IN_PROGRESS:
+ case DEPOPULATION_RESTORATION_IN_PROGRESS:
+ goto out;
+ default:
+ break;
+ }
+
/*
* Issue command to spin up drive when not ready
*/
@@ -2608,8 +2610,9 @@ sd_spinup_disk(struct scsi_disk *sdkp)
* occur here. It's characteristic of these devices.
*/
} else if (sense_valid &&
- sshdr.sense_key == UNIT_ATTENTION &&
- sshdr.asc == 0x28) {
+ sshdr.sense_key == UNIT_ATTENTION &&
+ scsi_sense_asc(&sshdr) ==
+ ASC_NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED) {
if (!spintime) {
spintime_expire = jiffies + 5 * HZ;
spintime = 1;
@@ -2628,6 +2631,7 @@ sd_spinup_disk(struct scsi_disk *sdkp)
} while (spintime && time_before_eq(jiffies, spintime_expire));
+out:
if (spintime) {
if (scsi_status_is_good(the_result))
printk(KERN_CONT "ready\n");
@@ -2753,15 +2757,14 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
sense_valid = scsi_sense_valid(&sshdr);
if (sense_valid &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- (sshdr.asc == 0x20 || sshdr.asc == 0x24) &&
- sshdr.ascq == 0x00)
- /* Invalid Command Operation Code or
- * Invalid Field in CDB, just retry
- * silently with RC10 */
+ (sshdr.sense_code == INVALID_COMMAND_OP_CODE ||
+ sshdr.sense_code == INVALID_FIELD_IN_CDB))
+ /* Just retry silently with RC10 */
return -EINVAL;
if (sense_valid &&
sshdr.sense_key == UNIT_ATTENTION &&
- sshdr.asc == 0x29 && sshdr.ascq == 0x00)
+ sshdr.sense_code ==
+ POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED)
/* Device reset might occur several times,
* give it one more chance */
if (--reset_retries > 0)
@@ -2817,19 +2820,19 @@ static int read_capacity_10(struct scsi_disk *sdkp, struct scsi_device *sdp,
struct scsi_failure failure_defs[] = {
/* Do not retry Medium Not Present */
{
- .sense = UNIT_ATTENTION,
- .asc = 0x3A,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = MEDIUM_NOT_PRESENT,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = NOT_READY,
- .asc = 0x3A,
+ .sense_key = NOT_READY,
+ .sense_code = MEDIUM_NOT_PRESENT,
.result = SAM_STAT_CHECK_CONDITION,
},
/* Device reset might occur several times so retry a lot */
{
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.allowed = READ_CAPACITY_RETRIES_ON_RESET,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -3258,8 +3261,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
bad_sense:
if (res == -EIO && scsi_sense_valid(&sshdr) &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- sshdr.asc == 0x24 && sshdr.ascq == 0x0)
- /* Invalid field in CDB */
+ sshdr.sense_code == INVALID_FIELD_IN_CDB)
sd_first_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
else
sd_first_printk(KERN_ERR, sdkp,
@@ -4159,23 +4161,20 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
struct scsi_failure failure_defs[] = {
{
/* Power on, reset, or bus device reset occurred */
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 0,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
/* Power on occurred */
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 1,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{
/* SCSI bus reset */
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = 2,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = SCSI_BUS_RESET_OCCURRED,
.result = SAM_STAT_CHECK_CONDITION,
},
{}
@@ -4207,8 +4206,7 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
sd_print_result(sdkp, "Start/Stop Unit failed", res);
if (res > 0 && scsi_sense_valid(&sshdr)) {
sd_print_sense_hdr(sdkp, &sshdr);
- /* 0x3a is medium not present */
- if (sshdr.asc == 0x3a)
+ if (scsi_sense_asc(&sshdr) == ASC_MEDIUM_NOT_PRESENT)
res = 0;
}
}
diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c
index 456beaf2e769..8cbf171e6fab 100644
--- a/drivers/scsi/sd_zbc.c
+++ b/drivers/scsi/sd_zbc.c
@@ -369,7 +369,7 @@ unsigned int sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
if (op_is_zone_mgmt(req_op(rq)) &&
result &&
sshdr->sense_key == ILLEGAL_REQUEST &&
- sshdr->asc == 0x24) {
+ scsi_sense_asc(sshdr) == ASC_INVALID_FIELD_IN_CDB) {
/*
* INVALID FIELD IN CDB error: a zone management command was
* attempted on a conventional zone. Nothing to worry about,
diff --git a/drivers/scsi/sense_codes.h b/drivers/scsi/sense_codes.h
index 805d4c13d070..c2eb1a9ec4c0 100644
--- a/drivers/scsi/sense_codes.h
+++ b/drivers/scsi/sense_codes.h
@@ -4,876 +4,1642 @@
* http://www.t10.org/lists/asc-num.txt [most recent: 20200817]
*/
-SENSE_CODE(0x0000, "No additional sense information")
-SENSE_CODE(0x0001, "Filemark detected")
-SENSE_CODE(0x0002, "End-of-partition/medium detected")
-SENSE_CODE(0x0003, "Setmark detected")
-SENSE_CODE(0x0004, "Beginning-of-partition/medium detected")
-SENSE_CODE(0x0005, "End-of-data detected")
-SENSE_CODE(0x0006, "I/O process terminated")
-SENSE_CODE(0x0007, "Programmable early warning detected")
-SENSE_CODE(0x0011, "Audio play operation in progress")
-SENSE_CODE(0x0012, "Audio play operation paused")
-SENSE_CODE(0x0013, "Audio play operation successfully completed")
-SENSE_CODE(0x0014, "Audio play operation stopped due to error")
-SENSE_CODE(0x0015, "No current audio status to return")
-SENSE_CODE(0x0016, "Operation in progress")
-SENSE_CODE(0x0017, "Cleaning requested")
-SENSE_CODE(0x0018, "Erase operation in progress")
-SENSE_CODE(0x0019, "Locate operation in progress")
-SENSE_CODE(0x001A, "Rewind operation in progress")
-SENSE_CODE(0x001B, "Set capacity operation in progress")
-SENSE_CODE(0x001C, "Verify operation in progress")
-SENSE_CODE(0x001D, "ATA pass through information available")
-SENSE_CODE(0x001E, "Conflicting SA creation request")
-SENSE_CODE(0x001F, "Logical unit transitioning to another power condition")
-SENSE_CODE(0x0020, "Extended copy information available")
-SENSE_CODE(0x0021, "Atomic command aborted due to ACA")
-SENSE_CODE(0x0022, "Deferred microcode is pending")
-
-SENSE_CODE(0x0100, "No index/sector signal")
-
-SENSE_CODE(0x0200, "No seek complete")
-
-SENSE_CODE(0x0300, "Peripheral device write fault")
-SENSE_CODE(0x0301, "No write current")
-SENSE_CODE(0x0302, "Excessive write errors")
-
-SENSE_CODE(0x0400, "Logical unit not ready, cause not reportable")
-SENSE_CODE(0x0401, "Logical unit is in process of becoming ready")
-SENSE_CODE(0x0402, "Logical unit not ready, initializing command required")
-SENSE_CODE(0x0403, "Logical unit not ready, manual intervention required")
-SENSE_CODE(0x0404, "Logical unit not ready, format in progress")
-SENSE_CODE(0x0405, "Logical unit not ready, rebuild in progress")
-SENSE_CODE(0x0406, "Logical unit not ready, recalculation in progress")
-SENSE_CODE(0x0407, "Logical unit not ready, operation in progress")
-SENSE_CODE(0x0408, "Logical unit not ready, long write in progress")
-SENSE_CODE(0x0409, "Logical unit not ready, self-test in progress")
-SENSE_CODE(0x040A, "Logical unit not accessible, asymmetric access state transition")
-SENSE_CODE(0x040B, "Logical unit not accessible, target port in standby state")
-SENSE_CODE(0x040C, "Logical unit not accessible, target port in unavailable state")
-SENSE_CODE(0x040D, "Logical unit not ready, structure check required")
-SENSE_CODE(0x040E, "Logical unit not ready, security session in progress")
-SENSE_CODE(0x0410, "Logical unit not ready, auxiliary memory not accessible")
-SENSE_CODE(0x0411, "Logical unit not ready, notify (enable spinup) required")
-SENSE_CODE(0x0412, "Logical unit not ready, offline")
-SENSE_CODE(0x0413, "Logical unit not ready, SA creation in progress")
-SENSE_CODE(0x0414, "Logical unit not ready, space allocation in progress")
-SENSE_CODE(0x0415, "Logical unit not ready, robotics disabled")
-SENSE_CODE(0x0416, "Logical unit not ready, configuration required")
-SENSE_CODE(0x0417, "Logical unit not ready, calibration required")
-SENSE_CODE(0x0418, "Logical unit not ready, a door is open")
-SENSE_CODE(0x0419, "Logical unit not ready, operating in sequential mode")
-SENSE_CODE(0x041A, "Logical unit not ready, start stop unit command in progress")
-SENSE_CODE(0x041B, "Logical unit not ready, sanitize in progress")
-SENSE_CODE(0x041C, "Logical unit not ready, additional power use not yet granted")
-SENSE_CODE(0x041D, "Logical unit not ready, configuration in progress")
-SENSE_CODE(0x041E, "Logical unit not ready, microcode activation required")
-SENSE_CODE(0x041F, "Logical unit not ready, microcode download required")
-SENSE_CODE(0x0420, "Logical unit not ready, logical unit reset required")
-SENSE_CODE(0x0421, "Logical unit not ready, hard reset required")
-SENSE_CODE(0x0422, "Logical unit not ready, power cycle required")
-SENSE_CODE(0x0423, "Logical unit not ready, affiliation required")
-SENSE_CODE(0x0424, "Depopulation in progress")
-SENSE_CODE(0x0425, "Depopulation restoration in progress")
-
-SENSE_CODE(0x0500, "Logical unit does not respond to selection")
-
-SENSE_CODE(0x0600, "No reference position found")
-
-SENSE_CODE(0x0700, "Multiple peripheral devices selected")
-
-SENSE_CODE(0x0800, "Logical unit communication failure")
-SENSE_CODE(0x0801, "Logical unit communication time-out")
-SENSE_CODE(0x0802, "Logical unit communication parity error")
-SENSE_CODE(0x0803, "Logical unit communication CRC error (Ultra-DMA/32)")
-SENSE_CODE(0x0804, "Unreachable copy target")
-
-SENSE_CODE(0x0900, "Track following error")
-SENSE_CODE(0x0901, "Tracking servo failure")
-SENSE_CODE(0x0902, "Focus servo failure")
-SENSE_CODE(0x0903, "Spindle servo failure")
-SENSE_CODE(0x0904, "Head select fault")
-SENSE_CODE(0x0905, "Vibration induced tracking error")
-
-SENSE_CODE(0x0A00, "Error log overflow")
-
-SENSE_CODE(0x0B00, "Warning")
-SENSE_CODE(0x0B01, "Warning - specified temperature exceeded")
-SENSE_CODE(0x0B02, "Warning - enclosure degraded")
-SENSE_CODE(0x0B03, "Warning - background self-test failed")
-SENSE_CODE(0x0B04, "Warning - background pre-scan detected medium error")
-SENSE_CODE(0x0B05, "Warning - background medium scan detected medium error")
-SENSE_CODE(0x0B06, "Warning - non-volatile cache now volatile")
-SENSE_CODE(0x0B07, "Warning - degraded power to non-volatile cache")
-SENSE_CODE(0x0B08, "Warning - power loss expected")
-SENSE_CODE(0x0B09, "Warning - device statistics notification active")
-SENSE_CODE(0x0B0A, "Warning - high critical temperature limit exceeded")
-SENSE_CODE(0x0B0B, "Warning - low critical temperature limit exceeded")
-SENSE_CODE(0x0B0C, "Warning - high operating temperature limit exceeded")
-SENSE_CODE(0x0B0D, "Warning - low operating temperature limit exceeded")
-SENSE_CODE(0x0B0E, "Warning - high critical humidity limit exceeded")
-SENSE_CODE(0x0B0F, "Warning - low critical humidity limit exceeded")
-SENSE_CODE(0x0B10, "Warning - high operating humidity limit exceeded")
-SENSE_CODE(0x0B11, "Warning - low operating humidity limit exceeded")
-SENSE_CODE(0x0B12, "Warning - microcode security at risk")
-SENSE_CODE(0x0B13, "Warning - microcode digital signature validation failure")
-SENSE_CODE(0x0B14, "Warning - physical element status change")
-
-SENSE_CODE(0x0C00, "Write error")
-SENSE_CODE(0x0C01, "Write error - recovered with auto reallocation")
-SENSE_CODE(0x0C02, "Write error - auto reallocation failed")
-SENSE_CODE(0x0C03, "Write error - recommend reassignment")
-SENSE_CODE(0x0C04, "Compression check miscompare error")
-SENSE_CODE(0x0C05, "Data expansion occurred during compression")
-SENSE_CODE(0x0C06, "Block not compressible")
-SENSE_CODE(0x0C07, "Write error - recovery needed")
-SENSE_CODE(0x0C08, "Write error - recovery failed")
-SENSE_CODE(0x0C09, "Write error - loss of streaming")
-SENSE_CODE(0x0C0A, "Write error - padding blocks added")
-SENSE_CODE(0x0C0B, "Auxiliary memory write error")
-SENSE_CODE(0x0C0C, "Write error - unexpected unsolicited data")
-SENSE_CODE(0x0C0D, "Write error - not enough unsolicited data")
-SENSE_CODE(0x0C0E, "Multiple write errors")
-SENSE_CODE(0x0C0F, "Defects in error window")
-SENSE_CODE(0x0C10, "Incomplete multiple atomic write operations")
-SENSE_CODE(0x0C11, "Write error - recovery scan needed")
-SENSE_CODE(0x0C12, "Write error - insufficient zone resources")
-
-SENSE_CODE(0x0D00, "Error detected by third party temporary initiator")
-SENSE_CODE(0x0D01, "Third party device failure")
-SENSE_CODE(0x0D02, "Copy target device not reachable")
-SENSE_CODE(0x0D03, "Incorrect copy target device type")
-SENSE_CODE(0x0D04, "Copy target device data underrun")
-SENSE_CODE(0x0D05, "Copy target device data overrun")
-
-SENSE_CODE(0x0E00, "Invalid information unit")
-SENSE_CODE(0x0E01, "Information unit too short")
-SENSE_CODE(0x0E02, "Information unit too long")
-SENSE_CODE(0x0E03, "Invalid field in command information unit")
-
-SENSE_CODE(0x1000, "Id CRC or ECC error")
-SENSE_CODE(0x1001, "Logical block guard check failed")
-SENSE_CODE(0x1002, "Logical block application tag check failed")
-SENSE_CODE(0x1003, "Logical block reference tag check failed")
-SENSE_CODE(0x1004, "Logical block protection error on recover buffered data")
-SENSE_CODE(0x1005, "Logical block protection method error")
-
-SENSE_CODE(0x1100, "Unrecovered read error")
-SENSE_CODE(0x1101, "Read retries exhausted")
-SENSE_CODE(0x1102, "Error too long to correct")
-SENSE_CODE(0x1103, "Multiple read errors")
-SENSE_CODE(0x1104, "Unrecovered read error - auto reallocate failed")
-SENSE_CODE(0x1105, "L-EC uncorrectable error")
-SENSE_CODE(0x1106, "CIRC unrecovered error")
-SENSE_CODE(0x1107, "Data re-synchronization error")
-SENSE_CODE(0x1108, "Incomplete block read")
-SENSE_CODE(0x1109, "No gap found")
-SENSE_CODE(0x110A, "Miscorrected error")
-SENSE_CODE(0x110B, "Unrecovered read error - recommend reassignment")
-SENSE_CODE(0x110C, "Unrecovered read error - recommend rewrite the data")
-SENSE_CODE(0x110D, "De-compression CRC error")
-SENSE_CODE(0x110E, "Cannot decompress using declared algorithm")
-SENSE_CODE(0x110F, "Error reading UPC/EAN number")
-SENSE_CODE(0x1110, "Error reading ISRC number")
-SENSE_CODE(0x1111, "Read error - loss of streaming")
-SENSE_CODE(0x1112, "Auxiliary memory read error")
-SENSE_CODE(0x1113, "Read error - failed retransmission request")
-SENSE_CODE(0x1114, "Read error - lba marked bad by application client")
-SENSE_CODE(0x1115, "Write after sanitize required")
-
-SENSE_CODE(0x1200, "Address mark not found for id field")
-
-SENSE_CODE(0x1300, "Address mark not found for data field")
-
-SENSE_CODE(0x1400, "Recorded entity not found")
-SENSE_CODE(0x1401, "Record not found")
-SENSE_CODE(0x1402, "Filemark or setmark not found")
-SENSE_CODE(0x1403, "End-of-data not found")
-SENSE_CODE(0x1404, "Block sequence error")
-SENSE_CODE(0x1405, "Record not found - recommend reassignment")
-SENSE_CODE(0x1406, "Record not found - data auto-reallocated")
-SENSE_CODE(0x1407, "Locate operation failure")
-
-SENSE_CODE(0x1500, "Random positioning error")
-SENSE_CODE(0x1501, "Mechanical positioning error")
-SENSE_CODE(0x1502, "Positioning error detected by read of medium")
-
-SENSE_CODE(0x1600, "Data synchronization mark error")
-SENSE_CODE(0x1601, "Data sync error - data rewritten")
-SENSE_CODE(0x1602, "Data sync error - recommend rewrite")
-SENSE_CODE(0x1603, "Data sync error - data auto-reallocated")
-SENSE_CODE(0x1604, "Data sync error - recommend reassignment")
-
-SENSE_CODE(0x1700, "Recovered data with no error correction applied")
-SENSE_CODE(0x1701, "Recovered data with retries")
-SENSE_CODE(0x1702, "Recovered data with positive head offset")
-SENSE_CODE(0x1703, "Recovered data with negative head offset")
-SENSE_CODE(0x1704, "Recovered data with retries and/or circ applied")
-SENSE_CODE(0x1705, "Recovered data using previous sector id")
-SENSE_CODE(0x1706, "Recovered data without ECC - data auto-reallocated")
-SENSE_CODE(0x1707, "Recovered data without ECC - recommend reassignment")
-SENSE_CODE(0x1708, "Recovered data without ECC - recommend rewrite")
-SENSE_CODE(0x1709, "Recovered data without ECC - data rewritten")
-
-SENSE_CODE(0x1800, "Recovered data with error correction applied")
-SENSE_CODE(0x1801, "Recovered data with error corr. & retries applied")
-SENSE_CODE(0x1802, "Recovered data - data auto-reallocated")
-SENSE_CODE(0x1803, "Recovered data with CIRC")
-SENSE_CODE(0x1804, "Recovered data with L-EC")
-SENSE_CODE(0x1805, "Recovered data - recommend reassignment")
-SENSE_CODE(0x1806, "Recovered data - recommend rewrite")
-SENSE_CODE(0x1807, "Recovered data with ECC - data rewritten")
-SENSE_CODE(0x1808, "Recovered data with linking")
-
-SENSE_CODE(0x1900, "Defect list error")
-SENSE_CODE(0x1901, "Defect list not available")
-SENSE_CODE(0x1902, "Defect list error in primary list")
-SENSE_CODE(0x1903, "Defect list error in grown list")
-
-SENSE_CODE(0x1A00, "Parameter list length error")
-
-SENSE_CODE(0x1B00, "Synchronous data transfer error")
-
-SENSE_CODE(0x1C00, "Defect list not found")
-SENSE_CODE(0x1C01, "Primary defect list not found")
-SENSE_CODE(0x1C02, "Grown defect list not found")
-
-SENSE_CODE(0x1D00, "Miscompare during verify operation")
-SENSE_CODE(0x1D01, "Miscompare verify of unmapped LBA")
-
-SENSE_CODE(0x1E00, "Recovered id with ECC correction")
-
-SENSE_CODE(0x1F00, "Partial defect list transfer")
-
-SENSE_CODE(0x2000, "Invalid command operation code")
-SENSE_CODE(0x2001, "Access denied - initiator pending-enrolled")
-SENSE_CODE(0x2002, "Access denied - no access rights")
-SENSE_CODE(0x2003, "Access denied - invalid mgmt id key")
-SENSE_CODE(0x2004, "Illegal command while in write capable state")
-SENSE_CODE(0x2005, "Obsolete")
-SENSE_CODE(0x2006, "Illegal command while in explicit address mode")
-SENSE_CODE(0x2007, "Illegal command while in implicit address mode")
-SENSE_CODE(0x2008, "Access denied - enrollment conflict")
-SENSE_CODE(0x2009, "Access denied - invalid LU identifier")
-SENSE_CODE(0x200A, "Access denied - invalid proxy token")
-SENSE_CODE(0x200B, "Access denied - ACL LUN conflict")
-SENSE_CODE(0x200C, "Illegal command when not in append-only mode")
-SENSE_CODE(0x200D, "Not an administrative logical unit")
-SENSE_CODE(0x200E, "Not a subsidiary logical unit")
-SENSE_CODE(0x200F, "Not a conglomerate logical unit")
-
-SENSE_CODE(0x2100, "Logical block address out of range")
-SENSE_CODE(0x2101, "Invalid element address")
-SENSE_CODE(0x2102, "Invalid address for write")
-SENSE_CODE(0x2103, "Invalid write crossing layer jump")
-SENSE_CODE(0x2104, "Unaligned write command")
-SENSE_CODE(0x2105, "Write boundary violation")
-SENSE_CODE(0x2106, "Attempt to read invalid data")
-SENSE_CODE(0x2107, "Read boundary violation")
-SENSE_CODE(0x2108, "Misaligned write command")
-SENSE_CODE(0x2109, "Attempt to access gap zone")
-
-SENSE_CODE(0x2200, "Illegal function (use 20 00, 24 00, or 26 00)")
-
-SENSE_CODE(0x2300, "Invalid token operation, cause not reportable")
-SENSE_CODE(0x2301, "Invalid token operation, unsupported token type")
-SENSE_CODE(0x2302, "Invalid token operation, remote token usage not supported")
-SENSE_CODE(0x2303, "Invalid token operation, remote rod token creation not supported")
-SENSE_CODE(0x2304, "Invalid token operation, token unknown")
-SENSE_CODE(0x2305, "Invalid token operation, token corrupt")
-SENSE_CODE(0x2306, "Invalid token operation, token revoked")
-SENSE_CODE(0x2307, "Invalid token operation, token expired")
-SENSE_CODE(0x2308, "Invalid token operation, token cancelled")
-SENSE_CODE(0x2309, "Invalid token operation, token deleted")
-SENSE_CODE(0x230A, "Invalid token operation, invalid token length")
-
-SENSE_CODE(0x2400, "Invalid field in cdb")
-SENSE_CODE(0x2401, "CDB decryption error")
-SENSE_CODE(0x2402, "Obsolete")
-SENSE_CODE(0x2403, "Obsolete")
-SENSE_CODE(0x2404, "Security audit value frozen")
-SENSE_CODE(0x2405, "Security working key frozen")
-SENSE_CODE(0x2406, "Nonce not unique")
-SENSE_CODE(0x2407, "Nonce timestamp out of range")
-SENSE_CODE(0x2408, "Invalid XCDB")
-SENSE_CODE(0x2409, "Invalid fast format")
-
-SENSE_CODE(0x2500, "Logical unit not supported")
-
-SENSE_CODE(0x2600, "Invalid field in parameter list")
-SENSE_CODE(0x2601, "Parameter not supported")
-SENSE_CODE(0x2602, "Parameter value invalid")
-SENSE_CODE(0x2603, "Threshold parameters not supported")
-SENSE_CODE(0x2604, "Invalid release of persistent reservation")
-SENSE_CODE(0x2605, "Data decryption error")
-SENSE_CODE(0x2606, "Too many target descriptors")
-SENSE_CODE(0x2607, "Unsupported target descriptor type code")
-SENSE_CODE(0x2608, "Too many segment descriptors")
-SENSE_CODE(0x2609, "Unsupported segment descriptor type code")
-SENSE_CODE(0x260A, "Unexpected inexact segment")
-SENSE_CODE(0x260B, "Inline data length exceeded")
-SENSE_CODE(0x260C, "Invalid operation for copy source or destination")
-SENSE_CODE(0x260D, "Copy segment granularity violation")
-SENSE_CODE(0x260E, "Invalid parameter while port is enabled")
-SENSE_CODE(0x260F, "Invalid data-out buffer integrity check value")
-SENSE_CODE(0x2610, "Data decryption key fail limit reached")
-SENSE_CODE(0x2611, "Incomplete key-associated data set")
-SENSE_CODE(0x2612, "Vendor specific key reference not found")
-SENSE_CODE(0x2613, "Application tag mode page is invalid")
-SENSE_CODE(0x2614, "Tape stream mirroring prevented")
-SENSE_CODE(0x2615, "Copy source or copy destination not authorized")
-SENSE_CODE(0x2616, "Fast copy not possible")
-
-SENSE_CODE(0x2700, "Write protected")
-SENSE_CODE(0x2701, "Hardware write protected")
-SENSE_CODE(0x2702, "Logical unit software write protected")
-SENSE_CODE(0x2703, "Associated write protect")
-SENSE_CODE(0x2704, "Persistent write protect")
-SENSE_CODE(0x2705, "Permanent write protect")
-SENSE_CODE(0x2706, "Conditional write protect")
-SENSE_CODE(0x2707, "Space allocation failed write protect")
-SENSE_CODE(0x2708, "Zone is read only")
-
-SENSE_CODE(0x2800, "Not ready to ready change, medium may have changed")
-SENSE_CODE(0x2801, "Import or export element accessed")
-SENSE_CODE(0x2802, "Format-layer may have changed")
-SENSE_CODE(0x2803, "Import/export element accessed, medium changed")
-
-SENSE_CODE(0x2900, "Power on, reset, or bus device reset occurred")
-SENSE_CODE(0x2901, "Power on occurred")
-SENSE_CODE(0x2902, "Scsi bus reset occurred")
-SENSE_CODE(0x2903, "Bus device reset function occurred")
-SENSE_CODE(0x2904, "Device internal reset")
-SENSE_CODE(0x2905, "Transceiver mode changed to single-ended")
-SENSE_CODE(0x2906, "Transceiver mode changed to lvd")
-SENSE_CODE(0x2907, "I_T nexus loss occurred")
-
-SENSE_CODE(0x2A00, "Parameters changed")
-SENSE_CODE(0x2A01, "Mode parameters changed")
-SENSE_CODE(0x2A02, "Log parameters changed")
-SENSE_CODE(0x2A03, "Reservations preempted")
-SENSE_CODE(0x2A04, "Reservations released")
-SENSE_CODE(0x2A05, "Registrations preempted")
-SENSE_CODE(0x2A06, "Asymmetric access state changed")
-SENSE_CODE(0x2A07, "Implicit asymmetric access state transition failed")
-SENSE_CODE(0x2A08, "Priority changed")
-SENSE_CODE(0x2A09, "Capacity data has changed")
-SENSE_CODE(0x2A0A, "Error history I_T nexus cleared")
-SENSE_CODE(0x2A0B, "Error history snapshot released")
-SENSE_CODE(0x2A0C, "Error recovery attributes have changed")
-SENSE_CODE(0x2A0D, "Data encryption capabilities changed")
-SENSE_CODE(0x2A10, "Timestamp changed")
-SENSE_CODE(0x2A11, "Data encryption parameters changed by another i_t nexus")
-SENSE_CODE(0x2A12, "Data encryption parameters changed by vendor specific event")
-SENSE_CODE(0x2A13, "Data encryption key instance counter has changed")
-SENSE_CODE(0x2A14, "SA creation capabilities data has changed")
-SENSE_CODE(0x2A15, "Medium removal prevention preempted")
-SENSE_CODE(0x2A16, "Zone reset write pointer recommended")
-
-SENSE_CODE(0x2B00, "Copy cannot execute since host cannot disconnect")
-
-SENSE_CODE(0x2C00, "Command sequence error")
-SENSE_CODE(0x2C01, "Too many windows specified")
-SENSE_CODE(0x2C02, "Invalid combination of windows specified")
-SENSE_CODE(0x2C03, "Current program area is not empty")
-SENSE_CODE(0x2C04, "Current program area is empty")
-SENSE_CODE(0x2C05, "Illegal power condition request")
-SENSE_CODE(0x2C06, "Persistent prevent conflict")
-SENSE_CODE(0x2C07, "Previous busy status")
-SENSE_CODE(0x2C08, "Previous task set full status")
-SENSE_CODE(0x2C09, "Previous reservation conflict status")
-SENSE_CODE(0x2C0A, "Partition or collection contains user objects")
-SENSE_CODE(0x2C0B, "Not reserved")
-SENSE_CODE(0x2C0C, "Orwrite generation does not match")
-SENSE_CODE(0x2C0D, "Reset write pointer not allowed")
-SENSE_CODE(0x2C0E, "Zone is offline")
-SENSE_CODE(0x2C0F, "Stream not open")
-SENSE_CODE(0x2C10, "Unwritten data in zone")
-SENSE_CODE(0x2C11, "Descriptor format sense data required")
-SENSE_CODE(0x2C12, "Zone is inactive")
-SENSE_CODE(0x2C13, "Well known logical unit access required")
-
-SENSE_CODE(0x2D00, "Overwrite error on update in place")
-
-SENSE_CODE(0x2E00, "Insufficient time for operation")
-SENSE_CODE(0x2E01, "Command timeout before processing")
-SENSE_CODE(0x2E02, "Command timeout during processing")
-SENSE_CODE(0x2E03, "Command timeout during processing due to error recovery")
-
-SENSE_CODE(0x2F00, "Commands cleared by another initiator")
-SENSE_CODE(0x2F01, "Commands cleared by power loss notification")
-SENSE_CODE(0x2F02, "Commands cleared by device server")
-SENSE_CODE(0x2F03, "Some commands cleared by queuing layer event")
-
-SENSE_CODE(0x3000, "Incompatible medium installed")
-SENSE_CODE(0x3001, "Cannot read medium - unknown format")
-SENSE_CODE(0x3002, "Cannot read medium - incompatible format")
-SENSE_CODE(0x3003, "Cleaning cartridge installed")
-SENSE_CODE(0x3004, "Cannot write medium - unknown format")
-SENSE_CODE(0x3005, "Cannot write medium - incompatible format")
-SENSE_CODE(0x3006, "Cannot format medium - incompatible medium")
-SENSE_CODE(0x3007, "Cleaning failure")
-SENSE_CODE(0x3008, "Cannot write - application code mismatch")
-SENSE_CODE(0x3009, "Current session not fixated for append")
-SENSE_CODE(0x300A, "Cleaning request rejected")
-SENSE_CODE(0x300C, "WORM medium - overwrite attempted")
-SENSE_CODE(0x300D, "WORM medium - integrity check")
-SENSE_CODE(0x3010, "Medium not formatted")
-SENSE_CODE(0x3011, "Incompatible volume type")
-SENSE_CODE(0x3012, "Incompatible volume qualifier")
-SENSE_CODE(0x3013, "Cleaning volume expired")
-
-SENSE_CODE(0x3100, "Medium format corrupted")
-SENSE_CODE(0x3101, "Format command failed")
-SENSE_CODE(0x3102, "Zoned formatting failed due to spare linking")
-SENSE_CODE(0x3103, "Sanitize command failed")
-SENSE_CODE(0x3104, "Depopulation failed")
-SENSE_CODE(0x3105, "Depopulation restoration failed")
-
-SENSE_CODE(0x3200, "No defect spare location available")
-SENSE_CODE(0x3201, "Defect list update failure")
-
-SENSE_CODE(0x3300, "Tape length error")
-
-SENSE_CODE(0x3400, "Enclosure failure")
-
-SENSE_CODE(0x3500, "Enclosure services failure")
-SENSE_CODE(0x3501, "Unsupported enclosure function")
-SENSE_CODE(0x3502, "Enclosure services unavailable")
-SENSE_CODE(0x3503, "Enclosure services transfer failure")
-SENSE_CODE(0x3504, "Enclosure services transfer refused")
-SENSE_CODE(0x3505, "Enclosure services checksum error")
-
-SENSE_CODE(0x3600, "Ribbon, ink, or toner failure")
-
-SENSE_CODE(0x3700, "Rounded parameter")
-
-SENSE_CODE(0x3800, "Event status notification")
-SENSE_CODE(0x3802, "Esn - power management class event")
-SENSE_CODE(0x3804, "Esn - media class event")
-SENSE_CODE(0x3806, "Esn - device busy class event")
-SENSE_CODE(0x3807, "Thin Provisioning soft threshold reached")
-SENSE_CODE(0x3808, "Depopulation interrupted")
-
-SENSE_CODE(0x3900, "Saving parameters not supported")
-
-SENSE_CODE(0x3A00, "Medium not present")
-SENSE_CODE(0x3A01, "Medium not present - tray closed")
-SENSE_CODE(0x3A02, "Medium not present - tray open")
-SENSE_CODE(0x3A03, "Medium not present - loadable")
-SENSE_CODE(0x3A04, "Medium not present - medium auxiliary memory accessible")
-
-SENSE_CODE(0x3B00, "Sequential positioning error")
-SENSE_CODE(0x3B01, "Tape position error at beginning-of-medium")
-SENSE_CODE(0x3B02, "Tape position error at end-of-medium")
-SENSE_CODE(0x3B03, "Tape or electronic vertical forms unit not ready")
-SENSE_CODE(0x3B04, "Slew failure")
-SENSE_CODE(0x3B05, "Paper jam")
-SENSE_CODE(0x3B06, "Failed to sense top-of-form")
-SENSE_CODE(0x3B07, "Failed to sense bottom-of-form")
-SENSE_CODE(0x3B08, "Reposition error")
-SENSE_CODE(0x3B09, "Read past end of medium")
-SENSE_CODE(0x3B0A, "Read past beginning of medium")
-SENSE_CODE(0x3B0B, "Position past end of medium")
-SENSE_CODE(0x3B0C, "Position past beginning of medium")
-SENSE_CODE(0x3B0D, "Medium destination element full")
-SENSE_CODE(0x3B0E, "Medium source element empty")
-SENSE_CODE(0x3B0F, "End of medium reached")
-SENSE_CODE(0x3B11, "Medium magazine not accessible")
-SENSE_CODE(0x3B12, "Medium magazine removed")
-SENSE_CODE(0x3B13, "Medium magazine inserted")
-SENSE_CODE(0x3B14, "Medium magazine locked")
-SENSE_CODE(0x3B15, "Medium magazine unlocked")
-SENSE_CODE(0x3B16, "Mechanical positioning or changer error")
-SENSE_CODE(0x3B17, "Read past end of user object")
-SENSE_CODE(0x3B18, "Element disabled")
-SENSE_CODE(0x3B19, "Element enabled")
-SENSE_CODE(0x3B1A, "Data transfer device removed")
-SENSE_CODE(0x3B1B, "Data transfer device inserted")
-SENSE_CODE(0x3B1C, "Too many logical objects on partition to support operation")
-SENSE_CODE(0x3B20, "Element static information changed")
-
-SENSE_CODE(0x3D00, "Invalid bits in identify message")
-
-SENSE_CODE(0x3E00, "Logical unit has not self-configured yet")
-SENSE_CODE(0x3E01, "Logical unit failure")
-SENSE_CODE(0x3E02, "Timeout on logical unit")
-SENSE_CODE(0x3E03, "Logical unit failed self-test")
-SENSE_CODE(0x3E04, "Logical unit unable to update self-test log")
-
-SENSE_CODE(0x3F00, "Target operating conditions have changed")
-SENSE_CODE(0x3F01, "Microcode has been changed")
-SENSE_CODE(0x3F02, "Changed operating definition")
-SENSE_CODE(0x3F03, "Inquiry data has changed")
-SENSE_CODE(0x3F04, "Component device attached")
-SENSE_CODE(0x3F05, "Device identifier changed")
-SENSE_CODE(0x3F06, "Redundancy group created or modified")
-SENSE_CODE(0x3F07, "Redundancy group deleted")
-SENSE_CODE(0x3F08, "Spare created or modified")
-SENSE_CODE(0x3F09, "Spare deleted")
-SENSE_CODE(0x3F0A, "Volume set created or modified")
-SENSE_CODE(0x3F0B, "Volume set deleted")
-SENSE_CODE(0x3F0C, "Volume set deassigned")
-SENSE_CODE(0x3F0D, "Volume set reassigned")
-SENSE_CODE(0x3F0E, "Reported luns data has changed")
-SENSE_CODE(0x3F0F, "Echo buffer overwritten")
-SENSE_CODE(0x3F10, "Medium loadable")
-SENSE_CODE(0x3F11, "Medium auxiliary memory accessible")
-SENSE_CODE(0x3F12, "iSCSI IP address added")
-SENSE_CODE(0x3F13, "iSCSI IP address removed")
-SENSE_CODE(0x3F14, "iSCSI IP address changed")
-SENSE_CODE(0x3F15, "Inspect referrals sense descriptors")
-SENSE_CODE(0x3F16, "Microcode has been changed without reset")
-SENSE_CODE(0x3F17, "Zone transition to full")
-SENSE_CODE(0x3F18, "Bind completed")
-SENSE_CODE(0x3F19, "Bind redirected")
-SENSE_CODE(0x3F1A, "Subsidiary binding changed")
+SENSE_CODE(NO_ADDITIONAL_SENSE_INFORMATION,
+ "No additional sense information")
+SENSE_CODE(FILEMARK_DETECTED,
+ "Filemark detected")
+SENSE_CODE(END_OF_PARTITION_MEDIUM_DETECTED,
+ "End-of-partition/medium detected")
+SENSE_CODE(SETMARK_DETECTED,
+ "Setmark detected")
+SENSE_CODE(BEGINNING_OF_PARTITION_MEDIUM_DETECTED,
+ "Beginning-of-partition/medium detected")
+SENSE_CODE(END_OF_DATA_DETECTED,
+ "End-of-data detected")
+SENSE_CODE(IO_PROCESS_TERMINATED,
+ "I/O process terminated")
+SENSE_CODE(PROGRAMMABLE_EARLY_WARNING_DETECTED,
+ "Programmable early warning detected")
+SENSE_CODE(AUDIO_PLAY_OP_IN_PROGRESS,
+ "Audio play operation in progress")
+SENSE_CODE(AUDIO_PLAY_OP_PAUSED,
+ "Audio play operation paused")
+SENSE_CODE(AUDIO_PLAY_OP_SUCCESSFULLY_COMPLETED,
+ "Audio play operation successfully completed")
+SENSE_CODE(AUDIO_PLAY_OP_STOPPED_DUE_TO_ERROR,
+ "Audio play operation stopped due to error")
+SENSE_CODE(NO_CURRENT_AUDIO_STATUS_TO_RETURN,
+ "No current audio status to return")
+SENSE_CODE(OP_IN_PROGRESS,
+ "Operation in progress")
+SENSE_CODE(CLEANING_REQUESTED,
+ "Cleaning requested")
+SENSE_CODE(ERASE_OP_IN_PROGRESS,
+ "Erase operation in progress")
+SENSE_CODE(LOCATE_OP_IN_PROGRESS,
+ "Locate operation in progress")
+SENSE_CODE(REWIND_OP_IN_PROGRESS,
+ "Rewind operation in progress")
+SENSE_CODE(SET_CAPACITY_OP_IN_PROGRESS,
+ "Set capacity operation in progress")
+SENSE_CODE(VERIFY_OP_IN_PROGRESS,
+ "Verify operation in progress")
+SENSE_CODE(ATA_PASS_THROUGH_INFORMATION_AVAILABLE,
+ "ATA pass through information available")
+SENSE_CODE(CONFLICTING_SA_CREATION_REQUEST,
+ "Conflicting SA creation request")
+SENSE_CODE(LU_TRANSITIONING_TO_ANOTHER_POWER_CONDITION,
+ "Logical unit transitioning to another power condition")
+SENSE_CODE(EXTENDED_COPY_INFORMATION_AVAILABLE,
+ "Extended copy information available")
+SENSE_CODE(ATOMIC_COMMAND_ABORTED_DUE_TO_ACA,
+ "Atomic command aborted due to ACA")
+SENSE_CODE(DEFERRED_MICROCODE_IS_PENDING,
+ "Deferred microcode is pending")
+SENSE_CODE(OVERLAPPING_ATOMIC_COMMAND_IN_PROGRESS,
+ "Overlapping atomic command in progress")
+
+SENSE_CODE(NO_INDEX_SECTOR_SIGNAL,
+ "No index/sector signal")
+
+SENSE_CODE(NO_SEEK_COMPLETE,
+ "No seek complete")
+
+SENSE_CODE(PERIPHERAL_DEVICE_WRITE_FAULT,
+ "Peripheral device write fault")
+SENSE_CODE(NO_WRITE_CURRENT,
+ "No write current")
+SENSE_CODE(EXCESSIVE_WRITE_ERRORS,
+ "Excessive write errors")
+
+SENSE_CODE(LU_NOT_READY,
+ "Logical unit not ready, cause not reportable")
+SENSE_CODE(LU_IS_IN_PROCESS_OF_BECOMING_READY,
+ "Logical unit is in process of becoming ready")
+SENSE_CODE(LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED,
+ "Logical unit not ready, initializing command required")
+SENSE_CODE(LU_NOT_READY_MANUAL_INTERVENTION_REQUIRED,
+ "Logical unit not ready, manual intervention required")
+SENSE_CODE(LU_NOT_READY_FORMAT_IN_PROGRESS,
+ "Logical unit not ready, format in progress")
+SENSE_CODE(LU_NOT_READY_REBUILD_IN_PROGRESS,
+ "Logical unit not ready, rebuild in progress")
+SENSE_CODE(LU_NOT_READY_RECALCULATION_IN_PROGRESS,
+ "Logical unit not ready, recalculation in progress")
+SENSE_CODE(LU_NOT_READY_OP_IN_PROGRESS,
+ "Logical unit not ready, operation in progress")
+SENSE_CODE(LU_NOT_READY_LONG_WRITE_IN_PROGRESS,
+ "Logical unit not ready, long write in progress")
+SENSE_CODE(LU_NOT_READY_SELFTEST_IN_PROGRESS,
+ "Logical unit not ready, self-test in progress")
+SENSE_CODE(LU_NOT_ACCESSIBLE_ASYMMETRIC_ACCESS_STATE_TRANSITION,
+ "Logical unit not accessible, asymmetric access state transition")
+SENSE_CODE(LU_NOT_ACCESSIBLE_TARGET_PORT_IN_STANDBY_STATE,
+ "Logical unit not accessible, target port in standby state")
+SENSE_CODE(LU_NOT_ACCESSIBLE_TARGET_PORT_IN_UNAVAILABLE_STATE,
+ "Logical unit not accessible, target port in unavailable state")
+SENSE_CODE(LU_NOT_READY_STRUCTURE_CHECK_REQUIRED,
+ "Logical unit not ready, structure check required")
+SENSE_CODE(LU_NOT_READY_SECURITY_SESSION_IN_PROGRESS,
+ "Logical unit not ready, security session in progress")
+SENSE_CODE(LU_NOT_READY_AUXILIARY_MEMORY_NOT_ACCESSIBLE,
+ "Logical unit not ready, auxiliary memory not accessible")
+SENSE_CODE(LU_NOT_READY_NOTIFY_REQUIRED,
+ "Logical unit not ready, notify (enable spinup) required")
+SENSE_CODE(LU_NOT_READY_OFFLINE,
+ "Logical unit not ready, offline")
+SENSE_CODE(LU_NOT_READY_SA_CREATION_IN_PROGRESS,
+ "Logical unit not ready, SA creation in progress")
+SENSE_CODE(LU_NOT_READY_SPACE_ALLOCATION_IN_PROGRESS,
+ "Logical unit not ready, space allocation in progress")
+SENSE_CODE(LU_NOT_READY_ROBOTICS_DISABLED,
+ "Logical unit not ready, robotics disabled")
+SENSE_CODE(LU_NOT_READY_CONFIG_REQUIRED,
+ "Logical unit not ready, configuration required")
+SENSE_CODE(LU_NOT_READY_CALIBRATION_REQUIRED,
+ "Logical unit not ready, calibration required")
+SENSE_CODE(LU_NOT_READY_A_DOOR_IS_OPEN,
+ "Logical unit not ready, a door is open")
+SENSE_CODE(LU_NOT_READY_OPERATING_IN_SEQUENTIAL_MODE,
+ "Logical unit not ready, operating in sequential mode")
+SENSE_CODE(LU_NOT_READY_START_STOP_UNIT_COMMAND_IN_PROGRESS,
+ "Logical unit not ready, start stop unit command in progress")
+SENSE_CODE(LU_NOT_READY_SANITIZE_IN_PROGRESS,
+ "Logical unit not ready, sanitize in progress")
+SENSE_CODE(LU_NOT_READY_ADDITIONAL_POWER_USE_NOT_YET_GRANTED,
+ "Logical unit not ready, additional power use not yet granted")
+SENSE_CODE(LU_NOT_READY_CONFIG_IN_PROGRESS,
+ "Logical unit not ready, configuration in progress")
+SENSE_CODE(LU_NOT_READY_MICROCODE_ACTIVATION_REQUIRED,
+ "Logical unit not ready, microcode activation required")
+SENSE_CODE(LU_NOT_READY_MICROCODE_DOWNLOAD_REQUIRED,
+ "Logical unit not ready, microcode download required")
+SENSE_CODE(LU_NOT_READY_LU_RESET_REQUIRED,
+ "Logical unit not ready, logical unit reset required")
+SENSE_CODE(LU_NOT_READY_HARD_RESET_REQUIRED,
+ "Logical unit not ready, hard reset required")
+SENSE_CODE(LU_NOT_READY_POWER_CYCLE_REQUIRED,
+ "Logical unit not ready, power cycle required")
+SENSE_CODE(LU_NOT_READY_AFFILIATION_REQUIRED,
+ "Logical unit not ready, affiliation required")
+SENSE_CODE(DEPOPULATION_IN_PROGRESS,
+ "Depopulation in progress")
+SENSE_CODE(DEPOPULATION_RESTORATION_IN_PROGRESS,
+ "Depopulation restoration in progress")
+
+SENSE_CODE(LU_DOES_NOT_RESPOND_TO_SELECTION,
+ "Logical unit does not respond to selection")
+
+SENSE_CODE(NO_REFERENCE_POSITION_FOUND,
+ "No reference position found")
+
+SENSE_CODE(MULTIPLE_PERIPHERAL_DEVICES_SELECTED,
+ "Multiple peripheral devices selected")
+
+SENSE_CODE(LU_COMMUNICATION_FAILURE,
+ "Logical unit communication failure")
+SENSE_CODE(LU_COMMUNICATION_TIMEOUT,
+ "Logical unit communication time-out")
+SENSE_CODE(LU_COMMUNICATION_PARITY_ERROR,
+ "Logical unit communication parity error")
+SENSE_CODE(LU_COMMUNICATION_CRC_ERROR,
+ "Logical unit communication CRC error (Ultra-DMA/32)")
+SENSE_CODE(UNREACHABLE_COPY_TARGET,
+ "Unreachable copy target")
+
+SENSE_CODE(TRACK_FOLLOWING_ERROR,
+ "Track following error")
+SENSE_CODE(TRACKING_SERVO_FAILURE,
+ "Tracking servo failure")
+SENSE_CODE(FOCUS_SERVO_FAILURE,
+ "Focus servo failure")
+SENSE_CODE(SPINDLE_SERVO_FAILURE,
+ "Spindle servo failure")
+SENSE_CODE(HEAD_SELECT_FAULT,
+ "Head select fault")
+SENSE_CODE(VIBRATION_INDUCED_TRACKING_ERROR,
+ "Vibration induced tracking error")
+
+SENSE_CODE(ERROR_LOG_OVERFLOW,
+ "Error log overflow")
+
+SENSE_CODE(SSC_WARNING,
+ "Warning")
+SENSE_CODE(WARNING_SPECIFIED_TEMPERATURE_EXCEEDED,
+ "Warning - specified temperature exceeded")
+SENSE_CODE(WARNING_ENCLOSURE_DEGRADED,
+ "Warning - enclosure degraded")
+SENSE_CODE(WARNING_BACKGROUND_SELFTEST_FAILED,
+ "Warning - background self-test failed")
+SENSE_CODE(WARNING_BACKGROUND_PRESCAN_DETECTED_MEDIUM_ERROR,
+ "Warning - background pre-scan detected medium error")
+SENSE_CODE(WARNING_BACKGROUND_MEDIUM_SCAN_DETECTED_MEDIUM_ERROR,
+ "Warning - background medium scan detected medium error")
+SENSE_CODE(WARNING_NONVOLATILE_CACHE_NOW_VOLATILE,
+ "Warning - non-volatile cache now volatile")
+SENSE_CODE(WARNING_DEGRADED_POWER_TO_NONVOLATILE_CACHE,
+ "Warning - degraded power to non-volatile cache")
+SENSE_CODE(WARNING_POWER_LOSS_EXPECTED,
+ "Warning - power loss expected")
+SENSE_CODE(WARNING_DEVICE_STATISTICS_NOTIFICATION_ACTIVE,
+ "Warning - device statistics notification active")
+SENSE_CODE(WARNING_HIGH_CRITICAL_TEMPERATURE_LIMIT_EXCEEDED,
+ "Warning - high critical temperature limit exceeded")
+SENSE_CODE(WARNING_LOW_CRITICAL_TEMPERATURE_LIMIT_EXCEEDED,
+ "Warning - low critical temperature limit exceeded")
+SENSE_CODE(WARNING_HIGH_OPERATING_TEMPERATURE_LIMIT_EXCEEDED,
+ "Warning - high operating temperature limit exceeded")
+SENSE_CODE(WARNING_LOW_OPERATING_TEMPERATURE_LIMIT_EXCEEDED,
+ "Warning - low operating temperature limit exceeded")
+SENSE_CODE(WARNING_HIGH_CRITICAL_HUMIDITY_LIMIT_EXCEEDED,
+ "Warning - high critical humidity limit exceeded")
+SENSE_CODE(WARNING_LOW_CRITICAL_HUMIDITY_LIMIT_EXCEEDED,
+ "Warning - low critical humidity limit exceeded")
+SENSE_CODE(WARNING_HIGH_OPERATING_HUMIDITY_LIMIT_EXCEEDED,
+ "Warning - high operating humidity limit exceeded")
+SENSE_CODE(WARNING_LOW_OPERATING_HUMIDITY_LIMIT_EXCEEDED,
+ "Warning - low operating humidity limit exceeded")
+SENSE_CODE(WARNING_MICROCODE_SECURITY_AT_RISK,
+ "Warning - microcode security at risk")
+SENSE_CODE(WARNING_MICROCODE_DIGITAL_SIGNATURE_VALIDATION_FAILURE,
+ "Warning - microcode digital signature validation failure")
+SENSE_CODE(WARNING_PHYSICAL_ELEMENT_STATUS_CHANGE,
+ "Warning - physical element status change")
+
+SENSE_CODE(SSC_WRITE_ERROR,
+ "Write error")
+SENSE_CODE(WRITE_ERROR_RECOVERED_WITH_AUTO_REALLOCATION,
+ "Write error - recovered with auto reallocation")
+SENSE_CODE(WRITE_ERROR_AUTO_REALLOCATION_FAILED,
+ "Write error - auto reallocation failed")
+SENSE_CODE(WRITE_ERROR_RECOMMEND_REASSIGNMENT,
+ "Write error - recommend reassignment")
+SENSE_CODE(COMPRESSION_CHECK_MISCOMPARE_ERROR,
+ "Compression check miscompare error")
+SENSE_CODE(DATA_EXPANSION_OCCURRED_DURING_COMPRESSION,
+ "Data expansion occurred during compression")
+SENSE_CODE(BLOCK_NOT_COMPRESSIBLE,
+ "Block not compressible")
+SENSE_CODE(WRITE_ERROR_RECOVERY_NEEDED,
+ "Write error - recovery needed")
+SENSE_CODE(WRITE_ERROR_RECOVERY_FAILED,
+ "Write error - recovery failed")
+SENSE_CODE(WRITE_ERROR_LOSS_OF_STREAMING,
+ "Write error - loss of streaming")
+SENSE_CODE(WRITE_ERROR_PADDING_BLOCKS_ADDED,
+ "Write error - padding blocks added")
+SENSE_CODE(AUXILIARY_MEMORY_WRITE_ERROR,
+ "Auxiliary memory write error")
+SENSE_CODE(WRITE_ERROR_UNEXPECTED_UNSOLICITED_DATA,
+ "Write error - unexpected unsolicited data")
+SENSE_CODE(WRITE_ERROR_NOT_ENOUGH_UNSOLICITED_DATA,
+ "Write error - not enough unsolicited data")
+SENSE_CODE(MULTIPLE_WRITE_ERRORS,
+ "Multiple write errors")
+SENSE_CODE(DEFECTS_IN_ERROR_WINDOW,
+ "Defects in error window")
+SENSE_CODE(INCOMPLETE_MULTIPLE_ATOMIC_WRITE_OPERATIONS,
+ "Incomplete multiple atomic write operations")
+SENSE_CODE(WRITE_ERROR_RECOVERY_SCAN_NEEDED,
+ "Write error - recovery scan needed")
+SENSE_CODE(WRITE_ERROR_INSUFFICIENT_ZONE_RESOURCES,
+ "Write error - insufficient zone resources")
+
+SENSE_CODE(ERROR_DETECTED_BY_THIRD_PARTY_TEMPORARY_INITIATOR,
+ "Error detected by third party temporary initiator")
+SENSE_CODE(THIRD_PARTY_DEVICE_FAILURE,
+ "Third party device failure")
+SENSE_CODE(COPY_TARGET_DEVICE_NOT_REACHABLE,
+ "Copy target device not reachable")
+SENSE_CODE(INCORRECT_COPY_TARGET_DEVICE_TYPE,
+ "Incorrect copy target device type")
+SENSE_CODE(COPY_TARGET_DEVICE_DATA_UNDERRUN,
+ "Copy target device data underrun")
+SENSE_CODE(COPY_TARGET_DEVICE_DATA_OVERRUN,
+ "Copy target device data overrun")
+
+SENSE_CODE(INVALID_INFORMATION_UNIT,
+ "Invalid information unit")
+SENSE_CODE(INFORMATION_UNIT_TOO_SHORT,
+ "Information unit too short")
+SENSE_CODE(INFORMATION_UNIT_TOO_LONG,
+ "Information unit too long")
+SENSE_CODE(INVALID_FIELD_IN_COMMAND_INFORMATION_UNIT,
+ "Invalid field in command information unit")
+
+SENSE_CODE(ID_CRC_OR_ECC_ERROR,
+ "Id CRC or ECC error")
+SENSE_CODE(LOGICAL_BLOCK_GUARD_CHECK_FAILED,
+ "Logical block guard check failed")
+SENSE_CODE(LOGICAL_BLOCK_APPLICATION_TAG_CHECK_FAILED,
+ "Logical block application tag check failed")
+SENSE_CODE(LOGICAL_BLOCK_REFERENCE_TAG_CHECK_FAILED,
+ "Logical block reference tag check failed")
+SENSE_CODE(LOGICAL_BLOCK_PROTECTION_ERROR_ON_RECOVER_BUFFERED_DATA,
+ "Logical block protection error on recover buffered data")
+SENSE_CODE(LOGICAL_BLOCK_PROTECTION_METHOD_ERROR,
+ "Logical block protection method error")
+
+SENSE_CODE(UNRECOVERED_READ_ERROR,
+ "Unrecovered read error")
+SENSE_CODE(READ_RETRIES_EXHAUSTED,
+ "Read retries exhausted")
+SENSE_CODE(ERROR_TOO_LONG_TO_CORRECT,
+ "Error too long to correct")
+SENSE_CODE(MULTIPLE_READ_ERRORS,
+ "Multiple read errors")
+SENSE_CODE(UNRECOVERED_READ_ERROR_AUTO_REALLOCATE_FAILED,
+ "Unrecovered read error - auto reallocate failed")
+SENSE_CODE(LEC_UNCORRECTABLE_ERROR,
+ "L-EC uncorrectable error")
+SENSE_CODE(CIRC_UNRECOVERED_ERROR,
+ "CIRC unrecovered error")
+SENSE_CODE(DATA_RESYNCHRONIZATION_ERROR,
+ "Data re-synchronization error")
+SENSE_CODE(INCOMPLETE_BLOCK_READ,
+ "Incomplete block read")
+SENSE_CODE(NO_GAP_FOUND,
+ "No gap found")
+SENSE_CODE(MISCORRECTED_ERROR,
+ "Miscorrected error")
+SENSE_CODE(UNRECOVERED_READ_ERROR_RECOMMEND_REASSIGNMENT,
+ "Unrecovered read error - recommend reassignment")
+SENSE_CODE(UNRECOVERED_READ_ERROR_RECOMMEND_REWRITE_THE_DATA,
+ "Unrecovered read error - recommend rewrite the data")
+SENSE_CODE(DECOMPRESSION_CRC_ERROR,
+ "De-compression CRC error")
+SENSE_CODE(CANNOT_DECOMPRESS_USING_DECLARED_ALGORITHM,
+ "Cannot decompress using declared algorithm")
+SENSE_CODE(ERROR_READING_UPC_EAN_NUMBER,
+ "Error reading UPC/EAN number")
+SENSE_CODE(ERROR_READING_ISRC_NUMBER,
+ "Error reading ISRC number")
+SENSE_CODE(READ_ERROR_LOSS_OF_STREAMING,
+ "Read error - loss of streaming")
+SENSE_CODE(AUXILIARY_MEMORY_READ_ERROR,
+ "Auxiliary memory read error")
+SENSE_CODE(READ_ERROR_FAILED_RETRANSMISSION_REQUEST,
+ "Read error - failed retransmission request")
+SENSE_CODE(READ_ERROR_LBA_MARKED_BAD_BY_APPLICATION_CLIENT,
+ "Read error - lba marked bad by application client")
+SENSE_CODE(WRITE_AFTER_SANITIZE_REQUIRED,
+ "Write after sanitize required")
+
+SENSE_CODE(ADDRESS_MARK_NOT_FOUND_FOR_ID_FIELD,
+ "Address mark not found for id field")
+
+SENSE_CODE(ADDRESS_MARK_NOT_FOUND_FOR_DATA_FIELD,
+ "Address mark not found for data field")
+
+SENSE_CODE(RECORDED_ENTITY_NOT_FOUND,
+ "Recorded entity not found")
+SENSE_CODE(RECORD_NOT_FOUND,
+ "Record not found")
+SENSE_CODE(FILEMARK_OR_SETMARK_NOT_FOUND,
+ "Filemark or setmark not found")
+SENSE_CODE(END_OF_DATA_NOT_FOUND,
+ "End-of-data not found")
+SENSE_CODE(BLOCK_SEQUENCE_ERROR,
+ "Block sequence error")
+SENSE_CODE(RECORD_NOT_FOUND_RECOMMEND_REASSIGNMENT,
+ "Record not found - recommend reassignment")
+SENSE_CODE(RECORD_NOT_FOUND_DATA_AUTO_REALLOCATED,
+ "Record not found - data auto-reallocated")
+SENSE_CODE(LOCATE_OPERATION_FAILURE,
+ "Locate operation failure")
+
+SENSE_CODE(RANDOM_POSITIONING_ERROR,
+ "Random positioning error")
+SENSE_CODE(MECHANICAL_POSITIONING_ERROR,
+ "Mechanical positioning error")
+SENSE_CODE(POSITIONING_ERROR_DETECTED_BY_READ_OF_MEDIUM,
+ "Positioning error detected by read of medium")
+
+SENSE_CODE(DATA_SYNCHRONIZATION_MARK_ERROR,
+ "Data synchronization mark error")
+SENSE_CODE(DATA_SYNC_ERROR_DATA_REWRITTEN,
+ "Data sync error - data rewritten")
+SENSE_CODE(DATA_SYNC_ERROR_RECOMMEND_REWRITE,
+ "Data sync error - recommend rewrite")
+SENSE_CODE(DATA_SYNC_ERROR_DATA_AUTO_REALLOCATED,
+ "Data sync error - data auto-reallocated")
+SENSE_CODE(DATA_SYNC_ERROR_RECOMMEND_REASSIGNMENT,
+ "Data sync error - recommend reassignment")
+
+SENSE_CODE(RECOVERED_DATA_WITH_NO_ERROR_CORRECTION_APPLIED,
+ "Recovered data with no error correction applied")
+SENSE_CODE(RECOVERED_DATA_WITH_RETRIES,
+ "Recovered data with retries")
+SENSE_CODE(RECOVERED_DATA_WITH_POSITIVE_HEAD_OFFSET,
+ "Recovered data with positive head offset")
+SENSE_CODE(RECOVERED_DATA_WITH_NEGATIVE_HEAD_OFFSET,
+ "Recovered data with negative head offset")
+SENSE_CODE(RECOVERED_DATA_WITH_RETRIES_AND_OR_CIRC_APPLIED,
+ "Recovered data with retries and/or circ applied")
+SENSE_CODE(RECOVERED_DATA_USING_PREVIOUS_SECTOR_ID,
+ "Recovered data using previous sector id")
+SENSE_CODE(RECOVERED_DATA_WITHOUT_ECC_DATA_AUTO_REALLOCATED,
+ "Recovered data without ECC - data auto-reallocated")
+SENSE_CODE(RECOVERED_DATA_WITHOUT_ECC_RECOMMEND_REASSIGNMENT,
+ "Recovered data without ECC - recommend reassignment")
+SENSE_CODE(RECOVERED_DATA_WITHOUT_ECC_RECOMMEND_REWRITE,
+ "Recovered data without ECC - recommend rewrite")
+SENSE_CODE(RECOVERED_DATA_WITHOUT_ECC_DATA_REWRITTEN,
+ "Recovered data without ECC - data rewritten")
+
+SENSE_CODE(RECOVERED_DATA_WITH_ERROR_CORRECTION_APPLIED,
+ "Recovered data with error correction applied")
+SENSE_CODE(RECOVERED_DATA_WITH_ERROR_CORRECTION_RETRIES_APPLIED,
+ "Recovered data with error corr. & retries applied")
+SENSE_CODE(RECOVERED_DATA_DATA_AUTO_REALLOCATED,
+ "Recovered data - data auto-reallocated")
+SENSE_CODE(RECOVERED_DATA_WITH_CIRC,
+ "Recovered data with CIRC")
+SENSE_CODE(RECOVERED_DATA_WITH_LEC,
+ "Recovered data with L-EC")
+SENSE_CODE(RECOVERED_DATA_RECOMMEND_REASSIGNMENT,
+ "Recovered data - recommend reassignment")
+SENSE_CODE(RECOVERED_DATA_RECOMMEND_REWRITE,
+ "Recovered data - recommend rewrite")
+SENSE_CODE(RECOVERED_DATA_WITH_ECC_DATA_REWRITTEN,
+ "Recovered data with ECC - data rewritten")
+SENSE_CODE(RECOVERED_DATA_WITH_LINKING,
+ "Recovered data with linking")
+
+SENSE_CODE(DEFECT_LIST_ERROR,
+ "Defect list error")
+SENSE_CODE(DEFECT_LIST_NOT_AVAILABLE,
+ "Defect list not available")
+SENSE_CODE(DEFECT_LIST_ERROR_IN_PRIMARY_LIST,
+ "Defect list error in primary list")
+SENSE_CODE(DEFECT_LIST_ERROR_IN_GROWN_LIST,
+ "Defect list error in grown list")
+
+SENSE_CODE(PARAMETER_LIST_LENGTH_ERROR,
+ "Parameter list length error")
+
+SENSE_CODE(SYNCHRONOUS_DATA_TRANSFER_ERROR,
+ "Synchronous data transfer error")
+
+SENSE_CODE(DEFECT_LIST_NOT_FOUND,
+ "Defect list not found")
+SENSE_CODE(PRIMARY_DEFECT_LIST_NOT_FOUND,
+ "Primary defect list not found")
+SENSE_CODE(GROWN_DEFECT_LIST_NOT_FOUND,
+ "Grown defect list not found")
+
+SENSE_CODE(MISCOMPARE_DURING_VERIFY_OPERATION,
+ "Miscompare during verify operation")
+SENSE_CODE(MISCOMPARE_VERIFY_OF_UNMAPPED_LBA,
+ "Miscompare verify of unmapped LBA")
+
+SENSE_CODE(RECOVERED_ID_WITH_ECC_CORRECTION,
+ "Recovered id with ECC correction")
+
+SENSE_CODE(PARTIAL_DEFECT_LIST_TRANSFER,
+ "Partial defect list transfer")
+
+SENSE_CODE(INVALID_COMMAND_OP_CODE,
+ "Invalid command operation code")
+SENSE_CODE(ACCESS_DENIED_INITIATOR_PENDING_ENROLLED,
+ "Access denied - initiator pending-enrolled")
+SENSE_CODE(ACCESS_DENIED_NO_ACCESS_RIGHTS,
+ "Access denied - no access rights")
+SENSE_CODE(ACCESS_DENIED_INVALID_MGMT_ID_KEY,
+ "Access denied - invalid mgmt id key")
+SENSE_CODE(ILLEGAL_COMMAND_WHILE_IN_WRITE_CAPABLE_STATE,
+ "Illegal command while in write capable state")
+SENSE_CODE(0x2005,
+ "Obsolete")
+SENSE_CODE(ILLEGAL_COMMAND_WHILE_IN_EXPLICIT_ADDRESS_MODE,
+ "Illegal command while in explicit address mode")
+SENSE_CODE(ILLEGAL_COMMAND_WHILE_IN_IMPLICIT_ADDRESS_MODE,
+ "Illegal command while in implicit address mode")
+SENSE_CODE(ACCESS_DENIED_ENROLLMENT_CONFLICT,
+ "Access denied - enrollment conflict")
+SENSE_CODE(ACCESS_DENIED_INVALID_LU_IDENTIFIER,
+ "Access denied - invalid LU identifier")
+SENSE_CODE(ACCESS_DENIED_INVALID_PROXY_TOKEN,
+ "Access denied - invalid proxy token")
+SENSE_CODE(ACCESS_DENIED_ACL_LUN_CONFLICT,
+ "Access denied - ACL LUN conflict")
+SENSE_CODE(ILLEGAL_COMMAND_WHEN_NOT_IN_APPEND_ONLY_MODE,
+ "Illegal command when not in append-only mode")
+SENSE_CODE(NOT_AN_ADMINISTRATIVE_LOGICAL_UNIT,
+ "Not an administrative logical unit")
+SENSE_CODE(NOT_A_SUBSIDIARY_LOGICAL_UNIT,
+ "Not a subsidiary logical unit")
+SENSE_CODE(NOT_A_CONGLOMERATE_LOGICAL_UNIT,
+ "Not a conglomerate logical unit")
+
+SENSE_CODE(LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE,
+ "Logical block address out of range")
+SENSE_CODE(INVALID_ELEMENT_ADDRESS,
+ "Invalid element address")
+SENSE_CODE(INVALID_ADDRESS_FOR_WRITE,
+ "Invalid address for write")
+SENSE_CODE(INVALID_WRITE_CROSSING_LAYER_JUMP,
+ "Invalid write crossing layer jump")
+SENSE_CODE(UNALIGNED_WRITE_COMMAND,
+ "Unaligned write command")
+SENSE_CODE(WRITE_BOUNDARY_VIOLATION,
+ "Write boundary violation")
+SENSE_CODE(ATTEMPT_TO_READ_INVALID_DATA,
+ "Attempt to read invalid data")
+SENSE_CODE(READ_BOUNDARY_VIOLATION,
+ "Read boundary violation")
+SENSE_CODE(MISALIGNED_WRITE_COMMAND,
+ "Misaligned write command")
+SENSE_CODE(ATTEMPT_TO_ACCESS_GAP_ZONE,
+ "Attempt to access gap zone")
+
+SENSE_CODE(ILLEGAL_FUNCTION,
+ "Illegal function (use 20 00, 24 00, or 26 00)")
+
+SENSE_CODE(INVALID_TOKEN_OP,
+ "Invalid token operation, cause not reportable")
+SENSE_CODE(INVALID_TOKEN_OP_UNSUPPORTED_TOKEN_TYPE,
+ "Invalid token operation, unsupported token type")
+SENSE_CODE(INVALID_TOKEN_OP_REMOTE_TOKEN_USAGE_NOT_SUPPORTED,
+ "Invalid token operation, remote token usage not supported")
+SENSE_CODE(INVALID_TOKEN_OP_REMOTE_ROD_TOKEN_CREATION_NOT_SUPPORTED,
+ "Invalid token operation, remote rod token creation not supported")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_UNKNOWN,
+ "Invalid token operation, token unknown")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_CORRUPT,
+ "Invalid token operation, token corrupt")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_REVOKED,
+ "Invalid token operation, token revoked")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_EXPIRED,
+ "Invalid token operation, token expired")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_CANCELLED,
+ "Invalid token operation, token cancelled")
+SENSE_CODE(INVALID_TOKEN_OP_TOKEN_DELETED,
+ "Invalid token operation, token deleted")
+SENSE_CODE(INVALID_TOKEN_OP_INVALID_TOKEN_LENGTH,
+ "Invalid token operation, invalid token length")
+
+SENSE_CODE(INVALID_FIELD_IN_CDB,
+ "Invalid field in cdb")
+SENSE_CODE(CDB_DECRYPTION_ERROR,
+ "CDB decryption error")
+SENSE_CODE(0x2402,
+ "Obsolete")
+SENSE_CODE(0x2403,
+ "Obsolete")
+SENSE_CODE(SECURITY_AUDIT_VALUE_FROZEN,
+ "Security audit value frozen")
+SENSE_CODE(SECURITY_WORKING_KEY_FROZEN,
+ "Security working key frozen")
+SENSE_CODE(NONCE_NOT_UNIQUE,
+ "Nonce not unique")
+SENSE_CODE(NONCE_TIMESTAMP_OUT_OF_RANGE,
+ "Nonce timestamp out of range")
+SENSE_CODE(INVALID_XCDB,
+ "Invalid XCDB")
+SENSE_CODE(INVALID_FAST_FORMAT,
+ "Invalid fast format")
+
+SENSE_CODE(LU_NOT_SUPPORTED,
+ "Logical unit not supported")
+
+SENSE_CODE(INVALID_FIELD_IN_PARAMETER_LIST,
+ "Invalid field in parameter list")
+SENSE_CODE(PARAMETER_NOT_SUPPORTED,
+ "Parameter not supported")
+SENSE_CODE(PARAMETER_VALUE_INVALID,
+ "Parameter value invalid")
+SENSE_CODE(THRESHOLD_PARAMETERS_NOT_SUPPORTED,
+ "Threshold parameters not supported")
+SENSE_CODE(INVALID_RELEASE_OF_PERSISTENT_RESERVATION,
+ "Invalid release of persistent reservation")
+SENSE_CODE(DATA_DECRYPTION_ERROR,
+ "Data decryption error")
+SENSE_CODE(TOO_MANY_TARGET_DESCRIPTORS,
+ "Too many target descriptors")
+SENSE_CODE(UNSUPPORTED_TARGET_DESCRIPTOR_TYPE_CODE,
+ "Unsupported target descriptor type code")
+SENSE_CODE(TOO_MANY_SEGMENT_DESCRIPTORS,
+ "Too many segment descriptors")
+SENSE_CODE(UNSUPPORTED_SEGMENT_DESCRIPTOR_TYPE_CODE,
+ "Unsupported segment descriptor type code")
+SENSE_CODE(UNEXPECTED_INEXACT_SEGMENT,
+ "Unexpected inexact segment")
+SENSE_CODE(INLINE_DATA_LENGTH_EXCEEDED,
+ "Inline data length exceeded")
+SENSE_CODE(INVALID_OP_FOR_COPY_SOURCE_OR_DESTINATION,
+ "Invalid operation for copy source or destination")
+SENSE_CODE(COPY_SEGMENT_GRANULARITY_VIOLATION,
+ "Copy segment granularity violation")
+SENSE_CODE(INVALID_PARAMETER_WHILE_PORT_IS_ENABLED,
+ "Invalid parameter while port is enabled")
+SENSE_CODE(INVALID_DATA_OUT_BUFFER_INTEGRITY_CHECK_VALUE,
+ "Invalid data-out buffer integrity check value")
+SENSE_CODE(DATA_DECRYPTION_KEY_FAIL_LIMIT_REACHED,
+ "Data decryption key fail limit reached")
+SENSE_CODE(INCOMPLETE_KEY_ASSOCIATED_DATA_SET,
+ "Incomplete key-associated data set")
+SENSE_CODE(VENDOR_SPECIFIC_KEY_REFERENCE_NOT_FOUND,
+ "Vendor specific key reference not found")
+SENSE_CODE(APPLICATION_TAG_MODE_PAGE_IS_INVALID,
+ "Application tag mode page is invalid")
+SENSE_CODE(TAPE_STREAM_MIRRORING_PREVENTED,
+ "Tape stream mirroring prevented")
+SENSE_CODE(COPY_SOURCE_OR_COPY_DESTINATION_NOT_AUTHORIZED,
+ "Copy source or copy destination not authorized")
+SENSE_CODE(FAST_COPY_NOT_POSSIBLE,
+ "Fast copy not possible")
+
+SENSE_CODE(WRITE_PROTECTED,
+ "Write protected")
+SENSE_CODE(HW_WRITE_PROTECTED,
+ "Hardware write protected")
+SENSE_CODE(LU_SOFTWARE_WRITE_PROTECTED,
+ "Logical unit software write protected")
+SENSE_CODE(ASSOCIATED_WRITE_PROTECT,
+ "Associated write protect")
+SENSE_CODE(PERSISTENT_WRITE_PROTECT,
+ "Persistent write protect")
+SENSE_CODE(PERMANENT_WRITE_PROTECT,
+ "Permanent write protect")
+SENSE_CODE(CONDITIONAL_WRITE_PROTECT,
+ "Conditional write protect")
+SENSE_CODE(SPACE_ALLOCATION_FAILED_WRITE_PROTECT,
+ "Space allocation failed write protect")
+SENSE_CODE(ZONE_IS_READ_ONLY,
+ "Zone is read only")
+
+SENSE_CODE(NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED,
+ "Not ready to ready change, medium may have changed")
+SENSE_CODE(IMPORT_OR_EXPORT_ELEMENT_ACCESSED,
+ "Import or export element accessed")
+SENSE_CODE(FORMAT_LAYER_MAY_HAVE_CHANGED,
+ "Format-layer may have changed")
+SENSE_CODE(IMPORT_EXPORT_ELEMENT_ACCESSED_MEDIUM_CHANGED,
+ "Import/export element accessed, medium changed")
+
+SENSE_CODE(POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED,
+ "Power on, reset, or bus device reset occurred")
+SENSE_CODE(POWER_ON_OCCURRED,
+ "Power on occurred")
+SENSE_CODE(SCSI_BUS_RESET_OCCURRED,
+ "Scsi bus reset occurred")
+SENSE_CODE(BUS_DEVICE_RESET_FUNCTION_OCCURRED,
+ "Bus device reset function occurred")
+SENSE_CODE(DEVICE_INTERNAL_RESET,
+ "Device internal reset")
+SENSE_CODE(TRANSCEIVER_MODE_CHANGED_TO_SINGLE_ENDED,
+ "Transceiver mode changed to single-ended")
+SENSE_CODE(TRANSCEIVER_MODE_CHANGED_TO_LVD,
+ "Transceiver mode changed to lvd")
+SENSE_CODE(I_T_NEXUS_LOSS_OCCURRED,
+ "I_T nexus loss occurred")
+
+SENSE_CODE(PARAMETERS_CHANGED,
+ "Parameters changed")
+SENSE_CODE(MODE_PARAMETERS_CHANGED,
+ "Mode parameters changed")
+SENSE_CODE(LOG_PARAMETERS_CHANGED,
+ "Log parameters changed")
+SENSE_CODE(RESERVATIONS_PREEMPTED,
+ "Reservations preempted")
+SENSE_CODE(RESERVATIONS_RELEASED,
+ "Reservations released")
+SENSE_CODE(REGISTRATIONS_PREEMPTED,
+ "Registrations preempted")
+SENSE_CODE(ASYMMETRIC_ACCESS_STATE_CHANGED,
+ "Asymmetric access state changed")
+SENSE_CODE(IMPLICIT_ASYMMETRIC_ACCESS_STATE_TRANSITION_FAILED,
+ "Implicit asymmetric access state transition failed")
+SENSE_CODE(PRIORITY_CHANGED,
+ "Priority changed")
+SENSE_CODE(CAPACITY_DATA_HAS_CHANGED,
+ "Capacity data has changed")
+SENSE_CODE(ERROR_HISTORY_I_T_NEXUS_CLEARED,
+ "Error history I_T nexus cleared")
+SENSE_CODE(ERROR_HISTORY_SNAPSHOT_RELEASED,
+ "Error history snapshot released")
+SENSE_CODE(ERROR_RECOVERY_ATTRIBUTES_HAVE_CHANGED,
+ "Error recovery attributes have changed")
+SENSE_CODE(DATA_ENCRYPTION_CAPABILITIES_CHANGED,
+ "Data encryption capabilities changed")
+SENSE_CODE(TIMESTAMP_CHANGED,
+ "Timestamp changed")
+SENSE_CODE(DATA_ENCRYPTION_PARAMS_CHANGED_BY_ANOTHER_I_T_NEXUS,
+ "Data encryption parameters changed by another i_t nexus")
+SENSE_CODE(DATA_ENCRYPTION_PARAMS_CHANGED_BY_VENDOR_SPECIFIC_EVENT,
+ "Data encryption parameters changed by vendor specific event")
+SENSE_CODE(DATA_ENCRYPTION_KEY_INSTANCE_COUNTER_HAS_CHANGED,
+ "Data encryption key instance counter has changed")
+SENSE_CODE(SA_CREATION_CAPABILITIES_DATA_HAS_CHANGED,
+ "SA creation capabilities data has changed")
+SENSE_CODE(MEDIUM_REMOVAL_PREVENTION_PREEMPTED,
+ "Medium removal prevention preempted")
+SENSE_CODE(ZONE_RESET_WRITE_POINTER_RECOMMENDED,
+ "Zone reset write pointer recommended")
+
+SENSE_CODE(COPY_CANNOT_EXECUTE_SINCE_HOST_CANNOT_DISCONNECT,
+ "Copy cannot execute since host cannot disconnect")
+
+SENSE_CODE(COMMAND_SEQUENCE_ERROR,
+ "Command sequence error")
+SENSE_CODE(TOO_MANY_WINDOWS_SPECIFIED,
+ "Too many windows specified")
+SENSE_CODE(INVALID_COMBINATION_OF_WINDOWS_SPECIFIED,
+ "Invalid combination of windows specified")
+SENSE_CODE(CURRENT_PROGRAM_AREA_IS_NOT_EMPTY,
+ "Current program area is not empty")
+SENSE_CODE(CURRENT_PROGRAM_AREA_IS_EMPTY,
+ "Current program area is empty")
+SENSE_CODE(ILLEGAL_POWER_CONDITION_REQUEST,
+ "Illegal power condition request")
+SENSE_CODE(PERSISTENT_PREVENT_CONFLICT,
+ "Persistent prevent conflict")
+SENSE_CODE(PREVIOUS_BUSY_STATUS,
+ "Previous busy status")
+SENSE_CODE(PREVIOUS_TASK_SET_FULL_STATUS,
+ "Previous task set full status")
+SENSE_CODE(PREVIOUS_RESERVATION_CONFLICT_STATUS,
+ "Previous reservation conflict status")
+SENSE_CODE(PARTITION_OR_COLLECTION_CONTAINS_USER_OBJECTS,
+ "Partition or collection contains user objects")
+SENSE_CODE(NOT_RESERVED,
+ "Not reserved")
+SENSE_CODE(ORWRITE_GENERATION_DOES_NOT_MATCH,
+ "Orwrite generation does not match")
+SENSE_CODE(RESET_WRITE_POINTER_NOT_ALLOWED,
+ "Reset write pointer not allowed")
+SENSE_CODE(ZONE_IS_OFFLINE,
+ "Zone is offline")
+SENSE_CODE(STREAM_NOT_OPEN,
+ "Stream not open")
+SENSE_CODE(UNWRITTEN_DATA_IN_ZONE,
+ "Unwritten data in zone")
+SENSE_CODE(DESCRIPTOR_FORMAT_SENSE_DATA_REQUIRED,
+ "Descriptor format sense data required")
+SENSE_CODE(ZONE_IS_INACTIVE,
+ "Zone is inactive")
+SENSE_CODE(WELL_KNOWN_LU_ACCESS_REQUIRED,
+ "Well known logical unit access required")
+
+SENSE_CODE(OVERWRITE_ERROR_ON_UPDATE_IN_PLACE,
+ "Overwrite error on update in place")
+
+SENSE_CODE(INSUFFICIENT_TIME_FOR_OPERATION,
+ "Insufficient time for operation")
+SENSE_CODE(COMMAND_TIMEOUT_BEFORE_PROCESSING,
+ "Command timeout before processing")
+SENSE_CODE(COMMAND_TIMEOUT_DURING_PROCESSING,
+ "Command timeout during processing")
+SENSE_CODE(COMMAND_TIMEOUT_DURING_PROCESSING_DUE_TO_ERROR_RECOVERY,
+ "Command timeout during processing due to error recovery")
+
+SENSE_CODE(COMMANDS_CLEARED_BY_ANOTHER_INITIATOR,
+ "Commands cleared by another initiator")
+SENSE_CODE(COMMANDS_CLEARED_BY_POWER_LOSS_NOTIFICATION,
+ "Commands cleared by power loss notification")
+SENSE_CODE(COMMANDS_CLEARED_BY_DEVICE_SERVER,
+ "Commands cleared by device server")
+SENSE_CODE(SOME_COMMANDS_CLEARED_BY_QUEUING_LAYER_EVENT,
+ "Some commands cleared by queuing layer event")
+
+SENSE_CODE(INCOMPATIBLE_MEDIUM_INSTALLED,
+ "Incompatible medium installed")
+SENSE_CODE(CANNOT_READ_MEDIUM_UNKNOWN_FORMAT,
+ "Cannot read medium - unknown format")
+SENSE_CODE(CANNOT_READ_MEDIUM_INCOMPATIBLE_FORMAT,
+ "Cannot read medium - incompatible format")
+SENSE_CODE(CLEANING_CARTRIDGE_INSTALLED,
+ "Cleaning cartridge installed")
+SENSE_CODE(CANNOT_WRITE_MEDIUM_UNKNOWN_FORMAT,
+ "Cannot write medium - unknown format")
+SENSE_CODE(CANNOT_WRITE_MEDIUM_INCOMPATIBLE_FORMAT,
+ "Cannot write medium - incompatible format")
+SENSE_CODE(CANNOT_FORMAT_MEDIUM_INCOMPATIBLE_MEDIUM,
+ "Cannot format medium - incompatible medium")
+SENSE_CODE(CLEANING_FAILURE,
+ "Cleaning failure")
+SENSE_CODE(CANNOT_WRITE_APPLICATION_CODE_MISMATCH,
+ "Cannot write - application code mismatch")
+SENSE_CODE(CURRENT_SESSION_NOT_FIXATED_FOR_APPEND,
+ "Current session not fixated for append")
+SENSE_CODE(CLEANING_REQUEST_REJECTED,
+ "Cleaning request rejected")
+SENSE_CODE(WORM_MEDIUM_OVERWRITE_ATTEMPTED,
+ "WORM medium - overwrite attempted")
+SENSE_CODE(WORM_MEDIUM_INTEGRITY_CHECK,
+ "WORM medium - integrity check")
+SENSE_CODE(MEDIUM_NOT_FORMATTED,
+ "Medium not formatted")
+SENSE_CODE(INCOMPATIBLE_VOLUME_TYPE,
+ "Incompatible volume type")
+SENSE_CODE(INCOMPATIBLE_VOLUME_QUALIFIER,
+ "Incompatible volume qualifier")
+SENSE_CODE(CLEANING_VOLUME_EXPIRED,
+ "Cleaning volume expired")
+
+SENSE_CODE(MEDIUM_FORMAT_CORRUPTED,
+ "Medium format corrupted")
+SENSE_CODE(FORMAT_COMMAND_FAILED,
+ "Format command failed")
+SENSE_CODE(ZONED_FORMATTING_FAILED_DUE_TO_SPARE_LINKING,
+ "Zoned formatting failed due to spare linking")
+SENSE_CODE(SANITIZE_COMMAND_FAILED,
+ "Sanitize command failed")
+SENSE_CODE(DEPOPULATION_FAILED,
+ "Depopulation failed")
+SENSE_CODE(DEPOPULATION_RESTORATION_FAILED,
+ "Depopulation restoration failed")
+
+SENSE_CODE(NO_DEFECT_SPARE_LOCATION_AVAILABLE,
+ "No defect spare location available")
+SENSE_CODE(DEFECT_LIST_UPDATE_FAILURE,
+ "Defect list update failure")
+
+SENSE_CODE(TAPE_LENGTH_ERROR,
+ "Tape length error")
+
+SENSE_CODE(ENCLOSURE_FAILURE,
+ "Enclosure failure")
+
+SENSE_CODE(ENCLOSURE_SERVICES_FAILURE,
+ "Enclosure services failure")
+SENSE_CODE(UNSUPPORTED_ENCLOSURE_FUNCTION,
+ "Unsupported enclosure function")
+SENSE_CODE(ENCLOSURE_SERVICES_UNAVAILABLE,
+ "Enclosure services unavailable")
+SENSE_CODE(ENCLOSURE_SERVICES_TRANSFER_FAILURE,
+ "Enclosure services transfer failure")
+SENSE_CODE(ENCLOSURE_SERVICES_TRANSFER_REFUSED,
+ "Enclosure services transfer refused")
+SENSE_CODE(ENCLOSURE_SERVICES_CHECKSUM_ERROR,
+ "Enclosure services checksum error")
+
+SENSE_CODE(RIBBON_INK_OR_TONER_FAILURE,
+ "Ribbon, ink, or toner failure")
+
+SENSE_CODE(ROUNDED_PARAMETER,
+ "Rounded parameter")
+
+SENSE_CODE(EVENT_STATUS_NOTIFICATION,
+ "Event status notification")
+SENSE_CODE(ESN_POWER_MANAGEMENT_CLASS_EVENT,
+ "Esn - power management class event")
+SENSE_CODE(ESN_MEDIA_CLASS_EVENT,
+ "Esn - media class event")
+SENSE_CODE(ESN_DEVICE_BUSY_CLASS_EVENT,
+ "Esn - device busy class event")
+SENSE_CODE(THIN_PROVISIONING_SOFT_THRESHOLD_REACHED,
+ "Thin Provisioning soft threshold reached")
+SENSE_CODE(DEPOPULATION_INTERRUPTED,
+ "Depopulation interrupted")
+SENSE_CODE(DEPOPULATION_RESTORATION_INTERRUPTED,
+ "Depopulation restoration interrupted")
+
+SENSE_CODE(SAVING_PARAMETERS_NOT_SUPPORTED,
+ "Saving parameters not supported")
+
+SENSE_CODE(MEDIUM_NOT_PRESENT,
+ "Medium not present")
+SENSE_CODE(MEDIUM_NOT_PRESENT_TRAY_CLOSED,
+ "Medium not present - tray closed")
+SENSE_CODE(MEDIUM_NOT_PRESENT_TRAY_OPEN,
+ "Medium not present - tray open")
+SENSE_CODE(MEDIUM_NOT_PRESENT_LOADABLE,
+ "Medium not present - loadable")
+SENSE_CODE(MEDIUM_NOT_PRESENT_MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE,
+ "Medium not present - medium auxiliary memory accessible")
+
+SENSE_CODE(SEQUENTIAL_POSITIONING_ERROR,
+ "Sequential positioning error")
+SENSE_CODE(TAPE_POSITION_ERROR_AT_BEGINNING_OF_MEDIUM,
+ "Tape position error at beginning-of-medium")
+SENSE_CODE(TAPE_POSITION_ERROR_AT_END_OF_MEDIUM,
+ "Tape position error at end-of-medium")
+SENSE_CODE(TAPE_OR_ELECTRONIC_VERTICAL_FORMS_UNIT_NOT_READY,
+ "Tape or electronic vertical forms unit not ready")
+SENSE_CODE(SLEW_FAILURE,
+ "Slew failure")
+SENSE_CODE(PAPER_JAM,
+ "Paper jam")
+SENSE_CODE(FAILED_TO_SENSE_TOP_OF_FORM,
+ "Failed to sense top-of-form")
+SENSE_CODE(FAILED_TO_SENSE_BOTTOM_OF_FORM,
+ "Failed to sense bottom-of-form")
+SENSE_CODE(REPOSITION_ERROR,
+ "Reposition error")
+SENSE_CODE(READ_PAST_END_OF_MEDIUM,
+ "Read past end of medium")
+SENSE_CODE(READ_PAST_BEGINNING_OF_MEDIUM,
+ "Read past beginning of medium")
+SENSE_CODE(POSITION_PAST_END_OF_MEDIUM,
+ "Position past end of medium")
+SENSE_CODE(POSITION_PAST_BEGINNING_OF_MEDIUM,
+ "Position past beginning of medium")
+SENSE_CODE(MEDIUM_DESTINATION_ELEMENT_FULL,
+ "Medium destination element full")
+SENSE_CODE(MEDIUM_SOURCE_ELEMENT_EMPTY,
+ "Medium source element empty")
+SENSE_CODE(END_OF_MEDIUM_REACHED,
+ "End of medium reached")
+SENSE_CODE(MEDIUM_MAGAZINE_NOT_ACCESSIBLE,
+ "Medium magazine not accessible")
+SENSE_CODE(MEDIUM_MAGAZINE_REMOVED,
+ "Medium magazine removed")
+SENSE_CODE(MEDIUM_MAGAZINE_INSERTED,
+ "Medium magazine inserted")
+SENSE_CODE(MEDIUM_MAGAZINE_LOCKED,
+ "Medium magazine locked")
+SENSE_CODE(MEDIUM_MAGAZINE_UNLOCKED,
+ "Medium magazine unlocked")
+SENSE_CODE(MECHANICAL_POSITIONING_OR_CHANGER_ERROR,
+ "Mechanical positioning or changer error")
+SENSE_CODE(READ_PAST_END_OF_USER_OBJECT,
+ "Read past end of user object")
+SENSE_CODE(ELEMENT_DISABLED,
+ "Element disabled")
+SENSE_CODE(ELEMENT_ENABLED,
+ "Element enabled")
+SENSE_CODE(DATA_TRANSFER_DEVICE_REMOVED,
+ "Data transfer device removed")
+SENSE_CODE(DATA_TRANSFER_DEVICE_INSERTED,
+ "Data transfer device inserted")
+SENSE_CODE(TOO_MANY_LOGICAL_OBJECTS_ON_PARTITION_TO_SUPPORT_OP,
+ "Too many logical objects on partition to support operation")
+SENSE_CODE(ELEMENT_STATIC_INFORMATION_CHANGED,
+ "Element static information changed")
+
+SENSE_CODE(INVALID_BITS_IN_IDENTIFY_MESSAGE,
+ "Invalid bits in identify message")
+
+SENSE_CODE(LU_HAS_NOT_SELF_CONFIGURED_YET,
+ "Logical unit has not self-configured yet")
+SENSE_CODE(LU_FAILURE,
+ "Logical unit failure")
+SENSE_CODE(TIMEOUT_ON_LOGICAL_UNIT,
+ "Timeout on logical unit")
+SENSE_CODE(LU_FAILED_SELF_TEST,
+ "Logical unit failed self-test")
+SENSE_CODE(LU_UNABLE_TO_UPDATE_SELFTEST_LOG,
+ "Logical unit unable to update self-test log")
+
+SENSE_CODE(TARGET_OPERATING_CONDITIONS_HAVE_CHANGED,
+ "Target operating conditions have changed")
+SENSE_CODE(MICROCODE_HAS_BEEN_CHANGED,
+ "Microcode has been changed")
+SENSE_CODE(CHANGED_OPERATING_DEFINITION,
+ "Changed operating definition")
+SENSE_CODE(INQUIRY_DATA_HAS_CHANGED,
+ "Inquiry data has changed")
+SENSE_CODE(COMPONENT_DEVICE_ATTACHED,
+ "Component device attached")
+SENSE_CODE(DEVICE_IDENTIFIER_CHANGED,
+ "Device identifier changed")
+SENSE_CODE(REDUNDANCY_GROUP_CREATED_OR_MODIFIED,
+ "Redundancy group created or modified")
+SENSE_CODE(REDUNDANCY_GROUP_DELETED,
+ "Redundancy group deleted")
+SENSE_CODE(SPARE_CREATED_OR_MODIFIED,
+ "Spare created or modified")
+SENSE_CODE(SPARE_DELETED,
+ "Spare deleted")
+SENSE_CODE(VOLUME_SET_CREATED_OR_MODIFIED,
+ "Volume set created or modified")
+SENSE_CODE(VOLUME_SET_DELETED,
+ "Volume set deleted")
+SENSE_CODE(VOLUME_SET_DEASSIGNED,
+ "Volume set deassigned")
+SENSE_CODE(VOLUME_SET_REASSIGNED,
+ "Volume set reassigned")
+SENSE_CODE(REPORTED_LUNS_DATA_HAS_CHANGED,
+ "Reported luns data has changed")
+SENSE_CODE(ECHO_BUFFER_OVERWRITTEN,
+ "Echo buffer overwritten")
+SENSE_CODE(MEDIUM_LOADABLE,
+ "Medium loadable")
+SENSE_CODE(MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE,
+ "Medium auxiliary memory accessible")
+SENSE_CODE(iSCSI_IP_ADDRESS_ADDED,
+ "iSCSI IP address added")
+SENSE_CODE(iSCSI_IP_ADDRESS_REMOVED,
+ "iSCSI IP address removed")
+SENSE_CODE(iSCSI_IP_ADDRESS_CHANGED,
+ "iSCSI IP address changed")
+SENSE_CODE(INSPECT_REFERRALS_SENSE_DESCRIPTORS,
+ "Inspect referrals sense descriptors")
+SENSE_CODE(MICROCODE_HAS_BEEN_CHANGED_WITHOUT_RESET,
+ "Microcode has been changed without reset")
+SENSE_CODE(ZONE_TRANSITION_TO_FULL,
+ "Zone transition to full")
+SENSE_CODE(BIND_COMPLETED,
+ "Bind completed")
+SENSE_CODE(BIND_REDIRECTED,
+ "Bind redirected")
+SENSE_CODE(SUBSIDIARY_BINDING_CHANGED,
+ "Subsidiary binding changed")
/*
- * SENSE_CODE(0x40NN, "Ram failure")
- * SENSE_CODE(0x40NN, "Diagnostic failure on component nn")
- * SENSE_CODE(0x41NN, "Data path failure")
- * SENSE_CODE(0x42NN, "Power-on or self-test failure")
+ * SENSE_CODE(0x40NN, "Ram failure")
+ * SENSE_CODE(0x40NN, "Diagnostic failure on component nn")
+ *
+ * SENSE_CODE(0x41NN, "Data path failure")
+ *
+ * SENSE_CODE(0x42NN, "Power-on or self-test failure")
*/
-SENSE_CODE(0x4300, "Message error")
-
-SENSE_CODE(0x4400, "Internal target failure")
-SENSE_CODE(0x4401, "Persistent reservation information lost")
-SENSE_CODE(0x4471, "ATA device failed set features")
-
-SENSE_CODE(0x4500, "Select or reselect failure")
-
-SENSE_CODE(0x4600, "Unsuccessful soft reset")
-
-SENSE_CODE(0x4700, "Scsi parity error")
-SENSE_CODE(0x4701, "Data phase CRC error detected")
-SENSE_CODE(0x4702, "Scsi parity error detected during st data phase")
-SENSE_CODE(0x4703, "Information unit iuCRC error detected")
-SENSE_CODE(0x4704, "Asynchronous information protection error detected")
-SENSE_CODE(0x4705, "Protocol service CRC error")
-SENSE_CODE(0x4706, "Phy test function in progress")
-SENSE_CODE(0x477f, "Some commands cleared by iSCSI Protocol event")
-
-SENSE_CODE(0x4800, "Initiator detected error message received")
-
-SENSE_CODE(0x4900, "Invalid message error")
-
-SENSE_CODE(0x4A00, "Command phase error")
-
-SENSE_CODE(0x4B00, "Data phase error")
-SENSE_CODE(0x4B01, "Invalid target port transfer tag received")
-SENSE_CODE(0x4B02, "Too much write data")
-SENSE_CODE(0x4B03, "Ack/nak timeout")
-SENSE_CODE(0x4B04, "Nak received")
-SENSE_CODE(0x4B05, "Data offset error")
-SENSE_CODE(0x4B06, "Initiator response timeout")
-SENSE_CODE(0x4B07, "Connection lost")
-SENSE_CODE(0x4B08, "Data-in buffer overflow - data buffer size")
-SENSE_CODE(0x4B09, "Data-in buffer overflow - data buffer descriptor area")
-SENSE_CODE(0x4B0A, "Data-in buffer error")
-SENSE_CODE(0x4B0B, "Data-out buffer overflow - data buffer size")
-SENSE_CODE(0x4B0C, "Data-out buffer overflow - data buffer descriptor area")
-SENSE_CODE(0x4B0D, "Data-out buffer error")
-SENSE_CODE(0x4B0E, "PCIe fabric error")
-SENSE_CODE(0x4B0F, "PCIe completion timeout")
-SENSE_CODE(0x4B10, "PCIe completer abort")
-SENSE_CODE(0x4B11, "PCIe poisoned tlp received")
-SENSE_CODE(0x4B12, "PCIe eCRC check failed")
-SENSE_CODE(0x4B13, "PCIe unsupported request")
-SENSE_CODE(0x4B14, "PCIe acs violation")
-SENSE_CODE(0x4B15, "PCIe tlp prefix blocked")
-
-SENSE_CODE(0x4C00, "Logical unit failed self-configuration")
+
+SENSE_CODE(MESSAGE_ERROR,
+ "Message error")
+
+SENSE_CODE(INTERNAL_TARGET_FAILURE,
+ "Internal target failure")
+SENSE_CODE(PERSISTENT_RESERVATION_INFORMATION_LOST,
+ "Persistent reservation information lost")
+SENSE_CODE(ATA_DEVICE_FAILED_SET_FEATURES,
+ "ATA device failed set features")
+
+SENSE_CODE(SELECT_OR_RESELECT_FAILURE,
+ "Select or reselect failure")
+
+SENSE_CODE(UNSUCCESSFUL_SOFT_RESET,
+ "Unsuccessful soft reset")
+
+SENSE_CODE(SCSI_PARITY_ERROR,
+ "Scsi parity error")
+SENSE_CODE(DATA_PHASE_CRC_ERROR_DETECTED,
+ "Data phase CRC error detected")
+SENSE_CODE(SCSI_PARITY_ERROR_DETECTED_DURING_ST_DATA_PHASE,
+ "Scsi parity error detected during st data phase")
+SENSE_CODE(INFORMATION_UNIT_iuCRC_ERROR_DETECTED,
+ "Information unit iuCRC error detected")
+SENSE_CODE(ASYNCHRONOUS_INFORMATION_PROTECTION_ERROR_DETECTED,
+ "Asynchronous information protection error detected")
+SENSE_CODE(PROTOCOL_SERVICE_CRC_ERROR,
+ "Protocol service CRC error")
+SENSE_CODE(PHY_TEST_FUNCTION_IN_PROGRESS,
+ "Phy test function in progress")
+SENSE_CODE(SOME_COMMANDS_CLEARED_BY_ISCSI_PROTOCOL_EVENT,
+ "Some commands cleared by iSCSI Protocol event")
+
+SENSE_CODE(INITIATOR_DETECTED_ERROR_MESSAGE_RECEIVED,
+ "Initiator detected error message received")
+
+SENSE_CODE(INVALID_MESSAGE_ERROR,
+ "Invalid message error")
+
+SENSE_CODE(COMMAND_PHASE_ERROR,
+ "Command phase error")
+
+SENSE_CODE(DATA_PHASE_ERROR,
+ "Data phase error")
+SENSE_CODE(INVALID_TARGET_PORT_TRANSFER_TAG_RECEIVED,
+ "Invalid target port transfer tag received")
+SENSE_CODE(TOO_MUCH_WRITE_DATA,
+ "Too much write data")
+SENSE_CODE(ACK_NAK_TIMEOUT,
+ "Ack/nak timeout")
+SENSE_CODE(NAK_RECEIVED,
+ "Nak received")
+SENSE_CODE(DATA_OFFSET_ERROR,
+ "Data offset error")
+SENSE_CODE(INITIATOR_RESPONSE_TIMEOUT,
+ "Initiator response timeout")
+SENSE_CODE(CONNECTION_LOST,
+ "Connection lost")
+SENSE_CODE(DATA_IN_BUFFER_OVERFLOW_BUFFER_SIZE,
+ "Data-in buffer overflow - data buffer size")
+SENSE_CODE(DATA_IN_BUFFER_OVERFLOW_BUFFER_DESCRIPTOR_AREA,
+ "Data-in buffer overflow - data buffer descriptor area")
+SENSE_CODE(DATA_IN_BUFFER_ERROR,
+ "Data-in buffer error")
+SENSE_CODE(DATA_OUT_BUFFER_OVERFLOW_BUFFER_SIZE,
+ "Data-out buffer overflow - data buffer size")
+SENSE_CODE(DATA_OUT_BUFFER_OVERFLOW_BUFFER_DESCRIPTOR_AREA,
+ "Data-out buffer overflow - data buffer descriptor area")
+SENSE_CODE(DATA_OUT_BUFFER_ERROR,
+ "Data-out buffer error")
+SENSE_CODE(PCIE_FABRIC_ERROR,
+ "PCIe fabric error")
+SENSE_CODE(PCIE_COMPLETION_TIMEOUT,
+ "PCIe completion timeout")
+SENSE_CODE(PCIE_COMPLETER_ABORT,
+ "PCIe completer abort")
+SENSE_CODE(PCIE_POISONED_TLP_RECEIVED,
+ "PCIe poisoned tlp received")
+SENSE_CODE(PCIE_ECRC_CHECK_FAILED,
+ "PCIe eCRC check failed")
+SENSE_CODE(PCIE_UNSUPPORTED_REQUEST,
+ "PCIe unsupported request")
+SENSE_CODE(PCIE_ACS_VIOLATION,
+ "PCIe acs violation")
+SENSE_CODE(PCIE_TLP_PREFIX_BLOCKED,
+ "PCIe tlp prefix blocked")
+
+SENSE_CODE(LU_FAILED_SELF_CONFIGURATION,
+ "Logical unit failed self-configuration")
+
/*
- * SENSE_CODE(0x4DNN, "Tagged overlapped commands (nn = queue tag)")
+ * SENSE_CODE(0x4DNN, "Tagged overlapped commands (nn = queue tag)")
*/
-SENSE_CODE(0x4E00, "Overlapped commands attempted")
-
-SENSE_CODE(0x5000, "Write append error")
-SENSE_CODE(0x5001, "Write append position error")
-SENSE_CODE(0x5002, "Position error related to timing")
-
-SENSE_CODE(0x5100, "Erase failure")
-SENSE_CODE(0x5101, "Erase failure - incomplete erase operation detected")
-
-SENSE_CODE(0x5200, "Cartridge fault")
-
-SENSE_CODE(0x5300, "Media load or eject failed")
-SENSE_CODE(0x5301, "Unload tape failure")
-SENSE_CODE(0x5302, "Medium removal prevented")
-SENSE_CODE(0x5303, "Medium removal prevented by data transfer element")
-SENSE_CODE(0x5304, "Medium thread or unthread failure")
-SENSE_CODE(0x5305, "Volume identifier invalid")
-SENSE_CODE(0x5306, "Volume identifier missing")
-SENSE_CODE(0x5307, "Duplicate volume identifier")
-SENSE_CODE(0x5308, "Element status unknown")
-SENSE_CODE(0x5309, "Data transfer device error - load failed")
-SENSE_CODE(0x530a, "Data transfer device error - unload failed")
-SENSE_CODE(0x530b, "Data transfer device error - unload missing")
-SENSE_CODE(0x530c, "Data transfer device error - eject failed")
-SENSE_CODE(0x530d, "Data transfer device error - library communication failed")
-
-SENSE_CODE(0x5400, "Scsi to host system interface failure")
-
-SENSE_CODE(0x5500, "System resource failure")
-SENSE_CODE(0x5501, "System buffer full")
-SENSE_CODE(0x5502, "Insufficient reservation resources")
-SENSE_CODE(0x5503, "Insufficient resources")
-SENSE_CODE(0x5504, "Insufficient registration resources")
-SENSE_CODE(0x5505, "Insufficient access control resources")
-SENSE_CODE(0x5506, "Auxiliary memory out of space")
-SENSE_CODE(0x5507, "Quota error")
-SENSE_CODE(0x5508, "Maximum number of supplemental decryption keys exceeded")
-SENSE_CODE(0x5509, "Medium auxiliary memory not accessible")
-SENSE_CODE(0x550A, "Data currently unavailable")
-SENSE_CODE(0x550B, "Insufficient power for operation")
-SENSE_CODE(0x550C, "Insufficient resources to create rod")
-SENSE_CODE(0x550D, "Insufficient resources to create rod token")
-SENSE_CODE(0x550E, "Insufficient zone resources")
-SENSE_CODE(0x550F, "Insufficient zone resources to complete write")
-SENSE_CODE(0x5510, "Maximum number of streams open")
-SENSE_CODE(0x5511, "Insufficient resources to bind")
-
-SENSE_CODE(0x5700, "Unable to recover table-of-contents")
-
-SENSE_CODE(0x5800, "Generation does not exist")
-
-SENSE_CODE(0x5900, "Updated block read")
-
-SENSE_CODE(0x5A00, "Operator request or state change input")
-SENSE_CODE(0x5A01, "Operator medium removal request")
-SENSE_CODE(0x5A02, "Operator selected write protect")
-SENSE_CODE(0x5A03, "Operator selected write permit")
-
-SENSE_CODE(0x5B00, "Log exception")
-SENSE_CODE(0x5B01, "Threshold condition met")
-SENSE_CODE(0x5B02, "Log counter at maximum")
-SENSE_CODE(0x5B03, "Log list codes exhausted")
-
-SENSE_CODE(0x5C00, "Rpl status change")
-SENSE_CODE(0x5C01, "Spindles synchronized")
-SENSE_CODE(0x5C02, "Spindles not synchronized")
-
-SENSE_CODE(0x5D00, "Failure prediction threshold exceeded")
-SENSE_CODE(0x5D01, "Media failure prediction threshold exceeded")
-SENSE_CODE(0x5D02, "Logical unit failure prediction threshold exceeded")
-SENSE_CODE(0x5D03, "Spare area exhaustion prediction threshold exceeded")
-SENSE_CODE(0x5D10, "Hardware impending failure general hard drive failure")
-SENSE_CODE(0x5D11, "Hardware impending failure drive error rate too high")
-SENSE_CODE(0x5D12, "Hardware impending failure data error rate too high")
-SENSE_CODE(0x5D13, "Hardware impending failure seek error rate too high")
-SENSE_CODE(0x5D14, "Hardware impending failure too many block reassigns")
-SENSE_CODE(0x5D15, "Hardware impending failure access times too high")
-SENSE_CODE(0x5D16, "Hardware impending failure start unit times too high")
-SENSE_CODE(0x5D17, "Hardware impending failure channel parametrics")
-SENSE_CODE(0x5D18, "Hardware impending failure controller detected")
-SENSE_CODE(0x5D19, "Hardware impending failure throughput performance")
-SENSE_CODE(0x5D1A, "Hardware impending failure seek time performance")
-SENSE_CODE(0x5D1B, "Hardware impending failure spin-up retry count")
-SENSE_CODE(0x5D1C, "Hardware impending failure drive calibration retry count")
-SENSE_CODE(0x5D20, "Controller impending failure general hard drive failure")
-SENSE_CODE(0x5D21, "Controller impending failure drive error rate too high")
-SENSE_CODE(0x5D22, "Controller impending failure data error rate too high")
-SENSE_CODE(0x5D23, "Controller impending failure seek error rate too high")
-SENSE_CODE(0x5D24, "Controller impending failure too many block reassigns")
-SENSE_CODE(0x5D25, "Controller impending failure access times too high")
-SENSE_CODE(0x5D26, "Controller impending failure start unit times too high")
-SENSE_CODE(0x5D27, "Controller impending failure channel parametrics")
-SENSE_CODE(0x5D28, "Controller impending failure controller detected")
-SENSE_CODE(0x5D29, "Controller impending failure throughput performance")
-SENSE_CODE(0x5D2A, "Controller impending failure seek time performance")
-SENSE_CODE(0x5D2B, "Controller impending failure spin-up retry count")
-SENSE_CODE(0x5D2C, "Controller impending failure drive calibration retry count")
-SENSE_CODE(0x5D30, "Data channel impending failure general hard drive failure")
-SENSE_CODE(0x5D31, "Data channel impending failure drive error rate too high")
-SENSE_CODE(0x5D32, "Data channel impending failure data error rate too high")
-SENSE_CODE(0x5D33, "Data channel impending failure seek error rate too high")
-SENSE_CODE(0x5D34, "Data channel impending failure too many block reassigns")
-SENSE_CODE(0x5D35, "Data channel impending failure access times too high")
-SENSE_CODE(0x5D36, "Data channel impending failure start unit times too high")
-SENSE_CODE(0x5D37, "Data channel impending failure channel parametrics")
-SENSE_CODE(0x5D38, "Data channel impending failure controller detected")
-SENSE_CODE(0x5D39, "Data channel impending failure throughput performance")
-SENSE_CODE(0x5D3A, "Data channel impending failure seek time performance")
-SENSE_CODE(0x5D3B, "Data channel impending failure spin-up retry count")
-SENSE_CODE(0x5D3C, "Data channel impending failure drive calibration retry count")
-SENSE_CODE(0x5D40, "Servo impending failure general hard drive failure")
-SENSE_CODE(0x5D41, "Servo impending failure drive error rate too high")
-SENSE_CODE(0x5D42, "Servo impending failure data error rate too high")
-SENSE_CODE(0x5D43, "Servo impending failure seek error rate too high")
-SENSE_CODE(0x5D44, "Servo impending failure too many block reassigns")
-SENSE_CODE(0x5D45, "Servo impending failure access times too high")
-SENSE_CODE(0x5D46, "Servo impending failure start unit times too high")
-SENSE_CODE(0x5D47, "Servo impending failure channel parametrics")
-SENSE_CODE(0x5D48, "Servo impending failure controller detected")
-SENSE_CODE(0x5D49, "Servo impending failure throughput performance")
-SENSE_CODE(0x5D4A, "Servo impending failure seek time performance")
-SENSE_CODE(0x5D4B, "Servo impending failure spin-up retry count")
-SENSE_CODE(0x5D4C, "Servo impending failure drive calibration retry count")
-SENSE_CODE(0x5D50, "Spindle impending failure general hard drive failure")
-SENSE_CODE(0x5D51, "Spindle impending failure drive error rate too high")
-SENSE_CODE(0x5D52, "Spindle impending failure data error rate too high")
-SENSE_CODE(0x5D53, "Spindle impending failure seek error rate too high")
-SENSE_CODE(0x5D54, "Spindle impending failure too many block reassigns")
-SENSE_CODE(0x5D55, "Spindle impending failure access times too high")
-SENSE_CODE(0x5D56, "Spindle impending failure start unit times too high")
-SENSE_CODE(0x5D57, "Spindle impending failure channel parametrics")
-SENSE_CODE(0x5D58, "Spindle impending failure controller detected")
-SENSE_CODE(0x5D59, "Spindle impending failure throughput performance")
-SENSE_CODE(0x5D5A, "Spindle impending failure seek time performance")
-SENSE_CODE(0x5D5B, "Spindle impending failure spin-up retry count")
-SENSE_CODE(0x5D5C, "Spindle impending failure drive calibration retry count")
-SENSE_CODE(0x5D60, "Firmware impending failure general hard drive failure")
-SENSE_CODE(0x5D61, "Firmware impending failure drive error rate too high")
-SENSE_CODE(0x5D62, "Firmware impending failure data error rate too high")
-SENSE_CODE(0x5D63, "Firmware impending failure seek error rate too high")
-SENSE_CODE(0x5D64, "Firmware impending failure too many block reassigns")
-SENSE_CODE(0x5D65, "Firmware impending failure access times too high")
-SENSE_CODE(0x5D66, "Firmware impending failure start unit times too high")
-SENSE_CODE(0x5D67, "Firmware impending failure channel parametrics")
-SENSE_CODE(0x5D68, "Firmware impending failure controller detected")
-SENSE_CODE(0x5D69, "Firmware impending failure throughput performance")
-SENSE_CODE(0x5D6A, "Firmware impending failure seek time performance")
-SENSE_CODE(0x5D6B, "Firmware impending failure spin-up retry count")
-SENSE_CODE(0x5D6C, "Firmware impending failure drive calibration retry count")
-SENSE_CODE(0x5D73, "Media impending failure endurance limit met")
-SENSE_CODE(0x5DFF, "Failure prediction threshold exceeded (false)")
-
-SENSE_CODE(0x5E00, "Low power condition on")
-SENSE_CODE(0x5E01, "Idle condition activated by timer")
-SENSE_CODE(0x5E02, "Standby condition activated by timer")
-SENSE_CODE(0x5E03, "Idle condition activated by command")
-SENSE_CODE(0x5E04, "Standby condition activated by command")
-SENSE_CODE(0x5E05, "Idle_b condition activated by timer")
-SENSE_CODE(0x5E06, "Idle_b condition activated by command")
-SENSE_CODE(0x5E07, "Idle_c condition activated by timer")
-SENSE_CODE(0x5E08, "Idle_c condition activated by command")
-SENSE_CODE(0x5E09, "Standby_y condition activated by timer")
-SENSE_CODE(0x5E0A, "Standby_y condition activated by command")
-SENSE_CODE(0x5E41, "Power state change to active")
-SENSE_CODE(0x5E42, "Power state change to idle")
-SENSE_CODE(0x5E43, "Power state change to standby")
-SENSE_CODE(0x5E45, "Power state change to sleep")
-SENSE_CODE(0x5E47, "Power state change to device control")
-
-SENSE_CODE(0x6000, "Lamp failure")
-
-SENSE_CODE(0x6100, "Video acquisition error")
-SENSE_CODE(0x6101, "Unable to acquire video")
-SENSE_CODE(0x6102, "Out of focus")
-
-SENSE_CODE(0x6200, "Scan head positioning error")
-
-SENSE_CODE(0x6300, "End of user area encountered on this track")
-SENSE_CODE(0x6301, "Packet does not fit in available space")
-
-SENSE_CODE(0x6400, "Illegal mode for this track")
-SENSE_CODE(0x6401, "Invalid packet size")
-
-SENSE_CODE(0x6500, "Voltage fault")
-
-SENSE_CODE(0x6600, "Automatic document feeder cover up")
-SENSE_CODE(0x6601, "Automatic document feeder lift up")
-SENSE_CODE(0x6602, "Document jam in automatic document feeder")
-SENSE_CODE(0x6603, "Document miss feed automatic in document feeder")
-
-SENSE_CODE(0x6700, "Configuration failure")
-SENSE_CODE(0x6701, "Configuration of incapable logical units failed")
-SENSE_CODE(0x6702, "Add logical unit failed")
-SENSE_CODE(0x6703, "Modification of logical unit failed")
-SENSE_CODE(0x6704, "Exchange of logical unit failed")
-SENSE_CODE(0x6705, "Remove of logical unit failed")
-SENSE_CODE(0x6706, "Attachment of logical unit failed")
-SENSE_CODE(0x6707, "Creation of logical unit failed")
-SENSE_CODE(0x6708, "Assign failure occurred")
-SENSE_CODE(0x6709, "Multiply assigned logical unit")
-SENSE_CODE(0x670A, "Set target port groups command failed")
-SENSE_CODE(0x670B, "ATA device feature not enabled")
-SENSE_CODE(0x670C, "Command rejected")
-SENSE_CODE(0x670D, "Explicit bind not allowed")
-
-SENSE_CODE(0x6800, "Logical unit not configured")
-SENSE_CODE(0x6801, "Subsidiary logical unit not configured")
-
-SENSE_CODE(0x6900, "Data loss on logical unit")
-SENSE_CODE(0x6901, "Multiple logical unit failures")
-SENSE_CODE(0x6902, "Parity/data mismatch")
-
-SENSE_CODE(0x6A00, "Informational, refer to log")
-
-SENSE_CODE(0x6B00, "State change has occurred")
-SENSE_CODE(0x6B01, "Redundancy level got better")
-SENSE_CODE(0x6B02, "Redundancy level got worse")
-
-SENSE_CODE(0x6C00, "Rebuild failure occurred")
-
-SENSE_CODE(0x6D00, "Recalculate failure occurred")
-
-SENSE_CODE(0x6E00, "Command to logical unit failed")
-
-SENSE_CODE(0x6F00, "Copy protection key exchange failure - authentication failure")
-SENSE_CODE(0x6F01, "Copy protection key exchange failure - key not present")
-SENSE_CODE(0x6F02, "Copy protection key exchange failure - key not established")
-SENSE_CODE(0x6F03, "Read of scrambled sector without authentication")
-SENSE_CODE(0x6F04, "Media region code is mismatched to logical unit region")
-SENSE_CODE(0x6F05, "Drive region must be permanent/region reset count error")
-SENSE_CODE(0x6F06, "Insufficient block count for binding nonce recording")
-SENSE_CODE(0x6F07, "Conflict in binding nonce recording")
-SENSE_CODE(0x6F08, "Insufficient permission")
-SENSE_CODE(0x6F09, "Invalid drive-host pairing server")
-SENSE_CODE(0x6F0A, "Drive-host pairing suspended")
+
+SENSE_CODE(OVERLAPPED_COMMANDS_ATTEMPTED,
+ "Overlapped commands attempted")
+
+SENSE_CODE(WRITE_APPEND_ERROR,
+ "Write append error")
+SENSE_CODE(WRITE_APPEND_POSITION_ERROR,
+ "Write append position error")
+SENSE_CODE(POSITION_ERROR_RELATED_TO_TIMING,
+ "Position error related to timing")
+
+SENSE_CODE(ERASE_FAILURE,
+ "Erase failure")
+SENSE_CODE(ERASE_FAILURE_INCOMPLETE_ERASE_OP_DETECTED,
+ "Erase failure - incomplete erase operation detected")
+
+SENSE_CODE(CARTRIDGE_FAULT,
+ "Cartridge fault")
+
+SENSE_CODE(MEDIA_LOAD_OR_EJECT_FAILED,
+ "Media load or eject failed")
+SENSE_CODE(UNLOAD_TAPE_FAILURE,
+ "Unload tape failure")
+SENSE_CODE(MEDIUM_REMOVAL_PREVENTED,
+ "Medium removal prevented")
+SENSE_CODE(MEDIUM_REMOVAL_PREVENTED_BY_DATA_TRANSFER_ELEMENT,
+ "Medium removal prevented by data transfer element")
+SENSE_CODE(MEDIUM_THREAD_OR_UNTHREAD_FAILURE,
+ "Medium thread or unthread failure")
+SENSE_CODE(VOLUME_IDENTIFIER_INVALID,
+ "Volume identifier invalid")
+SENSE_CODE(VOLUME_IDENTIFIER_MISSING,
+ "Volume identifier missing")
+SENSE_CODE(DUPLICATE_VOLUME_IDENTIFIER,
+ "Duplicate volume identifier")
+SENSE_CODE(ELEMENT_STATUS_UNKNOWN,
+ "Element status unknown")
+SENSE_CODE(DATA_TRANSFER_DEVICE_ERR_LOAD_FAILED,
+ "Data transfer device error - load failed")
+SENSE_CODE(DATA_TRANSFER_DEVICE_ERR_UNLOAD_FAILED,
+ "Data transfer device error - unload failed")
+SENSE_CODE(DATA_TRANSFER_DEVICE_ERR_UNLOAD_MISSING,
+ "Data transfer device error - unload missing")
+SENSE_CODE(DATA_TRANSFER_DEVICE_ERR_EJECT_FAILED,
+ "Data transfer device error - eject failed")
+SENSE_CODE(DATA_TRANSFER_DEVICE_ERR_LIBRARY_COMMUNICATION_FAILED,
+ "Data transfer device error - library communication failed")
+
+SENSE_CODE(SCSI_TO_HOST_SYSTEM_INTERFACE_FAILURE,
+ "Scsi to host system interface failure")
+
+SENSE_CODE(SYSTEM_RESOURCE_FAILURE,
+ "System resource failure")
+SENSE_CODE(SYSTEM_BUFFER_FULL,
+ "System buffer full")
+SENSE_CODE(INSUFFICIENT_RESERVATION_RESOURCES,
+ "Insufficient reservation resources")
+SENSE_CODE(INSUFFICIENT_RESOURCES,
+ "Insufficient resources")
+SENSE_CODE(INSUFFICIENT_REGISTRATION_RESOURCES,
+ "Insufficient registration resources")
+SENSE_CODE(INSUFFICIENT_ACCESS_CONTROL_RESOURCES,
+ "Insufficient access control resources")
+SENSE_CODE(AUXILIARY_MEMORY_OUT_OF_SPACE,
+ "Auxiliary memory out of space")
+SENSE_CODE(QUOTA_ERROR,
+ "Quota error")
+SENSE_CODE(MAXIMUM_NUMBER_OF_SUPPLEMENTAL_DECRYPTION_KEYS_EXCEEDED,
+ "Maximum number of supplemental decryption keys exceeded")
+SENSE_CODE(MEDIUM_AUXILIARY_MEMORY_NOT_ACCESSIBLE,
+ "Medium auxiliary memory not accessible")
+SENSE_CODE(DATA_CURRENTLY_UNAVAILABLE,
+ "Data currently unavailable")
+SENSE_CODE(INSUFFICIENT_POWER_FOR_OPERATION,
+ "Insufficient power for operation")
+SENSE_CODE(INSUFFICIENT_RESOURCES_TO_CREATE_ROD,
+ "Insufficient resources to create rod")
+SENSE_CODE(INSUFFICIENT_RESOURCES_TO_CREATE_ROD_TOKEN,
+ "Insufficient resources to create rod token")
+SENSE_CODE(INSUFFICIENT_ZONE_RESOURCES,
+ "Insufficient zone resources")
+SENSE_CODE(INSUFFICIENT_ZONE_RESOURCES_TO_COMPLETE_WRITE,
+ "Insufficient zone resources to complete write")
+SENSE_CODE(MAXIMUM_NUMBER_OF_STREAMS_OPEN,
+ "Maximum number of streams open")
+SENSE_CODE(INSUFFICIENT_RESOURCES_TO_BIND,
+ "Insufficient resources to bind")
+
+SENSE_CODE(UNABLE_TO_RECOVER_TABLE_OF_CONTENTS,
+ "Unable to recover table-of-contents")
+
+SENSE_CODE(GENERATION_DOES_NOT_EXIST,
+ "Generation does not exist")
+
+SENSE_CODE(UPDATED_BLOCK_READ,
+ "Updated block read")
+
+SENSE_CODE(OPERATOR_REQUEST_OR_STATE_CHANGE_INPUT,
+ "Operator request or state change input")
+SENSE_CODE(OPERATOR_MEDIUM_REMOVAL_REQUEST,
+ "Operator medium removal request")
+SENSE_CODE(OPERATOR_SELECTED_WRITE_PROTECT,
+ "Operator selected write protect")
+SENSE_CODE(OPERATOR_SELECTED_WRITE_PERMIT,
+ "Operator selected write permit")
+
+SENSE_CODE(LOG_EXCEPTION,
+ "Log exception")
+SENSE_CODE(THRESHOLD_CONDITION_MET,
+ "Threshold condition met")
+SENSE_CODE(LOG_COUNTER_AT_MAXIMUM,
+ "Log counter at maximum")
+SENSE_CODE(LOG_LIST_CODES_EXHAUSTED,
+ "Log list codes exhausted")
+
+SENSE_CODE(RPL_STATUS_CHANGE,
+ "Rpl status change")
+SENSE_CODE(SPINDLES_SYNCHRONIZED,
+ "Spindles synchronized")
+SENSE_CODE(SPINDLES_NOT_SYNCHRONIZED,
+ "Spindles not synchronized")
+
+SENSE_CODE(FAILURE_PREDICTION_THRESHOLD_EXCEEDED,
+ "Failure prediction threshold exceeded")
+SENSE_CODE(MEDIA_FAILURE_PREDICTION_THRESHOLD_EXCEEDED,
+ "Media failure prediction threshold exceeded")
+SENSE_CODE(LU_FAILURE_PREDICTION_THRESHOLD_EXCEEDED,
+ "Logical unit failure prediction threshold exceeded")
+SENSE_CODE(SPARE_AREA_EXHAUSTION_PREDICTION_THRESHOLD_EXCEEDED,
+ "Spare area exhaustion prediction threshold exceeded")
+SENSE_CODE(HW_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Hardware impending failure general hard drive failure")
+SENSE_CODE(HW_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Hardware impending failure drive error rate too high")
+SENSE_CODE(HW_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Hardware impending failure data error rate too high")
+SENSE_CODE(HW_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Hardware impending failure seek error rate too high")
+SENSE_CODE(HW_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Hardware impending failure too many block reassigns")
+SENSE_CODE(HW_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Hardware impending failure access times too high")
+SENSE_CODE(HW_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Hardware impending failure start unit times too high")
+SENSE_CODE(HW_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Hardware impending failure channel parametrics")
+SENSE_CODE(HW_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Hardware impending failure controller detected")
+SENSE_CODE(HW_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Hardware impending failure throughput performance")
+SENSE_CODE(HW_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Hardware impending failure seek time performance")
+SENSE_CODE(HW_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Hardware impending failure spin-up retry count")
+SENSE_CODE(HW_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Hardware impending failure drive calibration retry count")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Controller impending failure general hard drive failure")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Controller impending failure drive error rate too high")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Controller impending failure data error rate too high")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Controller impending failure seek error rate too high")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Controller impending failure too many block reassigns")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Controller impending failure access times too high")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Controller impending failure start unit times too high")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Controller impending failure channel parametrics")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Controller impending failure controller detected")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Controller impending failure throughput performance")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Controller impending failure seek time performance")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Controller impending failure spin-up retry count")
+SENSE_CODE(CONTROLLER_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Controller impending failure drive calibration retry count")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Data channel impending failure general hard drive failure")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Data channel impending failure drive error rate too high")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Data channel impending failure data error rate too high")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Data channel impending failure seek error rate too high")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Data channel impending failure too many block reassigns")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Data channel impending failure access times too high")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Data channel impending failure start unit times too high")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Data channel impending failure channel parametrics")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Data channel impending failure controller detected")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Data channel impending failure throughput performance")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Data channel impending failure seek time performance")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Data channel impending failure spin-up retry count")
+SENSE_CODE(DATA_CHANNEL_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Data channel impending failure drive calibration retry count")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Servo impending failure general hard drive failure")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Servo impending failure drive error rate too high")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Servo impending failure data error rate too high")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Servo impending failure seek error rate too high")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Servo impending failure too many block reassigns")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Servo impending failure access times too high")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Servo impending failure start unit times too high")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Servo impending failure channel parametrics")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Servo impending failure controller detected")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Servo impending failure throughput performance")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Servo impending failure seek time performance")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Servo impending failure spin-up retry count")
+SENSE_CODE(SERVO_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Servo impending failure drive calibration retry count")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Spindle impending failure general hard drive failure")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Spindle impending failure drive error rate too high")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Spindle impending failure data error rate too high")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Spindle impending failure seek error rate too high")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Spindle impending failure too many block reassigns")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Spindle impending failure access times too high")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Spindle impending failure start unit times too high")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Spindle impending failure channel parametrics")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Spindle impending failure controller detected")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Spindle impending failure throughput performance")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Spindle impending failure seek time performance")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Spindle impending failure spin-up retry count")
+SENSE_CODE(SPINDLE_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Spindle impending failure drive calibration retry count")
+SENSE_CODE(FW_IMPENDING_FAILURE_GENERAL_HARD_DRIVE_FAILURE,
+ "Firmware impending failure general hard drive failure")
+SENSE_CODE(FW_IMPENDING_FAILURE_DRIVE_ERROR_RATE_TOO_HIGH,
+ "Firmware impending failure drive error rate too high")
+SENSE_CODE(FW_IMPENDING_FAILURE_DATA_ERROR_RATE_TOO_HIGH,
+ "Firmware impending failure data error rate too high")
+SENSE_CODE(FW_IMPENDING_FAILURE_SEEK_ERROR_RATE_TOO_HIGH,
+ "Firmware impending failure seek error rate too high")
+SENSE_CODE(FW_IMPENDING_FAILURE_TOO_MANY_BLOCK_REASSIGNS,
+ "Firmware impending failure too many block reassigns")
+SENSE_CODE(FW_IMPENDING_FAILURE_ACCESS_TIMES_TOO_HIGH,
+ "Firmware impending failure access times too high")
+SENSE_CODE(FW_IMPENDING_FAILURE_START_UNIT_TIMES_TOO_HIGH,
+ "Firmware impending failure start unit times too high")
+SENSE_CODE(FW_IMPENDING_FAILURE_CHANNEL_PARAMETRICS,
+ "Firmware impending failure channel parametrics")
+SENSE_CODE(FW_IMPENDING_FAILURE_CONTROLLER_DETECTED,
+ "Firmware impending failure controller detected")
+SENSE_CODE(FW_IMPENDING_FAILURE_THROUGHPUT_PERFORMANCE,
+ "Firmware impending failure throughput performance")
+SENSE_CODE(FW_IMPENDING_FAILURE_SEEK_TIME_PERFORMANCE,
+ "Firmware impending failure seek time performance")
+SENSE_CODE(FW_IMPENDING_FAILURE_SPINUP_RETRY_COUNT,
+ "Firmware impending failure spin-up retry count")
+SENSE_CODE(FW_IMPENDING_FAILURE_DRIVE_CALIBRATION_RETRY_COUNT,
+ "Firmware impending failure drive calibration retry count")
+SENSE_CODE(MEDIA_IMPENDING_FAILURE_ENDURANCE_LIMIT_MET,
+ "Media impending failure endurance limit met")
+SENSE_CODE(FAILURE_PREDICTION_THRESHOLD_EXCEEDED_FALSE,
+ "Failure prediction threshold exceeded (false)")
+
+SENSE_CODE(LOW_POWER_CONDITION_ON,
+ "Low power condition on")
+SENSE_CODE(IDLE_CONDITION_ACTIVATED_BY_TIMER,
+ "Idle condition activated by timer")
+SENSE_CODE(STANDBY_CONDITION_ACTIVATED_BY_TIMER,
+ "Standby condition activated by timer")
+SENSE_CODE(IDLE_CONDITION_ACTIVATED_BY_COMMAND,
+ "Idle condition activated by command")
+SENSE_CODE(STANDBY_CONDITION_ACTIVATED_BY_COMMAND,
+ "Standby condition activated by command")
+SENSE_CODE(IDLE_B_CONDITION_ACTIVATED_BY_TIMER,
+ "Idle_b condition activated by timer")
+SENSE_CODE(IDLE_B_CONDITION_ACTIVATED_BY_COMMAND,
+ "Idle_b condition activated by command")
+SENSE_CODE(IDLE_C_CONDITION_ACTIVATED_BY_TIMER,
+ "Idle_c condition activated by timer")
+SENSE_CODE(IDLE_C_CONDITION_ACTIVATED_BY_COMMAND,
+ "Idle_c condition activated by command")
+SENSE_CODE(STANDBY_Y_CONDITION_ACTIVATED_BY_TIMER,
+ "Standby_y condition activated by timer")
+SENSE_CODE(STANDBY_Y_CONDITION_ACTIVATED_BY_COMMAND,
+ "Standby_y condition activated by command")
+SENSE_CODE(POWER_STATE_CHANGE_TO_ACTIVE,
+ "Power state change to active")
+SENSE_CODE(POWER_STATE_CHANGE_TO_IDLE,
+ "Power state change to idle")
+SENSE_CODE(POWER_STATE_CHANGE_TO_STANDBY,
+ "Power state change to standby")
+SENSE_CODE(POWER_STATE_CHANGE_TO_SLEEP,
+ "Power state change to sleep")
+SENSE_CODE(POWER_STATE_CHANGE_TO_DEVICE_CONTROL,
+ "Power state change to device control")
+
+SENSE_CODE(LAMP_FAILURE,
+ "Lamp failure")
+
+SENSE_CODE(VIDEO_ACQUISITION_ERROR,
+ "Video acquisition error")
+SENSE_CODE(UNABLE_TO_ACQUIRE_VIDEO,
+ "Unable to acquire video")
+SENSE_CODE(OUT_OF_FOCUS,
+ "Out of focus")
+
+SENSE_CODE(SCAN_HEAD_POSITIONING_ERROR,
+ "Scan head positioning error")
+
+SENSE_CODE(END_OF_USER_AREA_ENCOUNTERED_ON_THIS_TRACK,
+ "End of user area encountered on this track")
+SENSE_CODE(PACKET_DOES_NOT_FIT_IN_AVAILABLE_SPACE,
+ "Packet does not fit in available space")
+
+SENSE_CODE(ILLEGAL_MODE_FOR_THIS_TRACK,
+ "Illegal mode for this track")
+SENSE_CODE(INVALID_PACKET_SIZE,
+ "Invalid packet size")
+
+SENSE_CODE(VOLTAGE_FAULT,
+ "Voltage fault")
+
+SENSE_CODE(AUTOMATIC_DOCUMENT_FEEDER_COVER_UP,
+ "Automatic document feeder cover up")
+SENSE_CODE(AUTOMATIC_DOCUMENT_FEEDER_LIFT_UP,
+ "Automatic document feeder lift up")
+SENSE_CODE(DOCUMENT_JAM_IN_AUTOMATIC_DOCUMENT_FEEDER,
+ "Document jam in automatic document feeder")
+SENSE_CODE(DOCUMENT_MISS_FEED_AUTOMATIC_IN_DOCUMENT_FEEDER,
+ "Document miss feed automatic in document feeder")
+
+SENSE_CODE(CONFIG_FAILURE,
+ "Configuration failure")
+SENSE_CODE(CONFIG_OF_INCAPABLE_LOGICAL_UNITS_FAILED,
+ "Configuration of incapable logical units failed")
+SENSE_CODE(ADD_LU_FAILED,
+ "Add logical unit failed")
+SENSE_CODE(MODIFICATION_OF_LU_FAILED,
+ "Modification of logical unit failed")
+SENSE_CODE(EXCHANGE_OF_LU_FAILED,
+ "Exchange of logical unit failed")
+SENSE_CODE(REMOVE_OF_LU_FAILED,
+ "Remove of logical unit failed")
+SENSE_CODE(ATTACHMENT_OF_LU_FAILED,
+ "Attachment of logical unit failed")
+SENSE_CODE(CREATION_OF_LU_FAILED,
+ "Creation of logical unit failed")
+SENSE_CODE(ASSIGN_FAILURE_OCCURRED,
+ "Assign failure occurred")
+SENSE_CODE(MULTIPLY_ASSIGNED_LOGICAL_UNIT,
+ "Multiply assigned logical unit")
+SENSE_CODE(SET_TARGET_PORT_GROUPS_COMMAND_FAILED,
+ "Set target port groups command failed")
+SENSE_CODE(ATA_DEVICE_FEATURE_NOT_ENABLED,
+ "ATA device feature not enabled")
+SENSE_CODE(COMMAND_REJECTED,
+ "Command rejected")
+SENSE_CODE(EXPLICIT_BIND_NOT_ALLOWED,
+ "Explicit bind not allowed")
+
+SENSE_CODE(LU_NOT_CONFIGURED,
+ "Logical unit not configured")
+SENSE_CODE(SUBSIDIARY_LU_NOT_CONFIGURED,
+ "Subsidiary logical unit not configured")
+
+SENSE_CODE(DATA_LOSS_ON_LOGICAL_UNIT,
+ "Data loss on logical unit")
+SENSE_CODE(MULTIPLE_LU_FAILURES,
+ "Multiple logical unit failures")
+SENSE_CODE(PARITY_DATA_MISMATCH,
+ "Parity/data mismatch")
+
+SENSE_CODE(INFORMATIONAL_REFER_TO_LOG,
+ "Informational, refer to log")
+
+SENSE_CODE(STATE_CHANGE_HAS_OCCURRED,
+ "State change has occurred")
+SENSE_CODE(REDUNDANCY_LEVEL_GOT_BETTER,
+ "Redundancy level got better")
+SENSE_CODE(REDUNDANCY_LEVEL_GOT_WORSE,
+ "Redundancy level got worse")
+
+SENSE_CODE(REBUILD_FAILURE_OCCURRED,
+ "Rebuild failure occurred")
+
+SENSE_CODE(RECALCULATE_FAILURE_OCCURRED,
+ "Recalculate failure occurred")
+
+SENSE_CODE(COMMAND_TO_LU_FAILED,
+ "Command to logical unit failed")
+
+SENSE_CODE(COPY_PROTECTION_KEY_EXCHANGE_FAILURE_AUTHENTICATION_FAILURE,
+ "Copy protection key exchange failure - authentication failure")
+SENSE_CODE(COPY_PROTECTION_KEY_EXCHANGE_FAILURE_KEY_NOT_PRESENT,
+ "Copy protection key exchange failure - key not present")
+SENSE_CODE(COPY_PROTECTION_KEY_EXCHANGE_FAILURE_KEY_NOT_ESTABLISHED,
+ "Copy protection key exchange failure - key not established")
+SENSE_CODE(READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION,
+ "Read of scrambled sector without authentication")
+SENSE_CODE(MEDIA_REGION_CODE_IS_MISMATCHED_TO_LU_REGION,
+ "Media region code is mismatched to logical unit region")
+SENSE_CODE(DRIVE_REGION_MUST_BE_PERMANENT_REGION_RESET_COUNT_ERROR,
+ "Drive region must be permanent/region reset count error")
+SENSE_CODE(INSUFFICIENT_BLOCK_COUNT_FOR_BINDING_NONCE_RECORDING,
+ "Insufficient block count for binding nonce recording")
+SENSE_CODE(CONFLICT_IN_BINDING_NONCE_RECORDING,
+ "Conflict in binding nonce recording")
+SENSE_CODE(INSUFFICIENT_PERMISSION,
+ "Insufficient permission")
+SENSE_CODE(INVALID_DRIVE_HOST_PAIRING_SERVER,
+ "Invalid drive-host pairing server")
+SENSE_CODE(DRIVE_HOST_PAIRING_SUSPENDED,
+ "Drive-host pairing suspended")
/*
- * SENSE_CODE(0x70NN, "Decompression exception short algorithm id of nn")
+ * SENSE_CODE(0x70NN, "Decompression exception short algorithm id of nn")
*/
-SENSE_CODE(0x7100, "Decompression exception long algorithm id")
-
-SENSE_CODE(0x7200, "Session fixation error")
-SENSE_CODE(0x7201, "Session fixation error writing lead-in")
-SENSE_CODE(0x7202, "Session fixation error writing lead-out")
-SENSE_CODE(0x7203, "Session fixation error - incomplete track in session")
-SENSE_CODE(0x7204, "Empty or partially written reserved track")
-SENSE_CODE(0x7205, "No more track reservations allowed")
-SENSE_CODE(0x7206, "RMZ extension is not allowed")
-SENSE_CODE(0x7207, "No more test zone extensions are allowed")
-
-SENSE_CODE(0x7300, "Cd control error")
-SENSE_CODE(0x7301, "Power calibration area almost full")
-SENSE_CODE(0x7302, "Power calibration area is full")
-SENSE_CODE(0x7303, "Power calibration area error")
-SENSE_CODE(0x7304, "Program memory area update failure")
-SENSE_CODE(0x7305, "Program memory area is full")
-SENSE_CODE(0x7306, "RMA/PMA is almost full")
-SENSE_CODE(0x7310, "Current power calibration area almost full")
-SENSE_CODE(0x7311, "Current power calibration area is full")
-SENSE_CODE(0x7317, "RDZ is full")
-
-SENSE_CODE(0x7400, "Security error")
-SENSE_CODE(0x7401, "Unable to decrypt data")
-SENSE_CODE(0x7402, "Unencrypted data encountered while decrypting")
-SENSE_CODE(0x7403, "Incorrect data encryption key")
-SENSE_CODE(0x7404, "Cryptographic integrity validation failed")
-SENSE_CODE(0x7405, "Error decrypting data")
-SENSE_CODE(0x7406, "Unknown signature verification key")
-SENSE_CODE(0x7407, "Encryption parameters not useable")
-SENSE_CODE(0x7408, "Digital signature validation failure")
-SENSE_CODE(0x7409, "Encryption mode mismatch on read")
-SENSE_CODE(0x740A, "Encrypted block not raw read enabled")
-SENSE_CODE(0x740B, "Incorrect Encryption parameters")
-SENSE_CODE(0x740C, "Unable to decrypt parameter list")
-SENSE_CODE(0x740D, "Encryption algorithm disabled")
-SENSE_CODE(0x7410, "SA creation parameter value invalid")
-SENSE_CODE(0x7411, "SA creation parameter value rejected")
-SENSE_CODE(0x7412, "Invalid SA usage")
-SENSE_CODE(0x7421, "Data Encryption configuration prevented")
-SENSE_CODE(0x7430, "SA creation parameter not supported")
-SENSE_CODE(0x7440, "Authentication failed")
-SENSE_CODE(0x7461, "External data encryption key manager access error")
-SENSE_CODE(0x7462, "External data encryption key manager error")
-SENSE_CODE(0x7463, "External data encryption key not found")
-SENSE_CODE(0x7464, "External data encryption request not authorized")
-SENSE_CODE(0x746E, "External data encryption control timeout")
-SENSE_CODE(0x746F, "External data encryption control error")
-SENSE_CODE(0x7471, "Logical unit access not authorized")
-SENSE_CODE(0x7479, "Security conflict in translated device")
+
+SENSE_CODE(DECOMPRESSION_EXCEPTION_LONG_ALGORITHM_ID,
+ "Decompression exception long algorithm id")
+
+SENSE_CODE(SESSION_FIXATION_ERROR,
+ "Session fixation error")
+SENSE_CODE(SESSION_FIXATION_ERROR_WRITING_LEAD_IN,
+ "Session fixation error writing lead-in")
+SENSE_CODE(SESSION_FIXATION_ERROR_WRITING_LEAD_OUT,
+ "Session fixation error writing lead-out")
+SENSE_CODE(SESSION_FIXATION_ERROR_INCOMPLETE_TRACK_IN_SESSION,
+ "Session fixation error - incomplete track in session")
+SENSE_CODE(EMPTY_OR_PARTIALLY_WRITTEN_RESERVED_TRACK,
+ "Empty or partially written reserved track")
+SENSE_CODE(NO_MORE_TRACK_RESERVATIONS_ALLOWED,
+ "No more track reservations allowed")
+SENSE_CODE(RMZ_EXTENSION_IS_NOT_ALLOWED,
+ "RMZ extension is not allowed")
+SENSE_CODE(NO_MORE_TEST_ZONE_EXTENSIONS_ARE_ALLOWED,
+ "No more test zone extensions are allowed")
+
+SENSE_CODE(CD_CONTROL_ERROR,
+ "Cd control error")
+SENSE_CODE(POWER_CALIBRATION_AREA_ALMOST_FULL,
+ "Power calibration area almost full")
+SENSE_CODE(POWER_CALIBRATION_AREA_IS_FULL,
+ "Power calibration area is full")
+SENSE_CODE(POWER_CALIBRATION_AREA_ERROR,
+ "Power calibration area error")
+SENSE_CODE(PROGRAM_MEMORY_AREA_UPDATE_FAILURE,
+ "Program memory area update failure")
+SENSE_CODE(PROGRAM_MEMORY_AREA_IS_FULL,
+ "Program memory area is full")
+SENSE_CODE(RMA_PMA_IS_ALMOST_FULL,
+ "RMA/PMA is almost full")
+SENSE_CODE(CURRENT_POWER_CALIBRATION_AREA_ALMOST_FULL,
+ "Current power calibration area almost full")
+SENSE_CODE(CURRENT_POWER_CALIBRATION_AREA_IS_FULL,
+ "Current power calibration area is full")
+SENSE_CODE(RDZ_IS_FULL,
+ "RDZ is full")
+
+SENSE_CODE(SECURITY_ERROR,
+ "Security error")
+SENSE_CODE(UNABLE_TO_DECRYPT_DATA,
+ "Unable to decrypt data")
+SENSE_CODE(UNENCRYPTED_DATA_ENCOUNTERED_WHILE_DECRYPTING,
+ "Unencrypted data encountered while decrypting")
+SENSE_CODE(INCORRECT_DATA_ENCRYPTION_KEY,
+ "Incorrect data encryption key")
+SENSE_CODE(CRYPTOGRAPHIC_INTEGRITY_VALIDATION_FAILED,
+ "Cryptographic integrity validation failed")
+SENSE_CODE(ERROR_DECRYPTING_DATA,
+ "Error decrypting data")
+SENSE_CODE(UNKNOWN_SIGNATURE_VERIFICATION_KEY,
+ "Unknown signature verification key")
+SENSE_CODE(ENCRYPTION_PARAMS_NOT_USEABLE,
+ "Encryption parameters not useable")
+SENSE_CODE(DIGITAL_SIGNATURE_VALIDATION_FAILURE,
+ "Digital signature validation failure")
+SENSE_CODE(ENCRYPTION_MODE_MISMATCH_ON_READ,
+ "Encryption mode mismatch on read")
+SENSE_CODE(ENCRYPTED_BLOCK_NOT_RAW_READ_ENABLED,
+ "Encrypted block not raw read enabled")
+SENSE_CODE(INCORRECT_ENCRYPTION_PARAMS,
+ "Incorrect Encryption parameters")
+SENSE_CODE(UNABLE_TO_DECRYPT_PARAMETER_LIST,
+ "Unable to decrypt parameter list")
+SENSE_CODE(ENCRYPTION_ALGORITHM_DISABLED,
+ "Encryption algorithm disabled")
+SENSE_CODE(SA_CREATION_PARAMETER_VALUE_INVALID,
+ "SA creation parameter value invalid")
+SENSE_CODE(SA_CREATION_PARAMETER_VALUE_REJECTED,
+ "SA creation parameter value rejected")
+SENSE_CODE(INVALID_SA_USAGE,
+ "Invalid SA usage")
+SENSE_CODE(DATA_ENCRYPTION_CONFIG_PREVENTED,
+ "Data Encryption configuration prevented")
+SENSE_CODE(SA_CREATION_PARAMETER_NOT_SUPPORTED,
+ "SA creation parameter not supported")
+SENSE_CODE(AUTHENTICATION_FAILED,
+ "Authentication failed")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_KEY_MANAGER_ACCESS_ERROR,
+ "External data encryption key manager access error")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_KEY_MANAGER_ERROR,
+ "External data encryption key manager error")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_KEY_NOT_FOUND,
+ "External data encryption key not found")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_REQUEST_NOT_AUTHORIZED,
+ "External data encryption request not authorized")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_CONTROL_TIMEOUT,
+ "External data encryption control timeout")
+SENSE_CODE(EXTERNAL_DATA_ENCRYPTION_CONTROL_ERROR,
+ "External data encryption control error")
+SENSE_CODE(LU_ACCESS_NOT_AUTHORIZED,
+ "Logical unit access not authorized")
+SENSE_CODE(SECURITY_CONFLICT_IN_TRANSLATED_DEVICE,
+ "Security conflict in translated device")
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
index 4c348645b04e..eefeb8b9a75c 100644
--- a/drivers/scsi/ses.c
+++ b/drivers/scsi/ses.c
@@ -72,6 +72,9 @@ static void init_device_slot_control(unsigned char *dest_desc,
dest_desc[3] &= 0x3c;
}
+#define POWER_ON_RESET_ANY \
+ scsi_sense_code(ASC_POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED, \
+ SCMD_FAILURE_ASCQ_ANY)
static int ses_recv_diag(struct scsi_device *sdev, int page_code,
void *buf, int bufflen)
@@ -88,16 +91,14 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
unsigned char recv_page_code;
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_RESET_ANY,
.allowed = SES_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = NOT_READY,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = NOT_READY,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = SES_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
@@ -145,16 +146,14 @@ static int ses_send_diag(struct scsi_device *sdev, int page_code,
};
struct scsi_failure failure_defs[] = {
{
- .sense = UNIT_ATTENTION,
- .asc = 0x29,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = UNIT_ATTENTION,
+ .sense_code = POWER_ON_RESET_ANY,
.allowed = SES_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
{
- .sense = NOT_READY,
- .asc = SCMD_FAILURE_ASC_ANY,
- .ascq = SCMD_FAILURE_ASCQ_ANY,
+ .sense_key = NOT_READY,
+ .sense_code = SCMD_FAILURE_SENSE_CODE_ANY,
.allowed = SES_RETRIES,
.result = SAM_STAT_CHECK_CONDITION,
},
diff --git a/drivers/scsi/sgiwd93.c b/drivers/scsi/sgiwd93.c
index 6594661db5f4..455208776239 100644
--- a/drivers/scsi/sgiwd93.c
+++ b/drivers/scsi/sgiwd93.c
@@ -59,9 +59,9 @@ static irqreturn_t sgiwd93_intr(int irq, void *dev_id)
struct Scsi_Host * host = dev_id;
unsigned long flags;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
wd33c93_intr(host);
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c
index 140e8a6addbe..d8d0fe915805 100644
--- a/drivers/scsi/smartpqi/smartpqi_init.c
+++ b/drivers/scsi/smartpqi/smartpqi_init.c
@@ -3249,15 +3249,15 @@ static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
sense_data_length = sizeof(error_info->data);
if (scsi_status == SAM_STAT_CHECK_CONDITION &&
- scsi_normalize_sense(error_info->data,
- sense_data_length, &sshdr) &&
- sshdr.sense_key == HARDWARE_ERROR &&
- sshdr.asc == 0x3e) {
+ scsi_normalize_sense(error_info->data,
+ sense_data_length, &sshdr) &&
+ sshdr.sense_key == HARDWARE_ERROR &&
+ scsi_sense_asc(&sshdr) == ASC_LU_HAS_NOT_SELF_CONFIGURED_YET) {
struct pqi_ctrl_info *ctrl_info = shost_to_hba(scmd->device->host);
struct pqi_scsi_dev *device = scmd->device->hostdata;
- switch (sshdr.ascq) {
- case 0x1: /* LOGICAL UNIT FAILURE */
+ switch (sshdr.sense_code) {
+ case LU_FAILURE:
if (printk_ratelimit())
scmd_printk(KERN_ERR, scmd, "received 'logical unit failure' from controller for scsi %d:%d:%d:%d\n",
ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
@@ -3265,10 +3265,15 @@ static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
host_byte = DID_NO_CONNECT;
break;
- default: /* See http://www.t10.org/lists/asc-num.htm#ASC_3E */
+ default:
+ /* include/scsi/scsi_sense.h */
if (printk_ratelimit())
- scmd_printk(KERN_ERR, scmd, "received unhandled error %d from controller for scsi %d:%d:%d:%d\n",
- sshdr.ascq, ctrl_info->scsi_host->host_no, device->bus, device->target, device->lun);
+ scmd_printk(KERN_ERR, scmd,
+ "received unhandled error %d from controller for scsi %d:%d:%d:%d\n",
+ scsi_sense_ascq(&sshdr),
+ ctrl_info->scsi_host->host_no,
+ device->bus, device->target,
+ device->lun);
break;
}
}
@@ -3286,11 +3291,11 @@ static void pqi_process_raid_io_error(struct pqi_io_request *io_request)
sense_data_length &&
scsi_normalize_sense(error_info->data, sense_data_length, &sshdr) &&
sshdr.sense_key == ILLEGAL_REQUEST &&
- sshdr.asc == 0x26 &&
- sshdr.ascq == 0x0) {
+ sshdr.sense_code == INVALID_FIELD_IN_PARAMETER_LIST) {
host_byte = DID_NO_CONNECT;
pqi_take_device_offline(scmd->device, "AIO");
- scsi_build_sense_buffer(0, scmd->sense_buffer, HARDWARE_ERROR, 0x3e, 0x1);
+ scsi_set_sense_buffer(0, scmd->sense_buffer, HARDWARE_ERROR,
+ LU_FAILURE);
}
scmd->result = scsi_status;
@@ -3380,7 +3385,7 @@ static void pqi_process_aio_io_error(struct pqi_io_request *io_request)
}
if (device_offline && sense_data_length == 0)
- scsi_build_sense(scmd, 0, HARDWARE_ERROR, 0x3e, 0x1);
+ scsi_set_sense(scmd, 0, HARDWARE_ERROR, LU_FAILURE);
scmd->result = scsi_status;
set_host_byte(scmd, host_byte);
diff --git a/drivers/scsi/snic/snic_disc.c b/drivers/scsi/snic/snic_disc.c
index 71d34a702f2a..8c262b4bbb83 100644
--- a/drivers/scsi/snic/snic_disc.c
+++ b/drivers/scsi/snic/snic_disc.c
@@ -160,9 +160,9 @@ snic_scsi_scan_tgt(struct work_struct *work)
SCAN_WILD_CARD,
SCSI_SCAN_RESCAN);
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
tgt->flags &= ~SNIC_TGT_SCAN_PENDING;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
} /* end of snic_scsi_scan_tgt */
/*
@@ -287,11 +287,11 @@ snic_tgt_create(struct snic *snic, struct snic_tgt_id *tgtid)
break;
}
- spin_lock_irqsave(snic->shost->host_lock, flags);
+ spin_lock_irqsave(&snic->shost->host_lock, flags);
list_add_tail(&tgt->list, &snic->disc.tgt_list);
tgt->scsi_tgt_id = snic->disc.nxt_tgt_id++;
tgt->state = SNIC_TGT_STAT_ONLINE;
- spin_unlock_irqrestore(snic->shost->host_lock, flags);
+ spin_unlock_irqrestore(&snic->shost->host_lock, flags);
SNIC_HOST_INFO(snic->shost,
"Tgt %d, type = %s detected. Adding..\n",
@@ -304,9 +304,9 @@ snic_tgt_create(struct snic *snic, struct snic_tgt_id *tgtid)
ret);
put_device(&snic->shost->shost_gendev);
- spin_lock_irqsave(snic->shost->host_lock, flags);
+ spin_lock_irqsave(&snic->shost->host_lock, flags);
list_del(&tgt->list);
- spin_unlock_irqrestore(snic->shost->host_lock, flags);
+ spin_unlock_irqrestore(&snic->shost->host_lock, flags);
put_device(&tgt->dev);
tgt = NULL;
@@ -537,7 +537,7 @@ snic_tgt_del_all(struct snic *snic)
scsi_flush_work(snic->shost);
mutex_lock(&snic->disc.mutex);
- spin_lock_irqsave(snic->shost->host_lock, flags);
+ spin_lock_irqsave(&snic->shost->host_lock, flags);
list_for_each_safe(cur, nxt, &snic->disc.tgt_list) {
tgt = list_entry(cur, struct snic_tgt, list);
@@ -547,7 +547,7 @@ snic_tgt_del_all(struct snic *snic)
queue_work(snic_glob->event_q, &tgt->del_work);
tgt = NULL;
}
- spin_unlock_irqrestore(snic->shost->host_lock, flags);
+ spin_unlock_irqrestore(&snic->shost->host_lock, flags);
mutex_unlock(&snic->disc.mutex);
flush_workqueue(snic_glob->event_q);
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index c36c54ecd354..4f2e8d1be6da 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -253,7 +253,8 @@ do_tur:
* (ASC 0x3a).
*/
cd->media_present = scsi_status_is_good(ret) ||
- (scsi_sense_valid(&sshdr) && sshdr.asc != 0x3a);
+ (scsi_sense_valid(&sshdr) &&
+ scsi_sense_asc(&sshdr) != ASC_MEDIUM_NOT_PRESENT);
if (last_present != cd->media_present)
cd->device->changed = 1;
diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
index 089653018d32..e4ec0f63cdcc 100644
--- a/drivers/scsi/sr_ioctl.c
+++ b/drivers/scsi/sr_ioctl.c
@@ -226,9 +226,8 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
err = -ENOMEDIUM;
break;
case NOT_READY: /* This happens if there is no disc in drive */
- if (sshdr->asc == 0x04 &&
- sshdr->ascq == 0x01) {
- /* sense: Logical unit is in process of becoming ready */
+ if (sshdr->sense_code ==
+ LU_IS_IN_PROCESS_OF_BECOMING_READY) {
if (!cgc->quiet)
sr_printk(KERN_INFO, cd,
"CDROM not ready yet.\n");
@@ -250,9 +249,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
break;
case ILLEGAL_REQUEST:
err = -EIO;
- if (sshdr->asc == 0x20 &&
- sshdr->ascq == 0x00)
- /* sense: Invalid command operation code */
+ if (sshdr->sense_code == INVALID_COMMAND_OP_CODE)
err = -EDRIVE_CANT_DO_THIS;
break;
default:
@@ -303,9 +300,8 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
if (!scsi_test_unit_ready(cd->device, SR_TIMEOUT, MAX_RETRIES, &sshdr))
return CDS_DISC_OK;
- /* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */
- if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
- && sshdr.asc == 0x04 && sshdr.ascq == 0x01)
+ if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY &&
+ sshdr.sense_code == LU_IS_IN_PROCESS_OF_BECOMING_READY)
return CDS_DRIVE_NOT_READY;
if (!cdrom_get_media_event(cdi, &med)) {
@@ -318,18 +314,18 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
}
/*
- * SK/ASC/ASCQ of 2/4/2 means "initialization required"
* Using CD_TRAY_OPEN results in an START_STOP_UNIT to close
* the tray, which resolves the initialization requirement.
*/
- if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
- && sshdr.asc == 0x04 && sshdr.ascq == 0x02)
+ if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY &&
+ sshdr.sense_code == LU_NOT_READY_INITIALIZING_COMMAND_REQUIRED)
return CDS_TRAY_OPEN;
/*
* 0x04 is format in progress .. but there must be a disc present!
*/
- if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04)
+ if (sshdr.sense_key == NOT_READY &&
+ scsi_sense_asc(&sshdr) == ASC_LU_NOT_READY)
return CDS_DISC_OK;
/*
@@ -338,13 +334,10 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
* any other way to detect this...
*/
if (scsi_sense_valid(&sshdr) &&
- /* 0x3a is medium not present */
- sshdr.asc == 0x3a)
+ scsi_sense_asc(&sshdr) == ASC_MEDIUM_NOT_PRESENT)
return CDS_NO_DISC;
- else
- return CDS_TRAY_OPEN;
- return CDS_DRIVE_NOT_READY;
+ return CDS_TRAY_OPEN;
}
int sr_disk_status(struct cdrom_device_info *cdi)
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index f1c3c4946637..77366890edeb 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -368,6 +368,8 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
if (ctr != STp->por_ctr) {
STp->por_ctr = ctr;
STp->pos_unknown = 1; /* ASC => power on / reset */
+ /* The reset allowed medium removal; relock at next access */
+ STp->door_locked = ST_UNLOCKED;
st_printk(KERN_WARNING, STp, "Power on/reset recognized.");
}
@@ -421,11 +423,14 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
STp->cln_sense_mask) != 0);
}
if (cmdstatp->have_sense &&
- cmdstatp->sense_hdr.asc == 0 && cmdstatp->sense_hdr.ascq == 0x17)
- STp->cleaning_req = 1; /* ASC and ASCQ => cleaning requested */
+ cmdstatp->sense_hdr.sense_code == CLEANING_REQUESTED)
+ STp->cleaning_req = 1;
if (cmdstatp->have_sense && scode == UNIT_ATTENTION &&
- cmdstatp->sense_hdr.asc == 0x29 && !STp->pos_unknown) {
- STp->pos_unknown = 1; /* ASC => power on / reset */
+ scsi_sense_asc(&cmdstatp->sense_hdr) ==
+ ASC_POWER_ON_RESET_OR_BUS_DEVICE_RESET_OCCURRED &&
+ !STp->pos_unknown) {
+ STp->pos_unknown = 1;
+ STp->door_locked = ST_UNLOCKED;
st_printk(KERN_WARNING, STp, "Power on/reset recognized.");
}
@@ -1003,7 +1008,8 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
scode = cmdstatp->sense_hdr.sense_key;
if (scode == UNIT_ATTENTION) { /* New media? */
- if (cmdstatp->sense_hdr.asc == 0x28) { /* New media */
+ if (scsi_sense_asc(&cmdstatp->sense_hdr) ==
+ ASC_NOT_READY_TO_READY_CHANGE_MEDIUM_MAY_HAVE_CHANGED) {
new_session = 1;
DEBC_printk(STp, "New tape session.");
}
@@ -1026,14 +1032,13 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
waits++;
continue;
}
- else {
- if ((STp->device)->scsi_level >= SCSI_2 &&
- cmdstatp->sense_hdr.asc == 0x3a) /* Check ASC */
- retval = CHKRES_NO_TAPE;
- else
- retval = CHKRES_NOT_READY;
- break;
- }
+ if ((STp->device)->scsi_level >= SCSI_2 &&
+ scsi_sense_asc(&cmdstatp->sense_hdr) ==
+ ASC_MEDIUM_NOT_PRESENT)
+ retval = CHKRES_NO_TAPE;
+ else
+ retval = CHKRES_NOT_READY;
+ break;
}
}
@@ -2686,6 +2691,30 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod
else {
STp->rew_at_close = STp->autorew_dev;
retval = check_tape(STp, filp);
+ /*
+ * LOAD leaves the medium at the beginning of partition
+ * 0. check_tape() records that only for a new session;
+ * without a new-medium unit attention (the medium was
+ * already loaded) the partition and the partition state
+ * would be left as before the load. Reset them as a
+ * new session does, for all partitions: a stale
+ * ST_WRITING state would make st_flush() write a
+ * filemark at the beginning of partition 0.
+ */
+ if (retval == CHKRES_READY) {
+ int i;
+
+ STp->partition = STp->new_partition = 0;
+ for (i = 0; i < ST_NBR_PARTITIONS; i++) {
+ STps = &(STp->ps[i]);
+ STps->rw = ST_IDLE;
+ STps->eof = ST_NOEOF;
+ STps->at_sm = 0;
+ STps->last_block_valid = 0;
+ STps->drv_block = 0;
+ STps->drv_file = 0;
+ }
+ }
if (retval > 0)
retval = 0;
}
@@ -2939,9 +2968,11 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
direction = DMA_TO_DEVICE;
memset((STp->buffer)->b_data, 0, 12);
- if (cmd_in == MTSETDRVBUFFER)
+ if (cmd_in == MTSETDRVBUFFER) {
(STp->buffer)->b_data[2] = (arg & 7) << 4;
- else
+ STp->drv_buffer_changed = 1; /* At least we tried ;-) */
+ STp->changed_drv_buffer = arg & 7;
+ } else
(STp->buffer)->b_data[2] =
STp->drv_buffer << 4;
(STp->buffer)->b_data[3] = 8; /* block descriptor length */
@@ -3105,9 +3136,10 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
cmd_in == MTSETDRVBUFFER ||
cmd_in == SET_DENS_AND_BLK) {
if (cmdstatp->sense_hdr.sense_key == ILLEGAL_REQUEST &&
- cmdstatp->sense_hdr.asc == 0x24 &&
- (STp->device)->scsi_level <= SCSI_2 &&
- !(STp->use_pf & PF_TESTED)) {
+ scsi_sense_asc(&cmdstatp->sense_hdr) ==
+ ASC_INVALID_FIELD_IN_CDB &&
+ (STp->device)->scsi_level <= SCSI_2 &&
+ !(STp->use_pf & PF_TESTED)) {
/* Try the other possible state of Page Format if not
already tried */
STp->use_pf = (STp->use_pf ^ USE_PF) | PF_TESTED;
@@ -3217,14 +3249,20 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
partition >= ST_NBR_PARTITIONS)
return (-EINVAL);
if (partition != STp->partition) {
- if (get_location(STp, &blk, &p, 1))
+ /*
+ * Save the location for the partition the drive reports,
+ * not for STp->partition: after a reset STp->partition may
+ * not match the partition the drive is in.
+ */
+ if (get_location(STp, &blk, &p, 1) ||
+ p < 0 || p >= ST_NBR_PARTITIONS)
STps->last_block_valid = 0;
else {
- STps->last_block_valid = 1;
- STps->last_block_visited = blk;
+ STp->ps[p].last_block_valid = 1;
+ STp->ps[p].last_block_visited = blk;
DEBC_printk(STp, "Visited block %d for "
"partition %d saved.\n",
- blk, STp->partition);
+ blk, p);
}
}
@@ -3586,6 +3624,26 @@ out:
return retval;
}
+/*
+ * Re-apply a drive buffering mode, density and block size that were changed
+ * by the user before a device reset (a negative value means "not changed").
+ * The buffering mode goes first: the other MODE SELECTs send the current
+ * STp->drv_buffer. A unit attention still pending after the operation
+ * (e.g. new medium after a load) fails the first MODE SELECT, so retry each
+ * once. As in the other post-reset restore path, errors are ignored and one
+ * setting failing does not prevent restoring the others.
+ */
+static void st_restore_changed_settings(struct scsi_tape *STp, int drv_buffer,
+ int density, int blksize)
+{
+ if (drv_buffer >= 0 && st_int_ioctl(STp, MTSETDRVBUFFER, drv_buffer))
+ st_int_ioctl(STp, MTSETDRVBUFFER, drv_buffer);
+ if (density >= 0 && st_int_ioctl(STp, MTSETDENSITY, density))
+ st_int_ioctl(STp, MTSETDENSITY, density);
+ if (blksize >= 0 && st_int_ioctl(STp, MTSETBLK, blksize))
+ st_int_ioctl(STp, MTSETBLK, blksize);
+}
+
/* The ioctl command */
static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
{
@@ -3594,6 +3652,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
int retval = 0;
unsigned int blk;
bool cmd_mtiocget;
+ int restore_drv_buffer = -1, restore_density = -1, restore_blksize = -1;
struct scsi_tape *STp = file->private_data;
struct st_modedef *STm;
struct st_partstat *STps;
@@ -3736,10 +3795,26 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
STp->partition = 0;
switch_partition(STp);
}
+ if (STp->drv_buffer_changed)
+ st_int_ioctl(STp, MTSETDRVBUFFER,
+ STp->changed_drv_buffer);
if (STp->density_changed)
st_int_ioctl(STp, MTSETDENSITY, STp->changed_density);
if (STp->blksize_changed)
st_int_ioctl(STp, MTSETBLK, STp->changed_blksize);
+ } else if (mtc.mt_op == MTLOAD || mtc.mt_op == MTRETEN) {
+ /*
+ * The same medium ends up at BOT, so the settings
+ * apply as with MTREW. The operation may start a
+ * new session, which clears the "changed" flags:
+ * save the values and restore them afterwards.
+ */
+ if (STp->drv_buffer_changed)
+ restore_drv_buffer = STp->changed_drv_buffer;
+ if (STp->density_changed)
+ restore_density = STp->changed_density;
+ if (STp->blksize_changed)
+ restore_blksize = STp->changed_blksize;
}
}
@@ -3819,6 +3894,15 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
if (mtc.mt_op == MTLOAD) {
retval = do_load_unload(STp, file, max(1, mtc.mt_count));
+ /*
+ * Restore only if the drive is ready: after an
+ * immediate-mode load with O_NONBLOCK, check_tape()
+ * does not wait and the drive may still be loading.
+ */
+ if (!retval && STp->ready == ST_READY)
+ st_restore_changed_settings(STp, restore_drv_buffer,
+ restore_density,
+ restore_blksize);
goto out;
}
@@ -3837,6 +3921,22 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
retval = st_compression(STp, (mtc.mt_count & 1));
else
retval = st_int_ioctl(STp, mtc.mt_op, mtc.mt_count);
+ if (!retval && mtc.mt_op == MTRETEN && !STp->immediate &&
+ (restore_drv_buffer >= 0 || restore_density >= 0 ||
+ restore_blksize >= 0)) {
+ /*
+ * Retension reloads the medium and the drive may
+ * report a new medium. Let check_tape() start the new
+ * session (applying the mode defaults) now, as for
+ * MTLOAD; otherwise it happens at the next open and
+ * overrides the restored settings.
+ */
+ if (check_tape(STp, file) >= 0 &&
+ STp->ready == ST_READY)
+ st_restore_changed_settings(STp, restore_drv_buffer,
+ restore_density,
+ restore_blksize);
+ }
goto out;
}
if (!STm->defined) {
@@ -4442,7 +4542,7 @@ static int st_probe(struct scsi_device *SDp)
tpnt->modes[0].defined = 1;
tpnt->density_changed = tpnt->compression_changed =
- tpnt->blksize_changed = 0;
+ tpnt->blksize_changed = tpnt->drv_buffer_changed = 0;
mutex_init(&tpnt->lock);
idr_preload(GFP_KERNEL);
@@ -4509,11 +4609,11 @@ static void st_remove(struct scsi_device *SDp)
remove_cdevs(tpnt);
mutex_lock(&st_ref_mutex);
- kref_put(&tpnt->kref, scsi_tape_release);
- mutex_unlock(&st_ref_mutex);
spin_lock(&st_index_lock);
idr_remove(&st_index_idr, index);
spin_unlock(&st_index_lock);
+ kref_put(&tpnt->kref, scsi_tape_release);
+ mutex_unlock(&st_ref_mutex);
}
/**
diff --git a/drivers/scsi/st.h b/drivers/scsi/st.h
index 0d7c4b8c2c8a..c580024880c3 100644
--- a/drivers/scsi/st.h
+++ b/drivers/scsi/st.h
@@ -162,10 +162,12 @@ struct scsi_tape {
unsigned char in_use;
unsigned char blksize_changed;
unsigned char density_changed;
+ unsigned char drv_buffer_changed;
unsigned char compression_changed;
unsigned char drv_buffer;
unsigned char density;
unsigned char changed_density;
+ unsigned char changed_drv_buffer;
unsigned char door_locked;
unsigned char autorew_dev; /* auto-rewind device */
unsigned char rew_at_close; /* rewind necessary at close */
diff --git a/drivers/scsi/stex.c b/drivers/scsi/stex.c
index 6aeeb338633d..d4899816f7dc 100644
--- a/drivers/scsi/stex.c
+++ b/drivers/scsi/stex.c
@@ -401,8 +401,7 @@ static struct status_msg *stex_get_status(struct st_hba *hba)
static void stex_invalid_field(struct scsi_cmnd *cmd,
void (*done)(struct scsi_cmnd *))
{
- /* "Invalid field in cdb" */
- scsi_build_sense(cmd, 0, ILLEGAL_REQUEST, 0x24, 0x0);
+ scsi_set_sense(cmd, 0, ILLEGAL_REQUEST, INVALID_FIELD_IN_CDB);
done(cmd);
}
@@ -568,7 +567,7 @@ static void return_abnormal_state(struct st_hba *hba, int status)
unsigned long flags;
u16 tag;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
for (tag = 0; tag < hba->host->can_queue; tag++) {
ccb = &hba->ccb[tag];
if (ccb->req == NULL)
@@ -581,7 +580,7 @@ static void return_abnormal_state(struct st_hba *hba, int status)
ccb->cmd = NULL;
}
}
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
}
static int
stex_sdev_configure(struct scsi_device *sdev, struct queue_limits *lim)
@@ -887,7 +886,7 @@ static irqreturn_t stex_intr(int irq, void *__hba)
u32 data;
unsigned long flags;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
data = readl(base + ODBL);
@@ -896,14 +895,14 @@ static irqreturn_t stex_intr(int irq, void *__hba)
writel(data, base + ODBL);
readl(base + ODBL); /* flush */
stex_mu_intr(hba, data);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
if (unlikely(data & MU_OUTBOUND_DOORBELL_REQUEST_RESET &&
hba->cardtype == st_shasta))
queue_work(hba->work_q, &hba->reset_work);
return IRQ_HANDLED;
}
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return IRQ_NONE;
}
@@ -988,7 +987,7 @@ static irqreturn_t stex_ss_intr(int irq, void *__hba)
u32 data;
unsigned long flags;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
if (hba->cardtype == st_yel) {
data = readl(base + YI2H_INT);
@@ -996,7 +995,7 @@ static irqreturn_t stex_ss_intr(int irq, void *__hba)
/* clear the interrupt */
writel(data, base + YI2H_INT_C);
stex_ss_mu_intr(hba);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
if (unlikely(data & SS_I2H_REQUEST_RESET))
queue_work(hba->work_q, &hba->reset_work);
return IRQ_HANDLED;
@@ -1010,14 +1009,14 @@ static irqreturn_t stex_ss_intr(int irq, void *__hba)
writel((1 << 22), base + YH2I_INT);
}
stex_ss_mu_intr(hba);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
if (unlikely(data & SS_I2H_REQUEST_RESET))
queue_work(hba->work_q, &hba->reset_work);
return IRQ_HANDLED;
}
}
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return IRQ_NONE;
}
@@ -1227,7 +1226,7 @@ static int stex_handshake(struct st_hba *hba)
err = stex_ss_handshake(hba);
else
err = stex_common_handshake(hba);
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
mu_status = hba->mu_status;
if (err == 0) {
hba->req_head = 0;
@@ -1240,7 +1239,7 @@ static int stex_handshake(struct st_hba *hba)
hba->mu_status = MU_STATE_FAILED;
if (mu_status == MU_STATE_RESETTING)
wake_up_all(&hba->reset_waitq);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return err;
}
@@ -1257,7 +1256,7 @@ static int stex_abort(struct scsi_cmnd *cmd)
scmd_printk(KERN_INFO, cmd, "aborting command\n");
base = hba->mmio_base;
- spin_lock_irqsave(host->host_lock, flags);
+ spin_lock_irqsave(&host->host_lock, flags);
if (tag < host->can_queue &&
hba->ccb[tag].req && hba->ccb[tag].cmd == cmd)
hba->wait_ccb = &hba->ccb[tag];
@@ -1301,7 +1300,7 @@ fail_out:
hba->wait_ccb = NULL;
result = FAILED;
out:
- spin_unlock_irqrestore(host->host_lock, flags);
+ spin_unlock_irqrestore(&host->host_lock, flags);
return result;
}
@@ -1364,13 +1363,13 @@ static int stex_yos_reset(struct st_hba *hba)
msleep(1);
}
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
if (ret == -1)
hba->mu_status = MU_STATE_FAILED;
else
hba->mu_status = MU_STATE_STARTED;
wake_up_all(&hba->reset_waitq);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return ret;
}
@@ -1393,29 +1392,29 @@ static int stex_do_reset(struct st_hba *hba)
unsigned long flags;
unsigned int mu_status = MU_STATE_RESETTING;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
if (hba->mu_status == MU_STATE_STARTING) {
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
printk(KERN_INFO DRV_NAME "(%s): request reset during init\n",
pci_name(hba->pdev));
return 0;
}
while (hba->mu_status == MU_STATE_RESETTING) {
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
wait_event_timeout(hba->reset_waitq,
hba->mu_status != MU_STATE_RESETTING,
MU_MAX_DELAY * HZ);
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
mu_status = hba->mu_status;
}
if (mu_status != MU_STATE_RESETTING) {
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return (mu_status == MU_STATE_STARTED) ? 0 : -1;
}
hba->mu_status = MU_STATE_RESETTING;
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
if (hba->cardtype == st_yosemite)
return stex_yos_reset(hba);
@@ -1858,12 +1857,12 @@ static void stex_hba_stop(struct st_hba *hba, int st_sleep_mic)
unsigned long before;
u16 tag = 0;
- spin_lock_irqsave(hba->host->host_lock, flags);
+ spin_lock_irqsave(&hba->host->host_lock, flags);
if ((hba->cardtype == st_yel || hba->cardtype == st_P3) &&
hba->supports_pm == 1) {
if (st_sleep_mic == ST_NOTHANDLED) {
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
return;
}
}
@@ -1899,7 +1898,7 @@ static void stex_hba_stop(struct st_hba *hba, int st_sleep_mic)
hba->ccb[tag].sense_buffer = NULL;
hba->ccb[tag].req_type = PASSTHRU_REQ_TYPE;
hba->send(hba, req, tag);
- spin_unlock_irqrestore(hba->host->host_lock, flags);
+ spin_unlock_irqrestore(&hba->host->host_lock, flags);
before = jiffies;
while (hba->ccb[tag].req_type & PASSTHRU_REQ_TYPE) {
if (time_after(jiffies, before + ST_INTERNAL_TIMEOUT * HZ)) {
diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
index ef3cd3bc7390..625db97d1a03 100644
--- a/drivers/scsi/storvsc_drv.c
+++ b/drivers/scsi/storvsc_drv.c
@@ -1016,7 +1016,7 @@ done:
static void storvsc_handle_error(struct vmscsi_request *vm_srb,
struct scsi_cmnd *scmnd,
struct Scsi_Host *host,
- u8 asc, u8 ascq)
+ struct scsi_sense_hdr *sshdr)
{
struct storvsc_scan_work *wrk;
void (*process_err_fn)(struct work_struct *work);
@@ -1033,7 +1033,7 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
case SRB_STATUS_DATA_OVERRUN:
if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID) {
/* Check for capacity change */
- if ((asc == 0x2a) && (ascq == 0x9)) {
+ if (sshdr->sense_code == CAPACITY_DATA_HAS_CHANGED) {
process_err_fn = storvsc_device_scan;
/* Retry the I/O that triggered this. */
set_host_byte(scmnd, DID_REQUEUE);
@@ -1049,8 +1049,12 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
* want scsi_report_sense() to output a message
* that a sysadmin wouldn't know what to do with.
*/
- if ((asc == 0x3f) && (ascq != 0x03) &&
- (ascq != 0x0e)) {
+ if (scsi_sense_asc(sshdr) ==
+ ASC_TARGET_OPERATING_CONDITIONS_HAVE_CHANGED &&
+ sshdr->sense_code !=
+ INQUIRY_DATA_HAS_CHANGED &&
+ sshdr->sense_code !=
+ REPORTED_LUNS_DATA_HAS_CHANGED) {
process_err_fn = storvsc_device_scan;
set_host_byte(scmnd, DID_REQUEUE);
goto do_work;
@@ -1141,8 +1145,7 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request,
}
if (vm_srb->srb_status != SRB_STATUS_SUCCESS) {
- storvsc_handle_error(vm_srb, scmnd, host, sense_hdr.asc,
- sense_hdr.ascq);
+ storvsc_handle_error(vm_srb, scmnd, host, &sense_hdr);
/*
* The Windows driver set data_transfer_length on
* SRB_STATUS_DATA_OVERRUN. On other errors, this value
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c
index 27e22acaf1a7..e3783c015b02 100644
--- a/drivers/scsi/sym53c8xx_2/sym_glue.c
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.c
@@ -531,9 +531,9 @@ static irqreturn_t sym53c8xx_intr(int irq, void *dev_id)
if (DEBUG_FLAGS & DEBUG_TINY) printf_debug ("[");
- spin_lock(shost->host_lock);
+ spin_lock(&shost->host_lock);
result = sym_interrupt(shost);
- spin_unlock(shost->host_lock);
+ spin_unlock(&shost->host_lock);
if (DEBUG_FLAGS & DEBUG_TINY) printf_debug ("]\n");
@@ -548,9 +548,9 @@ static void sym53c8xx_timer(struct timer_list *t)
struct sym_hcb *np = timer_container_of(np, t, s.timer);
unsigned long flags;
- spin_lock_irqsave(np->s.host->host_lock, flags);
+ spin_lock_irqsave(&np->s.host->host_lock, flags);
sym_timer(np);
- spin_unlock_irqrestore(np->s.host->host_lock, flags);
+ spin_unlock_irqrestore(&np->s.host->host_lock, flags);
}
@@ -587,7 +587,7 @@ static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd)
if (pci_channel_offline(pdev))
return SCSI_FAILED;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
/* This one is queued in some place -> to wait for completion */
FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
struct sym_ccb *cp = sym_que_entry(qp, struct sym_ccb, link_ccbq);
@@ -605,13 +605,13 @@ static int sym53c8xx_eh_abort_handler(struct scsi_cmnd *cmd)
if (cmd_queued) {
init_completion(&eh_done);
ucmd->eh_done = &eh_done;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
if (!wait_for_completion_timeout(&eh_done, 5*HZ)) {
ucmd->eh_done = NULL;
sts = -2;
}
} else {
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
dev_warn(&cmd->device->sdev_gendev, "ABORT operation %s.\n",
@@ -639,7 +639,7 @@ static int sym53c8xx_eh_target_reset_handler(struct scsi_cmnd *cmd)
if (pci_channel_offline(pdev))
return SCSI_FAILED;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
sts = sym_reset_scsi_target(np, starget->id);
if (!sts) {
FOR_EACH_QUEUED_ELEMENT(&np->busy_ccbq, qp) {
@@ -655,15 +655,15 @@ static int sym53c8xx_eh_target_reset_handler(struct scsi_cmnd *cmd)
ucmd = SYM_UCMD_PTR(cmd);
init_completion(&eh_done);
ucmd->eh_done = &eh_done;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
if (!wait_for_completion_timeout(&eh_done, 5*HZ)) {
ucmd->eh_done = NULL;
sts = -2;
}
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
}
}
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
starget_printk(KERN_WARNING, starget, "TARGET RESET operation %s.\n",
sts==0 ? "complete" :sts==-2 ? "timed-out" : "failed");
@@ -685,9 +685,9 @@ static int sym53c8xx_eh_bus_reset_handler(struct scsi_cmnd *cmd)
if (pci_channel_offline(pdev))
return SCSI_FAILED;
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
sym_reset_scsi_bus(np, 1);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
dev_warn(&cmd->device->sdev_gendev, "BUS RESET operation complete.\n");
return SCSI_SUCCESS;
@@ -713,21 +713,21 @@ static int sym53c8xx_eh_host_reset_handler(struct scsi_cmnd *cmd)
#define WAIT_FOR_PCI_RECOVERY 35
if (pci_channel_offline(pdev)) {
init_completion(&eh_done);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
/* Make sure we didn't race */
if (pci_channel_offline(pdev)) {
BUG_ON(sym_data->io_reset);
sym_data->io_reset = &eh_done;
finished_reset = 0;
}
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
if (!finished_reset)
finished_reset = wait_for_completion_timeout
(sym_data->io_reset,
WAIT_FOR_PCI_RECOVERY*HZ);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
sym_data->io_reset = NULL;
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
if (finished_reset) {
@@ -776,7 +776,7 @@ static int sym53c8xx_sdev_init(struct scsi_device *sdev)
if (sdev->id >= SYM_CONF_MAX_TARGET || sdev->lun >= SYM_CONF_MAX_LUN)
return -ENXIO;
- spin_lock_irqsave(np->s.host->host_lock, flags);
+ spin_lock_irqsave(&np->s.host->host_lock, flags);
/*
* Fail the device init if the device is flagged NOSCAN at BOOT in
@@ -817,7 +817,7 @@ static int sym53c8xx_sdev_init(struct scsi_device *sdev)
error = 0;
out:
- spin_unlock_irqrestore(np->s.host->host_lock, flags);
+ spin_unlock_irqrestore(&np->s.host->host_lock, flags);
return error;
}
@@ -873,7 +873,7 @@ static void sym53c8xx_sdev_destroy(struct scsi_device *sdev)
if (!lp)
return;
- spin_lock_irqsave(np->s.host->host_lock, flags);
+ spin_lock_irqsave(&np->s.host->host_lock, flags);
if (lp->busy_itlq || lp->busy_itl) {
/*
@@ -896,7 +896,7 @@ static void sym53c8xx_sdev_destroy(struct scsi_device *sdev)
tp->starget = NULL;
}
- spin_unlock_irqrestore(np->s.host->host_lock, flags);
+ spin_unlock_irqrestore(&np->s.host->host_lock, flags);
}
/*
@@ -1191,9 +1191,9 @@ printk("sym_user_command: data=%ld\n", uc->data);
else {
unsigned long flags;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
sym_exec_user_command(np, uc);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
}
return length;
}
@@ -1371,7 +1371,7 @@ static struct Scsi_Host *sym_attach(const struct scsi_host_template *tpnt, int u
* After SCSI devices have been opened, we cannot
* reset the bus safely, so we do it here.
*/
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (sym_reset_scsi_bus(np, 0))
goto reset_failed;
@@ -1407,14 +1407,14 @@ static struct Scsi_Host *sym_attach(const struct scsi_host_template *tpnt, int u
if (pdev->device == PCI_DEVICE_ID_NCR_53C896 && pdev->revision < 2)
shost->dma_boundary = 0xFFFFFF;
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return shost;
reset_failed:
printf_err("%s: FATAL ERROR: CHECK SCSI BUS - CABLES, "
"TERMINATION, DEVICE POWER etc.!\n", sym_name(np));
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
attach_failed:
printf_info("sym%d: giving up ...\n", unit);
if (np)
@@ -1903,10 +1903,10 @@ static void sym2_io_resume(struct pci_dev *pdev)
struct Scsi_Host *shost = pci_get_drvdata(pdev);
struct sym_data *sym_data = shost_priv(shost);
- spin_lock_irq(shost->host_lock);
+ spin_lock_irq(&shost->host_lock);
if (sym_data->io_reset)
complete(sym_data->io_reset);
- spin_unlock_irq(shost->host_lock);
+ spin_unlock_irq(&shost->host_lock);
}
static void sym2_get_signalling(struct Scsi_Host *shost)
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.h b/drivers/scsi/sym53c8xx_2/sym_hipd.h
index 9231a2899064..aa365e8ba66f 100644
--- a/drivers/scsi/sym53c8xx_2/sym_hipd.h
+++ b/drivers/scsi/sym53c8xx_2/sym_hipd.h
@@ -1110,9 +1110,9 @@ bad:
*/
#define sym_get_mem_cluster() \
- (void *) __get_free_pages(GFP_ATOMIC, SYM_MEM_PAGE_ORDER)
+ kmalloc(PAGE_SIZE << SYM_MEM_PAGE_ORDER, GFP_ATOMIC)
#define sym_free_mem_cluster(p) \
- free_pages((unsigned long)p, SYM_MEM_PAGE_ORDER)
+ kfree(p)
/*
* Link between free memory chunks of a given size.
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c
index 1e49d0402f0b..2a698b93faf8 100644
--- a/drivers/scsi/wd33c93.c
+++ b/drivers/scsi/wd33c93.c
@@ -1515,7 +1515,7 @@ wd33c93_host_reset(struct scsi_cmnd * SCpnt)
int i;
instance = SCpnt->device->host;
- spin_lock_irq(instance->host_lock);
+ spin_lock_irq(&instance->host_lock);
hostdata = (struct WD33C93_hostdata *) instance->hostdata;
printk("scsi%d: reset. ", instance->host_no);
@@ -1541,7 +1541,7 @@ wd33c93_host_reset(struct scsi_cmnd * SCpnt)
reset_wd33c93(instance);
SCpnt->result = DID_RESET << 16;
enable_irq(instance->irq);
- spin_unlock_irq(instance->host_lock);
+ spin_unlock_irq(&instance->host_lock);
return SUCCESS;
}
diff --git a/drivers/scsi/wd719x.c b/drivers/scsi/wd719x.c
index 830d40f57f6a..85cf6c9d2ec9 100644
--- a/drivers/scsi/wd719x.c
+++ b/drivers/scsi/wd719x.c
@@ -270,11 +270,11 @@ static enum scsi_qc_status wd719x_queuecommand(struct Scsi_Host *sh,
scb->data_p = 0;
}
- spin_lock_irqsave(wd->sh->host_lock, flags);
+ spin_lock_irqsave(&wd->sh->host_lock, flags);
/* check if the Command register is free */
if (wd719x_readb(wd, WD719X_AMR_COMMAND) != WD719X_CMD_READY) {
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
return SCSI_MLQUEUE_HOST_BUSY;
}
@@ -285,7 +285,7 @@ static enum scsi_qc_status wd719x_queuecommand(struct Scsi_Host *sh,
/* send SCB opcode */
wd719x_writeb(wd, WD719X_AMR_COMMAND, WD719X_CMD_PROCESS_SCB);
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
return 0;
out_unmap_sense:
@@ -473,12 +473,12 @@ static int wd719x_abort(struct scsi_cmnd *cmd)
action = WD719X_CMD_ABORT;
- spin_lock_irqsave(wd->sh->host_lock, flags);
+ spin_lock_irqsave(&wd->sh->host_lock, flags);
result = wd719x_direct_cmd(wd, action, cmd->device->id,
cmd->device->lun, scsi_cmd_to_rq(cmd)->tag,
scb->phys, 0);
wd719x_finish_cmd(scb, DID_ABORT);
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
if (result)
return FAILED;
@@ -495,7 +495,7 @@ static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device)
dev_info(&wd->pdev->dev, "%s reset requested\n",
(opcode == WD719X_CMD_BUSRESET) ? "bus" : "device");
- spin_lock_irqsave(wd->sh->host_lock, flags);
+ spin_lock_irqsave(&wd->sh->host_lock, flags);
result = wd719x_direct_cmd(wd, opcode, device, 0, 0, 0,
WD719X_WAIT_FOR_SCSI_RESET);
/* flush all SCBs (or all for a device if dev_reset) */
@@ -504,7 +504,7 @@ static int wd719x_reset(struct scsi_cmnd *cmd, u8 opcode, u8 device)
scb->cmd->device->id == device)
wd719x_finish_cmd(scb, DID_RESET);
}
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
if (result)
return FAILED;
@@ -528,7 +528,7 @@ static int wd719x_host_reset(struct scsi_cmnd *cmd)
unsigned long flags;
dev_info(&wd->pdev->dev, "host reset requested\n");
- spin_lock_irqsave(wd->sh->host_lock, flags);
+ spin_lock_irqsave(&wd->sh->host_lock, flags);
/* stop the RISC */
if (wd719x_direct_cmd(wd, WD719X_CMD_SLEEP, 0, 0, 0, 0,
WD719X_WAIT_FOR_RISC))
@@ -539,7 +539,7 @@ static int wd719x_host_reset(struct scsi_cmnd *cmd)
/* flush all SCBs */
list_for_each_entry_safe(scb, tmp, &wd->active_scbs, list)
wd719x_finish_cmd(scb, DID_RESET);
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
/* Try to reinit the RISC */
return wd719x_chip_init(wd) == 0 ? SUCCESS : FAILED;
@@ -663,7 +663,7 @@ static irqreturn_t wd719x_interrupt(int irq, void *dev_id)
unsigned long flags;
u32 SCB_out;
- spin_lock_irqsave(wd->sh->host_lock, flags);
+ spin_lock_irqsave(&wd->sh->host_lock, flags);
/* read SCB pointer back from card */
SCB_out = wd719x_readl(wd, WD719X_AMR_SCB_OUT);
/* read all status info at once */
@@ -671,7 +671,7 @@ static irqreturn_t wd719x_interrupt(int irq, void *dev_id)
switch (regs.bytes.INT) {
case WD719X_INT_NONE:
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
return IRQ_NONE;
case WD719X_INT_LINKNOSTATUS:
dev_err(&wd->pdev->dev, "linked command completed with no status\n");
@@ -708,7 +708,7 @@ static irqreturn_t wd719x_interrupt(int irq, void *dev_id)
}
/* clear interrupt so another can happen */
wd719x_writeb(wd, WD719X_AMR_INT_STATUS, WD719X_INT_NONE);
- spin_unlock_irqrestore(wd->sh->host_lock, flags);
+ spin_unlock_irqrestore(&wd->sh->host_lock, flags);
return IRQ_HANDLED;
}
diff --git a/drivers/scsi/xen-scsifront.c b/drivers/scsi/xen-scsifront.c
index 989bcaee42ca..b37657953245 100644
--- a/drivers/scsi/xen-scsifront.c
+++ b/drivers/scsi/xen-scsifront.c
@@ -367,6 +367,7 @@ static void scsifront_do_response(struct vscsifrnt_info *info,
struct vscsifrnt_shadow *shadow;
if (ring_rsp->rqid >= VSCSIIF_MAX_REQS ||
+ !info->shadow[ring_rsp->rqid] ||
!info->shadow[ring_rsp->rqid]->inflight) {
scsifront_set_error(info, "illegal rqid returned by backend!");
return;
@@ -417,13 +418,13 @@ static int scsifront_cmd_done(struct vscsifrnt_info *info,
int more_to_do;
unsigned long flags;
- spin_lock_irqsave(info->host->host_lock, flags);
+ spin_lock_irqsave(&info->host->host_lock, flags);
more_to_do = scsifront_ring_drain(info, eoiflag);
info->wait_ring_available = 0;
- spin_unlock_irqrestore(info->host->host_lock, flags);
+ spin_unlock_irqrestore(&info->host->host_lock, flags);
wake_up(&info->wq_sync);
@@ -619,9 +620,9 @@ static enum scsi_qc_status scsifront_queuecommand(struct Scsi_Host *shost,
shadow->sc = sc;
shadow->act = VSCSIIF_ACT_SCSI_CDB;
- spin_lock_irqsave(shost->host_lock, flags);
+ spin_lock_irqsave(&shost->host_lock, flags);
if (scsifront_enter(info)) {
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return SCSI_MLQUEUE_HOST_BUSY;
}
@@ -629,7 +630,7 @@ static enum scsi_qc_status scsifront_queuecommand(struct Scsi_Host *shost,
if (err < 0) {
pr_debug("%s: err %d\n", __func__, err);
scsifront_return(info);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
if (err == -ENOMEM)
return SCSI_MLQUEUE_HOST_BUSY;
sc->result = DID_ERROR << 16;
@@ -643,13 +644,13 @@ static enum scsi_qc_status scsifront_queuecommand(struct Scsi_Host *shost,
}
scsifront_return(info);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
return 0;
busy:
scsifront_return(info);
- spin_unlock_irqrestore(shost->host_lock, flags);
+ spin_unlock_irqrestore(&shost->host_lock, flags);
pr_debug("%s: busy\n", __func__);
return SCSI_MLQUEUE_HOST_BUSY;
}
@@ -679,7 +680,7 @@ static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act)
shadow->ref_rqid = s->rqid;
init_waitqueue_head(&shadow->wq_reset);
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
for (;;) {
if (scsifront_enter(info))
@@ -692,15 +693,15 @@ static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act)
if (err)
goto fail;
info->wait_ring_available = 1;
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
err = wait_event_interruptible(info->wq_sync,
!info->wait_ring_available);
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
}
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
err = wait_event_interruptible(shadow->wq_reset, shadow->wait_reset);
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
if (!err) {
err = shadow->rslt_reset;
@@ -714,11 +715,11 @@ static int scsifront_action_handler(struct scsi_cmnd *sc, uint8_t act)
}
scsifront_return(info);
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
return err;
fail:
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
kfree(shadow);
return FAILED;
}
@@ -953,12 +954,12 @@ static int scsifront_resume(struct xenbus_device *dev)
struct Scsi_Host *host = info->host;
int err;
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
/* Finish all still pending commands. */
scsifront_finish_all(info);
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
/* Reconnect to dom0. */
scsifront_free_ring(info);
@@ -981,18 +982,18 @@ static int scsifront_suspend(struct xenbus_device *dev)
int err = 0;
/* No new commands for the backend. */
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
info->pause = 1;
while (info->callers && !err) {
info->waiting_pause = 1;
info->wait_ring_available = 0;
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
wake_up(&info->wq_sync);
err = wait_event_interruptible(info->wq_pause,
!info->waiting_pause);
- spin_lock_irq(host->host_lock);
+ spin_lock_irq(&host->host_lock);
}
- spin_unlock_irq(host->host_lock);
+ spin_unlock_irq(&host->host_lock);
return err;
}
@@ -1076,7 +1077,7 @@ static void scsifront_do_lun_hotplug(struct vscsifrnt_info *info, int op)
/*
* Front device state path, used in sdev_configure called
- * on successfull scsi_add_device, and in sdev_destroy called
+ * on successful scsi_add_device, and in sdev_destroy called
* on remove of a device.
*/
snprintf(info->dev_state_path, sizeof(info->dev_state_path),
diff --git a/drivers/scsi/zorro7xx.c b/drivers/scsi/zorro7xx.c
index 21c769dc1ecb..89475632675c 100644
--- a/drivers/scsi/zorro7xx.c
+++ b/drivers/scsi/zorro7xx.c
@@ -35,38 +35,45 @@ static struct scsi_host_template zorro7xx_scsi_driver_template = {
.module = THIS_MODULE,
};
-static struct zorro_driver_data {
+struct zorro_driver_data {
const char *name;
unsigned long offset;
int absolute; /* offset is absolute address */
-} zorro7xx_driver_data[] = {
- { .name = "PowerUP 603e+", .offset = 0xf40000, .absolute = 1 },
- { .name = "WarpEngine 40xx", .offset = 0x40000 },
- { .name = "A4091", .offset = 0x800000 },
- { .name = "GForce 040/060", .offset = 0x40000 },
- { 0 }
+};
+
+static const struct zorro_driver_data zorro7xx_blizzard_603e_plus_data = {
+ .name = "PowerUP 603e+", .offset = 0xf40000, .absolute = 1
+};
+static const struct zorro_driver_data zorro7xx_warp_engine_40xx_data = {
+ .name = "WarpEngine 40xx", .offset = 0x40000
+};
+static const struct zorro_driver_data zorro7xx_a4091_data = {
+ .name = "A4091", .offset = 0x800000
+};
+static const struct zorro_driver_data zorro7xx_gforce_040_060_data = {
+ .name = "GForce 040/060", .offset = 0x40000
};
static struct zorro_device_id zorro7xx_zorro_tbl[] = {
{
.id = ZORRO_PROD_PHASE5_BLIZZARD_603E_PLUS,
- .driver_data_ptr = &zorro7xx_driver_data[0],
+ .driver_data_ptr = &zorro7xx_blizzard_603e_plus_data,
},
{
.id = ZORRO_PROD_MACROSYSTEMS_WARP_ENGINE_40xx,
- .driver_data_ptr = &zorro7xx_driver_data[1],
+ .driver_data_ptr = &zorro7xx_warp_engine_40xx_data,
},
{
.id = ZORRO_PROD_CBM_A4091_1,
- .driver_data_ptr = &zorro7xx_driver_data[2],
+ .driver_data_ptr = &zorro7xx_a4091_data,
},
{
.id = ZORRO_PROD_CBM_A4091_2,
- .driver_data_ptr = &zorro7xx_driver_data[2],
+ .driver_data_ptr = &zorro7xx_a4091_data,
},
{
.id = ZORRO_PROD_GVP_GFORCE_040_060,
- .driver_data_ptr = &zorro7xx_driver_data[3],
+ .driver_data_ptr = &zorro7xx_gforce_040_060_data,
},
{ }
};