Commit 77e63ed4 authored by Kashyap, Desai's avatar Kashyap, Desai Committed by James Bottomley

[SCSI] mpt2sas: Target Reset will be issued from Interrupt context.

(1) Added three new functions to handle sending target resest and OP_REMOVE
from interrupt time, they are _scsih_tm_tr_send, _scsih_tm_tr_complete, and
_scsih_sas_control_complete.  This code will create a link list of pending
target resets if there is no more available request in the hipriority
request queue.  The list is stored in ioc->delayed_tr_list.

(2) All callback handler return type is changed from void to u8.
Now _base_interrupt will check for return type of callback handlers to
take decision of message frame is already freed or not.
In genral,
Return 1 meaning mf should be freed from _base_interrupt
       0 means the mf is freed from function.
Signed-off-by: default avatarKashyap Desai <kashyap.desai@lsi.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 595bb0bd
...@@ -575,9 +575,10 @@ _base_display_reply_info(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -575,9 +575,10 @@ _base_display_reply_info(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
* @msix_index: MSIX table index supplied by the OS * @msix_index: MSIX table index supplied by the OS
* @reply: reply message frame(lower 32bit addr) * @reply: reply message frame(lower 32bit addr)
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
void u8
mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply) u32 reply)
{ {
...@@ -585,10 +586,10 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -585,10 +586,10 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
if (mpi_reply && mpi_reply->Function == MPI2_FUNCTION_EVENT_ACK) if (mpi_reply && mpi_reply->Function == MPI2_FUNCTION_EVENT_ACK)
return; return 1;
if (ioc->base_cmds.status == MPT2_CMD_NOT_USED) if (ioc->base_cmds.status == MPT2_CMD_NOT_USED)
return; return 1;
ioc->base_cmds.status |= MPT2_CMD_COMPLETE; ioc->base_cmds.status |= MPT2_CMD_COMPLETE;
if (mpi_reply) { if (mpi_reply) {
...@@ -597,6 +598,7 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -597,6 +598,7 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
} }
ioc->base_cmds.status &= ~MPT2_CMD_PENDING; ioc->base_cmds.status &= ~MPT2_CMD_PENDING;
complete(&ioc->base_cmds.done); complete(&ioc->base_cmds.done);
return 1;
} }
/** /**
...@@ -605,9 +607,10 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -605,9 +607,10 @@ mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
* @msix_index: MSIX table index supplied by the OS * @msix_index: MSIX table index supplied by the OS
* @reply: reply message frame(lower 32bit addr) * @reply: reply message frame(lower 32bit addr)
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
static void static u8
_base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply) _base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply)
{ {
Mpi2EventNotificationReply_t *mpi_reply; Mpi2EventNotificationReply_t *mpi_reply;
...@@ -616,9 +619,9 @@ _base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply) ...@@ -616,9 +619,9 @@ _base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply)
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
if (!mpi_reply) if (!mpi_reply)
return; return 1;
if (mpi_reply->Function != MPI2_FUNCTION_EVENT_NOTIFICATION) if (mpi_reply->Function != MPI2_FUNCTION_EVENT_NOTIFICATION)
return; return 1;
#ifdef CONFIG_SCSI_MPT2SAS_LOGGING #ifdef CONFIG_SCSI_MPT2SAS_LOGGING
_base_display_event_data(ioc, mpi_reply); _base_display_event_data(ioc, mpi_reply);
#endif #endif
...@@ -647,6 +650,8 @@ _base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply) ...@@ -647,6 +650,8 @@ _base_async_event(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u32 reply)
/* ctl callback handler */ /* ctl callback handler */
mpt2sas_ctl_event_callback(ioc, msix_index, reply); mpt2sas_ctl_event_callback(ioc, msix_index, reply);
return 1;
} }
/** /**
...@@ -745,6 +750,7 @@ _base_interrupt(int irq, void *bus_id) ...@@ -745,6 +750,7 @@ _base_interrupt(int irq, void *bus_id)
u8 msix_index; u8 msix_index;
struct MPT2SAS_ADAPTER *ioc = bus_id; struct MPT2SAS_ADAPTER *ioc = bus_id;
Mpi2ReplyDescriptorsUnion_t *rpf; Mpi2ReplyDescriptorsUnion_t *rpf;
u8 rc;
if (ioc->mask_interrupts) if (ioc->mask_interrupts)
return IRQ_NONE; return IRQ_NONE;
...@@ -777,12 +783,13 @@ _base_interrupt(int irq, void *bus_id) ...@@ -777,12 +783,13 @@ _base_interrupt(int irq, void *bus_id)
if (smid) if (smid)
cb_idx = _base_get_cb_idx(ioc, smid); cb_idx = _base_get_cb_idx(ioc, smid);
if (smid && cb_idx != 0xFF) { if (smid && cb_idx != 0xFF) {
mpt_callbacks[cb_idx](ioc, smid, msix_index, rc = mpt_callbacks[cb_idx](ioc, smid, msix_index,
reply); reply);
if (reply) if (reply)
_base_display_reply_info(ioc, smid, msix_index, _base_display_reply_info(ioc, smid, msix_index,
reply); reply);
mpt2sas_base_free_smid(ioc, smid); if (rc)
mpt2sas_base_free_smid(ioc, smid);
} }
if (!smid) if (!smid)
_base_async_event(ioc, msix_index, reply); _base_async_event(ioc, msix_index, reply);
...@@ -3323,10 +3330,18 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) ...@@ -3323,10 +3330,18 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, int sleep_flag)
unsigned long flags; unsigned long flags;
u32 reply_address; u32 reply_address;
u16 smid; u16 smid;
struct _tr_list *delayed_tr, *delayed_tr_next;
dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name, dinitprintk(ioc, printk(MPT2SAS_DEBUG_FMT "%s\n", ioc->name,
__func__)); __func__));
/* clean the delayed target reset list */
list_for_each_entry_safe(delayed_tr, delayed_tr_next,
&ioc->delayed_tr_list, list) {
list_del(&delayed_tr->list);
kfree(delayed_tr);
}
/* initialize the scsi lookup free list */ /* initialize the scsi lookup free list */
spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); spin_lock_irqsave(&ioc->scsi_lookup_lock, flags);
INIT_LIST_HEAD(&ioc->free_list); INIT_LIST_HEAD(&ioc->free_list);
......
...@@ -307,6 +307,7 @@ struct _sas_device { ...@@ -307,6 +307,7 @@ struct _sas_device {
u16 slot; u16 slot;
u8 hidden_raid_component; u8 hidden_raid_component;
u8 responding; u8 responding;
u16 state;
}; };
/** /**
...@@ -443,6 +444,17 @@ struct request_tracker { ...@@ -443,6 +444,17 @@ struct request_tracker {
struct list_head tracker_list; struct list_head tracker_list;
}; };
/**
* struct _tr_list - target reset list
* @handle: device handle
* @state: state machine
*/
struct _tr_list {
struct list_head list;
u16 handle;
u16 state;
};
typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr); typedef void (*MPT_ADD_SGE)(void *paddr, u32 flags_length, dma_addr_t dma_addr);
/** /**
...@@ -617,6 +629,8 @@ struct MPT2SAS_ADAPTER { ...@@ -617,6 +629,8 @@ struct MPT2SAS_ADAPTER {
u8 ctl_cb_idx; u8 ctl_cb_idx;
u8 base_cb_idx; u8 base_cb_idx;
u8 config_cb_idx; u8 config_cb_idx;
u8 tm_tr_cb_idx;
u8 tm_sas_control_cb_idx;
struct _internal_cmd base_cmds; struct _internal_cmd base_cmds;
struct _internal_cmd transport_cmds; struct _internal_cmd transport_cmds;
struct _internal_cmd tm_cmds; struct _internal_cmd tm_cmds;
...@@ -727,6 +741,8 @@ struct MPT2SAS_ADAPTER { ...@@ -727,6 +741,8 @@ struct MPT2SAS_ADAPTER {
struct dma_pool *reply_post_free_dma_pool; struct dma_pool *reply_post_free_dma_pool;
u32 reply_post_host_index; u32 reply_post_host_index;
struct list_head delayed_tr_list;
/* diag buffer support */ /* diag buffer support */
u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT];
u32 diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT]; u32 diag_buffer_sz[MPI2_DIAG_BUF_TYPE_COUNT];
...@@ -738,8 +754,8 @@ struct MPT2SAS_ADAPTER { ...@@ -738,8 +754,8 @@ struct MPT2SAS_ADAPTER {
u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT]; u32 diagnostic_flags[MPI2_DIAG_BUF_TYPE_COUNT];
}; };
typedef void (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, typedef u8 (*MPT_CALLBACK)(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u8 msix_index, u32 reply); u32 reply);
/* base shared API */ /* base shared API */
...@@ -757,7 +773,8 @@ int mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag, ...@@ -757,7 +773,8 @@ int mpt2sas_base_hard_reset_handler(struct MPT2SAS_ADAPTER *ioc, int sleep_flag,
void *mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid); void *mpt2sas_base_get_msg_frame(struct MPT2SAS_ADAPTER *ioc, u16 smid);
void *mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid); void *mpt2sas_base_get_sense_buffer(struct MPT2SAS_ADAPTER *ioc, u16 smid);
void mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr); void mpt2sas_base_build_zero_len_sge(struct MPT2SAS_ADAPTER *ioc, void *paddr);
dma_addr_t mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc, u16 smid); dma_addr_t mpt2sas_base_get_sense_buffer_dma(struct MPT2SAS_ADAPTER *ioc,
u16 smid);
/* hi-priority queue */ /* hi-priority queue */
u16 mpt2sas_base_get_smid_hpr(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx); u16 mpt2sas_base_get_smid_hpr(struct MPT2SAS_ADAPTER *ioc, u8 cb_idx);
...@@ -776,7 +793,7 @@ void mpt2sas_base_initialize_callback_handler(void); ...@@ -776,7 +793,7 @@ void mpt2sas_base_initialize_callback_handler(void);
u8 mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func); u8 mpt2sas_base_register_callback_handler(MPT_CALLBACK cb_func);
void mpt2sas_base_release_callback_handler(u8 cb_idx); void mpt2sas_base_release_callback_handler(u8 cb_idx);
void mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u8 mpt2sas_base_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply); u32 reply);
void *mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, u32 phys_addr); void *mpt2sas_base_get_reply_virt_addr(struct MPT2SAS_ADAPTER *ioc, u32 phys_addr);
...@@ -791,6 +808,8 @@ int mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc, ...@@ -791,6 +808,8 @@ int mpt2sas_base_scsi_enclosure_processor(struct MPT2SAS_ADAPTER *ioc,
void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_type); void mpt2sas_base_validate_event_type(struct MPT2SAS_ADAPTER *ioc, u32 *event_type);
/* scsih shared API */ /* scsih shared API */
u8 mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
u32 reply);
void mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun, void mpt2sas_scsih_issue_tm(struct MPT2SAS_ADAPTER *ioc, u16 handle, uint lun,
u8 type, u16 smid_task, ulong timeout); u8 type, u16 smid_task, ulong timeout);
void mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle); void mpt2sas_scsih_set_tm_flag(struct MPT2SAS_ADAPTER *ioc, u16 handle);
...@@ -802,12 +821,10 @@ struct _sas_node *mpt2sas_scsih_expander_find_by_sas_address(struct MPT2SAS_ADAP ...@@ -802,12 +821,10 @@ struct _sas_node *mpt2sas_scsih_expander_find_by_sas_address(struct MPT2SAS_ADAP
struct _sas_device *mpt2sas_scsih_sas_device_find_by_sas_address( struct _sas_device *mpt2sas_scsih_sas_device_find_by_sas_address(
struct MPT2SAS_ADAPTER *ioc, u64 sas_address); struct MPT2SAS_ADAPTER *ioc, u64 sas_address);
void mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
u32 reply);
void mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase); void mpt2sas_scsih_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
/* config shared API */ /* config shared API */
void mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u8 mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply); u32 reply);
int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys); int mpt2sas_config_get_number_hba_phys(struct MPT2SAS_ADAPTER *ioc, u8 *num_phys);
int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc, int mpt2sas_config_get_manufacturing_pg0(struct MPT2SAS_ADAPTER *ioc,
...@@ -861,17 +878,17 @@ extern struct device_attribute *mpt2sas_host_attrs[]; ...@@ -861,17 +878,17 @@ extern struct device_attribute *mpt2sas_host_attrs[];
extern struct device_attribute *mpt2sas_dev_attrs[]; extern struct device_attribute *mpt2sas_dev_attrs[];
void mpt2sas_ctl_init(void); void mpt2sas_ctl_init(void);
void mpt2sas_ctl_exit(void); void mpt2sas_ctl_exit(void);
void mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u8 mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply); u32 reply);
void mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase); void mpt2sas_ctl_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase);
void mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, u8 mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
u32 reply); u32 reply);
void mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc, void mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc,
Mpi2EventNotificationReply_t *mpi_reply); Mpi2EventNotificationReply_t *mpi_reply);
/* transport shared API */ /* transport shared API */
void mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u8 msix_index, u32 reply); u32 reply);
struct _sas_port *mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc, struct _sas_port *mpt2sas_transport_port_add(struct MPT2SAS_ADAPTER *ioc,
u16 handle, u16 parent_handle); u16 handle, u16 parent_handle);
void mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address, void mpt2sas_transport_port_remove(struct MPT2SAS_ADAPTER *ioc, u64 sas_address,
...@@ -885,6 +902,8 @@ void mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, u16 handle, ...@@ -885,6 +902,8 @@ void mpt2sas_transport_update_links(struct MPT2SAS_ADAPTER *ioc, u16 handle,
extern struct sas_function_template mpt2sas_transport_functions; extern struct sas_function_template mpt2sas_transport_functions;
extern struct scsi_transport_template *mpt2sas_transport_template; extern struct scsi_transport_template *mpt2sas_transport_template;
extern int scsi_internal_device_block(struct scsi_device *sdev); extern int scsi_internal_device_block(struct scsi_device *sdev);
extern u8 mpt2sas_stm_zero_smid_handler(struct MPT2SAS_ADAPTER *ioc,
u8 msix_index, u32 reply);
extern int scsi_internal_device_unblock(struct scsi_device *sdev); extern int scsi_internal_device_unblock(struct scsi_device *sdev);
#endif /* MPT2SAS_BASE_H_INCLUDED */ #endif /* MPT2SAS_BASE_H_INCLUDED */
...@@ -233,18 +233,19 @@ _config_free_config_dma_memory(struct MPT2SAS_ADAPTER *ioc, ...@@ -233,18 +233,19 @@ _config_free_config_dma_memory(struct MPT2SAS_ADAPTER *ioc,
* *
* The callback handler when using _config_request. * The callback handler when using _config_request.
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
void u8
mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply) u32 reply)
{ {
MPI2DefaultReply_t *mpi_reply; MPI2DefaultReply_t *mpi_reply;
if (ioc->config_cmds.status == MPT2_CMD_NOT_USED) if (ioc->config_cmds.status == MPT2_CMD_NOT_USED)
return; return 1;
if (ioc->config_cmds.smid != smid) if (ioc->config_cmds.smid != smid)
return; return 1;
ioc->config_cmds.status |= MPT2_CMD_COMPLETE; ioc->config_cmds.status |= MPT2_CMD_COMPLETE;
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
if (mpi_reply) { if (mpi_reply) {
...@@ -258,6 +259,7 @@ mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -258,6 +259,7 @@ mpt2sas_config_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
#endif #endif
ioc->config_cmds.smid = USHORT_MAX; ioc->config_cmds.smid = USHORT_MAX;
complete(&ioc->config_cmds.done); complete(&ioc->config_cmds.done);
return 1;
} }
/** /**
......
...@@ -225,18 +225,19 @@ _ctl_display_some_debug(struct MPT2SAS_ADAPTER *ioc, u16 smid, ...@@ -225,18 +225,19 @@ _ctl_display_some_debug(struct MPT2SAS_ADAPTER *ioc, u16 smid,
* *
* The callback handler when using ioc->ctl_cb_idx. * The callback handler when using ioc->ctl_cb_idx.
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
void u8
mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply) u32 reply)
{ {
MPI2DefaultReply_t *mpi_reply; MPI2DefaultReply_t *mpi_reply;
if (ioc->ctl_cmds.status == MPT2_CMD_NOT_USED) if (ioc->ctl_cmds.status == MPT2_CMD_NOT_USED)
return; return 1;
if (ioc->ctl_cmds.smid != smid) if (ioc->ctl_cmds.smid != smid)
return; return 1;
ioc->ctl_cmds.status |= MPT2_CMD_COMPLETE; ioc->ctl_cmds.status |= MPT2_CMD_COMPLETE;
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
if (mpi_reply) { if (mpi_reply) {
...@@ -248,6 +249,7 @@ mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -248,6 +249,7 @@ mpt2sas_ctl_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
#endif #endif
ioc->ctl_cmds.status &= ~MPT2_CMD_PENDING; ioc->ctl_cmds.status &= ~MPT2_CMD_PENDING;
complete(&ioc->ctl_cmds.done); complete(&ioc->ctl_cmds.done);
return 1;
} }
/** /**
...@@ -336,9 +338,10 @@ mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc, ...@@ -336,9 +338,10 @@ mpt2sas_ctl_add_to_event_log(struct MPT2SAS_ADAPTER *ioc,
* This function merely adds a new work task into ioc->firmware_event_thread. * This function merely adds a new work task into ioc->firmware_event_thread.
* The tasks are worked from _firmware_event_work in user context. * The tasks are worked from _firmware_event_work in user context.
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
void u8
mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
u32 reply) u32 reply)
{ {
...@@ -346,6 +349,7 @@ mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, ...@@ -346,6 +349,7 @@ mpt2sas_ctl_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index,
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
mpt2sas_ctl_add_to_event_log(ioc, mpi_reply); mpt2sas_ctl_add_to_event_log(ioc, mpi_reply);
return 1;
} }
/** /**
......
This diff is collapsed.
...@@ -218,9 +218,10 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle, ...@@ -218,9 +218,10 @@ _transport_set_identify(struct MPT2SAS_ADAPTER *ioc, u16 handle,
* Callback handler when sending internal generated transport cmds. * Callback handler when sending internal generated transport cmds.
* The callback index passed is `ioc->transport_cb_idx` * The callback index passed is `ioc->transport_cb_idx`
* *
* Return nothing. * Return 1 meaning mf should be freed from _base_interrupt
* 0 means the mf is freed from this function.
*/ */
void u8
mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
u32 reply) u32 reply)
{ {
...@@ -228,9 +229,9 @@ mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -228,9 +229,9 @@ mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply);
if (ioc->transport_cmds.status == MPT2_CMD_NOT_USED) if (ioc->transport_cmds.status == MPT2_CMD_NOT_USED)
return; return 1;
if (ioc->transport_cmds.smid != smid) if (ioc->transport_cmds.smid != smid)
return; return 1;
ioc->transport_cmds.status |= MPT2_CMD_COMPLETE; ioc->transport_cmds.status |= MPT2_CMD_COMPLETE;
if (mpi_reply) { if (mpi_reply) {
memcpy(ioc->transport_cmds.reply, mpi_reply, memcpy(ioc->transport_cmds.reply, mpi_reply,
...@@ -239,6 +240,7 @@ mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index, ...@@ -239,6 +240,7 @@ mpt2sas_transport_done(struct MPT2SAS_ADAPTER *ioc, u16 smid, u8 msix_index,
} }
ioc->transport_cmds.status &= ~MPT2_CMD_PENDING; ioc->transport_cmds.status &= ~MPT2_CMD_PENDING;
complete(&ioc->transport_cmds.done); complete(&ioc->transport_cmds.done);
return 1;
} }
/* report manufacture request structure */ /* report manufacture request structure */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment