spi/omap_mcspi: catch xfers of non-multiple SPI word size
If an SPI access was not a multiple of the SPI word size, the while() loop would spin and the rx/tx ptrs would be incremented indefinitely. Signed-off-by: Michael Jones <michael.jones@matrix-vision.de> Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
		
					parent
					
						
							
								57d9c10dd9
							
						
					
				
			
			
				commit
				
					
						adef658ddf
					
				
			
		
					 1 changed files with 6 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -487,6 +487,9 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
 | 
			
		|||
	rx_reg		= base + OMAP2_MCSPI_RX0;
 | 
			
		||||
	chstat_reg	= base + OMAP2_MCSPI_CHSTAT0;
 | 
			
		||||
 | 
			
		||||
	if (c < (word_len>>3))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	if (word_len <= 8) {
 | 
			
		||||
		u8		*rx;
 | 
			
		||||
		const u8	*tx;
 | 
			
		||||
| 
						 | 
				
			
			@ -534,7 +537,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
 | 
			
		|||
				dev_vdbg(&spi->dev, "read-%d %02x\n",
 | 
			
		||||
						word_len, *(rx - 1));
 | 
			
		||||
			}
 | 
			
		||||
		} while (c);
 | 
			
		||||
		} while (c > (word_len>>3));
 | 
			
		||||
	} else if (word_len <= 16) {
 | 
			
		||||
		u16		*rx;
 | 
			
		||||
		const u16	*tx;
 | 
			
		||||
| 
						 | 
				
			
			@ -581,7 +584,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
 | 
			
		|||
				dev_vdbg(&spi->dev, "read-%d %04x\n",
 | 
			
		||||
						word_len, *(rx - 1));
 | 
			
		||||
			}
 | 
			
		||||
		} while (c);
 | 
			
		||||
		} while (c > (word_len>>3));
 | 
			
		||||
	} else if (word_len <= 32) {
 | 
			
		||||
		u32		*rx;
 | 
			
		||||
		const u32	*tx;
 | 
			
		||||
| 
						 | 
				
			
			@ -628,7 +631,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
 | 
			
		|||
				dev_vdbg(&spi->dev, "read-%d %08x\n",
 | 
			
		||||
						word_len, *(rx - 1));
 | 
			
		||||
			}
 | 
			
		||||
		} while (c);
 | 
			
		||||
		} while (c > (word_len>>3));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* for TX_ONLY mode, be sure all words have shifted out */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue