hinic3: Add HW event handler

Add HINIC3_INIT_UP flags to trace netdev open status.
Add port module event handler.
Add link status event type(FAULT, PCIE link down, heart lost, mgmt
watchdog).

Co-developed-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Zhu Yikai <zhuyikai1@h-partners.com>
Signed-off-by: Fan Gong <gongfan1@huawei.com>
Link: https://patch.msgid.link/53a2b928136998f740d597bbd45ca1740b95538f.1768375903.git.zhuyikai1@h-partners.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Fan Gong
2026-01-14 16:38:28 +08:00
committed by Paolo Abeni
parent aebd95b00a
commit cb36f89b10
6 changed files with 92 additions and 1 deletions

View File

@@ -17,6 +17,15 @@ enum hinic3_event_service_type {
HINIC3_EVENT_SRV_NIC = 1
};
enum hinic3_comm_event_type {
HINIC3_COMM_EVENT_PCIE_LINK_DOWN = 0,
HINIC3_COMM_EVENT_HEART_LOST = 1,
HINIC3_COMM_EVENT_FAULT = 2,
HINIC3_COMM_EVENT_SRIOV_STATE_CHANGE = 3,
HINIC3_COMM_EVENT_CARD_REMOVE = 4,
HINIC3_COMM_EVENT_MGMT_WATCHDOG = 5,
};
enum hinic3_fault_err_level {
HINIC3_FAULT_LEVEL_SERIOUS_FLR = 3,
};

View File

@@ -19,7 +19,8 @@ static void hinic3_net_dim(struct hinic3_nic_dev *nic_dev,
struct hinic3_rxq *rxq = irq_cfg->rxq;
struct dim_sample sample = {};
if (!nic_dev->adaptive_rx_coal)
if (!test_bit(HINIC3_INTF_UP, &nic_dev->flags) ||
!nic_dev->adaptive_rx_coal)
return;
dim_update_sample(irq_cfg->total_events, rxq->rxq_stats.packets,

View File

@@ -331,6 +331,44 @@ static void hinic3_link_status_change(struct net_device *netdev,
}
}
static void hinic3_port_module_event_handler(struct net_device *netdev,
struct hinic3_event_info *event)
{
const char *g_hinic3_module_link_err[LINK_ERR_NUM] = {
"Unrecognized module"
};
struct hinic3_port_module_event *module_event;
enum port_module_event_type type;
enum link_err_type err_type;
module_event = (struct hinic3_port_module_event *)event->event_data;
type = module_event->type;
err_type = module_event->err_type;
switch (type) {
case HINIC3_PORT_MODULE_CABLE_PLUGGED:
case HINIC3_PORT_MODULE_CABLE_UNPLUGGED:
netdev_info(netdev, "Port module event: Cable %s\n",
type == HINIC3_PORT_MODULE_CABLE_PLUGGED ?
"plugged" : "unplugged");
break;
case HINIC3_PORT_MODULE_LINK_ERR:
if (err_type >= LINK_ERR_NUM) {
netdev_info(netdev, "Link failed, Unknown error type: 0x%x\n",
err_type);
} else {
netdev_info(netdev,
"Link failed, error type: 0x%x: %s\n",
err_type,
g_hinic3_module_link_err[err_type]);
}
break;
default:
netdev_err(netdev, "Unknown port module type %d\n", type);
break;
}
}
static void hinic3_nic_event(struct auxiliary_device *adev,
struct hinic3_event_info *event)
{
@@ -344,8 +382,20 @@ static void hinic3_nic_event(struct auxiliary_device *adev,
HINIC3_NIC_EVENT_LINK_UP):
hinic3_link_status_change(netdev, true);
break;
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_NIC,
HINIC3_NIC_EVENT_PORT_MODULE_EVENT):
hinic3_port_module_event_handler(netdev, event);
break;
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_NIC,
HINIC3_NIC_EVENT_LINK_DOWN):
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_COMM,
HINIC3_COMM_EVENT_FAULT):
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_COMM,
HINIC3_COMM_EVENT_PCIE_LINK_DOWN):
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_COMM,
HINIC3_COMM_EVENT_HEART_LOST):
case HINIC3_SRV_EVENT_TYPE(HINIC3_EVENT_SRV_COMM,
HINIC3_COMM_EVENT_MGMT_WATCHDOG):
hinic3_link_status_change(netdev, false);
break;
default:

View File

@@ -432,6 +432,11 @@ static int hinic3_open(struct net_device *netdev)
struct hinic3_dyna_qp_params qp_params;
int err;
if (test_bit(HINIC3_INTF_UP, &nic_dev->flags)) {
netdev_dbg(netdev, "Netdev already open, do nothing\n");
return 0;
}
err = hinic3_init_nicio_res(nic_dev);
if (err) {
netdev_err(netdev, "Failed to init nicio resources\n");
@@ -459,6 +464,8 @@ static int hinic3_open(struct net_device *netdev)
if (err)
goto err_close_channel;
set_bit(HINIC3_INTF_UP, &nic_dev->flags);
return 0;
err_close_channel:
@@ -479,6 +486,11 @@ static int hinic3_close(struct net_device *netdev)
struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
struct hinic3_dyna_qp_params qp_params;
if (!test_and_clear_bit(HINIC3_INTF_UP, &nic_dev->flags)) {
netdev_dbg(netdev, "Netdev already close, do nothing\n");
return 0;
}
hinic3_vport_down(netdev);
hinic3_close_channel(netdev);
hinic3_uninit_qps(nic_dev, &qp_params);

View File

@@ -22,6 +22,7 @@ struct hinic3_nic_dev;
enum hinic3_nic_event_type {
HINIC3_NIC_EVENT_LINK_DOWN = 0,
HINIC3_NIC_EVENT_LINK_UP = 1,
HINIC3_NIC_EVENT_PORT_MODULE_EVENT = 2,
};
struct hinic3_sq_attr {
@@ -51,6 +52,23 @@ struct mag_cmd_set_port_enable {
u8 rsvd1[3];
};
enum link_err_type {
LINK_ERR_MODULE_UNRECOGENIZED,
LINK_ERR_NUM,
};
enum port_module_event_type {
HINIC3_PORT_MODULE_CABLE_PLUGGED,
HINIC3_PORT_MODULE_CABLE_UNPLUGGED,
HINIC3_PORT_MODULE_LINK_ERR,
HINIC3_PORT_MODULE_MAX_EVENT,
};
struct hinic3_port_module_event {
enum port_module_event_type type;
enum link_err_type err_type;
};
int hinic3_get_nic_feature_from_hw(struct hinic3_nic_dev *nic_dev);
int hinic3_set_nic_feature_to_hw(struct hinic3_nic_dev *nic_dev);
bool hinic3_test_support(struct hinic3_nic_dev *nic_dev,

View File

@@ -16,6 +16,7 @@
(VLAN_N_VID / HINIC3_VLAN_BITMAP_BYTE_SIZE(nic_dev))
enum hinic3_flags {
HINIC3_INTF_UP,
HINIC3_MAC_FILTER_CHANGED,
HINIC3_RSS_ENABLE,
HINIC3_UPDATE_MAC_FILTER,