@@ -120,6 +120,7 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *);
120
120
static void release_crq_queue (struct ibmvnic_adapter * );
121
121
static int __ibmvnic_set_mac (struct net_device * netdev , struct sockaddr * p );
122
122
static int init_crq_queue (struct ibmvnic_adapter * adapter );
123
+ static int send_query_phys_parms (struct ibmvnic_adapter * adapter );
123
124
124
125
struct ibmvnic_stat {
125
126
char name [ETH_GSTRING_LEN ];
@@ -2278,23 +2279,20 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
2278
2279
static int ibmvnic_get_link_ksettings (struct net_device * netdev ,
2279
2280
struct ethtool_link_ksettings * cmd )
2280
2281
{
2281
- u32 supported , advertising ;
2282
+ struct ibmvnic_adapter * adapter = netdev_priv (netdev );
2283
+ int rc ;
2282
2284
2283
- supported = (SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg |
2284
- SUPPORTED_FIBRE );
2285
- advertising = (ADVERTISED_1000baseT_Full | ADVERTISED_Autoneg |
2286
- ADVERTISED_FIBRE );
2287
- cmd -> base .speed = SPEED_1000 ;
2288
- cmd -> base .duplex = DUPLEX_FULL ;
2285
+ rc = send_query_phys_parms (adapter );
2286
+ if (rc ) {
2287
+ adapter -> speed = SPEED_UNKNOWN ;
2288
+ adapter -> duplex = DUPLEX_UNKNOWN ;
2289
+ }
2290
+ cmd -> base .speed = adapter -> speed ;
2291
+ cmd -> base .duplex = adapter -> duplex ;
2289
2292
cmd -> base .port = PORT_FIBRE ;
2290
2293
cmd -> base .phy_address = 0 ;
2291
2294
cmd -> base .autoneg = AUTONEG_ENABLE ;
2292
2295
2293
- ethtool_convert_legacy_u32_to_link_mode (cmd -> link_modes .supported ,
2294
- supported );
2295
- ethtool_convert_legacy_u32_to_link_mode (cmd -> link_modes .advertising ,
2296
- advertising );
2297
-
2298
2296
return 0 ;
2299
2297
}
2300
2298
@@ -4278,6 +4276,73 @@ static void handle_query_cap_rsp(union ibmvnic_crq *crq,
4278
4276
}
4279
4277
}
4280
4278
4279
+ static int send_query_phys_parms (struct ibmvnic_adapter * adapter )
4280
+ {
4281
+ union ibmvnic_crq crq ;
4282
+ int rc ;
4283
+
4284
+ memset (& crq , 0 , sizeof (crq ));
4285
+ crq .query_phys_parms .first = IBMVNIC_CRQ_CMD ;
4286
+ crq .query_phys_parms .cmd = QUERY_PHYS_PARMS ;
4287
+ init_completion (& adapter -> fw_done );
4288
+ rc = ibmvnic_send_crq (adapter , & crq );
4289
+ if (rc )
4290
+ return rc ;
4291
+ wait_for_completion (& adapter -> fw_done );
4292
+ return adapter -> fw_done_rc ? - EIO : 0 ;
4293
+ }
4294
+
4295
+ static int handle_query_phys_parms_rsp (union ibmvnic_crq * crq ,
4296
+ struct ibmvnic_adapter * adapter )
4297
+ {
4298
+ struct net_device * netdev = adapter -> netdev ;
4299
+ int rc ;
4300
+
4301
+ rc = crq -> query_phys_parms_rsp .rc .code ;
4302
+ if (rc ) {
4303
+ netdev_err (netdev , "Error %d in QUERY_PHYS_PARMS\n" , rc );
4304
+ return rc ;
4305
+ }
4306
+ switch (cpu_to_be32 (crq -> query_phys_parms_rsp .speed )) {
4307
+ case IBMVNIC_10MBPS :
4308
+ adapter -> speed = SPEED_10 ;
4309
+ break ;
4310
+ case IBMVNIC_100MBPS :
4311
+ adapter -> speed = SPEED_100 ;
4312
+ break ;
4313
+ case IBMVNIC_1GBPS :
4314
+ adapter -> speed = SPEED_1000 ;
4315
+ break ;
4316
+ case IBMVNIC_10GBP :
4317
+ adapter -> speed = SPEED_10000 ;
4318
+ break ;
4319
+ case IBMVNIC_25GBPS :
4320
+ adapter -> speed = SPEED_25000 ;
4321
+ break ;
4322
+ case IBMVNIC_40GBPS :
4323
+ adapter -> speed = SPEED_40000 ;
4324
+ break ;
4325
+ case IBMVNIC_50GBPS :
4326
+ adapter -> speed = SPEED_50000 ;
4327
+ break ;
4328
+ case IBMVNIC_100GBPS :
4329
+ adapter -> speed = SPEED_100000 ;
4330
+ break ;
4331
+ default :
4332
+ netdev_warn (netdev , "Unknown speed 0x%08x\n" ,
4333
+ cpu_to_be32 (crq -> query_phys_parms_rsp .speed ));
4334
+ adapter -> speed = SPEED_UNKNOWN ;
4335
+ }
4336
+ if (crq -> query_phys_parms_rsp .flags1 & IBMVNIC_FULL_DUPLEX )
4337
+ adapter -> duplex = DUPLEX_FULL ;
4338
+ else if (crq -> query_phys_parms_rsp .flags1 & IBMVNIC_HALF_DUPLEX )
4339
+ adapter -> duplex = DUPLEX_HALF ;
4340
+ else
4341
+ adapter -> duplex = DUPLEX_UNKNOWN ;
4342
+
4343
+ return rc ;
4344
+ }
4345
+
4281
4346
static void ibmvnic_handle_crq (union ibmvnic_crq * crq ,
4282
4347
struct ibmvnic_adapter * adapter )
4283
4348
{
@@ -4426,6 +4491,10 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
4426
4491
case GET_VPD_RSP :
4427
4492
handle_vpd_rsp (crq , adapter );
4428
4493
break ;
4494
+ case QUERY_PHYS_PARMS_RSP :
4495
+ adapter -> fw_done_rc = handle_query_phys_parms_rsp (crq , adapter );
4496
+ complete (& adapter -> fw_done );
4497
+ break ;
4429
4498
default :
4430
4499
netdev_err (netdev , "Got an invalid cmd type 0x%02x\n" ,
4431
4500
gen_crq -> cmd );
0 commit comments