void b43legacy_leds_switch_all(struct b43legacy_wldev *dev, int on) { struct b43legacy_led *led; u16 ledctl; int i; int bit_on; unsigned long flags; spin_lock_irqsave(&dev->wl->leds_lock, flags); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); for (i = 0; i < B43legacy_NR_LEDS; i++) { led = &(dev->leds[i]); if (led->behaviour == B43legacy_LED_INACTIVE) continue; if (on) bit_on = led->activelow ? 0 : 1; else bit_on = led->activelow ? 1 : 0; if (bit_on) ledctl |= (1 << i); else ledctl &= ~(1 << i); } b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); spin_unlock_irqrestore(&dev->wl->leds_lock, flags); }
static void b43legacy_led_changestate(struct b43legacy_led *led) { struct b43legacy_wldev *dev = led->dev; const int index = led->index; u16 ledctl; B43legacy_WARN_ON(!(index >= 0 && index < B43legacy_NR_LEDS)); B43legacy_WARN_ON(!led->blink_interval); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); ledctl ^= (1 << index); b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); }
/* Returns TRUE, if the radio is enabled in hardware. */ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev) { if (dev->phy.rev >= 3) { if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI) & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)) return 1; } else { if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO) & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK) return 1; } return 0; }
/* Returns TRUE, if the radio is enabled in hardware. */ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev) { if (dev->phy.rev >= 3) { if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI) & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)) return 1; } else { /* To prevent CPU fault on PPC, do not read a register * unless the interface is started; however, on resume * for hibernation, this routine is entered early. When * that happens, unconditionally return TRUE. */ if (b43legacy_status(dev) < B43legacy_STAT_STARTED) return 1; if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO) & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK) return 1; } return 0; }
static void b43legacy_led_blink_stop(struct b43legacy_led *led, int sync) { struct b43legacy_wldev *dev = led->dev; const int index = led->index; u16 ledctl; if (!led->blink_interval) return; if (unlikely(sync)) del_timer_sync(&led->blink_timer); else del_timer(&led->blink_timer); led->blink_interval = 0; /* Make sure the LED is turned off. */ B43legacy_WARN_ON(!(index >= 0 && index < B43legacy_NR_LEDS)); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); if (led->activelow) ledctl |= (1 << index); else ledctl &= ~(1 << index); b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); }
void b43legacy_leds_update(struct b43legacy_wldev *dev, int activity) { struct b43legacy_led *led; struct b43legacy_phy *phy = &dev->phy; const int transferring = (jiffies - dev->stats.last_tx) < B43legacy_LED_XFER_THRES; int i; int turn_on; unsigned long interval = 0; u16 ledctl; unsigned long flags; bool radio_enabled = (phy->radio_on && dev->radio_hw_enable); spin_lock_irqsave(&dev->wl->leds_lock, flags); ledctl = b43legacy_read16(dev, B43legacy_MMIO_GPIO_CONTROL); for (i = 0; i < B43legacy_NR_LEDS; i++) { led = &(dev->leds[i]); turn_on = 0; switch (led->behaviour) { case B43legacy_LED_INACTIVE: continue; case B43legacy_LED_OFF: break; case B43legacy_LED_ON: turn_on = 1; break; case B43legacy_LED_ACTIVITY: turn_on = activity; break; case B43legacy_LED_RADIO_ALL: turn_on = radio_enabled; break; case B43legacy_LED_RADIO_A: break; case B43legacy_LED_RADIO_B: turn_on = radio_enabled; break; case B43legacy_LED_MODE_BG: if (phy->type == B43legacy_PHYTYPE_G && radio_enabled) turn_on = 1; break; case B43legacy_LED_TRANSFER: if (transferring) b43legacy_led_blink_start(led, B43legacy_LEDBLINK_MEDIUM); else b43legacy_led_blink_stop(led, 0); continue; case B43legacy_LED_APTRANSFER: if (b43legacy_is_mode(dev->wl, IEEE80211_IF_TYPE_AP)) { if (transferring) { interval = B43legacy_LEDBLINK_FAST; turn_on = 1; } } else { turn_on = 1; if (transferring) interval = B43legacy_LEDBLINK_FAST; else turn_on = 0; } if (turn_on) b43legacy_led_blink_start(led, interval); else b43legacy_led_blink_stop(led, 0); continue; case B43legacy_LED_WEIRD: break; case B43legacy_LED_ASSOC: turn_on = 1; #ifdef CONFIG_B43LEGACY_DEBUG case B43legacy_LED_TEST_BLINKSLOW: b43legacy_led_blink_start(led, B43legacy_LEDBLINK_SLOW); continue; case B43legacy_LED_TEST_BLINKMEDIUM: b43legacy_led_blink_start(led, B43legacy_LEDBLINK_MEDIUM); continue; case B43legacy_LED_TEST_BLINKFAST: b43legacy_led_blink_start(led, B43legacy_LEDBLINK_FAST); continue; #endif /* CONFIG_B43LEGACY_DEBUG */ default: break; }; if (led->activelow) turn_on = !turn_on; if (turn_on) ledctl |= (1 << i); else ledctl &= ~(1 << i); } b43legacy_write16(dev, B43legacy_MMIO_GPIO_CONTROL, ledctl); spin_unlock_irqrestore(&dev->wl->leds_lock, flags); }