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; }
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); }