aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2013-09-02 19:55:32 -0400
committerDavid S. Miller <davem@davemloft.net>2013-09-04 00:27:27 -0400
commit0b536be7b987de14dab63ea565fc1e271a7f3a5f (patch)
tree29be0d6b5cdc13e2db3e1e1c04d47fbfb36271a8
parentc67c71b4e8cf9cffc66b0a12f93b1c6b9cc1ea4f (diff)
ibmveth: Fix little endian issues
The hypervisor is big endian, so little endian kernel builds need to byteswap. Signed-off-by: Anton Blanchard <anton@samba.org> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/ibm/ibmveth.c4
-rw-r--r--drivers/net/ethernet/ibm/ibmveth.h19
2 files changed, 18 insertions, 5 deletions
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index 70fd55968844..5d41aee69d16 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -106,7 +106,7 @@ struct ibmveth_stat ibmveth_stats[] = {
106/* simple methods of getting data from the current rxq entry */ 106/* simple methods of getting data from the current rxq entry */
107static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter) 107static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter)
108{ 108{
109 return adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off; 109 return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off);
110} 110}
111 111
112static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter) 112static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter)
@@ -132,7 +132,7 @@ static inline int ibmveth_rxq_frame_offset(struct ibmveth_adapter *adapter)
132 132
133static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter) 133static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
134{ 134{
135 return adapter->rx_queue.queue_addr[adapter->rx_queue.index].length; 135 return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length);
136} 136}
137 137
138static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter) 138static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter)
diff --git a/drivers/net/ethernet/ibm/ibmveth.h b/drivers/net/ethernet/ibm/ibmveth.h
index 43a794fab9ff..84066bafe057 100644
--- a/drivers/net/ethernet/ibm/ibmveth.h
+++ b/drivers/net/ethernet/ibm/ibmveth.h
@@ -164,14 +164,26 @@ struct ibmveth_adapter {
164 u64 tx_send_failed; 164 u64 tx_send_failed;
165}; 165};
166 166
167/*
168 * We pass struct ibmveth_buf_desc_fields to the hypervisor in registers,
169 * so we don't need to byteswap the two elements. However since we use
170 * a union (ibmveth_buf_desc) to convert from the struct to a u64 we
171 * do end up with endian specific ordering of the elements and that
172 * needs correcting.
173 */
167struct ibmveth_buf_desc_fields { 174struct ibmveth_buf_desc_fields {
175#ifdef __BIG_ENDIAN
176 u32 flags_len;
177 u32 address;
178#else
179 u32 address;
168 u32 flags_len; 180 u32 flags_len;
181#endif
169#define IBMVETH_BUF_VALID 0x80000000 182#define IBMVETH_BUF_VALID 0x80000000
170#define IBMVETH_BUF_TOGGLE 0x40000000 183#define IBMVETH_BUF_TOGGLE 0x40000000
171#define IBMVETH_BUF_NO_CSUM 0x02000000 184#define IBMVETH_BUF_NO_CSUM 0x02000000
172#define IBMVETH_BUF_CSUM_GOOD 0x01000000 185#define IBMVETH_BUF_CSUM_GOOD 0x01000000
173#define IBMVETH_BUF_LEN_MASK 0x00FFFFFF 186#define IBMVETH_BUF_LEN_MASK 0x00FFFFFF
174 u32 address;
175}; 187};
176 188
177union ibmveth_buf_desc { 189union ibmveth_buf_desc {
@@ -180,7 +192,7 @@ union ibmveth_buf_desc {
180}; 192};
181 193
182struct ibmveth_rx_q_entry { 194struct ibmveth_rx_q_entry {
183 u32 flags_off; 195 __be32 flags_off;
184#define IBMVETH_RXQ_TOGGLE 0x80000000 196#define IBMVETH_RXQ_TOGGLE 0x80000000
185#define IBMVETH_RXQ_TOGGLE_SHIFT 31 197#define IBMVETH_RXQ_TOGGLE_SHIFT 31
186#define IBMVETH_RXQ_VALID 0x40000000 198#define IBMVETH_RXQ_VALID 0x40000000
@@ -188,7 +200,8 @@ struct ibmveth_rx_q_entry {
188#define IBMVETH_RXQ_CSUM_GOOD 0x01000000 200#define IBMVETH_RXQ_CSUM_GOOD 0x01000000
189#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF 201#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF
190 202
191 u32 length; 203 __be32 length;
204 /* correlator is only used by the OS, no need to byte swap */
192 u64 correlator; 205 u64 correlator;
193}; 206};
194 207