@@ -249,78 +249,150 @@ static u32 qede_get_priv_flags(struct net_device *dev)
249
249
return (!!(edev -> dev_info .common .num_hwfns > 1 )) << QEDE_PRI_FLAG_CMT ;
250
250
}
251
251
252
- static int qede_get_settings (struct net_device * dev , struct ethtool_cmd * cmd )
252
+ struct qede_link_mode_mapping {
253
+ u32 qed_link_mode ;
254
+ u32 ethtool_link_mode ;
255
+ };
256
+
257
+ static const struct qede_link_mode_mapping qed_lm_map [] = {
258
+ {QED_LM_FIBRE_BIT , ETHTOOL_LINK_MODE_FIBRE_BIT },
259
+ {QED_LM_Autoneg_BIT , ETHTOOL_LINK_MODE_Autoneg_BIT },
260
+ {QED_LM_Asym_Pause_BIT , ETHTOOL_LINK_MODE_Asym_Pause_BIT },
261
+ {QED_LM_Pause_BIT , ETHTOOL_LINK_MODE_Pause_BIT },
262
+ {QED_LM_1000baseT_Half_BIT , ETHTOOL_LINK_MODE_1000baseT_Half_BIT },
263
+ {QED_LM_1000baseT_Full_BIT , ETHTOOL_LINK_MODE_1000baseT_Full_BIT },
264
+ {QED_LM_10000baseKR_Full_BIT , ETHTOOL_LINK_MODE_10000baseKR_Full_BIT },
265
+ {QED_LM_25000baseKR_Full_BIT , ETHTOOL_LINK_MODE_25000baseKR_Full_BIT },
266
+ {QED_LM_40000baseLR4_Full_BIT , ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT },
267
+ {QED_LM_50000baseKR2_Full_BIT , ETHTOOL_LINK_MODE_50000baseKR2_Full_BIT },
268
+ {QED_LM_100000baseKR4_Full_BIT ,
269
+ ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT },
270
+ };
271
+
272
+ #define QEDE_DRV_TO_ETHTOOL_CAPS (caps , lk_ksettings , name ) \
273
+ { \
274
+ int i; \
275
+ \
276
+ for (i = 0; i < QED_LM_COUNT; i++) { \
277
+ if ((caps) & (qed_lm_map[i].qed_link_mode)) \
278
+ __set_bit(qed_lm_map[i].ethtool_link_mode,\
279
+ lk_ksettings->link_modes.name); \
280
+ } \
281
+ }
282
+
283
+ #define QEDE_ETHTOOL_TO_DRV_CAPS (caps , lk_ksettings , name ) \
284
+ { \
285
+ int i; \
286
+ \
287
+ for (i = 0; i < QED_LM_COUNT; i++) { \
288
+ if (test_bit(qed_lm_map[i].ethtool_link_mode, \
289
+ lk_ksettings->link_modes.name)) \
290
+ caps |= qed_lm_map[i].qed_link_mode; \
291
+ } \
292
+ }
293
+
294
+ static int qede_get_link_ksettings (struct net_device * dev ,
295
+ struct ethtool_link_ksettings * cmd )
253
296
{
297
+ struct ethtool_link_settings * base = & cmd -> base ;
254
298
struct qede_dev * edev = netdev_priv (dev );
255
299
struct qed_link_output current_link ;
256
300
257
301
memset (& current_link , 0 , sizeof (current_link ));
258
302
edev -> ops -> common -> get_link (edev -> cdev , & current_link );
259
303
260
- cmd -> supported = current_link .supported_caps ;
261
- cmd -> advertising = current_link .advertised_caps ;
304
+ ethtool_link_ksettings_zero_link_mode (cmd , supported );
305
+ QEDE_DRV_TO_ETHTOOL_CAPS (current_link .supported_caps , cmd , supported )
306
+
307
+ ethtool_link_ksettings_zero_link_mode (cmd , advertising );
308
+ QEDE_DRV_TO_ETHTOOL_CAPS (current_link .advertised_caps , cmd , advertising )
309
+
310
+ ethtool_link_ksettings_zero_link_mode (cmd , lp_advertising );
311
+ QEDE_DRV_TO_ETHTOOL_CAPS (current_link .lp_caps , cmd , lp_advertising )
312
+
262
313
if ((edev -> state == QEDE_STATE_OPEN ) && (current_link .link_up )) {
263
- ethtool_cmd_speed_set ( cmd , current_link .speed ) ;
264
- cmd -> duplex = current_link .duplex ;
314
+ base -> speed = current_link .speed ;
315
+ base -> duplex = current_link .duplex ;
265
316
} else {
266
- cmd -> duplex = DUPLEX_UNKNOWN ;
267
- ethtool_cmd_speed_set ( cmd , SPEED_UNKNOWN ) ;
317
+ base -> speed = SPEED_UNKNOWN ;
318
+ base -> duplex = DUPLEX_UNKNOWN ;
268
319
}
269
- cmd -> port = current_link .port ;
270
- cmd -> autoneg = (current_link .autoneg ) ? AUTONEG_ENABLE :
271
- AUTONEG_DISABLE ;
272
- cmd -> lp_advertising = current_link .lp_caps ;
320
+ base -> port = current_link .port ;
321
+ base -> autoneg = (current_link .autoneg ) ? AUTONEG_ENABLE :
322
+ AUTONEG_DISABLE ;
273
323
274
324
return 0 ;
275
325
}
276
326
277
- static int qede_set_settings (struct net_device * dev , struct ethtool_cmd * cmd )
327
+ static int qede_set_link_ksettings (struct net_device * dev ,
328
+ const struct ethtool_link_ksettings * cmd )
278
329
{
330
+ const struct ethtool_link_settings * base = & cmd -> base ;
279
331
struct qede_dev * edev = netdev_priv (dev );
280
332
struct qed_link_output current_link ;
281
333
struct qed_link_params params ;
282
- u32 speed ;
283
334
284
335
if (!edev -> ops || !edev -> ops -> common -> can_link_change (edev -> cdev )) {
285
- DP_INFO (edev ,
286
- "Link settings are not allowed to be changed\n" );
336
+ DP_INFO (edev , "Link settings are not allowed to be changed\n" );
287
337
return - EOPNOTSUPP ;
288
338
}
289
-
290
339
memset (& current_link , 0 , sizeof (current_link ));
291
340
memset (& params , 0 , sizeof (params ));
292
341
edev -> ops -> common -> get_link (edev -> cdev , & current_link );
293
342
294
- speed = ethtool_cmd_speed (cmd );
295
343
params .override_flags |= QED_LINK_OVERRIDE_SPEED_ADV_SPEEDS ;
296
344
params .override_flags |= QED_LINK_OVERRIDE_SPEED_AUTONEG ;
297
- if (cmd -> autoneg == AUTONEG_ENABLE ) {
345
+ if (base -> autoneg == AUTONEG_ENABLE ) {
298
346
params .autoneg = true;
299
347
params .forced_speed = 0 ;
300
- params .adv_speeds = cmd -> advertising ;
301
- } else { /* forced speed */
348
+ QEDE_ETHTOOL_TO_DRV_CAPS ( params .adv_speeds , cmd , advertising )
349
+ } else { /* forced speed */
302
350
params .override_flags |= QED_LINK_OVERRIDE_SPEED_FORCED_SPEED ;
303
351
params .autoneg = false;
304
- params .forced_speed = speed ;
305
- switch (speed ) {
352
+ params .forced_speed = base -> speed ;
353
+ switch (base -> speed ) {
306
354
case SPEED_10000 :
307
355
if (!(current_link .supported_caps &
308
- SUPPORTED_10000baseKR_Full )) {
356
+ QED_LM_10000baseKR_Full_BIT )) {
309
357
DP_INFO (edev , "10G speed not supported\n" );
310
358
return - EINVAL ;
311
359
}
312
- params .adv_speeds = SUPPORTED_10000baseKR_Full ;
360
+ params .adv_speeds = QED_LM_10000baseKR_Full_BIT ;
361
+ break ;
362
+ case SPEED_25000 :
363
+ if (!(current_link .supported_caps &
364
+ QED_LM_25000baseKR_Full_BIT )) {
365
+ DP_INFO (edev , "25G speed not supported\n" );
366
+ return - EINVAL ;
367
+ }
368
+ params .adv_speeds = QED_LM_25000baseKR_Full_BIT ;
313
369
break ;
314
370
case SPEED_40000 :
315
371
if (!(current_link .supported_caps &
316
- SUPPORTED_40000baseLR4_Full )) {
372
+ QED_LM_40000baseLR4_Full_BIT )) {
317
373
DP_INFO (edev , "40G speed not supported\n" );
318
374
return - EINVAL ;
319
375
}
320
- params .adv_speeds = SUPPORTED_40000baseLR4_Full ;
376
+ params .adv_speeds = QED_LM_40000baseLR4_Full_BIT ;
377
+ break ;
378
+ case 0xdead :
379
+ if (!(current_link .supported_caps &
380
+ QED_LM_50000baseKR2_Full_BIT )) {
381
+ DP_INFO (edev , "50G speed not supported\n" );
382
+ return - EINVAL ;
383
+ }
384
+ params .adv_speeds = QED_LM_50000baseKR2_Full_BIT ;
385
+ break ;
386
+ case 0xbeef :
387
+ if (!(current_link .supported_caps &
388
+ QED_LM_100000baseKR4_Full_BIT )) {
389
+ DP_INFO (edev , "100G speed not supported\n" );
390
+ return - EINVAL ;
391
+ }
392
+ params .adv_speeds = QED_LM_100000baseKR4_Full_BIT ;
321
393
break ;
322
394
default :
323
- DP_INFO (edev , "Unsupported speed %u\n" , speed );
395
+ DP_INFO (edev , "Unsupported speed %u\n" , base -> speed );
324
396
return - EINVAL ;
325
397
}
326
398
}
@@ -1228,8 +1300,8 @@ static int qede_get_tunable(struct net_device *dev,
1228
1300
}
1229
1301
1230
1302
static const struct ethtool_ops qede_ethtool_ops = {
1231
- .get_settings = qede_get_settings ,
1232
- .set_settings = qede_set_settings ,
1303
+ .get_link_ksettings = qede_get_link_ksettings ,
1304
+ .set_link_ksettings = qede_set_link_ksettings ,
1233
1305
.get_drvinfo = qede_get_drvinfo ,
1234
1306
.get_msglevel = qede_get_msglevel ,
1235
1307
.set_msglevel = qede_set_msglevel ,
@@ -1260,7 +1332,7 @@ static const struct ethtool_ops qede_ethtool_ops = {
1260
1332
};
1261
1333
1262
1334
static const struct ethtool_ops qede_vf_ethtool_ops = {
1263
- .get_settings = qede_get_settings ,
1335
+ .get_link_ksettings = qede_get_link_ksettings ,
1264
1336
.get_drvinfo = qede_get_drvinfo ,
1265
1337
.get_msglevel = qede_get_msglevel ,
1266
1338
.set_msglevel = qede_set_msglevel ,
0 commit comments