* [PATCH edk2-platforms v2] Silicon/Socionext/SynQuacerI2cDxe: fix TPL handling bug
@ 2018-02-21 11:04 Ard Biesheuvel
2018-02-21 11:11 ` Leif Lindholm
0 siblings, 1 reply; 3+ messages in thread
From: Ard Biesheuvel @ 2018-02-21 11:04 UTC (permalink / raw)
To: edk2-devel; +Cc: leif.lindholm, Ard Biesheuvel
Currently, SynQuacerI2cStartRequest() increases the TPL to TPL_HIGH_LEVEL
while accessing the I2C controller hardware, but fails to restore the TPL
to the original level if the call to SynQuacerI2cMasterStart() fails, and
returns right away. Given the TPL_HIGH_LEVEL implies that interrupts are
disabled, this results in a complete system hang. So instead, break out
of the loop, so that the TPL restore will occur before leaving the
function.
Note that this will result in the bus control bits to be de-asserted in
case of a failure to send the START condition, which is an appropriate
cleanup action to take after SynQuacerI2cMasterStart() fails.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
v2: clarify comment and commit log to explain that releasing the bus controls
is an appropriate action for this failure mode
Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
index 46c512a20151..5e70f9d921c3 100644
--- a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
+++ b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
@@ -324,7 +324,7 @@ SynQuacerI2cStartRequest (
Status = SynQuacerI2cMasterStart (I2c, SlaveAddress, Op);
if (EFI_ERROR (Status)) {
- return Status;
+ break;
}
Status = WaitForInterrupt (I2c);
@@ -397,7 +397,7 @@ SynQuacerI2cStartRequest (
} while (BufIdx < Op->LengthInBytes);
}
- // Stop the transfer
+ // Force bus state to idle, terminating any ongoing transfer
MmioWrite8 (I2c->MmioBase + F_I2C_REG_BCR, 0);
if (!AtRuntime) {
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH edk2-platforms v2] Silicon/Socionext/SynQuacerI2cDxe: fix TPL handling bug
2018-02-21 11:04 [PATCH edk2-platforms v2] Silicon/Socionext/SynQuacerI2cDxe: fix TPL handling bug Ard Biesheuvel
@ 2018-02-21 11:11 ` Leif Lindholm
2018-02-21 12:09 ` Ard Biesheuvel
0 siblings, 1 reply; 3+ messages in thread
From: Leif Lindholm @ 2018-02-21 11:11 UTC (permalink / raw)
To: Ard Biesheuvel; +Cc: edk2-devel
On Wed, Feb 21, 2018 at 11:04:21AM +0000, Ard Biesheuvel wrote:
> Currently, SynQuacerI2cStartRequest() increases the TPL to TPL_HIGH_LEVEL
> while accessing the I2C controller hardware, but fails to restore the TPL
> to the original level if the call to SynQuacerI2cMasterStart() fails, and
> returns right away. Given the TPL_HIGH_LEVEL implies that interrupts are
> disabled, this results in a complete system hang. So instead, break out
> of the loop, so that the TPL restore will occur before leaving the
> function.
>
> Note that this will result in the bus control bits to be de-asserted in
> case of a failure to send the START condition, which is an appropriate
> cleanup action to take after SynQuacerI2cMasterStart() fails.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
> ---
> v2: clarify comment and commit log to explain that releasing the bus controls
> is an appropriate action for this failure mode
>
> Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
> index 46c512a20151..5e70f9d921c3 100644
> --- a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
> +++ b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
> @@ -324,7 +324,7 @@ SynQuacerI2cStartRequest (
>
> Status = SynQuacerI2cMasterStart (I2c, SlaveAddress, Op);
> if (EFI_ERROR (Status)) {
> - return Status;
> + break;
> }
>
> Status = WaitForInterrupt (I2c);
> @@ -397,7 +397,7 @@ SynQuacerI2cStartRequest (
> } while (BufIdx < Op->LengthInBytes);
> }
>
> - // Stop the transfer
> + // Force bus state to idle, terminating any ongoing transfer
> MmioWrite8 (I2c->MmioBase + F_I2C_REG_BCR, 0);
>
> if (!AtRuntime) {
> --
> 2.11.0
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH edk2-platforms v2] Silicon/Socionext/SynQuacerI2cDxe: fix TPL handling bug
2018-02-21 11:11 ` Leif Lindholm
@ 2018-02-21 12:09 ` Ard Biesheuvel
0 siblings, 0 replies; 3+ messages in thread
From: Ard Biesheuvel @ 2018-02-21 12:09 UTC (permalink / raw)
To: Leif Lindholm; +Cc: edk2-devel@lists.01.org
On 21 February 2018 at 11:11, Leif Lindholm <leif.lindholm@linaro.org> wrote:
> On Wed, Feb 21, 2018 at 11:04:21AM +0000, Ard Biesheuvel wrote:
>> Currently, SynQuacerI2cStartRequest() increases the TPL to TPL_HIGH_LEVEL
>> while accessing the I2C controller hardware, but fails to restore the TPL
>> to the original level if the call to SynQuacerI2cMasterStart() fails, and
>> returns right away. Given the TPL_HIGH_LEVEL implies that interrupts are
>> disabled, this results in a complete system hang. So instead, break out
>> of the loop, so that the TPL restore will occur before leaving the
>> function.
>>
>> Note that this will result in the bus control bits to be de-asserted in
>> case of a failure to send the START condition, which is an appropriate
>> cleanup action to take after SynQuacerI2cMasterStart() fails.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
>
Thanks
Pushed as 33d1b85bae27
>> ---
>> v2: clarify comment and commit log to explain that releasing the bus controls
>> is an appropriate action for this failure mode
>>
>> Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c | 4 ++--
>> 1 file changed, 2 insertions(+), 2 deletions(-)
>>
>> diff --git a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
>> index 46c512a20151..5e70f9d921c3 100644
>> --- a/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
>> +++ b/Silicon/Socionext/SynQuacer/Drivers/SynQuacerI2cDxe/SynQuacerI2cDxe.c
>> @@ -324,7 +324,7 @@ SynQuacerI2cStartRequest (
>>
>> Status = SynQuacerI2cMasterStart (I2c, SlaveAddress, Op);
>> if (EFI_ERROR (Status)) {
>> - return Status;
>> + break;
>> }
>>
>> Status = WaitForInterrupt (I2c);
>> @@ -397,7 +397,7 @@ SynQuacerI2cStartRequest (
>> } while (BufIdx < Op->LengthInBytes);
>> }
>>
>> - // Stop the transfer
>> + // Force bus state to idle, terminating any ongoing transfer
>> MmioWrite8 (I2c->MmioBase + F_I2C_REG_BCR, 0);
>>
>> if (!AtRuntime) {
>> --
>> 2.11.0
>>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-02-21 12:03 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-21 11:04 [PATCH edk2-platforms v2] Silicon/Socionext/SynQuacerI2cDxe: fix TPL handling bug Ard Biesheuvel
2018-02-21 11:11 ` Leif Lindholm
2018-02-21 12:09 ` Ard Biesheuvel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox