aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet/be_ethtool.c
diff options
context:
space:
mode:
authorAjit Khaparde <ajitk@serverengines.com>2010-06-30 23:51:00 -0400
committerDavid S. Miller <davem@davemloft.net>2010-07-02 01:45:53 -0400
commitee3cb6295144b0adfa75ccaca307643a6998b1e2 (patch)
treebe53541071540edaa0ef6a1e2802a07cdd52618d /drivers/net/benet/be_ethtool.c
parent3d8009c780ee90fccb5c171caf30aff839f13547 (diff)
be2net: changes to properly provide phy details
be2net driver is currently not showing correct phy details in certain cases. This patch fixes it. Signed-off-by: Ajit Khaparde <ajitk@serverengines.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet/be_ethtool.c')
-rw-r--r--drivers/net/benet/be_ethtool.c55
1 files changed, 41 insertions, 14 deletions
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c
index 200e98515909..c0ade242895d 100644
--- a/drivers/net/benet/be_ethtool.c
+++ b/drivers/net/benet/be_ethtool.c
@@ -314,10 +314,13 @@ static int be_get_sset_count(struct net_device *netdev, int stringset)
314static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) 314static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
315{ 315{
316 struct be_adapter *adapter = netdev_priv(netdev); 316 struct be_adapter *adapter = netdev_priv(netdev);
317 u8 mac_speed = 0, connector = 0; 317 struct be_dma_mem phy_cmd;
318 struct be_cmd_resp_get_phy_info *resp;
319 u8 mac_speed = 0;
318 u16 link_speed = 0; 320 u16 link_speed = 0;
319 bool link_up = false; 321 bool link_up = false;
320 int status; 322 int status;
323 u16 intf_type;
321 324
322 if (adapter->link_speed < 0) { 325 if (adapter->link_speed < 0) {
323 status = be_cmd_link_status_query(adapter, &link_up, 326 status = be_cmd_link_status_query(adapter, &link_up,
@@ -337,40 +340,57 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
337 } 340 }
338 } 341 }
339 342
340 status = be_cmd_read_port_type(adapter, adapter->port_num, 343 phy_cmd.size = sizeof(struct be_cmd_req_get_phy_info);
341 &connector); 344 phy_cmd.va = pci_alloc_consistent(adapter->pdev, phy_cmd.size,
345 &phy_cmd.dma);
346 if (!phy_cmd.va) {
347 dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
348 return -ENOMEM;
349 }
350 status = be_cmd_get_phy_info(adapter, &phy_cmd);
342 if (!status) { 351 if (!status) {
343 switch (connector) { 352 resp = (struct be_cmd_resp_get_phy_info *) phy_cmd.va;
344 case 7: 353 intf_type = le16_to_cpu(resp->interface_type);
354
355 switch (intf_type) {
356 case PHY_TYPE_XFP_10GB:
357 case PHY_TYPE_SFP_1GB:
358 case PHY_TYPE_SFP_PLUS_10GB:
345 ecmd->port = PORT_FIBRE; 359 ecmd->port = PORT_FIBRE;
346 ecmd->transceiver = XCVR_EXTERNAL;
347 break;
348 case 0:
349 ecmd->port = PORT_TP;
350 ecmd->transceiver = XCVR_EXTERNAL;
351 break; 360 break;
352 default: 361 default:
353 ecmd->port = PORT_TP; 362 ecmd->port = PORT_TP;
354 ecmd->transceiver = XCVR_INTERNAL;
355 break; 363 break;
356 } 364 }
357 } else { 365
358 ecmd->port = PORT_AUI; 366 switch (intf_type) {
367 case PHY_TYPE_KR_10GB:
368 case PHY_TYPE_KX4_10GB:
369 ecmd->autoneg = AUTONEG_ENABLE;
359 ecmd->transceiver = XCVR_INTERNAL; 370 ecmd->transceiver = XCVR_INTERNAL;
371 break;
372 default:
373 ecmd->autoneg = AUTONEG_DISABLE;
374 ecmd->transceiver = XCVR_EXTERNAL;
375 break;
376 }
360 } 377 }
361 378
362 /* Save for future use */ 379 /* Save for future use */
363 adapter->link_speed = ecmd->speed; 380 adapter->link_speed = ecmd->speed;
364 adapter->port_type = ecmd->port; 381 adapter->port_type = ecmd->port;
365 adapter->transceiver = ecmd->transceiver; 382 adapter->transceiver = ecmd->transceiver;
383 adapter->autoneg = ecmd->autoneg;
384 pci_free_consistent(adapter->pdev, phy_cmd.size,
385 phy_cmd.va, phy_cmd.dma);
366 } else { 386 } else {
367 ecmd->speed = adapter->link_speed; 387 ecmd->speed = adapter->link_speed;
368 ecmd->port = adapter->port_type; 388 ecmd->port = adapter->port_type;
369 ecmd->transceiver = adapter->transceiver; 389 ecmd->transceiver = adapter->transceiver;
390 ecmd->autoneg = adapter->autoneg;
370 } 391 }
371 392
372 ecmd->duplex = DUPLEX_FULL; 393 ecmd->duplex = DUPLEX_FULL;
373 ecmd->autoneg = AUTONEG_DISABLE;
374 ecmd->phy_address = adapter->port_num; 394 ecmd->phy_address = adapter->port_num;
375 switch (ecmd->port) { 395 switch (ecmd->port) {
376 case PORT_FIBRE: 396 case PORT_FIBRE:
@@ -384,6 +404,13 @@ static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
384 break; 404 break;
385 } 405 }
386 406
407 if (ecmd->autoneg) {
408 ecmd->supported |= SUPPORTED_1000baseT_Full;
409 ecmd->supported |= SUPPORTED_Autoneg;
410 ecmd->advertising |= (ADVERTISED_10000baseT_Full |
411 ADVERTISED_1000baseT_Full);
412 }
413
387 return 0; 414 return 0;
388} 415}
389 416