void led_control_lte(int percent) { if(percent >= 0) { //high priority led for LTE int LTE_LED[] = { LED_SIG1, LED_SIG2, LED_SIG3, LED_USB, LED_LAN, LED_2G, LED_5G, LED_WAN, LED_LTE, LED_POWER }; int i; nvram_set(LED_CTRL_HIPRIO, "1"); for(i = 0; i < ARRAY_SIZE(LTE_LED); i++) { if((percent/9) > i) do_led_control(LTE_LED[i], LED_ON); else do_led_control(LTE_LED[i], LED_OFF); } } else if(nvram_match(LED_CTRL_HIPRIO, "1")) { //restore int which, mode; char name[16]; char *p; nvram_unset(LED_CTRL_HIPRIO); for(which = 0; which < LED_ID_MAX; which++) { sprintf(name, "led%02d", which); if ((p = nvram_get(name)) != NULL) { mode = atoi(p); do_led_control(which, mode); } } } }
int led_control(int which, int mode) #ifdef RTCONFIG_INTERNAL_GOBI { //save value char name[16]; snprintf(name, sizeof(name), "led%02d", which); if(nvram_get_int(name) != mode) nvram_set_int(name, mode); if (nvram_match(LED_CTRL_HIPRIO, "1")) return 0; int do_led_control(int which, int mode); return do_led_control(which, mode); }
static int mptsas_led_mode(topo_mod_t *mod, tnode_t *node, topo_version_t vers, nvlist_t *in, nvlist_t **nvout) { int err, ret = 0; tnode_t *pnode = topo_node_parent(node); uint32_t type, ledmode = 0; nvlist_t *pargs, *nvl; char *driver = NULL, *devctl = NULL; uint32_t enclosure, slot; uint8_t mptsas_led; boolean_t set; if (vers > TOPO_METH_MPTSAS_LED_MODE_VERSION) return (topo_mod_seterrno(mod, ETOPO_METHOD_VERNEW)); if (topo_prop_get_string(pnode, TOPO_PGROUP_BINDING, TOPO_BINDING_DRIVER, &driver, &err) != 0 || strcmp("mpt_sas", driver) != 0) { topo_mod_dprintf(mod, "%s: Facility driver was not mpt_sas", __func__); ret = topo_mod_seterrno(mod, EMOD_NVL_INVAL); goto out; } if (topo_prop_get_uint32(node, TOPO_PGROUP_FACILITY, TOPO_FACILITY_TYPE, &type, &err) != 0) { topo_mod_dprintf(mod, "%s: Failed to lookup %s property " "(%s)", __func__, TOPO_FACILITY_TYPE, topo_strerror(err)); return (topo_mod_seterrno(mod, EMOD_NVL_INVAL)); } switch (type) { case (TOPO_LED_TYPE_SERVICE): mptsas_led = MPTSAS_LEDCTL_LED_FAIL; break; case (TOPO_LED_TYPE_LOCATE): mptsas_led = MPTSAS_LEDCTL_LED_IDENT; break; case (TOPO_LED_TYPE_OK2RM): mptsas_led = MPTSAS_LEDCTL_LED_OK2RM; break; default: topo_mod_dprintf(mod, "%s: Invalid LED type: 0x%x\n", __func__, type); return (topo_mod_seterrno(mod, EMOD_NVL_INVAL)); } if (topo_prop_get_string(pnode, TOPO_PGROUP_BINDING, TOPO_BINDING_DEVCTL, &devctl, &err) != 0 || topo_prop_get_uint32(pnode, TOPO_PGROUP_BINDING, TOPO_BINDING_ENCLOSURE, &enclosure, &err) != 0 || topo_prop_get_uint32(pnode, TOPO_PGROUP_BINDING, TOPO_BINDING_SLOT, &slot, &err) != 0) { topo_mod_dprintf(mod, "%s: Facility was missing mpt_sas binding" " properties\n", __func__); ret = topo_mod_seterrno(mod, EMOD_NVL_INVAL); goto out; } if ((nvlist_lookup_nvlist(in, TOPO_PROP_PARGS, &pargs) == 0) && nvlist_exists(pargs, TOPO_PROP_VAL_VAL)) { /* * Set the LED mode */ set = B_TRUE; if ((ret = nvlist_lookup_uint32(pargs, TOPO_PROP_VAL_VAL, &ledmode)) != 0) { topo_mod_dprintf(mod, "%s: Failed to lookup %s nvpair " "(%s)\n", __func__, TOPO_PROP_VAL_VAL, strerror(ret)); ret = topo_mod_seterrno(mod, EMOD_NVL_INVAL); goto out; } topo_mod_dprintf(mod, "%s: Setting LED mode to %s\n", __func__, ledmode ? "ON" : "OFF"); } else { /* * Get the LED mode */ set = B_FALSE; topo_mod_dprintf(mod, "%s: Getting LED mode\n", __func__); } if (do_led_control(mod, devctl, enclosure, slot, mptsas_led, &ledmode, set) != 0) { topo_mod_dprintf(mod, "%s: do_led_control failed", __func__); ret = topo_mod_seterrno(mod, EMOD_UNKNOWN); goto out; } if (topo_mod_nvalloc(mod, &nvl, NV_UNIQUE_NAME) != 0 || nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, TOPO_LED_MODE) != 0 || nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, TOPO_TYPE_UINT32) != 0 || nvlist_add_uint32(nvl, TOPO_PROP_VAL_VAL, ledmode) != 0) { topo_mod_dprintf(mod, "%s: Failed to allocate 'out' nvlist\n", __func__); nvlist_free(nvl); ret = topo_mod_seterrno(mod, EMOD_NOMEM); goto out; } *nvout = nvl; out: if (driver != NULL) topo_mod_strfree(mod, driver); if (devctl != NULL) topo_mod_strfree(mod, devctl); return (ret); }