2019-05-29 17:17:58 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2016-03-10 18:37:10 +03:00
/*
* Copyright ( c ) 2014 - 2016 , The Linux Foundation . All rights reserved .
*/
# ifndef _UFS_QUIRKS_H_
# define _UFS_QUIRKS_H_
/* return true if s1 is a prefix of s2 */
# define STR_PRFX_EQUAL(s1, s2) !strncmp(s1, s2, strlen(s1))
2016-03-10 18:37:18 +03:00
# define UFS_ANY_VENDOR 0xFFFF
2016-03-10 18:37:10 +03:00
# define UFS_ANY_MODEL "ANY_MODEL"
# define UFS_VENDOR_TOSHIBA 0x198
# define UFS_VENDOR_SAMSUNG 0x1CE
2016-09-26 17:58:25 +03:00
# define UFS_VENDOR_SKHYNIX 0x1AD
2020-02-24 07:09:22 +03:00
# define UFS_VENDOR_WDC 0x145
2016-03-10 18:37:10 +03:00
/**
* ufs_dev_fix - ufs device quirk info
* @ card : ufs card details
* @ quirk : device quirk
*/
struct ufs_dev_fix {
2020-01-20 16:08:14 +03:00
u16 wmanufacturerid ;
u8 * model ;
2016-03-10 18:37:10 +03:00
unsigned int quirk ;
} ;
2020-01-20 16:08:14 +03:00
# define END_FIX { }
2016-03-10 18:37:10 +03:00
/* add specific device quirk */
2017-01-05 11:45:12 +03:00
# define UFS_FIX(_vendor, _model, _quirk) { \
2020-01-20 16:08:14 +03:00
. wmanufacturerid = ( _vendor ) , \
. model = ( _model ) , \
2017-01-05 11:45:12 +03:00
. quirk = ( _quirk ) , \
}
2016-03-10 18:37:10 +03:00
/*
* Some vendor ' s UFS device sends back to back NACs for the DL data frames
* causing the host controller to raise the DFES error status . Sometimes
* such UFS devices send back to back NAC without waiting for new
* retransmitted DL frame from the host and in such cases it might be possible
* the Host UniPro goes into bad state without raising the DFES error
* interrupt . If this happens then all the pending commands would timeout
* only after respective SW command ( which is generally too large ) .
*
* We can workaround such device behaviour like this :
* - As soon as SW sees the DL NAC error , it should schedule the error handler
* - Error handler would sleep for 50 ms to see if there are any fatal errors
* raised by UFS controller .
* - If there are fatal errors then SW does normal error recovery .
* - If there are no fatal errors then SW sends the NOP command to device
* to check if link is alive .
* - If NOP command times out , SW does normal error recovery
* - If NOP command succeed , skip the error handling .
*
* If DL NAC error is seen multiple times with some vendor ' s UFS devices then
* enable this quirk to initiate quick error recovery and also silence related
* error logs to reduce spamming of kernel logs .
*/
# define UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS (1 << 2)
/*
* Few Toshiba UFS device models advertise RX_MIN_ACTIVATETIME_CAPABILITY as
* 600u s which may not be enough for reliable hibern8 exit hardware sequence
* from UFS device .
* To workaround this issue , host should set its PA_TACTIVATE time to 1 ms even
* if device advertises RX_MIN_ACTIVATETIME_CAPABILITY less than 1 ms .
*/
# define UFS_DEVICE_QUIRK_PA_TACTIVATE (1 << 4)
2016-03-10 18:37:18 +03:00
/*
* It seems some UFS devices may keep drawing more than sleep current
* ( atleast for 500u s ) from UFS rails ( especially from VCCQ rail ) .
* To avoid this situation , add 2 ms delay before putting these UFS
* rails in LPM mode .
*/
# define UFS_DEVICE_QUIRK_DELAY_BEFORE_LPM (1 << 6)
2016-11-24 03:32:08 +03:00
/*
* Some UFS devices require host PA_TACTIVATE to be lower than device
* PA_TACTIVATE , enabling this quirk ensure this .
*/
# define UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE (1 << 7)
2016-12-06 06:25:32 +03:00
/*
* The max . value PA_SaveConfigTime is 250 ( 10u s ) but this is not enough for
* some vendors .
* Gear switch from PWM to HS may fail even with this max . PA_SaveConfigTime .
* Gear switch can be issued by host controller as an error recovery and any
* software delay will not help on this case so we need to increase
* PA_SaveConfigTime to > 32u s as per vendor recommendation .
*/
# define UFS_DEVICE_QUIRK_HOST_PA_SAVECONFIGTIME (1 << 8)
2016-11-24 03:32:08 +03:00
2018-11-08 20:08:29 +03:00
/*
* Some UFS devices require VS_DebugSaveConfigTime is 0x10 ,
* enabling this quirk ensure this .
*/
# define UFS_DEVICE_QUIRK_HOST_VS_DEBUGSAVECONFIGTIME (1 << 9)
2020-05-08 11:01:08 +03:00
/*
* Some pre - 3.1 UFS devices can support extended features by upgrading
* the firmware . Enable this quirk to make UFS core driver probe and enable
* supported features on such devices .
*/
# define UFS_DEVICE_QUIRK_SUPPORT_EXTENDED_FEATURES (1 << 10)
2016-03-10 18:37:10 +03:00
# endif /* UFS_QUIRKS_H_ */