static ssize_t bcm43xx_attr_interfmode_show(struct device *dev,
        struct device_attribute *attr,
        char *buf)
{
    struct bcm43xx_private *bcm = dev_to_bcm(dev);
    unsigned long flags;
    int err;
    ssize_t count = 0;

    if (!capable(CAP_NET_ADMIN))
        return -EPERM;

    bcm43xx_lock(bcm, flags);
    assert(bcm->initialized);

    switch (bcm43xx_current_radio(bcm)->interfmode) {
    case BCM43xx_RADIO_INTERFMODE_NONE:
        count = snprintf(buf, PAGE_SIZE, "0 (No Interference Mitigation)\n");
        break;
    case BCM43xx_RADIO_INTERFMODE_NONWLAN:
        count = snprintf(buf, PAGE_SIZE, "1 (Non-WLAN Interference Mitigation)\n");
        break;
    case BCM43xx_RADIO_INTERFMODE_MANUALWLAN:
        count = snprintf(buf, PAGE_SIZE, "2 (WLAN Interference Mitigation)\n");
        break;
    default:
        assert(0);
    }
    err = 0;

    bcm43xx_unlock(bcm, flags);

    return err ? err : count;

}
Example #2
0
void bcm43xx_leds_update(struct bcm43xx_private *bcm, int activity)
{
	struct bcm43xx_led *led;
	struct bcm43xx_radioinfo *radio = bcm43xx_current_radio(bcm);
	struct bcm43xx_phyinfo *phy = bcm43xx_current_phy(bcm);
	const int transferring = (jiffies - bcm->stats.last_tx) < BCM43xx_LED_XFER_THRES;
	int i, turn_on;
	unsigned long interval = 0;
	u16 ledctl;
	unsigned long flags;

	spin_lock_irqsave(&bcm->leds_lock, flags);
	ledctl = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL);
	for (i = 0; i < BCM43xx_NR_LEDS; i++) {
		led = &(bcm->leds[i]);

		turn_on = 0;
		switch (led->behaviour) {
		case BCM43xx_LED_INACTIVE:
			continue;
		case BCM43xx_LED_OFF:
		case BCM43xx_LED_BCM4303_3:
			break;
		case BCM43xx_LED_ON:
			turn_on = 1;
			break;
		case BCM43xx_LED_ACTIVITY:
		case BCM43xx_LED_BCM4303_0:
			turn_on = activity;
			break;
		case BCM43xx_LED_RADIO_ALL:
			turn_on = radio->enabled && bcm43xx_is_hw_radio_enabled(bcm);
			break;
		case BCM43xx_LED_RADIO_A:
		case BCM43xx_LED_BCM4303_2:
			turn_on = (radio->enabled && bcm43xx_is_hw_radio_enabled(bcm) &&
				   phy->type == BCM43xx_PHYTYPE_A);
			break;
		case BCM43xx_LED_RADIO_B:
		case BCM43xx_LED_BCM4303_1:
			turn_on = (radio->enabled && bcm43xx_is_hw_radio_enabled(bcm) &&
				   (phy->type == BCM43xx_PHYTYPE_B ||
				    phy->type == BCM43xx_PHYTYPE_G));
			break;
		case BCM43xx_LED_MODE_BG:
			if (phy->type == BCM43xx_PHYTYPE_G && bcm43xx_is_hw_radio_enabled(bcm) &&
			    1/*FIXME: using G rates.*/)
				turn_on = 1;
			break;
		case BCM43xx_LED_TRANSFER:
			if (transferring)
				bcm43xx_led_blink_start(led, BCM43xx_LEDBLINK_MEDIUM);
			else
				bcm43xx_led_blink_stop(led, 0);
			continue;
		case BCM43xx_LED_APTRANSFER:
			if (bcm->ieee->iw_mode == IW_MODE_MASTER) {
				if (transferring) {
					interval = BCM43xx_LEDBLINK_FAST;
					turn_on = 1;
				}
			} else {
				turn_on = 1;
				if (0/*TODO: not assoc*/)
					interval = BCM43xx_LEDBLINK_SLOW;
				else if (transferring)
					interval = BCM43xx_LEDBLINK_FAST;
				else
					turn_on = 0;
			}
			if (turn_on)
				bcm43xx_led_blink_start(led, interval);
			else
				bcm43xx_led_blink_stop(led, 0);
			continue;
		case BCM43xx_LED_WEIRD:
			//TODO
			break;
		case BCM43xx_LED_ASSOC:
			if (bcm->softmac->associnfo.associated)
				turn_on = 1;
			break;
#ifdef CONFIG_BCM43XX_DEBUG
		case BCM43xx_LED_TEST_BLINKSLOW:
			bcm43xx_led_blink_start(led, BCM43xx_LEDBLINK_SLOW);
			continue;
		case BCM43xx_LED_TEST_BLINKMEDIUM:
			bcm43xx_led_blink_start(led, BCM43xx_LEDBLINK_MEDIUM);
			continue;
		case BCM43xx_LED_TEST_BLINKFAST:
			bcm43xx_led_blink_start(led, BCM43xx_LEDBLINK_FAST);
			continue;
#endif /* CONFIG_BCM43XX_DEBUG */
		default:
			dprintkl(KERN_INFO PFX "Bad value in leds_update,"
				" led->behaviour: 0x%x\n", led->behaviour);
		};

		if (led->activelow)
			turn_on = !turn_on;
		if (turn_on)
			ledctl |= (1 << i);
		else
			ledctl &= ~(1 << i);
	}
	bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl);
	spin_unlock_irqrestore(&bcm->leds_lock, flags);
}