lkml.org 
[lkml]   [2009]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH] move macsonic's probe function to .devinit.text


    On Sat, 11 Jul 2009, Uwe Kleine-K?nig wrote:

    > A pointer to mac_sonic_probe is passed to the core via
    > platform_driver_register and so the function must not disappear when the
    > .init sections are discarded. Otherwise (if also having HOTPLUG=y)
    > unbinding and binding a device to the driver via sysfs will result in an
    > oops as does a device being registered late.

    This patch works for me (tested on a Quadra 630). I still get an oops on
    rmmod, but that's a separate issue. I'll send a patch for that.

    Finn

    >
    > Various other functions that are called by mac_sonic_probe need to move
    > to .devinit.text, too.
    >
    > An alternative to this patch is using platform_driver_probe instead of
    > platform_driver_register plus removing the pointer to the probe function
    > from the struct platform_driver.
    >
    > Signed-off-by: Uwe Kleine-K?nig <u.kleine-koenig@pengutronix.de>
    > Cc: Jeff Garzik <jgarzik@redhat.com>
    > Cc: David S. Miller <davem@davemloft.net>
    > Cc: Finn Thain <fthain@telegraphics.com.au>
    > Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    > Cc: Andrew Morton <akpm@linux-foundation.org>
    > ---
    > drivers/net/macsonic.c | 14 +++++++-------
    > 1 files changed, 7 insertions(+), 7 deletions(-)
    >
    > diff --git a/drivers/net/macsonic.c b/drivers/net/macsonic.c
    > index acd143d..8f492c7 100644
    > --- a/drivers/net/macsonic.c
    > +++ b/drivers/net/macsonic.c
    > @@ -179,7 +179,7 @@ static const struct net_device_ops macsonic_netdev_ops = {
    > .ndo_set_mac_address = eth_mac_addr,
    > };
    >
    > -static int __init macsonic_init(struct net_device *dev)
    > +static int __devinit macsonic_init(struct net_device *dev)
    > {
    > struct sonic_local* lp = netdev_priv(dev);
    >
    > @@ -223,7 +223,7 @@ static int __init macsonic_init(struct net_device *dev)
    > return 0;
    > }
    >
    > -static int __init mac_onboard_sonic_ethernet_addr(struct net_device *dev)
    > +static int __devinit mac_onboard_sonic_ethernet_addr(struct net_device *dev)
    > {
    > struct sonic_local *lp = netdev_priv(dev);
    > const int prom_addr = ONBOARD_SONIC_PROM_BASE;
    > @@ -288,7 +288,7 @@ static int __init mac_onboard_sonic_ethernet_addr(struct net_device *dev)
    > } else return 0;
    > }
    >
    > -static int __init mac_onboard_sonic_probe(struct net_device *dev)
    > +static int __devinit mac_onboard_sonic_probe(struct net_device *dev)
    > {
    > /* Bwahahaha */
    > static int once_is_more_than_enough;
    > @@ -409,7 +409,7 @@ static int __init mac_onboard_sonic_probe(struct net_device *dev)
    > return macsonic_init(dev);
    > }
    >
    > -static int __init mac_nubus_sonic_ethernet_addr(struct net_device *dev,
    > +static int __devinit mac_nubus_sonic_ethernet_addr(struct net_device *dev,
    > unsigned long prom_addr,
    > int id)
    > {
    > @@ -424,7 +424,7 @@ static int __init mac_nubus_sonic_ethernet_addr(struct net_device *dev,
    > return 0;
    > }
    >
    > -static int __init macsonic_ident(struct nubus_dev *ndev)
    > +static int __devinit macsonic_ident(struct nubus_dev *ndev)
    > {
    > if (ndev->dr_hw == NUBUS_DRHW_ASANTE_LC &&
    > ndev->dr_sw == NUBUS_DRSW_SONIC_LC)
    > @@ -449,7 +449,7 @@ static int __init macsonic_ident(struct nubus_dev *ndev)
    > return -1;
    > }
    >
    > -static int __init mac_nubus_sonic_probe(struct net_device *dev)
    > +static int __devinit mac_nubus_sonic_probe(struct net_device *dev)
    > {
    > static int slots;
    > struct nubus_dev* ndev = NULL;
    > @@ -562,7 +562,7 @@ static int __init mac_nubus_sonic_probe(struct net_device *dev)
    > return macsonic_init(dev);
    > }
    >
    > -static int __init mac_sonic_probe(struct platform_device *pdev)
    > +static int __devinit mac_sonic_probe(struct platform_device *pdev)
    > {
    > struct net_device *dev;
    > struct sonic_local *lp;
    >


    \
     
     \ /
      Last update: 2009-07-21 17:25    [W:0.026 / U:33.728 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site