Merge branch 'master' into for-2.6.31
Conflicts: drivers/block/hd.c drivers/block/mg_disk.c Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
@@ -636,6 +636,14 @@ _base_unmask_interrupts(struct MPT2SAS_ADAPTER *ioc)
|
||||
static irqreturn_t
|
||||
_base_interrupt(int irq, void *bus_id)
|
||||
{
|
||||
union reply_descriptor {
|
||||
u64 word;
|
||||
struct {
|
||||
u32 low;
|
||||
u32 high;
|
||||
} u;
|
||||
};
|
||||
union reply_descriptor rd;
|
||||
u32 post_index, post_index_next, completed_cmds;
|
||||
u8 request_desript_type;
|
||||
u16 smid;
|
||||
@@ -656,7 +664,8 @@ _base_interrupt(int irq, void *bus_id)
|
||||
|
||||
completed_cmds = 0;
|
||||
do {
|
||||
if (ioc->reply_post_free[post_index].Words == ~0ULL)
|
||||
rd.word = ioc->reply_post_free[post_index].Words;
|
||||
if (rd.u.low == UINT_MAX || rd.u.high == UINT_MAX)
|
||||
goto out;
|
||||
reply = 0;
|
||||
cb_idx = 0xFF;
|
||||
@@ -721,7 +730,7 @@ _base_interrupt(int irq, void *bus_id)
|
||||
for (i = 0 ; i < completed_cmds; i++) {
|
||||
post_index = post_index_next;
|
||||
/* poison the reply post descriptor */
|
||||
ioc->reply_post_free[post_index_next].Words = ~0ULL;
|
||||
ioc->reply_post_free[post_index_next].Words = ULLONG_MAX;
|
||||
post_index_next = (post_index ==
|
||||
(ioc->reply_post_queue_depth - 1))
|
||||
? 0 : post_index + 1;
|
||||
@@ -1386,6 +1395,64 @@ mpt2sas_base_put_smid_target_assist(struct MPT2SAS_ADAPTER *ioc, u16 smid,
|
||||
&ioc->scsi_lookup_lock);
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_display_dell_branding - Disply branding string
|
||||
* @ioc: per adapter object
|
||||
*
|
||||
* Return nothing.
|
||||
*/
|
||||
static void
|
||||
_base_display_dell_branding(struct MPT2SAS_ADAPTER *ioc)
|
||||
{
|
||||
char dell_branding[MPT2SAS_DELL_BRANDING_SIZE];
|
||||
|
||||
if (ioc->pdev->subsystem_vendor != PCI_VENDOR_ID_DELL)
|
||||
return;
|
||||
|
||||
memset(dell_branding, 0, MPT2SAS_DELL_BRANDING_SIZE);
|
||||
switch (ioc->pdev->subsystem_device) {
|
||||
case MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID:
|
||||
strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID:
|
||||
strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID:
|
||||
strncpy(dell_branding,
|
||||
MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_PERC_H200_MODULAR_SSDID:
|
||||
strncpy(dell_branding,
|
||||
MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID:
|
||||
strncpy(dell_branding,
|
||||
MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_PERC_H200_SSDID:
|
||||
strncpy(dell_branding, MPT2SAS_DELL_PERC_H200_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
case MPT2SAS_DELL_6GBPS_SAS_SSDID:
|
||||
strncpy(dell_branding, MPT2SAS_DELL_6GBPS_SAS_BRANDING,
|
||||
MPT2SAS_DELL_BRANDING_SIZE - 1);
|
||||
break;
|
||||
default:
|
||||
sprintf(dell_branding, "0x%4X", ioc->pdev->subsystem_device);
|
||||
break;
|
||||
}
|
||||
|
||||
printk(MPT2SAS_INFO_FMT "%s: Vendor(0x%04X), Device(0x%04X),"
|
||||
" SSVID(0x%04X), SSDID(0x%04X)\n", ioc->name, dell_branding,
|
||||
ioc->pdev->vendor, ioc->pdev->device, ioc->pdev->subsystem_vendor,
|
||||
ioc->pdev->subsystem_device);
|
||||
}
|
||||
|
||||
/**
|
||||
* _base_display_ioc_capabilities - Disply IOC's capabilities.
|
||||
* @ioc: per adapter object
|
||||
@@ -1427,6 +1494,8 @@ _base_display_ioc_capabilities(struct MPT2SAS_ADAPTER *ioc)
|
||||
i++;
|
||||
}
|
||||
|
||||
_base_display_dell_branding(ioc);
|
||||
|
||||
i = 0;
|
||||
printk("), ");
|
||||
printk("Capabilities=(");
|
||||
@@ -3068,7 +3137,7 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
||||
|
||||
/* initialize Reply Post Free Queue */
|
||||
for (i = 0; i < ioc->reply_post_queue_depth; i++)
|
||||
ioc->reply_post_free[i].Words = ~0ULL;
|
||||
ioc->reply_post_free[i].Words = ULLONG_MAX;
|
||||
|
||||
r = _base_send_ioc_init(ioc, VF_ID, sleep_flag);
|
||||
if (r)
|
||||
|
@@ -68,11 +68,11 @@
|
||||
#define MPT2SAS_DRIVER_NAME "mpt2sas"
|
||||
#define MPT2SAS_AUTHOR "LSI Corporation <DL-MPTFusionLinux@lsi.com>"
|
||||
#define MPT2SAS_DESCRIPTION "LSI MPT Fusion SAS 2.0 Device Driver"
|
||||
#define MPT2SAS_DRIVER_VERSION "00.100.11.16"
|
||||
#define MPT2SAS_DRIVER_VERSION "01.100.02.00"
|
||||
#define MPT2SAS_MAJOR_VERSION 00
|
||||
#define MPT2SAS_MINOR_VERSION 100
|
||||
#define MPT2SAS_BUILD_VERSION 11
|
||||
#define MPT2SAS_RELEASE_VERSION 16
|
||||
#define MPT2SAS_BUILD_VERSION 02
|
||||
#define MPT2SAS_RELEASE_VERSION 00
|
||||
|
||||
/*
|
||||
* Set MPT2SAS_SG_DEPTH value based on user input.
|
||||
@@ -129,6 +129,30 @@
|
||||
#define MPT2SAS_WARN_FMT KERN_WARNING MPT2SAS_FMT
|
||||
#define MPT2SAS_ERR_FMT KERN_ERR MPT2SAS_FMT
|
||||
|
||||
/*
|
||||
* Dell HBA branding
|
||||
*/
|
||||
#define MPT2SAS_DELL_BRANDING_SIZE 32
|
||||
|
||||
#define MPT2SAS_DELL_6GBPS_SAS_HBA_BRANDING "Dell 6Gbps SAS HBA"
|
||||
#define MPT2SAS_DELL_PERC_H200_ADAPTER_BRANDING "Dell PERC H200 Adapter"
|
||||
#define MPT2SAS_DELL_PERC_H200_INTEGRATED_BRANDING "Dell PERC H200 Integrated"
|
||||
#define MPT2SAS_DELL_PERC_H200_MODULAR_BRANDING "Dell PERC H200 Modular"
|
||||
#define MPT2SAS_DELL_PERC_H200_EMBEDDED_BRANDING "Dell PERC H200 Embedded"
|
||||
#define MPT2SAS_DELL_PERC_H200_BRANDING "Dell PERC H200"
|
||||
#define MPT2SAS_DELL_6GBPS_SAS_BRANDING "Dell 6Gbps SAS"
|
||||
|
||||
/*
|
||||
* Dell HBA SSDIDs
|
||||
*/
|
||||
#define MPT2SAS_DELL_6GBPS_SAS_HBA_SSDID 0x1F1C
|
||||
#define MPT2SAS_DELL_PERC_H200_ADAPTER_SSDID 0x1F1D
|
||||
#define MPT2SAS_DELL_PERC_H200_INTEGRATED_SSDID 0x1F1E
|
||||
#define MPT2SAS_DELL_PERC_H200_MODULAR_SSDID 0x1F1F
|
||||
#define MPT2SAS_DELL_PERC_H200_EMBEDDED_SSDID 0x1F20
|
||||
#define MPT2SAS_DELL_PERC_H200_SSDID 0x1F21
|
||||
#define MPT2SAS_DELL_6GBPS_SAS_SSDID 0x1F22
|
||||
|
||||
/*
|
||||
* per target private data
|
||||
*/
|
||||
|
@@ -64,6 +64,9 @@
|
||||
static struct fasync_struct *async_queue;
|
||||
static DECLARE_WAIT_QUEUE_HEAD(ctl_poll_wait);
|
||||
|
||||
static int _ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type,
|
||||
u8 *issue_reset);
|
||||
|
||||
/**
|
||||
* enum block_state - blocking state
|
||||
* @NON_BLOCKING: non blocking
|
||||
@@ -378,10 +381,22 @@ _ctl_verify_adapter(int ioc_number, struct MPT2SAS_ADAPTER **iocpp)
|
||||
void
|
||||
mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
|
||||
{
|
||||
int i;
|
||||
u8 issue_reset;
|
||||
|
||||
switch (reset_phase) {
|
||||
case MPT2_IOC_PRE_RESET:
|
||||
dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
|
||||
"MPT2_IOC_PRE_RESET\n", ioc->name, __func__));
|
||||
for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
|
||||
if (!(ioc->diag_buffer_status[i] &
|
||||
MPT2_DIAG_BUFFER_IS_REGISTERED))
|
||||
continue;
|
||||
if ((ioc->diag_buffer_status[i] &
|
||||
MPT2_DIAG_BUFFER_IS_RELEASED))
|
||||
continue;
|
||||
_ctl_send_release(ioc, i, &issue_reset);
|
||||
}
|
||||
break;
|
||||
case MPT2_IOC_AFTER_RESET:
|
||||
dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
|
||||
@@ -395,6 +410,17 @@ mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase)
|
||||
case MPT2_IOC_DONE_RESET:
|
||||
dtmprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
|
||||
"MPT2_IOC_DONE_RESET\n", ioc->name, __func__));
|
||||
|
||||
for (i = 0; i < MPI2_DIAG_BUF_TYPE_COUNT; i++) {
|
||||
if (!(ioc->diag_buffer_status[i] &
|
||||
MPT2_DIAG_BUFFER_IS_REGISTERED))
|
||||
continue;
|
||||
if ((ioc->diag_buffer_status[i] &
|
||||
MPT2_DIAG_BUFFER_IS_RELEASED))
|
||||
continue;
|
||||
ioc->diag_buffer_status[i] |=
|
||||
MPT2_DIAG_BUFFER_IS_DIAG_RESET;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -714,8 +740,10 @@ _ctl_do_mpt_command(struct MPT2SAS_ADAPTER *ioc,
|
||||
|
||||
if (tm_request->TaskType ==
|
||||
MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK) {
|
||||
if (_ctl_do_task_abort(ioc, &karg, tm_request))
|
||||
if (_ctl_do_task_abort(ioc, &karg, tm_request)) {
|
||||
mpt2sas_base_free_smid(ioc, smid);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(&ioc->tm_cmds.mutex);
|
||||
@@ -915,9 +943,9 @@ _ctl_getiocinfo(void __user *arg)
|
||||
karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn);
|
||||
karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus);
|
||||
karg.firmware_version = ioc->facts.FWVersion.Word;
|
||||
strncpy(karg.driver_version, MPT2SAS_DRIVER_VERSION,
|
||||
MPT2_IOCTL_VERSION_LENGTH);
|
||||
karg.driver_version[MPT2_IOCTL_VERSION_LENGTH - 1] = '\0';
|
||||
strcpy(karg.driver_version, MPT2SAS_DRIVER_NAME);
|
||||
strcat(karg.driver_version, "-");
|
||||
strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION);
|
||||
karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion);
|
||||
|
||||
if (copy_to_user(arg, &karg, sizeof(karg))) {
|
||||
@@ -1550,6 +1578,105 @@ _ctl_diag_query(void __user *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* _ctl_send_release - Diag Release Message
|
||||
* @ioc: per adapter object
|
||||
* @buffer_type - specifies either TRACE or SNAPSHOT
|
||||
* @issue_reset - specifies whether host reset is required.
|
||||
*
|
||||
*/
|
||||
static int
|
||||
_ctl_send_release(struct MPT2SAS_ADAPTER *ioc, u8 buffer_type, u8 *issue_reset)
|
||||
{
|
||||
Mpi2DiagReleaseRequest_t *mpi_request;
|
||||
Mpi2DiagReleaseReply_t *mpi_reply;
|
||||
u16 smid;
|
||||
u16 ioc_status;
|
||||
u32 ioc_state;
|
||||
int rc;
|
||||
unsigned long timeleft;
|
||||
|
||||
dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
|
||||
__func__));
|
||||
|
||||
rc = 0;
|
||||
*issue_reset = 0;
|
||||
|
||||
ioc_state = mpt2sas_base_get_iocstate(ioc, 1);
|
||||
if (ioc_state != MPI2_IOC_STATE_OPERATIONAL) {
|
||||
dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: "
|
||||
"skipping due to FAULT state\n", ioc->name,
|
||||
__func__));
|
||||
rc = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx);
|
||||
if (!smid) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ioc->ctl_cmds.status = MPT2_CMD_PENDING;
|
||||
memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
|
||||
mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
|
||||
ioc->ctl_cmds.smid = smid;
|
||||
|
||||
mpi_request->Function = MPI2_FUNCTION_DIAG_RELEASE;
|
||||
mpi_request->BufferType = buffer_type;
|
||||
|
||||
mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID);
|
||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
||||
|
||||
if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
|
||||
__func__);
|
||||
_debug_dump_mf(mpi_request,
|
||||
sizeof(Mpi2DiagReleaseRequest_t)/4);
|
||||
if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
|
||||
*issue_reset = 1;
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* process the completed Reply Message Frame */
|
||||
if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: no reply message\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mpi_reply = ioc->ctl_cmds.reply;
|
||||
ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
|
||||
|
||||
if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
|
||||
ioc->diag_buffer_status[buffer_type] |=
|
||||
MPT2_DIAG_BUFFER_IS_RELEASED;
|
||||
dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: success\n",
|
||||
ioc->name, __func__));
|
||||
} else {
|
||||
printk(MPT2SAS_DEBUG_FMT "%s: ioc_status(0x%04x) "
|
||||
"log_info(0x%08x)\n", ioc->name, __func__,
|
||||
ioc_status, mpi_reply->IOCLogInfo);
|
||||
rc = -EFAULT;
|
||||
}
|
||||
|
||||
out:
|
||||
ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* _ctl_diag_release - request to send Diag Release Message to firmware
|
||||
* @arg - user space buffer containing ioctl content
|
||||
@@ -1566,12 +1693,7 @@ _ctl_diag_release(void __user *arg, enum block_state state)
|
||||
struct MPT2SAS_ADAPTER *ioc;
|
||||
void *request_data;
|
||||
int rc;
|
||||
Mpi2DiagReleaseRequest_t *mpi_request;
|
||||
Mpi2DiagReleaseReply_t *mpi_reply;
|
||||
u8 buffer_type;
|
||||
unsigned long timeleft;
|
||||
u16 smid;
|
||||
u16 ioc_status;
|
||||
u8 issue_reset = 0;
|
||||
|
||||
if (copy_from_user(&karg, arg, sizeof(karg))) {
|
||||
@@ -1621,80 +1743,30 @@ _ctl_diag_release(void __user *arg, enum block_state state)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* buffers were released by due to host reset */
|
||||
if ((ioc->diag_buffer_status[buffer_type] &
|
||||
MPT2_DIAG_BUFFER_IS_DIAG_RESET)) {
|
||||
ioc->diag_buffer_status[buffer_type] |=
|
||||
MPT2_DIAG_BUFFER_IS_RELEASED;
|
||||
ioc->diag_buffer_status[buffer_type] &=
|
||||
~MPT2_DIAG_BUFFER_IS_DIAG_RESET;
|
||||
printk(MPT2SAS_ERR_FMT "%s: buffer_type(0x%02x) "
|
||||
"was released due to host reset\n", ioc->name, __func__,
|
||||
buffer_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex))
|
||||
return -EAGAIN;
|
||||
else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex))
|
||||
return -ERESTARTSYS;
|
||||
|
||||
if (ioc->ctl_cmds.status != MPT2_CMD_NOT_USED) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: ctl_cmd in use\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
rc = _ctl_send_release(ioc, buffer_type, &issue_reset);
|
||||
|
||||
smid = mpt2sas_base_get_smid(ioc, ioc->ctl_cb_idx);
|
||||
if (!smid) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: failed obtaining a smid\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
ioc->ctl_cmds.status = MPT2_CMD_PENDING;
|
||||
memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz);
|
||||
mpi_request = mpt2sas_base_get_msg_frame(ioc, smid);
|
||||
ioc->ctl_cmds.smid = smid;
|
||||
|
||||
mpi_request->Function = MPI2_FUNCTION_DIAG_RELEASE;
|
||||
mpi_request->BufferType = buffer_type;
|
||||
|
||||
mpt2sas_base_put_smid_default(ioc, smid, mpi_request->VF_ID);
|
||||
timeleft = wait_for_completion_timeout(&ioc->ctl_cmds.done,
|
||||
MPT2_IOCTL_DEFAULT_TIMEOUT*HZ);
|
||||
|
||||
if (!(ioc->ctl_cmds.status & MPT2_CMD_COMPLETE)) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: timeout\n", ioc->name,
|
||||
__func__);
|
||||
_debug_dump_mf(mpi_request,
|
||||
sizeof(Mpi2DiagReleaseRequest_t)/4);
|
||||
if (!(ioc->ctl_cmds.status & MPT2_CMD_RESET))
|
||||
issue_reset = 1;
|
||||
goto issue_host_reset;
|
||||
}
|
||||
|
||||
/* process the completed Reply Message Frame */
|
||||
if ((ioc->ctl_cmds.status & MPT2_CMD_REPLY_VALID) == 0) {
|
||||
printk(MPT2SAS_ERR_FMT "%s: no reply message\n",
|
||||
ioc->name, __func__);
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mpi_reply = ioc->ctl_cmds.reply;
|
||||
ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK;
|
||||
|
||||
if (ioc_status == MPI2_IOCSTATUS_SUCCESS) {
|
||||
ioc->diag_buffer_status[buffer_type] |=
|
||||
MPT2_DIAG_BUFFER_IS_RELEASED;
|
||||
dctlprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s: success\n",
|
||||
ioc->name, __func__));
|
||||
} else {
|
||||
printk(MPT2SAS_DEBUG_FMT "%s: ioc_status(0x%04x) "
|
||||
"log_info(0x%08x)\n", ioc->name, __func__,
|
||||
ioc_status, mpi_reply->IOCLogInfo);
|
||||
rc = -EFAULT;
|
||||
}
|
||||
|
||||
issue_host_reset:
|
||||
if (issue_reset)
|
||||
mpt2sas_base_hard_reset_handler(ioc, CAN_SLEEP,
|
||||
FORCE_BIG_HAMMER);
|
||||
|
||||
out:
|
||||
|
||||
ioc->ctl_cmds.status = MPT2_CMD_NOT_USED;
|
||||
mutex_unlock(&ioc->ctl_cmds.mutex);
|
||||
return rc;
|
||||
}
|
||||
|
@@ -50,7 +50,7 @@
|
||||
#endif
|
||||
|
||||
#define MPT2SAS_DEV_NAME "mpt2ctl"
|
||||
#define MPT2_MAGIC_NUMBER 'm'
|
||||
#define MPT2_MAGIC_NUMBER 'L'
|
||||
#define MPT2_IOCTL_DEFAULT_TIMEOUT (10) /* in seconds */
|
||||
|
||||
/**
|
||||
@@ -295,8 +295,9 @@ struct mpt2_ioctl_btdh_mapping {
|
||||
|
||||
|
||||
/* status bits for ioc->diag_buffer_status */
|
||||
#define MPT2_DIAG_BUFFER_IS_REGISTERED (0x01)
|
||||
#define MPT2_DIAG_BUFFER_IS_RELEASED (0x02)
|
||||
#define MPT2_DIAG_BUFFER_IS_REGISTERED (0x01)
|
||||
#define MPT2_DIAG_BUFFER_IS_RELEASED (0x02)
|
||||
#define MPT2_DIAG_BUFFER_IS_DIAG_RESET (0x04)
|
||||
|
||||
/* application flags for mpt2_diag_register, mpt2_diag_query */
|
||||
#define MPT2_APP_FLAGS_APP_OWNED (0x0001)
|
||||
|
@@ -119,7 +119,7 @@ struct sense_info {
|
||||
*/
|
||||
struct fw_event_work {
|
||||
struct list_head list;
|
||||
struct delayed_work work;
|
||||
struct work_struct work;
|
||||
struct MPT2SAS_ADAPTER *ioc;
|
||||
u8 VF_ID;
|
||||
u8 host_reset_handling;
|
||||
@@ -516,12 +516,8 @@ _scsih_sas_device_add(struct MPT2SAS_ADAPTER *ioc,
|
||||
handle = sas_device->handle;
|
||||
parent_handle = sas_device->parent_handle;
|
||||
sas_address = sas_device->sas_address;
|
||||
if (!mpt2sas_transport_port_add(ioc, handle, parent_handle)) {
|
||||
if (!mpt2sas_transport_port_add(ioc, handle, parent_handle))
|
||||
_scsih_sas_device_remove(ioc, sas_device);
|
||||
} else if (!sas_device->starget) {
|
||||
mpt2sas_transport_port_remove(ioc, sas_address, parent_handle);
|
||||
_scsih_sas_device_remove(ioc, sas_device);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1203,7 +1199,9 @@ scsih_target_destroy(struct scsi_target *starget)
|
||||
rphy = dev_to_rphy(starget->dev.parent);
|
||||
sas_device = mpt2sas_scsih_sas_device_find_by_sas_address(ioc,
|
||||
rphy->identify.sas_address);
|
||||
if (sas_device)
|
||||
if (sas_device && (sas_device->starget == starget) &&
|
||||
(sas_device->id == starget->id) &&
|
||||
(sas_device->channel == starget->channel))
|
||||
sas_device->starget = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&ioc->sas_device_lock, flags);
|
||||
@@ -2009,8 +2007,8 @@ _scsih_fw_event_add(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work *fw_event)
|
||||
|
||||
spin_lock_irqsave(&ioc->fw_event_lock, flags);
|
||||
list_add_tail(&fw_event->list, &ioc->fw_event_list);
|
||||
INIT_DELAYED_WORK(&fw_event->work, _firmware_event_work);
|
||||
queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, 1);
|
||||
INIT_WORK(&fw_event->work, _firmware_event_work);
|
||||
queue_work(ioc->firmware_event_thread, &fw_event->work);
|
||||
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
|
||||
}
|
||||
|
||||
@@ -2054,7 +2052,7 @@ _scsih_fw_event_requeue(struct MPT2SAS_ADAPTER *ioc, struct fw_event_work
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&ioc->fw_event_lock, flags);
|
||||
queue_delayed_work(ioc->firmware_event_thread, &fw_event->work, delay);
|
||||
queue_work(ioc->firmware_event_thread, &fw_event->work);
|
||||
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
|
||||
}
|
||||
|
||||
@@ -2863,8 +2861,9 @@ scsih_io_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 VF_ID, u32 reply)
|
||||
struct sense_info data;
|
||||
const void *sense_data = mpt2sas_base_get_sense_buffer(ioc,
|
||||
smid);
|
||||
memcpy(scmd->sense_buffer, sense_data,
|
||||
u32 sz = min_t(u32, SCSI_SENSE_BUFFERSIZE,
|
||||
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)
|
||||
@@ -3923,7 +3922,7 @@ _scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
||||
|
||||
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
||||
MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30);
|
||||
termination_count += le32_to_cpu(mpi_reply->TerminationCount);
|
||||
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
||||
|
||||
if ((mpi_reply->IOCStatus == MPI2_IOCSTATUS_SUCCESS) &&
|
||||
(mpi_reply->ResponseCode ==
|
||||
@@ -3933,10 +3932,10 @@ _scsih_sas_broadcast_primative_event(struct MPT2SAS_ADAPTER *ioc, u8 VF_ID,
|
||||
continue;
|
||||
|
||||
mpt2sas_scsih_issue_tm(ioc, handle, lun,
|
||||
MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, smid, 30);
|
||||
MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 30);
|
||||
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
||||
termination_count += le32_to_cpu(mpi_reply->TerminationCount);
|
||||
}
|
||||
ioc->tm_cmds.status = MPT2_CMD_NOT_USED;
|
||||
ioc->broadcast_aen_busy = 0;
|
||||
mutex_unlock(&ioc->tm_cmds.mutex);
|
||||
|
||||
@@ -4962,7 +4961,7 @@ static void
|
||||
_firmware_event_work(struct work_struct *work)
|
||||
{
|
||||
struct fw_event_work *fw_event = container_of(work,
|
||||
struct fw_event_work, work.work);
|
||||
struct fw_event_work, work);
|
||||
unsigned long flags;
|
||||
struct MPT2SAS_ADAPTER *ioc = fw_event->ioc;
|
||||
|
||||
|
Reference in New Issue
Block a user