@@ -120,6 +120,7 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *);
120120static void release_crq_queue (struct ibmvnic_adapter * );
121121static int __ibmvnic_set_mac (struct net_device * netdev , struct sockaddr * p );
122122static int init_crq_queue (struct ibmvnic_adapter * adapter );
123+ static int send_query_phys_parms (struct ibmvnic_adapter * adapter );
123124
124125struct ibmvnic_stat {
125126 char name [ETH_GSTRING_LEN ];
@@ -2278,23 +2279,20 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
22782279static int ibmvnic_get_link_ksettings (struct net_device * netdev ,
22792280 struct ethtool_link_ksettings * cmd )
22802281{
2281- u32 supported , advertising ;
2282+ struct ibmvnic_adapter * adapter = netdev_priv (netdev );
2283+ int rc ;
22822284
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 ;
22892292 cmd -> base .port = PORT_FIBRE ;
22902293 cmd -> base .phy_address = 0 ;
22912294 cmd -> base .autoneg = AUTONEG_ENABLE ;
22922295
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-
22982296 return 0 ;
22992297}
23002298
@@ -4278,6 +4276,73 @@ static void handle_query_cap_rsp(union ibmvnic_crq *crq,
42784276 }
42794277}
42804278
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+
42814346static void ibmvnic_handle_crq (union ibmvnic_crq * crq ,
42824347 struct ibmvnic_adapter * adapter )
42834348{
@@ -4426,6 +4491,10 @@ static void ibmvnic_handle_crq(union ibmvnic_crq *crq,
44264491 case GET_VPD_RSP :
44274492 handle_vpd_rsp (crq , adapter );
44284493 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 ;
44294498 default :
44304499 netdev_err (netdev , "Got an invalid cmd type 0x%02x\n" ,
44314500 gen_crq -> cmd );
0 commit comments