Message ID | 20210531181757.19458-5-p.yadav@ti.com |
---|---|
State | Changes Requested |
Delegated to: | Ambarus Tudor |
Headers | show |
Series | Avoid odd length/address read/writes in 8D-8D-8D mode. | expand |
On 5/31/21 9:17 PM, Pratyush Yadav wrote: > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > In 8D-8D-8D mode two bytes are transferred per cycle. So an odd number > of bytes cannot be transferred because it would leave a residual half > cycle at the end. Consider such a transfer invalid and reject it. > > Signed-off-by: Pratyush Yadav <p.yadav@ti.com> > Reviewed-by: Mark Brown <broonie@kernel.org> > > --- > > Changes in v2: > - Add Mark's R-by (spell corrected). > > drivers/spi/spi-mem.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c > index 1513553e4080..ab9eefbaa1d9 100644 > --- a/drivers/spi/spi-mem.c > +++ b/drivers/spi/spi-mem.c > @@ -162,7 +162,17 @@ static bool spi_mem_check_buswidth(struct spi_mem *mem, > bool spi_mem_dtr_supports_op(struct spi_mem *mem, > const struct spi_mem_op *op) > { > - if (op->cmd.nbytes != 2) > + if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2) !IS_ALIGNED(op->cmd.nbytes, 2)? > + return false; > + > + if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2) > + return false; > + > + if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2) > + return false; > + > + if (op->data.dir != SPI_MEM_NO_DATA && > + op->dummy.buswidth == 8 && op->data.nbytes % 2) dummy is sent on the same buswidth as data's indeed, but I would s/op->dummy.buswidth/op->data.buswidth for code consistency reasons. > return false; > > return spi_mem_check_buswidth(mem, op); > -- > 2.30.0 >
On 23/12/21 11:43AM, Tudor.Ambarus@microchip.com wrote: > On 5/31/21 9:17 PM, Pratyush Yadav wrote: > > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe > > > > In 8D-8D-8D mode two bytes are transferred per cycle. So an odd number > > of bytes cannot be transferred because it would leave a residual half > > cycle at the end. Consider such a transfer invalid and reject it. > > > > Signed-off-by: Pratyush Yadav <p.yadav@ti.com> > > Reviewed-by: Mark Brown <broonie@kernel.org> > > > > --- > > > > Changes in v2: > > - Add Mark's R-by (spell corrected). > > > > drivers/spi/spi-mem.c | 12 +++++++++++- > > 1 file changed, 11 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c > > index 1513553e4080..ab9eefbaa1d9 100644 > > --- a/drivers/spi/spi-mem.c > > +++ b/drivers/spi/spi-mem.c > > @@ -162,7 +162,17 @@ static bool spi_mem_check_buswidth(struct spi_mem *mem, > > bool spi_mem_dtr_supports_op(struct spi_mem *mem, > > const struct spi_mem_op *op) > > { > > - if (op->cmd.nbytes != 2) > > + if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2) > > !IS_ALIGNED(op->cmd.nbytes, 2)? Ok. > > > + return false; > > + > > + if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2) > > + return false; > > + > > + if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2) > > + return false; > > + > > + if (op->data.dir != SPI_MEM_NO_DATA && > > + op->dummy.buswidth == 8 && op->data.nbytes % 2) > > dummy is sent on the same buswidth as data's indeed, but I would > s/op->dummy.buswidth/op->data.buswidth for code consistency reasons. This looks like a typo. It should indeed be data.buswidth. > > > return false; > > > > return spi_mem_check_buswidth(mem, op); > > -- > > 2.30.0 > > >
diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c index 1513553e4080..ab9eefbaa1d9 100644 --- a/drivers/spi/spi-mem.c +++ b/drivers/spi/spi-mem.c @@ -162,7 +162,17 @@ static bool spi_mem_check_buswidth(struct spi_mem *mem, bool spi_mem_dtr_supports_op(struct spi_mem *mem, const struct spi_mem_op *op) { - if (op->cmd.nbytes != 2) + if (op->cmd.buswidth == 8 && op->cmd.nbytes % 2) + return false; + + if (op->addr.nbytes && op->addr.buswidth == 8 && op->addr.nbytes % 2) + return false; + + if (op->dummy.nbytes && op->dummy.buswidth == 8 && op->dummy.nbytes % 2) + return false; + + if (op->data.dir != SPI_MEM_NO_DATA && + op->dummy.buswidth == 8 && op->data.nbytes % 2) return false; return spi_mem_check_buswidth(mem, op);