Skip to content

Commit 1413ff1

Browse files
committed
Merge branch 'hns3-fixes'
Guangbin Huang says: ==================== net: hns3: add some fixes for -net This series adds some fixes for the HNS3 ethernet driver. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 8f1bc38 + 688db0c commit 1413ff1

File tree

12 files changed

+147
-132
lines changed

12 files changed

+147
-132
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4210,6 +4210,13 @@ int hns3_clean_rx_ring(struct hns3_enet_ring *ring, int budget,
42104210
}
42114211

42124212
out:
4213+
/* sync head pointer before exiting, since hardware will calculate
4214+
* FBD number with head pointer
4215+
*/
4216+
if (unused_count > 0)
4217+
failure = failure ||
4218+
hns3_nic_alloc_rx_buffers(ring, unused_count);
4219+
42134220
return failure ? budget : recv_pkts;
42144221
}
42154222

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ static int hclge_firmware_compat_config(struct hclge_dev *hdev, bool en)
483483
if (hnae3_dev_phy_imp_supported(hdev))
484484
hnae3_set_bit(compat, HCLGE_PHY_IMP_EN_B, 1);
485485
hnae3_set_bit(compat, HCLGE_MAC_STATS_EXT_EN_B, 1);
486+
hnae3_set_bit(compat, HCLGE_SYNC_RX_RING_HEAD_EN_B, 1);
486487

487488
req->compat = cpu_to_le32(compat);
488489
}

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,7 @@ struct hclge_query_ppu_pf_other_int_dfx_cmd {
11511151
#define HCLGE_NCSI_ERROR_REPORT_EN_B 1
11521152
#define HCLGE_PHY_IMP_EN_B 2
11531153
#define HCLGE_MAC_STATS_EXT_EN_B 3
1154+
#define HCLGE_SYNC_RX_RING_HEAD_EN_B 4
11541155
struct hclge_firmware_compat_cmd {
11551156
__le32 compat;
11561157
u8 rsv[20];

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ static int hclge_ets_sch_mode_validate(struct hclge_dev *hdev,
129129
u32 total_ets_bw = 0;
130130
u8 i;
131131

132-
for (i = 0; i < hdev->tc_max; i++) {
132+
for (i = 0; i < HNAE3_MAX_TC; i++) {
133133
switch (ets->tc_tsa[i]) {
134134
case IEEE_8021QAZ_TSA_STRICT:
135135
if (hdev->tm_info.tc_info[i].tc_sch_mode !=
@@ -286,28 +286,24 @@ static int hclge_ieee_setets(struct hnae3_handle *h, struct ieee_ets *ets)
286286

287287
static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
288288
{
289-
u64 requests[HNAE3_MAX_TC], indications[HNAE3_MAX_TC];
290289
struct hclge_vport *vport = hclge_get_vport(h);
291290
struct hclge_dev *hdev = vport->back;
292291
int ret;
293-
u8 i;
294292

295293
memset(pfc, 0, sizeof(*pfc));
296294
pfc->pfc_cap = hdev->pfc_max;
297295
pfc->pfc_en = hdev->tm_info.pfc_en;
298296

299-
ret = hclge_pfc_tx_stats_get(hdev, requests);
300-
if (ret)
297+
ret = hclge_mac_update_stats(hdev);
298+
if (ret) {
299+
dev_err(&hdev->pdev->dev,
300+
"failed to update MAC stats, ret = %d.\n", ret);
301301
return ret;
302+
}
302303

303-
ret = hclge_pfc_rx_stats_get(hdev, indications);
304-
if (ret)
305-
return ret;
304+
hclge_pfc_tx_stats_get(hdev, pfc->requests);
305+
hclge_pfc_rx_stats_get(hdev, pfc->indications);
306306

307-
for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
308-
pfc->requests[i] = requests[i];
309-
pfc->indications[i] = indications[i];
310-
}
311307
return 0;
312308
}
313309

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 39 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
#include "hclge_devlink.h"
2727

2828
#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))
3129

3230
#define HCLGE_BUF_SIZE_UNIT 256U
3331
#define HCLGE_BUF_MUL_BY 2
@@ -568,6 +566,16 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
568566
struct hclge_desc desc;
569567
int ret;
570568

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+
571579
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_REG_NUM, true);
572580
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
573581
if (ret) {
@@ -587,7 +595,7 @@ static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *reg_num)
587595
return 0;
588596
}
589597

590-
static int hclge_mac_update_stats(struct hclge_dev *hdev)
598+
int hclge_mac_update_stats(struct hclge_dev *hdev)
591599
{
592600
/* The firmware supports the new statistics acquisition method */
593601
if (hdev->ae_dev->dev_specs.mac_stats_num)
@@ -2581,7 +2589,7 @@ static int hclge_init_roce_base_info(struct hclge_vport *vport)
25812589
if (hdev->num_msi < hdev->num_nic_msi + hdev->num_roce_msi)
25822590
return -EINVAL;
25832591

2584-
roce->rinfo.base_vector = hdev->roce_base_vector;
2592+
roce->rinfo.base_vector = hdev->num_nic_msi;
25852593

25862594
roce->rinfo.netdev = nic->kinfo.netdev;
25872595
roce->rinfo.roce_io_base = hdev->hw.io_base;
@@ -2617,10 +2625,6 @@ static int hclge_init_msi(struct hclge_dev *hdev)
26172625
hdev->num_msi = vectors;
26182626
hdev->num_msi_left = vectors;
26192627

2620-
hdev->base_msi_vector = pdev->irq;
2621-
hdev->roce_base_vector = hdev->base_msi_vector +
2622-
hdev->num_nic_msi;
2623-
26242628
hdev->vector_status = devm_kcalloc(&pdev->dev, hdev->num_msi,
26252629
sizeof(u16), GFP_KERNEL);
26262630
if (!hdev->vector_status) {
@@ -8949,8 +8953,11 @@ int hclge_add_mc_addr_common(struct hclge_vport *vport,
89498953

89508954
err_no_space:
89518955
/* 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;
89538958
dev_err(&hdev->pdev->dev, "mc mac vlan table is full\n");
8959+
}
8960+
89548961
return -ENOSPC;
89558962
}
89568963

@@ -9006,12 +9013,17 @@ int hclge_rm_mc_addr_common(struct hclge_vport *vport,
90069013

90079014
static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
90089015
struct list_head *list,
9009-
int (*sync)(struct hclge_vport *,
9010-
const unsigned char *))
9016+
enum HCLGE_MAC_ADDR_TYPE mac_type)
90119017
{
9018+
int (*sync)(struct hclge_vport *vport, const unsigned char *addr);
90129019
struct hclge_mac_node *mac_node, *tmp;
90139020
int ret;
90149021

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+
90159027
list_for_each_entry_safe(mac_node, tmp, list, node) {
90169028
ret = sync(vport, mac_node->mac_addr);
90179029
if (!ret) {
@@ -9023,21 +9035,31 @@ static void hclge_sync_vport_mac_list(struct hclge_vport *vport,
90239035
/* If one unicast mac address is existing in hardware,
90249036
* we need to try whether other unicast mac addresses
90259037
* 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.
90269042
*/
9027-
if (ret != -EEXIST)
9043+
if ((mac_type == HCLGE_MAC_ADDR_UC && ret != -EEXIST) ||
9044+
(mac_type == HCLGE_MAC_ADDR_MC && ret != -ENOSPC))
90289045
break;
90299046
}
90309047
}
90319048
}
90329049

90339050
static void hclge_unsync_vport_mac_list(struct hclge_vport *vport,
90349051
struct list_head *list,
9035-
int (*unsync)(struct hclge_vport *,
9036-
const unsigned char *))
9052+
enum HCLGE_MAC_ADDR_TYPE mac_type)
90379053
{
9054+
int (*unsync)(struct hclge_vport *vport, const unsigned char *addr);
90389055
struct hclge_mac_node *mac_node, *tmp;
90399056
int ret;
90409057

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+
90419063
list_for_each_entry_safe(mac_node, tmp, list, node) {
90429064
ret = unsync(vport, mac_node->mac_addr);
90439065
if (!ret || ret == -ENOENT) {
@@ -9168,17 +9190,8 @@ static void hclge_sync_vport_mac_table(struct hclge_vport *vport,
91689190
spin_unlock_bh(&vport->mac_list_lock);
91699191

91709192
/* 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);
91829195

91839196
/* if some mac addresses were added/deleted fail, move back to the
91849197
* mac_list, and retry at next time.
@@ -9337,12 +9350,7 @@ static void hclge_uninit_vport_mac_list(struct hclge_vport *vport,
93379350

93389351
spin_unlock_bh(&vport->mac_list_lock);
93399352

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);
93469354

93479355
if (!list_empty(&tmp_del_list))
93489356
dev_warn(&hdev->pdev->dev,
@@ -9410,36 +9418,6 @@ static int hclge_get_mac_ethertype_cmd_status(struct hclge_dev *hdev,
94109418
return return_status;
94119419
}
94129420

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-
94439421
static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
94449422
u8 *mac_addr)
94459423
{
@@ -9457,12 +9435,6 @@ static int hclge_set_vf_mac(struct hnae3_handle *handle, int vf,
94579435
return 0;
94589436
}
94599437

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-
94669438
ether_addr_copy(vport->vf_info.mac, mac_addr);
94679439

94689440
if (test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state)) {

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ struct hclge_tm_info {
404404
};
405405

406406
/* max number of mac statistics on each version */
407-
#define HCLGE_MAC_STATS_MAX_NUM_V1 84
407+
#define HCLGE_MAC_STATS_MAX_NUM_V1 87
408408
#define HCLGE_MAC_STATS_MAX_NUM_V2 105
409409

410410
struct hclge_comm_stats_str {
@@ -852,6 +852,9 @@ struct hclge_vf_vlan_cfg {
852852
(y) = (_k_ ^ ~_v_) & (_k_); \
853853
} while (0)
854854

855+
#define HCLGE_MAC_STATS_FIELD_OFF(f) (offsetof(struct hclge_mac_stats, f))
856+
#define HCLGE_STATS_READ(p, offset) (*(u64 *)((u8 *)(p) + (offset)))
857+
855858
#define HCLGE_MAC_TNL_LOG_SIZE 8
856859
#define HCLGE_VPORT_NUM 256
857860
struct hclge_dev {
@@ -904,12 +907,10 @@ struct hclge_dev {
904907
u16 num_msi;
905908
u16 num_msi_left;
906909
u16 num_msi_used;
907-
u32 base_msi_vector;
908910
u16 *vector_status;
909911
int *vector_irq;
910912
u16 num_nic_msi; /* Num of nic vectors for this PF */
911913
u16 num_roce_msi; /* Num of roce vectors for this PF */
912-
int roce_base_vector;
913914

914915
unsigned long service_timer_period;
915916
unsigned long service_timer_previous;
@@ -1168,4 +1169,5 @@ void hclge_inform_vf_promisc_info(struct hclge_vport *vport);
11681169
int hclge_dbg_dump_rst_info(struct hclge_dev *hdev, char *buf, int len);
11691170
int hclge_push_vf_link_status(struct hclge_vport *vport);
11701171
int hclge_enable_vport_vlan_filter(struct hclge_vport *vport, bool request_en);
1172+
int hclge_mac_update_stats(struct hclge_dev *hdev);
11711173
#endif

0 commit comments

Comments
 (0)