aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorSomnath Kotur <somnath.kotur@emulex.com>2012-05-17 18:59:03 -0400
committerDavid S. Miller <davem@davemloft.net>2012-05-18 13:33:32 -0400
commit941a77d582c84492e7433b8359c3bfcde90c9411 (patch)
treedbf4d56333d799f4359bece3c1b74db37e8ef676 /drivers
parentd7f7c0ac11bd6792b755ec76ac3befdc0767262a (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.h3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c56
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.h57
-rw-r--r--drivers/net/ethernet/emulex/benet/be_ethtool.c77
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c37
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);
603extern int be_load_fw(struct be_adapter *adapter, u8 *func); 604extern int be_load_fw(struct be_adapter *adapter, u8 *func);
604extern bool be_is_wol_supported(struct be_adapter *adapter); 605extern bool be_is_wol_supported(struct be_adapter *adapter);
605extern bool be_pause_supported(struct be_adapter *adapter); 606extern bool be_pause_supported(struct be_adapter *adapter);
607extern 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}
2594int 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);
2617err:
2618 mutex_unlock(&adapter->mbox_lock);
2619 return status;
2620}
2621
2622int 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);
2645err:
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
1615struct ext_fat_mode {
1616 u8 mode;
1617 u8 rsvd0;
1618 u16 port_mask;
1619 u32 dbg_lvl;
1620 u64 fun_mask;
1621} __packed;
1622
1623struct 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
1630struct 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
1642struct be_cmd_req_get_ext_fat_caps {
1643 struct be_cmd_req_hdr hdr;
1644 u32 parameter_type;
1645};
1646
1647struct be_cmd_resp_get_ext_fat_caps {
1648 struct be_cmd_resp_hdr hdr;
1649 struct be_fat_conf_params get_params;
1650};
1651
1652struct be_cmd_req_set_ext_fat_caps {
1653 struct be_cmd_req_hdr hdr;
1654 struct be_fat_conf_params set_params;
1655};
1656
1605extern int be_pci_fnum_get(struct be_adapter *adapter); 1657extern int be_pci_fnum_get(struct be_adapter *adapter);
1606extern int be_cmd_POST(struct be_adapter *adapter); 1658extern int be_cmd_POST(struct be_adapter *adapter);
1607extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, 1659extern 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,
1707extern int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, 1759extern int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
1708 u32 domain, u16 intf_id); 1760 u32 domain, u16 intf_id);
1709extern int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter); 1761extern int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter);
1762extern int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
1763 struct be_dma_mem *cmd);
1764extern 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
881static 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
893static 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);
932err:
933 return;
934}
935
936static 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
881const struct ethtool_ops be_ethtool_ops = { 956const 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
3406u32 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);
3436err:
3437 return level;
3438}
3406static int be_get_initial_config(struct be_adapter *adapter) 3439static 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