当前位置: 首页 > news >正文

UFS Reset 介绍

一 . UFS Reset 简介

UFS Reset 是 针对UFS设备的一种硬件或者软件操作,用于解决设备异常、通信故障或状态不一致等问题, 

二 . UFS Reset 概述

1 . Power-on Reset

UFS Power-on Reset是将关闭并重新开启VCCQ、VCCQ2和VCC电源来实现,

UFS设备应具备独立的上电检测电路,该电路会在电源开启后将UFS设备及其各层级置于预定义状态, Unipro链路层和UFS Devic都会Reset.

VCC存储器件的供电电压
VCCQ通常用于存储器控制器,可选用于PHY接口、存储器I/O及其他内部超低压模块的供电电压
VCCQ2通常用于PHY接口、存储器控制器及其他内部低压模块的供电电压

2 . Hardware Reset 

Hardware Reset 是通过操作硬件的RST_N引脚来实现,Unipro链路层和UFS Devic都会Reset.

Figure3 UFS Hardware Reset

hardware reset信号是在UFS Host和UFS Device之间的:

Firgure4  UFS System Model

hardware reset的时序:默认RST_n引脚是拉高的

(1) 将RST_n引脚拉低,保持1us以上

(2) 将RST_n引脚拉高,保持1us以上,

(3) hardware reset 操作完成

Firgure5  Reset AC timings

SymbolCommentMinMaxUnit
tRSTWRST_n Pulse Width1 µs
tRSTHRST_n High Period (Interval)1µs
tRSTFRST_n filter100ns

3 . EndPointReset

EndPointReset是通过DME_ENDPOINTRESET命令来实现, 是本地應用程序用來請求Peer端自行Reset.

The EndPointReset is a means for the local Application to request the peer Endpoint Application to reset itself

发送DME_ENDPOINTRESET之后,UFS Device和Unipro链路层都会Reset成默认值, 只会Reset Peer端。

UFS Host应该忽略UFS Device做完 EndPointReset之后回复的Response.

4 . Logical Unit Reset 

Logical Unit Reset  通过 Task management 命令 LOGICAL UNIT RESET来实现

发送LOGICAL UNIT RESET之后,LU 相關的配置會進行重置,但是UFS Device相關的(Descriptor/Flag/Attrbutes)不會被重置,也不影響Unipro鏈路層的狀態,所以不建議使用Logical Unit Reset在系統啓動的
時候使用。

5 . Host UniPro Warm Reset 

Host UniPro Warm Reset 使用DME_Reset(UniPro Warm Reset)來实现

Host UniPro Warm Reset 做完之后,Unipro链路层和UFS Device层都会变成初始化状态,包括所有协议状态机、定时器及属性应复位至初始状态,且所有数据缓冲区必须清空。与Host Unipro Cold Reset的区别在于:状态字段(包括统计信息、错误计数器和错误标志)将保持不变

6. Host UniPro Cold Reset 

Host UniPro Cold Reset 使用DME_Reset(UniPro Cold Reset)來实现

UniPro冷复位是基础性的UniPro复位操作。该复位可由任何上电复位(power-on reset (POR))事件或本地端点应用(local Endpoint Application)触发,但不能直接通过链路启动序列触发。

冷复位将使所有协议层恢复至初始状态:所有协议状态机、定时器、属性(包括统计信息、错误计数器和错误标志)均将重置至复位状态,且所有数据缓冲区均被清空。

当设备管理实体接收到来自DME用户的DME_RESET.req请求时,应通过<层标识符>_LM_RESET.req原语复位整个UniPro协议栈。DME应按自底向上顺序(从L1.5层至L4层)对各协议层进行复位。复位过程完成后,链路将进入禁用状态。在此状态下,DME用户可通过DME_ENABLE.req原语调用启动流程,或使用DME_POWEROFF.req原语转入关闭状态。

需要说明的是,冷复位操作不会对本地应用(local Application.)进行复位。

7.  UFS LINERESET

UFS LINERESE是只复位物理层(M-PHY) 和链路层(UniPro)。它不会清除设备的核心功能

  • Line Reset: 只复位物理层(M-PHY) 和链路层(UniPro)。它不会清除设备的核心功能,例如:

    • 不会清除正在传输的指令(Tasks)。

    • 不会清除写入缓冲区(Write Buffer)或缓存(Cache)中的数据。

    • 不会复位协议状态机到初始状态(除了链路层相关的部分)。

    • 不会清除设备的状态、统计信息或错误计数器。

  • Cold Reset(冷复位): 这是一种最深层次的复位。它会将整个UFS设备彻底恢复到上电初始状态,包括:

    • 复位所有协议状态机、定时器、属性。

    • 清空所有数据缓冲区。

    • 通常也会清除状态字段和错误计数器(这与您之前描述的场景略有不同,具体行为以规格书为准)。

(1)当主机与UFS设备之间的数据链路(M-PHY的Lane)出现通信不稳定、同步丢失、信号完整性等问题时,用于快速恢复链路的正常连接。

(2)它是一种相对轻量级的复位,目标是修复物理层和链路层的错误,而不影响上层协议和缓存中的数据

8.  Summary of Resets and Device Behavior

UFS Reset 之后的状态:

UFS Reset之后Unipro Attribute, UFS Attribute. UFS Flags的变化:

三 .  UFS Reset 详解

1. power-on reset 

(1)UFS文档有关于power on Reset属性(UFS Flags和UFS Attributes)的描述: 

Access Property
Description
Power on Reset
The attribute is set to the default value after power cycle or hardware reset event.
The attribute can written only one time after a power cycle or hardware reset,  and it cannot be re-written until the next power cycle or hardware reset

UFS Flags:  Power on Reset相关的Flag

IDN
Name
Type
Type1
# Ind.2
# Sel.
Default
Description
03h
fPowerOnWPEn
Read /
Power on
reset
D
0
Power On Write Protection Enable
fPowerOnWPEn enables the write
protection on all logical units configured as power on write protected.
If fPowerOnWPEn is equal to one and the device receives a Query Request to clear or toggle this flag, the Query Request shall fail and Response field shall be set
to “F8h” (Parameter already written).
The device shall set fPowerOnWPEn to zero in the event of power cycle or hardware reset.
0b: Power on write protection disabled.
1b: Power on write protection enabled.

(2)从UFS文档的定义可以看到,带有power on reset的属性((UFS Flags和UFS Attributes)),在power cycle之后只可以写一次,如果通过query request写多次会出现报错

Query Response Code Value
Query Response Code Description
F8h
Parameter already written

Parameter already written: 这个错误码适用于具有“一次性写入(Write Once)”或“上电复位(Power on Reset)”写入权限属性的参数,如果写多次返回F8的错误

(3) UFS Device 初始化完成之前能接收的Events
PhaseEventValid UPIU Valid SCSI command
Before
Initialization
Power On Reset / HW
Reset / EndPointReset
NoneNone

从UFS文档可以看出,在UFS Device初始化完成(即fDeviceInit set and get完成)之前,UFS 初始化能响应的Events有Power On Reset / HW Reset / EndPointReset.

(4)  UniPro启动流程在Cold Reset(包括Power on Reset)或Warm Reset之后执行。该流程由DME用户通过DME_ENABLE.req原语调用启动。

2 . hardware reset

(1) 根据HCI的规定,当出现Device Error的时候,建议按以下顺序进行错误恢复:

a. 向设备发送DME_ENDPOINT_RESET指令
b. 执行主机控制器与设备的power cycle环或hardware reset

(2) 退出UFS-DeepSleep低功耗模式的唯一方法是使用 hardware reset 或者power cycle.
(3) DME_RESET指令仅应在以下情况中使用: 在执行了power-on or hardware reset, or  DME_LINKLOST.ind之后。

3. EndPointReset

DME_ENDPOINTRESET:用于UFS主机要求UFS设备执行端点复位的场景。

(1) EndPointReset是一种local Applicatio请求peer Endpoint Application自行复位的手段。这本质上是一个通过UniPro链路传输的远程触发事件(TRG_EPR)。LocalEndpoint Application可通过调用DME_ENDPOINTRESET.req原语来请求发送此触发事件。

(2) 对等UniPort在接收到此触发事件后,必须向其Endpoint Application进行通知。peer Endpoint Application所执行的后续操作是可选的——既可执行自我复位,也可拒绝响应此触发。若Endpoint Application 选择执行自我复位,则必须同时对其UniPort执行Warm Reset。如未执行此操作,EndPointReset将对UniPro协议栈不产生任何后续影响。

(3) 在Link Startup状态下, DME_ENDPOINTRESET.ind原语和DME_ENDPOINTRESET.req原语在Link Startup状态下才会执行成功,

在其他的状态下,DME_ENDPOINTRESET.ind原语和DME_ENDPOINTRESET.req原语都会受到限制(请求被忽略,且不生成指示信号) 。

(4) PACP_EPR_ind 是PA链路层的EndPointReset request, 可以通过抓PA信号分析流程

(5) EndPointReset之后,发命令访问所有的Normal Lun会出现Unit Attention Condition (UAC) ,发命令访问Well-Know Lun不会出现Unit Attention Condition (UAC) 。

4. Logical Unit Reset

(1) Logical Unit Reset是一种Task Management Function,
(2) 所有的Logical Unit都支持Logical Unit Reset功能, 
(3) 所有SCSI传输协议标准均必须支持"Logical Unit Reset"任务管理功能。
(4) 若Logical Unit 中有一个或多个任务需要输出数据传输,Target Device(目标设备)必须等待收到所有与待处理"准备传输"UPIU相关的数据输出UPIU后,方可发送任务管理响应。

5. Host Unipro Warm Reset

DME_RESET:用于需要对UniPro协议栈进行整体复位的场景

(1) 在UniPro Cold Reset 或Warm Reset后,加扰功能(scrambling function)将处于禁用状态。仅当对端设备在PACP_CAP_EXT1_ind信令交互过程中已声明具备数据解扰(Data scrambling )能力(通过PA_PeerScrambling标志)时,方可请求启用加扰功能(scrambling function)。

(2) 在UniPro Cold Reset 或Warm Reset后,跳转符号插入(Skip Symbol Insertion)功能应处于禁用状态

(3) 在UniPro Cold Reset 或Warm Reset流程结束时,UniPro链路将处于禁用状态,此时可指令其进入关闭状态(通过DME_POWEROFF.req原语),或启动引导流程(通过DME_ENABLE.req原语).

(4) UniPro Boot流程在Cold Reset(含Power-on Reset)或Warrm Reset后执行。该流程由DME用户通过调用DME_ENABLE.req原语触发。

(5)  在UniPro Cold Reset 或Warm Reset时,所有DME属性均应复位至其对应的静态值(static value)(若存在),否则应Reset至预设的Reset 默认值.

6. Host Unipro Cold Reset

DME_RESET:用于需要对UniPro协议栈进行整体复位的场景

7. UFS LINERESET

PA层会在以下三种场景往物理层发送LINE-RESET:

(1) 在Link Startup流程的Phase0阶段的开始

(2) 在Power Mode Change操作的恢复阶段

(3) 收到了来自Data Link Layer的PA_INIT.req 原语请求时

如果Link Startup流程完成了,则应该在所有的Connect TX Lane发送LINE-RESET信号,否则,应在all available TX Lanes上发出LINE-RESET. 

在发出LINE-RESET之前,PA Layer应关闭现有的TX Burst,唤醒所有available or connected TX Lanes,并等待 PA_TActivate, 完成LINE-RESET操作后,PA Layer应等待 PA_SaveConfigTime

如果物理层因接收到线路复位或因发送了LINE-RESET而被重置,则PA Layer应通过 PA_LM_PHY_RESET.ind 原语向DME指示。由于LINE-RESET会导致物理层将其许多属性重置为默认值,因此应用程序(Application)需要在每次复位后重新设置优化值

四 .  UFS Reset代码实现

1. power-on reset 

上电初始化的Reset, 作用相当于hardware reset, 在romcode/lk/kernel均有上电的流程

(1)init vcc/vccq/vccq2, 获取vcc/vccq/vccq2的配置信息

static int ufshcd_init_vreg(struct ufs_hba *hba)
{int ret = 0;struct device *dev = hba->dev;struct ufs_vreg_info *info = &hba->vreg_info;ret = ufshcd_get_vreg(dev, info->vcc);if (ret)goto out;ret = ufshcd_get_vreg(dev, info->vccq);if (!ret)ret = ufshcd_get_vreg(dev, info->vccq2);
out:return ret;
}

(2) setup vcc/vccq/vccq2, 设置并且使能vcc/vccq/vccq2的电压

static int ufshcd_setup_vreg(struct ufs_hba *hba, bool on)
{int ret = 0;struct device *dev = hba->dev;struct ufs_vreg_info *info = &hba->vreg_info;ret = ufshcd_toggle_vreg(dev, info->vcc, on);if (ret)goto out;ret = ufshcd_toggle_vreg(dev, info->vccq, on);if (ret)goto out;ret = ufshcd_toggle_vreg(dev, info->vccq2, on);out:if (ret) {ufshcd_toggle_vreg(dev, info->vccq2, false);ufshcd_toggle_vreg(dev, info->vccq, false);ufshcd_toggle_vreg(dev, info->vcc, false);}return ret;
}

ufs驱动在做完power on reset设置的power mode信息

 /*** ufshcd_init_pwr_info - setting the POR (power on reset)* values in hba power info* @hba: per-adapter instance*/
static void ufshcd_init_pwr_info(struct ufs_hba *hba)
{hba->pwr_info.gear_rx = UFS_PWM_G1;hba->pwr_info.gear_tx = UFS_PWM_G1;hba->pwr_info.lane_rx = UFS_LANE_1;hba->pwr_info.lane_tx = UFS_LANE_1;hba->pwr_info.pwr_rx = SLOWAUTO_MODE;hba->pwr_info.pwr_tx = SLOWAUTO_MODE;hba->pwr_info.hs_rate = 0;
}

2 . hardware reset

hardware reset是将SOC芯片的reset引脚做复位动作,一般是先拉低reset引脚再拉高引脚

qcom/mtk/sprd 平台都有一套自己的hardware reset流程

static int ufs_mtk_device_reset(struct ufs_hba *hba)
{struct arm_smccc_res res;/* disable hba before device reset */ufshcd_hba_stop(hba);ufs_mtk_device_reset_ctrl(0, res);/** The reset signal is active low. UFS devices shall detect* more than or equal to 1us of positive or negative RST_n* pulse width.** To be on safe side, keep the reset low for at least 10us.*/usleep_range(10, 15);ufs_mtk_device_reset_ctrl(1, res);/* Some devices may need time to respond to rst_n */usleep_range(10000, 15000);dev_info(hba->dev, "device reset done\n");return 0;
}

3. EndPointReset

EndPointReset是通过DME_ENDPOINTRESET触发ufs device 去做reset.

目前在kernel没有找到EndPointReset的代码

4. Logical Unit Reset

如果发命令出错,UFS Host 会发送UFS_LOGICAL_RESET命令去Reset对应的Lun

/*** ufshcd_eh_device_reset_handler() - Reset a single logical unit.* @cmd: SCSI command pointer** Return: SUCCESS or FAILED.*/
static int ufshcd_eh_device_reset_handler(struct scsi_cmnd *cmd)
{unsigned long flags, pending_reqs = 0, not_cleared = 0;struct Scsi_Host *host;struct ufs_hba *hba;struct ufs_hw_queue *hwq;struct ufshcd_lrb *lrbp;u32 pos, not_cleared_mask = 0;int err;u8 resp = 0xF, lun;host = cmd->device->host;hba = shost_priv(host);lun = ufshcd_scsi_to_upiu_lun(cmd->device->lun);err = ufshcd_issue_tm_cmd(hba, lun, 0, UFS_LOGICAL_RESET, &resp);if (err || resp != UPIU_TASK_MANAGEMENT_FUNC_COMPL) {if (!err)err = resp;goto out;}if (hba->mcq_enabled) {for (pos = 0; pos < hba->nutrs; pos++) {lrbp = &hba->lrb[pos];if (ufshcd_cmd_inflight(lrbp->cmd) &&lrbp->lun == lun) {ufshcd_clear_cmd(hba, pos);hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));ufshcd_mcq_poll_cqe_lock(hba, hwq);}}err = 0;goto out;}/* clear the commands that were pending for corresponding LUN */spin_lock_irqsave(&hba->outstanding_lock, flags);for_each_set_bit(pos, &hba->outstanding_reqs, hba->nutrs)if (hba->lrb[pos].lun == lun)__set_bit(pos, &pending_reqs);hba->outstanding_reqs &= ~pending_reqs;spin_unlock_irqrestore(&hba->outstanding_lock, flags);for_each_set_bit(pos, &pending_reqs, hba->nutrs) {if (ufshcd_clear_cmd(hba, pos) < 0) {spin_lock_irqsave(&hba->outstanding_lock, flags);not_cleared = 1U << pos &ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);hba->outstanding_reqs |= not_cleared;not_cleared_mask |= not_cleared;spin_unlock_irqrestore(&hba->outstanding_lock, flags);dev_err(hba->dev, "%s: failed to clear request %d\n",__func__, pos);}}__ufshcd_transfer_req_compl(hba, pending_reqs & ~not_cleared_mask);out:hba->req_abort_count = 0;ufshcd_update_evt_hist(hba, UFS_EVT_DEV_RESET, (u32)err);if (!err) {err = SUCCESS;} else {dev_err(hba->dev, "%s: failed with err %d\n", __func__, err);err = FAILED;}return err;
}

5. Host Unipro Warm Reset

目前kernel没有代码发送host unipro warm reset命令.

6. Host Unipro ColdReset

在kernel阶段,ufs初始化的时候会发送dme reset with cold reset, 但是需要host设置了UFSHCI_QUIRK_BROKEN_HCE标志,才会发送dme reset with cold reset

UFSHCI_QUIRK_BROKEN_HCE 是一个用于修复有缺陷的 UFS 主机控制器 硬件的工作机制。该控制器的缺陷在于它无法被操作系统通过标准流程正确开启

应用此机制后,Linux 内核会跳过标准的控制器启用步骤,转而采用一种变通方法来完成初始化

/*** ufshcd_dme_reset - UIC command for DME_RESET* @hba: per adapter instance** DME_RESET command is issued in order to reset UniPro stack.* This function now deals with cold reset.** Return: 0 on success, non-zero value on failure.*/
int ufshcd_dme_reset(struct ufs_hba *hba)
{struct uic_command uic_cmd = {.command = UIC_CMD_DME_RESET,};int ret;ret = ufshcd_send_uic_cmd(hba, &uic_cmd);if (ret)dev_err(hba->dev,"dme-reset: error code %d\n", ret);return ret;
}
EXPORT_SYMBOL_GPL(ufshcd_dme_reset);

如果ufs host 支持UFSHCI_QUIRK_BROKEN_HCE, 则会在开机启动的时候调用发送UIC_CMD_DME_RESET命令,否则就不会发送UIC_CMD_DME_RESET命令。

下面的mtk 平台没有设置UFSHCI_QUIRK_BROKEN_HCE, 则在开机启动的时候不会下发UIC_CMD_DME_RESET命令

int ufshcd_hba_enable(struct ufs_hba *hba)
{int ret;if (hba->quirks & UFSHCI_QUIRK_BROKEN_HCE) {ufshcd_set_link_off(hba);ufshcd_vops_hce_enable_notify(hba, PRE_CHANGE);/* enable UIC related interrupts */ufshcd_enable_intr(hba, UFSHCD_UIC_MASK);ret = ufshcd_dme_reset(hba);if (ret) {dev_err(hba->dev, "DME_RESET failed\n");return ret;}ret = ufshcd_dme_enable(hba);if (ret) {dev_err(hba->dev, "Enabling DME failed\n");return ret;}ufshcd_vops_hce_enable_notify(hba, POST_CHANGE);} else {ret = ufshcd_hba_execute_hce(hba);}return ret;
}
EXPORT_SYMBOL_GPL(ufshcd_hba_enable);/*** ufs_mtk_init - find other essential mmio bases* @hba: host controller instance** Binds PHY with controller and powers up PHY enabling clocks* and regulators.** Return: -EPROBE_DEFER if binding fails, returns negative error* on phy power up failure and returns zero on success.*/
static int ufs_mtk_init(struct ufs_hba *hba)
{hba->quirks |= UFSHCI_QUIRK_SKIP_MANUAL_WB_FLUSH_CTRL;hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_INTR;hba->quirks |= UFSHCD_QUIRK_MCQ_BROKEN_RTC;hba->vps->wb_flush_threshold = UFS_WB_BUF_REMAIN_PERCENT(80);if (host->caps & UFS_MTK_CAP_DISABLE_AH8)hba->caps |= UFSHCD_CAP_HIBERN8_WITH_CLK_GATING;if (host->caps & UFS_MTK_CAP_DISABLE_MCQ)hba->quirks |= UFSHCD_QUIRK_BROKEN_LSDBS_CAP;
}

7. UFS LINERESET

UECPA是ROC(Read Only and Read to clear)类型的,Read一次寄存器就会将UECPA错误清除,相对应的就是清除了LINERESET错误

(1) 在LINK_STARTUP 过程中发生LINERESET ,需清除UECPA一次。

/*** ufshcd_link_startup - Initialize unipro link startup* @hba: per adapter instance** Return: 0 for success, non-zero in case of failure.*/
static int ufshcd_link_startup(struct ufs_hba *hba)
{int ret;int retries = DME_LINKSTARTUP_RETRIES;bool link_startup_again = false;/** If UFS device isn't active then we will have to issue link startup* 2 times to make sure the device state move to active.*/if (!ufshcd_is_ufs_dev_active(hba))link_startup_again = true;link_startup:do {ufshcd_vops_link_startup_notify(hba, PRE_CHANGE);ret = ufshcd_dme_link_startup(hba);/* check if device is detected by inter-connect layer */if (!ret && !ufshcd_is_device_present(hba)) {ufshcd_update_evt_hist(hba,UFS_EVT_LINK_STARTUP_FAIL,0);dev_err(hba->dev, "%s: Device not present\n", __func__);ret = -ENXIO;goto out;}/** DME link lost indication is only received when link is up,* but we can't be sure if the link is up until link startup* succeeds. So reset the local Uni-Pro and try again.*/if (ret && retries && ufshcd_hba_enable(hba)) {ufshcd_update_evt_hist(hba,UFS_EVT_LINK_STARTUP_FAIL,(u32)ret);goto out;}} while (ret && retries--);if (ret) {/* failed to get the link up... retire */ufshcd_update_evt_hist(hba,UFS_EVT_LINK_STARTUP_FAIL,(u32)ret);goto out;}if (link_startup_again) {link_startup_again = false;retries = DME_LINKSTARTUP_RETRIES;goto link_startup;}/* Mark that link is up in PWM-G1, 1-lane, SLOW-AUTO mode */ufshcd_init_pwr_info(hba);ufshcd_print_pwr_info(hba);if (hba->quirks & UFSHCD_QUIRK_BROKEN_LCC) {ret = ufshcd_disable_device_tx_lcc(hba);if (ret)goto out;}/* Include any host controller configuration via UIC commands */ret = ufshcd_vops_link_startup_notify(hba, POST_CHANGE);if (ret)goto out;/* Clear UECPA once due to LINERESET has happened during LINK_STARTUP */ufshcd_readl(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER);ret = ufshcd_make_hba_operational(hba);
out:if (ret) {dev_err(hba->dev, "link startup failed %d\n", ret);ufshcd_print_host_state(hba);ufshcd_print_pwr_info(hba);ufshcd_print_evt_hist(hba);}return ret;
}

(2)在通过DME_SET命令执行power mode change操作期间,应忽略LINERESET错误状态。

/*** ufshcd_update_uic_error - check and set fatal UIC error flags.* @hba: per-adapter instance** Return:*  IRQ_HANDLED - If interrupt is valid*  IRQ_NONE    - If invalid interrupt*/
static irqreturn_t ufshcd_update_uic_error(struct ufs_hba *hba)
{u32 reg;irqreturn_t retval = IRQ_NONE;/* PHY layer error */reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER);if ((reg & UIC_PHY_ADAPTER_LAYER_ERROR) &&(reg & UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK)) {ufshcd_update_evt_hist(hba, UFS_EVT_PA_ERR, reg);/** To know whether this error is fatal or not, DB timeout* must be checked but this error is handled separately.*/if (reg & UIC_PHY_ADAPTER_LAYER_LANE_ERR_MASK)dev_dbg(hba->dev, "%s: UIC Lane error reported\n",__func__);/* Got a LINERESET indication. */if (reg & UIC_PHY_ADAPTER_LAYER_GENERIC_ERROR) {struct uic_command *cmd = NULL;hba->uic_error |= UFSHCD_UIC_PA_GENERIC_ERROR;if (hba->uic_async_done && hba->active_uic_cmd)cmd = hba->active_uic_cmd;/** Ignore the LINERESET during power mode change* operation via DME_SET command.*/if (cmd && (cmd->command == UIC_CMD_DME_SET))hba->uic_error &= ~UFSHCD_UIC_PA_GENERIC_ERROR;}retval |= IRQ_HANDLED;}
}

五 .  参考资料

1 . JESD220E UFS3.1协议

2 . Kernel stable kernel 

3.  Unipro 1.8 协议

http://www.dtcms.com/a/532826.html

相关文章:

  • ESP8266无线开关
  • 生鲜电商网站建设一共有多少网站
  • 泰州网站建设案例海淘网站主要关键词
  • 网站 第三方登录做公众号用什么网站吗
  • 【FPGA】三八译码器——板级验证
  • Bugku-Web题目-charlottesweb- WolvCTF 2023
  • TCMalloc原理解析(下)
  • 短波红外相机入门核心场景和选型要求
  • centos做网站服务器吗南京品牌网站设计
  • 【Qt】启动新窗口--C/S传输信息
  • vf建设银行网站wordpress根据点击量最高查询文章
  • 统一日志管理架构设计
  • 綦江网站网站seo找准隐迅推
  • 建设网站前准备资料微信如何注册小程序
  • 解释无损极化,有损极化;纯电容电流-无损极化,吸收电流-有损极化
  • 2.2.1.5 大数据方法论与实践指南-产品复盘文档模板
  • 第六章:感知篇 - 语音活动检测:让助手知道“你何时在说话”
  • 抖音实名信息转移实操指南:原账号可登录场景下的安全操作方案
  • Git 学习打卡
  • php网站后台制作公司网站官网
  • 做外贸客户要求看网站开发微信公众平台
  • 【图像算法 - 30】基于深度学习的PCB板缺陷检测系统: YOLOv11 + UI界面 + 数据集实现
  • 网站建设企业站有哪些要求自己买个服务器有什么用
  • 如何做网站的维护工作摄影网站怎么做数据库
  • 网站建设的域名续费怎样黑公司的网站
  • Auto CAD二次开发——三点创建圆弧对象函数封装
  • 企业门户网站建设教程江苏建设官方网站
  • Spring Boot 项目标准目录结构
  • Flutter 框架设计与高效执行原理解析
  • 优秀门户网站欣赏泰安网站制作排行