mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-09 22:24:04 +08:00
be2net: add code to display temperature of ASIC
Add support to display temperature of ASIC via ethtool -S From: Somnath K <somnath.kotur@emulex.com> Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3968fa1e58
commit
609ff3bb8f
@ -225,6 +225,10 @@ struct be_rx_obj {
|
|||||||
u32 cache_line_barrier[15];
|
u32 cache_line_barrier[15];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct be_drv_stats {
|
||||||
|
u8 be_on_die_temperature;
|
||||||
|
};
|
||||||
|
|
||||||
struct be_vf_cfg {
|
struct be_vf_cfg {
|
||||||
unsigned char vf_mac_addr[ETH_ALEN];
|
unsigned char vf_mac_addr[ETH_ALEN];
|
||||||
u32 vf_if_handle;
|
u32 vf_if_handle;
|
||||||
@ -234,6 +238,7 @@ struct be_vf_cfg {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#define BE_INVALID_PMAC_ID 0xffffffff
|
#define BE_INVALID_PMAC_ID 0xffffffff
|
||||||
|
|
||||||
struct be_adapter {
|
struct be_adapter {
|
||||||
struct pci_dev *pdev;
|
struct pci_dev *pdev;
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
@ -269,6 +274,7 @@ struct be_adapter {
|
|||||||
u32 big_page_size; /* Compounded page size shared by rx wrbs */
|
u32 big_page_size; /* Compounded page size shared by rx wrbs */
|
||||||
|
|
||||||
u8 msix_vec_next_idx;
|
u8 msix_vec_next_idx;
|
||||||
|
struct be_drv_stats drv_stats;
|
||||||
|
|
||||||
struct vlan_group *vlan_grp;
|
struct vlan_group *vlan_grp;
|
||||||
u16 vlans_added;
|
u16 vlans_added;
|
||||||
@ -281,6 +287,7 @@ struct be_adapter {
|
|||||||
struct be_dma_mem stats_cmd;
|
struct be_dma_mem stats_cmd;
|
||||||
/* Work queue used to perform periodic tasks like getting statistics */
|
/* Work queue used to perform periodic tasks like getting statistics */
|
||||||
struct delayed_work work;
|
struct delayed_work work;
|
||||||
|
u16 work_counter;
|
||||||
|
|
||||||
/* Ethtool knobs and info */
|
/* Ethtool knobs and info */
|
||||||
bool rx_csum; /* BE card must perform rx-checksumming */
|
bool rx_csum; /* BE card must perform rx-checksumming */
|
||||||
|
@ -18,6 +18,9 @@
|
|||||||
#include "be.h"
|
#include "be.h"
|
||||||
#include "be_cmds.h"
|
#include "be_cmds.h"
|
||||||
|
|
||||||
|
/* Must be a power of 2 or else MODULO will BUG_ON */
|
||||||
|
static int be_get_temp_freq = 32;
|
||||||
|
|
||||||
static void be_mcc_notify(struct be_adapter *adapter)
|
static void be_mcc_notify(struct be_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct be_queue_info *mccq = &adapter->mcc_obj.q;
|
struct be_queue_info *mccq = &adapter->mcc_obj.q;
|
||||||
@ -1069,6 +1072,9 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
|
|||||||
struct be_sge *sge;
|
struct be_sge *sge;
|
||||||
int status = 0;
|
int status = 0;
|
||||||
|
|
||||||
|
if (MODULO(adapter->work_counter, be_get_temp_freq) == 0)
|
||||||
|
be_cmd_get_die_temperature(adapter);
|
||||||
|
|
||||||
spin_lock_bh(&adapter->mcc_lock);
|
spin_lock_bh(&adapter->mcc_lock);
|
||||||
|
|
||||||
wrb = wrb_from_mccq(adapter);
|
wrb = wrb_from_mccq(adapter);
|
||||||
@ -1136,6 +1142,44 @@ err:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Uses synchronous mcc */
|
||||||
|
int be_cmd_get_die_temperature(struct be_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct be_mcc_wrb *wrb;
|
||||||
|
struct be_cmd_req_get_cntl_addnl_attribs *req;
|
||||||
|
int status;
|
||||||
|
|
||||||
|
spin_lock_bh(&adapter->mcc_lock);
|
||||||
|
|
||||||
|
wrb = wrb_from_mccq(adapter);
|
||||||
|
if (!wrb) {
|
||||||
|
status = -EBUSY;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
req = embedded_payload(wrb);
|
||||||
|
|
||||||
|
be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
|
||||||
|
OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES);
|
||||||
|
|
||||||
|
be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
|
||||||
|
OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES, sizeof(*req));
|
||||||
|
|
||||||
|
status = be_mcc_notify_wait(adapter);
|
||||||
|
if (!status) {
|
||||||
|
struct be_cmd_resp_get_cntl_addnl_attribs *resp =
|
||||||
|
embedded_payload(wrb);
|
||||||
|
adapter->drv_stats.be_on_die_temperature =
|
||||||
|
resp->on_die_temperature;
|
||||||
|
}
|
||||||
|
/* If IOCTL fails once, do not bother issuing it again */
|
||||||
|
else
|
||||||
|
be_get_temp_freq = 0;
|
||||||
|
|
||||||
|
err:
|
||||||
|
spin_unlock_bh(&adapter->mcc_lock);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
/* Uses Mbox */
|
/* Uses Mbox */
|
||||||
int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
|
int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
|
||||||
{
|
{
|
||||||
|
@ -189,6 +189,7 @@ struct be_mcc_mailbox {
|
|||||||
#define OPCODE_COMMON_GET_BEACON_STATE 70
|
#define OPCODE_COMMON_GET_BEACON_STATE 70
|
||||||
#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
|
#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
|
||||||
#define OPCODE_COMMON_GET_PHY_DETAILS 102
|
#define OPCODE_COMMON_GET_PHY_DETAILS 102
|
||||||
|
#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121
|
||||||
|
|
||||||
#define OPCODE_ETH_RSS_CONFIG 1
|
#define OPCODE_ETH_RSS_CONFIG 1
|
||||||
#define OPCODE_ETH_ACPI_CONFIG 2
|
#define OPCODE_ETH_ACPI_CONFIG 2
|
||||||
@ -668,6 +669,20 @@ struct be_cmd_resp_get_stats {
|
|||||||
struct be_hw_stats hw_stats;
|
struct be_hw_stats hw_stats;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct be_cmd_req_get_cntl_addnl_attribs {
|
||||||
|
struct be_cmd_req_hdr hdr;
|
||||||
|
u8 rsvd[8];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct be_cmd_resp_get_cntl_addnl_attribs {
|
||||||
|
struct be_cmd_resp_hdr hdr;
|
||||||
|
u16 ipl_file_number;
|
||||||
|
u8 ipl_file_version;
|
||||||
|
u8 rsvd0;
|
||||||
|
u8 on_die_temperature; /* in degrees centigrade*/
|
||||||
|
u8 rsvd1[3];
|
||||||
|
};
|
||||||
|
|
||||||
struct be_cmd_req_vlan_config {
|
struct be_cmd_req_vlan_config {
|
||||||
struct be_cmd_req_hdr hdr;
|
struct be_cmd_req_hdr hdr;
|
||||||
u8 interface_id;
|
u8 interface_id;
|
||||||
@ -1099,4 +1114,5 @@ extern int be_cmd_get_phy_info(struct be_adapter *adapter,
|
|||||||
struct be_dma_mem *cmd);
|
struct be_dma_mem *cmd);
|
||||||
extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
|
extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
|
||||||
extern void be_detect_dump_ue(struct be_adapter *adapter);
|
extern void be_detect_dump_ue(struct be_adapter *adapter);
|
||||||
|
extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ struct be_ethtool_stat {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
|
enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
|
||||||
PMEMSTAT};
|
PMEMSTAT, DRVSTAT};
|
||||||
#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
|
#define FIELDINFO(_struct, field) FIELD_SIZEOF(_struct, field), \
|
||||||
offsetof(_struct, field)
|
offsetof(_struct, field)
|
||||||
#define NETSTAT_INFO(field) #field, NETSTAT,\
|
#define NETSTAT_INFO(field) #field, NETSTAT,\
|
||||||
@ -46,6 +46,9 @@ enum {NETSTAT, PORTSTAT, MISCSTAT, DRVSTAT_TX, DRVSTAT_RX, ERXSTAT,
|
|||||||
FIELDINFO(struct be_erx_stats, field)
|
FIELDINFO(struct be_erx_stats, field)
|
||||||
#define PMEMSTAT_INFO(field) #field, PMEMSTAT,\
|
#define PMEMSTAT_INFO(field) #field, PMEMSTAT,\
|
||||||
FIELDINFO(struct be_pmem_stats, field)
|
FIELDINFO(struct be_pmem_stats, field)
|
||||||
|
#define DRVSTAT_INFO(field) #field, DRVSTAT,\
|
||||||
|
FIELDINFO(struct be_drv_stats, \
|
||||||
|
field)
|
||||||
|
|
||||||
static const struct be_ethtool_stat et_stats[] = {
|
static const struct be_ethtool_stat et_stats[] = {
|
||||||
{NETSTAT_INFO(rx_packets)},
|
{NETSTAT_INFO(rx_packets)},
|
||||||
@ -105,7 +108,8 @@ static const struct be_ethtool_stat et_stats[] = {
|
|||||||
{MISCSTAT_INFO(rx_drops_mtu)},
|
{MISCSTAT_INFO(rx_drops_mtu)},
|
||||||
{MISCSTAT_INFO(port0_jabber_events)},
|
{MISCSTAT_INFO(port0_jabber_events)},
|
||||||
{MISCSTAT_INFO(port1_jabber_events)},
|
{MISCSTAT_INFO(port1_jabber_events)},
|
||||||
{PMEMSTAT_INFO(eth_red_drops)}
|
{PMEMSTAT_INFO(eth_red_drops)},
|
||||||
|
{DRVSTAT_INFO(be_on_die_temperature)}
|
||||||
};
|
};
|
||||||
#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
|
#define ETHTOOL_STATS_NUM ARRAY_SIZE(et_stats)
|
||||||
|
|
||||||
@ -285,6 +289,9 @@ be_get_ethtool_stats(struct net_device *netdev,
|
|||||||
case PMEMSTAT:
|
case PMEMSTAT:
|
||||||
p = &hw_stats->pmem;
|
p = &hw_stats->pmem;
|
||||||
break;
|
break;
|
||||||
|
case DRVSTAT:
|
||||||
|
p = &adapter->drv_stats;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = (u8 *)p + et_stats[i].offset;
|
p = (u8 *)p + et_stats[i].offset;
|
||||||
|
Loading…
Reference in New Issue
Block a user