Message ID | 1612269593-18691-5-git-send-email-tanhuazhong@huawei.com |
---|---|
State | New |
Headers | show |
Series | net: hns3: updates for -next | expand |
On Tue, 2 Feb 2021 20:39:50 +0800 Huazhong Tan wrote: > From: Yufeng Mo <moyufeng@huawei.com> > > Since the newer hardware may supports different frame size, > so add support to obtain the capability from the firmware > instead of the fixed value. > > Signed-off-by: Yufeng Mo <moyufeng@huawei.com> > Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> > @@ -9659,7 +9663,7 @@ int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu) > /* HW supprt 2 layer vlan */ > max_frm_size = new_mtu + ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN; > if (max_frm_size < HCLGE_MAC_MIN_FRAME || > - max_frm_size > HCLGE_MAC_MAX_FRAME) > + max_frm_size > hdev->ae_dev->dev_specs.max_pkt_len) > return -EINVAL; > > max_frm_size = max(max_frm_size, HCLGE_MAC_DEFAULT_FRAME); Don't you have to adjust netdev->max_mtu as well when device specifies max_pkt_len different than HCLGE_MAC_MAX_FRAME?
On 2021/2/4 8:56, Jakub Kicinski wrote: > On Tue, 2 Feb 2021 20:39:50 +0800 Huazhong Tan wrote: >> From: Yufeng Mo <moyufeng@huawei.com> >> >> Since the newer hardware may supports different frame size, >> so add support to obtain the capability from the firmware >> instead of the fixed value. >> >> Signed-off-by: Yufeng Mo <moyufeng@huawei.com> >> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> >> @@ -9659,7 +9663,7 @@ int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu) >> /* HW supprt 2 layer vlan */ >> max_frm_size = new_mtu + ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN; >> if (max_frm_size < HCLGE_MAC_MIN_FRAME || >> - max_frm_size > HCLGE_MAC_MAX_FRAME) >> + max_frm_size > hdev->ae_dev->dev_specs.max_pkt_len) >> return -EINVAL; >> >> max_frm_size = max(max_frm_size, HCLGE_MAC_DEFAULT_FRAME); > Don't you have to adjust netdev->max_mtu as well when device specifies > max_pkt_len different than HCLGE_MAC_MAX_FRAME? netdev->max_mtu should be adjusted as well, will fix it. thanks. > .
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h index f4c8d72..f27504e 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h @@ -284,6 +284,7 @@ struct hnae3_dev_specs { u16 int_ql_max; /* max value of interrupt coalesce based on INT_QL */ u16 max_int_gl; /* max value of interrupt coalesce based on INT_GL */ u8 max_non_tso_bd_num; /* max BD number of one non-TSO packet */ + u16 max_pkt_len; }; struct hnae3_client_ops { diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h index 9ceb059..0c8ac68 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h @@ -1131,7 +1131,8 @@ struct hclge_dev_specs_0_cmd { #define HCLGE_DEF_MAX_INT_GL 0x1FE0U struct hclge_dev_specs_1_cmd { - __le32 rsv0; + __le16 max_pkt_len; + __le16 rsv0; __le16 max_int_gl; u8 rsv1[18]; }; diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index fcf1bca..dd205c0 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c @@ -1371,6 +1371,7 @@ static void hclge_set_default_dev_specs(struct hclge_dev *hdev) ae_dev->dev_specs.rss_key_size = HCLGE_RSS_KEY_SIZE; ae_dev->dev_specs.max_tm_rate = HCLGE_ETHER_MAX_RATE; ae_dev->dev_specs.max_int_gl = HCLGE_DEF_MAX_INT_GL; + ae_dev->dev_specs.max_pkt_len = HCLGE_MAC_MAX_FRAME; } static void hclge_parse_dev_specs(struct hclge_dev *hdev, @@ -1390,6 +1391,7 @@ static void hclge_parse_dev_specs(struct hclge_dev *hdev, ae_dev->dev_specs.rss_key_size = le16_to_cpu(req0->rss_key_size); ae_dev->dev_specs.max_tm_rate = le32_to_cpu(req0->max_tm_rate); ae_dev->dev_specs.max_int_gl = le16_to_cpu(req1->max_int_gl); + ae_dev->dev_specs.max_pkt_len = le16_to_cpu(req1->max_pkt_len); } static void hclge_check_dev_specs(struct hclge_dev *hdev) @@ -1406,6 +1408,8 @@ static void hclge_check_dev_specs(struct hclge_dev *hdev) dev_specs->max_tm_rate = HCLGE_ETHER_MAX_RATE; if (!dev_specs->max_int_gl) dev_specs->max_int_gl = HCLGE_DEF_MAX_INT_GL; + if (!dev_specs->max_pkt_len) + dev_specs->max_pkt_len = HCLGE_MAC_MAX_FRAME; } static int hclge_query_dev_specs(struct hclge_dev *hdev) @@ -9659,7 +9663,7 @@ int hclge_set_vport_mtu(struct hclge_vport *vport, int new_mtu) /* HW supprt 2 layer vlan */ max_frm_size = new_mtu + ETH_HLEN + ETH_FCS_LEN + 2 * VLAN_HLEN; if (max_frm_size < HCLGE_MAC_MIN_FRAME || - max_frm_size > HCLGE_MAC_MAX_FRAME) + max_frm_size > hdev->ae_dev->dev_specs.max_pkt_len) return -EINVAL; max_frm_size = max(max_frm_size, HCLGE_MAC_DEFAULT_FRAME);