aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAl Viro <viro@ftp.linux.org.uk>2007-12-16 15:53:36 -0500
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:07:08 -0500
commitb710b43c306650261c01ad08100791afec78a7db (patch)
tree656c18e9d3736b84b56c1f91303c28207c424951 /drivers/net
parentf5a3ea6f966700ae82504202fdd827f2d3c79e66 (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')
-rw-r--r--drivers/net/tokenring/olympic.c10
-rw-r--r--drivers/net/tokenring/olympic.h18
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
218struct olympic_tx_desc { 218struct olympic_tx_desc {
219 u32 buffer; 219 __le32 buffer;
220 u32 status_length; 220 __le32 status_length;
221}; 221};
222 222
223struct olympic_tx_status { 223struct olympic_tx_status {
224 u32 status; 224 __le32 status;
225}; 225};
226 226
227struct olympic_rx_desc { 227struct olympic_rx_desc {
228 u32 buffer; 228 __le32 buffer;
229 u32 res_length; 229 __le32 res_length;
230}; 230};
231 231
232struct olympic_rx_status { 232struct 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
239struct mac_receive_buffer { 239struct 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