Skip to content

Commit dd0b961

Browse files
plbossartvinodkoul
authored andcommitted
soundwire: cadence: use directly bus sdw_defer structure
Copying the bus sdw_defer structure into the Cadence internals leads to using stale pointers and kernel oopses on errors. It's just simpler and safer to use the bus sdw_defer structure directly. Link: thesofproject#4056 Signed-off-by: Pierre-Louis Bossart <[email protected]> Reviewed-by: Ranjani Sridharan <[email protected]> Signed-off-by: Bard Liao <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent 45cb70f commit dd0b961

File tree

4 files changed

+11
-16
lines changed

4 files changed

+11
-16
lines changed

drivers/soundwire/bus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ static inline int do_transfer_defer(struct sdw_bus *bus,
237237
init_completion(&defer->complete);
238238

239239
for (i = 0; i <= retry; i++) {
240-
resp = bus->ops->xfer_msg_defer(bus, msg, defer);
240+
resp = bus->ops->xfer_msg_defer(bus, msg);
241241
ret = find_response_code(resp);
242242
/* if cmd is ok or ignored return */
243243
if (ret == 0 || ret == -ENODATA)

drivers/soundwire/cadence_master.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -750,7 +750,7 @@ EXPORT_SYMBOL(cdns_xfer_msg);
750750

751751
enum sdw_command_response
752752
cdns_xfer_msg_defer(struct sdw_bus *bus,
753-
struct sdw_msg *msg, struct sdw_defer *defer)
753+
struct sdw_msg *msg)
754754
{
755755
struct sdw_cdns *cdns = bus_to_cdns(bus);
756756
int cmd = 0, ret;
@@ -763,9 +763,6 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
763763
if (ret)
764764
return SDW_CMD_FAIL_OTHER;
765765

766-
cdns->defer = defer;
767-
cdns->defer->length = msg->len;
768-
769766
return _cdns_xfer_msg(cdns, msg, cmd, 0, msg->len, true);
770767
}
771768
EXPORT_SYMBOL(cdns_xfer_msg_defer);
@@ -879,13 +876,15 @@ irqreturn_t sdw_cdns_irq(int irq, void *dev_id)
879876
return IRQ_NONE;
880877

881878
if (int_status & CDNS_MCP_INT_RX_WL) {
879+
struct sdw_bus *bus = &cdns->bus;
880+
struct sdw_defer *defer = &bus->defer_msg;
881+
882882
cdns_read_response(cdns);
883883

884-
if (cdns->defer) {
885-
cdns_fill_msg_resp(cdns, cdns->defer->msg,
886-
cdns->defer->length, 0);
887-
complete(&cdns->defer->complete);
888-
cdns->defer = NULL;
884+
if (defer && defer->msg) {
885+
cdns_fill_msg_resp(cdns, defer->msg,
886+
defer->length, 0);
887+
complete(&defer->complete);
889888
} else {
890889
complete(&cdns->tx_complete);
891890
}

drivers/soundwire/cadence_master.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ struct sdw_cdns_dai_runtime {
109109
* @instance: instance number
110110
* @response_buf: SoundWire response buffer
111111
* @tx_complete: Tx completion
112-
* @defer: Defer pointer
113112
* @ports: Data ports
114113
* @num_ports: Total number of data ports
115114
* @pcm: PCM streams
@@ -130,7 +129,6 @@ struct sdw_cdns {
130129
u32 response_buf[CDNS_MCP_IP_MAX_CMD_LEN + 2];
131130

132131
struct completion tx_complete;
133-
struct sdw_defer *defer;
134132

135133
struct sdw_cdns_port *ports;
136134
int num_ports;
@@ -186,8 +184,7 @@ enum sdw_command_response
186184
cdns_xfer_msg(struct sdw_bus *bus, struct sdw_msg *msg);
187185

188186
enum sdw_command_response
189-
cdns_xfer_msg_defer(struct sdw_bus *bus,
190-
struct sdw_msg *msg, struct sdw_defer *defer);
187+
cdns_xfer_msg_defer(struct sdw_bus *bus, struct sdw_msg *msg);
191188

192189
u32 cdns_read_ping_status(struct sdw_bus *bus);
193190

include/linux/soundwire/sdw.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -851,8 +851,7 @@ struct sdw_master_ops {
851851
enum sdw_command_response (*xfer_msg)
852852
(struct sdw_bus *bus, struct sdw_msg *msg);
853853
enum sdw_command_response (*xfer_msg_defer)
854-
(struct sdw_bus *bus, struct sdw_msg *msg,
855-
struct sdw_defer *defer);
854+
(struct sdw_bus *bus, struct sdw_msg *msg);
856855
int (*set_bus_conf)(struct sdw_bus *bus,
857856
struct sdw_bus_params *params);
858857
int (*pre_bank_switch)(struct sdw_bus *bus);

0 commit comments

Comments
 (0)