26
26
#include "hclge_devlink.h"
27
27
28
28
#define HCLGE_NAME "hclge"
29
- #define HCLGE_STATS_READ (p , offset ) (*(u64 *)((u8 *)(p) + (offset)))
30
- #define HCLGE_MAC_STATS_FIELD_OFF (f ) (offsetof(struct hclge_mac_stats, f))
31
29
32
30
#define HCLGE_BUF_SIZE_UNIT 256U
33
31
#define HCLGE_BUF_MUL_BY 2
@@ -568,6 +566,16 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
568
566
struct hclge_desc desc ;
569
567
int ret ;
570
568
569
+ /* Driver needs total register number of both valid registers and
570
+ * reserved registers, but the old firmware only returns number
571
+ * of valid registers in device V2. To be compatible with these
572
+ * devices, driver uses a fixed value.
573
+ */
574
+ if (hdev -> ae_dev -> dev_version == HNAE3_DEVICE_VERSION_V2 ) {
575
+ * reg_num = HCLGE_MAC_STATS_MAX_NUM_V1 ;
576
+ return 0 ;
577
+ }
578
+
571
579
hclge_cmd_setup_basic_desc (& desc , HCLGE_OPC_QUERY_MAC_REG_NUM , true);
572
580
ret = hclge_cmd_send (& hdev -> hw , & desc , 1 );
573
581
if (ret ) {
@@ -587,7 +595,7 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
587
595
return 0 ;
588
596
}
589
597
590
- static int hclge_mac_update_stats (struct hclge_dev * hdev )
598
+ int hclge_mac_update_stats (struct hclge_dev * hdev )
591
599
{
592
600
/* The firmware supports the new statistics acquisition method */
593
601
if (hdev -> ae_dev -> dev_specs .mac_stats_num )
@@ -2581,7 +2589,7 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
2581
2589
if (hdev -> num_msi < hdev -> num_nic_msi + hdev -> num_roce_msi )
2582
2590
return - EINVAL ;
2583
2591
2584
- roce -> rinfo .base_vector = hdev -> roce_base_vector ;
2592
+ roce -> rinfo .base_vector = hdev -> num_nic_msi ;
2585
2593
2586
2594
roce -> rinfo .netdev = nic -> kinfo .netdev ;
2587
2595
roce -> rinfo .roce_io_base = hdev -> hw .io_base ;
@@ -2617,10 +2625,6 @@ static int hclge_init_msi(struct hclge_dev *hdev)
2617
2625
hdev -> num_msi = vectors ;
2618
2626
hdev -> num_msi_left = vectors ;
2619
2627
2620
- hdev -> base_msi_vector = pdev -> irq ;
2621
- hdev -> roce_base_vector = hdev -> base_msi_vector +
2622
- hdev -> num_nic_msi ;
2623
-
2624
2628
hdev -> vector_status = devm_kcalloc (& pdev -> dev , hdev -> num_msi ,
2625
2629
sizeof (u16 ), GFP_KERNEL );
2626
2630
if (!hdev -> vector_status ) {
@@ -8949,8 +8953,11 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
8949
8953
8950
8954
err_no_space :
8951
8955
/* if already overflow, not to print each time */
8952
- if (!(vport -> overflow_promisc_flags & HNAE3_OVERFLOW_MPE ))
8956
+ if (!(vport -> overflow_promisc_flags & HNAE3_OVERFLOW_MPE )) {
8957
+ vport -> overflow_promisc_flags |= HNAE3_OVERFLOW_MPE ;
8953
8958
dev_err (& hdev -> pdev -> dev , "mc mac vlan table is full\n" );
8959
+ }
8960
+
8954
8961
return - ENOSPC ;
8955
8962
}
8956
8963
@@ -9006,12 +9013,17 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
9006
9013
9007
9014
static void hclge_sync_vport_mac_list (struct hclge_vport * vport ,
9008
9015
struct list_head * list ,
9009
- int (* sync )(struct hclge_vport * ,
9010
- const unsigned char * ))
9016
+ enum HCLGE_MAC_ADDR_TYPE mac_type )
9011
9017
{
9018
+ int (* sync )(struct hclge_vport * vport , const unsigned char * addr );
9012
9019
struct hclge_mac_node * mac_node , * tmp ;
9013
9020
int ret ;
9014
9021
9022
+ if (mac_type == HCLGE_MAC_ADDR_UC )
9023
+ sync = hclge_add_uc_addr_common ;
9024
+ else
9025
+ sync = hclge_add_mc_addr_common ;
9026
+
9015
9027
list_for_each_entry_safe (mac_node , tmp , list , node ) {
9016
9028
ret = sync (vport , mac_node -> mac_addr );
9017
9029
if (!ret ) {
@@ -9023,21 +9035,31 @@ static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
9023
9035
/* If one unicast mac address is existing in hardware,
9024
9036
* we need to try whether other unicast mac addresses
9025
9037
* are new addresses that can be added.
9038
+ * Multicast mac address can be reusable, even though
9039
+ * there is no space to add new multicast mac address,
9040
+ * we should check whether other mac addresses are
9041
+ * existing in hardware for reuse.
9026
9042
*/
9027
- if (ret != - EEXIST )
9043
+ if ((mac_type == HCLGE_MAC_ADDR_UC && ret != - EEXIST ) ||
9044
+ (mac_type == HCLGE_MAC_ADDR_MC && ret != - ENOSPC ))
9028
9045
break ;
9029
9046
}
9030
9047
}
9031
9048
}
9032
9049
9033
9050
static void hclge_unsync_vport_mac_list (struct hclge_vport * vport ,
9034
9051
struct list_head * list ,
9035
- int (* unsync )(struct hclge_vport * ,
9036
- const unsigned char * ))
9052
+ enum HCLGE_MAC_ADDR_TYPE mac_type )
9037
9053
{
9054
+ int (* unsync )(struct hclge_vport * vport , const unsigned char * addr );
9038
9055
struct hclge_mac_node * mac_node , * tmp ;
9039
9056
int ret ;
9040
9057
9058
+ if (mac_type == HCLGE_MAC_ADDR_UC )
9059
+ unsync = hclge_rm_uc_addr_common ;
9060
+ else
9061
+ unsync = hclge_rm_mc_addr_common ;
9062
+
9041
9063
list_for_each_entry_safe (mac_node , tmp , list , node ) {
9042
9064
ret = unsync (vport , mac_node -> mac_addr );
9043
9065
if (!ret || ret == - ENOENT ) {
@@ -9168,17 +9190,8 @@ static void hclge_sync_vport_mac_table(struct hclge_vport *vport,
9168
9190
spin_unlock_bh (& vport -> mac_list_lock );
9169
9191
9170
9192
/* delete first, in order to get max mac table space for adding */
9171
- if (mac_type == HCLGE_MAC_ADDR_UC ) {
9172
- hclge_unsync_vport_mac_list (vport , & tmp_del_list ,
9173
- hclge_rm_uc_addr_common );
9174
- hclge_sync_vport_mac_list (vport , & tmp_add_list ,
9175
- hclge_add_uc_addr_common );
9176
- } else {
9177
- hclge_unsync_vport_mac_list (vport , & tmp_del_list ,
9178
- hclge_rm_mc_addr_common );
9179
- hclge_sync_vport_mac_list (vport , & tmp_add_list ,
9180
- hclge_add_mc_addr_common );
9181
- }
9193
+ hclge_unsync_vport_mac_list (vport , & tmp_del_list , mac_type );
9194
+ hclge_sync_vport_mac_list (vport , & tmp_add_list , mac_type );
9182
9195
9183
9196
/* if some mac addresses were added/deleted fail, move back to the
9184
9197
* mac_list, and retry at next time.
@@ -9337,12 +9350,7 @@ static void hclge_uninit_vport_mac_list(struct hclge_vport *vport,
9337
9350
9338
9351
spin_unlock_bh (& vport -> mac_list_lock );
9339
9352
9340
- if (mac_type == HCLGE_MAC_ADDR_UC )
9341
- hclge_unsync_vport_mac_list (vport , & tmp_del_list ,
9342
- hclge_rm_uc_addr_common );
9343
- else
9344
- hclge_unsync_vport_mac_list (vport , & tmp_del_list ,
9345
- hclge_rm_mc_addr_common );
9353
+ hclge_unsync_vport_mac_list (vport , & tmp_del_list , mac_type );
9346
9354
9347
9355
if (!list_empty (& tmp_del_list ))
9348
9356
dev_warn (& hdev -> pdev -> dev ,
@@ -9410,36 +9418,6 @@ static int hclge_get_mac_ethertype_cmd_status(struct hclge_dev *hdev,
9410
9418
return return_status ;
9411
9419
}
9412
9420
9413
- static bool hclge_check_vf_mac_exist (struct hclge_vport * vport , int vf_idx ,
9414
- u8 * mac_addr )
9415
- {
9416
- struct hclge_mac_vlan_tbl_entry_cmd req ;
9417
- struct hclge_dev * hdev = vport -> back ;
9418
- struct hclge_desc desc ;
9419
- u16 egress_port = 0 ;
9420
- int i ;
9421
-
9422
- if (is_zero_ether_addr (mac_addr ))
9423
- return false;
9424
-
9425
- memset (& req , 0 , sizeof (req ));
9426
- hnae3_set_field (egress_port , HCLGE_MAC_EPORT_VFID_M ,
9427
- HCLGE_MAC_EPORT_VFID_S , vport -> vport_id );
9428
- req .egress_port = cpu_to_le16 (egress_port );
9429
- hclge_prepare_mac_addr (& req , mac_addr , false);
9430
-
9431
- if (hclge_lookup_mac_vlan_tbl (vport , & req , & desc , false) != - ENOENT )
9432
- return true;
9433
-
9434
- vf_idx += HCLGE_VF_VPORT_START_NUM ;
9435
- for (i = HCLGE_VF_VPORT_START_NUM ; i < hdev -> num_alloc_vport ; i ++ )
9436
- if (i != vf_idx &&
9437
- ether_addr_equal (mac_addr , hdev -> vport [i ].vf_info .mac ))
9438
- return true;
9439
-
9440
- return false;
9441
- }
9442
-
9443
9421
static int hclge_set_vf_mac (struct hnae3_handle * handle , int vf ,
9444
9422
u8 * mac_addr )
9445
9423
{
@@ -9457,12 +9435,6 @@ static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
9457
9435
return 0 ;
9458
9436
}
9459
9437
9460
- if (hclge_check_vf_mac_exist (vport , vf , mac_addr )) {
9461
- dev_err (& hdev -> pdev -> dev , "Specified MAC(=%pM) exists!\n" ,
9462
- mac_addr );
9463
- return - EEXIST ;
9464
- }
9465
-
9466
9438
ether_addr_copy (vport -> vf_info .mac , mac_addr );
9467
9439
9468
9440
if (test_bit (HCLGE_VPORT_STATE_ALIVE , & vport -> state )) {
0 commit comments