diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2008-01-03 18:49:00 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-04 00:47:04 -0800 |
commit | e5e025401f6e926c1d9dc3f3f2813cf98a2d8708 (patch) | |
tree | 0d682965be7d1582c49570f4199b5d4a9b8a1891 /drivers/net/cassini.h | |
parent | 2d60abc2a937bf77575c3b8c83faeeb84a84e654 (diff) | |
download | op-kernel-dev-e5e025401f6e926c1d9dc3f3f2813cf98a2d8708.zip op-kernel-dev-e5e025401f6e926c1d9dc3f3f2813cf98a2d8708.tar.gz |
[CASSINI]: Fix endianness bug.
Here's proposed fix for RX checksum handling in cassini; it affects
little-endian working with half-duplex gigabit, but obviously needs
testing on big-endian too.
The problem is, we need to convert checksum to fixed-endian *before*
correcting for (unstripped) FCS. On big-endian it won't matter
(conversion is no-op), on little-endian it will, but only if FCS is
not stripped by hardware; i.e. in half-duplex gigabit mode when
->crc_size is set.
cassini.c part is that fix, cassini.h one consists of trivial
endianness annotations. With that applied the sucker is endian-clean,
according to sparse.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cassini.h')
-rw-r--r-- | drivers/net/cassini.h | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/net/cassini.h b/drivers/net/cassini.h index 2f93f83..552af89 100644 --- a/drivers/net/cassini.h +++ b/drivers/net/cassini.h @@ -4122,8 +4122,8 @@ cas_saturn_patch_t cas_saturn_patch[] = { inserted into outgoing frame. */ struct cas_tx_desc { - u64 control; - u64 buffer; + __le64 control; + __le64 buffer; }; /* descriptor ring for free buffers contains page-sized buffers. the index @@ -4131,8 +4131,8 @@ struct cas_tx_desc { * the completion ring. */ struct cas_rx_desc { - u64 index; - u64 buffer; + __le64 index; + __le64 buffer; }; /* received packets are put on the completion ring. */ @@ -4210,10 +4210,10 @@ struct cas_rx_desc { #define RX_INDEX_RELEASE 0x0000000000002000ULL struct cas_rx_comp { - u64 word1; - u64 word2; - u64 word3; - u64 word4; + __le64 word1; + __le64 word2; + __le64 word3; + __le64 word4; }; enum link_state { @@ -4252,7 +4252,7 @@ struct cas_init_block { struct cas_rx_comp rxcs[N_RX_COMP_RINGS][INIT_BLOCK_RX_COMP]; struct cas_rx_desc rxds[N_RX_DESC_RINGS][INIT_BLOCK_RX_DESC]; struct cas_tx_desc txds[N_TX_RINGS][INIT_BLOCK_TX]; - u64 tx_compwb; + __le64 tx_compwb; }; /* tiny buffers to deal with target abort issue. we allocate a bit |