Skip to content

Commit 8afe9a3

Browse files
jwrdegoedegregkh
authored andcommitted
usb: typec: tcpm: Refactor tcpm_handle_vdm_request payload handling
Refactor the tcpm_handle_vdm_request payload handling by doing the endianness conversion only once directly inside tcpm_handle_vdm_request itself instead of doing it multiple times inside various helper functions called by tcpm_handle_vdm_request. This is a preparation patch for some further refactoring to fix an AB BA lock inversion between the tcpm code and some altmode drivers. Reviewed-by: Guenter Roeck <[email protected]> Reviewed-by: Heikki Krogerus <[email protected]> Signed-off-by: Hans de Goede <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 03eafcf commit 8afe9a3

File tree

1 file changed

+22
-27
lines changed

1 file changed

+22
-27
lines changed

drivers/usb/typec/tcpm/tcpm.c

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -981,16 +981,15 @@ static void tcpm_queue_vdm_unlocked(struct tcpm_port *port, const u32 header,
981981
mutex_unlock(&port->lock);
982982
}
983983

984-
static void svdm_consume_identity(struct tcpm_port *port, const __le32 *payload,
985-
int cnt)
984+
static void svdm_consume_identity(struct tcpm_port *port, const u32 *p, int cnt)
986985
{
987-
u32 vdo = le32_to_cpu(payload[VDO_INDEX_IDH]);
988-
u32 product = le32_to_cpu(payload[VDO_INDEX_PRODUCT]);
986+
u32 vdo = p[VDO_INDEX_IDH];
987+
u32 product = p[VDO_INDEX_PRODUCT];
989988

990989
memset(&port->mode_data, 0, sizeof(port->mode_data));
991990

992991
port->partner_ident.id_header = vdo;
993-
port->partner_ident.cert_stat = le32_to_cpu(payload[VDO_INDEX_CSTAT]);
992+
port->partner_ident.cert_stat = p[VDO_INDEX_CSTAT];
994993
port->partner_ident.product = product;
995994

996995
typec_partner_set_identity(port->partner);
@@ -1000,17 +999,15 @@ static void svdm_consume_identity(struct tcpm_port *port, const __le32 *payload,
1000999
PD_PRODUCT_PID(product), product & 0xffff);
10011000
}
10021001

1003-
static bool svdm_consume_svids(struct tcpm_port *port, const __le32 *payload,
1004-
int cnt)
1002+
static bool svdm_consume_svids(struct tcpm_port *port, const u32 *p, int cnt)
10051003
{
10061004
struct pd_mode_data *pmdata = &port->mode_data;
10071005
int i;
10081006

10091007
for (i = 1; i < cnt; i++) {
1010-
u32 p = le32_to_cpu(payload[i]);
10111008
u16 svid;
10121009

1013-
svid = (p >> 16) & 0xffff;
1010+
svid = (p[i] >> 16) & 0xffff;
10141011
if (!svid)
10151012
return false;
10161013

@@ -1020,7 +1017,7 @@ static bool svdm_consume_svids(struct tcpm_port *port, const __le32 *payload,
10201017
pmdata->svids[pmdata->nsvids++] = svid;
10211018
tcpm_log(port, "SVID %d: 0x%x", pmdata->nsvids, svid);
10221019

1023-
svid = p & 0xffff;
1020+
svid = p[i] & 0xffff;
10241021
if (!svid)
10251022
return false;
10261023

@@ -1036,8 +1033,7 @@ static bool svdm_consume_svids(struct tcpm_port *port, const __le32 *payload,
10361033
return false;
10371034
}
10381035

1039-
static void svdm_consume_modes(struct tcpm_port *port, const __le32 *payload,
1040-
int cnt)
1036+
static void svdm_consume_modes(struct tcpm_port *port, const u32 *p, int cnt)
10411037
{
10421038
struct pd_mode_data *pmdata = &port->mode_data;
10431039
struct typec_altmode_desc *paltmode;
@@ -1054,7 +1050,7 @@ static void svdm_consume_modes(struct tcpm_port *port, const __le32 *payload,
10541050

10551051
paltmode->svid = pmdata->svids[pmdata->svid_index];
10561052
paltmode->mode = i;
1057-
paltmode->vdo = le32_to_cpu(payload[i]);
1053+
paltmode->vdo = p[i];
10581054

10591055
tcpm_log(port, " Alternate mode %d: SVID 0x%04x, VDO %d: 0x%08x",
10601056
pmdata->altmodes, paltmode->svid,
@@ -1084,21 +1080,17 @@ static void tcpm_register_partner_altmodes(struct tcpm_port *port)
10841080

10851081
#define supports_modal(port) PD_IDH_MODAL_SUPP((port)->partner_ident.id_header)
10861082

1087-
static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
1083+
static int tcpm_pd_svdm(struct tcpm_port *port, const u32 *p, int cnt,
10881084
u32 *response)
10891085
{
10901086
struct typec_altmode *adev;
10911087
struct typec_altmode *pdev;
10921088
struct pd_mode_data *modep;
1093-
u32 p[PD_MAX_PAYLOAD];
10941089
int rlen = 0;
10951090
int cmd_type;
10961091
int cmd;
10971092
int i;
10981093

1099-
for (i = 0; i < cnt; i++)
1100-
p[i] = le32_to_cpu(payload[i]);
1101-
11021094
cmd_type = PD_VDO_CMDT(p[0]);
11031095
cmd = PD_VDO_CMD(p[0]);
11041096

@@ -1159,13 +1151,13 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
11591151
switch (cmd) {
11601152
case CMD_DISCOVER_IDENT:
11611153
/* 6.4.4.3.1 */
1162-
svdm_consume_identity(port, payload, cnt);
1154+
svdm_consume_identity(port, p, cnt);
11631155
response[0] = VDO(USB_SID_PD, 1, CMD_DISCOVER_SVID);
11641156
rlen = 1;
11651157
break;
11661158
case CMD_DISCOVER_SVID:
11671159
/* 6.4.4.3.2 */
1168-
if (svdm_consume_svids(port, payload, cnt)) {
1160+
if (svdm_consume_svids(port, p, cnt)) {
11691161
response[0] = VDO(USB_SID_PD, 1,
11701162
CMD_DISCOVER_SVID);
11711163
rlen = 1;
@@ -1177,7 +1169,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
11771169
break;
11781170
case CMD_DISCOVER_MODES:
11791171
/* 6.4.4.3.3 */
1180-
svdm_consume_modes(port, payload, cnt);
1172+
svdm_consume_modes(port, p, cnt);
11811173
modep->svid_index++;
11821174
if (modep->svid_index < modep->nsvids) {
11831175
u16 svid = modep->svids[modep->svid_index];
@@ -1240,15 +1232,18 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt,
12401232
static void tcpm_handle_vdm_request(struct tcpm_port *port,
12411233
const __le32 *payload, int cnt)
12421234
{
1243-
int rlen = 0;
1235+
u32 p[PD_MAX_PAYLOAD];
12441236
u32 response[8] = { };
1245-
u32 p0 = le32_to_cpu(payload[0]);
1237+
int i, rlen = 0;
1238+
1239+
for (i = 0; i < cnt; i++)
1240+
p[i] = le32_to_cpu(payload[i]);
12461241

12471242
if (port->vdm_state == VDM_STATE_BUSY) {
12481243
/* If UFP responded busy retry after timeout */
1249-
if (PD_VDO_CMDT(p0) == CMDT_RSP_BUSY) {
1244+
if (PD_VDO_CMDT(p[0]) == CMDT_RSP_BUSY) {
12501245
port->vdm_state = VDM_STATE_WAIT_RSP_BUSY;
1251-
port->vdo_retry = (p0 & ~VDO_CMDT_MASK) |
1246+
port->vdo_retry = (p[0] & ~VDO_CMDT_MASK) |
12521247
CMDT_INIT;
12531248
mod_delayed_work(port->wq, &port->vdm_state_machine,
12541249
msecs_to_jiffies(PD_T_VDM_BUSY));
@@ -1257,8 +1252,8 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
12571252
port->vdm_state = VDM_STATE_DONE;
12581253
}
12591254

1260-
if (PD_VDO_SVDM(p0))
1261-
rlen = tcpm_pd_svdm(port, payload, cnt, response);
1255+
if (PD_VDO_SVDM(p[0]))
1256+
rlen = tcpm_pd_svdm(port, p, cnt, response);
12621257

12631258
if (rlen > 0)
12641259
tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);

0 commit comments

Comments
 (0)