aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/tlan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/tlan.c')
-rw-r--r--drivers/net/tlan.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c
index c14d2919c48a..aee2a458adc3 100644
--- a/drivers/net/tlan.c
+++ b/drivers/net/tlan.c
@@ -346,23 +346,21 @@ static void TLan_EeReceiveByte( u16, u8 *, int );
346static int TLan_EeReadByte( struct net_device *, u8, u8 * ); 346static int TLan_EeReadByte( struct net_device *, u8, u8 * );
347 347
348 348
349static void 349static inline void
350TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb) 350TLan_StoreSKB( struct tlan_list_tag *tag, struct sk_buff *skb)
351{ 351{
352 unsigned long addr = (unsigned long)skb; 352 unsigned long addr = (unsigned long)skb;
353 tag->buffer[9].address = (u32)addr; 353 tag->buffer[9].address = addr;
354 addr >>= 31; /* >>= 32 is undefined for 32bit arch, stupid C */ 354 tag->buffer[8].address = upper_32_bits(addr);
355 addr >>= 1;
356 tag->buffer[8].address = (u32)addr;
357} 355}
358 356
359static struct sk_buff * 357static inline struct sk_buff *
360TLan_GetSKB( struct tlan_list_tag *tag) 358TLan_GetSKB( const struct tlan_list_tag *tag)
361{ 359{
362 unsigned long addr = tag->buffer[8].address; 360 unsigned long addr;
363 addr <<= 31; 361
364 addr <<= 1; 362 addr = tag->buffer[8].address;
365 addr |= tag->buffer[9].address; 363 addr |= (tag->buffer[9].address << 16) << 16;
366 return (struct sk_buff *) addr; 364 return (struct sk_buff *) addr;
367} 365}
368 366
@@ -858,7 +856,8 @@ static int TLan_Init( struct net_device *dev )
858 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS ) 856 dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
859 * ( sizeof(TLanList) ); 857 * ( sizeof(TLanList) );
860 } 858 }
861 priv->dmaStorage = pci_alloc_consistent(priv->pciDev, dma_size, &priv->dmaStorageDMA); 859 priv->dmaStorage = pci_alloc_consistent(priv->pciDev,
860 dma_size, &priv->dmaStorageDMA);
862 priv->dmaSize = dma_size; 861 priv->dmaSize = dma_size;
863 862
864 if ( priv->dmaStorage == NULL ) { 863 if ( priv->dmaStorage == NULL ) {
@@ -867,11 +866,11 @@ static int TLan_Init( struct net_device *dev )
867 return -ENOMEM; 866 return -ENOMEM;
868 } 867 }
869 memset( priv->dmaStorage, 0, dma_size ); 868 memset( priv->dmaStorage, 0, dma_size );
870 priv->rxList = (TLanList *) 869 priv->rxList = (TLanList *) ALIGN((unsigned long)priv->dmaStorage, 8);
871 ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 ); 870 priv->rxListDMA = ALIGN(priv->dmaStorageDMA, 8);
872 priv->rxListDMA = ( ( ( (u32) priv->dmaStorageDMA ) + 7 ) & 0xFFFFFFF8 );
873 priv->txList = priv->rxList + TLAN_NUM_RX_LISTS; 871 priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
874 priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS; 872 priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS;
873
875 if ( bbuf ) { 874 if ( bbuf ) {
876 priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS ); 875 priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
877 priv->rxBufferDMA =priv->txListDMA + sizeof(TLanList) * TLAN_NUM_TX_LISTS; 876 priv->rxBufferDMA =priv->txListDMA + sizeof(TLanList) * TLAN_NUM_TX_LISTS;
@@ -1584,7 +1583,7 @@ static u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
1584 if ( new_skb != NULL ) { 1583 if ( new_skb != NULL ) {
1585 skb = TLan_GetSKB(head_list); 1584 skb = TLan_GetSKB(head_list);
1586 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE); 1585 pci_unmap_single(priv->pciDev, head_list->buffer[0].address, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1587 skb_trim( skb, frameSize ); 1586 skb_put( skb, frameSize );
1588 1587
1589 dev->stats.rx_bytes += frameSize; 1588 dev->stats.rx_bytes += frameSize;
1590 1589
@@ -1592,9 +1591,8 @@ static u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
1592 netif_rx( skb ); 1591 netif_rx( skb );
1593 1592
1594 skb_reserve( new_skb, 2 ); 1593 skb_reserve( new_skb, 2 );
1595 t = (void *) skb_put( new_skb, TLAN_MAX_FRAME_SIZE );
1596 head_list->buffer[0].address = pci_map_single(priv->pciDev, new_skb->data, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE); 1594 head_list->buffer[0].address = pci_map_single(priv->pciDev, new_skb->data, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
1597 head_list->buffer[8].address = (u32) t; 1595
1598 TLan_StoreSKB(head_list, new_skb); 1596 TLan_StoreSKB(head_list, new_skb);
1599 } else 1597 } else
1600 printk(KERN_WARNING "TLAN: Couldn't allocate memory for received data.\n" ); 1598 printk(KERN_WARNING "TLAN: Couldn't allocate memory for received data.\n" );
@@ -2003,10 +2001,8 @@ static void TLan_ResetLists( struct net_device *dev )
2003 } else { 2001 } else {
2004 skb->dev = dev; 2002 skb->dev = dev;
2005 skb_reserve( skb, 2 ); 2003 skb_reserve( skb, 2 );
2006 t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
2007 } 2004 }
2008 list->buffer[0].address = pci_map_single(priv->pciDev, t, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE); 2005 list->buffer[0].address = pci_map_single(priv->pciDev, t, TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
2009 list->buffer[8].address = (u32) t;
2010 TLan_StoreSKB(list, skb); 2006 TLan_StoreSKB(list, skb);
2011 } 2007 }
2012 list->buffer[1].count = 0; 2008 list->buffer[1].count = 0;
@@ -2108,7 +2104,7 @@ static void TLan_PrintList( TLanList *list, char *type, int num)
2108{ 2104{
2109 int i; 2105 int i;
2110 2106
2111 printk( "TLAN: %s List %d at 0x%08x\n", type, num, (u32) list ); 2107 printk( "TLAN: %s List %d at %p\n", type, num, list );
2112 printk( "TLAN: Forward = 0x%08x\n", list->forward ); 2108 printk( "TLAN: Forward = 0x%08x\n", list->forward );
2113 printk( "TLAN: CSTAT = 0x%04hx\n", list->cStat ); 2109 printk( "TLAN: CSTAT = 0x%04hx\n", list->cStat );
2114 printk( "TLAN: Frame Size = 0x%04hx\n", list->frameSize ); 2110 printk( "TLAN: Frame Size = 0x%04hx\n", list->frameSize );