mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 23:54:04 +08:00
[SCSI] mpt fusion: Firmware event implementation using seperate WorkQueue
Now Firmware events are handled by firmware event queue. Previously it was handled in interrupt context/WorkQueue of Linux. Firmware Event handling is restructured and optimized. Signed-off-by: Kashyap Desai <kadesai@lsi.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
ea2a788de4
commit
3eb0822c67
@ -1931,6 +1931,11 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
*/
|
||||
mpt_detect_bound_ports(ioc, pdev);
|
||||
|
||||
INIT_LIST_HEAD(&ioc->fw_event_list);
|
||||
spin_lock_init(&ioc->fw_event_lock);
|
||||
snprintf(ioc->fw_event_q_name, 20, "mpt/%d", ioc->id);
|
||||
ioc->fw_event_q = create_singlethread_workqueue(ioc->fw_event_q_name);
|
||||
|
||||
if ((r = mpt_do_ioc_recovery(ioc, MPT_HOSTEVENT_IOC_BRINGUP,
|
||||
CAN_SLEEP)) != 0){
|
||||
printk(MYIOC_s_ERR_FMT "didn't initialize properly! (%d)\n",
|
||||
@ -2010,6 +2015,11 @@ mpt_detach(struct pci_dev *pdev)
|
||||
cancel_delayed_work(&ioc->fault_reset_work);
|
||||
destroy_workqueue(wq);
|
||||
|
||||
spin_lock_irqsave(&ioc->fw_event_lock, flags);
|
||||
wq = ioc->fw_event_q;
|
||||
ioc->fw_event_q = NULL;
|
||||
spin_unlock_irqrestore(&ioc->fw_event_lock, flags);
|
||||
destroy_workqueue(wq);
|
||||
|
||||
sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/summary", ioc->name);
|
||||
remove_proc_entry(pname, NULL);
|
||||
|
@ -694,9 +694,18 @@ typedef struct _MPT_ADAPTER
|
||||
struct net_device *netdev;
|
||||
struct list_head sas_topology;
|
||||
struct mutex sas_topology_mutex;
|
||||
|
||||
struct workqueue_struct *fw_event_q;
|
||||
struct list_head fw_event_list;
|
||||
spinlock_t fw_event_lock;
|
||||
u8 fw_events_off; /* if '1', then ignore events */
|
||||
char fw_event_q_name[20];
|
||||
|
||||
struct mutex sas_discovery_mutex;
|
||||
u8 sas_discovery_runtime;
|
||||
u8 sas_discovery_ignore_events;
|
||||
struct list_head sas_device_info_list;
|
||||
struct mutex sas_device_info_mutex;
|
||||
u8 sas_discovery_quiesce_io;
|
||||
int sas_index; /* index refrencing */
|
||||
MPT_MGMT sas_mgmt;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -61,12 +61,30 @@ enum mptsas_hotplug_action {
|
||||
MPTSAS_DEL_DEVICE,
|
||||
MPTSAS_ADD_RAID,
|
||||
MPTSAS_DEL_RAID,
|
||||
MPTSAS_ADD_PHYSDISK,
|
||||
MPTSAS_ADD_PHYSDISK_REPROBE,
|
||||
MPTSAS_DEL_PHYSDISK,
|
||||
MPTSAS_DEL_PHYSDISK_REPROBE,
|
||||
MPTSAS_ADD_INACTIVE_VOLUME,
|
||||
MPTSAS_IGNORE_EVENT,
|
||||
};
|
||||
|
||||
struct mptsas_mapping{
|
||||
u8 id;
|
||||
u8 channel;
|
||||
};
|
||||
|
||||
struct mptsas_device_info {
|
||||
struct list_head list;
|
||||
struct mptsas_mapping os; /* operating system mapping*/
|
||||
struct mptsas_mapping fw; /* firmware mapping */
|
||||
u64 sas_address;
|
||||
u32 device_info; /* specific bits for devices */
|
||||
u16 slot; /* enclosure slot id */
|
||||
u64 enclosure_logical_id; /*enclosure address */
|
||||
};
|
||||
|
||||
struct mptsas_hotplug_event {
|
||||
struct work_struct work;
|
||||
MPT_ADAPTER *ioc;
|
||||
enum mptsas_hotplug_action event_type;
|
||||
u64 sas_address;
|
||||
@ -74,11 +92,18 @@ struct mptsas_hotplug_event {
|
||||
u8 id;
|
||||
u32 device_info;
|
||||
u16 handle;
|
||||
u16 parent_handle;
|
||||
u8 phy_id;
|
||||
u8 phys_disk_num_valid; /* hrc (hidden raid component) */
|
||||
u8 phys_disk_num; /* hrc - unique index*/
|
||||
u8 hidden_raid_component; /* hrc - don't expose*/
|
||||
struct scsi_device *sdev;
|
||||
};
|
||||
|
||||
struct fw_event_work {
|
||||
struct list_head list;
|
||||
struct delayed_work work;
|
||||
MPT_ADAPTER *ioc;
|
||||
u32 event;
|
||||
u8 retries;
|
||||
u8 event_data[1];
|
||||
};
|
||||
|
||||
struct mptsas_discovery_event {
|
||||
|
Loading…
Reference in New Issue
Block a user