forked from luck/tmp_suning_uos_patched
tlan: Remove broken support for big buffers
The big rx/tx buffer support is broken and unlikely to be very useful as such. Remove it. Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
354ade9058
commit
5eeabf5150
@ -163,6 +163,11 @@
|
|||||||
* v1.15 Apr 4, 2002 - Correct operation when aui=1 to be
|
* v1.15 Apr 4, 2002 - Correct operation when aui=1 to be
|
||||||
* 10T half duplex no loopback
|
* 10T half duplex no loopback
|
||||||
* Thanks to Gunnar Eikman
|
* Thanks to Gunnar Eikman
|
||||||
|
*
|
||||||
|
* Sakari Ailus <sakari.ailus@iki.fi>:
|
||||||
|
*
|
||||||
|
* v1.15a Dec 15 2008 - Remove bbuf support, it doesn't work anyway.
|
||||||
|
*
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
@ -213,12 +218,8 @@ static int debug;
|
|||||||
module_param(debug, int, 0);
|
module_param(debug, int, 0);
|
||||||
MODULE_PARM_DESC(debug, "ThunderLAN debug mask");
|
MODULE_PARM_DESC(debug, "ThunderLAN debug mask");
|
||||||
|
|
||||||
static int bbuf;
|
|
||||||
module_param(bbuf, int, 0);
|
|
||||||
MODULE_PARM_DESC(bbuf, "ThunderLAN use big buffer (0-1)");
|
|
||||||
|
|
||||||
static const char TLanSignature[] = "TLAN";
|
static const char TLanSignature[] = "TLAN";
|
||||||
static const char tlan_banner[] = "ThunderLAN driver v1.15\n";
|
static const char tlan_banner[] = "ThunderLAN driver v1.15a\n";
|
||||||
static int tlan_have_pci;
|
static int tlan_have_pci;
|
||||||
static int tlan_have_eisa;
|
static int tlan_have_eisa;
|
||||||
|
|
||||||
@ -859,13 +860,8 @@ static int TLan_Init( struct net_device *dev )
|
|||||||
|
|
||||||
priv = netdev_priv(dev);
|
priv = netdev_priv(dev);
|
||||||
|
|
||||||
if ( bbuf ) {
|
dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
|
||||||
dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
|
* ( sizeof(TLanList) );
|
||||||
* ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE );
|
|
||||||
} else {
|
|
||||||
dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
|
|
||||||
* ( sizeof(TLanList) );
|
|
||||||
}
|
|
||||||
priv->dmaStorage = pci_alloc_consistent(priv->pciDev,
|
priv->dmaStorage = pci_alloc_consistent(priv->pciDev,
|
||||||
dma_size, &priv->dmaStorageDMA);
|
dma_size, &priv->dmaStorageDMA);
|
||||||
priv->dmaSize = dma_size;
|
priv->dmaSize = dma_size;
|
||||||
@ -881,16 +877,6 @@ static int TLan_Init( struct net_device *dev )
|
|||||||
priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
|
priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
|
||||||
priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS;
|
priv->txListDMA = priv->rxListDMA + sizeof(TLanList) * TLAN_NUM_RX_LISTS;
|
||||||
|
|
||||||
if ( bbuf ) {
|
|
||||||
priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
|
|
||||||
priv->rxBufferDMA =priv->txListDMA
|
|
||||||
+ sizeof(TLanList) * TLAN_NUM_TX_LISTS;
|
|
||||||
priv->txBuffer = priv->rxBuffer
|
|
||||||
+ ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
|
|
||||||
priv->txBufferDMA = priv->rxBufferDMA
|
|
||||||
+ ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
|
|
||||||
}
|
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
for ( i = 0; i < 6 ; i++ )
|
for ( i = 0; i < 6 ; i++ )
|
||||||
err |= TLan_EeReadByte( dev,
|
err |= TLan_EeReadByte( dev,
|
||||||
@ -1094,9 +1080,8 @@ static void TLan_tx_timeout_work(struct work_struct *work)
|
|||||||
static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
|
static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
|
||||||
{
|
{
|
||||||
TLanPrivateInfo *priv = netdev_priv(dev);
|
TLanPrivateInfo *priv = netdev_priv(dev);
|
||||||
TLanList *tail_list;
|
|
||||||
dma_addr_t tail_list_phys;
|
dma_addr_t tail_list_phys;
|
||||||
u8 *tail_buffer;
|
TLanList *tail_list;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int txlen;
|
unsigned int txlen;
|
||||||
|
|
||||||
@ -1125,15 +1110,10 @@ static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
|
|||||||
|
|
||||||
tail_list->forward = 0;
|
tail_list->forward = 0;
|
||||||
|
|
||||||
if ( bbuf ) {
|
tail_list->buffer[0].address = pci_map_single(priv->pciDev,
|
||||||
tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
|
skb->data, txlen,
|
||||||
skb_copy_from_linear_data(skb, tail_buffer, txlen);
|
PCI_DMA_TODEVICE);
|
||||||
} else {
|
TLan_StoreSKB(tail_list, skb);
|
||||||
tail_list->buffer[0].address = pci_map_single(priv->pciDev,
|
|
||||||
skb->data, txlen,
|
|
||||||
PCI_DMA_TODEVICE);
|
|
||||||
TLan_StoreSKB(tail_list, skb);
|
|
||||||
}
|
|
||||||
|
|
||||||
tail_list->frameSize = (u16) txlen;
|
tail_list->frameSize = (u16) txlen;
|
||||||
tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) txlen;
|
tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) txlen;
|
||||||
@ -1163,9 +1143,6 @@ static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
|
|||||||
|
|
||||||
CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
|
CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
|
||||||
|
|
||||||
if ( bbuf )
|
|
||||||
dev_kfree_skb_any(skb);
|
|
||||||
|
|
||||||
dev->trans_start = jiffies;
|
dev->trans_start = jiffies;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1429,17 +1406,16 @@ static u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
|
|||||||
head_list = priv->txList + priv->txHead;
|
head_list = priv->txList + priv->txHead;
|
||||||
|
|
||||||
while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
|
while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
|
||||||
|
struct sk_buff *skb = TLan_GetSKB(head_list);
|
||||||
|
|
||||||
ack++;
|
ack++;
|
||||||
if ( ! bbuf ) {
|
pci_unmap_single(priv->pciDev, head_list->buffer[0].address,
|
||||||
struct sk_buff *skb = TLan_GetSKB(head_list);
|
max(skb->len,
|
||||||
pci_unmap_single(priv->pciDev, head_list->buffer[0].address,
|
(unsigned int)TLAN_MIN_FRAME_SIZE),
|
||||||
max(skb->len,
|
PCI_DMA_TODEVICE);
|
||||||
(unsigned int)TLAN_MIN_FRAME_SIZE),
|
dev_kfree_skb_any(skb);
|
||||||
PCI_DMA_TODEVICE);
|
head_list->buffer[8].address = 0;
|
||||||
dev_kfree_skb_any(skb);
|
head_list->buffer[9].address = 0;
|
||||||
head_list->buffer[8].address = 0;
|
|
||||||
head_list->buffer[9].address = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( tmpCStat & TLAN_CSTAT_EOC )
|
if ( tmpCStat & TLAN_CSTAT_EOC )
|
||||||
eoc = 1;
|
eoc = 1;
|
||||||
@ -1549,7 +1525,6 @@ static u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
|
|||||||
TLanPrivateInfo *priv = netdev_priv(dev);
|
TLanPrivateInfo *priv = netdev_priv(dev);
|
||||||
u32 ack = 0;
|
u32 ack = 0;
|
||||||
int eoc = 0;
|
int eoc = 0;
|
||||||
u8 *head_buffer;
|
|
||||||
TLanList *head_list;
|
TLanList *head_list;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
TLanList *tail_list;
|
TLanList *tail_list;
|
||||||
@ -1564,53 +1539,33 @@ static u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
|
|||||||
while (((tmpCStat = head_list->cStat) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
|
while (((tmpCStat = head_list->cStat) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
|
||||||
dma_addr_t frameDma = head_list->buffer[0].address;
|
dma_addr_t frameDma = head_list->buffer[0].address;
|
||||||
u32 frameSize = head_list->frameSize;
|
u32 frameSize = head_list->frameSize;
|
||||||
|
struct sk_buff *new_skb;
|
||||||
|
|
||||||
ack++;
|
ack++;
|
||||||
if (tmpCStat & TLAN_CSTAT_EOC)
|
if (tmpCStat & TLAN_CSTAT_EOC)
|
||||||
eoc = 1;
|
eoc = 1;
|
||||||
|
|
||||||
if (bbuf) {
|
new_skb = netdev_alloc_skb(dev, TLAN_MAX_FRAME_SIZE + 7 );
|
||||||
skb = netdev_alloc_skb(dev, frameSize + 7);
|
if ( !new_skb )
|
||||||
if ( !skb )
|
goto drop_and_reuse;
|
||||||
goto drop_and_reuse;
|
|
||||||
|
|
||||||
head_buffer = priv->rxBuffer
|
skb = TLan_GetSKB(head_list);
|
||||||
+ (priv->rxHead * TLAN_MAX_FRAME_SIZE);
|
pci_unmap_single(priv->pciDev, frameDma,
|
||||||
skb_reserve(skb, 2);
|
TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
|
||||||
pci_dma_sync_single_for_cpu(priv->pciDev,
|
skb_put( skb, frameSize );
|
||||||
frameDma, frameSize,
|
|
||||||
PCI_DMA_FROMDEVICE);
|
|
||||||
skb_copy_from_linear_data(skb, head_buffer, frameSize);
|
|
||||||
skb_put(skb, frameSize);
|
|
||||||
dev->stats.rx_bytes += frameSize;
|
|
||||||
|
|
||||||
skb->protocol = eth_type_trans( skb, dev );
|
dev->stats.rx_bytes += frameSize;
|
||||||
netif_rx( skb );
|
|
||||||
} else {
|
|
||||||
struct sk_buff *new_skb;
|
|
||||||
|
|
||||||
new_skb = netdev_alloc_skb(dev, TLAN_MAX_FRAME_SIZE + 7 );
|
skb->protocol = eth_type_trans( skb, dev );
|
||||||
if ( !new_skb )
|
netif_rx( skb );
|
||||||
goto drop_and_reuse;
|
|
||||||
|
|
||||||
skb = TLan_GetSKB(head_list);
|
skb_reserve( new_skb, NET_IP_ALIGN );
|
||||||
pci_unmap_single(priv->pciDev, frameDma,
|
head_list->buffer[0].address = pci_map_single(priv->pciDev,
|
||||||
TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
|
new_skb->data,
|
||||||
skb_put( skb, frameSize );
|
TLAN_MAX_FRAME_SIZE,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
|
||||||
dev->stats.rx_bytes += frameSize;
|
TLan_StoreSKB(head_list, new_skb);
|
||||||
|
|
||||||
skb->protocol = eth_type_trans( skb, dev );
|
|
||||||
netif_rx( skb );
|
|
||||||
|
|
||||||
skb_reserve( new_skb, NET_IP_ALIGN );
|
|
||||||
head_list->buffer[0].address = pci_map_single(priv->pciDev,
|
|
||||||
new_skb->data,
|
|
||||||
TLAN_MAX_FRAME_SIZE,
|
|
||||||
PCI_DMA_FROMDEVICE);
|
|
||||||
|
|
||||||
TLan_StoreSKB(head_list, new_skb);
|
|
||||||
|
|
||||||
}
|
|
||||||
drop_and_reuse:
|
drop_and_reuse:
|
||||||
head_list->forward = 0;
|
head_list->forward = 0;
|
||||||
head_list->cStat = 0;
|
head_list->cStat = 0;
|
||||||
@ -1993,12 +1948,7 @@ static void TLan_ResetLists( struct net_device *dev )
|
|||||||
for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
|
for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
|
||||||
list = priv->txList + i;
|
list = priv->txList + i;
|
||||||
list->cStat = TLAN_CSTAT_UNUSED;
|
list->cStat = TLAN_CSTAT_UNUSED;
|
||||||
if ( bbuf ) {
|
list->buffer[0].address = 0;
|
||||||
list->buffer[0].address = priv->txBufferDMA
|
|
||||||
+ ( i * TLAN_MAX_FRAME_SIZE );
|
|
||||||
} else {
|
|
||||||
list->buffer[0].address = 0;
|
|
||||||
}
|
|
||||||
list->buffer[2].count = 0;
|
list->buffer[2].count = 0;
|
||||||
list->buffer[2].address = 0;
|
list->buffer[2].address = 0;
|
||||||
list->buffer[8].address = 0;
|
list->buffer[8].address = 0;
|
||||||
@ -2013,23 +1963,18 @@ static void TLan_ResetLists( struct net_device *dev )
|
|||||||
list->cStat = TLAN_CSTAT_READY;
|
list->cStat = TLAN_CSTAT_READY;
|
||||||
list->frameSize = TLAN_MAX_FRAME_SIZE;
|
list->frameSize = TLAN_MAX_FRAME_SIZE;
|
||||||
list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
|
list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
|
||||||
if ( bbuf ) {
|
skb = netdev_alloc_skb(dev, TLAN_MAX_FRAME_SIZE + 7 );
|
||||||
list->buffer[0].address = priv->rxBufferDMA
|
if ( !skb ) {
|
||||||
+ ( i * TLAN_MAX_FRAME_SIZE );
|
pr_err("TLAN: out of memory for received data.\n" );
|
||||||
} else {
|
break;
|
||||||
skb = netdev_alloc_skb(dev, TLAN_MAX_FRAME_SIZE + 7 );
|
|
||||||
if ( !skb ) {
|
|
||||||
pr_err("TLAN: out of memory for received data.\n" );
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
skb_reserve( skb, NET_IP_ALIGN );
|
|
||||||
list->buffer[0].address = pci_map_single(priv->pciDev,
|
|
||||||
skb->data,
|
|
||||||
TLAN_MAX_FRAME_SIZE,
|
|
||||||
PCI_DMA_FROMDEVICE);
|
|
||||||
TLan_StoreSKB(list, skb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skb_reserve( skb, NET_IP_ALIGN );
|
||||||
|
list->buffer[0].address = pci_map_single(priv->pciDev,
|
||||||
|
skb->data,
|
||||||
|
TLAN_MAX_FRAME_SIZE,
|
||||||
|
PCI_DMA_FROMDEVICE);
|
||||||
|
TLan_StoreSKB(list, skb);
|
||||||
list->buffer[1].count = 0;
|
list->buffer[1].count = 0;
|
||||||
list->buffer[1].address = 0;
|
list->buffer[1].address = 0;
|
||||||
list->forward = list_phys + sizeof(TLanList);
|
list->forward = list_phys + sizeof(TLanList);
|
||||||
@ -2052,35 +1997,33 @@ static void TLan_FreeLists( struct net_device *dev )
|
|||||||
TLanList *list;
|
TLanList *list;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
|
||||||
if ( ! bbuf ) {
|
for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
|
||||||
for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
|
list = priv->txList + i;
|
||||||
list = priv->txList + i;
|
skb = TLan_GetSKB(list);
|
||||||
skb = TLan_GetSKB(list);
|
if ( skb ) {
|
||||||
if ( skb ) {
|
pci_unmap_single(
|
||||||
pci_unmap_single(
|
priv->pciDev,
|
||||||
priv->pciDev,
|
list->buffer[0].address,
|
||||||
list->buffer[0].address,
|
max(skb->len,
|
||||||
max(skb->len,
|
(unsigned int)TLAN_MIN_FRAME_SIZE),
|
||||||
(unsigned int)TLAN_MIN_FRAME_SIZE),
|
PCI_DMA_TODEVICE);
|
||||||
PCI_DMA_TODEVICE);
|
dev_kfree_skb_any( skb );
|
||||||
dev_kfree_skb_any( skb );
|
list->buffer[8].address = 0;
|
||||||
list->buffer[8].address = 0;
|
list->buffer[9].address = 0;
|
||||||
list->buffer[9].address = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
|
for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
|
||||||
list = priv->rxList + i;
|
list = priv->rxList + i;
|
||||||
skb = TLan_GetSKB(list);
|
skb = TLan_GetSKB(list);
|
||||||
if ( skb ) {
|
if ( skb ) {
|
||||||
pci_unmap_single(priv->pciDev,
|
pci_unmap_single(priv->pciDev,
|
||||||
list->buffer[0].address,
|
list->buffer[0].address,
|
||||||
TLAN_MAX_FRAME_SIZE,
|
TLAN_MAX_FRAME_SIZE,
|
||||||
PCI_DMA_FROMDEVICE);
|
PCI_DMA_FROMDEVICE);
|
||||||
dev_kfree_skb_any( skb );
|
dev_kfree_skb_any( skb );
|
||||||
list->buffer[8].address = 0;
|
list->buffer[8].address = 0;
|
||||||
list->buffer[9].address = 0;
|
list->buffer[9].address = 0;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} /* TLan_FreeLists */
|
} /* TLan_FreeLists */
|
||||||
|
Loading…
Reference in New Issue
Block a user