Skip to content

Commit f8d6ae0

Browse files
Murilo Fossa Vicentinidavem330
Murilo Fossa Vicentini
authored andcommitted
ibmvnic: Report actual backing device speed and duplex values
The ibmvnic driver currently reports a fixed value for both speed and duplex settings regardless of the actual backing device that is being used. By adding support to the QUERY_PHYS_PARMS command defined by the PAPR+ we can query the current physical port state and report the proper values for these feilds. Reported-by: Abdul Haleem <[email protected]> Signed-off-by: Murilo Fossa Vicentini <[email protected]> Reviewed-by: Mauro S. M. Rodrigues <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent c55c8ed commit f8d6ae0

File tree

2 files changed

+94
-17
lines changed

2 files changed

+94
-17
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

+81-12
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *);
120120
static void release_crq_queue(struct ibmvnic_adapter *);
121121
static int __ibmvnic_set_mac(struct net_device *netdev, struct sockaddr *p);
122122
static int init_crq_queue(struct ibmvnic_adapter *adapter);
123+
static int send_query_phys_parms(struct ibmvnic_adapter *adapter);
123124

124125
struct ibmvnic_stat {
125126
char name[ETH_GSTRING_LEN];
@@ -2278,23 +2279,20 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
22782279
static 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+
42814346
static 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);

drivers/net/ethernet/ibm/ibmvnic.h

+13-5
Original file line numberDiff line numberDiff line change
@@ -377,11 +377,16 @@ struct ibmvnic_phys_parms {
377377
u8 flags2;
378378
#define IBMVNIC_LOGICAL_LNK_ACTIVE 0x80
379379
__be32 speed;
380-
#define IBMVNIC_AUTONEG 0x80
381-
#define IBMVNIC_10MBPS 0x40
382-
#define IBMVNIC_100MBPS 0x20
383-
#define IBMVNIC_1GBPS 0x10
384-
#define IBMVNIC_10GBPS 0x08
380+
#define IBMVNIC_AUTONEG 0x80000000
381+
#define IBMVNIC_10MBPS 0x40000000
382+
#define IBMVNIC_100MBPS 0x20000000
383+
#define IBMVNIC_1GBPS 0x10000000
384+
#define IBMVNIC_10GBP 0x08000000
385+
#define IBMVNIC_40GBPS 0x04000000
386+
#define IBMVNIC_100GBPS 0x02000000
387+
#define IBMVNIC_25GBPS 0x01000000
388+
#define IBMVNIC_50GBPS 0x00800000
389+
#define IBMVNIC_200GBPS 0x00400000
385390
__be32 mtu;
386391
struct ibmvnic_rc rc;
387392
} __packed __aligned(8);
@@ -999,6 +1004,9 @@ struct ibmvnic_adapter {
9991004
int phys_link_state;
10001005
int logical_link_state;
10011006

1007+
u32 speed;
1008+
u8 duplex;
1009+
10021010
/* login data */
10031011
struct ibmvnic_login_buffer *login_buf;
10041012
dma_addr_t login_buf_token;

0 commit comments

Comments
 (0)