Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
forked fromtorvalds/linux

Commit3928ee6

Browse files
maciejsszmigierodavem330
authored andcommitted
net: phy: leds: Add support for "link" trigger
Currently, we create a LED trigger for any link speed known to a PHY.These triggers only fire when their exact link speed had been negotiated(they aren't cumulative, that is, they don't fire for "their or any higher"link speed).What we are missing, however, is a trigger which will fire on any linkspeed known to the PHY. Such trigger can then be used for implementing apoor man's substitute of the "link" LED on boards that lack it.Let's add it.Signed-off-by: Maciej S. Szmigiero <mail@maciej.szmigiero.name>Signed-off-by: David S. Miller <davem@davemloft.net>
1 parentff198cd commit3928ee6

File tree

3 files changed

+47
-5
lines changed

3 files changed

+47
-5
lines changed

‎drivers/net/phy/Kconfig‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,14 @@ config LED_TRIGGER_PHY
191191
Adds support for a set of LED trigger events per-PHY. Link
192192
state change will trigger the events, for consumption by an
193193
LED class driver. There are triggers for each link speed currently
194-
supported by the phy, and are of the form:
194+
supported by the PHY and also a one common "link" trigger as a
195+
logical-or of all the link speed ones.
196+
All these triggers are named according to the following pattern:
195197
<mii bus id>:<phy>:<speed>
196198

197199
Where speed is in the form:
198-
<Speed in megabits>Mbps or <Speed in gigabits>Gbps
200+
<Speed in megabits>Mbps OR <Speed in gigabits>Gbps OR link
201+
for any speed known to the PHY.
199202

200203

201204
comment "MII PHY device drivers"

‎drivers/net/phy/phy_led_triggers.c‎

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
6267
EXPORT_SYMBOL_GPL(phy_led_trigger_change_speed);
6368

69+
staticvoidphy_led_trigger_format_name(structphy_device*phy,char*buf,
70+
size_tsize,char*suffix)
71+
{
72+
snprintf(buf,size,PHY_ID_FMT":%s",
73+
phy->mdio.bus->id,phy->mdio.addr,suffix);
74+
}
75+
6476
staticintphy_led_trigger_register(structphy_device*phy,
6577
structphy_led_trigger*plt,
6678
unsignedintspeed)
@@ -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
returnled_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
return0;
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+
gotoout_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+
gotoout_free_link;
130+
102131
phy->phy_led_triggers=devm_kzalloc(&phy->mdio.dev,
103132
sizeof(structphy_led_trigger)*
104133
phy->phy_num_led_triggers,
105134
GFP_KERNEL);
106135
if (!phy->phy_led_triggers) {
107136
err=-ENOMEM;
108-
gotoout_clear;
137+
gotoout_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;
126160
out_clear:
127161
phy->phy_num_led_triggers=0;
128162
returnerr;
@@ -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
}
139176
EXPORT_SYMBOL_GPL(phy_led_triggers_unregister);

‎include/linux/phy.h‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,8 @@ struct phy_device {
451451
structphy_led_trigger*phy_led_triggers;
452452
unsignedintphy_num_led_triggers;
453453
structphy_led_trigger*last_triggered;
454+
455+
structphy_led_trigger*led_link_trigger;
454456
#endif
455457

456458
/*

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp