Commit b9fc7dc5 authored by Al Viro's avatar Al Viro Committed by David S. Miller

[TG3]: Endianness annotations.

Fixed misannotations, introduced a new helper - tg3_nvram_read_le().
It gets __le32 * instead of u32 * and puts there the value converted
to little-endian.  A lot of callers of tg3_nvram_read() were doing
that; converted them to tg3_nvram_read_le().

At that point the driver is practically endian-clean; the only remaining
place is an actual bug, AFAICS; will be dealt with in the next patch.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 20880e89
...@@ -8189,6 +8189,7 @@ static int tg3_get_eeprom_len(struct net_device *dev) ...@@ -8189,6 +8189,7 @@ static int tg3_get_eeprom_len(struct net_device *dev)
} }
static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val); static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val);
static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val);
static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val); static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val);
static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data) static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, u8 *data)
...@@ -8196,7 +8197,8 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8196,7 +8197,8 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
struct tg3 *tp = netdev_priv(dev); struct tg3 *tp = netdev_priv(dev);
int ret; int ret;
u8 *pd; u8 *pd;
u32 i, offset, len, val, b_offset, b_count; u32 i, offset, len, b_offset, b_count;
__le32 val;
if (tp->link_config.phy_is_low_power) if (tp->link_config.phy_is_low_power)
return -EAGAIN; return -EAGAIN;
...@@ -8215,10 +8217,9 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8215,10 +8217,9 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
/* i.e. offset=1 len=2 */ /* i.e. offset=1 len=2 */
b_count = len; b_count = len;
} }
ret = tg3_nvram_read(tp, offset-b_offset, &val); ret = tg3_nvram_read_le(tp, offset-b_offset, &val);
if (ret) if (ret)
return ret; return ret;
val = cpu_to_le32(val);
memcpy(data, ((char*)&val) + b_offset, b_count); memcpy(data, ((char*)&val) + b_offset, b_count);
len -= b_count; len -= b_count;
offset += b_count; offset += b_count;
...@@ -8228,12 +8229,11 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8228,12 +8229,11 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
/* read bytes upto the last 4 byte boundary */ /* read bytes upto the last 4 byte boundary */
pd = &data[eeprom->len]; pd = &data[eeprom->len];
for (i = 0; i < (len - (len & 3)); i += 4) { for (i = 0; i < (len - (len & 3)); i += 4) {
ret = tg3_nvram_read(tp, offset + i, &val); ret = tg3_nvram_read_le(tp, offset + i, &val);
if (ret) { if (ret) {
eeprom->len += i; eeprom->len += i;
return ret; return ret;
} }
val = cpu_to_le32(val);
memcpy(pd + i, &val, 4); memcpy(pd + i, &val, 4);
} }
eeprom->len += i; eeprom->len += i;
...@@ -8243,11 +8243,10 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8243,11 +8243,10 @@ static int tg3_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
pd = &data[eeprom->len]; pd = &data[eeprom->len];
b_count = len & 3; b_count = len & 3;
b_offset = offset + len - b_count; b_offset = offset + len - b_count;
ret = tg3_nvram_read(tp, b_offset, &val); ret = tg3_nvram_read_le(tp, b_offset, &val);
if (ret) if (ret)
return ret; return ret;
val = cpu_to_le32(val); memcpy(pd, &val, b_count);
memcpy(pd, ((char*)&val), b_count);
eeprom->len += b_count; eeprom->len += b_count;
} }
return 0; return 0;
...@@ -8259,8 +8258,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8259,8 +8258,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
{ {
struct tg3 *tp = netdev_priv(dev); struct tg3 *tp = netdev_priv(dev);
int ret; int ret;
u32 offset, len, b_offset, odd_len, start, end; u32 offset, len, b_offset, odd_len;
u8 *buf; u8 *buf;
__le32 start, end;
if (tp->link_config.phy_is_low_power) if (tp->link_config.phy_is_low_power)
return -EAGAIN; return -EAGAIN;
...@@ -8273,10 +8273,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8273,10 +8273,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
if ((b_offset = (offset & 3))) { if ((b_offset = (offset & 3))) {
/* adjustments to start on required 4 byte boundary */ /* adjustments to start on required 4 byte boundary */
ret = tg3_nvram_read(tp, offset-b_offset, &start); ret = tg3_nvram_read_le(tp, offset-b_offset, &start);
if (ret) if (ret)
return ret; return ret;
start = cpu_to_le32(start);
len += b_offset; len += b_offset;
offset &= ~3; offset &= ~3;
if (len < 4) if (len < 4)
...@@ -8288,10 +8287,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, ...@@ -8288,10 +8287,9 @@ static int tg3_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom,
/* adjustments to end on required 4 byte boundary */ /* adjustments to end on required 4 byte boundary */
odd_len = 1; odd_len = 1;
len = (len + 3) & ~3; len = (len + 3) & ~3;
ret = tg3_nvram_read(tp, offset+len-4, &end); ret = tg3_nvram_read_le(tp, offset+len-4, &end);
if (ret) if (ret)
return ret; return ret;
end = cpu_to_le32(end);
} }
buf = data; buf = data;
...@@ -8734,7 +8732,8 @@ static void tg3_get_ethtool_stats (struct net_device *dev, ...@@ -8734,7 +8732,8 @@ static void tg3_get_ethtool_stats (struct net_device *dev,
static int tg3_test_nvram(struct tg3 *tp) static int tg3_test_nvram(struct tg3 *tp)
{ {
u32 *buf, csum, magic; u32 csum, magic;
__le32 *buf;
int i, j, k, err = 0, size; int i, j, k, err = 0, size;
if (tg3_nvram_read_swab(tp, 0, &magic) != 0) if (tg3_nvram_read_swab(tp, 0, &magic) != 0)
...@@ -8771,21 +8770,19 @@ static int tg3_test_nvram(struct tg3 *tp) ...@@ -8771,21 +8770,19 @@ static int tg3_test_nvram(struct tg3 *tp)
err = -EIO; err = -EIO;
for (i = 0, j = 0; i < size; i += 4, j++) { for (i = 0, j = 0; i < size; i += 4, j++) {
u32 val; if ((err = tg3_nvram_read_le(tp, i, &buf[j])) != 0)
if ((err = tg3_nvram_read(tp, i, &val)) != 0)
break; break;
buf[j] = cpu_to_le32(val);
} }
if (i < size) if (i < size)
goto out; goto out;
/* Selfboot format */ /* Selfboot format */
if ((cpu_to_be32(buf[0]) & TG3_EEPROM_MAGIC_FW_MSK) == magic = swab32(le32_to_cpu(buf[0]));
if ((magic & TG3_EEPROM_MAGIC_FW_MSK) ==
TG3_EEPROM_MAGIC_FW) { TG3_EEPROM_MAGIC_FW) {
u8 *buf8 = (u8 *) buf, csum8 = 0; u8 *buf8 = (u8 *) buf, csum8 = 0;
if ((cpu_to_be32(buf[0]) & TG3_EEPROM_SB_REVISION_MASK) == if ((magic & TG3_EEPROM_SB_REVISION_MASK) ==
TG3_EEPROM_SB_REVISION_2) { TG3_EEPROM_SB_REVISION_2) {
/* For rev 2, the csum doesn't include the MBA. */ /* For rev 2, the csum doesn't include the MBA. */
for (i = 0; i < TG3_EEPROM_SB_F1R2_MBA_OFF; i++) for (i = 0; i < TG3_EEPROM_SB_F1R2_MBA_OFF; i++)
...@@ -8806,7 +8803,7 @@ static int tg3_test_nvram(struct tg3 *tp) ...@@ -8806,7 +8803,7 @@ static int tg3_test_nvram(struct tg3 *tp)
goto out; goto out;
} }
if ((cpu_to_be32(buf[0]) & TG3_EEPROM_MAGIC_HW_MSK) == if ((magic & TG3_EEPROM_MAGIC_HW_MSK) ==
TG3_EEPROM_MAGIC_HW) { TG3_EEPROM_MAGIC_HW) {
u8 data[NVRAM_SELFBOOT_DATA_SIZE]; u8 data[NVRAM_SELFBOOT_DATA_SIZE];
u8 parity[NVRAM_SELFBOOT_DATA_SIZE]; u8 parity[NVRAM_SELFBOOT_DATA_SIZE];
...@@ -8852,12 +8849,12 @@ static int tg3_test_nvram(struct tg3 *tp) ...@@ -8852,12 +8849,12 @@ static int tg3_test_nvram(struct tg3 *tp)
/* Bootstrap checksum at offset 0x10 */ /* Bootstrap checksum at offset 0x10 */
csum = calc_crc((unsigned char *) buf, 0x10); csum = calc_crc((unsigned char *) buf, 0x10);
if(csum != cpu_to_le32(buf[0x10/4])) if(csum != le32_to_cpu(buf[0x10/4]))
goto out; goto out;
/* Manufacturing block starts at offset 0x74, checksum at 0xfc */ /* Manufacturing block starts at offset 0x74, checksum at 0xfc */
csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88); csum = calc_crc((unsigned char *) &buf[0x74/4], 0x88);
if (csum != cpu_to_le32(buf[0xfc/4])) if (csum != le32_to_cpu(buf[0xfc/4]))
goto out; goto out;
err = 0; err = 0;
...@@ -10171,6 +10168,15 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val) ...@@ -10171,6 +10168,15 @@ static int tg3_nvram_read(struct tg3 *tp, u32 offset, u32 *val)
return ret; return ret;
} }
static int tg3_nvram_read_le(struct tg3 *tp, u32 offset, __le32 *val)
{
u32 v;
int res = tg3_nvram_read(tp, offset, &v);
if (!res)
*val = cpu_to_le32(v);
return res;
}
static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val) static int tg3_nvram_read_swab(struct tg3 *tp, u32 offset, u32 *val)
{ {
int err; int err;
...@@ -10188,13 +10194,14 @@ static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp, ...@@ -10188,13 +10194,14 @@ static int tg3_nvram_write_block_using_eeprom(struct tg3 *tp,
u32 val; u32 val;
for (i = 0; i < len; i += 4) { for (i = 0; i < len; i += 4) {
u32 addr, data; u32 addr;
__le32 data;
addr = offset + i; addr = offset + i;
memcpy(&data, buf + i, 4); memcpy(&data, buf + i, 4);
tw32(GRC_EEPROM_DATA, cpu_to_le32(data)); tw32(GRC_EEPROM_DATA, le32_to_cpu(data));
val = tr32(GRC_EEPROM_ADDR); val = tr32(GRC_EEPROM_ADDR);
tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE); tw32(GRC_EEPROM_ADDR, val | EEPROM_ADDR_COMPLETE);
...@@ -10244,8 +10251,9 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len, ...@@ -10244,8 +10251,9 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
phy_addr = offset & ~pagemask; phy_addr = offset & ~pagemask;
for (j = 0; j < pagesize; j += 4) { for (j = 0; j < pagesize; j += 4) {
/* Almost certainly should be tg3_nvram_read_le */
if ((ret = tg3_nvram_read(tp, phy_addr + j, if ((ret = tg3_nvram_read(tp, phy_addr + j,
(u32 *) (tmp + j)))) (__le32 *) (tmp + j))))
break; break;
} }
if (ret) if (ret)
...@@ -10289,10 +10297,11 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len, ...@@ -10289,10 +10297,11 @@ static int tg3_nvram_write_block_unbuffered(struct tg3 *tp, u32 offset, u32 len,
break; break;
for (j = 0; j < pagesize; j += 4) { for (j = 0; j < pagesize; j += 4) {
u32 data; __be32 data;
data = *((u32 *) (tmp + j)); data = *((__be32 *) (tmp + j));
tw32(NVRAM_WRDATA, cpu_to_be32(data)); /* swab32(le32_to_cpu(data)), actually */
tw32(NVRAM_WRDATA, be32_to_cpu(data));
tw32(NVRAM_ADDR, phy_addr + j); tw32(NVRAM_ADDR, phy_addr + j);
...@@ -10326,10 +10335,11 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len, ...@@ -10326,10 +10335,11 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
int i, ret = 0; int i, ret = 0;
for (i = 0; i < len; i += 4, offset += 4) { for (i = 0; i < len; i += 4, offset += 4) {
u32 data, page_off, phy_addr, nvram_cmd; u32 page_off, phy_addr, nvram_cmd;
__be32 data;
memcpy(&data, buf + i, 4); memcpy(&data, buf + i, 4);
tw32(NVRAM_WRDATA, cpu_to_be32(data)); tw32(NVRAM_WRDATA, be32_to_cpu(data));
page_off = offset % tp->nvram_pagesize; page_off = offset % tp->nvram_pagesize;
...@@ -10831,6 +10841,7 @@ static void __devinit tg3_read_partno(struct tg3 *tp) ...@@ -10831,6 +10841,7 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD); vpd_cap = pci_find_capability(tp->pdev, PCI_CAP_ID_VPD);
for (i = 0; i < 256; i += 4) { for (i = 0; i < 256; i += 4) {
u32 tmp, j = 0; u32 tmp, j = 0;
__le32 v;
u16 tmp16; u16 tmp16;
pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR, pci_write_config_word(tp->pdev, vpd_cap + PCI_VPD_ADDR,
...@@ -10847,8 +10858,8 @@ static void __devinit tg3_read_partno(struct tg3 *tp) ...@@ -10847,8 +10858,8 @@ static void __devinit tg3_read_partno(struct tg3 *tp)
pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA, pci_read_config_dword(tp->pdev, vpd_cap + PCI_VPD_DATA,
&tmp); &tmp);
tmp = cpu_to_le32(tmp); v = cpu_to_le32(tmp);
memcpy(&vpd_data[i], &tmp, 4); memcpy(&vpd_data[i], &v, 4);
} }
} }
...@@ -10941,11 +10952,11 @@ static void __devinit tg3_read_fw_ver(struct tg3 *tp) ...@@ -10941,11 +10952,11 @@ static void __devinit tg3_read_fw_ver(struct tg3 *tp)
offset = offset + ver_offset - start; offset = offset + ver_offset - start;
for (i = 0; i < 16; i += 4) { for (i = 0; i < 16; i += 4) {
if (tg3_nvram_read(tp, offset + i, &val)) __le32 v;
if (tg3_nvram_read_le(tp, offset + i, &v))
return; return;
val = le32_to_cpu(val); memcpy(tp->fw_ver + i, &v, 4);
memcpy(tp->fw_ver + i, &val, 4);
} }
if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) || if (!(tp->tg3_flags & TG3_FLAG_ENABLE_ASF) ||
...@@ -10983,19 +10994,19 @@ static void __devinit tg3_read_fw_ver(struct tg3 *tp) ...@@ -10983,19 +10994,19 @@ static void __devinit tg3_read_fw_ver(struct tg3 *tp)
tp->fw_ver[bcnt++] = ' '; tp->fw_ver[bcnt++] = ' ';
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (tg3_nvram_read(tp, offset, &val)) __le32 v;
if (tg3_nvram_read_le(tp, offset, &v))
return; return;
val = le32_to_cpu(val); offset += sizeof(v);
offset += sizeof(val);
if (bcnt > TG3_VER_SIZE - sizeof(val)) { if (bcnt > TG3_VER_SIZE - sizeof(v)) {
memcpy(&tp->fw_ver[bcnt], &val, TG3_VER_SIZE - bcnt); memcpy(&tp->fw_ver[bcnt], &v, TG3_VER_SIZE - bcnt);
break; break;
} }
memcpy(&tp->fw_ver[bcnt], &val, sizeof(val)); memcpy(&tp->fw_ver[bcnt], &v, sizeof(v));
bcnt += sizeof(val); bcnt += sizeof(v);
} }
tp->fw_ver[TG3_VER_SIZE - 1] = 0; tp->fw_ver[TG3_VER_SIZE - 1] = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment