mpt fusion: [2.6.30-rc6] rewrite of all internal generated functionsthat issue commands to
Subsystems (2)
PATCH 7/24 mpt fusion: [2.6.30-rc6] rewrite of all internal generated functionsthat issue commands to
1) rewrite of all internal generated functions that issue commands to firmware, porting them to be single threaded using the generic MPT_MGMT struct. Implemented using completion Queue.
---
Signed-off-by Kashyap Desai <[email protected]>
---
drivers/message/fusion/mptbase.c +2 -0
@@ -1775,6 +1775,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)spin_lock_init (&ioc->diagLock);spin_lock_init (&ioc->initializing_hba_lock); +mutex_init (&ioc->internal_cmds.mutex); +init_completion (&ioc->internal_cmds.done);mutex_init (&ioc->mptbase_cmds.mutex);init_completion (&ioc->mptbase_cmds.done);
drivers/message/fusion/mptbase.h +3 -2
@@ -465,7 +465,9 @@ typedef struct _MPT_MGMT {struct mutex mutex;struct completion done;u8 reply[MPT_DEFAULT_FRAME_SIZE ];/* reply frame data */ +u8 sense[MPT_SENSE_BUFFER_ALLOC ];u8 status;/* current command status */ +int completion_code; }MPT_MGMT ;/*
@@ -709,6 +711,7 @@ typedef struct _MPT_ADAPTERint sas_index;/* index refrencing */ MPT_MGMT sas_mgmt;MPT_MGMT mptbase_cmds;/* for sending config pages */ +MPT_MGMT internal_cmds;struct work_struct sas_persist_task;struct work_struct fc_setup_reset_work;
@@ -863,8 +866,6 @@ typedef struct _MPT_SCSI_HOST {unsigned long timeouts;/* cmd timeouts */ ushort sel_timeout[MPT_MAX_FC_DEVICES ];char *info_kbuf; -wait_queue_head_t scandv_waitq; -int scandv_wait_done;long last_queue_full;u16 tm_iocstatus;u16 spi_pending;
drivers/message/fusion/mptfc.c +0 -2
@@ -1310,8 +1310,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; -init_waitqueue_head (&hd->scandv_waitq); - hd->scandv_wait_done =0 ; hd->last_queue_full =0 ; sh->transportt = mptfc_transport_template;
drivers/message/fusion/mptsas.c +0 -2
@@ -3282,8 +3282,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ioc->sas_data.ptClear = mpt_pt_clear; -init_waitqueue_head (&hd->scandv_waitq); - hd->scandv_wait_done =0 ; hd->last_queue_full =0 ;INIT_LIST_HEAD (&hd->target_reset_list);spin_unlock_irqrestore (&ioc->FreeQlock, flags);
drivers/message/fusion/mptscsih.c +212 -304
664 lines not on this page · raw message
drivers/message/fusion/mptscsih.h +1 -0
@@ -60,6 +60,7 @@#define MPT_SCANDV_SELECTION_TIMEOUT (0x00000008)#define MPT_SCANDV_ISSUE_SENSE (0x00000010)#define MPT_SCANDV_FALLBACK (0x00000020) +#define MPT_SCANDV_BUSY (0x00000040)#define MPT_SCANDV_MAX_RETRIES (10)
drivers/message/fusion/mptspi.c +31 -21
81 lines not on this page · raw message
James Bottomley
maintainerQuoted 97 lines · Desai
1) rewrite of all internal generated functions that issue commands to firmware, porting them to be single threaded using the generic
MPT_MGMTstruct. Implemented using completion Queue.
---Signed-off-by Kashyap Desai <[email protected]>---
drivers/message/fusion/mptbase.c +2
-0@@ -1775,6 +1775,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)spin_lock_init (&ioc->diagLock);spin_lock_init (&ioc->initializing_hba_lock); +mutex_init (&ioc->internal_cmds.mutex); +init_completion (&ioc->internal_cmds.done);mutex_init (&ioc->mptbase_cmds.mutex);init_completion (&ioc->mptbase_cmds.done);drivers/message/fusion/mptbase.h +3
-2@@ -465,7 +465,9 @@ typedef struct _MPT_MGMT {struct mutex mutex;struct completion done;u8 reply[MPT_DEFAULT_FRAME_SIZE ];/* reply frame data */ +u8 sense[MPT_SENSE_BUFFER_ALLOC ];u8 status;/* current command status */ +int completion_code; }MPT_MGMT ;/* @@ -709,6 +711,7 @@ typedef struct _MPT_ADAPTERint sas_index;/* index refrencing */ MPT_MGMT sas_mgmt;MPT_MGMT mptbase_cmds;/* for sending config pages */ +MPT_MGMT internal_cmds;struct work_struct sas_persist_task;struct work_struct fc_setup_reset_work;@@ -863,8 +866,6 @@ typedef struct _MPT_SCSI_HOST {unsigned long timeouts;/* cmd timeouts */ ushort sel_timeout[MPT_MAX_FC_DEVICES ];char *info_kbuf; -wait_queue_head_t scandv_waitq; -int scandv_wait_done;long last_queue_full;u16 tm_iocstatus;u16 spi_pending;drivers/message/fusion/mptfc.c +0
-2@@ -1310,8 +1310,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; -init_waitqueue_head (&hd->scandv_waitq); - hd->scandv_wait_done =0 ; hd->last_queue_full =0 ; sh->transportt = mptfc_transport_template;drivers/message/fusion/mptsas.c +0
-2@@ -3282,8 +3282,6 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) ioc->sas_data.ptClear = mpt_pt_clear; -init_waitqueue_head (&hd->scandv_waitq); - hd->scandv_wait_done =0 ; hd->last_queue_full =0 ;INIT_LIST_HEAD (&hd->target_reset_list);spin_unlock_irqrestore (&ioc->FreeQlock, flags);drivers/message/fusion/mptscsih.c +2
-3@@ -100,6 +100,8 @@ static int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, u8 id,int mptscsih_ioc_reset (MPT_ADAPTER *ioc,int post_reset);int mptscsih_event_process (MPT_ADAPTER *ioc,EventNotificationReply_t *pEvReply); +static int mptscsih_get_completion_code (MPT_ADAPTER *ioc, +MPT_FRAME_HDR *req,MPT_FRAME_HDR *reply);int mptscsih_scandv_complete (MPT_ADAPTER *ioc,MPT_FRAME_HDR *mf,MPT_FRAME_HDR *r);static int mptscsih_do_cmd (MPT_SCSI_HOST *hd,INTERNAL_CMD *iocmd);static void mptscsih_synchronize_cache (MPT_SCSI_HOST *hd,VirtDevice *vdevice);@@ -2571,94 +2573,35 @@ int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) {MPT_SCSI_HOST *hd; -unsigned long flags; - - dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT
drivers/message/fusion/mptscsih.c int · line 2577
Quoted 10 lines
drivers/message/fusion/mptscsih.c +1
-8-": IOC %s_reset routed to SCSI host driver!\n" , - ioc->name, reset_phase==MPT_IOC_SETUP_RESET ?"setup" : ( - reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); -/* If a FW reload request arrives after base installed but -* before all scsi hosts have been attached, then an alt_ioc -* may have a NULL sh pointer. -*/ -if (ioc->sh ==NULL ||shost_priv (ioc->sh) ==NULL ) +if ((ioc->sh ==NULL ) || (ioc->sh->hostdata ==NULL ))
Just cosmetic, but the additional braces are superfluous, and that should still be shost_priv(ioc->sh) == NULL.
James