Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 591e48c2 authored by Peter Huewe's avatar Peter Huewe Committed by Jarkko Sakkinen
Browse files

tpm_tis_spi: Remove limitation of transfers to MAX_SPI_FRAMESIZE bytes



Limiting transfers to MAX_SPI_FRAMESIZE was not expected by the upper
layers, as tpm_tis has no such limitation. Add a loop to hide that
limitation.

v2: Moved scope of spi_message to the top as requested by Jarkko
Cc: <stable@vger.kernel.org>
Fixes: 0edbfea5 ("tpm/tpm_tis_spi: Add support for spi phy")
Signed-off-by: default avatarAlexander Steffen <Alexander.Steffen@infineon.com>
Signed-off-by: default avatarPeter Huewe <peter.huewe@infineon.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: default avatarBenoit Houyere <benoit.houyere@st.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent e110cc69
Loading
Loading
Loading
Loading
+58 −49
Original line number Diff line number Diff line
@@ -60,27 +60,30 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
				u8 *buffer, u8 direction)
{
	struct tpm_tis_spi_phy *phy = to_tpm_tis_spi_phy(data);
	int ret, i;
	int ret = 0;
	int i;
	struct spi_message m;
	struct spi_transfer spi_xfer = {
		.tx_buf = phy->tx_buf,
		.rx_buf = phy->rx_buf,
		.len = 4,
		.cs_change = 1,
	};
	struct spi_transfer spi_xfer;
	u8 transfer_len;

	if (len > MAX_SPI_FRAMESIZE)
		return -ENOMEM;
	spi_bus_lock(phy->spi_device->master);

	phy->tx_buf[0] = direction | (len - 1);
	while (len) {
		transfer_len = min_t(u16, len, MAX_SPI_FRAMESIZE);

		phy->tx_buf[0] = direction | (transfer_len - 1);
		phy->tx_buf[1] = 0xd4;
		phy->tx_buf[2] = addr >> 8;
		phy->tx_buf[3] = addr;

		memset(&spi_xfer, 0, sizeof(spi_xfer));
		spi_xfer.tx_buf = phy->tx_buf;
		spi_xfer.rx_buf = phy->rx_buf;
		spi_xfer.len = 4;
		spi_xfer.cs_change = 1;

		spi_message_init(&m);
		spi_message_add_tail(&spi_xfer, &m);

	spi_bus_lock(phy->spi_device->master);
		ret = spi_sync_locked(phy->spi_device, &m);
		if (ret < 0)
			goto exit;
@@ -107,7 +110,7 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
		}

		spi_xfer.cs_change = 0;
	spi_xfer.len = len;
		spi_xfer.len = transfer_len;

		if (direction) {
			spi_xfer.tx_buf = NULL;
@@ -120,6 +123,12 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
		spi_message_init(&m);
		spi_message_add_tail(&spi_xfer, &m);
		ret = spi_sync_locked(phy->spi_device, &m);
		if (ret < 0)
			goto exit;

		len -= transfer_len;
		buffer += transfer_len;
	}

exit:
	spi_bus_unlock(phy->spi_device->master);