RE: [PATCH v1 2/2] Bluetooth: btintel_pcie: Fix alive context state handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Paul,

>Subject: Re: [PATCH v1 2/2] Bluetooth: btintel_pcie: Fix alive context state
>handling
>
>Dear Kiran, dear Sai,
>
>
>Thank you for the patch.
>
>Am 07.07.25 um 05:46 schrieb Kiran K:
>> Firmware raises alive interrpt on sending 0xfc01 command. Alive
>> context
>
>interr*u*pt
>
>(I would have hoped, two developers would spot such a typo, a spell checker
>also highlights.)

Ack. Unfortunately  'interrpt' was missing in my codespell dictionary. I have updated the same. Thanks.
>
>> maintained in driver needs to be updated before sending 0xfc01 (Intel
>> Reset) or 0x03c0 (HCI Reset) to avoid the potential race condition
>> where the context is also updated in threaded irq.
>
>Do you have a reproducer for the issue?
Yes. Issue was reproduced in stress reboot scenario although reproduction rate is less - 1/25. 
>
>> Signed-off-by: Kiran K <kiran.k@xxxxxxxxx>
>> Signed-off-by: Sai Teja Aluvala <aluvala.sai.teja@xxxxxxxxx>
>> Fixes: 05c200c8f029 ("Bluetooth: btintel_pcie: Add handshake between
>> driver and firmware")
>
>I’d add the Fixes tag before the Signed-off-by lines.
Ack.

>
>> ---
>>   drivers/bluetooth/btintel_pcie.c | 25 ++++++++++++++-----------
>>   1 file changed, 14 insertions(+), 11 deletions(-)
>>
>> diff --git a/drivers/bluetooth/btintel_pcie.c
>> b/drivers/bluetooth/btintel_pcie.c
>> index f893ad6fc87a..d29103b102e4 100644
>> --- a/drivers/bluetooth/btintel_pcie.c
>> +++ b/drivers/bluetooth/btintel_pcie.c
>> @@ -1988,10 +1988,6 @@ static int btintel_pcie_send_frame(struct hci_dev
>*hdev,
>>   				btintel_pcie_inject_cmd_complete(hdev,
>opcode);
>>   		}
>>
>> -		/* Firmware raises alive interrupt on HCI_OP_RESET or
>0xfc01*/
>> -		if (opcode == HCI_OP_RESET || opcode == 0xfc01)
>> -			data->gp0_received = false;
>> -
>>   		hdev->stat.cmd_tx++;
>>   		break;
>>   	case HCI_ACLDATA_PKT:
>> @@ -2012,6 +2008,20 @@ static int btintel_pcie_send_frame(struct hci_dev
>*hdev,
>>   	memcpy(skb_push(skb, BTINTEL_PCIE_HCI_TYPE_LEN), &type,
>>   	       BTINTEL_PCIE_HCI_TYPE_LEN);
>>
>> +	if (type == BTINTEL_PCIE_HCI_CMD_PKT) {
>> +		/* Firmware raises alive interrupt on HCI_OP_RESET or
>0xfc01*/
>> +		if (opcode == HCI_OP_RESET || opcode == 0xfc01) {
>
>Why not keep the form of just one if statement with && in the condition?
>as below?
>
>> +			data->gp0_received = false;
>> +			old_ctxt = data->alive_intr_ctxt;
>> +			data->alive_intr_ctxt =
>> +				(opcode == 0xfc01 ?
>BTINTEL_PCIE_INTEL_HCI_RESET1 :
>> +					BTINTEL_PCIE_HCI_RESET);
>> +			bt_dev_dbg(data->hdev, "sending cmd: 0x%4.4x alive
>context changed: %s  ->  %s",
>> +				   opcode,
>btintel_pcie_alivectxt_state2str(old_ctxt),
>> +				   btintel_pcie_alivectxt_state2str(data-
>>alive_intr_ctxt));
>> +		}
>> +	}
>> +
>>   	ret = btintel_pcie_send_sync(data, skb);
>>   	if (ret) {
>>   		hdev->stat.err_tx++;
>> @@ -2021,13 +2031,6 @@ static int btintel_pcie_send_frame(struct
>> hci_dev *hdev,
>>
>>   	if (type == BTINTEL_PCIE_HCI_CMD_PKT &&
>>   	    (opcode == HCI_OP_RESET || opcode == 0xfc01)) {
>> -		old_ctxt = data->alive_intr_ctxt;
>> -		data->alive_intr_ctxt =
>> -			(opcode == 0xfc01 ? BTINTEL_PCIE_INTEL_HCI_RESET1
>:
>> -				BTINTEL_PCIE_HCI_RESET);
>> -		bt_dev_dbg(data->hdev, "sent cmd: 0x%4.4x alive context
>changed: %s  ->  %s",
>> -			   opcode, btintel_pcie_alivectxt_state2str(old_ctxt),
>> -			   btintel_pcie_alivectxt_state2str(data-
>>alive_intr_ctxt));
>>   		ret = wait_event_timeout(data->gp0_wait_q,
>>   					 data->gp0_received,
>>
>msecs_to_jiffies(BTINTEL_DEFAULT_INTR_TIMEOUT_MS));
>
>
>Kind regards,
>
>Paul

Regards,
Kiran





[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux