diff options
author | Sarveshwar Bandi <sarveshwarb@serverengines.com> | 2010-01-08 03:07:27 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-08 03:07:27 -0500 |
commit | 368c0ca2f0a69b0818fbc1796d8e21ff02a61b4c (patch) | |
tree | 5a087a7e86d65313d50cfa72af9f497d22068cfc /drivers/net/benet/be_ethtool.c | |
parent | a3aa18842a5303fc28fcc4d57dbd16618bd830a0 (diff) |
be2net: implements ethtool function to read eeprom data.
The patch implements a firmware command to fetch the eeprom data.
Signed-off-by: Sarveshwar Bandi <sarveshwarb@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 | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index 298b92cbd689..c5afc0286d4d 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
@@ -536,12 +536,57 @@ be_do_flash(struct net_device *netdev, struct ethtool_flash *efl) | |||
536 | return be_load_fw(adapter, file_name); | 536 | return be_load_fw(adapter, file_name); |
537 | } | 537 | } |
538 | 538 | ||
539 | static int | ||
540 | be_get_eeprom_len(struct net_device *netdev) | ||
541 | { | ||
542 | return BE_READ_SEEPROM_LEN; | ||
543 | } | ||
544 | |||
545 | static int | ||
546 | be_read_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom, | ||
547 | uint8_t *data) | ||
548 | { | ||
549 | struct be_adapter *adapter = netdev_priv(netdev); | ||
550 | struct be_dma_mem eeprom_cmd; | ||
551 | struct be_cmd_resp_seeprom_read *resp; | ||
552 | int status; | ||
553 | |||
554 | if (!eeprom->len) | ||
555 | return -EINVAL; | ||
556 | |||
557 | eeprom->magic = BE_VENDOR_ID | (adapter->pdev->device<<16); | ||
558 | |||
559 | memset(&eeprom_cmd, 0, sizeof(struct be_dma_mem)); | ||
560 | eeprom_cmd.size = sizeof(struct be_cmd_req_seeprom_read); | ||
561 | eeprom_cmd.va = pci_alloc_consistent(adapter->pdev, eeprom_cmd.size, | ||
562 | &eeprom_cmd.dma); | ||
563 | |||
564 | if (!eeprom_cmd.va) { | ||
565 | dev_err(&adapter->pdev->dev, | ||
566 | "Memory allocation failure. Could not read eeprom\n"); | ||
567 | return -ENOMEM; | ||
568 | } | ||
569 | |||
570 | status = be_cmd_get_seeprom_data(adapter, &eeprom_cmd); | ||
571 | |||
572 | if (!status) { | ||
573 | resp = (struct be_cmd_resp_seeprom_read *) eeprom_cmd.va; | ||
574 | memcpy(data, resp->seeprom_data, eeprom->len); | ||
575 | } | ||
576 | pci_free_consistent(adapter->pdev, eeprom_cmd.size, eeprom_cmd.va, | ||
577 | eeprom_cmd.dma); | ||
578 | |||
579 | return status; | ||
580 | } | ||
581 | |||
539 | const struct ethtool_ops be_ethtool_ops = { | 582 | const struct ethtool_ops be_ethtool_ops = { |
540 | .get_settings = be_get_settings, | 583 | .get_settings = be_get_settings, |
541 | .get_drvinfo = be_get_drvinfo, | 584 | .get_drvinfo = be_get_drvinfo, |
542 | .get_wol = be_get_wol, | 585 | .get_wol = be_get_wol, |
543 | .set_wol = be_set_wol, | 586 | .set_wol = be_set_wol, |
544 | .get_link = ethtool_op_get_link, | 587 | .get_link = ethtool_op_get_link, |
588 | .get_eeprom_len = be_get_eeprom_len, | ||
589 | .get_eeprom = be_read_eeprom, | ||
545 | .get_coalesce = be_get_coalesce, | 590 | .get_coalesce = be_get_coalesce, |
546 | .set_coalesce = be_set_coalesce, | 591 | .set_coalesce = be_set_coalesce, |
547 | .get_ringparam = be_get_ringparam, | 592 | .get_ringparam = be_get_ringparam, |