patch-2.4.0-test2 linux/drivers/net/plip.c
Next file: linux/drivers/net/ppp_generic.c
Previous file: linux/drivers/net/pcnet32.c
Back to the patch index
Back to the overall index
- Lines: 140
- Date:
Mon Jun 19 17:59:40 2000
- Orig file:
v2.4.0-test1/linux/drivers/net/plip.c
- Orig date:
Thu May 11 15:30:07 2000
diff -u --recursive --new-file v2.4.0-test1/linux/drivers/net/plip.c linux/drivers/net/plip.c
@@ -1301,10 +1301,66 @@
static struct net_device *dev_plip[PLIP_MAX] = { NULL, };
+static int inline
+plip_searchfor(int list[], int a)
+{
+ int i;
+ for (i = 0; i < PLIP_MAX && list[i] != -1; i++) {
+ if (list[i] == a) return 1;
+ }
+ return 0;
+}
+
+/* plip_attach() is called (by the parport code) when a port is
+ * available to use. */
+static void plip_attach (struct parport *port)
+{
+ static int i = 0;
+
+ if ((parport[0] == -1 && (!timid || !port->devices)) ||
+ plip_searchfor(parport, port->number)) {
+ if (i == PLIP_MAX) {
+ printk(KERN_ERR "plip: too many devices\n");
+ return;
+ }
+ dev_plip[i] = kmalloc(sizeof(struct net_device),
+ GFP_KERNEL);
+ if (!dev_plip[i]) {
+ printk(KERN_ERR "plip: memory squeeze\n");
+ return;
+ }
+ memset(dev_plip[i], 0, sizeof(struct net_device));
+ sprintf(dev_plip[i]->name, "plip%d", i);
+ dev_plip[i]->priv = port;
+ if (plip_init_dev(dev_plip[i],port) ||
+ register_netdev(dev_plip[i])) {
+ kfree(dev_plip[i]);
+ dev_plip[i] = NULL;
+ } else {
+ i++;
+ }
+ }
+}
+
+/* plip_detach() is called (by the parport code) when a port is
+ * no longer available to use. */
+static void plip_detach (struct parport *port)
+{
+ /* Nothing to do */
+}
+
+static struct parport_driver plip_driver = {
+ name: "plip",
+ attach: plip_attach,
+ detach: plip_detach
+};
+
static void __exit plip_cleanup_module (void)
{
int i;
+ parport_unregister_driver (&plip_driver);
+
for (i=0; i < PLIP_MAX; i++) {
if (dev_plip[i]) {
struct net_local *nl =
@@ -1314,7 +1370,6 @@
parport_release(nl->pardev);
parport_unregister_device(nl->pardev);
kfree(dev_plip[i]->priv);
- kfree(dev_plip[i]->name);
kfree(dev_plip[i]);
dev_plip[i] = NULL;
}
@@ -1357,21 +1412,8 @@
#endif /* !MODULE */
-static int inline
-plip_searchfor(int list[], int a)
-{
- int i;
- for (i = 0; i < PLIP_MAX && list[i] != -1; i++) {
- if (list[i] == a) return 1;
- }
- return 0;
-}
-
static int __init plip_init (void)
{
- struct parport *pb = parport_enumerate();
- int i=0;
-
if (parport[0] == -2)
return 0;
@@ -1380,38 +1422,11 @@
timid = 0;
}
- /* If the user feeds parameters, use them */
- while (pb) {
- if ((parport[0] == -1 && (!timid || !pb->devices)) ||
- plip_searchfor(parport, pb->number)) {
- if (i == PLIP_MAX) {
- printk(KERN_ERR "plip: too many devices\n");
- break;
- }
- dev_plip[i] = kmalloc(sizeof(struct net_device),
- GFP_KERNEL);
- if (!dev_plip[i]) {
- printk(KERN_ERR "plip: memory squeeze\n");
- break;
- }
- memset(dev_plip[i], 0, sizeof(struct net_device));
- sprintf(dev_plip[i]->name, "plip%d", i);
- dev_plip[i]->priv = pb;
- if (plip_init_dev(dev_plip[i],pb) || register_netdev(dev_plip[i])) {
- kfree(dev_plip[i]->name);
- kfree(dev_plip[i]);
- dev_plip[i] = NULL;
- } else {
- i++;
- }
- }
- pb = pb->next;
- }
-
- if (i == 0) {
- printk(KERN_INFO "plip: no devices registered\n");
- return -EIO;
+ if (parport_register_driver (&plip_driver)) {
+ printk (KERN_WARNING "plip: couldn't register driver\n");
+ return 1;
}
+
return 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)