mpt fusion: Optimized SendEventNotification [Resendig updated patch]
Subsystems (2)
SendEventNotification was handled through FIFO, now it is using doorbell mechenism to communicate with hardware.
Added Sleep Flag as an extra argument to support Can-Sleep feature.
---
---
drivers/message/fusion/mptbase.c +42 -34
@@ -192,7 +192,8 @@ static void mpt_read_ioc_pg_1(MPT_ADAPTER *ioc);static void mpt_read_ioc_pg_4 (MPT_ADAPTER *ioc);static void mpt_timer_expired (unsigned long data);static void mpt_get_manufacturing_pg_0 (MPT_ADAPTER *ioc); -static int SendEventNotification (MPT_ADAPTER *ioc,u8 EvSwitch); +static int SendEventNotification (MPT_ADAPTER *ioc,u8 EvSwitch, +int sleepFlag);static int SendEventAck (MPT_ADAPTER *ioc,EventNotificationReply_t *evnp);static int mpt_host_page_access_control (MPT_ADAPTER *ioc,u8 access_control_value,int sleepFlag);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,static void mpt_get_fw_exp_ver (char *buf,MPT_ADAPTER *ioc);//int mpt_HardResetHandler(MPT_ADAPTER *ioc, int sleepFlag); -static int ProcessEventNotification (MPT_ADAPTER *ioc,EventNotificationReply_t *evReply,int *evHandlers); +static int ProcessEventNotification (MPT_ADAPTER *ioc, +EventNotificationReply_t *evReply,int *evHandlers);static void mpt_iocstatus_info (MPT_ADAPTER *ioc,u32 ioc_status,MPT_FRAME_HDR *mf);static void mpt_fc_log_info (MPT_ADAPTER *ioc,u32 log_info);static void mpt_spi_log_info (MPT_ADAPTER *ioc,u32 log_info);
@@ -2269,28 +2271,36 @@ mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) } } +/* Enable MPT base driver management of EventNotification +* and EventAck handling. +*/ +if ((ret ==0 ) && (!ioc->facts.EventState)) { +dinitprintk (ioc,printk (MYIOC_s_INFO_FMT +"SendEventNotification\n" , + ioc->name)); + ret =SendEventNotification (ioc,1 , sleepFlag);/* 1=Enable */ + } + +if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) + rc =SendEventNotification (ioc->alt_ioc,1 , sleepFlag); +if (ret ==0 ) {/* Enable! (reply interrupt) */ CHIPREG_WRITE32 (&ioc->chip->IntMask,MPI_HIM_DIM ); ioc->active =1 ; } - -if (reset_alt_ioc_active && ioc->alt_ioc) { -/* (re)Enable alt-IOC! (reply interrupt) */ -dinitprintk (ioc,printk (MYIOC_s_INFO_FMT"alt_ioc reply irq re-enabled\n" , - ioc->alt_ioc->name)); -CHIPREG_WRITE32 (&ioc->alt_ioc->chip->IntMask,MPI_HIM_DIM ); - ioc->alt_ioc->active =1 ; +if (rc ==0 ) {/* alt ioc */ +if (reset_alt_ioc_active && ioc->alt_ioc) { +/* (re)Enable alt-IOC! (reply interrupt) */ + dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc + reply irq re-enabled\n", + ioc->alt_ioc->name)); +CHIPREG_WRITE32 (&ioc->alt_ioc->chip->IntMask, +MPI_HIM_DIM ); + ioc->alt_ioc->active =1 ; + } } -/* Enable MPT base driver management of EventNotification -* and EventAck handling. -*/ -if ((ret ==0 ) && (!ioc->facts.EventState)) - (void )SendEventNotification (ioc,1 );/* 1=Enable EventNotification */ - -if (ioc->alt_ioc && alt_ioc_ready && !ioc->alt_ioc->facts.EventState) - (void )SendEventNotification (ioc->alt_ioc,1 );/* 1=Enable EventNotification */ /* Add additional "reason" check before call to GetLanConfigPages * (combined with GetIoUnitPage2 call). This prevents a somewhat
@@ -5775,30 +5785,28 @@ mpt_get_manufacturing_pg_0(MPT_ADAPTER *ioc)* SendEventNotification - Send EventNotification (on or off) request to adapter * @ioc: Pointer to MPT_ADAPTER structure * @EvSwitch: Event switch flags +* @sleepFlag: Specifies whether the process can sleep */ static int -SendEventNotification (MPT_ADAPTER *ioc,u8 EvSwitch) +SendEventNotification (MPT_ADAPTER *ioc,u8 EvSwitch,int sleepFlag) { -EventNotification_t *evnp; +EventNotification_t evn; +MPIDefaultReply_t reply_buf; - evnp = (EventNotification_t *)mpt_get_msg_frame (mpt_base_index, ioc); -if (evnp ==NULL ) { -devtverboseprintk (ioc,printk (MYIOC_s_WARN_FMT"Unable to allocate event request frame!\n" , - ioc->name)); -return 0 ; - } -memset (evnp,0 ,sizeof (*evnp)); - -devtverboseprintk (ioc,printk (MYIOC_s_DEBUG_FMT"Sending EventNotification (%d) request %p\n" , ioc->name, EvSwitch, evnp)); +memset (&evn,0 ,sizeof (EventNotification_t)); +memset (&reply_buf,0 ,sizeof (MPIDefaultReply_t)); - evnp->Function =MPI_FUNCTION_EVENT_NOTIFICATION ; - evnp->ChainOffset =0 ; - evnp->MsgFlags =0 ; - evnp->Switch = EvSwitch; + evn.Function =MPI_FUNCTION_EVENT_NOTIFICATION ; + evn.Switch = EvSwitch; + evn.MsgContext =cpu_to_le32 (mpt_base_index <<16 ); -mpt_put_msg_frame (mpt_base_index, ioc, (MPT_FRAME_HDR *)evnp); +devtverboseprintk (ioc,printk (MYIOC_s_DEBUG_FMT +"Sending EventNotification (%d) request %p\n" , + ioc->name, EvSwitch, &evn)); -return 0 ; +return mpt_handshake_req_reply_wait (ioc,sizeof (EventNotification_t), + (u32 *)&evn,sizeof (MPIDefaultReply_t), (u16 *)&reply_buf,30 , + sleepFlag); }/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
James Bottomley
maintainerdrivers/message/fusion/mptbase.c mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) · line 2297
Quoted 13 lines · Desai
drivers/message/fusion/mptbase.c +6
-7- -if (reset_alt_ioc_active && ioc->alt_ioc) { -/* (re)Enable alt-IOC! (reply interrupt) */ -dinitprintk (ioc,printk (MYIOC_s_INFO_FMT"alt_ioc reply irq re-enabled\n" , - ioc->alt_ioc->name)); -CHIPREG_WRITE32 (&ioc->alt_ioc->chip->IntMask,MPI_HIM_DIM ); - ioc->alt_ioc->active =1 ; +if (rc ==0 ) {/* alt ioc */ +if (reset_alt_ioc_active && ioc->alt_ioc) { +/* (re)Enable alt-IOC! (reply interrupt) */ + dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc + reply irq re-enabled\n", + ioc->alt_ioc->name));
This isn't legal C: you can't split a string constant without a backslash:
drivers/message/fusion/mptbase.c:2295:46: warning: missing terminating " character drivers/message/fusion/mptbase.c:2296:27: warning: missing terminating " character drivers/message/fusion/mptbase.c: In function 'mpt_do_ioc_recovery':drivers/message/fusion/mptbase.c:2295: error: missing terminating " character drivers/message/fusion/mptbase.c:2295: error: expected ')' before 'reply' drivers/message/fusion/mptbase.c:2295: error: stray '\' in program drivers/message/fusion/mptbase.c:2295: error: missing terminating " character drivers/message/fusion/mptbase.c:2295: warning: too few arguments for format
James
Quoted 6 lines · James Bottomley
drivers/message/fusion/mptbase.c mpt_do_ioc_recovery(MPT_ADAPTER *ioc, u32 reason, int sleepFlag) · line 2297
Quoted 3 lines
drivers/message/fusion/mptbase.c +3
-0+ dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc + reply irq re-enabled\n", + ioc->alt_ioc->name));This isn't legal C: you can't split a string constant without a backslash:
Umm ... I don't think you can even split it with a backslash. You need to use string concatenation like so:
dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc "
"reply irq re-enabled\n", ioc->alt_ioc->name));
Or, since it's 100% more readable and greppable:
dinitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "alt-ioc reply irq re-enabled\n", ioc->alt_ioc->name));
Signature · 4 lines
Matthew Wilcox Intel Open Source Technology Centre "Bill, look, we understand that you're interested in selling us this operating system, but compare it to ours. We can't possibly take such a retrograde step."