@@ -31,6 +31,7 @@ static void phy_led_trigger_no_link(struct phy_device *phy)
3131{
3232 if (phy -> last_triggered ) {
3333 led_trigger_event (& phy -> last_triggered -> trigger , LED_OFF );
34+ led_trigger_event (& phy -> led_link_trigger -> trigger , LED_OFF );
3435 phy -> last_triggered = NULL ;
3536 }
3637}
@@ -54,13 +55,24 @@ void phy_led_trigger_change_speed(struct phy_device *phy)
5455 }
5556
5657 if (plt != phy -> last_triggered ) {
58+ if (!phy -> last_triggered )
59+ led_trigger_event (& phy -> led_link_trigger -> trigger ,
60+ LED_FULL );
61+
5762 led_trigger_event (& phy -> last_triggered -> trigger , LED_OFF );
5863 led_trigger_event (& plt -> trigger , LED_FULL );
5964 phy -> last_triggered = plt ;
6065 }
6166}
6267EXPORT_SYMBOL_GPL (phy_led_trigger_change_speed );
6368
69+ static void phy_led_trigger_format_name (struct phy_device * phy , char * buf ,
70+ size_t size , char * suffix )
71+ {
72+ snprintf (buf , size , PHY_ID_FMT ":%s" ,
73+ phy -> mdio .bus -> id , phy -> mdio .addr , suffix );
74+ }
75+
6476static int phy_led_trigger_register (struct phy_device * phy ,
6577 struct phy_led_trigger * plt ,
6678 unsigned int speed )
@@ -77,8 +89,8 @@ static int phy_led_trigger_register(struct phy_device *phy,
7789 snprintf (name_suffix , sizeof (name_suffix ), "%dGbps" ,
7890 DIV_ROUND_CLOSEST (speed , 1000 ));
7991
80- snprintf ( plt -> name , sizeof (plt -> name ), PHY_ID_FMT ":%s" ,
81- phy -> mdio . bus -> id , phy -> mdio . addr , name_suffix );
92+ phy_led_trigger_format_name ( phy , plt -> name , sizeof (plt -> name ),
93+ name_suffix );
8294 plt -> trigger .name = plt -> name ;
8395
8496 return led_trigger_register (& plt -> trigger );
@@ -99,13 +111,30 @@ int phy_led_triggers_register(struct phy_device *phy)
99111 if (!phy -> phy_num_led_triggers )
100112 return 0 ;
101113
114+ phy -> led_link_trigger = devm_kzalloc (& phy -> mdio .dev ,
115+ sizeof (* phy -> led_link_trigger ),
116+ GFP_KERNEL );
117+ if (!phy -> led_link_trigger ) {
118+ err = - ENOMEM ;
119+ goto out_clear ;
120+ }
121+
122+ phy_led_trigger_format_name (phy , phy -> led_link_trigger -> name ,
123+ sizeof (phy -> led_link_trigger -> name ),
124+ "link" );
125+ phy -> led_link_trigger -> trigger .name = phy -> led_link_trigger -> name ;
126+
127+ err = led_trigger_register (& phy -> led_link_trigger -> trigger );
128+ if (err )
129+ goto out_free_link ;
130+
102131 phy -> phy_led_triggers = devm_kzalloc (& phy -> mdio .dev ,
103132 sizeof (struct phy_led_trigger ) *
104133 phy -> phy_num_led_triggers ,
105134 GFP_KERNEL );
106135 if (!phy -> phy_led_triggers ) {
107136 err = - ENOMEM ;
108- goto out_clear ;
137+ goto out_unreg_link ;
109138 }
110139
111140 for (i = 0 ; i < phy -> phy_num_led_triggers ; i ++ ) {
@@ -123,6 +152,11 @@ int phy_led_triggers_register(struct phy_device *phy)
123152 while (i -- )
124153 phy_led_trigger_unregister (& phy -> phy_led_triggers [i ]);
125154 devm_kfree (& phy -> mdio .dev , phy -> phy_led_triggers );
155+ out_unreg_link :
156+ phy_led_trigger_unregister (phy -> led_link_trigger );
157+ out_free_link :
158+ devm_kfree (& phy -> mdio .dev , phy -> led_link_trigger );
159+ phy -> led_link_trigger = NULL ;
126160out_clear :
127161 phy -> phy_num_led_triggers = 0 ;
128162 return err ;
@@ -135,5 +169,8 @@ void phy_led_triggers_unregister(struct phy_device *phy)
135169
136170 for (i = 0 ; i < phy -> phy_num_led_triggers ; i ++ )
137171 phy_led_trigger_unregister (& phy -> phy_led_triggers [i ]);
172+
173+ if (phy -> led_link_trigger )
174+ phy_led_trigger_unregister (phy -> led_link_trigger );
138175}
139176EXPORT_SYMBOL_GPL (phy_led_triggers_unregister );
0 commit comments