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 2039 S: Maintained 2040 2040 2041 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> 2042 + P: Jan-Pascal van Best 2043 + M: janpascal@vanbest.org 2044 + P: Andreas Mohr 2045 + M: andi@lisas.de 2045 2046 L: netdev@vger.kernel.org 2046 2047 S: Maintained 2047 2048
+19 -16
drivers/net/8139cp.c
··· 1836 1836 1837 1837 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 1838 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"); 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"); 1842 1843 return -ENODEV; 1843 1844 } 1844 1845 ··· 1877 1876 pciaddr = pci_resource_start(pdev, 1); 1878 1877 if (!pciaddr) { 1879 1878 rc = -EIO; 1880 - printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n", 1881 - pci_name(pdev)); 1879 + dev_err(&pdev->dev, "no MMIO resource\n"); 1882 1880 goto err_out_res; 1883 1881 } 1884 1882 if (pci_resource_len(pdev, 1) < CP_REGS_SIZE) { 1885 1883 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)); 1884 + dev_err(&pdev->dev, "MMIO resource (%llx) too small\n", 1885 + (unsigned long long)pci_resource_len(pdev, 1)); 1888 1886 goto err_out_res; 1889 1887 } 1890 1888 ··· 1897 1897 1898 1898 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1899 1899 if (rc) { 1900 - printk(KERN_ERR PFX "No usable DMA configuration, " 1901 - "aborting.\n"); 1900 + dev_err(&pdev->dev, 1901 + "No usable DMA configuration, aborting.\n"); 1902 1902 goto err_out_res; 1903 1903 } 1904 1904 rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK); 1905 1905 if (rc) { 1906 - printk(KERN_ERR PFX "No usable consistent DMA configuration, " 1907 - "aborting.\n"); 1906 + dev_err(&pdev->dev, 1907 + "No usable consistent DMA configuration, " 1908 + "aborting.\n"); 1908 1909 goto err_out_res; 1909 1910 } 1910 1911 } ··· 1916 1915 regs = ioremap(pciaddr, CP_REGS_SIZE); 1917 1916 if (!regs) { 1918 1917 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)); 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); 1922 1921 goto err_out_res; 1923 1922 } 1924 1923 dev->base_addr = (unsigned long) regs; ··· 1987 1986 /* enable busmastering and memory-write-invalidate */ 1988 1987 pci_set_master(pdev); 1989 1988 1990 - if (cp->wol_enabled) cp_set_d3_state (cp); 1989 + if (cp->wol_enabled) 1990 + cp_set_d3_state (cp); 1991 1991 1992 1992 return 0; 1993 1993 ··· 2013 2011 BUG_ON(!dev); 2014 2012 unregister_netdev(dev); 2015 2013 iounmap(cp->regs); 2016 - if (cp->wol_enabled) pci_set_power_state (pdev, PCI_D0); 2014 + if (cp->wol_enabled) 2015 + pci_set_power_state (pdev, PCI_D0); 2017 2016 pci_release_regions(pdev); 2018 2017 pci_clear_mwi(pdev); 2019 2018 pci_disable_device(pdev);
+18 -16
drivers/net/8139too.c
··· 768 768 /* dev and priv zeroed in alloc_etherdev */ 769 769 dev = alloc_etherdev (sizeof (*tp)); 770 770 if (dev == NULL) { 771 - printk (KERN_ERR PFX "%s: Unable to alloc new net device\n", pci_name(pdev)); 771 + dev_err(&pdev->dev, "Unable to alloc new net device\n"); 772 772 return -ENOMEM; 773 773 } 774 774 SET_MODULE_OWNER(dev); ··· 800 800 #ifdef USE_IO_OPS 801 801 /* make sure PCI base addr 0 is PIO */ 802 802 if (!(pio_flags & IORESOURCE_IO)) { 803 - printk (KERN_ERR PFX "%s: region #0 not a PIO resource, aborting\n", pci_name(pdev)); 803 + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); 804 804 rc = -ENODEV; 805 805 goto err_out; 806 806 } 807 807 /* check for weird/broken PCI region reporting */ 808 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)); 809 + dev_err(&pdev->dev, "Invalid PCI I/O region size(s), aborting\n"); 810 810 rc = -ENODEV; 811 811 goto err_out; 812 812 } 813 813 #else 814 814 /* make sure PCI base addr 1 is MMIO */ 815 815 if (!(mmio_flags & IORESOURCE_MEM)) { 816 - printk (KERN_ERR PFX "%s: region #1 not an MMIO resource, aborting\n", pci_name(pdev)); 816 + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); 817 817 rc = -ENODEV; 818 818 goto err_out; 819 819 } 820 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)); 821 + dev_err(&pdev->dev, "Invalid PCI mem region size(s), aborting\n"); 822 822 rc = -ENODEV; 823 823 goto err_out; 824 824 } 825 825 #endif 826 826 827 - rc = pci_request_regions (pdev, "8139too"); 827 + rc = pci_request_regions (pdev, DRV_NAME); 828 828 if (rc) 829 829 goto err_out; 830 830 disable_dev_on_err = 1; ··· 835 835 #ifdef USE_IO_OPS 836 836 ioaddr = ioport_map(pio_start, pio_len); 837 837 if (!ioaddr) { 838 - printk (KERN_ERR PFX "%s: cannot map PIO, aborting\n", pci_name(pdev)); 838 + dev_err(&pdev->dev, "cannot map PIO, aborting\n"); 839 839 rc = -EIO; 840 840 goto err_out; 841 841 } ··· 846 846 /* ioremap MMIO region */ 847 847 ioaddr = pci_iomap(pdev, 1, 0); 848 848 if (ioaddr == NULL) { 849 - printk (KERN_ERR PFX "%s: cannot remap MMIO, aborting\n", pci_name(pdev)); 849 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 850 850 rc = -EIO; 851 851 goto err_out; 852 852 } ··· 860 860 861 861 /* check for missing/broken hardware */ 862 862 if (RTL_R32 (TxConfig) == 0xFFFFFFFF) { 863 - printk (KERN_ERR PFX "%s: Chip not responding, ignoring board\n", 864 - pci_name(pdev)); 863 + dev_err(&pdev->dev, "Chip not responding, ignoring board\n"); 865 864 rc = -EIO; 866 865 goto err_out; 867 866 } ··· 874 875 } 875 876 876 877 /* 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)); 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)); 880 882 tp->chipset = 0; 881 883 882 884 match: ··· 954 954 955 955 if (pdev->vendor == PCI_VENDOR_ID_REALTEK && 956 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"); 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"); 960 962 } 961 963 962 964 i = rtl8139_init_board (pdev, &dev);
+12 -15
drivers/net/b44.c
··· 2120 2120 2121 2121 err = pci_enable_device(pdev); 2122 2122 if (err) { 2123 - printk(KERN_ERR PFX "Cannot enable PCI device, " 2123 + dev_err(&pdev->dev, "Cannot enable PCI device, " 2124 2124 "aborting.\n"); 2125 2125 return err; 2126 2126 } 2127 2127 2128 2128 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 2129 - printk(KERN_ERR PFX "Cannot find proper PCI device " 2129 + dev_err(&pdev->dev, 2130 + "Cannot find proper PCI device " 2130 2131 "base address, aborting.\n"); 2131 2132 err = -ENODEV; 2132 2133 goto err_out_disable_pdev; ··· 2135 2134 2136 2135 err = pci_request_regions(pdev, DRV_MODULE_NAME); 2137 2136 if (err) { 2138 - printk(KERN_ERR PFX "Cannot obtain PCI resources, " 2139 - "aborting.\n"); 2137 + dev_err(&pdev->dev, 2138 + "Cannot obtain PCI resources, aborting.\n"); 2140 2139 goto err_out_disable_pdev; 2141 2140 } 2142 2141 ··· 2144 2143 2145 2144 err = pci_set_dma_mask(pdev, (u64) B44_DMA_MASK); 2146 2145 if (err) { 2147 - printk(KERN_ERR PFX "No usable DMA configuration, " 2148 - "aborting.\n"); 2146 + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); 2149 2147 goto err_out_free_res; 2150 2148 } 2151 2149 2152 2150 err = pci_set_consistent_dma_mask(pdev, (u64) B44_DMA_MASK); 2153 2151 if (err) { 2154 - printk(KERN_ERR PFX "No usable DMA configuration, " 2155 - "aborting.\n"); 2152 + dev_err(&pdev->dev, "No usable DMA configuration, aborting.\n"); 2156 2153 goto err_out_free_res; 2157 2154 } 2158 2155 ··· 2159 2160 2160 2161 dev = alloc_etherdev(sizeof(*bp)); 2161 2162 if (!dev) { 2162 - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); 2163 + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); 2163 2164 err = -ENOMEM; 2164 2165 goto err_out_free_res; 2165 2166 } ··· 2180 2181 2181 2182 bp->regs = ioremap(b44reg_base, b44reg_len); 2182 2183 if (bp->regs == 0UL) { 2183 - printk(KERN_ERR PFX "Cannot map device registers, " 2184 - "aborting.\n"); 2184 + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); 2185 2185 err = -ENOMEM; 2186 2186 goto err_out_free_dev; 2187 2187 } ··· 2210 2212 2211 2213 err = b44_get_invariants(bp); 2212 2214 if (err) { 2213 - printk(KERN_ERR PFX "Problem fetching invariants of chip, " 2214 - "aborting.\n"); 2215 + dev_err(&pdev->dev, 2216 + "Problem fetching invariants of chip, aborting.\n"); 2215 2217 goto err_out_iounmap; 2216 2218 } 2217 2219 ··· 2231 2233 2232 2234 err = register_netdev(dev); 2233 2235 if (err) { 2234 - printk(KERN_ERR PFX "Cannot register net device, " 2235 - "aborting.\n"); 2236 + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); 2236 2237 goto err_out_iounmap; 2237 2238 } 2238 2239
+15 -15
drivers/net/bnx2.c
··· 5575 5575 /* enable device (incl. PCI PM wakeup), and bus-mastering */ 5576 5576 rc = pci_enable_device(pdev); 5577 5577 if (rc) { 5578 - printk(KERN_ERR PFX "Cannot enable PCI device, aborting."); 5578 + dev_err(&pdev->dev, "Cannot enable PCI device, aborting."); 5579 5579 goto err_out; 5580 5580 } 5581 5581 5582 5582 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 5583 - printk(KERN_ERR PFX "Cannot find PCI device base address, " 5584 - "aborting.\n"); 5583 + dev_err(&pdev->dev, 5584 + "Cannot find PCI device base address, aborting.\n"); 5585 5585 rc = -ENODEV; 5586 5586 goto err_out_disable; 5587 5587 } 5588 5588 5589 5589 rc = pci_request_regions(pdev, DRV_MODULE_NAME); 5590 5590 if (rc) { 5591 - printk(KERN_ERR PFX "Cannot obtain PCI resources, aborting.\n"); 5591 + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); 5592 5592 goto err_out_disable; 5593 5593 } 5594 5594 ··· 5596 5596 5597 5597 bp->pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); 5598 5598 if (bp->pm_cap == 0) { 5599 - printk(KERN_ERR PFX "Cannot find power management capability, " 5600 - "aborting.\n"); 5599 + dev_err(&pdev->dev, 5600 + "Cannot find power management capability, aborting.\n"); 5601 5601 rc = -EIO; 5602 5602 goto err_out_release; 5603 5603 } 5604 5604 5605 5605 bp->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX); 5606 5606 if (bp->pcix_cap == 0) { 5607 - printk(KERN_ERR PFX "Cannot find PCIX capability, aborting.\n"); 5607 + dev_err(&pdev->dev, "Cannot find PCIX capability, aborting.\n"); 5608 5608 rc = -EIO; 5609 5609 goto err_out_release; 5610 5610 } ··· 5612 5612 if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) { 5613 5613 bp->flags |= USING_DAC_FLAG; 5614 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"); 5615 + dev_err(&pdev->dev, 5616 + "pci_set_consistent_dma_mask failed, aborting.\n"); 5617 5617 rc = -EIO; 5618 5618 goto err_out_release; 5619 5619 } 5620 5620 } 5621 5621 else if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) != 0) { 5622 - printk(KERN_ERR PFX "System does not support DMA, aborting.\n"); 5622 + dev_err(&pdev->dev, "System does not support DMA, aborting.\n"); 5623 5623 rc = -EIO; 5624 5624 goto err_out_release; 5625 5625 } ··· 5639 5639 bp->regview = ioremap_nocache(dev->base_addr, mem_len); 5640 5640 5641 5641 if (!bp->regview) { 5642 - printk(KERN_ERR PFX "Cannot map register space, aborting.\n"); 5642 + dev_err(&pdev->dev, "Cannot map register space, aborting.\n"); 5643 5643 rc = -ENOMEM; 5644 5644 goto err_out_release; 5645 5645 } ··· 5711 5711 else if ((CHIP_ID(bp) == CHIP_ID_5706_A1) && 5712 5712 !(bp->flags & PCIX_FLAG)) { 5713 5713 5714 - printk(KERN_ERR PFX "5706 A1 can only be used in a PCIX bus, " 5715 - "aborting.\n"); 5714 + dev_err(&pdev->dev, 5715 + "5706 A1 can only be used in a PCIX bus, aborting.\n"); 5716 5716 goto err_out_unmap; 5717 5717 } 5718 5718 ··· 5733 5733 5734 5734 if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != 5735 5735 BNX2_DEV_INFO_SIGNATURE_MAGIC) { 5736 - printk(KERN_ERR PFX "Firmware not running, aborting.\n"); 5736 + dev_err(&pdev->dev, "Firmware not running, aborting.\n"); 5737 5737 rc = -ENODEV; 5738 5738 goto err_out_unmap; 5739 5739 } ··· 5895 5895 #endif 5896 5896 5897 5897 if ((rc = register_netdev(dev))) { 5898 - printk(KERN_ERR PFX "Cannot register net device\n"); 5898 + dev_err(&pdev->dev, "Cannot register net device\n"); 5899 5899 if (bp->regview) 5900 5900 iounmap(bp->regview); 5901 5901 pci_release_regions(pdev);
+10 -15
drivers/net/cassini.c
··· 4887 4887 4888 4888 err = pci_enable_device(pdev); 4889 4889 if (err) { 4890 - printk(KERN_ERR PFX "Cannot enable PCI device, " 4891 - "aborting.\n"); 4890 + dev_err(&pdev->dev, "Cannot enable PCI device, aborting.\n"); 4892 4891 return err; 4893 4892 } 4894 4893 4895 4894 if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) { 4896 - printk(KERN_ERR PFX "Cannot find proper PCI device " 4895 + dev_err(&pdev->dev, "Cannot find proper PCI device " 4897 4896 "base address, aborting.\n"); 4898 4897 err = -ENODEV; 4899 4898 goto err_out_disable_pdev; ··· 4900 4901 4901 4902 dev = alloc_etherdev(sizeof(*cp)); 4902 4903 if (!dev) { 4903 - printk(KERN_ERR PFX "Etherdev alloc failed, aborting.\n"); 4904 + dev_err(&pdev->dev, "Etherdev alloc failed, aborting.\n"); 4904 4905 err = -ENOMEM; 4905 4906 goto err_out_disable_pdev; 4906 4907 } ··· 4909 4910 4910 4911 err = pci_request_regions(pdev, dev->name); 4911 4912 if (err) { 4912 - printk(KERN_ERR PFX "Cannot obtain PCI resources, " 4913 - "aborting.\n"); 4913 + dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting.\n"); 4914 4914 goto err_out_free_netdev; 4915 4915 } 4916 4916 pci_set_master(pdev); ··· 4939 4941 if (pci_write_config_byte(pdev, 4940 4942 PCI_CACHE_LINE_SIZE, 4941 4943 cas_cacheline_size)) { 4942 - printk(KERN_ERR PFX "Could not set PCI cache " 4944 + dev_err(&pdev->dev, "Could not set PCI cache " 4943 4945 "line size\n"); 4944 4946 goto err_write_cacheline; 4945 4947 } ··· 4953 4955 err = pci_set_consistent_dma_mask(pdev, 4954 4956 DMA_64BIT_MASK); 4955 4957 if (err < 0) { 4956 - printk(KERN_ERR PFX "Unable to obtain 64-bit DMA " 4958 + dev_err(&pdev->dev, "Unable to obtain 64-bit DMA " 4957 4959 "for consistent allocations\n"); 4958 4960 goto err_out_free_res; 4959 4961 } ··· 4961 4963 } else { 4962 4964 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 4963 4965 if (err) { 4964 - printk(KERN_ERR PFX "No usable DMA configuration, " 4966 + dev_err(&pdev->dev, "No usable DMA configuration, " 4965 4967 "aborting.\n"); 4966 4968 goto err_out_free_res; 4967 4969 } ··· 5021 5023 /* give us access to cassini registers */ 5022 5024 cp->regs = pci_iomap(pdev, 0, casreg_len); 5023 5025 if (cp->regs == 0UL) { 5024 - printk(KERN_ERR PFX "Cannot map device registers, " 5025 - "aborting.\n"); 5026 + dev_err(&pdev->dev, "Cannot map device registers, aborting.\n"); 5026 5027 goto err_out_free_res; 5027 5028 } 5028 5029 cp->casreg_len = casreg_len; ··· 5037 5040 pci_alloc_consistent(pdev, sizeof(struct cas_init_block), 5038 5041 &cp->block_dvma); 5039 5042 if (!cp->init_block) { 5040 - printk(KERN_ERR PFX "Cannot allocate init block, " 5041 - "aborting.\n"); 5043 + dev_err(&pdev->dev, "Cannot allocate init block, aborting.\n"); 5042 5044 goto err_out_iounmap; 5043 5045 } 5044 5046 ··· 5081 5085 dev->features |= NETIF_F_HIGHDMA; 5082 5086 5083 5087 if (register_netdev(dev)) { 5084 - printk(KERN_ERR PFX "Cannot register net device, " 5085 - "aborting.\n"); 5088 + dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); 5086 5089 goto err_out_free_consistent; 5087 5090 } 5088 5091
+4 -3
drivers/net/declance.c
··· 703 703 return IRQ_HANDLED; 704 704 } 705 705 706 - static irqreturn_t 707 - lance_interrupt(const int irq, void *dev_id, struct pt_regs *regs) 706 + static irqreturn_t lance_interrupt(const int irq, void *dev_id, 707 + struct pt_regs *regs) 708 708 { 709 709 struct net_device *dev = (struct net_device *) dev_id; 710 710 struct lance_private *lp = netdev_priv(dev); ··· 1253 1253 return 0; 1254 1254 1255 1255 err_out_free_dev: 1256 - kfree(dev); 1256 + free_netdev(dev); 1257 1257 1258 1258 err_out: 1259 1259 return ret; ··· 1299 1299 while (root_lance_dev) { 1300 1300 struct net_device *dev = root_lance_dev; 1301 1301 struct lance_private *lp = netdev_priv(dev); 1302 + 1302 1303 unregister_netdev(dev); 1303 1304 #ifdef CONFIG_TC 1304 1305 if (lp->slot >= 0)
+2 -41
drivers/net/dl2k.c
··· 9 9 the Free Software Foundation; either version 2 of the License, or 10 10 (at your option) any later version. 11 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 12 51 - */ 52 13 #define DRV_NAME "D-Link DL2000-based linux driver" 53 - #define DRV_VERSION "v1.17b" 54 - #define DRV_RELDATE "2006/03/10" 14 + #define DRV_VERSION "v1.18" 15 + #define DRV_RELDATE "2006/06/27" 55 16 #include "dl2k.h" 56 17 #include <linux/dma-mapping.h> 57 18
+3 -3
drivers/net/eepro100.c
··· 555 555 556 556 if (!request_region(pci_resource_start(pdev, 1), 557 557 pci_resource_len(pdev, 1), "eepro100")) { 558 - printk (KERN_ERR "eepro100: cannot reserve I/O ports\n"); 558 + dev_err(&pdev->dev, "eepro100: cannot reserve I/O ports\n"); 559 559 goto err_out_none; 560 560 } 561 561 if (!request_mem_region(pci_resource_start(pdev, 0), 562 562 pci_resource_len(pdev, 0), "eepro100")) { 563 - printk (KERN_ERR "eepro100: cannot reserve MMIO region\n"); 563 + dev_err(&pdev->dev, "eepro100: cannot reserve MMIO region\n"); 564 564 goto err_out_free_pio_region; 565 565 } 566 566 ··· 573 573 574 574 ioaddr = pci_iomap(pdev, pci_bar, 0); 575 575 if (!ioaddr) { 576 - printk (KERN_ERR "eepro100: cannot remap IO\n"); 576 + dev_err(&pdev->dev, "eepro100: cannot remap IO\n"); 577 577 goto err_out_free_mmio_region; 578 578 } 579 579
+21 -72
drivers/net/epic100.c
··· 19 19 20 20 Information and updates available at 21 21 http://www.scyld.com/network/epic100.html 22 + [this link no longer provides anything useful -jgarzik] 22 23 23 24 --------------------------------------------------------------------- 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 25 73 26 */ 74 27 75 28 #define DRV_NAME "epic100" 76 - #define DRV_VERSION "1.11+LK1.1.14+AC1.1.14" 77 - #define DRV_RELDATE "June 2, 2004" 29 + #define DRV_VERSION "2.0" 30 + #define DRV_RELDATE "June 27, 2006" 78 31 79 32 /* The user-configurable values. 80 33 These may be modified when a driver module is loaded.*/ ··· 157 204 158 205 struct epic_chip_info { 159 206 const char *name; 160 - int io_size; /* Needed for I/O region check or ioremap(). */ 161 207 int drv_flags; /* Driver use, intended as capability flags. */ 162 208 }; 163 209 164 210 165 211 /* indexed by chip_t */ 166 212 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 }, 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 }, 173 216 }; 174 217 175 218 ··· 334 385 goto out; 335 386 irq = pdev->irq; 336 387 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); 388 + if (pci_resource_len(pdev, 0) < EPIC_TOTAL_SIZE) { 389 + dev_err(&pdev->dev, "no PCI region space\n"); 339 390 ret = -ENODEV; 340 391 goto err_out_disable; 341 392 } ··· 350 401 351 402 dev = alloc_etherdev(sizeof (*ep)); 352 403 if (!dev) { 353 - printk (KERN_ERR "card %d: no memory for eth device\n", card_idx); 404 + dev_err(&pdev->dev, "no memory for eth device\n"); 354 405 goto err_out_free_res; 355 406 } 356 407 SET_MODULE_OWNER(dev); ··· 362 413 ioaddr = pci_resource_start (pdev, 1); 363 414 ioaddr = (long) ioremap (ioaddr, pci_resource_len (pdev, 1)); 364 415 if (!ioaddr) { 365 - printk (KERN_ERR DRV_NAME " %d: ioremap failed\n", card_idx); 416 + dev_err(&pdev->dev, "ioremap failed\n"); 366 417 goto err_out_free_netdev; 367 418 } 368 419 #endif ··· 422 473 ((u16 *)dev->dev_addr)[i] = le16_to_cpu(inw(ioaddr + LAN0 + i*4)); 423 474 424 475 if (debug > 2) { 425 - printk(KERN_DEBUG DRV_NAME "(%s): EEPROM contents\n", 426 - pci_name(pdev)); 476 + dev_printk(KERN_DEBUG, &pdev->dev, "EEPROM contents:\n"); 427 477 for (i = 0; i < 64; i++) 428 478 printk(" %4.4x%s", read_eeprom(ioaddr, i), 429 479 i % 16 == 15 ? "\n" : ""); ··· 444 496 int mii_status = mdio_read(dev, phy, MII_BMSR); 445 497 if (mii_status != 0xffff && mii_status != 0x0000) { 446 498 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); 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); 450 503 } 451 504 } 452 505 ep->mii_phy_cnt = phy_idx; 453 506 if (phy_idx != 0) { 454 507 phy = ep->phys[0]; 455 508 ep->mii.advertising = mdio_read(dev, phy, MII_ADVERTISE); 456 - printk(KERN_INFO DRV_NAME "(%s): Autonegotiation advertising %4.4x link " 509 + dev_info(&pdev->dev, 510 + "Autonegotiation advertising %4.4x link " 457 511 "partner %4.4x.\n", 458 - pci_name(pdev), ep->mii.advertising, mdio_read(dev, phy, 5)); 512 + ep->mii.advertising, mdio_read(dev, phy, 5)); 459 513 } else if ( ! (ep->chip_flags & NO_MII)) { 460 - printk(KERN_WARNING DRV_NAME "(%s): ***WARNING***: No MII transceiver found!\n", 461 - pci_name(pdev)); 514 + dev_warn(&pdev->dev, 515 + "***WARNING***: No MII transceiver found!\n"); 462 516 /* Use the known PHY address of the EPII. */ 463 517 ep->phys[0] = 3; 464 518 } ··· 475 525 /* The lower four bits are the media type. */ 476 526 if (duplex) { 477 527 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)); 528 + dev_info(&pdev->dev, "Forced full duplex requested.\n"); 480 529 } 481 530 dev->if_port = ep->default_port = option; 482 531
+19 -17
drivers/net/fealnx.c
··· 124 124 MODULE_PARM_DESC(options, "fealnx: Bits 0-3: media type, bit 17: full duplex"); 125 125 MODULE_PARM_DESC(full_duplex, "fealnx full duplex setting(s) (1)"); 126 126 127 - #define MIN_REGION_SIZE 136 127 + enum { 128 + MIN_REGION_SIZE = 136, 129 + }; 128 130 129 131 /* A chip capabilities table, matching the entries in pci_tbl[] above. */ 130 132 enum chip_capability_flags { ··· 148 146 149 147 struct chip_info { 150 148 char *chip_name; 151 - int io_size; 152 149 int flags; 153 150 }; 154 151 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}, 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 }, 159 156 }; 160 157 161 158 /* Offsets to the Command and Status Registers. */ ··· 505 504 506 505 len = pci_resource_len(pdev, bar); 507 506 if (len < MIN_REGION_SIZE) { 508 - printk(KERN_ERR "%s: region size %ld too small, aborting\n", 509 - boardname, len); 507 + dev_err(&pdev->dev, 508 + "region size %ld too small, aborting\n", len); 510 509 return -ENODEV; 511 510 } 512 511 513 512 i = pci_request_regions(pdev, boardname); 514 - if (i) return i; 513 + if (i) 514 + return i; 515 515 516 516 irq = pdev->irq; 517 517 ··· 578 576 579 577 if (mii_status != 0xffff && mii_status != 0x0000) { 580 578 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); 579 + dev_info(&pdev->dev, 580 + "MII PHY found at address %d, status " 581 + "0x%4.4x.\n", phy, mii_status); 584 582 /* get phy type */ 585 583 { 586 584 unsigned int data; ··· 603 601 } 604 602 605 603 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 - } 604 + if (phy_idx == 0) 605 + dev_warn(&pdev->dev, 606 + "MII PHY not found -- this device may " 607 + "not operate correctly.\n"); 610 608 } else { 611 609 np->phys[0] = 32; 612 610 /* 89/6/23 add, (begin) */ ··· 632 630 np->mii.full_duplex = full_duplex[card_idx]; 633 631 634 632 if (np->mii.full_duplex) { 635 - printk(KERN_INFO "%s: Media type forced to Full Duplex.\n", dev->name); 633 + dev_info(&pdev->dev, "Media type forced to Full Duplex.\n"); 636 634 /* 89/6/13 add, (begin) */ 637 635 // if (np->PHYType==MarvellPHY) 638 636 if ((np->PHYType == MarvellPHY) || (np->PHYType == LevelOnePHY)) {
+1 -2
drivers/net/gt96100eth.c
··· 699 699 memset(gp, 0, sizeof(*gp)); // clear it 700 700 701 701 gp->port_num = port_num; 702 - gp->io_size = GT96100_ETH_IO_SIZE; 703 702 gp->port_offset = port_num * GT96100_ETH_IO_SIZE; 704 703 gp->phy_addr = phy_addr; 705 704 gp->chip_rev = chip_rev; ··· 1530 1531 + sizeof(gt96100_td_t) * TX_RING_SIZE, 1531 1532 gp->rx_ring); 1532 1533 free_netdev(gtif->dev); 1533 - release_region(gtif->iobase, gp->io_size); 1534 + release_region(gtif->iobase, GT96100_ETH_IO_SIZE); 1534 1535 } 1535 1536 } 1536 1537 }
-2
drivers/net/gt96100eth.h
··· 331 331 mib_counters_t mib; 332 332 struct net_device_stats stats; 333 333 334 - int io_size; 335 334 int port_num; // 0 or 1 336 335 int chip_rev; 337 336 u32 port_offset; ··· 339 340 u32 last_psr; // last value of the port status register 340 341 341 342 int options; /* User-settable misc. driver options. */ 342 - int drv_flags; 343 343 struct timer_list timer; 344 344 spinlock_t lock; /* Serialise access to device */ 345 345 };
+5 -11
drivers/net/hamachi.c
··· 20 20 21 21 Support and updates available at 22 22 http://www.scyld.com/network/hamachi.html 23 + [link no longer provides useful info -jgarzik] 23 24 or 24 25 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 26 34 27 */ 35 28 36 29 #define DRV_NAME "hamachi" 37 - #define DRV_VERSION "1.01+LK1.0.1" 38 - #define DRV_RELDATE "5/18/2001" 30 + #define DRV_VERSION "2.0" 31 + #define DRV_RELDATE "June 27, 2006" 39 32 40 33 41 34 /* A few user-configurable values. */ ··· 601 608 pci_set_master(pdev); 602 609 603 610 i = pci_request_regions(pdev, DRV_NAME); 604 - if (i) return i; 611 + if (i) 612 + return i; 605 613 606 614 irq = pdev->irq; 607 615 ioaddr = ioremap(base, 0x400);
+9 -8
drivers/net/myri10ge/myri10ge.c
··· 188 188 int vendor_specific_offset; 189 189 u32 devctl; 190 190 u16 msi_flags; 191 - u32 pm_state[16]; 192 191 u32 read_dma; 193 192 u32 write_dma; 194 193 u32 read_write_dma; ··· 1288 1289 "tx_aborted_errors", "tx_carrier_errors", "tx_fifo_errors", 1289 1290 "tx_heartbeat_errors", "tx_window_errors", 1290 1291 /* device-specific stats */ 1292 + "tx_boundary", "WC", "irq", "MSI", 1291 1293 "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", 1292 1294 "serial_number", "tx_pkt_start", "tx_pkt_done", 1293 1295 "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", ··· 1327 1327 for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) 1328 1328 data[i] = ((unsigned long *)&mgp->stats)[i]; 1329 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; 1330 1334 data[i++] = (unsigned int)mgp->read_dma; 1331 1335 data[i++] = (unsigned int)mgp->write_dma; 1332 1336 data[i++] = (unsigned int)mgp->read_write_dma; ··· 2201 2197 * any other device, except if forced with myri10ge_ecrc_enable > 1. 2202 2198 */ 2203 2199 2204 - #define PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_PCIE 0x005d 2205 - 2206 2200 static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) 2207 2201 { 2208 2202 struct pci_dev *bridge = mgp->pdev->bus->self; ··· 2739 2737 dev_err(&pdev->dev, "register_netdev failed: %d\n", status); 2740 2738 goto abort_with_irq; 2741 2739 } 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")); 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")); 2747 2744 2748 2745 return 0; 2749 2746
+3 -114
drivers/net/natsemi.c
··· 20 20 21 21 Support information and updates available at 22 22 http://www.scyld.com/network/netsemi.html 23 + [link no longer provides useful info -jgarzik] 23 24 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 25 137 26 TODO: 138 27 * big endian support with CFG:BEM instead of cpu_to_le32 ··· 54 165 #include <asm/uaccess.h> 55 166 56 167 #define DRV_NAME "natsemi" 57 - #define DRV_VERSION "1.07+LK1.0.17" 58 - #define DRV_RELDATE "Sep 27, 2002" 168 + #define DRV_VERSION "2.0" 169 + #define DRV_RELDATE "June 27, 2006" 59 170 60 171 #define RX_OFFSET 2 61 172
+5 -4
drivers/net/ne2k-pci.c
··· 231 231 irq = pdev->irq; 232 232 233 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"); 234 + dev_err(&pdev->dev, "no I/O resource at PCI BAR #0\n"); 235 235 return -ENODEV; 236 236 } 237 237 238 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", 239 + dev_err(&pdev->dev, "I/O resource 0x%x @ 0x%lx busy\n", 240 240 NE_IO_EXTENT, ioaddr); 241 241 return -EBUSY; 242 242 } ··· 263 263 /* Allocate net_device, dev->priv; fill in 8390 specific dev fields. */ 264 264 dev = alloc_ei_netdev(); 265 265 if (!dev) { 266 - printk (KERN_ERR PFX "cannot allocate ethernet device\n"); 266 + dev_err(&pdev->dev, "cannot allocate ethernet device\n"); 267 267 goto err_out_free_res; 268 268 } 269 269 SET_MODULE_OWNER(dev); ··· 281 281 while ((inb(ioaddr + EN0_ISR) & ENISR_RESET) == 0) 282 282 /* Limit wait: '2' avoids jiffy roll-over. */ 283 283 if (jiffies - reset_start_time > 2) { 284 - printk(KERN_ERR PFX "Card failure (no reset ack).\n"); 284 + dev_err(&pdev->dev, 285 + "Card failure (no reset ack).\n"); 285 286 goto err_out_free_netdev; 286 287 } 287 288
+24 -28
drivers/net/ni5010.c
··· 1 1 /* ni5010.c: A network driver for the MiCom-Interlan NI5010 ethercard. 2 2 * 3 - * Copyright 1996,1997 Jan-Pascal van Best and Andreas Mohr. 3 + * Copyright 1996,1997,2006 Jan-Pascal van Best and Andreas Mohr. 4 4 * 5 5 * This software may be used and distributed according to the terms 6 6 * of the GNU General Public License, incorporated herein by reference. 7 7 * 8 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 9 + * janpascal@vanbest.org andi@lisas.de 15 10 * 16 11 * Sources: 17 12 * Donald Becker's "skeleton.c" ··· 22 27 * 970503 v0.93: Fixed auto-irq failure on warm reboot (JB) 23 28 * 970623 v1.00: First kernel version (AM) 24 29 * 970814 v1.01: Added detection of onboard receive buffer size (AM) 30 + * 060611 v1.02: slight cleanup: email addresses, driver modernization. 25 31 * Bugs: 26 - * - None known... 32 + * - not SMP-safe (no locking of I/O accesses) 27 33 * - Note that you have to patch ifconfig for the new /proc/net/dev 28 34 * format. It gives incorrect stats otherwise. 29 35 * ··· 35 39 * Complete merge with Andreas' driver 36 40 * Implement ring buffers (Is this useful? You can't squeeze 37 41 * too many packet in a 2k buffer!) 38 - * Implement DMA (Again, is this useful? Some docs says DMA is 42 + * Implement DMA (Again, is this useful? Some docs say DMA is 39 43 * slower than programmed I/O) 40 44 * 41 45 * Compile with: ··· 43 47 * -DMODULE -c ni5010.c 44 48 * 45 49 * Insert with e.g.: 46 - * insmod ni5010.o io=0x300 irq=5 50 + * insmod ni5010.ko io=0x300 irq=5 47 51 */ 48 52 49 53 #include <linux/module.h> ··· 65 69 66 70 #include "ni5010.h" 67 71 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"; 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"; 71 75 72 76 /* bufsize_rcv == 0 means autoprobing */ 73 77 static unsigned int bufsize_rcv; 74 78 75 - #define jumpered_interrupts /* IRQ line jumpered on board */ 76 - #undef jumpered_dma /* No DMA used */ 79 + #define JUMPERED_INTERRUPTS /* IRQ line jumpered on board */ 80 + #undef JUMPERED_DMA /* No DMA used */ 77 81 #undef FULL_IODETECT /* Only detect in portlist */ 78 82 79 83 #ifndef FULL_IODETECT ··· 277 281 278 282 PRINTK2((KERN_DEBUG "%s: I/O #4 passed!\n", dev->name)); 279 283 280 - #ifdef jumpered_interrupts 284 + #ifdef JUMPERED_INTERRUPTS 281 285 if (dev->irq == 0xff) 282 286 ; 283 287 else if (dev->irq < 2) { ··· 301 305 } else if (dev->irq == 2) { 302 306 dev->irq = 9; 303 307 } 304 - #endif /* jumpered_irq */ 308 + #endif /* JUMPERED_INTERRUPTS */ 305 309 PRINTK2((KERN_DEBUG "%s: I/O #9 passed!\n", dev->name)); 306 310 307 311 /* DMA is not supported (yet?), so no use detecting it */ ··· 330 334 outw(0, IE_GP); /* Point GP at start of packet */ 331 335 outb(0, IE_RBUF); /* set buffer byte 0 to 0 again */ 332 336 } 333 - printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); 337 + printk("-> bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); 334 338 memset(dev->priv, 0, sizeof(struct ni5010_local)); 335 339 336 340 dev->open = ni5010_open; ··· 350 354 outb(0xff, EDLC_XCLR); /* Kill all pending xmt interrupts */ 351 355 352 356 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); 357 + if (dev->dma) 358 + printk(" & DMA %d", dev->dma); 354 359 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 360 return 0; 359 361 out: 360 362 release_region(dev->base_addr, NI5010_IO_EXTENT); ··· 365 371 * 366 372 * This routine should set everything up anew at each open, even 367 373 * 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. 374 + * there is a non-reboot way to recover if something goes wrong. 369 375 */ 370 376 371 377 static int ni5010_open(struct net_device *dev) ··· 384 390 * Always allocate the DMA channel after the IRQ, 385 391 * and clean up on failure. 386 392 */ 387 - #ifdef jumpered_dma 393 + #ifdef JUMPERED_DMA 388 394 if (request_dma(dev->dma, cardname)) { 389 395 printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma); 390 396 free_irq(dev->irq, NULL); 391 397 return -EAGAIN; 392 398 } 393 - #endif /* jumpered_dma */ 399 + #endif /* JUMPERED_DMA */ 394 400 395 401 PRINTK3((KERN_DEBUG "%s: passed open() #2\n", dev->name)); 396 402 /* Reset the hardware here. Don't forget to set the station address. */ ··· 627 633 int ioaddr = dev->base_addr; 628 634 629 635 PRINTK2((KERN_DEBUG "%s: entering ni5010_close\n", dev->name)); 630 - #ifdef jumpered_interrupts 636 + #ifdef JUMPERED_INTERRUPTS 631 637 free_irq(dev->irq, NULL); 632 638 #endif 633 639 /* Put card in held-RESET state */ ··· 765 771 MODULE_PARM_DESC(io, "ni5010 I/O base address"); 766 772 MODULE_PARM_DESC(irq, "ni5010 IRQ number"); 767 773 768 - int init_module(void) 774 + static int __init ni5010_init_module(void) 769 775 { 770 776 PRINTK2((KERN_DEBUG "%s: entering init_module\n", boardname)); 771 777 /* ··· 786 792 return 0; 787 793 } 788 794 789 - void cleanup_module(void) 795 + static void __exit ni5010_cleanup_module(void) 790 796 { 791 797 PRINTK2((KERN_DEBUG "%s: entering cleanup_module\n", boardname)); 792 798 unregister_netdev(dev_ni5010); 793 799 release_region(dev_ni5010->base_addr, NI5010_IO_EXTENT); 794 800 free_netdev(dev_ni5010); 795 801 } 802 + module_init(ni5010_init_module); 803 + module_exit(ni5010_cleanup_module); 796 804 #endif /* MODULE */ 797 805 MODULE_LICENSE("GPL"); 798 806
+22 -19
drivers/net/ns83820.c
··· 803 803 804 804 writel(dev->IMR_cache, dev->base + IMR); 805 805 writel(1, dev->base + IER); 806 - spin_unlock_irq(&dev->misc_lock); 806 + spin_unlock(&dev->misc_lock); 807 807 808 808 kick_rx(ndev); 809 809 ··· 1012 1012 struct ns83820 *dev = PRIV(ndev); 1013 1013 u32 cmdsts, tx_done_idx, *desc; 1014 1014 1015 - spin_lock_irq(&dev->tx_lock); 1016 - 1017 1015 dprintk("do_tx_done(%p)\n", ndev); 1018 1016 tx_done_idx = dev->tx_done_idx; 1019 1017 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1067 1069 netif_start_queue(ndev); 1068 1070 netif_wake_queue(ndev); 1069 1071 } 1070 - spin_unlock_irq(&dev->tx_lock); 1071 1072 } 1072 1073 1073 1074 static void ns83820_cleanup_tx(struct ns83820 *dev) ··· 1278 1281 .get_link = ns83820_get_link 1279 1282 }; 1280 1283 1284 + /* this function is called in irq context from the ISR */ 1281 1285 static void ns83820_mib_isr(struct ns83820 *dev) 1282 1286 { 1283 - spin_lock(&dev->misc_lock); 1287 + unsigned long flags; 1288 + spin_lock_irqsave(&dev->misc_lock, flags); 1284 1289 ns83820_update_stats(dev); 1285 - spin_unlock(&dev->misc_lock); 1290 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1286 1291 } 1287 1292 1288 1293 static void ns83820_do_isr(struct net_device *ndev, u32 isr); ··· 1306 1307 static void ns83820_do_isr(struct net_device *ndev, u32 isr) 1307 1308 { 1308 1309 struct ns83820 *dev = PRIV(ndev); 1310 + unsigned long flags; 1311 + 1309 1312 #ifdef DEBUG 1310 1313 if (isr & ~(ISR_PHY | ISR_RXDESC | ISR_RXEARLY | ISR_RXOK | ISR_RXERR | ISR_TXIDLE | ISR_TXOK | ISR_TXDESC)) 1311 1314 Dprintk("odd isr? 0x%08x\n", isr); ··· 1322 1321 if ((ISR_RXDESC | ISR_RXOK) & isr) { 1323 1322 prefetch(dev->rx_info.next_rx_desc); 1324 1323 1325 - spin_lock_irq(&dev->misc_lock); 1324 + spin_lock_irqsave(&dev->misc_lock, flags); 1326 1325 dev->IMR_cache &= ~(ISR_RXDESC | ISR_RXOK); 1327 1326 writel(dev->IMR_cache, dev->base + IMR); 1328 - spin_unlock_irq(&dev->misc_lock); 1327 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1329 1328 1330 1329 tasklet_schedule(&dev->rx_tasklet); 1331 1330 //rx_irq(ndev); ··· 1371 1370 * work has accumulated 1372 1371 */ 1373 1372 if ((ISR_TXDESC | ISR_TXIDLE | ISR_TXOK | ISR_TXERR) & isr) { 1373 + spin_lock_irqsave(&dev->tx_lock, flags); 1374 1374 do_tx_done(ndev); 1375 + spin_unlock_irqrestore(&dev->tx_lock, flags); 1375 1376 1376 1377 /* Disable TxOk if there are no outstanding tx packets. 1377 1378 */ 1378 1379 if ((dev->tx_done_idx == dev->tx_free_idx) && 1379 1380 (dev->IMR_cache & ISR_TXOK)) { 1380 - spin_lock_irq(&dev->misc_lock); 1381 + spin_lock_irqsave(&dev->misc_lock, flags); 1381 1382 dev->IMR_cache &= ~ISR_TXOK; 1382 1383 writel(dev->IMR_cache, dev->base + IMR); 1383 - spin_unlock_irq(&dev->misc_lock); 1384 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1384 1385 } 1385 1386 } 1386 1387 ··· 1393 1390 * nature are expected, we must enable TxOk. 1394 1391 */ 1395 1392 if ((ISR_TXIDLE & isr) && (dev->tx_done_idx != dev->tx_free_idx)) { 1396 - spin_lock_irq(&dev->misc_lock); 1393 + spin_lock_irqsave(&dev->misc_lock, flags); 1397 1394 dev->IMR_cache |= ISR_TXOK; 1398 1395 writel(dev->IMR_cache, dev->base + IMR); 1399 - spin_unlock_irq(&dev->misc_lock); 1396 + spin_unlock_irqrestore(&dev->misc_lock, flags); 1400 1397 } 1401 1398 1402 1399 /* MIB interrupt: one of the statistics counters is about to overflow */ ··· 1458 1455 u32 tx_done_idx, *desc; 1459 1456 unsigned long flags; 1460 1457 1461 - local_irq_save(flags); 1458 + spin_lock_irqsave(&dev->tx_lock, flags); 1462 1459 1463 1460 tx_done_idx = dev->tx_done_idx; 1464 1461 desc = dev->tx_descs + (tx_done_idx * DESC_SIZE); ··· 1485 1482 ndev->name, 1486 1483 tx_done_idx, dev->tx_free_idx, le32_to_cpu(desc[DESC_CMDSTS])); 1487 1484 1488 - local_irq_restore(flags); 1485 + spin_unlock_irqrestore(&dev->tx_lock, flags); 1489 1486 } 1490 1487 1491 1488 static void ns83820_tx_watch(unsigned long data) ··· 1835 1832 } else if (!pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { 1836 1833 using_dac = 0; 1837 1834 } else { 1838 - printk(KERN_WARNING "ns83820.c: pci_set_dma_mask failed!\n"); 1835 + dev_warn(&pci_dev->dev, "pci_set_dma_mask failed!\n"); 1839 1836 return -ENODEV; 1840 1837 } 1841 1838 ··· 1858 1855 1859 1856 err = pci_enable_device(pci_dev); 1860 1857 if (err) { 1861 - printk(KERN_INFO "ns83820: pci_enable_dev failed: %d\n", err); 1858 + dev_info(&pci_dev->dev, "pci_enable_dev failed: %d\n", err); 1862 1859 goto out_free; 1863 1860 } 1864 1861 ··· 1887 1884 err = request_irq(pci_dev->irq, ns83820_irq, IRQF_SHARED, 1888 1885 DRV_NAME, ndev); 1889 1886 if (err) { 1890 - printk(KERN_INFO "ns83820: unable to register irq %d\n", 1891 - pci_dev->irq); 1887 + dev_info(&pci_dev->dev, "unable to register irq %d, err %d\n", 1888 + pci_dev->irq, err); 1892 1889 goto out_disable; 1893 1890 } 1894 1891 ··· 1902 1899 rtnl_lock(); 1903 1900 err = dev_alloc_name(ndev, ndev->name); 1904 1901 if (err < 0) { 1905 - printk(KERN_INFO "ns83820: unable to get netdev name: %d\n", err); 1902 + dev_info(&pci_dev->dev, "unable to get netdev name: %d\n", err); 1906 1903 goto out_free_irq; 1907 1904 } 1908 1905
+10 -9
drivers/net/pci-skeleton.c
··· 601 601 /* dev zeroed in alloc_etherdev */ 602 602 dev = alloc_etherdev (sizeof (*tp)); 603 603 if (dev == NULL) { 604 - printk (KERN_ERR PFX "unable to alloc new ethernet\n"); 604 + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); 605 605 DPRINTK ("EXIT, returning -ENOMEM\n"); 606 606 return -ENOMEM; 607 607 } ··· 631 631 632 632 /* make sure PCI base addr 0 is PIO */ 633 633 if (!(pio_flags & IORESOURCE_IO)) { 634 - printk (KERN_ERR PFX "region #0 not a PIO resource, aborting\n"); 634 + dev_err(&pdev->dev, "region #0 not a PIO resource, aborting\n"); 635 635 rc = -ENODEV; 636 636 goto err_out; 637 637 } 638 638 639 639 /* make sure PCI base addr 1 is MMIO */ 640 640 if (!(mmio_flags & IORESOURCE_MEM)) { 641 - printk (KERN_ERR PFX "region #1 not an MMIO resource, aborting\n"); 641 + dev_err(&pdev->dev, "region #1 not an MMIO resource, aborting\n"); 642 642 rc = -ENODEV; 643 643 goto err_out; 644 644 } ··· 646 646 /* check for weird/broken PCI region reporting */ 647 647 if ((pio_len < NETDRV_MIN_IO_SIZE) || 648 648 (mmio_len < NETDRV_MIN_IO_SIZE)) { 649 - printk (KERN_ERR PFX "Invalid PCI region size(s), aborting\n"); 649 + dev_err(&pdev->dev, "Invalid PCI region size(s), aborting\n"); 650 650 rc = -ENODEV; 651 651 goto err_out; 652 652 } 653 653 654 - rc = pci_request_regions (pdev, "pci-skeleton"); 654 + rc = pci_request_regions (pdev, MODNAME); 655 655 if (rc) 656 656 goto err_out; 657 657 ··· 663 663 /* ioremap MMIO region */ 664 664 ioaddr = ioremap (mmio_start, mmio_len); 665 665 if (ioaddr == NULL) { 666 - printk (KERN_ERR PFX "cannot remap MMIO, aborting\n"); 666 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 667 667 rc = -EIO; 668 668 goto err_out_free_res; 669 669 } ··· 699 699 } 700 700 701 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)); 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)); 705 706 tp->chipset = 0; 706 707 707 708 match:
+382 -138
drivers/net/pcnet32.c
··· 58 58 * PCI device identifiers for "new style" Linux PCI Device Drivers 59 59 */ 60 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}, 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), }, 65 63 66 64 /* 67 65 * Adapters that were sold with IBM's RS/6000 or pSeries hardware have 68 66 * the incorrect vendor id. 69 67 */ 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}, 68 + { PCI_DEVICE(PCI_VENDOR_ID_TRIDENT, PCI_DEVICE_ID_AMD_LANCE), 69 + .class = (PCI_CLASS_NETWORK_ETHERNET << 8), .class_mask = 0xffff00, }, 73 70 74 71 { } /* terminate list */ 75 72 }; ··· 185 188 186 189 #define PCNET32_TOTAL_SIZE 0x20 187 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 + 188 208 /* The PCNET32 Rx and Tx ring descriptors. */ 189 209 struct pcnet32_rx_head { 190 210 u32 base; ··· 291 277 u32 phymask; 292 278 }; 293 279 294 - static void pcnet32_probe_vlbus(void); 295 280 static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); 296 281 static int pcnet32_probe1(unsigned long, int, struct pci_dev *); 297 282 static int pcnet32_open(struct net_device *); ··· 432 419 .reset = pcnet32_dwio_reset 433 420 }; 434 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 + 435 654 #ifdef CONFIG_NET_POLL_CONTROLLER 436 655 static void pcnet32_poll_controller(struct net_device *dev) 437 656 { ··· 764 519 { 765 520 struct pcnet32_private *lp = dev->priv; 766 521 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; 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; 771 526 } 772 527 773 528 static int pcnet32_set_ringparam(struct net_device *dev, ··· 775 530 { 776 531 struct pcnet32_private *lp = dev->priv; 777 532 unsigned long flags; 533 + unsigned int size; 534 + ulong ioaddr = dev->base_addr; 778 535 int i; 779 536 780 537 if (ering->rx_mini_pending || ering->rx_jumbo_pending) 781 538 return -EINVAL; 782 539 783 540 if (netif_running(dev)) 784 - pcnet32_close(dev); 541 + pcnet32_netif_stop(dev); 785 542 786 543 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); 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); 792 547 793 548 /* set the minimum ring size to 4, to allow the loopback test to work 794 549 * unchanged. 795 550 */ 796 551 for (i = 2; i <= PCNET32_LOG_MAX_TX_BUFFERS; i++) { 797 - if (lp->tx_ring_size <= (1 << i)) 552 + if (size <= (1 << i)) 798 553 break; 799 554 } 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 - 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); 804 559 for (i = 2; i <= PCNET32_LOG_MAX_RX_BUFFERS; i++) { 805 - if (lp->rx_ring_size <= (1 << i)) 560 + if (size <= (1 << i)) 806 561 break; 807 562 } 808 - lp->rx_ring_size = (1 << i); 809 - lp->rx_mod_mask = lp->rx_ring_size - 1; 810 - lp->rx_len_bits = (i << 4); 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; 811 567 812 - if (pcnet32_alloc_ring(dev, dev->name)) { 813 - pcnet32_free_ring(dev); 814 - spin_unlock_irqrestore(&lp->lock, flags); 815 - return -ENOMEM; 568 + if (netif_running(dev)) { 569 + pcnet32_netif_start(dev); 570 + pcnet32_restart(dev, CSR0_NORMAL); 816 571 } 817 572 818 573 spin_unlock_irqrestore(&lp->lock, flags); 819 574 820 - if (pcnet32_debug & NETIF_MSG_DRV) 821 - printk(KERN_INFO PFX 575 + if (netif_msg_drv(lp)) 576 + printk(KERN_INFO 822 577 "%s: Ring Param Settings: RX: %d, TX: %d\n", dev->name, 823 578 lp->rx_ring_size, lp->tx_ring_size); 824 - 825 - if (netif_running(dev)) 826 - pcnet32_open(dev); 827 579 828 580 return 0; 829 581 } ··· 875 633 unsigned long flags; 876 634 unsigned long ticks; 877 635 878 - *data1 = 1; /* status of test, default to fail */ 879 636 rc = 1; /* default to fail */ 880 637 881 638 if (netif_running(dev)) 882 639 pcnet32_close(dev); 883 640 884 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)); 885 645 886 646 /* Reset the PCNET32 */ 887 647 lp->a.reset(ioaddr); 648 + lp->a.write_csr(ioaddr, CSR4, 0x0915); 888 649 889 650 /* switch pcnet32 to 32bit mode */ 890 651 lp->a.write_bcr(ioaddr, 20, 2); 891 652 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 653 /* purge & init rings but don't actually restart */ 898 654 pcnet32_restart(dev, 0x0000); 899 655 900 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 656 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 901 657 902 658 /* Initialize Transmit buffers. */ 903 659 size = data_len + 15; ··· 937 697 } 938 698 } 939 699 940 - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ 941 - x = x | 0x0002; 942 - a->write_bcr(ioaddr, 32, x); 700 + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ 701 + a->write_bcr(ioaddr, 32, x | 0x0002); 943 702 944 - lp->a.write_csr(ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ 703 + /* set int loopback in CSR15 */ 704 + x = a->read_csr(ioaddr, CSR15) & 0xfffc; 705 + lp->a.write_csr(ioaddr, CSR15, x | 0x0044); 945 706 946 707 teststatus = le16_to_cpu(0x8000); 947 - lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ 708 + lp->a.write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ 948 709 949 710 /* Check status of descriptors */ 950 711 for (x = 0; x < numbuffs; x++) { ··· 953 712 rmb(); 954 713 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 955 714 spin_unlock_irqrestore(&lp->lock, flags); 956 - mdelay(1); 715 + msleep(1); 957 716 spin_lock_irqsave(&lp->lock, flags); 958 717 rmb(); 959 718 ticks++; ··· 966 725 } 967 726 } 968 727 969 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 728 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 970 729 wmb(); 971 730 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 972 731 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 999 758 } 1000 759 x++; 1001 760 } 1002 - if (!rc) { 1003 - *data1 = 0; 1004 - } 1005 761 1006 762 clean_up: 763 + *data1 = rc; 1007 764 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 */ 765 + 766 + x = a->read_csr(ioaddr, CSR15); 767 + a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ 1010 768 1011 769 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); 770 + a->write_bcr(ioaddr, 32, (x & ~0x0002)); 1016 771 1017 772 if (netif_running(dev)) { 773 + spin_unlock_irqrestore(&lp->lock, flags); 1018 774 pcnet32_open(dev); 1019 775 } else { 776 + pcnet32_purge_rx_ring(dev); 1020 777 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 778 + spin_unlock_irqrestore(&lp->lock, flags); 1021 779 } 1022 780 1023 781 return (rc); ··· 1079 839 return 0; 1080 840 } 1081 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 + 1082 879 #define PCNET32_REGS_PER_PHY 32 1083 880 #define PCNET32_MAX_PHYS 32 1084 881 static int pcnet32_get_regs_len(struct net_device *dev) ··· 1134 857 struct pcnet32_private *lp = dev->priv; 1135 858 struct pcnet32_access *a = &lp->a; 1136 859 ulong ioaddr = dev->base_addr; 1137 - int ticks; 1138 860 unsigned long flags; 1139 861 1140 862 spin_lock_irqsave(&lp->lock, flags); 1141 863 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 - } 864 + csr0 = a->read_csr(ioaddr, CSR0); 865 + if (!(csr0 & CSR0_STOP)) /* If not stopped */ 866 + pcnet32_suspend(dev, &flags, 1); 1163 867 1164 868 /* read address PROM */ 1165 869 for (i = 0; i < 16; i += 2) ··· 1177 919 } 1178 920 } 1179 921 1180 - if (!(csr0 & 0x0004)) { /* If not stopped */ 922 + if (!(csr0 & CSR0_STOP)) { /* If not stopped */ 923 + int csr5; 924 + 1181 925 /* clear SUSPEND (SPND) - CSR5 bit 0 */ 1182 - a->write_csr(ioaddr, 5, 0x0000); 926 + csr5 = a->read_csr(ioaddr, CSR5); 927 + a->write_csr(ioaddr, CSR5, csr5 & (~CSR5_SUSPEND)); 1183 928 } 1184 929 1185 930 spin_unlock_irqrestore(&lp->lock, flags); ··· 1213 952 /* only probes for non-PCI devices, the rest are handled by 1214 953 * pci_register_driver via pcnet32_probe_pci */ 1215 954 1216 - static void __devinit pcnet32_probe_vlbus(void) 955 + static void __devinit pcnet32_probe_vlbus(unsigned int *pcnet32_portlist) 1217 956 { 1218 957 unsigned int *port, ioaddr; 1219 958 ··· 1697 1436 lp->tx_ring_size, 1698 1437 &lp->tx_ring_dma_addr); 1699 1438 if (lp->tx_ring == NULL) { 1700 - if (pcnet32_debug & NETIF_MSG_DRV) 1439 + if (netif_msg_drv(lp)) 1701 1440 printk("\n" KERN_ERR PFX 1702 1441 "%s: Consistent memory allocation failed.\n", 1703 1442 name); ··· 1709 1448 lp->rx_ring_size, 1710 1449 &lp->rx_ring_dma_addr); 1711 1450 if (lp->rx_ring == NULL) { 1712 - if (pcnet32_debug & NETIF_MSG_DRV) 1451 + if (netif_msg_drv(lp)) 1713 1452 printk("\n" KERN_ERR PFX 1714 1453 "%s: Consistent memory allocation failed.\n", 1715 1454 name); 1716 1455 return -ENOMEM; 1717 1456 } 1718 1457 1719 - lp->tx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->tx_ring_size, 1458 + lp->tx_dma_addr = kcalloc(lp->tx_ring_size, sizeof(dma_addr_t), 1720 1459 GFP_ATOMIC); 1721 1460 if (!lp->tx_dma_addr) { 1722 - if (pcnet32_debug & NETIF_MSG_DRV) 1461 + if (netif_msg_drv(lp)) 1723 1462 printk("\n" KERN_ERR PFX 1724 1463 "%s: Memory allocation failed.\n", name); 1725 1464 return -ENOMEM; 1726 1465 } 1727 - memset(lp->tx_dma_addr, 0, sizeof(dma_addr_t) * lp->tx_ring_size); 1728 1466 1729 - lp->rx_dma_addr = kmalloc(sizeof(dma_addr_t) * lp->rx_ring_size, 1467 + lp->rx_dma_addr = kcalloc(lp->rx_ring_size, sizeof(dma_addr_t), 1730 1468 GFP_ATOMIC); 1731 1469 if (!lp->rx_dma_addr) { 1732 - if (pcnet32_debug & NETIF_MSG_DRV) 1470 + if (netif_msg_drv(lp)) 1733 1471 printk("\n" KERN_ERR PFX 1734 1472 "%s: Memory allocation failed.\n", name); 1735 1473 return -ENOMEM; 1736 1474 } 1737 - memset(lp->rx_dma_addr, 0, sizeof(dma_addr_t) * lp->rx_ring_size); 1738 1475 1739 - lp->tx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->tx_ring_size, 1476 + lp->tx_skbuff = kcalloc(lp->tx_ring_size, sizeof(struct sk_buff *), 1740 1477 GFP_ATOMIC); 1741 1478 if (!lp->tx_skbuff) { 1742 - if (pcnet32_debug & NETIF_MSG_DRV) 1479 + if (netif_msg_drv(lp)) 1743 1480 printk("\n" KERN_ERR PFX 1744 1481 "%s: Memory allocation failed.\n", name); 1745 1482 return -ENOMEM; 1746 1483 } 1747 - memset(lp->tx_skbuff, 0, sizeof(struct sk_buff *) * lp->tx_ring_size); 1748 1484 1749 - lp->rx_skbuff = kmalloc(sizeof(struct sk_buff *) * lp->rx_ring_size, 1485 + lp->rx_skbuff = kcalloc(lp->rx_ring_size, sizeof(struct sk_buff *), 1750 1486 GFP_ATOMIC); 1751 1487 if (!lp->rx_skbuff) { 1752 - if (pcnet32_debug & NETIF_MSG_DRV) 1488 + if (netif_msg_drv(lp)) 1753 1489 printk("\n" KERN_ERR PFX 1754 1490 "%s: Memory allocation failed.\n", name); 1755 1491 return -ENOMEM; 1756 1492 } 1757 - memset(lp->rx_skbuff, 0, sizeof(struct sk_buff *) * lp->rx_ring_size); 1758 1493 1759 1494 return 0; 1760 1495 } ··· 2014 1757 2015 1758 err_free_ring: 2016 1759 /* 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 - } 1760 + pcnet32_purge_rx_ring(dev); 2027 1761 2028 1762 /* 2029 1763 * Switch back to 16bit mode to avoid problems with dumb ··· 2596 2348 { 2597 2349 unsigned long ioaddr = dev->base_addr; 2598 2350 struct pcnet32_private *lp = dev->priv; 2599 - int i; 2600 2351 unsigned long flags; 2601 2352 2602 2353 del_timer_sync(&lp->watchdog_timer); ··· 2626 2379 2627 2380 spin_lock_irqsave(&lp->lock, flags); 2628 2381 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 - } 2382 + pcnet32_purge_rx_ring(dev); 2383 + pcnet32_purge_tx_ring(dev); 2654 2384 2655 2385 spin_unlock_irqrestore(&lp->lock, flags); 2656 2386 ··· 2657 2433 volatile struct pcnet32_init_block *ib = &lp->init_block; 2658 2434 volatile u16 *mcast_table = (u16 *) & ib->filter; 2659 2435 struct dev_mc_list *dmi = dev->mc_list; 2436 + unsigned long ioaddr = dev->base_addr; 2660 2437 char *addrs; 2661 2438 int i; 2662 2439 u32 crc; ··· 2666 2441 if (dev->flags & IFF_ALLMULTI) { 2667 2442 ib->filter[0] = 0xffffffff; 2668 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); 2669 2448 return; 2670 2449 } 2671 2450 /* clear the multicast filter */ ··· 2691 2462 le16_to_cpu(le16_to_cpu(mcast_table[crc >> 4]) | 2692 2463 (1 << (crc & 0xf))); 2693 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])); 2694 2468 return; 2695 2469 } 2696 2470 ··· 2704 2472 { 2705 2473 unsigned long ioaddr = dev->base_addr, flags; 2706 2474 struct pcnet32_private *lp = dev->priv; 2475 + int csr15, suspended; 2707 2476 2708 2477 spin_lock_irqsave(&lp->lock, flags); 2478 + suspended = pcnet32_suspend(dev, &flags, 0); 2479 + csr15 = lp->a.read_csr(ioaddr, CSR15); 2709 2480 if (dev->flags & IFF_PROMISC) { 2710 2481 /* Log any net taps. */ 2711 2482 if (netif_msg_hw(lp)) ··· 2717 2482 lp->init_block.mode = 2718 2483 le16_to_cpu(0x8000 | (lp->options & PCNET32_PORT_PORTSEL) << 2719 2484 7); 2485 + lp->a.write_csr(ioaddr, CSR15, csr15 | 0x8000); 2720 2486 } else { 2721 2487 lp->init_block.mode = 2722 2488 le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); 2489 + lp->a.write_csr(ioaddr, CSR15, csr15 & 0x7fff); 2723 2490 pcnet32_load_multicast(dev); 2724 2491 } 2725 2492 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); 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 + } 2729 2503 2730 2504 spin_unlock_irqrestore(&lp->lock, flags); 2731 2505 } ··· 2974 2730 2975 2731 /* should we find any remaining VLbus devices ? */ 2976 2732 if (pcnet32vlb) 2977 - pcnet32_probe_vlbus(); 2733 + pcnet32_probe_vlbus(pcnet32_portlist); 2978 2734 2979 2735 if (cards_found && (pcnet32_debug & NETIF_MSG_PROBE)) 2980 2736 printk(KERN_INFO PFX "%d cards_found.\n", cards_found);
+36 -6
drivers/net/phy/cicada.c
··· 103 103 return err; 104 104 } 105 105 106 - /* Cicada 820x */ 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 */ 107 122 static struct phy_driver cis8204_driver = { 108 123 .phy_id = 0x000fc440, 109 124 .name = "Cicada Cis8204", ··· 133 118 .driver = { .owner = THIS_MODULE,}, 134 119 }; 135 120 136 - static int __init cis8204_init(void) 121 + static int __init cicada_init(void) 137 122 { 138 - return phy_driver_register(&cis8204_driver); 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; 139 138 } 140 139 141 - static void __exit cis8204_exit(void) 140 + static void __exit cicada_exit(void) 142 141 { 143 142 phy_driver_unregister(&cis8204_driver); 143 + phy_driver_unregister(&cis8201_driver); 144 144 } 145 145 146 - module_init(cis8204_init); 147 - module_exit(cis8204_exit); 146 + module_init(cicada_init); 147 + module_exit(cicada_exit);
+16 -24
drivers/net/r8169.c
··· 1406 1406 dev = alloc_etherdev(sizeof (*tp)); 1407 1407 if (dev == NULL) { 1408 1408 if (netif_msg_drv(&debug)) 1409 - printk(KERN_ERR PFX "unable to alloc new ethernet\n"); 1409 + dev_err(&pdev->dev, "unable to alloc new ethernet\n"); 1410 1410 goto err_out; 1411 1411 } 1412 1412 ··· 1418 1418 /* enable device (incl. PCI PM wakeup and hotplug setup) */ 1419 1419 rc = pci_enable_device(pdev); 1420 1420 if (rc < 0) { 1421 - if (netif_msg_probe(tp)) { 1422 - printk(KERN_ERR PFX "%s: enable failure\n", 1423 - pci_name(pdev)); 1424 - } 1421 + if (netif_msg_probe(tp)) 1422 + dev_err(&pdev->dev, "enable failure\n"); 1425 1423 goto err_out_free_dev; 1426 1424 } 1427 1425 ··· 1435 1437 pci_read_config_word(pdev, pm_cap + PCI_PM_CTRL, &pwr_command); 1436 1438 acpi_idle_state = pwr_command & PCI_PM_CTRL_STATE_MASK; 1437 1439 } else { 1438 - if (netif_msg_probe(tp)) { 1439 - printk(KERN_ERR PFX 1440 + if (netif_msg_probe(tp)) 1441 + dev_err(&pdev->dev, 1440 1442 "PowerManagement capability not found.\n"); 1441 - } 1442 1443 } 1443 1444 1444 1445 /* make sure PCI base addr 1 is MMIO */ 1445 1446 if (!(pci_resource_flags(pdev, 1) & IORESOURCE_MEM)) { 1446 - if (netif_msg_probe(tp)) { 1447 - printk(KERN_ERR PFX 1447 + if (netif_msg_probe(tp)) 1448 + dev_err(&pdev->dev, 1448 1449 "region #1 not an MMIO resource, aborting\n"); 1449 - } 1450 1450 rc = -ENODEV; 1451 1451 goto err_out_mwi; 1452 1452 } 1453 1453 /* check for weird/broken PCI region reporting */ 1454 1454 if (pci_resource_len(pdev, 1) < R8169_REGS_SIZE) { 1455 - if (netif_msg_probe(tp)) { 1456 - printk(KERN_ERR PFX 1455 + if (netif_msg_probe(tp)) 1456 + dev_err(&pdev->dev, 1457 1457 "Invalid PCI region size(s), aborting\n"); 1458 - } 1459 1458 rc = -ENODEV; 1460 1459 goto err_out_mwi; 1461 1460 } 1462 1461 1463 1462 rc = pci_request_regions(pdev, MODULENAME); 1464 1463 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 - } 1464 + if (netif_msg_probe(tp)) 1465 + dev_err(&pdev->dev, "could not request regions.\n"); 1469 1466 goto err_out_mwi; 1470 1467 } 1471 1468 ··· 1473 1480 } else { 1474 1481 rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 1475 1482 if (rc < 0) { 1476 - if (netif_msg_probe(tp)) { 1477 - printk(KERN_ERR PFX 1483 + if (netif_msg_probe(tp)) 1484 + dev_err(&pdev->dev, 1478 1485 "DMA configuration failed.\n"); 1479 - } 1480 1486 goto err_out_free_res; 1481 1487 } 1482 1488 } ··· 1486 1494 ioaddr = ioremap(pci_resource_start(pdev, 1), R8169_REGS_SIZE); 1487 1495 if (ioaddr == NULL) { 1488 1496 if (netif_msg_probe(tp)) 1489 - printk(KERN_ERR PFX "cannot remap MMIO, aborting\n"); 1497 + dev_err(&pdev->dev, "cannot remap MMIO, aborting\n"); 1490 1498 rc = -EIO; 1491 1499 goto err_out_free_res; 1492 1500 } ··· 1518 1526 if (i < 0) { 1519 1527 /* Unknown chip: assume array element #0, original RTL-8169 */ 1520 1528 if (netif_msg_probe(tp)) { 1521 - printk(KERN_DEBUG PFX "PCI device %s: " 1529 + dev_printk(KERN_DEBUG, &pdev->dev, 1522 1530 "unknown chip version, assuming %s\n", 1523 - pci_name(pdev), rtl_chip_info[0].name); 1531 + rtl_chip_info[0].name); 1524 1532 } 1525 1533 i++; 1526 1534 }
+3 -120
drivers/net/starfire.c
··· 22 22 23 23 Support and updates available at 24 24 http://www.scyld.com/network/starfire.html 25 + [link no longer provides useful info -jgarzik] 25 26 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 27 */ 144 28 145 29 #define DRV_NAME "starfire" 146 - #define DRV_VERSION "1.03+LK1.4.2.1" 147 - #define DRV_RELDATE "October 3, 2005" 30 + #define DRV_VERSION "2.0" 31 + #define DRV_RELDATE "June 27, 2006" 148 32 149 33 #include <linux/module.h> 150 34 #include <linux/kernel.h> ··· 730 846 goto err_out_free_netdev; 731 847 } 732 848 733 - /* ioremap is borken in Linux-2.2.x/sparc64 */ 734 849 base = ioremap(ioaddr, io_size); 735 850 if (!base) { 736 851 printk(KERN_ERR DRV_NAME " %d: cannot remap %#x @ %#lx, aborting\n",
+14 -92
drivers/net/sundance.c
··· 16 16 17 17 Support and updates available at 18 18 http://www.scyld.com/network/sundance.html 19 + [link no longer provides useful info -jgarzik] 19 20 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 21 */ 100 22 101 23 #define DRV_NAME "sundance" 102 - #define DRV_VERSION "1.01+LK1.11" 103 - #define DRV_RELDATE "14-Jun-2006" 24 + #define DRV_VERSION "1.1" 25 + #define DRV_RELDATE "27-Jun-2006" 104 26 105 27 106 28 /* The user-configurable values. ··· 204 282 #define USE_IO_OPS 1 205 283 #endif 206 284 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,} 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 + { } 216 294 }; 217 295 MODULE_DEVICE_TABLE(pci, sundance_pci_tbl); 218 296 ··· 223 301 struct pci_id_info { 224 302 const char *name; 225 303 }; 226 - static const struct pci_id_info pci_id_tbl[] = { 304 + static const struct pci_id_info pci_id_tbl[] __devinitdata = { 227 305 {"D-Link DFE-550TX FAST Ethernet Adapter"}, 228 306 {"D-Link DFE-550FX 100Mbps Fiber-optics Adapter"}, 229 307 {"D-Link DFE-580TX 4 port Server Adapter"}, ··· 231 309 {"D-Link DL10050-based FAST Ethernet Adapter"}, 232 310 {"Sundance Technology Alta"}, 233 311 {"IC Plus Corporation IP100A FAST Ethernet Adapter"}, 234 - {NULL,}, /* 0 terminated list. */ 312 + { } /* terminate list. */ 235 313 }; 236 314 237 315 /* This driver was written to use PCI memory space, however x86-oriented
+13 -16
drivers/net/tulip/winbond-840.c
··· 224 224 }; 225 225 MODULE_DEVICE_TABLE(pci, w840_pci_tbl); 226 226 227 + enum { 228 + netdev_res_size = 128, /* size of PCI BAR resource */ 229 + }; 230 + 227 231 struct pci_id_info { 228 232 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. */ 233 + int drv_flags; /* Driver use, intended as capability flags. */ 235 234 }; 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. */ 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. */ 245 242 }; 246 243 247 244 /* This driver was written to use PCI memory space, however some x86 systems ··· 396 399 #ifdef USE_IO_OPS 397 400 bar = 0; 398 401 #endif 399 - ioaddr = pci_iomap(pdev, bar, pci_id_tbl[chip_idx].io_size); 402 + ioaddr = pci_iomap(pdev, bar, netdev_res_size); 400 403 if (!ioaddr) 401 404 goto err_out_free_res; 402 405
+4 -23
drivers/net/tulip/xircom_tulip_cb.c
··· 10 10 410 Severn Ave., Suite 210 11 11 Annapolis MD 21403 12 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 13 */ 27 14 28 15 #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 16 + #define DRV_VERSION "0.92" 17 + #define DRV_RELDATE "June 27, 2006" 33 18 34 19 /* A few user-configurable values. */ 35 20 ··· 291 306 struct xircom_tx_desc tx_ring[TX_RING_SIZE]; 292 307 /* The saved address of a sent-in-place packet/buffer, for skfree(). */ 293 308 struct sk_buff* tx_skbuff[TX_RING_SIZE]; 294 - #ifdef CARDBUS 309 + 295 310 /* The X3201-3 requires 4-byte aligned tx bufs */ 296 311 struct sk_buff* tx_aligned_skbuff[TX_RING_SIZE]; 297 - #endif 312 + 298 313 /* The addresses of receive-in-place skbuffs. */ 299 314 struct sk_buff* rx_skbuff[RX_RING_SIZE]; 300 315 u16 setup_frame[PKT_SETUP_SZ / sizeof(u16)]; /* Pseudo-Tx frame to init address table. */ ··· 893 908 tp->tx_skbuff[i] = NULL; 894 909 tp->tx_ring[i].status = 0; 895 910 tp->tx_ring[i].buffer2 = virt_to_bus(&tp->tx_ring[i+1]); 896 - #ifdef CARDBUS 897 911 if (tp->chip_id == X3201_3) 898 912 tp->tx_aligned_skbuff[i] = dev_alloc_skb(PKT_BUF_SZ); 899 - #endif /* CARDBUS */ 900 913 } 901 914 tp->tx_ring[i-1].buffer2 = virt_to_bus(&tp->tx_ring[0]); 902 915 } ··· 914 931 entry = tp->cur_tx % TX_RING_SIZE; 915 932 916 933 tp->tx_skbuff[entry] = skb; 917 - #ifdef CARDBUS 918 934 if (tp->chip_id == X3201_3) { 919 935 memcpy(tp->tx_aligned_skbuff[entry]->data,skb->data,skb->len); 920 936 tp->tx_ring[entry].buffer1 = virt_to_bus(tp->tx_aligned_skbuff[entry]->data); 921 937 } else 922 - #endif 923 938 tp->tx_ring[entry].buffer1 = virt_to_bus(skb->data); 924 939 925 940 if (tp->cur_tx - tp->dirty_tx < TX_RING_SIZE/2) {/* Typical path */
+8 -113
drivers/net/via-rhine.c
··· 25 25 version. He may or may not be interested in bug reports on this 26 26 code. You can find his versions at: 27 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. 28 + [link no longer provides useful info -jgarzik] 133 29 134 30 */ 135 31 136 32 #define DRV_NAME "via-rhine" 137 - #define DRV_VERSION "1.2.0-2.6" 138 - #define DRV_RELDATE "June-10-2004" 33 + #define DRV_VERSION "1.4.0" 34 + #define DRV_RELDATE "June-27-2006" 139 35 140 36 141 37 /* A few user-configurable values. ··· 252 356 /* Beware of PCI posted writes */ 253 357 #define IOSYNC do { ioread8(ioaddr + StationAddr); } while (0) 254 358 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 */ 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 */ 261 364 { } /* terminate list */ 262 365 }; 263 366 MODULE_DEVICE_TABLE(pci, rhine_pci_tbl);
+50 -52
drivers/net/via-velocity.c
··· 229 229 module_param(rx_copybreak, int, 0644); 230 230 MODULE_PARM_DESC(rx_copybreak, "Copy breakpoint for copy-only-tiny-frames"); 231 231 232 - static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info); 232 + static void velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, 233 + const struct velocity_info_tbl *info); 233 234 static int velocity_get_pci_info(struct velocity_info *, struct pci_dev *pdev); 234 235 static void velocity_print_info(struct velocity_info *vptr); 235 236 static int velocity_open(struct net_device *dev); ··· 295 294 * Internal board variants. At the moment we have only one 296 295 */ 297 296 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} 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 + { } 301 300 }; 302 301 303 302 /* ··· 305 304 * device driver. Used for hotplug autoloading. 306 305 */ 307 306 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, } 307 + static const struct pci_device_id velocity_id_table[] __devinitdata = { 308 + { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_612X) }, 309 + { } 312 310 }; 313 311 314 312 MODULE_DEVICE_TABLE(pci, velocity_id_table); ··· 341 341 static void __devexit velocity_remove1(struct pci_dev *pdev) 342 342 { 343 343 struct net_device *dev = pci_get_drvdata(pdev); 344 - struct velocity_info *vptr = dev->priv; 344 + struct velocity_info *vptr = netdev_priv(dev); 345 345 346 346 #ifdef CONFIG_PM 347 347 unsigned long flags; ··· 686 686 static int first = 1; 687 687 struct net_device *dev; 688 688 int i; 689 - struct velocity_info_tbl *info = (struct velocity_info_tbl *) ent->driver_data; 689 + const struct velocity_info_tbl *info = &chip_info_table[ent->driver_data]; 690 690 struct velocity_info *vptr; 691 691 struct mac_regs __iomem * regs; 692 692 int ret = -ENOMEM; 693 693 694 + /* FIXME: this driver, like almost all other ethernet drivers, 695 + * can support more than MAX_UNITS. 696 + */ 694 697 if (velocity_nics >= MAX_UNITS) { 695 - printk(KERN_NOTICE VELOCITY_NAME ": already found %d NICs.\n", 696 - velocity_nics); 698 + dev_notice(&pdev->dev, "already found %d NICs.\n", 699 + velocity_nics); 697 700 return -ENODEV; 698 701 } 699 702 700 703 dev = alloc_etherdev(sizeof(struct velocity_info)); 701 - 702 - if (dev == NULL) { 703 - printk(KERN_ERR VELOCITY_NAME ": allocate net device failed.\n"); 704 + if (!dev) { 705 + dev_err(&pdev->dev, "allocate net device failed.\n"); 704 706 goto out; 705 707 } 706 708 ··· 710 708 711 709 SET_MODULE_OWNER(dev); 712 710 SET_NETDEV_DEV(dev, &pdev->dev); 713 - vptr = dev->priv; 711 + vptr = netdev_priv(dev); 714 712 715 713 716 714 if (first) { ··· 733 731 734 732 ret = velocity_get_pci_info(vptr, pdev); 735 733 if (ret < 0) { 736 - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); 734 + /* error message already printed */ 737 735 goto err_disable; 738 736 } 739 737 740 738 ret = pci_request_regions(pdev, VELOCITY_NAME); 741 739 if (ret < 0) { 742 - printk(KERN_ERR VELOCITY_NAME ": Failed to find PCI device.\n"); 740 + dev_err(&pdev->dev, "No PCI resources.\n"); 743 741 goto err_disable; 744 742 } 745 743 746 - regs = ioremap(vptr->memaddr, vptr->io_size); 744 + regs = ioremap(vptr->memaddr, VELOCITY_IO_SIZE); 747 745 if (regs == NULL) { 748 746 ret = -EIO; 749 747 goto err_release_res; ··· 861 859 * discovered. 862 860 */ 863 861 864 - static void __devinit velocity_init_info(struct pci_dev *pdev, struct velocity_info *vptr, struct velocity_info_tbl *info) 862 + static void __devinit velocity_init_info(struct pci_dev *pdev, 863 + struct velocity_info *vptr, 864 + const struct velocity_info_tbl *info) 865 865 { 866 866 memset(vptr, 0, sizeof(struct velocity_info)); 867 867 868 868 vptr->pdev = pdev; 869 869 vptr->chip_id = info->chip_id; 870 - vptr->io_size = info->io_size; 871 870 vptr->num_txq = info->txqueue; 872 871 vptr->multicast_limit = MCAM_SIZE; 873 872 spin_lock_init(&vptr->lock); ··· 886 883 887 884 static int __devinit velocity_get_pci_info(struct velocity_info *vptr, struct pci_dev *pdev) 888 885 { 889 - 890 - if(pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) 886 + if (pci_read_config_byte(pdev, PCI_REVISION_ID, &vptr->rev_id) < 0) 891 887 return -EIO; 892 888 893 889 pci_set_master(pdev); ··· 894 892 vptr->ioaddr = pci_resource_start(pdev, 0); 895 893 vptr->memaddr = pci_resource_start(pdev, 1); 896 894 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)); 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"); 901 898 return -EINVAL; 902 899 } 903 900 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)); 901 + if ((pci_resource_flags(pdev, 1) & IORESOURCE_IO)) { 902 + dev_err(&pdev->dev, 903 + "region #1 is an I/O resource, aborting.\n"); 908 904 return -EINVAL; 909 905 } 910 906 911 - if(pci_resource_len(pdev, 1) < 256) 912 - { 913 - printk(KERN_ERR "%s: region #1 is too small.\n", 914 - pci_name(pdev)); 907 + if (pci_resource_len(pdev, 1) < VELOCITY_IO_SIZE) { 908 + dev_err(&pdev->dev, "region #1 is too small.\n"); 915 909 return -EINVAL; 916 910 } 917 911 vptr->pdev = pdev; ··· 1726 1728 1727 1729 static int velocity_open(struct net_device *dev) 1728 1730 { 1729 - struct velocity_info *vptr = dev->priv; 1731 + struct velocity_info *vptr = netdev_priv(dev); 1730 1732 int ret; 1731 1733 1732 1734 vptr->rx_buf_sz = (dev->mtu <= 1504 ? PKT_BUF_SZ : dev->mtu + 32); ··· 1783 1785 1784 1786 static int velocity_change_mtu(struct net_device *dev, int new_mtu) 1785 1787 { 1786 - struct velocity_info *vptr = dev->priv; 1788 + struct velocity_info *vptr = netdev_priv(dev); 1787 1789 unsigned long flags; 1788 1790 int oldmtu = dev->mtu; 1789 1791 int ret = 0; ··· 1859 1861 1860 1862 static int velocity_close(struct net_device *dev) 1861 1863 { 1862 - struct velocity_info *vptr = dev->priv; 1864 + struct velocity_info *vptr = netdev_priv(dev); 1863 1865 1864 1866 netif_stop_queue(dev); 1865 1867 velocity_shutdown(vptr); ··· 1892 1894 1893 1895 static int velocity_xmit(struct sk_buff *skb, struct net_device *dev) 1894 1896 { 1895 - struct velocity_info *vptr = dev->priv; 1897 + struct velocity_info *vptr = netdev_priv(dev); 1896 1898 int qnum = 0; 1897 1899 struct tx_desc *td_ptr; 1898 1900 struct velocity_td_info *tdinfo; ··· 2047 2049 static int velocity_intr(int irq, void *dev_instance, struct pt_regs *regs) 2048 2050 { 2049 2051 struct net_device *dev = dev_instance; 2050 - struct velocity_info *vptr = dev->priv; 2052 + struct velocity_info *vptr = netdev_priv(dev); 2051 2053 u32 isr_status; 2052 2054 int max_count = 0; 2053 2055 ··· 2102 2104 2103 2105 static void velocity_set_multi(struct net_device *dev) 2104 2106 { 2105 - struct velocity_info *vptr = dev->priv; 2107 + struct velocity_info *vptr = netdev_priv(dev); 2106 2108 struct mac_regs __iomem * regs = vptr->mac_regs; 2107 2109 u8 rx_mode; 2108 2110 int i; ··· 2151 2153 2152 2154 static struct net_device_stats *velocity_get_stats(struct net_device *dev) 2153 2155 { 2154 - struct velocity_info *vptr = dev->priv; 2156 + struct velocity_info *vptr = netdev_priv(dev); 2155 2157 2156 2158 /* If the hardware is down, don't touch MII */ 2157 2159 if(!netif_running(dev)) ··· 2194 2196 2195 2197 static int velocity_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) 2196 2198 { 2197 - struct velocity_info *vptr = dev->priv; 2199 + struct velocity_info *vptr = netdev_priv(dev); 2198 2200 int ret; 2199 2201 2200 2202 /* If we are asked for information and the device is power ··· 2823 2825 2824 2826 static int velocity_ethtool_up(struct net_device *dev) 2825 2827 { 2826 - struct velocity_info *vptr = dev->priv; 2828 + struct velocity_info *vptr = netdev_priv(dev); 2827 2829 if (!netif_running(dev)) 2828 2830 pci_set_power_state(vptr->pdev, PCI_D0); 2829 2831 return 0; ··· 2839 2841 2840 2842 static void velocity_ethtool_down(struct net_device *dev) 2841 2843 { 2842 - struct velocity_info *vptr = dev->priv; 2844 + struct velocity_info *vptr = netdev_priv(dev); 2843 2845 if (!netif_running(dev)) 2844 2846 pci_set_power_state(vptr->pdev, PCI_D3hot); 2845 2847 } 2846 2848 2847 2849 static int velocity_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2848 2850 { 2849 - struct velocity_info *vptr = dev->priv; 2851 + struct velocity_info *vptr = netdev_priv(dev); 2850 2852 struct mac_regs __iomem * regs = vptr->mac_regs; 2851 2853 u32 status; 2852 2854 status = check_connection_type(vptr->mac_regs); ··· 2871 2873 2872 2874 static int velocity_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 2873 2875 { 2874 - struct velocity_info *vptr = dev->priv; 2876 + struct velocity_info *vptr = netdev_priv(dev); 2875 2877 u32 curr_status; 2876 2878 u32 new_status = 0; 2877 2879 int ret = 0; ··· 2894 2896 2895 2897 static u32 velocity_get_link(struct net_device *dev) 2896 2898 { 2897 - struct velocity_info *vptr = dev->priv; 2899 + struct velocity_info *vptr = netdev_priv(dev); 2898 2900 struct mac_regs __iomem * regs = vptr->mac_regs; 2899 2901 return BYTE_REG_BITS_IS_ON(PHYSR0_LINKGD, &regs->PHYSR0) ? 0 : 1; 2900 2902 } 2901 2903 2902 2904 static void velocity_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) 2903 2905 { 2904 - struct velocity_info *vptr = dev->priv; 2906 + struct velocity_info *vptr = netdev_priv(dev); 2905 2907 strcpy(info->driver, VELOCITY_NAME); 2906 2908 strcpy(info->version, VELOCITY_VERSION); 2907 2909 strcpy(info->bus_info, pci_name(vptr->pdev)); ··· 2909 2911 2910 2912 static void velocity_ethtool_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2911 2913 { 2912 - struct velocity_info *vptr = dev->priv; 2914 + struct velocity_info *vptr = netdev_priv(dev); 2913 2915 wol->supported = WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP; 2914 2916 wol->wolopts |= WAKE_MAGIC; 2915 2917 /* ··· 2925 2927 2926 2928 static int velocity_ethtool_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 2927 2929 { 2928 - struct velocity_info *vptr = dev->priv; 2930 + struct velocity_info *vptr = netdev_priv(dev); 2929 2931 2930 2932 if (!(wol->wolopts & (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_ARP))) 2931 2933 return -EFAULT; ··· 2990 2992 2991 2993 static int velocity_mii_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) 2992 2994 { 2993 - struct velocity_info *vptr = dev->priv; 2995 + struct velocity_info *vptr = netdev_priv(dev); 2994 2996 struct mac_regs __iomem * regs = vptr->mac_regs; 2995 2997 unsigned long flags; 2996 2998 struct mii_ioctl_data *miidata = if_mii(ifr);
+2 -2
drivers/net/via-velocity.h
··· 31 31 #define VELOCITY_FULL_DRV_NAM "VIA Networking Velocity Family Gigabit Ethernet Adapter Driver" 32 32 #define VELOCITY_VERSION "1.13" 33 33 34 + #define VELOCITY_IO_SIZE 256 35 + 34 36 #define PKT_BUF_SZ 1540 35 37 36 38 #define MAX_UNITS 8 ··· 1193 1191 struct velocity_info_tbl { 1194 1192 enum chip_type chip_id; 1195 1193 char *name; 1196 - int io_size; 1197 1194 int txqueue; 1198 1195 u32 flags; 1199 1196 }; ··· 1752 1751 struct mac_regs __iomem * mac_regs; 1753 1752 unsigned long memaddr; 1754 1753 unsigned long ioaddr; 1755 - u32 io_size; 1756 1754 1757 1755 u8 rev_id; 1758 1756
-12
drivers/net/wan/Kconfig
··· 134 134 The driver will be compiled as a module: the 135 135 module will be called sealevel. 136 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 137 # Generic HDLC 150 138 config HDLC 151 139 tristate "Generic HDLC layer"
-1
drivers/net/wan/Makefile
··· 28 28 obj-$(CONFIG_FARSYNC) += syncppp.o farsync.o 29 29 obj-$(CONFIG_DSCC4) += dscc4.o 30 30 obj-$(CONFIG_LANMEDIA) += syncppp.o 31 - obj-$(CONFIG_SYNCLINK_SYNCPPP) += syncppp.o 32 31 obj-$(CONFIG_X25_ASY) += x25_asy.o 33 32 34 33 obj-$(CONFIG_LANMEDIA) += lmc/
+1
drivers/net/wireless/Kconfig
··· 550 550 551 551 source "drivers/net/wireless/hostap/Kconfig" 552 552 source "drivers/net/wireless/bcm43xx/Kconfig" 553 + source "drivers/net/wireless/zd1211rw/Kconfig" 553 554 554 555 # yes, this works even when no drivers are selected 555 556 config NET_WIRELESS
+1
drivers/net/wireless/Makefile
··· 36 36 37 37 obj-$(CONFIG_HOSTAP) += hostap/ 38 38 obj-$(CONFIG_BCM43XX) += bcm43xx/ 39 + obj-$(CONFIG_ZD1211RW) += zd1211rw/ 39 40 40 41 # 16-bit wireless PCMCIA client drivers 41 42 obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o
+18 -13
drivers/net/wireless/bcm43xx/bcm43xx_main.c
··· 1885 1885 1886 1886 spin_lock(&bcm->irq_lock); 1887 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 + 1888 1897 reason = bcm43xx_read32(bcm, BCM43xx_MMIO_GEN_IRQ_REASON); 1889 1898 if (reason == 0xffffffff) { 1890 1899 /* irq not for us (shared irq) */ ··· 1915 1906 1916 1907 bcm43xx_interrupt_ack(bcm, reason); 1917 1908 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 - } 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); 1931 1914 1932 1915 out: 1933 1916 mmiowb(); ··· 3698 3697 if (sec->flags & SEC_ENCRYPT) { 3699 3698 secinfo->encrypt = sec->encrypt; 3700 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); 3701 3704 } 3702 3705 dprintk("\n"); 3703 3706 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED &&
-24
drivers/net/wireless/bcm43xx/bcm43xx_main.h
··· 112 112 return bcm43xx_channel_to_freq_bg(channel); 113 113 } 114 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 115 void bcm43xx_tsf_read(struct bcm43xx_private *bcm, u64 *tsf); 140 116 void bcm43xx_tsf_write(struct bcm43xx_private *bcm, u64 tsf); 141 117
+2 -5
drivers/net/wireless/bcm43xx/bcm43xx_radio.c
··· 1594 1594 u16 r8, tmp; 1595 1595 u16 freq; 1596 1596 1597 + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) 1598 + return -EINVAL; 1597 1599 if ((radio->manufact == 0x17F) && 1598 1600 (radio->version == 0x2060) && 1599 1601 (radio->revision == 1)) { 1600 - if (channel > 200) 1601 - return -EINVAL; 1602 1602 freq = channel2freq_a(channel); 1603 1603 1604 1604 r8 = bcm43xx_radio_read16(bcm, 0x0008); ··· 1651 1651 TODO(); //TODO: TSSI2dbm workaround 1652 1652 bcm43xx_phy_xmitpower(bcm);//FIXME correct? 1653 1653 } else { 1654 - if ((channel < 1) || (channel > 14)) 1655 - return -EINVAL; 1656 - 1657 1654 if (synthetic_pu_workaround) 1658 1655 bcm43xx_synth_pu_workaround(bcm, channel); 1659 1656
+1 -1
drivers/net/wireless/bcm43xx/bcm43xx_wx.c
··· 119 119 channel = bcm43xx_freq_to_channel(bcm, data->freq.m); 120 120 freq = data->freq.m; 121 121 } 122 - if (!bcm43xx_is_valid_channel(bcm, channel)) 122 + if (!ieee80211_is_valid_channel(bcm->ieee, channel)) 123 123 goto out_unlock; 124 124 if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED) { 125 125 //ieee80211softmac_disassoc(softmac, $REASON);
+4 -1
drivers/net/wireless/bcm43xx/bcm43xx_xmit.c
··· 296 296 u16 control = 0; 297 297 u16 wsec_rate = 0; 298 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); 299 301 300 302 /* Now construct the TX header. */ 301 303 memset(txhdr, 0, sizeof(*txhdr)); 302 304 303 - bitrate = bcm->softmac->txrates.default_rate; 305 + bitrate = ieee80211softmac_suggest_txrate(bcm->softmac, 306 + is_multicast_ether_addr(wireless_header->addr1), is_mgt); 304 307 ofdm_modulation = !(ieee80211_is_cck_rate(bitrate)); 305 308 fallback_bitrate = bcm43xx_calc_fallback_rate(bitrate); 306 309 fallback_ofdm_modulation = !(ieee80211_is_cck_rate(fallback_bitrate));
+2
drivers/net/wireless/hostap/hostap_plx.c
··· 66 66 PLXDEV(0x10b7, 0x7770, "3Com AirConnect PCI 777A"), 67 67 PLXDEV(0x111a, 0x1023, "Siemens SpeedStream SS1023"), 68 68 PLXDEV(0x126c, 0x8030, "Nortel emobility"), 69 + PLXDEV(0x1562, 0x0001, "Symbol LA-4123"), 69 70 PLXDEV(0x1385, 0x4100, "Netgear MA301"), 70 71 PLXDEV(0x15e8, 0x0130, "National Datacomm NCP130 (PLX9052)"), 71 72 PLXDEV(0x15e8, 0x0131, "National Datacomm NCP130 (TMD7160)"), 72 73 PLXDEV(0x1638, 0x1100, "Eumitcom WL11000"), 74 + PLXDEV(0x16ab, 0x1100, "Global Sun Tech GL24110P"), 73 75 PLXDEV(0x16ab, 0x1101, "Global Sun Tech GL24110P (?)"), 74 76 PLXDEV(0x16ab, 0x1102, "Linksys WPC11 with WDT11"), 75 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 19 20 20 Support and updates available at 21 21 http://www.scyld.com/network/yellowfin.html 22 + [link no longer provides useful info -jgarzik] 22 23 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 24 */ 49 25 50 26 #define DRV_NAME "yellowfin" 51 - #define DRV_VERSION "1.05+LK1.1.6" 52 - #define DRV_RELDATE "Feb 11, 2002" 27 + #define DRV_VERSION "2.0" 28 + #define DRV_RELDATE "Jun 27, 2006" 53 29 54 30 #define PFX DRV_NAME ": " 55 31 ··· 215 239 HasMACAddrBug=32, /* Only on early revs. */ 216 240 DontUseEeprom=64, /* Don't read the MAC from the EEPROm. */ 217 241 }; 242 + 218 243 /* The PCI I/O space extent. */ 219 - #define YELLOWFIN_SIZE 0x100 244 + enum { 245 + YELLOWFIN_SIZE = 0x100, 246 + }; 220 247 221 248 struct pci_id_info { 222 249 const char *name; ··· 227 248 int pci, pci_mask, subsystem, subsystem_mask; 228 249 int revision, revision_mask; /* Only 8 bits. */ 229 250 } id; 230 - int io_size; /* Needed for I/O region check or ioremap(). */ 231 251 int drv_flags; /* Driver use, intended as capability flags. */ 232 252 }; 233 253 234 254 static const struct pci_id_info pci_id_tbl[] = { 235 255 {"Yellowfin G-NIC Gigabit Ethernet", { 0x07021000, 0xffffffff}, 236 - YELLOWFIN_SIZE, 237 256 FullTxStatus | IsGigabit | HasMulticastBug | HasMACAddrBug | DontUseEeprom}, 238 257 {"Symbios SYM83C885", { 0x07011000, 0xffffffff}, 239 - YELLOWFIN_SIZE, HasMII | DontUseEeprom }, 258 + HasMII | DontUseEeprom }, 240 259 { } 241 260 }; 242 261
+1
include/net/ieee80211softmac.h
··· 104 104 */ 105 105 u8 static_essid:1, 106 106 associating:1, 107 + assoc_wait:1, 107 108 bssvalid:1, 108 109 bssfixed:1; 109 110
+3 -1
net/ieee80211/ieee80211_rx.c
··· 368 368 369 369 /* Put this code here so that we avoid duplicating it in all 370 370 * Rx paths. - Jean II */ 371 + #ifdef CONFIG_WIRELESS_EXT 371 372 #ifdef IW_WIRELESS_SPY /* defined in iw_handler.h */ 372 373 /* If spy monitoring on */ 373 374 if (ieee->spy_data.spy_number > 0) { ··· 397 396 wireless_spy_update(ieee->dev, hdr->addr2, &wstats); 398 397 } 399 398 #endif /* IW_WIRELESS_SPY */ 399 + #endif /* CONFIG_WIRELESS_EXT */ 400 400 401 401 #ifdef NOT_YET 402 402 hostap_update_rx_stats(local->ap, hdr, rx_stats); 403 403 #endif 404 404 405 405 if (ieee->iw_mode == IW_MODE_MONITOR) { 406 - ieee80211_monitor_rx(ieee, skb, rx_stats); 407 406 stats->rx_packets++; 408 407 stats->rx_bytes += skb->len; 408 + ieee80211_monitor_rx(ieee, skb, rx_stats); 409 409 return 1; 410 410 } 411 411
+11 -4
net/ieee80211/ieee80211_tx.c
··· 562 562 struct net_device_stats *stats = &ieee->stats; 563 563 struct sk_buff *skb_frag; 564 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]; 565 568 566 569 spin_lock_irqsave(&ieee->lock, flags); 567 570 568 - if (encrypt_mpdu && !ieee->sec.encrypt) 571 + if (encrypt_mpdu && (!ieee->sec.encrypt || !crypt)) 569 572 encrypt_mpdu = 0; 570 573 571 574 /* If there is no driver handler to take the TXB, dont' bother ··· 584 581 goto success; 585 582 } 586 583 587 - if (encrypt_mpdu) 584 + if (encrypt_mpdu) { 588 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 + } 589 590 590 591 /* When we allocate the TXB we allocate enough space for the reserve 591 592 * and full fragment bytes (bytes_per_frag doesn't include prefix, 592 593 * postfix, header, FCS, etc.) */ 593 - txb = ieee80211_alloc_txb(1, total_len, ieee->tx_headroom, GFP_ATOMIC); 594 + txb = ieee80211_alloc_txb(1, fraglen, headroom, GFP_ATOMIC); 594 595 if (unlikely(!txb)) { 595 596 printk(KERN_WARNING "%s: Could not allocate TXB\n", 596 597 ieee->dev->name); 597 598 goto failed; 598 599 } 599 600 txb->encrypted = 0; 600 - txb->payload_size = total_len; 601 + txb->payload_size = fraglen; 601 602 602 603 skb_frag = txb->fragments[0]; 603 604
+24 -7
net/ieee80211/softmac/ieee80211softmac_assoc.c
··· 47 47 48 48 dprintk(KERN_INFO PFX "sent association request!\n"); 49 49 50 - /* Change the state to associating */ 51 50 spin_lock_irqsave(&mac->lock, flags); 52 - mac->associnfo.associating = 1; 53 51 mac->associated = 0; /* just to make sure */ 54 52 55 53 /* Set a timer for timeout */ ··· 61 63 ieee80211softmac_assoc_timeout(void *d) 62 64 { 63 65 struct ieee80211softmac_device *mac = (struct ieee80211softmac_device *)d; 66 + struct ieee80211softmac_network *n; 64 67 unsigned long flags; 65 68 66 69 spin_lock_irqsave(&mac->lock, flags); ··· 74 75 mac->associnfo.associating = 0; 75 76 mac->associnfo.bssvalid = 0; 76 77 mac->associated = 0; 78 + 79 + n = ieee80211softmac_get_network_by_bssid_locked(mac, mac->associnfo.bssid); 77 80 spin_unlock_irqrestore(&mac->lock, flags); 78 81 79 82 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); 83 + ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_TIMEOUT, n); 82 84 } 83 85 84 86 void ··· 203 203 if (mac->associated) 204 204 ieee80211softmac_send_disassoc_req(mac, WLAN_REASON_DISASSOC_STA_HAS_LEFT); 205 205 206 + spin_lock_irqsave(&mac->lock, flags); 207 + mac->associnfo.associating = 1; 208 + spin_unlock_irqrestore(&mac->lock, flags); 209 + 206 210 /* try to find the requested network in our list, if we found one already */ 207 211 if (bssvalid || mac->associnfo.bssfixed) 208 212 found = ieee80211softmac_get_network_by_bssid(mac, mac->associnfo.bssid); ··· 299 295 memcpy(mac->associnfo.associate_essid.data, found->essid.data, IW_ESSID_MAX_SIZE + 1); 300 296 301 297 /* we found a network! authenticate (if necessary) and associate to it. */ 302 - if (!found->authenticated) { 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) { 303 307 /* This relies on the fact that _auth_req only queues the work, 304 308 * otherwise adding the notification would be racy. */ 305 309 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); 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 + } 308 315 } else { 309 316 printkl(KERN_WARNING PFX "Not authenticated, but requesting authentication failed. Giving up to associate\n"); 317 + mac->associnfo.assoc_wait = 0; 310 318 ieee80211softmac_call_events(mac, IEEE80211SOFTMAC_EVENT_ASSOCIATE_FAILED, found); 311 319 } 312 320 return; 313 321 } 314 322 /* finally! now we can start associating */ 323 + mac->associnfo.assoc_wait = 0; 315 324 ieee80211softmac_assoc(mac, found); 316 325 } 317 326
+2 -2
net/ieee80211/softmac/ieee80211softmac_auth.c
··· 36 36 struct ieee80211softmac_auth_queue_item *auth; 37 37 unsigned long flags; 38 38 39 - if (net->authenticating) 39 + if (net->authenticating || net->authenticated) 40 40 return 0; 41 + net->authenticating = 1; 41 42 42 43 /* Add the network if it's not already added */ 43 44 ieee80211softmac_add_network(mac, net); ··· 93 92 return; 94 93 } 95 94 net->authenticated = 0; 96 - net->authenticating = 1; 97 95 /* add a timeout call so we eventually give up waiting for an auth reply */ 98 96 schedule_delayed_work(&auth->work, IEEE80211SOFTMAC_AUTH_TIMEOUT); 99 97 auth->retry--;
+3
net/ieee80211/softmac/ieee80211softmac_io.c
··· 229 229 return 0; 230 230 ieee80211softmac_hdr_3addr(mac, &((*pkt)->header), IEEE80211_STYPE_ASSOC_REQ, net->bssid, net->bssid); 231 231 232 + /* Fill in the capabilities */ 233 + (*pkt)->capability = ieee80211softmac_capabilities(mac, net); 234 + 232 235 /* Fill in Listen Interval (?) */ 233 236 (*pkt)->listen_interval = cpu_to_le16(10); 234 237
+34 -2
net/ieee80211/softmac/ieee80211softmac_wx.c
··· 70 70 char *extra) 71 71 { 72 72 struct ieee80211softmac_device *sm = ieee80211_priv(net_dev); 73 + struct ieee80211softmac_network *n; 74 + struct ieee80211softmac_auth_queue_item *authptr; 73 75 int length = 0; 74 76 unsigned long flags; 75 - 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 + 76 107 spin_lock_irqsave(&sm->lock, flags); 77 - 108 + 78 109 sm->associnfo.static_essid = 0; 110 + sm->associnfo.assoc_wait = 0; 79 111 80 112 if (data->essid.flags && data->essid.length && extra /*required?*/) { 81 113 length = min(data->essid.length - 1, IW_ESSID_MAX_SIZE);