@@ -37,6 +37,8 @@ static int linkstate_get_sqi(struct net_device *dev)
37
37
mutex_lock (& phydev -> lock );
38
38
if (!phydev -> drv || !phydev -> drv -> get_sqi )
39
39
ret = - EOPNOTSUPP ;
40
+ else if (!phydev -> link )
41
+ ret = - ENETDOWN ;
40
42
else
41
43
ret = phydev -> drv -> get_sqi (phydev );
42
44
mutex_unlock (& phydev -> lock );
@@ -55,13 +57,26 @@ static int linkstate_get_sqi_max(struct net_device *dev)
55
57
mutex_lock (& phydev -> lock );
56
58
if (!phydev -> drv || !phydev -> drv -> get_sqi_max )
57
59
ret = - EOPNOTSUPP ;
60
+ else if (!phydev -> link )
61
+ ret = - ENETDOWN ;
58
62
else
59
63
ret = phydev -> drv -> get_sqi_max (phydev );
60
64
mutex_unlock (& phydev -> lock );
61
65
62
66
return ret ;
63
67
};
64
68
69
+ static bool linkstate_sqi_critical_error (int sqi )
70
+ {
71
+ return sqi < 0 && sqi != - EOPNOTSUPP && sqi != - ENETDOWN ;
72
+ }
73
+
74
+ static bool linkstate_sqi_valid (struct linkstate_reply_data * data )
75
+ {
76
+ return data -> sqi >= 0 && data -> sqi_max >= 0 &&
77
+ data -> sqi <= data -> sqi_max ;
78
+ }
79
+
65
80
static int linkstate_get_link_ext_state (struct net_device * dev ,
66
81
struct linkstate_reply_data * data )
67
82
{
@@ -93,12 +108,12 @@ static int linkstate_prepare_data(const struct ethnl_req_info *req_base,
93
108
data -> link = __ethtool_get_link (dev );
94
109
95
110
ret = linkstate_get_sqi (dev );
96
- if (ret < 0 && ret != - EOPNOTSUPP )
111
+ if (linkstate_sqi_critical_error ( ret ) )
97
112
goto out ;
98
113
data -> sqi = ret ;
99
114
100
115
ret = linkstate_get_sqi_max (dev );
101
- if (ret < 0 && ret != - EOPNOTSUPP )
116
+ if (linkstate_sqi_critical_error ( ret ) )
102
117
goto out ;
103
118
data -> sqi_max = ret ;
104
119
@@ -136,11 +151,10 @@ static int linkstate_reply_size(const struct ethnl_req_info *req_base,
136
151
len = nla_total_size (sizeof (u8 )) /* LINKSTATE_LINK */
137
152
+ 0 ;
138
153
139
- if (data -> sqi != - EOPNOTSUPP )
140
- len += nla_total_size (sizeof (u32 ));
141
-
142
- if (data -> sqi_max != - EOPNOTSUPP )
143
- len += nla_total_size (sizeof (u32 ));
154
+ if (linkstate_sqi_valid (data )) {
155
+ len += nla_total_size (sizeof (u32 )); /* LINKSTATE_SQI */
156
+ len += nla_total_size (sizeof (u32 )); /* LINKSTATE_SQI_MAX */
157
+ }
144
158
145
159
if (data -> link_ext_state_provided )
146
160
len += nla_total_size (sizeof (u8 )); /* LINKSTATE_EXT_STATE */
@@ -164,13 +178,14 @@ static int linkstate_fill_reply(struct sk_buff *skb,
164
178
nla_put_u8 (skb , ETHTOOL_A_LINKSTATE_LINK , !!data -> link ))
165
179
return - EMSGSIZE ;
166
180
167
- if (data -> sqi != - EOPNOTSUPP &&
168
- nla_put_u32 (skb , ETHTOOL_A_LINKSTATE_SQI , data -> sqi ))
169
- return - EMSGSIZE ;
181
+ if (linkstate_sqi_valid ( data )) {
182
+ if ( nla_put_u32 (skb , ETHTOOL_A_LINKSTATE_SQI , data -> sqi ))
183
+ return - EMSGSIZE ;
170
184
171
- if (data -> sqi_max != - EOPNOTSUPP &&
172
- nla_put_u32 (skb , ETHTOOL_A_LINKSTATE_SQI_MAX , data -> sqi_max ))
173
- return - EMSGSIZE ;
185
+ if (nla_put_u32 (skb , ETHTOOL_A_LINKSTATE_SQI_MAX ,
186
+ data -> sqi_max ))
187
+ return - EMSGSIZE ;
188
+ }
174
189
175
190
if (data -> link_ext_state_provided ) {
176
191
if (nla_put_u8 (skb , ETHTOOL_A_LINKSTATE_EXT_STATE ,
0 commit comments