From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> To: alsa-devel@alsa-project.org Cc: linux-kernel@vger.kernel.org, tiwai@suse.de, broonie@kernel.org, vkoul@kernel.org, gregkh@linuxfoundation.org, jank@cadence.com, srinivas.kandagatla@linaro.org, slawomir.blauciak@intel.com, Bard liao <yung-chuan.liao@linux.intel.com>, Rander Wang <rander.wang@linux.intel.com>, Ranjani Sridharan <ranjani.sridharan@linux.intel.com>, Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>, Sanyog Kale <sanyog.r.kale@intel.com> Subject: [PATCH 06/10] soundwire: bus: add helper to clear Slave status to UNATTACHED Date: Tue, 14 Jan 2020 18:08:40 -0600 [thread overview] Message-ID: <20200115000844.14695-7-pierre-louis.bossart@linux.intel.com> (raw) In-Reply-To: <20200115000844.14695-1-pierre-louis.bossart@linux.intel.com> When resuming with a bus reset, we need to re-enumerate and restart from UNATTACHED. The helper added in this patch helps implement a more robust state machine avoiding race conditions on resume. The unattach request is stored and will be used by Slave drivers, if needed: Intel validation exposed a corner case where the Slave device may transition to D3 when streaming stops, but streaming restarts before the Master transitions to D3. In that case, the Slave status was not cleared as UNATTACHED by the Master resuming, and the wait_for_completion will time out. When the slave resumes, it can check if a Master-initiated re-enumeration and initialization took place and skip the wait_for_completion() if there is no reason to wait. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> --- drivers/soundwire/bus.c | 27 +++++++++++++++++++++++++++ drivers/soundwire/bus.h | 8 ++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index dfe27e3ca815..57dec61142e5 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -1163,3 +1163,30 @@ int sdw_handle_slave_status(struct sdw_bus *bus, return ret; } EXPORT_SYMBOL(sdw_handle_slave_status); + +void sdw_clear_slave_status(struct sdw_bus *bus, u32 request) +{ + struct sdw_slave *slave; + int i; + + /* Check all non-zero devices */ + for (i = 1; i <= SDW_MAX_DEVICES; i++) { + mutex_lock(&bus->bus_lock); + if (test_bit(i, bus->assigned) == false) { + mutex_unlock(&bus->bus_lock); + continue; + } + mutex_unlock(&bus->bus_lock); + + slave = sdw_get_slave(bus, i); + if (!slave) + continue; + + if (slave->status != SDW_SLAVE_UNATTACHED) + sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED); + + /* keep track of request, used in pm_runtime resume */ + slave->unattach_request = request; + } +} +EXPORT_SYMBOL(sdw_clear_slave_status); diff --git a/drivers/soundwire/bus.h b/drivers/soundwire/bus.h index acb8d11a4c84..204204a26db8 100644 --- a/drivers/soundwire/bus.h +++ b/drivers/soundwire/bus.h @@ -165,4 +165,12 @@ sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) return sdw_write(slave, addr, tmp); } +/* + * At the moment we only track Master-initiated hw_reset. + * Additional fields can be added as needed + */ +#define SDW_UNATTACH_REQUEST_MASTER_RESET BIT(0) + +void sdw_clear_slave_status(struct sdw_bus *bus, u32 request); + #endif /* __SDW_BUS_H */ -- 2.20.1
WARNING: multiple messages have this Message-ID (diff)
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> To: alsa-devel@alsa-project.org Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>, tiwai@suse.de, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, Ranjani Sridharan <ranjani.sridharan@linux.intel.com>, vkoul@kernel.org, broonie@kernel.org, srinivas.kandagatla@linaro.org, jank@cadence.com, slawomir.blauciak@intel.com, Sanyog Kale <sanyog.r.kale@intel.com>, Bard liao <yung-chuan.liao@linux.intel.com>, Rander Wang <rander.wang@linux.intel.com> Subject: [alsa-devel] [PATCH 06/10] soundwire: bus: add helper to clear Slave status to UNATTACHED Date: Tue, 14 Jan 2020 18:08:40 -0600 [thread overview] Message-ID: <20200115000844.14695-7-pierre-louis.bossart@linux.intel.com> (raw) In-Reply-To: <20200115000844.14695-1-pierre-louis.bossart@linux.intel.com> When resuming with a bus reset, we need to re-enumerate and restart from UNATTACHED. The helper added in this patch helps implement a more robust state machine avoiding race conditions on resume. The unattach request is stored and will be used by Slave drivers, if needed: Intel validation exposed a corner case where the Slave device may transition to D3 when streaming stops, but streaming restarts before the Master transitions to D3. In that case, the Slave status was not cleared as UNATTACHED by the Master resuming, and the wait_for_completion will time out. When the slave resumes, it can check if a Master-initiated re-enumeration and initialization took place and skip the wait_for_completion() if there is no reason to wait. Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> --- drivers/soundwire/bus.c | 27 +++++++++++++++++++++++++++ drivers/soundwire/bus.h | 8 ++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c index dfe27e3ca815..57dec61142e5 100644 --- a/drivers/soundwire/bus.c +++ b/drivers/soundwire/bus.c @@ -1163,3 +1163,30 @@ int sdw_handle_slave_status(struct sdw_bus *bus, return ret; } EXPORT_SYMBOL(sdw_handle_slave_status); + +void sdw_clear_slave_status(struct sdw_bus *bus, u32 request) +{ + struct sdw_slave *slave; + int i; + + /* Check all non-zero devices */ + for (i = 1; i <= SDW_MAX_DEVICES; i++) { + mutex_lock(&bus->bus_lock); + if (test_bit(i, bus->assigned) == false) { + mutex_unlock(&bus->bus_lock); + continue; + } + mutex_unlock(&bus->bus_lock); + + slave = sdw_get_slave(bus, i); + if (!slave) + continue; + + if (slave->status != SDW_SLAVE_UNATTACHED) + sdw_modify_slave_status(slave, SDW_SLAVE_UNATTACHED); + + /* keep track of request, used in pm_runtime resume */ + slave->unattach_request = request; + } +} +EXPORT_SYMBOL(sdw_clear_slave_status); diff --git a/drivers/soundwire/bus.h b/drivers/soundwire/bus.h index acb8d11a4c84..204204a26db8 100644 --- a/drivers/soundwire/bus.h +++ b/drivers/soundwire/bus.h @@ -165,4 +165,12 @@ sdw_update(struct sdw_slave *slave, u32 addr, u8 mask, u8 val) return sdw_write(slave, addr, tmp); } +/* + * At the moment we only track Master-initiated hw_reset. + * Additional fields can be added as needed + */ +#define SDW_UNATTACH_REQUEST_MASTER_RESET BIT(0) + +void sdw_clear_slave_status(struct sdw_bus *bus, u32 request); + #endif /* __SDW_BUS_H */ -- 2.20.1 _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org https://mailman.alsa-project.org/mailman/listinfo/alsa-devel
next prev parent reply other threads:[~2020-01-15 0:09 UTC|newest] Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-01-15 0:08 [PATCH 00/10] soundwire: bus: fix race conditions, add suspend-resume Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 01/10] soundwire: bus: fix race condition with probe_complete signaling Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 02/10] soundwire: bus: fix race condition with enumeration_complete signaling Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 03/10] soundwire: bus: fix race condition with initialization_complete signaling Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 04/10] soundwire: bus: add PM/no-PM versions of read/write functions Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 05/10] soundwire: bus: write Slave Device Number without runtime_pm Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` Pierre-Louis Bossart [this message] 2020-01-15 0:08 ` [alsa-devel] [PATCH 06/10] soundwire: bus: add helper to clear Slave status to UNATTACHED Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 07/10] soundwire: bus: disable pm_runtime in sdw_slave_delete Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 08/10] soundwire: bus: fix io error when processing alert event Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 09/10] soundwire: bus: add clock stop helpers Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-01-15 0:08 ` [PATCH 10/10] soundwire: bus: don't treat CMD_IGNORED as error on ClockStop Pierre-Louis Bossart 2020-01-15 0:08 ` [alsa-devel] " Pierre-Louis Bossart 2020-02-10 14:30 ` [alsa-devel] [PATCH 00/10] soundwire: bus: fix race conditions, add suspend-resume Pierre-Louis Bossart 2020-02-10 14:30 ` Pierre-Louis Bossart 2020-02-25 10:27 ` Vinod Koul 2020-02-25 10:27 ` Vinod Koul 2020-02-25 15:23 ` Pierre-Louis Bossart
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200115000844.14695-7-pierre-louis.bossart@linux.intel.com \ --to=pierre-louis.bossart@linux.intel.com \ --cc=alsa-devel@alsa-project.org \ --cc=broonie@kernel.org \ --cc=gregkh@linuxfoundation.org \ --cc=jank@cadence.com \ --cc=linux-kernel@vger.kernel.org \ --cc=rander.wang@linux.intel.com \ --cc=ranjani.sridharan@linux.intel.com \ --cc=sanyog.r.kale@intel.com \ --cc=slawomir.blauciak@intel.com \ --cc=srinivas.kandagatla@linaro.org \ --cc=tiwai@suse.de \ --cc=vkoul@kernel.org \ --cc=yung-chuan.liao@linux.intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.