|
|
|
@ -102,8 +102,6 @@ static int mfcounter = 0;
|
|
|
|
|
/*
|
|
|
|
|
* Public data...
|
|
|
|
|
*/
|
|
|
|
|
int mpt_lan_index = -1;
|
|
|
|
|
int mpt_stm_index = -1;
|
|
|
|
|
|
|
|
|
|
struct proc_dir_entry *mpt_proc_root_dir;
|
|
|
|
|
|
|
|
|
@ -125,11 +123,14 @@ static MPT_EVHANDLER MptEvHandlers[MPT_MAX_PROTOCOL_DRIVERS];
|
|
|
|
|
static MPT_RESETHANDLER MptResetHandlers[MPT_MAX_PROTOCOL_DRIVERS];
|
|
|
|
|
static struct mpt_pci_driver *MptDeviceDriverHandlers[MPT_MAX_PROTOCOL_DRIVERS];
|
|
|
|
|
|
|
|
|
|
static int mpt_base_index = -1;
|
|
|
|
|
static int last_drv_idx = -1;
|
|
|
|
|
|
|
|
|
|
static DECLARE_WAIT_QUEUE_HEAD(mpt_waitq);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Driver Callback Index's
|
|
|
|
|
*/
|
|
|
|
|
static u8 mpt_base_index = MPT_MAX_PROTOCOL_DRIVERS;
|
|
|
|
|
static u8 last_drv_idx;
|
|
|
|
|
|
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
|
|
/*
|
|
|
|
|
* Forward protos...
|
|
|
|
@ -235,6 +236,23 @@ static int mpt_set_debug_level(const char *val, struct kernel_param *kp)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* mpt_get_cb_idx - obtain cb_idx for registered driver
|
|
|
|
|
* @dclass: class driver enum
|
|
|
|
|
*
|
|
|
|
|
* Returns cb_idx, or zero means it wasn't found
|
|
|
|
|
**/
|
|
|
|
|
static u8
|
|
|
|
|
mpt_get_cb_idx(MPT_DRIVER_CLASS dclass)
|
|
|
|
|
{
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
|
|
|
|
|
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--)
|
|
|
|
|
if (MptDriverClass[cb_idx] == dclass)
|
|
|
|
|
return cb_idx;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Process turbo (context) reply...
|
|
|
|
|
*/
|
|
|
|
@ -243,8 +261,8 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
{
|
|
|
|
|
MPT_FRAME_HDR *mf = NULL;
|
|
|
|
|
MPT_FRAME_HDR *mr = NULL;
|
|
|
|
|
int req_idx = 0;
|
|
|
|
|
int cb_idx;
|
|
|
|
|
u16 req_idx = 0;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
|
|
|
|
|
dmfprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Got TURBO reply req_idx=%08x\n",
|
|
|
|
|
ioc->name, pa));
|
|
|
|
@ -256,7 +274,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
mf = MPT_INDEX_2_MFPTR(ioc, req_idx);
|
|
|
|
|
break;
|
|
|
|
|
case MPI_CONTEXT_REPLY_TYPE_LAN:
|
|
|
|
|
cb_idx = mpt_lan_index;
|
|
|
|
|
cb_idx = mpt_get_cb_idx(MPTLAN_DRIVER);
|
|
|
|
|
/*
|
|
|
|
|
* Blind set of mf to NULL here was fatal
|
|
|
|
|
* after lan_reply says "freeme"
|
|
|
|
@ -277,7 +295,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);
|
|
|
|
|
break;
|
|
|
|
|
case MPI_CONTEXT_REPLY_TYPE_SCSI_TARGET:
|
|
|
|
|
cb_idx = mpt_stm_index;
|
|
|
|
|
cb_idx = mpt_get_cb_idx(MPTSTM_DRIVER);
|
|
|
|
|
mr = (MPT_FRAME_HDR *) CAST_U32_TO_PTR(pa);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
@ -286,7 +304,7 @@ mpt_turbo_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Check for (valid) IO callback! */
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
|
|
|
|
|
MptCallbacks[cb_idx] == NULL) {
|
|
|
|
|
printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",
|
|
|
|
|
__FUNCTION__, ioc->name, cb_idx);
|
|
|
|
@ -304,8 +322,8 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
{
|
|
|
|
|
MPT_FRAME_HDR *mf;
|
|
|
|
|
MPT_FRAME_HDR *mr;
|
|
|
|
|
int req_idx;
|
|
|
|
|
int cb_idx;
|
|
|
|
|
u16 req_idx;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int freeme;
|
|
|
|
|
|
|
|
|
|
u32 reply_dma_low;
|
|
|
|
@ -350,7 +368,7 @@ mpt_reply(MPT_ADAPTER *ioc, u32 pa)
|
|
|
|
|
mpt_iocstatus_info(ioc, (u32)ioc_stat, mf);
|
|
|
|
|
|
|
|
|
|
/* Check for (valid) IO callback! */
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS ||
|
|
|
|
|
MptCallbacks[cb_idx] == NULL) {
|
|
|
|
|
printk(MYIOC_s_WARN_FMT "%s: Invalid cb_idx (%d)!\n",
|
|
|
|
|
__FUNCTION__, ioc->name, cb_idx);
|
|
|
|
@ -563,28 +581,27 @@ mpt_base_reply(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *reply)
|
|
|
|
|
* in order to register separate callbacks; one for "normal" SCSI IO;
|
|
|
|
|
* one for MptScsiTaskMgmt requests; one for Scan/DV requests.
|
|
|
|
|
*
|
|
|
|
|
* Returns a positive integer valued "handle" in the
|
|
|
|
|
* range (and S.O.D. order) {N,...,7,6,5,...,1} if successful.
|
|
|
|
|
* Any non-positive return value (including zero!) should be considered
|
|
|
|
|
* an error by the caller.
|
|
|
|
|
* Returns u8 valued "handle" in the range (and S.O.D. order)
|
|
|
|
|
* {N,...,7,6,5,...,1} if successful.
|
|
|
|
|
* A return value of MPT_MAX_PROTOCOL_DRIVERS (including zero!) should be
|
|
|
|
|
* considered an error by the caller.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
u8
|
|
|
|
|
mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
last_drv_idx = -1;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
last_drv_idx = MPT_MAX_PROTOCOL_DRIVERS;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Search for empty callback slot in this order: {N,...,7,6,5,...,1}
|
|
|
|
|
* (slot/handle 0 is reserved!)
|
|
|
|
|
*/
|
|
|
|
|
for (i = MPT_MAX_PROTOCOL_DRIVERS-1; i; i--) {
|
|
|
|
|
if (MptCallbacks[i] == NULL) {
|
|
|
|
|
MptCallbacks[i] = cbfunc;
|
|
|
|
|
MptDriverClass[i] = dclass;
|
|
|
|
|
MptEvHandlers[i] = NULL;
|
|
|
|
|
last_drv_idx = i;
|
|
|
|
|
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
|
|
|
|
if (MptCallbacks[cb_idx] == NULL) {
|
|
|
|
|
MptCallbacks[cb_idx] = cbfunc;
|
|
|
|
|
MptDriverClass[cb_idx] = dclass;
|
|
|
|
|
MptEvHandlers[cb_idx] = NULL;
|
|
|
|
|
last_drv_idx = cb_idx;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -601,9 +618,9 @@ mpt_register(MPT_CALLBACK cbfunc, MPT_DRIVER_CLASS dclass)
|
|
|
|
|
* module is unloaded.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
mpt_deregister(int cb_idx)
|
|
|
|
|
mpt_deregister(u8 cb_idx)
|
|
|
|
|
{
|
|
|
|
|
if ((cb_idx >= 0) && (cb_idx < MPT_MAX_PROTOCOL_DRIVERS)) {
|
|
|
|
|
if (cb_idx && (cb_idx < MPT_MAX_PROTOCOL_DRIVERS)) {
|
|
|
|
|
MptCallbacks[cb_idx] = NULL;
|
|
|
|
|
MptDriverClass[cb_idx] = MPTUNKNOWN_DRIVER;
|
|
|
|
|
MptEvHandlers[cb_idx] = NULL;
|
|
|
|
@ -625,9 +642,9 @@ mpt_deregister(int cb_idx)
|
|
|
|
|
* Returns 0 for success.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc)
|
|
|
|
|
mpt_event_register(u8 cb_idx, MPT_EVHANDLER ev_cbfunc)
|
|
|
|
|
{
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
MptEvHandlers[cb_idx] = ev_cbfunc;
|
|
|
|
@ -645,9 +662,9 @@ mpt_event_register(int cb_idx, MPT_EVHANDLER ev_cbfunc)
|
|
|
|
|
* or when its module is unloaded.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
mpt_event_deregister(int cb_idx)
|
|
|
|
|
mpt_event_deregister(u8 cb_idx)
|
|
|
|
|
{
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
MptEvHandlers[cb_idx] = NULL;
|
|
|
|
@ -665,9 +682,9 @@ mpt_event_deregister(int cb_idx)
|
|
|
|
|
* Returns 0 for success.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func)
|
|
|
|
|
mpt_reset_register(u8 cb_idx, MPT_RESETHANDLER reset_func)
|
|
|
|
|
{
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
MptResetHandlers[cb_idx] = reset_func;
|
|
|
|
@ -684,9 +701,9 @@ mpt_reset_register(int cb_idx, MPT_RESETHANDLER reset_func)
|
|
|
|
|
* or when its module is unloaded.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
mpt_reset_deregister(int cb_idx)
|
|
|
|
|
mpt_reset_deregister(u8 cb_idx)
|
|
|
|
|
{
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
MptResetHandlers[cb_idx] = NULL;
|
|
|
|
@ -699,12 +716,12 @@ mpt_reset_deregister(int cb_idx)
|
|
|
|
|
* @cb_idx: MPT protocol driver index
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)
|
|
|
|
|
mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, u8 cb_idx)
|
|
|
|
|
{
|
|
|
|
|
MPT_ADAPTER *ioc;
|
|
|
|
|
const struct pci_device_id *id;
|
|
|
|
|
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
|
|
|
|
|
MptDeviceDriverHandlers[cb_idx] = dd_cbfunc;
|
|
|
|
@ -726,12 +743,12 @@ mpt_device_driver_register(struct mpt_pci_driver * dd_cbfunc, int cb_idx)
|
|
|
|
|
* @cb_idx: MPT protocol driver index
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
mpt_device_driver_deregister(int cb_idx)
|
|
|
|
|
mpt_device_driver_deregister(u8 cb_idx)
|
|
|
|
|
{
|
|
|
|
|
struct mpt_pci_driver *dd_cbfunc;
|
|
|
|
|
MPT_ADAPTER *ioc;
|
|
|
|
|
|
|
|
|
|
if (cb_idx < 1 || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
if (!cb_idx || cb_idx >= MPT_MAX_PROTOCOL_DRIVERS)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
dd_cbfunc = MptDeviceDriverHandlers[cb_idx];
|
|
|
|
@ -749,14 +766,14 @@ mpt_device_driver_deregister(int cb_idx)
|
|
|
|
|
/**
|
|
|
|
|
* mpt_get_msg_frame - Obtain a MPT request frame from the pool (of 1024)
|
|
|
|
|
* allocated per MPT adapter.
|
|
|
|
|
* @handle: Handle of registered MPT protocol driver
|
|
|
|
|
* @cb_idx: Handle of registered MPT protocol driver
|
|
|
|
|
* @ioc: Pointer to MPT adapter structure
|
|
|
|
|
*
|
|
|
|
|
* Returns pointer to a MPT request frame or %NULL if none are available
|
|
|
|
|
* or IOC is not active.
|
|
|
|
|
*/
|
|
|
|
|
MPT_FRAME_HDR*
|
|
|
|
|
mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
|
|
|
|
|
mpt_get_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc)
|
|
|
|
|
{
|
|
|
|
|
MPT_FRAME_HDR *mf;
|
|
|
|
|
unsigned long flags;
|
|
|
|
@ -781,7 +798,7 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
|
|
|
|
|
u.frame.linkage.list);
|
|
|
|
|
list_del(&mf->u.frame.linkage.list);
|
|
|
|
|
mf->u.frame.linkage.arg1 = 0;
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle; /* byte */
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx; /* byte */
|
|
|
|
|
req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
|
|
|
|
|
/* u16! */
|
|
|
|
|
req_idx = req_offset / ioc->req_sz;
|
|
|
|
@ -805,7 +822,7 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
dmfprintk(ioc, printk(KERN_INFO MYNAM ": %s: mpt_get_msg_frame(%d,%d), got mf=%p\n",
|
|
|
|
|
ioc->name, handle, ioc->id, mf));
|
|
|
|
|
ioc->name, cb_idx, ioc->id, mf));
|
|
|
|
|
return mf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -813,7 +830,7 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
|
|
|
|
|
/**
|
|
|
|
|
* mpt_put_msg_frame - Send a protocol specific MPT request frame
|
|
|
|
|
* to a IOC.
|
|
|
|
|
* @handle: Handle of registered MPT protocol driver
|
|
|
|
|
* @cb_idx: Handle of registered MPT protocol driver
|
|
|
|
|
* @ioc: Pointer to MPT adapter structure
|
|
|
|
|
* @mf: Pointer to MPT request frame
|
|
|
|
|
*
|
|
|
|
@ -821,14 +838,14 @@ mpt_get_msg_frame(int handle, MPT_ADAPTER *ioc)
|
|
|
|
|
* specific MPT adapter.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
mpt_put_msg_frame(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
{
|
|
|
|
|
u32 mf_dma_addr;
|
|
|
|
|
int req_offset;
|
|
|
|
|
u16 req_idx; /* Request index */
|
|
|
|
|
|
|
|
|
|
/* ensure values are reset properly! */
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle; /* byte */
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx; /* byte */
|
|
|
|
|
req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
|
|
|
|
|
/* u16! */
|
|
|
|
|
req_idx = req_offset / ioc->req_sz;
|
|
|
|
@ -845,7 +862,7 @@ mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
/**
|
|
|
|
|
* mpt_put_msg_frame_hi_pri - Send a protocol specific MPT request frame
|
|
|
|
|
* to a IOC using hi priority request queue.
|
|
|
|
|
* @handle: Handle of registered MPT protocol driver
|
|
|
|
|
* @cb_idx: Handle of registered MPT protocol driver
|
|
|
|
|
* @ioc: Pointer to MPT adapter structure
|
|
|
|
|
* @mf: Pointer to MPT request frame
|
|
|
|
|
*
|
|
|
|
@ -853,14 +870,14 @@ mpt_put_msg_frame(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
* specific MPT adapter.
|
|
|
|
|
**/
|
|
|
|
|
void
|
|
|
|
|
mpt_put_msg_frame_hi_pri(int handle, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
mpt_put_msg_frame_hi_pri(u8 cb_idx, MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf)
|
|
|
|
|
{
|
|
|
|
|
u32 mf_dma_addr;
|
|
|
|
|
int req_offset;
|
|
|
|
|
u16 req_idx; /* Request index */
|
|
|
|
|
|
|
|
|
|
/* ensure values are reset properly! */
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;
|
|
|
|
|
req_offset = (u8 *)mf - (u8 *)ioc->req_frames;
|
|
|
|
|
req_idx = req_offset / ioc->req_sz;
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(req_idx);
|
|
|
|
@ -931,7 +948,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)
|
|
|
|
|
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
|
|
|
|
|
/**
|
|
|
|
|
* mpt_send_handshake_request - Send MPT request via doorbell handshake method.
|
|
|
|
|
* @handle: Handle of registered MPT protocol driver
|
|
|
|
|
* @cb_idx: Handle of registered MPT protocol driver
|
|
|
|
|
* @ioc: Pointer to MPT adapter structure
|
|
|
|
|
* @reqBytes: Size of the request in bytes
|
|
|
|
|
* @req: Pointer to MPT request frame
|
|
|
|
@ -946,7 +963,7 @@ mpt_add_sge(char *pAddr, u32 flagslength, dma_addr_t dma_addr)
|
|
|
|
|
* Returns 0 for success, non-zero for failure.
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)
|
|
|
|
|
mpt_send_handshake_request(u8 cb_idx, MPT_ADAPTER *ioc, int reqBytes, u32 *req, int sleepFlag)
|
|
|
|
|
{
|
|
|
|
|
int r = 0;
|
|
|
|
|
u8 *req_as_bytes;
|
|
|
|
@ -966,7 +983,7 @@ mpt_send_handshake_request(int handle, MPT_ADAPTER *ioc, int reqBytes, u32 *req,
|
|
|
|
|
if (reqBytes >= 12 && ii >= 0 && ii < ioc->req_depth) {
|
|
|
|
|
MPT_FRAME_HDR *mf = (MPT_FRAME_HDR*)req;
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.req_idx = cpu_to_le16(ii);
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = handle;
|
|
|
|
|
mf->u.frame.hwhdr.msgctxu.fld.cb_idx = cb_idx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure there are no doorbells */
|
|
|
|
@ -1432,6 +1449,7 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
u32 msize;
|
|
|
|
|
u32 psize;
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int r = -ENODEV;
|
|
|
|
|
u8 revision;
|
|
|
|
|
u8 pcixcmd;
|
|
|
|
@ -1655,10 +1673,10 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* call per device driver probe entry point */
|
|
|
|
|
for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
|
|
|
|
|
if(MptDeviceDriverHandlers[ii] &&
|
|
|
|
|
MptDeviceDriverHandlers[ii]->probe) {
|
|
|
|
|
MptDeviceDriverHandlers[ii]->probe(pdev,id);
|
|
|
|
|
for(cb_idx=0; cb_idx<MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) {
|
|
|
|
|
if(MptDeviceDriverHandlers[cb_idx] &&
|
|
|
|
|
MptDeviceDriverHandlers[cb_idx]->probe) {
|
|
|
|
|
MptDeviceDriverHandlers[cb_idx]->probe(pdev,id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1695,7 +1713,7 @@ mpt_detach(struct pci_dev *pdev)
|
|
|
|
|
{
|
|
|
|
|
MPT_ADAPTER *ioc = pci_get_drvdata(pdev);
|
|
|
|
|
char pname[32];
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
|
|
|
|
|
sprintf(pname, MPT_PROCFS_MPTBASEDIR "/%s/summary", ioc->name);
|
|
|
|
|
remove_proc_entry(pname, NULL);
|
|
|
|
@ -1705,10 +1723,10 @@ mpt_detach(struct pci_dev *pdev)
|
|
|
|
|
remove_proc_entry(pname, NULL);
|
|
|
|
|
|
|
|
|
|
/* call per device driver remove entry point */
|
|
|
|
|
for(ii=0; ii<MPT_MAX_PROTOCOL_DRIVERS; ii++) {
|
|
|
|
|
if(MptDeviceDriverHandlers[ii] &&
|
|
|
|
|
MptDeviceDriverHandlers[ii]->remove) {
|
|
|
|
|
MptDeviceDriverHandlers[ii]->remove(pdev);
|
|
|
|
|
for(cb_idx=0; cb_idx<MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) {
|
|
|
|
|
if(MptDeviceDriverHandlers[cb_idx] &&
|
|
|
|
|
MptDeviceDriverHandlers[cb_idx]->remove) {
|
|
|
|
|
MptDeviceDriverHandlers[cb_idx]->remove(pdev);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1820,7 +1838,7 @@ mpt_resume(struct pci_dev *pdev)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int
|
|
|
|
|
mpt_signal_reset(int index, MPT_ADAPTER *ioc, int reset_phase)
|
|
|
|
|
mpt_signal_reset(u8 index, MPT_ADAPTER *ioc, int reset_phase)
|
|
|
|
|
{
|
|
|
|
|
if ((MptDriverClass[index] == MPTSPI_DRIVER &&
|
|
|
|
|
ioc->bus_type != SPI) ||
|
|
|
|
@ -1862,6 +1880,7 @@ 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;
|
|
|
|
@ -2146,20 +2165,20 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag)
|
|
|
|
|
*/
|
|
|
|
|
if (hard_reset_done) {
|
|
|
|
|
rc = handlers = 0;
|
|
|
|
|
for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
|
|
|
|
|
if ((ret == 0) && MptResetHandlers[ii]) {
|
|
|
|
|
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, ii));
|
|
|
|
|
rc += mpt_signal_reset(ii, ioc, MPT_IOC_POST_RESET);
|
|
|
|
|
ioc->name, cb_idx));
|
|
|
|
|
rc += mpt_signal_reset(cb_idx, ioc, MPT_IOC_POST_RESET);
|
|
|
|
|
handlers++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (alt_ioc_ready && MptResetHandlers[ii]) {
|
|
|
|
|
if (alt_ioc_ready && MptResetHandlers[cb_idx]) {
|
|
|
|
|
drsprintk(ioc, printk(MYIOC_s_DEBUG_FMT
|
|
|
|
|
"Calling alt-%s post_reset handler #%d\n",
|
|
|
|
|
ioc->name, ioc->alt_ioc->name, ii));
|
|
|
|
|
rc += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_POST_RESET);
|
|
|
|
|
ioc->name, ioc->alt_ioc->name, cb_idx));
|
|
|
|
|
rc += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_POST_RESET);
|
|
|
|
|
handlers++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -3592,20 +3611,20 @@ mpt_diag_reset(MPT_ADAPTER *ioc, int ignore, int sleepFlag)
|
|
|
|
|
* MptResetHandlers[] registered yet.
|
|
|
|
|
*/
|
|
|
|
|
{
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int r = 0;
|
|
|
|
|
|
|
|
|
|
for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
|
|
|
|
|
if (MptResetHandlers[ii]) {
|
|
|
|
|
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, ii));
|
|
|
|
|
r += mpt_signal_reset(ii, ioc, MPT_IOC_PRE_RESET);
|
|
|
|
|
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, ii));
|
|
|
|
|
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
|
|
|
|
ioc->name, ioc->alt_ioc->name, cb_idx));
|
|
|
|
|
r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_PRE_RESET);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -5907,7 +5926,7 @@ procmpt_summary_read(char *buf, char **start, off_t offset, int request, int *eo
|
|
|
|
|
static int
|
|
|
|
|
procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eof, void *data)
|
|
|
|
|
{
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int scsi, fc, sas, lan, ctl, targ, dmp;
|
|
|
|
|
char *drvname;
|
|
|
|
|
int len;
|
|
|
|
@ -5916,10 +5935,10 @@ procmpt_version_read(char *buf, char **start, off_t offset, int request, int *eo
|
|
|
|
|
len += sprintf(buf+len, " Fusion MPT base driver\n");
|
|
|
|
|
|
|
|
|
|
scsi = fc = sas = lan = ctl = targ = dmp = 0;
|
|
|
|
|
for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
|
|
|
|
|
for (cb_idx=MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
|
|
|
|
drvname = NULL;
|
|
|
|
|
if (MptCallbacks[ii]) {
|
|
|
|
|
switch (MptDriverClass[ii]) {
|
|
|
|
|
if (MptCallbacks[cb_idx]) {
|
|
|
|
|
switch (MptDriverClass[cb_idx]) {
|
|
|
|
|
case MPTSPI_DRIVER:
|
|
|
|
|
if (!scsi++) drvname = "SPI host";
|
|
|
|
|
break;
|
|
|
|
@ -6163,18 +6182,18 @@ mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag)
|
|
|
|
|
* For all other protocol drivers, this is a no-op.
|
|
|
|
|
*/
|
|
|
|
|
{
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int r = 0;
|
|
|
|
|
|
|
|
|
|
for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
|
|
|
|
|
if (MptResetHandlers[ii]) {
|
|
|
|
|
for (cb_idx = MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
|
|
|
|
if (MptResetHandlers[cb_idx]) {
|
|
|
|
|
dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling IOC reset_setup handler #%d\n",
|
|
|
|
|
ioc->name, ii));
|
|
|
|
|
r += mpt_signal_reset(ii, ioc, MPT_IOC_SETUP_RESET);
|
|
|
|
|
ioc->name, cb_idx));
|
|
|
|
|
r += mpt_signal_reset(cb_idx, ioc, MPT_IOC_SETUP_RESET);
|
|
|
|
|
if (ioc->alt_ioc) {
|
|
|
|
|
dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Calling alt-%s setup reset handler #%d\n",
|
|
|
|
|
ioc->name, ioc->alt_ioc->name, ii));
|
|
|
|
|
r += mpt_signal_reset(ii, ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
|
|
|
|
ioc->name, ioc->alt_ioc->name, cb_idx));
|
|
|
|
|
r += mpt_signal_reset(cb_idx, ioc->alt_ioc, MPT_IOC_SETUP_RESET);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -6579,6 +6598,7 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
|
|
|
|
|
u32 evData0 = 0;
|
|
|
|
|
// u32 evCtx;
|
|
|
|
|
int ii;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
int r = 0;
|
|
|
|
|
int handlers = 0;
|
|
|
|
|
char evStr[EVENT_DESCR_STR_SZ];
|
|
|
|
@ -6659,11 +6679,11 @@ ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *pEventReply
|
|
|
|
|
/*
|
|
|
|
|
* Call each currently registered protocol event handler.
|
|
|
|
|
*/
|
|
|
|
|
for (ii=MPT_MAX_PROTOCOL_DRIVERS-1; ii; ii--) {
|
|
|
|
|
if (MptEvHandlers[ii]) {
|
|
|
|
|
for (cb_idx=MPT_MAX_PROTOCOL_DRIVERS-1; cb_idx; cb_idx--) {
|
|
|
|
|
if (MptEvHandlers[cb_idx]) {
|
|
|
|
|
devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Routing Event to event handler #%d\n",
|
|
|
|
|
ioc->name, ii));
|
|
|
|
|
r += (*(MptEvHandlers[ii]))(ioc, pEventReply);
|
|
|
|
|
ioc->name, cb_idx));
|
|
|
|
|
r += (*(MptEvHandlers[cb_idx]))(ioc, pEventReply);
|
|
|
|
|
handlers++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -7354,8 +7374,6 @@ EXPORT_SYMBOL(mpt_send_handshake_request);
|
|
|
|
|
EXPORT_SYMBOL(mpt_verify_adapter);
|
|
|
|
|
EXPORT_SYMBOL(mpt_GetIocState);
|
|
|
|
|
EXPORT_SYMBOL(mpt_print_ioc_summary);
|
|
|
|
|
EXPORT_SYMBOL(mpt_lan_index);
|
|
|
|
|
EXPORT_SYMBOL(mpt_stm_index);
|
|
|
|
|
EXPORT_SYMBOL(mpt_HardResetHandler);
|
|
|
|
|
EXPORT_SYMBOL(mpt_config);
|
|
|
|
|
EXPORT_SYMBOL(mpt_findImVolumes);
|
|
|
|
@ -7373,16 +7391,16 @@ EXPORT_SYMBOL(mpt_raid_phys_disk_pg0);
|
|
|
|
|
static int __init
|
|
|
|
|
fusion_init(void)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
u8 cb_idx;
|
|
|
|
|
|
|
|
|
|
show_mptmod_ver(my_NAME, my_VERSION);
|
|
|
|
|
printk(KERN_INFO COPYRIGHT "\n");
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < MPT_MAX_PROTOCOL_DRIVERS; i++) {
|
|
|
|
|
MptCallbacks[i] = NULL;
|
|
|
|
|
MptDriverClass[i] = MPTUNKNOWN_DRIVER;
|
|
|
|
|
MptEvHandlers[i] = NULL;
|
|
|
|
|
MptResetHandlers[i] = NULL;
|
|
|
|
|
for (cb_idx = 0; cb_idx < MPT_MAX_PROTOCOL_DRIVERS; cb_idx++) {
|
|
|
|
|
MptCallbacks[cb_idx] = NULL;
|
|
|
|
|
MptDriverClass[cb_idx] = MPTUNKNOWN_DRIVER;
|
|
|
|
|
MptEvHandlers[cb_idx] = NULL;
|
|
|
|
|
MptResetHandlers[cb_idx] = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Register ourselves (mptbase) in order to facilitate
|
|
|
|
|