diff options
-rw-r--r-- | drivers/message/fusion/mptbase.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c index 54326e09629c..0d2fb0eb34b9 100644 --- a/drivers/message/fusion/mptbase.c +++ b/drivers/message/fusion/mptbase.c | |||
@@ -192,7 +192,8 @@ static void mpt_read_ioc_pg_1(MPT_ADAPTER *ioc); | |||
192 | static void mpt_read_ioc_pg_4(MPT_ADAPTER *ioc); | 192 | static void mpt_read_ioc_pg_4(MPT_ADAPTER *ioc); |
193 | static void mpt_timer_expired(unsigned long data); | 193 | static void mpt_timer_expired(unsigned long data); |
194 | static void mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc); | 194 | static void mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc); |
195 | static int SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch); | 195 | static int SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch, |
196 | int sleepFlag); | ||
196 | static int SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp); | 197 | static int SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp); |
197 | static int mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag); | 198 | static int mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag); |
198 | static int mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init); | 199 | static int mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init); |
@@ -208,7 +209,8 @@ static int procmpt_iocinfo_read(char *buf, char **start, off_t offset, | |||
208 | static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc); | 209 | static void mpt_get_fw_exp_ver(char *buf, MPT_ADAPTER *ioc); |
209 | 210 | ||
210 | //int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag); | 211 | //int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag); |
211 | static int ProcessEventNotification(MPT_ADAPTER *ioc, EventNotificationReply_t *evReply, int *evHandlers); | 212 | static int ProcessEventNotification(MPT_ADAPTER *ioc, |
213 | EventNotificationReply_t *evReply, int *evHandlers); | ||
212 | static void mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf); | 214 | static void mpt_iocstatus_info(MPT_ADAPTER *ioc, u32 ioc_status, MPT_FRAME_HDR *mf); |
213 | static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); | 215 | static void mpt_fc_log_info(MPT_ADAPTER *ioc, u32 log_info); |
214 | static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info); | 216 | static void mpt_spi_log_info(MPT_ADAPTER *ioc, u32 log_info); |
@@ -2472,28 +2474,36 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) | |||
2472 | } | 2474 | } |
2473 | } | 2475 | } |
2474 | 2476 | ||
2477 | /* Enable MPT base driver management of EventNotification | ||
2478 | * and EventAck handling. | ||
2479 | */ | ||
2480 | if ((ret == 0) && (!ioc->facts.EventState)) { | ||
2481 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT | ||
2482 | "SendEventNotification\n", | ||
2483 | ioc->name)); | ||
2484 | ret = SendEventNotification(ioc, 1, sleepFlag); /* 1=Enable */ | ||
2485 | } | ||
2486 | |||
2487 | if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) | ||
2488 | rc = SendEventNotification(ioc->alt_ioc, 1, sleepFlag); | ||
2489 | |||
2475 | if (ret == 0) { | 2490 | if (ret == 0) { |
2476 | /* Enable! (reply interrupt) */ | 2491 | /* Enable! (reply interrupt) */ |
2477 | CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); | 2492 | CHIPREG_WRITE32(&ioc->chip->IntMask, MPI_HIM_DIM); |
2478 | ioc->active = 1; | 2493 | ioc->active = 1; |
2479 | } | 2494 | } |
2480 | 2495 | if (rc == 0) { /* alt ioc */ | |
2481 | if (reset_alt_ioc_active && ioc->alt_ioc) { | 2496 | if (reset_alt_ioc_active && ioc->alt_ioc) { |
2482 | /* (re)Enable alt-IOC! (reply interrupt) */ | 2497 | /* (re)Enable alt-IOC! (reply interrupt) */ |
2483 | dinitprintk(ioc, printk(MYIOC_s_INFO_FMT "alt_ioc reply irq re-enabled\n", | 2498 | dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc" |
2484 | ioc->alt_ioc->name)); | 2499 | "reply irq re-enabled\n", |
2485 | CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, MPI_HIM_DIM); | 2500 | ioc->alt_ioc->name)); |
2486 | ioc->alt_ioc->active = 1; | 2501 | CHIPREG_WRITE32(&ioc->alt_ioc->chip->IntMask, |
2502 | MPI_HIM_DIM); | ||
2503 | ioc->alt_ioc->active = 1; | ||
2504 | } | ||
2487 | } | 2505 | } |
2488 | 2506 | ||
2489 | /* Enable MPT base driver management of EventNotification | ||
2490 | * and EventAck handling. | ||
2491 | */ | ||
2492 | if ((ret == 0) && (!ioc->facts.EventState)) | ||
2493 | (void) SendEventNotification(ioc, 1); /* 1=Enable EventNotification */ | ||
2494 | |||
2495 | if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) | ||
2496 | (void) SendEventNotification(ioc->alt_ioc, 1); /* 1=Enable EventNotification */ | ||
2497 | 2507 | ||
2498 | /* Add additional "reason" check before call to GetLanConfigPages | 2508 | /* Add additional "reason" check before call to GetLanConfigPages |
2499 | * (combined with GetIoUnitPage2 call). This prevents a somewhat | 2509 | * (combined with GetIoUnitPage2 call). This prevents a somewhat |
@@ -6019,30 +6029,28 @@ mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc) | |||
6019 | * SendEventNotification - Send EventNotification (on or off) request to adapter | 6029 | * SendEventNotification - Send EventNotification (on or off) request to adapter |
6020 | * @ioc: Pointer to MPT_ADAPTER structure | 6030 | * @ioc: Pointer to MPT_ADAPTER structure |
6021 | * @EvSwitch: Event switch flags | 6031 | * @EvSwitch: Event switch flags |
6032 | * @sleepFlag: Specifies whether the process can sleep | ||
6022 | */ | 6033 | */ |
6023 | static int | 6034 | static int |
6024 | SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch) | 6035 | SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch, int sleepFlag) |
6025 | { | 6036 | { |
6026 | EventNotification_t *evnp; | 6037 | EventNotification_t evn; |
6038 | MPIDefaultReply_t reply_buf; | ||
6027 | 6039 | ||
6028 | evnp = (EventNotification_t *) mpt_get_msg_frame(mpt_base_index, ioc); | 6040 | memset(&evn, 0, sizeof(EventNotification_t)); |
6029 | if (evnp == NULL) { | 6041 | memset(&reply_buf, 0, sizeof(MPIDefaultReply_t)); |
6030 | devtverboseprintk(ioc, printk(MYIOC_s_WARN_FMT "Unable to allocate event request frame!\n", | ||
6031 | ioc->name)); | ||
6032 | return 0; | ||
6033 | } | ||
6034 | memset(evnp, 0, sizeof(*evnp)); | ||
6035 | |||
6036 | devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "Sending EventNotification (%d) request %p\n", ioc->name, EvSwitch, evnp)); | ||
6037 | 6042 | ||
6038 | evnp->Function = MPI_FUNCTION_EVENT_NOTIFICATION; | 6043 | evn.Function = MPI_FUNCTION_EVENT_NOTIFICATION; |
6039 | evnp->ChainOffset = 0; | 6044 | evn.Switch = EvSwitch; |
6040 | evnp->MsgFlags = 0; | 6045 | evn.MsgContext = cpu_to_le32(mpt_base_index << 16); |
6041 | evnp->Switch = EvSwitch; | ||
6042 | 6046 | ||
6043 | mpt_put_msg_frame(mpt_base_index, ioc, (MPT_FRAME_HDR *)evnp); | 6047 | devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
6048 | "Sending EventNotification (%d) request %p\n", | ||
6049 | ioc->name, EvSwitch, &evn)); | ||
6044 | 6050 | ||
6045 | return 0; | 6051 | return mpt_handshake_req_reply_wait(ioc, sizeof(EventNotification_t), |
6052 | (u32 *)&evn, sizeof(MPIDefaultReply_t), (u16 *)&reply_buf, 30, | ||
6053 | sleepFlag); | ||
6046 | } | 6054 | } |
6047 | 6055 | ||
6048 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ | 6056 | /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ |