void bcm43xx_leds_switch_all(struct bcm43xx_private *bcm, int on) { struct bcm43xx_led *led; u16 ledctl; int i; int bit_on; 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]); if (led->behaviour == BCM43xx_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); } bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl); spin_unlock_irqrestore(&bcm->leds_lock, flags); }
static void bcm43xx_led_changestate(struct bcm43xx_led *led) { struct bcm43xx_private *bcm = led->bcm; const int index = bcm43xx_led_index(led); const u16 mask = (1 << index); u16 ledctl; assert(index >= 0 && index < BCM43xx_NR_LEDS); assert(led->blink_interval); ledctl = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL); ledctl = (ledctl & mask) ? (ledctl & ~mask) : (ledctl | mask); bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl); }
static void bcm43xx_led_blink_stop(struct bcm43xx_led *led, int sync) { struct bcm43xx_private *bcm = led->bcm; const int index = bcm43xx_led_index(led); 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. */ assert(index >= 0 && index < BCM43xx_NR_LEDS); ledctl = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL); if (led->activelow) ledctl |= (1 << index); else ledctl &= ~(1 << index); bcm43xx_write16(bcm, BCM43xx_MMIO_GPIO_CONTROL, ledctl); }
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); }
static ssize_t devinfo_read_file(struct file *file, char __user *userbuf, size_t count, loff_t *ppos) { const size_t len = REALLY_BIG_BUFFER_SIZE; struct bcm43xx_private *bcm = file->private_data; char *buf = really_big_buffer; size_t pos = 0; ssize_t res; struct net_device *net_dev; struct pci_dev *pci_dev; unsigned long flags; u16 tmp16; int i; down(&big_buffer_sem); bcm43xx_lock_mmio(bcm, flags); if (!bcm->initialized) { fappend("Board not initialized.\n"); goto out; } net_dev = bcm->net_dev; pci_dev = bcm->pci_dev; /* This is where the information is written to the "devinfo" file */ fappend("*** %s devinfo ***\n", net_dev->name); fappend("vendor: 0x%04x device: 0x%04x\n", pci_dev->vendor, pci_dev->device); fappend("subsystem_vendor: 0x%04x subsystem_device: 0x%04x\n", pci_dev->subsystem_vendor, pci_dev->subsystem_device); fappend("IRQ: %d\n", bcm->irq); fappend("mmio_addr: 0x%p mmio_len: %u\n", bcm->mmio_addr, bcm->mmio_len); fappend("chip_id: 0x%04x chip_rev: 0x%02x\n", bcm->chip_id, bcm->chip_rev); if ((bcm->core_80211[0].rev >= 3) && (bcm43xx_read32(bcm, 0x0158) & (1 << 16))) fappend("Radio disabled by hardware!\n"); if ((bcm->core_80211[0].rev < 3) && !(bcm43xx_read16(bcm, 0x049A) & (1 << 4))) fappend("Radio disabled by hardware!\n"); fappend("board_vendor: 0x%04x board_type: 0x%04x\n", bcm->board_vendor, bcm->board_type); fappend("\nCores:\n"); #define fappend_core(name, info) fappend("core \"" name "\" %s, %s, id: 0x%04x, " \ "rev: 0x%02x, index: 0x%02x\n", \ (info).available \ ? "available" : "nonavailable", \ (info).enabled \ ? "enabled" : "disabled", \ (info).id, (info).rev, (info).index) fappend_core("CHIPCOMMON", bcm->core_chipcommon); fappend_core("PCI", bcm->core_pci); fappend_core("first 80211", bcm->core_80211[0]); fappend_core("second 80211", bcm->core_80211[1]); #undef fappend_core tmp16 = bcm43xx_read16(bcm, BCM43xx_MMIO_GPIO_CONTROL); fappend("LEDs: "); for (i = 0; i < BCM43xx_NR_LEDS; i++) fappend("%d ", !!(tmp16 & (1 << i))); fappend("\n"); out: bcm43xx_unlock_mmio(bcm, flags); res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); up(&big_buffer_sem); return res; }