Merge branch 'net-hns3-misc-updates-for-next'
Huazhong Tan says: ==================== net: hns3: misc updates for -next This patchset includes some misc updates for the HNS3 ethernet driver. #1 & #2 add two cleanups. #3 provides an interface for the client to query the CMDQ's status. #4 adds a little optimization about debugfs. #5 prevents 1000M auto-negotiation off setting. ==================== Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
90d9834ecd
@ -552,6 +552,7 @@ struct hnae3_ae_ops {
|
||||
int (*set_vf_mac)(struct hnae3_handle *handle, int vf, u8 *p);
|
||||
int (*get_module_eeprom)(struct hnae3_handle *handle, u32 offset,
|
||||
u32 len, u8 *data);
|
||||
bool (*get_cmdq_stat)(struct hnae3_handle *handle);
|
||||
};
|
||||
|
||||
struct hnae3_dcb_ops {
|
||||
|
@ -773,8 +773,13 @@ static int hns3_set_link_ksettings(struct net_device *netdev,
|
||||
cmd->base.autoneg, cmd->base.speed, cmd->base.duplex);
|
||||
|
||||
/* Only support ksettings_set for netdev with phy attached for now */
|
||||
if (netdev->phydev)
|
||||
if (netdev->phydev) {
|
||||
if (cmd->base.speed == SPEED_1000 &&
|
||||
cmd->base.autoneg == AUTONEG_DISABLE)
|
||||
return -EINVAL;
|
||||
|
||||
return phy_ethtool_ksettings_set(netdev->phydev, cmd);
|
||||
}
|
||||
|
||||
if (handle->pdev->revision == 0x20)
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -184,11 +184,11 @@ enum hclge_opcode_type {
|
||||
/* TQP commands */
|
||||
HCLGE_OPC_CFG_TX_QUEUE = 0x0B01,
|
||||
HCLGE_OPC_QUERY_TX_POINTER = 0x0B02,
|
||||
HCLGE_OPC_QUERY_TX_STATUS = 0x0B03,
|
||||
HCLGE_OPC_QUERY_TX_STATS = 0x0B03,
|
||||
HCLGE_OPC_TQP_TX_QUEUE_TC = 0x0B04,
|
||||
HCLGE_OPC_CFG_RX_QUEUE = 0x0B11,
|
||||
HCLGE_OPC_QUERY_RX_POINTER = 0x0B12,
|
||||
HCLGE_OPC_QUERY_RX_STATUS = 0x0B13,
|
||||
HCLGE_OPC_QUERY_RX_STATS = 0x0B13,
|
||||
HCLGE_OPC_STASH_RX_QUEUE_LRO = 0x0B16,
|
||||
HCLGE_OPC_CFG_RX_QUEUE_LRO = 0x0B17,
|
||||
HCLGE_OPC_CFG_COM_TQP_QUEUE = 0x0B20,
|
||||
|
@ -1258,6 +1258,7 @@ static void hclge_dbg_dump_ncl_config(struct hclge_dev *hdev,
|
||||
{
|
||||
#define HCLGE_MAX_NCL_CONFIG_OFFSET 4096
|
||||
#define HCLGE_NCL_CONFIG_LENGTH_IN_EACH_CMD (20 + 24 * 4)
|
||||
#define HCLGE_NCL_CONFIG_PARAM_NUM 2
|
||||
|
||||
struct hclge_desc desc[HCLGE_CMD_NCL_CONFIG_BD_NUM];
|
||||
int bd_num = HCLGE_CMD_NCL_CONFIG_BD_NUM;
|
||||
@ -1267,13 +1268,17 @@ static void hclge_dbg_dump_ncl_config(struct hclge_dev *hdev,
|
||||
int ret;
|
||||
|
||||
ret = sscanf(cmd_buf, "%x %x", &offset, &length);
|
||||
if (ret != 2 || offset >= HCLGE_MAX_NCL_CONFIG_OFFSET ||
|
||||
length > HCLGE_MAX_NCL_CONFIG_OFFSET - offset) {
|
||||
dev_err(&hdev->pdev->dev, "Invalid offset or length.\n");
|
||||
if (ret != HCLGE_NCL_CONFIG_PARAM_NUM) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Too few parameters, num = %d.\n", ret);
|
||||
return;
|
||||
}
|
||||
if (offset < 0 || length <= 0) {
|
||||
dev_err(&hdev->pdev->dev, "Non-positive offset or length.\n");
|
||||
|
||||
if (offset < 0 || offset >= HCLGE_MAX_NCL_CONFIG_OFFSET ||
|
||||
length <= 0 || length > HCLGE_MAX_NCL_CONFIG_OFFSET - offset) {
|
||||
dev_err(&hdev->pdev->dev,
|
||||
"Invalid input, offset = %d, length = %d.\n",
|
||||
offset, length);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -16,7 +16,6 @@
|
||||
#define HCLGE_RAS_REG_NFE_MASK 0xFF00
|
||||
#define HCLGE_RAS_REG_ROCEE_ERR_MASK 0x3000000
|
||||
|
||||
#define HCLGE_VECTOR0_PF_OTHER_INT_STS_REG 0x20800
|
||||
#define HCLGE_VECTOR0_REG_MSIX_MASK 0x1FF00
|
||||
|
||||
#define HCLGE_IMP_TCM_ECC_ERR_INT_EN 0xFFFF0000
|
||||
|
@ -552,7 +552,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
|
||||
queue = handle->kinfo.tqp[i];
|
||||
tqp = container_of(queue, struct hclge_tqp, q);
|
||||
/* command : HCLGE_OPC_QUERY_IGU_STAT */
|
||||
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_RX_STATUS,
|
||||
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_QUERY_RX_STATS,
|
||||
true);
|
||||
|
||||
desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
|
||||
@ -572,7 +572,7 @@ static int hclge_tqps_update_stats(struct hnae3_handle *handle)
|
||||
tqp = container_of(queue, struct hclge_tqp, q);
|
||||
/* command : HCLGE_OPC_QUERY_IGU_STAT */
|
||||
hclge_cmd_setup_basic_desc(&desc[0],
|
||||
HCLGE_OPC_QUERY_TX_STATUS,
|
||||
HCLGE_OPC_QUERY_TX_STATS,
|
||||
true);
|
||||
|
||||
desc[0].data[0] = cpu_to_le32((tqp->index & 0x1ff));
|
||||
@ -2968,13 +2968,11 @@ static int hclge_set_vf_link_state(struct hnae3_handle *handle, int vf,
|
||||
|
||||
static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
{
|
||||
u32 rst_src_reg, cmdq_src_reg, msix_src_reg;
|
||||
u32 cmdq_src_reg, msix_src_reg;
|
||||
|
||||
/* fetch the events from their corresponding regs */
|
||||
rst_src_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
cmdq_src_reg = hclge_read_dev(&hdev->hw, HCLGE_VECTOR0_CMDQ_SRC_REG);
|
||||
msix_src_reg = hclge_read_dev(&hdev->hw,
|
||||
HCLGE_VECTOR0_PF_OTHER_INT_STS_REG);
|
||||
msix_src_reg = hclge_read_dev(&hdev->hw, HCLGE_MISC_VECTOR_INT_STS);
|
||||
|
||||
/* Assumption: If by any chance reset and mailbox events are reported
|
||||
* together then we will only process reset event in this go and will
|
||||
@ -2984,7 +2982,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
*
|
||||
* check for vector0 reset event sources
|
||||
*/
|
||||
if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & rst_src_reg) {
|
||||
if (BIT(HCLGE_VECTOR0_IMPRESET_INT_B) & msix_src_reg) {
|
||||
dev_info(&hdev->pdev->dev, "IMP reset interrupt\n");
|
||||
set_bit(HNAE3_IMP_RESET, &hdev->reset_pending);
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
@ -2993,7 +2991,7 @@ static u32 hclge_check_event_cause(struct hclge_dev *hdev, u32 *clearval)
|
||||
return HCLGE_VECTOR0_EVENT_RST;
|
||||
}
|
||||
|
||||
if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & rst_src_reg) {
|
||||
if (BIT(HCLGE_VECTOR0_GLOBALRESET_INT_B) & msix_src_reg) {
|
||||
dev_info(&hdev->pdev->dev, "global reset interrupt\n");
|
||||
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
set_bit(HNAE3_GLOBAL_RESET, &hdev->reset_pending);
|
||||
@ -3483,7 +3481,7 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hnae3_ae_dev *ae_dev,
|
||||
/* first, resolve any unknown reset type to the known type(s) */
|
||||
if (test_bit(HNAE3_UNKNOWN_RESET, addr)) {
|
||||
u32 msix_sts_reg = hclge_read_dev(&hdev->hw,
|
||||
HCLGE_VECTOR0_PF_OTHER_INT_STS_REG);
|
||||
HCLGE_MISC_VECTOR_INT_STS);
|
||||
/* we will intentionally ignore any errors from this function
|
||||
* as we will end up in *some* reset request in any case
|
||||
*/
|
||||
@ -6404,6 +6402,14 @@ static bool hclge_get_hw_reset_stat(struct hnae3_handle *handle)
|
||||
hclge_read_dev(&hdev->hw, HCLGE_FUN_RST_ING);
|
||||
}
|
||||
|
||||
static bool hclge_get_cmdq_stat(struct hnae3_handle *handle)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
|
||||
return test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
|
||||
}
|
||||
|
||||
static bool hclge_ae_dev_resetting(struct hnae3_handle *handle)
|
||||
{
|
||||
struct hclge_vport *vport = hclge_get_vport(handle);
|
||||
@ -11313,6 +11319,7 @@ static const struct hnae3_ae_ops hclge_ops = {
|
||||
.set_vf_rate = hclge_set_vf_rate,
|
||||
.set_vf_mac = hclge_set_vf_mac,
|
||||
.get_module_eeprom = hclge_get_module_eeprom,
|
||||
.get_cmdq_stat = hclge_get_cmdq_stat,
|
||||
};
|
||||
|
||||
static struct hnae3_ae_algo ae_algo = {
|
||||
|
Loading…
Reference in New Issue
Block a user