Stanley Chu 0fef6bb730 scsi: ufs: core: mcq: Fix the incorrect OCS value for the device command
In MCQ mode, when a device command uses a hardware queue shared with other
commands, a race condition may occur in the following scenario:

 1. A device command is completed in CQx with CQE entry "e".

 2. The interrupt handler copies the "cqe" pointer to "hba->dev_cmd.cqe"
    and completes "hba->dev_cmd.complete".

 3. The "ufshcd_wait_for_dev_cmd()" function is awakened and retrieves the
    OCS value from "hba->dev_cmd.cqe".

However, there is a possibility that the CQE entry "e" will be overwritten
by newly completed commands in CQx, resulting in an incorrect OCS value
being received by "ufshcd_wait_for_dev_cmd()".

To avoid this race condition, the OCS value should be immediately copied to
the struct "lrb" of the device command. Then "ufshcd_wait_for_dev_cmd()"
can retrieve the OCS value from the struct "lrb".

Fixes: 57b1c0ef89ac ("scsi: ufs: core: mcq: Add support to allocate multiple queues")
Suggested-by: Can Guo <quic_cang@quicinc.com>
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Link: https://lore.kernel.org/r/20230610021553.1213-2-powen.kao@mediatek.com
Tested-by: Po-Wen Kao <powen.kao@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2023-06-16 12:04:30 -04:00
..
2023-04-27 11:53:57 -07:00
2023-05-07 10:00:09 -07:00
2023-04-27 16:36:55 -07:00
2023-05-02 10:41:31 -07:00
2023-04-27 11:53:57 -07:00
2023-04-30 11:51:51 -07:00
2023-04-27 11:53:57 -07:00
2023-05-03 11:11:56 -07:00
2023-04-27 11:53:57 -07:00
2023-04-27 11:27:48 -07:00
2023-04-29 17:42:33 -07:00
2023-04-27 12:07:50 -07:00
2023-05-03 11:00:27 -07:00
2023-05-05 11:49:22 -07:00
2023-04-27 11:53:57 -07:00
2023-04-27 10:09:05 -07:00
2023-04-27 17:17:12 -07:00
2023-04-27 11:53:57 -07:00
2023-04-27 12:07:50 -07:00
2023-05-01 17:18:56 -07:00
2023-04-27 16:36:55 -07:00
2023-04-30 13:00:38 -07:00
2023-05-05 19:12:01 -07:00
2023-05-02 10:36:02 -07:00
2023-04-28 16:24:32 -07:00
2023-04-30 13:00:38 -07:00
2023-04-25 12:02:16 -07:00
2023-05-02 10:41:31 -07:00
2023-04-28 14:02:54 -07:00
2023-04-27 11:46:26 -07:00
2023-05-05 19:12:01 -07:00
2023-04-27 16:36:55 -07:00
2023-05-05 13:27:59 -07:00
2023-04-27 10:09:05 -07:00
2023-04-30 11:51:51 -07:00
2023-05-05 11:57:29 -07:00
2023-04-27 16:36:55 -07:00
2023-04-27 11:53:57 -07:00
2023-05-03 11:25:01 -07:00
2023-04-27 16:36:55 -07:00
2023-04-27 11:53:57 -07:00
2023-05-02 10:41:31 -07:00
2023-04-27 11:53:57 -07:00
2023-04-27 16:36:55 -07:00
2023-04-27 12:07:50 -07:00
2023-04-27 16:36:55 -07:00
2023-04-27 11:53:57 -07:00
2023-04-27 12:07:50 -07:00
2023-04-27 12:07:50 -07:00
2023-05-02 11:56:43 -07:00
2023-04-28 14:53:30 -07:00
2023-05-02 10:46:11 -07:00
2023-04-27 10:09:05 -07:00
2023-04-27 12:07:50 -07:00
2023-05-04 18:33:56 -07:00
2023-04-27 17:27:06 -07:00