diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2012-05-17 18:59:03 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-18 13:33:32 -0400 |
commit | 941a77d582c84492e7433b8359c3bfcde90c9411 (patch) | |
tree | dbf4d56333d799f4359bece3c1b74db37e8ef676 /drivers | |
parent | d7f7c0ac11bd6792b755ec76ac3befdc0767262a (diff) |
be2net: Fix to allow get/set of debug levels in the firmware.
Patch re-spin.
Incorporated review comments by Ben Hutchings.
Signed-off-by: Suresh Reddy <suresh.reddy@emulex.com>
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com>
Acked-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be.h | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.c | 56 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_cmds.h | 57 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_ethtool.c | 77 | ||||
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 37 |
5 files changed, 230 insertions, 0 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h index ecf1a81f26e..ff4eb8fe25d 100644 --- a/drivers/net/ethernet/emulex/benet/be.h +++ b/drivers/net/ethernet/emulex/benet/be.h | |||
@@ -421,6 +421,7 @@ struct be_adapter { | |||
421 | bool wol; | 421 | bool wol; |
422 | u32 max_pmac_cnt; /* Max secondary UC MACs programmable */ | 422 | u32 max_pmac_cnt; /* Max secondary UC MACs programmable */ |
423 | u32 uc_macs; /* Count of secondary UC MAC programmed */ | 423 | u32 uc_macs; /* Count of secondary UC MAC programmed */ |
424 | u32 msg_enable; | ||
424 | }; | 425 | }; |
425 | 426 | ||
426 | #define be_physfn(adapter) (!adapter->virtfn) | 427 | #define be_physfn(adapter) (!adapter->virtfn) |
@@ -603,4 +604,6 @@ extern void be_parse_stats(struct be_adapter *adapter); | |||
603 | extern int be_load_fw(struct be_adapter *adapter, u8 *func); | 604 | extern int be_load_fw(struct be_adapter *adapter, u8 *func); |
604 | extern bool be_is_wol_supported(struct be_adapter *adapter); | 605 | extern bool be_is_wol_supported(struct be_adapter *adapter); |
605 | extern bool be_pause_supported(struct be_adapter *adapter); | 606 | extern bool be_pause_supported(struct be_adapter *adapter); |
607 | extern u32 be_get_fw_log_level(struct be_adapter *adapter); | ||
608 | |||
606 | #endif /* BE_H */ | 609 | #endif /* BE_H */ |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 43167e86395..b24623cce07 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
@@ -2589,4 +2589,60 @@ err: | |||
2589 | mutex_unlock(&adapter->mbox_lock); | 2589 | mutex_unlock(&adapter->mbox_lock); |
2590 | pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma); | 2590 | pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma); |
2591 | return status; | 2591 | return status; |
2592 | |||
2593 | } | ||
2594 | int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, | ||
2595 | struct be_dma_mem *cmd) | ||
2596 | { | ||
2597 | struct be_mcc_wrb *wrb; | ||
2598 | struct be_cmd_req_get_ext_fat_caps *req; | ||
2599 | int status; | ||
2600 | |||
2601 | if (mutex_lock_interruptible(&adapter->mbox_lock)) | ||
2602 | return -1; | ||
2603 | |||
2604 | wrb = wrb_from_mbox(adapter); | ||
2605 | if (!wrb) { | ||
2606 | status = -EBUSY; | ||
2607 | goto err; | ||
2608 | } | ||
2609 | |||
2610 | req = cmd->va; | ||
2611 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
2612 | OPCODE_COMMON_GET_EXT_FAT_CAPABILITES, | ||
2613 | cmd->size, wrb, cmd); | ||
2614 | req->parameter_type = cpu_to_le32(1); | ||
2615 | |||
2616 | status = be_mbox_notify_wait(adapter); | ||
2617 | err: | ||
2618 | mutex_unlock(&adapter->mbox_lock); | ||
2619 | return status; | ||
2620 | } | ||
2621 | |||
2622 | int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, | ||
2623 | struct be_dma_mem *cmd, | ||
2624 | struct be_fat_conf_params *configs) | ||
2625 | { | ||
2626 | struct be_mcc_wrb *wrb; | ||
2627 | struct be_cmd_req_set_ext_fat_caps *req; | ||
2628 | int status; | ||
2629 | |||
2630 | spin_lock_bh(&adapter->mcc_lock); | ||
2631 | |||
2632 | wrb = wrb_from_mccq(adapter); | ||
2633 | if (!wrb) { | ||
2634 | status = -EBUSY; | ||
2635 | goto err; | ||
2636 | } | ||
2637 | |||
2638 | req = cmd->va; | ||
2639 | memcpy(&req->set_params, configs, sizeof(struct be_fat_conf_params)); | ||
2640 | be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | ||
2641 | OPCODE_COMMON_SET_EXT_FAT_CAPABILITES, | ||
2642 | cmd->size, wrb, cmd); | ||
2643 | |||
2644 | status = be_mcc_notify_wait(adapter); | ||
2645 | err: | ||
2646 | spin_unlock_bh(&adapter->mcc_lock); | ||
2647 | return status; | ||
2592 | } | 2648 | } |
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.h b/drivers/net/ethernet/emulex/benet/be_cmds.h index 944f031bd31..0b1029b60f6 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.h +++ b/drivers/net/ethernet/emulex/benet/be_cmds.h | |||
@@ -189,6 +189,8 @@ struct be_mcc_mailbox { | |||
189 | #define OPCODE_COMMON_GET_PHY_DETAILS 102 | 189 | #define OPCODE_COMMON_GET_PHY_DETAILS 102 |
190 | #define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103 | 190 | #define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103 |
191 | #define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 | 191 | #define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 |
192 | #define OPCODE_COMMON_GET_EXT_FAT_CAPABILITES 125 | ||
193 | #define OPCODE_COMMON_SET_EXT_FAT_CAPABILITES 126 | ||
192 | #define OPCODE_COMMON_GET_MAC_LIST 147 | 194 | #define OPCODE_COMMON_GET_MAC_LIST 147 |
193 | #define OPCODE_COMMON_SET_MAC_LIST 148 | 195 | #define OPCODE_COMMON_SET_MAC_LIST 148 |
194 | #define OPCODE_COMMON_GET_HSW_CONFIG 152 | 196 | #define OPCODE_COMMON_GET_HSW_CONFIG 152 |
@@ -1602,6 +1604,56 @@ static inline void *be_erx_stats_from_cmd(struct be_adapter *adapter) | |||
1602 | } | 1604 | } |
1603 | } | 1605 | } |
1604 | 1606 | ||
1607 | |||
1608 | /************** get fat capabilites *******************/ | ||
1609 | #define MAX_MODULES 27 | ||
1610 | #define MAX_MODES 4 | ||
1611 | #define MODE_UART 0 | ||
1612 | #define FW_LOG_LEVEL_DEFAULT 48 | ||
1613 | #define FW_LOG_LEVEL_FATAL 64 | ||
1614 | |||
1615 | struct ext_fat_mode { | ||
1616 | u8 mode; | ||
1617 | u8 rsvd0; | ||
1618 | u16 port_mask; | ||
1619 | u32 dbg_lvl; | ||
1620 | u64 fun_mask; | ||
1621 | } __packed; | ||
1622 | |||
1623 | struct ext_fat_modules { | ||
1624 | u8 modules_str[32]; | ||
1625 | u32 modules_id; | ||
1626 | u32 num_modes; | ||
1627 | struct ext_fat_mode trace_lvl[MAX_MODES]; | ||
1628 | } __packed; | ||
1629 | |||
1630 | struct be_fat_conf_params { | ||
1631 | u32 max_log_entries; | ||
1632 | u32 log_entry_size; | ||
1633 | u8 log_type; | ||
1634 | u8 max_log_funs; | ||
1635 | u8 max_log_ports; | ||
1636 | u8 rsvd0; | ||
1637 | u32 supp_modes; | ||
1638 | u32 num_modules; | ||
1639 | struct ext_fat_modules module[MAX_MODULES]; | ||
1640 | } __packed; | ||
1641 | |||
1642 | struct be_cmd_req_get_ext_fat_caps { | ||
1643 | struct be_cmd_req_hdr hdr; | ||
1644 | u32 parameter_type; | ||
1645 | }; | ||
1646 | |||
1647 | struct be_cmd_resp_get_ext_fat_caps { | ||
1648 | struct be_cmd_resp_hdr hdr; | ||
1649 | struct be_fat_conf_params get_params; | ||
1650 | }; | ||
1651 | |||
1652 | struct be_cmd_req_set_ext_fat_caps { | ||
1653 | struct be_cmd_req_hdr hdr; | ||
1654 | struct be_fat_conf_params set_params; | ||
1655 | }; | ||
1656 | |||
1605 | extern int be_pci_fnum_get(struct be_adapter *adapter); | 1657 | extern int be_pci_fnum_get(struct be_adapter *adapter); |
1606 | extern int be_cmd_POST(struct be_adapter *adapter); | 1658 | extern int be_cmd_POST(struct be_adapter *adapter); |
1607 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | 1659 | extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, |
@@ -1707,4 +1759,9 @@ extern int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, | |||
1707 | extern int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, | 1759 | extern int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, |
1708 | u32 domain, u16 intf_id); | 1760 | u32 domain, u16 intf_id); |
1709 | extern int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); | 1761 | extern int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); |
1762 | extern int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter, | ||
1763 | struct be_dma_mem *cmd); | ||
1764 | extern int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, | ||
1765 | struct be_dma_mem *cmd, | ||
1766 | struct be_fat_conf_params *cfgs); | ||
1710 | 1767 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c index 747f68fa976..63e51d47690 100644 --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c | |||
@@ -878,6 +878,81 @@ be_read_eeprom(struct net_device *netdev, struct ethtool_eeprom *eeprom, | |||
878 | return status; | 878 | return status; |
879 | } | 879 | } |
880 | 880 | ||
881 | static u32 be_get_msg_level(struct net_device *netdev) | ||
882 | { | ||
883 | struct be_adapter *adapter = netdev_priv(netdev); | ||
884 | |||
885 | if (lancer_chip(adapter)) { | ||
886 | dev_err(&adapter->pdev->dev, "Operation not supported\n"); | ||
887 | return -EOPNOTSUPP; | ||
888 | } | ||
889 | |||
890 | return adapter->msg_enable; | ||
891 | } | ||
892 | |||
893 | static void be_set_fw_log_level(struct be_adapter *adapter, u32 level) | ||
894 | { | ||
895 | struct be_dma_mem extfat_cmd; | ||
896 | struct be_fat_conf_params *cfgs; | ||
897 | int status; | ||
898 | int i, j; | ||
899 | |||
900 | memset(&extfat_cmd, 0, sizeof(struct be_dma_mem)); | ||
901 | extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps); | ||
902 | extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size, | ||
903 | &extfat_cmd.dma); | ||
904 | if (!extfat_cmd.va) { | ||
905 | dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n", | ||
906 | __func__); | ||
907 | goto err; | ||
908 | } | ||
909 | status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd); | ||
910 | if (!status) { | ||
911 | cfgs = (struct be_fat_conf_params *)(extfat_cmd.va + | ||
912 | sizeof(struct be_cmd_resp_hdr)); | ||
913 | for (i = 0; i < cfgs->num_modules; i++) { | ||
914 | for (j = 0; j < cfgs->module[i].num_modes; j++) { | ||
915 | if (cfgs->module[i].trace_lvl[j].mode == | ||
916 | MODE_UART) | ||
917 | cfgs->module[i].trace_lvl[j].dbg_lvl = | ||
918 | cpu_to_le32(level); | ||
919 | } | ||
920 | } | ||
921 | status = be_cmd_set_ext_fat_capabilites(adapter, &extfat_cmd, | ||
922 | cfgs); | ||
923 | if (status) | ||
924 | dev_err(&adapter->pdev->dev, | ||
925 | "Message level set failed\n"); | ||
926 | } else { | ||
927 | dev_err(&adapter->pdev->dev, "Message level get failed\n"); | ||
928 | } | ||
929 | |||
930 | pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va, | ||
931 | extfat_cmd.dma); | ||
932 | err: | ||
933 | return; | ||
934 | } | ||
935 | |||
936 | static void be_set_msg_level(struct net_device *netdev, u32 level) | ||
937 | { | ||
938 | struct be_adapter *adapter = netdev_priv(netdev); | ||
939 | |||
940 | if (lancer_chip(adapter)) { | ||
941 | dev_err(&adapter->pdev->dev, "Operation not supported\n"); | ||
942 | return; | ||
943 | } | ||
944 | |||
945 | if (adapter->msg_enable == level) | ||
946 | return; | ||
947 | |||
948 | if ((level & NETIF_MSG_HW) != (adapter->msg_enable & NETIF_MSG_HW)) | ||
949 | be_set_fw_log_level(adapter, level & NETIF_MSG_HW ? | ||
950 | FW_LOG_LEVEL_DEFAULT : FW_LOG_LEVEL_FATAL); | ||
951 | adapter->msg_enable = level; | ||
952 | |||
953 | return; | ||
954 | } | ||
955 | |||
881 | const struct ethtool_ops be_ethtool_ops = { | 956 | const struct ethtool_ops be_ethtool_ops = { |
882 | .get_settings = be_get_settings, | 957 | .get_settings = be_get_settings, |
883 | .get_drvinfo = be_get_drvinfo, | 958 | .get_drvinfo = be_get_drvinfo, |
@@ -893,6 +968,8 @@ const struct ethtool_ops be_ethtool_ops = { | |||
893 | .set_pauseparam = be_set_pauseparam, | 968 | .set_pauseparam = be_set_pauseparam, |
894 | .get_strings = be_get_stat_strings, | 969 | .get_strings = be_get_stat_strings, |
895 | .set_phys_id = be_set_phys_id, | 970 | .set_phys_id = be_set_phys_id, |
971 | .get_msglevel = be_get_msg_level, | ||
972 | .set_msglevel = be_set_msg_level, | ||
896 | .get_sset_count = be_get_sset_count, | 973 | .get_sset_count = be_get_sset_count, |
897 | .get_ethtool_stats = be_get_ethtool_stats, | 974 | .get_ethtool_stats = be_get_ethtool_stats, |
898 | .get_regs_len = be_get_reg_len, | 975 | .get_regs_len = be_get_reg_len, |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index a01f7346753..081c7770116 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -3403,9 +3403,43 @@ bool be_is_wol_supported(struct be_adapter *adapter) | |||
3403 | !be_is_wol_excluded(adapter)) ? true : false; | 3403 | !be_is_wol_excluded(adapter)) ? true : false; |
3404 | } | 3404 | } |
3405 | 3405 | ||
3406 | u32 be_get_fw_log_level(struct be_adapter *adapter) | ||
3407 | { | ||
3408 | struct be_dma_mem extfat_cmd; | ||
3409 | struct be_fat_conf_params *cfgs; | ||
3410 | int status; | ||
3411 | u32 level = 0; | ||
3412 | int j; | ||
3413 | |||
3414 | memset(&extfat_cmd, 0, sizeof(struct be_dma_mem)); | ||
3415 | extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps); | ||
3416 | extfat_cmd.va = pci_alloc_consistent(adapter->pdev, extfat_cmd.size, | ||
3417 | &extfat_cmd.dma); | ||
3418 | |||
3419 | if (!extfat_cmd.va) { | ||
3420 | dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n", | ||
3421 | __func__); | ||
3422 | goto err; | ||
3423 | } | ||
3424 | |||
3425 | status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd); | ||
3426 | if (!status) { | ||
3427 | cfgs = (struct be_fat_conf_params *)(extfat_cmd.va + | ||
3428 | sizeof(struct be_cmd_resp_hdr)); | ||
3429 | for (j = 0; j < cfgs->module[0].num_modes; j++) { | ||
3430 | if (cfgs->module[0].trace_lvl[j].mode == MODE_UART) | ||
3431 | level = cfgs->module[0].trace_lvl[j].dbg_lvl; | ||
3432 | } | ||
3433 | } | ||
3434 | pci_free_consistent(adapter->pdev, extfat_cmd.size, extfat_cmd.va, | ||
3435 | extfat_cmd.dma); | ||
3436 | err: | ||
3437 | return level; | ||
3438 | } | ||
3406 | static int be_get_initial_config(struct be_adapter *adapter) | 3439 | static int be_get_initial_config(struct be_adapter *adapter) |
3407 | { | 3440 | { |
3408 | int status; | 3441 | int status; |
3442 | u32 level; | ||
3409 | 3443 | ||
3410 | status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, | 3444 | status = be_cmd_query_fw_cfg(adapter, &adapter->port_num, |
3411 | &adapter->function_mode, &adapter->function_caps); | 3445 | &adapter->function_mode, &adapter->function_caps); |
@@ -3443,6 +3477,9 @@ static int be_get_initial_config(struct be_adapter *adapter) | |||
3443 | if (be_is_wol_supported(adapter)) | 3477 | if (be_is_wol_supported(adapter)) |
3444 | adapter->wol = true; | 3478 | adapter->wol = true; |
3445 | 3479 | ||
3480 | level = be_get_fw_log_level(adapter); | ||
3481 | adapter->msg_enable = level <= FW_LOG_LEVEL_DEFAULT ? NETIF_MSG_HW : 0; | ||
3482 | |||
3446 | return 0; | 3483 | return 0; |
3447 | } | 3484 | } |
3448 | 3485 | ||