All of lore.kernel.org
 help / color / mirror / Atom feed
From: andrew may <acmay@acmay.homeip.net>
To: linuxppc-embedded@lists.linuxppc.org
Cc: Dan Malek <dan@mvista.com>
Subject: [PATCH] some fixups for ppc405_enet init code
Date: Fri, 7 Sep 2001 20:13:41 -0700	[thread overview]
Message-ID: <20010907201341.A1856@ecam.san.rr.com> (raw)

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

This change is for Config.in and the Makefile to add the
ppc405_enet driver.

I also removed the _probe1 function and moved the code down
into the init function. This was done for 2 reasons: 1 the
dev->name is not know until the device is registered and
2 so the code would be removed after init.

I also added a kfree of the private data when the register
fails and when the module is removed.

[-- Attachment #2: ppc_enet.diff --]
[-- Type: text/plain, Size: 5992 bytes --]

diff -ur linux-bk/drivers/net/Config.in linux-bk-local/drivers/net/Config.in
--- linux-bk/drivers/net/Config.in	Fri Sep  7 08:36:06 2001
+++ linux-bk-local/drivers/net/Config.in	Fri Sep  7 17:44:46 2001
@@ -42,7 +42,7 @@
       tristate '  Symbios 53c885 (Synergy ethernet) support' CONFIG_NCR885E
       tristate '  National DP83902AV (Oak ethernet) support' CONFIG_OAKNET
       if [ "$CONFIG_405GP" = "y" ]; then
-        bool '  PowerPC 405 on-chip ethernet' CONFIG_PPC405_ENET
+        tristate '  PowerPC 405 on-chip ethernet' CONFIG_PPC405_ENET
         if [ "$CONFIG_PPC405_ENET" = "y" ]; then
           int  '    PHY Address' CONFIG_PPC405_ENET_PHY_ADDR 1
           bool '    Include extended error messages' CONFIG_PPC405_ENET_ERROR_MSG n
diff -ur linux-bk/drivers/net/Makefile linux-bk-local/drivers/net/Makefile
--- linux-bk/drivers/net/Makefile	Fri Sep  7 08:36:31 2001
+++ linux-bk-local/drivers/net/Makefile	Fri Sep  7 17:45:38 2001
@@ -205,6 +205,7 @@
 obj-$(CONFIG_MAC89x0) += mac89x0.o
 obj-$(CONFIG_TUN) += tun.o
 obj-$(CONFIG_DL2K) += dl2k.o
+obj-$(CONFIG_PPC405_ENET) += ppc405_enet.o

 ifeq ($(CONFIG_ARCH_ACORN),y)
 mod-subdirs	+= ../acorn/net
diff -ur linux-bk/drivers/net/ppc405_enet.c linux-bk-local/drivers/net/ppc405_enet.c
--- linux-bk/drivers/net/ppc405_enet.c	Fri Sep  7 08:36:05 2001
+++ linux-bk-local/drivers/net/ppc405_enet.c	Fri Sep  7 18:50:44 2001
@@ -55,7 +55,6 @@

 #include "ppc405_enet.h"

-static int	ppc405_enet_probe1(struct net_device *);
 static int	ppc405_phy_speed(void);
 static int	ppc405_phy_duplex(void);
 static int	ppc405_phy_read(unsigned char, unsigned short *);
@@ -455,65 +454,6 @@


 static int
-ppc405_enet_probe1(struct net_device *dev)
-{
-	int	delay, i;
-	bd_t	*bd;
-	struct ppc405_enet_private *lo_priv;
-
-	/* Reset the MAL */
-	mtdcr(DCRN_MALCR, MALCR_MMSR);
-
-	/* Reset the EMAC */
-	ppc405_enet_regp->em0mr0 = EMAC_M0_SRST;
-	eieio();
-	for (delay = 0; delay < 1000; delay++);
-	ppc405_enet_regp->em0mr0 = ppc405_enet_regp->em0mr0 & ~EMAC_M0_SRST;
-	eieio();
-
-	/* read the MAC Address */
-	bd = (bd_t *)__res;
-	for (i=0; i<6; i++) {
-		dev->dev_addr[i] = bd->bi_enetaddr[i];
-	}
-
-	dev->base_addr = 0xffe0;  /* indicate no actual physical probing */
-	dev->irq = BL_MAC0_WOL;   /* the first ethernet irq - need something here */
-
-	/* initialize the private data pointer */
-	lo_priv = (void *)(((long)kmalloc(
-		sizeof(struct ppc405_enet_private),
-		GFP_KERNEL | GFP_DMA) + 7) & ~7);
-	memset(lo_priv, 0, sizeof(struct ppc405_enet_private));
-	dev->priv = lo_priv;
-
-	/* Find out the default network settings from the phy */
-	lo_priv->ep_speed  = ppc405_phy_speed();
-	lo_priv->ep_duplex = ppc405_phy_duplex();
-
-	printk(KERN_NOTICE "%s: PPC405 EMAC %d Mbs %s duplex ",
-			dev->name, lo_priv->ep_speed,
-			(lo_priv->ep_duplex == HALF)? "Half": "Full");
-
-	/* no KERN_NOTICE, this continues previous printk */
-	printk("MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-			dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-			dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-
-	/* Fill in the driver function table */
-	dev->open               = &ppc405_enet_open;
-	dev->hard_start_xmit    = &ppc405_enet_start_xmit;
-	dev->stop               = &ppc405_enet_close;
-	dev->get_stats          = &ppc405_enet_stats;
-	dev->set_multicast_list = &ppc405_enet_set_multicast_list;
-
-	/* Fill in the generic fields of the device structure. */
-	ether_setup(dev);
-	return 0;
-}
-
-
-static int
 ppc405_phy_speed(void)
 {
 	int speed = _10BASET;
@@ -1248,15 +1188,67 @@
 static int __init
 init_ppc405_enet(void)
 {
-	int rc;
+	int     rc;
+	int	delay, i;
+	bd_t	*bd;
+        struct net_device* dev;
+	struct ppc405_enet_private *lo_priv;

-	rc = ppc405_enet_probe1(&ppc405_enet_dev);
-	if (rc)
-		return rc;
+        dev = &ppc405_enet_dev;
+	/* Reset the MAL */
+	mtdcr(DCRN_MALCR, MALCR_MMSR);
+
+	/* Reset the EMAC */
+	ppc405_enet_regp->em0mr0 = EMAC_M0_SRST;
+	eieio();
+	for (delay = 0; delay < 1000; delay++);
+	ppc405_enet_regp->em0mr0 = ppc405_enet_regp->em0mr0 & ~EMAC_M0_SRST;
+	eieio();
+
+	/* read the MAC Address */
+	bd = (bd_t *)__res;
+	for (i=0; i<6; i++) {
+		dev->dev_addr[i] = bd->bi_enetaddr[i];
+	}
+
+	dev->base_addr = 0xffe0;  /* indicate no actual physical probing */
+	dev->irq = BL_MAC0_WOL;   /* the first ethernet irq - need something here */
+
+	/* initialize the private data pointer */
+	lo_priv = (void *)(((long)kmalloc(
+		sizeof(struct ppc405_enet_private),
+		GFP_KERNEL | GFP_DMA) + 7) & ~7);
+	memset(lo_priv, 0, sizeof(struct ppc405_enet_private));
+	dev->priv = lo_priv;
+
+	/* Find out the default network settings from the phy */
+	lo_priv->ep_speed  = ppc405_phy_speed();
+	lo_priv->ep_duplex = ppc405_phy_duplex();
+
+	/* Fill in the driver function table */
+	dev->open               = &ppc405_enet_open;
+	dev->hard_start_xmit    = &ppc405_enet_start_xmit;
+	dev->stop               = &ppc405_enet_close;
+	dev->get_stats          = &ppc405_enet_stats;
+	dev->set_multicast_list = &ppc405_enet_set_multicast_list;
+
+	/* Fill in the generic fields of the device structure. */
+	ether_setup(dev);
+
+        /*Let the net/core keep track of module use count*/
+        SET_MODULE_OWNER(dev);

-	rc = register_netdev(&ppc405_enet_dev);
-	if (rc)
+	rc = register_netdev(dev);
+	if (rc){
+                kfree(dev->priv);
 		return rc;
+        }
+	printk(KERN_NOTICE "%s: PPC405 EMAC %d Mbs %s duplex "
+               "MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+               dev->name, lo_priv->ep_speed,
+               (lo_priv->ep_duplex == HALF)? "Half": "Full",
+               dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+               dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5] );

 	return 0;
 }
@@ -1265,6 +1257,9 @@
 exit_ppc405_enet(void)
 {
 	unregister_netdev(&ppc405_enet_dev);
+        if( ppc405_enet_dev.priv )
+                kfree(ppc405_enet_dev.priv);
+        ppc405_enet_dev.priv = 0;
 }

 module_init(init_ppc405_enet);

             reply	other threads:[~2001-09-08  3:13 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-09-08  3:13 andrew may [this message]
2001-09-10 17:53 ` [PATCH] some fixups for ppc405_enet init code Armin Kuster

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=20010907201341.A1856@ecam.san.rr.com \
    --to=acmay@acmay.homeip.net \
    --cc=dan@mvista.com \
    --cc=linuxppc-embedded@lists.linuxppc.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.