android_kernel_xiaomi_sm8450/include/linux/mtd
Wang Haitao a4d62babf9 mtd: map: fixed bug in 64-bit systems
Hardware:
	CPU: XLP832,the 64-bit OS
	NOR Flash:S29GL128S 128M
Software:
	Kernel:2.6.32.41
	Filesystem:JFFS2
When writing files, errors appear:
	Write len 182  but return retlen 180
	Write of 182 bytes at 0x072c815c failed. returned -5, retlen 180
	Write len 186  but return retlen 184
	Write of 186 bytes at 0x072caff4 failed. returned -5, retlen 184
These errors exist only in 64-bit systems,not in 32-bit systems. After analysis, we
found that the left shift operation is wrong in map_word_load_partial. For instance:
	unsigned char buf[3] ={0x9e,0x3a,0xea};
	map_bankwidth(map) is 4;
	for (i=0; i < 3; i++) {
		int bitpos;
		bitpos = (map_bankwidth(map)-1-i)*8;
		orig.x[0] &= ~(0xff << bitpos);
		orig.x[0] |= buf[i] << bitpos;
	}

The value of orig.x[0] is expected to be 0x9e3aeaff, but in this situation(64-bit
System) we'll get the wrong value of 0xffffffff9e3aeaff due to the 64-bit sign
extension:
buf[i] is defined as "unsigned char" and the left-shift operation will convert it
to the type of "signed int", so when left-shift buf[i] by 24 bits, the final result
will get the wrong value: 0xffffffff9e3aeaff.

If the left-shift bits are less than 24, then sign extension will not occur. Whereas
the bankwidth of the nor flash we used is 4, therefore this BUG emerges.

Signed-off-by: Pang Xunlei <pang.xunlei@zte.com.cn>
Signed-off-by: Zhang Yi <zhang.yi20@zte.com.cn>
Signed-off-by: Lu Zhongjun <lu.zhongjun@zte.com.cn>
Cc: <stable@vger.kernel.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
2013-11-06 23:32:59 -08:00
..
bbm.h mtd: nand: remove NAND_BBT_SCANEMPTY 2013-08-30 16:48:37 +01:00
blktrans.h mtd_blktrans_ops->release() should return void 2013-05-05 21:31:22 -04:00
cfi_endian.h mtd: cfi: Allow per-mapping CFI device endianness 2012-01-09 18:06:13 +00:00
cfi.h BUG: headers with BUG/BUG_ON etc. need linux/bug.h 2012-03-04 17:54:34 -05:00
concat.h
doc2000.h mtd: diskonchip: use inline functions for DocRead/DocWrite 2012-11-16 10:57:38 +02:00
flashchip.h
fsmc.h mtd: nand: fsmc: update of OF support 2013-08-05 20:48:49 +01:00
ftl.h
gen_probe.h
inftl.h
latch-addr-flash.h
lpc32xx_mlc.h mtd: lpc32xx_mlc: Make driver independent of AMBA DMA engine driver 2012-09-29 14:53:08 +01:00
lpc32xx_slc.h mtd: lpc32xx_slc: Make driver independent of AMBA DMA engine driver 2012-09-29 14:52:45 +01:00
map.h mtd: map: fixed bug in 64-bit systems 2013-11-06 23:32:59 -08:00
mtd.h mtd: Move major number definitions to major.h 2013-11-06 23:32:59 -08:00
mtdram.h
nand_bch.h
nand_ecc.h
nand-gpio.h
nand.h mtd: nand: rename the cellinfo to bits_per_cell 2013-10-27 16:27:04 -07:00
ndfc.h
nftl.h
onenand_regs.h
onenand.h mtd: OneNAND: Detect the correct NOP when 4KiB pagesize 2011-09-11 15:02:13 +03:00
partitions.h mtd: mtdparts: introduce mtd_get_device_size 2012-09-04 09:38:58 +03:00
pfow.h
physmap.h mtd: physmap: add const qualifiers 2013-04-05 13:02:40 +01:00
pismo.h
plat-ram.h mtd: plat-ram: add const quilifiers 2013-04-05 13:02:33 +01:00
qinfo.h
sh_flctl.h mtd: sh_flctl: Add DMA capabilty 2012-11-15 15:37:50 +02:00
sharpsl.h
spear_smi.h mtd: add device-tree support to spear_smi 2012-03-27 01:01:21 +01:00
super.h
ubi.h UBI: modify ubi_wl_flush function to clear work queue for a lnum 2012-05-21 11:34:41 +03:00
xip.h