@@ -31,6 +31,7 @@ static void phy_led_trigger_no_link(struct phy_device *phy)
31
31
{
32
32
if (phy -> last_triggered ) {
33
33
led_trigger_event (& phy -> last_triggered -> trigger , LED_OFF );
34
+ led_trigger_event (& phy -> led_link_trigger -> trigger , LED_OFF );
34
35
phy -> last_triggered = NULL ;
35
36
}
36
37
}
@@ -54,13 +55,24 @@ void phy_led_trigger_change_speed(struct phy_device *phy)
54
55
}
55
56
56
57
if (plt != phy -> last_triggered ) {
58
+ if (!phy -> last_triggered )
59
+ led_trigger_event (& phy -> led_link_trigger -> trigger ,
60
+ LED_FULL );
61
+
57
62
led_trigger_event (& phy -> last_triggered -> trigger , LED_OFF );
58
63
led_trigger_event (& plt -> trigger , LED_FULL );
59
64
phy -> last_triggered = plt ;
60
65
}
61
66
}
62
67
EXPORT_SYMBOL_GPL (phy_led_trigger_change_speed );
63
68
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
+
64
76
static int phy_led_trigger_register (struct phy_device * phy ,
65
77
struct phy_led_trigger * plt ,
66
78
unsigned int speed )
@@ -77,8 +89,8 @@ static int phy_led_trigger_register(struct phy_device *phy,
77
89
snprintf (name_suffix , sizeof (name_suffix ), "%dGbps" ,
78
90
DIV_ROUND_CLOSEST (speed , 1000 ));
79
91
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 );
82
94
plt -> trigger .name = plt -> name ;
83
95
84
96
return led_trigger_register (& plt -> trigger );
@@ -99,13 +111,30 @@ int phy_led_triggers_register(struct phy_device *phy)
99
111
if (!phy -> phy_num_led_triggers )
100
112
return 0 ;
101
113
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
+
102
131
phy -> phy_led_triggers = devm_kzalloc (& phy -> mdio .dev ,
103
132
sizeof (struct phy_led_trigger ) *
104
133
phy -> phy_num_led_triggers ,
105
134
GFP_KERNEL );
106
135
if (!phy -> phy_led_triggers ) {
107
136
err = - ENOMEM ;
108
- goto out_clear ;
137
+ goto out_unreg_link ;
109
138
}
110
139
111
140
for (i = 0 ; i < phy -> phy_num_led_triggers ; i ++ ) {
@@ -123,6 +152,11 @@ int phy_led_triggers_register(struct phy_device *phy)
123
152
while (i -- )
124
153
phy_led_trigger_unregister (& phy -> phy_led_triggers [i ]);
125
154
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 ;
126
160
out_clear :
127
161
phy -> phy_num_led_triggers = 0 ;
128
162
return err ;
@@ -135,5 +169,8 @@ void phy_led_triggers_unregister(struct phy_device *phy)
135
169
136
170
for (i = 0 ; i < phy -> phy_num_led_triggers ; i ++ )
137
171
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 );
138
175
}
139
176
EXPORT_SYMBOL_GPL (phy_led_triggers_unregister );
0 commit comments