scsi: ufs: ufs-mediatek: Provide detailed description for UIC errors
authorStanley Chu <stanley.chu@mediatek.com>
Tue, 2 Aug 2022 23:54:34 +0000 (07:54 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 23 Aug 2022 02:58:29 +0000 (22:58 -0400)
Provide detailed description in logs for UIC errors for easier issue
breakdown.

Link: https://lore.kernel.org/r/20220802235437.4547-3-stanley.chu@mediatek.com
Signed-off-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/host/ufs-mediatek.c

index ff6fd8f..62bc3b7 100644 (file)
@@ -46,6 +46,44 @@ static const struct of_device_id ufs_mtk_of_match[] = {
        {},
 };
 
+/*
+ * Details of UIC Errors
+ */
+static const char *const ufs_uic_err_str[] = {
+       "PHY Adapter Layer",
+       "Data Link Layer",
+       "Network Link Layer",
+       "Transport Link Layer",
+       "DME"
+};
+
+static const char *const ufs_uic_pa_err_str[] = {
+       "PHY error on Lane 0",
+       "PHY error on Lane 1",
+       "PHY error on Lane 2",
+       "PHY error on Lane 3",
+       "Generic PHY Adapter Error. This should be the LINERESET indication"
+};
+
+static const char *const ufs_uic_dl_err_str[] = {
+       "NAC_RECEIVED",
+       "TCx_REPLAY_TIMER_EXPIRED",
+       "AFCx_REQUEST_TIMER_EXPIRED",
+       "FCx_PROTECTION_TIMER_EXPIRED",
+       "CRC_ERROR",
+       "RX_BUFFER_OVERFLOW",
+       "MAX_FRAME_LENGTH_EXCEEDED",
+       "WRONG_SEQUENCE_NUMBER",
+       "AFC_FRAME_SYNTAX_ERROR",
+       "NAC_FRAME_SYNTAX_ERROR",
+       "EOF_SYNTAX_ERROR",
+       "FRAME_SYNTAX_ERROR",
+       "BAD_CTRL_SYMBOL_TYPE",
+       "PA_INIT_ERROR",
+       "PA_ERROR_IND_RECEIVED",
+       "PA_INIT"
+};
+
 static bool ufs_mtk_is_boost_crypt_enabled(struct ufs_hba *hba)
 {
        struct ufs_mtk_host *host = ufshcd_get_variant(hba);
@@ -1309,8 +1347,28 @@ static void ufs_mtk_event_notify(struct ufs_hba *hba,
                                 enum ufs_event_type evt, void *data)
 {
        unsigned int val = *(u32 *)data;
+       unsigned long reg;
+       u8 bit;
 
        trace_ufs_mtk_event(evt, val);
+
+       /* Print details of UIC Errors */
+       if (evt <= UFS_EVT_DME_ERR) {
+               dev_info(hba->dev,
+                        "Host UIC Error Code (%s): %08x\n",
+                        ufs_uic_err_str[evt], val);
+               reg = val;
+       }
+
+       if (evt == UFS_EVT_PA_ERR) {
+               for_each_set_bit(bit, &reg, ARRAY_SIZE(ufs_uic_pa_err_str))
+                       dev_info(hba->dev, "%s\n", ufs_uic_pa_err_str[bit]);
+       }
+
+       if (evt == UFS_EVT_DL_ERR) {
+               for_each_set_bit(bit, &reg, ARRAY_SIZE(ufs_uic_dl_err_str))
+                       dev_info(hba->dev, "%s\n", ufs_uic_dl_err_str[bit]);
+       }
 }
 
 /*