Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'net-phy-mscc-add-support-for-phy-led-control'

Lad Prabhakar says:

====================
net: phy: mscc: Add support for PHY LED control

This patch series adds support for controlling the PHY LEDs on the
VSC85xx family of PHYs from Microsemi (now part of Renesas).
The first two patches simplify and consolidate existing probe code
the third patch introduces the LED control functionality.
The LED control feature allows users to configure the LED behavior
based on link activity, speed, and other criteria.
====================

Link: https://patch.msgid.link/20251112135715.1017117-1-prabhakar.mahadev-lad.rj@bp.renesas.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+371 -114
+4
drivers/net/phy/mscc/mscc.h
··· 85 85 #define LED_MODE_SEL_MASK(x) (GENMASK(3, 0) << LED_MODE_SEL_POS(x)) 86 86 #define LED_MODE_SEL(x, mode) (((mode) << LED_MODE_SEL_POS(x)) & LED_MODE_SEL_MASK(x)) 87 87 88 + #define MSCC_PHY_LED_BEHAVIOR 30 89 + #define LED_COMBINE_DIS_MASK(x) BIT(x) 90 + #define LED_COMBINE_DIS(x, dis) (((dis) ? 1 : 0) << (x)) 91 + 88 92 #define MSCC_EXT_PAGE_CSR_CNTL_17 17 89 93 #define MSCC_EXT_PAGE_CSR_CNTL_18 18 90 94
+367 -114
drivers/net/phy/mscc/mscc_main.c
··· 22 22 #include "mscc_serdes.h" 23 23 #include "mscc.h" 24 24 25 + struct vsc85xx_probe_config { 26 + const struct vsc85xx_hw_stat *hw_stats; 27 + size_t shared_size; 28 + size_t nstats; 29 + u16 supp_led_modes; 30 + u8 nleds; 31 + bool check_rate_magic; 32 + bool use_package; 33 + bool has_ptp; 34 + }; 35 + 36 + static const u32 vsc85xx_default_led_modes_4[] = { 37 + VSC8531_LINK_1000_ACTIVITY, 38 + VSC8531_LINK_100_ACTIVITY, 39 + VSC8531_LINK_ACTIVITY, 40 + VSC8531_DUPLEX_COLLISION 41 + }; 42 + 25 43 static const struct vsc85xx_hw_stat vsc85xx_hw_stats[] = { 26 44 { 27 45 .string = "phy_receive_errors", ··· 195 177 u8 led_num, 196 178 u8 mode) 197 179 { 198 - int rc; 199 - u16 reg_val; 180 + u16 mask = LED_MODE_SEL_MASK(led_num); 181 + u16 val = LED_MODE_SEL(led_num, mode); 200 182 201 - mutex_lock(&phydev->lock); 202 - reg_val = phy_read(phydev, MSCC_PHY_LED_MODE_SEL); 203 - reg_val &= ~LED_MODE_SEL_MASK(led_num); 204 - reg_val |= LED_MODE_SEL(led_num, (u16)mode); 205 - rc = phy_write(phydev, MSCC_PHY_LED_MODE_SEL, reg_val); 206 - mutex_unlock(&phydev->lock); 183 + return phy_modify(phydev, MSCC_PHY_LED_MODE_SEL, mask, val); 184 + } 207 185 208 - return rc; 186 + static int vsc85xx_led_combine_disable_set(struct phy_device *phydev, 187 + u8 led_num, bool combine_disable) 188 + { 189 + u16 val = LED_COMBINE_DIS(led_num, combine_disable); 190 + u16 mask = LED_COMBINE_DIS_MASK(led_num); 191 + 192 + return phy_modify(phydev, MSCC_PHY_LED_BEHAVIOR, mask, val); 209 193 } 210 194 211 195 static int vsc85xx_mdix_get(struct phy_device *phydev, u8 *mdix) ··· 463 443 #endif /* CONFIG_OF_MDIO */ 464 444 465 445 static int vsc85xx_dt_led_modes_get(struct phy_device *phydev, 466 - u32 *default_mode) 446 + const u32 *default_mode) 467 447 { 468 448 struct vsc8531_private *priv = phydev->priv; 469 449 char led_dt_prop[28]; ··· 2238 2218 reg_val); 2239 2219 } 2240 2220 2241 - static int vsc8514_probe(struct phy_device *phydev) 2221 + static int vsc85xx_probe_common(struct phy_device *phydev, 2222 + const struct vsc85xx_probe_config *cfg, 2223 + const u32 *default_led_mode) 2242 2224 { 2243 2225 struct vsc8531_private *vsc8531; 2244 - u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY, 2245 - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, 2246 - VSC8531_DUPLEX_COLLISION}; 2247 - 2248 - vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); 2249 - if (!vsc8531) 2250 - return -ENOMEM; 2251 - 2252 - phydev->priv = vsc8531; 2253 - 2254 - vsc8584_get_base_addr(phydev); 2255 - devm_phy_package_join(&phydev->mdio.dev, phydev, 2256 - vsc8531->base_addr, 0); 2257 - 2258 - vsc8531->nleds = 4; 2259 - vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; 2260 - vsc8531->hw_stats = vsc85xx_hw_stats; 2261 - vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); 2262 - vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, 2263 - sizeof(u64), GFP_KERNEL); 2264 - if (!vsc8531->stats) 2265 - return -ENOMEM; 2266 - 2267 - return vsc85xx_dt_led_modes_get(phydev, default_mode); 2268 - } 2269 - 2270 - static int vsc8574_probe(struct phy_device *phydev) 2271 - { 2272 - struct vsc8531_private *vsc8531; 2273 - u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY, 2274 - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, 2275 - VSC8531_DUPLEX_COLLISION}; 2276 - 2277 - vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); 2278 - if (!vsc8531) 2279 - return -ENOMEM; 2280 - 2281 - phydev->priv = vsc8531; 2282 - 2283 - vsc8584_get_base_addr(phydev); 2284 - devm_phy_package_join(&phydev->mdio.dev, phydev, 2285 - vsc8531->base_addr, 0); 2286 - 2287 - vsc8531->nleds = 4; 2288 - vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; 2289 - vsc8531->hw_stats = vsc8584_hw_stats; 2290 - vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); 2291 - vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, 2292 - sizeof(u64), GFP_KERNEL); 2293 - if (!vsc8531->stats) 2294 - return -ENOMEM; 2295 - 2296 - return vsc85xx_dt_led_modes_get(phydev, default_mode); 2297 - } 2298 - 2299 - static int vsc8584_probe(struct phy_device *phydev) 2300 - { 2301 - struct vsc8531_private *vsc8531; 2302 - u32 default_mode[4] = {VSC8531_LINK_1000_ACTIVITY, 2303 - VSC8531_LINK_100_ACTIVITY, VSC8531_LINK_ACTIVITY, 2304 - VSC8531_DUPLEX_COLLISION}; 2226 + struct device_node *np; 2305 2227 int ret; 2306 2228 2307 2229 vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); ··· 2252 2290 2253 2291 phydev->priv = vsc8531; 2254 2292 2255 - vsc8584_get_base_addr(phydev); 2256 - devm_phy_package_join(&phydev->mdio.dev, phydev, vsc8531->base_addr, 2257 - sizeof(struct vsc85xx_shared_private)); 2293 + /* Check rate magic if needed (only for non-package PHYs) */ 2294 + if (cfg->check_rate_magic) { 2295 + ret = vsc85xx_edge_rate_magic_get(phydev); 2296 + if (ret < 0) 2297 + return ret; 2258 2298 2259 - vsc8531->nleds = 4; 2260 - vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; 2261 - vsc8531->hw_stats = vsc8584_hw_stats; 2262 - vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); 2263 - vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, 2264 - sizeof(u64), GFP_KERNEL); 2265 - if (!vsc8531->stats) 2266 - return -ENOMEM; 2299 + vsc8531->rate_magic = ret; 2300 + } 2267 2301 2268 - if (phy_package_probe_once(phydev)) { 2269 - ret = vsc8584_ptp_probe_once(phydev); 2302 + /* Set up package if needed */ 2303 + if (cfg->use_package) { 2304 + vsc8584_get_base_addr(phydev); 2305 + ret = devm_phy_package_join(&phydev->mdio.dev, phydev, 2306 + vsc8531->base_addr, 2307 + cfg->shared_size); 2270 2308 if (ret) 2271 2309 return ret; 2272 2310 } 2273 2311 2274 - ret = vsc8584_ptp_probe(phydev); 2275 - if (ret) 2276 - return ret; 2312 + /* Configure LED settings */ 2313 + vsc8531->nleds = cfg->nleds; 2314 + vsc8531->supp_led_modes = cfg->supp_led_modes; 2277 2315 2278 - return vsc85xx_dt_led_modes_get(phydev, default_mode); 2279 - } 2280 - 2281 - static int vsc85xx_probe(struct phy_device *phydev) 2282 - { 2283 - struct vsc8531_private *vsc8531; 2284 - int rate_magic; 2285 - u32 default_mode[2] = {VSC8531_LINK_1000_ACTIVITY, 2286 - VSC8531_LINK_100_ACTIVITY}; 2287 - 2288 - rate_magic = vsc85xx_edge_rate_magic_get(phydev); 2289 - if (rate_magic < 0) 2290 - return rate_magic; 2291 - 2292 - vsc8531 = devm_kzalloc(&phydev->mdio.dev, sizeof(*vsc8531), GFP_KERNEL); 2293 - if (!vsc8531) 2294 - return -ENOMEM; 2295 - 2296 - phydev->priv = vsc8531; 2297 - 2298 - vsc8531->rate_magic = rate_magic; 2299 - vsc8531->nleds = 2; 2300 - vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; 2301 - vsc8531->hw_stats = vsc85xx_hw_stats; 2302 - vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); 2316 + /* Configure hardware stats */ 2317 + vsc8531->hw_stats = cfg->hw_stats; 2318 + vsc8531->nstats = cfg->nstats; 2303 2319 vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, 2304 2320 sizeof(u64), GFP_KERNEL); 2305 2321 if (!vsc8531->stats) 2306 2322 return -ENOMEM; 2307 2323 2308 - return vsc85xx_dt_led_modes_get(phydev, default_mode); 2324 + /* PTP setup for VSC8584 */ 2325 + if (cfg->has_ptp) { 2326 + if (phy_package_probe_once(phydev)) { 2327 + ret = vsc8584_ptp_probe_once(phydev); 2328 + if (ret) 2329 + return ret; 2330 + } 2331 + 2332 + ret = vsc8584_ptp_probe(phydev); 2333 + if (ret) 2334 + return ret; 2335 + } 2336 + 2337 + /* 2338 + * Check for LED configuration in device tree if available 2339 + * or fall back to default `vsc8531,led-x-mode` DT properties. 2340 + */ 2341 + np = of_get_child_by_name(phydev->mdio.dev.of_node, "leds"); 2342 + if (np) { 2343 + of_node_put(np); 2344 + 2345 + /* Force to defaults */ 2346 + for (unsigned int i = 0; i < vsc8531->nleds; i++) 2347 + vsc8531->leds_mode[i] = default_led_mode[i]; 2348 + 2349 + return 0; 2350 + } 2351 + 2352 + /* Parse LED modes from device tree */ 2353 + return vsc85xx_dt_led_modes_get(phydev, default_led_mode); 2354 + } 2355 + 2356 + static int vsc85xx_led_brightness_set(struct phy_device *phydev, 2357 + u8 index, enum led_brightness value) 2358 + { 2359 + struct vsc8531_private *vsc8531 = phydev->priv; 2360 + 2361 + if (index >= vsc8531->nleds) 2362 + return -EINVAL; 2363 + 2364 + return vsc85xx_led_cntl_set(phydev, index, value == LED_OFF ? 2365 + VSC8531_FORCE_LED_OFF : VSC8531_FORCE_LED_ON); 2366 + } 2367 + 2368 + static int vsc85xx_led_hw_is_supported(struct phy_device *phydev, u8 index, 2369 + unsigned long rules) 2370 + { 2371 + static const unsigned long supported = BIT(TRIGGER_NETDEV_LINK_1000) | 2372 + BIT(TRIGGER_NETDEV_LINK_100) | 2373 + BIT(TRIGGER_NETDEV_LINK_10) | 2374 + BIT(TRIGGER_NETDEV_LINK) | 2375 + BIT(TRIGGER_NETDEV_RX) | 2376 + BIT(TRIGGER_NETDEV_TX); 2377 + struct vsc8531_private *vsc8531 = phydev->priv; 2378 + 2379 + if (index >= vsc8531->nleds) 2380 + return -EINVAL; 2381 + 2382 + if (rules & ~supported) 2383 + return -EOPNOTSUPP; 2384 + 2385 + return 0; 2386 + } 2387 + 2388 + static int vsc85xx_led_hw_control_get(struct phy_device *phydev, u8 index, 2389 + unsigned long *rules) 2390 + { 2391 + struct vsc8531_private *vsc8531 = phydev->priv; 2392 + u8 mode, behavior; 2393 + int rc; 2394 + 2395 + if (index >= vsc8531->nleds) 2396 + return -EINVAL; 2397 + 2398 + rc = phy_read(phydev, MSCC_PHY_LED_MODE_SEL); 2399 + if (rc < 0) 2400 + return rc; 2401 + mode = (rc & LED_MODE_SEL_MASK(index)) >> LED_MODE_SEL_POS(index); 2402 + 2403 + rc = phy_read(phydev, MSCC_PHY_LED_BEHAVIOR); 2404 + if (rc < 0) 2405 + return rc; 2406 + behavior = (rc & LED_COMBINE_DIS_MASK(index)) >> index; 2407 + 2408 + switch (mode) { 2409 + case VSC8531_LINK_ACTIVITY: 2410 + case VSC8531_ACTIVITY: 2411 + *rules = BIT(TRIGGER_NETDEV_LINK); 2412 + break; 2413 + 2414 + case VSC8531_LINK_1000_ACTIVITY: 2415 + *rules = BIT(TRIGGER_NETDEV_LINK_1000) | 2416 + BIT(TRIGGER_NETDEV_LINK); 2417 + break; 2418 + 2419 + case VSC8531_LINK_100_ACTIVITY: 2420 + *rules = BIT(TRIGGER_NETDEV_LINK_100) | 2421 + BIT(TRIGGER_NETDEV_LINK); 2422 + break; 2423 + 2424 + case VSC8531_LINK_10_ACTIVITY: 2425 + *rules = BIT(TRIGGER_NETDEV_LINK_10) | 2426 + BIT(TRIGGER_NETDEV_LINK); 2427 + break; 2428 + 2429 + case VSC8531_LINK_100_1000_ACTIVITY: 2430 + *rules = BIT(TRIGGER_NETDEV_LINK_1000) | 2431 + BIT(TRIGGER_NETDEV_LINK_100) | 2432 + BIT(TRIGGER_NETDEV_LINK); 2433 + break; 2434 + 2435 + case VSC8531_LINK_10_1000_ACTIVITY: 2436 + *rules = BIT(TRIGGER_NETDEV_LINK_1000) | 2437 + BIT(TRIGGER_NETDEV_LINK_10) | 2438 + BIT(TRIGGER_NETDEV_LINK); 2439 + break; 2440 + 2441 + case VSC8531_LINK_10_100_ACTIVITY: 2442 + *rules = BIT(TRIGGER_NETDEV_LINK_100) | 2443 + BIT(TRIGGER_NETDEV_LINK_10) | 2444 + BIT(TRIGGER_NETDEV_LINK); 2445 + break; 2446 + 2447 + default: 2448 + *rules = 0; 2449 + break; 2450 + } 2451 + 2452 + if (!behavior && *rules) 2453 + *rules |= BIT(TRIGGER_NETDEV_RX) | BIT(TRIGGER_NETDEV_TX); 2454 + 2455 + return 0; 2456 + } 2457 + 2458 + static int vsc85xx_led_hw_control_set(struct phy_device *phydev, u8 index, 2459 + unsigned long rules) 2460 + { 2461 + struct vsc8531_private *vsc8531 = phydev->priv; 2462 + u8 mode = VSC8531_FORCE_LED_ON; 2463 + bool combine_disable = false; 2464 + bool has_rx, has_tx; 2465 + int ret; 2466 + 2467 + if (index >= vsc8531->nleds) 2468 + return -EINVAL; 2469 + 2470 + if (rules & BIT(TRIGGER_NETDEV_LINK)) 2471 + mode = VSC8531_LINK_ACTIVITY; 2472 + 2473 + if (rules & BIT(TRIGGER_NETDEV_LINK_10)) 2474 + mode = VSC8531_LINK_10_ACTIVITY; 2475 + 2476 + if (rules & BIT(TRIGGER_NETDEV_LINK_100)) 2477 + mode = VSC8531_LINK_100_ACTIVITY; 2478 + 2479 + if (rules & BIT(TRIGGER_NETDEV_LINK_1000)) 2480 + mode = VSC8531_LINK_1000_ACTIVITY; 2481 + 2482 + if (rules & BIT(TRIGGER_NETDEV_LINK_100) && 2483 + rules & BIT(TRIGGER_NETDEV_LINK_1000)) 2484 + mode = VSC8531_LINK_100_1000_ACTIVITY; 2485 + 2486 + if (rules & BIT(TRIGGER_NETDEV_LINK_10) && 2487 + rules & BIT(TRIGGER_NETDEV_LINK_1000)) 2488 + mode = VSC8531_LINK_10_1000_ACTIVITY; 2489 + 2490 + if (rules & BIT(TRIGGER_NETDEV_LINK_10) && 2491 + rules & BIT(TRIGGER_NETDEV_LINK_100)) 2492 + mode = VSC8531_LINK_10_100_ACTIVITY; 2493 + 2494 + /* 2495 + * The VSC85xx PHYs provides an option to control LED behavior. By 2496 + * default, the LEDx combine function is enabled, meaning the LED 2497 + * will be on when there is link/activity or duplex/collision. If 2498 + * the combine function is disabled, the LED will be on only for 2499 + * link or duplex. 2500 + * 2501 + * To control this behavior, we check the selected rules. If both 2502 + * RX and TX activity are not selected, the LED combine function 2503 + * is disabled; otherwise, it remains enabled. 2504 + */ 2505 + has_rx = !!(rules & BIT(TRIGGER_NETDEV_RX)); 2506 + has_tx = !!(rules & BIT(TRIGGER_NETDEV_TX)); 2507 + if (!has_rx && !has_tx) 2508 + combine_disable = true; 2509 + 2510 + ret = vsc85xx_led_combine_disable_set(phydev, index, combine_disable); 2511 + if (ret < 0) 2512 + return ret; 2513 + 2514 + return vsc85xx_led_cntl_set(phydev, index, mode); 2515 + } 2516 + 2517 + static int vsc8514_probe(struct phy_device *phydev) 2518 + { 2519 + static const struct vsc85xx_probe_config vsc8514_cfg = { 2520 + .nleds = 4, 2521 + .supp_led_modes = VSC85XX_SUPP_LED_MODES, 2522 + .hw_stats = vsc85xx_hw_stats, 2523 + .nstats = ARRAY_SIZE(vsc85xx_hw_stats), 2524 + .use_package = true, 2525 + .shared_size = 0, 2526 + .has_ptp = false, 2527 + .check_rate_magic = false, 2528 + }; 2529 + 2530 + return vsc85xx_probe_common(phydev, &vsc8514_cfg, vsc85xx_default_led_modes_4); 2531 + } 2532 + 2533 + static int vsc8574_probe(struct phy_device *phydev) 2534 + { 2535 + static const struct vsc85xx_probe_config vsc8574_cfg = { 2536 + .nleds = 4, 2537 + .supp_led_modes = VSC8584_SUPP_LED_MODES, 2538 + .hw_stats = vsc8584_hw_stats, 2539 + .nstats = ARRAY_SIZE(vsc8584_hw_stats), 2540 + .use_package = true, 2541 + .shared_size = 0, 2542 + .has_ptp = false, 2543 + .check_rate_magic = false, 2544 + }; 2545 + 2546 + return vsc85xx_probe_common(phydev, &vsc8574_cfg, vsc85xx_default_led_modes_4); 2547 + } 2548 + 2549 + static int vsc8584_probe(struct phy_device *phydev) 2550 + { 2551 + static const struct vsc85xx_probe_config vsc8584_cfg = { 2552 + .nleds = 4, 2553 + .supp_led_modes = VSC8584_SUPP_LED_MODES, 2554 + .hw_stats = vsc8584_hw_stats, 2555 + .nstats = ARRAY_SIZE(vsc8584_hw_stats), 2556 + .use_package = true, 2557 + .shared_size = sizeof(struct vsc85xx_shared_private), 2558 + .has_ptp = true, 2559 + .check_rate_magic = false, 2560 + }; 2561 + 2562 + return vsc85xx_probe_common(phydev, &vsc8584_cfg, vsc85xx_default_led_modes_4); 2563 + } 2564 + 2565 + static int vsc85xx_probe(struct phy_device *phydev) 2566 + { 2567 + static const struct vsc85xx_probe_config vsc85xx_cfg = { 2568 + .nleds = 2, 2569 + .supp_led_modes = VSC85XX_SUPP_LED_MODES, 2570 + .hw_stats = vsc85xx_hw_stats, 2571 + .nstats = ARRAY_SIZE(vsc85xx_hw_stats), 2572 + .use_package = false, 2573 + .has_ptp = false, 2574 + .check_rate_magic = true, 2575 + }; 2576 + 2577 + return vsc85xx_probe_common(phydev, &vsc85xx_cfg, vsc85xx_default_led_modes_4); 2309 2578 } 2310 2579 2311 2580 static void vsc85xx_remove(struct phy_device *phydev) ··· 2569 2376 .get_sset_count = &vsc85xx_get_sset_count, 2570 2377 .get_strings = &vsc85xx_get_strings, 2571 2378 .get_stats = &vsc85xx_get_stats, 2379 + .led_brightness_set = vsc85xx_led_brightness_set, 2380 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2381 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2382 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2572 2383 }, 2573 2384 { 2574 2385 .phy_id = PHY_ID_VSC8502, ··· 2597 2400 .get_sset_count = &vsc85xx_get_sset_count, 2598 2401 .get_strings = &vsc85xx_get_strings, 2599 2402 .get_stats = &vsc85xx_get_stats, 2403 + .led_brightness_set = vsc85xx_led_brightness_set, 2404 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2405 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2406 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2600 2407 }, 2601 2408 { 2602 2409 .phy_id = PHY_ID_VSC8504, ··· 2628 2427 .get_stats = &vsc85xx_get_stats, 2629 2428 .inband_caps = vsc85xx_inband_caps, 2630 2429 .config_inband = vsc85xx_config_inband, 2430 + .led_brightness_set = vsc85xx_led_brightness_set, 2431 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2432 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2433 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2631 2434 }, 2632 2435 { 2633 2436 .phy_id = PHY_ID_VSC8514, ··· 2657 2452 .get_stats = &vsc85xx_get_stats, 2658 2453 .inband_caps = vsc85xx_inband_caps, 2659 2454 .config_inband = vsc85xx_config_inband, 2455 + .led_brightness_set = vsc85xx_led_brightness_set, 2456 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2457 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2458 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2660 2459 }, 2661 2460 { 2662 2461 .phy_id = PHY_ID_VSC8530, ··· 2685 2476 .get_sset_count = &vsc85xx_get_sset_count, 2686 2477 .get_strings = &vsc85xx_get_strings, 2687 2478 .get_stats = &vsc85xx_get_stats, 2479 + .led_brightness_set = vsc85xx_led_brightness_set, 2480 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2481 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2482 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2688 2483 }, 2689 2484 { 2690 2485 .phy_id = PHY_ID_VSC8531, ··· 2713 2500 .get_sset_count = &vsc85xx_get_sset_count, 2714 2501 .get_strings = &vsc85xx_get_strings, 2715 2502 .get_stats = &vsc85xx_get_stats, 2503 + .led_brightness_set = vsc85xx_led_brightness_set, 2504 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2505 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2506 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2716 2507 }, 2717 2508 { 2718 2509 .phy_id = PHY_ID_VSC8540, ··· 2741 2524 .get_sset_count = &vsc85xx_get_sset_count, 2742 2525 .get_strings = &vsc85xx_get_strings, 2743 2526 .get_stats = &vsc85xx_get_stats, 2527 + .led_brightness_set = vsc85xx_led_brightness_set, 2528 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2529 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2530 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2744 2531 }, 2745 2532 { 2746 2533 .phy_id = PHY_ID_VSC8541, ··· 2769 2548 .get_sset_count = &vsc85xx_get_sset_count, 2770 2549 .get_strings = &vsc85xx_get_strings, 2771 2550 .get_stats = &vsc85xx_get_stats, 2551 + .led_brightness_set = vsc85xx_led_brightness_set, 2552 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2553 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2554 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2772 2555 }, 2773 2556 { 2774 2557 .phy_id = PHY_ID_VSC8552, ··· 2799 2574 .get_stats = &vsc85xx_get_stats, 2800 2575 .inband_caps = vsc85xx_inband_caps, 2801 2576 .config_inband = vsc85xx_config_inband, 2577 + .led_brightness_set = vsc85xx_led_brightness_set, 2578 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2579 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2580 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2802 2581 }, 2803 2582 { 2804 2583 PHY_ID_MATCH_EXACT(PHY_ID_VSC856X), ··· 2826 2597 .get_stats = &vsc85xx_get_stats, 2827 2598 .inband_caps = vsc85xx_inband_caps, 2828 2599 .config_inband = vsc85xx_config_inband, 2600 + .led_brightness_set = vsc85xx_led_brightness_set, 2601 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2602 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2603 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2829 2604 }, 2830 2605 { 2831 2606 .phy_id = PHY_ID_VSC8572, ··· 2858 2625 .get_stats = &vsc85xx_get_stats, 2859 2626 .inband_caps = vsc85xx_inband_caps, 2860 2627 .config_inband = vsc85xx_config_inband, 2628 + .led_brightness_set = vsc85xx_led_brightness_set, 2629 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2630 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2631 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2861 2632 }, 2862 2633 { 2863 2634 .phy_id = PHY_ID_VSC8574, ··· 2890 2653 .get_stats = &vsc85xx_get_stats, 2891 2654 .inband_caps = vsc85xx_inband_caps, 2892 2655 .config_inband = vsc85xx_config_inband, 2656 + .led_brightness_set = vsc85xx_led_brightness_set, 2657 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2658 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2659 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2893 2660 }, 2894 2661 { 2895 2662 PHY_ID_MATCH_EXACT(PHY_ID_VSC8575), ··· 2919 2678 .get_stats = &vsc85xx_get_stats, 2920 2679 .inband_caps = vsc85xx_inband_caps, 2921 2680 .config_inband = vsc85xx_config_inband, 2681 + .led_brightness_set = vsc85xx_led_brightness_set, 2682 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2683 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2684 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2922 2685 }, 2923 2686 { 2924 2687 PHY_ID_MATCH_EXACT(PHY_ID_VSC8582), ··· 2948 2703 .get_stats = &vsc85xx_get_stats, 2949 2704 .inband_caps = vsc85xx_inband_caps, 2950 2705 .config_inband = vsc85xx_config_inband, 2706 + .led_brightness_set = vsc85xx_led_brightness_set, 2707 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2708 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2709 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2951 2710 }, 2952 2711 { 2953 2712 PHY_ID_MATCH_EXACT(PHY_ID_VSC8584), ··· 2978 2729 .link_change_notify = &vsc85xx_link_change_notify, 2979 2730 .inband_caps = vsc85xx_inband_caps, 2980 2731 .config_inband = vsc85xx_config_inband, 2732 + .led_brightness_set = vsc85xx_led_brightness_set, 2733 + .led_hw_is_supported = vsc85xx_led_hw_is_supported, 2734 + .led_hw_control_get = vsc85xx_led_hw_control_get, 2735 + .led_hw_control_set = vsc85xx_led_hw_control_set, 2981 2736 } 2982 2737 2983 2738 };