public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] 2.5.24 : drivers/net/tlan.c
@ 2002-06-24  2:34 Frank Davis
  2002-06-24  6:43 ` Francois Romieu
  0 siblings, 1 reply; 16+ messages in thread
From: Frank Davis @ 2002-06-24  2:34 UTC (permalink / raw)
  To: linux-kernel; +Cc: fdavis

Hello all,
  This patch adds the check for 32-bit DMA capability for the tlan driver. 
This is the first step for Documentation/DMA-mapping.txt compliance. As 
for the preferred action if the driver fails on pci_set_dma_mask(), I plan 
to add that in a future patch. Please review. 
Regards,
Frank

--- drivers/net/tlan.c.old	Sun May 26 14:37:35 2002
+++ drivers/net/tlan.c	Sun Jun 23 22:15:30 2002
@@ -516,6 +516,10 @@
 
 	if (pdev && pci_enable_device(pdev))
 		return -EIO;
+	if(pci_set_dma_mask(pdev, 0xffffffff))
+	{
+		printk(KERN_WARNING "tlan : No suitable DMA available.\n");
+	}
 
 	dev = init_etherdev(NULL, sizeof(TLanPrivateInfo));
 	if (dev == NULL) {


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] 2.5.24 : drivers/net/tlan.c
  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
  0 siblings, 1 reply; 16+ messages in thread
From: Francois Romieu @ 2002-06-24  6:43 UTC (permalink / raw)
  To: Frank Davis; +Cc: linux-kernel

Re,

Frank Davis <fdavis@si.rr.com> :
> Hello all,
>   This patch adds the check for 32-bit DMA capability for the tlan driver. 
> This is the first step for Documentation/DMA-mapping.txt compliance. As 
> for the preferred action if the driver fails on pci_set_dma_mask(), I plan 
> to add that in a future patch. Please review. 

See comment regarding scsi drivers.

I've done some work for this one and rrunner around 2.4.7. Give me 24h to
dig the mail archive and see what the missing parts/problems were, ok ?

Btw, you may Cc:jgarzik@mandrakesoft.com as well as the adequate maintainer
if there's one.

-- 
Ueimor

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] 2.5.24 : drivers/net/tlan.c; drivers/net/rrunner.c
  2002-06-24  6:43 ` Francois Romieu
@ 2002-06-24 19:14   ` Francois Romieu
  2002-06-24 19:34     ` Jeff Garzik
  0 siblings, 1 reply; 16+ messages in thread
From: Francois Romieu @ 2002-06-24 19:14 UTC (permalink / raw)
  To: Frank Davis; +Cc: linux-kernel, Jes Sorensen, jgarzik

[-- Attachment #1: Type: text/plain, Size: 451 bytes --]

Greetings,

[remaining DMA-mapping conversion in drivers/net]

- tlan plays isa/pci and does as well some interesting things with copy
  buffers. The patch is attached but I'll feel safer if somebody with 
  the adequate hardware at hand appears.
- Imho rrunner wouldn't suffer from compat code removal + pci driver init 
  style + DMA mapping conversion. I'd like to know what the maintainer
  thinks before resurrecting the patch. Jes ?

-- 
Ueimor

[-- Attachment #2: tlan-S2.bz2 --]
[-- Type: application/x-bzip2, Size: 5279 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] 2.5.24 : drivers/net/tlan.c; drivers/net/rrunner.c
  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
                         ` (11 more replies)
  0 siblings, 12 replies; 16+ messages in thread
From: Jeff Garzik @ 2002-06-24 19:34 UTC (permalink / raw)
  To: Francois Romieu; +Cc: Frank Davis, linux-kernel, Jes Sorensen, davej

Francois Romieu wrote:
> Greetings,
> 
> [remaining DMA-mapping conversion in drivers/net]
> 
> - tlan plays isa/pci and does as well some interesting things with copy
>   buffers. The patch is attached but I'll feel safer if somebody with 
>   the adequate hardware at hand appears.

I've got some tlan cards

> - Imho rrunner wouldn't suffer from compat code removal + pci driver init 
>   style + DMA mapping conversion. I'd like to know what the maintainer
>   thinks before resurrecting the patch. Jes ?

Just make sure you split it up... one of the reasons why I have stalled 
applying davej's 2.4.x->2.5.x rrunner patch is that it's pretty darn 
huge, even though the changes are fairly minor.  (nothing against davej, 
of course)

	Jeff



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH] 2.5.24 : drivers/net/tlan.c; drivers/net/rrunner.c
  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
                         ` (10 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Dave Jones @ 2002-06-24 20:59 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: Francois Romieu, Frank Davis, linux-kernel, Jes Sorensen

On Mon, Jun 24, 2002 at 03:34:22PM -0400, Jeff Garzik wrote:
 > Just make sure you split it up... one of the reasons why I have stalled 
 > applying davej's 2.4.x->2.5.x rrunner patch is that it's pretty darn 
 > huge, even though the changes are fairly minor.  (nothing against davej, 
 > of course)

There are a few net drivers just like that, which have seen quite a bit
of development in 2.4.  Over time, it's possible the authors of the
drivers will submit stuff through you (or to Linus) bit by bit.
At which point, what's in my tree only serves as a "oh, you missed
this bit" service.

        Dave

-- 
| Dave Jones.        http://www.codemonkey.org.uk
| SuSE Labs

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 0/10
  2002-06-24 19:34     ` Jeff Garzik
  2002-06-24 20:59       ` Dave Jones
@ 2002-06-30 15:18       ` Francois Romieu
  2002-06-30 15:18       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 1/10 Francois Romieu
                         ` (9 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:18 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- missing include and #error removal in order to compile.

--- linux-2.5.24/drivers/net/tlan.h	Sun Jun  9 07:28:44 2002
+++ linux-2.5.24/drivers/net/tlan.h	Sat Jun 29 21:59:54 2002
@@ -25,7 +25,7 @@
 #include <asm/io.h>
 #include <asm/types.h>
 #include <linux/netdevice.h>
-
+#include <linux/tqueue.h>
 
 
 	/*****************************************************************
--- linux-2.5.24/drivers/net/tlan.c	Sun Jun  9 07:27:29 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 21:59:16 2002
@@ -166,8 +166,6 @@
  *	                       Thanks to Gunnar Eikman
  *******************************************************************************/
 
-#error Please convert me to Documentation/DMA-mapping.txt
-                                                                                
 #include <linux/module.h>
 
 #include "tlan.h"

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 1/10
  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       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 2/10 Francois Romieu
                         ` (8 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:18 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- removal of code duplication.

--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 21:59:16 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:01:37 2002
@@ -295,6 +295,7 @@ static int	TLan_ioctl( struct net_device
 static int      TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent);
 static void	TLan_tx_timeout( struct net_device *dev);
 static int 	tlan_init_one( struct pci_dev *pdev, const struct pci_device_id *ent);
+static void	TLan_Release_Dev(struct net_device *);
 
 static u32	TLan_HandleInvalid( struct net_device *, u16 );
 static u32	TLan_HandleTxEOF( struct net_device *, u16 );
@@ -415,18 +416,8 @@ TLan_SetTimer( struct net_device *dev, u
 static void __devexit tlan_remove_one( struct pci_dev *pdev)
 {
 	struct net_device *dev = pci_get_drvdata( pdev );
-	TLanPrivateInfo	*priv = dev->priv;
-	
-	unregister_netdev( dev );
-
-	if ( priv->dmaStorage ) {
-		kfree( priv->dmaStorage );
-	}
-
-	release_region( dev->base_addr, 0x10 );
-	
-	kfree( dev );
 		
+	TLan_Release_Dev(dev);	
 	pci_set_drvdata( pdev, NULL );
 } 
 
@@ -627,23 +618,25 @@ static int __devinit TLan_probe1(struct 
 
 }
 
+static void TLan_Release_Dev(struct net_device *dev)
+{
+	TLanPrivateInfo *priv = dev->priv;
+
+	if (priv->dmaStorage)
+		kfree(priv->dmaStorage);
+	release_region(dev->base_addr, 0x10);
+	unregister_netdev(dev);
+}
 
 static void TLan_Eisa_Cleanup(void)
 {
-	struct net_device *dev;
-	TLanPrivateInfo *priv;
+	for (; tlan_have_eisa; tlan_have_eisa--) {
+		struct net_device *dev = TLan_Eisa_Devices;
+		TLanPrivateInfo *priv = dev->priv;
 	
-	while( tlan_have_eisa ) {
-		dev = TLan_Eisa_Devices;
-		priv = dev->priv;
-		if (priv->dmaStorage) {
-			kfree(priv->dmaStorage);
-		}
-		release_region( dev->base_addr, 0x10);
-		unregister_netdev( dev );
+		TLan_Release_Dev(dev);
 		TLan_Eisa_Devices = priv->nextDevice;
 		kfree( dev );
-		tlan_have_eisa--;
 	}
 }
 	

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 2/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (2 preceding siblings ...)
  2002-06-30 15:18       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 1/10 Francois Romieu
@ 2002-06-30 15:19       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 3/10 Francois Romieu
                         ` (7 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- TLAN pad buffer virt_to_bus -> pci_map_single conversion.

--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:06:32 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:12:10 2002
@@ -215,6 +215,7 @@ MODULE_PARM_DESC(bbuf, "ThunderLAN use b
 static  int		debug;
 
 static	int		bbuf;
+static	dma_addr_t	TLanPadBuffer_dma;
 static	u8		*TLanPadBuffer;
 static	char		TLanSignature[] = "TLAN";
 static const char tlan_banner[] = "ThunderLAN driver v1.15\n";
@@ -441,6 +442,9 @@ static int __init tlan_probe(void)
 		printk(KERN_ERR "TLAN: Could not allocate memory for pad buffer.\n");
 		return -ENOMEM;
 	}
+	TLanPadBuffer_dma = pci_map_single(NULL, TLanPadBuffer,
+		TLAN_MIN_FRAME_SIZE, PCI_DMA_TODEVICE);
+
 
 	memset(TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE);
 	pad_allocated = 1;
@@ -647,6 +651,8 @@ static void __exit tlan_exit(void)
 
 	if (tlan_have_eisa)
 		TLan_Eisa_Cleanup();
+	pci_unmap_single(NULL, TLanPadBuffer_dma, TLAN_MIN_FRAME_SIZE,
+		PCI_DMA_TODEVICE);
 
 	kfree( TLanPadBuffer );
 
@@ -1026,7 +1032,7 @@ static int TLan_StartTx( struct sk_buff 
 		tail_list->frameSize = (u16) skb->len + pad;
 		tail_list->buffer[0].count = (u32) skb->len;
 		tail_list->buffer[1].count = TLAN_LAST_BUFFER | (u32) pad;
-		tail_list->buffer[1].address = virt_to_bus( TLanPadBuffer );
+		tail_list->buffer[1].address = TLanPadBuffer_dma;
 	} else {
 		tail_list->frameSize = (u16) skb->len;
 		tail_list->buffer[0].count = TLAN_LAST_BUFFER | (u32) skb->len;

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 3/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (3 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 2/10 Francois Romieu
@ 2002-06-30 15:19       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 4/10 Francois Romieu
                         ` (6 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- (cosmetic) removal of unused variable (pad_allocated);
- (cosmetic) gotoize error paths in TLan_probe1. Extra benefit: code gets 
  correctly indented again.

--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:15:10 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:25:22 2002
@@ -431,12 +431,9 @@ static struct pci_driver tlan_driver = {
 
 static int __init tlan_probe(void)
 {
-	static int	pad_allocated;
-	
 	printk(KERN_INFO "%s", tlan_banner);
 	
-	TLanPadBuffer = (u8 *) kmalloc(TLAN_MIN_FRAME_SIZE, 
-					GFP_KERNEL);
+	TLanPadBuffer = (u8 *) kmalloc(TLAN_MIN_FRAME_SIZE, GFP_KERNEL);
 
 	if (TLanPadBuffer == NULL) {
 		printk(KERN_ERR "TLAN: Could not allocate memory for pad buffer.\n");
@@ -447,7 +444,6 @@ static int __init tlan_probe(void)
 
 
 	memset(TLanPadBuffer, 0, TLAN_MIN_FRAME_SIZE);
-	pad_allocated = 1;
 
 	TLAN_DBG(TLAN_DEBUG_PROBE, "Starting PCI Probe....\n");
 	
@@ -505,7 +501,7 @@ static int __devinit TLan_probe1(struct 
 	TLanPrivateInfo    *priv;
 	u8		   pci_rev;
 	u16		   device_id;
-	int		   reg;
+	int		   reg, ret;
 
 	if (pdev && pci_enable_device(pdev))
 		return -EIO;
@@ -513,7 +509,8 @@ static int __devinit TLan_probe1(struct 
 	dev = init_etherdev(NULL, sizeof(TLanPrivateInfo));
 	if (dev == NULL) {
 		printk(KERN_ERR "TLAN: Could not allocate memory for device.\n");
-		return -ENOMEM;
+		ret = -ENOMEM;
+		goto err_out;
 	}
 	SET_MODULE_OWNER(dev);
 	
@@ -537,9 +534,8 @@ static int __devinit TLan_probe1(struct 
 		}
 		if (!pci_io_base) {
 			printk(KERN_ERR "TLAN: No IO mappings available\n");
-			unregister_netdev(dev);
-			kfree(dev);
-			return -ENODEV;
+			ret = -ENODEV;
+			goto err_unregister_dev;
 		}
 		
 		dev->base_addr = pci_io_base;
@@ -594,10 +590,9 @@ static int __devinit TLan_probe1(struct 
 	
 	if (TLan_Init(dev)) {
 		printk(KERN_ERR "TLAN: Could not register device.\n");
-		unregister_netdev(dev);
-		kfree(dev);
-		return -EAGAIN;
-	} else {
+		ret = -EAGAIN;
+		goto err_unregister_dev;
+	}
 	
 	TLanDevicesInstalled++;
 	boards_found++;
@@ -618,8 +613,12 @@ static int __devinit TLan_probe1(struct 
 			priv->adapter->deviceLabel,
 			priv->adapterRev);
 	return 0;
-	}
 
+err_unregister_dev:
+	unregister_netdev(dev);
+	kfree(dev);
+err_out:
+	return ret;
 }
 
 static void TLan_Release_Dev(struct net_device *dev)

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 4/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (4 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 3/10 Francois Romieu
@ 2002-06-30 15:19       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 5/10 Francois Romieu
                         ` (5 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- skbuff virt_to_bus -> pci_map_single conversion in Rx/Tx paths.

--- linux-2.5.24/drivers/net/tlan.h	Sat Jun 29 22:01:16 2002
+++ linux-2.5.24/drivers/net/tlan.h	Sat Jun 29 22:50:17 2002
@@ -168,6 +168,7 @@ typedef u8 TLanBuffer[TLAN_MAX_FRAME_SIZ
 	 ****************************************************************/
 
 typedef struct tlan_private_tag {
+	struct pci_dev  	*pci_dev;
 	struct net_device       *nextDevice;
 	void			*dmaStorage;
 	u8			*padBuffer;
--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 22:28:42 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 23:08:37 2002
@@ -515,6 +515,7 @@ static int __devinit TLan_probe1(struct 
 	SET_MODULE_OWNER(dev);
 	
 	priv = dev->priv;
+	priv->pci_dev = pdev;
 
 	/* Is this a PCI device? */
 	if (pdev) {
@@ -995,6 +996,7 @@ static void TLan_tx_timeout(struct net_d
 static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
 {
 	TLanPrivateInfo *priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
 	TLanList	*tail_list;
 	u8		*tail_buffer;
 	int		pad;
@@ -1021,7 +1023,8 @@ static int TLan_StartTx( struct sk_buff 
 		tail_buffer = priv->txBuffer + ( priv->txTail * TLAN_MAX_FRAME_SIZE );
 		memcpy( tail_buffer, skb->data, skb->len );
 	} else {
-		tail_list->buffer[0].address = virt_to_bus( skb->data );
+		tail_list->buffer[0].address =  pci_map_single(pdev, skb->data,
+			skb->len, PCI_DMA_TODEVICE);
 		tail_list->buffer[9].address = (u32) skb;
 	}
 
@@ -1335,6 +1338,7 @@ u32 TLan_HandleInvalid( struct net_devic
 u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
 {
 	TLanPrivateInfo	*priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
 	int		eoc = 0;
 	TLanList	*head_list;
 	u32		ack = 0;
@@ -1346,7 +1350,11 @@ u32 TLan_HandleTxEOF( struct net_device 
 	while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
 		ack++;
 		if ( ! bbuf ) {
-			dev_kfree_skb_any( (struct sk_buff *) head_list->buffer[9].address );
+			struct sk_buff *skb = (struct sk_buff *)head_list->buffer[9].address;
+
+			pci_unmap_single(pdev, head_list->buffer[0].address,
+				skb->len, PCI_DMA_TODEVICE);
+			dev_kfree_skb_any(skb);
 			head_list->buffer[9].address = 0;
 		}
 	
@@ -1452,6 +1460,7 @@ u32 TLan_HandleStatOverflow( struct net_
 u32 TLan_HandleRxEOF( struct net_device *dev, u16 host_int )
 {
 	TLanPrivateInfo	*priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
 	u32		ack = 0;
 	int		eoc = 0;
 	u8		*head_buffer;
@@ -1499,9 +1508,13 @@ u32 TLan_HandleRxEOF( struct net_device 
 			new_skb = dev_alloc_skb( TLAN_MAX_FRAME_SIZE + 7 );
 			
 			if ( new_skb != NULL ) {
+				TLanBufferRef *head_buf = head_list->buffer;
+
 				/* If this ever happened it would be a problem */
 				/* not any more - ac */
-				skb = (struct sk_buff *) head_list->buffer[9].address;
+				pci_unmap_single(pdev, head_list->buffer[0].address,
+					TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
+				skb = (struct sk_buff *) head_buf[9].address;
 				skb_trim( skb, frameSize );
 
 				priv->stats.rx_bytes += frameSize;
@@ -1512,9 +1525,10 @@ u32 TLan_HandleRxEOF( struct net_device 
 				new_skb->dev = dev;
 				skb_reserve( new_skb, 2 );
 				t = (void *) skb_put( new_skb, TLAN_MAX_FRAME_SIZE );
-				head_list->buffer[0].address = virt_to_bus( t );
-				head_list->buffer[8].address = (u32) t;
-				head_list->buffer[9].address = (u32) new_skb;
+				head_buf[0].address = pci_map_single(pdev, t,
+					TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
+				head_buf[8].address = (u32) t;
+				head_buf[9].address = (u32) new_skb;
 			} else 
 				printk(KERN_WARNING "TLAN:  Couldn't allocate memory for received data.\n" );
 		}
@@ -1879,6 +1893,7 @@ void TLan_Timer( unsigned long data )
 void TLan_ResetLists( struct net_device *dev )
 {
 	TLanPrivateInfo *priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
 	int		i;
 	TLanList	*list;
 	struct sk_buff	*skb;
@@ -1918,7 +1933,8 @@ void TLan_ResetLists( struct net_device 
 				skb_reserve( skb, 2 );
 				t = (void *) skb_put( skb, TLAN_MAX_FRAME_SIZE );
 			}
-			list->buffer[0].address = virt_to_bus( t );
+			list->buffer[0].address = pci_map_single(pdev, t,
+				TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
 			list->buffer[8].address = (u32) t;
 			list->buffer[9].address = (u32) skb;
 		}
@@ -1936,6 +1952,7 @@ void TLan_ResetLists( struct net_device 
 void TLan_FreeLists( struct net_device *dev )
 {
 	TLanPrivateInfo *priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
 	int		i;
 	TLanList	*list;
 	struct sk_buff	*skb;
@@ -1945,6 +1962,8 @@ void TLan_FreeLists( struct net_device *
 			list = priv->txList + i;
 			skb = (struct sk_buff *) list->buffer[9].address;
 			if ( skb ) {
+				pci_unmap_single(pdev, list->buffer[0].address,
+					skb->len, PCI_DMA_TODEVICE);
 				dev_kfree_skb_any( skb );
 				list->buffer[9].address = 0;
 			}
@@ -1954,6 +1973,8 @@ void TLan_FreeLists( struct net_device *
 			list = priv->rxList + i;
 			skb = (struct sk_buff *) list->buffer[9].address;
 			if ( skb ) {
+				pci_unmap_single(pdev, list->buffer[0].address,
+					TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
 				dev_kfree_skb_any( skb );
 				list->buffer[9].address = 0;
 			}

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 5/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (5 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 4/10 Francois Romieu
@ 2002-06-30 15:19       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 6/10 Francois Romieu
                         ` (4 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- more code duplication removal.

--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 23:09:16 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 23:18:19 2002
@@ -296,6 +296,8 @@ static int	TLan_ioctl( struct net_device
 static int      TLan_probe1( struct pci_dev *pdev, long ioaddr, int irq, int rev, const struct pci_device_id *ent);
 static void	TLan_tx_timeout( struct net_device *dev);
 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_Release_Dev(struct net_device *);
 
 static u32	TLan_HandleInvalid( struct net_device *, u16 );
@@ -1349,14 +1351,8 @@ u32 TLan_HandleTxEOF( struct net_device 
 
 	while (((tmpCStat = head_list->cStat ) & TLAN_CSTAT_FRM_CMP) && (ack < 255)) {
 		ack++;
-		if ( ! bbuf ) {
-			struct sk_buff *skb = (struct sk_buff *)head_list->buffer[9].address;
-
-			pci_unmap_single(pdev, head_list->buffer[0].address,
-				skb->len, PCI_DMA_TODEVICE);
-			dev_kfree_skb_any(skb);
-			head_list->buffer[9].address = 0;
-		}
+		if ( ! bbuf )
+			TLan_ResetTxBuffer(pdev, head_list);
 	
 		if ( tmpCStat & TLAN_CSTAT_EOC )
 			eoc = 1;
@@ -1948,37 +1944,42 @@ void TLan_ResetLists( struct net_device 
 
 } /* TLan_ResetLists */
 
-
-void TLan_FreeLists( struct net_device *dev )
+static void TLan_ResetTxBuffer(struct pci_dev *pdev, TLanList *list)
 {
-	TLanPrivateInfo *priv = dev->priv;
-	struct pci_dev	*pdev = priv->pci_dev;
-	int		i;
-	TLanList	*list;
-	struct sk_buff	*skb;
+	struct sk_buff	*skb = (struct sk_buff *) list->buffer[9].address;
 
-	if ( ! bbuf ) {
-		for ( i = 0; i < TLAN_NUM_TX_LISTS; i++ ) {
-			list = priv->txList + i;
-			skb = (struct sk_buff *) list->buffer[9].address;
-			if ( skb ) {
-				pci_unmap_single(pdev, list->buffer[0].address,
-					skb->len, PCI_DMA_TODEVICE);
-				dev_kfree_skb_any( skb );
+	if (skb) {
+		pci_unmap_single(pdev, list->buffer[0].address, skb->len,
+			PCI_DMA_TODEVICE);
+		dev_kfree_skb_any(skb);
 				list->buffer[9].address = 0;
 			}
-		}
+}
+
+static void TLan_ResetRxBuffer(struct pci_dev *pdev, TLanList *list)
+{
+	struct sk_buff *skb = (struct sk_buff *) list->buffer[9].address;
 
-		for ( i = 0; i < TLAN_NUM_RX_LISTS; i++ ) {
-			list = priv->rxList + i;
 			skb = (struct sk_buff *) list->buffer[9].address;
-			if ( skb ) {
+	if (skb) {
 				pci_unmap_single(pdev, list->buffer[0].address,
 					TLAN_MAX_FRAME_SIZE, PCI_DMA_FROMDEVICE);
-				dev_kfree_skb_any( skb );
+		dev_kfree_skb_any(skb);
 				list->buffer[9].address = 0;
 			}
-		}
+}
+
+void TLan_FreeLists( struct net_device *dev )
+{
+	TLanPrivateInfo *priv = dev->priv;
+	struct pci_dev	*pdev = priv->pci_dev;
+	int		i;
+
+	if ( ! bbuf ) {
+		for (i = 0; i < TLAN_NUM_TX_LISTS; i++)
+			TLan_ResetTxBuffer(pdev, priv->txList + i);
+		for (i = 0; i < TLAN_NUM_RX_LISTS; i++)
+			TLan_ResetRxBuffer(pdev, priv->rxList + i);
 	}
 
 } /* TLan_FreeLists */

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 6/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (6 preceding siblings ...)
  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
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 7/10 Francois Romieu
                         ` (3 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- 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 ) {

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 7/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (7 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 6/10 Francois Romieu
@ 2002-06-30 15:19       ` Francois Romieu
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 8/10 Francois Romieu
                         ` (2 subsequent siblings)
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- private dma storage doesn't need room for Rx/Tx buffers anymore.

--- linux-2.5.24/drivers/net/tlan.h	Sat Jun 29 23:51:42 2002
+++ linux-2.5.24/drivers/net/tlan.h	Sat Jun 29 23:56:02 2002
@@ -42,6 +42,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_TOTAL_SIZE		TLAN_NUM_ALL_LISTS*sizeof(TLanList)
 
 #define TLAN_IGNORE		0
 #define TLAN_RECORD		1
--- linux-2.5.24/drivers/net/tlan.c	Sat Jun 29 23:51:38 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 00:00:07 2002
@@ -813,13 +813,7 @@ static int TLan_Init( struct net_device 
 			return -EIO;
 		}
 	
-	if ( bbuf ) {
-		dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
-	           * ( sizeof(TLanList) + TLAN_MAX_FRAME_SIZE );
-	} else {
-		dma_size = ( TLAN_NUM_RX_LISTS + TLAN_NUM_TX_LISTS )
-	           * ( sizeof(TLanList) );
-	}
+	dma_size = TLAN_TOTAL_SIZE;	
 	priv->dmaStorage = kmalloc(dma_size, GFP_KERNEL | GFP_DMA);
 	if ( priv->dmaStorage == NULL ) {
 		printk(KERN_ERR "TLAN:  Could not allocate lists and buffers for %s.\n",

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 8/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (8 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 7/10 Francois Romieu
@ 2002-06-30 15:19       ` 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
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:19 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- descriptors converted to synchronous DMA mapping.

--- linux-2.5.24/drivers/net/tlan.h	Sun Jun 30 00:00:39 2002
+++ linux-2.5.24/drivers/net/tlan.h	Sun Jun 30 14:34:27 2002
@@ -173,8 +173,8 @@ typedef struct tlan_private_tag {
 	struct pci_dev  	*pci_dev;
 	dma_addr_t		rxBuffer_dma;
 	dma_addr_t		txBuffer_dma;
+	dma_addr_t		lists_dma;
 	struct net_device       *nextDevice;
-	void			*dmaStorage;
 	u8			*padBuffer;
 	TLanList                *rxList;
 	u8			*rxBuffer;
--- linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 00:00:42 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 14:53:29 2002
@@ -639,8 +639,7 @@ static void TLan_Release_Dev(struct net_
 	TLanPrivateInfo *priv = dev->priv;
 	struct pci_dev	*pdev = priv->pci_dev;
 
-	if (priv->dmaStorage)
-		kfree(priv->dmaStorage);
+	pci_free_consistent(pdev, TLAN_TOTAL_SIZE, priv->rxList, priv->lists_dma);
 	if ( bbuf )
 		TLan_ReleaseBuffers(pdev, priv);
 	release_region(dev->base_addr, 0x10);
@@ -814,16 +813,19 @@ static int TLan_Init( struct net_device 
 		}
 
 	dma_size = TLAN_TOTAL_SIZE;	
-	priv->dmaStorage = kmalloc(dma_size, GFP_KERNEL | GFP_DMA);
-	if ( priv->dmaStorage == NULL ) {
+	addr = pci_alloc_consistent(pdev, TLAN_TOTAL_SIZE, &priv->lists_dma);
+	if (!addr) {
 		printk(KERN_ERR "TLAN:  Could not allocate lists and buffers for %s.\n",
 			dev->name );
 		release_region( dev->base_addr, 0x10 );
 		return -ENOMEM;
 	}
-	memset( priv->dmaStorage, 0, dma_size );
-	priv->rxList = (TLanList *) 
-		       ( ( ( (u32) priv->dmaStorage ) + 7 ) & 0xFFFFFFF8 );
+	/*
+	 * pci_alloc_consistent and an adequate power of 2 for TLAN_NUM_RX_LISTS
+	 * guarantees that &xList is aligned on a 8 bytes boundary (required 
+	 * for rx and tx).
+	 */
+	priv->rxList = (TLanList *)addr;
 	priv->txList = priv->rxList + TLAN_NUM_RX_LISTS;
 	if ( bbuf ) {
 		dma_size = TLAN_NUM_ALL_LISTS * TLAN_MAX_FRAME_SIZE;
@@ -831,6 +833,8 @@ static int TLan_Init( struct net_device 
 		if ( addr == NULL ) {
 			printk(KERN_ERR "%s: buffers allocation failed\n",
 				dev->name );
+			pci_free_consistent(pdev, TLAN_TOTAL_SIZE, priv->rxList,
+				priv->lists_dma);
 			release_region( dev->base_addr, 0x10 );
 			return -ENOMEM;
 		}
@@ -1074,15 +1078,15 @@ static int TLan_StartTx( struct sk_buff 
 	if ( ! priv->txInProgress ) {
 		priv->txInProgress = 1;
 		TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  Starting TX on buffer %d\n", priv->txTail );
-		outl( virt_to_bus( tail_list ), dev->base_addr + TLAN_CH_PARM );
+		outl( priv->lists_dma +
+			(TLAN_NUM_RX_LISTS + priv->txTail)*sizeof(TLanList),
+			dev->base_addr + TLAN_CH_PARM );
 		outl( TLAN_HC_GO, dev->base_addr + TLAN_HOST_CMD );
 	} else {
 		TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  Adding buffer %d to TX channel\n", priv->txTail );
-		if ( priv->txTail == 0 ) {
-			( priv->txList + ( TLAN_NUM_TX_LISTS - 1 ) )->forward = virt_to_bus( tail_list );
-		} else {
-			( priv->txList + ( priv->txTail - 1 ) )->forward = virt_to_bus( tail_list );
-		}
+		priv->txList[(priv->txTail-1)%TLAN_NUM_TX_LISTS].forward =
+			priv->lists_dma +
+			(TLAN_NUM_RX_LISTS + priv->txTail)*sizeof(TLanList);
 	}
 	spin_unlock_irqrestore(&priv->lock, flags);
 
@@ -1397,7 +1401,9 @@ u32 TLan_HandleTxEOF( struct net_device 
 		TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
 		head_list = priv->txList + priv->txHead;
 		if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
-			outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
+			outl( priv->lists_dma +
+				(TLAN_NUM_RX_LISTS + priv->txHead)*sizeof(TLanList),
+				dev->base_addr + TLAN_CH_PARM );
 			ack |= TLAN_HC_GO;
 		} else {
 			priv->txInProgress = 0;
@@ -1560,7 +1566,8 @@ u32 TLan_HandleRxEOF( struct net_device 
 		head_list->forward = 0;
 		head_list->cStat = 0;
 		tail_list = priv->rxList + priv->rxTail;
-		tail_list->forward = virt_to_bus( head_list );
+		tail_list->forward = priv->lists_dma + 
+			priv->rxHead*sizeof(TLanList);
 
 		CIRC_INC( priv->rxHead, TLAN_NUM_RX_LISTS );
 		CIRC_INC( priv->rxTail, TLAN_NUM_RX_LISTS );
@@ -1576,7 +1583,8 @@ u32 TLan_HandleRxEOF( struct net_device 
 	if ( eoc ) { 
 		TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE:  Handling RX EOC (Head=%d Tail=%d)\n", priv->rxHead, priv->rxTail );
 		head_list = priv->rxList + priv->rxHead;
-		outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
+		outl( priv->lists_dma + priv->rxHead*sizeof(TLanList),
+			dev->base_addr + TLAN_CH_PARM );
 		ack |= TLAN_HC_GO | TLAN_HC_RT;
 		priv->rxEocCount++;
 	}
@@ -1663,7 +1671,9 @@ u32 TLan_HandleTxEOC( struct net_device 
 		head_list = priv->txList + priv->txHead;
 		if ( ( head_list->cStat & TLAN_CSTAT_READY ) == TLAN_CSTAT_READY ) {
 			netif_stop_queue(dev);
-			outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
+			outl( priv->lists_dma + (TLAN_NUM_RX_LISTS +
+				priv->txHead)*sizeof(TLanList),
+				dev->base_addr + TLAN_CH_PARM );
 			ack |= TLAN_HC_GO;
 		} else {
 			priv->txInProgress = 0;
@@ -1782,7 +1792,8 @@ u32 TLan_HandleRxEOC( struct net_device 
 	if (  priv->tlanRev < 0x30 ) {
 		TLAN_DBG( TLAN_DEBUG_RX, "RECEIVE:  Handling RX EOC (Head=%d Tail=%d) -- IRQ\n", priv->rxHead, priv->rxTail );
 		head_list = priv->rxList + priv->rxHead;
-		outl( virt_to_bus( head_list ), dev->base_addr + TLAN_CH_PARM );
+		outl( priv->lists_dma + priv->rxHead*sizeof(TLanList),
+			dev->base_addr + TLAN_CH_PARM );
 		ack |= TLAN_HC_GO | TLAN_HC_RT;
 		priv->rxEocCount++;
 	}
@@ -1964,12 +1975,9 @@ void TLan_ResetLists( struct net_device 
 		}
 		list->buffer[1].count = 0;
 		list->buffer[1].address = 0;
-		if ( i < TLAN_NUM_RX_LISTS - 1 )
-			list->forward = virt_to_bus( list + 1 );
-		else
-			list->forward = 0;
+		list->forward = priv->lists_dma + (i+1)*sizeof(TLanList);
 	}
-
+	list->forward = 0;
 } /* TLan_ResetLists */
 
 static void TLan_ResetTxBuffer(struct pci_dev *pdev, TLanList *list)
@@ -2347,7 +2355,7 @@ TLan_FinishReset( struct net_device *dev
 		if ( debug >= 1 && debug != TLAN_DEBUG_PROBE ) {
 			outb( ( TLAN_HC_REQ_INT >> 8 ), dev->base_addr + TLAN_HOST_CMD + 1 );
 		}
-		outl( virt_to_bus( priv->rxList ), dev->base_addr + TLAN_CH_PARM );
+		outl( priv->lists_dma, dev->base_addr + TLAN_CH_PARM );
 		outl( TLAN_HC_GO | TLAN_HC_RT, dev->base_addr + TLAN_HOST_CMD );
 	} else {
 		printk( "TLAN: %s: Link inactive, will retry in 10 secs...\n", dev->name );

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 9/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (9 preceding siblings ...)
  2002-06-30 15:19       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 8/10 Francois Romieu
@ 2002-06-30 15:20       ` Francois Romieu
  2002-06-30 15:20       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 10/10 Francois Romieu
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:20 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- (cosmetic) gotoize error paths in TLan_Init.

--- linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 14:54:32 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 15:10:34 2002
@@ -805,11 +805,10 @@ static int TLan_Init( struct net_device 
 
 	if (!priv->is_eisa)	/* EISA devices have already requested IO */
 		if (!request_region( dev->base_addr, 0x10, TLanSignature )) {
-			printk(KERN_ERR "TLAN: %s: IO port region 0x%lx size 0x%x in use.\n",
-				dev->name,
-				dev->base_addr,
-				0x10 );
-			return -EIO;
+			printk(KERN_ERR "%s: IO port region 0x%lx size 0x%x in use\n",
+				dev->name, dev->base_addr, 0x10);
+			err = -EIO;
+			goto err_out;
 		}
 
 	dma_size = TLAN_TOTAL_SIZE;
@@ -817,8 +816,8 @@ static int TLan_Init( struct net_device 
 	if (!addr) {
 		printk(KERN_ERR "TLAN:  Could not allocate lists and buffers for %s.\n",
 			dev->name );
-		release_region( dev->base_addr, 0x10 );
-		return -ENOMEM;
+		err = -ENOMEM;
+		goto err_out_release_region;
 	}
 	/*
 	 * pci_alloc_consistent and an adequate power of 2 for TLAN_NUM_RX_LISTS
@@ -833,10 +832,8 @@ static int TLan_Init( struct net_device 
 		if ( addr == NULL ) {
 			printk(KERN_ERR "%s: buffers allocation failed\n",
 				dev->name );
-			pci_free_consistent(pdev, TLAN_TOTAL_SIZE, priv->rxList,
-				priv->lists_dma);
-			release_region( dev->base_addr, 0x10 );
-			return -ENOMEM;
+			err = -ENOMEM;
+			goto err_out_free_consistent;
 		}
 		memset(addr, 0, dma_size );
 		priv->rxBuffer = (u8 *)addr;
@@ -874,6 +871,14 @@ static int TLan_Init( struct net_device 
 
 	return 0;
 
+err_out_free_consistent:
+	pci_free_consistent(pdev, TLAN_TOTAL_SIZE, priv->rxList,
+		priv->lists_dma);
+err_out_release_region:
+	release_region( dev->base_addr, 0x10 );
+err_out:
+	return err;
+
 } /* TLan_Init */
 
 

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 10/10
  2002-06-24 19:34     ` Jeff Garzik
                         ` (10 preceding siblings ...)
  2002-06-30 15:20       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 9/10 Francois Romieu
@ 2002-06-30 15:20       ` Francois Romieu
  11 siblings, 0 replies; 16+ messages in thread
From: Francois Romieu @ 2002-06-30 15:20 UTC (permalink / raw)
  To: Jeff Garzik; +Cc: linux-kernel

- changelog update.

--- linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 15:13:20 2002
+++ linux-2.5.24/drivers/net/tlan.c	Sun Jun 30 16:10:08 2002
@@ -164,6 +164,8 @@
  *	v1.15 Apr 4, 2002    - Correct operation when aui=1 to be
  *	                       10T half duplex no loopback
  *	                       Thanks to Gunnar Eikman
+ *
+ *	v1.16 Jun 30, 2002   - DMA mapping conversion <romieu@cogenit.fr>
  *******************************************************************************/
 
 #include <linux/module.h>
@@ -218,7 +220,7 @@ static	int		bbuf;
 static	dma_addr_t	TLanPadBuffer_dma;
 static	u8		*TLanPadBuffer;
 static	char		TLanSignature[] = "TLAN";
-static const char tlan_banner[] = "ThunderLAN driver v1.15\n";
+static const char tlan_banner[] = "ThunderLAN driver v1.16\n";
 static int tlan_have_pci;
 static int tlan_have_eisa;
 

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2002-06-30 15:29 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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       ` [PATCH] 2.5.24 - drivers/net/tlan.c dma mapping 6/10 Francois Romieu
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox