Merge git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/v4l-dvb
[pandora-kernel.git] / drivers / net / wireless / b43legacy / radio.c
index a361dee..2df545c 100644 (file)
@@ -3,7 +3,7 @@
   Broadcom B43legacy wireless driver
 
   Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>,
-                    Stefano Brivio <st3@riseup.net>
+                    Stefano Brivio <stefano.brivio@polimi.it>
                     Michael Buesch <mbuesch@freenet.de>
                     Danny van Dyk <kugelfang@gentoo.org>
                     Andreas Jaggi <andreas.jaggi@waterwave.ch>
@@ -91,9 +91,10 @@ void b43legacy_radio_lock(struct b43legacy_wldev *dev)
 {
        u32 status;
 
-       status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD);
-       status |= B43legacy_SBF_RADIOREG_LOCK;
-       b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status);
+       status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL);
+       B43legacy_WARN_ON(status & B43legacy_MACCTL_RADIOLOCK);
+       status |= B43legacy_MACCTL_RADIOLOCK;
+       b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status);
        mmiowb();
        udelay(10);
 }
@@ -103,9 +104,10 @@ void b43legacy_radio_unlock(struct b43legacy_wldev *dev)
        u32 status;
 
        b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); /* dummy read */
-       status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD);
-       status &= ~B43legacy_SBF_RADIOREG_LOCK;
-       b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status);
+       status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL);
+       B43legacy_WARN_ON(!(status & B43legacy_MACCTL_RADIOLOCK));
+       status &= ~B43legacy_MACCTL_RADIOLOCK;
+       b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status);
        mmiowb();
 }
 
@@ -284,12 +286,11 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev)
        unsigned int j;
        unsigned int start;
        unsigned int end;
-       unsigned long phylock_flags;
 
        if (!((phy->type == B43legacy_PHYTYPE_G) && (phy->rev > 0)))
                return 0;
 
-       b43legacy_phy_lock(dev, phylock_flags);
+       b43legacy_phy_lock(dev);
        b43legacy_radio_lock(dev);
        b43legacy_phy_write(dev, 0x0802,
                            b43legacy_phy_read(dev, 0x0802) & 0xFFFC);
@@ -323,7 +324,7 @@ u8 b43legacy_radio_aci_scan(struct b43legacy_wldev *dev)
                        ret[j] = 1;
        }
        b43legacy_radio_unlock(dev);
-       b43legacy_phy_unlock(dev, phylock_flags);
+       b43legacy_phy_unlock(dev);
 
        return ret[channel - 1];
 }
@@ -356,7 +357,7 @@ void b43legacy_nrssi_hw_update(struct b43legacy_wldev *dev, u16 val)
        for (i = 0; i < 64; i++) {
                tmp = b43legacy_nrssi_hw_read(dev, i);
                tmp -= val;
-               tmp = limit_value(tmp, -32, 31);
+               tmp = clamp_val(tmp, -32, 31);
                b43legacy_nrssi_hw_write(dev, i, tmp);
        }
 }
@@ -374,7 +375,7 @@ void b43legacy_nrssi_mem_update(struct b43legacy_wldev *dev)
                tmp = (i - delta) * phy->nrssislope;
                tmp /= 0x10000;
                tmp += 0x3A;
-               tmp = limit_value(tmp, 0, 0x3F);
+               tmp = clamp_val(tmp, 0, 0x3F);
                phy->nrssi_lt[i] = tmp;
        }
 }
@@ -827,7 +828,7 @@ void b43legacy_calc_nrssi_threshold(struct b43legacy_wldev *dev)
        case B43legacy_PHYTYPE_B: {
                if (phy->radio_ver != 0x2050)
                        return;
-               if (!(dev->dev->bus->sprom.r1.boardflags_lo &
+               if (!(dev->dev->bus->sprom.boardflags_lo &
                    B43legacy_BFL_RSSI))
                        return;
 
@@ -838,7 +839,7 @@ void b43legacy_calc_nrssi_threshold(struct b43legacy_wldev *dev)
                } else
                        threshold = phy->nrssi[1] - 5;
 
-               threshold = limit_value(threshold, 0, 0x3E);
+               threshold = clamp_val(threshold, 0, 0x3E);
                b43legacy_phy_read(dev, 0x0020); /* dummy read */
                b43legacy_phy_write(dev, 0x0020, (((u16)threshold) << 8)
                                    | 0x001C);
@@ -857,7 +858,7 @@ void b43legacy_calc_nrssi_threshold(struct b43legacy_wldev *dev)
        }
        case B43legacy_PHYTYPE_G:
                if (!phy->gmode ||
-                   !(dev->dev->bus->sprom.r1.boardflags_lo &
+                   !(dev->dev->bus->sprom.boardflags_lo &
                    B43legacy_BFL_RSSI)) {
                        tmp16 = b43legacy_nrssi_hw_read(dev, 0x20);
                        if (tmp16 >= 0x20)
@@ -891,7 +892,7 @@ void b43legacy_calc_nrssi_threshold(struct b43legacy_wldev *dev)
                        else
                                a += 32;
                        a = a >> 6;
-                       a = limit_value(a, -31, 31);
+                       a = clamp_val(a, -31, 31);
 
                        b = b * (phy->nrssi[1] - phy->nrssi[0]);
                        b += (phy->nrssi[0] << 6);
@@ -900,7 +901,7 @@ void b43legacy_calc_nrssi_threshold(struct b43legacy_wldev *dev)
                        else
                                b += 32;
                        b = b >> 6;
-                       b = limit_value(b, -31, 31);
+                       b = clamp_val(b, -31, 31);
 
                        tmp_u16 = b43legacy_phy_read(dev, 0x048A) & 0xF000;
                        tmp_u16 |= ((u32)b & 0x0000003F);
@@ -1406,7 +1407,7 @@ static u16 b43legacy_get_812_value(struct b43legacy_wldev *dev, u8 lpd)
        if (!phy->gmode)
                return 0;
        if (!has_loopback_gain(phy)) {
-               if (phy->rev < 7 || !(dev->dev->bus->sprom.r1.boardflags_lo
+               if (phy->rev < 7 || !(dev->dev->bus->sprom.boardflags_lo
                    & B43legacy_BFL_EXTLNA)) {
                        switch (lpd) {
                        case LPD(0, 1, 1):
@@ -1459,7 +1460,7 @@ static u16 b43legacy_get_812_value(struct b43legacy_wldev *dev, u8 lpd)
                }
 
                loop_or = (loop << 8) | extern_lna_control;
-               if (phy->rev >= 7 && dev->dev->bus->sprom.r1.boardflags_lo
+               if (phy->rev >= 7 && dev->dev->bus->sprom.boardflags_lo
                    & B43legacy_BFL_EXTLNA) {
                        if (extern_lna_control)
                                loop_or |= 0x8000;
@@ -1550,7 +1551,7 @@ u16 b43legacy_radio_init2050(struct b43legacy_wldev *dev)
                                            b43legacy_get_812_value(dev,
                                            LPD(0, 1, 1)));
                        if (phy->rev < 7 ||
-                           !(dev->dev->bus->sprom.r1.boardflags_lo
+                           !(dev->dev->bus->sprom.boardflags_lo
                            & B43legacy_BFL_EXTLNA))
                                b43legacy_phy_write(dev, 0x0811, 0x01B3);
                        else
@@ -1786,7 +1787,7 @@ int b43legacy_radio_selectchannel(struct b43legacy_wldev *dev,
                          channel2freq_bg(channel));
 
        if (channel == 14) {
-               if (dev->dev->bus->sprom.r1.country_code == 5)   /* JAPAN) */
+               if (dev->dev->bus->sprom.country_code == 5)   /* JAPAN) */
                        b43legacy_shm_write32(dev, B43legacy_SHM_SHARED,
                                              B43legacy_UCODEFLAGS_OFFSET,
                                              b43legacy_shm_read32(dev,
@@ -1904,7 +1905,7 @@ void b43legacy_radio_set_txpower_a(struct b43legacy_wldev *dev, u16 txpower)
        u16 dac;
        u16 ilt;
 
-       txpower = limit_value(txpower, 0, 63);
+       txpower = clamp_val(txpower, 0, 63);
 
        pamp = b43legacy_get_txgain_freq_power_amp(txpower);
        pamp <<= 5;
@@ -2113,21 +2114,25 @@ void b43legacy_radio_turn_on(struct b43legacy_wldev *dev)
                B43legacy_BUG_ON(1);
        }
        phy->radio_on = 1;
-       b43legacy_leds_update(dev, 0);
 }
 
-void b43legacy_radio_turn_off(struct b43legacy_wldev *dev)
+void b43legacy_radio_turn_off(struct b43legacy_wldev *dev, bool force)
 {
        struct b43legacy_phy *phy = &dev->phy;
 
+       if (!phy->radio_on && !force)
+               return;
+
        if (phy->type == B43legacy_PHYTYPE_G && dev->dev->id.revision >= 5) {
                u16 rfover, rfoverval;
 
                rfover = b43legacy_phy_read(dev, B43legacy_PHY_RFOVER);
                rfoverval = b43legacy_phy_read(dev, B43legacy_PHY_RFOVERVAL);
-               phy->radio_off_context.rfover = rfover;
-               phy->radio_off_context.rfoverval = rfoverval;
-               phy->radio_off_context.valid = 1;
+               if (!force) {
+                       phy->radio_off_context.rfover = rfover;
+                       phy->radio_off_context.rfoverval = rfoverval;
+                       phy->radio_off_context.valid = 1;
+               }
                b43legacy_phy_write(dev, B43legacy_PHY_RFOVER, rfover | 0x008C);
                b43legacy_phy_write(dev, B43legacy_PHY_RFOVERVAL,
                                    rfoverval & 0xFF73);
@@ -2135,7 +2140,6 @@ void b43legacy_radio_turn_off(struct b43legacy_wldev *dev)
                b43legacy_phy_write(dev, 0x0015, 0xAA00);
        phy->radio_on = 0;
        b43legacydbg(dev->wl, "Radio initialized\n");
-       b43legacy_leds_update(dev, 0);
 }
 
 void b43legacy_radio_clear_tssi(struct b43legacy_wldev *dev)