mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
net: hns3: add querying speed and duplex support to VF
This patch adds support for querying speed and duplex by ethtool ethX to VF. Signed-off-by: Fuyun Liang <liangfuyun1@huawei.com> Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
175ec96b46
commit
4a152de95d
@ -309,16 +309,20 @@ static int hclge_get_link_info(struct hclge_vport *vport,
|
||||
{
|
||||
struct hclge_dev *hdev = vport->back;
|
||||
u16 link_status;
|
||||
u8 msg_data[2];
|
||||
u8 msg_data[8];
|
||||
u8 dest_vfid;
|
||||
u16 duplex;
|
||||
|
||||
/* mac.link can only be 0 or 1 */
|
||||
link_status = (u16)hdev->hw.mac.link;
|
||||
duplex = hdev->hw.mac.duplex;
|
||||
memcpy(&msg_data[0], &link_status, sizeof(u16));
|
||||
memcpy(&msg_data[2], &hdev->hw.mac.speed, sizeof(u32));
|
||||
memcpy(&msg_data[6], &duplex, sizeof(u16));
|
||||
dest_vfid = mbx_req->mbx_src_vfid;
|
||||
|
||||
/* send this requested info to VF */
|
||||
return hclge_send_mbx_msg(vport, msg_data, sizeof(u8),
|
||||
return hclge_send_mbx_msg(vport, msg_data, sizeof(msg_data),
|
||||
HCLGE_MBX_LINK_STAT_CHANGE, dest_vfid);
|
||||
}
|
||||
|
||||
|
@ -1475,6 +1475,27 @@ static int hclgevf_get_status(struct hnae3_handle *handle)
|
||||
return hdev->hw.mac.link;
|
||||
}
|
||||
|
||||
static void hclgevf_get_ksettings_an_result(struct hnae3_handle *handle,
|
||||
u8 *auto_neg, u32 *speed,
|
||||
u8 *duplex)
|
||||
{
|
||||
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
|
||||
|
||||
if (speed)
|
||||
*speed = hdev->hw.mac.speed;
|
||||
if (duplex)
|
||||
*duplex = hdev->hw.mac.duplex;
|
||||
if (auto_neg)
|
||||
*auto_neg = AUTONEG_DISABLE;
|
||||
}
|
||||
|
||||
void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,
|
||||
u8 duplex)
|
||||
{
|
||||
hdev->hw.mac.speed = speed;
|
||||
hdev->hw.mac.duplex = duplex;
|
||||
}
|
||||
|
||||
static const struct hnae3_ae_ops hclgevf_ops = {
|
||||
.init_ae_dev = hclgevf_init_ae_dev,
|
||||
.uninit_ae_dev = hclgevf_uninit_ae_dev,
|
||||
@ -1508,6 +1529,7 @@ static const struct hnae3_ae_ops hclgevf_ops = {
|
||||
.get_channels = hclgevf_get_channels,
|
||||
.get_tqps_and_rss_info = hclgevf_get_tqps_and_rss_info,
|
||||
.get_status = hclgevf_get_status,
|
||||
.get_ksettings_an_result = hclgevf_get_ksettings_an_result,
|
||||
};
|
||||
|
||||
static struct hnae3_ae_algo ae_algovf = {
|
||||
|
@ -61,6 +61,8 @@ enum hclgevf_states {
|
||||
struct hclgevf_mac {
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
int link;
|
||||
u8 duplex;
|
||||
u32 speed;
|
||||
};
|
||||
|
||||
struct hclgevf_hw {
|
||||
@ -161,4 +163,6 @@ int hclgevf_send_mbx_msg(struct hclgevf_dev *hdev, u16 code, u16 subcode,
|
||||
u8 *resp_data, u16 resp_len);
|
||||
void hclgevf_mbx_handler(struct hclgevf_dev *hdev);
|
||||
void hclgevf_update_link_status(struct hclgevf_dev *hdev, int link_state);
|
||||
void hclgevf_update_speed_duplex(struct hclgevf_dev *hdev, u32 speed,
|
||||
u8 duplex);
|
||||
#endif
|
||||
|
@ -133,6 +133,8 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
||||
struct hclgevf_cmq_ring *crq;
|
||||
struct hclgevf_desc *desc;
|
||||
u16 link_status, flag;
|
||||
u32 speed;
|
||||
u8 duplex;
|
||||
u8 *temp;
|
||||
int i;
|
||||
|
||||
@ -164,9 +166,12 @@ void hclgevf_mbx_handler(struct hclgevf_dev *hdev)
|
||||
break;
|
||||
case HCLGE_MBX_LINK_STAT_CHANGE:
|
||||
link_status = le16_to_cpu(req->msg[1]);
|
||||
memcpy(&speed, &req->msg[2], sizeof(speed));
|
||||
duplex = (u8)le16_to_cpu(req->msg[4]);
|
||||
|
||||
/* update upper layer with new link link status */
|
||||
hclgevf_update_link_status(hdev, link_status);
|
||||
hclgevf_update_speed_duplex(hdev, speed, duplex);
|
||||
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user