]>
Commit | Line | Data |
---|---|---|
c58ab7aa YG |
1 | /* |
2 | * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License version 2 and | |
6 | * only version 2 as published by the Free Software Foundation. | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, | |
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | * GNU General Public License for more details. | |
12 | * | |
13 | */ | |
14 | ||
15 | #ifndef _UFS_QUIRKS_H_ | |
16 | #define _UFS_QUIRKS_H_ | |
17 | ||
18 | /* return true if s1 is a prefix of s2 */ | |
19 | #define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1)) | |
20 | ||
b799fdf7 | 21 | #define UFS_ANY_VENDOR 0xFFFF |
c58ab7aa YG |
22 | #define UFS_ANY_MODEL "ANY_MODEL" |
23 | ||
c58ab7aa YG |
24 | #define UFS_VENDOR_TOSHIBA 0x198 |
25 | #define UFS_VENDOR_SAMSUNG 0x1CE | |
46c1cf70 | 26 | #define UFS_VENDOR_SKHYNIX 0x1AD |
c58ab7aa | 27 | |
c58ab7aa YG |
28 | /** |
29 | * ufs_dev_fix - ufs device quirk info | |
30 | * @card: ufs card details | |
31 | * @quirk: device quirk | |
32 | */ | |
33 | struct ufs_dev_fix { | |
93fdd5ac | 34 | struct ufs_dev_desc card; |
c58ab7aa YG |
35 | unsigned int quirk; |
36 | }; | |
37 | ||
38 | #define END_FIX { { 0 }, 0 } | |
39 | ||
40 | /* add specific device quirk */ | |
93fdd5ac TW |
41 | #define UFS_FIX(_vendor, _model, _quirk) { \ |
42 | .card.wmanufacturerid = (_vendor),\ | |
43 | .card.model = (_model), \ | |
44 | .quirk = (_quirk), \ | |
45 | } | |
c58ab7aa YG |
46 | |
47 | /* | |
48 | * If UFS device is having issue in processing LCC (Line Control | |
49 | * Command) coming from UFS host controller then enable this quirk. | |
50 | * When this quirk is enabled, host controller driver should disable | |
51 | * the LCC transmission on UFS host controller (by clearing | |
52 | * TX_LCC_ENABLE attribute of host to 0). | |
53 | */ | |
54 | #define UFS_DEVICE_QUIRK_BROKEN_LCC (1 << 0) | |
55 | ||
56 | /* | |
57 | * Some UFS devices don't need VCCQ rail for device operations. Enabling this | |
58 | * quirk for such devices will make sure that VCCQ rail is not voted. | |
59 | */ | |
60 | #define UFS_DEVICE_NO_VCCQ (1 << 1) | |
61 | ||
62 | /* | |
63 | * Some vendor's UFS device sends back to back NACs for the DL data frames | |
64 | * causing the host controller to raise the DFES error status. Sometimes | |
65 | * such UFS devices send back to back NAC without waiting for new | |
66 | * retransmitted DL frame from the host and in such cases it might be possible | |
67 | * the Host UniPro goes into bad state without raising the DFES error | |
68 | * interrupt. If this happens then all the pending commands would timeout | |
69 | * only after respective SW command (which is generally too large). | |
70 | * | |
71 | * We can workaround such device behaviour like this: | |
72 | * - As soon as SW sees the DL NAC error, it should schedule the error handler | |
73 | * - Error handler would sleep for 50ms to see if there are any fatal errors | |
74 | * raised by UFS controller. | |
75 | * - If there are fatal errors then SW does normal error recovery. | |
76 | * - If there are no fatal errors then SW sends the NOP command to device | |
77 | * to check if link is alive. | |
78 | * - If NOP command times out, SW does normal error recovery | |
79 | * - If NOP command succeed, skip the error handling. | |
80 | * | |
81 | * If DL NAC error is seen multiple times with some vendor's UFS devices then | |
82 | * enable this quirk to initiate quick error recovery and also silence related | |
83 | * error logs to reduce spamming of kernel logs. | |
84 | */ | |
85 | #define UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS (1 << 2) | |
86 | ||
87 | /* | |
88 | * Some UFS devices may not work properly after resume if the link was kept | |
89 | * in off state during suspend. Enabling this quirk will not allow the | |
90 | * link to be kept in off state during suspend. | |
91 | */ | |
92 | #define UFS_DEVICE_QUIRK_NO_LINK_OFF (1 << 3) | |
93 | ||
94 | /* | |
95 | * Few Toshiba UFS device models advertise RX_MIN_ACTIVATETIME_CAPABILITY as | |
96 | * 600us which may not be enough for reliable hibern8 exit hardware sequence | |
97 | * from UFS device. | |
98 | * To workaround this issue, host should set its PA_TACTIVATE time to 1ms even | |
99 | * if device advertises RX_MIN_ACTIVATETIME_CAPABILITY less than 1ms. | |
100 | */ | |
101 | #define UFS_DEVICE_QUIRK_PA_TACTIVATE (1 << 4) | |
102 | ||
103 | /* | |
104 | * Some UFS memory devices may have really low read/write throughput in | |
105 | * FAST AUTO mode, enable this quirk to make sure that FAST AUTO mode is | |
106 | * never enabled for such devices. | |
107 | */ | |
108 | #define UFS_DEVICE_NO_FASTAUTO (1 << 5) | |
109 | ||
b799fdf7 YG |
110 | /* |
111 | * It seems some UFS devices may keep drawing more than sleep current | |
112 | * (atleast for 500us) from UFS rails (especially from VCCQ rail). | |
113 | * To avoid this situation, add 2ms delay before putting these UFS | |
114 | * rails in LPM mode. | |
115 | */ | |
116 | #define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6) | |
117 | ||
c6a6db43 SJ |
118 | /* |
119 | * Some UFS devices require host PA_TACTIVATE to be lower than device | |
120 | * PA_TACTIVATE, enabling this quirk ensure this. | |
121 | */ | |
122 | #define UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE (1 << 7) | |
123 | ||
56d4a186 SJ |
124 | /* |
125 | * The max. value PA_SaveConfigTime is 250 (10us) but this is not enough for | |
126 | * some vendors. | |
127 | * Gear switch from PWM to HS may fail even with this max. PA_SaveConfigTime. | |
128 | * Gear switch can be issued by host controller as an error recovery and any | |
129 | * software delay will not help on this case so we need to increase | |
130 | * PA_SaveConfigTime to >32us as per vendor recommendation. | |
131 | */ | |
132 | #define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8) | |
c6a6db43 | 133 | |
8e4829c6 WL |
134 | /* |
135 | * Some UFS devices require VS_DebugSaveConfigTime is 0x10, | |
136 | * enabling this quirk ensure this. | |
137 | */ | |
138 | #define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9) | |
139 | ||
c58ab7aa | 140 | #endif /* UFS_QUIRKS_H_ */ |