[PATCH] some fixups for ppc405_enet init code
andrew may
acmay at acmay.homeip.net
Sat Sep 8 13:13:41 EST 2001
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.
-------------- next part --------------
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);
More information about the Linuxppc-embedded
mailing list