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