static int p54_start(struct ieee80211_hw *dev) { struct p54_common *priv = dev->priv; int err; mutex_lock(&priv->conf_mutex); err = priv->open(dev); if (err) goto out; P54_SET_QUEUE(priv->qos_params[0], 0x0002, 0x0003, 0x0007, 47); P54_SET_QUEUE(priv->qos_params[1], 0x0002, 0x0007, 0x000f, 94); P54_SET_QUEUE(priv->qos_params[2], 0x0003, 0x000f, 0x03ff, 0); P54_SET_QUEUE(priv->qos_params[3], 0x0007, 0x000f, 0x03ff, 0); err = p54_set_edcf(priv); if (err) goto out; memset(priv->bssid, ~0, ETH_ALEN); priv->mode = NL80211_IFTYPE_MONITOR; err = p54_setup_mac(priv); if (err) { priv->mode = NL80211_IFTYPE_UNSPECIFIED; goto out; } ieee80211_queue_delayed_work(dev, &priv->work, 0); priv->softled_state = 0; err = p54_set_leds(priv); out: mutex_unlock(&priv->conf_mutex); return err; }
int p54_init_leds(struct p54_common *priv) { int err; /* * TODO: * Figure out if the EEPROM contains some hints about the number * of available/programmable LEDs of the device. */ INIT_DELAYED_WORK(&priv->led_work, p54_update_leds); err = p54_register_led(priv, 0, "assoc", ieee80211_get_assoc_led_name(priv->hw)); if (err) return err; err = p54_register_led(priv, 1, "tx", ieee80211_get_tx_led_name(priv->hw)); if (err) return err; err = p54_register_led(priv, 2, "rx", ieee80211_get_rx_led_name(priv->hw)); if (err) return err; err = p54_register_led(priv, 3, "radio", ieee80211_get_radio_led_name(priv->hw)); if (err) return err; err = p54_set_leds(priv); return err; }
static void p54_stop(struct ieee80211_hw *dev) { struct p54_common *priv = dev->priv; int i; priv->mode = NL80211_IFTYPE_UNSPECIFIED; priv->softled_state = 0; cancel_delayed_work_sync(&priv->work); mutex_lock(&priv->conf_mutex); p54_set_leds(priv); priv->stop(dev); skb_queue_purge(&priv->tx_pending); skb_queue_purge(&priv->tx_queue); for (i = 0; i < P54_QUEUE_NUM; i++) { priv->tx_stats[i].count = 0; priv->tx_stats[i].len = 0; } priv->beacon_req_id = cpu_to_le32(0); priv->tsf_high32 = priv->tsf_low32 = 0; mutex_unlock(&priv->conf_mutex); }
static void p54_update_leds(struct work_struct *work) { struct p54_common *priv = container_of(work, struct p54_common, led_work.work); int err, i, tmp, blink_delay = 400; bool rerun = false; /* Don't toggle the LED, when the device is down. */ if (priv->mode == NL80211_IFTYPE_UNSPECIFIED) return ; for (i = 0; i < ARRAY_SIZE(priv->leds); i++) if (priv->leds[i].toggled) { priv->softled_state |= BIT(i); tmp = 70 + 200 / (priv->leds[i].toggled); if (tmp < blink_delay) blink_delay = tmp; if (priv->leds[i].led_dev.brightness == LED_OFF) rerun = true; priv->leds[i].toggled = !!priv->leds[i].led_dev.brightness; } else priv->softled_state &= ~BIT(i); err = p54_set_leds(priv); if (err && net_ratelimit()) wiphy_err(priv->hw->wiphy, "failed to update leds (%d).\n", err); if (rerun) ieee80211_queue_delayed_work(priv->hw, &priv->led_work, msecs_to_jiffies(blink_delay)); }