Commit | Line | Data |
---|---|---|
97fb5e8d | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
c58ab7aa YG |
2 | /* |
3 | * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. | |
c58ab7aa YG |
4 | */ |
5 | ||
6 | #ifndef _UFS_QUIRKS_H_ | |
7 | #define _UFS_QUIRKS_H_ | |
8 | ||
9 | /* return true if s1 is a prefix of s2 */ | |
10 | #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1)) | |
11 | ||
b799fdf7 | 12 | #define UFS_ANY_VENDOR 0xFFFF |
c58ab7aa YG |
13 | #define UFS_ANY_MODEL "ANY_MODEL" |
14 | ||
c0a18ee0 | 15 | #define UFS_VENDOR_MICRON 0x12C |
c58ab7aa | 16 | #define UFS_VENDOR_SAMSUNG 0x1CE |
46c1cf70 | 17 | #define UFS_VENDOR_SKHYNIX 0x1AD |
ed0b40ff | 18 | #define UFS_VENDOR_TOSHIBA 0x198 |
27ff2c60 | 19 | #define UFS_VENDOR_WDC 0x145 |
c58ab7aa | 20 | |
c58ab7aa | 21 | /** |
25eff2f5 | 22 | * ufs_dev_quirk - ufs device quirk info |
c58ab7aa YG |
23 | * @card: ufs card details |
24 | * @quirk: device quirk | |
25 | */ | |
25eff2f5 | 26 | struct ufs_dev_quirk { |
09750066 | 27 | u16 wmanufacturerid; |
aead21f3 | 28 | const u8 *model; |
c58ab7aa YG |
29 | unsigned int quirk; |
30 | }; | |
31 | ||
c58ab7aa YG |
32 | /* |
33 | * Some vendor's UFS device sends back to back NACs for the DL data frames | |
34 | * causing the host controller to raise the DFES error status. Sometimes | |
35 | * such UFS devices send back to back NAC without waiting for new | |
36 | * retransmitted DL frame from the host and in such cases it might be possible | |
37 | * the Host UniPro goes into bad state without raising the DFES error | |
38 | * interrupt. If this happens then all the pending commands would timeout | |
39 | * only after respective SW command (which is generally too large). | |
40 | * | |
41 | * We can workaround such device behaviour like this: | |
42 | * - As soon as SW sees the DL NAC error, it should schedule the error handler | |
43 | * - Error handler would sleep for 50ms to see if there are any fatal errors | |
44 | * raised by UFS controller. | |
45 | * - If there are fatal errors then SW does normal error recovery. | |
46 | * - If there are no fatal errors then SW sends the NOP command to device | |
47 | * to check if link is alive. | |
48 | * - If NOP command times out, SW does normal error recovery | |
49 | * - If NOP command succeed, skip the error handling. | |
50 | * | |
51 | * If DL NAC error is seen multiple times with some vendor's UFS devices then | |
52 | * enable this quirk to initiate quick error recovery and also silence related | |
53 | * error logs to reduce spamming of kernel logs. | |
54 | */ | |
55 | #define UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS (1 << 2) | |
56 | ||
c58ab7aa YG |
57 | /* |
58 | * Few Toshiba UFS device models advertise RX_MIN_ACTIVATETIME_CAPABILITY as | |
59 | * 600us which may not be enough for reliable hibern8 exit hardware sequence | |
60 | * from UFS device. | |
61 | * To workaround this issue, host should set its PA_TACTIVATE time to 1ms even | |
62 | * if device advertises RX_MIN_ACTIVATETIME_CAPABILITY less than 1ms. | |
63 | */ | |
64 | #define UFS_DEVICE_QUIRK_PA_TACTIVATE (1 << 4) | |
65 | ||
b799fdf7 YG |
66 | /* |
67 | * It seems some UFS devices may keep drawing more than sleep current | |
68 | * (atleast for 500us) from UFS rails (especially from VCCQ rail). | |
69 | * To avoid this situation, add 2ms delay before putting these UFS | |
70 | * rails in LPM mode. | |
71 | */ | |
72 | #define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6) | |
73 | ||
c6a6db43 | 74 | /* |
75 | * Some UFS devices require host PA_TACTIVATE to be lower than device | |
76 | * PA_TACTIVATE, enabling this quirk ensure this. | |
77 | */ | |
78 | #define UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE (1 << 7) | |
79 | ||
56d4a186 SJ |
80 | /* |
81 | * The max. value PA_SaveConfigTime is 250 (10us) but this is not enough for | |
82 | * some vendors. | |
83 | * Gear switch from PWM to HS may fail even with this max. PA_SaveConfigTime. | |
84 | * Gear switch can be issued by host controller as an error recovery and any | |
85 | * software delay will not help on this case so we need to increase | |
86 | * PA_SaveConfigTime to >32us as per vendor recommendation. | |
87 | */ | |
88 | #define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8) | |
c6a6db43 | 89 | |
8e4829c6 WL |
90 | /* |
91 | * Some UFS devices require VS_DebugSaveConfigTime is 0x10, | |
92 | * enabling this quirk ensure this. | |
93 | */ | |
94 | #define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9) | |
95 | ||
817d7e14 SC |
96 | /* |
97 | * Some pre-3.1 UFS devices can support extended features by upgrading | |
98 | * the firmware. Enable this quirk to make UFS core driver probe and enable | |
99 | * supported features on such devices. | |
100 | */ | |
101 | #define UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES (1 << 10) | |
102 | ||
c4df6eed SC |
103 | /* |
104 | * Some UFS devices require delay after VCC power rail is turned-off. | |
105 | * Enable this quirk to introduce 5ms delays after VCC power-off during | |
106 | * suspend flow. | |
107 | */ | |
108 | #define UFS_DEVICE_QUIRK_DELAY_AFTER_LPM (1 << 11) | |
109 | ||
63522bf3 BH |
110 | /* |
111 | * Some UFS devices require L2P entry should be swapped before being sent to the | |
112 | * UFS device for HPB READ command. | |
113 | */ | |
114 | #define UFS_DEVICE_QUIRK_SWAP_L2P_ENTRY_FOR_HPB_READ (1 << 12) | |
115 | ||
c58ab7aa | 116 | #endif /* UFS_QUIRKS_H_ */ |