diff options
author | Al Viro <viro@ftp.linux.org.uk> | 2007-12-16 15:53:36 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-01-28 18:07:08 -0500 |
commit | b710b43c306650261c01ad08100791afec78a7db (patch) | |
tree | 656c18e9d3736b84b56c1f91303c28207c424951 /drivers/net/tokenring | |
parent | f5a3ea6f966700ae82504202fdd827f2d3c79e66 (diff) |
endianness annotations and fixes for olympic
* missing braces in !readl(...) & ...
* trivial endianness annotations
* in olympic_arb_cmd() the loop collecting fragments of
packet is b0rken on big-endian - we have
(next_ptr && (buf_ptr=olympic_priv->olympic_lap + ntohs(next_ptr)))
as condition and it should have swab16(), not ntohs() - it's host-endian
byteswapped, not big-endian. So if we get more than one fragment on big-endian
host, we get screwed.
This ntohs() got missed back when the rest of those had been switched
to swab16() in 2.4.0-test2-pre1 - at a guess, nobody had hit fragmented
packets during the testing of PPC fixes.
PS: Ken Aaker cc'd on assumption that he is the same guy who'd done the
original set of PPC fixes in olympic
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/tokenring')
-rw-r--r-- | drivers/net/tokenring/olympic.c | 10 | ||||
-rw-r--r-- | drivers/net/tokenring/olympic.h | 18 |
2 files changed, 14 insertions, 14 deletions
diff --git a/drivers/net/tokenring/olympic.c b/drivers/net/tokenring/olympic.c index 74c1f0f189f5..e7b4adc5c4e7 100644 --- a/drivers/net/tokenring/olympic.c +++ b/drivers/net/tokenring/olympic.c | |||
@@ -357,7 +357,7 @@ static int __devinit olympic_init(struct net_device *dev) | |||
357 | 357 | ||
358 | if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) { | 358 | if(!(readl(olympic_mmio+BCTL) & BCTL_MODE_INDICATOR)) { |
359 | t=jiffies; | 359 | t=jiffies; |
360 | while (!readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE) { | 360 | while (!(readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE)) { |
361 | schedule() ; | 361 | schedule() ; |
362 | if(time_after(jiffies, t + 2*HZ)) { | 362 | if(time_after(jiffies, t + 2*HZ)) { |
363 | printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; | 363 | printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; |
@@ -671,7 +671,7 @@ static int olympic_open(struct net_device *dev) | |||
671 | 671 | ||
672 | writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */ | 672 | writel(BMCTL_TX1_DIS,olympic_mmio+BMCTL_RWM); /* Yes, this enables TX channel 1 */ |
673 | for(i=0;i<OLYMPIC_TX_RING_SIZE;i++) | 673 | for(i=0;i<OLYMPIC_TX_RING_SIZE;i++) |
674 | olympic_priv->olympic_tx_ring[i].buffer=0xdeadbeef; | 674 | olympic_priv->olympic_tx_ring[i].buffer=cpu_to_le32(0xdeadbeef); |
675 | 675 | ||
676 | olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE; | 676 | olympic_priv->free_tx_ring_entries=OLYMPIC_TX_RING_SIZE; |
677 | olympic_priv->tx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_tx_ring, | 677 | olympic_priv->tx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_tx_ring, |
@@ -897,7 +897,7 @@ static void olympic_freemem(struct net_device *dev) | |||
897 | dev_kfree_skb_irq(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]); | 897 | dev_kfree_skb_irq(olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received]); |
898 | olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] = NULL; | 898 | olympic_priv->rx_ring_skb[olympic_priv->rx_status_last_received] = NULL; |
899 | } | 899 | } |
900 | if (olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer != 0xdeadbeef) { | 900 | if (olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer != cpu_to_le32(0xdeadbeef)) { |
901 | pci_unmap_single(olympic_priv->pdev, | 901 | pci_unmap_single(olympic_priv->pdev, |
902 | le32_to_cpu(olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer), | 902 | le32_to_cpu(olympic_priv->olympic_rx_ring[olympic_priv->rx_status_last_received].buffer), |
903 | olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE); | 903 | olympic_priv->pkt_buf_sz, PCI_DMA_FROMDEVICE); |
@@ -983,7 +983,7 @@ static irqreturn_t olympic_interrupt(int irq, void *dev_id) | |||
983 | le32_to_cpu(olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer), | 983 | le32_to_cpu(olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer), |
984 | olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len,PCI_DMA_TODEVICE); | 984 | olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]->len,PCI_DMA_TODEVICE); |
985 | dev_kfree_skb_irq(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]); | 985 | dev_kfree_skb_irq(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]); |
986 | olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=0xdeadbeef; | 986 | olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=cpu_to_le32(0xdeadbeef); |
987 | olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0; | 987 | olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0; |
988 | } | 988 | } |
989 | netif_wake_queue(dev); | 989 | netif_wake_queue(dev); |
@@ -1432,7 +1432,7 @@ static void olympic_arb_cmd(struct net_device *dev) | |||
1432 | buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); | 1432 | buffer_len = swab16(readw(buf_ptr+offsetof(struct mac_receive_buffer,buffer_length))); |
1433 | memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ; | 1433 | memcpy_fromio(skb_put(mac_frame, buffer_len), frame_data , buffer_len ) ; |
1434 | next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); | 1434 | next_ptr=readw(buf_ptr+offsetof(struct mac_receive_buffer,next)); |
1435 | } while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + ntohs(next_ptr))); | 1435 | } while (next_ptr && (buf_ptr=olympic_priv->olympic_lap + swab16(next_ptr))); |
1436 | 1436 | ||
1437 | mac_frame->protocol = tr_type_trans(mac_frame, dev); | 1437 | mac_frame->protocol = tr_type_trans(mac_frame, dev); |
1438 | 1438 | ||
diff --git a/drivers/net/tokenring/olympic.h b/drivers/net/tokenring/olympic.h index 2fc59c997468..c91956310fb2 100644 --- a/drivers/net/tokenring/olympic.h +++ b/drivers/net/tokenring/olympic.h | |||
@@ -216,31 +216,31 @@ | |||
216 | /* xxxx These structures are all little endian in hardware. */ | 216 | /* xxxx These structures are all little endian in hardware. */ |
217 | 217 | ||
218 | struct olympic_tx_desc { | 218 | struct olympic_tx_desc { |
219 | u32 buffer; | 219 | __le32 buffer; |
220 | u32 status_length; | 220 | __le32 status_length; |
221 | }; | 221 | }; |
222 | 222 | ||
223 | struct olympic_tx_status { | 223 | struct olympic_tx_status { |
224 | u32 status; | 224 | __le32 status; |
225 | }; | 225 | }; |
226 | 226 | ||
227 | struct olympic_rx_desc { | 227 | struct olympic_rx_desc { |
228 | u32 buffer; | 228 | __le32 buffer; |
229 | u32 res_length; | 229 | __le32 res_length; |
230 | }; | 230 | }; |
231 | 231 | ||
232 | struct olympic_rx_status { | 232 | struct olympic_rx_status { |
233 | u32 fragmentcnt_framelen; | 233 | __le32 fragmentcnt_framelen; |
234 | u32 status_buffercnt; | 234 | __le32 status_buffercnt; |
235 | }; | 235 | }; |
236 | /* xxxx END These structures are all little endian in hardware. */ | 236 | /* xxxx END These structures are all little endian in hardware. */ |
237 | /* xxxx There may be more, but I'm pretty sure about these */ | 237 | /* xxxx There may be more, but I'm pretty sure about these */ |
238 | 238 | ||
239 | struct mac_receive_buffer { | 239 | struct mac_receive_buffer { |
240 | u16 next ; | 240 | __le16 next ; |
241 | u8 padding ; | 241 | u8 padding ; |
242 | u8 frame_status ; | 242 | u8 frame_status ; |
243 | u16 buffer_length ; | 243 | __le16 buffer_length ; |
244 | u8 frame_data ; | 244 | u8 frame_data ; |
245 | }; | 245 | }; |
246 | 246 | ||