Merge "usb: pd: Do not respond to SVDM messages in PD 2.0"

This commit is contained in:
qctecmdr 2021-12-03 04:17:06 -08:00 • committed by Gerrit - the friendly Code Review server
commit 7f0235fa21

View file

@ -275,7 +275,7 @@ static void *usbpd_ipc_log;
#define PD_MAX_DATA_OBJ 7
#define PD_SRC_CAP_EXT_DB_LEN 24
#define PD_STATUS_DB_LEN 5
#define PD_STATUS_DB_LEN 6
#define PD_BATTERY_CAP_DB_LEN 9
#define PD_MAX_EXT_MSG_LEN 260
@ -1412,10 +1412,12 @@ int usbpd_send_svdm(struct usbpd *pd, u16 svid, u8 cmd,
enum usbpd_svdm_cmd_type cmd_type, int obj_pos,
const u32 *vdos, int num_vdos)
{
u32 svdm_hdr = SVDM_HDR(svid, 0, obj_pos, cmd_type, cmd);
u32 svdm_hdr = SVDM_HDR(svid, pd->spec_rev == USBPD_REV_30 ? 1 : 0,
obj_pos, cmd_type, cmd);
usbpd_dbg(&pd->dev, "VDM tx: svid:%x cmd:%x cmd_type:%x svdm_hdr:%x\n",
svid, cmd, cmd_type, svdm_hdr);
usbpd_dbg(&pd->dev, "VDM tx: svid:%04x ver:%d obj_pos:%d cmd:%x cmd_type:%x svdm_hdr:%x\n",
svid, pd->spec_rev == USBPD_REV_30 ? 1 : 0, obj_pos,
cmd, cmd_type, svdm_hdr);
return usbpd_send_vdm(pd, svdm_hdr, vdos, num_vdos);
}
@ -1582,7 +1584,7 @@ static void handle_vdm_rx(struct usbpd *pd, struct rx_msg *rx_msg)
ktime_t recvd_time = ktime_get();
usbpd_dbg(&pd->dev,
"VDM rx: svid:%x cmd:%x cmd_type:%x vdm_hdr:%x has_dp: %s\n",
"VDM rx: svid:%04x cmd:%x cmd_type:%x vdm_hdr:%x has_dp: %s\n",
svid, cmd, cmd_type, vdm_hdr,
pd->has_dp ? "true" : "false");
@ -1605,11 +1607,9 @@ static void handle_vdm_rx(struct usbpd *pd, struct rx_msg *rx_msg)
return;
}
if (SVDM_HDR_VER(vdm_hdr) > 1) {
usbpd_dbg(&pd->dev, "Discarding SVDM with incorrect version:%d\n",
if (SVDM_HDR_VER(vdm_hdr) > 1)
usbpd_dbg(&pd->dev, "Received SVDM with unsupported version:%d\n",
SVDM_HDR_VER(vdm_hdr));
return;
}
if (cmd_type != SVDM_CMD_TYPE_INITIATOR &&
pd->current_state != PE_SRC_STARTUP_WAIT_FOR_VDM_RESP)
@ -1634,11 +1634,6 @@ static void handle_vdm_rx(struct usbpd *pd, struct rx_msg *rx_msg)
0, SOP_MSG);
if (ret)
usbpd_set_state(pd, PE_SEND_SOFT_RESET);
} else {
usbpd_send_svdm(pd, svid, cmd,
SVDM_CMD_TYPE_RESP_NAK,
SVDM_HDR_OBJ_POS(vdm_hdr),
NULL, 0);
}
}
break;
@ -3016,13 +3011,15 @@ static bool handle_ext_snk_ready(struct usbpd *pd, struct rx_msg *rx_msg)
complete(&pd->is_ready);
break;
case MSG_STATUS:
if (rx_msg->data_len != PD_STATUS_DB_LEN) {
usbpd_err(&pd->dev, "Invalid status db\n");
break;
}
if (rx_msg->data_len > PD_STATUS_DB_LEN)
usbpd_err(&pd->dev, "Invalid status db length:%d\n",
rx_msg->data_len);
memset(&pd->status_db, 0, sizeof(pd->status_db));
memcpy(&pd->status_db, rx_msg->payload,
sizeof(pd->status_db));
min((size_t)rx_msg->data_len, sizeof(pd->status_db)));
kobject_uevent(&pd->dev.kobj, KOBJ_CHANGE);
complete(&pd->is_ready);
break;
case MSG_BATTERY_CAPABILITIES:
if (rx_msg->data_len != PD_BATTERY_CAP_DB_LEN) {
@ -4014,9 +4011,9 @@ static int usbpd_uevent(struct device *dev, struct kobj_uevent_env *env)
"explicit" : "implicit");
add_uevent_var(env, "ALT_MODE=%d", pd->vdm_state == MODE_ENTERED);
add_uevent_var(env, "SDB=%02x %02x %02x %02x %02x", pd->status_db[0],
pd->status_db[1], pd->status_db[2], pd->status_db[3],
pd->status_db[4]);
add_uevent_var(env, "SDB=%02x %02x %02x %02x %02x %02x",
pd->status_db[0], pd->status_db[1], pd->status_db[2],
pd->status_db[3], pd->status_db[4], pd->status_db[5]);
return 0;
}