From: Francois Romieu <romieu@cogenit.fr>
To: Jeff Garzik <jgarzik@mandrakesoft.com>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 6/10
Date: Sun, 30 Jun 2002 17:19:38 +0200 [thread overview]
Message-ID: <20020630171938.H19347@fafner.intra.cogenit.fr> (raw)
In-Reply-To: <3D17743E.8060905@mandrakesoft.com>; from jgarzik@mandrakesoft.com on Mon, Jun 24, 2002 at 03:34:22PM -0400
- TLAN Rx/Tx buffers virt_to_bus -> pci_map_single conversion.
--- linux-2.5.24/drivers/net/tlan.h Sat Jun 29 23:09:21 2002
+++ linux-2.5.24/drivers/net/tlan.h Sat Jun 29 23:42:28 2002
@@ -41,6 +41,7 @@
#define TLAN_NUM_RX_LISTS 32
#define TLAN_NUM_TX_LISTS 64
+#define TLAN_NUM_ALL_LISTS (TLAN_NUM_RX_LISTS+TLAN_NUM_TX_LISTS)
#define TLAN_IGNORE 0
#define TLAN_RECORD 1
@@ -169,6 +170,8 @@ typedef u8 TLanBuffer[TLAN_MAX_FRAME_SIZ
typedef struct tlan_private_tag {
struct pci_dev *pci_dev;
+ dma_addr_t rxBuffer_dma;
+ dma_addr_t txBuffer_dma;
struct net_device *nextDevice;
void *dmaStorage;
u8 *padBuffer;
--- linux-2.5.24/drivers/net/tlan.c Sat Jun 29 23:19:12 2002
+++ linux-2.5.24/drivers/net/tlan.c Sat Jun 29 23:49:46 2002
@@ -298,6 +298,7 @@ static void TLan_tx_timeout( struct net_
static int tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent);
static void TLan_ResetTxBuffer(struct pci_dev *, TLanList *);
static void TLan_ResetRxBuffer(struct pci_dev *, TLanList *);
+static void TLan_ReleaseBuffers(struct pci_dev *, TLanPrivateInfo *);
static void TLan_Release_Dev(struct net_device *);
static u32 TLan_HandleInvalid( struct net_device *, u16 );
@@ -624,12 +625,24 @@ err_out:
return ret;
}
+static void TLan_ReleaseBuffers(struct pci_dev *pdev, TLanPrivateInfo *priv)
+{
+ pci_unmap_single(pdev, priv->rxBuffer_dma,
+ TLAN_NUM_RX_LISTS*TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
+ pci_unmap_single(pdev, priv->txBuffer_dma,
+ TLAN_NUM_TX_LISTS*TLAN_MAX_FRAME_SIZE, PCI_DMA_TODEVICE);
+ kfree(priv->rxBuffer);
+}
+
static void TLan_Release_Dev(struct net_device *dev)
{
TLanPrivateInfo *priv = dev->priv;
+ struct pci_dev *pdev = priv->pci_dev;
if (priv->dmaStorage)
kfree(priv->dmaStorage);
+ if ( bbuf )
+ TLan_ReleaseBuffers(pdev, priv);
release_region(dev->base_addr, 0x10);
unregister_netdev(dev);
}
@@ -784,12 +797,12 @@ static void __init TLan_EisaProbe (void
static int TLan_Init( struct net_device *dev )
{
+ TLanPrivateInfo *priv = dev->priv;
+ struct pci_dev *pdev = priv->pci_dev;
+ void *addr;
int dma_size;
int err;
int i;
- TLanPrivateInfo *priv;
-
- priv = dev->priv;
if (!priv->is_eisa) /* EISA devices have already requested IO */
if (!request_region( dev->base_addr, 0x10, TLanSignature )) {
@@ -819,9 +832,24 @@ static int TLan_Init( struct net_device
( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 );
priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
if ( bbuf ) {
- priv->rxBuffer = (u8 *) ( priv->txList + TLAN_NUM_TX_LISTS );
- priv->txBuffer = priv->rxBuffer
- + ( TLAN_NUM_RX_LISTS * TLAN_MAX_FRAME_SIZE );
+ dma_size = TLAN_NUM_ALL_LISTS * TLAN_MAX_FRAME_SIZE;
+ addr = kmalloc(dma_size, GFP_KERNEL | GFP_DMA);
+ if ( addr == NULL ) {
+ printk(KERN_ERR "%s: buffers allocation failed\n",
+ dev->name );
+ release_region( dev->base_addr, 0x10 );
+ return -ENOMEM;
+ }
+ memset(addr, 0, dma_size );
+ priv->rxBuffer = (u8 *)addr;
+ priv->rxBuffer_dma = pci_map_single(pdev, addr,
+ TLAN_NUM_RX_LISTS*TLAN_MAX_FRAME_SIZE,
+ PCI_DMA_FROMDEVICE);
+ priv->txBuffer = priv->rxBuffer +
+ TLAN_NUM_RX_LISTS*TLAN_MAX_FRAME_SIZE;
+ priv->txBuffer_dma = pci_map_single(pdev, priv->txBuffer,
+ TLAN_NUM_TX_LISTS*TLAN_MAX_FRAME_SIZE,
+ PCI_DMA_TODEVICE);
}
err = 0;
@@ -1024,6 +1052,9 @@ static int TLan_StartTx( struct sk_buff
if ( bbuf ) {
tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
memcpy( tail_buffer, skb->data, skb->len );
+ pci_dma_sync_single(pdev, priv->txBuffer_dma +
+ priv->txTail*TLAN_MAX_FRAME_SIZE,
+ skb->len, PCI_DMA_TODEVICE);
} else {
tail_list->buffer[0].address = pci_map_single(pdev, skb->data,
skb->len, PCI_DMA_TODEVICE);
@@ -1488,6 +1519,9 @@ u32 TLan_HandleRxEOF( struct net_device
priv->stats.rx_bytes += head_list->frameSize;
+ pci_dma_sync_single(pdev, priv->rxBuffer_dma +
+ priv->rxHead*TLAN_MAX_FRAME_SIZE,
+ frameSize, PCI_DMA_FROMDEVICE);
memcpy( t, head_buffer, frameSize );
skb->protocol = eth_type_trans( skb, dev );
netif_rx( skb );
@@ -1901,7 +1935,7 @@ void TLan_ResetLists( struct net_device
list = priv->txList + i;
list->cStat = TLAN_CSTAT_UNUSED;
if ( bbuf ) {
- list->buffer[0].address = virt_to_bus( priv->txBuffer + ( i * TLAN_MAX_FRAME_SIZE ) );
+ list->buffer[0].address = priv->rxBuffer_dma + (i * TLAN_MAX_FRAME_SIZE);
} else {
list->buffer[0].address = 0;
}
@@ -1918,7 +1952,7 @@ void TLan_ResetLists( struct net_device
list->frameSize = TLAN_MAX_FRAME_SIZE;
list->buffer[0].count = TLAN_MAX_FRAME_SIZE | TLAN_LAST_BUFFER;
if ( bbuf ) {
- list->buffer[0].address = virt_to_bus( priv->rxBuffer + ( i * TLAN_MAX_FRAME_SIZE ) );
+ list->buffer[0].address = priv->rxBuffer_dma + (i * TLAN_MAX_FRAME_SIZE);
} else {
skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
if ( skb == NULL ) {
next prev parent reply other threads:[~2002-06-30 15:18 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-06-24 2:34 [PATCH] 2.5.24 : drivers/net/tlan.c Frank Davis
2002-06-24 6:43 ` Francois Romieu
2002-06-24 19:14 ` [PATCH] 2.5.24 : drivers/net/tlan.c; drivers/net/rrunner.c Francois Romieu
2002-06-24 19:34 ` Jeff Garzik
2002-06-24 20:59 ` Dave Jones
2002-06-30 15:18 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 0/10 Francois Romieu
2002-06-30 15:18 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 1/10 Francois Romieu
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 2/10 Francois Romieu
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 3/10 Francois Romieu
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 4/10 Francois Romieu
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 5/10 Francois Romieu
2002-06-30 15:19 ` Francois Romieu [this message]
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 7/10 Francois Romieu
2002-06-30 15:19 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 8/10 Francois Romieu
2002-06-30 15:20 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 9/10 Francois Romieu
2002-06-30 15:20 ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 10/10 Francois Romieu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020630171938.H19347@fafner.intra.cogenit.fr \
--to=romieu@cogenit.fr \
--cc=jgarzik@mandrakesoft.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®