Commit graph

563364 commits

Author SHA1 Message Date
Subhash Jadavani
2d59afeff9 scsi: ufs: add UFS power collapse support during hibern8
UFS host controller hardware may allow the host controller
to be power collapsed when UFS link is hibern8 state, this
change allows the UFS host controller to be power collapsed
during hibern8.

Change-Id: I42f962484b9d6635be1139b1fc6447dd2ca2200c
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[venkatg@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
2016-03-22 10:58:36 -07:00
Gilad Broner
4ad04d8bc5 scsi: ufs-qcom: change device reference clock control
As of HW major version 2, bit 'UFS_DEV_REF_CLK_EN' which is used to
gate/ungate the ref_clk to external UFS device, was moved into the
UFS register space to UFS_CFG1 register. This change adds support
to appropriately control the device reference clock and it also
adds the missing documentation for the device reference clock control
register address space.

Change-Id: I66a6a75dc5a1cf130b1cee90ae20f9f950edfb3a
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:35 -07:00
Subhash Jadavani
7ae3423485 scsi: ufs: fix UFS HCI 2.0 version register value
It seems UFS version register (offset 08h) fields position has changed in
UFS HCI 2.0 specification when compared to 1.0/1.0 specification.
According to 2.0 spec, UFS version register value should be 0000_0200h
(version 2.0). This change fixes the expected version register value and
also added the error message if host controller advertises invalid
version.

Change-Id: I2dd399fd7e47ce99b60591f7eac75e7305758bde
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[venkatg@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
2016-03-22 10:58:34 -07:00
Subhash Jadavani
1008d1889d scsi: ufs: suspend clock scaling at the start of suspend
Currently clock scaling is suspended only after the host and device
are put in low power mode but we should avoid clock scaling running
after UFS link is put in low power mode (hibern8). This change
suspends clock scaling before putting host/device in low power mode.

Change-Id: Iff9846cee1345a3c0c8b1aaee0b4ad567f37ea79
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:33 -07:00
Subhash Jadavani
60455e93d1 scsi: ufs: avoid exception event handler racing with PM callbacks
If device raises the exception event in the response to the commands
sent during the runtime/system PM callbacks, exception event handler
might run in parallel with PM callbacks and may see unclocked register
accesses. This change fixes this issue by not scheduling the exception
event handler while PM callbacks are running.

Change-Id: I8644f50366d5c87ba6a5048e48703b3723ab241b
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:32 -07:00
Dov Levenglick
4229a8a3ed scsi: ufs-qcom: expose debug registers by debugfs
Add support for exposing debug registers via debugfs. This
can be used for runtime debugging of failures/errors without
the need to add more prints to the console.
In order to avoid unnecessary code duplication, the function
for dumping registers to a file (in debugfs.c) has been
slightly modified and exposed as an external function.

Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
Change-Id: I77f9f3a6d041f805a93d095446f3e8077977036f
2016-03-22 10:58:31 -07:00
Dov Levenglick
7d17fba879 scsi: ufs-qcom: add debug prints for test bus
Adds support for configuring and reading the test bus and debug
registers. The configuration is controlled by debugfs. Reading can
be triggered either by debugfs or by the kernel code.

Change-Id: I943e3c1b1e383a91a8abbb8dab9714434c56b6f5
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
[imaund@codeaurora.org: Resolved context conflicts]
Signed-off-by: Ian Maund <imaund@codeaurora.org>
2016-03-22 10:58:30 -07:00
Dov Levenglick
25531d6eea scsi: ufs-qcom: add ICE debug prints
Add ICE debug prints for debugging purposes. These prints
will be shown as part of dumping registers during error handling.
Enabling can be controlled by debugfs.

Change-Id: I7d070cc8df099e6c526997d39973a3e1c161091b
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
2016-03-22 10:58:30 -07:00
Dov Levenglick
6021822eca scsi: ufs-qcom: add print suppressing debugfs mechanism
Provide a mechanism for the userspace to suppress specific
debug prints via debugfs. This is useful in order to avoid
cases where too much printing would cause watchdog timers
to expire.

Change-Id: I2500b7621b631e260d98595ed8cfe7d5a496dc10
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
2016-03-22 10:58:29 -07:00
Dov Levenglick
a422990e68 scsi: ufs: wait for a longer time for fDeviceInit to clear
On some device, in some cases, the initialization time is
uncharacteristically long. This is within the standard which states
in section 13.4.6.1.2 (Dynamic Capacity Procedural Flow):
"The device initialization may take a time longer than normal
initialization..."
Therefore, making the loop pending on fDeviceInit to clear
longer.

CRs-Fixed: 776748
Change-Id: Ida491467da63ac9630d3ecc9b8f5c3e9ac5187c2
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
2016-03-22 10:58:28 -07:00
Yaniv Gardi
5e500d99d2 scsi: ufs: clear outstanding_request bit in case query timeout
When sending a query to the device returns with a timeout error,
we clear the corresponding bit in the DOORBELL register but
we don't clear the outstanding_request field as we should.
This patch fixes this bug.

Change-Id: Ia7e0aa29b0d822742654ba206a5837b9091fdb4a
Signed-off-by: Yaniv Gardi <ygardi@codeaurora.org>
2016-03-22 10:58:27 -07:00
Gilad Broner
5cdbfe11ca scsi: ufs-qcom: set device ref. clk bit
As of HW major version 2, a new bit 'UFS_DEV_REF_CLK_EN' was added
to UFS_CFG1 register which needs to be set as part of hibernate
enter/exit sequences during suspend/resume.

Change-Id: I66a6a75dc5a1cf130b1cee90ae20f9f950edfb3a
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[imaund@codeaurora.org: Resolved context conflicts and updated a
  conditional in ufs_qcom_advertise_quirks to use the ufs_qcom_host
  struct when querying major hw versions]
Signed-off-by: Ian Maund <imaund@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[venkatg@codeaurora.org: resolved trivial merge conflicts,
drop changes to include/linux/phy/phy-qcom-ufs.h]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
2016-03-22 10:58:26 -07:00
Dov Levenglick
f6786d1fec scsi: ufs: add print suppressing debugfs mechanism
Provides a mechanism for the userspace to suppress specific
debug prints via the debugfs. This is useful in order to avoid
cases where too much printing would cause watchdog timers to expire.

Change-Id: I1ab068cd616ddac767ec5f30ab130e3b1ac34e15
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
[imaund@codeaurora.org: Resolved context conflicts]
Signed-off-by: Ian Maund <imaund@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:25 -07:00
Maya Erez
1fd1c6a697 scsi: ufs: perform ice_init as part of UFS initialization
ice_init may need UFS clocks to be enabled in order to allow
enabling ICE as part of its initialization. To allow that,
ice_init should be done as part of UFS initialization sequence.
In such a case ice_reset is no longer needed to be called as part of
UFS initialization and should be moved to host reset scenarios.

Change-Id: Iaa851083a9f73045c7ca02d69dd65b3a00b85bff
Signed-off-by: Maya Erez <merez@codeaurora.org>
2016-03-22 10:58:24 -07:00
Subhash Jadavani
8a03efed53 scsi: ufs-qcom: write the clock registers only if there is a change
If we write REG_UFS_SYS1CLK_1US & REG_UFS_TX_SYMBOL_CLK_NS_US registers
multiple times (especially when UFS symbol clocks are not running) then
it might make the HW to go back to default value of these registers.
This change updates above registers only if there is a change in these
registers value.

Change-Id: I7c94c477e52b36b26a1624fa3ddfa75a49916d58
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[imaund@codeaurora.org: Resolved context conflicts]
Signed-off-by: Ian Maund <imaund@codeaurora.org>
2016-03-22 10:58:23 -07:00
Subhash Jadavani
7005012bb0 scsi: ufs-qcom: save controller revision before phy_init()
phy_init() calls "init" phy_ops and UFS phy driver might need
to know the UFS controller revision in this "init" ops hence
save the controller revision before calling phy_init().

Change-Id: I3e9d780dfa3da603b372b1fc4465dfd5f7cfb31a
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:22 -07:00
Subhash Jadavani
e0c0dd6ba0 scsi: ufs: set right GenSelectorIndex for M-PHY attributes
DME attributes read/write commands need GenSelectorIndex argument and
according to UFS host controller specification, it should specify the
targeted M-PHY data lane.
This is the valid range of GenSelectorIndex for M-PHY attributes:
	0 to (2 * PA_MaxDataLanes - 1)

Example (Note: PA_MaxDataLanes is UniPro protocol constant set to 4):
  ---------------------------------------
  MPHY Access target |	 GenSelectorIndex
  ---------------------------------------
    TX Lane0         |          0
    TX Lane1         |          1
    RX Lane0         |          4
    RX Lane1         |          5
  ---------------------------------------

This change make sure that correct GenSelectorIndex is passed for M-PHY
attributes

Change-Id: I38c14b5801ece7fce7a7970385756859618efd32
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[venkatg@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
2016-03-22 10:58:21 -07:00
Subhash Jadavani
bd0b5b8919 scsi: ufs-qcom: remove unnecessary quirks for QUniPro
QUniPro doesn't require some of the quirks required for legacy UniPro
controller hence this change disables those quirks.

Change-Id: Ic97ec38d4a9ee7a51d8f336bcbc8fd9533db2f8d
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:21 -07:00
Subhash Jadavani
a7578e830e scsi: ufs-qcom: add QUniPro hardware support
New revisions of UFS host controller supports the new UniPro
hardware controller (referred as QUniPro). This patch adds
the support to enable this new UniPro controller hardware.

Change-Id: Iccbcc38c36e6d9b9fcbb5c7fd7a3e3326c1c4ce0
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:20 -07:00
Yaniv Gardi
ce7e8d0894 scsi: ufs-qcom: remove support for save/restore phy configuration
Since support for 28nm phy removed in kernel 3.14, all related code
that is specific to phy 28nm is also removed.
Specifically the quirk that enables save/restore phy configuration
is removed (and all its relevant callbacks) as it's unique to 28nm
ufs phy.

Change-Id: Ie723885bacb52548573fc1140d09b0ea5f067382
Signed-off-by: Yaniv Gardi <ygardi@codeaurora.org>
[venkatg@codeaurora.org: drop changes to
include/linux/phy/phy-qcom-ufs.h]
Signed-off-by: Venkat Gopalakrishnan <venkatg@codeaurora.org>
2016-03-22 10:58:19 -07:00
Gilad Broner
a8886a5856 scsi: ufs: fix spinlock recursion in ufshcd_queuecommand()
Before calling ufshcd_send_command() the host spinlock is taken.
In case error is returned ufshcd_release_all() is called, which
in turn attempts to lock the host spinlock again.
Unlocked the host spinlock in case error was returned to
prevent the spinlock recursion.

Change-Id: I630ac8b901f03285a37547bfbcd49ec575e7545a
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:18 -07:00
Dov Levenglick
84e017fe91 scsi: ufs: fail ufshcd_probe_hba() if power configuration fails
In case the power configuration fails, skip further processing
of the  probing function and return immediately. This has 2 reasons:
1. Don't allow the UFS to continue running in PWM
2. Avoid multiple calls to pm_runtime_put_sync() when not
   in error handling or power management contexts

Change-Id: I8d6faefadf42385aace903f90ab967c6ddcf7460
Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
2016-03-22 10:58:17 -07:00
Gilad Broner
b030bfae53 scsi: ufs-qcom: add number of lanes per direction
Different platform may have different number of lanes
for the UFS link.
Add parameter to device tree specifying how many lanes
should be configured for the UFS link.

Change-Id: Ida8b13b916f76b3cc7afd3da3d04219e95627678
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:16 -07:00
Maya Erez
57a5a68620 scsi: ufs: Clear the aborted tag in case of ICE error
ICE error is handled as a fatal error, hence all the outstanding
requests are being aborted.
This patch clears the tag in case of device management requests
and fixes a bug where outstanding_tasks was cleared instead of
outstanding_reqs.

Change-Id: If160b6179edd4e36c541ed7f1b14dfc01de0842b
Signed-off-by: Maya Erez <merez@codeaurora.org>
2016-03-22 10:58:15 -07:00
Subhash Jadavani
b4eb820709 scsi: ufs: optimize system suspend handling
Consider following sequence of events:
1. UFS is runtime suspended, link_state = Hibern8, device_state = sleep
2. System goes into system suspend, ufshcd_system_suspend() brings both
   link and device to active state and then puts the device in Power_Down
   state and link in OFF state.
3. System resumes at some later point in time, ufshcd_system_resume()
   doesn't do anything as UFS state is runtime suspended. Note that link
   is still on OFF state and device is in Power_Down state.
4. Now system again goes into suspend without any UFS accesses before it.
   ufshcd_system_suspend() again brings both link and device to active
   state and then puts the device in Power_Down state and link if OFF
   state. But it's unnecessary to bring the link & device in active state
   as both link and device are already in desired low power states. This
   change fixes this issue by adding proper state checks in
   ufshcd_system_suspend().

Change-Id: I6ada697f5f844724e0da77fa960401d1d6a1288e
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[gbroner@codeaurora.org: fix compilation errors due to changes in
kernel 3.14]
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:14 -07:00
Gilad Broner
86f3ac8635 scsi: ufs: fix locking in __ufshcd_pm_qos_hold
The function is called with locked spinlock and disabled interrupts
which is done in a wrapper function ufshcd_pm_qos_hold().
Before flushing the PM QoS voting work spinlock must be released
and interrupts must be restored. As the interrupts flags state is
saved in the wrapper function, we cannot restore the state.
Moving the locking to the internal function fixes this, which
makes the wrapper function redundant so it is deleted.

Change-Id: I167292305a25d2b8c3524dcddb51f5a7109444aa
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:13 -07:00
Gilad Broner
ebfaba8c84 scsi: ufs: define cpu affinity mask for PM QoS voting
PM QoS request type PM_QOS_REQ_AFFINE_CORES specifies for which CPU
cores the voting is applied to by the cpu affinity mask.
This change defines the cpu mask to be used for the voting in the
device tree node so it can be customized for each target.

Change-Id: I004dea47b42eaf3cdf0489427b2bb894c9982f22
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:12 -07:00
Gilad Broner
f54f471c44 scsi: ufs: adjust DME command delay
DME command delay is used to ensure a sufficient interval between
subsequent commands. The hardware programming guide specified 1ms.
Value of 700us was used as optimization, but it seems to be too short
so DME commands would sometimes fail.
Update the command delay to 1ms as recommended.

Change-Id: I8960f8488c261013ec95ef8c49b58ceda9d065f6
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:11 -07:00
Subhash Jadavani
7248753f68 scsi: ufs: optimize clock, pm_qos, hibern8 handling in queuecommand
ufshcd_queuecommand() vote for the resources in this order: clocks,
pm_qos latency, hibern8 exit. If any of these votes are not already
applied, each one has to be applied asynchronously and in that case we are
releasing all the previously applied resource votes (for example, if
hibern8 exit has to be completed asynchronously, we release the votes for
pm_qos and clocks as well). This is not a optimal solution instead we
should skip scheduling the unvoting work for already voted resources.

Change-Id: Ie700d9b3bf64370a5885787f7313d41adb5b3566
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:10 -07:00
Subhash Jadavani
c991cc0db0 scsi: ufs: fix possible unclocked register access during hibern8 exit
ufshcd_queuecommand() function calls ufshcd_hibern8_hold() to bring the
link out of hibern8 asynchronously. If the link was in hibern8 state then
it schedules a work to execute the hibern8 without any timeout and returns
error back to ufshcd_queuecommand(). ufshcd_queuecommand() calls
ufshcd_release() which schedules the clock gating work to be executed
after clock gating timeout (50ms at this moment). Ideally hibern8 exit
work should have finished much before clock gating work starts execution
but it may not be true on heavily loaded system. To protect this race,
hibern8 exit work should make sure that clocks are running (by calling
ufshcd_hold()) before executing hibern8 exit.

Change-Id: I572b26881277886f5ec17b0eed96ee9e59ca1fbf
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:10 -07:00
Gilad Broner
b19709a5c3 scsi: ufs: reduce printout for aborted requests
Details printed for each request that is aborted can overload the
target as there can be several requests that are aborted at once.
This change will print full request details only for the first
aborted request since the last link reset, and minimal details
for other subsequent requests.

Change-Id: I2868262e0b687c9ddd771a52708428b7de14bea2
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:09 -07:00
Gilad Broner
2fe969df93 scsi: ufs: suspend clock scaling for failed runtime_resume
During runtime resume operation, clock scaling may get indirectly
resumed via call to ufshcd_set_dev_pwr_mode(): Start/Stop Unit command
times out and SCSI error handling ultimately calls the host reset handler
to recover, during which clock scaling is resumed.
Error case exit path of runtime resume will disable clocks.
As clock scaling was already resumed, it will get scheduled later on and
try to access UFS registers while clocks are disabled, resulting in NOC
error.

Change-Id: I3faf46109420ac54404c18b209b4d42982e963b2
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:08 -07:00
Gilad Broner
48ef425125 scsi: ufs: set REQUEST_SENSE command size to 18 bytes
According to UFS device specification REQUEST_SENSE command can
only report back up to 18 bytes of data.

Change-Id: I1121b016ddabfa0e7182a1b6c9b30c27061694d2
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:07 -07:00
Subhash Jadavani
2df0831a9f scsi: ufs_quirks: remove no link off quirk for Toshiba
UFS_DEVICE_QUIRK_NO_LINK_OFF quirk was enabled for Toshiba devices as
these device may stop resonding back on resume after the link
initialization. But we now have proper workaround in place to allow link
off for these UFS devices hence this patch disables the
UFS_DEVICE_QUIRK_NO_LINK_OFF.

Change-Id: I52af7c2088d4d85cb517ee1bd76c0238db80a2d0
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:06 -07:00
Subhash Jadavani
d5a765b27b scsi: ufs: send request sense after the link reinitialization
After link reintialization, device would set the UNIT ATTENTION condition
for each logical units. UNIT ATTENTION condition gets automatically
cleared on either receiving explicit REQUEST SENSE command or data commands
to LUs. Although some devices may stop responding to data commands if we do
UFS link hibern8 enter/exit after link reinitialization but before any data
commands. This change works around above mentioned issue by sending
the explicit REQUEST SENSE command to all LUs after the link
reinitialization.

Change-Id: Ia191b8f05f9521bf587a713924b71bf19c801c31
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:05 -07:00
Maya Erez
e2834bc665 scsi: ufs: Set DBD setting in mode sense for caching mode page
Host sends MODE_SENSE_10 with caching mode page, to check if the device
supports the cache feature.
UFS standards requires DBD field to be set to 1.

Some card vendors are more strict and check the DBD field, hence
respond with CHECK_CONDITION (Sense key set to ILLEGAL_REQUEST and
ASC set to INVALID FIELD IN CDB).
As a result of the CHECK_CONDITION response, host assumes that the
device doesn't support the cache feature and doesn't send
SYNCHORONIZE_CACHE commands to flush the device cache.
This can result in data corruption in case of sudden power down, when
there is data stored in the device cache.

This patch fixes the DBD field setting in case of caching mode page.

Change-Id: I4d63cba26331f04c34e87b99dbdf17c05ab96839
Signed-off-by: Maya Erez <merez@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:04 -07:00
Gilad Broner
7223077cfd scsi: ufs-qcom: save ufs_qcom_host object pointers
Analyzing crash logs is made easier when the different UFS objects
state is accessible. Save a pointer to the main ufs_qcom_host
object when it is allocated.

Change-Id: I8eb909729dee7209e5d9b1af2652fe76ccd3c0ca
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:03 -07:00
Gilad Broner
f3fdd87f21 scsi: ufs: skip request abort task when previous aborts failed
On certain error conditions request abort task itself might fail
when aborting a request. In such case, subsequent request aborts
should skip issuing the abort task as it is expected to fail as well,
and device reset handler will be called next.

Change-Id: I28c111c58e8c7fd54b836c6933d5fc56682c28b9
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
2016-03-22 10:58:02 -07:00
Subhash Jadavani
350f0a1398 scsi: ufs: set the hibern8 on idle state at missing places
Hibern8 on idle state should be set to HIBERN8_EXITED during
initialization and also during resume if the link is reinitialized but
its missing as of now, this change takes care of it.

Change-Id: I9f3b25df3904a666f0efe9bc23f75c0c4116e960
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:01 -07:00
Subhash Jadavani
a5a277f863 scsi: ufs: add quirk for not allowing link off
Some UFS devices may not work properly after resume if the link was
kept in off state during suspend. This change adds a quirk which
will not allow the link to be kept in off state for such devices.

Change-Id: I72c4baebccbe79ff731282f76c3b22782e1edf3e
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:58:00 -07:00
Subhash Jadavani
9226d74e2c scsi: ufs: add error recovery after DL NAC error
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).

This change workarounds such device behaviour like this:
- As soon as SW sees the DL NAC error, it would schedule the error handler
- Error handler would sleep for 50ms to see if there 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.

Change-Id: Id2f0c05c414d700ba923513f8c9e3d1e6a8a749a
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:59 -07:00
Subhash Jadavani
3c2eebd16d scsi: ufs: make error handling bit faster
UFS driver's error handler forcefully tries to clear all the pending
requests. For each pending request in the queue, it waits 1 sec for it
to get cleared. If we have multiple requests in the queue then it's
possible that we might end up waiting for those many seconds before
resetting the host. But note that resetting host would any way clear all
the pending requests from the hardware. Hence this change skips the
forceful clear of the pending requests if we are anyway going to
reset the host (for fatal errors).

Change-Id: I1ce761a140d84b6e1ed53aa215fc8141e336ff64
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
[gbroner@codeaurora.org: fix merge conflict]
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:58 -07:00
Subhash Jadavani
6666b25de7 scsi: ufs: fix the downdifferntial value for clock scaling
"downdifferntial" parameter of devfreq ondemand governor should
be set to value such that if the load is under upthreshold minus
downdifferential, the governor may consider slowing the frequency down.

As the devfreq ondemand governor is now fixed to handle the
downdifferential correctly, update the downdifferential parameter for
UFS clock scaling (which uses the devfreq ondemand governor).

Change-Id: I14efbe5706a56af00d72fad08392b3db13cbbca9
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:58 -07:00
Subhash Jadavani
3b2cafba36 scsi: ufs: add retries for hibern8 enter
If hibern8 enter command fails then UFS link state may be unknown which
may result into timeout of all the commands issued after failure.

This change does 2 things (for pre-defined number of retry counts) after
hibern8 enter failure:
1. Recovers the UFS link to active state
2. If link is recovered to active state, tries to put the UFS link in
   hibern8 enter again until retry count expires.

Change-Id: I6ae6d1371126b3b71ba2154182d6b9920e8996f5
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:57 -07:00
Subhash Jadavani
ed86dcf563 scsi: ufs: fix error recovery after the hibern8 exit failure
Hibern8 exit can be called from 3 different context:
	- ufshcd_hibern8_exit_work
	- ufshcd_ungate_work
	- runtime/system resume.

If hibern8 exit fails for some reason then we try to bring the link to
active state by link startup but this recovery mechanism results into
deadlock or errors from first 2 context listed above. This change fixes
the recovery by adding proper error handling mechanism.

Change-Id: I4d46e53eb052bddae29797cd9780fc5cf33b09ba
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:56 -07:00
Dolev Raviv
2ea3c6c0fa scsi: ufs-qcom: implement ufs dbg_register_dump cb
Errors such as UIC errors, illegal OCS values, and others may require
information kept in non standard UFS registers but controller debug
registers.
Implementing dbg_register_dump cb gives access to such register while
debugging those issues.

Change-Id: I259c3d691b95f72ea62ed162492f9081d472de80
Signed-off-by: Dolev Raviv <draviv@codeaurora.org>
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:55 -07:00
Dolev Raviv
3c0960d0f1 scsi: ufs: Improve fatal error logs
Errors such as UIC error, illegal OCS values, and others may require
more information for debugging. Such information could be hibern8 events,
events sequences, recoverable errors, error history, and more.
This patch improves tracking of important errors and events in debug level
to be enabled when debugging a such issues. It includes:
* UIC error history
* Successful hibern8 events
* Successful command after hibern8 exit
* Clk-freq info
* Failed device command
* Infrastructure for dumping host controller debug information

Change-Id: If3b38b86caeec4ffc669d001b452050a4a6b5173
Signed-off-by: Dolev Raviv <draviv@codeaurora.org>
[subhashj@codeaurora.org: resolved trivial merge conflicts]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:54 -07:00
Lee Susman
b0c1404cb0 scsi: ufs: add trace event for ufs commands
Use the ftrace infrastructure to conditionally trace ufs command events.
New trace event is created, which samples the following ufs command data:
- device name
- optional identification string
- task tag
- doorbell register
- number of transfer bytes
- interrupt status register
- request start LBA
- command opcode

Currently we only fully trace read(10) and write(10) commands.
All other commands which pass through ufshcd_send_command() will be
printed with "-1" in the lba and transfer_len fields.

Usage:
	echo 1 > /sys/kernel/debug/tracing/events/ufs/enable
	cat /sys/kernel/debug/tracing/trace_pipe

Change-Id: Id6e16a8c0b2a833c5453ed9923384f641e374a71
Signed-off-by: Lee Susman <lsusman@codeaurora.org>
[gbroner@codeaurora.org: fix merge conflict]
Signed-off-by: Gilad Broner <gbroner@codeaurora.org>
[subhashj@codeaurora.org: resolved merge conflicts and compilation error]
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:53 -07:00
Subhash Jadavani
134fbea94b scsi: ufs: clear fields UTRD, UPIU req and rsp before new transfers
Some of the data structures (like response UPIU) and/or its elements
(unused fields) should be cleared before sending out the respective
command to UFS device.

This change clears the UPIU response data structure for query commands
and NOP command before sending out the command. We also initialize the
PRDT table length to zero which should take care of commands which doesn't
have any data associated with it. We are also clearing the unused fields in
request UPIU for NOP command.

Change-Id: Iac02618cd5e9d97883652e134c5365884f3d0b44
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:52 -07:00
Subhash Jadavani
81be613925 scsi: ufs: increase fDeviceInit query response timeout
fDeviceInit query response time for some devices is too long that default
query request timeout of 100ms may not be enough. Experiments show that
fDeviceInit response sometimes takes 500ms so to be on safer side this
change sets the timeout to 600ms. Without this change, we might
unnecessarily have to retry fDeviceInit query requests multiple times and
each query request timeout prints one error message.

Change-Id: Ib44fef65c9e408201eb6e0ff9e02d0703d4bf5d9
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
2016-03-22 10:57:51 -07:00