Loading drivers/scsi/ufs/ufs-debugfs.c +44 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -955,6 +955,49 @@ static int ufsdbg_show_hba_show(struct seq_file *file, void *data) hba->ufs_stats.power_mode_change_cnt); seq_printf(file, "hibern8_exit_cnt = %d\n", hba->ufs_stats.hibern8_exit_cnt); seq_printf(file, "pa_err_cnt_total = %d\n", hba->ufs_stats.pa_err_cnt_total); seq_printf(file, "pa_lane_0_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_0]); seq_printf(file, "pa_lane_1_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_1]); seq_printf(file, "pa_line_reset_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LINE_RESET]); seq_printf(file, "dl_err_cnt_total = %d\n", hba->ufs_stats.dl_err_cnt_total); seq_printf(file, "dl_nac_received_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_RECEIVED]); seq_printf(file, "dl_tcx_replay_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED]); seq_printf(file, "dl_afcx_request_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED]); seq_printf(file, "dl_fcx_protection_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED]); seq_printf(file, "dl_crc_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_CRC_ERROR]); seq_printf(file, "dll_rx_buffer_overflow_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_RX_BUFFER_OVERFLOW]); seq_printf(file, "dl_max_frame_length_exceeded_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED]); seq_printf(file, "dl_wrong_sequence_number_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_WRONG_SEQUENCE_NUMBER]); seq_printf(file, "dl_afc_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_nac_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_eof_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_EOF_SYNTAX_ERROR]); seq_printf(file, "dl_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_bad_ctrl_symbol_type_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE]); seq_printf(file, "dl_pa_init_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_INIT_ERROR]); seq_printf(file, "dl_pa_error_ind_received = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_ERROR_IND_RECEIVED]); seq_printf(file, "dme_err_cnt = %d\n", hba->ufs_stats.dme_err_cnt); return 0; } Loading drivers/scsi/ufs/ufshcd.c +57 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,33 @@ void ufshcd_update_query_stats(struct ufs_hba *hba, } #endif static void ufshcd_update_uic_error_cnt(struct ufs_hba *hba, u32 reg, int type) { unsigned long err_bits; int ec; switch (type) { case UFS_UIC_ERROR_PA: err_bits = reg & UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK; for_each_set_bit(ec, &err_bits, UFS_EC_PA_MAX) { hba->ufs_stats.pa_err_cnt[ec]++; hba->ufs_stats.pa_err_cnt_total++; } break; case UFS_UIC_ERROR_DL: err_bits = reg & UIC_DATA_LINK_LAYER_ERROR_CODE_MASK; for_each_set_bit(ec, &err_bits, UFS_EC_DL_MAX) { hba->ufs_stats.dl_err_cnt[ec]++; hba->ufs_stats.dl_err_cnt_total++; } break; case UFS_UIC_ERROR_DME: hba->ufs_stats.dme_err_cnt++; default: break; } } #define CREATE_TRACE_POINTS #include <trace/events/ufs.h> Loading Loading @@ -957,6 +984,33 @@ static void ufshcd_print_host_state(struct ufs_hba *hba) hba->capabilities, hba->caps); dev_err(hba->dev, "quirks=0x%x, dev. quirks=0x%x\n", hba->quirks, hba->dev_info.quirks); dev_err(hba->dev, "pa_err_cnt_total=%d, pa_lane_0_err_cnt=%d, pa_lane_1_err_cnt=%d, pa_line_reset_err_cnt=%d\n", hba->ufs_stats.pa_err_cnt_total, hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_0], hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_1], hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LINE_RESET]); dev_err(hba->dev, "dl_err_cnt_total=%d, dl_nac_received_err_cnt=%d, dl_tcx_replay_timer_expired_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt_total, hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_RECEIVED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED]); dev_err(hba->dev, "dl_afcx_request_timer_expired_err_cnt=%d, dl_fcx_protection_timer_expired_err_cnt=%d, dl_crc_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_CRC_ERROR]); dev_err(hba->dev, "dll_rx_buffer_overflow_err_cnt=%d, dl_max_frame_length_exceeded_err_cnt=%d, dl_wrong_sequence_number_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_RX_BUFFER_OVERFLOW], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_WRONG_SEQUENCE_NUMBER]); dev_err(hba->dev, "dl_afc_frame_syntax_err_cnt=%d, dl_nac_frame_syntax_err_cnt=%d, dl_eof_syntax_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_EOF_SYNTAX_ERROR]); dev_err(hba->dev, "dl_frame_syntax_err_cnt=%d, dl_bad_ctrl_symbol_type_err_cnt=%d, dl_pa_init_err_cnt=%d, dl_pa_error_ind_received=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_INIT_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_ERROR_IND_RECEIVED]); dev_err(hba->dev, "dme_err_cnt=%d\n", hba->ufs_stats.dme_err_cnt); } /** Loading Loading @@ -7084,6 +7138,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) */ dev_dbg(hba->dev, "%s: UIC Lane error reported, reg 0x%x\n", __func__, reg); ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_PA); ufshcd_update_uic_reg_hist(&hba->ufs_stats.pa_err, reg); /* Loading @@ -7110,6 +7165,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER); if ((reg & UIC_DATA_LINK_LAYER_ERROR) && (reg & UIC_DATA_LINK_LAYER_ERROR_CODE_MASK)) { ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_DL); ufshcd_update_uic_reg_hist(&hba->ufs_stats.dl_err, reg); if (reg & UIC_DATA_LINK_LAYER_ERROR_PA_INIT) { Loading Loading @@ -7147,6 +7203,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_DME); if ((reg & UIC_DME_ERROR) && (reg & UIC_DME_ERROR_CODE_MASK)) { ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_DME); ufshcd_update_uic_reg_hist(&hba->ufs_stats.dme_err, reg); hba->uic_error |= UFSHCD_UIC_DME_ERROR; retval |= IRQ_HANDLED; Loading drivers/scsi/ufs/ufshcd.h +6 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ * * This code is based on drivers/scsi/ufs/ufshcd.h * Copyright (C) 2011-2013 Samsung India Software Operations * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * Authors: * Santosh Yaraganavi <santosh.sy@samsung.com> Loading Loading @@ -655,6 +655,11 @@ struct ufs_stats { struct ufs_uic_err_reg_hist nl_err; struct ufs_uic_err_reg_hist tl_err; struct ufs_uic_err_reg_hist dme_err; u32 pa_err_cnt_total; u32 pa_err_cnt[UFS_EC_PA_MAX]; u32 dl_err_cnt_total; u32 dl_err_cnt[UFS_EC_DL_MAX]; u32 dme_err_cnt; }; /* UFS Host Controller debug print bitmask */ Loading drivers/scsi/ufs/ufshci.h +37 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,43 @@ enum { PWR_FATAL_ERROR = 0x05, }; /* Host UIC error type */ enum ufshcd_uic_err_type { UFS_UIC_ERROR_PA, UFS_UIC_ERROR_DL, UFS_UIC_ERROR_DME, }; /* Host UIC error code PHY adapter layer */ enum ufshcd_ec_pa { UFS_EC_PA_LANE_0, UFS_EC_PA_LANE_1, UFS_EC_PA_LANE_2, UFS_EC_PA_LANE_3, UFS_EC_PA_LINE_RESET, UFS_EC_PA_MAX, }; /* Host UIC error code data link layer */ enum ufshcd_ec_dl { UFS_EC_DL_NAC_RECEIVED, UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED, UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED, UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED, UFS_EC_DL_CRC_ERROR, UFS_EC_DL_RX_BUFFER_OVERFLOW, UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED, UFS_EC_DL_WRONG_SEQUENCE_NUMBER, UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR, UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR, UFS_EC_DL_EOF_SYNTAX_ERROR, UFS_EC_DL_FRAME_SYNTAX_ERROR, UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE, UFS_EC_DL_PA_INIT_ERROR, UFS_EC_DL_PA_ERROR_IND_RECEIVED, UFS_EC_DL_MAX, }; /* HCE - Host Controller Enable 34h */ #define CONTROLLER_ENABLE UFS_BIT(0) #define CONTROLLER_DISABLE 0x0 Loading Loading
drivers/scsi/ufs/ufs-debugfs.c +44 −1 Original line number Diff line number Diff line /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -955,6 +955,49 @@ static int ufsdbg_show_hba_show(struct seq_file *file, void *data) hba->ufs_stats.power_mode_change_cnt); seq_printf(file, "hibern8_exit_cnt = %d\n", hba->ufs_stats.hibern8_exit_cnt); seq_printf(file, "pa_err_cnt_total = %d\n", hba->ufs_stats.pa_err_cnt_total); seq_printf(file, "pa_lane_0_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_0]); seq_printf(file, "pa_lane_1_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_1]); seq_printf(file, "pa_line_reset_err_cnt = %d\n", hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LINE_RESET]); seq_printf(file, "dl_err_cnt_total = %d\n", hba->ufs_stats.dl_err_cnt_total); seq_printf(file, "dl_nac_received_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_RECEIVED]); seq_printf(file, "dl_tcx_replay_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED]); seq_printf(file, "dl_afcx_request_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED]); seq_printf(file, "dl_fcx_protection_timer_expired_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED]); seq_printf(file, "dl_crc_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_CRC_ERROR]); seq_printf(file, "dll_rx_buffer_overflow_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_RX_BUFFER_OVERFLOW]); seq_printf(file, "dl_max_frame_length_exceeded_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED]); seq_printf(file, "dl_wrong_sequence_number_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_WRONG_SEQUENCE_NUMBER]); seq_printf(file, "dl_afc_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_nac_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_eof_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_EOF_SYNTAX_ERROR]); seq_printf(file, "dl_frame_syntax_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FRAME_SYNTAX_ERROR]); seq_printf(file, "dl_bad_ctrl_symbol_type_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE]); seq_printf(file, "dl_pa_init_err_cnt = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_INIT_ERROR]); seq_printf(file, "dl_pa_error_ind_received = %d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_ERROR_IND_RECEIVED]); seq_printf(file, "dme_err_cnt = %d\n", hba->ufs_stats.dme_err_cnt); return 0; } Loading
drivers/scsi/ufs/ufshcd.c +57 −0 Original line number Diff line number Diff line Loading @@ -169,6 +169,33 @@ void ufshcd_update_query_stats(struct ufs_hba *hba, } #endif static void ufshcd_update_uic_error_cnt(struct ufs_hba *hba, u32 reg, int type) { unsigned long err_bits; int ec; switch (type) { case UFS_UIC_ERROR_PA: err_bits = reg & UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK; for_each_set_bit(ec, &err_bits, UFS_EC_PA_MAX) { hba->ufs_stats.pa_err_cnt[ec]++; hba->ufs_stats.pa_err_cnt_total++; } break; case UFS_UIC_ERROR_DL: err_bits = reg & UIC_DATA_LINK_LAYER_ERROR_CODE_MASK; for_each_set_bit(ec, &err_bits, UFS_EC_DL_MAX) { hba->ufs_stats.dl_err_cnt[ec]++; hba->ufs_stats.dl_err_cnt_total++; } break; case UFS_UIC_ERROR_DME: hba->ufs_stats.dme_err_cnt++; default: break; } } #define CREATE_TRACE_POINTS #include <trace/events/ufs.h> Loading Loading @@ -957,6 +984,33 @@ static void ufshcd_print_host_state(struct ufs_hba *hba) hba->capabilities, hba->caps); dev_err(hba->dev, "quirks=0x%x, dev. quirks=0x%x\n", hba->quirks, hba->dev_info.quirks); dev_err(hba->dev, "pa_err_cnt_total=%d, pa_lane_0_err_cnt=%d, pa_lane_1_err_cnt=%d, pa_line_reset_err_cnt=%d\n", hba->ufs_stats.pa_err_cnt_total, hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_0], hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LANE_1], hba->ufs_stats.pa_err_cnt[UFS_EC_PA_LINE_RESET]); dev_err(hba->dev, "dl_err_cnt_total=%d, dl_nac_received_err_cnt=%d, dl_tcx_replay_timer_expired_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt_total, hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_RECEIVED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED]); dev_err(hba->dev, "dl_afcx_request_timer_expired_err_cnt=%d, dl_fcx_protection_timer_expired_err_cnt=%d, dl_crc_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_CRC_ERROR]); dev_err(hba->dev, "dll_rx_buffer_overflow_err_cnt=%d, dl_max_frame_length_exceeded_err_cnt=%d, dl_wrong_sequence_number_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_RX_BUFFER_OVERFLOW], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_WRONG_SEQUENCE_NUMBER]); dev_err(hba->dev, "dl_afc_frame_syntax_err_cnt=%d, dl_nac_frame_syntax_err_cnt=%d, dl_eof_syntax_err_cnt=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_EOF_SYNTAX_ERROR]); dev_err(hba->dev, "dl_frame_syntax_err_cnt=%d, dl_bad_ctrl_symbol_type_err_cnt=%d, dl_pa_init_err_cnt=%d, dl_pa_error_ind_received=%d\n", hba->ufs_stats.dl_err_cnt[UFS_EC_DL_FRAME_SYNTAX_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_INIT_ERROR], hba->ufs_stats.dl_err_cnt[UFS_EC_DL_PA_ERROR_IND_RECEIVED]); dev_err(hba->dev, "dme_err_cnt=%d\n", hba->ufs_stats.dme_err_cnt); } /** Loading Loading @@ -7084,6 +7138,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) */ dev_dbg(hba->dev, "%s: UIC Lane error reported, reg 0x%x\n", __func__, reg); ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_PA); ufshcd_update_uic_reg_hist(&hba->ufs_stats.pa_err, reg); /* Loading @@ -7110,6 +7165,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER); if ((reg & UIC_DATA_LINK_LAYER_ERROR) && (reg & UIC_DATA_LINK_LAYER_ERROR_CODE_MASK)) { ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_DL); ufshcd_update_uic_reg_hist(&hba->ufs_stats.dl_err, reg); if (reg & UIC_DATA_LINK_LAYER_ERROR_PA_INIT) { Loading Loading @@ -7147,6 +7203,7 @@ static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba) reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_DME); if ((reg & UIC_DME_ERROR) && (reg & UIC_DME_ERROR_CODE_MASK)) { ufshcd_update_uic_error_cnt(hba, reg, UFS_UIC_ERROR_DME); ufshcd_update_uic_reg_hist(&hba->ufs_stats.dme_err, reg); hba->uic_error |= UFSHCD_UIC_DME_ERROR; retval |= IRQ_HANDLED; Loading
drivers/scsi/ufs/ufshcd.h +6 −1 Original line number Diff line number Diff line Loading @@ -3,7 +3,7 @@ * * This code is based on drivers/scsi/ufs/ufshcd.h * Copyright (C) 2011-2013 Samsung India Software Operations * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. * * Authors: * Santosh Yaraganavi <santosh.sy@samsung.com> Loading Loading @@ -655,6 +655,11 @@ struct ufs_stats { struct ufs_uic_err_reg_hist nl_err; struct ufs_uic_err_reg_hist tl_err; struct ufs_uic_err_reg_hist dme_err; u32 pa_err_cnt_total; u32 pa_err_cnt[UFS_EC_PA_MAX]; u32 dl_err_cnt_total; u32 dl_err_cnt[UFS_EC_DL_MAX]; u32 dme_err_cnt; }; /* UFS Host Controller debug print bitmask */ Loading
drivers/scsi/ufs/ufshci.h +37 −0 Original line number Diff line number Diff line Loading @@ -188,6 +188,43 @@ enum { PWR_FATAL_ERROR = 0x05, }; /* Host UIC error type */ enum ufshcd_uic_err_type { UFS_UIC_ERROR_PA, UFS_UIC_ERROR_DL, UFS_UIC_ERROR_DME, }; /* Host UIC error code PHY adapter layer */ enum ufshcd_ec_pa { UFS_EC_PA_LANE_0, UFS_EC_PA_LANE_1, UFS_EC_PA_LANE_2, UFS_EC_PA_LANE_3, UFS_EC_PA_LINE_RESET, UFS_EC_PA_MAX, }; /* Host UIC error code data link layer */ enum ufshcd_ec_dl { UFS_EC_DL_NAC_RECEIVED, UFS_EC_DL_TCx_REPLAY_TIMER_EXPIRED, UFS_EC_DL_AFCx_REQUEST_TIMER_EXPIRED, UFS_EC_DL_FCx_PROTECT_TIMER_EXPIRED, UFS_EC_DL_CRC_ERROR, UFS_EC_DL_RX_BUFFER_OVERFLOW, UFS_EC_DL_MAX_FRAME_LENGTH_EXCEEDED, UFS_EC_DL_WRONG_SEQUENCE_NUMBER, UFS_EC_DL_AFC_FRAME_SYNTAX_ERROR, UFS_EC_DL_NAC_FRAME_SYNTAX_ERROR, UFS_EC_DL_EOF_SYNTAX_ERROR, UFS_EC_DL_FRAME_SYNTAX_ERROR, UFS_EC_DL_BAD_CTRL_SYMBOL_TYPE, UFS_EC_DL_PA_INIT_ERROR, UFS_EC_DL_PA_ERROR_IND_RECEIVED, UFS_EC_DL_MAX, }; /* HCE - Host Controller Enable 34h */ #define CONTROLLER_ENABLE UFS_BIT(0) #define CONTROLLER_DISABLE 0x0 Loading