@@ -363,7 +363,7 @@ static int __ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
363363{
364364 struct kernel_ipmi_msg msg ;
365365 unsigned char data [6 ];
366- int rv ;
366+ int rv = 0 ;
367367 struct ipmi_system_interface_addr addr ;
368368 int hbnow = 0 ;
369369
@@ -405,14 +405,18 @@ static int __ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
405405 msg .cmd = IPMI_WDOG_SET_TIMER ;
406406 msg .data = data ;
407407 msg .data_len = sizeof (data );
408- rv = ipmi_request_supply_msgs (watchdog_user ,
409- (struct ipmi_addr * ) & addr ,
410- 0 ,
411- & msg ,
412- NULL ,
413- smi_msg ,
414- recv_msg ,
415- 1 );
408+ if (smi_msg )
409+ rv = ipmi_request_supply_msgs (watchdog_user ,
410+ (struct ipmi_addr * ) & addr ,
411+ 0 ,
412+ & msg ,
413+ NULL ,
414+ smi_msg ,
415+ recv_msg ,
416+ 1 );
417+ else
418+ ipmi_panic_request_and_wait (watchdog_user ,
419+ (struct ipmi_addr * ) & addr , & msg );
416420 if (rv )
417421 pr_warn ("set timeout error: %d\n" , rv );
418422 else if (send_heartbeat_now )
@@ -431,9 +435,7 @@ static int _ipmi_set_timeout(int do_heartbeat)
431435
432436 atomic_set (& msg_tofree , 2 );
433437
434- rv = __ipmi_set_timeout (& smi_msg ,
435- & recv_msg ,
436- & send_heartbeat_now );
438+ rv = __ipmi_set_timeout (& smi_msg , & recv_msg , & send_heartbeat_now );
437439 if (rv ) {
438440 atomic_set (& msg_tofree , 0 );
439441 return rv ;
@@ -460,27 +462,10 @@ static int ipmi_set_timeout(int do_heartbeat)
460462 return rv ;
461463}
462464
463- static atomic_t panic_done_count = ATOMIC_INIT (0 );
464-
465- static void panic_smi_free (struct ipmi_smi_msg * msg )
466- {
467- atomic_dec (& panic_done_count );
468- }
469- static void panic_recv_free (struct ipmi_recv_msg * msg )
470- {
471- atomic_dec (& panic_done_count );
472- }
473-
474- static struct ipmi_smi_msg panic_halt_heartbeat_smi_msg =
475- INIT_IPMI_SMI_MSG (panic_smi_free );
476- static struct ipmi_recv_msg panic_halt_heartbeat_recv_msg =
477- INIT_IPMI_RECV_MSG (panic_recv_free );
478-
479465static void panic_halt_ipmi_heartbeat (void )
480466{
481467 struct kernel_ipmi_msg msg ;
482468 struct ipmi_system_interface_addr addr ;
483- int rv ;
484469
485470 /*
486471 * Don't reset the timer if we have the timer turned off, that
@@ -497,24 +482,10 @@ static void panic_halt_ipmi_heartbeat(void)
497482 msg .cmd = IPMI_WDOG_RESET_TIMER ;
498483 msg .data = NULL ;
499484 msg .data_len = 0 ;
500- atomic_add (2 , & panic_done_count );
501- rv = ipmi_request_supply_msgs (watchdog_user ,
502- (struct ipmi_addr * ) & addr ,
503- 0 ,
504- & msg ,
505- NULL ,
506- & panic_halt_heartbeat_smi_msg ,
507- & panic_halt_heartbeat_recv_msg ,
508- 1 );
509- if (rv )
510- atomic_sub (2 , & panic_done_count );
485+ ipmi_panic_request_and_wait (watchdog_user , (struct ipmi_addr * ) & addr ,
486+ & msg );
511487}
512488
513- static struct ipmi_smi_msg panic_halt_smi_msg =
514- INIT_IPMI_SMI_MSG (panic_smi_free );
515- static struct ipmi_recv_msg panic_halt_recv_msg =
516- INIT_IPMI_RECV_MSG (panic_recv_free );
517-
518489/*
519490 * Special call, doesn't claim any locks. This is only to be called
520491 * at panic or halt time, in run-to-completion mode, when the caller
@@ -526,22 +497,13 @@ static void panic_halt_ipmi_set_timeout(void)
526497 int send_heartbeat_now ;
527498 int rv ;
528499
529- /* Wait for the messages to be free. */
530- while (atomic_read (& panic_done_count ) != 0 )
531- ipmi_poll_interface (watchdog_user );
532- atomic_add (2 , & panic_done_count );
533- rv = __ipmi_set_timeout (& panic_halt_smi_msg ,
534- & panic_halt_recv_msg ,
535- & send_heartbeat_now );
500+ rv = __ipmi_set_timeout (NULL , NULL , & send_heartbeat_now );
536501 if (rv ) {
537- atomic_sub (2 , & panic_done_count );
538502 pr_warn ("Unable to extend the watchdog timeout\n" );
539503 } else {
540504 if (send_heartbeat_now )
541505 panic_halt_ipmi_heartbeat ();
542506 }
543- while (atomic_read (& panic_done_count ) != 0 )
544- ipmi_poll_interface (watchdog_user );
545507}
546508
547509static int __ipmi_heartbeat (void )
0 commit comments