diff options
author | Michael Buesch <mbuesch@freenet.de> | 2006-02-19 08:09:20 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2006-03-27 11:18:36 -0500 |
commit | ea0922b067a0863f9a4198740651fd47a22af7f1 (patch) | |
tree | b8632f6842be02a10a3fe52d58aa89663e16c789 /drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |
parent | 489423c8d0ba2b4311530502f7b5a331da9a60f9 (diff) |
[PATCH] bcm43xx: Move sprom lowlevel reading/writing to its own functions.
Signed-off-by: Michael Buesch <mbuesch@freenet.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/bcm43xx/bcm43xx_wx.c')
-rw-r--r-- | drivers/net/wireless/bcm43xx/bcm43xx_wx.c | 66 |
1 files changed, 6 insertions, 60 deletions
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c index 4c972cdc0a24..df37d28996c9 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_wx.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_wx.c | |||
@@ -782,7 +782,6 @@ static int hex2sprom(u16 *sprom, const char *dump, unsigned int len) | |||
782 | char tmp[5] = { 0 }; | 782 | char tmp[5] = { 0 }; |
783 | int cnt = 0; | 783 | int cnt = 0; |
784 | unsigned long parsed; | 784 | unsigned long parsed; |
785 | u8 crc, expected_crc; | ||
786 | 785 | ||
787 | if (len < BCM43xx_SPROM_SIZE * sizeof(u16) * 2) | 786 | if (len < BCM43xx_SPROM_SIZE * sizeof(u16) * 2) |
788 | return -EINVAL; | 787 | return -EINVAL; |
@@ -793,13 +792,6 @@ static int hex2sprom(u16 *sprom, const char *dump, unsigned int len) | |||
793 | sprom[cnt++] = swab16((u16)parsed); | 792 | sprom[cnt++] = swab16((u16)parsed); |
794 | } | 793 | } |
795 | 794 | ||
796 | crc = bcm43xx_sprom_crc(sprom); | ||
797 | expected_crc = (sprom[BCM43xx_SPROM_VERSION] & 0xFF00) >> 8; | ||
798 | if (crc != expected_crc) { | ||
799 | printk(KERN_ERR PFX "SPROM input data: Invalid CRC\n"); | ||
800 | return -EINVAL; | ||
801 | } | ||
802 | |||
803 | return 0; | 795 | return 0; |
804 | } | 796 | } |
805 | 797 | ||
@@ -809,7 +801,7 @@ static int bcm43xx_wx_sprom_read(struct net_device *net_dev, | |||
809 | char *extra) | 801 | char *extra) |
810 | { | 802 | { |
811 | struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); | 803 | struct bcm43xx_private *bcm = bcm43xx_priv(net_dev); |
812 | int err = -EPERM, i; | 804 | int err = -EPERM; |
813 | u16 *sprom; | 805 | u16 *sprom; |
814 | unsigned long flags; | 806 | unsigned long flags; |
815 | 807 | ||
@@ -828,13 +820,10 @@ static int bcm43xx_wx_sprom_read(struct net_device *net_dev, | |||
828 | spin_unlock_irqrestore(&bcm->lock, flags); | 820 | spin_unlock_irqrestore(&bcm->lock, flags); |
829 | goto out_kfree; | 821 | goto out_kfree; |
830 | } | 822 | } |
831 | for (i = 0; i < BCM43xx_SPROM_SIZE; i++) | 823 | err = bcm43xx_sprom_read(bcm, sprom); |
832 | sprom[i] = bcm43xx_read16(bcm, BCM43xx_SPROM_BASE + (i * 2)); | ||
833 | spin_unlock_irqrestore(&bcm->lock, flags); | 824 | spin_unlock_irqrestore(&bcm->lock, flags); |
834 | 825 | if (!err) | |
835 | data->data.length = sprom2hex(sprom, extra); | 826 | data->data.length = sprom2hex(sprom, extra); |
836 | |||
837 | err = 0; | ||
838 | out_kfree: | 827 | out_kfree: |
839 | kfree(sprom); | 828 | kfree(sprom); |
840 | out: | 829 | out: |
@@ -852,8 +841,6 @@ static int bcm43xx_wx_sprom_write(struct net_device *net_dev, | |||
852 | unsigned long flags; | 841 | unsigned long flags; |
853 | char *input; | 842 | char *input; |
854 | unsigned int len; | 843 | unsigned int len; |
855 | u32 spromctl; | ||
856 | int i; | ||
857 | 844 | ||
858 | if (!capable(CAP_SYS_RAWIO)) | 845 | if (!capable(CAP_SYS_RAWIO)) |
859 | goto out; | 846 | goto out; |
@@ -878,50 +865,9 @@ static int bcm43xx_wx_sprom_write(struct net_device *net_dev, | |||
878 | 865 | ||
879 | spin_lock_irqsave(&bcm->lock, flags); | 866 | spin_lock_irqsave(&bcm->lock, flags); |
880 | err = -ENODEV; | 867 | err = -ENODEV; |
881 | if (!bcm->initialized) { | 868 | if (!bcm->initialized) |
882 | spin_unlock_irqrestore(&bcm->lock, flags); | ||
883 | goto out_kfree; | ||
884 | } | ||
885 | |||
886 | printk(KERN_INFO PFX "Writing SPROM. Do NOT turn off the power! Please stand by...\n"); | ||
887 | err = bcm43xx_pci_read_config32(bcm, BCM43xx_PCICFG_SPROMCTL, &spromctl); | ||
888 | if (err) { | ||
889 | printk(KERN_ERR PFX "Could not access SPROM control register.\n"); | ||
890 | goto out_unlock; | ||
891 | } | ||
892 | spromctl |= 0x10; /* SPROM WRITE enable. */ | ||
893 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | ||
894 | if (err) { | ||
895 | printk(KERN_ERR PFX "Could not access SPROM control register.\n"); | ||
896 | goto out_unlock; | ||
897 | } | ||
898 | /* We must burn lots of CPU cycles here, but that does not | ||
899 | * really matter as one does not write the SPROM every other minute... | ||
900 | */ | ||
901 | printk(KERN_INFO PFX "[ 0%%"); | ||
902 | mdelay(500); | ||
903 | for (i = 0; i < BCM43xx_SPROM_SIZE; i++) { | ||
904 | if (i == 16) | ||
905 | printk("25%%"); | ||
906 | else if (i == 32) | ||
907 | printk("50%%"); | ||
908 | else if (i == 48) | ||
909 | printk("75%%"); | ||
910 | else if (i % 2) | ||
911 | printk("."); | ||
912 | bcm43xx_write16(bcm, BCM43xx_SPROM_BASE + (i * 2), sprom[i]); | ||
913 | mdelay(20); | ||
914 | } | ||
915 | spromctl &= ~0x10; /* SPROM WRITE enable. */ | ||
916 | bcm43xx_pci_write_config32(bcm, BCM43xx_PCICFG_SPROMCTL, spromctl); | ||
917 | if (err) { | ||
918 | printk(KERN_ERR PFX "Could not access SPROM control register.\n"); | ||
919 | goto out_unlock; | 869 | goto out_unlock; |
920 | } | 870 | err = bcm43xx_sprom_write(bcm, sprom); |
921 | mdelay(500); | ||
922 | printk("100%% ]\n"); | ||
923 | printk(KERN_INFO PFX "SPROM written.\n"); | ||
924 | err = 0; | ||
925 | out_unlock: | 871 | out_unlock: |
926 | spin_unlock_irqrestore(&bcm->lock, flags); | 872 | spin_unlock_irqrestore(&bcm->lock, flags); |
927 | out_kfree: | 873 | out_kfree: |