Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6: (39 commits)
[PATCH] myri10ge - Export more parameters to ethtool
[PATCH] myri10ge - Use dev_info() when printing parameters after probe
[PATCH] myri10ge - Drop ununsed nvidia chipset id
[PATCH] myri10ge - Drop unused pm_state
[PATCH] Fix freeing of net device
[PATCH] remove dead entry in net wan Kconfig
[PATCH] NI5010 netcard cleanup
[PATCH] lock validator: fix ns83820.c irq-flags bug
[PATCH] pcnet32: Cleanup rx buffers after loopback test.
[PATCH] pcnet32: Suspend the chip rather than restart when changing multicast/promisc
[PATCH] pcnet32: Handle memory allocation failures cleanly when resizing tx/rx rings
[PATCH] pcnet32: Use kcalloc instead of kmalloc and memset
[PATCH] pcnet32: Fix off-by-one in get_ringparam
[PATCH] pcnet32: Use PCI_DEVICE macro
[PATCH] pcnet32: Fix Section mismatch error
[PATCH] Add support for the Cicada 8201 PHY
[PATCH] zd1211rw: disable TX queue during stop
[PATCH] ZyDAS ZD1211 USB-WLAN driver
[PATCH] softmac: fix build-break from 881ee6999d66c8fc903b429b73bbe6045b38c549
[PATCH] CONFIG_WIRELESS_EXT is neccessary after all
...

+7760 -1103
+4 -3
MAINTAINERS
··· 2039 S: Maintained 2040 2041 NI5010 NETWORK DRIVER 2042 - P: Jan-Pascal van Best and Andreas Mohr 2043 - M: Jan-Pascal van Best <jvbest@qv3pluto.leidenuniv.nl> 2044 - M: Andreas Mohr <100.30936@germany.net> 2045 L: netdev@vger.kernel.org 2046 S: Maintained 2047
··· 2039 S: Maintained 2040 2041 NI5010 NETWORK DRIVER 2042 + P: Jan-Pascal van Best 2043 + M: janpascal@vanbest.org 2044 + P: Andreas Mohr 2045 + M: andi@lisas.de 2046 L: netdev@vger.kernel.org 2047 S: Maintained 2048
+19 -16
drivers/net/8139cp.c
··· 1836 1837 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 1838 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev < 0x20) { 1839 - printk(KERN_ERR PFX "pci dev %s (id %04x:%04x rev %02x) is not an 8139C+ compatible chip\n", 1840 - pci_name(pdev), pdev->vendor, pdev->device, pci_rev); 1841 - printk(KERN_ERR PFX "Try the \"8139too\" driver instead.\n"); 1842 return -ENODEV; 1843 } 1844 ··· 1877 pciaddr = pci_resource_start(pdev, 1); 1878 if (!pciaddr) { 1879 rc = -EIO; 1880 - printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n", 1881 - pci_name(pdev)); 1882 goto err_out_res; 1883 } 1884 if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { 1885 rc = -EIO; 1886 - printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n", 1887 - (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev)); 1888 goto err_out_res; 1889 } 1890 ··· 1897 1898 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1899 if (rc) { 1900 - printk(KERN_ERR PFX "No usable DMA configuration, " 1901 - "aborting.\n"); 1902 goto err_out_res; 1903 } 1904 rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); 1905 if (rc) { 1906 - printk(KERN_ERR PFX "No usable consistent DMA configuration, " 1907 - "aborting.\n"); 1908 goto err_out_res; 1909 } 1910 } ··· 1916 regs = ioremap(pciaddr, CP_REGS_SIZE); 1917 if (!regs) { 1918 rc = -EIO; 1919 - printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%llx) on pci dev %s\n", 1920 - (unsigned long long)pci_resource_len(pdev, 1), 1921 - (unsigned long long)pciaddr, pci_name(pdev)); 1922 goto err_out_res; 1923 } 1924 dev->base_addr = (unsigned long) regs; ··· 1987 /* enable busmastering and memory-write-invalidate */ 1988 pci_set_master(pdev); 1989 1990 - if (cp->wol_enabled) cp_set_d3_state (cp); 1991 1992 return 0; 1993 ··· 2013 BUG_ON(!dev); 2014 unregister_netdev(dev); 2015 iounmap(cp->regs); 2016 - if (cp->wol_enabled) pci_set_power_state (pdev, PCI_D0); 2017 pci_release_regions(pdev); 2018 pci_clear_mwi(pdev); 2019 pci_disable_device(pdev);
··· 1836 1837 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 1838 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev < 0x20) { 1839 + dev_err(&pdev->dev, 1840 + "This (id %04x:%04x rev %02x) is not an 8139C+ compatible chip\n", 1841 + pdev->vendor, pdev->device, pci_rev); 1842 + dev_err(&pdev->dev, "Try the \"8139too\" driver instead.\n"); 1843 return -ENODEV; 1844 } 1845 ··· 1876 pciaddr = pci_resource_start(pdev, 1); 1877 if (!pciaddr) { 1878 rc = -EIO; 1879 + dev_err(&pdev->dev, "no MMIO resource\n"); 1880 goto err_out_res; 1881 } 1882 if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { 1883 rc = -EIO; 1884 + dev_err(&pdev->dev, "MMIO resource (%llx) too small\n", 1885 + (unsigned long long)pci_resource_len(pdev, 1)); 1886 goto err_out_res; 1887 } 1888 ··· 1897 1898 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1899 if (rc) { 1900 + dev_err(&pdev->dev, 1901 + "No usable DMA configuration, aborting.\n"); 1902 goto err_out_res; 1903 } 1904 rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); 1905 if (rc) { 1906 + dev_err(&pdev->dev, 1907 + "No usable consistent DMA configuration, " 1908 + "aborting.\n"); 1909 goto err_out_res; 1910 } 1911 } ··· 1915 regs = ioremap(pciaddr, CP_REGS_SIZE); 1916 if (!regs) { 1917 rc = -EIO; 1918 + dev_err(&pdev->dev, "Cannot map PCI MMIO (%lx@%lx)\n", 1919 + (unsigned long long)pci_resource_len(pdev, 1), 1920 + (unsigned long long)pciaddr); 1921 goto err_out_res; 1922 } 1923 dev->base_addr = (unsigned long) regs; ··· 1986 /* enable busmastering and memory-write-invalidate */ 1987 pci_set_master(pdev); 1988 1989 + if (cp->wol_enabled) 1990 + cp_set_d3_state (cp); 1991 1992 return 0; 1993 ··· 2011 BUG_ON(!dev); 2012 unregister_netdev(dev); 2013 iounmap(cp->regs); 2014 + if (cp->wol_enabled) 2015 + pci_set_power_state (pdev, PCI_D0); 2016 pci_release_regions(pdev); 2017 pci_clear_mwi(pdev); 2018 pci_disable_device(pdev);
+18 -16
drivers/net/8139too.c
··· 768 /* dev and priv zeroed in alloc_etherdev */ 769 dev = alloc_etherdev (sizeof (*tp)); 770 if (dev == NULL) { 771 - printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pci_name(pdev)); 772 return -ENOMEM; 773 } 774 SET_MODULE_OWNER(dev); ··· 800 #ifdef USE_IO_OPS 801 /* make sure PCI base addr 0 is PIO */ 802 if (!(pio_flags & IORESOURCE_IO)) { 803 - printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pci_name(pdev)); 804 rc = -ENODEV; 805 goto err_out; 806 } 807 /* check for weird/broken PCI region reporting */ 808 if (pio_len < RTL_MIN_IO_SIZE) { 809 - printk (KERN_ERR PFX "%s: Invalid PCI I/O region size(s), aborting\n", pci_name(pdev)); 810 rc = -ENODEV; 811 goto err_out; 812 } 813 #else 814 /* make sure PCI base addr 1 is MMIO */ 815 if (!(mmio_flags & IORESOURCE_MEM)) { 816 - printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pci_name(pdev)); 817 rc = -ENODEV; 818 goto err_out; 819 } 820 if (mmio_len < RTL_MIN_IO_SIZE) { 821 - printk (KERN_ERR PFX "%s: Invalid PCI mem region size(s), aborting\n", pci_name(pdev)); 822 rc = -ENODEV; 823 goto err_out; 824 } 825 #endif 826 827 - rc = pci_request_regions (pdev, "8139too"); 828 if (rc) 829 goto err_out; 830 disable_dev_on_err = 1; ··· 835 #ifdef USE_IO_OPS 836 ioaddr = ioport_map(pio_start, pio_len); 837 if (!ioaddr) { 838 - printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev)); 839 rc = -EIO; 840 goto err_out; 841 } ··· 846 /* ioremap MMIO region */ 847 ioaddr = pci_iomap(pdev, 1, 0); 848 if (ioaddr == NULL) { 849 - printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); 850 rc = -EIO; 851 goto err_out; 852 } ··· 860 861 /* check for missing/broken hardware */ 862 if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { 863 - printk (KERN_ERR PFX "%s: Chip not responding, ignoring board\n", 864 - pci_name(pdev)); 865 rc = -EIO; 866 goto err_out; 867 } ··· 874 } 875 876 /* if unknown chip, assume array element #0, original RTL-8139 in this case */ 877 - printk (KERN_DEBUG PFX "%s: unknown chip version, assuming RTL-8139\n", 878 - pci_name(pdev)); 879 - printk (KERN_DEBUG PFX "%s: TxConfig = 0x%lx\n", pci_name(pdev), RTL_R32 (TxConfig)); 880 tp->chipset = 0; 881 882 match: ··· 954 955 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 956 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev >= 0x20) { 957 - printk(KERN_INFO PFX "pci dev %s (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n", 958 - pci_name(pdev), pdev->vendor, pdev->device, pci_rev); 959 - printk(KERN_INFO PFX "Use the \"8139cp\" driver for improved performance and stability.\n"); 960 } 961 962 i = rtl8139_init_board (pdev, &dev);
··· 768 /* dev and priv zeroed in alloc_etherdev */ 769 dev = alloc_etherdev (sizeof (*tp)); 770 if (dev == NULL) { 771 + dev_err(&pdev->dev, "Unable to alloc new net device\n"); 772 return -ENOMEM; 773 } 774 SET_MODULE_OWNER(dev); ··· 800 #ifdef USE_IO_OPS 801 /* make sure PCI base addr 0 is PIO */ 802 if (!(pio_flags & IORESOURCE_IO)) { 803 + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); 804 rc = -ENODEV; 805 goto err_out; 806 } 807 /* check for weird/broken PCI region reporting */ 808 if (pio_len < RTL_MIN_IO_SIZE) { 809 + dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n"); 810 rc = -ENODEV; 811 goto err_out; 812 } 813 #else 814 /* make sure PCI base addr 1 is MMIO */ 815 if (!(mmio_flags & IORESOURCE_MEM)) { 816 + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); 817 rc = -ENODEV; 818 goto err_out; 819 } 820 if (mmio_len < RTL_MIN_IO_SIZE) { 821 + dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n"); 822 rc = -ENODEV; 823 goto err_out; 824 } 825 #endif 826 827 + rc = pci_request_regions (pdev, DRV_NAME); 828 if (rc) 829 goto err_out; 830 disable_dev_on_err = 1; ··· 835 #ifdef USE_IO_OPS 836 ioaddr = ioport_map(pio_start, pio_len); 837 if (!ioaddr) { 838 + dev_err(&pdev->dev, "cannot map PIO, aborting\n"); 839 rc = -EIO; 840 goto err_out; 841 } ··· 846 /* ioremap MMIO region */ 847 ioaddr = pci_iomap(pdev, 1, 0); 848 if (ioaddr == NULL) { 849 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 850 rc = -EIO; 851 goto err_out; 852 } ··· 860 861 /* check for missing/broken hardware */ 862 if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { 863 + dev_err(&pdev->dev, "Chip not responding, ignoring board\n"); 864 rc = -EIO; 865 goto err_out; 866 } ··· 875 } 876 877 /* if unknown chip, assume array element #0, original RTL-8139 in this case */ 878 + dev_printk (KERN_DEBUG, &pdev->dev, 879 + "unknown chip version, assuming RTL-8139\n"); 880 + dev_printk (KERN_DEBUG, &pdev->dev, 881 + "TxConfig = 0x%lx\n", RTL_R32 (TxConfig)); 882 tp->chipset = 0; 883 884 match: ··· 954 955 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 956 pdev->device == PCI_DEVICE_ID_REALTEK_8139 && pci_rev >= 0x20) { 957 + dev_info(&pdev->dev, 958 + "This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip\n", 959 + pdev->vendor, pdev->device, pci_rev); 960 + dev_info(&pdev->dev, 961 + "Use the \"8139cp\" driver for improved performance and stability.\n"); 962 } 963 964 i = rtl8139_init_board (pdev, &dev);
+12 -15
drivers/net/b44.c
··· 2120 2121 err = pci_enable_device(pdev); 2122 if (err) { 2123 - printk(KERN_ERR PFX "Cannot enable PCI device, " 2124 "aborting.\n"); 2125 return err; 2126 } 2127 2128 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 2129 - printk(KERN_ERR PFX "Cannot find proper PCI device " 2130 "base address, aborting.\n"); 2131 err = -ENODEV; 2132 goto err_out_disable_pdev; ··· 2135 2136 err = pci_request_regions(pdev, DRV_MODULE_NAME); 2137 if (err) { 2138 - printk(KERN_ERR PFX "Cannot obtain PCI resources, " 2139 - "aborting.\n"); 2140 goto err_out_disable_pdev; 2141 } 2142 ··· 2144 2145 err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK); 2146 if (err) { 2147 - printk(KERN_ERR PFX "No usable DMA configuration, " 2148 - "aborting.\n"); 2149 goto err_out_free_res; 2150 } 2151 2152 err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); 2153 if (err) { 2154 - printk(KERN_ERR PFX "No usable DMA configuration, " 2155 - "aborting.\n"); 2156 goto err_out_free_res; 2157 } 2158 ··· 2159 2160 dev = alloc_etherdev(sizeof(*bp)); 2161 if (!dev) { 2162 - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); 2163 err = -ENOMEM; 2164 goto err_out_free_res; 2165 } ··· 2180 2181 bp->regs = ioremap(b44reg_base, b44reg_len); 2182 if (bp->regs == 0UL) { 2183 - printk(KERN_ERR PFX "Cannot map device registers, " 2184 - "aborting.\n"); 2185 err = -ENOMEM; 2186 goto err_out_free_dev; 2187 } ··· 2210 2211 err = b44_get_invariants(bp); 2212 if (err) { 2213 - printk(KERN_ERR PFX "Problem fetching invariants of chip, " 2214 - "aborting.\n"); 2215 goto err_out_iounmap; 2216 } 2217 ··· 2231 2232 err = register_netdev(dev); 2233 if (err) { 2234 - printk(KERN_ERR PFX "Cannot register net device, " 2235 - "aborting.\n"); 2236 goto err_out_iounmap; 2237 } 2238
··· 2120 2121 err = pci_enable_device(pdev); 2122 if (err) { 2123 + dev_err(&pdev->dev, "Cannot enable PCI device, " 2124 "aborting.\n"); 2125 return err; 2126 } 2127 2128 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 2129 + dev_err(&pdev->dev, 2130 + "Cannot find proper PCI device " 2131 "base address, aborting.\n"); 2132 err = -ENODEV; 2133 goto err_out_disable_pdev; ··· 2134 2135 err = pci_request_regions(pdev, DRV_MODULE_NAME); 2136 if (err) { 2137 + dev_err(&pdev->dev, 2138 + "Cannot obtain PCI resources, aborting.\n"); 2139 goto err_out_disable_pdev; 2140 } 2141 ··· 2143 2144 err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK); 2145 if (err) { 2146 + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); 2147 goto err_out_free_res; 2148 } 2149 2150 err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); 2151 if (err) { 2152 + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); 2153 goto err_out_free_res; 2154 } 2155 ··· 2160 2161 dev = alloc_etherdev(sizeof(*bp)); 2162 if (!dev) { 2163 + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); 2164 err = -ENOMEM; 2165 goto err_out_free_res; 2166 } ··· 2181 2182 bp->regs = ioremap(b44reg_base, b44reg_len); 2183 if (bp->regs == 0UL) { 2184 + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); 2185 err = -ENOMEM; 2186 goto err_out_free_dev; 2187 } ··· 2212 2213 err = b44_get_invariants(bp); 2214 if (err) { 2215 + dev_err(&pdev->dev, 2216 + "Problem fetching invariants of chip, aborting.\n"); 2217 goto err_out_iounmap; 2218 } 2219 ··· 2233 2234 err = register_netdev(dev); 2235 if (err) { 2236 + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); 2237 goto err_out_iounmap; 2238 } 2239
+15 -15
drivers/net/bnx2.c
··· 5575 /* enable device (incl. PCI PM wakeup), and bus-mastering */ 5576 rc = pci_enable_device(pdev); 5577 if (rc) { 5578 - printk(KERN_ERR PFX "Cannot enable PCI device, aborting."); 5579 goto err_out; 5580 } 5581 5582 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 5583 - printk(KERN_ERR PFX "Cannot find PCI device base address, " 5584 - "aborting.\n"); 5585 rc = -ENODEV; 5586 goto err_out_disable; 5587 } 5588 5589 rc = pci_request_regions(pdev, DRV_MODULE_NAME); 5590 if (rc) { 5591 - printk(KERN_ERR PFX "Cannot obtain PCI resources, aborting.\n"); 5592 goto err_out_disable; 5593 } 5594 ··· 5596 5597 bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); 5598 if (bp->pm_cap == 0) { 5599 - printk(KERN_ERR PFX "Cannot find power management capability, " 5600 - "aborting.\n"); 5601 rc = -EIO; 5602 goto err_out_release; 5603 } 5604 5605 bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); 5606 if (bp->pcix_cap == 0) { 5607 - printk(KERN_ERR PFX "Cannot find PCIX capability, aborting.\n"); 5608 rc = -EIO; 5609 goto err_out_release; 5610 } ··· 5612 if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) { 5613 bp->flags |= USING_DAC_FLAG; 5614 if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) { 5615 - printk(KERN_ERR PFX "pci_set_consistent_dma_mask " 5616 - "failed, aborting.\n"); 5617 rc = -EIO; 5618 goto err_out_release; 5619 } 5620 } 5621 else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { 5622 - printk(KERN_ERR PFX "System does not support DMA, aborting.\n"); 5623 rc = -EIO; 5624 goto err_out_release; 5625 } ··· 5639 bp->regview = ioremap_nocache(dev->base_addr, mem_len); 5640 5641 if (!bp->regview) { 5642 - printk(KERN_ERR PFX "Cannot map register space, aborting.\n"); 5643 rc = -ENOMEM; 5644 goto err_out_release; 5645 } ··· 5711 else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && 5712 !(bp->flags & PCIX_FLAG)) { 5713 5714 - printk(KERN_ERR PFX "5706 A1 can only be used in a PCIX bus, " 5715 - "aborting.\n"); 5716 goto err_out_unmap; 5717 } 5718 ··· 5733 5734 if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != 5735 BNX2_DEV_INFO_SIGNATURE_MAGIC) { 5736 - printk(KERN_ERR PFX "Firmware not running, aborting.\n"); 5737 rc = -ENODEV; 5738 goto err_out_unmap; 5739 } ··· 5895 #endif 5896 5897 if ((rc = register_netdev(dev))) { 5898 - printk(KERN_ERR PFX "Cannot register net device\n"); 5899 if (bp->regview) 5900 iounmap(bp->regview); 5901 pci_release_regions(pdev);
··· 5575 /* enable device (incl. PCI PM wakeup), and bus-mastering */ 5576 rc = pci_enable_device(pdev); 5577 if (rc) { 5578 + dev_err(&pdev->dev, "Cannot enable PCI device, aborting."); 5579 goto err_out; 5580 } 5581 5582 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 5583 + dev_err(&pdev->dev, 5584 + "Cannot find PCI device base address, aborting.\n"); 5585 rc = -ENODEV; 5586 goto err_out_disable; 5587 } 5588 5589 rc = pci_request_regions(pdev, DRV_MODULE_NAME); 5590 if (rc) { 5591 + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); 5592 goto err_out_disable; 5593 } 5594 ··· 5596 5597 bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); 5598 if (bp->pm_cap == 0) { 5599 + dev_err(&pdev->dev, 5600 + "Cannot find power management capability, aborting.\n"); 5601 rc = -EIO; 5602 goto err_out_release; 5603 } 5604 5605 bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); 5606 if (bp->pcix_cap == 0) { 5607 + dev_err(&pdev->dev, "Cannot find PCIX capability, aborting.\n"); 5608 rc = -EIO; 5609 goto err_out_release; 5610 } ··· 5612 if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) { 5613 bp->flags |= USING_DAC_FLAG; 5614 if (pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK) != 0) { 5615 + dev_err(&pdev->dev, 5616 + "pci_set_consistent_dma_mask failed, aborting.\n"); 5617 rc = -EIO; 5618 goto err_out_release; 5619 } 5620 } 5621 else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { 5622 + dev_err(&pdev->dev, "System does not support DMA, aborting.\n"); 5623 rc = -EIO; 5624 goto err_out_release; 5625 } ··· 5639 bp->regview = ioremap_nocache(dev->base_addr, mem_len); 5640 5641 if (!bp->regview) { 5642 + dev_err(&pdev->dev, "Cannot map register space, aborting.\n"); 5643 rc = -ENOMEM; 5644 goto err_out_release; 5645 } ··· 5711 else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && 5712 !(bp->flags & PCIX_FLAG)) { 5713 5714 + dev_err(&pdev->dev, 5715 + "5706 A1 can only be used in a PCIX bus, aborting.\n"); 5716 goto err_out_unmap; 5717 } 5718 ··· 5733 5734 if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != 5735 BNX2_DEV_INFO_SIGNATURE_MAGIC) { 5736 + dev_err(&pdev->dev, "Firmware not running, aborting.\n"); 5737 rc = -ENODEV; 5738 goto err_out_unmap; 5739 } ··· 5895 #endif 5896 5897 if ((rc = register_netdev(dev))) { 5898 + dev_err(&pdev->dev, "Cannot register net device\n"); 5899 if (bp->regview) 5900 iounmap(bp->regview); 5901 pci_release_regions(pdev);
+10 -15
drivers/net/cassini.c
··· 4887 4888 err = pci_enable_device(pdev); 4889 if (err) { 4890 - printk(KERN_ERR PFX "Cannot enable PCI device, " 4891 - "aborting.\n"); 4892 return err; 4893 } 4894 4895 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 4896 - printk(KERN_ERR PFX "Cannot find proper PCI device " 4897 "base address, aborting.\n"); 4898 err = -ENODEV; 4899 goto err_out_disable_pdev; ··· 4900 4901 dev = alloc_etherdev(sizeof(*cp)); 4902 if (!dev) { 4903 - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); 4904 err = -ENOMEM; 4905 goto err_out_disable_pdev; 4906 } ··· 4909 4910 err = pci_request_regions(pdev, dev->name); 4911 if (err) { 4912 - printk(KERN_ERR PFX "Cannot obtain PCI resources, " 4913 - "aborting.\n"); 4914 goto err_out_free_netdev; 4915 } 4916 pci_set_master(pdev); ··· 4939 if (pci_write_config_byte(pdev, 4940 PCI_CACHE_LINE_SIZE, 4941 cas_cacheline_size)) { 4942 - printk(KERN_ERR PFX "Could not set PCI cache " 4943 "line size\n"); 4944 goto err_write_cacheline; 4945 } ··· 4953 err = pci_set_consistent_dma_mask(pdev, 4954 DMA_64BIT_MASK); 4955 if (err < 0) { 4956 - printk(KERN_ERR PFX "Unable to obtain 64-bit DMA " 4957 "for consistent allocations\n"); 4958 goto err_out_free_res; 4959 } ··· 4961 } else { 4962 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 4963 if (err) { 4964 - printk(KERN_ERR PFX "No usable DMA configuration, " 4965 "aborting.\n"); 4966 goto err_out_free_res; 4967 } ··· 5021 /* give us access to cassini registers */ 5022 cp->regs = pci_iomap(pdev, 0, casreg_len); 5023 if (cp->regs == 0UL) { 5024 - printk(KERN_ERR PFX "Cannot map device registers, " 5025 - "aborting.\n"); 5026 goto err_out_free_res; 5027 } 5028 cp->casreg_len = casreg_len; ··· 5037 pci_alloc_consistent(pdev, sizeof(struct cas_init_block), 5038 &cp->block_dvma); 5039 if (!cp->init_block) { 5040 - printk(KERN_ERR PFX "Cannot allocate init block, " 5041 - "aborting.\n"); 5042 goto err_out_iounmap; 5043 } 5044 ··· 5081 dev->features |= NETIF_F_HIGHDMA; 5082 5083 if (register_netdev(dev)) { 5084 - printk(KERN_ERR PFX "Cannot register net device, " 5085 - "aborting.\n"); 5086 goto err_out_free_consistent; 5087 } 5088
··· 4887 4888 err = pci_enable_device(pdev); 4889 if (err) { 4890 + dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n"); 4891 return err; 4892 } 4893 4894 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 4895 + dev_err(&pdev->dev, "Cannot find proper PCI device " 4896 "base address, aborting.\n"); 4897 err = -ENODEV; 4898 goto err_out_disable_pdev; ··· 4901 4902 dev = alloc_etherdev(sizeof(*cp)); 4903 if (!dev) { 4904 + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); 4905 err = -ENOMEM; 4906 goto err_out_disable_pdev; 4907 } ··· 4910 4911 err = pci_request_regions(pdev, dev->name); 4912 if (err) { 4913 + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); 4914 goto err_out_free_netdev; 4915 } 4916 pci_set_master(pdev); ··· 4941 if (pci_write_config_byte(pdev, 4942 PCI_CACHE_LINE_SIZE, 4943 cas_cacheline_size)) { 4944 + dev_err(&pdev->dev, "Could not set PCI cache " 4945 "line size\n"); 4946 goto err_write_cacheline; 4947 } ··· 4955 err = pci_set_consistent_dma_mask(pdev, 4956 DMA_64BIT_MASK); 4957 if (err < 0) { 4958 + dev_err(&pdev->dev, "Unable to obtain 64-bit DMA " 4959 "for consistent allocations\n"); 4960 goto err_out_free_res; 4961 } ··· 4963 } else { 4964 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 4965 if (err) { 4966 + dev_err(&pdev->dev, "No usable DMA configuration, " 4967 "aborting.\n"); 4968 goto err_out_free_res; 4969 } ··· 5023 /* give us access to cassini registers */ 5024 cp->regs = pci_iomap(pdev, 0, casreg_len); 5025 if (cp->regs == 0UL) { 5026 + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); 5027 goto err_out_free_res; 5028 } 5029 cp->casreg_len = casreg_len; ··· 5040 pci_alloc_consistent(pdev, sizeof(struct cas_init_block), 5041 &cp->block_dvma); 5042 if (!cp->init_block) { 5043 + dev_err(&pdev->dev, "Cannot allocate init block, aborting.\n"); 5044 goto err_out_iounmap; 5045 } 5046 ··· 5085 dev->features |= NETIF_F_HIGHDMA; 5086 5087 if (register_netdev(dev)) { 5088 + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); 5089 goto err_out_free_consistent; 5090 } 5091
+4 -3
drivers/net/declance.c
··· 703 return IRQ_HANDLED; 704 } 705 706 - static irqreturn_t 707 - lance_interrupt(const int irq, void *dev_id, struct pt_regs *regs) 708 { 709 struct net_device *dev = (struct net_device *) dev_id; 710 struct lance_private *lp = netdev_priv(dev); ··· 1253 return 0; 1254 1255 err_out_free_dev: 1256 - kfree(dev); 1257 1258 err_out: 1259 return ret; ··· 1299 while (root_lance_dev) { 1300 struct net_device *dev = root_lance_dev; 1301 struct lance_private *lp = netdev_priv(dev); 1302 unregister_netdev(dev); 1303 #ifdef CONFIG_TC 1304 if (lp->slot >= 0)
··· 703 return IRQ_HANDLED; 704 } 705 706 + static irqreturn_t lance_interrupt(const int irq, void *dev_id, 707 + struct pt_regs *regs) 708 { 709 struct net_device *dev = (struct net_device *) dev_id; 710 struct lance_private *lp = netdev_priv(dev); ··· 1253 return 0; 1254 1255 err_out_free_dev: 1256 + free_netdev(dev); 1257 1258 err_out: 1259 return ret; ··· 1299 while (root_lance_dev) { 1300 struct net_device *dev = root_lance_dev; 1301 struct lance_private *lp = netdev_priv(dev); 1302 + 1303 unregister_netdev(dev); 1304 #ifdef CONFIG_TC 1305 if (lp->slot >= 0)
+2 -41
drivers/net/dl2k.c
··· 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 */ 12 - /* 13 - Rev Date Description 14 - ========================================================================== 15 - 0.01 2001/05/03 Created DL2000-based linux driver 16 - 0.02 2001/05/21 Added VLAN and hardware checksum support. 17 - 1.00 2001/06/26 Added jumbo frame support. 18 - 1.01 2001/08/21 Added two parameters, rx_coalesce and rx_timeout. 19 - 1.02 2001/10/08 Supported fiber media. 20 - Added flow control parameters. 21 - 1.03 2001/10/12 Changed the default media to 1000mbps_fd for 22 - the fiber devices. 23 - 1.04 2001/11/08 Fixed Tx stopped when tx very busy. 24 - 1.05 2001/11/22 Fixed Tx stopped when unidirectional tx busy. 25 - 1.06 2001/12/13 Fixed disconnect bug at 10Mbps mode. 26 - Fixed tx_full flag incorrect. 27 - Added tx_coalesce paramter. 28 - 1.07 2002/01/03 Fixed miscount of RX frame error. 29 - 1.08 2002/01/17 Fixed the multicast bug. 30 - 1.09 2002/03/07 Move rx-poll-now to re-fill loop. 31 - Added rio_timer() to watch rx buffers. 32 - 1.10 2002/04/16 Fixed miscount of carrier error. 33 - 1.11 2002/05/23 Added ISR schedule scheme 34 - Fixed miscount of rx frame error for DGE-550SX. 35 - Fixed VLAN bug. 36 - 1.12 2002/06/13 Lock tx_coalesce=1 on 10/100Mbps mode. 37 - 1.13 2002/08/13 1. Fix disconnection (many tx:carrier/rx:frame 38 - errs) with some mainboards. 39 - 2. Use definition "DRV_NAME" "DRV_VERSION" 40 - "DRV_RELDATE" for flexibility. 41 - 1.14 2002/08/14 Support ethtool. 42 - 1.15 2002/08/27 Changed the default media to Auto-Negotiation 43 - for the fiber devices. 44 - 1.16 2002/09/04 More power down time for fiber devices auto- 45 - negotiation. 46 - Fix disconnect bug after ifup and ifdown. 47 - 1.17 2002/10/03 Fix RMON statistics overflow. 48 - Always use I/O mapping to access eeprom, 49 - avoid system freezing with some chipsets. 50 51 - */ 52 #define DRV_NAME "D-Link DL2000-based linux driver" 53 - #define DRV_VERSION "v1.17b" 54 - #define DRV_RELDATE "2006/03/10" 55 #include "dl2k.h" 56 #include <linux/dma-mapping.h> 57
··· 9 the Free Software Foundation; either version 2 of the License, or 10 (at your option) any later version. 11 */ 12 13 #define DRV_NAME "D-Link DL2000-based linux driver" 14 + #define DRV_VERSION "v1.18" 15 + #define DRV_RELDATE "2006/06/27" 16 #include "dl2k.h" 17 #include <linux/dma-mapping.h> 18
+3 -3
drivers/net/eepro100.c
··· 555 556 if (!request_region(pci_resource_start(pdev, 1), 557 pci_resource_len(pdev, 1), "eepro100")) { 558 - printk (KERN_ERR "eepro100: cannot reserve I/O ports\n"); 559 goto err_out_none; 560 } 561 if (!request_mem_region(pci_resource_start(pdev, 0), 562 pci_resource_len(pdev, 0), "eepro100")) { 563 - printk (KERN_ERR "eepro100: cannot reserve MMIO region\n"); 564 goto err_out_free_pio_region; 565 } 566 ··· 573 574 ioaddr = pci_iomap(pdev, pci_bar, 0); 575 if (!ioaddr) { 576 - printk (KERN_ERR "eepro100: cannot remap IO\n"); 577 goto err_out_free_mmio_region; 578 } 579
··· 555 556 if (!request_region(pci_resource_start(pdev, 1), 557 pci_resource_len(pdev, 1), "eepro100")) { 558 + dev_err(&pdev->dev, "eepro100: cannot reserve I/O ports\n"); 559 goto err_out_none; 560 } 561 if (!request_mem_region(pci_resource_start(pdev, 0), 562 pci_resource_len(pdev, 0), "eepro100")) { 563 + dev_err(&pdev->dev, "eepro100: cannot reserve MMIO region\n"); 564 goto err_out_free_pio_region; 565 } 566 ··· 573 574 ioaddr = pci_iomap(pdev, pci_bar, 0); 575 if (!ioaddr) { 576 + dev_err(&pdev->dev, "eepro100: cannot remap IO\n"); 577 goto err_out_free_mmio_region; 578 } 579
+21 -72
drivers/net/epic100.c
··· 19 20 Information and updates available at 21 http://www.scyld.com/network/epic100.html 22 23 --------------------------------------------------------------------- 24 - 25 - Linux kernel-specific changes: 26 - 27 - LK1.1.2 (jgarzik): 28 - * Merge becker version 1.09 (4/08/2000) 29 - 30 - LK1.1.3: 31 - * Major bugfix to 1.09 driver (Francis Romieu) 32 - 33 - LK1.1.4 (jgarzik): 34 - * Merge becker test version 1.09 (5/29/2000) 35 - 36 - LK1.1.5: 37 - * Fix locking (jgarzik) 38 - * Limit 83c175 probe to ethernet-class PCI devices (rgooch) 39 - 40 - LK1.1.6: 41 - * Merge becker version 1.11 42 - * Move pci_enable_device before any PCI BAR len checks 43 - 44 - LK1.1.7: 45 - * { fill me in } 46 - 47 - LK1.1.8: 48 - * ethtool driver info support (jgarzik) 49 - 50 - LK1.1.9: 51 - * ethtool media get/set support (jgarzik) 52 - 53 - LK1.1.10: 54 - * revert MII transceiver init change (jgarzik) 55 - 56 - LK1.1.11: 57 - * implement ETHTOOL_[GS]SET, _NWAY_RST, _[GS]MSGLVL, _GLINK (jgarzik) 58 - * replace some MII-related magic numbers with constants 59 - 60 - LK1.1.12: 61 - * fix power-up sequence 62 - 63 - LK1.1.13: 64 - * revert version 1.1.12, power-up sequence "fix" 65 - 66 - LK1.1.14 (Kryzsztof Halasa): 67 - * fix spurious bad initializations 68 - * pound phy a la SMSC's app note on the subject 69 - 70 - AC1.1.14ac 71 - * fix power up/down for ethtool that broke in 1.11 72 73 */ 74 75 #define DRV_NAME "epic100" 76 - #define DRV_VERSION "1.11+LK1.1.14+AC1.1.14" 77 - #define DRV_RELDATE "June 2, 2004" 78 79 /* The user-configurable values. 80 These may be modified when a driver module is loaded.*/ ··· 157 158 struct epic_chip_info { 159 const char *name; 160 - int io_size; /* Needed for I/O region check or ioremap(). */ 161 int drv_flags; /* Driver use, intended as capability flags. */ 162 }; 163 164 165 /* indexed by chip_t */ 166 static const struct epic_chip_info pci_id_tbl[] = { 167 - { "SMSC EPIC/100 83c170", 168 - EPIC_TOTAL_SIZE, TYPE2_INTR | NO_MII | MII_PWRDWN }, 169 - { "SMSC EPIC/100 83c170", 170 - EPIC_TOTAL_SIZE, TYPE2_INTR }, 171 - { "SMSC EPIC/C 83c175", 172 - EPIC_TOTAL_SIZE, TYPE2_INTR | MII_PWRDWN }, 173 }; 174 175 ··· 334 goto out; 335 irq = pdev->irq; 336 337 - if (pci_resource_len(pdev, 0) < pci_id_tbl[chip_idx].io_size) { 338 - printk (KERN_ERR "card %d: no PCI region space\n", card_idx); 339 ret = -ENODEV; 340 goto err_out_disable; 341 } ··· 350 351 dev = alloc_etherdev(sizeof (*ep)); 352 if (!dev) { 353 - printk (KERN_ERR "card %d: no memory for eth device\n", card_idx); 354 goto err_out_free_res; 355 } 356 SET_MODULE_OWNER(dev); ··· 362 ioaddr = pci_resource_start (pdev, 1); 363 ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1)); 364 if (!ioaddr) { 365 - printk (KERN_ERR DRV_NAME " %d: ioremap failed\n", card_idx); 366 goto err_out_free_netdev; 367 } 368 #endif ··· 422 ((u16 *)dev->dev_addr)[i] = le16_to_cpu(inw(ioaddr + LAN0 + i*4)); 423 424 if (debug > 2) { 425 - printk(KERN_DEBUG DRV_NAME "(%s): EEPROM contents\n", 426 - pci_name(pdev)); 427 for (i = 0; i < 64; i++) 428 printk(" %4.4x%s", read_eeprom(ioaddr, i), 429 i % 16 == 15 ? "\n" : ""); ··· 444 int mii_status = mdio_read(dev, phy, MII_BMSR); 445 if (mii_status != 0xffff && mii_status != 0x0000) { 446 ep->phys[phy_idx++] = phy; 447 - printk(KERN_INFO DRV_NAME "(%s): MII transceiver #%d control " 448 - "%4.4x status %4.4x.\n", 449 - pci_name(pdev), phy, mdio_read(dev, phy, 0), mii_status); 450 } 451 } 452 ep->mii_phy_cnt = phy_idx; 453 if (phy_idx != 0) { 454 phy = ep->phys[0]; 455 ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); 456 - printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link " 457 "partner %4.4x.\n", 458 - pci_name(pdev), ep->mii.advertising, mdio_read(dev, phy, 5)); 459 } else if ( ! (ep->chip_flags & NO_MII)) { 460 - printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n", 461 - pci_name(pdev)); 462 /* Use the known PHY address of the EPII. */ 463 ep->phys[0] = 3; 464 } ··· 475 /* The lower four bits are the media type. */ 476 if (duplex) { 477 ep->mii.force_media = ep->mii.full_duplex = 1; 478 - printk(KERN_INFO DRV_NAME "(%s): Forced full duplex operation requested.\n", 479 - pci_name(pdev)); 480 } 481 dev->if_port = ep->default_port = option; 482
··· 19 20 Information and updates available at 21 http://www.scyld.com/network/epic100.html 22 + [this link no longer provides anything useful -jgarzik] 23 24 --------------------------------------------------------------------- 25 26 */ 27 28 #define DRV_NAME "epic100" 29 + #define DRV_VERSION "2.0" 30 + #define DRV_RELDATE "June 27, 2006" 31 32 /* The user-configurable values. 33 These may be modified when a driver module is loaded.*/ ··· 204 205 struct epic_chip_info { 206 const char *name; 207 int drv_flags; /* Driver use, intended as capability flags. */ 208 }; 209 210 211 /* indexed by chip_t */ 212 static const struct epic_chip_info pci_id_tbl[] = { 213 + { "SMSC EPIC/100 83c170", TYPE2_INTR | NO_MII | MII_PWRDWN }, 214 + { "SMSC EPIC/100 83c170", TYPE2_INTR }, 215 + { "SMSC EPIC/C 83c175", TYPE2_INTR | MII_PWRDWN }, 216 }; 217 218 ··· 385 goto out; 386 irq = pdev->irq; 387 388 + if (pci_resource_len(pdev, 0) < EPIC_TOTAL_SIZE) { 389 + dev_err(&pdev->dev, "no PCI region space\n"); 390 ret = -ENODEV; 391 goto err_out_disable; 392 } ··· 401 402 dev = alloc_etherdev(sizeof (*ep)); 403 if (!dev) { 404 + dev_err(&pdev->dev, "no memory for eth device\n"); 405 goto err_out_free_res; 406 } 407 SET_MODULE_OWNER(dev); ··· 413 ioaddr = pci_resource_start (pdev, 1); 414 ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1)); 415 if (!ioaddr) { 416 + dev_err(&pdev->dev, "ioremap failed\n"); 417 goto err_out_free_netdev; 418 } 419 #endif ··· 473 ((u16 *)dev->dev_addr)[i] = le16_to_cpu(inw(ioaddr + LAN0 + i*4)); 474 475 if (debug > 2) { 476 + dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n"); 477 for (i = 0; i < 64; i++) 478 printk(" %4.4x%s", read_eeprom(ioaddr, i), 479 i % 16 == 15 ? "\n" : ""); ··· 496 int mii_status = mdio_read(dev, phy, MII_BMSR); 497 if (mii_status != 0xffff && mii_status != 0x0000) { 498 ep->phys[phy_idx++] = phy; 499 + dev_info(&pdev->dev, 500 + "MII transceiver #%d control " 501 + "%4.4x status %4.4x.\n", 502 + phy, mdio_read(dev, phy, 0), mii_status); 503 } 504 } 505 ep->mii_phy_cnt = phy_idx; 506 if (phy_idx != 0) { 507 phy = ep->phys[0]; 508 ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); 509 + dev_info(&pdev->dev, 510 + "Autonegotiation advertising %4.4x link " 511 "partner %4.4x.\n", 512 + ep->mii.advertising, mdio_read(dev, phy, 5)); 513 } else if ( ! (ep->chip_flags & NO_MII)) { 514 + dev_warn(&pdev->dev, 515 + "***WARNING***: No MII transceiver found!\n"); 516 /* Use the known PHY address of the EPII. */ 517 ep->phys[0] = 3; 518 } ··· 525 /* The lower four bits are the media type. */ 526 if (duplex) { 527 ep->mii.force_media = ep->mii.full_duplex = 1; 528 + dev_info(&pdev->dev, "Forced full duplex requested.\n"); 529 } 530 dev->if_port = ep->default_port = option; 531
+19 -17
drivers/net/fealnx.c
··· 124 MODULE_PARM_DESC(options, "fealnx: Bits 0-3: media type, bit 17: full duplex"); 125 MODULE_PARM_DESC(full_duplex, "fealnx full duplex setting(s) (1)"); 126 127 - #define MIN_REGION_SIZE 136 128 129 /* A chip capabilities table, matching the entries in pci_tbl[] above. */ 130 enum chip_capability_flags { ··· 148 149 struct chip_info { 150 char *chip_name; 151 - int io_size; 152 int flags; 153 }; 154 155 - static const struct chip_info skel_netdrv_tbl[] = { 156 - {"100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, 157 - {"100/10M Ethernet PCI Adapter", 136, HAS_CHIP_XCVR}, 158 - {"1000/100/10M Ethernet PCI Adapter", 136, HAS_MII_XCVR}, 159 }; 160 161 /* Offsets to the Command and Status Registers. */ ··· 505 506 len = pci_resource_len(pdev, bar); 507 if (len < MIN_REGION_SIZE) { 508 - printk(KERN_ERR "%s: region size %ld too small, aborting\n", 509 - boardname, len); 510 return -ENODEV; 511 } 512 513 i = pci_request_regions(pdev, boardname); 514 - if (i) return i; 515 516 irq = pdev->irq; 517 ··· 578 579 if (mii_status != 0xffff && mii_status != 0x0000) { 580 np->phys[phy_idx++] = phy; 581 - printk(KERN_INFO 582 - "%s: MII PHY found at address %d, status " 583 - "0x%4.4x.\n", dev->name, phy, mii_status); 584 /* get phy type */ 585 { 586 unsigned int data; ··· 603 } 604 605 np->mii_cnt = phy_idx; 606 - if (phy_idx == 0) { 607 - printk(KERN_WARNING "%s: MII PHY not found -- this device may " 608 - "not operate correctly.\n", dev->name); 609 - } 610 } else { 611 np->phys[0] = 32; 612 /* 89/6/23 add, (begin) */ ··· 632 np->mii.full_duplex = full_duplex[card_idx]; 633 634 if (np->mii.full_duplex) { 635 - printk(KERN_INFO "%s: Media type forced to Full Duplex.\n", dev->name); 636 /* 89/6/13 add, (begin) */ 637 // if (np->PHYType==MarvellPHY) 638 if ((np->PHYType == MarvellPHY) || (np->PHYType == LevelOnePHY)) {
··· 124 MODULE_PARM_DESC(options, "fealnx: Bits 0-3: media type, bit 17: full duplex"); 125 MODULE_PARM_DESC(full_duplex, "fealnx full duplex setting(s) (1)"); 126 127 + enum { 128 + MIN_REGION_SIZE = 136, 129 + }; 130 131 /* A chip capabilities table, matching the entries in pci_tbl[] above. */ 132 enum chip_capability_flags { ··· 146 147 struct chip_info { 148 char *chip_name; 149 int flags; 150 }; 151 152 + static const struct chip_info skel_netdrv_tbl[] __devinitdata = { 153 + { "100/10M Ethernet PCI Adapter", HAS_MII_XCVR }, 154 + { "100/10M Ethernet PCI Adapter", HAS_CHIP_XCVR }, 155 + { "1000/100/10M Ethernet PCI Adapter", HAS_MII_XCVR }, 156 }; 157 158 /* Offsets to the Command and Status Registers. */ ··· 504 505 len = pci_resource_len(pdev, bar); 506 if (len < MIN_REGION_SIZE) { 507 + dev_err(&pdev->dev, 508 + "region size %ld too small, aborting\n", len); 509 return -ENODEV; 510 } 511 512 i = pci_request_regions(pdev, boardname); 513 + if (i) 514 + return i; 515 516 irq = pdev->irq; 517 ··· 576 577 if (mii_status != 0xffff && mii_status != 0x0000) { 578 np->phys[phy_idx++] = phy; 579 + dev_info(&pdev->dev, 580 + "MII PHY found at address %d, status " 581 + "0x%4.4x.\n", phy, mii_status); 582 /* get phy type */ 583 { 584 unsigned int data; ··· 601 } 602 603 np->mii_cnt = phy_idx; 604 + if (phy_idx == 0) 605 + dev_warn(&pdev->dev, 606 + "MII PHY not found -- this device may " 607 + "not operate correctly.\n"); 608 } else { 609 np->phys[0] = 32; 610 /* 89/6/23 add, (begin) */ ··· 630 np->mii.full_duplex = full_duplex[card_idx]; 631 632 if (np->mii.full_duplex) { 633 + dev_info(&pdev->dev, "Media type forced to Full Duplex.\n"); 634 /* 89/6/13 add, (begin) */ 635 // if (np->PHYType==MarvellPHY) 636 if ((np->PHYType == MarvellPHY) || (np->PHYType == LevelOnePHY)) {
+1 -2
drivers/net/gt96100eth.c
··· 699 memset(gp, 0, sizeof(*gp)); // clear it 700 701 gp->port_num = port_num; 702 - gp->io_size = GT96100_ETH_IO_SIZE; 703 gp->port_offset = port_num * GT96100_ETH_IO_SIZE; 704 gp->phy_addr = phy_addr; 705 gp->chip_rev = chip_rev; ··· 1530 + sizeof(gt96100_td_t) * TX_RING_SIZE, 1531 gp->rx_ring); 1532 free_netdev(gtif->dev); 1533 - release_region(gtif->iobase, gp->io_size); 1534 } 1535 } 1536 }
··· 699 memset(gp, 0, sizeof(*gp)); // clear it 700 701 gp->port_num = port_num; 702 gp->port_offset = port_num * GT96100_ETH_IO_SIZE; 703 gp->phy_addr = phy_addr; 704 gp->chip_rev = chip_rev; ··· 1531 + sizeof(gt96100_td_t) * TX_RING_SIZE, 1532 gp->rx_ring); 1533 free_netdev(gtif->dev); 1534 + release_region(gtif->iobase, GT96100_ETH_IO_SIZE); 1535 } 1536 } 1537 }
-2
drivers/net/gt96100eth.h
··· 331 mib_counters_t mib; 332 struct net_device_stats stats; 333 334 - int io_size; 335 int port_num; // 0 or 1 336 int chip_rev; 337 u32 port_offset; ··· 339 u32 last_psr; // last value of the port status register 340 341 int options; /* User-settable misc. driver options. */ 342 - int drv_flags; 343 struct timer_list timer; 344 spinlock_t lock; /* Serialise access to device */ 345 };
··· 331 mib_counters_t mib; 332 struct net_device_stats stats; 333 334 int port_num; // 0 or 1 335 int chip_rev; 336 u32 port_offset; ··· 340 u32 last_psr; // last value of the port status register 341 342 int options; /* User-settable misc. driver options. */ 343 struct timer_list timer; 344 spinlock_t lock; /* Serialise access to device */ 345 };
+5 -11
drivers/net/hamachi.c
··· 20 21 Support and updates available at 22 http://www.scyld.com/network/hamachi.html 23 or 24 http://www.parl.clemson.edu/~keithu/hamachi.html 25 - 26 - 27 - 28 - Linux kernel changelog: 29 - 30 - LK1.0.1: 31 - - fix lack of pci_dev<->dev association 32 - - ethtool support (jgarzik) 33 34 */ 35 36 #define DRV_NAME "hamachi" 37 - #define DRV_VERSION "1.01+LK1.0.1" 38 - #define DRV_RELDATE "5/18/2001" 39 40 41 /* A few user-configurable values. */ ··· 601 pci_set_master(pdev); 602 603 i = pci_request_regions(pdev, DRV_NAME); 604 - if (i) return i; 605 606 irq = pdev->irq; 607 ioaddr = ioremap(base, 0x400);
··· 20 21 Support and updates available at 22 http://www.scyld.com/network/hamachi.html 23 + [link no longer provides useful info -jgarzik] 24 or 25 http://www.parl.clemson.edu/~keithu/hamachi.html 26 27 */ 28 29 #define DRV_NAME "hamachi" 30 + #define DRV_VERSION "2.0" 31 + #define DRV_RELDATE "June 27, 2006" 32 33 34 /* A few user-configurable values. */ ··· 608 pci_set_master(pdev); 609 610 i = pci_request_regions(pdev, DRV_NAME); 611 + if (i) 612 + return i; 613 614 irq = pdev->irq; 615 ioaddr = ioremap(base, 0x400);
+9 -8
drivers/net/myri10ge/myri10ge.c
··· 188 int vendor_specific_offset; 189 u32 devctl; 190 u16 msi_flags; 191 - u32 pm_state[16]; 192 u32 read_dma; 193 u32 write_dma; 194 u32 read_write_dma; ··· 1288 "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors", 1289 "tx_heartbeat_errors", "tx_window_errors", 1290 /* device-specific stats */ 1291 "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", 1292 "serial_number", "tx_pkt_start", "tx_pkt_done", 1293 "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", ··· 1327 for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) 1328 data[i] = ((unsigned long *)&mgp->stats)[i]; 1329 1330 data[i++] = (unsigned int)mgp->read_dma; 1331 data[i++] = (unsigned int)mgp->write_dma; 1332 data[i++] = (unsigned int)mgp->read_write_dma; ··· 2201 * any other device, except if forced with myri10ge_ecrc_enable > 1. 2202 */ 2203 2204 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_PCIE 0x005d 2205 - 2206 static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) 2207 { 2208 struct pci_dev *bridge = mgp->pdev->bus->self; ··· 2739 dev_err(&pdev->dev, "register_netdev failed: %d\n", status); 2740 goto abort_with_irq; 2741 } 2742 - 2743 - printk(KERN_INFO "myri10ge: %s: %s IRQ %d, tx bndry %d, fw %s, WC %s\n", 2744 - netdev->name, (mgp->msi_enabled ? "MSI" : "xPIC"), 2745 - pdev->irq, mgp->tx.boundary, mgp->fw_name, 2746 - (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); 2747 2748 return 0; 2749
··· 188 int vendor_specific_offset; 189 u32 devctl; 190 u16 msi_flags; 191 u32 read_dma; 192 u32 write_dma; 193 u32 read_write_dma; ··· 1289 "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors", 1290 "tx_heartbeat_errors", "tx_window_errors", 1291 /* device-specific stats */ 1292 + "tx_boundary", "WC", "irq", "MSI", 1293 "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", 1294 "serial_number", "tx_pkt_start", "tx_pkt_done", 1295 "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", ··· 1327 for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) 1328 data[i] = ((unsigned long *)&mgp->stats)[i]; 1329 1330 + data[i++] = (unsigned int)mgp->tx.boundary; 1331 + data[i++] = (unsigned int)(mgp->mtrr >= 0); 1332 + data[i++] = (unsigned int)mgp->pdev->irq; 1333 + data[i++] = (unsigned int)mgp->msi_enabled; 1334 data[i++] = (unsigned int)mgp->read_dma; 1335 data[i++] = (unsigned int)mgp->write_dma; 1336 data[i++] = (unsigned int)mgp->read_write_dma; ··· 2197 * any other device, except if forced with myri10ge_ecrc_enable > 1. 2198 */ 2199 2200 static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) 2201 { 2202 struct pci_dev *bridge = mgp->pdev->bus->self; ··· 2737 dev_err(&pdev->dev, "register_netdev failed: %d\n", status); 2738 goto abort_with_irq; 2739 } 2740 + dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", 2741 + (mgp->msi_enabled ? "MSI" : "xPIC"), 2742 + pdev->irq, mgp->tx.boundary, mgp->fw_name, 2743 + (mgp->mtrr >= 0 ? "Enabled" : "Disabled")); 2744 2745 return 0; 2746
+3 -114
drivers/net/natsemi.c
··· 20 21 Support information and updates available at 22 http://www.scyld.com/network/netsemi.html 23 24 - 25 - Linux kernel modifications: 26 - 27 - Version 1.0.1: 28 - - Spinlock fixes 29 - - Bug fixes and better intr performance (Tjeerd) 30 - Version 1.0.2: 31 - - Now reads correct MAC address from eeprom 32 - Version 1.0.3: 33 - - Eliminate redundant priv->tx_full flag 34 - - Call netif_start_queue from dev->tx_timeout 35 - - wmb() in start_tx() to flush data 36 - - Update Tx locking 37 - - Clean up PCI enable (davej) 38 - Version 1.0.4: 39 - - Merge Donald Becker's natsemi.c version 1.07 40 - Version 1.0.5: 41 - - { fill me in } 42 - Version 1.0.6: 43 - * ethtool support (jgarzik) 44 - * Proper initialization of the card (which sometimes 45 - fails to occur and leaves the card in a non-functional 46 - state). (uzi) 47 - 48 - * Some documented register settings to optimize some 49 - of the 100Mbit autodetection circuitry in rev C cards. (uzi) 50 - 51 - * Polling of the PHY intr for stuff like link state 52 - change and auto- negotiation to finally work properly. (uzi) 53 - 54 - * One-liner removal of a duplicate declaration of 55 - netdev_error(). (uzi) 56 - 57 - Version 1.0.7: (Manfred Spraul) 58 - * pci dma 59 - * SMP locking update 60 - * full reset added into tx_timeout 61 - * correct multicast hash generation (both big and little endian) 62 - [copied from a natsemi driver version 63 - from Myrio Corporation, Greg Smith] 64 - * suspend/resume 65 - 66 - version 1.0.8 (Tim Hockin <thockin@sun.com>) 67 - * ETHTOOL_* support 68 - * Wake on lan support (Erik Gilling) 69 - * MXDMA fixes for serverworks 70 - * EEPROM reload 71 - 72 - version 1.0.9 (Manfred Spraul) 73 - * Main change: fix lack of synchronize 74 - netif_close/netif_suspend against a last interrupt 75 - or packet. 76 - * do not enable superflous interrupts (e.g. the 77 - drivers relies on TxDone - TxIntr not needed) 78 - * wait that the hardware has really stopped in close 79 - and suspend. 80 - * workaround for the (at least) gcc-2.95.1 compiler 81 - problem. Also simplifies the code a bit. 82 - * disable_irq() in tx_timeout - needed to protect 83 - against rx interrupts. 84 - * stop the nic before switching into silent rx mode 85 - for wol (required according to docu). 86 - 87 - version 1.0.10: 88 - * use long for ee_addr (various) 89 - * print pointers properly (DaveM) 90 - * include asm/irq.h (?) 91 - 92 - version 1.0.11: 93 - * check and reset if PHY errors appear (Adrian Sun) 94 - * WoL cleanup (Tim Hockin) 95 - * Magic number cleanup (Tim Hockin) 96 - * Don't reload EEPROM on every reset (Tim Hockin) 97 - * Save and restore EEPROM state across reset (Tim Hockin) 98 - * MDIO Cleanup (Tim Hockin) 99 - * Reformat register offsets/bits (jgarzik) 100 - 101 - version 1.0.12: 102 - * ETHTOOL_* further support (Tim Hockin) 103 - 104 - version 1.0.13: 105 - * ETHTOOL_[G]EEPROM support (Tim Hockin) 106 - 107 - version 1.0.13: 108 - * crc cleanup (Matt Domsch <Matt_Domsch@dell.com>) 109 - 110 - version 1.0.14: 111 - * Cleanup some messages and autoneg in ethtool (Tim Hockin) 112 - 113 - version 1.0.15: 114 - * Get rid of cable_magic flag 115 - * use new (National provided) solution for cable magic issue 116 - 117 - version 1.0.16: 118 - * call netdev_rx() for RxErrors (Manfred Spraul) 119 - * formatting and cleanups 120 - * change options and full_duplex arrays to be zero 121 - initialized 122 - * enable only the WoL and PHY interrupts in wol mode 123 - 124 - version 1.0.17: 125 - * only do cable_magic on 83815 and early 83816 (Tim Hockin) 126 - * create a function for rx refill (Manfred Spraul) 127 - * combine drain_ring and init_ring (Manfred Spraul) 128 - * oom handling (Manfred Spraul) 129 - * hands_off instead of playing with netif_device_{de,a}ttach 130 - (Manfred Spraul) 131 - * be sure to write the MAC back to the chip (Manfred Spraul) 132 - * lengthen EEPROM timeout, and always warn about timeouts 133 - (Manfred Spraul) 134 - * comments update (Manfred) 135 - * do the right thing on a phy-reset (Manfred and Tim) 136 137 TODO: 138 * big endian support with CFG:BEM instead of cpu_to_le32 ··· 54 #include <asm/uaccess.h> 55 56 #define DRV_NAME "natsemi" 57 - #define DRV_VERSION "1.07+LK1.0.17" 58 - #define DRV_RELDATE "Sep 27, 2002" 59 60 #define RX_OFFSET 2 61
··· 20 21 Support information and updates available at 22 http://www.scyld.com/network/netsemi.html 23 + [link no longer provides useful info -jgarzik] 24 25 26 TODO: 27 * big endian support with CFG:BEM instead of cpu_to_le32 ··· 165 #include <asm/uaccess.h> 166 167 #define DRV_NAME "natsemi" 168 + #define DRV_VERSION "2.0" 169 + #define DRV_RELDATE "June 27, 2006" 170 171 #define RX_OFFSET 2 172
+5 -4
drivers/net/ne2k-pci.c
··· 231 irq = pdev->irq; 232 233 if (!ioaddr || ((pci_resource_flags (pdev, 0) & IORESOURCE_IO) == 0)) { 234 - printk (KERN_ERR PFX "no I/O resource at PCI BAR #0\n"); 235 return -ENODEV; 236 } 237 238 if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) { 239 - printk (KERN_ERR PFX "I/O resource 0x%x @ 0x%lx busy\n", 240 NE_IO_EXTENT, ioaddr); 241 return -EBUSY; 242 } ··· 263 /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */ 264 dev = alloc_ei_netdev(); 265 if (!dev) { 266 - printk (KERN_ERR PFX "cannot allocate ethernet device\n"); 267 goto err_out_free_res; 268 } 269 SET_MODULE_OWNER(dev); ··· 281 while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0) 282 /* Limit wait: '2' avoids jiffy roll-over. */ 283 if (jiffies - reset_start_time > 2) { 284 - printk(KERN_ERR PFX "Card failure (no reset ack).\n"); 285 goto err_out_free_netdev; 286 } 287
··· 231 irq = pdev->irq; 232 233 if (!ioaddr || ((pci_resource_flags (pdev, 0) & IORESOURCE_IO) == 0)) { 234 + dev_err(&pdev->dev, "no I/O resource at PCI BAR #0\n"); 235 return -ENODEV; 236 } 237 238 if (request_region (ioaddr, NE_IO_EXTENT, DRV_NAME) == NULL) { 239 + dev_err(&pdev->dev, "I/O resource 0x%x @ 0x%lx busy\n", 240 NE_IO_EXTENT, ioaddr); 241 return -EBUSY; 242 } ··· 263 /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */ 264 dev = alloc_ei_netdev(); 265 if (!dev) { 266 + dev_err(&pdev->dev, "cannot allocate ethernet device\n"); 267 goto err_out_free_res; 268 } 269 SET_MODULE_OWNER(dev); ··· 281 while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0) 282 /* Limit wait: '2' avoids jiffy roll-over. */ 283 if (jiffies - reset_start_time > 2) { 284 + dev_err(&pdev->dev, 285 + "Card failure (no reset ack).\n"); 286 goto err_out_free_netdev; 287 } 288
+24 -28
drivers/net/ni5010.c
··· 1 /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard. 2 * 3 - * Copyright 1996,1997 Jan-Pascal van Best and Andreas Mohr. 4 * 5 * This software may be used and distributed according to the terms 6 * of the GNU General Public License, incorporated herein by reference. 7 * 8 * The authors may be reached as: 9 - * jvbest@wi.leidenuniv.nl a.mohr@mailto.de 10 - * or by snail mail as 11 - * Jan-Pascal van Best Andreas Mohr 12 - * Klikspaanweg 58-4 Stauferstr. 6 13 - * 2324 LZ Leiden D-71272 Renningen 14 - * The Netherlands Germany 15 * 16 * Sources: 17 * Donald Becker's "skeleton.c" ··· 22 * 970503 v0.93: Fixed auto-irq failure on warm reboot (JB) 23 * 970623 v1.00: First kernel version (AM) 24 * 970814 v1.01: Added detection of onboard receive buffer size (AM) 25 * Bugs: 26 - * - None known... 27 * - Note that you have to patch ifconfig for the new /proc/net/dev 28 * format. It gives incorrect stats otherwise. 29 * ··· 35 * Complete merge with Andreas' driver 36 * Implement ring buffers (Is this useful? You can't squeeze 37 * too many packet in a 2k buffer!) 38 - * Implement DMA (Again, is this useful? Some docs says DMA is 39 * slower than programmed I/O) 40 * 41 * Compile with: ··· 43 * -DMODULE -c ni5010.c 44 * 45 * Insert with e.g.: 46 - * insmod ni5010.o io=0x300 irq=5 47 */ 48 49 #include <linux/module.h> ··· 65 66 #include "ni5010.h" 67 68 - static const char *boardname = "NI5010"; 69 - static char *version = 70 - "ni5010.c: v1.00 06/23/97 Jan-Pascal van Best and Andreas Mohr\n"; 71 72 /* bufsize_rcv == 0 means autoprobing */ 73 static unsigned int bufsize_rcv; 74 75 - #define jumpered_interrupts /* IRQ line jumpered on board */ 76 - #undef jumpered_dma /* No DMA used */ 77 #undef FULL_IODETECT /* Only detect in portlist */ 78 79 #ifndef FULL_IODETECT ··· 277 278 PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name)); 279 280 - #ifdef jumpered_interrupts 281 if (dev->irq == 0xff) 282 ; 283 else if (dev->irq < 2) { ··· 301 } else if (dev->irq == 2) { 302 dev->irq = 9; 303 } 304 - #endif /* jumpered_irq */ 305 PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); 306 307 /* DMA is not supported (yet?), so no use detecting it */ ··· 330 outw(0, IE_GP); /* Point GP at start of packet */ 331 outb(0, IE_RBUF); /* set buffer byte 0 to 0 again */ 332 } 333 - printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); 334 memset(dev->priv, 0, sizeof(struct ni5010_local)); 335 336 dev->open = ni5010_open; ··· 350 outb(0xff, EDLC_XCLR); /* Kill all pending xmt interrupts */ 351 352 printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq); 353 - if (dev->dma) printk(" & DMA %d", dev->dma); 354 printk(".\n"); 355 - 356 - printk(KERN_INFO "Join the NI5010 driver development team!\n"); 357 - printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n"); 358 return 0; 359 out: 360 release_region(dev->base_addr, NI5010_IO_EXTENT); ··· 365 * 366 * This routine should set everything up anew at each open, even 367 * registers that "should" only need to be set once at boot, so that 368 - * there is non-reboot way to recover if something goes wrong. 369 */ 370 371 static int ni5010_open(struct net_device *dev) ··· 384 * Always allocate the DMA channel after the IRQ, 385 * and clean up on failure. 386 */ 387 - #ifdef jumpered_dma 388 if (request_dma(dev->dma, cardname)) { 389 printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma); 390 free_irq(dev->irq, NULL); 391 return -EAGAIN; 392 } 393 - #endif /* jumpered_dma */ 394 395 PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name)); 396 /* Reset the hardware here. Don't forget to set the station address. */ ··· 627 int ioaddr = dev->base_addr; 628 629 PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name)); 630 - #ifdef jumpered_interrupts 631 free_irq(dev->irq, NULL); 632 #endif 633 /* Put card in held-RESET state */ ··· 765 MODULE_PARM_DESC(io, "ni5010 I/O base address"); 766 MODULE_PARM_DESC(irq, "ni5010 IRQ number"); 767 768 - int init_module(void) 769 { 770 PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); 771 /* ··· 786 return 0; 787 } 788 789 - void cleanup_module(void) 790 { 791 PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname)); 792 unregister_netdev(dev_ni5010); 793 release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT); 794 free_netdev(dev_ni5010); 795 } 796 #endif /* MODULE */ 797 MODULE_LICENSE("GPL"); 798
··· 1 /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard. 2 * 3 + * Copyright 1996,1997,2006 Jan-Pascal van Best and Andreas Mohr. 4 * 5 * This software may be used and distributed according to the terms 6 * of the GNU General Public License, incorporated herein by reference. 7 * 8 * The authors may be reached as: 9 + * janpascal@vanbest.org andi@lisas.de 10 * 11 * Sources: 12 * Donald Becker's "skeleton.c" ··· 27 * 970503 v0.93: Fixed auto-irq failure on warm reboot (JB) 28 * 970623 v1.00: First kernel version (AM) 29 * 970814 v1.01: Added detection of onboard receive buffer size (AM) 30 + * 060611 v1.02: slight cleanup: email addresses, driver modernization. 31 * Bugs: 32 + * - not SMP-safe (no locking of I/O accesses) 33 * - Note that you have to patch ifconfig for the new /proc/net/dev 34 * format. It gives incorrect stats otherwise. 35 * ··· 39 * Complete merge with Andreas' driver 40 * Implement ring buffers (Is this useful? You can't squeeze 41 * too many packet in a 2k buffer!) 42 + * Implement DMA (Again, is this useful? Some docs say DMA is 43 * slower than programmed I/O) 44 * 45 * Compile with: ··· 47 * -DMODULE -c ni5010.c 48 * 49 * Insert with e.g.: 50 + * insmod ni5010.ko io=0x300 irq=5 51 */ 52 53 #include <linux/module.h> ··· 69 70 #include "ni5010.h" 71 72 + static const char boardname[] = "NI5010"; 73 + static char version[] __initdata = 74 + "ni5010.c: v1.02 20060611 Jan-Pascal van Best and Andreas Mohr\n"; 75 76 /* bufsize_rcv == 0 means autoprobing */ 77 static unsigned int bufsize_rcv; 78 79 + #define JUMPERED_INTERRUPTS /* IRQ line jumpered on board */ 80 + #undef JUMPERED_DMA /* No DMA used */ 81 #undef FULL_IODETECT /* Only detect in portlist */ 82 83 #ifndef FULL_IODETECT ··· 281 282 PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name)); 283 284 + #ifdef JUMPERED_INTERRUPTS 285 if (dev->irq == 0xff) 286 ; 287 else if (dev->irq < 2) { ··· 305 } else if (dev->irq == 2) { 306 dev->irq = 9; 307 } 308 + #endif /* JUMPERED_INTERRUPTS */ 309 PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); 310 311 /* DMA is not supported (yet?), so no use detecting it */ ··· 334 outw(0, IE_GP); /* Point GP at start of packet */ 335 outb(0, IE_RBUF); /* set buffer byte 0 to 0 again */ 336 } 337 + printk("-> bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); 338 memset(dev->priv, 0, sizeof(struct ni5010_local)); 339 340 dev->open = ni5010_open; ··· 354 outb(0xff, EDLC_XCLR); /* Kill all pending xmt interrupts */ 355 356 printk(KERN_INFO "%s: NI5010 found at 0x%x, using IRQ %d", dev->name, ioaddr, dev->irq); 357 + if (dev->dma) 358 + printk(" & DMA %d", dev->dma); 359 printk(".\n"); 360 return 0; 361 out: 362 release_region(dev->base_addr, NI5010_IO_EXTENT); ··· 371 * 372 * This routine should set everything up anew at each open, even 373 * registers that "should" only need to be set once at boot, so that 374 + * there is a non-reboot way to recover if something goes wrong. 375 */ 376 377 static int ni5010_open(struct net_device *dev) ··· 390 * Always allocate the DMA channel after the IRQ, 391 * and clean up on failure. 392 */ 393 + #ifdef JUMPERED_DMA 394 if (request_dma(dev->dma, cardname)) { 395 printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma); 396 free_irq(dev->irq, NULL); 397 return -EAGAIN; 398 } 399 + #endif /* JUMPERED_DMA */ 400 401 PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name)); 402 /* Reset the hardware here. Don't forget to set the station address. */ ··· 633 int ioaddr = dev->base_addr; 634 635 PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name)); 636 + #ifdef JUMPERED_INTERRUPTS 637 free_irq(dev->irq, NULL); 638 #endif 639 /* Put card in held-RESET state */ ··· 771 MODULE_PARM_DESC(io, "ni5010 I/O base address"); 772 MODULE_PARM_DESC(irq, "ni5010 IRQ number"); 773 774 + static int __init ni5010_init_module(void) 775 { 776 PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); 777 /* ··· 792 return 0; 793 } 794 795 + static void __exit ni5010_cleanup_module(void) 796 { 797 PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname)); 798 unregister_netdev(dev_ni5010); 799 release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT); 800 free_netdev(dev_ni5010); 801 } 802 + module_init(ni5010_init_module); 803 + module_exit(ni5010_cleanup_module); 804 #endif /* MODULE */ 805 MODULE_LICENSE("GPL"); 806
+22 -19
drivers/net/ns83820.c
··· 803 804 writel(dev->IMR_cache, dev->base + IMR); 805 writel(1, dev->base + IER); 806 - spin_unlock_irq(&dev->misc_lock); 807 808 kick_rx(ndev); 809 ··· 1012 struct ns83820 *dev = PRIV(ndev); 1013 u32 cmdsts, tx_done_idx, *desc; 1014 1015 - spin_lock_irq(&dev->tx_lock); 1016 - 1017 dprintk("do_tx_done(%p)\n", ndev); 1018 tx_done_idx = dev->tx_done_idx; 1019 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1067 netif_start_queue(ndev); 1068 netif_wake_queue(ndev); 1069 } 1070 - spin_unlock_irq(&dev->tx_lock); 1071 } 1072 1073 static void ns83820_cleanup_tx(struct ns83820 *dev) ··· 1278 .get_link = ns83820_get_link 1279 }; 1280 1281 static void ns83820_mib_isr(struct ns83820 *dev) 1282 { 1283 - spin_lock(&dev->misc_lock); 1284 ns83820_update_stats(dev); 1285 - spin_unlock(&dev->misc_lock); 1286 } 1287 1288 static void ns83820_do_isr(struct net_device *ndev, u32 isr); ··· 1306 static void ns83820_do_isr(struct net_device *ndev, u32 isr) 1307 { 1308 struct ns83820 *dev = PRIV(ndev); 1309 #ifdef DEBUG 1310 if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC)) 1311 Dprintk("odd isr? 0x%08x\n", isr); ··· 1322 if ((ISR_RXDESC | ISR_RXOK) & isr) { 1323 prefetch(dev->rx_info.next_rx_desc); 1324 1325 - spin_lock_irq(&dev->misc_lock); 1326 dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK); 1327 writel(dev->IMR_cache, dev->base + IMR); 1328 - spin_unlock_irq(&dev->misc_lock); 1329 1330 tasklet_schedule(&dev->rx_tasklet); 1331 //rx_irq(ndev); ··· 1371 * work has accumulated 1372 */ 1373 if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) { 1374 do_tx_done(ndev); 1375 1376 /* Disable TxOk if there are no outstanding tx packets. 1377 */ 1378 if ((dev->tx_done_idx == dev->tx_free_idx) && 1379 (dev->IMR_cache & ISR_TXOK)) { 1380 - spin_lock_irq(&dev->misc_lock); 1381 dev->IMR_cache &= ~ISR_TXOK; 1382 writel(dev->IMR_cache, dev->base + IMR); 1383 - spin_unlock_irq(&dev->misc_lock); 1384 } 1385 } 1386 ··· 1393 * nature are expected, we must enable TxOk. 1394 */ 1395 if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) { 1396 - spin_lock_irq(&dev->misc_lock); 1397 dev->IMR_cache |= ISR_TXOK; 1398 writel(dev->IMR_cache, dev->base + IMR); 1399 - spin_unlock_irq(&dev->misc_lock); 1400 } 1401 1402 /* MIB interrupt: one of the statistics counters is about to overflow */ ··· 1458 u32 tx_done_idx, *desc; 1459 unsigned long flags; 1460 1461 - local_irq_save(flags); 1462 1463 tx_done_idx = dev->tx_done_idx; 1464 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1485 ndev->name, 1486 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); 1487 1488 - local_irq_restore(flags); 1489 } 1490 1491 static void ns83820_tx_watch(unsigned long data) ··· 1835 } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { 1836 using_dac = 0; 1837 } else { 1838 - printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n"); 1839 return -ENODEV; 1840 } 1841 ··· 1858 1859 err = pci_enable_device(pci_dev); 1860 if (err) { 1861 - printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err); 1862 goto out_free; 1863 } 1864 ··· 1887 err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED, 1888 DRV_NAME, ndev); 1889 if (err) { 1890 - printk(KERN_INFO "ns83820: unable to register irq %d\n", 1891 - pci_dev->irq); 1892 goto out_disable; 1893 } 1894 ··· 1902 rtnl_lock(); 1903 err = dev_alloc_name(ndev, ndev->name); 1904 if (err < 0) { 1905 - printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err); 1906 goto out_free_irq; 1907 } 1908
··· 803 804 writel(dev->IMR_cache, dev->base + IMR); 805 writel(1, dev->base + IER); 806 + spin_unlock(&dev->misc_lock); 807 808 kick_rx(ndev); 809 ··· 1012 struct ns83820 *dev = PRIV(ndev); 1013 u32 cmdsts, tx_done_idx, *desc; 1014 1015 dprintk("do_tx_done(%p)\n", ndev); 1016 tx_done_idx = dev->tx_done_idx; 1017 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1069 netif_start_queue(ndev); 1070 netif_wake_queue(ndev); 1071 } 1072 } 1073 1074 static void ns83820_cleanup_tx(struct ns83820 *dev) ··· 1281 .get_link = ns83820_get_link 1282 }; 1283 1284 + /* this function is called in irq context from the ISR */ 1285 static void ns83820_mib_isr(struct ns83820 *dev) 1286 { 1287 + unsigned long flags; 1288 + spin_lock_irqsave(&dev->misc_lock, flags); 1289 ns83820_update_stats(dev); 1290 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1291 } 1292 1293 static void ns83820_do_isr(struct net_device *ndev, u32 isr); ··· 1307 static void ns83820_do_isr(struct net_device *ndev, u32 isr) 1308 { 1309 struct ns83820 *dev = PRIV(ndev); 1310 + unsigned long flags; 1311 + 1312 #ifdef DEBUG 1313 if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC)) 1314 Dprintk("odd isr? 0x%08x\n", isr); ··· 1321 if ((ISR_RXDESC | ISR_RXOK) & isr) { 1322 prefetch(dev->rx_info.next_rx_desc); 1323 1324 + spin_lock_irqsave(&dev->misc_lock, flags); 1325 dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK); 1326 writel(dev->IMR_cache, dev->base + IMR); 1327 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1328 1329 tasklet_schedule(&dev->rx_tasklet); 1330 //rx_irq(ndev); ··· 1370 * work has accumulated 1371 */ 1372 if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) { 1373 + spin_lock_irqsave(&dev->tx_lock, flags); 1374 do_tx_done(ndev); 1375 + spin_unlock_irqrestore(&dev->tx_lock, flags); 1376 1377 /* Disable TxOk if there are no outstanding tx packets. 1378 */ 1379 if ((dev->tx_done_idx == dev->tx_free_idx) && 1380 (dev->IMR_cache & ISR_TXOK)) { 1381 + spin_lock_irqsave(&dev->misc_lock, flags); 1382 dev->IMR_cache &= ~ISR_TXOK; 1383 writel(dev->IMR_cache, dev->base + IMR); 1384 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1385 } 1386 } 1387 ··· 1390 * nature are expected, we must enable TxOk. 1391 */ 1392 if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) { 1393 + spin_lock_irqsave(&dev->misc_lock, flags); 1394 dev->IMR_cache |= ISR_TXOK; 1395 writel(dev->IMR_cache, dev->base + IMR); 1396 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1397 } 1398 1399 /* MIB interrupt: one of the statistics counters is about to overflow */ ··· 1455 u32 tx_done_idx, *desc; 1456 unsigned long flags; 1457 1458 + spin_lock_irqsave(&dev->tx_lock, flags); 1459 1460 tx_done_idx = dev->tx_done_idx; 1461 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1482 ndev->name, 1483 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); 1484 1485 + spin_unlock_irqrestore(&dev->tx_lock, flags); 1486 } 1487 1488 static void ns83820_tx_watch(unsigned long data) ··· 1832 } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { 1833 using_dac = 0; 1834 } else { 1835 + dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n"); 1836 return -ENODEV; 1837 } 1838 ··· 1855 1856 err = pci_enable_device(pci_dev); 1857 if (err) { 1858 + dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err); 1859 goto out_free; 1860 } 1861 ··· 1884 err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED, 1885 DRV_NAME, ndev); 1886 if (err) { 1887 + dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n", 1888 + pci_dev->irq, err); 1889 goto out_disable; 1890 } 1891 ··· 1899 rtnl_lock(); 1900 err = dev_alloc_name(ndev, ndev->name); 1901 if (err < 0) { 1902 + dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err); 1903 goto out_free_irq; 1904 } 1905
+10 -9
drivers/net/pci-skeleton.c
··· 601 /* dev zeroed in alloc_etherdev */ 602 dev = alloc_etherdev (sizeof (*tp)); 603 if (dev == NULL) { 604 - printk (KERN_ERR PFX "unable to alloc new ethernet\n"); 605 DPRINTK ("EXIT, returning -ENOMEM\n"); 606 return -ENOMEM; 607 } ··· 631 632 /* make sure PCI base addr 0 is PIO */ 633 if (!(pio_flags & IORESOURCE_IO)) { 634 - printk (KERN_ERR PFX "region #0 not a PIO resource, aborting\n"); 635 rc = -ENODEV; 636 goto err_out; 637 } 638 639 /* make sure PCI base addr 1 is MMIO */ 640 if (!(mmio_flags & IORESOURCE_MEM)) { 641 - printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n"); 642 rc = -ENODEV; 643 goto err_out; 644 } ··· 646 /* check for weird/broken PCI region reporting */ 647 if ((pio_len < NETDRV_MIN_IO_SIZE) || 648 (mmio_len < NETDRV_MIN_IO_SIZE)) { 649 - printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n"); 650 rc = -ENODEV; 651 goto err_out; 652 } 653 654 - rc = pci_request_regions (pdev, "pci-skeleton"); 655 if (rc) 656 goto err_out; 657 ··· 663 /* ioremap MMIO region */ 664 ioaddr = ioremap (mmio_start, mmio_len); 665 if (ioaddr == NULL) { 666 - printk (KERN_ERR PFX "cannot remap MMIO, aborting\n"); 667 rc = -EIO; 668 goto err_out_free_res; 669 } ··· 699 } 700 701 /* if unknown chip, assume array element #0, original RTL-8139 in this case */ 702 - printk (KERN_DEBUG PFX "PCI device %s: unknown chip version, assuming RTL-8139\n", 703 - pci_name(pdev)); 704 - printk (KERN_DEBUG PFX "PCI device %s: TxConfig = 0x%lx\n", pci_name(pdev), NETDRV_R32 (TxConfig)); 705 tp->chipset = 0; 706 707 match:
··· 601 /* dev zeroed in alloc_etherdev */ 602 dev = alloc_etherdev (sizeof (*tp)); 603 if (dev == NULL) { 604 + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); 605 DPRINTK ("EXIT, returning -ENOMEM\n"); 606 return -ENOMEM; 607 } ··· 631 632 /* make sure PCI base addr 0 is PIO */ 633 if (!(pio_flags & IORESOURCE_IO)) { 634 + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); 635 rc = -ENODEV; 636 goto err_out; 637 } 638 639 /* make sure PCI base addr 1 is MMIO */ 640 if (!(mmio_flags & IORESOURCE_MEM)) { 641 + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); 642 rc = -ENODEV; 643 goto err_out; 644 } ··· 646 /* check for weird/broken PCI region reporting */ 647 if ((pio_len < NETDRV_MIN_IO_SIZE) || 648 (mmio_len < NETDRV_MIN_IO_SIZE)) { 649 + dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); 650 rc = -ENODEV; 651 goto err_out; 652 } 653 654 + rc = pci_request_regions (pdev, MODNAME); 655 if (rc) 656 goto err_out; 657 ··· 663 /* ioremap MMIO region */ 664 ioaddr = ioremap (mmio_start, mmio_len); 665 if (ioaddr == NULL) { 666 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 667 rc = -EIO; 668 goto err_out_free_res; 669 } ··· 699 } 700 701 /* if unknown chip, assume array element #0, original RTL-8139 in this case */ 702 + dev_printk (KERN_DEBUG, &pdev->dev, 703 + "unknown chip version, assuming RTL-8139\n"); 704 + dev_printk (KERN_DEBUG, &pdev->dev, "TxConfig = 0x%lx\n", 705 + NETDRV_R32 (TxConfig)); 706 tp->chipset = 0; 707 708 match:
+382 -138
drivers/net/pcnet32.c
··· 58 * PCI device identifiers for "new style" Linux PCI Device Drivers 59 */ 60 static struct pci_device_id pcnet32_pci_tbl[] = { 61 - { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE_HOME, 62 - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 63 - { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE, 64 - PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, 65 66 /* 67 * Adapters that were sold with IBM's RS/6000 or pSeries hardware have 68 * the incorrect vendor id. 69 */ 70 - { PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE, 71 - PCI_ANY_ID, PCI_ANY_ID, 72 - PCI_CLASS_NETWORK_ETHERNET << 8, 0xffff00, 0}, 73 74 { } /* terminate list */ 75 }; ··· 185 186 #define PCNET32_TOTAL_SIZE 0x20 187 188 /* The PCNET32 Rx and Tx ring descriptors. */ 189 struct pcnet32_rx_head { 190 u32 base; ··· 291 u32 phymask; 292 }; 293 294 - static void pcnet32_probe_vlbus(void); 295 static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); 296 static int pcnet32_probe1(unsigned long, int, struct pci_dev *); 297 static int pcnet32_open(struct net_device *); ··· 432 .reset = pcnet32_dwio_reset 433 }; 434 435 #ifdef CONFIG_NET_POLL_CONTROLLER 436 static void pcnet32_poll_controller(struct net_device *dev) 437 { ··· 764 { 765 struct pcnet32_private *lp = dev->priv; 766 767 - ering->tx_max_pending = TX_MAX_RING_SIZE - 1; 768 - ering->tx_pending = lp->tx_ring_size - 1; 769 - ering->rx_max_pending = RX_MAX_RING_SIZE - 1; 770 - ering->rx_pending = lp->rx_ring_size - 1; 771 } 772 773 static int pcnet32_set_ringparam(struct net_device *dev, ··· 775 { 776 struct pcnet32_private *lp = dev->priv; 777 unsigned long flags; 778 int i; 779 780 if (ering->rx_mini_pending || ering->rx_jumbo_pending) 781 return -EINVAL; 782 783 if (netif_running(dev)) 784 - pcnet32_close(dev); 785 786 spin_lock_irqsave(&lp->lock, flags); 787 - pcnet32_free_ring(dev); 788 - lp->tx_ring_size = 789 - min(ering->tx_pending, (unsigned int)TX_MAX_RING_SIZE); 790 - lp->rx_ring_size = 791 - min(ering->rx_pending, (unsigned int)RX_MAX_RING_SIZE); 792 793 /* set the minimum ring size to 4, to allow the loopback test to work 794 * unchanged. 795 */ 796 for (i = 2; i <= PCNET32_LOG_MAX_TX_BUFFERS; i++) { 797 - if (lp->tx_ring_size <= (1 << i)) 798 break; 799 } 800 - lp->tx_ring_size = (1 << i); 801 - lp->tx_mod_mask = lp->tx_ring_size - 1; 802 - lp->tx_len_bits = (i << 12); 803 - 804 for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { 805 - if (lp->rx_ring_size <= (1 << i)) 806 break; 807 } 808 - lp->rx_ring_size = (1 << i); 809 - lp->rx_mod_mask = lp->rx_ring_size - 1; 810 - lp->rx_len_bits = (i << 4); 811 812 - if (pcnet32_alloc_ring(dev, dev->name)) { 813 - pcnet32_free_ring(dev); 814 - spin_unlock_irqrestore(&lp->lock, flags); 815 - return -ENOMEM; 816 } 817 818 spin_unlock_irqrestore(&lp->lock, flags); 819 820 - if (pcnet32_debug & NETIF_MSG_DRV) 821 - printk(KERN_INFO PFX 822 "%s: Ring Param Settings: RX: %d, TX: %d\n", dev->name, 823 lp->rx_ring_size, lp->tx_ring_size); 824 - 825 - if (netif_running(dev)) 826 - pcnet32_open(dev); 827 828 return 0; 829 } ··· 875 unsigned long flags; 876 unsigned long ticks; 877 878 - *data1 = 1; /* status of test, default to fail */ 879 rc = 1; /* default to fail */ 880 881 if (netif_running(dev)) 882 pcnet32_close(dev); 883 884 spin_lock_irqsave(&lp->lock, flags); 885 886 /* Reset the PCNET32 */ 887 lp->a.reset(ioaddr); 888 889 /* switch pcnet32 to 32bit mode */ 890 lp->a.write_bcr(ioaddr, 20, 2); 891 892 - lp->init_block.mode = 893 - le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); 894 - lp->init_block.filter[0] = 0; 895 - lp->init_block.filter[1] = 0; 896 - 897 /* purge & init rings but don't actually restart */ 898 pcnet32_restart(dev, 0x0000); 899 900 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 901 902 /* Initialize Transmit buffers. */ 903 size = data_len + 15; ··· 937 } 938 } 939 940 - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ 941 - x = x | 0x0002; 942 - a->write_bcr(ioaddr, 32, x); 943 944 - lp->a.write_csr(ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ 945 946 teststatus = le16_to_cpu(0x8000); 947 - lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ 948 949 /* Check status of descriptors */ 950 for (x = 0; x < numbuffs; x++) { ··· 953 rmb(); 954 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 955 spin_unlock_irqrestore(&lp->lock, flags); 956 - mdelay(1); 957 spin_lock_irqsave(&lp->lock, flags); 958 rmb(); 959 ticks++; ··· 966 } 967 } 968 969 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 970 wmb(); 971 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 972 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 999 } 1000 x++; 1001 } 1002 - if (!rc) { 1003 - *data1 = 0; 1004 - } 1005 1006 clean_up: 1007 pcnet32_purge_tx_ring(dev); 1008 - x = a->read_csr(ioaddr, 15) & 0xFFFF; 1009 - a->write_csr(ioaddr, 15, (x & ~0x0044)); /* reset bits 6 and 2 */ 1010 1011 x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ 1012 - x = x & ~0x0002; 1013 - a->write_bcr(ioaddr, 32, x); 1014 - 1015 - spin_unlock_irqrestore(&lp->lock, flags); 1016 1017 if (netif_running(dev)) { 1018 pcnet32_open(dev); 1019 } else { 1020 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 1021 } 1022 1023 return (rc); ··· 1079 return 0; 1080 } 1081 1082 #define PCNET32_REGS_PER_PHY 32 1083 #define PCNET32_MAX_PHYS 32 1084 static int pcnet32_get_regs_len(struct net_device *dev) ··· 1134 struct pcnet32_private *lp = dev->priv; 1135 struct pcnet32_access *a = &lp->a; 1136 ulong ioaddr = dev->base_addr; 1137 - int ticks; 1138 unsigned long flags; 1139 1140 spin_lock_irqsave(&lp->lock, flags); 1141 1142 - csr0 = a->read_csr(ioaddr, 0); 1143 - if (!(csr0 & 0x0004)) { /* If not stopped */ 1144 - /* set SUSPEND (SPND) - CSR5 bit 0 */ 1145 - a->write_csr(ioaddr, 5, 0x0001); 1146 - 1147 - /* poll waiting for bit to be set */ 1148 - ticks = 0; 1149 - while (!(a->read_csr(ioaddr, 5) & 0x0001)) { 1150 - spin_unlock_irqrestore(&lp->lock, flags); 1151 - mdelay(1); 1152 - spin_lock_irqsave(&lp->lock, flags); 1153 - ticks++; 1154 - if (ticks > 200) { 1155 - if (netif_msg_hw(lp)) 1156 - printk(KERN_DEBUG 1157 - "%s: Error getting into suspend!\n", 1158 - dev->name); 1159 - break; 1160 - } 1161 - } 1162 - } 1163 1164 /* read address PROM */ 1165 for (i = 0; i < 16; i += 2) ··· 1177 } 1178 } 1179 1180 - if (!(csr0 & 0x0004)) { /* If not stopped */ 1181 /* clear SUSPEND (SPND) - CSR5 bit 0 */ 1182 - a->write_csr(ioaddr, 5, 0x0000); 1183 } 1184 1185 spin_unlock_irqrestore(&lp->lock, flags); ··· 1213 /* only probes for non-PCI devices, the rest are handled by 1214 * pci_register_driver via pcnet32_probe_pci */ 1215 1216 - static void __devinit pcnet32_probe_vlbus(void) 1217 { 1218 unsigned int *port, ioaddr; 1219 ··· 1697 lp->tx_ring_size, 1698 &lp->tx_ring_dma_addr); 1699 if (lp->tx_ring == NULL) { 1700 - if (pcnet32_debug & NETIF_MSG_DRV) 1701 printk("\n" KERN_ERR PFX 1702 "%s: Consistent memory allocation failed.\n", 1703 name); ··· 1709 lp->rx_ring_size, 1710 &lp->rx_ring_dma_addr); 1711 if (lp->rx_ring == NULL) { 1712 - if (pcnet32_debug & NETIF_MSG_DRV) 1713 printk("\n" KERN_ERR PFX 1714 "%s: Consistent memory allocation failed.\n", 1715 name); 1716 return -ENOMEM; 1717 } 1718 1719 - lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, 1720 GFP_ATOMIC); 1721 if (!lp->tx_dma_addr) { 1722 - if (pcnet32_debug & NETIF_MSG_DRV) 1723 printk("\n" KERN_ERR PFX 1724 "%s: Memory allocation failed.\n", name); 1725 return -ENOMEM; 1726 } 1727 - memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); 1728 1729 - lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, 1730 GFP_ATOMIC); 1731 if (!lp->rx_dma_addr) { 1732 - if (pcnet32_debug & NETIF_MSG_DRV) 1733 printk("\n" KERN_ERR PFX 1734 "%s: Memory allocation failed.\n", name); 1735 return -ENOMEM; 1736 } 1737 - memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); 1738 1739 - lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, 1740 GFP_ATOMIC); 1741 if (!lp->tx_skbuff) { 1742 - if (pcnet32_debug & NETIF_MSG_DRV) 1743 printk("\n" KERN_ERR PFX 1744 "%s: Memory allocation failed.\n", name); 1745 return -ENOMEM; 1746 } 1747 - memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); 1748 1749 - lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, 1750 GFP_ATOMIC); 1751 if (!lp->rx_skbuff) { 1752 - if (pcnet32_debug & NETIF_MSG_DRV) 1753 printk("\n" KERN_ERR PFX 1754 "%s: Memory allocation failed.\n", name); 1755 return -ENOMEM; 1756 } 1757 - memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); 1758 1759 return 0; 1760 } ··· 2014 2015 err_free_ring: 2016 /* free any allocated skbuffs */ 2017 - for (i = 0; i < lp->rx_ring_size; i++) { 2018 - lp->rx_ring[i].status = 0; 2019 - if (lp->rx_skbuff[i]) { 2020 - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 2021 - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 2022 - dev_kfree_skb(lp->rx_skbuff[i]); 2023 - } 2024 - lp->rx_skbuff[i] = NULL; 2025 - lp->rx_dma_addr[i] = 0; 2026 - } 2027 2028 /* 2029 * Switch back to 16bit mode to avoid problems with dumb ··· 2596 { 2597 unsigned long ioaddr = dev->base_addr; 2598 struct pcnet32_private *lp = dev->priv; 2599 - int i; 2600 unsigned long flags; 2601 2602 del_timer_sync(&lp->watchdog_timer); ··· 2626 2627 spin_lock_irqsave(&lp->lock, flags); 2628 2629 - /* free all allocated skbuffs */ 2630 - for (i = 0; i < lp->rx_ring_size; i++) { 2631 - lp->rx_ring[i].status = 0; 2632 - wmb(); /* Make sure adapter sees owner change */ 2633 - if (lp->rx_skbuff[i]) { 2634 - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 2635 - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 2636 - dev_kfree_skb(lp->rx_skbuff[i]); 2637 - } 2638 - lp->rx_skbuff[i] = NULL; 2639 - lp->rx_dma_addr[i] = 0; 2640 - } 2641 - 2642 - for (i = 0; i < lp->tx_ring_size; i++) { 2643 - lp->tx_ring[i].status = 0; /* CPU owns buffer */ 2644 - wmb(); /* Make sure adapter sees owner change */ 2645 - if (lp->tx_skbuff[i]) { 2646 - pci_unmap_single(lp->pci_dev, lp->tx_dma_addr[i], 2647 - lp->tx_skbuff[i]->len, 2648 - PCI_DMA_TODEVICE); 2649 - dev_kfree_skb(lp->tx_skbuff[i]); 2650 - } 2651 - lp->tx_skbuff[i] = NULL; 2652 - lp->tx_dma_addr[i] = 0; 2653 - } 2654 2655 spin_unlock_irqrestore(&lp->lock, flags); 2656 ··· 2657 volatile struct pcnet32_init_block *ib = &lp->init_block; 2658 volatile u16 *mcast_table = (u16 *) & ib->filter; 2659 struct dev_mc_list *dmi = dev->mc_list; 2660 char *addrs; 2661 int i; 2662 u32 crc; ··· 2666 if (dev->flags & IFF_ALLMULTI) { 2667 ib->filter[0] = 0xffffffff; 2668 ib->filter[1] = 0xffffffff; 2669 return; 2670 } 2671 /* clear the multicast filter */ ··· 2691 le16_to_cpu(le16_to_cpu(mcast_table[crc >> 4]) | 2692 (1 << (crc & 0xf))); 2693 } 2694 return; 2695 } 2696 ··· 2704 { 2705 unsigned long ioaddr = dev->base_addr, flags; 2706 struct pcnet32_private *lp = dev->priv; 2707 2708 spin_lock_irqsave(&lp->lock, flags); 2709 if (dev->flags & IFF_PROMISC) { 2710 /* Log any net taps. */ 2711 if (netif_msg_hw(lp)) ··· 2717 lp->init_block.mode = 2718 le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 2719 7); 2720 } else { 2721 lp->init_block.mode = 2722 le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); 2723 pcnet32_load_multicast(dev); 2724 } 2725 2726 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Temporarily stop the lance. */ 2727 - pcnet32_restart(dev, 0x0042); /* Resume normal operation */ 2728 - netif_wake_queue(dev); 2729 2730 spin_unlock_irqrestore(&lp->lock, flags); 2731 } ··· 2974 2975 /* should we find any remaining VLbus devices ? */ 2976 if (pcnet32vlb) 2977 - pcnet32_probe_vlbus(); 2978 2979 if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) 2980 printk(KERN_INFO PFX "%d cards_found.\n", cards_found);
··· 58 * PCI device identifiers for "new style" Linux PCI Device Drivers 59 */ 60 static struct pci_device_id pcnet32_pci_tbl[] = { 61 + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE_HOME), }, 62 + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE), }, 63 64 /* 65 * Adapters that were sold with IBM's RS/6000 or pSeries hardware have 66 * the incorrect vendor id. 67 */ 68 + { PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE), 69 + .class = (PCI_CLASS_NETWORK_ETHERNET << 8), .class_mask = 0xffff00, }, 70 71 { } /* terminate list */ 72 }; ··· 188 189 #define PCNET32_TOTAL_SIZE 0x20 190 191 + #define CSR0 0 192 + #define CSR0_INIT 0x1 193 + #define CSR0_START 0x2 194 + #define CSR0_STOP 0x4 195 + #define CSR0_TXPOLL 0x8 196 + #define CSR0_INTEN 0x40 197 + #define CSR0_IDON 0x0100 198 + #define CSR0_NORMAL (CSR0_START | CSR0_INTEN) 199 + #define PCNET32_INIT_LOW 1 200 + #define PCNET32_INIT_HIGH 2 201 + #define CSR3 3 202 + #define CSR4 4 203 + #define CSR5 5 204 + #define CSR5_SUSPEND 0x0001 205 + #define CSR15 15 206 + #define PCNET32_MC_FILTER 8 207 + 208 /* The PCNET32 Rx and Tx ring descriptors. */ 209 struct pcnet32_rx_head { 210 u32 base; ··· 277 u32 phymask; 278 }; 279 280 static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); 281 static int pcnet32_probe1(unsigned long, int, struct pci_dev *); 282 static int pcnet32_open(struct net_device *); ··· 419 .reset = pcnet32_dwio_reset 420 }; 421 422 + static void pcnet32_netif_stop(struct net_device *dev) 423 + { 424 + dev->trans_start = jiffies; 425 + netif_poll_disable(dev); 426 + netif_tx_disable(dev); 427 + } 428 + 429 + static void pcnet32_netif_start(struct net_device *dev) 430 + { 431 + netif_wake_queue(dev); 432 + netif_poll_enable(dev); 433 + } 434 + 435 + /* 436 + * Allocate space for the new sized tx ring. 437 + * Free old resources 438 + * Save new resources. 439 + * Any failure keeps old resources. 440 + * Must be called with lp->lock held. 441 + */ 442 + static void pcnet32_realloc_tx_ring(struct net_device *dev, 443 + struct pcnet32_private *lp, 444 + unsigned int size) 445 + { 446 + dma_addr_t new_ring_dma_addr; 447 + dma_addr_t *new_dma_addr_list; 448 + struct pcnet32_tx_head *new_tx_ring; 449 + struct sk_buff **new_skb_list; 450 + 451 + pcnet32_purge_tx_ring(dev); 452 + 453 + new_tx_ring = pci_alloc_consistent(lp->pci_dev, 454 + sizeof(struct pcnet32_tx_head) * 455 + (1 << size), 456 + &new_ring_dma_addr); 457 + if (new_tx_ring == NULL) { 458 + if (netif_msg_drv(lp)) 459 + printk("\n" KERN_ERR 460 + "%s: Consistent memory allocation failed.\n", 461 + dev->name); 462 + return; 463 + } 464 + memset(new_tx_ring, 0, sizeof(struct pcnet32_tx_head) * (1 << size)); 465 + 466 + new_dma_addr_list = kcalloc((1 << size), sizeof(dma_addr_t), 467 + GFP_ATOMIC); 468 + if (!new_dma_addr_list) { 469 + if (netif_msg_drv(lp)) 470 + printk("\n" KERN_ERR 471 + "%s: Memory allocation failed.\n", dev->name); 472 + goto free_new_tx_ring; 473 + } 474 + 475 + new_skb_list = kcalloc((1 << size), sizeof(struct sk_buff *), 476 + GFP_ATOMIC); 477 + if (!new_skb_list) { 478 + if (netif_msg_drv(lp)) 479 + printk("\n" KERN_ERR 480 + "%s: Memory allocation failed.\n", dev->name); 481 + goto free_new_lists; 482 + } 483 + 484 + kfree(lp->tx_skbuff); 485 + kfree(lp->tx_dma_addr); 486 + pci_free_consistent(lp->pci_dev, 487 + sizeof(struct pcnet32_tx_head) * 488 + lp->tx_ring_size, lp->tx_ring, 489 + lp->tx_ring_dma_addr); 490 + 491 + lp->tx_ring_size = (1 << size); 492 + lp->tx_mod_mask = lp->tx_ring_size - 1; 493 + lp->tx_len_bits = (size << 12); 494 + lp->tx_ring = new_tx_ring; 495 + lp->tx_ring_dma_addr = new_ring_dma_addr; 496 + lp->tx_dma_addr = new_dma_addr_list; 497 + lp->tx_skbuff = new_skb_list; 498 + return; 499 + 500 + free_new_lists: 501 + kfree(new_dma_addr_list); 502 + free_new_tx_ring: 503 + pci_free_consistent(lp->pci_dev, 504 + sizeof(struct pcnet32_tx_head) * 505 + (1 << size), 506 + new_tx_ring, 507 + new_ring_dma_addr); 508 + return; 509 + } 510 + 511 + /* 512 + * Allocate space for the new sized rx ring. 513 + * Re-use old receive buffers. 514 + * alloc extra buffers 515 + * free unneeded buffers 516 + * free unneeded buffers 517 + * Save new resources. 518 + * Any failure keeps old resources. 519 + * Must be called with lp->lock held. 520 + */ 521 + static void pcnet32_realloc_rx_ring(struct net_device *dev, 522 + struct pcnet32_private *lp, 523 + unsigned int size) 524 + { 525 + dma_addr_t new_ring_dma_addr; 526 + dma_addr_t *new_dma_addr_list; 527 + struct pcnet32_rx_head *new_rx_ring; 528 + struct sk_buff **new_skb_list; 529 + int new, overlap; 530 + 531 + new_rx_ring = pci_alloc_consistent(lp->pci_dev, 532 + sizeof(struct pcnet32_rx_head) * 533 + (1 << size), 534 + &new_ring_dma_addr); 535 + if (new_rx_ring == NULL) { 536 + if (netif_msg_drv(lp)) 537 + printk("\n" KERN_ERR 538 + "%s: Consistent memory allocation failed.\n", 539 + dev->name); 540 + return; 541 + } 542 + memset(new_rx_ring, 0, sizeof(struct pcnet32_rx_head) * (1 << size)); 543 + 544 + new_dma_addr_list = kcalloc((1 << size), sizeof(dma_addr_t), 545 + GFP_ATOMIC); 546 + if (!new_dma_addr_list) { 547 + if (netif_msg_drv(lp)) 548 + printk("\n" KERN_ERR 549 + "%s: Memory allocation failed.\n", dev->name); 550 + goto free_new_rx_ring; 551 + } 552 + 553 + new_skb_list = kcalloc((1 << size), sizeof(struct sk_buff *), 554 + GFP_ATOMIC); 555 + if (!new_skb_list) { 556 + if (netif_msg_drv(lp)) 557 + printk("\n" KERN_ERR 558 + "%s: Memory allocation failed.\n", dev->name); 559 + goto free_new_lists; 560 + } 561 + 562 + /* first copy the current receive buffers */ 563 + overlap = min(size, lp->rx_ring_size); 564 + for (new = 0; new < overlap; new++) { 565 + new_rx_ring[new] = lp->rx_ring[new]; 566 + new_dma_addr_list[new] = lp->rx_dma_addr[new]; 567 + new_skb_list[new] = lp->rx_skbuff[new]; 568 + } 569 + /* now allocate any new buffers needed */ 570 + for (; new < size; new++ ) { 571 + struct sk_buff *rx_skbuff; 572 + new_skb_list[new] = dev_alloc_skb(PKT_BUF_SZ); 573 + if (!(rx_skbuff = new_skb_list[new])) { 574 + /* keep the original lists and buffers */ 575 + if (netif_msg_drv(lp)) 576 + printk(KERN_ERR 577 + "%s: pcnet32_realloc_rx_ring dev_alloc_skb failed.\n", 578 + dev->name); 579 + goto free_all_new; 580 + } 581 + skb_reserve(rx_skbuff, 2); 582 + 583 + new_dma_addr_list[new] = 584 + pci_map_single(lp->pci_dev, rx_skbuff->data, 585 + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 586 + new_rx_ring[new].base = (u32) le32_to_cpu(new_dma_addr_list[new]); 587 + new_rx_ring[new].buf_length = le16_to_cpu(2 - PKT_BUF_SZ); 588 + new_rx_ring[new].status = le16_to_cpu(0x8000); 589 + } 590 + /* and free any unneeded buffers */ 591 + for (; new < lp->rx_ring_size; new++) { 592 + if (lp->rx_skbuff[new]) { 593 + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[new], 594 + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 595 + dev_kfree_skb(lp->rx_skbuff[new]); 596 + } 597 + } 598 + 599 + kfree(lp->rx_skbuff); 600 + kfree(lp->rx_dma_addr); 601 + pci_free_consistent(lp->pci_dev, 602 + sizeof(struct pcnet32_rx_head) * 603 + lp->rx_ring_size, lp->rx_ring, 604 + lp->rx_ring_dma_addr); 605 + 606 + lp->rx_ring_size = (1 << size); 607 + lp->rx_mod_mask = lp->rx_ring_size - 1; 608 + lp->rx_len_bits = (size << 4); 609 + lp->rx_ring = new_rx_ring; 610 + lp->rx_ring_dma_addr = new_ring_dma_addr; 611 + lp->rx_dma_addr = new_dma_addr_list; 612 + lp->rx_skbuff = new_skb_list; 613 + return; 614 + 615 + free_all_new: 616 + for (; --new >= lp->rx_ring_size; ) { 617 + if (new_skb_list[new]) { 618 + pci_unmap_single(lp->pci_dev, new_dma_addr_list[new], 619 + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 620 + dev_kfree_skb(new_skb_list[new]); 621 + } 622 + } 623 + kfree(new_skb_list); 624 + free_new_lists: 625 + kfree(new_dma_addr_list); 626 + free_new_rx_ring: 627 + pci_free_consistent(lp->pci_dev, 628 + sizeof(struct pcnet32_rx_head) * 629 + (1 << size), 630 + new_rx_ring, 631 + new_ring_dma_addr); 632 + return; 633 + } 634 + 635 + static void pcnet32_purge_rx_ring(struct net_device *dev) 636 + { 637 + struct pcnet32_private *lp = dev->priv; 638 + int i; 639 + 640 + /* free all allocated skbuffs */ 641 + for (i = 0; i < lp->rx_ring_size; i++) { 642 + lp->rx_ring[i].status = 0; /* CPU owns buffer */ 643 + wmb(); /* Make sure adapter sees owner change */ 644 + if (lp->rx_skbuff[i]) { 645 + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 646 + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 647 + dev_kfree_skb_any(lp->rx_skbuff[i]); 648 + } 649 + lp->rx_skbuff[i] = NULL; 650 + lp->rx_dma_addr[i] = 0; 651 + } 652 + } 653 + 654 #ifdef CONFIG_NET_POLL_CONTROLLER 655 static void pcnet32_poll_controller(struct net_device *dev) 656 { ··· 519 { 520 struct pcnet32_private *lp = dev->priv; 521 522 + ering->tx_max_pending = TX_MAX_RING_SIZE; 523 + ering->tx_pending = lp->tx_ring_size; 524 + ering->rx_max_pending = RX_MAX_RING_SIZE; 525 + ering->rx_pending = lp->rx_ring_size; 526 } 527 528 static int pcnet32_set_ringparam(struct net_device *dev, ··· 530 { 531 struct pcnet32_private *lp = dev->priv; 532 unsigned long flags; 533 + unsigned int size; 534 + ulong ioaddr = dev->base_addr; 535 int i; 536 537 if (ering->rx_mini_pending || ering->rx_jumbo_pending) 538 return -EINVAL; 539 540 if (netif_running(dev)) 541 + pcnet32_netif_stop(dev); 542 543 spin_lock_irqsave(&lp->lock, flags); 544 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ 545 + 546 + size = min(ering->tx_pending, (unsigned int)TX_MAX_RING_SIZE); 547 548 /* set the minimum ring size to 4, to allow the loopback test to work 549 * unchanged. 550 */ 551 for (i = 2; i <= PCNET32_LOG_MAX_TX_BUFFERS; i++) { 552 + if (size <= (1 << i)) 553 break; 554 } 555 + if ((1 << i) != lp->tx_ring_size) 556 + pcnet32_realloc_tx_ring(dev, lp, i); 557 + 558 + size = min(ering->rx_pending, (unsigned int)RX_MAX_RING_SIZE); 559 for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { 560 + if (size <= (1 << i)) 561 break; 562 } 563 + if ((1 << i) != lp->rx_ring_size) 564 + pcnet32_realloc_rx_ring(dev, lp, i); 565 + 566 + dev->weight = lp->rx_ring_size / 2; 567 568 + if (netif_running(dev)) { 569 + pcnet32_netif_start(dev); 570 + pcnet32_restart(dev, CSR0_NORMAL); 571 } 572 573 spin_unlock_irqrestore(&lp->lock, flags); 574 575 + if (netif_msg_drv(lp)) 576 + printk(KERN_INFO 577 "%s: Ring Param Settings: RX: %d, TX: %d\n", dev->name, 578 lp->rx_ring_size, lp->tx_ring_size); 579 580 return 0; 581 } ··· 633 unsigned long flags; 634 unsigned long ticks; 635 636 rc = 1; /* default to fail */ 637 638 if (netif_running(dev)) 639 pcnet32_close(dev); 640 641 spin_lock_irqsave(&lp->lock, flags); 642 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ 643 + 644 + numbuffs = min(numbuffs, (int)min(lp->rx_ring_size, lp->tx_ring_size)); 645 646 /* Reset the PCNET32 */ 647 lp->a.reset(ioaddr); 648 + lp->a.write_csr(ioaddr, CSR4, 0x0915); 649 650 /* switch pcnet32 to 32bit mode */ 651 lp->a.write_bcr(ioaddr, 20, 2); 652 653 /* purge & init rings but don't actually restart */ 654 pcnet32_restart(dev, 0x0000); 655 656 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 657 658 /* Initialize Transmit buffers. */ 659 size = data_len + 15; ··· 697 } 698 } 699 700 + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ 701 + a->write_bcr(ioaddr, 32, x | 0x0002); 702 703 + /* set int loopback in CSR15 */ 704 + x = a->read_csr(ioaddr, CSR15) & 0xfffc; 705 + lp->a.write_csr(ioaddr, CSR15, x | 0x0044); 706 707 teststatus = le16_to_cpu(0x8000); 708 + lp->a.write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ 709 710 /* Check status of descriptors */ 711 for (x = 0; x < numbuffs; x++) { ··· 712 rmb(); 713 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 714 spin_unlock_irqrestore(&lp->lock, flags); 715 + msleep(1); 716 spin_lock_irqsave(&lp->lock, flags); 717 rmb(); 718 ticks++; ··· 725 } 726 } 727 728 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 729 wmb(); 730 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 731 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 758 } 759 x++; 760 } 761 762 clean_up: 763 + *data1 = rc; 764 pcnet32_purge_tx_ring(dev); 765 + 766 + x = a->read_csr(ioaddr, CSR15); 767 + a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ 768 769 x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ 770 + a->write_bcr(ioaddr, 32, (x & ~0x0002)); 771 772 if (netif_running(dev)) { 773 + spin_unlock_irqrestore(&lp->lock, flags); 774 pcnet32_open(dev); 775 } else { 776 + pcnet32_purge_rx_ring(dev); 777 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 778 + spin_unlock_irqrestore(&lp->lock, flags); 779 } 780 781 return (rc); ··· 839 return 0; 840 } 841 842 + /* 843 + * lp->lock must be held. 844 + */ 845 + static int pcnet32_suspend(struct net_device *dev, unsigned long *flags, 846 + int can_sleep) 847 + { 848 + int csr5; 849 + struct pcnet32_private *lp = dev->priv; 850 + struct pcnet32_access *a = &lp->a; 851 + ulong ioaddr = dev->base_addr; 852 + int ticks; 853 + 854 + /* set SUSPEND (SPND) - CSR5 bit 0 */ 855 + csr5 = a->read_csr(ioaddr, CSR5); 856 + a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); 857 + 858 + /* poll waiting for bit to be set */ 859 + ticks = 0; 860 + while (!(a->read_csr(ioaddr, CSR5) & CSR5_SUSPEND)) { 861 + spin_unlock_irqrestore(&lp->lock, *flags); 862 + if (can_sleep) 863 + msleep(1); 864 + else 865 + mdelay(1); 866 + spin_lock_irqsave(&lp->lock, *flags); 867 + ticks++; 868 + if (ticks > 200) { 869 + if (netif_msg_hw(lp)) 870 + printk(KERN_DEBUG 871 + "%s: Error getting into suspend!\n", 872 + dev->name); 873 + return 0; 874 + } 875 + } 876 + return 1; 877 + } 878 + 879 #define PCNET32_REGS_PER_PHY 32 880 #define PCNET32_MAX_PHYS 32 881 static int pcnet32_get_regs_len(struct net_device *dev) ··· 857 struct pcnet32_private *lp = dev->priv; 858 struct pcnet32_access *a = &lp->a; 859 ulong ioaddr = dev->base_addr; 860 unsigned long flags; 861 862 spin_lock_irqsave(&lp->lock, flags); 863 864 + csr0 = a->read_csr(ioaddr, CSR0); 865 + if (!(csr0 & CSR0_STOP)) /* If not stopped */ 866 + pcnet32_suspend(dev, &flags, 1); 867 868 /* read address PROM */ 869 for (i = 0; i < 16; i += 2) ··· 919 } 920 } 921 922 + if (!(csr0 & CSR0_STOP)) { /* If not stopped */ 923 + int csr5; 924 + 925 /* clear SUSPEND (SPND) - CSR5 bit 0 */ 926 + csr5 = a->read_csr(ioaddr, CSR5); 927 + a->write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); 928 } 929 930 spin_unlock_irqrestore(&lp->lock, flags); ··· 952 /* only probes for non-PCI devices, the rest are handled by 953 * pci_register_driver via pcnet32_probe_pci */ 954 955 + static void __devinit pcnet32_probe_vlbus(unsigned int *pcnet32_portlist) 956 { 957 unsigned int *port, ioaddr; 958 ··· 1436 lp->tx_ring_size, 1437 &lp->tx_ring_dma_addr); 1438 if (lp->tx_ring == NULL) { 1439 + if (netif_msg_drv(lp)) 1440 printk("\n" KERN_ERR PFX 1441 "%s: Consistent memory allocation failed.\n", 1442 name); ··· 1448 lp->rx_ring_size, 1449 &lp->rx_ring_dma_addr); 1450 if (lp->rx_ring == NULL) { 1451 + if (netif_msg_drv(lp)) 1452 printk("\n" KERN_ERR PFX 1453 "%s: Consistent memory allocation failed.\n", 1454 name); 1455 return -ENOMEM; 1456 } 1457 1458 + lp->tx_dma_addr = kcalloc(lp->tx_ring_size, sizeof(dma_addr_t), 1459 GFP_ATOMIC); 1460 if (!lp->tx_dma_addr) { 1461 + if (netif_msg_drv(lp)) 1462 printk("\n" KERN_ERR PFX 1463 "%s: Memory allocation failed.\n", name); 1464 return -ENOMEM; 1465 } 1466 1467 + lp->rx_dma_addr = kcalloc(lp->rx_ring_size, sizeof(dma_addr_t), 1468 GFP_ATOMIC); 1469 if (!lp->rx_dma_addr) { 1470 + if (netif_msg_drv(lp)) 1471 printk("\n" KERN_ERR PFX 1472 "%s: Memory allocation failed.\n", name); 1473 return -ENOMEM; 1474 } 1475 1476 + lp->tx_skbuff = kcalloc(lp->tx_ring_size, sizeof(struct sk_buff *), 1477 GFP_ATOMIC); 1478 if (!lp->tx_skbuff) { 1479 + if (netif_msg_drv(lp)) 1480 printk("\n" KERN_ERR PFX 1481 "%s: Memory allocation failed.\n", name); 1482 return -ENOMEM; 1483 } 1484 1485 + lp->rx_skbuff = kcalloc(lp->rx_ring_size, sizeof(struct sk_buff *), 1486 GFP_ATOMIC); 1487 if (!lp->rx_skbuff) { 1488 + if (netif_msg_drv(lp)) 1489 printk("\n" KERN_ERR PFX 1490 "%s: Memory allocation failed.\n", name); 1491 return -ENOMEM; 1492 } 1493 1494 return 0; 1495 } ··· 1757 1758 err_free_ring: 1759 /* free any allocated skbuffs */ 1760 + pcnet32_purge_rx_ring(dev); 1761 1762 /* 1763 * Switch back to 16bit mode to avoid problems with dumb ··· 2348 { 2349 unsigned long ioaddr = dev->base_addr; 2350 struct pcnet32_private *lp = dev->priv; 2351 unsigned long flags; 2352 2353 del_timer_sync(&lp->watchdog_timer); ··· 2379 2380 spin_lock_irqsave(&lp->lock, flags); 2381 2382 + pcnet32_purge_rx_ring(dev); 2383 + pcnet32_purge_tx_ring(dev); 2384 2385 spin_unlock_irqrestore(&lp->lock, flags); 2386 ··· 2433 volatile struct pcnet32_init_block *ib = &lp->init_block; 2434 volatile u16 *mcast_table = (u16 *) & ib->filter; 2435 struct dev_mc_list *dmi = dev->mc_list; 2436 + unsigned long ioaddr = dev->base_addr; 2437 char *addrs; 2438 int i; 2439 u32 crc; ··· 2441 if (dev->flags & IFF_ALLMULTI) { 2442 ib->filter[0] = 0xffffffff; 2443 ib->filter[1] = 0xffffffff; 2444 + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER, 0xffff); 2445 + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+1, 0xffff); 2446 + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+2, 0xffff); 2447 + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER+3, 0xffff); 2448 return; 2449 } 2450 /* clear the multicast filter */ ··· 2462 le16_to_cpu(le16_to_cpu(mcast_table[crc >> 4]) | 2463 (1 << (crc & 0xf))); 2464 } 2465 + for (i = 0; i < 4; i++) 2466 + lp->a.write_csr(ioaddr, PCNET32_MC_FILTER + i, 2467 + le16_to_cpu(mcast_table[i])); 2468 return; 2469 } 2470 ··· 2472 { 2473 unsigned long ioaddr = dev->base_addr, flags; 2474 struct pcnet32_private *lp = dev->priv; 2475 + int csr15, suspended; 2476 2477 spin_lock_irqsave(&lp->lock, flags); 2478 + suspended = pcnet32_suspend(dev, &flags, 0); 2479 + csr15 = lp->a.read_csr(ioaddr, CSR15); 2480 if (dev->flags & IFF_PROMISC) { 2481 /* Log any net taps. */ 2482 if (netif_msg_hw(lp)) ··· 2482 lp->init_block.mode = 2483 le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 2484 7); 2485 + lp->a.write_csr(ioaddr, CSR15, csr15 | 0x8000); 2486 } else { 2487 lp->init_block.mode = 2488 le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); 2489 + lp->a.write_csr(ioaddr, CSR15, csr15 & 0x7fff); 2490 pcnet32_load_multicast(dev); 2491 } 2492 2493 + if (suspended) { 2494 + int csr5; 2495 + /* clear SUSPEND (SPND) - CSR5 bit 0 */ 2496 + csr5 = lp->a.read_csr(ioaddr, CSR5); 2497 + lp->a.write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); 2498 + } else { 2499 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); 2500 + pcnet32_restart(dev, CSR0_NORMAL); 2501 + netif_wake_queue(dev); 2502 + } 2503 2504 spin_unlock_irqrestore(&lp->lock, flags); 2505 } ··· 2730 2731 /* should we find any remaining VLbus devices ? */ 2732 if (pcnet32vlb) 2733 + pcnet32_probe_vlbus(pcnet32_portlist); 2734 2735 if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) 2736 printk(KERN_INFO PFX "%d cards_found.\n", cards_found);
+36 -6
drivers/net/phy/cicada.c
··· 103 return err; 104 } 105 106 - /* Cicada 820x */ 107 static struct phy_driver cis8204_driver = { 108 .phy_id = 0x000fc440, 109 .name = "Cicada Cis8204", ··· 133 .driver = { .owner = THIS_MODULE,}, 134 }; 135 136 - static int __init cis8204_init(void) 137 { 138 - return phy_driver_register(&cis8204_driver); 139 } 140 141 - static void __exit cis8204_exit(void) 142 { 143 phy_driver_unregister(&cis8204_driver); 144 } 145 146 - module_init(cis8204_init); 147 - module_exit(cis8204_exit);
··· 103 return err; 104 } 105 106 + /* Cicada 8201, a.k.a Vitesse VSC8201 */ 107 + static struct phy_driver cis8201_driver = { 108 + .phy_id = 0x000fc410, 109 + .name = "Cicada Cis8201", 110 + .phy_id_mask = 0x000ffff0, 111 + .features = PHY_GBIT_FEATURES, 112 + .flags = PHY_HAS_INTERRUPT, 113 + .config_init = &cis820x_config_init, 114 + .config_aneg = &genphy_config_aneg, 115 + .read_status = &genphy_read_status, 116 + .ack_interrupt = &cis820x_ack_interrupt, 117 + .config_intr = &cis820x_config_intr, 118 + .driver = { .owner = THIS_MODULE,}, 119 + }; 120 + 121 + /* Cicada 8204 */ 122 static struct phy_driver cis8204_driver = { 123 .phy_id = 0x000fc440, 124 .name = "Cicada Cis8204", ··· 118 .driver = { .owner = THIS_MODULE,}, 119 }; 120 121 + static int __init cicada_init(void) 122 { 123 + int ret; 124 + 125 + ret = phy_driver_register(&cis8204_driver); 126 + if (ret) 127 + goto err1; 128 + 129 + ret = phy_driver_register(&cis8201_driver); 130 + if (ret) 131 + goto err2; 132 + return 0; 133 + 134 + err2: 135 + phy_driver_unregister(&cis8204_driver); 136 + err1: 137 + return ret; 138 } 139 140 + static void __exit cicada_exit(void) 141 { 142 phy_driver_unregister(&cis8204_driver); 143 + phy_driver_unregister(&cis8201_driver); 144 } 145 146 + module_init(cicada_init); 147 + module_exit(cicada_exit);
+16 -24
drivers/net/r8169.c
··· 1406 dev = alloc_etherdev(sizeof (*tp)); 1407 if (dev == NULL) { 1408 if (netif_msg_drv(&debug)) 1409 - printk(KERN_ERR PFX "unable to alloc new ethernet\n"); 1410 goto err_out; 1411 } 1412 ··· 1418 /* enable device (incl. PCI PM wakeup and hotplug setup) */ 1419 rc = pci_enable_device(pdev); 1420 if (rc < 0) { 1421 - if (netif_msg_probe(tp)) { 1422 - printk(KERN_ERR PFX "%s: enable failure\n", 1423 - pci_name(pdev)); 1424 - } 1425 goto err_out_free_dev; 1426 } 1427 ··· 1435 pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command); 1436 acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK; 1437 } else { 1438 - if (netif_msg_probe(tp)) { 1439 - printk(KERN_ERR PFX 1440 "PowerManagement capability not found.\n"); 1441 - } 1442 } 1443 1444 /* make sure PCI base addr 1 is MMIO */ 1445 if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 1446 - if (netif_msg_probe(tp)) { 1447 - printk(KERN_ERR PFX 1448 "region #1 not an MMIO resource, aborting\n"); 1449 - } 1450 rc = -ENODEV; 1451 goto err_out_mwi; 1452 } 1453 /* check for weird/broken PCI region reporting */ 1454 if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) { 1455 - if (netif_msg_probe(tp)) { 1456 - printk(KERN_ERR PFX 1457 "Invalid PCI region size(s), aborting\n"); 1458 - } 1459 rc = -ENODEV; 1460 goto err_out_mwi; 1461 } 1462 1463 rc = pci_request_regions(pdev, MODULENAME); 1464 if (rc < 0) { 1465 - if (netif_msg_probe(tp)) { 1466 - printk(KERN_ERR PFX "%s: could not request regions.\n", 1467 - pci_name(pdev)); 1468 - } 1469 goto err_out_mwi; 1470 } 1471 ··· 1473 } else { 1474 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1475 if (rc < 0) { 1476 - if (netif_msg_probe(tp)) { 1477 - printk(KERN_ERR PFX 1478 "DMA configuration failed.\n"); 1479 - } 1480 goto err_out_free_res; 1481 } 1482 } ··· 1486 ioaddr = ioremap(pci_resource_start(pdev, 1), R8169_REGS_SIZE); 1487 if (ioaddr == NULL) { 1488 if (netif_msg_probe(tp)) 1489 - printk(KERN_ERR PFX "cannot remap MMIO, aborting\n"); 1490 rc = -EIO; 1491 goto err_out_free_res; 1492 } ··· 1518 if (i < 0) { 1519 /* Unknown chip: assume array element #0, original RTL-8169 */ 1520 if (netif_msg_probe(tp)) { 1521 - printk(KERN_DEBUG PFX "PCI device %s: " 1522 "unknown chip version, assuming %s\n", 1523 - pci_name(pdev), rtl_chip_info[0].name); 1524 } 1525 i++; 1526 }
··· 1406 dev = alloc_etherdev(sizeof (*tp)); 1407 if (dev == NULL) { 1408 if (netif_msg_drv(&debug)) 1409 + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); 1410 goto err_out; 1411 } 1412 ··· 1418 /* enable device (incl. PCI PM wakeup and hotplug setup) */ 1419 rc = pci_enable_device(pdev); 1420 if (rc < 0) { 1421 + if (netif_msg_probe(tp)) 1422 + dev_err(&pdev->dev, "enable failure\n"); 1423 goto err_out_free_dev; 1424 } 1425 ··· 1437 pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command); 1438 acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK; 1439 } else { 1440 + if (netif_msg_probe(tp)) 1441 + dev_err(&pdev->dev, 1442 "PowerManagement capability not found.\n"); 1443 } 1444 1445 /* make sure PCI base addr 1 is MMIO */ 1446 if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 1447 + if (netif_msg_probe(tp)) 1448 + dev_err(&pdev->dev, 1449 "region #1 not an MMIO resource, aborting\n"); 1450 rc = -ENODEV; 1451 goto err_out_mwi; 1452 } 1453 /* check for weird/broken PCI region reporting */ 1454 if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) { 1455 + if (netif_msg_probe(tp)) 1456 + dev_err(&pdev->dev, 1457 "Invalid PCI region size(s), aborting\n"); 1458 rc = -ENODEV; 1459 goto err_out_mwi; 1460 } 1461 1462 rc = pci_request_regions(pdev, MODULENAME); 1463 if (rc < 0) { 1464 + if (netif_msg_probe(tp)) 1465 + dev_err(&pdev->dev, "could not request regions.\n"); 1466 goto err_out_mwi; 1467 } 1468 ··· 1480 } else { 1481 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1482 if (rc < 0) { 1483 + if (netif_msg_probe(tp)) 1484 + dev_err(&pdev->dev, 1485 "DMA configuration failed.\n"); 1486 goto err_out_free_res; 1487 } 1488 } ··· 1494 ioaddr = ioremap(pci_resource_start(pdev, 1), R8169_REGS_SIZE); 1495 if (ioaddr == NULL) { 1496 if (netif_msg_probe(tp)) 1497 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 1498 rc = -EIO; 1499 goto err_out_free_res; 1500 } ··· 1526 if (i < 0) { 1527 /* Unknown chip: assume array element #0, original RTL-8169 */ 1528 if (netif_msg_probe(tp)) { 1529 + dev_printk(KERN_DEBUG, &pdev->dev, 1530 "unknown chip version, assuming %s\n", 1531 + rtl_chip_info[0].name); 1532 } 1533 i++; 1534 }
+3 -120
drivers/net/starfire.c
··· 22 23 Support and updates available at 24 http://www.scyld.com/network/starfire.html 25 26 - ----------------------------------------------------------- 27 - 28 - Linux kernel-specific changes: 29 - 30 - LK1.1.1 (jgarzik): 31 - - Use PCI driver interface 32 - - Fix MOD_xxx races 33 - - softnet fixups 34 - 35 - LK1.1.2 (jgarzik): 36 - - Merge Becker version 0.15 37 - 38 - LK1.1.3 (Andrew Morton) 39 - - Timer cleanups 40 - 41 - LK1.1.4 (jgarzik): 42 - - Merge Becker version 1.03 43 - 44 - LK1.2.1 (Ion Badulescu <ionut@cs.columbia.edu>) 45 - - Support hardware Rx/Tx checksumming 46 - - Use the GFP firmware taken from Adaptec's Netware driver 47 - 48 - LK1.2.2 (Ion Badulescu) 49 - - Backported to 2.2.x 50 - 51 - LK1.2.3 (Ion Badulescu) 52 - - Fix the flaky mdio interface 53 - - More compat clean-ups 54 - 55 - LK1.2.4 (Ion Badulescu) 56 - - More 2.2.x initialization fixes 57 - 58 - LK1.2.5 (Ion Badulescu) 59 - - Several fixes from Manfred Spraul 60 - 61 - LK1.2.6 (Ion Badulescu) 62 - - Fixed ifup/ifdown/ifup problem in 2.4.x 63 - 64 - LK1.2.7 (Ion Badulescu) 65 - - Removed unused code 66 - - Made more functions static and __init 67 - 68 - LK1.2.8 (Ion Badulescu) 69 - - Quell bogus error messages, inform about the Tx threshold 70 - - Removed #ifdef CONFIG_PCI, this driver is PCI only 71 - 72 - LK1.2.9 (Ion Badulescu) 73 - - Merged Jeff Garzik's changes from 2.4.4-pre5 74 - - Added 2.2.x compatibility stuff required by the above changes 75 - 76 - LK1.2.9a (Ion Badulescu) 77 - - More updates from Jeff Garzik 78 - 79 - LK1.3.0 (Ion Badulescu) 80 - - Merged zerocopy support 81 - 82 - LK1.3.1 (Ion Badulescu) 83 - - Added ethtool support 84 - - Added GPIO (media change) interrupt support 85 - 86 - LK1.3.2 (Ion Badulescu) 87 - - Fixed 2.2.x compatibility issues introduced in 1.3.1 88 - - Fixed ethtool ioctl returning uninitialized memory 89 - 90 - LK1.3.3 (Ion Badulescu) 91 - - Initialize the TxMode register properly 92 - - Don't dereference dev->priv after freeing it 93 - 94 - LK1.3.4 (Ion Badulescu) 95 - - Fixed initialization timing problems 96 - - Fixed interrupt mask definitions 97 - 98 - LK1.3.5 (jgarzik) 99 - - ethtool NWAY_RST, GLINK, [GS]MSGLVL support 100 - 101 - LK1.3.6: 102 - - Sparc64 support and fixes (Ion Badulescu) 103 - - Better stats and error handling (Ion Badulescu) 104 - - Use new pci_set_mwi() PCI API function (jgarzik) 105 - 106 - LK1.3.7 (Ion Badulescu) 107 - - minimal implementation of tx_timeout() 108 - - correctly shutdown the Rx/Tx engines in netdev_close() 109 - - added calls to netif_carrier_on/off 110 - (patch from Stefan Rompf <srompf@isg.de>) 111 - - VLAN support 112 - 113 - LK1.3.8 (Ion Badulescu) 114 - - adjust DMA burst size on sparc64 115 - - 64-bit support 116 - - reworked zerocopy support for 64-bit buffers 117 - - working and usable interrupt mitigation/latency 118 - - reduced Tx interrupt frequency for lower interrupt overhead 119 - 120 - LK1.3.9 (Ion Badulescu) 121 - - bugfix for mcast filter 122 - - enable the right kind of Tx interrupts (TxDMADone, not TxDone) 123 - 124 - LK1.4.0 (Ion Badulescu) 125 - - NAPI support 126 - 127 - LK1.4.1 (Ion Badulescu) 128 - - flush PCI posting buffers after disabling Rx interrupts 129 - - put the chip to a D3 slumber on driver unload 130 - - added config option to enable/disable NAPI 131 - 132 - LK1.4.2 (Ion Badulescu) 133 - - finally added firmware (GPL'ed by Adaptec) 134 - - removed compatibility code for 2.2.x 135 - 136 - LK1.4.2.1 (Ion Badulescu) 137 - - fixed 32/64 bit issues on i386 + CONFIG_HIGHMEM 138 - - added 32-bit padding to outgoing skb's, removed previous workaround 139 - 140 - TODO: - fix forced speed/duplexing code (broken a long time ago, when 141 - somebody converted the driver to use the generic MII code) 142 - - fix VLAN support 143 */ 144 145 #define DRV_NAME "starfire" 146 - #define DRV_VERSION "1.03+LK1.4.2.1" 147 - #define DRV_RELDATE "October 3, 2005" 148 149 #include <linux/module.h> 150 #include <linux/kernel.h> ··· 730 goto err_out_free_netdev; 731 } 732 733 - /* ioremap is borken in Linux-2.2.x/sparc64 */ 734 base = ioremap(ioaddr, io_size); 735 if (!base) { 736 printk(KERN_ERR DRV_NAME " %d: cannot remap %#x @ %#lx, aborting\n",
··· 22 23 Support and updates available at 24 http://www.scyld.com/network/starfire.html 25 + [link no longer provides useful info -jgarzik] 26 27 */ 28 29 #define DRV_NAME "starfire" 30 + #define DRV_VERSION "2.0" 31 + #define DRV_RELDATE "June 27, 2006" 32 33 #include <linux/module.h> 34 #include <linux/kernel.h> ··· 846 goto err_out_free_netdev; 847 } 848 849 base = ioremap(ioaddr, io_size); 850 if (!base) { 851 printk(KERN_ERR DRV_NAME " %d: cannot remap %#x @ %#lx, aborting\n",
+14 -92
drivers/net/sundance.c
··· 16 17 Support and updates available at 18 http://www.scyld.com/network/sundance.html 19 20 - 21 - Version LK1.01a (jgarzik): 22 - - Replace some MII-related magic numbers with constants 23 - 24 - Version LK1.02 (D-Link): 25 - - Add new board to PCI ID list 26 - - Fix multicast bug 27 - 28 - Version LK1.03 (D-Link): 29 - - New Rx scheme, reduce Rx congestion 30 - - Option to disable flow control 31 - 32 - Version LK1.04 (D-Link): 33 - - Tx timeout recovery 34 - - More support for ethtool. 35 - 36 - Version LK1.04a: 37 - - Remove unused/constant members from struct pci_id_info 38 - (which then allows removal of 'drv_flags' from private struct) 39 - (jgarzik) 40 - - If no phy is found, fail to load that board (jgarzik) 41 - - Always start phy id scan at id 1 to avoid problems (Donald Becker) 42 - - Autodetect where mii_preable_required is needed, 43 - default to not needed. (Donald Becker) 44 - 45 - Version LK1.04b: 46 - - Remove mii_preamble_required module parameter (Donald Becker) 47 - - Add per-interface mii_preamble_required (setting is autodetected) 48 - (Donald Becker) 49 - - Remove unnecessary cast from void pointer (jgarzik) 50 - - Re-align comments in private struct (jgarzik) 51 - 52 - Version LK1.04c (jgarzik): 53 - - Support bitmapped message levels (NETIF_MSG_xxx), and the 54 - two ethtool ioctls that get/set them 55 - - Don't hand-code MII ethtool support, use standard API/lib 56 - 57 - Version LK1.04d: 58 - - Merge from Donald Becker's sundance.c: (Jason Lunz) 59 - * proper support for variably-sized MTUs 60 - * default to PIO, to fix chip bugs 61 - - Add missing unregister_netdev (Jason Lunz) 62 - - Add CONFIG_SUNDANCE_MMIO config option (jgarzik) 63 - - Better rx buf size calculation (Donald Becker) 64 - 65 - Version LK1.05 (D-Link): 66 - - Fix DFE-580TX packet drop issue (for DL10050C) 67 - - Fix reset_tx logic 68 - 69 - Version LK1.06 (D-Link): 70 - - Fix crash while unloading driver 71 - 72 - Versin LK1.06b (D-Link): 73 - - New tx scheme, adaptive tx_coalesce 74 - 75 - Version LK1.07 (D-Link): 76 - - Fix tx bugs in big-endian machines 77 - - Remove unused max_interrupt_work module parameter, the new 78 - NAPI-like rx scheme doesn't need it. 79 - - Remove redundancy get_stats() in intr_handler(), those 80 - I/O access could affect performance in ARM-based system 81 - - Add Linux software VLAN support 82 - 83 - Version LK1.08 (Philippe De Muyter phdm@macqel.be): 84 - - Fix bug of custom mac address 85 - (StationAddr register only accept word write) 86 - 87 - Version LK1.09 (D-Link): 88 - - Fix the flowctrl bug. 89 - - Set Pause bit in MII ANAR if flow control enabled. 90 - 91 - Version LK1.09a (ICPlus): 92 - - Add the delay time in reading the contents of EEPROM 93 - 94 - Version LK1.10 (Philippe De Muyter phdm@macqel.be): 95 - - Make 'unblock interface after Tx underrun' work 96 - 97 - Version LK1.11 (Pedro Alejandro Lopez-Valencia palopezv at gmail.com): 98 - - Add support for IC Plus Corporation IP100A chipset 99 */ 100 101 #define DRV_NAME "sundance" 102 - #define DRV_VERSION "1.01+LK1.11" 103 - #define DRV_RELDATE "14-Jun-2006" 104 105 106 /* The user-configurable values. ··· 204 #define USE_IO_OPS 1 205 #endif 206 207 - static struct pci_device_id sundance_pci_tbl[] = { 208 - {0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0}, 209 - {0x1186, 0x1002, 0x1186, 0x1003, 0, 0, 1}, 210 - {0x1186, 0x1002, 0x1186, 0x1012, 0, 0, 2}, 211 - {0x1186, 0x1002, 0x1186, 0x1040, 0, 0, 3}, 212 - {0x1186, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, 213 - {0x13F0, 0x0201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5}, 214 - {0x13F0, 0x0200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6}, 215 - {0,} 216 }; 217 MODULE_DEVICE_TABLE(pci, sundance_pci_tbl); 218 ··· 223 struct pci_id_info { 224 const char *name; 225 }; 226 - static const struct pci_id_info pci_id_tbl[] = { 227 {"D-Link DFE-550TX FAST Ethernet Adapter"}, 228 {"D-Link DFE-550FX 100Mbps Fiber-optics Adapter"}, 229 {"D-Link DFE-580TX 4 port Server Adapter"}, ··· 231 {"D-Link DL10050-based FAST Ethernet Adapter"}, 232 {"Sundance Technology Alta"}, 233 {"IC Plus Corporation IP100A FAST Ethernet Adapter"}, 234 - {NULL,}, /* 0 terminated list. */ 235 }; 236 237 /* This driver was written to use PCI memory space, however x86-oriented
··· 16 17 Support and updates available at 18 http://www.scyld.com/network/sundance.html 19 + [link no longer provides useful info -jgarzik] 20 21 */ 22 23 #define DRV_NAME "sundance" 24 + #define DRV_VERSION "1.1" 25 + #define DRV_RELDATE "27-Jun-2006" 26 27 28 /* The user-configurable values. ··· 282 #define USE_IO_OPS 1 283 #endif 284 285 + static const struct pci_device_id sundance_pci_tbl[] = { 286 + { 0x1186, 0x1002, 0x1186, 0x1002, 0, 0, 0 }, 287 + { 0x1186, 0x1002, 0x1186, 0x1003, 0, 0, 1 }, 288 + { 0x1186, 0x1002, 0x1186, 0x1012, 0, 0, 2 }, 289 + { 0x1186, 0x1002, 0x1186, 0x1040, 0, 0, 3 }, 290 + { 0x1186, 0x1002, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4 }, 291 + { 0x13F0, 0x0201, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 5 }, 292 + { 0x13F0, 0x0200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 6 }, 293 + { } 294 }; 295 MODULE_DEVICE_TABLE(pci, sundance_pci_tbl); 296 ··· 301 struct pci_id_info { 302 const char *name; 303 }; 304 + static const struct pci_id_info pci_id_tbl[] __devinitdata = { 305 {"D-Link DFE-550TX FAST Ethernet Adapter"}, 306 {"D-Link DFE-550FX 100Mbps Fiber-optics Adapter"}, 307 {"D-Link DFE-580TX 4 port Server Adapter"}, ··· 309 {"D-Link DL10050-based FAST Ethernet Adapter"}, 310 {"Sundance Technology Alta"}, 311 {"IC Plus Corporation IP100A FAST Ethernet Adapter"}, 312 + { } /* terminate list. */ 313 }; 314 315 /* This driver was written to use PCI memory space, however x86-oriented
+13 -16
drivers/net/tulip/winbond-840.c
··· 224 }; 225 MODULE_DEVICE_TABLE(pci, w840_pci_tbl); 226 227 struct pci_id_info { 228 const char *name; 229 - struct match_info { 230 - int pci, pci_mask, subsystem, subsystem_mask; 231 - int revision, revision_mask; /* Only 8 bits. */ 232 - } id; 233 - int io_size; /* Needed for I/O region check or ioremap(). */ 234 - int drv_flags; /* Driver use, intended as capability flags. */ 235 }; 236 - static struct pci_id_info pci_id_tbl[] = { 237 - {"Winbond W89c840", /* Sometime a Level-One switch card. */ 238 - { 0x08401050, 0xffffffff, 0x81530000, 0xffff0000 }, 239 - 128, CanHaveMII | HasBrokenTx | FDXOnNoMII}, 240 - {"Winbond W89c840", { 0x08401050, 0xffffffff, }, 241 - 128, CanHaveMII | HasBrokenTx}, 242 - {"Compex RL100-ATX", { 0x201111F6, 0xffffffff,}, 243 - 128, CanHaveMII | HasBrokenTx}, 244 - {NULL,}, /* 0 terminated list. */ 245 }; 246 247 /* This driver was written to use PCI memory space, however some x86 systems ··· 396 #ifdef USE_IO_OPS 397 bar = 0; 398 #endif 399 - ioaddr = pci_iomap(pdev, bar, pci_id_tbl[chip_idx].io_size); 400 if (!ioaddr) 401 goto err_out_free_res; 402
··· 224 }; 225 MODULE_DEVICE_TABLE(pci, w840_pci_tbl); 226 227 + enum { 228 + netdev_res_size = 128, /* size of PCI BAR resource */ 229 + }; 230 + 231 struct pci_id_info { 232 const char *name; 233 + int drv_flags; /* Driver use, intended as capability flags. */ 234 }; 235 + 236 + static const struct pci_id_info pci_id_tbl[] __devinitdata = { 237 + { /* Sometime a Level-One switch card. */ 238 + "Winbond W89c840", CanHaveMII | HasBrokenTx | FDXOnNoMII}, 239 + { "Winbond W89c840", CanHaveMII | HasBrokenTx}, 240 + { "Compex RL100-ATX", CanHaveMII | HasBrokenTx}, 241 + { } /* terminate list. */ 242 }; 243 244 /* This driver was written to use PCI memory space, however some x86 systems ··· 399 #ifdef USE_IO_OPS 400 bar = 0; 401 #endif 402 + ioaddr = pci_iomap(pdev, bar, netdev_res_size); 403 if (!ioaddr) 404 goto err_out_free_res; 405
+4 -23
drivers/net/tulip/xircom_tulip_cb.c
··· 10 410 Severn Ave., Suite 210 11 Annapolis MD 21403 12 13 - ----------------------------------------------------------- 14 - 15 - Linux kernel-specific changes: 16 - 17 - LK1.0 (Ion Badulescu) 18 - - Major cleanup 19 - - Use 2.4 PCI API 20 - - Support ethtool 21 - - Rewrite perfect filter/hash code 22 - - Use interrupts for media changes 23 - 24 - LK1.1 (Ion Badulescu) 25 - - Disallow negotiation of unsupported full-duplex modes 26 */ 27 28 #define DRV_NAME "xircom_tulip_cb" 29 - #define DRV_VERSION "0.91+LK1.1" 30 - #define DRV_RELDATE "October 11, 2001" 31 - 32 - #define CARDBUS 1 33 34 /* A few user-configurable values. */ 35 ··· 291 struct xircom_tx_desc tx_ring[TX_RING_SIZE]; 292 /* The saved address of a sent-in-place packet/buffer, for skfree(). */ 293 struct sk_buff* tx_skbuff[TX_RING_SIZE]; 294 - #ifdef CARDBUS 295 /* The X3201-3 requires 4-byte aligned tx bufs */ 296 struct sk_buff* tx_aligned_skbuff[TX_RING_SIZE]; 297 - #endif 298 /* The addresses of receive-in-place skbuffs. */ 299 struct sk_buff* rx_skbuff[RX_RING_SIZE]; 300 u16 setup_frame[PKT_SETUP_SZ / sizeof(u16)]; /* Pseudo-Tx frame to init address table. */ ··· 893 tp->tx_skbuff[i] = NULL; 894 tp->tx_ring[i].status = 0; 895 tp->tx_ring[i].buffer2 = virt_to_bus(&tp->tx_ring[i+1]); 896 - #ifdef CARDBUS 897 if (tp->chip_id == X3201_3) 898 tp->tx_aligned_skbuff[i] = dev_alloc_skb(PKT_BUF_SZ); 899 - #endif /* CARDBUS */ 900 } 901 tp->tx_ring[i-1].buffer2 = virt_to_bus(&tp->tx_ring[0]); 902 } ··· 914 entry = tp->cur_tx % TX_RING_SIZE; 915 916 tp->tx_skbuff[entry] = skb; 917 - #ifdef CARDBUS 918 if (tp->chip_id == X3201_3) { 919 memcpy(tp->tx_aligned_skbuff[entry]->data,skb->data,skb->len); 920 tp->tx_ring[entry].buffer1 = virt_to_bus(tp->tx_aligned_skbuff[entry]->data); 921 } else 922 - #endif 923 tp->tx_ring[entry].buffer1 = virt_to_bus(skb->data); 924 925 if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
··· 10 410 Severn Ave., Suite 210 11 Annapolis MD 21403 12 13 */ 14 15 #define DRV_NAME "xircom_tulip_cb" 16 + #define DRV_VERSION "0.92" 17 + #define DRV_RELDATE "June 27, 2006" 18 19 /* A few user-configurable values. */ 20 ··· 306 struct xircom_tx_desc tx_ring[TX_RING_SIZE]; 307 /* The saved address of a sent-in-place packet/buffer, for skfree(). */ 308 struct sk_buff* tx_skbuff[TX_RING_SIZE]; 309 + 310 /* The X3201-3 requires 4-byte aligned tx bufs */ 311 struct sk_buff* tx_aligned_skbuff[TX_RING_SIZE]; 312 + 313 /* The addresses of receive-in-place skbuffs. */ 314 struct sk_buff* rx_skbuff[RX_RING_SIZE]; 315 u16 setup_frame[PKT_SETUP_SZ / sizeof(u16)]; /* Pseudo-Tx frame to init address table. */ ··· 908 tp->tx_skbuff[i] = NULL; 909 tp->tx_ring[i].status = 0; 910 tp->tx_ring[i].buffer2 = virt_to_bus(&tp->tx_ring[i+1]); 911 if (tp->chip_id == X3201_3) 912 tp->tx_aligned_skbuff[i] = dev_alloc_skb(PKT_BUF_SZ); 913 } 914 tp->tx_ring[i-1].buffer2 = virt_to_bus(&tp->tx_ring[0]); 915 } ··· 931 entry = tp->cur_tx % TX_RING_SIZE; 932 933 tp->tx_skbuff[entry] = skb; 934 if (tp->chip_id == X3201_3) { 935 memcpy(tp->tx_aligned_skbuff[entry]->data,skb->data,skb->len); 936 tp->tx_ring[entry].buffer1 = virt_to_bus(tp->tx_aligned_skbuff[entry]->data); 937 } else 938 tp->tx_ring[entry].buffer1 = virt_to_bus(skb->data); 939 940 if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
+8 -113
drivers/net/via-rhine.c
··· 25 version. He may or may not be interested in bug reports on this 26 code. You can find his versions at: 27 http://www.scyld.com/network/via-rhine.html 28 - 29 - 30 - Linux kernel version history: 31 - 32 - LK1.1.0: 33 - - Jeff Garzik: softnet 'n stuff 34 - 35 - LK1.1.1: 36 - - Justin Guyett: softnet and locking fixes 37 - - Jeff Garzik: use PCI interface 38 - 39 - LK1.1.2: 40 - - Urban Widmark: minor cleanups, merges from Becker 1.03a/1.04 versions 41 - 42 - LK1.1.3: 43 - - Urban Widmark: use PCI DMA interface (with thanks to the eepro100.c 44 - code) update "Theory of Operation" with 45 - softnet/locking changes 46 - - Dave Miller: PCI DMA and endian fixups 47 - - Jeff Garzik: MOD_xxx race fixes, updated PCI resource allocation 48 - 49 - LK1.1.4: 50 - - Urban Widmark: fix gcc 2.95.2 problem and 51 - remove writel's to fixed address 0x7c 52 - 53 - LK1.1.5: 54 - - Urban Widmark: mdio locking, bounce buffer changes 55 - merges from Beckers 1.05 version 56 - added netif_running_on/off support 57 - 58 - LK1.1.6: 59 - - Urban Widmark: merges from Beckers 1.08b version (VT6102 + mdio) 60 - set netif_running_on/off on startup, del_timer_sync 61 - 62 - LK1.1.7: 63 - - Manfred Spraul: added reset into tx_timeout 64 - 65 - LK1.1.9: 66 - - Urban Widmark: merges from Beckers 1.10 version 67 - (media selection + eeprom reload) 68 - - David Vrabel: merges from D-Link "1.11" version 69 - (disable WOL and PME on startup) 70 - 71 - LK1.1.10: 72 - - Manfred Spraul: use "singlecopy" for unaligned buffers 73 - don't allocate bounce buffers for !ReqTxAlign cards 74 - 75 - LK1.1.11: 76 - - David Woodhouse: Set dev->base_addr before the first time we call 77 - wait_for_reset(). It's a lot happier that way. 78 - Free np->tx_bufs only if we actually allocated it. 79 - 80 - LK1.1.12: 81 - - Martin Eriksson: Allow Memory-Mapped IO to be enabled. 82 - 83 - LK1.1.13 (jgarzik): 84 - - Add ethtool support 85 - - Replace some MII-related magic numbers with constants 86 - 87 - LK1.1.14 (Ivan G.): 88 - - fixes comments for Rhine-III 89 - - removes W_MAX_TIMEOUT (unused) 90 - - adds HasDavicomPhy for Rhine-I (basis: linuxfet driver; my card 91 - is R-I and has Davicom chip, flag is referenced in kernel driver) 92 - - sends chip_id as a parameter to wait_for_reset since np is not 93 - initialized on first call 94 - - changes mmio "else if (chip_id==VT6102)" to "else" so it will work 95 - for Rhine-III's (documentation says same bit is correct) 96 - - transmit frame queue message is off by one - fixed 97 - - adds IntrNormalSummary to "Something Wicked" exclusion list 98 - so normal interrupts will not trigger the message (src: Donald Becker) 99 - (Roger Luethi) 100 - - show confused chip where to continue after Tx error 101 - - location of collision counter is chip specific 102 - - allow selecting backoff algorithm (module parameter) 103 - 104 - LK1.1.15 (jgarzik): 105 - - Use new MII lib helper generic_mii_ioctl 106 - 107 - LK1.1.16 (Roger Luethi) 108 - - Etherleak fix 109 - - Handle Tx buffer underrun 110 - - Fix bugs in full duplex handling 111 - - New reset code uses "force reset" cmd on Rhine-II 112 - - Various clean ups 113 - 114 - LK1.1.17 (Roger Luethi) 115 - - Fix race in via_rhine_start_tx() 116 - - On errors, wait for Tx engine to turn off before scavenging 117 - - Handle Tx descriptor write-back race on Rhine-II 118 - - Force flushing for PCI posted writes 119 - - More reset code changes 120 - 121 - LK1.1.18 (Roger Luethi) 122 - - No filtering multicast in promisc mode (Edward Peng) 123 - - Fix for Rhine-I Tx timeouts 124 - 125 - LK1.1.19 (Roger Luethi) 126 - - Increase Tx threshold for unspecified errors 127 - 128 - LK1.2.0-2.6 (Roger Luethi) 129 - - Massive clean-up 130 - - Rewrite PHY, media handling (remove options, full_duplex, backoff) 131 - - Fix Tx engine race for good 132 - - Craig Brind: Zero padded aligned buffers for short packets. 133 134 */ 135 136 #define DRV_NAME "via-rhine" 137 - #define DRV_VERSION "1.2.0-2.6" 138 - #define DRV_RELDATE "June-10-2004" 139 140 141 /* A few user-configurable values. ··· 252 /* Beware of PCI posted writes */ 253 #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) 254 255 - static struct pci_device_id rhine_pci_tbl[] = 256 - { 257 - {0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT86C100A */ 258 - {0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6102 */ 259 - {0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* 6105{,L,LOM} */ 260 - {0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, }, /* VT6105M */ 261 { } /* terminate list */ 262 }; 263 MODULE_DEVICE_TABLE(pci, rhine_pci_tbl);
··· 25 version. He may or may not be interested in bug reports on this 26 code. You can find his versions at: 27 http://www.scyld.com/network/via-rhine.html 28 + [link no longer provides useful info -jgarzik] 29 30 */ 31 32 #define DRV_NAME "via-rhine" 33 + #define DRV_VERSION "1.4.0" 34 + #define DRV_RELDATE "June-27-2006" 35 36 37 /* A few user-configurable values. ··· 356 /* Beware of PCI posted writes */ 357 #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) 358 359 + static const struct pci_device_id rhine_pci_tbl[] = { 360 + { 0x1106, 0x3043, PCI_ANY_ID, PCI_ANY_ID, }, /* VT86C100A */ 361 + { 0x1106, 0x3065, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6102 */ 362 + { 0x1106, 0x3106, PCI_ANY_ID, PCI_ANY_ID, }, /* 6105{,L,LOM} */ 363 + { 0x1106, 0x3053, PCI_ANY_ID, PCI_ANY_ID, }, /* VT6105M */ 364 { } /* terminate list */ 365 }; 366 MODULE_DEVICE_TABLE(pci, rhine_pci_tbl);
+50 -52
drivers/net/via-velocity.c
··· 229 module_param(rx_copybreak, int, 0644); 230 MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); 231 232 - static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info); 233 static int velocity_get_pci_info(struct velocity_info *, struct pci_dev *pdev); 234 static void velocity_print_info(struct velocity_info *vptr); 235 static int velocity_open(struct net_device *dev); ··· 295 * Internal board variants. At the moment we have only one 296 */ 297 298 - static struct velocity_info_tbl chip_info_table[] = { 299 - {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 256, 1, 0x00FFFFFFUL}, 300 - {0, NULL} 301 }; 302 303 /* ··· 305 * device driver. Used for hotplug autoloading. 306 */ 307 308 - static struct pci_device_id velocity_id_table[] __devinitdata = { 309 - {PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X, 310 - PCI_ANY_ID, PCI_ANY_ID, 0, 0, (unsigned long) chip_info_table}, 311 - {0, } 312 }; 313 314 MODULE_DEVICE_TABLE(pci, velocity_id_table); ··· 341 static void __devexit velocity_remove1(struct pci_dev *pdev) 342 { 343 struct net_device *dev = pci_get_drvdata(pdev); 344 - struct velocity_info *vptr = dev->priv; 345 346 #ifdef CONFIG_PM 347 unsigned long flags; ··· 686 static int first = 1; 687 struct net_device *dev; 688 int i; 689 - struct velocity_info_tbl *info = (struct velocity_info_tbl *) ent->driver_data; 690 struct velocity_info *vptr; 691 struct mac_regs __iomem * regs; 692 int ret = -ENOMEM; 693 694 if (velocity_nics >= MAX_UNITS) { 695 - printk(KERN_NOTICE VELOCITY_NAME ": already found %d NICs.\n", 696 - velocity_nics); 697 return -ENODEV; 698 } 699 700 dev = alloc_etherdev(sizeof(struct velocity_info)); 701 - 702 - if (dev == NULL) { 703 - printk(KERN_ERR VELOCITY_NAME ": allocate net device failed.\n"); 704 goto out; 705 } 706 ··· 710 711 SET_MODULE_OWNER(dev); 712 SET_NETDEV_DEV(dev, &pdev->dev); 713 - vptr = dev->priv; 714 715 716 if (first) { ··· 733 734 ret = velocity_get_pci_info(vptr, pdev); 735 if (ret < 0) { 736 - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); 737 goto err_disable; 738 } 739 740 ret = pci_request_regions(pdev, VELOCITY_NAME); 741 if (ret < 0) { 742 - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); 743 goto err_disable; 744 } 745 746 - regs = ioremap(vptr->memaddr, vptr->io_size); 747 if (regs == NULL) { 748 ret = -EIO; 749 goto err_release_res; ··· 861 * discovered. 862 */ 863 864 - static void __devinit velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info) 865 { 866 memset(vptr, 0, sizeof(struct velocity_info)); 867 868 vptr->pdev = pdev; 869 vptr->chip_id = info->chip_id; 870 - vptr->io_size = info->io_size; 871 vptr->num_txq = info->txqueue; 872 vptr->multicast_limit = MCAM_SIZE; 873 spin_lock_init(&vptr->lock); ··· 886 887 static int __devinit velocity_get_pci_info(struct velocity_info *vptr, struct pci_dev *pdev) 888 { 889 - 890 - if(pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) 891 return -EIO; 892 893 pci_set_master(pdev); ··· 894 vptr->ioaddr = pci_resource_start(pdev, 0); 895 vptr->memaddr = pci_resource_start(pdev, 1); 896 897 - if(!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) 898 - { 899 - printk(KERN_ERR "%s: region #0 is not an I/O resource, aborting.\n", 900 - pci_name(pdev)); 901 return -EINVAL; 902 } 903 904 - if((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) 905 - { 906 - printk(KERN_ERR "%s: region #1 is an I/O resource, aborting.\n", 907 - pci_name(pdev)); 908 return -EINVAL; 909 } 910 911 - if(pci_resource_len(pdev, 1) < 256) 912 - { 913 - printk(KERN_ERR "%s: region #1 is too small.\n", 914 - pci_name(pdev)); 915 return -EINVAL; 916 } 917 vptr->pdev = pdev; ··· 1726 1727 static int velocity_open(struct net_device *dev) 1728 { 1729 - struct velocity_info *vptr = dev->priv; 1730 int ret; 1731 1732 vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); ··· 1783 1784 static int velocity_change_mtu(struct net_device *dev, int new_mtu) 1785 { 1786 - struct velocity_info *vptr = dev->priv; 1787 unsigned long flags; 1788 int oldmtu = dev->mtu; 1789 int ret = 0; ··· 1859 1860 static int velocity_close(struct net_device *dev) 1861 { 1862 - struct velocity_info *vptr = dev->priv; 1863 1864 netif_stop_queue(dev); 1865 velocity_shutdown(vptr); ··· 1892 1893 static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) 1894 { 1895 - struct velocity_info *vptr = dev->priv; 1896 int qnum = 0; 1897 struct tx_desc *td_ptr; 1898 struct velocity_td_info *tdinfo; ··· 2047 static int velocity_intr(int irq, void *dev_instance, struct pt_regs *regs) 2048 { 2049 struct net_device *dev = dev_instance; 2050 - struct velocity_info *vptr = dev->priv; 2051 u32 isr_status; 2052 int max_count = 0; 2053 ··· 2102 2103 static void velocity_set_multi(struct net_device *dev) 2104 { 2105 - struct velocity_info *vptr = dev->priv; 2106 struct mac_regs __iomem * regs = vptr->mac_regs; 2107 u8 rx_mode; 2108 int i; ··· 2151 2152 static struct net_device_stats *velocity_get_stats(struct net_device *dev) 2153 { 2154 - struct velocity_info *vptr = dev->priv; 2155 2156 /* If the hardware is down, don't touch MII */ 2157 if(!netif_running(dev)) ··· 2194 2195 static int velocity_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 2196 { 2197 - struct velocity_info *vptr = dev->priv; 2198 int ret; 2199 2200 /* If we are asked for information and the device is power ··· 2823 2824 static int velocity_ethtool_up(struct net_device *dev) 2825 { 2826 - struct velocity_info *vptr = dev->priv; 2827 if (!netif_running(dev)) 2828 pci_set_power_state(vptr->pdev, PCI_D0); 2829 return 0; ··· 2839 2840 static void velocity_ethtool_down(struct net_device *dev) 2841 { 2842 - struct velocity_info *vptr = dev->priv; 2843 if (!netif_running(dev)) 2844 pci_set_power_state(vptr->pdev, PCI_D3hot); 2845 } 2846 2847 static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2848 { 2849 - struct velocity_info *vptr = dev->priv; 2850 struct mac_regs __iomem * regs = vptr->mac_regs; 2851 u32 status; 2852 status = check_connection_type(vptr->mac_regs); ··· 2871 2872 static int velocity_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2873 { 2874 - struct velocity_info *vptr = dev->priv; 2875 u32 curr_status; 2876 u32 new_status = 0; 2877 int ret = 0; ··· 2894 2895 static u32 velocity_get_link(struct net_device *dev) 2896 { 2897 - struct velocity_info *vptr = dev->priv; 2898 struct mac_regs __iomem * regs = vptr->mac_regs; 2899 return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, &regs->PHYSR0) ? 0 : 1; 2900 } 2901 2902 static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 2903 { 2904 - struct velocity_info *vptr = dev->priv; 2905 strcpy(info->driver, VELOCITY_NAME); 2906 strcpy(info->version, VELOCITY_VERSION); 2907 strcpy(info->bus_info, pci_name(vptr->pdev)); ··· 2909 2910 static void velocity_ethtool_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2911 { 2912 - struct velocity_info *vptr = dev->priv; 2913 wol->supported = WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP; 2914 wol->wolopts |= WAKE_MAGIC; 2915 /* ··· 2925 2926 static int velocity_ethtool_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2927 { 2928 - struct velocity_info *vptr = dev->priv; 2929 2930 if (!(wol->wolopts & (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP))) 2931 return -EFAULT; ··· 2990 2991 static int velocity_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 2992 { 2993 - struct velocity_info *vptr = dev->priv; 2994 struct mac_regs __iomem * regs = vptr->mac_regs; 2995 unsigned long flags; 2996 struct mii_ioctl_data *miidata = if_mii(ifr);
··· 229 module_param(rx_copybreak, int, 0644); 230 MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); 231 232 + static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, 233 + const struct velocity_info_tbl *info); 234 static int velocity_get_pci_info(struct velocity_info *, struct pci_dev *pdev); 235 static void velocity_print_info(struct velocity_info *vptr); 236 static int velocity_open(struct net_device *dev); ··· 294 * Internal board variants. At the moment we have only one 295 */ 296 297 + static const struct velocity_info_tbl chip_info_table[] __devinitdata = { 298 + {CHIP_TYPE_VT6110, "VIA Networking Velocity Family Gigabit Ethernet Adapter", 1, 0x00FFFFFFUL}, 299 + { } 300 }; 301 302 /* ··· 304 * device driver. Used for hotplug autoloading. 305 */ 306 307 + static const struct pci_device_id velocity_id_table[] __devinitdata = { 308 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X) }, 309 + { } 310 }; 311 312 MODULE_DEVICE_TABLE(pci, velocity_id_table); ··· 341 static void __devexit velocity_remove1(struct pci_dev *pdev) 342 { 343 struct net_device *dev = pci_get_drvdata(pdev); 344 + struct velocity_info *vptr = netdev_priv(dev); 345 346 #ifdef CONFIG_PM 347 unsigned long flags; ··· 686 static int first = 1; 687 struct net_device *dev; 688 int i; 689 + const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; 690 struct velocity_info *vptr; 691 struct mac_regs __iomem * regs; 692 int ret = -ENOMEM; 693 694 + /* FIXME: this driver, like almost all other ethernet drivers, 695 + * can support more than MAX_UNITS. 696 + */ 697 if (velocity_nics >= MAX_UNITS) { 698 + dev_notice(&pdev->dev, "already found %d NICs.\n", 699 + velocity_nics); 700 return -ENODEV; 701 } 702 703 dev = alloc_etherdev(sizeof(struct velocity_info)); 704 + if (!dev) { 705 + dev_err(&pdev->dev, "allocate net device failed.\n"); 706 goto out; 707 } 708 ··· 708 709 SET_MODULE_OWNER(dev); 710 SET_NETDEV_DEV(dev, &pdev->dev); 711 + vptr = netdev_priv(dev); 712 713 714 if (first) { ··· 731 732 ret = velocity_get_pci_info(vptr, pdev); 733 if (ret < 0) { 734 + /* error message already printed */ 735 goto err_disable; 736 } 737 738 ret = pci_request_regions(pdev, VELOCITY_NAME); 739 if (ret < 0) { 740 + dev_err(&pdev->dev, "No PCI resources.\n"); 741 goto err_disable; 742 } 743 744 + regs = ioremap(vptr->memaddr, VELOCITY_IO_SIZE); 745 if (regs == NULL) { 746 ret = -EIO; 747 goto err_release_res; ··· 859 * discovered. 860 */ 861 862 + static void __devinit velocity_init_info(struct pci_dev *pdev, 863 + struct velocity_info *vptr, 864 + const struct velocity_info_tbl *info) 865 { 866 memset(vptr, 0, sizeof(struct velocity_info)); 867 868 vptr->pdev = pdev; 869 vptr->chip_id = info->chip_id; 870 vptr->num_txq = info->txqueue; 871 vptr->multicast_limit = MCAM_SIZE; 872 spin_lock_init(&vptr->lock); ··· 883 884 static int __devinit velocity_get_pci_info(struct velocity_info *vptr, struct pci_dev *pdev) 885 { 886 + if (pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) 887 return -EIO; 888 889 pci_set_master(pdev); ··· 892 vptr->ioaddr = pci_resource_start(pdev, 0); 893 vptr->memaddr = pci_resource_start(pdev, 1); 894 895 + if (!(pci_resource_flags(pdev, 0) & IORESOURCE_IO)) { 896 + dev_err(&pdev->dev, 897 + "region #0 is not an I/O resource, aborting.\n"); 898 return -EINVAL; 899 } 900 901 + if ((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) { 902 + dev_err(&pdev->dev, 903 + "region #1 is an I/O resource, aborting.\n"); 904 return -EINVAL; 905 } 906 907 + if (pci_resource_len(pdev, 1) < VELOCITY_IO_SIZE) { 908 + dev_err(&pdev->dev, "region #1 is too small.\n"); 909 return -EINVAL; 910 } 911 vptr->pdev = pdev; ··· 1728 1729 static int velocity_open(struct net_device *dev) 1730 { 1731 + struct velocity_info *vptr = netdev_priv(dev); 1732 int ret; 1733 1734 vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); ··· 1785 1786 static int velocity_change_mtu(struct net_device *dev, int new_mtu) 1787 { 1788 + struct velocity_info *vptr = netdev_priv(dev); 1789 unsigned long flags; 1790 int oldmtu = dev->mtu; 1791 int ret = 0; ··· 1861 1862 static int velocity_close(struct net_device *dev) 1863 { 1864 + struct velocity_info *vptr = netdev_priv(dev); 1865 1866 netif_stop_queue(dev); 1867 velocity_shutdown(vptr); ··· 1894 1895 static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) 1896 { 1897 + struct velocity_info *vptr = netdev_priv(dev); 1898 int qnum = 0; 1899 struct tx_desc *td_ptr; 1900 struct velocity_td_info *tdinfo; ··· 2049 static int velocity_intr(int irq, void *dev_instance, struct pt_regs *regs) 2050 { 2051 struct net_device *dev = dev_instance; 2052 + struct velocity_info *vptr = netdev_priv(dev); 2053 u32 isr_status; 2054 int max_count = 0; 2055 ··· 2104 2105 static void velocity_set_multi(struct net_device *dev) 2106 { 2107 + struct velocity_info *vptr = netdev_priv(dev); 2108 struct mac_regs __iomem * regs = vptr->mac_regs; 2109 u8 rx_mode; 2110 int i; ··· 2153 2154 static struct net_device_stats *velocity_get_stats(struct net_device *dev) 2155 { 2156 + struct velocity_info *vptr = netdev_priv(dev); 2157 2158 /* If the hardware is down, don't touch MII */ 2159 if(!netif_running(dev)) ··· 2196 2197 static int velocity_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 2198 { 2199 + struct velocity_info *vptr = netdev_priv(dev); 2200 int ret; 2201 2202 /* If we are asked for information and the device is power ··· 2825 2826 static int velocity_ethtool_up(struct net_device *dev) 2827 { 2828 + struct velocity_info *vptr = netdev_priv(dev); 2829 if (!netif_running(dev)) 2830 pci_set_power_state(vptr->pdev, PCI_D0); 2831 return 0; ··· 2841 2842 static void velocity_ethtool_down(struct net_device *dev) 2843 { 2844 + struct velocity_info *vptr = netdev_priv(dev); 2845 if (!netif_running(dev)) 2846 pci_set_power_state(vptr->pdev, PCI_D3hot); 2847 } 2848 2849 static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2850 { 2851 + struct velocity_info *vptr = netdev_priv(dev); 2852 struct mac_regs __iomem * regs = vptr->mac_regs; 2853 u32 status; 2854 status = check_connection_type(vptr->mac_regs); ··· 2873 2874 static int velocity_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2875 { 2876 + struct velocity_info *vptr = netdev_priv(dev); 2877 u32 curr_status; 2878 u32 new_status = 0; 2879 int ret = 0; ··· 2896 2897 static u32 velocity_get_link(struct net_device *dev) 2898 { 2899 + struct velocity_info *vptr = netdev_priv(dev); 2900 struct mac_regs __iomem * regs = vptr->mac_regs; 2901 return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, &regs->PHYSR0) ? 0 : 1; 2902 } 2903 2904 static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 2905 { 2906 + struct velocity_info *vptr = netdev_priv(dev); 2907 strcpy(info->driver, VELOCITY_NAME); 2908 strcpy(info->version, VELOCITY_VERSION); 2909 strcpy(info->bus_info, pci_name(vptr->pdev)); ··· 2911 2912 static void velocity_ethtool_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2913 { 2914 + struct velocity_info *vptr = netdev_priv(dev); 2915 wol->supported = WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP; 2916 wol->wolopts |= WAKE_MAGIC; 2917 /* ··· 2927 2928 static int velocity_ethtool_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2929 { 2930 + struct velocity_info *vptr = netdev_priv(dev); 2931 2932 if (!(wol->wolopts & (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP))) 2933 return -EFAULT; ··· 2992 2993 static int velocity_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 2994 { 2995 + struct velocity_info *vptr = netdev_priv(dev); 2996 struct mac_regs __iomem * regs = vptr->mac_regs; 2997 unsigned long flags; 2998 struct mii_ioctl_data *miidata = if_mii(ifr);
+2 -2
drivers/net/via-velocity.h
··· 31 #define VELOCITY_FULL_DRV_NAM "VIA Networking Velocity Family Gigabit Ethernet Adapter Driver" 32 #define VELOCITY_VERSION "1.13" 33 34 #define PKT_BUF_SZ 1540 35 36 #define MAX_UNITS 8 ··· 1193 struct velocity_info_tbl { 1194 enum chip_type chip_id; 1195 char *name; 1196 - int io_size; 1197 int txqueue; 1198 u32 flags; 1199 }; ··· 1752 struct mac_regs __iomem * mac_regs; 1753 unsigned long memaddr; 1754 unsigned long ioaddr; 1755 - u32 io_size; 1756 1757 u8 rev_id; 1758
··· 31 #define VELOCITY_FULL_DRV_NAM "VIA Networking Velocity Family Gigabit Ethernet Adapter Driver" 32 #define VELOCITY_VERSION "1.13" 33 34 + #define VELOCITY_IO_SIZE 256 35 + 36 #define PKT_BUF_SZ 1540 37 38 #define MAX_UNITS 8 ··· 1191 struct velocity_info_tbl { 1192 enum chip_type chip_id; 1193 char *name; 1194 int txqueue; 1195 u32 flags; 1196 }; ··· 1751 struct mac_regs __iomem * mac_regs; 1752 unsigned long memaddr; 1753 unsigned long ioaddr; 1754 1755 u8 rev_id; 1756
-12
drivers/net/wan/Kconfig
··· 134 The driver will be compiled as a module: the 135 module will be called sealevel. 136 137 - config SYNCLINK_SYNCPPP 138 - tristate "SyncLink HDLC/SYNCPPP support" 139 - depends on WAN 140 - help 141 - Enables HDLC/SYNCPPP support for the SyncLink WAN driver. 142 - 143 - Normally the SyncLink WAN driver works with the main PPP driver 144 - <file:drivers/net/ppp_generic.c> and pppd program. 145 - HDLC/SYNCPPP support allows use of the Cisco HDLC/PPP driver 146 - <file:drivers/net/wan/syncppp.c>. The SyncLink WAN driver (in 147 - character devices) must also be enabled. 148 - 149 # Generic HDLC 150 config HDLC 151 tristate "Generic HDLC layer"
··· 134 The driver will be compiled as a module: the 135 module will be called sealevel. 136 137 # Generic HDLC 138 config HDLC 139 tristate "Generic HDLC layer"
-1
drivers/net/wan/Makefile
··· 28 obj-$(CONFIG_FARSYNC) += syncppp.o farsync.o 29 obj-$(CONFIG_DSCC4) += dscc4.o 30 obj-$(CONFIG_LANMEDIA) += syncppp.o 31 - obj-$(CONFIG_SYNCLINK_SYNCPPP) += syncppp.o 32 obj-$(CONFIG_X25_ASY) += x25_asy.o 33 34 obj-$(CONFIG_LANMEDIA) += lmc/
··· 28 obj-$(CONFIG_FARSYNC) += syncppp.o farsync.o 29 obj-$(CONFIG_DSCC4) += dscc4.o 30 obj-$(CONFIG_LANMEDIA) += syncppp.o 31 obj-$(CONFIG_X25_ASY) += x25_asy.o 32 33 obj-$(CONFIG_LANMEDIA) += lmc/
+1
drivers/net/wireless/Kconfig
··· 550 551 source "drivers/net/wireless/hostap/Kconfig" 552 source "drivers/net/wireless/bcm43xx/Kconfig" 553 554 # yes, this works even when no drivers are selected 555 config NET_WIRELESS
··· 550 551 source "drivers/net/wireless/hostap/Kconfig" 552 source "drivers/net/wireless/bcm43xx/Kconfig" 553 + source "drivers/net/wireless/zd1211rw/Kconfig" 554 555 # yes, this works even when no drivers are selected 556 config NET_WIRELESS
+1
drivers/net/wireless/Makefile
··· 36 37 obj-$(CONFIG_HOSTAP) += hostap/ 38 obj-$(CONFIG_BCM43XX) += bcm43xx/ 39 40 # 16-bit wireless PCMCIA client drivers 41 obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
··· 36 37 obj-$(CONFIG_HOSTAP) += hostap/ 38 obj-$(CONFIG_BCM43XX) += bcm43xx/ 39 + obj-$(CONFIG_ZD1211RW) += zd1211rw/ 40 41 # 16-bit wireless PCMCIA client drivers 42 obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
+18 -13
drivers/net/wireless/bcm43xx/bcm43xx_main.c
··· 1885 1886 spin_lock(&bcm->irq_lock); 1887 1888 reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); 1889 if (reason == 0xffffffff) { 1890 /* irq not for us (shared irq) */ ··· 1915 1916 bcm43xx_interrupt_ack(bcm, reason); 1917 1918 - /* Only accept IRQs, if we are initialized properly. 1919 - * This avoids an RX race while initializing. 1920 - * We should probably not enable IRQs before we are initialized 1921 - * completely, but some careful work is needed to fix this. I think it 1922 - * is best to stay with this cheap workaround for now... . 1923 - */ 1924 - if (likely(bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED)) { 1925 - /* disable all IRQs. They are enabled again in the bottom half. */ 1926 - bcm->irq_savedstate = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); 1927 - /* save the reason code and call our bottom half. */ 1928 - bcm->irq_reason = reason; 1929 - tasklet_schedule(&bcm->isr_tasklet); 1930 - } 1931 1932 out: 1933 mmiowb(); ··· 3698 if (sec->flags & SEC_ENCRYPT) { 3699 secinfo->encrypt = sec->encrypt; 3700 dprintk(", .encrypt = %d", sec->encrypt); 3701 } 3702 dprintk("\n"); 3703 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED &&
··· 1885 1886 spin_lock(&bcm->irq_lock); 1887 1888 + /* Only accept IRQs, if we are initialized properly. 1889 + * This avoids an RX race while initializing. 1890 + * We should probably not enable IRQs before we are initialized 1891 + * completely, but some careful work is needed to fix this. I think it 1892 + * is best to stay with this cheap workaround for now... . 1893 + */ 1894 + if (unlikely(bcm43xx_status(bcm) != BCM43xx_STAT_INITIALIZED)) 1895 + goto out; 1896 + 1897 reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); 1898 if (reason == 0xffffffff) { 1899 /* irq not for us (shared irq) */ ··· 1906 1907 bcm43xx_interrupt_ack(bcm, reason); 1908 1909 + /* disable all IRQs. They are enabled again in the bottom half. */ 1910 + bcm->irq_savedstate = bcm43xx_interrupt_disable(bcm, BCM43xx_IRQ_ALL); 1911 + /* save the reason code and call our bottom half. */ 1912 + bcm->irq_reason = reason; 1913 + tasklet_schedule(&bcm->isr_tasklet); 1914 1915 out: 1916 mmiowb(); ··· 3697 if (sec->flags & SEC_ENCRYPT) { 3698 secinfo->encrypt = sec->encrypt; 3699 dprintk(", .encrypt = %d", sec->encrypt); 3700 + } 3701 + if (sec->flags & SEC_AUTH_MODE) { 3702 + secinfo->auth_mode = sec->auth_mode; 3703 + dprintk(", .auth_mode = %d\n", sec->auth_mode); 3704 } 3705 dprintk("\n"); 3706 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED &&
-24
drivers/net/wireless/bcm43xx/bcm43xx_main.h
··· 112 return bcm43xx_channel_to_freq_bg(channel); 113 } 114 115 - /* Lightweight function to check if a channel number is valid. 116 - * Note that this does _NOT_ check for geographical restrictions! 117 - */ 118 - static inline 119 - int bcm43xx_is_valid_channel_a(u8 channel) 120 - { 121 - return (channel >= IEEE80211_52GHZ_MIN_CHANNEL 122 - && channel <= IEEE80211_52GHZ_MAX_CHANNEL); 123 - } 124 - static inline 125 - int bcm43xx_is_valid_channel_bg(u8 channel) 126 - { 127 - return (channel >= IEEE80211_24GHZ_MIN_CHANNEL 128 - && channel <= IEEE80211_24GHZ_MAX_CHANNEL); 129 - } 130 - static inline 131 - int bcm43xx_is_valid_channel(struct bcm43xx_private *bcm, 132 - u8 channel) 133 - { 134 - if (bcm43xx_current_phy(bcm)->type == BCM43xx_PHYTYPE_A) 135 - return bcm43xx_is_valid_channel_a(channel); 136 - return bcm43xx_is_valid_channel_bg(channel); 137 - } 138 - 139 void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf); 140 void bcm43xx_tsf_write(struct bcm43xx_private *bcm, u64 tsf); 141
··· 112 return bcm43xx_channel_to_freq_bg(channel); 113 } 114 115 void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf); 116 void bcm43xx_tsf_write(struct bcm43xx_private *bcm, u64 tsf); 117
+2 -5
drivers/net/wireless/bcm43xx/bcm43xx_radio.c
··· 1594 u16 r8, tmp; 1595 u16 freq; 1596 1597 if ((radio->manufact == 0x17F) && 1598 (radio->version == 0x2060) && 1599 (radio->revision == 1)) { 1600 - if (channel > 200) 1601 - return -EINVAL; 1602 freq = channel2freq_a(channel); 1603 1604 r8 = bcm43xx_radio_read16(bcm, 0x0008); ··· 1651 TODO(); //TODO: TSSI2dbm workaround 1652 bcm43xx_phy_xmitpower(bcm);//FIXME correct? 1653 } else { 1654 - if ((channel < 1) || (channel > 14)) 1655 - return -EINVAL; 1656 - 1657 if (synthetic_pu_workaround) 1658 bcm43xx_synth_pu_workaround(bcm, channel); 1659
··· 1594 u16 r8, tmp; 1595 u16 freq; 1596 1597 + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) 1598 + return -EINVAL; 1599 if ((radio->manufact == 0x17F) && 1600 (radio->version == 0x2060) && 1601 (radio->revision == 1)) { 1602 freq = channel2freq_a(channel); 1603 1604 r8 = bcm43xx_radio_read16(bcm, 0x0008); ··· 1651 TODO(); //TODO: TSSI2dbm workaround 1652 bcm43xx_phy_xmitpower(bcm);//FIXME correct? 1653 } else { 1654 if (synthetic_pu_workaround) 1655 bcm43xx_synth_pu_workaround(bcm, channel); 1656
+1 -1
drivers/net/wireless/bcm43xx/bcm43xx_wx.c
··· 119 channel = bcm43xx_freq_to_channel(bcm, data->freq.m); 120 freq = data->freq.m; 121 } 122 - if (!bcm43xx_is_valid_channel(bcm, channel)) 123 goto out_unlock; 124 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { 125 //ieee80211softmac_disassoc(softmac, $REASON);
··· 119 channel = bcm43xx_freq_to_channel(bcm, data->freq.m); 120 freq = data->freq.m; 121 } 122 + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) 123 goto out_unlock; 124 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { 125 //ieee80211softmac_disassoc(softmac, $REASON);
+4 -1
drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
··· 296 u16 control = 0; 297 u16 wsec_rate = 0; 298 u16 encrypt_frame; 299 300 /* Now construct the TX header. */ 301 memset(txhdr, 0, sizeof(*txhdr)); 302 303 - bitrate = bcm->softmac->txrates.default_rate; 304 ofdm_modulation = !(ieee80211_is_cck_rate(bitrate)); 305 fallback_bitrate = bcm43xx_calc_fallback_rate(bitrate); 306 fallback_ofdm_modulation = !(ieee80211_is_cck_rate(fallback_bitrate));
··· 296 u16 control = 0; 297 u16 wsec_rate = 0; 298 u16 encrypt_frame; 299 + const u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(wireless_header->frame_ctl)); 300 + const int is_mgt = (ftype == IEEE80211_FTYPE_MGMT); 301 302 /* Now construct the TX header. */ 303 memset(txhdr, 0, sizeof(*txhdr)); 304 305 + bitrate = ieee80211softmac_suggest_txrate(bcm->softmac, 306 + is_multicast_ether_addr(wireless_header->addr1), is_mgt); 307 ofdm_modulation = !(ieee80211_is_cck_rate(bitrate)); 308 fallback_bitrate = bcm43xx_calc_fallback_rate(bitrate); 309 fallback_ofdm_modulation = !(ieee80211_is_cck_rate(fallback_bitrate));
+2
drivers/net/wireless/hostap/hostap_plx.c
··· 66 PLXDEV(0x10b7, 0x7770, "3Com AirConnect PCI 777A"), 67 PLXDEV(0x111a, 0x1023, "Siemens SpeedStream SS1023"), 68 PLXDEV(0x126c, 0x8030, "Nortel emobility"), 69 PLXDEV(0x1385, 0x4100, "Netgear MA301"), 70 PLXDEV(0x15e8, 0x0130, "National Datacomm NCP130 (PLX9052)"), 71 PLXDEV(0x15e8, 0x0131, "National Datacomm NCP130 (TMD7160)"), 72 PLXDEV(0x1638, 0x1100, "Eumitcom WL11000"), 73 PLXDEV(0x16ab, 0x1101, "Global Sun Tech GL24110P (?)"), 74 PLXDEV(0x16ab, 0x1102, "Linksys WPC11 with WDT11"), 75 PLXDEV(0x16ab, 0x1103, "Longshine 8031"),
··· 66 PLXDEV(0x10b7, 0x7770, "3Com AirConnect PCI 777A"), 67 PLXDEV(0x111a, 0x1023, "Siemens SpeedStream SS1023"), 68 PLXDEV(0x126c, 0x8030, "Nortel emobility"), 69 + PLXDEV(0x1562, 0x0001, "Symbol LA-4123"), 70 PLXDEV(0x1385, 0x4100, "Netgear MA301"), 71 PLXDEV(0x15e8, 0x0130, "National Datacomm NCP130 (PLX9052)"), 72 PLXDEV(0x15e8, 0x0131, "National Datacomm NCP130 (TMD7160)"), 73 PLXDEV(0x1638, 0x1100, "Eumitcom WL11000"), 74 + PLXDEV(0x16ab, 0x1100, "Global Sun Tech GL24110P"), 75 PLXDEV(0x16ab, 0x1101, "Global Sun Tech GL24110P (?)"), 76 PLXDEV(0x16ab, 0x1102, "Linksys WPC11 with WDT11"), 77 PLXDEV(0x16ab, 0x1103, "Longshine 8031"),
+19
drivers/net/wireless/zd1211rw/Kconfig
···
··· 1 + config ZD1211RW 2 + tristate "ZyDAS ZD1211/ZD1211B USB-wireless support" 3 + depends on USB && IEEE80211 && IEEE80211_SOFTMAC && NET_RADIO && EXPERIMENTAL 4 + select FW_LOADER 5 + ---help--- 6 + This is an experimental driver for the ZyDAS ZD1211/ZD1211B wireless 7 + chip, present in many USB-wireless adapters. 8 + 9 + Device firmware is required alongside this driver. You can download the 10 + firmware distribution from http://zd1211.ath.cx/get-firmware 11 + 12 + config ZD1211RW_DEBUG 13 + bool "ZyDAS ZD1211 debugging" 14 + depends on ZD1211RW 15 + ---help--- 16 + ZD1211 debugging messages. Choosing Y will result in additional debug 17 + messages being saved to your kernel logs, which may help debug any 18 + problems. 19 +
+11
drivers/net/wireless/zd1211rw/Makefile
···
··· 1 + obj-$(CONFIG_ZD1211RW) += zd1211rw.o 2 + 3 + zd1211rw-objs := zd_chip.o zd_ieee80211.o \ 4 + zd_mac.o zd_netdev.o \ 5 + zd_rf_al2230.o zd_rf_rf2959.o \ 6 + zd_rf.o zd_usb.o zd_util.o 7 + 8 + ifeq ($(CONFIG_ZD1211RW_DEBUG),y) 9 + EXTRA_CFLAGS += -DDEBUG 10 + endif 11 +
+1615
drivers/net/wireless/zd1211rw/zd_chip.c
···
··· 1 + /* zd_chip.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + /* This file implements all the hardware specific functions for the ZD1211 19 + * and ZD1211B chips. Support for the ZD1211B was possible after Timothy 20 + * Legge sent me a ZD1211B device. Thank you Tim. -- Uli 21 + */ 22 + 23 + #include <linux/kernel.h> 24 + #include <linux/errno.h> 25 + 26 + #include "zd_def.h" 27 + #include "zd_chip.h" 28 + #include "zd_ieee80211.h" 29 + #include "zd_mac.h" 30 + #include "zd_rf.h" 31 + #include "zd_util.h" 32 + 33 + void zd_chip_init(struct zd_chip *chip, 34 + struct net_device *netdev, 35 + struct usb_interface *intf) 36 + { 37 + memset(chip, 0, sizeof(*chip)); 38 + mutex_init(&chip->mutex); 39 + zd_usb_init(&chip->usb, netdev, intf); 40 + zd_rf_init(&chip->rf); 41 + } 42 + 43 + void zd_chip_clear(struct zd_chip *chip) 44 + { 45 + mutex_lock(&chip->mutex); 46 + zd_usb_clear(&chip->usb); 47 + zd_rf_clear(&chip->rf); 48 + mutex_unlock(&chip->mutex); 49 + mutex_destroy(&chip->mutex); 50 + memset(chip, 0, sizeof(*chip)); 51 + } 52 + 53 + static int scnprint_mac_oui(const u8 *addr, char *buffer, size_t size) 54 + { 55 + return scnprintf(buffer, size, "%02x-%02x-%02x", 56 + addr[0], addr[1], addr[2]); 57 + } 58 + 59 + /* Prints an identifier line, which will support debugging. */ 60 + static int scnprint_id(struct zd_chip *chip, char *buffer, size_t size) 61 + { 62 + int i = 0; 63 + 64 + i = scnprintf(buffer, size, "zd1211%s chip ", 65 + chip->is_zd1211b ? "b" : ""); 66 + i += zd_usb_scnprint_id(&chip->usb, buffer+i, size-i); 67 + i += scnprintf(buffer+i, size-i, " "); 68 + i += scnprint_mac_oui(chip->e2p_mac, buffer+i, size-i); 69 + i += scnprintf(buffer+i, size-i, " "); 70 + i += zd_rf_scnprint_id(&chip->rf, buffer+i, size-i); 71 + i += scnprintf(buffer+i, size-i, " pa%1x %c%c%c", chip->pa_type, 72 + chip->patch_cck_gain ? 'g' : '-', 73 + chip->patch_cr157 ? '7' : '-', 74 + chip->patch_6m_band_edge ? '6' : '-'); 75 + return i; 76 + } 77 + 78 + static void print_id(struct zd_chip *chip) 79 + { 80 + char buffer[80]; 81 + 82 + scnprint_id(chip, buffer, sizeof(buffer)); 83 + buffer[sizeof(buffer)-1] = 0; 84 + dev_info(zd_chip_dev(chip), "%s\n", buffer); 85 + } 86 + 87 + /* Read a variable number of 32-bit values. Parameter count is not allowed to 88 + * exceed USB_MAX_IOREAD32_COUNT. 89 + */ 90 + int zd_ioread32v_locked(struct zd_chip *chip, u32 *values, const zd_addr_t *addr, 91 + unsigned int count) 92 + { 93 + int r; 94 + int i; 95 + zd_addr_t *a16 = (zd_addr_t *)NULL; 96 + u16 *v16; 97 + unsigned int count16; 98 + 99 + if (count > USB_MAX_IOREAD32_COUNT) 100 + return -EINVAL; 101 + 102 + /* Allocate a single memory block for values and addresses. */ 103 + count16 = 2*count; 104 + a16 = (zd_addr_t *)kmalloc(count16 * (sizeof(zd_addr_t) + sizeof(u16)), 105 + GFP_NOFS); 106 + if (!a16) { 107 + dev_dbg_f(zd_chip_dev(chip), 108 + "error ENOMEM in allocation of a16\n"); 109 + r = -ENOMEM; 110 + goto out; 111 + } 112 + v16 = (u16 *)(a16 + count16); 113 + 114 + for (i = 0; i < count; i++) { 115 + int j = 2*i; 116 + /* We read the high word always first. */ 117 + a16[j] = zd_inc_word(addr[i]); 118 + a16[j+1] = addr[i]; 119 + } 120 + 121 + r = zd_ioread16v_locked(chip, v16, a16, count16); 122 + if (r) { 123 + dev_dbg_f(zd_chip_dev(chip), 124 + "error: zd_ioread16v_locked. Error number %d\n", r); 125 + goto out; 126 + } 127 + 128 + for (i = 0; i < count; i++) { 129 + int j = 2*i; 130 + values[i] = (v16[j] << 16) | v16[j+1]; 131 + } 132 + 133 + out: 134 + kfree((void *)a16); 135 + return r; 136 + } 137 + 138 + int _zd_iowrite32v_locked(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs, 139 + unsigned int count) 140 + { 141 + int i, j, r; 142 + struct zd_ioreq16 *ioreqs16; 143 + unsigned int count16; 144 + 145 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 146 + 147 + if (count == 0) 148 + return 0; 149 + if (count > USB_MAX_IOWRITE32_COUNT) 150 + return -EINVAL; 151 + 152 + /* Allocate a single memory block for values and addresses. */ 153 + count16 = 2*count; 154 + ioreqs16 = kmalloc(count16 * sizeof(struct zd_ioreq16), GFP_NOFS); 155 + if (!ioreqs16) { 156 + r = -ENOMEM; 157 + dev_dbg_f(zd_chip_dev(chip), 158 + "error %d in ioreqs16 allocation\n", r); 159 + goto out; 160 + } 161 + 162 + for (i = 0; i < count; i++) { 163 + j = 2*i; 164 + /* We write the high word always first. */ 165 + ioreqs16[j].value = ioreqs[i].value >> 16; 166 + ioreqs16[j].addr = zd_inc_word(ioreqs[i].addr); 167 + ioreqs16[j+1].value = ioreqs[i].value; 168 + ioreqs16[j+1].addr = ioreqs[i].addr; 169 + } 170 + 171 + r = zd_usb_iowrite16v(&chip->usb, ioreqs16, count16); 172 + #ifdef DEBUG 173 + if (r) { 174 + dev_dbg_f(zd_chip_dev(chip), 175 + "error %d in zd_usb_write16v\n", r); 176 + } 177 + #endif /* DEBUG */ 178 + out: 179 + kfree(ioreqs16); 180 + return r; 181 + } 182 + 183 + int zd_iowrite16a_locked(struct zd_chip *chip, 184 + const struct zd_ioreq16 *ioreqs, unsigned int count) 185 + { 186 + int r; 187 + unsigned int i, j, t, max; 188 + 189 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 190 + for (i = 0; i < count; i += j + t) { 191 + t = 0; 192 + max = count-i; 193 + if (max > USB_MAX_IOWRITE16_COUNT) 194 + max = USB_MAX_IOWRITE16_COUNT; 195 + for (j = 0; j < max; j++) { 196 + if (!ioreqs[i+j].addr) { 197 + t = 1; 198 + break; 199 + } 200 + } 201 + 202 + r = zd_usb_iowrite16v(&chip->usb, &ioreqs[i], j); 203 + if (r) { 204 + dev_dbg_f(zd_chip_dev(chip), 205 + "error zd_usb_iowrite16v. Error number %d\n", 206 + r); 207 + return r; 208 + } 209 + } 210 + 211 + return 0; 212 + } 213 + 214 + /* Writes a variable number of 32 bit registers. The functions will split 215 + * that in several USB requests. A split can be forced by inserting an IO 216 + * request with an zero address field. 217 + */ 218 + int zd_iowrite32a_locked(struct zd_chip *chip, 219 + const struct zd_ioreq32 *ioreqs, unsigned int count) 220 + { 221 + int r; 222 + unsigned int i, j, t, max; 223 + 224 + for (i = 0; i < count; i += j + t) { 225 + t = 0; 226 + max = count-i; 227 + if (max > USB_MAX_IOWRITE32_COUNT) 228 + max = USB_MAX_IOWRITE32_COUNT; 229 + for (j = 0; j < max; j++) { 230 + if (!ioreqs[i+j].addr) { 231 + t = 1; 232 + break; 233 + } 234 + } 235 + 236 + r = _zd_iowrite32v_locked(chip, &ioreqs[i], j); 237 + if (r) { 238 + dev_dbg_f(zd_chip_dev(chip), 239 + "error _zd_iowrite32v_locked." 240 + " Error number %d\n", r); 241 + return r; 242 + } 243 + } 244 + 245 + return 0; 246 + } 247 + 248 + int zd_ioread16(struct zd_chip *chip, zd_addr_t addr, u16 *value) 249 + { 250 + int r; 251 + 252 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 253 + mutex_lock(&chip->mutex); 254 + r = zd_ioread16_locked(chip, value, addr); 255 + mutex_unlock(&chip->mutex); 256 + return r; 257 + } 258 + 259 + int zd_ioread32(struct zd_chip *chip, zd_addr_t addr, u32 *value) 260 + { 261 + int r; 262 + 263 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 264 + mutex_lock(&chip->mutex); 265 + r = zd_ioread32_locked(chip, value, addr); 266 + mutex_unlock(&chip->mutex); 267 + return r; 268 + } 269 + 270 + int zd_iowrite16(struct zd_chip *chip, zd_addr_t addr, u16 value) 271 + { 272 + int r; 273 + 274 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 275 + mutex_lock(&chip->mutex); 276 + r = zd_iowrite16_locked(chip, value, addr); 277 + mutex_unlock(&chip->mutex); 278 + return r; 279 + } 280 + 281 + int zd_iowrite32(struct zd_chip *chip, zd_addr_t addr, u32 value) 282 + { 283 + int r; 284 + 285 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 286 + mutex_lock(&chip->mutex); 287 + r = zd_iowrite32_locked(chip, value, addr); 288 + mutex_unlock(&chip->mutex); 289 + return r; 290 + } 291 + 292 + int zd_ioread32v(struct zd_chip *chip, const zd_addr_t *addresses, 293 + u32 *values, unsigned int count) 294 + { 295 + int r; 296 + 297 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 298 + mutex_lock(&chip->mutex); 299 + r = zd_ioread32v_locked(chip, values, addresses, count); 300 + mutex_unlock(&chip->mutex); 301 + return r; 302 + } 303 + 304 + int zd_iowrite32a(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs, 305 + unsigned int count) 306 + { 307 + int r; 308 + 309 + ZD_ASSERT(!mutex_is_locked(&chip->mutex)); 310 + mutex_lock(&chip->mutex); 311 + r = zd_iowrite32a_locked(chip, ioreqs, count); 312 + mutex_unlock(&chip->mutex); 313 + return r; 314 + } 315 + 316 + static int read_pod(struct zd_chip *chip, u8 *rf_type) 317 + { 318 + int r; 319 + u32 value; 320 + 321 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 322 + r = zd_ioread32_locked(chip, &value, E2P_POD); 323 + if (r) 324 + goto error; 325 + dev_dbg_f(zd_chip_dev(chip), "E2P_POD %#010x\n", value); 326 + 327 + /* FIXME: AL2230 handling (Bit 7 in POD) */ 328 + *rf_type = value & 0x0f; 329 + chip->pa_type = (value >> 16) & 0x0f; 330 + chip->patch_cck_gain = (value >> 8) & 0x1; 331 + chip->patch_cr157 = (value >> 13) & 0x1; 332 + chip->patch_6m_band_edge = (value >> 21) & 0x1; 333 + 334 + dev_dbg_f(zd_chip_dev(chip), 335 + "RF %s %#01x PA type %#01x patch CCK %d patch CR157 %d " 336 + "patch 6M %d\n", 337 + zd_rf_name(*rf_type), *rf_type, 338 + chip->pa_type, chip->patch_cck_gain, 339 + chip->patch_cr157, chip->patch_6m_band_edge); 340 + return 0; 341 + error: 342 + *rf_type = 0; 343 + chip->pa_type = 0; 344 + chip->patch_cck_gain = 0; 345 + chip->patch_cr157 = 0; 346 + chip->patch_6m_band_edge = 0; 347 + return r; 348 + } 349 + 350 + static int _read_mac_addr(struct zd_chip *chip, u8 *mac_addr, 351 + const zd_addr_t *addr) 352 + { 353 + int r; 354 + u32 parts[2]; 355 + 356 + r = zd_ioread32v_locked(chip, parts, (const zd_addr_t *)addr, 2); 357 + if (r) { 358 + dev_dbg_f(zd_chip_dev(chip), 359 + "error: couldn't read e2p macs. Error number %d\n", r); 360 + return r; 361 + } 362 + 363 + mac_addr[0] = parts[0]; 364 + mac_addr[1] = parts[0] >> 8; 365 + mac_addr[2] = parts[0] >> 16; 366 + mac_addr[3] = parts[0] >> 24; 367 + mac_addr[4] = parts[1]; 368 + mac_addr[5] = parts[1] >> 8; 369 + 370 + return 0; 371 + } 372 + 373 + static int read_e2p_mac_addr(struct zd_chip *chip) 374 + { 375 + static const zd_addr_t addr[2] = { E2P_MAC_ADDR_P1, E2P_MAC_ADDR_P2 }; 376 + 377 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 378 + return _read_mac_addr(chip, chip->e2p_mac, (const zd_addr_t *)addr); 379 + } 380 + 381 + /* MAC address: if custom mac addresses are to to be used CR_MAC_ADDR_P1 and 382 + * CR_MAC_ADDR_P2 must be overwritten 383 + */ 384 + void zd_get_e2p_mac_addr(struct zd_chip *chip, u8 *mac_addr) 385 + { 386 + mutex_lock(&chip->mutex); 387 + memcpy(mac_addr, chip->e2p_mac, ETH_ALEN); 388 + mutex_unlock(&chip->mutex); 389 + } 390 + 391 + static int read_mac_addr(struct zd_chip *chip, u8 *mac_addr) 392 + { 393 + static const zd_addr_t addr[2] = { CR_MAC_ADDR_P1, CR_MAC_ADDR_P2 }; 394 + return _read_mac_addr(chip, mac_addr, (const zd_addr_t *)addr); 395 + } 396 + 397 + int zd_read_mac_addr(struct zd_chip *chip, u8 *mac_addr) 398 + { 399 + int r; 400 + 401 + dev_dbg_f(zd_chip_dev(chip), "\n"); 402 + mutex_lock(&chip->mutex); 403 + r = read_mac_addr(chip, mac_addr); 404 + mutex_unlock(&chip->mutex); 405 + return r; 406 + } 407 + 408 + int zd_write_mac_addr(struct zd_chip *chip, const u8 *mac_addr) 409 + { 410 + int r; 411 + struct zd_ioreq32 reqs[2] = { 412 + [0] = { .addr = CR_MAC_ADDR_P1 }, 413 + [1] = { .addr = CR_MAC_ADDR_P2 }, 414 + }; 415 + 416 + reqs[0].value = (mac_addr[3] << 24) 417 + | (mac_addr[2] << 16) 418 + | (mac_addr[1] << 8) 419 + | mac_addr[0]; 420 + reqs[1].value = (mac_addr[5] << 8) 421 + | mac_addr[4]; 422 + 423 + dev_dbg_f(zd_chip_dev(chip), 424 + "mac addr " MAC_FMT "\n", MAC_ARG(mac_addr)); 425 + 426 + mutex_lock(&chip->mutex); 427 + r = zd_iowrite32a_locked(chip, reqs, ARRAY_SIZE(reqs)); 428 + #ifdef DEBUG 429 + { 430 + u8 tmp[ETH_ALEN]; 431 + read_mac_addr(chip, tmp); 432 + } 433 + #endif /* DEBUG */ 434 + mutex_unlock(&chip->mutex); 435 + return r; 436 + } 437 + 438 + int zd_read_regdomain(struct zd_chip *chip, u8 *regdomain) 439 + { 440 + int r; 441 + u32 value; 442 + 443 + mutex_lock(&chip->mutex); 444 + r = zd_ioread32_locked(chip, &value, E2P_SUBID); 445 + mutex_unlock(&chip->mutex); 446 + if (r) 447 + return r; 448 + 449 + *regdomain = value >> 16; 450 + dev_dbg_f(zd_chip_dev(chip), "regdomain: %#04x\n", *regdomain); 451 + 452 + return 0; 453 + } 454 + 455 + static int read_values(struct zd_chip *chip, u8 *values, size_t count, 456 + zd_addr_t e2p_addr, u32 guard) 457 + { 458 + int r; 459 + int i; 460 + u32 v; 461 + 462 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 463 + for (i = 0;;) { 464 + r = zd_ioread32_locked(chip, &v, e2p_addr+i/2); 465 + if (r) 466 + return r; 467 + v -= guard; 468 + if (i+4 < count) { 469 + values[i++] = v; 470 + values[i++] = v >> 8; 471 + values[i++] = v >> 16; 472 + values[i++] = v >> 24; 473 + continue; 474 + } 475 + for (;i < count; i++) 476 + values[i] = v >> (8*(i%3)); 477 + return 0; 478 + } 479 + } 480 + 481 + static int read_pwr_cal_values(struct zd_chip *chip) 482 + { 483 + return read_values(chip, chip->pwr_cal_values, 484 + E2P_CHANNEL_COUNT, E2P_PWR_CAL_VALUE1, 485 + 0); 486 + } 487 + 488 + static int read_pwr_int_values(struct zd_chip *chip) 489 + { 490 + return read_values(chip, chip->pwr_int_values, 491 + E2P_CHANNEL_COUNT, E2P_PWR_INT_VALUE1, 492 + E2P_PWR_INT_GUARD); 493 + } 494 + 495 + static int read_ofdm_cal_values(struct zd_chip *chip) 496 + { 497 + int r; 498 + int i; 499 + static const zd_addr_t addresses[] = { 500 + E2P_36M_CAL_VALUE1, 501 + E2P_48M_CAL_VALUE1, 502 + E2P_54M_CAL_VALUE1, 503 + }; 504 + 505 + for (i = 0; i < 3; i++) { 506 + r = read_values(chip, chip->ofdm_cal_values[i], 507 + E2P_CHANNEL_COUNT, addresses[i], 0); 508 + if (r) 509 + return r; 510 + } 511 + return 0; 512 + } 513 + 514 + static int read_cal_int_tables(struct zd_chip *chip) 515 + { 516 + int r; 517 + 518 + r = read_pwr_cal_values(chip); 519 + if (r) 520 + return r; 521 + r = read_pwr_int_values(chip); 522 + if (r) 523 + return r; 524 + r = read_ofdm_cal_values(chip); 525 + if (r) 526 + return r; 527 + return 0; 528 + } 529 + 530 + /* phy means physical registers */ 531 + int zd_chip_lock_phy_regs(struct zd_chip *chip) 532 + { 533 + int r; 534 + u32 tmp; 535 + 536 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 537 + r = zd_ioread32_locked(chip, &tmp, CR_REG1); 538 + if (r) { 539 + dev_err(zd_chip_dev(chip), "error ioread32(CR_REG1): %d\n", r); 540 + return r; 541 + } 542 + 543 + dev_dbg_f(zd_chip_dev(chip), 544 + "CR_REG1: 0x%02x -> 0x%02x\n", tmp, tmp & ~UNLOCK_PHY_REGS); 545 + tmp &= ~UNLOCK_PHY_REGS; 546 + 547 + r = zd_iowrite32_locked(chip, tmp, CR_REG1); 548 + if (r) 549 + dev_err(zd_chip_dev(chip), "error iowrite32(CR_REG1): %d\n", r); 550 + return r; 551 + } 552 + 553 + int zd_chip_unlock_phy_regs(struct zd_chip *chip) 554 + { 555 + int r; 556 + u32 tmp; 557 + 558 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 559 + r = zd_ioread32_locked(chip, &tmp, CR_REG1); 560 + if (r) { 561 + dev_err(zd_chip_dev(chip), 562 + "error ioread32(CR_REG1): %d\n", r); 563 + return r; 564 + } 565 + 566 + dev_dbg_f(zd_chip_dev(chip), 567 + "CR_REG1: 0x%02x -> 0x%02x\n", tmp, tmp | UNLOCK_PHY_REGS); 568 + tmp |= UNLOCK_PHY_REGS; 569 + 570 + r = zd_iowrite32_locked(chip, tmp, CR_REG1); 571 + if (r) 572 + dev_err(zd_chip_dev(chip), "error iowrite32(CR_REG1): %d\n", r); 573 + return r; 574 + } 575 + 576 + /* CR157 can be optionally patched by the EEPROM */ 577 + static int patch_cr157(struct zd_chip *chip) 578 + { 579 + int r; 580 + u32 value; 581 + 582 + if (!chip->patch_cr157) 583 + return 0; 584 + 585 + r = zd_ioread32_locked(chip, &value, E2P_PHY_REG); 586 + if (r) 587 + return r; 588 + 589 + dev_dbg_f(zd_chip_dev(chip), "patching value %x\n", value >> 8); 590 + return zd_iowrite32_locked(chip, value >> 8, CR157); 591 + } 592 + 593 + /* 594 + * 6M band edge can be optionally overwritten for certain RF's 595 + * Vendor driver says: for FCC regulation, enabled per HWFeature 6M band edge 596 + * bit (for AL2230, AL2230S) 597 + */ 598 + static int patch_6m_band_edge(struct zd_chip *chip, int channel) 599 + { 600 + struct zd_ioreq16 ioreqs[] = { 601 + { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 }, 602 + { CR47, 0x1e }, 603 + }; 604 + 605 + if (!chip->patch_6m_band_edge || !chip->rf.patch_6m_band_edge) 606 + return 0; 607 + 608 + /* FIXME: Channel 11 is not the edge for all regulatory domains. */ 609 + if (channel == 1 || channel == 11) 610 + ioreqs[0].value = 0x12; 611 + 612 + dev_dbg_f(zd_chip_dev(chip), "patching for channel %d\n", channel); 613 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 614 + } 615 + 616 + static int zd1211_hw_reset_phy(struct zd_chip *chip) 617 + { 618 + static const struct zd_ioreq16 ioreqs[] = { 619 + { CR0, 0x0a }, { CR1, 0x06 }, { CR2, 0x26 }, 620 + { CR3, 0x38 }, { CR4, 0x80 }, { CR9, 0xa0 }, 621 + { CR10, 0x81 }, { CR11, 0x00 }, { CR12, 0x7f }, 622 + { CR13, 0x8c }, { CR14, 0x80 }, { CR15, 0x3d }, 623 + { CR16, 0x20 }, { CR17, 0x1e }, { CR18, 0x0a }, 624 + { CR19, 0x48 }, { CR20, 0x0c }, { CR21, 0x0c }, 625 + { CR22, 0x23 }, { CR23, 0x90 }, { CR24, 0x14 }, 626 + { CR25, 0x40 }, { CR26, 0x10 }, { CR27, 0x19 }, 627 + { CR28, 0x7f }, { CR29, 0x80 }, { CR30, 0x4b }, 628 + { CR31, 0x60 }, { CR32, 0x43 }, { CR33, 0x08 }, 629 + { CR34, 0x06 }, { CR35, 0x0a }, { CR36, 0x00 }, 630 + { CR37, 0x00 }, { CR38, 0x38 }, { CR39, 0x0c }, 631 + { CR40, 0x84 }, { CR41, 0x2a }, { CR42, 0x80 }, 632 + { CR43, 0x10 }, { CR44, 0x12 }, { CR46, 0xff }, 633 + { CR47, 0x1E }, { CR48, 0x26 }, { CR49, 0x5b }, 634 + { CR64, 0xd0 }, { CR65, 0x04 }, { CR66, 0x58 }, 635 + { CR67, 0xc9 }, { CR68, 0x88 }, { CR69, 0x41 }, 636 + { CR70, 0x23 }, { CR71, 0x10 }, { CR72, 0xff }, 637 + { CR73, 0x32 }, { CR74, 0x30 }, { CR75, 0x65 }, 638 + { CR76, 0x41 }, { CR77, 0x1b }, { CR78, 0x30 }, 639 + { CR79, 0x68 }, { CR80, 0x64 }, { CR81, 0x64 }, 640 + { CR82, 0x00 }, { CR83, 0x00 }, { CR84, 0x00 }, 641 + { CR85, 0x02 }, { CR86, 0x00 }, { CR87, 0x00 }, 642 + { CR88, 0xff }, { CR89, 0xfc }, { CR90, 0x00 }, 643 + { CR91, 0x00 }, { CR92, 0x00 }, { CR93, 0x08 }, 644 + { CR94, 0x00 }, { CR95, 0x00 }, { CR96, 0xff }, 645 + { CR97, 0xe7 }, { CR98, 0x00 }, { CR99, 0x00 }, 646 + { CR100, 0x00 }, { CR101, 0xae }, { CR102, 0x02 }, 647 + { CR103, 0x00 }, { CR104, 0x03 }, { CR105, 0x65 }, 648 + { CR106, 0x04 }, { CR107, 0x00 }, { CR108, 0x0a }, 649 + { CR109, 0xaa }, { CR110, 0xaa }, { CR111, 0x25 }, 650 + { CR112, 0x25 }, { CR113, 0x00 }, { CR119, 0x1e }, 651 + { CR125, 0x90 }, { CR126, 0x00 }, { CR127, 0x00 }, 652 + { }, 653 + { CR5, 0x00 }, { CR6, 0x00 }, { CR7, 0x00 }, 654 + { CR8, 0x00 }, { CR9, 0x20 }, { CR12, 0xf0 }, 655 + { CR20, 0x0e }, { CR21, 0x0e }, { CR27, 0x10 }, 656 + { CR44, 0x33 }, { CR47, 0x1E }, { CR83, 0x24 }, 657 + { CR84, 0x04 }, { CR85, 0x00 }, { CR86, 0x0C }, 658 + { CR87, 0x12 }, { CR88, 0x0C }, { CR89, 0x00 }, 659 + { CR90, 0x10 }, { CR91, 0x08 }, { CR93, 0x00 }, 660 + { CR94, 0x01 }, { CR95, 0x00 }, { CR96, 0x50 }, 661 + { CR97, 0x37 }, { CR98, 0x35 }, { CR101, 0x13 }, 662 + { CR102, 0x27 }, { CR103, 0x27 }, { CR104, 0x18 }, 663 + { CR105, 0x12 }, { CR109, 0x27 }, { CR110, 0x27 }, 664 + { CR111, 0x27 }, { CR112, 0x27 }, { CR113, 0x27 }, 665 + { CR114, 0x27 }, { CR115, 0x26 }, { CR116, 0x24 }, 666 + { CR117, 0xfc }, { CR118, 0xfa }, { CR120, 0x4f }, 667 + { CR123, 0x27 }, { CR125, 0xaa }, { CR127, 0x03 }, 668 + { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 }, 669 + { CR131, 0x0C }, { CR136, 0xdf }, { CR137, 0x40 }, 670 + { CR138, 0xa0 }, { CR139, 0xb0 }, { CR140, 0x99 }, 671 + { CR141, 0x82 }, { CR142, 0x54 }, { CR143, 0x1c }, 672 + { CR144, 0x6c }, { CR147, 0x07 }, { CR148, 0x4c }, 673 + { CR149, 0x50 }, { CR150, 0x0e }, { CR151, 0x18 }, 674 + { CR160, 0xfe }, { CR161, 0xee }, { CR162, 0xaa }, 675 + { CR163, 0xfa }, { CR164, 0xfa }, { CR165, 0xea }, 676 + { CR166, 0xbe }, { CR167, 0xbe }, { CR168, 0x6a }, 677 + { CR169, 0xba }, { CR170, 0xba }, { CR171, 0xba }, 678 + /* Note: CR204 must lead the CR203 */ 679 + { CR204, 0x7d }, 680 + { }, 681 + { CR203, 0x30 }, 682 + }; 683 + 684 + int r, t; 685 + 686 + dev_dbg_f(zd_chip_dev(chip), "\n"); 687 + 688 + r = zd_chip_lock_phy_regs(chip); 689 + if (r) 690 + goto out; 691 + 692 + r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 693 + if (r) 694 + goto unlock; 695 + 696 + r = patch_cr157(chip); 697 + unlock: 698 + t = zd_chip_unlock_phy_regs(chip); 699 + if (t && !r) 700 + r = t; 701 + out: 702 + return r; 703 + } 704 + 705 + static int zd1211b_hw_reset_phy(struct zd_chip *chip) 706 + { 707 + static const struct zd_ioreq16 ioreqs[] = { 708 + { CR0, 0x14 }, { CR1, 0x06 }, { CR2, 0x26 }, 709 + { CR3, 0x38 }, { CR4, 0x80 }, { CR9, 0xe0 }, 710 + { CR10, 0x81 }, 711 + /* power control { { CR11, 1 << 6 }, */ 712 + { CR11, 0x00 }, 713 + { CR12, 0xf0 }, { CR13, 0x8c }, { CR14, 0x80 }, 714 + { CR15, 0x3d }, { CR16, 0x20 }, { CR17, 0x1e }, 715 + { CR18, 0x0a }, { CR19, 0x48 }, 716 + { CR20, 0x10 }, /* Org:0x0E, ComTrend:RalLink AP */ 717 + { CR21, 0x0e }, { CR22, 0x23 }, { CR23, 0x90 }, 718 + { CR24, 0x14 }, { CR25, 0x40 }, { CR26, 0x10 }, 719 + { CR27, 0x10 }, { CR28, 0x7f }, { CR29, 0x80 }, 720 + { CR30, 0x49 }, /* jointly decoder, no ASIC */ 721 + { CR31, 0x60 }, { CR32, 0x43 }, { CR33, 0x08 }, 722 + { CR34, 0x06 }, { CR35, 0x0a }, { CR36, 0x00 }, 723 + { CR37, 0x00 }, { CR38, 0x38 }, { CR39, 0x0c }, 724 + { CR40, 0x84 }, { CR41, 0x2a }, { CR42, 0x80 }, 725 + { CR43, 0x10 }, { CR44, 0x33 }, { CR46, 0xff }, 726 + { CR47, 0x1E }, { CR48, 0x26 }, { CR49, 0x5b }, 727 + { CR64, 0xd0 }, { CR65, 0x04 }, { CR66, 0x58 }, 728 + { CR67, 0xc9 }, { CR68, 0x88 }, { CR69, 0x41 }, 729 + { CR70, 0x23 }, { CR71, 0x10 }, { CR72, 0xff }, 730 + { CR73, 0x32 }, { CR74, 0x30 }, { CR75, 0x65 }, 731 + { CR76, 0x41 }, { CR77, 0x1b }, { CR78, 0x30 }, 732 + { CR79, 0xf0 }, { CR80, 0x64 }, { CR81, 0x64 }, 733 + { CR82, 0x00 }, { CR83, 0x24 }, { CR84, 0x04 }, 734 + { CR85, 0x00 }, { CR86, 0x0c }, { CR87, 0x12 }, 735 + { CR88, 0x0c }, { CR89, 0x00 }, { CR90, 0x58 }, 736 + { CR91, 0x04 }, { CR92, 0x00 }, { CR93, 0x00 }, 737 + { CR94, 0x01 }, 738 + { CR95, 0x20 }, /* ZD1211B */ 739 + { CR96, 0x50 }, { CR97, 0x37 }, { CR98, 0x35 }, 740 + { CR99, 0x00 }, { CR100, 0x01 }, { CR101, 0x13 }, 741 + { CR102, 0x27 }, { CR103, 0x27 }, { CR104, 0x18 }, 742 + { CR105, 0x12 }, { CR106, 0x04 }, { CR107, 0x00 }, 743 + { CR108, 0x0a }, { CR109, 0x27 }, { CR110, 0x27 }, 744 + { CR111, 0x27 }, { CR112, 0x27 }, { CR113, 0x27 }, 745 + { CR114, 0x27 }, { CR115, 0x26 }, { CR116, 0x24 }, 746 + { CR117, 0xfc }, { CR118, 0xfa }, { CR119, 0x1e }, 747 + { CR125, 0x90 }, { CR126, 0x00 }, { CR127, 0x00 }, 748 + { CR128, 0x14 }, { CR129, 0x12 }, { CR130, 0x10 }, 749 + { CR131, 0x0c }, { CR136, 0xdf }, { CR137, 0xa0 }, 750 + { CR138, 0xa8 }, { CR139, 0xb4 }, { CR140, 0x98 }, 751 + { CR141, 0x82 }, { CR142, 0x53 }, { CR143, 0x1c }, 752 + { CR144, 0x6c }, { CR147, 0x07 }, { CR148, 0x40 }, 753 + { CR149, 0x40 }, /* Org:0x50 ComTrend:RalLink AP */ 754 + { CR150, 0x14 }, /* Org:0x0E ComTrend:RalLink AP */ 755 + { CR151, 0x18 }, { CR159, 0x70 }, { CR160, 0xfe }, 756 + { CR161, 0xee }, { CR162, 0xaa }, { CR163, 0xfa }, 757 + { CR164, 0xfa }, { CR165, 0xea }, { CR166, 0xbe }, 758 + { CR167, 0xbe }, { CR168, 0x6a }, { CR169, 0xba }, 759 + { CR170, 0xba }, { CR171, 0xba }, 760 + /* Note: CR204 must lead the CR203 */ 761 + { CR204, 0x7d }, 762 + {}, 763 + { CR203, 0x30 }, 764 + }; 765 + 766 + int r, t; 767 + 768 + dev_dbg_f(zd_chip_dev(chip), "\n"); 769 + 770 + r = zd_chip_lock_phy_regs(chip); 771 + if (r) 772 + goto out; 773 + 774 + r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 775 + if (r) 776 + goto unlock; 777 + 778 + r = patch_cr157(chip); 779 + unlock: 780 + t = zd_chip_unlock_phy_regs(chip); 781 + if (t && !r) 782 + r = t; 783 + out: 784 + return r; 785 + } 786 + 787 + static int hw_reset_phy(struct zd_chip *chip) 788 + { 789 + return chip->is_zd1211b ? zd1211b_hw_reset_phy(chip) : 790 + zd1211_hw_reset_phy(chip); 791 + } 792 + 793 + static int zd1211_hw_init_hmac(struct zd_chip *chip) 794 + { 795 + static const struct zd_ioreq32 ioreqs[] = { 796 + { CR_ACK_TIMEOUT_EXT, 0x20 }, 797 + { CR_ADDA_MBIAS_WARMTIME, 0x30000808 }, 798 + { CR_ZD1211_RETRY_MAX, 0x2 }, 799 + { CR_SNIFFER_ON, 0 }, 800 + { CR_RX_FILTER, AP_RX_FILTER }, 801 + { CR_GROUP_HASH_P1, 0x00 }, 802 + { CR_GROUP_HASH_P2, 0x80000000 }, 803 + { CR_REG1, 0xa4 }, 804 + { CR_ADDA_PWR_DWN, 0x7f }, 805 + { CR_BCN_PLCP_CFG, 0x00f00401 }, 806 + { CR_PHY_DELAY, 0x00 }, 807 + { CR_ACK_TIMEOUT_EXT, 0x80 }, 808 + { CR_ADDA_PWR_DWN, 0x00 }, 809 + { CR_ACK_TIME_80211, 0x100 }, 810 + { CR_IFS_VALUE, 0x547c032 }, 811 + { CR_RX_PE_DELAY, 0x70 }, 812 + { CR_PS_CTRL, 0x10000000 }, 813 + { CR_RTS_CTS_RATE, 0x02030203 }, 814 + { CR_RX_THRESHOLD, 0x000c0640 }, 815 + { CR_AFTER_PNP, 0x1 }, 816 + { CR_WEP_PROTECT, 0x114 }, 817 + }; 818 + 819 + int r; 820 + 821 + dev_dbg_f(zd_chip_dev(chip), "\n"); 822 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 823 + r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 824 + #ifdef DEBUG 825 + if (r) { 826 + dev_err(zd_chip_dev(chip), 827 + "error in zd_iowrite32a_locked. Error number %d\n", r); 828 + } 829 + #endif /* DEBUG */ 830 + return r; 831 + } 832 + 833 + static int zd1211b_hw_init_hmac(struct zd_chip *chip) 834 + { 835 + static const struct zd_ioreq32 ioreqs[] = { 836 + { CR_ACK_TIMEOUT_EXT, 0x20 }, 837 + { CR_ADDA_MBIAS_WARMTIME, 0x30000808 }, 838 + { CR_ZD1211B_RETRY_MAX, 0x02020202 }, 839 + { CR_ZD1211B_TX_PWR_CTL4, 0x007f003f }, 840 + { CR_ZD1211B_TX_PWR_CTL3, 0x007f003f }, 841 + { CR_ZD1211B_TX_PWR_CTL2, 0x003f001f }, 842 + { CR_ZD1211B_TX_PWR_CTL1, 0x001f000f }, 843 + { CR_ZD1211B_AIFS_CTL1, 0x00280028 }, 844 + { CR_ZD1211B_AIFS_CTL2, 0x008C003C }, 845 + { CR_ZD1211B_TXOP, 0x01800824 }, 846 + { CR_SNIFFER_ON, 0 }, 847 + { CR_RX_FILTER, AP_RX_FILTER }, 848 + { CR_GROUP_HASH_P1, 0x00 }, 849 + { CR_GROUP_HASH_P2, 0x80000000 }, 850 + { CR_REG1, 0xa4 }, 851 + { CR_ADDA_PWR_DWN, 0x7f }, 852 + { CR_BCN_PLCP_CFG, 0x00f00401 }, 853 + { CR_PHY_DELAY, 0x00 }, 854 + { CR_ACK_TIMEOUT_EXT, 0x80 }, 855 + { CR_ADDA_PWR_DWN, 0x00 }, 856 + { CR_ACK_TIME_80211, 0x100 }, 857 + { CR_IFS_VALUE, 0x547c032 }, 858 + { CR_RX_PE_DELAY, 0x70 }, 859 + { CR_PS_CTRL, 0x10000000 }, 860 + { CR_RTS_CTS_RATE, 0x02030203 }, 861 + { CR_RX_THRESHOLD, 0x000c0640 }, 862 + { CR_AFTER_PNP, 0x1 }, 863 + { CR_WEP_PROTECT, 0x114 }, 864 + }; 865 + 866 + int r; 867 + 868 + dev_dbg_f(zd_chip_dev(chip), "\n"); 869 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 870 + r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 871 + if (r) { 872 + dev_dbg_f(zd_chip_dev(chip), 873 + "error in zd_iowrite32a_locked. Error number %d\n", r); 874 + } 875 + return r; 876 + } 877 + 878 + static int hw_init_hmac(struct zd_chip *chip) 879 + { 880 + return chip->is_zd1211b ? 881 + zd1211b_hw_init_hmac(chip) : zd1211_hw_init_hmac(chip); 882 + } 883 + 884 + struct aw_pt_bi { 885 + u32 atim_wnd_period; 886 + u32 pre_tbtt; 887 + u32 beacon_interval; 888 + }; 889 + 890 + static int get_aw_pt_bi(struct zd_chip *chip, struct aw_pt_bi *s) 891 + { 892 + int r; 893 + static const zd_addr_t aw_pt_bi_addr[] = 894 + { CR_ATIM_WND_PERIOD, CR_PRE_TBTT, CR_BCN_INTERVAL }; 895 + u32 values[3]; 896 + 897 + r = zd_ioread32v_locked(chip, values, (const zd_addr_t *)aw_pt_bi_addr, 898 + ARRAY_SIZE(aw_pt_bi_addr)); 899 + if (r) { 900 + memset(s, 0, sizeof(*s)); 901 + return r; 902 + } 903 + 904 + s->atim_wnd_period = values[0]; 905 + s->pre_tbtt = values[1]; 906 + s->beacon_interval = values[2]; 907 + dev_dbg_f(zd_chip_dev(chip), "aw %u pt %u bi %u\n", 908 + s->atim_wnd_period, s->pre_tbtt, s->beacon_interval); 909 + return 0; 910 + } 911 + 912 + static int set_aw_pt_bi(struct zd_chip *chip, struct aw_pt_bi *s) 913 + { 914 + struct zd_ioreq32 reqs[3]; 915 + 916 + if (s->beacon_interval <= 5) 917 + s->beacon_interval = 5; 918 + if (s->pre_tbtt < 4 || s->pre_tbtt >= s->beacon_interval) 919 + s->pre_tbtt = s->beacon_interval - 1; 920 + if (s->atim_wnd_period >= s->pre_tbtt) 921 + s->atim_wnd_period = s->pre_tbtt - 1; 922 + 923 + reqs[0].addr = CR_ATIM_WND_PERIOD; 924 + reqs[0].value = s->atim_wnd_period; 925 + reqs[1].addr = CR_PRE_TBTT; 926 + reqs[1].value = s->pre_tbtt; 927 + reqs[2].addr = CR_BCN_INTERVAL; 928 + reqs[2].value = s->beacon_interval; 929 + 930 + dev_dbg_f(zd_chip_dev(chip), 931 + "aw %u pt %u bi %u\n", s->atim_wnd_period, s->pre_tbtt, 932 + s->beacon_interval); 933 + return zd_iowrite32a_locked(chip, reqs, ARRAY_SIZE(reqs)); 934 + } 935 + 936 + 937 + static int set_beacon_interval(struct zd_chip *chip, u32 interval) 938 + { 939 + int r; 940 + struct aw_pt_bi s; 941 + 942 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 943 + r = get_aw_pt_bi(chip, &s); 944 + if (r) 945 + return r; 946 + s.beacon_interval = interval; 947 + return set_aw_pt_bi(chip, &s); 948 + } 949 + 950 + int zd_set_beacon_interval(struct zd_chip *chip, u32 interval) 951 + { 952 + int r; 953 + 954 + mutex_lock(&chip->mutex); 955 + r = set_beacon_interval(chip, interval); 956 + mutex_unlock(&chip->mutex); 957 + return r; 958 + } 959 + 960 + static int hw_init(struct zd_chip *chip) 961 + { 962 + int r; 963 + 964 + dev_dbg_f(zd_chip_dev(chip), "\n"); 965 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 966 + r = hw_reset_phy(chip); 967 + if (r) 968 + return r; 969 + 970 + r = hw_init_hmac(chip); 971 + if (r) 972 + return r; 973 + r = set_beacon_interval(chip, 100); 974 + if (r) 975 + return r; 976 + return 0; 977 + } 978 + 979 + #ifdef DEBUG 980 + static int dump_cr(struct zd_chip *chip, const zd_addr_t addr, 981 + const char *addr_string) 982 + { 983 + int r; 984 + u32 value; 985 + 986 + r = zd_ioread32_locked(chip, &value, addr); 987 + if (r) { 988 + dev_dbg_f(zd_chip_dev(chip), 989 + "error reading %s. Error number %d\n", addr_string, r); 990 + return r; 991 + } 992 + 993 + dev_dbg_f(zd_chip_dev(chip), "%s %#010x\n", 994 + addr_string, (unsigned int)value); 995 + return 0; 996 + } 997 + 998 + static int test_init(struct zd_chip *chip) 999 + { 1000 + int r; 1001 + 1002 + r = dump_cr(chip, CR_AFTER_PNP, "CR_AFTER_PNP"); 1003 + if (r) 1004 + return r; 1005 + r = dump_cr(chip, CR_GPI_EN, "CR_GPI_EN"); 1006 + if (r) 1007 + return r; 1008 + return dump_cr(chip, CR_INTERRUPT, "CR_INTERRUPT"); 1009 + } 1010 + 1011 + static void dump_fw_registers(struct zd_chip *chip) 1012 + { 1013 + static const zd_addr_t addr[4] = { 1014 + FW_FIRMWARE_VER, FW_USB_SPEED, FW_FIX_TX_RATE, 1015 + FW_LINK_STATUS 1016 + }; 1017 + 1018 + int r; 1019 + u16 values[4]; 1020 + 1021 + r = zd_ioread16v_locked(chip, values, (const zd_addr_t*)addr, 1022 + ARRAY_SIZE(addr)); 1023 + if (r) { 1024 + dev_dbg_f(zd_chip_dev(chip), "error %d zd_ioread16v_locked\n", 1025 + r); 1026 + return; 1027 + } 1028 + 1029 + dev_dbg_f(zd_chip_dev(chip), "FW_FIRMWARE_VER %#06hx\n", values[0]); 1030 + dev_dbg_f(zd_chip_dev(chip), "FW_USB_SPEED %#06hx\n", values[1]); 1031 + dev_dbg_f(zd_chip_dev(chip), "FW_FIX_TX_RATE %#06hx\n", values[2]); 1032 + dev_dbg_f(zd_chip_dev(chip), "FW_LINK_STATUS %#06hx\n", values[3]); 1033 + } 1034 + #endif /* DEBUG */ 1035 + 1036 + static int print_fw_version(struct zd_chip *chip) 1037 + { 1038 + int r; 1039 + u16 version; 1040 + 1041 + r = zd_ioread16_locked(chip, &version, FW_FIRMWARE_VER); 1042 + if (r) 1043 + return r; 1044 + 1045 + dev_info(zd_chip_dev(chip),"firmware version %04hx\n", version); 1046 + return 0; 1047 + } 1048 + 1049 + static int set_mandatory_rates(struct zd_chip *chip, enum ieee80211_std std) 1050 + { 1051 + u32 rates; 1052 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 1053 + /* This sets the mandatory rates, which only depend from the standard 1054 + * that the device is supporting. Until further notice we should try 1055 + * to support 802.11g also for full speed USB. 1056 + */ 1057 + switch (std) { 1058 + case IEEE80211B: 1059 + rates = CR_RATE_1M|CR_RATE_2M|CR_RATE_5_5M|CR_RATE_11M; 1060 + break; 1061 + case IEEE80211G: 1062 + rates = CR_RATE_1M|CR_RATE_2M|CR_RATE_5_5M|CR_RATE_11M| 1063 + CR_RATE_6M|CR_RATE_12M|CR_RATE_24M; 1064 + break; 1065 + default: 1066 + return -EINVAL; 1067 + } 1068 + return zd_iowrite32_locked(chip, rates, CR_MANDATORY_RATE_TBL); 1069 + } 1070 + 1071 + int zd_chip_enable_hwint(struct zd_chip *chip) 1072 + { 1073 + int r; 1074 + 1075 + mutex_lock(&chip->mutex); 1076 + r = zd_iowrite32_locked(chip, HWINT_ENABLED, CR_INTERRUPT); 1077 + mutex_unlock(&chip->mutex); 1078 + return r; 1079 + } 1080 + 1081 + static int disable_hwint(struct zd_chip *chip) 1082 + { 1083 + return zd_iowrite32_locked(chip, HWINT_DISABLED, CR_INTERRUPT); 1084 + } 1085 + 1086 + int zd_chip_disable_hwint(struct zd_chip *chip) 1087 + { 1088 + int r; 1089 + 1090 + mutex_lock(&chip->mutex); 1091 + r = disable_hwint(chip); 1092 + mutex_unlock(&chip->mutex); 1093 + return r; 1094 + } 1095 + 1096 + int zd_chip_init_hw(struct zd_chip *chip, u8 device_type) 1097 + { 1098 + int r; 1099 + u8 rf_type; 1100 + 1101 + dev_dbg_f(zd_chip_dev(chip), "\n"); 1102 + 1103 + mutex_lock(&chip->mutex); 1104 + chip->is_zd1211b = (device_type == DEVICE_ZD1211B) != 0; 1105 + 1106 + #ifdef DEBUG 1107 + r = test_init(chip); 1108 + if (r) 1109 + goto out; 1110 + #endif 1111 + r = zd_iowrite32_locked(chip, 1, CR_AFTER_PNP); 1112 + if (r) 1113 + goto out; 1114 + 1115 + r = zd_usb_init_hw(&chip->usb); 1116 + if (r) 1117 + goto out; 1118 + 1119 + /* GPI is always disabled, also in the other driver. 1120 + */ 1121 + r = zd_iowrite32_locked(chip, 0, CR_GPI_EN); 1122 + if (r) 1123 + goto out; 1124 + r = zd_iowrite32_locked(chip, CWIN_SIZE, CR_CWMIN_CWMAX); 1125 + if (r) 1126 + goto out; 1127 + /* Currently we support IEEE 802.11g for full and high speed USB. 1128 + * It might be discussed, whether we should suppport pure b mode for 1129 + * full speed USB. 1130 + */ 1131 + r = set_mandatory_rates(chip, IEEE80211G); 1132 + if (r) 1133 + goto out; 1134 + /* Disabling interrupts is certainly a smart thing here. 1135 + */ 1136 + r = disable_hwint(chip); 1137 + if (r) 1138 + goto out; 1139 + r = read_pod(chip, &rf_type); 1140 + if (r) 1141 + goto out; 1142 + r = hw_init(chip); 1143 + if (r) 1144 + goto out; 1145 + r = zd_rf_init_hw(&chip->rf, rf_type); 1146 + if (r) 1147 + goto out; 1148 + 1149 + r = print_fw_version(chip); 1150 + if (r) 1151 + goto out; 1152 + 1153 + #ifdef DEBUG 1154 + dump_fw_registers(chip); 1155 + r = test_init(chip); 1156 + if (r) 1157 + goto out; 1158 + #endif /* DEBUG */ 1159 + 1160 + r = read_e2p_mac_addr(chip); 1161 + if (r) 1162 + goto out; 1163 + 1164 + r = read_cal_int_tables(chip); 1165 + if (r) 1166 + goto out; 1167 + 1168 + print_id(chip); 1169 + out: 1170 + mutex_unlock(&chip->mutex); 1171 + return r; 1172 + } 1173 + 1174 + static int update_pwr_int(struct zd_chip *chip, u8 channel) 1175 + { 1176 + u8 value = chip->pwr_int_values[channel - 1]; 1177 + dev_dbg_f(zd_chip_dev(chip), "channel %d pwr_int %#04x\n", 1178 + channel, value); 1179 + return zd_iowrite32_locked(chip, value, CR31); 1180 + } 1181 + 1182 + static int update_pwr_cal(struct zd_chip *chip, u8 channel) 1183 + { 1184 + u8 value = chip->pwr_cal_values[channel-1]; 1185 + dev_dbg_f(zd_chip_dev(chip), "channel %d pwr_cal %#04x\n", 1186 + channel, value); 1187 + return zd_iowrite32_locked(chip, value, CR68); 1188 + } 1189 + 1190 + static int update_ofdm_cal(struct zd_chip *chip, u8 channel) 1191 + { 1192 + struct zd_ioreq32 ioreqs[3]; 1193 + 1194 + ioreqs[0].addr = CR67; 1195 + ioreqs[0].value = chip->ofdm_cal_values[OFDM_36M_INDEX][channel-1]; 1196 + ioreqs[1].addr = CR66; 1197 + ioreqs[1].value = chip->ofdm_cal_values[OFDM_48M_INDEX][channel-1]; 1198 + ioreqs[2].addr = CR65; 1199 + ioreqs[2].value = chip->ofdm_cal_values[OFDM_54M_INDEX][channel-1]; 1200 + 1201 + dev_dbg_f(zd_chip_dev(chip), 1202 + "channel %d ofdm_cal 36M %#04x 48M %#04x 54M %#04x\n", 1203 + channel, ioreqs[0].value, ioreqs[1].value, ioreqs[2].value); 1204 + return zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 1205 + } 1206 + 1207 + static int update_channel_integration_and_calibration(struct zd_chip *chip, 1208 + u8 channel) 1209 + { 1210 + int r; 1211 + 1212 + r = update_pwr_int(chip, channel); 1213 + if (r) 1214 + return r; 1215 + if (chip->is_zd1211b) { 1216 + static const struct zd_ioreq32 ioreqs[] = { 1217 + { CR69, 0x28 }, 1218 + {}, 1219 + { CR69, 0x2a }, 1220 + }; 1221 + 1222 + r = update_ofdm_cal(chip, channel); 1223 + if (r) 1224 + return r; 1225 + r = update_pwr_cal(chip, channel); 1226 + if (r) 1227 + return r; 1228 + r = zd_iowrite32a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 1229 + if (r) 1230 + return r; 1231 + } 1232 + 1233 + return 0; 1234 + } 1235 + 1236 + /* The CCK baseband gain can be optionally patched by the EEPROM */ 1237 + static int patch_cck_gain(struct zd_chip *chip) 1238 + { 1239 + int r; 1240 + u32 value; 1241 + 1242 + if (!chip->patch_cck_gain) 1243 + return 0; 1244 + 1245 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 1246 + r = zd_ioread32_locked(chip, &value, E2P_PHY_REG); 1247 + if (r) 1248 + return r; 1249 + dev_dbg_f(zd_chip_dev(chip), "patching value %x\n", value & 0xff); 1250 + return zd_iowrite32_locked(chip, value & 0xff, CR47); 1251 + } 1252 + 1253 + int zd_chip_set_channel(struct zd_chip *chip, u8 channel) 1254 + { 1255 + int r, t; 1256 + 1257 + mutex_lock(&chip->mutex); 1258 + r = zd_chip_lock_phy_regs(chip); 1259 + if (r) 1260 + goto out; 1261 + r = zd_rf_set_channel(&chip->rf, channel); 1262 + if (r) 1263 + goto unlock; 1264 + r = update_channel_integration_and_calibration(chip, channel); 1265 + if (r) 1266 + goto unlock; 1267 + r = patch_cck_gain(chip); 1268 + if (r) 1269 + goto unlock; 1270 + r = patch_6m_band_edge(chip, channel); 1271 + if (r) 1272 + goto unlock; 1273 + r = zd_iowrite32_locked(chip, 0, CR_CONFIG_PHILIPS); 1274 + unlock: 1275 + t = zd_chip_unlock_phy_regs(chip); 1276 + if (t && !r) 1277 + r = t; 1278 + out: 1279 + mutex_unlock(&chip->mutex); 1280 + return r; 1281 + } 1282 + 1283 + u8 zd_chip_get_channel(struct zd_chip *chip) 1284 + { 1285 + u8 channel; 1286 + 1287 + mutex_lock(&chip->mutex); 1288 + channel = chip->rf.channel; 1289 + mutex_unlock(&chip->mutex); 1290 + return channel; 1291 + } 1292 + 1293 + static u16 led_mask(int led) 1294 + { 1295 + switch (led) { 1296 + case 1: 1297 + return LED1; 1298 + case 2: 1299 + return LED2; 1300 + default: 1301 + return 0; 1302 + } 1303 + } 1304 + 1305 + static int read_led_reg(struct zd_chip *chip, u16 *status) 1306 + { 1307 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 1308 + return zd_ioread16_locked(chip, status, CR_LED); 1309 + } 1310 + 1311 + static int write_led_reg(struct zd_chip *chip, u16 status) 1312 + { 1313 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 1314 + return zd_iowrite16_locked(chip, status, CR_LED); 1315 + } 1316 + 1317 + int zd_chip_led_status(struct zd_chip *chip, int led, enum led_status status) 1318 + { 1319 + int r, ret; 1320 + u16 mask = led_mask(led); 1321 + u16 reg; 1322 + 1323 + if (!mask) 1324 + return -EINVAL; 1325 + mutex_lock(&chip->mutex); 1326 + r = read_led_reg(chip, &reg); 1327 + if (r) 1328 + return r; 1329 + switch (status) { 1330 + case LED_STATUS: 1331 + return (reg & mask) ? LED_ON : LED_OFF; 1332 + case LED_OFF: 1333 + reg &= ~mask; 1334 + ret = LED_OFF; 1335 + break; 1336 + case LED_FLIP: 1337 + reg ^= mask; 1338 + ret = (reg&mask) ? LED_ON : LED_OFF; 1339 + break; 1340 + case LED_ON: 1341 + reg |= mask; 1342 + ret = LED_ON; 1343 + break; 1344 + default: 1345 + return -EINVAL; 1346 + } 1347 + r = write_led_reg(chip, reg); 1348 + if (r) { 1349 + ret = r; 1350 + goto out; 1351 + } 1352 + out: 1353 + mutex_unlock(&chip->mutex); 1354 + return r; 1355 + } 1356 + 1357 + int zd_chip_led_flip(struct zd_chip *chip, int led, 1358 + const unsigned int *phases_msecs, unsigned int count) 1359 + { 1360 + int i, r; 1361 + enum led_status status; 1362 + 1363 + r = zd_chip_led_status(chip, led, LED_STATUS); 1364 + if (r) 1365 + return r; 1366 + status = r; 1367 + for (i = 0; i < count; i++) { 1368 + r = zd_chip_led_status(chip, led, LED_FLIP); 1369 + if (r < 0) 1370 + goto out; 1371 + msleep(phases_msecs[i]); 1372 + } 1373 + 1374 + out: 1375 + zd_chip_led_status(chip, led, status); 1376 + return r; 1377 + } 1378 + 1379 + int zd_chip_set_basic_rates(struct zd_chip *chip, u16 cr_rates) 1380 + { 1381 + int r; 1382 + 1383 + if (cr_rates & ~(CR_RATES_80211B|CR_RATES_80211G)) 1384 + return -EINVAL; 1385 + 1386 + mutex_lock(&chip->mutex); 1387 + r = zd_iowrite32_locked(chip, cr_rates, CR_BASIC_RATE_TBL); 1388 + mutex_unlock(&chip->mutex); 1389 + return r; 1390 + } 1391 + 1392 + static int ofdm_qual_db(u8 status_quality, u8 rate, unsigned int size) 1393 + { 1394 + static const u16 constants[] = { 1395 + 715, 655, 585, 540, 470, 410, 360, 315, 1396 + 270, 235, 205, 175, 150, 125, 105, 85, 1397 + 65, 50, 40, 25, 15 1398 + }; 1399 + 1400 + int i; 1401 + u32 x; 1402 + 1403 + /* It seems that their quality parameter is somehow per signal 1404 + * and is now transferred per bit. 1405 + */ 1406 + switch (rate) { 1407 + case ZD_OFDM_RATE_6M: 1408 + case ZD_OFDM_RATE_12M: 1409 + case ZD_OFDM_RATE_24M: 1410 + size *= 2; 1411 + break; 1412 + case ZD_OFDM_RATE_9M: 1413 + case ZD_OFDM_RATE_18M: 1414 + case ZD_OFDM_RATE_36M: 1415 + case ZD_OFDM_RATE_54M: 1416 + size *= 4; 1417 + size /= 3; 1418 + break; 1419 + case ZD_OFDM_RATE_48M: 1420 + size *= 3; 1421 + size /= 2; 1422 + break; 1423 + default: 1424 + return -EINVAL; 1425 + } 1426 + 1427 + x = (10000 * status_quality)/size; 1428 + for (i = 0; i < ARRAY_SIZE(constants); i++) { 1429 + if (x > constants[i]) 1430 + break; 1431 + } 1432 + 1433 + return i; 1434 + } 1435 + 1436 + static unsigned int log10times100(unsigned int x) 1437 + { 1438 + static const u8 log10[] = { 1439 + 0, 1440 + 0, 30, 47, 60, 69, 77, 84, 90, 95, 100, 1441 + 104, 107, 111, 114, 117, 120, 123, 125, 127, 130, 1442 + 132, 134, 136, 138, 139, 141, 143, 144, 146, 147, 1443 + 149, 150, 151, 153, 154, 155, 156, 157, 159, 160, 1444 + 161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 1445 + 170, 171, 172, 173, 174, 174, 175, 176, 177, 177, 1446 + 178, 179, 179, 180, 181, 181, 182, 183, 183, 184, 1447 + 185, 185, 186, 186, 187, 188, 188, 189, 189, 190, 1448 + 190, 191, 191, 192, 192, 193, 193, 194, 194, 195, 1449 + 195, 196, 196, 197, 197, 198, 198, 199, 199, 200, 1450 + 200, 200, 201, 201, 202, 202, 202, 203, 203, 204, 1451 + 204, 204, 205, 205, 206, 206, 206, 207, 207, 207, 1452 + 208, 208, 208, 209, 209, 210, 210, 210, 211, 211, 1453 + 211, 212, 212, 212, 213, 213, 213, 213, 214, 214, 1454 + 214, 215, 215, 215, 216, 216, 216, 217, 217, 217, 1455 + 217, 218, 218, 218, 219, 219, 219, 219, 220, 220, 1456 + 220, 220, 221, 221, 221, 222, 222, 222, 222, 223, 1457 + 223, 223, 223, 224, 224, 224, 224, 1458 + }; 1459 + 1460 + return x < ARRAY_SIZE(log10) ? log10[x] : 225; 1461 + } 1462 + 1463 + enum { 1464 + MAX_CCK_EVM_DB = 45, 1465 + }; 1466 + 1467 + static int cck_evm_db(u8 status_quality) 1468 + { 1469 + return (20 * log10times100(status_quality)) / 100; 1470 + } 1471 + 1472 + static int cck_snr_db(u8 status_quality) 1473 + { 1474 + int r = MAX_CCK_EVM_DB - cck_evm_db(status_quality); 1475 + ZD_ASSERT(r >= 0); 1476 + return r; 1477 + } 1478 + 1479 + static int rx_qual_db(const void *rx_frame, unsigned int size, 1480 + const struct rx_status *status) 1481 + { 1482 + return (status->frame_status&ZD_RX_OFDM) ? 1483 + ofdm_qual_db(status->signal_quality_ofdm, 1484 + zd_ofdm_plcp_header_rate(rx_frame), 1485 + size) : 1486 + cck_snr_db(status->signal_quality_cck); 1487 + } 1488 + 1489 + u8 zd_rx_qual_percent(const void *rx_frame, unsigned int size, 1490 + const struct rx_status *status) 1491 + { 1492 + int r = rx_qual_db(rx_frame, size, status); 1493 + if (r < 0) 1494 + r = 0; 1495 + r = (r * 100) / 14; 1496 + if (r > 100) 1497 + r = 100; 1498 + return r; 1499 + } 1500 + 1501 + u8 zd_rx_strength_percent(u8 rssi) 1502 + { 1503 + int r = (rssi*100) / 30; 1504 + if (r > 100) 1505 + r = 100; 1506 + return (u8) r; 1507 + } 1508 + 1509 + u16 zd_rx_rate(const void *rx_frame, const struct rx_status *status) 1510 + { 1511 + static const u16 ofdm_rates[] = { 1512 + [ZD_OFDM_RATE_6M] = 60, 1513 + [ZD_OFDM_RATE_9M] = 90, 1514 + [ZD_OFDM_RATE_12M] = 120, 1515 + [ZD_OFDM_RATE_18M] = 180, 1516 + [ZD_OFDM_RATE_24M] = 240, 1517 + [ZD_OFDM_RATE_36M] = 360, 1518 + [ZD_OFDM_RATE_48M] = 480, 1519 + [ZD_OFDM_RATE_54M] = 540, 1520 + }; 1521 + u16 rate; 1522 + if (status->frame_status & ZD_RX_OFDM) { 1523 + u8 ofdm_rate = zd_ofdm_plcp_header_rate(rx_frame); 1524 + rate = ofdm_rates[ofdm_rate & 0xf]; 1525 + } else { 1526 + u8 cck_rate = zd_cck_plcp_header_rate(rx_frame); 1527 + switch (cck_rate) { 1528 + case ZD_CCK_SIGNAL_1M: 1529 + rate = 10; 1530 + break; 1531 + case ZD_CCK_SIGNAL_2M: 1532 + rate = 20; 1533 + break; 1534 + case ZD_CCK_SIGNAL_5M5: 1535 + rate = 55; 1536 + break; 1537 + case ZD_CCK_SIGNAL_11M: 1538 + rate = 110; 1539 + break; 1540 + default: 1541 + rate = 0; 1542 + } 1543 + } 1544 + 1545 + return rate; 1546 + } 1547 + 1548 + int zd_chip_switch_radio_on(struct zd_chip *chip) 1549 + { 1550 + int r; 1551 + 1552 + mutex_lock(&chip->mutex); 1553 + r = zd_switch_radio_on(&chip->rf); 1554 + mutex_unlock(&chip->mutex); 1555 + return r; 1556 + } 1557 + 1558 + int zd_chip_switch_radio_off(struct zd_chip *chip) 1559 + { 1560 + int r; 1561 + 1562 + mutex_lock(&chip->mutex); 1563 + r = zd_switch_radio_off(&chip->rf); 1564 + mutex_unlock(&chip->mutex); 1565 + return r; 1566 + } 1567 + 1568 + int zd_chip_enable_int(struct zd_chip *chip) 1569 + { 1570 + int r; 1571 + 1572 + mutex_lock(&chip->mutex); 1573 + r = zd_usb_enable_int(&chip->usb); 1574 + mutex_unlock(&chip->mutex); 1575 + return r; 1576 + } 1577 + 1578 + void zd_chip_disable_int(struct zd_chip *chip) 1579 + { 1580 + mutex_lock(&chip->mutex); 1581 + zd_usb_disable_int(&chip->usb); 1582 + mutex_unlock(&chip->mutex); 1583 + } 1584 + 1585 + int zd_chip_enable_rx(struct zd_chip *chip) 1586 + { 1587 + int r; 1588 + 1589 + mutex_lock(&chip->mutex); 1590 + r = zd_usb_enable_rx(&chip->usb); 1591 + mutex_unlock(&chip->mutex); 1592 + return r; 1593 + } 1594 + 1595 + void zd_chip_disable_rx(struct zd_chip *chip) 1596 + { 1597 + mutex_lock(&chip->mutex); 1598 + zd_usb_disable_rx(&chip->usb); 1599 + mutex_unlock(&chip->mutex); 1600 + } 1601 + 1602 + int zd_rfwritev_locked(struct zd_chip *chip, 1603 + const u32* values, unsigned int count, u8 bits) 1604 + { 1605 + int r; 1606 + unsigned int i; 1607 + 1608 + for (i = 0; i < count; i++) { 1609 + r = zd_rfwrite_locked(chip, values[i], bits); 1610 + if (r) 1611 + return r; 1612 + } 1613 + 1614 + return 0; 1615 + }
+825
drivers/net/wireless/zd1211rw/zd_chip.h
···
··· 1 + /* zd_chip.h 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_CHIP_H 19 + #define _ZD_CHIP_H 20 + 21 + #include "zd_types.h" 22 + #include "zd_rf.h" 23 + #include "zd_usb.h" 24 + 25 + /* Header for the Media Access Controller (MAC) and the Baseband Processor 26 + * (BBP). It appears that the ZD1211 wraps the old ZD1205 with USB glue and 27 + * adds a processor for handling the USB protocol. 28 + */ 29 + 30 + /* 8-bit hardware registers */ 31 + #define CR0 CTL_REG(0x0000) 32 + #define CR1 CTL_REG(0x0004) 33 + #define CR2 CTL_REG(0x0008) 34 + #define CR3 CTL_REG(0x000C) 35 + 36 + #define CR5 CTL_REG(0x0010) 37 + /* bit 5: if set short preamble used 38 + * bit 6: filter band - Japan channel 14 on, else off 39 + */ 40 + #define CR6 CTL_REG(0x0014) 41 + #define CR7 CTL_REG(0x0018) 42 + #define CR8 CTL_REG(0x001C) 43 + 44 + #define CR4 CTL_REG(0x0020) 45 + 46 + #define CR9 CTL_REG(0x0024) 47 + /* bit 2: antenna switch (together with CR10) */ 48 + #define CR10 CTL_REG(0x0028) 49 + /* bit 1: antenna switch (together with CR9) 50 + * RF2959 controls with CR11 radion on and off 51 + */ 52 + #define CR11 CTL_REG(0x002C) 53 + /* bit 6: TX power control for OFDM 54 + * RF2959 controls with CR10 radio on and off 55 + */ 56 + #define CR12 CTL_REG(0x0030) 57 + #define CR13 CTL_REG(0x0034) 58 + #define CR14 CTL_REG(0x0038) 59 + #define CR15 CTL_REG(0x003C) 60 + #define CR16 CTL_REG(0x0040) 61 + #define CR17 CTL_REG(0x0044) 62 + #define CR18 CTL_REG(0x0048) 63 + #define CR19 CTL_REG(0x004C) 64 + #define CR20 CTL_REG(0x0050) 65 + #define CR21 CTL_REG(0x0054) 66 + #define CR22 CTL_REG(0x0058) 67 + #define CR23 CTL_REG(0x005C) 68 + #define CR24 CTL_REG(0x0060) /* CCA threshold */ 69 + #define CR25 CTL_REG(0x0064) 70 + #define CR26 CTL_REG(0x0068) 71 + #define CR27 CTL_REG(0x006C) 72 + #define CR28 CTL_REG(0x0070) 73 + #define CR29 CTL_REG(0x0074) 74 + #define CR30 CTL_REG(0x0078) 75 + #define CR31 CTL_REG(0x007C) /* TX power control for RF in CCK mode */ 76 + #define CR32 CTL_REG(0x0080) 77 + #define CR33 CTL_REG(0x0084) 78 + #define CR34 CTL_REG(0x0088) 79 + #define CR35 CTL_REG(0x008C) 80 + #define CR36 CTL_REG(0x0090) 81 + #define CR37 CTL_REG(0x0094) 82 + #define CR38 CTL_REG(0x0098) 83 + #define CR39 CTL_REG(0x009C) 84 + #define CR40 CTL_REG(0x00A0) 85 + #define CR41 CTL_REG(0x00A4) 86 + #define CR42 CTL_REG(0x00A8) 87 + #define CR43 CTL_REG(0x00AC) 88 + #define CR44 CTL_REG(0x00B0) 89 + #define CR45 CTL_REG(0x00B4) 90 + #define CR46 CTL_REG(0x00B8) 91 + #define CR47 CTL_REG(0x00BC) /* CCK baseband gain 92 + * (patch value might be in EEPROM) 93 + */ 94 + #define CR48 CTL_REG(0x00C0) 95 + #define CR49 CTL_REG(0x00C4) 96 + #define CR50 CTL_REG(0x00C8) 97 + #define CR51 CTL_REG(0x00CC) /* TX power control for RF in 6-36M modes */ 98 + #define CR52 CTL_REG(0x00D0) /* TX power control for RF in 48M mode */ 99 + #define CR53 CTL_REG(0x00D4) /* TX power control for RF in 54M mode */ 100 + #define CR54 CTL_REG(0x00D8) 101 + #define CR55 CTL_REG(0x00DC) 102 + #define CR56 CTL_REG(0x00E0) 103 + #define CR57 CTL_REG(0x00E4) 104 + #define CR58 CTL_REG(0x00E8) 105 + #define CR59 CTL_REG(0x00EC) 106 + #define CR60 CTL_REG(0x00F0) 107 + #define CR61 CTL_REG(0x00F4) 108 + #define CR62 CTL_REG(0x00F8) 109 + #define CR63 CTL_REG(0x00FC) 110 + #define CR64 CTL_REG(0x0100) 111 + #define CR65 CTL_REG(0x0104) /* OFDM 54M calibration */ 112 + #define CR66 CTL_REG(0x0108) /* OFDM 48M calibration */ 113 + #define CR67 CTL_REG(0x010C) /* OFDM 36M calibration */ 114 + #define CR68 CTL_REG(0x0110) /* CCK calibration */ 115 + #define CR69 CTL_REG(0x0114) 116 + #define CR70 CTL_REG(0x0118) 117 + #define CR71 CTL_REG(0x011C) 118 + #define CR72 CTL_REG(0x0120) 119 + #define CR73 CTL_REG(0x0124) 120 + #define CR74 CTL_REG(0x0128) 121 + #define CR75 CTL_REG(0x012C) 122 + #define CR76 CTL_REG(0x0130) 123 + #define CR77 CTL_REG(0x0134) 124 + #define CR78 CTL_REG(0x0138) 125 + #define CR79 CTL_REG(0x013C) 126 + #define CR80 CTL_REG(0x0140) 127 + #define CR81 CTL_REG(0x0144) 128 + #define CR82 CTL_REG(0x0148) 129 + #define CR83 CTL_REG(0x014C) 130 + #define CR84 CTL_REG(0x0150) 131 + #define CR85 CTL_REG(0x0154) 132 + #define CR86 CTL_REG(0x0158) 133 + #define CR87 CTL_REG(0x015C) 134 + #define CR88 CTL_REG(0x0160) 135 + #define CR89 CTL_REG(0x0164) 136 + #define CR90 CTL_REG(0x0168) 137 + #define CR91 CTL_REG(0x016C) 138 + #define CR92 CTL_REG(0x0170) 139 + #define CR93 CTL_REG(0x0174) 140 + #define CR94 CTL_REG(0x0178) 141 + #define CR95 CTL_REG(0x017C) 142 + #define CR96 CTL_REG(0x0180) 143 + #define CR97 CTL_REG(0x0184) 144 + #define CR98 CTL_REG(0x0188) 145 + #define CR99 CTL_REG(0x018C) 146 + #define CR100 CTL_REG(0x0190) 147 + #define CR101 CTL_REG(0x0194) 148 + #define CR102 CTL_REG(0x0198) 149 + #define CR103 CTL_REG(0x019C) 150 + #define CR104 CTL_REG(0x01A0) 151 + #define CR105 CTL_REG(0x01A4) 152 + #define CR106 CTL_REG(0x01A8) 153 + #define CR107 CTL_REG(0x01AC) 154 + #define CR108 CTL_REG(0x01B0) 155 + #define CR109 CTL_REG(0x01B4) 156 + #define CR110 CTL_REG(0x01B8) 157 + #define CR111 CTL_REG(0x01BC) 158 + #define CR112 CTL_REG(0x01C0) 159 + #define CR113 CTL_REG(0x01C4) 160 + #define CR114 CTL_REG(0x01C8) 161 + #define CR115 CTL_REG(0x01CC) 162 + #define CR116 CTL_REG(0x01D0) 163 + #define CR117 CTL_REG(0x01D4) 164 + #define CR118 CTL_REG(0x01D8) 165 + #define CR119 CTL_REG(0x01DC) 166 + #define CR120 CTL_REG(0x01E0) 167 + #define CR121 CTL_REG(0x01E4) 168 + #define CR122 CTL_REG(0x01E8) 169 + #define CR123 CTL_REG(0x01EC) 170 + #define CR124 CTL_REG(0x01F0) 171 + #define CR125 CTL_REG(0x01F4) 172 + #define CR126 CTL_REG(0x01F8) 173 + #define CR127 CTL_REG(0x01FC) 174 + #define CR128 CTL_REG(0x0200) 175 + #define CR129 CTL_REG(0x0204) 176 + #define CR130 CTL_REG(0x0208) 177 + #define CR131 CTL_REG(0x020C) 178 + #define CR132 CTL_REG(0x0210) 179 + #define CR133 CTL_REG(0x0214) 180 + #define CR134 CTL_REG(0x0218) 181 + #define CR135 CTL_REG(0x021C) 182 + #define CR136 CTL_REG(0x0220) 183 + #define CR137 CTL_REG(0x0224) 184 + #define CR138 CTL_REG(0x0228) 185 + #define CR139 CTL_REG(0x022C) 186 + #define CR140 CTL_REG(0x0230) 187 + #define CR141 CTL_REG(0x0234) 188 + #define CR142 CTL_REG(0x0238) 189 + #define CR143 CTL_REG(0x023C) 190 + #define CR144 CTL_REG(0x0240) 191 + #define CR145 CTL_REG(0x0244) 192 + #define CR146 CTL_REG(0x0248) 193 + #define CR147 CTL_REG(0x024C) 194 + #define CR148 CTL_REG(0x0250) 195 + #define CR149 CTL_REG(0x0254) 196 + #define CR150 CTL_REG(0x0258) 197 + #define CR151 CTL_REG(0x025C) 198 + #define CR152 CTL_REG(0x0260) 199 + #define CR153 CTL_REG(0x0264) 200 + #define CR154 CTL_REG(0x0268) 201 + #define CR155 CTL_REG(0x026C) 202 + #define CR156 CTL_REG(0x0270) 203 + #define CR157 CTL_REG(0x0274) 204 + #define CR158 CTL_REG(0x0278) 205 + #define CR159 CTL_REG(0x027C) 206 + #define CR160 CTL_REG(0x0280) 207 + #define CR161 CTL_REG(0x0284) 208 + #define CR162 CTL_REG(0x0288) 209 + #define CR163 CTL_REG(0x028C) 210 + #define CR164 CTL_REG(0x0290) 211 + #define CR165 CTL_REG(0x0294) 212 + #define CR166 CTL_REG(0x0298) 213 + #define CR167 CTL_REG(0x029C) 214 + #define CR168 CTL_REG(0x02A0) 215 + #define CR169 CTL_REG(0x02A4) 216 + #define CR170 CTL_REG(0x02A8) 217 + #define CR171 CTL_REG(0x02AC) 218 + #define CR172 CTL_REG(0x02B0) 219 + #define CR173 CTL_REG(0x02B4) 220 + #define CR174 CTL_REG(0x02B8) 221 + #define CR175 CTL_REG(0x02BC) 222 + #define CR176 CTL_REG(0x02C0) 223 + #define CR177 CTL_REG(0x02C4) 224 + #define CR178 CTL_REG(0x02C8) 225 + #define CR179 CTL_REG(0x02CC) 226 + #define CR180 CTL_REG(0x02D0) 227 + #define CR181 CTL_REG(0x02D4) 228 + #define CR182 CTL_REG(0x02D8) 229 + #define CR183 CTL_REG(0x02DC) 230 + #define CR184 CTL_REG(0x02E0) 231 + #define CR185 CTL_REG(0x02E4) 232 + #define CR186 CTL_REG(0x02E8) 233 + #define CR187 CTL_REG(0x02EC) 234 + #define CR188 CTL_REG(0x02F0) 235 + #define CR189 CTL_REG(0x02F4) 236 + #define CR190 CTL_REG(0x02F8) 237 + #define CR191 CTL_REG(0x02FC) 238 + #define CR192 CTL_REG(0x0300) 239 + #define CR193 CTL_REG(0x0304) 240 + #define CR194 CTL_REG(0x0308) 241 + #define CR195 CTL_REG(0x030C) 242 + #define CR196 CTL_REG(0x0310) 243 + #define CR197 CTL_REG(0x0314) 244 + #define CR198 CTL_REG(0x0318) 245 + #define CR199 CTL_REG(0x031C) 246 + #define CR200 CTL_REG(0x0320) 247 + #define CR201 CTL_REG(0x0324) 248 + #define CR202 CTL_REG(0x0328) 249 + #define CR203 CTL_REG(0x032C) /* I2C bus template value & flash control */ 250 + #define CR204 CTL_REG(0x0330) 251 + #define CR205 CTL_REG(0x0334) 252 + #define CR206 CTL_REG(0x0338) 253 + #define CR207 CTL_REG(0x033C) 254 + #define CR208 CTL_REG(0x0340) 255 + #define CR209 CTL_REG(0x0344) 256 + #define CR210 CTL_REG(0x0348) 257 + #define CR211 CTL_REG(0x034C) 258 + #define CR212 CTL_REG(0x0350) 259 + #define CR213 CTL_REG(0x0354) 260 + #define CR214 CTL_REG(0x0358) 261 + #define CR215 CTL_REG(0x035C) 262 + #define CR216 CTL_REG(0x0360) 263 + #define CR217 CTL_REG(0x0364) 264 + #define CR218 CTL_REG(0x0368) 265 + #define CR219 CTL_REG(0x036C) 266 + #define CR220 CTL_REG(0x0370) 267 + #define CR221 CTL_REG(0x0374) 268 + #define CR222 CTL_REG(0x0378) 269 + #define CR223 CTL_REG(0x037C) 270 + #define CR224 CTL_REG(0x0380) 271 + #define CR225 CTL_REG(0x0384) 272 + #define CR226 CTL_REG(0x0388) 273 + #define CR227 CTL_REG(0x038C) 274 + #define CR228 CTL_REG(0x0390) 275 + #define CR229 CTL_REG(0x0394) 276 + #define CR230 CTL_REG(0x0398) 277 + #define CR231 CTL_REG(0x039C) 278 + #define CR232 CTL_REG(0x03A0) 279 + #define CR233 CTL_REG(0x03A4) 280 + #define CR234 CTL_REG(0x03A8) 281 + #define CR235 CTL_REG(0x03AC) 282 + #define CR236 CTL_REG(0x03B0) 283 + 284 + #define CR240 CTL_REG(0x03C0) 285 + /* bit 7: host-controlled RF register writes 286 + * CR241-CR245: for hardware controlled writing of RF bits, not needed for 287 + * USB 288 + */ 289 + #define CR241 CTL_REG(0x03C4) 290 + #define CR242 CTL_REG(0x03C8) 291 + #define CR243 CTL_REG(0x03CC) 292 + #define CR244 CTL_REG(0x03D0) 293 + #define CR245 CTL_REG(0x03D4) 294 + 295 + #define CR251 CTL_REG(0x03EC) /* only used for activation and deactivation of 296 + * Airoha RFs AL2230 and AL7230B 297 + */ 298 + #define CR252 CTL_REG(0x03F0) 299 + #define CR253 CTL_REG(0x03F4) 300 + #define CR254 CTL_REG(0x03F8) 301 + #define CR255 CTL_REG(0x03FC) 302 + 303 + #define CR_MAX_PHY_REG 255 304 + 305 + /* Taken from the ZYDAS driver, not all of them are relevant for the ZSD1211 306 + * driver. 307 + */ 308 + 309 + #define CR_RF_IF_CLK CTL_REG(0x0400) 310 + #define CR_RF_IF_DATA CTL_REG(0x0404) 311 + #define CR_PE1_PE2 CTL_REG(0x0408) 312 + #define CR_PE2_DLY CTL_REG(0x040C) 313 + #define CR_LE1 CTL_REG(0x0410) 314 + #define CR_LE2 CTL_REG(0x0414) 315 + /* Seems to enable/disable GPI (General Purpose IO?) */ 316 + #define CR_GPI_EN CTL_REG(0x0418) 317 + #define CR_RADIO_PD CTL_REG(0x042C) 318 + #define CR_RF2948_PD CTL_REG(0x042C) 319 + #define CR_ENABLE_PS_MANUAL_AGC CTL_REG(0x043C) 320 + #define CR_CONFIG_PHILIPS CTL_REG(0x0440) 321 + #define CR_SA2400_SER_AP CTL_REG(0x0444) 322 + #define CR_I2C_WRITE CTL_REG(0x0444) 323 + #define CR_SA2400_SER_RP CTL_REG(0x0448) 324 + #define CR_RADIO_PE CTL_REG(0x0458) 325 + #define CR_RST_BUS_MASTER CTL_REG(0x045C) 326 + #define CR_RFCFG CTL_REG(0x0464) 327 + #define CR_HSTSCHG CTL_REG(0x046C) 328 + #define CR_PHY_ON CTL_REG(0x0474) 329 + #define CR_RX_DELAY CTL_REG(0x0478) 330 + #define CR_RX_PE_DELAY CTL_REG(0x047C) 331 + #define CR_GPIO_1 CTL_REG(0x0490) 332 + #define CR_GPIO_2 CTL_REG(0x0494) 333 + #define CR_EncryBufMux CTL_REG(0x04A8) 334 + #define CR_PS_CTRL CTL_REG(0x0500) 335 + #define CR_ADDA_PWR_DWN CTL_REG(0x0504) 336 + #define CR_ADDA_MBIAS_WARMTIME CTL_REG(0x0508) 337 + #define CR_MAC_PS_STATE CTL_REG(0x050C) 338 + 339 + #define CR_INTERRUPT CTL_REG(0x0510) 340 + #define INT_TX_COMPLETE 0x00000001 341 + #define INT_RX_COMPLETE 0x00000002 342 + #define INT_RETRY_FAIL 0x00000004 343 + #define INT_WAKEUP 0x00000008 344 + #define INT_DTIM_NOTIFY 0x00000020 345 + #define INT_CFG_NEXT_BCN 0x00000040 346 + #define INT_BUS_ABORT 0x00000080 347 + #define INT_TX_FIFO_READY 0x00000100 348 + #define INT_UART 0x00000200 349 + #define INT_TX_COMPLETE_EN 0x00010000 350 + #define INT_RX_COMPLETE_EN 0x00020000 351 + #define INT_RETRY_FAIL_EN 0x00040000 352 + #define INT_WAKEUP_EN 0x00080000 353 + #define INT_DTIM_NOTIFY_EN 0x00200000 354 + #define INT_CFG_NEXT_BCN_EN 0x00400000 355 + #define INT_BUS_ABORT_EN 0x00800000 356 + #define INT_TX_FIFO_READY_EN 0x01000000 357 + #define INT_UART_EN 0x02000000 358 + 359 + #define CR_TSF_LOW_PART CTL_REG(0x0514) 360 + #define CR_TSF_HIGH_PART CTL_REG(0x0518) 361 + 362 + /* Following three values are in time units (1024us) 363 + * Following condition must be met: 364 + * atim < tbtt < bcn 365 + */ 366 + #define CR_ATIM_WND_PERIOD CTL_REG(0x051C) 367 + #define CR_BCN_INTERVAL CTL_REG(0x0520) 368 + #define CR_PRE_TBTT CTL_REG(0x0524) 369 + /* in units of TU(1024us) */ 370 + 371 + /* for UART support */ 372 + #define CR_UART_RBR_THR_DLL CTL_REG(0x0540) 373 + #define CR_UART_DLM_IER CTL_REG(0x0544) 374 + #define CR_UART_IIR_FCR CTL_REG(0x0548) 375 + #define CR_UART_LCR CTL_REG(0x054c) 376 + #define CR_UART_MCR CTL_REG(0x0550) 377 + #define CR_UART_LSR CTL_REG(0x0554) 378 + #define CR_UART_MSR CTL_REG(0x0558) 379 + #define CR_UART_ECR CTL_REG(0x055c) 380 + #define CR_UART_STATUS CTL_REG(0x0560) 381 + 382 + #define CR_PCI_TX_ADDR_P1 CTL_REG(0x0600) 383 + #define CR_PCI_TX_AddR_P2 CTL_REG(0x0604) 384 + #define CR_PCI_RX_AddR_P1 CTL_REG(0x0608) 385 + #define CR_PCI_RX_AddR_P2 CTL_REG(0x060C) 386 + 387 + /* must be overwritten if custom MAC address will be used */ 388 + #define CR_MAC_ADDR_P1 CTL_REG(0x0610) 389 + #define CR_MAC_ADDR_P2 CTL_REG(0x0614) 390 + #define CR_BSSID_P1 CTL_REG(0x0618) 391 + #define CR_BSSID_P2 CTL_REG(0x061C) 392 + #define CR_BCN_PLCP_CFG CTL_REG(0x0620) 393 + #define CR_GROUP_HASH_P1 CTL_REG(0x0624) 394 + #define CR_GROUP_HASH_P2 CTL_REG(0x0628) 395 + #define CR_RX_TIMEOUT CTL_REG(0x062C) 396 + 397 + /* Basic rates supported by the BSS. When producing ACK or CTS messages, the 398 + * device will use a rate in this table that is less than or equal to the rate 399 + * of the incoming frame which prompted the response */ 400 + #define CR_BASIC_RATE_TBL CTL_REG(0x0630) 401 + #define CR_RATE_1M 0x0001 /* 802.11b */ 402 + #define CR_RATE_2M 0x0002 /* 802.11b */ 403 + #define CR_RATE_5_5M 0x0004 /* 802.11b */ 404 + #define CR_RATE_11M 0x0008 /* 802.11b */ 405 + #define CR_RATE_6M 0x0100 /* 802.11g */ 406 + #define CR_RATE_9M 0x0200 /* 802.11g */ 407 + #define CR_RATE_12M 0x0400 /* 802.11g */ 408 + #define CR_RATE_18M 0x0800 /* 802.11g */ 409 + #define CR_RATE_24M 0x1000 /* 802.11g */ 410 + #define CR_RATE_36M 0x2000 /* 802.11g */ 411 + #define CR_RATE_48M 0x4000 /* 802.11g */ 412 + #define CR_RATE_54M 0x8000 /* 802.11g */ 413 + #define CR_RATES_80211G 0xff00 414 + #define CR_RATES_80211B 0x000f 415 + 416 + /* Mandatory rates required in the BSS. When producing ACK or CTS messages, if 417 + * the device could not find an appropriate rate in CR_BASIC_RATE_TBL, it will 418 + * look for a rate in this table that is less than or equal to the rate of 419 + * the incoming frame. */ 420 + #define CR_MANDATORY_RATE_TBL CTL_REG(0x0634) 421 + #define CR_RTS_CTS_RATE CTL_REG(0x0638) 422 + 423 + #define CR_WEP_PROTECT CTL_REG(0x063C) 424 + #define CR_RX_THRESHOLD CTL_REG(0x0640) 425 + 426 + /* register for controlling the LEDS */ 427 + #define CR_LED CTL_REG(0x0644) 428 + /* masks for controlling LEDs */ 429 + #define LED1 0x0100 430 + #define LED2 0x0200 431 + 432 + /* Seems to indicate that the configuration is over. 433 + */ 434 + #define CR_AFTER_PNP CTL_REG(0x0648) 435 + #define CR_ACK_TIME_80211 CTL_REG(0x0658) 436 + 437 + #define CR_RX_OFFSET CTL_REG(0x065c) 438 + 439 + #define CR_PHY_DELAY CTL_REG(0x066C) 440 + #define CR_BCN_FIFO CTL_REG(0x0670) 441 + #define CR_SNIFFER_ON CTL_REG(0x0674) 442 + 443 + #define CR_ENCRYPTION_TYPE CTL_REG(0x0678) 444 + #define NO_WEP 0 445 + #define WEP64 1 446 + #define WEP128 5 447 + #define WEP256 6 448 + #define ENC_SNIFFER 8 449 + 450 + #define CR_ZD1211_RETRY_MAX CTL_REG(0x067C) 451 + 452 + #define CR_REG1 CTL_REG(0x0680) 453 + /* Setting the bit UNLOCK_PHY_REGS disallows the write access to physical 454 + * registers, so one could argue it is a LOCK bit. But calling it 455 + * LOCK_PHY_REGS makes it confusing. 456 + */ 457 + #define UNLOCK_PHY_REGS 0x0080 458 + 459 + #define CR_DEVICE_STATE CTL_REG(0x0684) 460 + #define CR_UNDERRUN_CNT CTL_REG(0x0688) 461 + 462 + #define CR_RX_FILTER CTL_REG(0x068c) 463 + #define RX_FILTER_ASSOC_RESPONSE 0x0002 464 + #define RX_FILTER_PROBE_RESPONSE 0x0020 465 + #define RX_FILTER_BEACON 0x0100 466 + #define RX_FILTER_AUTH 0x0800 467 + /* Sniff modus sets filter to 0xfffff */ 468 + 469 + #define CR_ACK_TIMEOUT_EXT CTL_REG(0x0690) 470 + #define CR_BCN_FIFO_SEMAPHORE CTL_REG(0x0694) 471 + #define CR_IFS_VALUE CTL_REG(0x0698) 472 + #define CR_RX_TIME_OUT CTL_REG(0x069C) 473 + #define CR_TOTAL_RX_FRM CTL_REG(0x06A0) 474 + #define CR_CRC32_CNT CTL_REG(0x06A4) 475 + #define CR_CRC16_CNT CTL_REG(0x06A8) 476 + #define CR_DECRYPTION_ERR_UNI CTL_REG(0x06AC) 477 + #define CR_RX_FIFO_OVERRUN CTL_REG(0x06B0) 478 + 479 + #define CR_DECRYPTION_ERR_MUL CTL_REG(0x06BC) 480 + 481 + #define CR_NAV_CNT CTL_REG(0x06C4) 482 + #define CR_NAV_CCA CTL_REG(0x06C8) 483 + #define CR_RETRY_CNT CTL_REG(0x06CC) 484 + 485 + #define CR_READ_TCB_ADDR CTL_REG(0x06E8) 486 + #define CR_READ_RFD_ADDR CTL_REG(0x06EC) 487 + #define CR_CWMIN_CWMAX CTL_REG(0x06F0) 488 + #define CR_TOTAL_TX_FRM CTL_REG(0x06F4) 489 + 490 + /* CAM: Continuous Access Mode (power management) */ 491 + #define CR_CAM_MODE CTL_REG(0x0700) 492 + #define CR_CAM_ROLL_TB_LOW CTL_REG(0x0704) 493 + #define CR_CAM_ROLL_TB_HIGH CTL_REG(0x0708) 494 + #define CR_CAM_ADDRESS CTL_REG(0x070C) 495 + #define CR_CAM_DATA CTL_REG(0x0710) 496 + 497 + #define CR_ROMDIR CTL_REG(0x0714) 498 + 499 + #define CR_DECRY_ERR_FLG_LOW CTL_REG(0x0714) 500 + #define CR_DECRY_ERR_FLG_HIGH CTL_REG(0x0718) 501 + 502 + #define CR_WEPKEY0 CTL_REG(0x0720) 503 + #define CR_WEPKEY1 CTL_REG(0x0724) 504 + #define CR_WEPKEY2 CTL_REG(0x0728) 505 + #define CR_WEPKEY3 CTL_REG(0x072C) 506 + #define CR_WEPKEY4 CTL_REG(0x0730) 507 + #define CR_WEPKEY5 CTL_REG(0x0734) 508 + #define CR_WEPKEY6 CTL_REG(0x0738) 509 + #define CR_WEPKEY7 CTL_REG(0x073C) 510 + #define CR_WEPKEY8 CTL_REG(0x0740) 511 + #define CR_WEPKEY9 CTL_REG(0x0744) 512 + #define CR_WEPKEY10 CTL_REG(0x0748) 513 + #define CR_WEPKEY11 CTL_REG(0x074C) 514 + #define CR_WEPKEY12 CTL_REG(0x0750) 515 + #define CR_WEPKEY13 CTL_REG(0x0754) 516 + #define CR_WEPKEY14 CTL_REG(0x0758) 517 + #define CR_WEPKEY15 CTL_REG(0x075c) 518 + #define CR_TKIP_MODE CTL_REG(0x0760) 519 + 520 + #define CR_EEPROM_PROTECT0 CTL_REG(0x0758) 521 + #define CR_EEPROM_PROTECT1 CTL_REG(0x075C) 522 + 523 + #define CR_DBG_FIFO_RD CTL_REG(0x0800) 524 + #define CR_DBG_SELECT CTL_REG(0x0804) 525 + #define CR_FIFO_Length CTL_REG(0x0808) 526 + 527 + 528 + #define CR_RSSI_MGC CTL_REG(0x0810) 529 + 530 + #define CR_PON CTL_REG(0x0818) 531 + #define CR_RX_ON CTL_REG(0x081C) 532 + #define CR_TX_ON CTL_REG(0x0820) 533 + #define CR_CHIP_EN CTL_REG(0x0824) 534 + #define CR_LO_SW CTL_REG(0x0828) 535 + #define CR_TXRX_SW CTL_REG(0x082C) 536 + #define CR_S_MD CTL_REG(0x0830) 537 + 538 + #define CR_USB_DEBUG_PORT CTL_REG(0x0888) 539 + 540 + #define CR_ZD1211B_TX_PWR_CTL1 CTL_REG(0x0b00) 541 + #define CR_ZD1211B_TX_PWR_CTL2 CTL_REG(0x0b04) 542 + #define CR_ZD1211B_TX_PWR_CTL3 CTL_REG(0x0b08) 543 + #define CR_ZD1211B_TX_PWR_CTL4 CTL_REG(0x0b0c) 544 + #define CR_ZD1211B_AIFS_CTL1 CTL_REG(0x0b10) 545 + #define CR_ZD1211B_AIFS_CTL2 CTL_REG(0x0b14) 546 + #define CR_ZD1211B_TXOP CTL_REG(0x0b20) 547 + #define CR_ZD1211B_RETRY_MAX CTL_REG(0x0b28) 548 + 549 + #define AP_RX_FILTER 0x0400feff 550 + #define STA_RX_FILTER 0x0000ffff 551 + 552 + #define CWIN_SIZE 0x007f043f 553 + 554 + 555 + #define HWINT_ENABLED 0x004f0000 556 + #define HWINT_DISABLED 0 557 + 558 + #define E2P_PWR_INT_GUARD 8 559 + #define E2P_CHANNEL_COUNT 14 560 + 561 + /* If you compare this addresses with the ZYDAS orignal driver, please notify 562 + * that we use word mapping for the EEPROM. 563 + */ 564 + 565 + /* 566 + * Upper 16 bit contains the regulatory domain. 567 + */ 568 + #define E2P_SUBID E2P_REG(0x00) 569 + #define E2P_POD E2P_REG(0x02) 570 + #define E2P_MAC_ADDR_P1 E2P_REG(0x04) 571 + #define E2P_MAC_ADDR_P2 E2P_REG(0x06) 572 + #define E2P_PWR_CAL_VALUE1 E2P_REG(0x08) 573 + #define E2P_PWR_CAL_VALUE2 E2P_REG(0x0a) 574 + #define E2P_PWR_CAL_VALUE3 E2P_REG(0x0c) 575 + #define E2P_PWR_CAL_VALUE4 E2P_REG(0x0e) 576 + #define E2P_PWR_INT_VALUE1 E2P_REG(0x10) 577 + #define E2P_PWR_INT_VALUE2 E2P_REG(0x12) 578 + #define E2P_PWR_INT_VALUE3 E2P_REG(0x14) 579 + #define E2P_PWR_INT_VALUE4 E2P_REG(0x16) 580 + 581 + /* Contains a bit for each allowed channel. It gives for Europe (ETSI 0x30) 582 + * also only 11 channels. */ 583 + #define E2P_ALLOWED_CHANNEL E2P_REG(0x18) 584 + 585 + #define E2P_PHY_REG E2P_REG(0x1a) 586 + #define E2P_DEVICE_VER E2P_REG(0x20) 587 + #define E2P_36M_CAL_VALUE1 E2P_REG(0x28) 588 + #define E2P_36M_CAL_VALUE2 E2P_REG(0x2a) 589 + #define E2P_36M_CAL_VALUE3 E2P_REG(0x2c) 590 + #define E2P_36M_CAL_VALUE4 E2P_REG(0x2e) 591 + #define E2P_11A_INT_VALUE1 E2P_REG(0x30) 592 + #define E2P_11A_INT_VALUE2 E2P_REG(0x32) 593 + #define E2P_11A_INT_VALUE3 E2P_REG(0x34) 594 + #define E2P_11A_INT_VALUE4 E2P_REG(0x36) 595 + #define E2P_48M_CAL_VALUE1 E2P_REG(0x38) 596 + #define E2P_48M_CAL_VALUE2 E2P_REG(0x3a) 597 + #define E2P_48M_CAL_VALUE3 E2P_REG(0x3c) 598 + #define E2P_48M_CAL_VALUE4 E2P_REG(0x3e) 599 + #define E2P_48M_INT_VALUE1 E2P_REG(0x40) 600 + #define E2P_48M_INT_VALUE2 E2P_REG(0x42) 601 + #define E2P_48M_INT_VALUE3 E2P_REG(0x44) 602 + #define E2P_48M_INT_VALUE4 E2P_REG(0x46) 603 + #define E2P_54M_CAL_VALUE1 E2P_REG(0x48) /* ??? */ 604 + #define E2P_54M_CAL_VALUE2 E2P_REG(0x4a) 605 + #define E2P_54M_CAL_VALUE3 E2P_REG(0x4c) 606 + #define E2P_54M_CAL_VALUE4 E2P_REG(0x4e) 607 + #define E2P_54M_INT_VALUE1 E2P_REG(0x50) 608 + #define E2P_54M_INT_VALUE2 E2P_REG(0x52) 609 + #define E2P_54M_INT_VALUE3 E2P_REG(0x54) 610 + #define E2P_54M_INT_VALUE4 E2P_REG(0x56) 611 + 612 + /* All 16 bit values */ 613 + #define FW_FIRMWARE_VER FW_REG(0) 614 + /* non-zero if USB high speed connection */ 615 + #define FW_USB_SPEED FW_REG(1) 616 + #define FW_FIX_TX_RATE FW_REG(2) 617 + /* Seems to be able to control LEDs over the firmware */ 618 + #define FW_LINK_STATUS FW_REG(3) 619 + #define FW_SOFT_RESET FW_REG(4) 620 + #define FW_FLASH_CHK FW_REG(5) 621 + 622 + enum { 623 + CR_BASE_OFFSET = 0x9000, 624 + FW_START_OFFSET = 0xee00, 625 + FW_BASE_ADDR_OFFSET = FW_START_OFFSET + 0x1d, 626 + EEPROM_START_OFFSET = 0xf800, 627 + EEPROM_SIZE = 0x800, /* words */ 628 + LOAD_CODE_SIZE = 0xe, /* words */ 629 + LOAD_VECT_SIZE = 0x10000 - 0xfff7, /* words */ 630 + EEPROM_REGS_OFFSET = LOAD_CODE_SIZE + LOAD_VECT_SIZE, 631 + E2P_BASE_OFFSET = EEPROM_START_OFFSET + 632 + EEPROM_REGS_OFFSET, 633 + }; 634 + 635 + #define FW_REG_TABLE_ADDR USB_ADDR(FW_START_OFFSET + 0x1d) 636 + 637 + enum { 638 + /* indices for ofdm_cal_values */ 639 + OFDM_36M_INDEX = 0, 640 + OFDM_48M_INDEX = 1, 641 + OFDM_54M_INDEX = 2, 642 + }; 643 + 644 + struct zd_chip { 645 + struct zd_usb usb; 646 + struct zd_rf rf; 647 + struct mutex mutex; 648 + u8 e2p_mac[ETH_ALEN]; 649 + /* EepSetPoint in the vendor driver */ 650 + u8 pwr_cal_values[E2P_CHANNEL_COUNT]; 651 + /* integration values in the vendor driver */ 652 + u8 pwr_int_values[E2P_CHANNEL_COUNT]; 653 + /* SetPointOFDM in the vendor driver */ 654 + u8 ofdm_cal_values[3][E2P_CHANNEL_COUNT]; 655 + u8 pa_type:4, patch_cck_gain:1, patch_cr157:1, patch_6m_band_edge:1, 656 + is_zd1211b:1; 657 + }; 658 + 659 + static inline struct zd_chip *zd_usb_to_chip(struct zd_usb *usb) 660 + { 661 + return container_of(usb, struct zd_chip, usb); 662 + } 663 + 664 + static inline struct zd_chip *zd_rf_to_chip(struct zd_rf *rf) 665 + { 666 + return container_of(rf, struct zd_chip, rf); 667 + } 668 + 669 + #define zd_chip_dev(chip) (&(chip)->usb.intf->dev) 670 + 671 + void zd_chip_init(struct zd_chip *chip, 672 + struct net_device *netdev, 673 + struct usb_interface *intf); 674 + void zd_chip_clear(struct zd_chip *chip); 675 + int zd_chip_init_hw(struct zd_chip *chip, u8 device_type); 676 + int zd_chip_reset(struct zd_chip *chip); 677 + 678 + static inline int zd_ioread16v_locked(struct zd_chip *chip, u16 *values, 679 + const zd_addr_t *addresses, 680 + unsigned int count) 681 + { 682 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 683 + return zd_usb_ioread16v(&chip->usb, values, addresses, count); 684 + } 685 + 686 + static inline int zd_ioread16_locked(struct zd_chip *chip, u16 *value, 687 + const zd_addr_t addr) 688 + { 689 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 690 + return zd_usb_ioread16(&chip->usb, value, addr); 691 + } 692 + 693 + int zd_ioread32v_locked(struct zd_chip *chip, u32 *values, 694 + const zd_addr_t *addresses, unsigned int count); 695 + 696 + static inline int zd_ioread32_locked(struct zd_chip *chip, u32 *value, 697 + const zd_addr_t addr) 698 + { 699 + return zd_ioread32v_locked(chip, value, (const zd_addr_t *)&addr, 1); 700 + } 701 + 702 + static inline int zd_iowrite16_locked(struct zd_chip *chip, u16 value, 703 + zd_addr_t addr) 704 + { 705 + struct zd_ioreq16 ioreq; 706 + 707 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 708 + ioreq.addr = addr; 709 + ioreq.value = value; 710 + 711 + return zd_usb_iowrite16v(&chip->usb, &ioreq, 1); 712 + } 713 + 714 + int zd_iowrite16a_locked(struct zd_chip *chip, 715 + const struct zd_ioreq16 *ioreqs, unsigned int count); 716 + 717 + int _zd_iowrite32v_locked(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs, 718 + unsigned int count); 719 + 720 + static inline int zd_iowrite32_locked(struct zd_chip *chip, u32 value, 721 + zd_addr_t addr) 722 + { 723 + struct zd_ioreq32 ioreq; 724 + 725 + ioreq.addr = addr; 726 + ioreq.value = value; 727 + 728 + return _zd_iowrite32v_locked(chip, &ioreq, 1); 729 + } 730 + 731 + int zd_iowrite32a_locked(struct zd_chip *chip, 732 + const struct zd_ioreq32 *ioreqs, unsigned int count); 733 + 734 + static inline int zd_rfwrite_locked(struct zd_chip *chip, u32 value, u8 bits) 735 + { 736 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 737 + return zd_usb_rfwrite(&chip->usb, value, bits); 738 + } 739 + 740 + int zd_rfwritev_locked(struct zd_chip *chip, 741 + const u32* values, unsigned int count, u8 bits); 742 + 743 + /* Locking functions for reading and writing registers. 744 + * The different parameters are intentional. 745 + */ 746 + int zd_ioread16(struct zd_chip *chip, zd_addr_t addr, u16 *value); 747 + int zd_iowrite16(struct zd_chip *chip, zd_addr_t addr, u16 value); 748 + int zd_ioread32(struct zd_chip *chip, zd_addr_t addr, u32 *value); 749 + int zd_iowrite32(struct zd_chip *chip, zd_addr_t addr, u32 value); 750 + int zd_ioread32v(struct zd_chip *chip, const zd_addr_t *addresses, 751 + u32 *values, unsigned int count); 752 + int zd_iowrite32a(struct zd_chip *chip, const struct zd_ioreq32 *ioreqs, 753 + unsigned int count); 754 + 755 + int zd_chip_set_channel(struct zd_chip *chip, u8 channel); 756 + static inline u8 _zd_chip_get_channel(struct zd_chip *chip) 757 + { 758 + return chip->rf.channel; 759 + } 760 + u8 zd_chip_get_channel(struct zd_chip *chip); 761 + int zd_read_regdomain(struct zd_chip *chip, u8 *regdomain); 762 + void zd_get_e2p_mac_addr(struct zd_chip *chip, u8 *mac_addr); 763 + int zd_read_mac_addr(struct zd_chip *chip, u8 *mac_addr); 764 + int zd_write_mac_addr(struct zd_chip *chip, const u8 *mac_addr); 765 + int zd_chip_switch_radio_on(struct zd_chip *chip); 766 + int zd_chip_switch_radio_off(struct zd_chip *chip); 767 + int zd_chip_enable_int(struct zd_chip *chip); 768 + void zd_chip_disable_int(struct zd_chip *chip); 769 + int zd_chip_enable_rx(struct zd_chip *chip); 770 + void zd_chip_disable_rx(struct zd_chip *chip); 771 + int zd_chip_enable_hwint(struct zd_chip *chip); 772 + int zd_chip_disable_hwint(struct zd_chip *chip); 773 + 774 + static inline int zd_get_encryption_type(struct zd_chip *chip, u32 *type) 775 + { 776 + return zd_ioread32(chip, CR_ENCRYPTION_TYPE, type); 777 + } 778 + 779 + static inline int zd_set_encryption_type(struct zd_chip *chip, u32 type) 780 + { 781 + return zd_iowrite32(chip, CR_ENCRYPTION_TYPE, type); 782 + } 783 + 784 + static inline int zd_chip_get_basic_rates(struct zd_chip *chip, u16 *cr_rates) 785 + { 786 + return zd_ioread16(chip, CR_BASIC_RATE_TBL, cr_rates); 787 + } 788 + 789 + int zd_chip_set_basic_rates(struct zd_chip *chip, u16 cr_rates); 790 + 791 + static inline int zd_chip_set_rx_filter(struct zd_chip *chip, u32 filter) 792 + { 793 + return zd_iowrite32(chip, CR_RX_FILTER, filter); 794 + } 795 + 796 + int zd_chip_lock_phy_regs(struct zd_chip *chip); 797 + int zd_chip_unlock_phy_regs(struct zd_chip *chip); 798 + 799 + enum led_status { 800 + LED_OFF = 0, 801 + LED_ON = 1, 802 + LED_FLIP = 2, 803 + LED_STATUS = 3, 804 + }; 805 + 806 + int zd_chip_led_status(struct zd_chip *chip, int led, enum led_status status); 807 + int zd_chip_led_flip(struct zd_chip *chip, int led, 808 + const unsigned int *phases_msecs, unsigned int count); 809 + 810 + int zd_set_beacon_interval(struct zd_chip *chip, u32 interval); 811 + 812 + static inline int zd_get_beacon_interval(struct zd_chip *chip, u32 *interval) 813 + { 814 + return zd_ioread32(chip, CR_BCN_INTERVAL, interval); 815 + } 816 + 817 + struct rx_status; 818 + 819 + u8 zd_rx_qual_percent(const void *rx_frame, unsigned int size, 820 + const struct rx_status *status); 821 + u8 zd_rx_strength_percent(u8 rssi); 822 + 823 + u16 zd_rx_rate(const void *rx_frame, const struct rx_status *status); 824 + 825 + #endif /* _ZD_CHIP_H */
+48
drivers/net/wireless/zd1211rw/zd_def.h
···
··· 1 + /* zd_def.h 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_DEF_H 19 + #define _ZD_DEF_H 20 + 21 + #include <linux/kernel.h> 22 + #include <linux/stringify.h> 23 + #include <linux/device.h> 24 + #include <linux/kernel.h> 25 + 26 + #define dev_printk_f(level, dev, fmt, args...) \ 27 + dev_printk(level, dev, "%s() " fmt, __func__, ##args) 28 + 29 + #ifdef DEBUG 30 + # define dev_dbg_f(dev, fmt, args...) \ 31 + dev_printk_f(KERN_DEBUG, dev, fmt, ## args) 32 + #else 33 + # define dev_dbg_f(dev, fmt, args...) do { (void)(dev); } while (0) 34 + #endif /* DEBUG */ 35 + 36 + #ifdef DEBUG 37 + # define ZD_ASSERT(x) \ 38 + do { \ 39 + if (!(x)) { \ 40 + pr_debug("%s:%d ASSERT %s VIOLATED!\n", \ 41 + __FILE__, __LINE__, __stringify(x)); \ 42 + } \ 43 + } while (0) 44 + #else 45 + # define ZD_ASSERT(x) do { } while (0) 46 + #endif 47 + 48 + #endif /* _ZD_DEF_H */
+191
drivers/net/wireless/zd1211rw/zd_ieee80211.c
···
··· 1 + /* zd_ieee80211.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + /* 19 + * A lot of this code is generic and should be moved into the upper layers 20 + * at some point. 21 + */ 22 + 23 + #include <linux/errno.h> 24 + #include <linux/wireless.h> 25 + #include <linux/kernel.h> 26 + #include <net/ieee80211.h> 27 + 28 + #include "zd_def.h" 29 + #include "zd_ieee80211.h" 30 + #include "zd_mac.h" 31 + 32 + static const struct channel_range channel_ranges[] = { 33 + [0] = { 0, 0}, 34 + [ZD_REGDOMAIN_FCC] = { 1, 12}, 35 + [ZD_REGDOMAIN_IC] = { 1, 12}, 36 + [ZD_REGDOMAIN_ETSI] = { 1, 14}, 37 + [ZD_REGDOMAIN_JAPAN] = { 1, 14}, 38 + [ZD_REGDOMAIN_SPAIN] = { 1, 14}, 39 + [ZD_REGDOMAIN_FRANCE] = { 1, 14}, 40 + [ZD_REGDOMAIN_JAPAN_ADD] = {14, 15}, 41 + }; 42 + 43 + const struct channel_range *zd_channel_range(u8 regdomain) 44 + { 45 + if (regdomain >= ARRAY_SIZE(channel_ranges)) 46 + regdomain = 0; 47 + return &channel_ranges[regdomain]; 48 + } 49 + 50 + int zd_regdomain_supports_channel(u8 regdomain, u8 channel) 51 + { 52 + const struct channel_range *range = zd_channel_range(regdomain); 53 + return range->start <= channel && channel < range->end; 54 + } 55 + 56 + int zd_regdomain_supported(u8 regdomain) 57 + { 58 + const struct channel_range *range = zd_channel_range(regdomain); 59 + return range->start != 0; 60 + } 61 + 62 + /* Stores channel frequencies in MHz. */ 63 + static const u16 channel_frequencies[] = { 64 + 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 65 + 2452, 2457, 2462, 2467, 2472, 2484, 66 + }; 67 + 68 + #define NUM_CHANNELS ARRAY_SIZE(channel_frequencies) 69 + 70 + static int compute_freq(struct iw_freq *freq, u32 mhz, u32 hz) 71 + { 72 + u32 factor; 73 + 74 + freq->e = 0; 75 + if (mhz >= 1000000000U) { 76 + pr_debug("zd1211 mhz %u to large\n", mhz); 77 + freq->m = 0; 78 + return -EINVAL; 79 + } 80 + 81 + factor = 1000; 82 + while (mhz >= factor) { 83 + 84 + freq->e += 1; 85 + factor *= 10; 86 + } 87 + 88 + factor /= 1000U; 89 + freq->m = mhz * (1000000U/factor) + hz/factor; 90 + 91 + return 0; 92 + } 93 + 94 + int zd_channel_to_freq(struct iw_freq *freq, u8 channel) 95 + { 96 + if (channel > NUM_CHANNELS) { 97 + freq->m = 0; 98 + freq->e = 0; 99 + return -EINVAL; 100 + } 101 + if (!channel) { 102 + freq->m = 0; 103 + freq->e = 0; 104 + return -EINVAL; 105 + } 106 + return compute_freq(freq, channel_frequencies[channel-1], 0); 107 + } 108 + 109 + static int freq_to_mhz(const struct iw_freq *freq) 110 + { 111 + u32 factor; 112 + int e; 113 + 114 + /* Such high frequencies are not supported. */ 115 + if (freq->e > 6) 116 + return -EINVAL; 117 + 118 + factor = 1; 119 + for (e = freq->e; e > 0; --e) { 120 + factor *= 10; 121 + } 122 + factor = 1000000U / factor; 123 + 124 + if (freq->m % factor) { 125 + return -EINVAL; 126 + } 127 + 128 + return freq->m / factor; 129 + } 130 + 131 + int zd_find_channel(u8 *channel, const struct iw_freq *freq) 132 + { 133 + int i, r; 134 + u32 mhz; 135 + 136 + if (!(freq->flags & IW_FREQ_FIXED)) 137 + return 0; 138 + 139 + if (freq->m < 1000) { 140 + if (freq->m > NUM_CHANNELS || freq->m == 0) 141 + return -EINVAL; 142 + *channel = freq->m; 143 + return 1; 144 + } 145 + 146 + r = freq_to_mhz(freq); 147 + if (r < 0) 148 + return r; 149 + mhz = r; 150 + 151 + for (i = 0; i < NUM_CHANNELS; i++) { 152 + if (mhz == channel_frequencies[i]) { 153 + *channel = i+1; 154 + return 1; 155 + } 156 + } 157 + 158 + return -EINVAL; 159 + } 160 + 161 + int zd_geo_init(struct ieee80211_device *ieee, u8 regdomain) 162 + { 163 + struct ieee80211_geo geo; 164 + const struct channel_range *range; 165 + int i; 166 + u8 channel; 167 + 168 + dev_dbg(zd_mac_dev(zd_netdev_mac(ieee->dev)), 169 + "regdomain %#04x\n", regdomain); 170 + 171 + range = zd_channel_range(regdomain); 172 + if (range->start == 0) { 173 + dev_err(zd_mac_dev(zd_netdev_mac(ieee->dev)), 174 + "zd1211 regdomain %#04x not supported\n", 175 + regdomain); 176 + return -EINVAL; 177 + } 178 + 179 + memset(&geo, 0, sizeof(geo)); 180 + 181 + for (i = 0, channel = range->start; channel < range->end; channel++) { 182 + struct ieee80211_channel *chan = &geo.bg[i++]; 183 + chan->freq = channel_frequencies[channel - 1]; 184 + chan->channel = channel; 185 + } 186 + 187 + geo.bg_channels = i; 188 + memcpy(geo.name, "XX ", 4); 189 + ieee80211_set_geo(ieee, &geo); 190 + return 0; 191 + }
+85
drivers/net/wireless/zd1211rw/zd_ieee80211.h
···
··· 1 + #ifndef _ZD_IEEE80211_H 2 + #define _ZD_IEEE80211_H 3 + 4 + #include <net/ieee80211.h> 5 + #include "zd_types.h" 6 + 7 + /* Additional definitions from the standards. 8 + */ 9 + 10 + #define ZD_REGDOMAIN_FCC 0x10 11 + #define ZD_REGDOMAIN_IC 0x20 12 + #define ZD_REGDOMAIN_ETSI 0x30 13 + #define ZD_REGDOMAIN_SPAIN 0x31 14 + #define ZD_REGDOMAIN_FRANCE 0x32 15 + #define ZD_REGDOMAIN_JAPAN_ADD 0x40 16 + #define ZD_REGDOMAIN_JAPAN 0x41 17 + 18 + enum { 19 + MIN_CHANNEL24 = 1, 20 + MAX_CHANNEL24 = 14, 21 + }; 22 + 23 + struct channel_range { 24 + u8 start; 25 + u8 end; /* exclusive (channel must be less than end) */ 26 + }; 27 + 28 + struct iw_freq; 29 + 30 + int zd_geo_init(struct ieee80211_device *ieee, u8 regdomain); 31 + 32 + const struct channel_range *zd_channel_range(u8 regdomain); 33 + int zd_regdomain_supports_channel(u8 regdomain, u8 channel); 34 + int zd_regdomain_supported(u8 regdomain); 35 + 36 + /* for 2.4 GHz band */ 37 + int zd_channel_to_freq(struct iw_freq *freq, u8 channel); 38 + int zd_find_channel(u8 *channel, const struct iw_freq *freq); 39 + 40 + #define ZD_PLCP_SERVICE_LENGTH_EXTENSION 0x80 41 + 42 + struct ofdm_plcp_header { 43 + u8 prefix[3]; 44 + __le16 service; 45 + } __attribute__((packed)); 46 + 47 + static inline u8 zd_ofdm_plcp_header_rate( 48 + const struct ofdm_plcp_header *header) 49 + { 50 + return header->prefix[0] & 0xf; 51 + } 52 + 53 + #define ZD_OFDM_RATE_6M 0xb 54 + #define ZD_OFDM_RATE_9M 0xf 55 + #define ZD_OFDM_RATE_12M 0xa 56 + #define ZD_OFDM_RATE_18M 0xe 57 + #define ZD_OFDM_RATE_24M 0x9 58 + #define ZD_OFDM_RATE_36M 0xd 59 + #define ZD_OFDM_RATE_48M 0x8 60 + #define ZD_OFDM_RATE_54M 0xc 61 + 62 + struct cck_plcp_header { 63 + u8 signal; 64 + u8 service; 65 + __le16 length; 66 + __le16 crc16; 67 + } __attribute__((packed)); 68 + 69 + static inline u8 zd_cck_plcp_header_rate(const struct cck_plcp_header *header) 70 + { 71 + return header->signal; 72 + } 73 + 74 + #define ZD_CCK_SIGNAL_1M 0x0a 75 + #define ZD_CCK_SIGNAL_2M 0x14 76 + #define ZD_CCK_SIGNAL_5M5 0x37 77 + #define ZD_CCK_SIGNAL_11M 0x6e 78 + 79 + enum ieee80211_std { 80 + IEEE80211B = 0x01, 81 + IEEE80211A = 0x02, 82 + IEEE80211G = 0x04, 83 + }; 84 + 85 + #endif /* _ZD_IEEE80211_H */
+1057
drivers/net/wireless/zd1211rw/zd_mac.c
···
··· 1 + /* zd_mac.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <linux/netdevice.h> 19 + #include <linux/etherdevice.h> 20 + #include <linux/wireless.h> 21 + #include <linux/usb.h> 22 + #include <linux/jiffies.h> 23 + #include <net/ieee80211_radiotap.h> 24 + 25 + #include "zd_def.h" 26 + #include "zd_chip.h" 27 + #include "zd_mac.h" 28 + #include "zd_ieee80211.h" 29 + #include "zd_netdev.h" 30 + #include "zd_rf.h" 31 + #include "zd_util.h" 32 + 33 + static void ieee_init(struct ieee80211_device *ieee); 34 + static void softmac_init(struct ieee80211softmac_device *sm); 35 + 36 + int zd_mac_init(struct zd_mac *mac, 37 + struct net_device *netdev, 38 + struct usb_interface *intf) 39 + { 40 + struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); 41 + 42 + memset(mac, 0, sizeof(*mac)); 43 + spin_lock_init(&mac->lock); 44 + mac->netdev = netdev; 45 + 46 + ieee_init(ieee); 47 + softmac_init(ieee80211_priv(netdev)); 48 + zd_chip_init(&mac->chip, netdev, intf); 49 + return 0; 50 + } 51 + 52 + static int reset_channel(struct zd_mac *mac) 53 + { 54 + int r; 55 + unsigned long flags; 56 + const struct channel_range *range; 57 + 58 + spin_lock_irqsave(&mac->lock, flags); 59 + range = zd_channel_range(mac->regdomain); 60 + if (!range->start) { 61 + r = -EINVAL; 62 + goto out; 63 + } 64 + mac->requested_channel = range->start; 65 + r = 0; 66 + out: 67 + spin_unlock_irqrestore(&mac->lock, flags); 68 + return r; 69 + } 70 + 71 + int zd_mac_init_hw(struct zd_mac *mac, u8 device_type) 72 + { 73 + int r; 74 + struct zd_chip *chip = &mac->chip; 75 + u8 addr[ETH_ALEN]; 76 + u8 default_regdomain; 77 + 78 + r = zd_chip_enable_int(chip); 79 + if (r) 80 + goto out; 81 + r = zd_chip_init_hw(chip, device_type); 82 + if (r) 83 + goto disable_int; 84 + 85 + zd_get_e2p_mac_addr(chip, addr); 86 + r = zd_write_mac_addr(chip, addr); 87 + if (r) 88 + goto disable_int; 89 + ZD_ASSERT(!irqs_disabled()); 90 + spin_lock_irq(&mac->lock); 91 + memcpy(mac->netdev->dev_addr, addr, ETH_ALEN); 92 + spin_unlock_irq(&mac->lock); 93 + 94 + r = zd_read_regdomain(chip, &default_regdomain); 95 + if (r) 96 + goto disable_int; 97 + if (!zd_regdomain_supported(default_regdomain)) { 98 + dev_dbg_f(zd_mac_dev(mac), 99 + "Regulatory Domain %#04x is not supported.\n", 100 + default_regdomain); 101 + r = -EINVAL; 102 + goto disable_int; 103 + } 104 + spin_lock_irq(&mac->lock); 105 + mac->regdomain = mac->default_regdomain = default_regdomain; 106 + spin_unlock_irq(&mac->lock); 107 + r = reset_channel(mac); 108 + if (r) 109 + goto disable_int; 110 + 111 + r = zd_set_encryption_type(chip, NO_WEP); 112 + if (r) 113 + goto disable_int; 114 + 115 + r = zd_geo_init(zd_mac_to_ieee80211(mac), mac->regdomain); 116 + if (r) 117 + goto disable_int; 118 + 119 + r = 0; 120 + disable_int: 121 + zd_chip_disable_int(chip); 122 + out: 123 + return r; 124 + } 125 + 126 + void zd_mac_clear(struct zd_mac *mac) 127 + { 128 + /* Aquire the lock. */ 129 + spin_lock(&mac->lock); 130 + spin_unlock(&mac->lock); 131 + zd_chip_clear(&mac->chip); 132 + memset(mac, 0, sizeof(*mac)); 133 + } 134 + 135 + static int reset_mode(struct zd_mac *mac) 136 + { 137 + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); 138 + struct zd_ioreq32 ioreqs[3] = { 139 + { CR_RX_FILTER, RX_FILTER_BEACON|RX_FILTER_PROBE_RESPONSE| 140 + RX_FILTER_AUTH|RX_FILTER_ASSOC_RESPONSE }, 141 + { CR_SNIFFER_ON, 0U }, 142 + { CR_ENCRYPTION_TYPE, NO_WEP }, 143 + }; 144 + 145 + if (ieee->iw_mode == IW_MODE_MONITOR) { 146 + ioreqs[0].value = 0xffffffff; 147 + ioreqs[1].value = 0x1; 148 + ioreqs[2].value = ENC_SNIFFER; 149 + } 150 + 151 + return zd_iowrite32a(&mac->chip, ioreqs, 3); 152 + } 153 + 154 + int zd_mac_open(struct net_device *netdev) 155 + { 156 + struct zd_mac *mac = zd_netdev_mac(netdev); 157 + struct zd_chip *chip = &mac->chip; 158 + int r; 159 + 160 + r = zd_chip_enable_int(chip); 161 + if (r < 0) 162 + goto out; 163 + 164 + r = zd_chip_set_basic_rates(chip, CR_RATES_80211B | CR_RATES_80211G); 165 + if (r < 0) 166 + goto disable_int; 167 + r = reset_mode(mac); 168 + if (r) 169 + goto disable_int; 170 + r = zd_chip_switch_radio_on(chip); 171 + if (r < 0) 172 + goto disable_int; 173 + r = zd_chip_set_channel(chip, mac->requested_channel); 174 + if (r < 0) 175 + goto disable_radio; 176 + r = zd_chip_enable_rx(chip); 177 + if (r < 0) 178 + goto disable_radio; 179 + r = zd_chip_enable_hwint(chip); 180 + if (r < 0) 181 + goto disable_rx; 182 + 183 + ieee80211softmac_start(netdev); 184 + return 0; 185 + disable_rx: 186 + zd_chip_disable_rx(chip); 187 + disable_radio: 188 + zd_chip_switch_radio_off(chip); 189 + disable_int: 190 + zd_chip_disable_int(chip); 191 + out: 192 + return r; 193 + } 194 + 195 + int zd_mac_stop(struct net_device *netdev) 196 + { 197 + struct zd_mac *mac = zd_netdev_mac(netdev); 198 + struct zd_chip *chip = &mac->chip; 199 + 200 + netif_stop_queue(netdev); 201 + 202 + /* 203 + * The order here deliberately is a little different from the open() 204 + * method, since we need to make sure there is no opportunity for RX 205 + * frames to be processed by softmac after we have stopped it. 206 + */ 207 + 208 + zd_chip_disable_rx(chip); 209 + ieee80211softmac_stop(netdev); 210 + 211 + zd_chip_disable_hwint(chip); 212 + zd_chip_switch_radio_off(chip); 213 + zd_chip_disable_int(chip); 214 + 215 + return 0; 216 + } 217 + 218 + int zd_mac_set_mac_address(struct net_device *netdev, void *p) 219 + { 220 + int r; 221 + unsigned long flags; 222 + struct sockaddr *addr = p; 223 + struct zd_mac *mac = zd_netdev_mac(netdev); 224 + struct zd_chip *chip = &mac->chip; 225 + 226 + if (!is_valid_ether_addr(addr->sa_data)) 227 + return -EADDRNOTAVAIL; 228 + 229 + dev_dbg_f(zd_mac_dev(mac), 230 + "Setting MAC to " MAC_FMT "\n", MAC_ARG(addr->sa_data)); 231 + 232 + r = zd_write_mac_addr(chip, addr->sa_data); 233 + if (r) 234 + return r; 235 + 236 + spin_lock_irqsave(&mac->lock, flags); 237 + memcpy(netdev->dev_addr, addr->sa_data, ETH_ALEN); 238 + spin_unlock_irqrestore(&mac->lock, flags); 239 + 240 + return 0; 241 + } 242 + 243 + int zd_mac_set_regdomain(struct zd_mac *mac, u8 regdomain) 244 + { 245 + int r; 246 + u8 channel; 247 + 248 + ZD_ASSERT(!irqs_disabled()); 249 + spin_lock_irq(&mac->lock); 250 + if (regdomain == 0) { 251 + regdomain = mac->default_regdomain; 252 + } 253 + if (!zd_regdomain_supported(regdomain)) { 254 + spin_unlock_irq(&mac->lock); 255 + return -EINVAL; 256 + } 257 + mac->regdomain = regdomain; 258 + channel = mac->requested_channel; 259 + spin_unlock_irq(&mac->lock); 260 + 261 + r = zd_geo_init(zd_mac_to_ieee80211(mac), regdomain); 262 + if (r) 263 + return r; 264 + if (!zd_regdomain_supports_channel(regdomain, channel)) { 265 + r = reset_channel(mac); 266 + if (r) 267 + return r; 268 + } 269 + 270 + return 0; 271 + } 272 + 273 + u8 zd_mac_get_regdomain(struct zd_mac *mac) 274 + { 275 + unsigned long flags; 276 + u8 regdomain; 277 + 278 + spin_lock_irqsave(&mac->lock, flags); 279 + regdomain = mac->regdomain; 280 + spin_unlock_irqrestore(&mac->lock, flags); 281 + return regdomain; 282 + } 283 + 284 + static void set_channel(struct net_device *netdev, u8 channel) 285 + { 286 + struct zd_mac *mac = zd_netdev_mac(netdev); 287 + 288 + dev_dbg_f(zd_mac_dev(mac), "channel %d\n", channel); 289 + 290 + zd_chip_set_channel(&mac->chip, channel); 291 + } 292 + 293 + /* TODO: Should not work in Managed mode. */ 294 + int zd_mac_request_channel(struct zd_mac *mac, u8 channel) 295 + { 296 + unsigned long lock_flags; 297 + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); 298 + 299 + if (ieee->iw_mode == IW_MODE_INFRA) 300 + return -EPERM; 301 + 302 + spin_lock_irqsave(&mac->lock, lock_flags); 303 + if (!zd_regdomain_supports_channel(mac->regdomain, channel)) { 304 + spin_unlock_irqrestore(&mac->lock, lock_flags); 305 + return -EINVAL; 306 + } 307 + mac->requested_channel = channel; 308 + spin_unlock_irqrestore(&mac->lock, lock_flags); 309 + if (netif_running(mac->netdev)) 310 + return zd_chip_set_channel(&mac->chip, channel); 311 + else 312 + return 0; 313 + } 314 + 315 + int zd_mac_get_channel(struct zd_mac *mac, u8 *channel, u8 *flags) 316 + { 317 + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); 318 + 319 + *channel = zd_chip_get_channel(&mac->chip); 320 + if (ieee->iw_mode != IW_MODE_INFRA) { 321 + spin_lock_irq(&mac->lock); 322 + *flags = *channel == mac->requested_channel ? 323 + MAC_FIXED_CHANNEL : 0; 324 + spin_unlock(&mac->lock); 325 + } else { 326 + *flags = 0; 327 + } 328 + dev_dbg_f(zd_mac_dev(mac), "channel %u flags %u\n", *channel, *flags); 329 + return 0; 330 + } 331 + 332 + /* If wrong rate is given, we are falling back to the slowest rate: 1MBit/s */ 333 + static u8 cs_typed_rate(u8 cs_rate) 334 + { 335 + static const u8 typed_rates[16] = { 336 + [ZD_CS_CCK_RATE_1M] = ZD_CS_CCK|ZD_CS_CCK_RATE_1M, 337 + [ZD_CS_CCK_RATE_2M] = ZD_CS_CCK|ZD_CS_CCK_RATE_2M, 338 + [ZD_CS_CCK_RATE_5_5M] = ZD_CS_CCK|ZD_CS_CCK_RATE_5_5M, 339 + [ZD_CS_CCK_RATE_11M] = ZD_CS_CCK|ZD_CS_CCK_RATE_11M, 340 + [ZD_OFDM_RATE_6M] = ZD_CS_OFDM|ZD_OFDM_RATE_6M, 341 + [ZD_OFDM_RATE_9M] = ZD_CS_OFDM|ZD_OFDM_RATE_9M, 342 + [ZD_OFDM_RATE_12M] = ZD_CS_OFDM|ZD_OFDM_RATE_12M, 343 + [ZD_OFDM_RATE_18M] = ZD_CS_OFDM|ZD_OFDM_RATE_18M, 344 + [ZD_OFDM_RATE_24M] = ZD_CS_OFDM|ZD_OFDM_RATE_24M, 345 + [ZD_OFDM_RATE_36M] = ZD_CS_OFDM|ZD_OFDM_RATE_36M, 346 + [ZD_OFDM_RATE_48M] = ZD_CS_OFDM|ZD_OFDM_RATE_48M, 347 + [ZD_OFDM_RATE_54M] = ZD_CS_OFDM|ZD_OFDM_RATE_54M, 348 + }; 349 + 350 + ZD_ASSERT(ZD_CS_RATE_MASK == 0x0f); 351 + return typed_rates[cs_rate & ZD_CS_RATE_MASK]; 352 + } 353 + 354 + /* Fallback to lowest rate, if rate is unknown. */ 355 + static u8 rate_to_cs_rate(u8 rate) 356 + { 357 + switch (rate) { 358 + case IEEE80211_CCK_RATE_2MB: 359 + return ZD_CS_CCK_RATE_2M; 360 + case IEEE80211_CCK_RATE_5MB: 361 + return ZD_CS_CCK_RATE_5_5M; 362 + case IEEE80211_CCK_RATE_11MB: 363 + return ZD_CS_CCK_RATE_11M; 364 + case IEEE80211_OFDM_RATE_6MB: 365 + return ZD_OFDM_RATE_6M; 366 + case IEEE80211_OFDM_RATE_9MB: 367 + return ZD_OFDM_RATE_9M; 368 + case IEEE80211_OFDM_RATE_12MB: 369 + return ZD_OFDM_RATE_12M; 370 + case IEEE80211_OFDM_RATE_18MB: 371 + return ZD_OFDM_RATE_18M; 372 + case IEEE80211_OFDM_RATE_24MB: 373 + return ZD_OFDM_RATE_24M; 374 + case IEEE80211_OFDM_RATE_36MB: 375 + return ZD_OFDM_RATE_36M; 376 + case IEEE80211_OFDM_RATE_48MB: 377 + return ZD_OFDM_RATE_48M; 378 + case IEEE80211_OFDM_RATE_54MB: 379 + return ZD_OFDM_RATE_54M; 380 + } 381 + return ZD_CS_CCK_RATE_1M; 382 + } 383 + 384 + int zd_mac_set_mode(struct zd_mac *mac, u32 mode) 385 + { 386 + struct ieee80211_device *ieee; 387 + 388 + switch (mode) { 389 + case IW_MODE_AUTO: 390 + case IW_MODE_ADHOC: 391 + case IW_MODE_INFRA: 392 + mac->netdev->type = ARPHRD_ETHER; 393 + break; 394 + case IW_MODE_MONITOR: 395 + mac->netdev->type = ARPHRD_IEEE80211_RADIOTAP; 396 + break; 397 + default: 398 + dev_dbg_f(zd_mac_dev(mac), "wrong mode %u\n", mode); 399 + return -EINVAL; 400 + } 401 + 402 + ieee = zd_mac_to_ieee80211(mac); 403 + ZD_ASSERT(!irqs_disabled()); 404 + spin_lock_irq(&ieee->lock); 405 + ieee->iw_mode = mode; 406 + spin_unlock_irq(&ieee->lock); 407 + 408 + if (netif_running(mac->netdev)) 409 + return reset_mode(mac); 410 + 411 + return 0; 412 + } 413 + 414 + int zd_mac_get_mode(struct zd_mac *mac, u32 *mode) 415 + { 416 + unsigned long flags; 417 + struct ieee80211_device *ieee; 418 + 419 + ieee = zd_mac_to_ieee80211(mac); 420 + spin_lock_irqsave(&ieee->lock, flags); 421 + *mode = ieee->iw_mode; 422 + spin_unlock_irqrestore(&ieee->lock, flags); 423 + return 0; 424 + } 425 + 426 + int zd_mac_get_range(struct zd_mac *mac, struct iw_range *range) 427 + { 428 + int i; 429 + const struct channel_range *channel_range; 430 + u8 regdomain; 431 + 432 + memset(range, 0, sizeof(*range)); 433 + 434 + /* FIXME: Not so important and depends on the mode. For 802.11g 435 + * usually this value is used. It seems to be that Bit/s number is 436 + * given here. 437 + */ 438 + range->throughput = 27 * 1000 * 1000; 439 + 440 + range->max_qual.qual = 100; 441 + range->max_qual.level = 100; 442 + 443 + /* FIXME: Needs still to be tuned. */ 444 + range->avg_qual.qual = 71; 445 + range->avg_qual.level = 80; 446 + 447 + /* FIXME: depends on standard? */ 448 + range->min_rts = 256; 449 + range->max_rts = 2346; 450 + 451 + range->min_frag = MIN_FRAG_THRESHOLD; 452 + range->max_frag = MAX_FRAG_THRESHOLD; 453 + 454 + range->max_encoding_tokens = WEP_KEYS; 455 + range->num_encoding_sizes = 2; 456 + range->encoding_size[0] = 5; 457 + range->encoding_size[1] = WEP_KEY_LEN; 458 + 459 + range->we_version_compiled = WIRELESS_EXT; 460 + range->we_version_source = 20; 461 + 462 + ZD_ASSERT(!irqs_disabled()); 463 + spin_lock_irq(&mac->lock); 464 + regdomain = mac->regdomain; 465 + spin_unlock_irq(&mac->lock); 466 + channel_range = zd_channel_range(regdomain); 467 + 468 + range->num_channels = channel_range->end - channel_range->start; 469 + range->old_num_channels = range->num_channels; 470 + range->num_frequency = range->num_channels; 471 + range->old_num_frequency = range->num_frequency; 472 + 473 + for (i = 0; i < range->num_frequency; i++) { 474 + struct iw_freq *freq = &range->freq[i]; 475 + freq->i = channel_range->start + i; 476 + zd_channel_to_freq(freq, freq->i); 477 + } 478 + 479 + return 0; 480 + } 481 + 482 + static int zd_calc_tx_length_us(u8 *service, u8 cs_rate, u16 tx_length) 483 + { 484 + static const u8 rate_divisor[] = { 485 + [ZD_CS_CCK_RATE_1M] = 1, 486 + [ZD_CS_CCK_RATE_2M] = 2, 487 + [ZD_CS_CCK_RATE_5_5M] = 11, /* bits must be doubled */ 488 + [ZD_CS_CCK_RATE_11M] = 11, 489 + [ZD_OFDM_RATE_6M] = 6, 490 + [ZD_OFDM_RATE_9M] = 9, 491 + [ZD_OFDM_RATE_12M] = 12, 492 + [ZD_OFDM_RATE_18M] = 18, 493 + [ZD_OFDM_RATE_24M] = 24, 494 + [ZD_OFDM_RATE_36M] = 36, 495 + [ZD_OFDM_RATE_48M] = 48, 496 + [ZD_OFDM_RATE_54M] = 54, 497 + }; 498 + 499 + u32 bits = (u32)tx_length * 8; 500 + u32 divisor; 501 + 502 + divisor = rate_divisor[cs_rate]; 503 + if (divisor == 0) 504 + return -EINVAL; 505 + 506 + switch (cs_rate) { 507 + case ZD_CS_CCK_RATE_5_5M: 508 + bits = (2*bits) + 10; /* round up to the next integer */ 509 + break; 510 + case ZD_CS_CCK_RATE_11M: 511 + if (service) { 512 + u32 t = bits % 11; 513 + *service &= ~ZD_PLCP_SERVICE_LENGTH_EXTENSION; 514 + if (0 < t && t <= 3) { 515 + *service |= ZD_PLCP_SERVICE_LENGTH_EXTENSION; 516 + } 517 + } 518 + bits += 10; /* round up to the next integer */ 519 + break; 520 + } 521 + 522 + return bits/divisor; 523 + } 524 + 525 + enum { 526 + R2M_SHORT_PREAMBLE = 0x01, 527 + R2M_11A = 0x02, 528 + }; 529 + 530 + static u8 cs_rate_to_modulation(u8 cs_rate, int flags) 531 + { 532 + u8 modulation; 533 + 534 + modulation = cs_typed_rate(cs_rate); 535 + if (flags & R2M_SHORT_PREAMBLE) { 536 + switch (ZD_CS_RATE(modulation)) { 537 + case ZD_CS_CCK_RATE_2M: 538 + case ZD_CS_CCK_RATE_5_5M: 539 + case ZD_CS_CCK_RATE_11M: 540 + modulation |= ZD_CS_CCK_PREA_SHORT; 541 + return modulation; 542 + } 543 + } 544 + if (flags & R2M_11A) { 545 + if (ZD_CS_TYPE(modulation) == ZD_CS_OFDM) 546 + modulation |= ZD_CS_OFDM_MODE_11A; 547 + } 548 + return modulation; 549 + } 550 + 551 + static void cs_set_modulation(struct zd_mac *mac, struct zd_ctrlset *cs, 552 + struct ieee80211_hdr_4addr *hdr) 553 + { 554 + struct ieee80211softmac_device *softmac = ieee80211_priv(mac->netdev); 555 + u16 ftype = WLAN_FC_GET_TYPE(le16_to_cpu(hdr->frame_ctl)); 556 + u8 rate, cs_rate; 557 + int is_mgt = (ftype == IEEE80211_FTYPE_MGMT) != 0; 558 + 559 + /* FIXME: 802.11a? short preamble? */ 560 + rate = ieee80211softmac_suggest_txrate(softmac, 561 + is_multicast_ether_addr(hdr->addr1), is_mgt); 562 + 563 + cs_rate = rate_to_cs_rate(rate); 564 + cs->modulation = cs_rate_to_modulation(cs_rate, 0); 565 + } 566 + 567 + static void cs_set_control(struct zd_mac *mac, struct zd_ctrlset *cs, 568 + struct ieee80211_hdr_4addr *header) 569 + { 570 + unsigned int tx_length = le16_to_cpu(cs->tx_length); 571 + u16 fctl = le16_to_cpu(header->frame_ctl); 572 + u16 ftype = WLAN_FC_GET_TYPE(fctl); 573 + u16 stype = WLAN_FC_GET_STYPE(fctl); 574 + 575 + /* 576 + * CONTROL: 577 + * - start at 0x00 578 + * - if fragment 0, enable bit 0 579 + * - if backoff needed, enable bit 0 580 + * - if burst (backoff not needed) disable bit 0 581 + * - if multicast, enable bit 1 582 + * - if PS-POLL frame, enable bit 2 583 + * - if in INDEPENDENT_BSS mode and zd1205_DestPowerSave, then enable 584 + * bit 4 (FIXME: wtf) 585 + * - if frag_len > RTS threshold, set bit 5 as long if it isnt 586 + * multicast or mgt 587 + * - if bit 5 is set, and we are in OFDM mode, unset bit 5 and set bit 588 + * 7 589 + */ 590 + 591 + cs->control = 0; 592 + 593 + /* First fragment */ 594 + if (WLAN_GET_SEQ_FRAG(le16_to_cpu(header->seq_ctl)) == 0) 595 + cs->control |= ZD_CS_NEED_RANDOM_BACKOFF; 596 + 597 + /* Multicast */ 598 + if (is_multicast_ether_addr(header->addr1)) 599 + cs->control |= ZD_CS_MULTICAST; 600 + 601 + /* PS-POLL */ 602 + if (stype == IEEE80211_STYPE_PSPOLL) 603 + cs->control |= ZD_CS_PS_POLL_FRAME; 604 + 605 + if (!is_multicast_ether_addr(header->addr1) && 606 + ftype != IEEE80211_FTYPE_MGMT && 607 + tx_length > zd_netdev_ieee80211(mac->netdev)->rts) 608 + { 609 + /* FIXME: check the logic */ 610 + if (ZD_CS_TYPE(cs->modulation) == ZD_CS_OFDM) { 611 + /* 802.11g */ 612 + cs->control |= ZD_CS_SELF_CTS; 613 + } else { /* 802.11b */ 614 + cs->control |= ZD_CS_RTS; 615 + } 616 + } 617 + 618 + /* FIXME: Management frame? */ 619 + } 620 + 621 + static int fill_ctrlset(struct zd_mac *mac, 622 + struct ieee80211_txb *txb, 623 + int frag_num) 624 + { 625 + int r; 626 + struct sk_buff *skb = txb->fragments[frag_num]; 627 + struct ieee80211_hdr_4addr *hdr = 628 + (struct ieee80211_hdr_4addr *) skb->data; 629 + unsigned int frag_len = skb->len + IEEE80211_FCS_LEN; 630 + unsigned int next_frag_len; 631 + unsigned int packet_length; 632 + struct zd_ctrlset *cs = (struct zd_ctrlset *) 633 + skb_push(skb, sizeof(struct zd_ctrlset)); 634 + 635 + if (frag_num+1 < txb->nr_frags) { 636 + next_frag_len = txb->fragments[frag_num+1]->len + 637 + IEEE80211_FCS_LEN; 638 + } else { 639 + next_frag_len = 0; 640 + } 641 + ZD_ASSERT(frag_len <= 0xffff); 642 + ZD_ASSERT(next_frag_len <= 0xffff); 643 + 644 + cs_set_modulation(mac, cs, hdr); 645 + 646 + cs->tx_length = cpu_to_le16(frag_len); 647 + 648 + cs_set_control(mac, cs, hdr); 649 + 650 + packet_length = frag_len + sizeof(struct zd_ctrlset) + 10; 651 + ZD_ASSERT(packet_length <= 0xffff); 652 + /* ZD1211B: Computing the length difference this way, gives us 653 + * flexibility to compute the packet length. 654 + */ 655 + cs->packet_length = cpu_to_le16(mac->chip.is_zd1211b ? 656 + packet_length - frag_len : packet_length); 657 + 658 + /* 659 + * CURRENT LENGTH: 660 + * - transmit frame length in microseconds 661 + * - seems to be derived from frame length 662 + * - see Cal_Us_Service() in zdinlinef.h 663 + * - if macp->bTxBurstEnable is enabled, then multiply by 4 664 + * - bTxBurstEnable is never set in the vendor driver 665 + * 666 + * SERVICE: 667 + * - "for PLCP configuration" 668 + * - always 0 except in some situations at 802.11b 11M 669 + * - see line 53 of zdinlinef.h 670 + */ 671 + cs->service = 0; 672 + r = zd_calc_tx_length_us(&cs->service, ZD_CS_RATE(cs->modulation), 673 + le16_to_cpu(cs->tx_length)); 674 + if (r < 0) 675 + return r; 676 + cs->current_length = cpu_to_le16(r); 677 + 678 + if (next_frag_len == 0) { 679 + cs->next_frame_length = 0; 680 + } else { 681 + r = zd_calc_tx_length_us(NULL, ZD_CS_RATE(cs->modulation), 682 + next_frag_len); 683 + if (r < 0) 684 + return r; 685 + cs->next_frame_length = cpu_to_le16(r); 686 + } 687 + 688 + return 0; 689 + } 690 + 691 + static int zd_mac_tx(struct zd_mac *mac, struct ieee80211_txb *txb, int pri) 692 + { 693 + int i, r; 694 + 695 + for (i = 0; i < txb->nr_frags; i++) { 696 + struct sk_buff *skb = txb->fragments[i]; 697 + 698 + r = fill_ctrlset(mac, txb, i); 699 + if (r) 700 + return r; 701 + r = zd_usb_tx(&mac->chip.usb, skb->data, skb->len); 702 + if (r) 703 + return r; 704 + } 705 + 706 + /* FIXME: shouldn't this be handled by the upper layers? */ 707 + mac->netdev->trans_start = jiffies; 708 + 709 + ieee80211_txb_free(txb); 710 + return 0; 711 + } 712 + 713 + struct zd_rt_hdr { 714 + struct ieee80211_radiotap_header rt_hdr; 715 + u8 rt_flags; 716 + u16 rt_channel; 717 + u16 rt_chbitmask; 718 + u16 rt_rate; 719 + }; 720 + 721 + static void fill_rt_header(void *buffer, struct zd_mac *mac, 722 + const struct ieee80211_rx_stats *stats, 723 + const struct rx_status *status) 724 + { 725 + struct zd_rt_hdr *hdr = buffer; 726 + 727 + hdr->rt_hdr.it_version = PKTHDR_RADIOTAP_VERSION; 728 + hdr->rt_hdr.it_pad = 0; 729 + hdr->rt_hdr.it_len = cpu_to_le16(sizeof(struct zd_rt_hdr)); 730 + hdr->rt_hdr.it_present = cpu_to_le32((1 << IEEE80211_RADIOTAP_FLAGS) | 731 + (1 << IEEE80211_RADIOTAP_CHANNEL) | 732 + (1 << IEEE80211_RADIOTAP_RATE)); 733 + 734 + hdr->rt_flags = 0; 735 + if (status->decryption_type & (ZD_RX_WEP64|ZD_RX_WEP128|ZD_RX_WEP256)) 736 + hdr->rt_flags |= IEEE80211_RADIOTAP_F_WEP; 737 + 738 + /* FIXME: 802.11a */ 739 + hdr->rt_channel = cpu_to_le16(ieee80211chan2mhz( 740 + _zd_chip_get_channel(&mac->chip))); 741 + hdr->rt_chbitmask = cpu_to_le16(IEEE80211_CHAN_2GHZ | 742 + ((status->frame_status & ZD_RX_FRAME_MODULATION_MASK) == 743 + ZD_RX_OFDM ? IEEE80211_CHAN_OFDM : IEEE80211_CHAN_CCK)); 744 + 745 + hdr->rt_rate = stats->rate / 5; 746 + } 747 + 748 + /* Returns 1 if the data packet is for us and 0 otherwise. */ 749 + static int is_data_packet_for_us(struct ieee80211_device *ieee, 750 + struct ieee80211_hdr_4addr *hdr) 751 + { 752 + struct net_device *netdev = ieee->dev; 753 + u16 fc = le16_to_cpu(hdr->frame_ctl); 754 + 755 + ZD_ASSERT(WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA); 756 + 757 + switch (ieee->iw_mode) { 758 + case IW_MODE_ADHOC: 759 + if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != 0 || 760 + memcmp(hdr->addr3, ieee->bssid, ETH_ALEN) != 0) 761 + return 0; 762 + break; 763 + case IW_MODE_AUTO: 764 + case IW_MODE_INFRA: 765 + if ((fc & (IEEE80211_FCTL_TODS|IEEE80211_FCTL_FROMDS)) != 766 + IEEE80211_FCTL_FROMDS || 767 + memcmp(hdr->addr2, ieee->bssid, ETH_ALEN) != 0) 768 + return 0; 769 + break; 770 + default: 771 + ZD_ASSERT(ieee->iw_mode != IW_MODE_MONITOR); 772 + return 0; 773 + } 774 + 775 + return memcmp(hdr->addr1, netdev->dev_addr, ETH_ALEN) == 0 || 776 + is_multicast_ether_addr(hdr->addr1) || 777 + (netdev->flags & IFF_PROMISC); 778 + } 779 + 780 + /* Filters receiving packets. If it returns 1 send it to ieee80211_rx, if 0 781 + * return. If an error is detected -EINVAL is returned. ieee80211_rx_mgt() is 782 + * called here. 783 + * 784 + * It has been based on ieee80211_rx_any. 785 + */ 786 + static int filter_rx(struct ieee80211_device *ieee, 787 + const u8 *buffer, unsigned int length, 788 + struct ieee80211_rx_stats *stats) 789 + { 790 + struct ieee80211_hdr_4addr *hdr; 791 + u16 fc; 792 + 793 + if (ieee->iw_mode == IW_MODE_MONITOR) 794 + return 1; 795 + 796 + hdr = (struct ieee80211_hdr_4addr *)buffer; 797 + fc = le16_to_cpu(hdr->frame_ctl); 798 + if ((fc & IEEE80211_FCTL_VERS) != 0) 799 + return -EINVAL; 800 + 801 + switch (WLAN_FC_GET_TYPE(fc)) { 802 + case IEEE80211_FTYPE_MGMT: 803 + if (length < sizeof(struct ieee80211_hdr_3addr)) 804 + return -EINVAL; 805 + ieee80211_rx_mgt(ieee, hdr, stats); 806 + return 0; 807 + case IEEE80211_FTYPE_CTL: 808 + /* Ignore invalid short buffers */ 809 + return 0; 810 + case IEEE80211_FTYPE_DATA: 811 + if (length < sizeof(struct ieee80211_hdr_3addr)) 812 + return -EINVAL; 813 + return is_data_packet_for_us(ieee, hdr); 814 + } 815 + 816 + return -EINVAL; 817 + } 818 + 819 + static void update_qual_rssi(struct zd_mac *mac, u8 qual_percent, u8 rssi) 820 + { 821 + unsigned long flags; 822 + 823 + spin_lock_irqsave(&mac->lock, flags); 824 + mac->qual_average = (7 * mac->qual_average + qual_percent) / 8; 825 + mac->rssi_average = (7 * mac->rssi_average + rssi) / 8; 826 + spin_unlock_irqrestore(&mac->lock, flags); 827 + } 828 + 829 + static int fill_rx_stats(struct ieee80211_rx_stats *stats, 830 + const struct rx_status **pstatus, 831 + struct zd_mac *mac, 832 + const u8 *buffer, unsigned int length) 833 + { 834 + const struct rx_status *status; 835 + 836 + *pstatus = status = zd_tail(buffer, length, sizeof(struct rx_status)); 837 + if (status->frame_status & ZD_RX_ERROR) { 838 + /* FIXME: update? */ 839 + return -EINVAL; 840 + } 841 + memset(stats, 0, sizeof(struct ieee80211_rx_stats)); 842 + stats->len = length - (ZD_PLCP_HEADER_SIZE + IEEE80211_FCS_LEN + 843 + + sizeof(struct rx_status)); 844 + /* FIXME: 802.11a */ 845 + stats->freq = IEEE80211_24GHZ_BAND; 846 + stats->received_channel = _zd_chip_get_channel(&mac->chip); 847 + stats->rssi = zd_rx_strength_percent(status->signal_strength); 848 + stats->signal = zd_rx_qual_percent(buffer, 849 + length - sizeof(struct rx_status), 850 + status); 851 + stats->mask = IEEE80211_STATMASK_RSSI | IEEE80211_STATMASK_SIGNAL; 852 + stats->rate = zd_rx_rate(buffer, status); 853 + if (stats->rate) 854 + stats->mask |= IEEE80211_STATMASK_RATE; 855 + 856 + update_qual_rssi(mac, stats->signal, stats->rssi); 857 + return 0; 858 + } 859 + 860 + int zd_mac_rx(struct zd_mac *mac, const u8 *buffer, unsigned int length) 861 + { 862 + int r; 863 + struct ieee80211_device *ieee = zd_mac_to_ieee80211(mac); 864 + struct ieee80211_rx_stats stats; 865 + const struct rx_status *status; 866 + struct sk_buff *skb; 867 + 868 + if (length < ZD_PLCP_HEADER_SIZE + IEEE80211_1ADDR_LEN + 869 + IEEE80211_FCS_LEN + sizeof(struct rx_status)) 870 + return -EINVAL; 871 + 872 + r = fill_rx_stats(&stats, &status, mac, buffer, length); 873 + if (r) 874 + return r; 875 + 876 + length -= ZD_PLCP_HEADER_SIZE+IEEE80211_FCS_LEN+ 877 + sizeof(struct rx_status); 878 + buffer += ZD_PLCP_HEADER_SIZE; 879 + 880 + r = filter_rx(ieee, buffer, length, &stats); 881 + if (r <= 0) 882 + return r; 883 + 884 + skb = dev_alloc_skb(sizeof(struct zd_rt_hdr) + length); 885 + if (!skb) 886 + return -ENOMEM; 887 + if (ieee->iw_mode == IW_MODE_MONITOR) 888 + fill_rt_header(skb_put(skb, sizeof(struct zd_rt_hdr)), mac, 889 + &stats, status); 890 + memcpy(skb_put(skb, length), buffer, length); 891 + 892 + r = ieee80211_rx(ieee, skb, &stats); 893 + if (!r) { 894 + ZD_ASSERT(in_irq()); 895 + dev_kfree_skb_irq(skb); 896 + } 897 + return 0; 898 + } 899 + 900 + static int netdev_tx(struct ieee80211_txb *txb, struct net_device *netdev, 901 + int pri) 902 + { 903 + return zd_mac_tx(zd_netdev_mac(netdev), txb, pri); 904 + } 905 + 906 + static void set_security(struct net_device *netdev, 907 + struct ieee80211_security *sec) 908 + { 909 + struct ieee80211_device *ieee = zd_netdev_ieee80211(netdev); 910 + struct ieee80211_security *secinfo = &ieee->sec; 911 + int keyidx; 912 + 913 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), "\n"); 914 + 915 + for (keyidx = 0; keyidx<WEP_KEYS; keyidx++) 916 + if (sec->flags & (1<<keyidx)) { 917 + secinfo->encode_alg[keyidx] = sec->encode_alg[keyidx]; 918 + secinfo->key_sizes[keyidx] = sec->key_sizes[keyidx]; 919 + memcpy(secinfo->keys[keyidx], sec->keys[keyidx], 920 + SCM_KEY_LEN); 921 + } 922 + 923 + if (sec->flags & SEC_ACTIVE_KEY) { 924 + secinfo->active_key = sec->active_key; 925 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 926 + " .active_key = %d\n", sec->active_key); 927 + } 928 + if (sec->flags & SEC_UNICAST_GROUP) { 929 + secinfo->unicast_uses_group = sec->unicast_uses_group; 930 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 931 + " .unicast_uses_group = %d\n", 932 + sec->unicast_uses_group); 933 + } 934 + if (sec->flags & SEC_LEVEL) { 935 + secinfo->level = sec->level; 936 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 937 + " .level = %d\n", sec->level); 938 + } 939 + if (sec->flags & SEC_ENABLED) { 940 + secinfo->enabled = sec->enabled; 941 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 942 + " .enabled = %d\n", sec->enabled); 943 + } 944 + if (sec->flags & SEC_ENCRYPT) { 945 + secinfo->encrypt = sec->encrypt; 946 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 947 + " .encrypt = %d\n", sec->encrypt); 948 + } 949 + if (sec->flags & SEC_AUTH_MODE) { 950 + secinfo->auth_mode = sec->auth_mode; 951 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), 952 + " .auth_mode = %d\n", sec->auth_mode); 953 + } 954 + } 955 + 956 + static void ieee_init(struct ieee80211_device *ieee) 957 + { 958 + ieee->mode = IEEE_B | IEEE_G; 959 + ieee->freq_band = IEEE80211_24GHZ_BAND; 960 + ieee->modulation = IEEE80211_OFDM_MODULATION | IEEE80211_CCK_MODULATION; 961 + ieee->tx_headroom = sizeof(struct zd_ctrlset); 962 + ieee->set_security = set_security; 963 + ieee->hard_start_xmit = netdev_tx; 964 + 965 + /* Software encryption/decryption for now */ 966 + ieee->host_build_iv = 0; 967 + ieee->host_encrypt = 1; 968 + ieee->host_decrypt = 1; 969 + 970 + /* FIXME: default to managed mode, until ieee80211 and zd1211rw can 971 + * correctly support AUTO */ 972 + ieee->iw_mode = IW_MODE_INFRA; 973 + } 974 + 975 + static void softmac_init(struct ieee80211softmac_device *sm) 976 + { 977 + sm->set_channel = set_channel; 978 + } 979 + 980 + struct iw_statistics *zd_mac_get_wireless_stats(struct net_device *ndev) 981 + { 982 + struct zd_mac *mac = zd_netdev_mac(ndev); 983 + struct iw_statistics *iw_stats = &mac->iw_stats; 984 + 985 + memset(iw_stats, 0, sizeof(struct iw_statistics)); 986 + /* We are not setting the status, because ieee->state is not updated 987 + * at all and this driver doesn't track authentication state. 988 + */ 989 + spin_lock_irq(&mac->lock); 990 + iw_stats->qual.qual = mac->qual_average; 991 + iw_stats->qual.level = mac->rssi_average; 992 + iw_stats->qual.updated = IW_QUAL_QUAL_UPDATED|IW_QUAL_LEVEL_UPDATED| 993 + IW_QUAL_NOISE_INVALID; 994 + spin_unlock_irq(&mac->lock); 995 + /* TODO: update counter */ 996 + return iw_stats; 997 + } 998 + 999 + #ifdef DEBUG 1000 + static const char* decryption_types[] = { 1001 + [ZD_RX_NO_WEP] = "none", 1002 + [ZD_RX_WEP64] = "WEP64", 1003 + [ZD_RX_TKIP] = "TKIP", 1004 + [ZD_RX_AES] = "AES", 1005 + [ZD_RX_WEP128] = "WEP128", 1006 + [ZD_RX_WEP256] = "WEP256", 1007 + }; 1008 + 1009 + static const char *decryption_type_string(u8 type) 1010 + { 1011 + const char *s; 1012 + 1013 + if (type < ARRAY_SIZE(decryption_types)) { 1014 + s = decryption_types[type]; 1015 + } else { 1016 + s = NULL; 1017 + } 1018 + return s ? s : "unknown"; 1019 + } 1020 + 1021 + static int is_ofdm(u8 frame_status) 1022 + { 1023 + return (frame_status & ZD_RX_OFDM); 1024 + } 1025 + 1026 + void zd_dump_rx_status(const struct rx_status *status) 1027 + { 1028 + const char* modulation; 1029 + u8 quality; 1030 + 1031 + if (is_ofdm(status->frame_status)) { 1032 + modulation = "ofdm"; 1033 + quality = status->signal_quality_ofdm; 1034 + } else { 1035 + modulation = "cck"; 1036 + quality = status->signal_quality_cck; 1037 + } 1038 + pr_debug("rx status %s strength %#04x qual %#04x decryption %s\n", 1039 + modulation, status->signal_strength, quality, 1040 + decryption_type_string(status->decryption_type)); 1041 + if (status->frame_status & ZD_RX_ERROR) { 1042 + pr_debug("rx error %s%s%s%s%s%s\n", 1043 + (status->frame_status & ZD_RX_TIMEOUT_ERROR) ? 1044 + "timeout " : "", 1045 + (status->frame_status & ZD_RX_FIFO_OVERRUN_ERROR) ? 1046 + "fifo " : "", 1047 + (status->frame_status & ZD_RX_DECRYPTION_ERROR) ? 1048 + "decryption " : "", 1049 + (status->frame_status & ZD_RX_CRC32_ERROR) ? 1050 + "crc32 " : "", 1051 + (status->frame_status & ZD_RX_NO_ADDR1_MATCH_ERROR) ? 1052 + "addr1 " : "", 1053 + (status->frame_status & ZD_RX_CRC16_ERROR) ? 1054 + "crc16" : ""); 1055 + } 1056 + } 1057 + #endif /* DEBUG */
+190
drivers/net/wireless/zd1211rw/zd_mac.h
···
··· 1 + /* zd_mac.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_MAC_H 19 + #define _ZD_MAC_H 20 + 21 + #include <linux/wireless.h> 22 + #include <linux/kernel.h> 23 + #include <net/ieee80211.h> 24 + #include <net/ieee80211softmac.h> 25 + 26 + #include "zd_chip.h" 27 + #include "zd_netdev.h" 28 + 29 + struct zd_ctrlset { 30 + u8 modulation; 31 + __le16 tx_length; 32 + u8 control; 33 + /* stores only the difference to tx_length on ZD1211B */ 34 + __le16 packet_length; 35 + __le16 current_length; 36 + u8 service; 37 + __le16 next_frame_length; 38 + } __attribute__((packed)); 39 + 40 + #define ZD_CS_RESERVED_SIZE 25 41 + 42 + /* zd_crtlset field modulation */ 43 + #define ZD_CS_RATE_MASK 0x0f 44 + #define ZD_CS_TYPE_MASK 0x10 45 + #define ZD_CS_RATE(modulation) ((modulation) & ZD_CS_RATE_MASK) 46 + #define ZD_CS_TYPE(modulation) ((modulation) & ZD_CS_TYPE_MASK) 47 + 48 + #define ZD_CS_CCK 0x00 49 + #define ZD_CS_OFDM 0x10 50 + 51 + #define ZD_CS_CCK_RATE_1M 0x00 52 + #define ZD_CS_CCK_RATE_2M 0x01 53 + #define ZD_CS_CCK_RATE_5_5M 0x02 54 + #define ZD_CS_CCK_RATE_11M 0x03 55 + /* The rates for OFDM are encoded as in the PLCP header. Use ZD_OFDM_RATE_*. 56 + */ 57 + 58 + /* bit 5 is preamble (when in CCK mode), or a/g selection (when in OFDM mode) */ 59 + #define ZD_CS_CCK_PREA_LONG 0x00 60 + #define ZD_CS_CCK_PREA_SHORT 0x20 61 + #define ZD_CS_OFDM_MODE_11G 0x00 62 + #define ZD_CS_OFDM_MODE_11A 0x20 63 + 64 + /* zd_ctrlset control field */ 65 + #define ZD_CS_NEED_RANDOM_BACKOFF 0x01 66 + #define ZD_CS_MULTICAST 0x02 67 + 68 + #define ZD_CS_FRAME_TYPE_MASK 0x0c 69 + #define ZD_CS_DATA_FRAME 0x00 70 + #define ZD_CS_PS_POLL_FRAME 0x04 71 + #define ZD_CS_MANAGEMENT_FRAME 0x08 72 + #define ZD_CS_NO_SEQUENCE_CTL_FRAME 0x0c 73 + 74 + #define ZD_CS_WAKE_DESTINATION 0x10 75 + #define ZD_CS_RTS 0x20 76 + #define ZD_CS_ENCRYPT 0x40 77 + #define ZD_CS_SELF_CTS 0x80 78 + 79 + /* Incoming frames are prepended by a PLCP header */ 80 + #define ZD_PLCP_HEADER_SIZE 5 81 + 82 + struct rx_length_info { 83 + __le16 length[3]; 84 + __le16 tag; 85 + } __attribute__((packed)); 86 + 87 + #define RX_LENGTH_INFO_TAG 0x697e 88 + 89 + struct rx_status { 90 + /* rssi */ 91 + u8 signal_strength; 92 + u8 signal_quality_cck; 93 + u8 signal_quality_ofdm; 94 + u8 decryption_type; 95 + u8 frame_status; 96 + } __attribute__((packed)); 97 + 98 + /* rx_status field decryption_type */ 99 + #define ZD_RX_NO_WEP 0 100 + #define ZD_RX_WEP64 1 101 + #define ZD_RX_TKIP 2 102 + #define ZD_RX_AES 4 103 + #define ZD_RX_WEP128 5 104 + #define ZD_RX_WEP256 6 105 + 106 + /* rx_status field frame_status */ 107 + #define ZD_RX_FRAME_MODULATION_MASK 0x01 108 + #define ZD_RX_CCK 0x00 109 + #define ZD_RX_OFDM 0x01 110 + 111 + #define ZD_RX_TIMEOUT_ERROR 0x02 112 + #define ZD_RX_FIFO_OVERRUN_ERROR 0x04 113 + #define ZD_RX_DECRYPTION_ERROR 0x08 114 + #define ZD_RX_CRC32_ERROR 0x10 115 + #define ZD_RX_NO_ADDR1_MATCH_ERROR 0x20 116 + #define ZD_RX_CRC16_ERROR 0x40 117 + #define ZD_RX_ERROR 0x80 118 + 119 + enum mac_flags { 120 + MAC_FIXED_CHANNEL = 0x01, 121 + }; 122 + 123 + struct zd_mac { 124 + struct net_device *netdev; 125 + struct zd_chip chip; 126 + spinlock_t lock; 127 + /* Unlocked reading possible */ 128 + struct iw_statistics iw_stats; 129 + u8 qual_average; 130 + u8 rssi_average; 131 + u8 regdomain; 132 + u8 default_regdomain; 133 + u8 requested_channel; 134 + }; 135 + 136 + static inline struct ieee80211_device *zd_mac_to_ieee80211(struct zd_mac *mac) 137 + { 138 + return zd_netdev_ieee80211(mac->netdev); 139 + } 140 + 141 + static inline struct zd_mac *zd_netdev_mac(struct net_device *netdev) 142 + { 143 + return ieee80211softmac_priv(netdev); 144 + } 145 + 146 + static inline struct zd_mac *zd_chip_to_mac(struct zd_chip *chip) 147 + { 148 + return container_of(chip, struct zd_mac, chip); 149 + } 150 + 151 + static inline struct zd_mac *zd_usb_to_mac(struct zd_usb *usb) 152 + { 153 + return zd_chip_to_mac(zd_usb_to_chip(usb)); 154 + } 155 + 156 + #define zd_mac_dev(mac) (zd_chip_dev(&(mac)->chip)) 157 + 158 + int zd_mac_init(struct zd_mac *mac, 159 + struct net_device *netdev, 160 + struct usb_interface *intf); 161 + void zd_mac_clear(struct zd_mac *mac); 162 + 163 + int zd_mac_init_hw(struct zd_mac *mac, u8 device_type); 164 + 165 + int zd_mac_open(struct net_device *netdev); 166 + int zd_mac_stop(struct net_device *netdev); 167 + int zd_mac_set_mac_address(struct net_device *dev, void *p); 168 + 169 + int zd_mac_rx(struct zd_mac *mac, const u8 *buffer, unsigned int length); 170 + 171 + int zd_mac_set_regdomain(struct zd_mac *zd_mac, u8 regdomain); 172 + u8 zd_mac_get_regdomain(struct zd_mac *zd_mac); 173 + 174 + int zd_mac_request_channel(struct zd_mac *mac, u8 channel); 175 + int zd_mac_get_channel(struct zd_mac *mac, u8 *channel, u8 *flags); 176 + 177 + int zd_mac_set_mode(struct zd_mac *mac, u32 mode); 178 + int zd_mac_get_mode(struct zd_mac *mac, u32 *mode); 179 + 180 + int zd_mac_get_range(struct zd_mac *mac, struct iw_range *range); 181 + 182 + struct iw_statistics *zd_mac_get_wireless_stats(struct net_device *ndev); 183 + 184 + #ifdef DEBUG 185 + void zd_dump_rx_status(const struct rx_status *status); 186 + #else 187 + #define zd_dump_rx_status(status) 188 + #endif /* DEBUG */ 189 + 190 + #endif /* _ZD_MAC_H */
+267
drivers/net/wireless/zd1211rw/zd_netdev.c
···
··· 1 + /* zd_netdev.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <linux/netdevice.h> 19 + #include <linux/etherdevice.h> 20 + #include <linux/skbuff.h> 21 + #include <net/ieee80211.h> 22 + #include <net/ieee80211softmac.h> 23 + #include <net/ieee80211softmac_wx.h> 24 + #include <net/iw_handler.h> 25 + 26 + #include "zd_def.h" 27 + #include "zd_netdev.h" 28 + #include "zd_mac.h" 29 + #include "zd_ieee80211.h" 30 + 31 + /* Region 0 means reset regdomain to default. */ 32 + static int zd_set_regdomain(struct net_device *netdev, 33 + struct iw_request_info *info, 34 + union iwreq_data *req, char *extra) 35 + { 36 + const u8 *regdomain = (u8 *)req; 37 + return zd_mac_set_regdomain(zd_netdev_mac(netdev), *regdomain); 38 + } 39 + 40 + static int zd_get_regdomain(struct net_device *netdev, 41 + struct iw_request_info *info, 42 + union iwreq_data *req, char *extra) 43 + { 44 + u8 *regdomain = (u8 *)req; 45 + if (!regdomain) 46 + return -EINVAL; 47 + *regdomain = zd_mac_get_regdomain(zd_netdev_mac(netdev)); 48 + return 0; 49 + } 50 + 51 + static const struct iw_priv_args zd_priv_args[] = { 52 + { 53 + .cmd = ZD_PRIV_SET_REGDOMAIN, 54 + .set_args = IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 55 + .name = "set_regdomain", 56 + }, 57 + { 58 + .cmd = ZD_PRIV_GET_REGDOMAIN, 59 + .get_args = IW_PRIV_TYPE_BYTE | IW_PRIV_SIZE_FIXED | 1, 60 + .name = "get_regdomain", 61 + }, 62 + }; 63 + 64 + #define PRIV_OFFSET(x) [(x)-SIOCIWFIRSTPRIV] 65 + 66 + static const iw_handler zd_priv_handler[] = { 67 + PRIV_OFFSET(ZD_PRIV_SET_REGDOMAIN) = zd_set_regdomain, 68 + PRIV_OFFSET(ZD_PRIV_GET_REGDOMAIN) = zd_get_regdomain, 69 + }; 70 + 71 + static int iw_get_name(struct net_device *netdev, 72 + struct iw_request_info *info, 73 + union iwreq_data *req, char *extra) 74 + { 75 + /* FIXME: check whether 802.11a will also supported, add also 76 + * zd1211B, if we support it. 77 + */ 78 + strlcpy(req->name, "802.11g zd1211", IFNAMSIZ); 79 + return 0; 80 + } 81 + 82 + static int iw_set_freq(struct net_device *netdev, 83 + struct iw_request_info *info, 84 + union iwreq_data *req, char *extra) 85 + { 86 + int r; 87 + struct zd_mac *mac = zd_netdev_mac(netdev); 88 + struct iw_freq *freq = &req->freq; 89 + u8 channel; 90 + 91 + r = zd_find_channel(&channel, freq); 92 + if (r < 0) 93 + return r; 94 + r = zd_mac_request_channel(mac, channel); 95 + return r; 96 + } 97 + 98 + static int iw_get_freq(struct net_device *netdev, 99 + struct iw_request_info *info, 100 + union iwreq_data *req, char *extra) 101 + { 102 + int r; 103 + struct zd_mac *mac = zd_netdev_mac(netdev); 104 + struct iw_freq *freq = &req->freq; 105 + u8 channel; 106 + u8 flags; 107 + 108 + r = zd_mac_get_channel(mac, &channel, &flags); 109 + if (r) 110 + return r; 111 + 112 + freq->flags = (flags & MAC_FIXED_CHANNEL) ? 113 + IW_FREQ_FIXED : IW_FREQ_AUTO; 114 + dev_dbg_f(zd_mac_dev(mac), "channel %s\n", 115 + (flags & MAC_FIXED_CHANNEL) ? "fixed" : "auto"); 116 + return zd_channel_to_freq(freq, channel); 117 + } 118 + 119 + static int iw_set_mode(struct net_device *netdev, 120 + struct iw_request_info *info, 121 + union iwreq_data *req, char *extra) 122 + { 123 + return zd_mac_set_mode(zd_netdev_mac(netdev), req->mode); 124 + } 125 + 126 + static int iw_get_mode(struct net_device *netdev, 127 + struct iw_request_info *info, 128 + union iwreq_data *req, char *extra) 129 + { 130 + return zd_mac_get_mode(zd_netdev_mac(netdev), &req->mode); 131 + } 132 + 133 + static int iw_get_range(struct net_device *netdev, 134 + struct iw_request_info *info, 135 + union iwreq_data *req, char *extra) 136 + { 137 + struct iw_range *range = (struct iw_range *)extra; 138 + 139 + dev_dbg_f(zd_mac_dev(zd_netdev_mac(netdev)), "\n"); 140 + req->data.length = sizeof(*range); 141 + return zd_mac_get_range(zd_netdev_mac(netdev), range); 142 + } 143 + 144 + static int iw_set_encode(struct net_device *netdev, 145 + struct iw_request_info *info, 146 + union iwreq_data *data, 147 + char *extra) 148 + { 149 + return ieee80211_wx_set_encode(zd_netdev_ieee80211(netdev), info, 150 + data, extra); 151 + } 152 + 153 + static int iw_get_encode(struct net_device *netdev, 154 + struct iw_request_info *info, 155 + union iwreq_data *data, 156 + char *extra) 157 + { 158 + return ieee80211_wx_get_encode(zd_netdev_ieee80211(netdev), info, 159 + data, extra); 160 + } 161 + 162 + static int iw_set_encodeext(struct net_device *netdev, 163 + struct iw_request_info *info, 164 + union iwreq_data *data, 165 + char *extra) 166 + { 167 + return ieee80211_wx_set_encodeext(zd_netdev_ieee80211(netdev), info, 168 + data, extra); 169 + } 170 + 171 + static int iw_get_encodeext(struct net_device *netdev, 172 + struct iw_request_info *info, 173 + union iwreq_data *data, 174 + char *extra) 175 + { 176 + return ieee80211_wx_get_encodeext(zd_netdev_ieee80211(netdev), info, 177 + data, extra); 178 + } 179 + 180 + #define WX(x) [(x)-SIOCIWFIRST] 181 + 182 + static const iw_handler zd_standard_iw_handlers[] = { 183 + WX(SIOCGIWNAME) = iw_get_name, 184 + WX(SIOCSIWFREQ) = iw_set_freq, 185 + WX(SIOCGIWFREQ) = iw_get_freq, 186 + WX(SIOCSIWMODE) = iw_set_mode, 187 + WX(SIOCGIWMODE) = iw_get_mode, 188 + WX(SIOCGIWRANGE) = iw_get_range, 189 + WX(SIOCSIWENCODE) = iw_set_encode, 190 + WX(SIOCGIWENCODE) = iw_get_encode, 191 + WX(SIOCSIWENCODEEXT) = iw_set_encodeext, 192 + WX(SIOCGIWENCODEEXT) = iw_get_encodeext, 193 + WX(SIOCSIWAUTH) = ieee80211_wx_set_auth, 194 + WX(SIOCGIWAUTH) = ieee80211_wx_get_auth, 195 + WX(SIOCSIWSCAN) = ieee80211softmac_wx_trigger_scan, 196 + WX(SIOCGIWSCAN) = ieee80211softmac_wx_get_scan_results, 197 + WX(SIOCSIWESSID) = ieee80211softmac_wx_set_essid, 198 + WX(SIOCGIWESSID) = ieee80211softmac_wx_get_essid, 199 + WX(SIOCSIWAP) = ieee80211softmac_wx_set_wap, 200 + WX(SIOCGIWAP) = ieee80211softmac_wx_get_wap, 201 + WX(SIOCSIWRATE) = ieee80211softmac_wx_set_rate, 202 + WX(SIOCGIWRATE) = ieee80211softmac_wx_get_rate, 203 + WX(SIOCSIWGENIE) = ieee80211softmac_wx_set_genie, 204 + WX(SIOCGIWGENIE) = ieee80211softmac_wx_get_genie, 205 + WX(SIOCSIWMLME) = ieee80211softmac_wx_set_mlme, 206 + }; 207 + 208 + static const struct iw_handler_def iw_handler_def = { 209 + .standard = zd_standard_iw_handlers, 210 + .num_standard = ARRAY_SIZE(zd_standard_iw_handlers), 211 + .private = zd_priv_handler, 212 + .num_private = ARRAY_SIZE(zd_priv_handler), 213 + .private_args = zd_priv_args, 214 + .num_private_args = ARRAY_SIZE(zd_priv_args), 215 + .get_wireless_stats = zd_mac_get_wireless_stats, 216 + }; 217 + 218 + struct net_device *zd_netdev_alloc(struct usb_interface *intf) 219 + { 220 + int r; 221 + struct net_device *netdev; 222 + struct zd_mac *mac; 223 + 224 + netdev = alloc_ieee80211softmac(sizeof(struct zd_mac)); 225 + if (!netdev) { 226 + dev_dbg_f(&intf->dev, "out of memory\n"); 227 + return NULL; 228 + } 229 + 230 + mac = zd_netdev_mac(netdev); 231 + r = zd_mac_init(mac, netdev, intf); 232 + if (r) { 233 + usb_set_intfdata(intf, NULL); 234 + free_ieee80211(netdev); 235 + return NULL; 236 + } 237 + 238 + SET_MODULE_OWNER(netdev); 239 + SET_NETDEV_DEV(netdev, &intf->dev); 240 + 241 + dev_dbg_f(&intf->dev, "netdev->flags %#06hx\n", netdev->flags); 242 + dev_dbg_f(&intf->dev, "netdev->features %#010lx\n", netdev->features); 243 + 244 + netdev->open = zd_mac_open; 245 + netdev->stop = zd_mac_stop; 246 + /* netdev->get_stats = */ 247 + /* netdev->set_multicast_list = */ 248 + netdev->set_mac_address = zd_mac_set_mac_address; 249 + netdev->wireless_handlers = &iw_handler_def; 250 + /* netdev->ethtool_ops = */ 251 + 252 + return netdev; 253 + } 254 + 255 + void zd_netdev_free(struct net_device *netdev) 256 + { 257 + if (!netdev) 258 + return; 259 + 260 + zd_mac_clear(zd_netdev_mac(netdev)); 261 + free_ieee80211(netdev); 262 + } 263 + 264 + void zd_netdev_disconnect(struct net_device *netdev) 265 + { 266 + unregister_netdev(netdev); 267 + }
+45
drivers/net/wireless/zd1211rw/zd_netdev.h
···
··· 1 + /* zd_netdev.h: Header for net device related functions. 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_NETDEV_H 19 + #define _ZD_NETDEV_H 20 + 21 + #include <linux/usb.h> 22 + #include <linux/netdevice.h> 23 + #include <net/ieee80211.h> 24 + 25 + #define ZD_PRIV_SET_REGDOMAIN (SIOCIWFIRSTPRIV) 26 + #define ZD_PRIV_GET_REGDOMAIN (SIOCIWFIRSTPRIV+1) 27 + 28 + static inline struct ieee80211_device *zd_netdev_ieee80211( 29 + struct net_device *ndev) 30 + { 31 + return netdev_priv(ndev); 32 + } 33 + 34 + static inline struct net_device *zd_ieee80211_to_netdev( 35 + struct ieee80211_device *ieee) 36 + { 37 + return ieee->dev; 38 + } 39 + 40 + struct net_device *zd_netdev_alloc(struct usb_interface *intf); 41 + void zd_netdev_free(struct net_device *netdev); 42 + 43 + void zd_netdev_disconnect(struct net_device *netdev); 44 + 45 + #endif /* _ZD_NETDEV_H */
+151
drivers/net/wireless/zd1211rw/zd_rf.c
···
··· 1 + /* zd_rf.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <linux/errno.h> 19 + #include <linux/string.h> 20 + 21 + #include "zd_def.h" 22 + #include "zd_rf.h" 23 + #include "zd_ieee80211.h" 24 + #include "zd_chip.h" 25 + 26 + static const char *rfs[] = { 27 + [0] = "unknown RF0", 28 + [1] = "unknown RF1", 29 + [UW2451_RF] = "UW2451_RF", 30 + [UCHIP_RF] = "UCHIP_RF", 31 + [AL2230_RF] = "AL2230_RF", 32 + [AL7230B_RF] = "AL7230B_RF", 33 + [THETA_RF] = "THETA_RF", 34 + [AL2210_RF] = "AL2210_RF", 35 + [MAXIM_NEW_RF] = "MAXIM_NEW_RF", 36 + [UW2453_RF] = "UW2453_RF", 37 + [AL2230S_RF] = "AL2230S_RF", 38 + [RALINK_RF] = "RALINK_RF", 39 + [INTERSIL_RF] = "INTERSIL_RF", 40 + [RF2959_RF] = "RF2959_RF", 41 + [MAXIM_NEW2_RF] = "MAXIM_NEW2_RF", 42 + [PHILIPS_RF] = "PHILIPS_RF", 43 + }; 44 + 45 + const char *zd_rf_name(u8 type) 46 + { 47 + if (type & 0xf0) 48 + type = 0; 49 + return rfs[type]; 50 + } 51 + 52 + void zd_rf_init(struct zd_rf *rf) 53 + { 54 + memset(rf, 0, sizeof(*rf)); 55 + } 56 + 57 + void zd_rf_clear(struct zd_rf *rf) 58 + { 59 + memset(rf, 0, sizeof(*rf)); 60 + } 61 + 62 + int zd_rf_init_hw(struct zd_rf *rf, u8 type) 63 + { 64 + int r, t; 65 + struct zd_chip *chip = zd_rf_to_chip(rf); 66 + 67 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 68 + switch (type) { 69 + case RF2959_RF: 70 + r = zd_rf_init_rf2959(rf); 71 + if (r) 72 + return r; 73 + break; 74 + case AL2230_RF: 75 + r = zd_rf_init_al2230(rf); 76 + if (r) 77 + return r; 78 + break; 79 + default: 80 + dev_err(zd_chip_dev(chip), 81 + "RF %s %#x is not supported\n", zd_rf_name(type), type); 82 + rf->type = 0; 83 + return -ENODEV; 84 + } 85 + 86 + rf->type = type; 87 + 88 + r = zd_chip_lock_phy_regs(chip); 89 + if (r) 90 + return r; 91 + t = rf->init_hw(rf); 92 + r = zd_chip_unlock_phy_regs(chip); 93 + if (t) 94 + r = t; 95 + return r; 96 + } 97 + 98 + int zd_rf_scnprint_id(struct zd_rf *rf, char *buffer, size_t size) 99 + { 100 + return scnprintf(buffer, size, "%s", zd_rf_name(rf->type)); 101 + } 102 + 103 + int zd_rf_set_channel(struct zd_rf *rf, u8 channel) 104 + { 105 + int r; 106 + 107 + ZD_ASSERT(mutex_is_locked(&zd_rf_to_chip(rf)->mutex)); 108 + if (channel < MIN_CHANNEL24) 109 + return -EINVAL; 110 + if (channel > MAX_CHANNEL24) 111 + return -EINVAL; 112 + dev_dbg_f(zd_chip_dev(zd_rf_to_chip(rf)), "channel: %d\n", channel); 113 + 114 + r = rf->set_channel(rf, channel); 115 + if (r >= 0) 116 + rf->channel = channel; 117 + return r; 118 + } 119 + 120 + int zd_switch_radio_on(struct zd_rf *rf) 121 + { 122 + int r, t; 123 + struct zd_chip *chip = zd_rf_to_chip(rf); 124 + 125 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 126 + r = zd_chip_lock_phy_regs(chip); 127 + if (r) 128 + return r; 129 + t = rf->switch_radio_on(rf); 130 + r = zd_chip_unlock_phy_regs(chip); 131 + if (t) 132 + r = t; 133 + return r; 134 + } 135 + 136 + int zd_switch_radio_off(struct zd_rf *rf) 137 + { 138 + int r, t; 139 + struct zd_chip *chip = zd_rf_to_chip(rf); 140 + 141 + /* TODO: move phy regs handling to zd_chip */ 142 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 143 + r = zd_chip_lock_phy_regs(chip); 144 + if (r) 145 + return r; 146 + t = rf->switch_radio_off(rf); 147 + r = zd_chip_unlock_phy_regs(chip); 148 + if (t) 149 + r = t; 150 + return r; 151 + }
+82
drivers/net/wireless/zd1211rw/zd_rf.h
···
··· 1 + /* zd_rf.h 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_RF_H 19 + #define _ZD_RF_H 20 + 21 + #include "zd_types.h" 22 + 23 + #define UW2451_RF 0x2 24 + #define UCHIP_RF 0x3 25 + #define AL2230_RF 0x4 26 + #define AL7230B_RF 0x5 /* a,b,g */ 27 + #define THETA_RF 0x6 28 + #define AL2210_RF 0x7 29 + #define MAXIM_NEW_RF 0x8 30 + #define UW2453_RF 0x9 31 + #define AL2230S_RF 0xa 32 + #define RALINK_RF 0xb 33 + #define INTERSIL_RF 0xc 34 + #define RF2959_RF 0xd 35 + #define MAXIM_NEW2_RF 0xe 36 + #define PHILIPS_RF 0xf 37 + 38 + #define RF_CHANNEL(ch) [(ch)-1] 39 + 40 + /* Provides functions of the RF transceiver. */ 41 + 42 + enum { 43 + RF_REG_BITS = 6, 44 + RF_VALUE_BITS = 18, 45 + RF_RV_BITS = RF_REG_BITS + RF_VALUE_BITS, 46 + }; 47 + 48 + struct zd_rf { 49 + u8 type; 50 + 51 + u8 channel; 52 + /* 53 + * Whether this RF should patch the 6M band edge 54 + * (assuming E2P_POD agrees) 55 + */ 56 + u8 patch_6m_band_edge:1; 57 + 58 + /* RF-specific functions */ 59 + int (*init_hw)(struct zd_rf *rf); 60 + int (*set_channel)(struct zd_rf *rf, u8 channel); 61 + int (*switch_radio_on)(struct zd_rf *rf); 62 + int (*switch_radio_off)(struct zd_rf *rf); 63 + }; 64 + 65 + const char *zd_rf_name(u8 type); 66 + void zd_rf_init(struct zd_rf *rf); 67 + void zd_rf_clear(struct zd_rf *rf); 68 + int zd_rf_init_hw(struct zd_rf *rf, u8 type); 69 + 70 + int zd_rf_scnprint_id(struct zd_rf *rf, char *buffer, size_t size); 71 + 72 + int zd_rf_set_channel(struct zd_rf *rf, u8 channel); 73 + 74 + int zd_switch_radio_on(struct zd_rf *rf); 75 + int zd_switch_radio_off(struct zd_rf *rf); 76 + 77 + /* Functions for individual RF chips */ 78 + 79 + int zd_rf_init_rf2959(struct zd_rf *rf); 80 + int zd_rf_init_al2230(struct zd_rf *rf); 81 + 82 + #endif /* _ZD_RF_H */
+308
drivers/net/wireless/zd1211rw/zd_rf_al2230.c
···
··· 1 + /* zd_rf_al2230.c: Functions for the AL2230 RF controller 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <linux/kernel.h> 19 + 20 + #include "zd_rf.h" 21 + #include "zd_usb.h" 22 + #include "zd_chip.h" 23 + 24 + static const u32 al2230_table[][3] = { 25 + RF_CHANNEL( 1) = { 0x03f790, 0x033331, 0x00000d, }, 26 + RF_CHANNEL( 2) = { 0x03f790, 0x0b3331, 0x00000d, }, 27 + RF_CHANNEL( 3) = { 0x03e790, 0x033331, 0x00000d, }, 28 + RF_CHANNEL( 4) = { 0x03e790, 0x0b3331, 0x00000d, }, 29 + RF_CHANNEL( 5) = { 0x03f7a0, 0x033331, 0x00000d, }, 30 + RF_CHANNEL( 6) = { 0x03f7a0, 0x0b3331, 0x00000d, }, 31 + RF_CHANNEL( 7) = { 0x03e7a0, 0x033331, 0x00000d, }, 32 + RF_CHANNEL( 8) = { 0x03e7a0, 0x0b3331, 0x00000d, }, 33 + RF_CHANNEL( 9) = { 0x03f7b0, 0x033331, 0x00000d, }, 34 + RF_CHANNEL(10) = { 0x03f7b0, 0x0b3331, 0x00000d, }, 35 + RF_CHANNEL(11) = { 0x03e7b0, 0x033331, 0x00000d, }, 36 + RF_CHANNEL(12) = { 0x03e7b0, 0x0b3331, 0x00000d, }, 37 + RF_CHANNEL(13) = { 0x03f7c0, 0x033331, 0x00000d, }, 38 + RF_CHANNEL(14) = { 0x03e7c0, 0x066661, 0x00000d, }, 39 + }; 40 + 41 + static int zd1211_al2230_init_hw(struct zd_rf *rf) 42 + { 43 + int r; 44 + struct zd_chip *chip = zd_rf_to_chip(rf); 45 + 46 + static const struct zd_ioreq16 ioreqs[] = { 47 + { CR15, 0x20 }, { CR23, 0x40 }, { CR24, 0x20 }, 48 + { CR26, 0x11 }, { CR28, 0x3e }, { CR29, 0x00 }, 49 + { CR44, 0x33 }, { CR106, 0x2a }, { CR107, 0x1a }, 50 + { CR109, 0x09 }, { CR110, 0x27 }, { CR111, 0x2b }, 51 + { CR112, 0x2b }, { CR119, 0x0a }, { CR10, 0x89 }, 52 + /* for newest (3rd cut) AL2300 */ 53 + { CR17, 0x28 }, 54 + { CR26, 0x93 }, { CR34, 0x30 }, 55 + /* for newest (3rd cut) AL2300 */ 56 + { CR35, 0x3e }, 57 + { CR41, 0x24 }, { CR44, 0x32 }, 58 + /* for newest (3rd cut) AL2300 */ 59 + { CR46, 0x96 }, 60 + { CR47, 0x1e }, { CR79, 0x58 }, { CR80, 0x30 }, 61 + { CR81, 0x30 }, { CR87, 0x0a }, { CR89, 0x04 }, 62 + { CR92, 0x0a }, { CR99, 0x28 }, { CR100, 0x00 }, 63 + { CR101, 0x13 }, { CR102, 0x27 }, { CR106, 0x24 }, 64 + { CR107, 0x2a }, { CR109, 0x09 }, { CR110, 0x13 }, 65 + { CR111, 0x1f }, { CR112, 0x1f }, { CR113, 0x27 }, 66 + { CR114, 0x27 }, 67 + /* for newest (3rd cut) AL2300 */ 68 + { CR115, 0x24 }, 69 + { CR116, 0x24 }, { CR117, 0xf4 }, { CR118, 0xfc }, 70 + { CR119, 0x10 }, { CR120, 0x4f }, { CR121, 0x77 }, 71 + { CR122, 0xe0 }, { CR137, 0x88 }, { CR252, 0xff }, 72 + { CR253, 0xff }, 73 + 74 + /* These following happen separately in the vendor driver */ 75 + { }, 76 + 77 + /* shdnb(PLL_ON)=0 */ 78 + { CR251, 0x2f }, 79 + /* shdnb(PLL_ON)=1 */ 80 + { CR251, 0x3f }, 81 + { CR138, 0x28 }, { CR203, 0x06 }, 82 + }; 83 + 84 + static const u32 rv[] = { 85 + /* Channel 1 */ 86 + 0x03f790, 87 + 0x033331, 88 + 0x00000d, 89 + 90 + 0x0b3331, 91 + 0x03b812, 92 + 0x00fff3, 93 + 0x000da4, 94 + 0x0f4dc5, /* fix freq shift, 0x04edc5 */ 95 + 0x0805b6, 96 + 0x011687, 97 + 0x000688, 98 + 0x0403b9, /* external control TX power (CR31) */ 99 + 0x00dbba, 100 + 0x00099b, 101 + 0x0bdffc, 102 + 0x00000d, 103 + 0x00500f, 104 + 105 + /* These writes happen separately in the vendor driver */ 106 + 0x00d00f, 107 + 0x004c0f, 108 + 0x00540f, 109 + 0x00700f, 110 + 0x00500f, 111 + }; 112 + 113 + r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 114 + if (r) 115 + return r; 116 + 117 + r = zd_rfwritev_locked(chip, rv, ARRAY_SIZE(rv), RF_RV_BITS); 118 + if (r) 119 + return r; 120 + 121 + return 0; 122 + } 123 + 124 + static int zd1211b_al2230_init_hw(struct zd_rf *rf) 125 + { 126 + int r; 127 + struct zd_chip *chip = zd_rf_to_chip(rf); 128 + 129 + static const struct zd_ioreq16 ioreqs1[] = { 130 + { CR10, 0x89 }, { CR15, 0x20 }, 131 + { CR17, 0x2B }, /* for newest(3rd cut) AL2230 */ 132 + { CR23, 0x40 }, { CR24, 0x20 }, { CR26, 0x93 }, 133 + { CR28, 0x3e }, { CR29, 0x00 }, 134 + { CR33, 0x28 }, /* 5621 */ 135 + { CR34, 0x30 }, 136 + { CR35, 0x3e }, /* for newest(3rd cut) AL2230 */ 137 + { CR41, 0x24 }, { CR44, 0x32 }, 138 + { CR46, 0x99 }, /* for newest(3rd cut) AL2230 */ 139 + { CR47, 0x1e }, 140 + 141 + /* ZD1211B 05.06.10 */ 142 + { CR48, 0x00 }, { CR49, 0x00 }, { CR51, 0x01 }, 143 + { CR52, 0x80 }, { CR53, 0x7e }, { CR65, 0x00 }, 144 + { CR66, 0x00 }, { CR67, 0x00 }, { CR68, 0x00 }, 145 + { CR69, 0x28 }, 146 + 147 + { CR79, 0x58 }, { CR80, 0x30 }, { CR81, 0x30 }, 148 + { CR87, 0x0a }, { CR89, 0x04 }, 149 + { CR91, 0x00 }, /* 5621 */ 150 + { CR92, 0x0a }, 151 + { CR98, 0x8d }, /* 4804, for 1212 new algorithm */ 152 + { CR99, 0x00 }, /* 5621 */ 153 + { CR101, 0x13 }, { CR102, 0x27 }, 154 + { CR106, 0x24 }, /* for newest(3rd cut) AL2230 */ 155 + { CR107, 0x2a }, 156 + { CR109, 0x13 }, /* 4804, for 1212 new algorithm */ 157 + { CR110, 0x1f }, /* 4804, for 1212 new algorithm */ 158 + { CR111, 0x1f }, { CR112, 0x1f }, { CR113, 0x27 }, 159 + { CR114, 0x27 }, 160 + { CR115, 0x26 }, /* 24->26 at 4902 for newest(3rd cut) AL2230 */ 161 + { CR116, 0x24 }, 162 + { CR117, 0xfa }, /* for 1211b */ 163 + { CR118, 0xfa }, /* for 1211b */ 164 + { CR119, 0x10 }, 165 + { CR120, 0x4f }, 166 + { CR121, 0x6c }, /* for 1211b */ 167 + { CR122, 0xfc }, /* E0->FC at 4902 */ 168 + { CR123, 0x57 }, /* 5623 */ 169 + { CR125, 0xad }, /* 4804, for 1212 new algorithm */ 170 + { CR126, 0x6c }, /* 5614 */ 171 + { CR127, 0x03 }, /* 4804, for 1212 new algorithm */ 172 + { CR137, 0x50 }, /* 5614 */ 173 + { CR138, 0xa8 }, 174 + { CR144, 0xac }, /* 5621 */ 175 + { CR150, 0x0d }, { CR252, 0x00 }, { CR253, 0x00 }, 176 + }; 177 + 178 + static const u32 rv1[] = { 179 + /* channel 1 */ 180 + 0x03f790, 181 + 0x033331, 182 + 0x00000d, 183 + 184 + 0x0b3331, 185 + 0x03b812, 186 + 0x00fff3, 187 + 0x0005a4, 188 + 0x0f4dc5, /* fix freq shift 0x044dc5 */ 189 + 0x0805b6, 190 + 0x0146c7, 191 + 0x000688, 192 + 0x0403b9, /* External control TX power (CR31) */ 193 + 0x00dbba, 194 + 0x00099b, 195 + 0x0bdffc, 196 + 0x00000d, 197 + 0x00580f, 198 + }; 199 + 200 + static const struct zd_ioreq16 ioreqs2[] = { 201 + { CR47, 0x1e }, { CR_RFCFG, 0x03 }, 202 + }; 203 + 204 + static const u32 rv2[] = { 205 + 0x00880f, 206 + 0x00080f, 207 + }; 208 + 209 + static const struct zd_ioreq16 ioreqs3[] = { 210 + { CR_RFCFG, 0x00 }, { CR47, 0x1e }, { CR251, 0x7f }, 211 + }; 212 + 213 + static const u32 rv3[] = { 214 + 0x00d80f, 215 + 0x00780f, 216 + 0x00580f, 217 + }; 218 + 219 + static const struct zd_ioreq16 ioreqs4[] = { 220 + { CR138, 0x28 }, { CR203, 0x06 }, 221 + }; 222 + 223 + r = zd_iowrite16a_locked(chip, ioreqs1, ARRAY_SIZE(ioreqs1)); 224 + if (r) 225 + return r; 226 + r = zd_rfwritev_locked(chip, rv1, ARRAY_SIZE(rv1), RF_RV_BITS); 227 + if (r) 228 + return r; 229 + r = zd_iowrite16a_locked(chip, ioreqs2, ARRAY_SIZE(ioreqs2)); 230 + if (r) 231 + return r; 232 + r = zd_rfwritev_locked(chip, rv2, ARRAY_SIZE(rv2), RF_RV_BITS); 233 + if (r) 234 + return r; 235 + r = zd_iowrite16a_locked(chip, ioreqs3, ARRAY_SIZE(ioreqs3)); 236 + if (r) 237 + return r; 238 + r = zd_rfwritev_locked(chip, rv3, ARRAY_SIZE(rv3), RF_RV_BITS); 239 + if (r) 240 + return r; 241 + return zd_iowrite16a_locked(chip, ioreqs4, ARRAY_SIZE(ioreqs4)); 242 + } 243 + 244 + static int al2230_set_channel(struct zd_rf *rf, u8 channel) 245 + { 246 + int r; 247 + const u32 *rv = al2230_table[channel-1]; 248 + struct zd_chip *chip = zd_rf_to_chip(rf); 249 + static const struct zd_ioreq16 ioreqs[] = { 250 + { CR138, 0x28 }, 251 + { CR203, 0x06 }, 252 + }; 253 + 254 + r = zd_rfwritev_locked(chip, rv, 3, RF_RV_BITS); 255 + if (r) 256 + return r; 257 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 258 + } 259 + 260 + static int zd1211_al2230_switch_radio_on(struct zd_rf *rf) 261 + { 262 + struct zd_chip *chip = zd_rf_to_chip(rf); 263 + static const struct zd_ioreq16 ioreqs[] = { 264 + { CR11, 0x00 }, 265 + { CR251, 0x3f }, 266 + }; 267 + 268 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 269 + } 270 + 271 + static int zd1211b_al2230_switch_radio_on(struct zd_rf *rf) 272 + { 273 + struct zd_chip *chip = zd_rf_to_chip(rf); 274 + static const struct zd_ioreq16 ioreqs[] = { 275 + { CR11, 0x00 }, 276 + { CR251, 0x7f }, 277 + }; 278 + 279 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 280 + } 281 + 282 + static int al2230_switch_radio_off(struct zd_rf *rf) 283 + { 284 + struct zd_chip *chip = zd_rf_to_chip(rf); 285 + static const struct zd_ioreq16 ioreqs[] = { 286 + { CR11, 0x04 }, 287 + { CR251, 0x2f }, 288 + }; 289 + 290 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 291 + } 292 + 293 + int zd_rf_init_al2230(struct zd_rf *rf) 294 + { 295 + struct zd_chip *chip = zd_rf_to_chip(rf); 296 + 297 + rf->set_channel = al2230_set_channel; 298 + rf->switch_radio_off = al2230_switch_radio_off; 299 + if (chip->is_zd1211b) { 300 + rf->init_hw = zd1211b_al2230_init_hw; 301 + rf->switch_radio_on = zd1211b_al2230_switch_radio_on; 302 + } else { 303 + rf->init_hw = zd1211_al2230_init_hw; 304 + rf->switch_radio_on = zd1211_al2230_switch_radio_on; 305 + } 306 + rf->patch_6m_band_edge = 1; 307 + return 0; 308 + }
+279
drivers/net/wireless/zd1211rw/zd_rf_rf2959.c
···
··· 1 + /* zd_rf_rfmd.c: Functions for the RFMD RF controller 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <linux/kernel.h> 19 + 20 + #include "zd_rf.h" 21 + #include "zd_usb.h" 22 + #include "zd_chip.h" 23 + 24 + static u32 rf2959_table[][2] = { 25 + RF_CHANNEL( 1) = { 0x181979, 0x1e6666 }, 26 + RF_CHANNEL( 2) = { 0x181989, 0x1e6666 }, 27 + RF_CHANNEL( 3) = { 0x181999, 0x1e6666 }, 28 + RF_CHANNEL( 4) = { 0x1819a9, 0x1e6666 }, 29 + RF_CHANNEL( 5) = { 0x1819b9, 0x1e6666 }, 30 + RF_CHANNEL( 6) = { 0x1819c9, 0x1e6666 }, 31 + RF_CHANNEL( 7) = { 0x1819d9, 0x1e6666 }, 32 + RF_CHANNEL( 8) = { 0x1819e9, 0x1e6666 }, 33 + RF_CHANNEL( 9) = { 0x1819f9, 0x1e6666 }, 34 + RF_CHANNEL(10) = { 0x181a09, 0x1e6666 }, 35 + RF_CHANNEL(11) = { 0x181a19, 0x1e6666 }, 36 + RF_CHANNEL(12) = { 0x181a29, 0x1e6666 }, 37 + RF_CHANNEL(13) = { 0x181a39, 0x1e6666 }, 38 + RF_CHANNEL(14) = { 0x181a60, 0x1c0000 }, 39 + }; 40 + 41 + #if 0 42 + static int bits(u32 rw, int from, int to) 43 + { 44 + rw &= ~(0xffffffffU << (to+1)); 45 + rw >>= from; 46 + return rw; 47 + } 48 + 49 + static int bit(u32 rw, int bit) 50 + { 51 + return bits(rw, bit, bit); 52 + } 53 + 54 + static void dump_regwrite(u32 rw) 55 + { 56 + int reg = bits(rw, 18, 22); 57 + int rw_flag = bits(rw, 23, 23); 58 + PDEBUG("rf2959 %#010x reg %d rw %d", rw, reg, rw_flag); 59 + 60 + switch (reg) { 61 + case 0: 62 + PDEBUG("reg0 CFG1 ref_sel %d hybernate %d rf_vco_reg_en %d" 63 + " if_vco_reg_en %d if_vga_en %d", 64 + bits(rw, 14, 15), bit(rw, 3), bit(rw, 2), bit(rw, 1), 65 + bit(rw, 0)); 66 + break; 67 + case 1: 68 + PDEBUG("reg1 IFPLL1 pll_en1 %d kv_en1 %d vtc_en1 %d lpf1 %d" 69 + " cpl1 %d pdp1 %d autocal_en1 %d ld_en1 %d ifloopr %d" 70 + " ifloopc %d dac1 %d", 71 + bit(rw, 17), bit(rw, 16), bit(rw, 15), bit(rw, 14), 72 + bit(rw, 13), bit(rw, 12), bit(rw, 11), bit(rw, 10), 73 + bits(rw, 7, 9), bits(rw, 4, 6), bits(rw, 0, 3)); 74 + break; 75 + case 2: 76 + PDEBUG("reg2 IFPLL2 n1 %d num1 %d", 77 + bits(rw, 6, 17), bits(rw, 0, 5)); 78 + break; 79 + case 3: 80 + PDEBUG("reg3 IFPLL3 num %d", bits(rw, 0, 17)); 81 + break; 82 + case 4: 83 + PDEBUG("reg4 IFPLL4 dn1 %#04x ct_def1 %d kv_def1 %d", 84 + bits(rw, 8, 16), bits(rw, 4, 7), bits(rw, 0, 3)); 85 + break; 86 + case 5: 87 + PDEBUG("reg5 RFPLL1 pll_en %d kv_en %d vtc_en %d lpf %d cpl %d" 88 + " pdp %d autocal_en %d ld_en %d rfloopr %d rfloopc %d" 89 + " dac %d", 90 + bit(rw, 17), bit(rw, 16), bit(rw, 15), bit(rw, 14), 91 + bit(rw, 13), bit(rw, 12), bit(rw, 11), bit(rw, 10), 92 + bits(rw, 7, 9), bits(rw, 4, 6), bits(rw, 0,3)); 93 + break; 94 + case 6: 95 + PDEBUG("reg6 RFPLL2 n %d num %d", 96 + bits(rw, 6, 17), bits(rw, 0, 5)); 97 + break; 98 + case 7: 99 + PDEBUG("reg7 RFPLL3 num2 %d", bits(rw, 0, 17)); 100 + break; 101 + case 8: 102 + PDEBUG("reg8 RFPLL4 dn %#06x ct_def %d kv_def %d", 103 + bits(rw, 8, 16), bits(rw, 4, 7), bits(rw, 0, 3)); 104 + break; 105 + case 9: 106 + PDEBUG("reg9 CAL1 tvco %d tlock %d m_ct_value %d ld_window %d", 107 + bits(rw, 13, 17), bits(rw, 8, 12), bits(rw, 3, 7), 108 + bits(rw, 0, 2)); 109 + break; 110 + case 10: 111 + PDEBUG("reg10 TXRX1 rxdcfbbyps %d pcontrol %d txvgc %d" 112 + " rxlpfbw %d txlpfbw %d txdiffmode %d txenmode %d" 113 + " intbiasen %d tybypass %d", 114 + bit(rw, 17), bits(rw, 15, 16), bits(rw, 10, 14), 115 + bits(rw, 7, 9), bits(rw, 4, 6), bit(rw, 3), bit(rw, 2), 116 + bit(rw, 1), bit(rw, 0)); 117 + break; 118 + case 11: 119 + PDEBUG("reg11 PCNT1 mid_bias %d p_desired %d pc_offset %d" 120 + " tx_delay %d", 121 + bits(rw, 15, 17), bits(rw, 9, 14), bits(rw, 3, 8), 122 + bits(rw, 0, 2)); 123 + break; 124 + case 12: 125 + PDEBUG("reg12 PCNT2 max_power %d mid_power %d min_power %d", 126 + bits(rw, 12, 17), bits(rw, 6, 11), bits(rw, 0, 5)); 127 + break; 128 + case 13: 129 + PDEBUG("reg13 VCOT1 rfpll vco comp %d ifpll vco comp %d" 130 + " lobias %d if_biasbuf %d if_biasvco %d rf_biasbuf %d" 131 + " rf_biasvco %d", 132 + bit(rw, 17), bit(rw, 16), bit(rw, 15), 133 + bits(rw, 8, 9), bits(rw, 5, 7), bits(rw, 3, 4), 134 + bits(rw, 0, 2)); 135 + break; 136 + case 14: 137 + PDEBUG("reg14 IQCAL rx_acal %d rx_pcal %d" 138 + " tx_acal %d tx_pcal %d", 139 + bits(rw, 13, 17), bits(rw, 9, 12), bits(rw, 4, 8), 140 + bits(rw, 0, 3)); 141 + break; 142 + } 143 + } 144 + #endif /* 0 */ 145 + 146 + static int rf2959_init_hw(struct zd_rf *rf) 147 + { 148 + int r; 149 + struct zd_chip *chip = zd_rf_to_chip(rf); 150 + 151 + static const struct zd_ioreq16 ioreqs[] = { 152 + { CR2, 0x1E }, { CR9, 0x20 }, { CR10, 0x89 }, 153 + { CR11, 0x00 }, { CR15, 0xD0 }, { CR17, 0x68 }, 154 + { CR19, 0x4a }, { CR20, 0x0c }, { CR21, 0x0E }, 155 + { CR23, 0x48 }, 156 + /* normal size for cca threshold */ 157 + { CR24, 0x14 }, 158 + /* { CR24, 0x20 }, */ 159 + { CR26, 0x90 }, { CR27, 0x30 }, { CR29, 0x20 }, 160 + { CR31, 0xb2 }, { CR32, 0x43 }, { CR33, 0x28 }, 161 + { CR38, 0x30 }, { CR34, 0x0f }, { CR35, 0xF0 }, 162 + { CR41, 0x2a }, { CR46, 0x7F }, { CR47, 0x1E }, 163 + { CR51, 0xc5 }, { CR52, 0xc5 }, { CR53, 0xc5 }, 164 + { CR79, 0x58 }, { CR80, 0x30 }, { CR81, 0x30 }, 165 + { CR82, 0x00 }, { CR83, 0x24 }, { CR84, 0x04 }, 166 + { CR85, 0x00 }, { CR86, 0x10 }, { CR87, 0x2A }, 167 + { CR88, 0x10 }, { CR89, 0x24 }, { CR90, 0x18 }, 168 + /* { CR91, 0x18 }, */ 169 + /* should solve continous CTS frame problems */ 170 + { CR91, 0x00 }, 171 + { CR92, 0x0a }, { CR93, 0x00 }, { CR94, 0x01 }, 172 + { CR95, 0x00 }, { CR96, 0x40 }, { CR97, 0x37 }, 173 + { CR98, 0x05 }, { CR99, 0x28 }, { CR100, 0x00 }, 174 + { CR101, 0x13 }, { CR102, 0x27 }, { CR103, 0x27 }, 175 + { CR104, 0x18 }, { CR105, 0x12 }, 176 + /* normal size */ 177 + { CR106, 0x1a }, 178 + /* { CR106, 0x22 }, */ 179 + { CR107, 0x24 }, { CR108, 0x0a }, { CR109, 0x13 }, 180 + { CR110, 0x2F }, { CR111, 0x27 }, { CR112, 0x27 }, 181 + { CR113, 0x27 }, { CR114, 0x27 }, { CR115, 0x40 }, 182 + { CR116, 0x40 }, { CR117, 0xF0 }, { CR118, 0xF0 }, 183 + { CR119, 0x16 }, 184 + /* no TX continuation */ 185 + { CR122, 0x00 }, 186 + /* { CR122, 0xff }, */ 187 + { CR127, 0x03 }, { CR131, 0x08 }, { CR138, 0x28 }, 188 + { CR148, 0x44 }, { CR150, 0x10 }, { CR169, 0xBB }, 189 + { CR170, 0xBB }, 190 + }; 191 + 192 + static const u32 rv[] = { 193 + 0x000007, /* REG0(CFG1) */ 194 + 0x07dd43, /* REG1(IFPLL1) */ 195 + 0x080959, /* REG2(IFPLL2) */ 196 + 0x0e6666, 197 + 0x116a57, /* REG4 */ 198 + 0x17dd43, /* REG5 */ 199 + 0x1819f9, /* REG6 */ 200 + 0x1e6666, 201 + 0x214554, 202 + 0x25e7fa, 203 + 0x27fffa, 204 + /* The Zydas driver somehow forgets to set this value. It's 205 + * only set for Japan. We are using internal power control 206 + * for now. 207 + */ 208 + 0x294128, /* internal power */ 209 + /* 0x28252c, */ /* External control TX power */ 210 + /* CR31_CCK, CR51_6-36M, CR52_48M, CR53_54M */ 211 + 0x2c0000, 212 + 0x300000, 213 + 0x340000, /* REG13(0xD) */ 214 + 0x381e0f, /* REG14(0xE) */ 215 + /* Bogus, RF2959's data sheet doesn't know register 27, which is 216 + * actually referenced here. The commented 0x11 is 17. 217 + */ 218 + 0x6c180f, /* REG27(0x11) */ 219 + }; 220 + 221 + r = zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 222 + if (r) 223 + return r; 224 + 225 + return zd_rfwritev_locked(chip, rv, ARRAY_SIZE(rv), RF_RV_BITS); 226 + } 227 + 228 + static int rf2959_set_channel(struct zd_rf *rf, u8 channel) 229 + { 230 + int i, r; 231 + u32 *rv = rf2959_table[channel-1]; 232 + struct zd_chip *chip = zd_rf_to_chip(rf); 233 + 234 + for (i = 0; i < 2; i++) { 235 + r = zd_rfwrite_locked(chip, rv[i], RF_RV_BITS); 236 + if (r) 237 + return r; 238 + } 239 + return 0; 240 + } 241 + 242 + static int rf2959_switch_radio_on(struct zd_rf *rf) 243 + { 244 + static const struct zd_ioreq16 ioreqs[] = { 245 + { CR10, 0x89 }, 246 + { CR11, 0x00 }, 247 + }; 248 + struct zd_chip *chip = zd_rf_to_chip(rf); 249 + 250 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 251 + } 252 + 253 + static int rf2959_switch_radio_off(struct zd_rf *rf) 254 + { 255 + static const struct zd_ioreq16 ioreqs[] = { 256 + { CR10, 0x15 }, 257 + { CR11, 0x81 }, 258 + }; 259 + struct zd_chip *chip = zd_rf_to_chip(rf); 260 + 261 + return zd_iowrite16a_locked(chip, ioreqs, ARRAY_SIZE(ioreqs)); 262 + } 263 + 264 + int zd_rf_init_rf2959(struct zd_rf *rf) 265 + { 266 + struct zd_chip *chip = zd_rf_to_chip(rf); 267 + 268 + if (chip->is_zd1211b) { 269 + dev_err(zd_chip_dev(chip), 270 + "RF2959 is currently not supported for ZD1211B" 271 + " devices\n"); 272 + return -ENODEV; 273 + } 274 + rf->init_hw = rf2959_init_hw; 275 + rf->set_channel = rf2959_set_channel; 276 + rf->switch_radio_on = rf2959_switch_radio_on; 277 + rf->switch_radio_off = rf2959_switch_radio_off; 278 + return 0; 279 + }
+71
drivers/net/wireless/zd1211rw/zd_types.h
···
··· 1 + /* zd_types.h 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_TYPES_H 19 + #define _ZD_TYPES_H 20 + 21 + #include <linux/types.h> 22 + 23 + /* We have three register spaces mapped into the overall USB address space of 24 + * 64K words (16-bit values). There is the control register space of 25 + * double-word registers, the eeprom register space and the firmware register 26 + * space. The control register space is byte mapped, the others are word 27 + * mapped. 28 + * 29 + * For that reason, we are using byte offsets for control registers and word 30 + * offsets for everything else. 31 + */ 32 + 33 + typedef u32 __nocast zd_addr_t; 34 + 35 + enum { 36 + ADDR_BASE_MASK = 0xff000000, 37 + ADDR_OFFSET_MASK = 0x0000ffff, 38 + ADDR_ZERO_MASK = 0x00ff0000, 39 + NULL_BASE = 0x00000000, 40 + USB_BASE = 0x01000000, 41 + CR_BASE = 0x02000000, 42 + CR_MAX_OFFSET = 0x0b30, 43 + E2P_BASE = 0x03000000, 44 + E2P_MAX_OFFSET = 0x007e, 45 + FW_BASE = 0x04000000, 46 + FW_MAX_OFFSET = 0x0005, 47 + }; 48 + 49 + #define ZD_ADDR_BASE(addr) ((u32)(addr) & ADDR_BASE_MASK) 50 + #define ZD_OFFSET(addr) ((u32)(addr) & ADDR_OFFSET_MASK) 51 + 52 + #define ZD_ADDR(base, offset) \ 53 + ((zd_addr_t)(((base) & ADDR_BASE_MASK) | ((offset) & ADDR_OFFSET_MASK))) 54 + 55 + #define ZD_NULL_ADDR ((zd_addr_t)0) 56 + #define USB_REG(offset) ZD_ADDR(USB_BASE, offset) /* word addressing */ 57 + #define CTL_REG(offset) ZD_ADDR(CR_BASE, offset) /* byte addressing */ 58 + #define E2P_REG(offset) ZD_ADDR(E2P_BASE, offset) /* word addressing */ 59 + #define FW_REG(offset) ZD_ADDR(FW_BASE, offset) /* word addressing */ 60 + 61 + static inline zd_addr_t zd_inc_word(zd_addr_t addr) 62 + { 63 + u32 base = ZD_ADDR_BASE(addr); 64 + u32 offset = ZD_OFFSET(addr); 65 + 66 + offset += base == CR_BASE ? 2 : 1; 67 + 68 + return base | offset; 69 + } 70 + 71 + #endif /* _ZD_TYPES_H */
+1316
drivers/net/wireless/zd1211rw/zd_usb.c
···
··· 1 + /* zd_usb.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #include <asm/unaligned.h> 19 + #include <linux/init.h> 20 + #include <linux/module.h> 21 + #include <linux/firmware.h> 22 + #include <linux/device.h> 23 + #include <linux/errno.h> 24 + #include <linux/skbuff.h> 25 + #include <linux/usb.h> 26 + #include <net/ieee80211.h> 27 + 28 + #include "zd_def.h" 29 + #include "zd_netdev.h" 30 + #include "zd_mac.h" 31 + #include "zd_usb.h" 32 + #include "zd_util.h" 33 + 34 + static struct usb_device_id usb_ids[] = { 35 + /* ZD1211 */ 36 + { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 }, 37 + { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 }, 38 + { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 }, 39 + { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, 40 + { USB_DEVICE(0x0df6, 0x9071), .driver_info = DEVICE_ZD1211 }, 41 + { USB_DEVICE(0x157e, 0x300b), .driver_info = DEVICE_ZD1211 }, 42 + /* ZD1211B */ 43 + { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, 44 + { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, 45 + {} 46 + }; 47 + 48 + MODULE_LICENSE("GPL"); 49 + MODULE_DESCRIPTION("USB driver for devices with the ZD1211 chip."); 50 + MODULE_AUTHOR("Ulrich Kunitz"); 51 + MODULE_AUTHOR("Daniel Drake"); 52 + MODULE_VERSION("1.0"); 53 + MODULE_DEVICE_TABLE(usb, usb_ids); 54 + 55 + #define FW_ZD1211_PREFIX "zd1211/zd1211_" 56 + #define FW_ZD1211B_PREFIX "zd1211/zd1211b_" 57 + 58 + /* register address handling */ 59 + 60 + #ifdef DEBUG 61 + static int check_addr(struct zd_usb *usb, zd_addr_t addr) 62 + { 63 + u32 base = ZD_ADDR_BASE(addr); 64 + u32 offset = ZD_OFFSET(addr); 65 + 66 + if ((u32)addr & ADDR_ZERO_MASK) 67 + goto invalid_address; 68 + switch (base) { 69 + case USB_BASE: 70 + break; 71 + case CR_BASE: 72 + if (offset > CR_MAX_OFFSET) { 73 + dev_dbg(zd_usb_dev(usb), 74 + "CR offset %#010x larger than" 75 + " CR_MAX_OFFSET %#10x\n", 76 + offset, CR_MAX_OFFSET); 77 + goto invalid_address; 78 + } 79 + if (offset & 1) { 80 + dev_dbg(zd_usb_dev(usb), 81 + "CR offset %#010x is not a multiple of 2\n", 82 + offset); 83 + goto invalid_address; 84 + } 85 + break; 86 + case E2P_BASE: 87 + if (offset > E2P_MAX_OFFSET) { 88 + dev_dbg(zd_usb_dev(usb), 89 + "E2P offset %#010x larger than" 90 + " E2P_MAX_OFFSET %#010x\n", 91 + offset, E2P_MAX_OFFSET); 92 + goto invalid_address; 93 + } 94 + break; 95 + case FW_BASE: 96 + if (!usb->fw_base_offset) { 97 + dev_dbg(zd_usb_dev(usb), 98 + "ERROR: fw base offset has not been set\n"); 99 + return -EAGAIN; 100 + } 101 + if (offset > FW_MAX_OFFSET) { 102 + dev_dbg(zd_usb_dev(usb), 103 + "FW offset %#10x is larger than" 104 + " FW_MAX_OFFSET %#010x\n", 105 + offset, FW_MAX_OFFSET); 106 + goto invalid_address; 107 + } 108 + break; 109 + default: 110 + dev_dbg(zd_usb_dev(usb), 111 + "address has unsupported base %#010x\n", addr); 112 + goto invalid_address; 113 + } 114 + 115 + return 0; 116 + invalid_address: 117 + dev_dbg(zd_usb_dev(usb), 118 + "ERROR: invalid address: %#010x\n", addr); 119 + return -EINVAL; 120 + } 121 + #endif /* DEBUG */ 122 + 123 + static u16 usb_addr(struct zd_usb *usb, zd_addr_t addr) 124 + { 125 + u32 base; 126 + u16 offset; 127 + 128 + base = ZD_ADDR_BASE(addr); 129 + offset = ZD_OFFSET(addr); 130 + 131 + ZD_ASSERT(check_addr(usb, addr) == 0); 132 + 133 + switch (base) { 134 + case CR_BASE: 135 + offset += CR_BASE_OFFSET; 136 + break; 137 + case E2P_BASE: 138 + offset += E2P_BASE_OFFSET; 139 + break; 140 + case FW_BASE: 141 + offset += usb->fw_base_offset; 142 + break; 143 + } 144 + 145 + return offset; 146 + } 147 + 148 + /* USB device initialization */ 149 + 150 + static int request_fw_file( 151 + const struct firmware **fw, const char *name, struct device *device) 152 + { 153 + int r; 154 + 155 + dev_dbg_f(device, "fw name %s\n", name); 156 + 157 + r = request_firmware(fw, name, device); 158 + if (r) 159 + dev_err(device, 160 + "Could not load firmware file %s. Error number %d\n", 161 + name, r); 162 + return r; 163 + } 164 + 165 + static inline u16 get_bcdDevice(const struct usb_device *udev) 166 + { 167 + return le16_to_cpu(udev->descriptor.bcdDevice); 168 + } 169 + 170 + enum upload_code_flags { 171 + REBOOT = 1, 172 + }; 173 + 174 + /* Ensures that MAX_TRANSFER_SIZE is even. */ 175 + #define MAX_TRANSFER_SIZE (USB_MAX_TRANSFER_SIZE & ~1) 176 + 177 + static int upload_code(struct usb_device *udev, 178 + const u8 *data, size_t size, u16 code_offset, int flags) 179 + { 180 + u8 *p; 181 + int r; 182 + 183 + /* USB request blocks need "kmalloced" buffers. 184 + */ 185 + p = kmalloc(MAX_TRANSFER_SIZE, GFP_KERNEL); 186 + if (!p) { 187 + dev_err(&udev->dev, "out of memory\n"); 188 + r = -ENOMEM; 189 + goto error; 190 + } 191 + 192 + size &= ~1; 193 + while (size > 0) { 194 + size_t transfer_size = size <= MAX_TRANSFER_SIZE ? 195 + size : MAX_TRANSFER_SIZE; 196 + 197 + dev_dbg_f(&udev->dev, "transfer size %zu\n", transfer_size); 198 + 199 + memcpy(p, data, transfer_size); 200 + r = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 201 + USB_REQ_FIRMWARE_DOWNLOAD, 202 + USB_DIR_OUT | USB_TYPE_VENDOR, 203 + code_offset, 0, p, transfer_size, 1000 /* ms */); 204 + if (r < 0) { 205 + dev_err(&udev->dev, 206 + "USB control request for firmware upload" 207 + " failed. Error number %d\n", r); 208 + goto error; 209 + } 210 + transfer_size = r & ~1; 211 + 212 + size -= transfer_size; 213 + data += transfer_size; 214 + code_offset += transfer_size/sizeof(u16); 215 + } 216 + 217 + if (flags & REBOOT) { 218 + u8 ret; 219 + 220 + r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 221 + USB_REQ_FIRMWARE_CONFIRM, 222 + USB_DIR_IN | USB_TYPE_VENDOR, 223 + 0, 0, &ret, sizeof(ret), 5000 /* ms */); 224 + if (r != sizeof(ret)) { 225 + dev_err(&udev->dev, 226 + "control request firmeware confirmation failed." 227 + " Return value %d\n", r); 228 + if (r >= 0) 229 + r = -ENODEV; 230 + goto error; 231 + } 232 + if (ret & 0x80) { 233 + dev_err(&udev->dev, 234 + "Internal error while downloading." 235 + " Firmware confirm return value %#04x\n", 236 + (unsigned int)ret); 237 + r = -ENODEV; 238 + goto error; 239 + } 240 + dev_dbg_f(&udev->dev, "firmware confirm return value %#04x\n", 241 + (unsigned int)ret); 242 + } 243 + 244 + r = 0; 245 + error: 246 + kfree(p); 247 + return r; 248 + } 249 + 250 + static u16 get_word(const void *data, u16 offset) 251 + { 252 + const __le16 *p = data; 253 + return le16_to_cpu(p[offset]); 254 + } 255 + 256 + static char *get_fw_name(char *buffer, size_t size, u8 device_type, 257 + const char* postfix) 258 + { 259 + scnprintf(buffer, size, "%s%s", 260 + device_type == DEVICE_ZD1211B ? 261 + FW_ZD1211B_PREFIX : FW_ZD1211_PREFIX, 262 + postfix); 263 + return buffer; 264 + } 265 + 266 + static int upload_firmware(struct usb_device *udev, u8 device_type) 267 + { 268 + int r; 269 + u16 fw_bcdDevice; 270 + u16 bcdDevice; 271 + const struct firmware *ub_fw = NULL; 272 + const struct firmware *uph_fw = NULL; 273 + char fw_name[128]; 274 + 275 + bcdDevice = get_bcdDevice(udev); 276 + 277 + r = request_fw_file(&ub_fw, 278 + get_fw_name(fw_name, sizeof(fw_name), device_type, "ub"), 279 + &udev->dev); 280 + if (r) 281 + goto error; 282 + 283 + fw_bcdDevice = get_word(ub_fw->data, EEPROM_REGS_OFFSET); 284 + 285 + /* FIXME: do we have any reason to perform the kludge that the vendor 286 + * driver does when there is a version mismatch? (their driver uploads 287 + * different firmwares and stuff) 288 + */ 289 + if (fw_bcdDevice != bcdDevice) { 290 + dev_info(&udev->dev, 291 + "firmware device id %#06x and actual device id " 292 + "%#06x differ, continuing anyway\n", 293 + fw_bcdDevice, bcdDevice); 294 + } else { 295 + dev_dbg_f(&udev->dev, 296 + "firmware device id %#06x is equal to the " 297 + "actual device id\n", fw_bcdDevice); 298 + } 299 + 300 + 301 + r = request_fw_file(&uph_fw, 302 + get_fw_name(fw_name, sizeof(fw_name), device_type, "uphr"), 303 + &udev->dev); 304 + if (r) 305 + goto error; 306 + 307 + r = upload_code(udev, uph_fw->data, uph_fw->size, FW_START_OFFSET, 308 + REBOOT); 309 + if (r) { 310 + dev_err(&udev->dev, 311 + "Could not upload firmware code uph. Error number %d\n", 312 + r); 313 + } 314 + 315 + /* FALL-THROUGH */ 316 + error: 317 + release_firmware(ub_fw); 318 + release_firmware(uph_fw); 319 + return r; 320 + } 321 + 322 + static void disable_read_regs_int(struct zd_usb *usb) 323 + { 324 + struct zd_usb_interrupt *intr = &usb->intr; 325 + 326 + ZD_ASSERT(in_interrupt()); 327 + spin_lock(&intr->lock); 328 + intr->read_regs_enabled = 0; 329 + spin_unlock(&intr->lock); 330 + } 331 + 332 + #define urb_dev(urb) (&(urb)->dev->dev) 333 + 334 + static inline void handle_regs_int(struct urb *urb) 335 + { 336 + struct zd_usb *usb = urb->context; 337 + struct zd_usb_interrupt *intr = &usb->intr; 338 + int len; 339 + 340 + ZD_ASSERT(in_interrupt()); 341 + spin_lock(&intr->lock); 342 + 343 + if (intr->read_regs_enabled) { 344 + intr->read_regs.length = len = urb->actual_length; 345 + 346 + if (len > sizeof(intr->read_regs.buffer)) 347 + len = sizeof(intr->read_regs.buffer); 348 + memcpy(intr->read_regs.buffer, urb->transfer_buffer, len); 349 + intr->read_regs_enabled = 0; 350 + complete(&intr->read_regs.completion); 351 + goto out; 352 + } 353 + 354 + dev_dbg_f(urb_dev(urb), "regs interrupt ignored\n"); 355 + out: 356 + spin_unlock(&intr->lock); 357 + } 358 + 359 + static inline void handle_retry_failed_int(struct urb *urb) 360 + { 361 + dev_dbg_f(urb_dev(urb), "retry failed interrupt\n"); 362 + } 363 + 364 + 365 + static void int_urb_complete(struct urb *urb, struct pt_regs *pt_regs) 366 + { 367 + int r; 368 + struct usb_int_header *hdr; 369 + 370 + switch (urb->status) { 371 + case 0: 372 + break; 373 + case -ESHUTDOWN: 374 + case -EINVAL: 375 + case -ENODEV: 376 + case -ENOENT: 377 + case -ECONNRESET: 378 + goto kfree; 379 + case -EPIPE: 380 + usb_clear_halt(urb->dev, EP_INT_IN); 381 + /* FALL-THROUGH */ 382 + default: 383 + goto resubmit; 384 + } 385 + 386 + if (urb->actual_length < sizeof(hdr)) { 387 + dev_dbg_f(urb_dev(urb), "error: urb %p to small\n", urb); 388 + goto resubmit; 389 + } 390 + 391 + hdr = urb->transfer_buffer; 392 + if (hdr->type != USB_INT_TYPE) { 393 + dev_dbg_f(urb_dev(urb), "error: urb %p wrong type\n", urb); 394 + goto resubmit; 395 + } 396 + 397 + switch (hdr->id) { 398 + case USB_INT_ID_REGS: 399 + handle_regs_int(urb); 400 + break; 401 + case USB_INT_ID_RETRY_FAILED: 402 + handle_retry_failed_int(urb); 403 + break; 404 + default: 405 + dev_dbg_f(urb_dev(urb), "error: urb %p unknown id %x\n", urb, 406 + (unsigned int)hdr->id); 407 + goto resubmit; 408 + } 409 + 410 + resubmit: 411 + r = usb_submit_urb(urb, GFP_ATOMIC); 412 + if (r) { 413 + dev_dbg_f(urb_dev(urb), "resubmit urb %p\n", urb); 414 + goto kfree; 415 + } 416 + return; 417 + kfree: 418 + kfree(urb->transfer_buffer); 419 + } 420 + 421 + static inline int int_urb_interval(struct usb_device *udev) 422 + { 423 + switch (udev->speed) { 424 + case USB_SPEED_HIGH: 425 + return 4; 426 + case USB_SPEED_LOW: 427 + return 10; 428 + case USB_SPEED_FULL: 429 + default: 430 + return 1; 431 + } 432 + } 433 + 434 + static inline int usb_int_enabled(struct zd_usb *usb) 435 + { 436 + unsigned long flags; 437 + struct zd_usb_interrupt *intr = &usb->intr; 438 + struct urb *urb; 439 + 440 + spin_lock_irqsave(&intr->lock, flags); 441 + urb = intr->urb; 442 + spin_unlock_irqrestore(&intr->lock, flags); 443 + return urb != NULL; 444 + } 445 + 446 + int zd_usb_enable_int(struct zd_usb *usb) 447 + { 448 + int r; 449 + struct usb_device *udev; 450 + struct zd_usb_interrupt *intr = &usb->intr; 451 + void *transfer_buffer = NULL; 452 + struct urb *urb; 453 + 454 + dev_dbg_f(zd_usb_dev(usb), "\n"); 455 + 456 + urb = usb_alloc_urb(0, GFP_NOFS); 457 + if (!urb) { 458 + r = -ENOMEM; 459 + goto out; 460 + } 461 + 462 + ZD_ASSERT(!irqs_disabled()); 463 + spin_lock_irq(&intr->lock); 464 + if (intr->urb) { 465 + spin_unlock_irq(&intr->lock); 466 + r = 0; 467 + goto error_free_urb; 468 + } 469 + intr->urb = urb; 470 + spin_unlock_irq(&intr->lock); 471 + 472 + /* TODO: make it a DMA buffer */ 473 + r = -ENOMEM; 474 + transfer_buffer = kmalloc(USB_MAX_EP_INT_BUFFER, GFP_NOFS); 475 + if (!transfer_buffer) { 476 + dev_dbg_f(zd_usb_dev(usb), 477 + "couldn't allocate transfer_buffer\n"); 478 + goto error_set_urb_null; 479 + } 480 + 481 + udev = zd_usb_to_usbdev(usb); 482 + usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, EP_INT_IN), 483 + transfer_buffer, USB_MAX_EP_INT_BUFFER, 484 + int_urb_complete, usb, 485 + intr->interval); 486 + 487 + dev_dbg_f(zd_usb_dev(usb), "submit urb %p\n", intr->urb); 488 + r = usb_submit_urb(urb, GFP_NOFS); 489 + if (r) { 490 + dev_dbg_f(zd_usb_dev(usb), 491 + "Couldn't submit urb. Error number %d\n", r); 492 + goto error; 493 + } 494 + 495 + return 0; 496 + error: 497 + kfree(transfer_buffer); 498 + error_set_urb_null: 499 + spin_lock_irq(&intr->lock); 500 + intr->urb = NULL; 501 + spin_unlock_irq(&intr->lock); 502 + error_free_urb: 503 + usb_free_urb(urb); 504 + out: 505 + return r; 506 + } 507 + 508 + void zd_usb_disable_int(struct zd_usb *usb) 509 + { 510 + unsigned long flags; 511 + struct zd_usb_interrupt *intr = &usb->intr; 512 + struct urb *urb; 513 + 514 + spin_lock_irqsave(&intr->lock, flags); 515 + urb = intr->urb; 516 + if (!urb) { 517 + spin_unlock_irqrestore(&intr->lock, flags); 518 + return; 519 + } 520 + intr->urb = NULL; 521 + spin_unlock_irqrestore(&intr->lock, flags); 522 + 523 + usb_kill_urb(urb); 524 + dev_dbg_f(zd_usb_dev(usb), "urb %p killed\n", urb); 525 + usb_free_urb(urb); 526 + } 527 + 528 + static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, 529 + unsigned int length) 530 + { 531 + int i; 532 + struct zd_mac *mac = zd_usb_to_mac(usb); 533 + const struct rx_length_info *length_info; 534 + 535 + if (length < sizeof(struct rx_length_info)) { 536 + /* It's not a complete packet anyhow. */ 537 + return; 538 + } 539 + length_info = (struct rx_length_info *) 540 + (buffer + length - sizeof(struct rx_length_info)); 541 + 542 + /* It might be that three frames are merged into a single URB 543 + * transaction. We have to check for the length info tag. 544 + * 545 + * While testing we discovered that length_info might be unaligned, 546 + * because if USB transactions are merged, the last packet will not 547 + * be padded. Unaligned access might also happen if the length_info 548 + * structure is not present. 549 + */ 550 + if (get_unaligned(&length_info->tag) == RX_LENGTH_INFO_TAG) { 551 + unsigned int l, k, n; 552 + for (i = 0, l = 0;; i++) { 553 + k = le16_to_cpu(get_unaligned( 554 + &length_info->length[i])); 555 + n = l+k; 556 + if (n > length) 557 + return; 558 + zd_mac_rx(mac, buffer+l, k); 559 + if (i >= 2) 560 + return; 561 + l = (n+3) & ~3; 562 + } 563 + } else { 564 + zd_mac_rx(mac, buffer, length); 565 + } 566 + } 567 + 568 + static void rx_urb_complete(struct urb *urb, struct pt_regs *pt_regs) 569 + { 570 + struct zd_usb *usb; 571 + struct zd_usb_rx *rx; 572 + const u8 *buffer; 573 + unsigned int length; 574 + 575 + switch (urb->status) { 576 + case 0: 577 + break; 578 + case -ESHUTDOWN: 579 + case -EINVAL: 580 + case -ENODEV: 581 + case -ENOENT: 582 + case -ECONNRESET: 583 + return; 584 + case -EPIPE: 585 + usb_clear_halt(urb->dev, EP_DATA_IN); 586 + /* FALL-THROUGH */ 587 + default: 588 + dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); 589 + goto resubmit; 590 + } 591 + 592 + buffer = urb->transfer_buffer; 593 + length = urb->actual_length; 594 + usb = urb->context; 595 + rx = &usb->rx; 596 + 597 + if (length%rx->usb_packet_size > rx->usb_packet_size-4) { 598 + /* If there is an old first fragment, we don't care. */ 599 + dev_dbg_f(urb_dev(urb), "*** first fragment ***\n"); 600 + ZD_ASSERT(length <= ARRAY_SIZE(rx->fragment)); 601 + spin_lock(&rx->lock); 602 + memcpy(rx->fragment, buffer, length); 603 + rx->fragment_length = length; 604 + spin_unlock(&rx->lock); 605 + goto resubmit; 606 + } 607 + 608 + spin_lock(&rx->lock); 609 + if (rx->fragment_length > 0) { 610 + /* We are on a second fragment, we believe */ 611 + ZD_ASSERT(length + rx->fragment_length <= 612 + ARRAY_SIZE(rx->fragment)); 613 + dev_dbg_f(urb_dev(urb), "*** second fragment ***\n"); 614 + memcpy(rx->fragment+rx->fragment_length, buffer, length); 615 + handle_rx_packet(usb, rx->fragment, 616 + rx->fragment_length + length); 617 + rx->fragment_length = 0; 618 + spin_unlock(&rx->lock); 619 + } else { 620 + spin_unlock(&rx->lock); 621 + handle_rx_packet(usb, buffer, length); 622 + } 623 + 624 + resubmit: 625 + usb_submit_urb(urb, GFP_ATOMIC); 626 + } 627 + 628 + struct urb *alloc_urb(struct zd_usb *usb) 629 + { 630 + struct usb_device *udev = zd_usb_to_usbdev(usb); 631 + struct urb *urb; 632 + void *buffer; 633 + 634 + urb = usb_alloc_urb(0, GFP_NOFS); 635 + if (!urb) 636 + return NULL; 637 + buffer = usb_buffer_alloc(udev, USB_MAX_RX_SIZE, GFP_NOFS, 638 + &urb->transfer_dma); 639 + if (!buffer) { 640 + usb_free_urb(urb); 641 + return NULL; 642 + } 643 + 644 + usb_fill_bulk_urb(urb, udev, usb_rcvbulkpipe(udev, EP_DATA_IN), 645 + buffer, USB_MAX_RX_SIZE, 646 + rx_urb_complete, usb); 647 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 648 + 649 + return urb; 650 + } 651 + 652 + void free_urb(struct urb *urb) 653 + { 654 + if (!urb) 655 + return; 656 + usb_buffer_free(urb->dev, urb->transfer_buffer_length, 657 + urb->transfer_buffer, urb->transfer_dma); 658 + usb_free_urb(urb); 659 + } 660 + 661 + int zd_usb_enable_rx(struct zd_usb *usb) 662 + { 663 + int i, r; 664 + struct zd_usb_rx *rx = &usb->rx; 665 + struct urb **urbs; 666 + 667 + dev_dbg_f(zd_usb_dev(usb), "\n"); 668 + 669 + r = -ENOMEM; 670 + urbs = kcalloc(URBS_COUNT, sizeof(struct urb *), GFP_NOFS); 671 + if (!urbs) 672 + goto error; 673 + for (i = 0; i < URBS_COUNT; i++) { 674 + urbs[i] = alloc_urb(usb); 675 + if (!urbs[i]) 676 + goto error; 677 + } 678 + 679 + ZD_ASSERT(!irqs_disabled()); 680 + spin_lock_irq(&rx->lock); 681 + if (rx->urbs) { 682 + spin_unlock_irq(&rx->lock); 683 + r = 0; 684 + goto error; 685 + } 686 + rx->urbs = urbs; 687 + rx->urbs_count = URBS_COUNT; 688 + spin_unlock_irq(&rx->lock); 689 + 690 + for (i = 0; i < URBS_COUNT; i++) { 691 + r = usb_submit_urb(urbs[i], GFP_NOFS); 692 + if (r) 693 + goto error_submit; 694 + } 695 + 696 + return 0; 697 + error_submit: 698 + for (i = 0; i < URBS_COUNT; i++) { 699 + usb_kill_urb(urbs[i]); 700 + } 701 + spin_lock_irq(&rx->lock); 702 + rx->urbs = NULL; 703 + rx->urbs_count = 0; 704 + spin_unlock_irq(&rx->lock); 705 + error: 706 + if (urbs) { 707 + for (i = 0; i < URBS_COUNT; i++) 708 + free_urb(urbs[i]); 709 + } 710 + return r; 711 + } 712 + 713 + void zd_usb_disable_rx(struct zd_usb *usb) 714 + { 715 + int i; 716 + unsigned long flags; 717 + struct urb **urbs; 718 + unsigned int count; 719 + struct zd_usb_rx *rx = &usb->rx; 720 + 721 + spin_lock_irqsave(&rx->lock, flags); 722 + urbs = rx->urbs; 723 + count = rx->urbs_count; 724 + spin_unlock_irqrestore(&rx->lock, flags); 725 + if (!urbs) 726 + return; 727 + 728 + for (i = 0; i < count; i++) { 729 + usb_kill_urb(urbs[i]); 730 + free_urb(urbs[i]); 731 + } 732 + kfree(urbs); 733 + 734 + spin_lock_irqsave(&rx->lock, flags); 735 + rx->urbs = NULL; 736 + rx->urbs_count = 0; 737 + spin_unlock_irqrestore(&rx->lock, flags); 738 + } 739 + 740 + static void tx_urb_complete(struct urb *urb, struct pt_regs *pt_regs) 741 + { 742 + int r; 743 + 744 + switch (urb->status) { 745 + case 0: 746 + break; 747 + case -ESHUTDOWN: 748 + case -EINVAL: 749 + case -ENODEV: 750 + case -ENOENT: 751 + case -ECONNRESET: 752 + dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); 753 + break; 754 + case -EPIPE: 755 + usb_clear_halt(urb->dev, EP_DATA_OUT); 756 + /* FALL-THROUGH */ 757 + default: 758 + dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); 759 + goto resubmit; 760 + } 761 + free_urb: 762 + usb_buffer_free(urb->dev, urb->transfer_buffer_length, 763 + urb->transfer_buffer, urb->transfer_dma); 764 + usb_free_urb(urb); 765 + return; 766 + resubmit: 767 + r = usb_submit_urb(urb, GFP_ATOMIC); 768 + if (r) { 769 + dev_dbg_f(urb_dev(urb), "error resubmit urb %p %d\n", urb, r); 770 + goto free_urb; 771 + } 772 + } 773 + 774 + /* Puts the frame on the USB endpoint. It doesn't wait for 775 + * completion. The frame must contain the control set. 776 + */ 777 + int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length) 778 + { 779 + int r; 780 + struct usb_device *udev = zd_usb_to_usbdev(usb); 781 + struct urb *urb; 782 + void *buffer; 783 + 784 + urb = usb_alloc_urb(0, GFP_ATOMIC); 785 + if (!urb) { 786 + r = -ENOMEM; 787 + goto out; 788 + } 789 + 790 + buffer = usb_buffer_alloc(zd_usb_to_usbdev(usb), length, GFP_ATOMIC, 791 + &urb->transfer_dma); 792 + if (!buffer) { 793 + r = -ENOMEM; 794 + goto error_free_urb; 795 + } 796 + memcpy(buffer, frame, length); 797 + 798 + usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), 799 + buffer, length, tx_urb_complete, NULL); 800 + urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 801 + 802 + r = usb_submit_urb(urb, GFP_ATOMIC); 803 + if (r) 804 + goto error; 805 + return 0; 806 + error: 807 + usb_buffer_free(zd_usb_to_usbdev(usb), length, buffer, 808 + urb->transfer_dma); 809 + error_free_urb: 810 + usb_free_urb(urb); 811 + out: 812 + return r; 813 + } 814 + 815 + static inline void init_usb_interrupt(struct zd_usb *usb) 816 + { 817 + struct zd_usb_interrupt *intr = &usb->intr; 818 + 819 + spin_lock_init(&intr->lock); 820 + intr->interval = int_urb_interval(zd_usb_to_usbdev(usb)); 821 + init_completion(&intr->read_regs.completion); 822 + intr->read_regs.cr_int_addr = cpu_to_le16(usb_addr(usb, CR_INTERRUPT)); 823 + } 824 + 825 + static inline void init_usb_rx(struct zd_usb *usb) 826 + { 827 + struct zd_usb_rx *rx = &usb->rx; 828 + spin_lock_init(&rx->lock); 829 + if (interface_to_usbdev(usb->intf)->speed == USB_SPEED_HIGH) { 830 + rx->usb_packet_size = 512; 831 + } else { 832 + rx->usb_packet_size = 64; 833 + } 834 + ZD_ASSERT(rx->fragment_length == 0); 835 + } 836 + 837 + static inline void init_usb_tx(struct zd_usb *usb) 838 + { 839 + /* FIXME: at this point we will allocate a fixed number of urb's for 840 + * use in a cyclic scheme */ 841 + } 842 + 843 + void zd_usb_init(struct zd_usb *usb, struct net_device *netdev, 844 + struct usb_interface *intf) 845 + { 846 + memset(usb, 0, sizeof(*usb)); 847 + usb->intf = usb_get_intf(intf); 848 + usb_set_intfdata(usb->intf, netdev); 849 + init_usb_interrupt(usb); 850 + init_usb_tx(usb); 851 + init_usb_rx(usb); 852 + } 853 + 854 + int zd_usb_init_hw(struct zd_usb *usb) 855 + { 856 + int r; 857 + struct zd_chip *chip = zd_usb_to_chip(usb); 858 + 859 + ZD_ASSERT(mutex_is_locked(&chip->mutex)); 860 + r = zd_ioread16_locked(chip, &usb->fw_base_offset, 861 + USB_REG((u16)FW_BASE_ADDR_OFFSET)); 862 + if (r) 863 + return r; 864 + dev_dbg_f(zd_usb_dev(usb), "fw_base_offset: %#06hx\n", 865 + usb->fw_base_offset); 866 + 867 + return 0; 868 + } 869 + 870 + void zd_usb_clear(struct zd_usb *usb) 871 + { 872 + usb_set_intfdata(usb->intf, NULL); 873 + usb_put_intf(usb->intf); 874 + memset(usb, 0, sizeof(*usb)); 875 + /* FIXME: usb_interrupt, usb_tx, usb_rx? */ 876 + } 877 + 878 + static const char *speed(enum usb_device_speed speed) 879 + { 880 + switch (speed) { 881 + case USB_SPEED_LOW: 882 + return "low"; 883 + case USB_SPEED_FULL: 884 + return "full"; 885 + case USB_SPEED_HIGH: 886 + return "high"; 887 + default: 888 + return "unknown speed"; 889 + } 890 + } 891 + 892 + static int scnprint_id(struct usb_device *udev, char *buffer, size_t size) 893 + { 894 + return scnprintf(buffer, size, "%04hx:%04hx v%04hx %s", 895 + le16_to_cpu(udev->descriptor.idVendor), 896 + le16_to_cpu(udev->descriptor.idProduct), 897 + get_bcdDevice(udev), 898 + speed(udev->speed)); 899 + } 900 + 901 + int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size) 902 + { 903 + struct usb_device *udev = interface_to_usbdev(usb->intf); 904 + return scnprint_id(udev, buffer, size); 905 + } 906 + 907 + #ifdef DEBUG 908 + static void print_id(struct usb_device *udev) 909 + { 910 + char buffer[40]; 911 + 912 + scnprint_id(udev, buffer, sizeof(buffer)); 913 + buffer[sizeof(buffer)-1] = 0; 914 + dev_dbg_f(&udev->dev, "%s\n", buffer); 915 + } 916 + #else 917 + #define print_id(udev) do { } while (0) 918 + #endif 919 + 920 + static int probe(struct usb_interface *intf, const struct usb_device_id *id) 921 + { 922 + int r; 923 + struct usb_device *udev = interface_to_usbdev(intf); 924 + struct net_device *netdev = NULL; 925 + 926 + print_id(udev); 927 + 928 + switch (udev->speed) { 929 + case USB_SPEED_LOW: 930 + case USB_SPEED_FULL: 931 + case USB_SPEED_HIGH: 932 + break; 933 + default: 934 + dev_dbg_f(&intf->dev, "Unknown USB speed\n"); 935 + r = -ENODEV; 936 + goto error; 937 + } 938 + 939 + netdev = zd_netdev_alloc(intf); 940 + if (netdev == NULL) { 941 + r = -ENOMEM; 942 + goto error; 943 + } 944 + 945 + r = upload_firmware(udev, id->driver_info); 946 + if (r) { 947 + dev_err(&intf->dev, 948 + "couldn't load firmware. Error number %d\n", r); 949 + goto error; 950 + } 951 + 952 + r = usb_reset_configuration(udev); 953 + if (r) { 954 + dev_dbg_f(&intf->dev, 955 + "couldn't reset configuration. Error number %d\n", r); 956 + goto error; 957 + } 958 + 959 + /* At this point the interrupt endpoint is not generally enabled. We 960 + * save the USB bandwidth until the network device is opened. But 961 + * notify that the initialization of the MAC will require the 962 + * interrupts to be temporary enabled. 963 + */ 964 + r = zd_mac_init_hw(zd_netdev_mac(netdev), id->driver_info); 965 + if (r) { 966 + dev_dbg_f(&intf->dev, 967 + "couldn't initialize mac. Error number %d\n", r); 968 + goto error; 969 + } 970 + 971 + r = register_netdev(netdev); 972 + if (r) { 973 + dev_dbg_f(&intf->dev, 974 + "couldn't register netdev. Error number %d\n", r); 975 + goto error; 976 + } 977 + 978 + dev_dbg_f(&intf->dev, "successful\n"); 979 + dev_info(&intf->dev,"%s\n", netdev->name); 980 + return 0; 981 + error: 982 + usb_reset_device(interface_to_usbdev(intf)); 983 + zd_netdev_free(netdev); 984 + return r; 985 + } 986 + 987 + static void disconnect(struct usb_interface *intf) 988 + { 989 + struct net_device *netdev = zd_intf_to_netdev(intf); 990 + struct zd_mac *mac = zd_netdev_mac(netdev); 991 + struct zd_usb *usb = &mac->chip.usb; 992 + 993 + dev_dbg_f(zd_usb_dev(usb), "\n"); 994 + 995 + zd_netdev_disconnect(netdev); 996 + 997 + /* Just in case something has gone wrong! */ 998 + zd_usb_disable_rx(usb); 999 + zd_usb_disable_int(usb); 1000 + 1001 + /* If the disconnect has been caused by a removal of the 1002 + * driver module, the reset allows reloading of the driver. If the 1003 + * reset will not be executed here, the upload of the firmware in the 1004 + * probe function caused by the reloading of the driver will fail. 1005 + */ 1006 + usb_reset_device(interface_to_usbdev(intf)); 1007 + 1008 + /* If somebody still waits on this lock now, this is an error. */ 1009 + zd_netdev_free(netdev); 1010 + dev_dbg(&intf->dev, "disconnected\n"); 1011 + } 1012 + 1013 + static struct usb_driver driver = { 1014 + .name = "zd1211rw", 1015 + .id_table = usb_ids, 1016 + .probe = probe, 1017 + .disconnect = disconnect, 1018 + }; 1019 + 1020 + static int __init usb_init(void) 1021 + { 1022 + int r; 1023 + 1024 + pr_debug("usb_init()\n"); 1025 + 1026 + r = usb_register(&driver); 1027 + if (r) { 1028 + printk(KERN_ERR "usb_register() failed. Error number %d\n", r); 1029 + return r; 1030 + } 1031 + 1032 + pr_debug("zd1211rw initialized\n"); 1033 + return 0; 1034 + } 1035 + 1036 + static void __exit usb_exit(void) 1037 + { 1038 + pr_debug("usb_exit()\n"); 1039 + usb_deregister(&driver); 1040 + } 1041 + 1042 + module_init(usb_init); 1043 + module_exit(usb_exit); 1044 + 1045 + static int usb_int_regs_length(unsigned int count) 1046 + { 1047 + return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data); 1048 + } 1049 + 1050 + static void prepare_read_regs_int(struct zd_usb *usb) 1051 + { 1052 + struct zd_usb_interrupt *intr = &usb->intr; 1053 + 1054 + spin_lock(&intr->lock); 1055 + intr->read_regs_enabled = 1; 1056 + INIT_COMPLETION(intr->read_regs.completion); 1057 + spin_unlock(&intr->lock); 1058 + } 1059 + 1060 + static int get_results(struct zd_usb *usb, u16 *values, 1061 + struct usb_req_read_regs *req, unsigned int count) 1062 + { 1063 + int r; 1064 + int i; 1065 + struct zd_usb_interrupt *intr = &usb->intr; 1066 + struct read_regs_int *rr = &intr->read_regs; 1067 + struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer; 1068 + 1069 + spin_lock(&intr->lock); 1070 + 1071 + r = -EIO; 1072 + /* The created block size seems to be larger than expected. 1073 + * However results appear to be correct. 1074 + */ 1075 + if (rr->length < usb_int_regs_length(count)) { 1076 + dev_dbg_f(zd_usb_dev(usb), 1077 + "error: actual length %d less than expected %d\n", 1078 + rr->length, usb_int_regs_length(count)); 1079 + goto error_unlock; 1080 + } 1081 + if (rr->length > sizeof(rr->buffer)) { 1082 + dev_dbg_f(zd_usb_dev(usb), 1083 + "error: actual length %d exceeds buffer size %zu\n", 1084 + rr->length, sizeof(rr->buffer)); 1085 + goto error_unlock; 1086 + } 1087 + 1088 + for (i = 0; i < count; i++) { 1089 + struct reg_data *rd = &regs->regs[i]; 1090 + if (rd->addr != req->addr[i]) { 1091 + dev_dbg_f(zd_usb_dev(usb), 1092 + "rd[%d] addr %#06hx expected %#06hx\n", i, 1093 + le16_to_cpu(rd->addr), 1094 + le16_to_cpu(req->addr[i])); 1095 + goto error_unlock; 1096 + } 1097 + values[i] = le16_to_cpu(rd->value); 1098 + } 1099 + 1100 + r = 0; 1101 + error_unlock: 1102 + spin_unlock(&intr->lock); 1103 + return r; 1104 + } 1105 + 1106 + int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, 1107 + const zd_addr_t *addresses, unsigned int count) 1108 + { 1109 + int r; 1110 + int i, req_len, actual_req_len; 1111 + struct usb_device *udev; 1112 + struct usb_req_read_regs *req = NULL; 1113 + unsigned long timeout; 1114 + 1115 + if (count < 1) { 1116 + dev_dbg_f(zd_usb_dev(usb), "error: count is zero\n"); 1117 + return -EINVAL; 1118 + } 1119 + if (count > USB_MAX_IOREAD16_COUNT) { 1120 + dev_dbg_f(zd_usb_dev(usb), 1121 + "error: count %u exceeds possible max %u\n", 1122 + count, USB_MAX_IOREAD16_COUNT); 1123 + return -EINVAL; 1124 + } 1125 + if (in_atomic()) { 1126 + dev_dbg_f(zd_usb_dev(usb), 1127 + "error: io in atomic context not supported\n"); 1128 + return -EWOULDBLOCK; 1129 + } 1130 + if (!usb_int_enabled(usb)) { 1131 + dev_dbg_f(zd_usb_dev(usb), 1132 + "error: usb interrupt not enabled\n"); 1133 + return -EWOULDBLOCK; 1134 + } 1135 + 1136 + req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16); 1137 + req = kmalloc(req_len, GFP_NOFS); 1138 + if (!req) 1139 + return -ENOMEM; 1140 + req->id = cpu_to_le16(USB_REQ_READ_REGS); 1141 + for (i = 0; i < count; i++) 1142 + req->addr[i] = cpu_to_le16(usb_addr(usb, addresses[i])); 1143 + 1144 + udev = zd_usb_to_usbdev(usb); 1145 + prepare_read_regs_int(usb); 1146 + r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), 1147 + req, req_len, &actual_req_len, 1000 /* ms */); 1148 + if (r) { 1149 + dev_dbg_f(zd_usb_dev(usb), 1150 + "error in usb_bulk_msg(). Error number %d\n", r); 1151 + goto error; 1152 + } 1153 + if (req_len != actual_req_len) { 1154 + dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()\n" 1155 + " req_len %d != actual_req_len %d\n", 1156 + req_len, actual_req_len); 1157 + r = -EIO; 1158 + goto error; 1159 + } 1160 + 1161 + timeout = wait_for_completion_timeout(&usb->intr.read_regs.completion, 1162 + msecs_to_jiffies(1000)); 1163 + if (!timeout) { 1164 + disable_read_regs_int(usb); 1165 + dev_dbg_f(zd_usb_dev(usb), "read timed out\n"); 1166 + r = -ETIMEDOUT; 1167 + goto error; 1168 + } 1169 + 1170 + r = get_results(usb, values, req, count); 1171 + error: 1172 + kfree(req); 1173 + return r; 1174 + } 1175 + 1176 + int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, 1177 + unsigned int count) 1178 + { 1179 + int r; 1180 + struct usb_device *udev; 1181 + struct usb_req_write_regs *req = NULL; 1182 + int i, req_len, actual_req_len; 1183 + 1184 + if (count == 0) 1185 + return 0; 1186 + if (count > USB_MAX_IOWRITE16_COUNT) { 1187 + dev_dbg_f(zd_usb_dev(usb), 1188 + "error: count %u exceeds possible max %u\n", 1189 + count, USB_MAX_IOWRITE16_COUNT); 1190 + return -EINVAL; 1191 + } 1192 + if (in_atomic()) { 1193 + dev_dbg_f(zd_usb_dev(usb), 1194 + "error: io in atomic context not supported\n"); 1195 + return -EWOULDBLOCK; 1196 + } 1197 + 1198 + req_len = sizeof(struct usb_req_write_regs) + 1199 + count * sizeof(struct reg_data); 1200 + req = kmalloc(req_len, GFP_NOFS); 1201 + if (!req) 1202 + return -ENOMEM; 1203 + 1204 + req->id = cpu_to_le16(USB_REQ_WRITE_REGS); 1205 + for (i = 0; i < count; i++) { 1206 + struct reg_data *rw = &req->reg_writes[i]; 1207 + rw->addr = cpu_to_le16(usb_addr(usb, ioreqs[i].addr)); 1208 + rw->value = cpu_to_le16(ioreqs[i].value); 1209 + } 1210 + 1211 + udev = zd_usb_to_usbdev(usb); 1212 + r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), 1213 + req, req_len, &actual_req_len, 1000 /* ms */); 1214 + if (r) { 1215 + dev_dbg_f(zd_usb_dev(usb), 1216 + "error in usb_bulk_msg(). Error number %d\n", r); 1217 + goto error; 1218 + } 1219 + if (req_len != actual_req_len) { 1220 + dev_dbg_f(zd_usb_dev(usb), 1221 + "error in usb_bulk_msg()" 1222 + " req_len %d != actual_req_len %d\n", 1223 + req_len, actual_req_len); 1224 + r = -EIO; 1225 + goto error; 1226 + } 1227 + 1228 + /* FALL-THROUGH with r == 0 */ 1229 + error: 1230 + kfree(req); 1231 + return r; 1232 + } 1233 + 1234 + int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) 1235 + { 1236 + int r; 1237 + struct usb_device *udev; 1238 + struct usb_req_rfwrite *req = NULL; 1239 + int i, req_len, actual_req_len; 1240 + u16 bit_value_template; 1241 + 1242 + if (in_atomic()) { 1243 + dev_dbg_f(zd_usb_dev(usb), 1244 + "error: io in atomic context not supported\n"); 1245 + return -EWOULDBLOCK; 1246 + } 1247 + if (bits < USB_MIN_RFWRITE_BIT_COUNT) { 1248 + dev_dbg_f(zd_usb_dev(usb), 1249 + "error: bits %d are smaller than" 1250 + " USB_MIN_RFWRITE_BIT_COUNT %d\n", 1251 + bits, USB_MIN_RFWRITE_BIT_COUNT); 1252 + return -EINVAL; 1253 + } 1254 + if (bits > USB_MAX_RFWRITE_BIT_COUNT) { 1255 + dev_dbg_f(zd_usb_dev(usb), 1256 + "error: bits %d exceed USB_MAX_RFWRITE_BIT_COUNT %d\n", 1257 + bits, USB_MAX_RFWRITE_BIT_COUNT); 1258 + return -EINVAL; 1259 + } 1260 + #ifdef DEBUG 1261 + if (value & (~0UL << bits)) { 1262 + dev_dbg_f(zd_usb_dev(usb), 1263 + "error: value %#09x has bits >= %d set\n", 1264 + value, bits); 1265 + return -EINVAL; 1266 + } 1267 + #endif /* DEBUG */ 1268 + 1269 + dev_dbg_f(zd_usb_dev(usb), "value %#09x bits %d\n", value, bits); 1270 + 1271 + r = zd_usb_ioread16(usb, &bit_value_template, CR203); 1272 + if (r) { 1273 + dev_dbg_f(zd_usb_dev(usb), 1274 + "error %d: Couldn't read CR203\n", r); 1275 + goto out; 1276 + } 1277 + bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA); 1278 + 1279 + req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16); 1280 + req = kmalloc(req_len, GFP_NOFS); 1281 + if (!req) 1282 + return -ENOMEM; 1283 + 1284 + req->id = cpu_to_le16(USB_REQ_WRITE_RF); 1285 + /* 1: 3683a, but not used in ZYDAS driver */ 1286 + req->value = cpu_to_le16(2); 1287 + req->bits = cpu_to_le16(bits); 1288 + 1289 + for (i = 0; i < bits; i++) { 1290 + u16 bv = bit_value_template; 1291 + if (value & (1 << (bits-1-i))) 1292 + bv |= RF_DATA; 1293 + req->bit_values[i] = cpu_to_le16(bv); 1294 + } 1295 + 1296 + udev = zd_usb_to_usbdev(usb); 1297 + r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), 1298 + req, req_len, &actual_req_len, 1000 /* ms */); 1299 + if (r) { 1300 + dev_dbg_f(zd_usb_dev(usb), 1301 + "error in usb_bulk_msg(). Error number %d\n", r); 1302 + goto out; 1303 + } 1304 + if (req_len != actual_req_len) { 1305 + dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()" 1306 + " req_len %d != actual_req_len %d\n", 1307 + req_len, actual_req_len); 1308 + r = -EIO; 1309 + goto out; 1310 + } 1311 + 1312 + /* FALL-THROUGH with r == 0 */ 1313 + out: 1314 + kfree(req); 1315 + return r; 1316 + }
+240
drivers/net/wireless/zd1211rw/zd_usb.h
···
··· 1 + /* zd_usb.h: Header for USB interface implemented by ZD1211 chip 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_USB_H 19 + #define _ZD_USB_H 20 + 21 + #include <linux/completion.h> 22 + #include <linux/netdevice.h> 23 + #include <linux/spinlock.h> 24 + #include <linux/skbuff.h> 25 + #include <linux/usb.h> 26 + 27 + #include "zd_def.h" 28 + #include "zd_types.h" 29 + 30 + enum devicetype { 31 + DEVICE_ZD1211 = 0, 32 + DEVICE_ZD1211B = 1, 33 + }; 34 + 35 + enum endpoints { 36 + EP_CTRL = 0, 37 + EP_DATA_OUT = 1, 38 + EP_DATA_IN = 2, 39 + EP_INT_IN = 3, 40 + EP_REGS_OUT = 4, 41 + }; 42 + 43 + enum { 44 + USB_MAX_TRANSFER_SIZE = 4096, /* bytes */ 45 + /* FIXME: The original driver uses this value. We have to check, 46 + * whether the MAX_TRANSFER_SIZE is sufficient and this needs only be 47 + * used if one combined frame is split over two USB transactions. 48 + */ 49 + USB_MAX_RX_SIZE = 4800, /* bytes */ 50 + USB_MAX_IOWRITE16_COUNT = 15, 51 + USB_MAX_IOWRITE32_COUNT = USB_MAX_IOWRITE16_COUNT/2, 52 + USB_MAX_IOREAD16_COUNT = 15, 53 + USB_MAX_IOREAD32_COUNT = USB_MAX_IOREAD16_COUNT/2, 54 + USB_MIN_RFWRITE_BIT_COUNT = 16, 55 + USB_MAX_RFWRITE_BIT_COUNT = 28, 56 + USB_MAX_EP_INT_BUFFER = 64, 57 + USB_ZD1211B_BCD_DEVICE = 0x4810, 58 + }; 59 + 60 + enum control_requests { 61 + USB_REQ_WRITE_REGS = 0x21, 62 + USB_REQ_READ_REGS = 0x22, 63 + USB_REQ_WRITE_RF = 0x23, 64 + USB_REQ_PROG_FLASH = 0x24, 65 + USB_REQ_EEPROM_START = 0x0128, /* ? request is a byte */ 66 + USB_REQ_EEPROM_MID = 0x28, 67 + USB_REQ_EEPROM_END = 0x0228, /* ? request is a byte */ 68 + USB_REQ_FIRMWARE_DOWNLOAD = 0x30, 69 + USB_REQ_FIRMWARE_CONFIRM = 0x31, 70 + USB_REQ_FIRMWARE_READ_DATA = 0x32, 71 + }; 72 + 73 + struct usb_req_read_regs { 74 + __le16 id; 75 + __le16 addr[0]; 76 + } __attribute__((packed)); 77 + 78 + struct reg_data { 79 + __le16 addr; 80 + __le16 value; 81 + } __attribute__((packed)); 82 + 83 + struct usb_req_write_regs { 84 + __le16 id; 85 + struct reg_data reg_writes[0]; 86 + } __attribute__((packed)); 87 + 88 + enum { 89 + RF_IF_LE = 0x02, 90 + RF_CLK = 0x04, 91 + RF_DATA = 0x08, 92 + }; 93 + 94 + struct usb_req_rfwrite { 95 + __le16 id; 96 + __le16 value; 97 + /* 1: 3683a */ 98 + /* 2: other (default) */ 99 + __le16 bits; 100 + /* RF2595: 24 */ 101 + __le16 bit_values[0]; 102 + /* (CR203 & ~(RF_IF_LE | RF_CLK | RF_DATA)) | (bit ? RF_DATA : 0) */ 103 + } __attribute__((packed)); 104 + 105 + /* USB interrupt */ 106 + 107 + enum usb_int_id { 108 + USB_INT_TYPE = 0x01, 109 + USB_INT_ID_REGS = 0x90, 110 + USB_INT_ID_RETRY_FAILED = 0xa0, 111 + }; 112 + 113 + enum usb_int_flags { 114 + USB_INT_READ_REGS_EN = 0x01, 115 + }; 116 + 117 + struct usb_int_header { 118 + u8 type; /* must always be 1 */ 119 + u8 id; 120 + } __attribute__((packed)); 121 + 122 + struct usb_int_regs { 123 + struct usb_int_header hdr; 124 + struct reg_data regs[0]; 125 + } __attribute__((packed)); 126 + 127 + struct usb_int_retry_fail { 128 + struct usb_int_header hdr; 129 + u8 new_rate; 130 + u8 _dummy; 131 + u8 addr[ETH_ALEN]; 132 + u8 ibss_wakeup_dest; 133 + } __attribute__((packed)); 134 + 135 + struct read_regs_int { 136 + struct completion completion; 137 + /* Stores the USB int structure and contains the USB address of the 138 + * first requested register before request. 139 + */ 140 + u8 buffer[USB_MAX_EP_INT_BUFFER]; 141 + int length; 142 + __le16 cr_int_addr; 143 + }; 144 + 145 + struct zd_ioreq16 { 146 + zd_addr_t addr; 147 + u16 value; 148 + }; 149 + 150 + struct zd_ioreq32 { 151 + zd_addr_t addr; 152 + u32 value; 153 + }; 154 + 155 + struct zd_usb_interrupt { 156 + struct read_regs_int read_regs; 157 + spinlock_t lock; 158 + struct urb *urb; 159 + int interval; 160 + u8 read_regs_enabled:1; 161 + }; 162 + 163 + static inline struct usb_int_regs *get_read_regs(struct zd_usb_interrupt *intr) 164 + { 165 + return (struct usb_int_regs *)intr->read_regs.buffer; 166 + } 167 + 168 + #define URBS_COUNT 5 169 + 170 + struct zd_usb_rx { 171 + spinlock_t lock; 172 + u8 fragment[2*USB_MAX_RX_SIZE]; 173 + unsigned int fragment_length; 174 + unsigned int usb_packet_size; 175 + struct urb **urbs; 176 + int urbs_count; 177 + }; 178 + 179 + struct zd_usb_tx { 180 + spinlock_t lock; 181 + }; 182 + 183 + /* Contains the usb parts. The structure doesn't require a lock, because intf 184 + * and fw_base_offset, will not be changed after initialization. 185 + */ 186 + struct zd_usb { 187 + struct zd_usb_interrupt intr; 188 + struct zd_usb_rx rx; 189 + struct zd_usb_tx tx; 190 + struct usb_interface *intf; 191 + u16 fw_base_offset; 192 + }; 193 + 194 + #define zd_usb_dev(usb) (&usb->intf->dev) 195 + 196 + static inline struct usb_device *zd_usb_to_usbdev(struct zd_usb *usb) 197 + { 198 + return interface_to_usbdev(usb->intf); 199 + } 200 + 201 + static inline struct net_device *zd_intf_to_netdev(struct usb_interface *intf) 202 + { 203 + return usb_get_intfdata(intf); 204 + } 205 + 206 + static inline struct net_device *zd_usb_to_netdev(struct zd_usb *usb) 207 + { 208 + return zd_intf_to_netdev(usb->intf); 209 + } 210 + 211 + void zd_usb_init(struct zd_usb *usb, struct net_device *netdev, 212 + struct usb_interface *intf); 213 + int zd_usb_init_hw(struct zd_usb *usb); 214 + void zd_usb_clear(struct zd_usb *usb); 215 + 216 + int zd_usb_scnprint_id(struct zd_usb *usb, char *buffer, size_t size); 217 + 218 + int zd_usb_enable_int(struct zd_usb *usb); 219 + void zd_usb_disable_int(struct zd_usb *usb); 220 + 221 + int zd_usb_enable_rx(struct zd_usb *usb); 222 + void zd_usb_disable_rx(struct zd_usb *usb); 223 + 224 + int zd_usb_tx(struct zd_usb *usb, const u8 *frame, unsigned int length); 225 + 226 + int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, 227 + const zd_addr_t *addresses, unsigned int count); 228 + 229 + static inline int zd_usb_ioread16(struct zd_usb *usb, u16 *value, 230 + const zd_addr_t addr) 231 + { 232 + return zd_usb_ioread16v(usb, value, (const zd_addr_t *)&addr, 1); 233 + } 234 + 235 + int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, 236 + unsigned int count); 237 + 238 + int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits); 239 + 240 + #endif /* _ZD_USB_H */
+82
drivers/net/wireless/zd1211rw/zd_util.c
···
··· 1 + /* zd_util.c 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + * 17 + * Utility program 18 + */ 19 + 20 + #include "zd_def.h" 21 + #include "zd_util.h" 22 + 23 + #ifdef DEBUG 24 + static char hex(u8 v) 25 + { 26 + v &= 0xf; 27 + return (v < 10 ? '0' : 'a' - 10) + v; 28 + } 29 + 30 + static char hex_print(u8 c) 31 + { 32 + return (0x20 <= c && c < 0x7f) ? c : '.'; 33 + } 34 + 35 + static void dump_line(const u8 *bytes, size_t size) 36 + { 37 + char c; 38 + size_t i; 39 + 40 + size = size <= 8 ? size : 8; 41 + printk(KERN_DEBUG "zd1211 %p ", bytes); 42 + for (i = 0; i < 8; i++) { 43 + switch (i) { 44 + case 1: 45 + case 5: 46 + c = '.'; 47 + break; 48 + case 3: 49 + c = ':'; 50 + break; 51 + default: 52 + c = ' '; 53 + } 54 + if (i < size) { 55 + printk("%c%c%c", hex(bytes[i] >> 4), hex(bytes[i]), c); 56 + } else { 57 + printk(" %c", c); 58 + } 59 + } 60 + 61 + for (i = 0; i < size; i++) 62 + printk("%c", hex_print(bytes[i])); 63 + printk("\n"); 64 + } 65 + 66 + void zd_hexdump(const void *bytes, size_t size) 67 + { 68 + size_t i = 0; 69 + 70 + do { 71 + dump_line((u8 *)bytes + i, size-i); 72 + i += 8; 73 + } while (i < size); 74 + } 75 + #endif /* DEBUG */ 76 + 77 + void *zd_tail(const void *buffer, size_t buffer_size, size_t tail_size) 78 + { 79 + if (buffer_size < tail_size) 80 + return NULL; 81 + return (u8 *)buffer + (buffer_size - tail_size); 82 + }
+29
drivers/net/wireless/zd1211rw/zd_util.h
···
··· 1 + /* zd_util.h 2 + * 3 + * This program is free software; you can redistribute it and/or modify 4 + * it under the terms of the GNU General Public License as published by 5 + * the Free Software Foundation; either version 2 of the License, or 6 + * (at your option) any later version. 7 + * 8 + * This program is distributed in the hope that it will be useful, 9 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 + * GNU General Public License for more details. 12 + * 13 + * You should have received a copy of the GNU General Public License 14 + * along with this program; if not, write to the Free Software 15 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 + */ 17 + 18 + #ifndef _ZD_UTIL_H 19 + #define _ZD_UTIL_H 20 + 21 + void *zd_tail(const void *buffer, size_t buffer_size, size_t tail_size); 22 + 23 + #ifdef DEBUG 24 + void zd_hexdump(const void *bytes, size_t size); 25 + #else 26 + #define zd_hexdump(bytes, size) 27 + #endif /* DEBUG */ 28 + 29 + #endif /* _ZD_UTIL_H */
+8 -31
drivers/net/yellowfin.c
··· 19 20 Support and updates available at 21 http://www.scyld.com/network/yellowfin.html 22 23 - 24 - Linux kernel changelog: 25 - ----------------------- 26 - 27 - LK1.1.1 (jgarzik): Port to 2.4 kernel 28 - 29 - LK1.1.2 (jgarzik): 30 - * Merge in becker version 1.05 31 - 32 - LK1.1.3 (jgarzik): 33 - * Various cleanups 34 - * Update yellowfin_timer to correctly calculate duplex. 35 - (suggested by Manfred Spraul) 36 - 37 - LK1.1.4 (val@nmt.edu): 38 - * Fix three endian-ness bugs 39 - * Support dual function SYM53C885E ethernet chip 40 - 41 - LK1.1.5 (val@nmt.edu): 42 - * Fix forced full-duplex bug I introduced 43 - 44 - LK1.1.6 (val@nmt.edu): 45 - * Only print warning on truly "oversized" packets 46 - * Fix theoretical bug on gigabit cards - return to 1.1.3 behavior 47 - 48 */ 49 50 #define DRV_NAME "yellowfin" 51 - #define DRV_VERSION "1.05+LK1.1.6" 52 - #define DRV_RELDATE "Feb 11, 2002" 53 54 #define PFX DRV_NAME ": " 55 ··· 215 HasMACAddrBug=32, /* Only on early revs. */ 216 DontUseEeprom=64, /* Don't read the MAC from the EEPROm. */ 217 }; 218 /* The PCI I/O space extent. */ 219 - #define YELLOWFIN_SIZE 0x100 220 221 struct pci_id_info { 222 const char *name; ··· 227 int pci, pci_mask, subsystem, subsystem_mask; 228 int revision, revision_mask; /* Only 8 bits. */ 229 } id; 230 - int io_size; /* Needed for I/O region check or ioremap(). */ 231 int drv_flags; /* Driver use, intended as capability flags. */ 232 }; 233 234 static const struct pci_id_info pci_id_tbl[] = { 235 {"Yellowfin G-NIC Gigabit Ethernet", { 0x07021000, 0xffffffff}, 236 - YELLOWFIN_SIZE, 237 FullTxStatus | IsGigabit | HasMulticastBug | HasMACAddrBug | DontUseEeprom}, 238 {"Symbios SYM83C885", { 0x07011000, 0xffffffff}, 239 - YELLOWFIN_SIZE, HasMII | DontUseEeprom }, 240 { } 241 }; 242
··· 19 20 Support and updates available at 21 http://www.scyld.com/network/yellowfin.html 22 + [link no longer provides useful info -jgarzik] 23 24 */ 25 26 #define DRV_NAME "yellowfin" 27 + #define DRV_VERSION "2.0" 28 + #define DRV_RELDATE "Jun 27, 2006" 29 30 #define PFX DRV_NAME ": " 31 ··· 239 HasMACAddrBug=32, /* Only on early revs. */ 240 DontUseEeprom=64, /* Don't read the MAC from the EEPROm. */ 241 }; 242 + 243 /* The PCI I/O space extent. */ 244 + enum { 245 + YELLOWFIN_SIZE = 0x100, 246 + }; 247 248 struct pci_id_info { 249 const char *name; ··· 248 int pci, pci_mask, subsystem, subsystem_mask; 249 int revision, revision_mask; /* Only 8 bits. */ 250 } id; 251 int drv_flags; /* Driver use, intended as capability flags. */ 252 }; 253 254 static const struct pci_id_info pci_id_tbl[] = { 255 {"Yellowfin G-NIC Gigabit Ethernet", { 0x07021000, 0xffffffff}, 256 FullTxStatus | IsGigabit | HasMulticastBug | HasMACAddrBug | DontUseEeprom}, 257 {"Symbios SYM83C885", { 0x07011000, 0xffffffff}, 258 + HasMII | DontUseEeprom }, 259 { } 260 }; 261
+1
include/net/ieee80211softmac.h
··· 104 */ 105 u8 static_essid:1, 106 associating:1, 107 bssvalid:1, 108 bssfixed:1; 109
··· 104 */ 105 u8 static_essid:1, 106 associating:1, 107 + assoc_wait:1, 108 bssvalid:1, 109 bssfixed:1; 110
+3 -1
net/ieee80211/ieee80211_rx.c
··· 368 369 /* Put this code here so that we avoid duplicating it in all 370 * Rx paths. - Jean II */ 371 #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ 372 /* If spy monitoring on */ 373 if (ieee->spy_data.spy_number > 0) { ··· 397 wireless_spy_update(ieee->dev, hdr->addr2, &wstats); 398 } 399 #endif /* IW_WIRELESS_SPY */ 400 401 #ifdef NOT_YET 402 hostap_update_rx_stats(local->ap, hdr, rx_stats); 403 #endif 404 405 if (ieee->iw_mode == IW_MODE_MONITOR) { 406 - ieee80211_monitor_rx(ieee, skb, rx_stats); 407 stats->rx_packets++; 408 stats->rx_bytes += skb->len; 409 return 1; 410 } 411
··· 368 369 /* Put this code here so that we avoid duplicating it in all 370 * Rx paths. - Jean II */ 371 + #ifdef CONFIG_WIRELESS_EXT 372 #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ 373 /* If spy monitoring on */ 374 if (ieee->spy_data.spy_number > 0) { ··· 396 wireless_spy_update(ieee->dev, hdr->addr2, &wstats); 397 } 398 #endif /* IW_WIRELESS_SPY */ 399 + #endif /* CONFIG_WIRELESS_EXT */ 400 401 #ifdef NOT_YET 402 hostap_update_rx_stats(local->ap, hdr, rx_stats); 403 #endif 404 405 if (ieee->iw_mode == IW_MODE_MONITOR) { 406 stats->rx_packets++; 407 stats->rx_bytes += skb->len; 408 + ieee80211_monitor_rx(ieee, skb, rx_stats); 409 return 1; 410 } 411
+11 -4
net/ieee80211/ieee80211_tx.c
··· 562 struct net_device_stats *stats = &ieee->stats; 563 struct sk_buff *skb_frag; 564 int priority = -1; 565 566 spin_lock_irqsave(&ieee->lock, flags); 567 568 - if (encrypt_mpdu && !ieee->sec.encrypt) 569 encrypt_mpdu = 0; 570 571 /* If there is no driver handler to take the TXB, dont' bother ··· 584 goto success; 585 } 586 587 - if (encrypt_mpdu) 588 frame->frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 589 590 /* When we allocate the TXB we allocate enough space for the reserve 591 * and full fragment bytes (bytes_per_frag doesn't include prefix, 592 * postfix, header, FCS, etc.) */ 593 - txb = ieee80211_alloc_txb(1, total_len, ieee->tx_headroom, GFP_ATOMIC); 594 if (unlikely(!txb)) { 595 printk(KERN_WARNING "%s: Could not allocate TXB\n", 596 ieee->dev->name); 597 goto failed; 598 } 599 txb->encrypted = 0; 600 - txb->payload_size = total_len; 601 602 skb_frag = txb->fragments[0]; 603
··· 562 struct net_device_stats *stats = &ieee->stats; 563 struct sk_buff *skb_frag; 564 int priority = -1; 565 + int fraglen = total_len; 566 + int headroom = ieee->tx_headroom; 567 + struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx]; 568 569 spin_lock_irqsave(&ieee->lock, flags); 570 571 + if (encrypt_mpdu && (!ieee->sec.encrypt || !crypt)) 572 encrypt_mpdu = 0; 573 574 /* If there is no driver handler to take the TXB, dont' bother ··· 581 goto success; 582 } 583 584 + if (encrypt_mpdu) { 585 frame->frame_ctl |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); 586 + fraglen += crypt->ops->extra_mpdu_prefix_len + 587 + crypt->ops->extra_mpdu_postfix_len; 588 + headroom += crypt->ops->extra_mpdu_prefix_len; 589 + } 590 591 /* When we allocate the TXB we allocate enough space for the reserve 592 * and full fragment bytes (bytes_per_frag doesn't include prefix, 593 * postfix, header, FCS, etc.) */ 594 + txb = ieee80211_alloc_txb(1, fraglen, headroom, GFP_ATOMIC); 595 if (unlikely(!txb)) { 596 printk(KERN_WARNING "%s: Could not allocate TXB\n", 597 ieee->dev->name); 598 goto failed; 599 } 600 txb->encrypted = 0; 601 + txb->payload_size = fraglen; 602 603 skb_frag = txb->fragments[0]; 604
+24 -7
net/ieee80211/softmac/ieee80211softmac_assoc.c
··· 47 48 dprintk(KERN_INFO PFX "sent association request!\n"); 49 50 - /* Change the state to associating */ 51 spin_lock_irqsave(&mac->lock, flags); 52 - mac->associnfo.associating = 1; 53 mac->associated = 0; /* just to make sure */ 54 55 /* Set a timer for timeout */ ··· 61 ieee80211softmac_assoc_timeout(void *d) 62 { 63 struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; 64 unsigned long flags; 65 66 spin_lock_irqsave(&mac->lock, flags); ··· 74 mac->associnfo.associating = 0; 75 mac->associnfo.bssvalid = 0; 76 mac->associated = 0; 77 spin_unlock_irqrestore(&mac->lock, flags); 78 79 dprintk(KERN_INFO PFX "assoc request timed out!\n"); 80 - /* FIXME: we need to know the network here. that requires a bit of restructuring */ 81 - ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, NULL); 82 } 83 84 void ··· 203 if (mac->associated) 204 ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); 205 206 /* try to find the requested network in our list, if we found one already */ 207 if (bssvalid || mac->associnfo.bssfixed) 208 found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); ··· 299 memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); 300 301 /* we found a network! authenticate (if necessary) and associate to it. */ 302 - if (!found->authenticated) { 303 /* This relies on the fact that _auth_req only queues the work, 304 * otherwise adding the notification would be racy. */ 305 if (!ieee80211softmac_auth_req(mac, found)) { 306 - dprintk(KERN_INFO PFX "cannot associate without being authenticated, requested authentication\n"); 307 - ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); 308 } else { 309 printkl(KERN_WARNING PFX "Not authenticated, but requesting authentication failed. Giving up to associate\n"); 310 ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); 311 } 312 return; 313 } 314 /* finally! now we can start associating */ 315 ieee80211softmac_assoc(mac, found); 316 } 317
··· 47 48 dprintk(KERN_INFO PFX "sent association request!\n"); 49 50 spin_lock_irqsave(&mac->lock, flags); 51 mac->associated = 0; /* just to make sure */ 52 53 /* Set a timer for timeout */ ··· 63 ieee80211softmac_assoc_timeout(void *d) 64 { 65 struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; 66 + struct ieee80211softmac_network *n; 67 unsigned long flags; 68 69 spin_lock_irqsave(&mac->lock, flags); ··· 75 mac->associnfo.associating = 0; 76 mac->associnfo.bssvalid = 0; 77 mac->associated = 0; 78 + 79 + n = ieee80211softmac_get_network_by_bssid_locked(mac, mac->associnfo.bssid); 80 spin_unlock_irqrestore(&mac->lock, flags); 81 82 dprintk(KERN_INFO PFX "assoc request timed out!\n"); 83 + ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, n); 84 } 85 86 void ··· 203 if (mac->associated) 204 ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); 205 206 + spin_lock_irqsave(&mac->lock, flags); 207 + mac->associnfo.associating = 1; 208 + spin_unlock_irqrestore(&mac->lock, flags); 209 + 210 /* try to find the requested network in our list, if we found one already */ 211 if (bssvalid || mac->associnfo.bssfixed) 212 found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); ··· 295 memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); 296 297 /* we found a network! authenticate (if necessary) and associate to it. */ 298 + if (found->authenticating) { 299 + dprintk(KERN_INFO PFX "Already requested authentication, waiting...\n"); 300 + if(!mac->associnfo.assoc_wait) { 301 + mac->associnfo.assoc_wait = 1; 302 + ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); 303 + } 304 + return; 305 + } 306 + if (!found->authenticated && !found->authenticating) { 307 /* This relies on the fact that _auth_req only queues the work, 308 * otherwise adding the notification would be racy. */ 309 if (!ieee80211softmac_auth_req(mac, found)) { 310 + if(!mac->associnfo.assoc_wait) { 311 + dprintk(KERN_INFO PFX "Cannot associate without being authenticated, requested authentication\n"); 312 + mac->associnfo.assoc_wait = 1; 313 + ieee80211softmac_notify_internal(mac, IEEE80211SOFTMAC_EVENT_ANY, found, ieee80211softmac_assoc_notify_auth, NULL, GFP_KERNEL); 314 + } 315 } else { 316 printkl(KERN_WARNING PFX "Not authenticated, but requesting authentication failed. Giving up to associate\n"); 317 + mac->associnfo.assoc_wait = 0; 318 ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); 319 } 320 return; 321 } 322 /* finally! now we can start associating */ 323 + mac->associnfo.assoc_wait = 0; 324 ieee80211softmac_assoc(mac, found); 325 } 326
+2 -2
net/ieee80211/softmac/ieee80211softmac_auth.c
··· 36 struct ieee80211softmac_auth_queue_item *auth; 37 unsigned long flags; 38 39 - if (net->authenticating) 40 return 0; 41 42 /* Add the network if it's not already added */ 43 ieee80211softmac_add_network(mac, net); ··· 93 return; 94 } 95 net->authenticated = 0; 96 - net->authenticating = 1; 97 /* add a timeout call so we eventually give up waiting for an auth reply */ 98 schedule_delayed_work(&auth->work, IEEE80211SOFTMAC_AUTH_TIMEOUT); 99 auth->retry--;
··· 36 struct ieee80211softmac_auth_queue_item *auth; 37 unsigned long flags; 38 39 + if (net->authenticating || net->authenticated) 40 return 0; 41 + net->authenticating = 1; 42 43 /* Add the network if it's not already added */ 44 ieee80211softmac_add_network(mac, net); ··· 92 return; 93 } 94 net->authenticated = 0; 95 /* add a timeout call so we eventually give up waiting for an auth reply */ 96 schedule_delayed_work(&auth->work, IEEE80211SOFTMAC_AUTH_TIMEOUT); 97 auth->retry--;
+3
net/ieee80211/softmac/ieee80211softmac_io.c
··· 229 return 0; 230 ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_ASSOC_REQ, net->bssid, net->bssid); 231 232 /* Fill in Listen Interval (?) */ 233 (*pkt)->listen_interval = cpu_to_le16(10); 234
··· 229 return 0; 230 ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_ASSOC_REQ, net->bssid, net->bssid); 231 232 + /* Fill in the capabilities */ 233 + (*pkt)->capability = ieee80211softmac_capabilities(mac, net); 234 + 235 /* Fill in Listen Interval (?) */ 236 (*pkt)->listen_interval = cpu_to_le16(10); 237
+34 -2
net/ieee80211/softmac/ieee80211softmac_wx.c
··· 70 char *extra) 71 { 72 struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); 73 int length = 0; 74 unsigned long flags; 75 - 76 spin_lock_irqsave(&sm->lock, flags); 77 - 78 sm->associnfo.static_essid = 0; 79 80 if (data->essid.flags && data->essid.length && extra /*required?*/) { 81 length = min(data->essid.length - 1, IW_ESSID_MAX_SIZE);
··· 70 char *extra) 71 { 72 struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); 73 + struct ieee80211softmac_network *n; 74 + struct ieee80211softmac_auth_queue_item *authptr; 75 int length = 0; 76 unsigned long flags; 77 + 78 + /* Check if we're already associating to this or another network 79 + * If it's another network, cancel and start over with our new network 80 + * If it's our network, ignore the change, we're already doing it! 81 + */ 82 + if((sm->associnfo.associating || sm->associated) && 83 + (data->essid.flags && data->essid.length && extra)) { 84 + /* Get the associating network */ 85 + n = ieee80211softmac_get_network_by_bssid(sm, sm->associnfo.bssid); 86 + if(n && n->essid.len == (data->essid.length - 1) && 87 + !memcmp(n->essid.data, extra, n->essid.len)) { 88 + dprintk(KERN_INFO PFX "Already associating or associated to "MAC_FMT"\n", 89 + MAC_ARG(sm->associnfo.bssid)); 90 + return 0; 91 + } else { 92 + dprintk(KERN_INFO PFX "Canceling existing associate request!\n"); 93 + spin_lock_irqsave(&sm->lock,flags); 94 + /* Cancel assoc work */ 95 + cancel_delayed_work(&sm->associnfo.work); 96 + /* We don't have to do this, but it's a little cleaner */ 97 + list_for_each_entry(authptr, &sm->auth_queue, list) 98 + cancel_delayed_work(&authptr->work); 99 + sm->associnfo.bssvalid = 0; 100 + sm->associnfo.bssfixed = 0; 101 + spin_unlock_irqrestore(&sm->lock,flags); 102 + flush_scheduled_work(); 103 + } 104 + } 105 + 106 + 107 spin_lock_irqsave(&sm->lock, flags); 108 + 109 sm->associnfo.static_essid = 0; 110 + sm->associnfo.assoc_wait = 0; 111 112 if (data->essid.flags && data->essid.length && extra /*required?*/) { 113 length = min(data->essid.length - 1, IW_ESSID_MAX_SIZE);