[Skiboot] [PATCH] fsp/fsp-rtc: Correctly report back errors to host

Cédric Le Goater clg at fr.ibm.com
Wed Nov 18 02:43:22 AEDT 2015


On 11/17/2015 09:04 AM, Stewart Smith wrote:
> When we got FSP_STATUS_TOD_RESET or similar, we would return OPAL_BUSY
> which would cause the Linux OPAL RTC driver to retry in a loop until
> we didn't say we're busy.
> 
> The problem with this is that some errors, such as FSP_STATUS_TOD_RESET
> are, in fact, permanent until we (say) set the time explicitly, so no
> matter how hard that little linux driver tries, it's never going to
> break out of that loop.
> 
> This fix is to fix our use of the state machine introduced way back in
> 6cf8b663e7d7cb1e827b6d9c90e694ea583f6f87 so that we return an error code
> to linux.
> 
> Reported-by: Cédric Le Goater <clg at fr.ibm.com>
> Fixes: 6cf8b663e7d7cb1e827b6d9c90e694ea583f6f87
> Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>


Reviewed-by: Cédric Le Goater <clg at fr.ibm.com>

Thanks,

C. 


> ---
>  hw/fsp/fsp-rtc.c | 5 +----
>  1 file changed, 1 insertion(+), 4 deletions(-)
> 
> diff --git a/hw/fsp/fsp-rtc.c b/hw/fsp/fsp-rtc.c
> index 6b982179d542..df0f67940372 100644
> --- a/hw/fsp/fsp-rtc.c
> +++ b/hw/fsp/fsp-rtc.c
> @@ -173,19 +173,16 @@ static void fsp_rtc_process_read(struct fsp_msg *read_resp)
>  		log_simple_error(&e_info(OPAL_RC_RTC_TOD),
>  				"RTC TOD in invalid state\n");
>  		rtc_tod_state = RTC_TOD_INVALID;
> -		rtc_read_request_state = RTC_READ_NO_REQUEST;
>  		break;
>  
>  	case FSP_STATUS_TOD_PERMANENT_ERROR:
>  		log_simple_error(&e_info(OPAL_RC_RTC_TOD),
>  			"RTC TOD in permanent error state\n");
>  		rtc_tod_state = RTC_TOD_PERMANENT_ERROR;
> -		rtc_read_request_state = RTC_READ_NO_REQUEST;
>  		break;
>  
>  	case FSP_STATUS_SUCCESS:
>  		/* Save the read RTC value in our cache */
> -		rtc_read_request_state = RTC_READ_REQUEST_AVAILABLE;
>  		rtc_tod_state = RTC_TOD_VALID;
>  		datetime_to_tm(read_resp->data.words[0],
>  			       (u64) read_resp->data.words[1] << 32, &tm);
> @@ -199,8 +196,8 @@ static void fsp_rtc_process_read(struct fsp_msg *read_resp)
>  		log_simple_error(&e_info(OPAL_RC_RTC_TOD),
>  				"RTC TOD read failed: %d\n", val);
>  		rtc_tod_state = RTC_TOD_INVALID;
> -		rtc_read_request_state = RTC_READ_NO_REQUEST;
>  	}
> +	rtc_read_request_state = RTC_READ_REQUEST_AVAILABLE;
>  }
>  
>  static void opal_rtc_eval_events(bool read_write)
> 



More information about the Skiboot mailing list