mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (209 commits) [SCSI] fix oops during scsi scanning [SCSI] libsrp: fix memory leak in srp_ring_free() [SCSI] libiscsi, bnx2i: make bound ep check common [SCSI] libiscsi: add completion function for drivers that do not need pdu processing [SCSI] scsi_dh_rdac: changes for rdac debug logging [SCSI] scsi_dh_rdac: changes to collect the rdac debug information during the initialization [SCSI] scsi_dh_rdac: move the init code from rdac_activate to rdac_bus_attach [SCSI] sg: fix oops in the error path in sg_build_indirect() [SCSI] mptsas : Bump version to 3.04.12 [SCSI] mptsas : FW event thread and scsi mid layer deadlock in SYNCHRONIZE CACHE command [SCSI] mptsas : Send DID_NO_CONNECT for pending IOs of removed device [SCSI] mptsas : PAE Kernel more than 4 GB kernel panic [SCSI] mptsas : NULL pointer on big endian systems causing Expander not to tear off [SCSI] mptsas : Sanity check for phyinfo is added [SCSI] scsi_dh_rdac: Add support for Sun StorageTek ST2500, ST2510 and ST2530 [SCSI] pmcraid: PMC-Sierra MaxRAID driver to support 6Gb/s SAS RAID controller [SCSI] qla2xxx: Update version number to 8.03.01-k6. [SCSI] qla2xxx: Properly delete rports attached to a vport. [SCSI] qla2xxx: Correct various NPIV issues. [SCSI] qla2xxx: Correct qla2x00_eh_wait_on_command() to wait correctly. ...
This commit is contained in:
commit
39695224bd
112 changed files with 14377 additions and 4867 deletions
|
|
@ -1015,9 +1015,9 @@ mpt_add_sge_64bit(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
|
|||
{
|
||||
SGESimple64_t *pSge = (SGESimple64_t *) pAddr;
|
||||
pSge->Address.Low = cpu_to_le32
|
||||
(lower_32_bits((unsigned long)(dma_addr)));
|
||||
(lower_32_bits(dma_addr));
|
||||
pSge->Address.High = cpu_to_le32
|
||||
(upper_32_bits((unsigned long)dma_addr));
|
||||
(upper_32_bits(dma_addr));
|
||||
pSge->FlagsLength = cpu_to_le32
|
||||
((flagslength | MPT_SGE_FLAGS_64_BIT_ADDRESSING));
|
||||
}
|
||||
|
|
@ -1038,8 +1038,8 @@ mpt_add_sge_64bit_1078(void *pAddr, u32 flagslength, dma_addr_t dma_addr)
|
|||
u32 tmp;
|
||||
|
||||
pSge->Address.Low = cpu_to_le32
|
||||
(lower_32_bits((unsigned long)(dma_addr)));
|
||||
tmp = (u32)(upper_32_bits((unsigned long)dma_addr));
|
||||
(lower_32_bits(dma_addr));
|
||||
tmp = (u32)(upper_32_bits(dma_addr));
|
||||
|
||||
/*
|
||||
* 1078 errata workaround for the 36GB limitation
|
||||
|
|
@ -1101,7 +1101,7 @@ mpt_add_chain_64bit(void *pAddr, u8 next, u16 length, dma_addr_t dma_addr)
|
|||
pChain->NextChainOffset = next;
|
||||
|
||||
pChain->Address.Low = cpu_to_le32(tmp);
|
||||
tmp = (u32)(upper_32_bits((unsigned long)dma_addr));
|
||||
tmp = (u32)(upper_32_bits(dma_addr));
|
||||
pChain->Address.High = cpu_to_le32(tmp);
|
||||
}
|
||||
|
||||
|
|
@ -1297,12 +1297,8 @@ mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init)
|
|||
psge = (char *)&ioc_init->HostPageBufferSGE;
|
||||
flags_length = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
|
||||
MPI_SGE_FLAGS_SYSTEM_ADDRESS |
|
||||
MPI_SGE_FLAGS_32_BIT_ADDRESSING |
|
||||
MPI_SGE_FLAGS_HOST_TO_IOC |
|
||||
MPI_SGE_FLAGS_END_OF_BUFFER;
|
||||
if (sizeof(dma_addr_t) == sizeof(u64)) {
|
||||
flags_length |= MPI_SGE_FLAGS_64_BIT_ADDRESSING;
|
||||
}
|
||||
flags_length = flags_length << MPI_SGE_FLAGS_SHIFT;
|
||||
flags_length |= ioc->HostPageBuffer_sz;
|
||||
ioc->add_sge(psge, flags_length, ioc->HostPageBuffer_dma);
|
||||
|
|
@ -2224,8 +2220,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|||
int hard;
|
||||
int rc=0;
|
||||
int ii;
|
||||
u8 cb_idx;
|
||||
int handlers;
|
||||
int ret = 0;
|
||||
int reset_alt_ioc_active = 0;
|
||||
int irq_allocated = 0;
|
||||
|
|
@ -2548,34 +2542,6 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|||
mpt_get_manufacturing_pg_0(ioc);
|
||||
}
|
||||
|
||||
/*
|
||||
* Call each currently registered protocol IOC reset handler
|
||||
* with post-reset indication.
|
||||
* NOTE: If we're doing _IOC_BRINGUP, there can be no
|
||||
* MptResetHandlers[] registered yet.
|
||||
*/
|
||||
if (hard_reset_done) {
|
||||
rc = handlers = 0;
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if ((ret == 0) && MptResetHandlers[cb_idx]) {
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Calling IOC post_reset handler #%d\n",
|
||||
ioc->name, cb_idx));
|
||||
rc += mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);
|
||||
handlers++;
|
||||
}
|
||||
|
||||
if (alt_ioc_ready && MptResetHandlers[cb_idx]) {
|
||||
drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Calling IOC post_reset handler #%d\n",
|
||||
ioc->alt_ioc->name, cb_idx));
|
||||
rc += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
handlers++;
|
||||
}
|
||||
}
|
||||
/* FIXME? Examine results here? */
|
||||
}
|
||||
|
||||
out:
|
||||
if ((ret != 0) && irq_allocated) {
|
||||
free_irq(ioc->pci_irq, ioc);
|
||||
|
|
@ -3938,6 +3904,7 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
|||
int count = 0;
|
||||
u32 diag1val = 0;
|
||||
MpiFwHeader_t *cached_fw; /* Pointer to FW */
|
||||
u8 cb_idx;
|
||||
|
||||
/* Clear any existing interrupts */
|
||||
CHIPREG_WRITE32(&ioc->chip->IntStatus, 0);
|
||||
|
|
@ -3956,6 +3923,18 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
|||
else
|
||||
mdelay(1);
|
||||
|
||||
/*
|
||||
* Call each currently registered protocol IOC reset handler
|
||||
* with pre-reset indication.
|
||||
* NOTE: If we're doing _IOC_BRINGUP, there can be no
|
||||
* MptResetHandlers[] registered yet.
|
||||
*/
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if (MptResetHandlers[cb_idx])
|
||||
(*(MptResetHandlers[cb_idx]))(ioc,
|
||||
MPT_IOC_PRE_RESET);
|
||||
}
|
||||
|
||||
for (count = 0; count < 60; count ++) {
|
||||
doorbell = CHIPREG_READ32(&ioc->chip->Doorbell);
|
||||
doorbell &= MPI_IOC_STATE_MASK;
|
||||
|
|
@ -4052,25 +4031,15 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
|||
* NOTE: If we're doing _IOC_BRINGUP, there can be no
|
||||
* MptResetHandlers[] registered yet.
|
||||
*/
|
||||
{
|
||||
u8 cb_idx;
|
||||
int r = 0;
|
||||
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if (MptResetHandlers[cb_idx]) {
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Calling IOC pre_reset handler #%d\n",
|
||||
ioc->name, cb_idx));
|
||||
r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_PRE_RESET);
|
||||
if (ioc->alt_ioc) {
|
||||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"Calling alt-%s pre_reset handler #%d\n",
|
||||
ioc->name, ioc->alt_ioc->name, cb_idx));
|
||||
r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
||||
}
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if (MptResetHandlers[cb_idx]) {
|
||||
mpt_signal_reset(cb_idx,
|
||||
ioc, MPT_IOC_PRE_RESET);
|
||||
if (ioc->alt_ioc) {
|
||||
mpt_signal_reset(cb_idx,
|
||||
ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
||||
}
|
||||
}
|
||||
/* FIXME? Examine results here? */
|
||||
}
|
||||
|
||||
if (ioc->cached_fw)
|
||||
|
|
@ -6956,7 +6925,7 @@ EXPORT_SYMBOL(mpt_halt_firmware);
|
|||
int
|
||||
mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
||||
{
|
||||
int rc;
|
||||
int rc;
|
||||
u8 cb_idx;
|
||||
unsigned long flags;
|
||||
unsigned long time_count;
|
||||
|
|
@ -6982,8 +6951,6 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
ioc->alt_ioc->ioc_reset_in_progress = 1;
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
|
||||
/* FIXME: If do_ioc_recovery fails, repeat....
|
||||
*/
|
||||
|
||||
/* The SCSI driver needs to adjust timeouts on all current
|
||||
* commands prior to the diagnostic reset being issued.
|
||||
|
|
@ -7020,6 +6987,15 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|||
}
|
||||
spin_unlock_irqrestore(&ioc->taskmgmt_lock, flags);
|
||||
|
||||
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
||||
if (MptResetHandlers[cb_idx]) {
|
||||
mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);
|
||||
if (ioc->alt_ioc)
|
||||
mpt_signal_reset(cb_idx,
|
||||
ioc->alt_ioc, MPT_IOC_POST_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
dtmprintk(ioc,
|
||||
printk(MYIOC_s_DEBUG_FMT
|
||||
"HardResetHandler: completed (%d seconds): %s\n", ioc->name,
|
||||
|
|
|
|||
|
|
@ -76,8 +76,8 @@
|
|||
#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
|
||||
#endif
|
||||
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.10"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09"
|
||||
#define MPT_LINUX_VERSION_COMMON "3.04.12"
|
||||
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.12"
|
||||
#define WHAT_MAGIC_STRING "@" "(" "#" ")"
|
||||
|
||||
#define show_mptmod_ver(s,ver) \
|
||||
|
|
@ -157,8 +157,9 @@
|
|||
/*
|
||||
* Try to keep these at 2^N-1
|
||||
*/
|
||||
#define MPT_FC_CAN_QUEUE 127
|
||||
#define MPT_FC_CAN_QUEUE 1024
|
||||
#define MPT_SCSI_CAN_QUEUE 127
|
||||
#define MPT_SAS_CAN_QUEUE 127
|
||||
|
||||
/*
|
||||
* Set the MAX_SGE value based on user input.
|
||||
|
|
@ -879,23 +880,9 @@ typedef enum {
|
|||
|
||||
typedef struct _MPT_SCSI_HOST {
|
||||
MPT_ADAPTER *ioc;
|
||||
int port;
|
||||
u32 pad0;
|
||||
MPT_LOCAL_REPLY *pLocal; /* used for internal commands */
|
||||
struct timer_list timer;
|
||||
/* Pool of memory for holding SCpnts before doing
|
||||
* OS callbacks. freeQ is the free pool.
|
||||
*/
|
||||
u8 negoNvram; /* DV disabled, nego NVRAM */
|
||||
u8 pad1;
|
||||
u8 rsvd[2];
|
||||
MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */
|
||||
struct scsi_cmnd *abortSCpnt;
|
||||
MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */
|
||||
ushort sel_timeout[MPT_MAX_FC_DEVICES];
|
||||
char *info_kbuf;
|
||||
long last_queue_full;
|
||||
u16 tm_iocstatus;
|
||||
u16 spi_pending;
|
||||
struct list_head target_reset_list;
|
||||
} MPT_SCSI_HOST;
|
||||
|
|
|
|||
|
|
@ -1288,25 +1288,6 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
hd->abortSCpnt = NULL;
|
||||
|
||||
/* Clear the pointer used to store
|
||||
* single-threaded commands, i.e., those
|
||||
* issued during a bus scan, dv and
|
||||
* configuration pages.
|
||||
*/
|
||||
hd->cmdPtr = NULL;
|
||||
|
||||
/* Initialize this SCSI Hosts' timers
|
||||
* To use, set the timer expires field
|
||||
* and add_timer
|
||||
*/
|
||||
init_timer(&hd->timer);
|
||||
hd->timer.data = (unsigned long) hd;
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
hd->last_queue_full = 0;
|
||||
|
||||
sh->transportt = mptfc_transport_template;
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@
|
|||
*/
|
||||
#define MPTSAS_RAID_CHANNEL 1
|
||||
|
||||
#define SAS_CONFIG_PAGE_TIMEOUT 30
|
||||
MODULE_AUTHOR(MODULEAUTHOR);
|
||||
MODULE_DESCRIPTION(my_NAME);
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -324,7 +325,6 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc)
|
|||
{
|
||||
struct fw_event_work *fw_event, *next;
|
||||
struct mptsas_target_reset_event *target_reset_list, *n;
|
||||
u8 flush_q;
|
||||
MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
|
||||
|
||||
/* flush the target_reset_list */
|
||||
|
|
@ -344,15 +344,10 @@ mptsas_cleanup_fw_event_q(MPT_ADAPTER *ioc)
|
|||
!ioc->fw_event_q || in_interrupt())
|
||||
return;
|
||||
|
||||
flush_q = 0;
|
||||
list_for_each_entry_safe(fw_event, next, &ioc->fw_event_list, list) {
|
||||
if (cancel_delayed_work(&fw_event->work))
|
||||
mptsas_free_fw_event(ioc, fw_event);
|
||||
else
|
||||
flush_q = 1;
|
||||
}
|
||||
if (flush_q)
|
||||
flush_workqueue(ioc->fw_event_q);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -661,7 +656,7 @@ mptsas_add_device_component_starget_ir(MPT_ADAPTER *ioc,
|
|||
cfg.pageAddr = starget->id;
|
||||
cfg.cfghdr.hdr = &hdr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
if (mpt_config(ioc, &cfg) != 0)
|
||||
goto out;
|
||||
|
|
@ -851,7 +846,13 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
|||
port_details->num_phys--;
|
||||
port_details->phy_bitmask &= ~ (1 << phy_info->phy_id);
|
||||
memset(&phy_info->attached, 0, sizeof(struct mptsas_devinfo));
|
||||
sas_port_delete_phy(port_details->port, phy_info->phy);
|
||||
if (phy_info->phy) {
|
||||
devtprintk(ioc, dev_printk(KERN_DEBUG,
|
||||
&phy_info->phy->dev, MYIOC_s_FMT
|
||||
"delete phy %d, phy-obj (0x%p)\n", ioc->name,
|
||||
phy_info->phy_id, phy_info->phy));
|
||||
sas_port_delete_phy(port_details->port, phy_info->phy);
|
||||
}
|
||||
phy_info->port_details = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -1272,7 +1273,6 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
|
|||
}
|
||||
mptsas_cleanup_fw_event_q(ioc);
|
||||
mptsas_queue_rescan(ioc);
|
||||
mptsas_fw_event_on(ioc);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -1318,7 +1318,7 @@ mptsas_sas_enclosure_pg0(MPT_ADAPTER *ioc, struct mptsas_enclosure *enclosure,
|
|||
cfg.pageAddr = form + form_specific;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
|
|
@ -1592,6 +1592,7 @@ mptsas_firmware_event_work(struct work_struct *work)
|
|||
mptsas_scan_sas_topology(ioc);
|
||||
ioc->in_rescan = 0;
|
||||
mptsas_free_fw_event(ioc, fw_event);
|
||||
mptsas_fw_event_on(ioc);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1891,7 +1892,7 @@ static struct scsi_host_template mptsas_driver_template = {
|
|||
.eh_bus_reset_handler = mptscsih_bus_reset,
|
||||
.eh_host_reset_handler = mptscsih_host_reset,
|
||||
.bios_param = mptscsih_bios_param,
|
||||
.can_queue = MPT_FC_CAN_QUEUE,
|
||||
.can_queue = MPT_SAS_CAN_QUEUE,
|
||||
.this_id = -1,
|
||||
.sg_tablesize = MPT_SCSI_SG_DEPTH,
|
||||
.max_sectors = 8192,
|
||||
|
|
@ -1926,7 +1927,7 @@ static int mptsas_get_linkerrors(struct sas_phy *phy)
|
|||
cfg.pageAddr = phy->identify.phy_identifier;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
|
|
@ -2278,7 +2279,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
|
|||
cfg.pageAddr = 0;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
|
|
@ -2349,7 +2350,7 @@ mptsas_sas_io_unit_pg1(MPT_ADAPTER *ioc)
|
|||
|
||||
cfg.cfghdr.ehdr = &hdr;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
cfg.cfghdr.ehdr->PageType = MPI_CONFIG_PAGETYPE_EXTENDED;
|
||||
cfg.cfghdr.ehdr->ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_IO_UNIT;
|
||||
cfg.cfghdr.ehdr->PageVersion = MPI_SASIOUNITPAGE1_PAGEVERSION;
|
||||
|
|
@ -2411,7 +2412,7 @@ mptsas_sas_phy_pg0(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
|
|||
|
||||
cfg.cfghdr.ehdr = &hdr;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
/* Get Phy Pg 0 for each Phy. */
|
||||
cfg.physAddr = -1;
|
||||
|
|
@ -2479,7 +2480,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
|
|||
cfg.physAddr = -1;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
memset(device_info, 0, sizeof(struct mptsas_devinfo));
|
||||
error = mpt_config(ioc, &cfg);
|
||||
|
|
@ -2554,7 +2555,7 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
|
|||
cfg.pageAddr = form + form_specific;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
memset(port_info, 0, sizeof(struct mptsas_portinfo));
|
||||
error = mpt_config(ioc, &cfg);
|
||||
|
|
@ -2635,7 +2636,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
|
|||
cfg.pageAddr = form + form_specific;
|
||||
cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER;
|
||||
cfg.dir = 0; /* read */
|
||||
cfg.timeout = 10;
|
||||
cfg.timeout = SAS_CONFIG_PAGE_TIMEOUT;
|
||||
|
||||
error = mpt_config(ioc, &cfg);
|
||||
if (error)
|
||||
|
|
@ -3307,6 +3308,7 @@ mptsas_send_expander_event(struct fw_event_work *fw_event)
|
|||
expander_data = (MpiEventDataSasExpanderStatusChange_t *)
|
||||
fw_event->event_data;
|
||||
memcpy(&sas_address, &expander_data->SASAddress, sizeof(__le64));
|
||||
sas_address = le64_to_cpu(sas_address);
|
||||
port_info = mptsas_find_portinfo_by_sas_address(ioc, sas_address);
|
||||
|
||||
if (expander_data->ReasonCode == MPI_EVENT_SAS_EXP_RC_ADDED) {
|
||||
|
|
@ -4760,10 +4762,9 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
|
||||
/* set 16 byte cdb's */
|
||||
sh->max_cmd_len = 16;
|
||||
|
||||
sh->max_id = ioc->pfacts[0].PortSCSIID;
|
||||
sh->can_queue = min_t(int, ioc->req_depth - 10, sh->can_queue);
|
||||
sh->max_id = -1;
|
||||
sh->max_lun = max_lun;
|
||||
|
||||
sh->transportt = mptsas_transport_template;
|
||||
|
||||
/* Required entry.
|
||||
|
|
@ -4821,25 +4822,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
hd->abortSCpnt = NULL;
|
||||
|
||||
/* Clear the pointer used to store
|
||||
* single-threaded commands, i.e., those
|
||||
* issued during a bus scan, dv and
|
||||
* configuration pages.
|
||||
*/
|
||||
hd->cmdPtr = NULL;
|
||||
|
||||
/* Initialize this SCSI Hosts' timers
|
||||
* To use, set the timer expires field
|
||||
* and add_timer
|
||||
*/
|
||||
init_timer(&hd->timer);
|
||||
hd->timer.data = (unsigned long) hd;
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
ioc->sas_data.ptClear = mpt_pt_clear;
|
||||
|
||||
hd->last_queue_full = 0;
|
||||
|
|
|
|||
|
|
@ -628,6 +628,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (ioc->bus_type == SAS) {
|
||||
VirtDevice *vdevice = sc->device->hostdata;
|
||||
|
||||
if (!vdevice || !vdevice->vtarget ||
|
||||
vdevice->vtarget->deleted) {
|
||||
sc->result = DID_NO_CONNECT << 16;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
sc->host_scribble = NULL;
|
||||
sc->result = DID_OK << 16; /* Set default reply as OK */
|
||||
pScsiReq = (SCSIIORequest_t *) mf;
|
||||
|
|
@ -689,6 +699,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
|||
|
||||
switch(status) {
|
||||
case MPI_IOCSTATUS_BUSY: /* 0x0002 */
|
||||
case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */
|
||||
/* CHECKME!
|
||||
* Maybe: DRIVER_BUSY | SUGGEST_RETRY | DID_SOFT_ERROR (retry)
|
||||
* But not: DID_BUS_BUSY lest one risk
|
||||
|
|
@ -872,7 +883,6 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
|||
case MPI_IOCSTATUS_INVALID_SGL: /* 0x0003 */
|
||||
case MPI_IOCSTATUS_INTERNAL_ERROR: /* 0x0004 */
|
||||
case MPI_IOCSTATUS_RESERVED: /* 0x0005 */
|
||||
case MPI_IOCSTATUS_INSUFFICIENT_RESOURCES: /* 0x0006 */
|
||||
case MPI_IOCSTATUS_INVALID_FIELD: /* 0x0007 */
|
||||
case MPI_IOCSTATUS_INVALID_STATE: /* 0x0008 */
|
||||
case MPI_IOCSTATUS_SCSI_IO_DATA_ERROR: /* 0x0046 */
|
||||
|
|
@ -892,7 +902,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
|
|||
#endif
|
||||
|
||||
} /* end of address reply case */
|
||||
|
||||
out:
|
||||
/* Unmap the DMA buffers, if any. */
|
||||
scsi_dma_unmap(sc);
|
||||
|
||||
|
|
@ -1729,9 +1739,6 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
|
|||
*/
|
||||
mf = MPT_INDEX_2_MFPTR(ioc, scpnt_idx);
|
||||
ctx2abort = mf->u.frame.hwhdr.msgctxu.MsgContext;
|
||||
|
||||
hd->abortSCpnt = SCpnt;
|
||||
|
||||
retval = mptscsih_IssueTaskMgmt(hd,
|
||||
MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
|
||||
vdevice->vtarget->channel,
|
||||
|
|
@ -2293,7 +2300,10 @@ mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth)
|
|||
else
|
||||
max_depth = MPT_SCSI_CMD_PER_DEV_LOW;
|
||||
} else
|
||||
max_depth = MPT_SCSI_CMD_PER_DEV_HIGH;
|
||||
max_depth = ioc->sh->can_queue;
|
||||
|
||||
if (!sdev->tagged_supported)
|
||||
max_depth = 1;
|
||||
|
||||
if (qdepth > max_depth)
|
||||
qdepth = max_depth;
|
||||
|
|
@ -2627,50 +2637,6 @@ mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
/* mptscsih_timer_expired - Call back for timer process.
|
||||
* Used only for dv functionality.
|
||||
* @data: Pointer to MPT_SCSI_HOST recast as an unsigned long
|
||||
*
|
||||
*/
|
||||
void
|
||||
mptscsih_timer_expired(unsigned long data)
|
||||
{
|
||||
MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *) data;
|
||||
MPT_ADAPTER *ioc = hd->ioc;
|
||||
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired! Cmd %p\n", ioc->name, hd->cmdPtr));
|
||||
|
||||
if (hd->cmdPtr) {
|
||||
MPIHeader_t *cmd = (MPIHeader_t *)hd->cmdPtr;
|
||||
|
||||
if (cmd->Function == MPI_FUNCTION_SCSI_IO_REQUEST) {
|
||||
/* Desire to issue a task management request here.
|
||||
* TM requests MUST be single threaded.
|
||||
* If old eh code and no TM current, issue request.
|
||||
* If new eh code, do nothing. Wait for OS cmd timeout
|
||||
* for bus reset.
|
||||
*/
|
||||
} else {
|
||||
/* Perform a FW reload */
|
||||
if (mpt_HardResetHandler(ioc, NO_SLEEP) < 0) {
|
||||
printk(MYIOC_s_WARN_FMT "Firmware Reload FAILED!\n", ioc->name);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
/* This should NEVER happen */
|
||||
printk(MYIOC_s_WARN_FMT "Null cmdPtr!!!!\n", ioc->name);
|
||||
}
|
||||
|
||||
/* No more processing.
|
||||
* TM call will generate an interrupt for SCSI TM Management.
|
||||
* The FW will reply to all outstanding commands, callback will finish cleanup.
|
||||
* Hard reset clean-up will free all resources.
|
||||
*/
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Timer Expired Complete!\n", ioc->name));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* mptscsih_get_completion_code -
|
||||
|
|
@ -3265,6 +3231,5 @@ EXPORT_SYMBOL(mptscsih_scandv_complete);
|
|||
EXPORT_SYMBOL(mptscsih_event_process);
|
||||
EXPORT_SYMBOL(mptscsih_ioc_reset);
|
||||
EXPORT_SYMBOL(mptscsih_change_queue_depth);
|
||||
EXPORT_SYMBOL(mptscsih_timer_expired);
|
||||
|
||||
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
||||
|
|
|
|||
|
|
@ -129,7 +129,6 @@ extern int mptscsih_scandv_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRA
|
|||
extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
|
||||
extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
|
||||
extern int mptscsih_change_queue_depth(struct scsi_device *sdev, int qdepth);
|
||||
extern void mptscsih_timer_expired(unsigned long data);
|
||||
extern u8 mptscsih_raid_id_to_num(MPT_ADAPTER *ioc, u8 channel, u8 id);
|
||||
extern int mptscsih_is_phys_disk(MPT_ADAPTER *ioc, u8 channel, u8 id);
|
||||
extern struct device_attribute *mptscsih_host_attrs[];
|
||||
|
|
|
|||
|
|
@ -1472,28 +1472,7 @@ mptspi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n",
|
||||
ioc->name, ioc->ScsiLookup));
|
||||
|
||||
/* Clear the TM flags
|
||||
*/
|
||||
hd->abortSCpnt = NULL;
|
||||
|
||||
/* Clear the pointer used to store
|
||||
* single-threaded commands, i.e., those
|
||||
* issued during a bus scan, dv and
|
||||
* configuration pages.
|
||||
*/
|
||||
hd->cmdPtr = NULL;
|
||||
|
||||
/* Initialize this SCSI Hosts' timers
|
||||
* To use, set the timer expires field
|
||||
* and add_timer
|
||||
*/
|
||||
init_timer(&hd->timer);
|
||||
hd->timer.data = (unsigned long) hd;
|
||||
hd->timer.function = mptscsih_timer_expired;
|
||||
|
||||
ioc->spi_data.Saf_Te = mpt_saf_te;
|
||||
|
||||
hd->negoNvram = MPT_SCSICFG_USE_NVRAM;
|
||||
ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
||||
"saf_te %x\n",
|
||||
ioc->name,
|
||||
|
|
|
|||
Loading…
Reference in a new issue