patch-2.4.23 linux-2.4.23/net/atm/mpc.c
Next file: linux-2.4.23/net/atm/mpc.h
Previous file: linux-2.4.23/net/atm/lec.h
Back to the patch index
Back to the overall index
- Lines: 139
- Date:
2003-11-28 10:26:21.000000000 -0800
- Orig file:
linux-2.4.22/net/atm/mpc.c
- Orig date:
2003-08-25 04:44:44.000000000 -0700
diff -urN linux-2.4.22/net/atm/mpc.c linux-2.4.23/net/atm/mpc.c
@@ -28,7 +28,7 @@
#include "lec.h"
#include "mpc.h"
-#include "resources.h" /* for bind_vcc() */
+#include "resources.h"
/*
* mpc.c: Implementation of MPOA client kernel part
@@ -251,12 +251,14 @@
static struct net_device *find_lec_by_itfnum(int itf)
{
- extern struct atm_lane_ops atm_lane_ops; /* in common.c */
-
- if (atm_lane_ops.get_lecs == NULL)
+ struct net_device *dev;
+ if (!try_atm_lane_ops())
return NULL;
- return atm_lane_ops.get_lecs()[itf]; /* FIXME: something better */
+ dev = atm_lane_ops->get_lec(itf);
+ if (atm_lane_ops->owner)
+ __MOD_DEC_USE_COUNT(atm_lane_ops->owner);
+ return dev;
}
static struct mpoa_client *alloc_mpc(void)
@@ -777,14 +779,16 @@
if (mpc->dev) { /* check if the lec is LANE2 capable */
priv = (struct lec_priv *)mpc->dev->priv;
- if (priv->lane_version < 2)
+ if (priv->lane_version < 2) {
+ dev_put(mpc->dev);
mpc->dev = NULL;
- else
+ } else
priv->lane2_ops->associate_indicator = lane2_assoc_ind;
}
mpc->mpoad_vcc = vcc;
- bind_vcc(vcc, &mpc_dev);
+ vcc->dev = &mpc_dev;
+ vcc_insert_socket(vcc->sk);
set_bit(ATM_VF_META,&vcc->flags);
set_bit(ATM_VF_READY,&vcc->flags);
@@ -837,6 +841,7 @@
struct lec_priv *priv = (struct lec_priv *)mpc->dev->priv;
priv->lane2_ops->associate_indicator = NULL;
stop_mpc(mpc);
+ dev_put(mpc->dev);
}
mpc->in_ops->destroy_cache(mpc);
@@ -973,6 +978,7 @@
}
mpc->dev_num = priv->itfnum;
mpc->dev = dev;
+ dev_hold(dev);
dprintk("mpoa: (%s) was initialized\n", dev->name);
break;
case NETDEV_UNREGISTER:
@@ -982,6 +988,7 @@
break;
dprintk("mpoa: device (%s) was deallocated\n", dev->name);
stop_mpc(mpc);
+ dev_put(mpc->dev);
mpc->dev = NULL;
break;
case NETDEV_UP:
@@ -1391,13 +1398,18 @@
return;
}
-void atm_mpoa_init_ops(struct atm_mpoa_ops *ops)
+static struct atm_mpoa_ops __atm_mpoa_ops = {
+ .mpoad_attach = atm_mpoa_mpoad_attach,
+ .vcc_attach = atm_mpoa_vcc_attach,
+ .owner = THIS_MODULE
+};
+
+static __init int atm_mpoa_init(void)
{
- ops->mpoad_attach = atm_mpoa_mpoad_attach;
- ops->vcc_attach = atm_mpoa_vcc_attach;
+ atm_mpoa_ops_set(&__atm_mpoa_ops);
#ifdef CONFIG_PROC_FS
- if(mpc_proc_init() != 0)
+ if (mpc_proc_init() != 0)
printk(KERN_INFO "mpoa: failed to initialize /proc/mpoa\n");
else
printk(KERN_INFO "mpoa: /proc/mpoa initialized\n");
@@ -1405,22 +1417,11 @@
printk("mpc.c: " __DATE__ " " __TIME__ " initialized\n");
- return;
-}
-
-#ifdef MODULE
-int init_module(void)
-{
- extern struct atm_mpoa_ops atm_mpoa_ops;
-
- atm_mpoa_init_ops(&atm_mpoa_ops);
-
return 0;
}
-void cleanup_module(void)
+void __exit atm_mpoa_cleanup(void)
{
- extern struct atm_mpoa_ops atm_mpoa_ops;
struct mpoa_client *mpc, *tmp;
struct atm_mpoa_qos *qos, *nextqos;
struct lec_priv *priv;
@@ -1435,8 +1436,7 @@
del_timer(&mpc_timer);
unregister_netdevice_notifier(&mpoa_notifier);
- atm_mpoa_ops.mpoad_attach = NULL;
- atm_mpoa_ops.vcc_attach = NULL;
+ atm_mpoa_ops_set(NULL);
mpc = mpcs;
mpcs = NULL;
@@ -1471,5 +1471,8 @@
return;
}
-#endif /* MODULE */
+
+module_init(atm_mpoa_init);
+module_exit(atm_mpoa_cleanup);
+
MODULE_LICENSE("GPL");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)