Messages in this thread Patch in this message |  | | Date | Mon, 21 May 2001 18:58:46 +0200 | From | Marcus Meissner <> | Subject | PATCH: toshoboe 2.4 PCI api |
| |
Hi,
I cleaned up the Toshoboe IrDA driver: - Ported to Linux 2.4 PCI API. Including PowerManagement this time. - got rid of static dev array, using pci device data - some misc cleanups.
Tested that IrDA still works on Toshiba Satellite 4080XCDT with irdadump and a Siemens S25.
Ciao, Marcus
Index: drivers/net/irda/toshoboe.c =================================================================== RCS file: /build/mm/work/repository/linux-mm/drivers/net/irda/toshoboe.c,v retrieving revision 1.18 diff -u -r1.18 toshoboe.c --- drivers/net/irda/toshoboe.c 2001/05/03 13:16:09 1.18 +++ drivers/net/irda/toshoboe.c 2001/05/21 16:14:13 @@ -43,9 +43,6 @@ /* Define this to enable FIR and MIR support */ #define ENABLE_FAST -/* Number of ports this driver can support, you also need to edit dev_self below */ -#define NSELFS 4 - /* Size of IO window */ #define CHIP_IO_EXTENT 0x1f @@ -77,7 +74,6 @@ #include <net/irda/irda_device.h> #include <linux/pm.h> -static int toshoboe_pmproc (struct pm_dev *dev, pm_request_t rqst, void *data); #include <net/irda/toshoboe.h> @@ -92,8 +88,6 @@ static const char *driver_name = "toshoboe"; -static struct toshoboe_cb *dev_self[NSELFS + 1]; - static int max_baud = 4000000; /* Shutdown the chip and point the taskfile reg somewhere else */ @@ -644,21 +638,20 @@ return ret; } -#ifdef MODULE - MODULE_DESCRIPTION("Toshiba OBOE IrDA Device Driver"); MODULE_AUTHOR("James McKenzie <james@fishsoup.dhs.org>"); MODULE_PARM (max_baud, "i"); MODULE_PARM_DESC(max_baus, "Maximum baud rate"); -static int -toshoboe_close (struct toshoboe_cb *self) +static void +toshoboe_remove (struct pci_dev *pci_dev) { int i; + struct toshoboe_cb *self = (struct toshoboe_cb*)pci_get_drvdata(pci_dev); IRDA_DEBUG (4, __FUNCTION__ "()\n"); - ASSERT (self != NULL, return -1; + ASSERT (self != NULL, return; ); if (!self->stopped) @@ -693,16 +686,12 @@ self->taskfilebuf = NULL; self->taskfile = NULL; - return (0); + return; } -#endif - - - static int -toshoboe_open (struct pci_dev *pci_dev) +toshoboe_probe (struct pci_dev *pci_dev, const struct pci_device_id *pdid) { struct toshoboe_cb *self; struct net_device *dev; @@ -713,15 +702,6 @@ IRDA_DEBUG (4, __FUNCTION__ "()\n"); - while (dev_self[i]) - i++; - - if (i == NSELFS) - { - printk (KERN_ERR "Oboe: No more instances available"); - return -ENOMEM; - } - if ((err=pci_enable_device(pci_dev))) return err; @@ -736,12 +716,10 @@ memset (self, 0, sizeof (struct toshoboe_cb)); - dev_self[i] = self; /*This needs moving if we ever get more than one chip */ - self->open = 0; self->stopped = 0; self->pdev = pci_dev; - self->base = pci_dev->resource[0].start; + self->base = pci_resource_start(pci_dev,0); self->io.sir_base = self->base; self->io.irq = pci_dev->irq; @@ -749,19 +727,15 @@ self->io.speed = 9600; /* Lock the port that we need */ - i = check_region (self->io.sir_base, self->io.sir_ext); - if (i < 0) + if (NULL==request_region (self->io.sir_base, self->io.sir_ext, driver_name)) { IRDA_DEBUG (0, __FUNCTION__ "(), can't get iobase of 0x%03x\n", self->io.sir_base); - - dev_self[i] = NULL; - kfree (self); - return -ENODEV; + err = -EBUSY; + goto freeself; } - irda_init_max_qos_capabilies (&self->qos); self->qos.baud_rate.bits = 0; @@ -804,8 +778,8 @@ if (!self->taskfilebuf) { printk (KERN_ERR "toshoboe: kmalloc for DMA failed()\n"); - kfree (self); - return -ENOMEM; + err = -ENOMEM; + goto freeregion; } @@ -839,25 +813,16 @@ if (ok != RX_SLOTS + TX_SLOTS) { printk (KERN_ERR "toshoboe: kmalloc for buffers failed()\n"); - - - for (i = 0; i < TX_SLOTS; ++i) - if (self->xmit_bufs[i]) - kfree (self->xmit_bufs[i]); - for (i = 0; i < RX_SLOTS; ++i) - if (self->recv_bufs[i]) - kfree (self->recv_bufs[i]); - - kfree (self); - return -ENOMEM; + err = -ENOMEM; + goto freebufs; - } + } - request_region (self->io.sir_base, self->io.sir_ext, driver_name); if (!(dev = dev_alloc("irda%d", &err))) { - ERROR(__FUNCTION__ "(), dev_alloc() failed!\n"); - return -ENOMEM; + ERROR(__FUNCTION__ "(), dev_alloc() failed!\n"); + err = -ENOMEM; + goto freebufs; } dev->priv = (void *) self; self->netdev = dev; @@ -875,12 +840,15 @@ rtnl_unlock(); if (err) { ERROR(__FUNCTION__ "(), register_netdev() failed!\n"); - return -1; + /* XXX there is not freeing for dev? */ + goto freebufs; } + pci_set_drvdata(pci_dev,self); - pmdev = pm_register (PM_PCI_DEV, PM_PCI_ID(pci_dev), toshoboe_pmproc); +/* pmdev = pm_register (PM_PCI_DEV, PM_PCI_ID(pci_dev), toshoboe_pmproc); if (pmdev) pmdev->data = self; + */ printk (KERN_WARNING "ToshOboe: Using "); #ifdef ONETASK @@ -891,16 +859,30 @@ printk (" tasks, version %s\n", rcsid); return (0); +freebufs: + for (i = 0; i < TX_SLOTS; ++i) + if (self->xmit_bufs[i]) + kfree (self->xmit_bufs[i]); + for (i = 0; i < RX_SLOTS; ++i) + if (self->recv_bufs[i]) + kfree (self->recv_bufs[i]); + kfree(self->taskfilebuf); +freeregion: + release_region (self->io.sir_base, self->io.sir_ext); +freeself: + kfree (self); + return err; } static void -toshoboe_gotosleep (struct toshoboe_cb *self) +toshoboe_suspend (struct pci_dev *pci_dev) { int i = 10; + struct toshoboe_cb *self = (struct toshoboe_cb*)pci_get_drvdata(pci_dev); printk (KERN_WARNING "ToshOboe: suspending\n"); - if (self->stopped) + if (!self || self->stopped) return; self->stopped = 1; @@ -922,10 +904,14 @@ static void -toshoboe_wakeup (struct toshoboe_cb *self) +toshoboe_resume (struct pci_dev *pci_dev) { + struct toshoboe_cb *self = (struct toshoboe_cb*)pci_get_drvdata(pci_dev); unsigned long flags; + if (!self) + return; + if (!self->stopped) return; @@ -949,108 +935,28 @@ netif_wake_queue(self->netdev); restore_flags (flags); printk (KERN_WARNING "ToshOboe: waking up\n"); - } -static int -toshoboe_pmproc (struct pm_dev *dev, pm_request_t rqst, void *data) -{ - struct toshoboe_cb *self = (struct toshoboe_cb *) dev->data; - if (self) { - switch (rqst) { - case PM_SUSPEND: - toshoboe_gotosleep (self); - break; - case PM_RESUME: - toshoboe_wakeup (self); - break; - } - } - return 0; -} - - -int __init toshoboe_init (void) -{ - struct pci_dev *pci_dev = NULL; - int found = 0; - - do - { - pci_dev = pci_find_device (PCI_VENDOR_ID_TOSHIBA, - PCI_DEVICE_ID_FIR701, pci_dev); - if (pci_dev) - { - printk (KERN_WARNING "ToshOboe: Found 701 chip at 0x%0lx irq %d\n", - pci_dev->resource[0].start, - pci_dev->irq); - - if (!toshoboe_open (pci_dev)) - found++; - } - - } - while (pci_dev); - - if (!found) do - { - pci_dev = pci_find_device (PCI_VENDOR_ID_TOSHIBA, - PCI_DEVICE_ID_FIR701b, pci_dev); - if (pci_dev) - { - printk (KERN_WARNING "ToshOboe: Found 701b chip at 0x%0lx irq %d\n", - pci_dev->resource[0].start, - pci_dev->irq); - - if (!toshoboe_open (pci_dev)) - found++; - } - - } - while (pci_dev); - - - - if (found) - { - return 0; - } - - return -ENODEV; -} - -#ifdef MODULE - -static void -toshoboe_cleanup (void) -{ - int i; - - IRDA_DEBUG (4, __FUNCTION__ "()\n"); - - for (i = 0; i < 4; i++) - { - if (dev_self[i]) - toshoboe_close (dev_self[i]); - } - - pm_unregister_all (toshoboe_pmproc); -} - - +static struct pci_driver toshoboe_pci_driver = { + name : "toshoboe", + id_table : toshoboe_pci_tbl, + probe : toshoboe_probe, + remove : toshoboe_remove, + suspend : toshoboe_suspend, + resume : toshoboe_resume +}; -int -init_module (void) -{ - return toshoboe_init (); +int __init +toshoboe_init (void) { + pci_module_init(&toshoboe_pci_driver); + return 0; } - void -cleanup_module (void) +toshoboe_cleanup (void) { - toshoboe_cleanup (); + pci_unregister_driver(&toshoboe_pci_driver); } - -#endif +module_init(toshoboe_init); +module_exit(toshoboe_cleanup); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
|  |