diff options
| -rw-r--r-- | drivers/net/irda/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/net/irda/vlsi_ir.c | 61 | ||||
| -rw-r--r-- | include/net/irda/vlsi_ir.h | 71 |
3 files changed, 95 insertions, 39 deletions
diff --git a/drivers/net/irda/Kconfig b/drivers/net/irda/Kconfig index 1b5bfb454334..dc276f9b20d5 100644 --- a/drivers/net/irda/Kconfig +++ b/drivers/net/irda/Kconfig @@ -319,7 +319,7 @@ config ALI_FIR config VLSI_FIR tristate "VLSI 82C147 SIR/MIR/FIR (EXPERIMENTAL)" - depends on EXPERIMENTAL && IRDA + depends on EXPERIMENTAL && IRDA && PCI help Say Y here if you want to build support for the VLSI 82C147 PCI-IrDA Controller. This controller is used by the HP OmniBook 800 diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c index e718cfe77dae..dbfc0face187 100644 --- a/drivers/net/irda/vlsi_ir.c +++ b/drivers/net/irda/vlsi_ir.c @@ -55,14 +55,16 @@ MODULE_LICENSE("GPL"); static /* const */ char drivername[] = DRIVER_NAME; -#define PCI_CLASS_WIRELESS_IRDA 0x0d00 - -static struct pci_device_id vlsi_irda_table [] = { { - - .class = PCI_CLASS_WIRELESS_IRDA << 8, - .vendor = PCI_VENDOR_ID_VLSI, - .device = PCI_DEVICE_ID_VLSI_82C147, - }, { /* all zeroes */ } +static struct pci_device_id vlsi_irda_table [] = { + { + .class = PCI_CLASS_WIRELESS_IRDA << 8, + .class_mask = PCI_CLASS_SUBCLASS_MASK << 8, + .vendor = PCI_VENDOR_ID_VLSI, + .device = PCI_DEVICE_ID_VLSI_82C147, + .subvendor = PCI_ANY_ID, + .subdevice = PCI_ANY_ID, + }, + { /* all zeroes */ } }; MODULE_DEVICE_TABLE(pci, vlsi_irda_table); @@ -164,7 +166,7 @@ static int vlsi_proc_pdev(struct pci_dev *pdev, char *buf, int len) return 0; out += sprintf(out, "\n%s (vid/did: %04x/%04x)\n", - pci_name(pdev), (int)pdev->vendor, (int)pdev->device); + PCIDEV_NAME(pdev), (int)pdev->vendor, (int)pdev->device); out += sprintf(out, "pci-power-state: %u\n", (unsigned) pdev->current_state); out += sprintf(out, "resources: irq=%u / io=0x%04x / dma_mask=0x%016Lx\n", pdev->irq, (unsigned)pci_resource_start(pdev, 0), (u64)pdev->dma_mask); @@ -1392,9 +1394,7 @@ static int vlsi_init_chip(struct pci_dev *pdev) /* start the clock and clean the registers */ if (vlsi_start_clock(pdev)) { - printk(KERN_ERR "%s: no valid clock source\n", - __FUNCTION__); - pci_disable_device(pdev); + ERROR("%s: no valid clock source\n", __FUNCTION__); return -1; } iobase = ndev->base_addr; @@ -1455,7 +1455,10 @@ static int vlsi_start_hw(vlsi_irda_dev_t *idev) pci_write_config_byte(pdev, VLSI_PCI_MSTRPAGE, MSTRPAGE_VALUE); pci_set_master(pdev); - vlsi_init_chip(pdev); + if (vlsi_init_chip(pdev) < 0) { + pci_disable_device(pdev); + return -1; + } vlsi_fill_rx(idev->rx_ring); @@ -1521,8 +1524,8 @@ static void vlsi_tx_timeout(struct net_device *ndev) idev->new_baud = idev->baud; /* keep current baudrate */ if (vlsi_start_hw(idev)) - printk(KERN_CRIT "%s: failed to restart hw - %s(%s) unusable!\n", - __FUNCTION__, pci_name(idev->pdev), ndev->name); + ERROR("%s: failed to restart hw - %s(%s) unusable!\n", + __FUNCTION__, PCIDEV_NAME(idev->pdev), ndev->name); else netif_start_queue(ndev); } @@ -1771,8 +1774,8 @@ vlsi_irda_probe(struct pci_dev *pdev, const struct pci_device_id *id) else pdev->current_state = 0; /* hw must be running now */ - printk(KERN_INFO "%s: IrDA PCI controller %s detected\n", - drivername, pci_name(pdev)); + MESSAGE("%s: IrDA PCI controller %s detected\n", + drivername, PCIDEV_NAME(pdev)); if ( !pci_resource_start(pdev,0) || !(pci_resource_flags(pdev,0) & IORESOURCE_IO) ) { @@ -1854,8 +1857,6 @@ static void __devexit vlsi_irda_remove(struct pci_dev *pdev) idev = ndev->priv; down(&idev->sem); - pci_set_drvdata(pdev, NULL); - pci_disable_device(pdev); if (idev->proc_entry) { remove_proc_entry(ndev->name, vlsi_proc_root); idev->proc_entry = NULL; @@ -1867,7 +1868,9 @@ static void __devexit vlsi_irda_remove(struct pci_dev *pdev) * ndev->destructor called (if present) when going to free */ - printk(KERN_INFO "%s: %s removed\n", drivername, pci_name(pdev)); + pci_set_drvdata(pdev, NULL); + + MESSAGE("%s: %s removed\n", drivername, PCIDEV_NAME(pdev)); } #ifdef CONFIG_PM @@ -1882,8 +1885,8 @@ static void __devexit vlsi_irda_remove(struct pci_dev *pdev) static int vlsi_irda_save_state(struct pci_dev *pdev, u32 state) { if (state < 1 || state > 3 ) { - printk( KERN_ERR "%s - %s: invalid pm state request: %u\n", - __FUNCTION__, pci_name(pdev), state); + ERROR("%s - %s: invalid pm state request: %u\n", + __FUNCTION__, PCIDEV_NAME(pdev), state); return -1; } return 0; @@ -1895,12 +1898,12 @@ static int vlsi_irda_suspend(struct pci_dev *pdev, u32 state) vlsi_irda_dev_t *idev; if (state < 1 || state > 3 ) { - printk( KERN_ERR "%s - %s: invalid pm state request: %u\n", - __FUNCTION__, pci_name(pdev), state); + ERROR("%s - %s: invalid pm state request: %u\n", + __FUNCTION__, PCIDEV_NAME(pdev), state); return 0; } if (!ndev) { - printk(KERN_ERR "%s - %s: no netdevice \n", __FUNCTION__, pci_name(pdev)); + ERROR("%s - %s: no netdevice \n", __FUNCTION__, PCIDEV_NAME(pdev)); return 0; } idev = ndev->priv; @@ -1911,8 +1914,8 @@ static int vlsi_irda_suspend(struct pci_dev *pdev, u32 state) pdev->current_state = state; } else - printk(KERN_ERR "%s - %s: invalid suspend request %u -> %u\n", - __FUNCTION__, pci_name(pdev), pdev->current_state, state); + ERROR("%s - %s: invalid suspend request %u -> %u\n", + __FUNCTION__, PCIDEV_NAME(pdev), pdev->current_state, state); up(&idev->sem); return 0; } @@ -1939,14 +1942,14 @@ static int vlsi_irda_resume(struct pci_dev *pdev) vlsi_irda_dev_t *idev; if (!ndev) { - printk(KERN_ERR "%s - %s: no netdevice \n", __FUNCTION__, pci_name(pdev)); + ERROR("%s - %s: no netdevice \n", __FUNCTION__, PCIDEV_NAME(pdev)); return 0; } idev = ndev->priv; down(&idev->sem); if (pdev->current_state == 0) { up(&idev->sem); - printk(KERN_ERR "%s - %s: already resumed\n", __FUNCTION__, pci_name(pdev)); + WARNING("%s - %s: already resumed\n", __FUNCTION__, PCIDEV_NAME(pdev)); return 0; } diff --git a/include/net/irda/vlsi_ir.h b/include/net/irda/vlsi_ir.h index 260fb87c7340..ca258787e04b 100644 --- a/include/net/irda/vlsi_ir.h +++ b/include/net/irda/vlsi_ir.h @@ -27,18 +27,71 @@ #ifndef IRDA_VLSI_FIR_H #define IRDA_VLSI_FIR_H -/* - * #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,xx) - * - * missing pci-dma api call to give streaming dma buffer back to hw - * patch floating on lkml - probably present in 2.5.26 or later - * otherwise defining it as noop is ok, since the vlsi-ir is only +/* ================================================================ + * compatibility stuff + */ + +/* definitions not present in pci_ids.h */ + +#ifndef PCI_CLASS_WIRELESS_IRDA +#define PCI_CLASS_WIRELESS_IRDA 0x0d00 +#endif + +#ifndef PCI_CLASS_SUBCLASS_MASK +#define PCI_CLASS_SUBCLASS_MASK 0xffff +#endif + +/* missing pci-dma api call to give streaming dma buffer back to hw + * patch was floating on lkml around 2.5.2x and might be present later. + * Defining it this way is ok, since the vlsi-ir is only * used on two oldish x86-based notebooks which are cache-coherent + * (and flush_write_buffers also handles PPro errata and C3 OOstore) */ -#define pci_dma_prep_single(dev, addr, size, direction) /* nothing */ -/* - * #endif +#ifdef CONFIG_X86 +#include <asm-i386/io.h> +#define pci_dma_prep_single(dev, addr, size, direction) flush_write_buffers() +#else +#error missing pci dma api call +#endif + +/* in recent 2.5 interrupt handlers have non-void return value */ +#ifndef IRQ_RETVAL +typedef void irqreturn_t; +#define IRQ_NONE +#define IRQ_HANDLED +#define IRQ_RETVAL(x) +#endif + +/* some stuff need to check kernelversion. Not all 2.5 stuff was present + * in early 2.5.x - the test is merely to separate 2.4 from 2.5 */ +#include <linux/version.h> + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) + +/* PDE() introduced in 2.5.4 */ +#ifdef CONFIG_PROC_FS +#define PDE(inode) ((inode)->u.generic_ip) +#endif + +/* irda crc16 calculation exported in 2.5.42 */ +#define irda_calc_crc16(fcs,buf,len) (GOOD_FCS) + +/* we use this for unified pci device name access */ +#define PCIDEV_NAME(pdev) ((pdev)->name) + +#else /* 2.5 or later */ + +/* recent 2.5/2.6 stores pci device names at varying places ;-) */ +#ifdef CONFIG_PCI_NAMES +/* human readable name */ +#define PCIDEV_NAME(pdev) ((pdev)->pretty_name) +#else +/* whatever we get from the associated struct device - bus:slot:dev.fn id */ +#define PCIDEV_NAME(pdev) (pci_name(pdev)) +#endif + +#endif /* ================================================================ */ |
