Commit e6809703 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge tag 'thunderbolt-for-v5.13-rc4' of...

Merge tag 'thunderbolt-for-v5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt into usb-linus

Mika writes:

thunderbolt: Fixes for v5.13-rc4

This includes two fixes from Mathias to handle NVM read side properly in
certain situations.

Both have been in linux-next with no reported issues.

* tag 'thunderbolt-for-v5.13-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/westeri/thunderbolt:
  thunderbolt: usb4: Fix NVM read buffer bounds and offset issue
  thunderbolt: dma_port: Fix NVM read buffer bounds and offset issue
parents e752dbc5 22c7a18e
...@@ -366,15 +366,15 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address, ...@@ -366,15 +366,15 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address,
void *buf, size_t size) void *buf, size_t size)
{ {
unsigned int retries = DMA_PORT_RETRIES; unsigned int retries = DMA_PORT_RETRIES;
unsigned int offset;
offset = address & 3;
address = address & ~3;
do { do {
u32 nbytes = min_t(u32, size, MAIL_DATA_DWORDS * 4); unsigned int offset;
size_t nbytes;
int ret; int ret;
offset = address & 3;
nbytes = min_t(size_t, size + offset, MAIL_DATA_DWORDS * 4);
ret = dma_port_flash_read_block(dma, address, dma->buf, ret = dma_port_flash_read_block(dma, address, dma->buf,
ALIGN(nbytes, 4)); ALIGN(nbytes, 4));
if (ret) { if (ret) {
...@@ -386,6 +386,7 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address, ...@@ -386,6 +386,7 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address,
return ret; return ret;
} }
nbytes -= offset;
memcpy(buf, dma->buf + offset, nbytes); memcpy(buf, dma->buf + offset, nbytes);
size -= nbytes; size -= nbytes;
......
...@@ -68,15 +68,15 @@ static int usb4_do_read_data(u16 address, void *buf, size_t size, ...@@ -68,15 +68,15 @@ static int usb4_do_read_data(u16 address, void *buf, size_t size,
unsigned int retries = USB4_DATA_RETRIES; unsigned int retries = USB4_DATA_RETRIES;
unsigned int offset; unsigned int offset;
offset = address & 3;
address = address & ~3;
do { do {
size_t nbytes = min_t(size_t, size, USB4_DATA_DWORDS * 4);
unsigned int dwaddress, dwords; unsigned int dwaddress, dwords;
u8 data[USB4_DATA_DWORDS * 4]; u8 data[USB4_DATA_DWORDS * 4];
size_t nbytes;
int ret; int ret;
offset = address & 3;
nbytes = min_t(size_t, size + offset, USB4_DATA_DWORDS * 4);
dwaddress = address / 4; dwaddress = address / 4;
dwords = ALIGN(nbytes, 4) / 4; dwords = ALIGN(nbytes, 4) / 4;
...@@ -87,6 +87,7 @@ static int usb4_do_read_data(u16 address, void *buf, size_t size, ...@@ -87,6 +87,7 @@ static int usb4_do_read_data(u16 address, void *buf, size_t size,
return ret; return ret;
} }
nbytes -= offset;
memcpy(buf, data + offset, nbytes); memcpy(buf, data + offset, nbytes);
size -= nbytes; size -= nbytes;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment