linux_dsm_epyc7002/drivers/i2c/busses
Felipe Balbi d60ece5f01 i2c: omap: ensure writes to dev->buf_len are ordered
if we allow compiler reorder our writes, we could
fall into a situation where dev->buf_len is reset
for no apparent reason.

This bug was found with a simple script which would
transfer data to an i2c client from 1 to 1024 bytes
(a simple for loop), when we got to transfer sizes
bigger than the fifo size, dev->buf_len was reset
to zero before we had an oportunity to handle XDR
Interrupt. Because dev->buf_len was zero, we entered
omap_i2c_transmit_data() to transfer zero bytes,
which would mean we would just silently exit
omap_i2c_transmit_data() without actually writing
anything to DATA register. That would cause XDR
IRQ to trigger forever and we would never transfer
the remaining bytes.

After adding the memory barrier, we also drop resetting
dev->buf_len to zero in omap_i2c_xfer_msg() because
both omap_i2c_transmit_data() and omap_i2c_receive_data()
will act until dev->buf_len reaches zero, rendering the
other write in omap_i2c_xfer_msg() redundant.

This patch has been tested with pandaboard for a few
iterations of the script mentioned above.

Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
2012-11-14 17:44:37 +01:00
..
i2c-acorn.c
i2c-ali15x3.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-ali1535.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-ali1563.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-amd756-s4882.c
i2c-amd756.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-amd8111.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-at91.c i2c: at91: fix SMBus quick command 2012-11-14 10:28:28 +01:00
i2c-au1550.c
i2c-bfin-twi.c i2c: i2c-bfin-twi: Move blackfin TWI register access Macro to head file. 2012-07-13 08:37:31 +02:00
i2c-cpm.c
i2c-davinci.c Merge branch 'i2c-embedded/for-next' of git://git.pengutronix.de/git/wsa/linux 2012-10-11 10:27:51 +09:00
i2c-designware-core.c i2c-designware: i2c_dw_xfer_msg can be static 2012-10-05 22:23:53 +02:00
i2c-designware-core.h
i2c-designware-pcidrv.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-designware-platdrv.c
i2c-diolan-u2c.c i2c: diolan-u2c: Fix master_xfer return code 2012-08-18 12:27:27 +02:00
i2c-eg20t.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-elektor.c
i2c-gpio.c i2c: i2c-gpio: fix name issue with multiple i2c gpio nodes 2012-11-14 09:56:43 +01:00
i2c-highlander.c
i2c-hydra.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-i801.c i2c-i801: Fix comment 2012-10-28 21:37:01 +01:00
i2c-ibm_iic.c
i2c-ibm_iic.h
i2c-imx.c Merge branch 'i2c-embedded/for-next' of git://git.pengutronix.de/git/wsa/linux 2012-10-11 10:27:51 +09:00
i2c-intel-mid.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-iop3xx.c i2c: iop3xx: use standard gpiolib functions 2012-07-25 09:26:41 -05:00
i2c-iop3xx.h
i2c-isch.c
i2c-mpc.c Merge branch 'i2c-embedded/for-next' of git://git.pengutronix.de/git/wsa/linux 2012-10-11 10:27:51 +09:00
i2c-mv64xxx.c I2C: MV64XYZ: Add Device Tree support 2012-07-23 22:04:11 +02:00
i2c-mxs.c i2c: mxs: remove broken PIOQUEUE support 2012-11-02 10:52:32 +01:00
i2c-nforce2-s4985.c
i2c-nforce2.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-nomadik.c i2c: nomadik: Fix the usage of wait_for_completion_timeout 2012-11-12 18:21:55 +01:00
i2c-nuc900.c ARM: w90x900: move platform_data definitions 2012-09-14 11:18:59 +02:00
i2c-ocores.c i2c: ocores: Use devm_request_and_ioremap() 2012-11-13 12:16:24 +01:00
i2c-octeon.c i2c: Convert i2c-octeon.c to use device tree. 2012-07-23 13:54:53 +01:00
i2c-omap.c i2c: omap: ensure writes to dev->buf_len are ordered 2012-11-14 17:44:37 +01:00
i2c-parport-light.c
i2c-parport.c i2c-parport: i2c_parport_irq can be static 2012-10-05 22:23:53 +02:00
i2c-parport.h
i2c-pasemi.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-pca-isa.c
i2c-pca-platform.c
i2c-piix4.c i2c-piix4: Fix build failure 2012-10-05 22:23:55 +02:00
i2c-pmcmsp.c i2c-pmcmsp: remove IRQF_SAMPLE_RANDOM which is now a no-op 2012-07-19 10:38:47 -04:00
i2c-pnx.c i2c: pnx: Fix read transactions of >= 2 bytes 2012-09-12 17:52:44 +02:00
i2c-powermac.c
i2c-puv3.c
i2c-pxa-pci.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-pxa.c i2c/i2c-pxa: remove conditional compilation of clk code 2012-07-30 17:25:12 -07:00
i2c-rcar.c i2c: rcar: fix section mismatch 2012-11-13 11:24:15 +01:00
i2c-s3c2410.c Merge branch 'i2c-embedded/for-next' of git://git.pengutronix.de/git/wsa/linux 2012-10-11 10:27:51 +09:00
i2c-s6000.c
i2c-s6000.h
i2c-scmi.c i2c-scmi: convert to module_acpi_driver() 2012-09-21 13:39:56 -04:00
i2c-sh7760.c
i2c-sh_mobile.c
i2c-sibyte.c
i2c-simtec.c
i2c-sirf.c
i2c-sis96x.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-sis630.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-sis5595.c
i2c-stu300.c i2c: stu300: use devm managed resources 2012-07-16 13:48:51 +02:00
i2c-taos-evm.c
i2c-tegra.c i2c: tegra: set irq name as device name 2012-11-02 10:52:52 +01:00
i2c-tiny-usb.c i2c-tiny-usb: Add support for the Robofuzz OSIF USB/I2C converter 2012-07-24 14:13:59 +02:00
i2c-versatile.c
i2c-via.c i2c/busses: Use module_pci_driver 2012-07-24 14:13:56 +02:00
i2c-viapro.c i2c-viapro: Add VIA VX900 device ID 2012-10-05 22:23:53 +02:00
i2c-xiic.c
i2c-xlr.c
Kconfig i2c-i801: Simplify dependency towards GPIOLIB 2012-10-28 21:37:01 +01:00
Makefile i2c-stub: Move to drivers/i2c 2012-10-28 21:37:00 +01:00
scx200_acb.c i2c/scx200_*: Replace printks with pr_<level>s 2012-10-05 22:23:52 +02:00
scx200_i2c.c i2c/scx200_*: Replace printks with pr_<level>s 2012-10-05 22:23:52 +02:00