|
48 | 48 | {QEDE_RQSTAT_OFFSET(stat_name), QEDE_RQSTAT_STRING(stat_name)}
|
49 | 49 |
|
50 | 50 | #define QEDE_SELFTEST_POLL_COUNT 100
|
| 51 | +#define QEDE_DUMP_VERSION 0x1 |
| 52 | +#define QEDE_DUMP_NVM_BUF_LEN 32 |
| 53 | +#define QEDE_DUMP_NVM_ARG_COUNT 2 |
51 | 54 |
|
52 | 55 | static const struct {
|
53 | 56 | u64 offset;
|
@@ -1973,6 +1976,89 @@ static int qede_get_module_eeprom(struct net_device *dev,
|
1973 | 1976 | return rc;
|
1974 | 1977 | }
|
1975 | 1978 |
|
| 1979 | +static int qede_set_dump(struct net_device *dev, struct ethtool_dump *val) |
| 1980 | +{ |
| 1981 | + struct qede_dev *edev = netdev_priv(dev); |
| 1982 | + int rc = 0; |
| 1983 | + |
| 1984 | + if (edev->dump_info.cmd == QEDE_DUMP_CMD_NONE) { |
| 1985 | + if (val->flag > QEDE_DUMP_CMD_MAX) { |
| 1986 | + DP_ERR(edev, "Invalid command %d\n", val->flag); |
| 1987 | + return -EINVAL; |
| 1988 | + } |
| 1989 | + edev->dump_info.cmd = val->flag; |
| 1990 | + edev->dump_info.num_args = 0; |
| 1991 | + return 0; |
| 1992 | + } |
| 1993 | + |
| 1994 | + if (edev->dump_info.num_args == QEDE_DUMP_MAX_ARGS) { |
| 1995 | + DP_ERR(edev, "Arg count = %d\n", edev->dump_info.num_args); |
| 1996 | + return -EINVAL; |
| 1997 | + } |
| 1998 | + |
| 1999 | + switch (edev->dump_info.cmd) { |
| 2000 | + case QEDE_DUMP_CMD_NVM_CFG: |
| 2001 | + edev->dump_info.args[edev->dump_info.num_args] = val->flag; |
| 2002 | + edev->dump_info.num_args++; |
| 2003 | + break; |
| 2004 | + default: |
| 2005 | + break; |
| 2006 | + } |
| 2007 | + |
| 2008 | + return rc; |
| 2009 | +} |
| 2010 | + |
| 2011 | +static int qede_get_dump_flag(struct net_device *dev, |
| 2012 | + struct ethtool_dump *dump) |
| 2013 | +{ |
| 2014 | + struct qede_dev *edev = netdev_priv(dev); |
| 2015 | + |
| 2016 | + dump->version = QEDE_DUMP_VERSION; |
| 2017 | + switch (edev->dump_info.cmd) { |
| 2018 | + case QEDE_DUMP_CMD_NVM_CFG: |
| 2019 | + dump->flag = QEDE_DUMP_CMD_NVM_CFG; |
| 2020 | + dump->len = QEDE_DUMP_NVM_BUF_LEN; |
| 2021 | + break; |
| 2022 | + default: |
| 2023 | + break; |
| 2024 | + } |
| 2025 | + |
| 2026 | + DP_VERBOSE(edev, QED_MSG_DEBUG, |
| 2027 | + "dump->version = 0x%x dump->flag = %d dump->len = %d\n", |
| 2028 | + dump->version, dump->flag, dump->len); |
| 2029 | + return 0; |
| 2030 | +} |
| 2031 | + |
| 2032 | +static int qede_get_dump_data(struct net_device *dev, |
| 2033 | + struct ethtool_dump *dump, void *buf) |
| 2034 | +{ |
| 2035 | + struct qede_dev *edev = netdev_priv(dev); |
| 2036 | + int rc; |
| 2037 | + |
| 2038 | + switch (edev->dump_info.cmd) { |
| 2039 | + case QEDE_DUMP_CMD_NVM_CFG: |
| 2040 | + if (edev->dump_info.num_args != QEDE_DUMP_NVM_ARG_COUNT) { |
| 2041 | + DP_ERR(edev, "Arg count = %d required = %d\n", |
| 2042 | + edev->dump_info.num_args, |
| 2043 | + QEDE_DUMP_NVM_ARG_COUNT); |
| 2044 | + return -EINVAL; |
| 2045 | + } |
| 2046 | + rc = edev->ops->common->read_nvm_cfg(edev->cdev, (u8 **)&buf, |
| 2047 | + edev->dump_info.args[0], |
| 2048 | + edev->dump_info.args[1]); |
| 2049 | + break; |
| 2050 | + default: |
| 2051 | + DP_ERR(edev, "Invalid cmd = %d\n", edev->dump_info.cmd); |
| 2052 | + rc = -EINVAL; |
| 2053 | + break; |
| 2054 | + } |
| 2055 | + |
| 2056 | + edev->dump_info.cmd = QEDE_DUMP_CMD_NONE; |
| 2057 | + edev->dump_info.num_args = 0; |
| 2058 | + |
| 2059 | + return rc; |
| 2060 | +} |
| 2061 | + |
1976 | 2062 | static const struct ethtool_ops qede_ethtool_ops = {
|
1977 | 2063 | .get_link_ksettings = qede_get_link_ksettings,
|
1978 | 2064 | .set_link_ksettings = qede_set_link_ksettings,
|
@@ -2014,6 +2100,9 @@ static const struct ethtool_ops qede_ethtool_ops = {
|
2014 | 2100 | .get_tunable = qede_get_tunable,
|
2015 | 2101 | .set_tunable = qede_set_tunable,
|
2016 | 2102 | .flash_device = qede_flash_device,
|
| 2103 | + .get_dump_flag = qede_get_dump_flag, |
| 2104 | + .get_dump_data = qede_get_dump_data, |
| 2105 | + .set_dump = qede_set_dump, |
2017 | 2106 | };
|
2018 | 2107 |
|
2019 | 2108 | static const struct ethtool_ops qede_vf_ethtool_ops = {
|
|
0 commit comments