Commit 729ea4e0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull i3c update from Boris Brezillon:
 "Fix GETMRL's logic"

* tag 'i3c/for-5.8' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux:
  i3c master: GETMRL's 3rd byte is optional even with BCR_IBI_PAYLOAD
parents d30fc97c b4203ce0
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -1008,7 +1008,6 @@ static int i3c_master_getmrl_locked(struct i3c_master_controller *master,
				    struct i3c_device_info *info)
{
	struct i3c_ccc_cmd_dest dest;
	unsigned int expected_len;
	struct i3c_ccc_mrl *mrl;
	struct i3c_ccc_cmd cmd;
	int ret;
@@ -1024,22 +1023,23 @@ static int i3c_master_getmrl_locked(struct i3c_master_controller *master,
	if (!(info->bcr & I3C_BCR_IBI_PAYLOAD))
		dest.payload.len -= 1;

	expected_len = dest.payload.len;
	i3c_ccc_cmd_init(&cmd, true, I3C_CCC_GETMRL, &dest, 1);
	ret = i3c_master_send_ccc_cmd_locked(master, &cmd);
	if (ret)
		goto out;

	if (dest.payload.len != expected_len) {
	switch (dest.payload.len) {
	case 3:
		info->max_ibi_len = mrl->ibi_len;
		fallthrough;
	case 2:
		info->max_read_len = be16_to_cpu(mrl->read_len);
		break;
	default:
		ret = -EIO;
		goto out;
	}

	info->max_read_len = be16_to_cpu(mrl->read_len);

	if (info->bcr & I3C_BCR_IBI_PAYLOAD)
		info->max_ibi_len = mrl->ibi_len;

out:
	i3c_ccc_cmd_dest_cleanup(&dest);