提交 2f187862 编写于 作者: K Kashyap, Desai 提交者: James Bottomley

[SCSI] mpt fusion: Code Cleanup patch

Resending patch considering Grants G's code review.

Main goal to submit this patch is code cleaup.
1. Better driver debug prints and code indentation.
2. fault_reset_work_lock is not used anywhere. driver is using taskmgmt_lock
instead of fault_reset_work_lock.
3. setting pci_set_drvdata properly.
4. Ingore config request when IOC is in reset state.( ioc_reset_in_progress
is set).
5. Init/clear managment frame proprely.(INITIALIZE_MGMT_STATUS and
CLEAR_MGMT_STATUS)
Signed-off-by: NKashyap Desai <kadesai@lsi.com>
Signed-off-by: NJames Bottomley <James.Bottomley@HansenPartnership.com>
上级 eedf92b9
此差异已折叠。
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
#define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR #define COPYRIGHT "Copyright (c) 1999-2008 " MODULEAUTHOR
#endif #endif
#define MPT_LINUX_VERSION_COMMON "3.04.09" #define MPT_LINUX_VERSION_COMMON "3.04.10"
#define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.04.09"
#define WHAT_MAGIC_STRING "@" "(" "#" ")" #define WHAT_MAGIC_STRING "@" "(" "#" ")"
...@@ -104,6 +104,7 @@ ...@@ -104,6 +104,7 @@
#endif #endif
#define MPT_NAME_LENGTH 32 #define MPT_NAME_LENGTH 32
#define MPT_KOBJ_NAME_LEN 20
#define MPT_PROCFS_MPTBASEDIR "mpt" #define MPT_PROCFS_MPTBASEDIR "mpt"
/* chg it to "driver/fusion" ? */ /* chg it to "driver/fusion" ? */
...@@ -162,10 +163,10 @@ ...@@ -162,10 +163,10 @@
/* /*
* Set the MAX_SGE value based on user input. * Set the MAX_SGE value based on user input.
*/ */
#ifdef CONFIG_FUSION_MAX_SGE #ifdef CONFIG_FUSION_MAX_SGE
#if CONFIG_FUSION_MAX_SGE < 16 #if CONFIG_FUSION_MAX_SGE < 16
#define MPT_SCSI_SG_DEPTH 16 #define MPT_SCSI_SG_DEPTH 16
#elif CONFIG_FUSION_MAX_SGE > 128 #elif CONFIG_FUSION_MAX_SGE > 128
#define MPT_SCSI_SG_DEPTH 128 #define MPT_SCSI_SG_DEPTH 128
#else #else
#define MPT_SCSI_SG_DEPTH CONFIG_FUSION_MAX_SGE #define MPT_SCSI_SG_DEPTH CONFIG_FUSION_MAX_SGE
...@@ -174,6 +175,18 @@ ...@@ -174,6 +175,18 @@
#define MPT_SCSI_SG_DEPTH 40 #define MPT_SCSI_SG_DEPTH 40
#endif #endif
#ifdef CONFIG_FUSION_MAX_FC_SGE
#if CONFIG_FUSION_MAX_FC_SGE < 16
#define MPT_SCSI_FC_SG_DEPTH 16
#elif CONFIG_FUSION_MAX_FC_SGE > 256
#define MPT_SCSI_FC_SG_DEPTH 256
#else
#define MPT_SCSI_FC_SG_DEPTH CONFIG_FUSION_MAX_FC_SGE
#endif
#else
#define MPT_SCSI_FC_SG_DEPTH 40
#endif
/* debug print string length used for events and iocstatus */ /* debug print string length used for events and iocstatus */
# define EVENT_DESCR_STR_SZ 100 # define EVENT_DESCR_STR_SZ 100
...@@ -576,6 +589,10 @@ typedef struct _MPT_ADAPTER ...@@ -576,6 +589,10 @@ typedef struct _MPT_ADAPTER
int pci_irq; /* This irq */ int pci_irq; /* This irq */
char name[MPT_NAME_LENGTH]; /* "iocN" */ char name[MPT_NAME_LENGTH]; /* "iocN" */
char prod_name[MPT_NAME_LENGTH]; /* "LSIFC9x9" */ char prod_name[MPT_NAME_LENGTH]; /* "LSIFC9x9" */
#ifdef CONFIG_FUSION_LOGGING
/* used in mpt_display_event_info */
char evStr[EVENT_DESCR_STR_SZ];
#endif
char board_name[16]; char board_name[16];
char board_assembly[16]; char board_assembly[16];
char board_tracer[16]; char board_tracer[16];
...@@ -682,14 +699,11 @@ typedef struct _MPT_ADAPTER ...@@ -682,14 +699,11 @@ typedef struct _MPT_ADAPTER
int aen_event_read_flag; /* flag to indicate event log was read*/ int aen_event_read_flag; /* flag to indicate event log was read*/
u8 FirstWhoInit; u8 FirstWhoInit;
u8 upload_fw; /* If set, do a fw upload */ u8 upload_fw; /* If set, do a fw upload */
u8 reload_fw; /* Force a FW Reload on next reset */
u8 NBShiftFactor; /* NB Shift Factor based on Block Size (Facts) */ u8 NBShiftFactor; /* NB Shift Factor based on Block Size (Facts) */
u8 pad1[4]; u8 pad1[4];
u8 DoneCtx; u8 DoneCtx;
u8 TaskCtx; u8 TaskCtx;
u8 InternalCtx; u8 InternalCtx;
spinlock_t initializing_hba_lock;
int initializing_hba_lock_flag;
struct list_head list; struct list_head list;
struct net_device *netdev; struct net_device *netdev;
struct list_head sas_topology; struct list_head sas_topology;
...@@ -699,7 +713,7 @@ typedef struct _MPT_ADAPTER ...@@ -699,7 +713,7 @@ typedef struct _MPT_ADAPTER
struct list_head fw_event_list; struct list_head fw_event_list;
spinlock_t fw_event_lock; spinlock_t fw_event_lock;
u8 fw_events_off; /* if '1', then ignore events */ u8 fw_events_off; /* if '1', then ignore events */
char fw_event_q_name[20]; char fw_event_q_name[MPT_KOBJ_NAME_LEN];
struct mutex sas_discovery_mutex; struct mutex sas_discovery_mutex;
u8 sas_discovery_runtime; u8 sas_discovery_runtime;
...@@ -731,15 +745,22 @@ typedef struct _MPT_ADAPTER ...@@ -731,15 +745,22 @@ typedef struct _MPT_ADAPTER
u8 fc_link_speed[2]; u8 fc_link_speed[2];
spinlock_t fc_rescan_work_lock; spinlock_t fc_rescan_work_lock;
struct work_struct fc_rescan_work; struct work_struct fc_rescan_work;
char fc_rescan_work_q_name[20]; char fc_rescan_work_q_name[MPT_KOBJ_NAME_LEN];
struct workqueue_struct *fc_rescan_work_q; struct workqueue_struct *fc_rescan_work_q;
/* driver forced bus resets count */
unsigned long hard_resets;
/* fw/external bus resets count */
unsigned long soft_resets;
/* cmd timeouts */
unsigned long timeouts;
struct scsi_cmnd **ScsiLookup; struct scsi_cmnd **ScsiLookup;
spinlock_t scsi_lookup_lock; spinlock_t scsi_lookup_lock;
u64 dma_mask; u64 dma_mask;
char reset_work_q_name[20]; char reset_work_q_name[MPT_KOBJ_NAME_LEN];
struct workqueue_struct *reset_work_q; struct workqueue_struct *reset_work_q;
struct delayed_work fault_reset_work; struct delayed_work fault_reset_work;
spinlock_t fault_reset_work_lock;
u8 sg_addr_size; u8 sg_addr_size;
u8 in_rescan; u8 in_rescan;
...@@ -870,9 +891,6 @@ typedef struct _MPT_SCSI_HOST { ...@@ -870,9 +891,6 @@ typedef struct _MPT_SCSI_HOST {
MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */ MPT_FRAME_HDR *cmdPtr; /* Ptr to nonOS request */
struct scsi_cmnd *abortSCpnt; struct scsi_cmnd *abortSCpnt;
MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */ MPT_LOCAL_REPLY localReply; /* internal cmd reply struct */
unsigned long hard_resets; /* driver forced bus resets count */
unsigned long soft_resets; /* fw/external bus resets count */
unsigned long timeouts; /* cmd timeouts */
ushort sel_timeout[MPT_MAX_FC_DEVICES]; ushort sel_timeout[MPT_MAX_FC_DEVICES];
char *info_kbuf; char *info_kbuf;
long last_queue_full; long last_queue_full;
......
...@@ -2534,9 +2534,9 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size) ...@@ -2534,9 +2534,9 @@ mptctl_hp_hostinfo(unsigned long arg, unsigned int data_size)
MPT_SCSI_HOST *hd = shost_priv(ioc->sh); MPT_SCSI_HOST *hd = shost_priv(ioc->sh);
if (hd && (cim_rev == 1)) { if (hd && (cim_rev == 1)) {
karg.hard_resets = hd->hard_resets; karg.hard_resets = ioc->hard_resets;
karg.soft_resets = hd->soft_resets; karg.soft_resets = ioc->soft_resets;
karg.timeouts = hd->timeouts; karg.timeouts = ioc->timeouts;
} }
} }
......
...@@ -724,8 +724,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) ...@@ -724,8 +724,8 @@ mptsas_setup_wide_ports(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
* Forming a port * Forming a port
*/ */
if (!port_details) { if (!port_details) {
port_details = kzalloc(sizeof(*port_details), port_details = kzalloc(sizeof(struct
GFP_KERNEL); mptsas_portinfo_details), GFP_KERNEL);
if (!port_details) if (!port_details)
goto out; goto out;
port_details->num_phys = 1; port_details->num_phys = 1;
...@@ -952,7 +952,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc, ...@@ -952,7 +952,7 @@ mptsas_target_reset_queue(MPT_ADAPTER *ioc,
vtarget->deleted = 1; /* block IO */ vtarget->deleted = 1; /* block IO */
target_reset_list = kzalloc(sizeof(*target_reset_list), target_reset_list = kzalloc(sizeof(struct mptsas_target_reset_event),
GFP_ATOMIC); GFP_ATOMIC);
if (!target_reset_list) { if (!target_reset_list) {
dfailprintk(ioc, printk(MYIOC_s_WARN_FMT dfailprintk(ioc, printk(MYIOC_s_WARN_FMT
...@@ -1791,8 +1791,13 @@ static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, ...@@ -1791,8 +1791,13 @@ static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req,
memcpy(ioc->sas_mgmt.reply, reply, memcpy(ioc->sas_mgmt.reply, reply,
min(ioc->reply_sz, 4 * reply->u.reply.MsgLength)); min(ioc->reply_sz, 4 * reply->u.reply.MsgLength));
} }
complete(&ioc->sas_mgmt.done);
return 1; if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_PENDING) {
ioc->sas_mgmt.status &= ~MPT_MGMT_STATUS_PENDING;
complete(&ioc->sas_mgmt.done);
return 1;
}
return 0;
} }
static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
...@@ -1831,6 +1836,7 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) ...@@ -1831,6 +1836,7 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET; MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET;
req->PhyNum = phy->identify.phy_identifier; req->PhyNum = phy->identify.phy_identifier;
INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status)
mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf); mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done,
...@@ -1862,6 +1868,7 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) ...@@ -1862,6 +1868,7 @@ static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset)
error = 0; error = 0;
out_unlock: out_unlock:
CLEAR_MGMT_STATUS(ioc->sas_mgmt.status)
mutex_unlock(&ioc->sas_mgmt.mutex); mutex_unlock(&ioc->sas_mgmt.mutex);
out: out:
return error; return error;
...@@ -1999,10 +2006,15 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -1999,10 +2006,15 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
if (!dma_addr_out) if (!dma_addr_out)
goto put_mf; goto put_mf;
ioc->add_sge(psge, flagsLength, dma_addr_out); ioc->add_sge(psge, flagsLength, dma_addr_out);
psge += (sizeof(u32) + sizeof(dma_addr_t)); psge += ioc->SGE_size;
/* response */ /* response */
flagsLength = MPT_SGE_FLAGS_SSIMPLE_READ; flagsLength = MPI_SGE_FLAGS_SIMPLE_ELEMENT |
MPI_SGE_FLAGS_SYSTEM_ADDRESS |
MPI_SGE_FLAGS_IOC_TO_HOST |
MPI_SGE_FLAGS_END_OF_BUFFER;
flagsLength = flagsLength << MPI_SGE_FLAGS_SHIFT;
flagsLength |= rsp->data_len + 4; flagsLength |= rsp->data_len + 4;
dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio), dma_addr_in = pci_map_single(ioc->pcidev, bio_data(rsp->bio),
rsp->data_len, PCI_DMA_BIDIRECTIONAL); rsp->data_len, PCI_DMA_BIDIRECTIONAL);
...@@ -2010,6 +2022,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -2010,6 +2022,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
goto unmap; goto unmap;
ioc->add_sge(psge, flagsLength, dma_addr_in); ioc->add_sge(psge, flagsLength, dma_addr_in);
INITIALIZE_MGMT_STATUS(ioc->sas_mgmt.status)
mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf); mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf);
timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ); timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, 10 * HZ);
...@@ -2031,7 +2044,8 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -2031,7 +2044,8 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
req->data_len = 0; req->data_len = 0;
rsp->data_len -= smprep->ResponseDataLength; rsp->data_len -= smprep->ResponseDataLength;
} else { } else {
printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n", printk(MYIOC_s_ERR_FMT
"%s: smp passthru reply failed to be returned\n",
ioc->name, __func__); ioc->name, __func__);
ret = -ENXIO; ret = -ENXIO;
} }
...@@ -2046,6 +2060,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy, ...@@ -2046,6 +2060,7 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
if (mf) if (mf)
mpt_free_msg_frame(ioc, mf); mpt_free_msg_frame(ioc, mf);
out_unlock: out_unlock:
CLEAR_MGMT_STATUS(ioc->sas_mgmt.status)
mutex_unlock(&ioc->sas_mgmt.mutex); mutex_unlock(&ioc->sas_mgmt.mutex);
out: out:
return ret; return ret;
...@@ -2109,7 +2124,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) ...@@ -2109,7 +2124,7 @@ mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info)
port_info->num_phys = buffer->NumPhys; port_info->num_phys = buffer->NumPhys;
port_info->phy_info = kcalloc(port_info->num_phys, port_info->phy_info = kcalloc(port_info->num_phys,
sizeof(*port_info->phy_info),GFP_KERNEL); sizeof(struct mptsas_phyinfo), GFP_KERNEL);
if (!port_info->phy_info) { if (!port_info->phy_info) {
error = -ENOMEM; error = -ENOMEM;
goto out_free_consistent; goto out_free_consistent;
...@@ -2271,10 +2286,6 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, ...@@ -2271,10 +2286,6 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
__le64 sas_address; __le64 sas_address;
int error=0; int error=0;
if (ioc->sas_discovery_runtime &&
mptsas_is_end_device(device_info))
goto out;
hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION; hdr.PageVersion = MPI_SASDEVICE0_PAGEVERSION;
hdr.ExtPageLength = 0; hdr.ExtPageLength = 0;
hdr.PageNumber = 0; hdr.PageNumber = 0;
...@@ -2315,6 +2326,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info, ...@@ -2315,6 +2326,7 @@ mptsas_sas_device_pg0(MPT_ADAPTER *ioc, struct mptsas_devinfo *device_info,
mptsas_print_device_pg0(ioc, buffer); mptsas_print_device_pg0(ioc, buffer);
memset(device_info, 0, sizeof(struct mptsas_devinfo));
device_info->handle = le16_to_cpu(buffer->DevHandle); device_info->handle = le16_to_cpu(buffer->DevHandle);
device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle); device_info->handle_parent = le16_to_cpu(buffer->ParentDevHandle);
device_info->handle_enclosure = device_info->handle_enclosure =
...@@ -2346,7 +2358,9 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, ...@@ -2346,7 +2358,9 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
SasExpanderPage0_t *buffer; SasExpanderPage0_t *buffer;
dma_addr_t dma_handle; dma_addr_t dma_handle;
int i, error; int i, error;
__le64 sas_address;
memset(port_info, 0, sizeof(struct mptsas_portinfo));
hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION; hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
hdr.ExtPageLength = 0; hdr.ExtPageLength = 0;
hdr.PageNumber = 0; hdr.PageNumber = 0;
...@@ -2392,18 +2406,23 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info, ...@@ -2392,18 +2406,23 @@ mptsas_sas_expander_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info,
} }
/* save config data */ /* save config data */
port_info->num_phys = buffer->NumPhys; port_info->num_phys = (buffer->NumPhys) ? buffer->NumPhys : 1;
port_info->phy_info = kcalloc(port_info->num_phys, port_info->phy_info = kcalloc(port_info->num_phys,
sizeof(*port_info->phy_info),GFP_KERNEL); sizeof(struct mptsas_phyinfo), GFP_KERNEL);
if (!port_info->phy_info) { if (!port_info->phy_info) {
error = -ENOMEM; error = -ENOMEM;
goto out_free_consistent; goto out_free_consistent;
} }
memcpy(&sas_address, &buffer->SASAddress, sizeof(__le64));
for (i = 0; i < port_info->num_phys; i++) { for (i = 0; i < port_info->num_phys; i++) {
port_info->phy_info[i].portinfo = port_info; port_info->phy_info[i].portinfo = port_info;
port_info->phy_info[i].handle = port_info->phy_info[i].handle =
le16_to_cpu(buffer->DevHandle); le16_to_cpu(buffer->DevHandle);
port_info->phy_info[i].identify.sas_address =
le64_to_cpu(sas_address);
port_info->phy_info[i].identify.handle_parent =
le16_to_cpu(buffer->ParentDevHandle);
} }
out_free_consistent: out_free_consistent:
...@@ -2423,11 +2442,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, ...@@ -2423,11 +2442,7 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
dma_addr_t dma_handle; dma_addr_t dma_handle;
int error=0; int error=0;
if (ioc->sas_discovery_runtime && hdr.PageVersion = MPI_SASEXPANDER1_PAGEVERSION;
mptsas_is_end_device(&phy_info->attached))
goto out;
hdr.PageVersion = MPI_SASEXPANDER0_PAGEVERSION;
hdr.ExtPageLength = 0; hdr.ExtPageLength = 0;
hdr.PageNumber = 1; hdr.PageNumber = 1;
hdr.Reserved1 = 0; hdr.Reserved1 = 0;
...@@ -2462,6 +2477,12 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info, ...@@ -2462,6 +2477,12 @@ mptsas_sas_expander_pg1(MPT_ADAPTER *ioc, struct mptsas_phyinfo *phy_info,
cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
error = mpt_config(ioc, &cfg); error = mpt_config(ioc, &cfg);
if (error == MPI_IOCSTATUS_CONFIG_INVALID_PAGE) {
error = -ENODEV;
goto out;
}
if (error) if (error)
goto out_free_consistent; goto out_free_consistent;
...@@ -2681,16 +2702,21 @@ static int mptsas_probe_one_phy(struct device *dev, ...@@ -2681,16 +2702,21 @@ static int mptsas_probe_one_phy(struct device *dev,
goto out; goto out;
} }
mptsas_set_port(ioc, phy_info, port); mptsas_set_port(ioc, phy_info, port);
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT devtprintk(ioc, dev_printk(KERN_DEBUG, &port->dev,
"sas_port_alloc: port=%p dev=%p port_id=%d\n", MYIOC_s_FMT "add port %d, sas_addr (0x%llx)\n",
ioc->name, port, dev, port->port_identifier)); ioc->name, port->port_identifier,
(unsigned long long)phy_info->
attached.sas_address));
} }
dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT "sas_port_add_phy: phy_id=%d\n", dsaswideprintk(ioc, printk(MYIOC_s_DEBUG_FMT
ioc->name, phy_info->phy_id)); "sas_port_add_phy: phy_id=%d\n",
ioc->name, phy_info->phy_id));
sas_port_add_phy(port, phy_info->phy); sas_port_add_phy(port, phy_info->phy);
phy_info->sas_port_add_phy = 0; phy_info->sas_port_add_phy = 0;
devtprintk(ioc, dev_printk(KERN_DEBUG, &phy_info->phy->dev,
MYIOC_s_FMT "add phy %d, phy-obj (0x%p)\n", ioc->name,
phy_info->phy_id, phy_info->phy));
} }
if (!mptsas_get_rphy(phy_info) && port && !port->rphy) { if (!mptsas_get_rphy(phy_info) && port && !port->rphy) {
struct sas_rphy *rphy; struct sas_rphy *rphy;
...@@ -2703,9 +2729,10 @@ static int mptsas_probe_one_phy(struct device *dev, ...@@ -2703,9 +2729,10 @@ static int mptsas_probe_one_phy(struct device *dev,
* the adding/removing of devices that occur * the adding/removing of devices that occur
* after start of day. * after start of day.
*/ */
if (ioc->sas_discovery_runtime && if (mptsas_is_end_device(&phy_info->attached) &&
mptsas_is_end_device(&phy_info->attached)) phy_info->attached.handle_parent) {
goto out; goto out;
}
mptsas_parse_device_info(&identify, &phy_info->attached); mptsas_parse_device_info(&identify, &phy_info->attached);
if (scsi_is_host_device(parent)) { if (scsi_is_host_device(parent)) {
...@@ -3420,9 +3447,12 @@ mptsas_probe_devices(MPT_ADAPTER *ioc) ...@@ -3420,9 +3447,12 @@ mptsas_probe_devices(MPT_ADAPTER *ioc)
} }
} }
/* /**
* Start of day discovery * mptsas_scan_sas_topology -
*/ * @ioc: Pointer to MPT_ADAPTER structure
* @sas_address:
*
**/
static void static void
mptsas_scan_sas_topology(MPT_ADAPTER *ioc) mptsas_scan_sas_topology(MPT_ADAPTER *ioc)
{ {
......
...@@ -80,7 +80,6 @@ MODULE_VERSION(my_VERSION); ...@@ -80,7 +80,6 @@ MODULE_VERSION(my_VERSION);
/* /*
* Other private/forward protos... * Other private/forward protos...
*/ */
static struct scsi_cmnd * mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i);
static struct scsi_cmnd * mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i); static struct scsi_cmnd * mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i);
static void mptscsih_set_scsi_lookup(MPT_ADAPTER *ioc, int i, struct scsi_cmnd *scmd); static void mptscsih_set_scsi_lookup(MPT_ADAPTER *ioc, int i, struct scsi_cmnd *scmd);
static int SCPNT_TO_LOOKUP_IDX(MPT_ADAPTER *ioc, struct scsi_cmnd *scmd); static int SCPNT_TO_LOOKUP_IDX(MPT_ADAPTER *ioc, struct scsi_cmnd *scmd);
...@@ -236,7 +235,8 @@ mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt, ...@@ -236,7 +235,8 @@ mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt,
for (ii=0; ii < (numSgeThisFrame-1); ii++) { for (ii=0; ii < (numSgeThisFrame-1); ii++) {
thisxfer = sg_dma_len(sg); thisxfer = sg_dma_len(sg);
if (thisxfer == 0) { if (thisxfer == 0) {
sg = sg_next(sg); /* Get next SG element from the OS */ /* Get next SG element from the OS */
sg = sg_next(sg);
sg_done++; sg_done++;
continue; continue;
} }
...@@ -244,7 +244,8 @@ mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt, ...@@ -244,7 +244,8 @@ mptscsih_AddSGE(MPT_ADAPTER *ioc, struct scsi_cmnd *SCpnt,
v2 = sg_dma_address(sg); v2 = sg_dma_address(sg);
ioc->add_sge(psge, sgflags | thisxfer, v2); ioc->add_sge(psge, sgflags | thisxfer, v2);
sg = sg_next(sg); /* Get next SG element from the OS */ /* Get next SG element from the OS */
sg = sg_next(sg);
psge += ioc->SGE_size; psge += ioc->SGE_size;
sgeOffset += ioc->SGE_size; sgeOffset += ioc->SGE_size;
sg_done++; sg_done++;
...@@ -533,14 +534,15 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc ...@@ -533,14 +534,15 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc
} }
scsi_print_command(sc); scsi_print_command(sc);
printk(MYIOC_s_DEBUG_FMT "\tfw_channel = %d, fw_id = %d\n", printk(MYIOC_s_DEBUG_FMT "\tfw_channel = %d, fw_id = %d, lun = %d\n",
ioc->name, pScsiReply->Bus, pScsiReply->TargetID); ioc->name, pScsiReply->Bus, pScsiReply->TargetID, sc->device->lun);
printk(MYIOC_s_DEBUG_FMT "\trequest_len = %d, underflow = %d, " printk(MYIOC_s_DEBUG_FMT "\trequest_len = %d, underflow = %d, "
"resid = %d\n", ioc->name, scsi_bufflen(sc), sc->underflow, "resid = %d\n", ioc->name, scsi_bufflen(sc), sc->underflow,
scsi_get_resid(sc)); scsi_get_resid(sc));
printk(MYIOC_s_DEBUG_FMT "\ttag = %d, transfer_count = %d, " printk(MYIOC_s_DEBUG_FMT "\ttag = %d, transfer_count = %d, "
"sc->result = %08X\n", ioc->name, le16_to_cpu(pScsiReply->TaskTag), "sc->result = %08X\n", ioc->name, le16_to_cpu(pScsiReply->TaskTag),
le32_to_cpu(pScsiReply->TransferCount), sc->result); le32_to_cpu(pScsiReply->TransferCount), sc->result);
printk(MYIOC_s_DEBUG_FMT "\tiocstatus = %s (0x%04x), " printk(MYIOC_s_DEBUG_FMT "\tiocstatus = %s (0x%04x), "
"scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n", "scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n",
ioc->name, desc, ioc_status, desc1, pScsiReply->SCSIStatus, ioc->name, desc, ioc_status, desc1, pScsiReply->SCSIStatus,
...@@ -595,16 +597,14 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -595,16 +597,14 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx); req_idx = le16_to_cpu(mf->u.frame.hwhdr.msgctxu.fld.req_idx);
req_idx_MR = (mr != NULL) ? req_idx_MR = (mr != NULL) ?
le16_to_cpu(mr->u.frame.hwhdr.msgctxu.fld.req_idx) : req_idx; le16_to_cpu(mr->u.frame.hwhdr.msgctxu.fld.req_idx) : req_idx;
/* Special case, where already freed message frame is received from
* Firmware. It happens with Resetting IOC.
* Return immediately. Do not care
*/
if ((req_idx != req_idx_MR) || if ((req_idx != req_idx_MR) ||
(mf->u.frame.linkage.arg1 == 0xdeadbeaf)) { (le32_to_cpu(mf->u.frame.linkage.arg1) == 0xdeadbeaf))
printk(MYIOC_s_ERR_FMT "Received a mf that was already freed\n",
ioc->name);
printk (MYIOC_s_ERR_FMT
"req_idx=%x req_idx_MR=%x mf=%p mr=%p sc=%p\n",
ioc->name, req_idx, req_idx_MR, mf, mr,
mptscsih_get_scsi_lookup(ioc, req_idx_MR));
return 0; return 0;
}
sc = mptscsih_getclear_scsi_lookup(ioc, req_idx); sc = mptscsih_getclear_scsi_lookup(ioc, req_idx);
if (sc == NULL) { if (sc == NULL) {
...@@ -751,12 +751,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) ...@@ -751,12 +751,16 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
*/ */
case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */ case MPI_IOCSTATUS_SCSI_TASK_TERMINATED: /* 0x0048 */
case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
/* Linux handles an unsolicited DID_RESET better /* Linux handles an unsolicited DID_RESET better
* than an unsolicited DID_ABORT. * than an unsolicited DID_ABORT.
*/ */
sc->result = DID_RESET << 16; sc->result = DID_RESET << 16;
case MPI_IOCSTATUS_SCSI_EXT_TERMINATED: /* 0x004C */
if (ioc->bus_type == FC)
sc->result = DID_ERROR << 16;
else
sc->result = DID_RESET << 16;
break; break;
case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */ case MPI_IOCSTATUS_SCSI_RESIDUAL_MISMATCH: /* 0x0049 */
...@@ -933,9 +937,9 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd) ...@@ -933,9 +937,9 @@ mptscsih_flush_running_cmds(MPT_SCSI_HOST *hd)
scsi_dma_unmap(sc); scsi_dma_unmap(sc);
sc->result = DID_RESET << 16; sc->result = DID_RESET << 16;
sc->host_scribble = NULL; sc->host_scribble = NULL;
sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT dtmprintk(ioc, sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT
"completing cmds: fw_channel %d, fw_id %d, sc=%p," "completing cmds: fw_channel %d, fw_id %d, sc=%p, mf = %p, "
" mf = %p, idx=%x\n", ioc->name, channel, id, sc, mf, ii); "idx=%x\n", ioc->name, channel, id, sc, mf, ii));
sc->scsi_done(sc); sc->scsi_done(sc);
} }
} }
...@@ -994,9 +998,11 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice) ...@@ -994,9 +998,11 @@ mptscsih_search_running_cmds(MPT_SCSI_HOST *hd, VirtDevice *vdevice)
scsi_dma_unmap(sc); scsi_dma_unmap(sc);
sc->host_scribble = NULL; sc->host_scribble = NULL;
sc->result = DID_NO_CONNECT << 16; sc->result = DID_NO_CONNECT << 16;
sdev_printk(KERN_INFO, sc->device, MYIOC_s_FMT "completing cmds: fw_channel %d," dtmprintk(ioc, sdev_printk(KERN_INFO, sc->device,
"fw_id %d, sc=%p, mf = %p, idx=%x\n", ioc->name, vdevice->vtarget->channel, MYIOC_s_FMT "completing cmds: fw_channel %d, "
vdevice->vtarget->id, sc, mf, ii); "fw_id %d, sc=%p, mf = %p, idx=%x\n", ioc->name,
vdevice->vtarget->channel, vdevice->vtarget->id,
sc, mf, ii));
sc->scsi_done(sc); sc->scsi_done(sc);
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
} }
...@@ -1287,7 +1293,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) ...@@ -1287,7 +1293,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
MPT_FRAME_HDR *mf; MPT_FRAME_HDR *mf;
SCSIIORequest_t *pScsiReq; SCSIIORequest_t *pScsiReq;
VirtDevice *vdevice = SCpnt->device->hostdata; VirtDevice *vdevice = SCpnt->device->hostdata;
int lun;
u32 datalen; u32 datalen;
u32 scsictl; u32 scsictl;
u32 scsidir; u32 scsidir;
...@@ -1298,7 +1303,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) ...@@ -1298,7 +1303,6 @@ mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *))
hd = shost_priv(SCpnt->device->host); hd = shost_priv(SCpnt->device->host);
ioc = hd->ioc; ioc = hd->ioc;
lun = SCpnt->device->lun;
SCpnt->scsi_done = done; SCpnt->scsi_done = done;
dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n", dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "qcmd: SCpnt=%p, done()=%p\n",
...@@ -1709,8 +1713,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) ...@@ -1709,8 +1713,8 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
goto out; goto out;
} }
if (hd->timeouts < -1) if (ioc->timeouts < -1)
hd->timeouts++; ioc->timeouts++;
if (mpt_fwfault_debug) if (mpt_fwfault_debug)
mpt_halt_firmware(ioc); mpt_halt_firmware(ioc);
...@@ -1734,17 +1738,23 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) ...@@ -1734,17 +1738,23 @@ mptscsih_abort(struct scsi_cmnd * SCpnt)
ctx2abort, mptscsih_get_tm_timeout(ioc)); ctx2abort, mptscsih_get_tm_timeout(ioc));
if (SCPNT_TO_LOOKUP_IDX(ioc, SCpnt) == scpnt_idx && if (SCPNT_TO_LOOKUP_IDX(ioc, SCpnt) == scpnt_idx &&
SCpnt->serial_number == sn) SCpnt->serial_number == sn) {
dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"task abort: command still in active list! (sc=%p)\n",
ioc->name, SCpnt));
retval = FAILED; retval = FAILED;
} else {
dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"task abort: command cleared from active list! (sc=%p)\n",
ioc->name, SCpnt));
retval = SUCCESS;
}
out: out:
printk(MYIOC_s_INFO_FMT "task abort: %s (sc=%p)\n", printk(MYIOC_s_INFO_FMT "task abort: %s (sc=%p)\n",
ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); ioc->name, ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), SCpnt);
if (retval == 0) return retval;
return SUCCESS;
else
return FAILED;
} }
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
...@@ -1779,7 +1789,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt) ...@@ -1779,7 +1789,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt)
vdevice = SCpnt->device->hostdata; vdevice = SCpnt->device->hostdata;
if (!vdevice || !vdevice->vtarget) { if (!vdevice || !vdevice->vtarget) {
retval = 0; retval = SUCCESS;
goto out; goto out;
} }
...@@ -1837,10 +1847,12 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt) ...@@ -1837,10 +1847,12 @@ mptscsih_bus_reset(struct scsi_cmnd * SCpnt)
ioc->name, SCpnt); ioc->name, SCpnt);
scsi_print_command(SCpnt); scsi_print_command(SCpnt);
if (hd->timeouts < -1) if (ioc->timeouts < -1)
hd->timeouts++; ioc->timeouts++;
vdevice = SCpnt->device->hostdata; vdevice = SCpnt->device->hostdata;
if (!vdevice || !vdevice->vtarget)
return SUCCESS;
retval = mptscsih_IssueTaskMgmt(hd, retval = mptscsih_IssueTaskMgmt(hd,
MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS, MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS,
vdevice->vtarget->channel, 0, 0, 0, vdevice->vtarget->channel, 0, 0, 0,
...@@ -1868,8 +1880,9 @@ int ...@@ -1868,8 +1880,9 @@ int
mptscsih_host_reset(struct scsi_cmnd *SCpnt) mptscsih_host_reset(struct scsi_cmnd *SCpnt)
{ {
MPT_SCSI_HOST * hd; MPT_SCSI_HOST * hd;
int retval; int status = SUCCESS;
MPT_ADAPTER *ioc; MPT_ADAPTER *ioc;
int retval;
/* If we can't locate the host to reset, then we failed. */ /* If we can't locate the host to reset, then we failed. */
if ((hd = shost_priv(SCpnt->device->host)) == NULL){ if ((hd = shost_priv(SCpnt->device->host)) == NULL){
...@@ -1888,19 +1901,16 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt) ...@@ -1888,19 +1901,16 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
/* If our attempts to reset the host failed, then return a failed /* If our attempts to reset the host failed, then return a failed
* status. The host will be taken off line by the SCSI mid-layer. * status. The host will be taken off line by the SCSI mid-layer.
*/ */
if (mpt_HardResetHandler(ioc, CAN_SLEEP) < 0) { retval = mpt_HardResetHandler(ioc, CAN_SLEEP);
retval = FAILED; if (retval < 0)
} else { status = FAILED;
/* Make sure TM pending is cleared and TM state is set to else
* NONE. status = SUCCESS;
*/
retval = 0;
}
printk(MYIOC_s_INFO_FMT "host reset: %s (sc=%p)\n", printk(MYIOC_s_INFO_FMT "host reset: %s (sc=%p)\n",
ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt); ioc->name, ((retval == 0) ? "SUCCESS" : "FAILED" ), SCpnt);
return retval; return status;
} }
static int static int
...@@ -2244,7 +2254,6 @@ mptscsih_slave_configure(struct scsi_device *sdev) ...@@ -2244,7 +2254,6 @@ mptscsih_slave_configure(struct scsi_device *sdev)
sdev->ppr, sdev->inquiry_len)); sdev->ppr, sdev->inquiry_len));
vdevice->configured_lun = 1; vdevice->configured_lun = 1;
mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"Queue depth=%d, tflags=%x\n", "Queue depth=%d, tflags=%x\n",
...@@ -2256,6 +2265,7 @@ mptscsih_slave_configure(struct scsi_device *sdev) ...@@ -2256,6 +2265,7 @@ mptscsih_slave_configure(struct scsi_device *sdev)
ioc->name, vtarget->negoFlags, vtarget->maxOffset, ioc->name, vtarget->negoFlags, vtarget->maxOffset,
vtarget->minSyncFactor)); vtarget->minSyncFactor));
mptscsih_change_queue_depth(sdev, MPT_SCSI_CMD_PER_DEV_HIGH);
dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT dsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"tagged %d, simple %d, ordered %d\n", "tagged %d, simple %d, ordered %d\n",
ioc->name,sdev->tagged_supported, sdev->simple_tags, ioc->name,sdev->tagged_supported, sdev->simple_tags,
...@@ -2328,36 +2338,17 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR ...@@ -2328,36 +2338,17 @@ mptscsih_copy_sense_data(struct scsi_cmnd *sc, MPT_SCSI_HOST *hd, MPT_FRAME_HDR
} }
} }
/**
* mptscsih_get_scsi_lookup
* @ioc: Pointer to MPT_ADAPTER structure
* @i: index into the array
*
* retrieves scmd entry from ScsiLookup[] array list
*
* Returns the scsi_cmd pointer
**/
static struct scsi_cmnd *
mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i)
{
unsigned long flags;
struct scsi_cmnd *scmd;
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
scmd = ioc->ScsiLookup[i];
spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags);
return scmd;
}
/** /**
* mptscsih_getclear_scsi_lookup * mptscsih_getclear_scsi_lookup
* @ioc: Pointer to MPT_ADAPTER structure
* @i: index into the array
* *
* retrieves and clears scmd entry from ScsiLookup[] array list * retrieves and clears scmd entry from ScsiLookup[] array list
* *
* @ioc: Pointer to MPT_ADAPTER structure
* @i: index into the array
*
* Returns the scsi_cmd pointer * Returns the scsi_cmd pointer
*
**/ **/
static struct scsi_cmnd * static struct scsi_cmnd *
mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i) mptscsih_getclear_scsi_lookup(MPT_ADAPTER *ioc, int i)
...@@ -2456,57 +2447,16 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) ...@@ -2456,57 +2447,16 @@ mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase)
int int
mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
{ {
MPT_SCSI_HOST *hd;
u8 event = le32_to_cpu(pEvReply->Event) & 0xFF; u8 event = le32_to_cpu(pEvReply->Event) & 0xFF;
devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"MPT event (=%02Xh) routed to SCSI host driver!\n", "MPT event (=%02Xh) routed to SCSI host driver!\n",
ioc->name, event)); ioc->name, event));
if (ioc->sh == NULL || if ((event == MPI_EVENT_IOC_BUS_RESET ||
((hd = shost_priv(ioc->sh)) == NULL)) event == MPI_EVENT_EXT_BUS_RESET) &&
return 1; (ioc->bus_type == SPI) && (ioc->soft_resets < -1))
ioc->soft_resets++;
switch (event) {
case MPI_EVENT_UNIT_ATTENTION: /* 03 */
/* FIXME! */
break;
case MPI_EVENT_IOC_BUS_RESET: /* 04 */
case MPI_EVENT_EXT_BUS_RESET: /* 05 */
if (hd && (ioc->bus_type == SPI) && (hd->soft_resets < -1))
hd->soft_resets++;
break;
case MPI_EVENT_LOGOUT: /* 09 */
/* FIXME! */
break;
case MPI_EVENT_RESCAN: /* 06 */
break;
/*
* CHECKME! Don't think we need to do
* anything for these, but...
*/
case MPI_EVENT_LINK_STATUS_CHANGE: /* 07 */
case MPI_EVENT_LOOP_STATE_CHANGE: /* 08 */
/*
* CHECKME! Falling thru...
*/
break;
case MPI_EVENT_INTEGRATED_RAID: /* 0B */
break;
case MPI_EVENT_NONE: /* 00 */
case MPI_EVENT_LOG_DATA: /* 01 */
case MPI_EVENT_STATE_CHANGE: /* 02 */
case MPI_EVENT_EVENT_CHANGE: /* 0A */
default:
dprintk(ioc, printk(MYIOC_s_DEBUG_FMT
": Ignoring event (=%02Xh)\n",
ioc->name, event));
break;
}
return 1; /* currently means nothing really */ return 1; /* currently means nothing really */
} }
......
...@@ -90,6 +90,7 @@ ...@@ -90,6 +90,7 @@
#endif #endif
typedef struct _internal_cmd { typedef struct _internal_cmd {
char *data; /* data pointer */ char *data; /* data pointer */
dma_addr_t data_dma; /* data dma address */ dma_addr_t data_dma; /* data dma address */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
新手
引导
客服 返回
顶部