11
11
#include "aq_vec.h"
12
12
#include "aq_ptp.h"
13
13
#include "aq_filters.h"
14
+ #include "aq_macsec.h"
14
15
15
16
#include <linux/ptp_clock_kernel.h>
16
17
@@ -96,6 +97,62 @@ static const char aq_ethtool_queue_stat_names[][ETH_GSTRING_LEN] = {
96
97
"Queue[%d] InErrors" ,
97
98
};
98
99
100
+ #if IS_ENABLED (CONFIG_MACSEC )
101
+ static const char aq_macsec_stat_names [][ETH_GSTRING_LEN ] = {
102
+ "MACSec InCtlPackets" ,
103
+ "MACSec InTaggedMissPackets" ,
104
+ "MACSec InUntaggedMissPackets" ,
105
+ "MACSec InNotagPackets" ,
106
+ "MACSec InUntaggedPackets" ,
107
+ "MACSec InBadTagPackets" ,
108
+ "MACSec InNoSciPackets" ,
109
+ "MACSec InUnknownSciPackets" ,
110
+ "MACSec InCtrlPortPassPackets" ,
111
+ "MACSec InUnctrlPortPassPackets" ,
112
+ "MACSec InCtrlPortFailPackets" ,
113
+ "MACSec InUnctrlPortFailPackets" ,
114
+ "MACSec InTooLongPackets" ,
115
+ "MACSec InIgpocCtlPackets" ,
116
+ "MACSec InEccErrorPackets" ,
117
+ "MACSec InUnctrlHitDropRedir" ,
118
+ "MACSec OutCtlPackets" ,
119
+ "MACSec OutUnknownSaPackets" ,
120
+ "MACSec OutUntaggedPackets" ,
121
+ "MACSec OutTooLong" ,
122
+ "MACSec OutEccErrorPackets" ,
123
+ "MACSec OutUnctrlHitDropRedir" ,
124
+ };
125
+
126
+ static const char * aq_macsec_txsc_stat_names [] = {
127
+ "MACSecTXSC%d ProtectedPkts" ,
128
+ "MACSecTXSC%d EncryptedPkts" ,
129
+ "MACSecTXSC%d ProtectedOctets" ,
130
+ "MACSecTXSC%d EncryptedOctets" ,
131
+ };
132
+
133
+ static const char * aq_macsec_txsa_stat_names [] = {
134
+ "MACSecTXSC%dSA%d HitDropRedirect" ,
135
+ "MACSecTXSC%dSA%d Protected2Pkts" ,
136
+ "MACSecTXSC%dSA%d ProtectedPkts" ,
137
+ "MACSecTXSC%dSA%d EncryptedPkts" ,
138
+ };
139
+
140
+ static const char * aq_macsec_rxsa_stat_names [] = {
141
+ "MACSecRXSC%dSA%d UntaggedHitPkts" ,
142
+ "MACSecRXSC%dSA%d CtrlHitDrpRedir" ,
143
+ "MACSecRXSC%dSA%d NotUsingSa" ,
144
+ "MACSecRXSC%dSA%d UnusedSa" ,
145
+ "MACSecRXSC%dSA%d NotValidPkts" ,
146
+ "MACSecRXSC%dSA%d InvalidPkts" ,
147
+ "MACSecRXSC%dSA%d OkPkts" ,
148
+ "MACSecRXSC%dSA%d LatePkts" ,
149
+ "MACSecRXSC%dSA%d DelayedPkts" ,
150
+ "MACSecRXSC%dSA%d UncheckedPkts" ,
151
+ "MACSecRXSC%dSA%d ValidatedOctets" ,
152
+ "MACSecRXSC%dSA%d DecryptedOctets" ,
153
+ };
154
+ #endif
155
+
99
156
static const char aq_ethtool_priv_flag_names [][ETH_GSTRING_LEN ] = {
100
157
"DMASystemLoopback" ,
101
158
"PKTSystemLoopback" ,
@@ -104,30 +161,48 @@ static const char aq_ethtool_priv_flag_names[][ETH_GSTRING_LEN] = {
104
161
"PHYExternalLoopback" ,
105
162
};
106
163
164
+ static u32 aq_ethtool_n_stats (struct net_device * ndev )
165
+ {
166
+ struct aq_nic_s * nic = netdev_priv (ndev );
167
+ struct aq_nic_cfg_s * cfg = aq_nic_get_cfg (nic );
168
+ u32 n_stats = ARRAY_SIZE (aq_ethtool_stat_names ) +
169
+ ARRAY_SIZE (aq_ethtool_queue_stat_names ) * cfg -> vecs ;
170
+
171
+ #if IS_ENABLED (CONFIG_MACSEC )
172
+ if (nic -> macsec_cfg ) {
173
+ n_stats += ARRAY_SIZE (aq_macsec_stat_names ) +
174
+ ARRAY_SIZE (aq_macsec_txsc_stat_names ) *
175
+ aq_macsec_tx_sc_cnt (nic ) +
176
+ ARRAY_SIZE (aq_macsec_txsa_stat_names ) *
177
+ aq_macsec_tx_sa_cnt (nic ) +
178
+ ARRAY_SIZE (aq_macsec_rxsa_stat_names ) *
179
+ aq_macsec_rx_sa_cnt (nic );
180
+ }
181
+ #endif
182
+
183
+ return n_stats ;
184
+ }
185
+
107
186
static void aq_ethtool_stats (struct net_device * ndev ,
108
187
struct ethtool_stats * stats , u64 * data )
109
188
{
110
189
struct aq_nic_s * aq_nic = netdev_priv (ndev );
111
- struct aq_nic_cfg_s * cfg ;
112
190
113
- cfg = aq_nic_get_cfg (aq_nic );
114
-
115
- memset (data , 0 , (ARRAY_SIZE (aq_ethtool_stat_names ) +
116
- ARRAY_SIZE (aq_ethtool_queue_stat_names ) *
117
- cfg -> vecs ) * sizeof (u64 ));
118
- aq_nic_get_stats (aq_nic , data );
191
+ memset (data , 0 , aq_ethtool_n_stats (ndev ) * sizeof (u64 ));
192
+ data = aq_nic_get_stats (aq_nic , data );
193
+ #if IS_ENABLED (CONFIG_MACSEC )
194
+ data = aq_macsec_get_stats (aq_nic , data );
195
+ #endif
119
196
}
120
197
121
198
static void aq_ethtool_get_drvinfo (struct net_device * ndev ,
122
199
struct ethtool_drvinfo * drvinfo )
123
200
{
124
201
struct pci_dev * pdev = to_pci_dev (ndev -> dev .parent );
125
202
struct aq_nic_s * aq_nic = netdev_priv (ndev );
126
- struct aq_nic_cfg_s * cfg ;
127
203
u32 firmware_version ;
128
204
u32 regs_count ;
129
205
130
- cfg = aq_nic_get_cfg (aq_nic );
131
206
firmware_version = aq_nic_get_fw_version (aq_nic );
132
207
regs_count = aq_nic_get_regs_count (aq_nic );
133
208
@@ -139,8 +214,7 @@ static void aq_ethtool_get_drvinfo(struct net_device *ndev,
139
214
140
215
strlcpy (drvinfo -> bus_info , pdev ? pci_name (pdev ) : "" ,
141
216
sizeof (drvinfo -> bus_info ));
142
- drvinfo -> n_stats = ARRAY_SIZE (aq_ethtool_stat_names ) +
143
- cfg -> vecs * ARRAY_SIZE (aq_ethtool_queue_stat_names );
217
+ drvinfo -> n_stats = aq_ethtool_n_stats (ndev );
144
218
drvinfo -> testinfo_len = 0 ;
145
219
drvinfo -> regdump_len = regs_count ;
146
220
drvinfo -> eedump_len = 0 ;
@@ -153,6 +227,9 @@ static void aq_ethtool_get_strings(struct net_device *ndev,
153
227
struct aq_nic_cfg_s * cfg ;
154
228
u8 * p = data ;
155
229
int i , si ;
230
+ #if IS_ENABLED (CONFIG_MACSEC )
231
+ int sa ;
232
+ #endif
156
233
157
234
cfg = aq_nic_get_cfg (aq_nic );
158
235
@@ -170,6 +247,60 @@ static void aq_ethtool_get_strings(struct net_device *ndev,
170
247
p += ETH_GSTRING_LEN ;
171
248
}
172
249
}
250
+ #if IS_ENABLED (CONFIG_MACSEC )
251
+ if (!aq_nic -> macsec_cfg )
252
+ break ;
253
+
254
+ memcpy (p , aq_macsec_stat_names , sizeof (aq_macsec_stat_names ));
255
+ p = p + sizeof (aq_macsec_stat_names );
256
+ for (i = 0 ; i < AQ_MACSEC_MAX_SC ; i ++ ) {
257
+ struct aq_macsec_txsc * aq_txsc ;
258
+
259
+ if (!(test_bit (i , & aq_nic -> macsec_cfg -> txsc_idx_busy )))
260
+ continue ;
261
+
262
+ for (si = 0 ;
263
+ si < ARRAY_SIZE (aq_macsec_txsc_stat_names );
264
+ si ++ ) {
265
+ snprintf (p , ETH_GSTRING_LEN ,
266
+ aq_macsec_txsc_stat_names [si ], i );
267
+ p += ETH_GSTRING_LEN ;
268
+ }
269
+ aq_txsc = & aq_nic -> macsec_cfg -> aq_txsc [i ];
270
+ for (sa = 0 ; sa < MACSEC_NUM_AN ; sa ++ ) {
271
+ if (!(test_bit (sa , & aq_txsc -> tx_sa_idx_busy )))
272
+ continue ;
273
+ for (si = 0 ;
274
+ si < ARRAY_SIZE (aq_macsec_txsa_stat_names );
275
+ si ++ ) {
276
+ snprintf (p , ETH_GSTRING_LEN ,
277
+ aq_macsec_txsa_stat_names [si ],
278
+ i , sa );
279
+ p += ETH_GSTRING_LEN ;
280
+ }
281
+ }
282
+ }
283
+ for (i = 0 ; i < AQ_MACSEC_MAX_SC ; i ++ ) {
284
+ struct aq_macsec_rxsc * aq_rxsc ;
285
+
286
+ if (!(test_bit (i , & aq_nic -> macsec_cfg -> rxsc_idx_busy )))
287
+ continue ;
288
+
289
+ aq_rxsc = & aq_nic -> macsec_cfg -> aq_rxsc [i ];
290
+ for (sa = 0 ; sa < MACSEC_NUM_AN ; sa ++ ) {
291
+ if (!(test_bit (sa , & aq_rxsc -> rx_sa_idx_busy )))
292
+ continue ;
293
+ for (si = 0 ;
294
+ si < ARRAY_SIZE (aq_macsec_rxsa_stat_names );
295
+ si ++ ) {
296
+ snprintf (p , ETH_GSTRING_LEN ,
297
+ aq_macsec_rxsa_stat_names [si ],
298
+ i , sa );
299
+ p += ETH_GSTRING_LEN ;
300
+ }
301
+ }
302
+ }
303
+ #endif
173
304
break ;
174
305
case ETH_SS_PRIV_FLAGS :
175
306
memcpy (p , aq_ethtool_priv_flag_names ,
@@ -209,16 +340,11 @@ static int aq_ethtool_set_phys_id(struct net_device *ndev,
209
340
210
341
static int aq_ethtool_get_sset_count (struct net_device * ndev , int stringset )
211
342
{
212
- struct aq_nic_s * aq_nic = netdev_priv (ndev );
213
- struct aq_nic_cfg_s * cfg ;
214
343
int ret = 0 ;
215
344
216
- cfg = aq_nic_get_cfg (aq_nic );
217
-
218
345
switch (stringset ) {
219
346
case ETH_SS_STATS :
220
- ret = ARRAY_SIZE (aq_ethtool_stat_names ) +
221
- cfg -> vecs * ARRAY_SIZE (aq_ethtool_queue_stat_names );
347
+ ret = aq_ethtool_n_stats (ndev );
222
348
break ;
223
349
case ETH_SS_PRIV_FLAGS :
224
350
ret = ARRAY_SIZE (aq_ethtool_priv_flag_names );
0 commit comments