static void hns_get_mdix_mode(struct net_device *net_dev, struct ethtool_link_ksettings *cmd) { int mdix_ctrl, mdix, retval, is_resolved; struct phy_device *phy_dev = net_dev->phydev; if (!phy_dev || !phy_dev->mdio.bus) { cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID; cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID; return; } phy_write(phy_dev, HNS_PHY_PAGE_REG, HNS_PHY_PAGE_MDIX); retval = phy_read(phy_dev, HNS_PHY_CSC_REG); mdix_ctrl = hnae_get_field(retval, PHY_MDIX_CTRL_M, PHY_MDIX_CTRL_S); retval = phy_read(phy_dev, HNS_PHY_CSS_REG); mdix = hnae_get_bit(retval, PHY_MDIX_STATUS_B); is_resolved = hnae_get_bit(retval, PHY_SPEED_DUP_RESOLVE_B); phy_write(phy_dev, HNS_PHY_PAGE_REG, HNS_PHY_PAGE_COPPER); switch (mdix_ctrl) { case 0x0: cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI; break; case 0x1: cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_X; break; case 0x3: cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_AUTO; break; default: cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_INVALID; break; } if (!is_resolved) cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID; else if (mdix) cmd->base.eth_tp_mdix = ETH_TP_MDI_X; else cmd->base.eth_tp_mdix = ETH_TP_MDI; }
void hclge_mbx_handler(struct hclge_dev *hdev) { struct hclge_cmq_ring *crq = &hdev->hw.cmq.crq; struct hclge_mbx_vf_to_pf_cmd *req; struct hclge_vport *vport; struct hclge_desc *desc; int ret, flag; /* handle all the mailbox requests in the queue */ while (!hclge_cmd_crq_empty(&hdev->hw)) { desc = &crq->desc[crq->next_to_use]; req = (struct hclge_mbx_vf_to_pf_cmd *)desc->data; flag = le16_to_cpu(crq->desc[crq->next_to_use].flag); if (unlikely(!hnae_get_bit(flag, HCLGE_CMDQ_RX_OUTVLD_B))) { dev_warn(&hdev->pdev->dev, "dropped invalid mailbox message, code = %d\n", req->msg[0]); /* dropping/not processing this invalid message */ crq->desc[crq->next_to_use].flag = 0; hclge_mbx_ring_ptr_move_crq(crq); continue; } vport = &hdev->vport[req->mbx_src_vfid]; switch (req->msg[0]) { case HCLGE_MBX_MAP_RING_TO_VECTOR: ret = hclge_map_unmap_ring_to_vf_vector(vport, true, req); break; case HCLGE_MBX_UNMAP_RING_TO_VECTOR: ret = hclge_map_unmap_ring_to_vf_vector(vport, false, req); break; case HCLGE_MBX_SET_PROMISC_MODE: ret = hclge_set_vf_promisc_mode(vport, req); if (ret) dev_err(&hdev->pdev->dev, "PF fail(%d) to set VF promisc mode\n", ret); break; case HCLGE_MBX_SET_UNICAST: ret = hclge_set_vf_uc_mac_addr(vport, req, true); if (ret) dev_err(&hdev->pdev->dev, "PF fail(%d) to set VF UC MAC Addr\n", ret); break; case HCLGE_MBX_SET_MULTICAST: ret = hclge_set_vf_mc_mac_addr(vport, req, false); if (ret) dev_err(&hdev->pdev->dev, "PF fail(%d) to set VF MC MAC Addr\n", ret); break; case HCLGE_MBX_SET_VLAN: ret = hclge_set_vf_vlan_cfg(vport, req, false); if (ret) dev_err(&hdev->pdev->dev, "PF failed(%d) to config VF's VLAN\n", ret); break; case HCLGE_MBX_GET_QINFO: ret = hclge_get_vf_queue_info(vport, req, true); if (ret) dev_err(&hdev->pdev->dev, "PF failed(%d) to get Q info for VF\n", ret); break; case HCLGE_MBX_GET_TCINFO: ret = hclge_get_vf_tcinfo(vport, req, true); if (ret) dev_err(&hdev->pdev->dev, "PF failed(%d) to get TC info for VF\n", ret); break; case HCLGE_MBX_GET_LINK_STATUS: ret = hclge_get_link_info(vport, req); if (ret) dev_err(&hdev->pdev->dev, "PF fail(%d) to get link stat for VF\n", ret); break; case HCLGE_MBX_QUEUE_RESET: hclge_mbx_reset_vf_queue(vport, req); break; case HCLGE_MBX_RESET: hclge_reset_vf(vport, req); break; default: dev_err(&hdev->pdev->dev, "un-supported mailbox message, code = %d\n", req->msg[0]); break; } crq->desc[crq->next_to_use].flag = 0; hclge_mbx_ring_ptr_move_crq(crq); } /* Write back CMDQ_RQ header pointer, M7 need this pointer */ hclge_write_dev(&hdev->hw, HCLGE_NIC_CRQ_HEAD_REG, crq->next_to_use); }