diff options
author | Will Deacon <will.deacon@arm.com> | 2013-10-11 09:52:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-11 17:50:59 -0400 |
commit | e9e4ea74f06635f2ffc1dffe5ef40c854faa0a90 (patch) | |
tree | 7f07c52efa9d265d81faf0a732778a1597da9f43 | |
parent | 96b340406724d87e4621284ebac5e059d67b2194 (diff) |
net: smc91x: dont't use SMC_outw for fixing up halfword-aligned data
SMC_outw invokes an endian-aware I/O accessor, which may change the data
endianness before writing to the device. This is not suitable for data
transfers where the memory buffer is simply a string of bytes that does
not require any byte-swapping.
This patches fixes the smc91x SMC_PUSH_DATA macro so that it uses the
string I/O accessor for outputting the leading or trailing halfwords on
halfword-aligned buffers.
Cc: <netdev@vger.kernel.org>
Cc: Nicolas Pitre <nico@fluxnic.net>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Acked-by: Nicolas Pitre <nico@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/smsc/smc91x.h | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/net/ethernet/smsc/smc91x.h b/drivers/net/ethernet/smsc/smc91x.h index 5730fe2445a6..98eedb90cdc3 100644 --- a/drivers/net/ethernet/smsc/smc91x.h +++ b/drivers/net/ethernet/smsc/smc91x.h | |||
@@ -1124,8 +1124,7 @@ static const char * chip_ids[ 16 ] = { | |||
1124 | void __iomem *__ioaddr = ioaddr; \ | 1124 | void __iomem *__ioaddr = ioaddr; \ |
1125 | if (__len >= 2 && (unsigned long)__ptr & 2) { \ | 1125 | if (__len >= 2 && (unsigned long)__ptr & 2) { \ |
1126 | __len -= 2; \ | 1126 | __len -= 2; \ |
1127 | SMC_outw(*(u16 *)__ptr, ioaddr, \ | 1127 | SMC_outsw(ioaddr, DATA_REG(lp), __ptr, 1); \ |
1128 | DATA_REG(lp)); \ | ||
1129 | __ptr += 2; \ | 1128 | __ptr += 2; \ |
1130 | } \ | 1129 | } \ |
1131 | if (SMC_CAN_USE_DATACS && lp->datacs) \ | 1130 | if (SMC_CAN_USE_DATACS && lp->datacs) \ |
@@ -1133,8 +1132,7 @@ static const char * chip_ids[ 16 ] = { | |||
1133 | SMC_outsl(__ioaddr, DATA_REG(lp), __ptr, __len>>2); \ | 1132 | SMC_outsl(__ioaddr, DATA_REG(lp), __ptr, __len>>2); \ |
1134 | if (__len & 2) { \ | 1133 | if (__len & 2) { \ |
1135 | __ptr += (__len & ~3); \ | 1134 | __ptr += (__len & ~3); \ |
1136 | SMC_outw(*((u16 *)__ptr), ioaddr, \ | 1135 | SMC_outsw(ioaddr, DATA_REG(lp), __ptr, 1); \ |
1137 | DATA_REG(lp)); \ | ||
1138 | } \ | 1136 | } \ |
1139 | } else if (SMC_16BIT(lp)) \ | 1137 | } else if (SMC_16BIT(lp)) \ |
1140 | SMC_outsw(ioaddr, DATA_REG(lp), p, (l) >> 1); \ | 1138 | SMC_outsw(ioaddr, DATA_REG(lp), p, (l) >> 1); \ |