diff options
author | Ajit Khaparde <ajitk@serverengines.com> | 2010-06-30 23:51:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-02 01:45:53 -0400 |
commit | ee3cb6295144b0adfa75ccaca307643a6998b1e2 (patch) | |
tree | be53541071540edaa0ef6a1e2802a07cdd52618d /drivers/net/benet/be_ethtool.c | |
parent | 3d8009c780ee90fccb5c171caf30aff839f13547 (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.c | 55 |
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) | |||
314 | static int be_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | 314 | static 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 | ||