aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/bcm43xx/bcm43xx_wx.c
diff options
context:
space:
mode:
authorMichael Buesch <mbuesch@freenet.de>2006-02-19 08:09:20 -0500
committerJohn W. Linville <linville@tuxdriver.com>2006-03-27 11:18:36 -0500
commitea0922b067a0863f9a4198740651fd47a22af7f1 (patch)
treeb8632f6842be02a10a3fe52d58aa89663e16c789 /drivers/net/wireless/bcm43xx/bcm43xx_wx.c
parent489423c8d0ba2b4311530502f7b5a331da9a60f9 (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.c66
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;
838out_kfree: 827out_kfree:
839 kfree(sprom); 828 kfree(sprom);
840out: 829out:
@@ -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;
925out_unlock: 871out_unlock:
926 spin_unlock_irqrestore(&bcm->lock, flags); 872 spin_unlock_irqrestore(&bcm->lock, flags);
927out_kfree: 873out_kfree: