Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (38 commits) [SCSI] More buffer->request_buffer changes [SCSI] mptfusion: bump version to 3.04.01 [SCSI] mptfusion: misc fix's [SCSI] mptfusion: firmware download boot fix's [SCSI] mptfusion: task abort fix's [SCSI] mptfusion: sas nexus loss support [SCSI] mptfusion: sas loginfo update [SCSI] mptfusion: mptctl panic when loading [SCSI] mptfusion: sas enclosures with smart drive [SCSI] NCR_D700: misc fixes (section and argument ordering) [SCSI] scsi_debug: must_check fixes [SCSI] scsi_transport_sas: kill the use of channel [SCSI] scsi_transport_sas: add expander backlink [SCSI] hide EH backup data outside the scsi_cmnd [SCSI] ibmvscsi: handle inactive SCSI target during probe [SCSI] ibmvscsi: allocate lpevents for ibmvscsi on iseries [SCSI] aic7[9x]xx: Remove last vestiges of reverse_scan [SCSI] aha152x: stop poking at saved scsi_cmnd members [SCSI] st.c: Improve sense output [SCSI] lpfc 8.1.7: Change version number to 8.1.7 ...
This commit is contained in:
@@ -48,10 +48,8 @@ config FUSION_SAS
|
||||
List of supported controllers:
|
||||
|
||||
LSISAS1064
|
||||
LSISAS1066
|
||||
LSISAS1068
|
||||
LSISAS1064E
|
||||
LSISAS1066E
|
||||
LSISAS1068E
|
||||
|
||||
config FUSION_MAX_SGE
|
||||
|
@@ -9,7 +9,6 @@
|
||||
#EXTRA_CFLAGS += -DMPT_DEBUG_EXIT
|
||||
#EXTRA_CFLAGS += -DMPT_DEBUG_FAIL
|
||||
|
||||
|
||||
#
|
||||
# driver/module specifics...
|
||||
#
|
||||
|
@@ -436,8 +436,6 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
|
||||
*/
|
||||
if (pEvReply->MsgFlags & MPI_MSGFLAGS_CONTINUATION_REPLY) {
|
||||
freereq = 0;
|
||||
devtverboseprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p does not return Request frame\n",
|
||||
ioc->name, pEvReply));
|
||||
} else {
|
||||
devtverboseprintk((MYIOC_s_WARN_FMT "EVENT_NOTIFICATION reply %p returns Request frame\n",
|
||||
ioc->name, pEvReply));
|
||||
@@ -678,19 +676,19 @@ int
|
||||
mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)
|
||||
{
|
||||
MPT_ADAPTER *ioc;
|
||||
const struct pci_device_id *id;
|
||||
|
||||
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS) {
|
||||
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
MptDeviceDriverHandlers[cb_idx] = dd_cbfunc;
|
||||
|
||||
/* call per pci device probe entry point */
|
||||
list_for_each_entry(ioc, &ioc_list, list) {
|
||||
if(dd_cbfunc->probe) {
|
||||
dd_cbfunc->probe(ioc->pcidev,
|
||||
ioc->pcidev->driver->id_table);
|
||||
}
|
||||
id = ioc->pcidev->driver ?
|
||||
ioc->pcidev->driver->id_table : NULL;
|
||||
if (dd_cbfunc->probe)
|
||||
dd_cbfunc->probe(ioc->pcidev, id);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1056,9 +1054,8 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init)
|
||||
|
||||
dinitprintk((MYIOC_s_INFO_FMT
|
||||
"host_page_buffer @ %p, dma @ %x, sz=%d bytes\n",
|
||||
ioc->name,
|
||||
ioc->HostPageBuffer,
|
||||
ioc->HostPageBuffer_dma,
|
||||
ioc->name, ioc->HostPageBuffer,
|
||||
(u32)ioc->HostPageBuffer_dma,
|
||||
host_page_buffer_sz));
|
||||
ioc->alloc_total += host_page_buffer_sz;
|
||||
ioc->HostPageBuffer_sz = host_page_buffer_sz;
|
||||
@@ -1380,6 +1377,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
printk(KERN_WARNING MYNAM
|
||||
": WARNING - %s did not initialize properly! (%d)\n",
|
||||
ioc->name, r);
|
||||
|
||||
list_del(&ioc->list);
|
||||
if (ioc->alt_ioc)
|
||||
ioc->alt_ioc->alt_ioc = NULL;
|
||||
@@ -1762,9 +1760,9 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
* chips (mpt_adapter_disable,
|
||||
* mpt_diag_reset)
|
||||
*/
|
||||
ioc->cached_fw = NULL;
|
||||
ddlprintk((MYIOC_s_INFO_FMT ": mpt_upload: alt_%s has cached_fw=%p \n",
|
||||
ioc->name, ioc->alt_ioc->name, ioc->alt_ioc->cached_fw));
|
||||
ioc->alt_ioc->cached_fw = NULL;
|
||||
}
|
||||
} else {
|
||||
printk(KERN_WARNING MYNAM ": firmware upload failure!\n");
|
||||
@@ -1885,7 +1883,7 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
||||
/* FIXME? Examine results here? */
|
||||
}
|
||||
|
||||
out:
|
||||
out:
|
||||
if ((ret != 0) && irq_allocated) {
|
||||
free_irq(ioc->pci_irq, ioc);
|
||||
if (mpt_msi_enable)
|
||||
@@ -2670,6 +2668,7 @@ SendIocInit(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
dinitprintk((MYIOC_s_INFO_FMT "INFO - Wait IOC_OPERATIONAL state (cnt=%d)\n",
|
||||
ioc->name, count));
|
||||
|
||||
ioc->aen_event_read_flag=0;
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -2737,6 +2736,8 @@ mpt_alloc_fw_memory(MPT_ADAPTER *ioc, int size)
|
||||
if (ioc->alt_ioc && ioc->alt_ioc->cached_fw) {
|
||||
ioc->cached_fw = ioc->alt_ioc->cached_fw; /* use alt_ioc's memory */
|
||||
ioc->cached_fw_dma = ioc->alt_ioc->cached_fw_dma;
|
||||
ioc->alloc_total += size;
|
||||
ioc->alt_ioc->alloc_total -= size;
|
||||
} else {
|
||||
if ( (ioc->cached_fw = pci_alloc_consistent(ioc->pcidev, size, &ioc->cached_fw_dma) ) )
|
||||
ioc->alloc_total += size;
|
||||
@@ -3166,6 +3167,7 @@ KickStart(MPT_ADAPTER *ioc, int force, int sleepFlag)
|
||||
static int
|
||||
mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
{
|
||||
MPT_ADAPTER *iocp=NULL;
|
||||
u32 diag0val;
|
||||
u32 doorbell;
|
||||
int hard_reset_done = 0;
|
||||
@@ -3301,17 +3303,23 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
/* FIXME? Examine results here? */
|
||||
}
|
||||
|
||||
if (ioc->cached_fw) {
|
||||
if (ioc->cached_fw)
|
||||
iocp = ioc;
|
||||
else if (ioc->alt_ioc && ioc->alt_ioc->cached_fw)
|
||||
iocp = ioc->alt_ioc;
|
||||
if (iocp) {
|
||||
/* If the DownloadBoot operation fails, the
|
||||
* IOC will be left unusable. This is a fatal error
|
||||
* case. _diag_reset will return < 0
|
||||
*/
|
||||
for (count = 0; count < 30; count ++) {
|
||||
diag0val = CHIPREG_READ32(&ioc->chip->Diagnostic);
|
||||
diag0val = CHIPREG_READ32(&iocp->chip->Diagnostic);
|
||||
if (!(diag0val & MPI_DIAG_RESET_ADAPTER)) {
|
||||
break;
|
||||
}
|
||||
|
||||
dprintk((MYIOC_s_INFO_FMT "cached_fw: diag0val=%x count=%d\n",
|
||||
iocp->name, diag0val, count));
|
||||
/* wait 1 sec */
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
msleep (1000);
|
||||
@@ -3320,7 +3328,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
||||
}
|
||||
}
|
||||
if ((count = mpt_downloadboot(ioc,
|
||||
(MpiFwHeader_t *)ioc->cached_fw, sleepFlag)) < 0) {
|
||||
(MpiFwHeader_t *)iocp->cached_fw, sleepFlag)) < 0) {
|
||||
printk(KERN_WARNING MYNAM
|
||||
": firmware downloadboot failure (%d)!\n", count);
|
||||
}
|
||||
@@ -3907,18 +3915,18 @@ WaitForDoorbellAck(MPT_ADAPTER *ioc, int howlong, int sleepFlag)
|
||||
|
||||
if (sleepFlag == CAN_SLEEP) {
|
||||
while (--cntdn) {
|
||||
msleep (1);
|
||||
intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
|
||||
if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS))
|
||||
break;
|
||||
msleep (1);
|
||||
count++;
|
||||
}
|
||||
} else {
|
||||
while (--cntdn) {
|
||||
mdelay (1);
|
||||
intstat = CHIPREG_READ32(&ioc->chip->IntStatus);
|
||||
if (! (intstat & MPI_HIS_IOP_DOORBELL_STATUS))
|
||||
break;
|
||||
mdelay (1);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@@ -4883,6 +4891,7 @@ mpt_read_ioc_pg_4(MPT_ADAPTER *ioc)
|
||||
pIoc4 = pci_alloc_consistent(ioc->pcidev, iocpage4sz, &ioc4_dma);
|
||||
if (!pIoc4)
|
||||
return;
|
||||
ioc->alloc_total += iocpage4sz;
|
||||
} else {
|
||||
ioc4_dma = ioc->spi_data.IocPg4_dma;
|
||||
iocpage4sz = ioc->spi_data.IocPg4Sz;
|
||||
@@ -4899,6 +4908,7 @@ mpt_read_ioc_pg_4(MPT_ADAPTER *ioc)
|
||||
} else {
|
||||
pci_free_consistent(ioc->pcidev, iocpage4sz, pIoc4, ioc4_dma);
|
||||
ioc->spi_data.pIocPg4 = NULL;
|
||||
ioc->alloc_total -= iocpage4sz;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5030,19 +5040,18 @@ SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp)
|
||||
EventAck_t *pAck;
|
||||
|
||||
if ((pAck = (EventAck_t *) mpt_get_msg_frame(mpt_base_index, ioc)) == NULL) {
|
||||
printk(MYIOC_s_WARN_FMT "Unable to allocate event ACK "
|
||||
"request frame for Event=%x EventContext=%x EventData=%x!\n",
|
||||
ioc->name, evnp->Event, le32_to_cpu(evnp->EventContext),
|
||||
le32_to_cpu(evnp->Data[0]));
|
||||
dfailprintk((MYIOC_s_WARN_FMT "%s, no msg frames!!\n",
|
||||
ioc->name,__FUNCTION__));
|
||||
return -1;
|
||||
}
|
||||
memset(pAck, 0, sizeof(*pAck));
|
||||
|
||||
dprintk((MYIOC_s_INFO_FMT "Sending EventAck\n", ioc->name));
|
||||
devtverboseprintk((MYIOC_s_INFO_FMT "Sending EventAck\n", ioc->name));
|
||||
|
||||
pAck->Function = MPI_FUNCTION_EVENT_ACK;
|
||||
pAck->ChainOffset = 0;
|
||||
pAck->Reserved[0] = pAck->Reserved[1] = 0;
|
||||
pAck->MsgFlags = 0;
|
||||
pAck->Reserved1[0] = pAck->Reserved1[1] = pAck->Reserved1[2] = 0;
|
||||
pAck->Event = evnp->Event;
|
||||
pAck->EventContext = evnp->EventContext;
|
||||
|
||||
@@ -5704,9 +5713,9 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
||||
break;
|
||||
case MPI_EVENT_EVENT_CHANGE:
|
||||
if (evData0)
|
||||
ds = "Events(ON) Change";
|
||||
ds = "Events ON";
|
||||
else
|
||||
ds = "Events(OFF) Change";
|
||||
ds = "Events OFF";
|
||||
break;
|
||||
case MPI_EVENT_INTEGRATED_RAID:
|
||||
{
|
||||
@@ -5777,8 +5786,27 @@ EventDescriptionStr(u8 event, u32 evData0, char *evStr)
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_NO_PERSIST_ADDED:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: No Persistancy "
|
||||
"Added: id=%d", id);
|
||||
"SAS Device Status Change: No Persistancy: id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Internal Device Reset : id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_TASK_ABORT_INTERNAL:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Internal Task Abort : id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_ABORT_TASK_SET_INTERNAL:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Internal Abort Task Set : id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_CLEAR_TASK_SET_INTERNAL:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Internal Clear Task Set : id=%d", id);
|
||||
break;
|
||||
case MPI_EVENT_SAS_DEV_STAT_RC_QUERY_TASK_INTERNAL:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
"SAS Device Status Change: Internal Query Task : id=%d", id);
|
||||
break;
|
||||
default:
|
||||
snprintf(evStr, EVENT_DESCR_STR_SZ,
|
||||
@@ -6034,7 +6062,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
|
||||
* @ioc: Pointer to MPT_ADAPTER structure
|
||||
* @log_info: U32 LogInfo reply word from the IOC
|
||||
*
|
||||
* Refer to lsi/fc_log.h.
|
||||
* Refer to lsi/mpi_log_fc.h.
|
||||
*/
|
||||
static void
|
||||
mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info)
|
||||
@@ -6131,8 +6159,10 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
|
||||
"Invalid SAS Address", /* 01h */
|
||||
NULL, /* 02h */
|
||||
"Invalid Page", /* 03h */
|
||||
NULL, /* 04h */
|
||||
"Task Terminated" /* 05h */
|
||||
"Diag Message Error", /* 04h */
|
||||
"Task Terminated", /* 05h */
|
||||
"Enclosure Management", /* 06h */
|
||||
"Target Mode" /* 07h */
|
||||
};
|
||||
static char *pl_code_str[] = {
|
||||
NULL, /* 00h */
|
||||
@@ -6158,7 +6188,7 @@ mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info)
|
||||
"IO Executed", /* 14h */
|
||||
"Persistant Reservation Out Not Affiliation Owner", /* 15h */
|
||||
"Open Transmit DMA Abort", /* 16h */
|
||||
NULL, /* 17h */
|
||||
"IO Device Missing Delay Retry", /* 17h */
|
||||
NULL, /* 18h */
|
||||
NULL, /* 19h */
|
||||
NULL, /* 1Ah */
|
||||
@@ -6238,7 +6268,7 @@ static void
|
||||
mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
|
||||
{
|
||||
u32 status = ioc_status & MPI_IOCSTATUS_MASK;
|
||||
char *desc = "";
|
||||
char *desc = NULL;
|
||||
|
||||
switch (status) {
|
||||
case MPI_IOCSTATUS_INVALID_FUNCTION: /* 0x0001 */
|
||||
@@ -6348,7 +6378,7 @@ mpt_sp_ioc_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf)
|
||||
desc = "Others";
|
||||
break;
|
||||
}
|
||||
if (desc != "")
|
||||
if (desc != NULL)
|
||||
printk(MYIOC_s_INFO_FMT "IOCStatus(0x%04x): %s\n", ioc->name, status, desc);
|
||||
}
|
||||
|
||||
@@ -6386,7 +6416,6 @@ EXPORT_SYMBOL(mpt_alloc_fw_memory);
|
||||
EXPORT_SYMBOL(mpt_free_fw_memory);
|
||||
EXPORT_SYMBOL(mptbase_sas_persist_operation);
|
||||
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* fusion_init - Fusion MPT base driver initialization routine.
|
||||
|
@@ -75,8 +75,8 @@
|
||||
#define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.00"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.00"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.01"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.01"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
@@ -307,8 +307,8 @@ typedef struct _SYSIF_REGS
|
||||
u32 HostIndex; /* 50 Host Index register */
|
||||
u32 Reserved4[15]; /* 54-8F */
|
||||
u32 Fubar; /* 90 For Fubar usage */
|
||||
u32 Reserved5[1050];/* 94-10F8 */
|
||||
u32 Reset_1078; /* 10FC Reset 1078 */
|
||||
u32 Reserved5[1050];/* 94-10F8 */
|
||||
u32 Reset_1078; /* 10FC Reset 1078 */
|
||||
} SYSIF_REGS;
|
||||
|
||||
/*
|
||||
@@ -363,6 +363,7 @@ typedef struct _VirtDevice {
|
||||
#define MPT_TARGET_FLAGS_VALID_56 0x10
|
||||
#define MPT_TARGET_FLAGS_SAF_TE_ISSUED 0x20
|
||||
#define MPT_TARGET_FLAGS_RAID_COMPONENT 0x40
|
||||
#define MPT_TARGET_FLAGS_LED_ON 0x80
|
||||
|
||||
/*
|
||||
* /proc/mpt interface
|
||||
@@ -634,7 +635,6 @@ typedef struct _MPT_ADAPTER
|
||||
u16 handle;
|
||||
int sas_index; /* index refrencing */
|
||||
MPT_SAS_MGMT sas_mgmt;
|
||||
int num_ports;
|
||||
struct work_struct sas_persist_task;
|
||||
|
||||
struct work_struct fc_setup_reset_work;
|
||||
@@ -644,7 +644,6 @@ typedef struct _MPT_ADAPTER
|
||||
struct work_struct fc_rescan_work;
|
||||
char fc_rescan_work_q_name[KOBJ_NAME_LEN];
|
||||
struct workqueue_struct *fc_rescan_work_q;
|
||||
u8 port_serial_number;
|
||||
} MPT_ADAPTER;
|
||||
|
||||
/*
|
||||
@@ -982,7 +981,7 @@ typedef struct _MPT_SCSI_HOST {
|
||||
wait_queue_head_t scandv_waitq;
|
||||
int scandv_wait_done;
|
||||
long last_queue_full;
|
||||
u8 mpt_pq_filter;
|
||||
u16 tm_iocstatus;
|
||||
} MPT_SCSI_HOST;
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
@@ -2332,7 +2332,7 @@ done_free_mem:
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/* Prototype Routine for the HP HOST INFO command.
|
||||
/* Prototype Routine for the HOST INFO command.
|
||||
*
|
||||
* Outputs: None.
|
||||
* Return: 0 if successful
|
||||
@@ -2568,7 +2568,7 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/* Prototype Routine for the HP TARGET INFO command.
|
||||
/* Prototype Routine for the TARGET INFO command.
|
||||
*
|
||||
* Outputs: None.
|
||||
* Return: 0 if successful
|
||||
|
@@ -354,9 +354,6 @@ struct mpt_ioctl_command32 {
|
||||
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* HP Specific IOCTL Defines and Structures
|
||||
*/
|
||||
|
||||
#define CPQFCTS_IOC_MAGIC 'Z'
|
||||
#define HP_IOC_MAGIC 'Z'
|
||||
@@ -364,8 +361,6 @@ struct mpt_ioctl_command32 {
|
||||
#define HP_GETHOSTINFO1 _IOR(HP_IOC_MAGIC, 20, hp_host_info_rev0_t)
|
||||
#define HP_GETTARGETINFO _IOR(HP_IOC_MAGIC, 21, hp_target_info_t)
|
||||
|
||||
/* All HP IOCTLs must include this header
|
||||
*/
|
||||
typedef struct _hp_header {
|
||||
unsigned int iocnum;
|
||||
unsigned int host;
|
||||
|
@@ -77,10 +77,6 @@ MODULE_DESCRIPTION(my_NAME);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
/* Command line args */
|
||||
static int mpt_pq_filter = 0;
|
||||
module_param(mpt_pq_filter, int, 0);
|
||||
MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1 (default=0)");
|
||||
|
||||
#define MPTFC_DEV_LOSS_TMO (60)
|
||||
static int mptfc_dev_loss_tmo = MPTFC_DEV_LOSS_TMO; /* reasonable default */
|
||||
module_param(mptfc_dev_loss_tmo, int, 0);
|
||||
@@ -513,8 +509,7 @@ mptfc_slave_alloc(struct scsi_device *sdev)
|
||||
|
||||
if (vtarget->num_luns == 0) {
|
||||
vtarget->ioc_id = hd->ioc->id;
|
||||
vtarget->tflags = MPT_TARGET_FLAGS_Q_YES |
|
||||
MPT_TARGET_FLAGS_VALID_INQUIRY;
|
||||
vtarget->tflags = MPT_TARGET_FLAGS_Q_YES;
|
||||
hd->Targets[sdev->id] = vtarget;
|
||||
}
|
||||
|
||||
@@ -1129,13 +1124,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
hd->timer.data = (unsigned long) hd;
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
hd->mpt_pq_filter = mpt_pq_filter;
|
||||
|
||||
ddvprintk((MYIOC_s_INFO_FMT
|
||||
"mpt_pq_filter %x\n",
|
||||
ioc->name,
|
||||
mpt_pq_filter));
|
||||
|
||||
init_waitqueue_head(&hd->scandv_waitq);
|
||||
hd->scandv_wait_done = 0;
|
||||
hd->last_queue_full = 0;
|
||||
|
@@ -67,20 +67,19 @@
|
||||
#define my_VERSION MPT_LINUX_VERSION_COMMON
|
||||
#define MYNAM "mptsas"
|
||||
|
||||
/*
|
||||
* Reserved channel for integrated raid
|
||||
*/
|
||||
#define MPTSAS_RAID_CHANNEL 1
|
||||
|
||||
MODULE_AUTHOR(MODULEAUTHOR);
|
||||
MODULE_DESCRIPTION(my_NAME);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static int mpt_pq_filter;
|
||||
module_param(mpt_pq_filter, int, 0);
|
||||
MODULE_PARM_DESC(mpt_pq_filter,
|
||||
"Enable peripheral qualifier filter: enable=1 "
|
||||
"(default=0)");
|
||||
|
||||
static int mpt_pt_clear;
|
||||
module_param(mpt_pt_clear, int, 0);
|
||||
MODULE_PARM_DESC(mpt_pt_clear,
|
||||
"Clear persistency table: enable=1 "
|
||||
" Clear persistency table: enable=1 "
|
||||
"(default=MPTSCSIH_PT_CLEAR=0)");
|
||||
|
||||
static int mptsasDoneCtx = -1;
|
||||
@@ -144,7 +143,6 @@ struct mptsas_devinfo {
|
||||
* Specific details on ports, wide/narrow
|
||||
*/
|
||||
struct mptsas_portinfo_details{
|
||||
u8 port_id; /* port number provided to transport */
|
||||
u16 num_phys; /* number of phys belong to this port */
|
||||
u64 phy_bitmask; /* TODO, extend support for 255 phys */
|
||||
struct sas_rphy *rphy; /* transport layer rphy object */
|
||||
@@ -350,10 +348,10 @@ mptsas_port_delete(struct mptsas_portinfo_details * port_details)
|
||||
port_info = port_details->port_info;
|
||||
phy_info = port_info->phy_info;
|
||||
|
||||
dsaswideprintk((KERN_DEBUG "%s: [%p]: port=%02d num_phys=%02d "
|
||||
dsaswideprintk((KERN_DEBUG "%s: [%p]: num_phys=%02d "
|
||||
"bitmask=0x%016llX\n",
|
||||
__FUNCTION__, port_details, port_details->port_id,
|
||||
port_details->num_phys, port_details->phy_bitmask));
|
||||
__FUNCTION__, port_details, port_details->num_phys,
|
||||
port_details->phy_bitmask));
|
||||
|
||||
for (i = 0; i < port_info->num_phys; i++, phy_info++) {
|
||||
if(phy_info->port_details != port_details)
|
||||
@@ -462,9 +460,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
* phy be removed by firmware events.
|
||||
*/
|
||||
dsaswideprintk((KERN_DEBUG
|
||||
"%s: [%p]: port=%d deleting phy = %d\n",
|
||||
__FUNCTION__, port_details,
|
||||
port_details->port_id, i));
|
||||
"%s: [%p]: deleting phy = %d\n",
|
||||
__FUNCTION__, port_details, i));
|
||||
port_details->num_phys--;
|
||||
port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
|
||||
memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
|
||||
@@ -493,7 +490,6 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
goto out;
|
||||
port_details->num_phys = 1;
|
||||
port_details->port_info = port_info;
|
||||
port_details->port_id = ioc->port_serial_number++;
|
||||
if (phy_info->phy_id < 64 )
|
||||
port_details->phy_bitmask |=
|
||||
(1 << phy_info->phy_id);
|
||||
@@ -525,12 +521,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
mptsas_get_port(phy_info_cmp);
|
||||
port_details->starget =
|
||||
mptsas_get_starget(phy_info_cmp);
|
||||
port_details->port_id =
|
||||
phy_info_cmp->port_details->port_id;
|
||||
port_details->num_phys =
|
||||
phy_info_cmp->port_details->num_phys;
|
||||
// port_info->port_serial_number--;
|
||||
ioc->port_serial_number--;
|
||||
if (!phy_info_cmp->port_details->num_phys)
|
||||
kfree(phy_info_cmp->port_details);
|
||||
} else
|
||||
@@ -554,11 +546,11 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
||||
if (!port_details)
|
||||
continue;
|
||||
dsaswideprintk((KERN_DEBUG
|
||||
"%s: [%p]: phy_id=%02d port_id=%02d num_phys=%02d "
|
||||
"%s: [%p]: phy_id=%02d num_phys=%02d "
|
||||
"bitmask=0x%016llX\n",
|
||||
__FUNCTION__,
|
||||
port_details, i, port_details->port_id,
|
||||
port_details->num_phys, port_details->phy_bitmask));
|
||||
port_details, i, port_details->num_phys,
|
||||
port_details->phy_bitmask));
|
||||
dsaswideprintk((KERN_DEBUG"\t\tport = %p rphy=%p\n",
|
||||
port_details->port, port_details->rphy));
|
||||
}
|
||||
@@ -651,16 +643,13 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
|
||||
static int
|
||||
mptsas_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct Scsi_Host *host = sdev->host;
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)host->hostdata;
|
||||
|
||||
/*
|
||||
* RAID volumes placed beyond the last expected port.
|
||||
* Ignore sending sas mode pages in that case..
|
||||
*/
|
||||
if (sdev->channel < hd->ioc->num_ports)
|
||||
sas_read_port_mode_page(sdev);
|
||||
if (sdev->channel == MPTSAS_RAID_CHANNEL)
|
||||
goto out;
|
||||
|
||||
sas_read_port_mode_page(sdev);
|
||||
|
||||
out:
|
||||
return mptscsih_slave_configure(sdev);
|
||||
}
|
||||
|
||||
@@ -689,10 +678,7 @@ mptsas_target_alloc(struct scsi_target *starget)
|
||||
|
||||
hd->Targets[target_id] = vtarget;
|
||||
|
||||
/*
|
||||
* RAID volumes placed beyond the last expected port.
|
||||
*/
|
||||
if (starget->channel == hd->ioc->num_ports)
|
||||
if (starget->channel == MPTSAS_RAID_CHANNEL)
|
||||
goto out;
|
||||
|
||||
rphy = dev_to_rphy(starget->dev.parent);
|
||||
@@ -743,7 +729,7 @@ mptsas_target_destroy(struct scsi_target *starget)
|
||||
if (!starget->hostdata)
|
||||
return;
|
||||
|
||||
if (starget->channel == hd->ioc->num_ports)
|
||||
if (starget->channel == MPTSAS_RAID_CHANNEL)
|
||||
goto out;
|
||||
|
||||
rphy = dev_to_rphy(starget->dev.parent);
|
||||
@@ -783,10 +769,7 @@ mptsas_slave_alloc(struct scsi_device *sdev)
|
||||
starget = scsi_target(sdev);
|
||||
vdev->vtarget = starget->hostdata;
|
||||
|
||||
/*
|
||||
* RAID volumes placed beyond the last expected port.
|
||||
*/
|
||||
if (sdev->channel == hd->ioc->num_ports)
|
||||
if (sdev->channel == MPTSAS_RAID_CHANNEL)
|
||||
goto out;
|
||||
|
||||
rphy = dev_to_rphy(sdev->sdev_target->dev.parent);
|
||||
@@ -1608,11 +1591,7 @@ static int mptsas_probe_one_phy(struct device *dev,
|
||||
if (phy_info->sas_port_add_phy) {
|
||||
|
||||
if (!port) {
|
||||
port = sas_port_alloc(dev,
|
||||
phy_info->port_details->port_id);
|
||||
dsaswideprintk((KERN_DEBUG
|
||||
"sas_port_alloc: port=%p dev=%p port_id=%d\n",
|
||||
port, dev, phy_info->port_details->port_id));
|
||||
port = sas_port_alloc_num(dev);
|
||||
if (!port) {
|
||||
error = -ENOMEM;
|
||||
goto out;
|
||||
@@ -1625,6 +1604,9 @@ static int mptsas_probe_one_phy(struct device *dev,
|
||||
goto out;
|
||||
}
|
||||
mptsas_set_port(phy_info, port);
|
||||
dsaswideprintk((KERN_DEBUG
|
||||
"sas_port_alloc: port=%p dev=%p port_id=%d\n",
|
||||
port, dev, port->port_identifier));
|
||||
}
|
||||
dsaswideprintk((KERN_DEBUG "sas_port_add_phy: phy_id=%d\n",
|
||||
phy_info->phy_id));
|
||||
@@ -1736,7 +1718,6 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc)
|
||||
hba = NULL;
|
||||
}
|
||||
mutex_unlock(&ioc->sas_topology_mutex);
|
||||
ioc->num_ports = port_info->num_phys;
|
||||
|
||||
for (i = 0; i < port_info->num_phys; i++) {
|
||||
mptsas_sas_phy_pg0(ioc, &port_info->phy_info[i],
|
||||
@@ -1939,7 +1920,8 @@ mptsas_delete_expander_phys(MPT_ADAPTER *ioc)
|
||||
expander_sas_address)
|
||||
continue;
|
||||
#ifdef MPT_DEBUG_SAS_WIDE
|
||||
dev_printk(KERN_DEBUG, &port->dev, "delete\n");
|
||||
dev_printk(KERN_DEBUG, &port->dev,
|
||||
"delete port (%d)\n", port->port_identifier);
|
||||
#endif
|
||||
sas_port_delete(port);
|
||||
mptsas_port_delete(phy_info->port_details);
|
||||
@@ -1984,7 +1966,7 @@ mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
|
||||
if (!ioc->raid_data.pIocPg2->NumActiveVolumes)
|
||||
goto out;
|
||||
for (i=0; i<ioc->raid_data.pIocPg2->NumActiveVolumes; i++) {
|
||||
scsi_add_device(ioc->sh, ioc->num_ports,
|
||||
scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL,
|
||||
ioc->raid_data.pIocPg2->RaidVolume[i].VolumeID, 0);
|
||||
}
|
||||
out:
|
||||
@@ -2185,7 +2167,8 @@ mptsas_hotplug_work(void *arg)
|
||||
ioc->name, ds, ev->channel, ev->id, phy_info->phy_id);
|
||||
|
||||
#ifdef MPT_DEBUG_SAS_WIDE
|
||||
dev_printk(KERN_DEBUG, &port->dev, "delete\n");
|
||||
dev_printk(KERN_DEBUG, &port->dev,
|
||||
"delete port (%d)\n", port->port_identifier);
|
||||
#endif
|
||||
sas_port_delete(port);
|
||||
mptsas_port_delete(phy_info->port_details);
|
||||
@@ -2289,35 +2272,26 @@ mptsas_hotplug_work(void *arg)
|
||||
mptsas_set_rphy(phy_info, rphy);
|
||||
break;
|
||||
case MPTSAS_ADD_RAID:
|
||||
sdev = scsi_device_lookup(
|
||||
ioc->sh,
|
||||
ioc->num_ports,
|
||||
ev->id,
|
||||
0);
|
||||
sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
|
||||
ev->id, 0);
|
||||
if (sdev) {
|
||||
scsi_device_put(sdev);
|
||||
break;
|
||||
}
|
||||
printk(MYIOC_s_INFO_FMT
|
||||
"attaching raid volume, channel %d, id %d\n",
|
||||
ioc->name, ioc->num_ports, ev->id);
|
||||
scsi_add_device(ioc->sh,
|
||||
ioc->num_ports,
|
||||
ev->id,
|
||||
0);
|
||||
ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
|
||||
scsi_add_device(ioc->sh, MPTSAS_RAID_CHANNEL, ev->id, 0);
|
||||
mpt_findImVolumes(ioc);
|
||||
break;
|
||||
case MPTSAS_DEL_RAID:
|
||||
sdev = scsi_device_lookup(
|
||||
ioc->sh,
|
||||
ioc->num_ports,
|
||||
ev->id,
|
||||
0);
|
||||
sdev = scsi_device_lookup(ioc->sh, MPTSAS_RAID_CHANNEL,
|
||||
ev->id, 0);
|
||||
if (!sdev)
|
||||
break;
|
||||
printk(MYIOC_s_INFO_FMT
|
||||
"removing raid volume, channel %d, id %d\n",
|
||||
ioc->name, ioc->num_ports, ev->id);
|
||||
ioc->name, MPTSAS_RAID_CHANNEL, ev->id);
|
||||
vdevice = sdev->hostdata;
|
||||
vdevice->vtarget->deleted = 1;
|
||||
mptsas_target_reset(ioc, vdevice->vtarget);
|
||||
@@ -2723,7 +2697,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
hd->timer.data = (unsigned long) hd;
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
hd->mpt_pq_filter = mpt_pq_filter;
|
||||
ioc->sas_data.ptClear = mpt_pt_clear;
|
||||
|
||||
if (ioc->sas_data.ptClear==1) {
|
||||
@@ -2731,12 +2704,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ioc, MPI_SAS_OP_CLEAR_ALL_PERSISTENT);
|
||||
}
|
||||
|
||||
ddvprintk((MYIOC_s_INFO_FMT
|
||||
"mpt_pq_filter %x mpt_pq_filter %x\n",
|
||||
ioc->name,
|
||||
mpt_pq_filter,
|
||||
mpt_pq_filter));
|
||||
|
||||
init_waitqueue_head(&hd->scandv_waitq);
|
||||
hd->scandv_wait_done = 0;
|
||||
hd->last_queue_full = 0;
|
||||
|
@@ -66,6 +66,7 @@
|
||||
|
||||
#include "mptbase.h"
|
||||
#include "mptscsih.h"
|
||||
#include "lsi/mpi_log_sas.h"
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
#define my_NAME "Fusion MPT SCSI Host driver"
|
||||
@@ -127,7 +128,7 @@ static void mptscsih_freeChainBuffers(MPT_ADAPTER *ioc, int req_idx);
|
||||
static void mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR *mf, SCSIIOReply_t *pScsiReply);
|
||||
static int mptscsih_tm_pending_wait(MPT_SCSI_HOST * hd);
|
||||
static int mptscsih_tm_wait_for_completion(MPT_SCSI_HOST * hd, ulong timeout );
|
||||
static u32 SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
|
||||
static int SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc);
|
||||
|
||||
static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, int ctx2abort, ulong timeout);
|
||||
|
||||
@@ -497,6 +498,34 @@ nextSGEset:
|
||||
return SUCCESS;
|
||||
} /* mptscsih_AddSGE() */
|
||||
|
||||
static void
|
||||
mptscsih_issue_sep_command(MPT_ADAPTER *ioc, VirtTarget *vtarget,
|
||||
U32 SlotStatus)
|
||||
{
|
||||
MPT_FRAME_HDR *mf;
|
||||
SEPRequest_t *SEPMsg;
|
||||
|
||||
if (ioc->bus_type == FC)
|
||||
return;
|
||||
|
||||
if ((mf = mpt_get_msg_frame(ioc->InternalCtx, ioc)) == NULL) {
|
||||
dfailprintk((MYIOC_s_WARN_FMT "%s: no msg frames!!\n",
|
||||
ioc->name,__FUNCTION__));
|
||||
return;
|
||||
}
|
||||
|
||||
SEPMsg = (SEPRequest_t *)mf;
|
||||
SEPMsg->Function = MPI_FUNCTION_SCSI_ENCLOSURE_PROCESSOR;
|
||||
SEPMsg->Bus = vtarget->bus_id;
|
||||
SEPMsg->TargetID = vtarget->target_id;
|
||||
SEPMsg->Action = MPI_SEP_REQ_ACTION_WRITE_STATUS;
|
||||
SEPMsg->SlotStatus = SlotStatus;
|
||||
devtverboseprintk((MYIOC_s_WARN_FMT
|
||||
"Sending SEP cmd=%x id=%d bus=%d\n",
|
||||
ioc->name, SlotStatus, SEPMsg->TargetID, SEPMsg->Bus));
|
||||
mpt_put_msg_frame(ioc->DoneCtx, ioc, mf);
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/*
|
||||
* mptscsih_io_done - Main SCSI IO callback routine registered to
|
||||
@@ -520,6 +549,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
SCSIIORequest_t *pScsiReq;
|
||||
SCSIIOReply_t *pScsiReply;
|
||||
u16 req_idx, req_idx_MR;
|
||||
VirtDevice *vdev;
|
||||
VirtTarget *vtarget;
|
||||
|
||||
hd = (MPT_SCSI_HOST *) ioc->sh->hostdata;
|
||||
|
||||
@@ -538,6 +569,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
}
|
||||
|
||||
sc = hd->ScsiLookup[req_idx];
|
||||
hd->ScsiLookup[req_idx] = NULL;
|
||||
if (sc == NULL) {
|
||||
MPIHeader_t *hdr = (MPIHeader_t *)mf;
|
||||
|
||||
@@ -553,6 +585,12 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ((unsigned char *)mf != sc->host_scribble) {
|
||||
mptscsih_freeChainBuffers(ioc, req_idx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
sc->host_scribble = NULL;
|
||||
sc->result = DID_OK << 16; /* Set default reply as OK */
|
||||
pScsiReq = (SCSIIORequest_t *) mf;
|
||||
pScsiReply = (SCSIIOReply_t *) mr;
|
||||
@@ -640,10 +678,36 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
|
||||
if (hd->sel_timeout[pScsiReq->TargetID] < 0xFFFF)
|
||||
hd->sel_timeout[pScsiReq->TargetID]++;
|
||||
|
||||
vdev = sc->device->hostdata;
|
||||
if (!vdev)
|
||||
break;
|
||||
vtarget = vdev->vtarget;
|
||||
if (vtarget->tflags & MPT_TARGET_FLAGS_LED_ON) {
|
||||
mptscsih_issue_sep_command(ioc, vtarget,
|
||||
MPI_SEP_REQ_SLOTSTATUS_UNCONFIGURED);
|
||||
vtarget->tflags &= ~MPT_TARGET_FLAGS_LED_ON;
|
||||
}
|
||||
break;
|
||||
|
||||
case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
|
||||
case MPI_IOCSTATUS_SCSI_IOC_TERMINATED: /* 0x004B */
|
||||
if ( ioc->bus_type == SAS ) {
|
||||
u16 ioc_status = le16_to_cpu(pScsiReply->IOCStatus);
|
||||
if (ioc_status & MPI_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE) {
|
||||
u32 log_info = le32_to_cpu(mr->u.reply.IOCLogInfo);
|
||||
log_info &=SAS_LOGINFO_MASK;
|
||||
if (log_info == SAS_LOGINFO_NEXUS_LOSS) {
|
||||
sc->result = (DID_BUS_BUSY << 16);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Allow non-SAS & non-NEXUS_LOSS to drop into below code
|
||||
*/
|
||||
|
||||
case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
|
||||
case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
|
||||
/* Linux handles an unsolicited DID_RESET better
|
||||
* than an unsolicited DID_ABORT.
|
||||
@@ -658,7 +722,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
sc->result=DID_SOFT_ERROR << 16;
|
||||
else /* Sufficient data transfer occurred */
|
||||
sc->result = (DID_OK << 16) | scsi_status;
|
||||
dreplyprintk((KERN_NOTICE
|
||||
dreplyprintk((KERN_NOTICE
|
||||
"RESIDUAL_MISMATCH: result=%x on id=%d\n", sc->result, sc->device->id));
|
||||
break;
|
||||
|
||||
@@ -784,8 +848,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
||||
sc->request_bufflen, sc->sc_data_direction);
|
||||
}
|
||||
|
||||
hd->ScsiLookup[req_idx] = NULL;
|
||||
|
||||
sc->scsi_done(sc); /* Issue the command callback */
|
||||
|
||||
/* Free Chain buffers */
|
||||
@@ -827,9 +889,17 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
|
||||
dmfprintk(( "flush: ScsiDone (mf=%p,sc=%p)\n",
|
||||
mf, SCpnt));
|
||||
|
||||
/* Free Chain buffers */
|
||||
mptscsih_freeChainBuffers(ioc, ii);
|
||||
|
||||
/* Free Message frames */
|
||||
mpt_free_msg_frame(ioc, mf);
|
||||
|
||||
if ((unsigned char *)mf != SCpnt->host_scribble)
|
||||
continue;
|
||||
|
||||
/* Set status, free OS resources (SG DMA buffers)
|
||||
* Do OS callback
|
||||
* Free driver resources (chain, msg buffers)
|
||||
*/
|
||||
if (SCpnt->use_sg) {
|
||||
pci_unmap_sg(ioc->pcidev,
|
||||
@@ -845,12 +915,6 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
|
||||
SCpnt->result = DID_RESET << 16;
|
||||
SCpnt->host_scribble = NULL;
|
||||
|
||||
/* Free Chain buffers */
|
||||
mptscsih_freeChainBuffers(ioc, ii);
|
||||
|
||||
/* Free Message frames */
|
||||
mpt_free_msg_frame(ioc, mf);
|
||||
|
||||
SCpnt->scsi_done(SCpnt); /* Issue the command callback */
|
||||
}
|
||||
}
|
||||
@@ -887,10 +951,10 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
|
||||
if ((sc = hd->ScsiLookup[ii]) != NULL) {
|
||||
|
||||
mf = (SCSIIORequest_t *)MPT_INDEX_2_MFPTR(hd->ioc, ii);
|
||||
|
||||
if (mf == NULL)
|
||||
continue;
|
||||
dsprintk(( "search_running: found (sc=%p, mf = %p) target %d, lun %d \n",
|
||||
hd->ScsiLookup[ii], mf, mf->TargetID, mf->LUN[1]));
|
||||
|
||||
if ((mf->TargetID != ((u8)vdevice->vtarget->target_id)) || (mf->LUN[1] != ((u8) vdevice->lun)))
|
||||
continue;
|
||||
|
||||
@@ -899,6 +963,8 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
|
||||
hd->ScsiLookup[ii] = NULL;
|
||||
mptscsih_freeChainBuffers(hd->ioc, ii);
|
||||
mpt_free_msg_frame(hd->ioc, (MPT_FRAME_HDR *)mf);
|
||||
if ((unsigned char *)mf != sc->host_scribble)
|
||||
continue;
|
||||
if (sc->use_sg) {
|
||||
pci_unmap_sg(hd->ioc->pcidev,
|
||||
(struct scatterlist *) sc->request_buffer,
|
||||
@@ -1341,8 +1407,8 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
SCpnt->host_scribble = (unsigned char *)mf;
|
||||
hd->ScsiLookup[my_idx] = SCpnt;
|
||||
SCpnt->host_scribble = NULL;
|
||||
|
||||
mpt_put_msg_frame(hd->ioc->DoneCtx, hd->ioc, mf);
|
||||
dmfprintk((MYIOC_s_INFO_FMT "Issued SCSI cmd (%p) mf=%p idx=%d\n",
|
||||
@@ -1529,6 +1595,12 @@ mptscsih_TMHandler(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 target, u8 lun, in
|
||||
rc = mpt_HardResetHandler(hd->ioc, CAN_SLEEP);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check IOCStatus from TM reply message
|
||||
*/
|
||||
if (hd->tm_iocstatus != MPI_IOCSTATUS_SUCCESS)
|
||||
rc = FAILED;
|
||||
|
||||
dtmprintk((MYIOC_s_INFO_FMT "TMHandler rc = %d!\n", hd->ioc->name, rc));
|
||||
|
||||
return rc;
|
||||
@@ -1654,6 +1726,7 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
|
||||
int scpnt_idx;
|
||||
int retval;
|
||||
VirtDevice *vdev;
|
||||
ulong sn = SCpnt->serial_number;
|
||||
|
||||
/* If we can't locate our host adapter structure, return FAILED status.
|
||||
*/
|
||||
@@ -1707,6 +1780,11 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
|
||||
vdev->vtarget->bus_id, vdev->vtarget->target_id, vdev->lun,
|
||||
ctx2abort, mptscsih_get_tm_timeout(hd->ioc));
|
||||
|
||||
if (SCPNT_TO_LOOKUP_IDX(SCpnt) == scpnt_idx &&
|
||||
SCpnt->serial_number == sn) {
|
||||
retval = FAILED;
|
||||
}
|
||||
|
||||
printk (KERN_WARNING MYNAM ": %s: task abort: %s (sc=%p)\n",
|
||||
hd->ioc->name,
|
||||
((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt);
|
||||
@@ -2023,6 +2101,7 @@ mptscsih_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *m
|
||||
DBG_DUMP_TM_REPLY_FRAME((u32 *)pScsiTmReply);
|
||||
|
||||
iocstatus = le16_to_cpu(pScsiTmReply->IOCStatus) & MPI_IOCSTATUS_MASK;
|
||||
hd->tm_iocstatus = iocstatus;
|
||||
dtmprintk((MYIOC_s_WARN_FMT " SCSI TaskMgmt (%d) IOCStatus=%04x IOCLogInfo=%08x\n",
|
||||
ioc->name, tmType, iocstatus, le32_to_cpu(pScsiTmReply->IOCLogInfo)));
|
||||
/* Error? (anything non-zero?) */
|
||||
@@ -2401,6 +2480,13 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
|
||||
ioc->events[idx].data[1] = (sense_data[13] << 8) || sense_data[12];
|
||||
|
||||
ioc->eventContext++;
|
||||
if (hd->ioc->pcidev->vendor ==
|
||||
PCI_VENDOR_ID_IBM) {
|
||||
mptscsih_issue_sep_command(hd->ioc,
|
||||
vdev->vtarget, MPI_SEP_REQ_SLOTSTATUS_PREDICTED_FAULT);
|
||||
vdev->vtarget->tflags |=
|
||||
MPT_TARGET_FLAGS_LED_ON;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -2409,7 +2495,7 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
|
||||
}
|
||||
}
|
||||
|
||||
static u32
|
||||
static int
|
||||
SCPNT_TO_LOOKUP_IDX(struct scsi_cmnd *sc)
|
||||
{
|
||||
MPT_SCSI_HOST *hd;
|
||||
|
@@ -83,10 +83,6 @@ static int mpt_saf_te = MPTSCSIH_SAF_TE;
|
||||
module_param(mpt_saf_te, int, 0);
|
||||
MODULE_PARM_DESC(mpt_saf_te, " Force enabling SEP Processor: enable=1 (default=MPTSCSIH_SAF_TE=0)");
|
||||
|
||||
static int mpt_pq_filter = 0;
|
||||
module_param(mpt_pq_filter, int, 0);
|
||||
MODULE_PARM_DESC(mpt_pq_filter, " Enable peripheral qualifier filter: enable=1 (default=0)");
|
||||
|
||||
static void mptspi_write_offset(struct scsi_target *, int);
|
||||
static void mptspi_write_width(struct scsi_target *, int);
|
||||
static int mptspi_write_spi_device_pg1(struct scsi_target *,
|
||||
@@ -1047,14 +1043,12 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
ioc->spi_data.Saf_Te = mpt_saf_te;
|
||||
hd->mpt_pq_filter = mpt_pq_filter;
|
||||
|
||||
hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
|
||||
ddvprintk((MYIOC_s_INFO_FMT
|
||||
"saf_te %x mpt_pq_filter %x\n",
|
||||
"saf_te %x\n",
|
||||
ioc->name,
|
||||
mpt_saf_te,
|
||||
mpt_pq_filter));
|
||||
mpt_saf_te));
|
||||
ioc->spi_data.noQas = 0;
|
||||
|
||||
init_waitqueue_head(&hd->scandv_waitq);
|
||||
|
Reference in New Issue
Block a user