diff options
Diffstat (limited to 'drivers/platform/surface/aggregator/ssh_request_layer.c')
-rw-r--r-- | drivers/platform/surface/aggregator/ssh_request_layer.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/platform/surface/aggregator/ssh_request_layer.c b/drivers/platform/surface/aggregator/ssh_request_layer.c index b649d71840fd..bb1c862411a2 100644 --- a/drivers/platform/surface/aggregator/ssh_request_layer.c +++ b/drivers/platform/surface/aggregator/ssh_request_layer.c @@ -8,6 +8,7 @@ #include <asm/unaligned.h> #include <linux/atomic.h> #include <linux/completion.h> +#include <linux/error-injection.h> #include <linux/ktime.h> #include <linux/limits.h> #include <linux/list.h> @@ -58,6 +59,30 @@ */ #define SSH_RTL_TX_BATCH 10 +#ifdef CONFIG_SURFACE_AGGREGATOR_ERROR_INJECTION + +/** + * ssh_rtl_should_drop_response() - Error injection hook to drop request + * responses. + * + * Useful to cause request transmission timeouts in the driver by dropping the + * response to a request. + */ +static noinline bool ssh_rtl_should_drop_response(void) +{ + return false; +} +ALLOW_ERROR_INJECTION(ssh_rtl_should_drop_response, TRUE); + +#else + +static inline bool ssh_rtl_should_drop_response(void) +{ + return false; +} + +#endif + static u16 ssh_request_get_rqid(struct ssh_request *rqst) { return get_unaligned_le16(rqst->packet.data.ptr @@ -459,6 +484,16 @@ static void ssh_rtl_complete(struct ssh_rtl *rtl, if (unlikely(ssh_request_get_rqid(p) != rqid)) continue; + /* Simulate response timeout. */ + if (ssh_rtl_should_drop_response()) { + spin_unlock(&rtl->pending.lock); + + trace_ssam_ei_rx_drop_response(p); + rtl_info(rtl, "request error injection: dropping response for request %p\n", + &p->packet); + return; + } + /* * Mark as "response received" and "locked" as we're going to * complete it. |