Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scsi: mvsas: fix wrong endianness of sgpio api

This patch fixes the byte order of the SGPIO api and brings it back in
sync with ledmon v0.80 and above.

[mkp: added missing SoB and fixed whitespace]

Signed-off-by: Wilfried Weissmann <wilfried.weissmann@gmx.at>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Wilfried Weissmann and committed by
Martin K. Petersen
e75fba9c 8aa29f19

+12 -11
+12 -11
drivers/scsi/mvsas/mv_94xx.c
··· 1080 1080 void __iomem *regs = mvi->regs_ex - 0x10200; 1081 1081 1082 1082 int drive = (i/3) & (4-1); /* drive number on host */ 1083 - u32 block = mr32(MVS_SGPIO_DCTRL + 1083 + int driveshift = drive * 8; /* bit offset of drive */ 1084 + u32 block = ioread32be(regs + MVS_SGPIO_DCTRL + 1084 1085 MVS_SGPIO_HOST_OFFSET * mvi->id); 1085 - 1086 1086 1087 1087 /* 1088 1088 * if bit is set then create a mask with the first 1089 1089 * bit of the drive set in the mask ... 1090 1090 */ 1091 - u32 bit = (write_data[i/8] & (1 << (i&(8-1)))) ? 1092 - 1<<(24-drive*8) : 0; 1091 + u32 bit = get_unaligned_be32(write_data) & (1 << i) ? 1092 + 1 << driveshift : 0; 1093 1093 1094 1094 /* 1095 1095 * ... and then shift it to the right position based ··· 1098 1098 switch (i%3) { 1099 1099 case 0: /* activity */ 1100 1100 block &= ~((0x7 << MVS_SGPIO_DCTRL_ACT_SHIFT) 1101 - << (24-drive*8)); 1101 + << driveshift); 1102 1102 /* hardwire activity bit to SOF */ 1103 1103 block |= LED_BLINKA_SOF << ( 1104 1104 MVS_SGPIO_DCTRL_ACT_SHIFT + 1105 - (24-drive*8)); 1105 + driveshift); 1106 1106 break; 1107 1107 case 1: /* id */ 1108 1108 block &= ~((0x3 << MVS_SGPIO_DCTRL_LOC_SHIFT) 1109 - << (24-drive*8)); 1109 + << driveshift); 1110 1110 block |= bit << MVS_SGPIO_DCTRL_LOC_SHIFT; 1111 1111 break; 1112 1112 case 2: /* fail */ 1113 1113 block &= ~((0x7 << MVS_SGPIO_DCTRL_ERR_SHIFT) 1114 - << (24-drive*8)); 1114 + << driveshift); 1115 1115 block |= bit << MVS_SGPIO_DCTRL_ERR_SHIFT; 1116 1116 break; 1117 1117 } 1118 1118 1119 - mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id, 1120 - block); 1119 + iowrite32be(block, 1120 + regs + MVS_SGPIO_DCTRL + 1121 + MVS_SGPIO_HOST_OFFSET * mvi->id); 1121 1122 1122 1123 } 1123 1124 ··· 1133 1132 void __iomem *regs = mvi->regs_ex - 0x10200; 1134 1133 1135 1134 mw32(MVS_SGPIO_DCTRL + MVS_SGPIO_HOST_OFFSET * mvi->id, 1136 - be32_to_cpu(((u32 *) write_data)[i])); 1135 + ((u32 *) write_data)[i]); 1137 1136 } 1138 1137 return reg_count; 1139 1138 }