Skip to content

Commit a56d7b9

Browse files
committed
Merge branch 'hns3-next'
Huazhong Tan says: ==================== code optimizations & bugfixes for HNS3 driver This patchset includes bugfixes and code optimizations for the HNS3 ethernet controller driver Change log: V1->V2: fixes comment from Eric Dumazet ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 16e8292 + d3ad430 commit a56d7b9

File tree

12 files changed

+251
-73
lines changed

12 files changed

+251
-73
lines changed

drivers/net/ethernet/hisilicon/hns3/hnae3.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,8 @@ struct hnae3_ae_ops {
433433
struct ethtool_channels *ch);
434434
void (*get_tqps_and_rss_info)(struct hnae3_handle *h,
435435
u16 *alloc_tqps, u16 *max_rss_size);
436-
int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num);
436+
int (*set_channels)(struct hnae3_handle *handle, u32 new_tqps_num,
437+
bool rxfh_configured);
437438
void (*get_flowctrl_adv)(struct hnae3_handle *handle,
438439
u32 *flowctrl_adv);
439440
int (*set_led_id)(struct hnae3_handle *handle,

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

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1399,7 +1399,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
13991399
int queue_num = priv->ae_handle->kinfo.num_tqps;
14001400
struct hnae3_handle *handle = priv->ae_handle;
14011401
struct hns3_enet_ring *ring;
1402+
u64 rx_length_errors = 0;
1403+
u64 rx_crc_errors = 0;
1404+
u64 rx_multicast = 0;
14021405
unsigned int start;
1406+
u64 tx_errors = 0;
1407+
u64 rx_errors = 0;
14031408
unsigned int idx;
14041409
u64 tx_bytes = 0;
14051410
u64 rx_bytes = 0;
@@ -1422,6 +1427,8 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
14221427
tx_pkts += ring->stats.tx_pkts;
14231428
tx_drop += ring->stats.tx_busy;
14241429
tx_drop += ring->stats.sw_err_cnt;
1430+
tx_errors += ring->stats.tx_busy;
1431+
tx_errors += ring->stats.sw_err_cnt;
14251432
} while (u64_stats_fetch_retry_irq(&ring->syncp, start));
14261433

14271434
/* fetch the rx stats */
@@ -1433,6 +1440,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
14331440
rx_drop += ring->stats.non_vld_descs;
14341441
rx_drop += ring->stats.err_pkt_len;
14351442
rx_drop += ring->stats.l2_err;
1443+
rx_errors += ring->stats.non_vld_descs;
1444+
rx_errors += ring->stats.l2_err;
1445+
rx_crc_errors += ring->stats.l2_err;
1446+
rx_crc_errors += ring->stats.l3l4_csum_err;
1447+
rx_multicast += ring->stats.rx_multicast;
1448+
rx_length_errors += ring->stats.err_pkt_len;
14361449
} while (u64_stats_fetch_retry_irq(&ring->syncp, start));
14371450
}
14381451

@@ -1441,15 +1454,15 @@ static void hns3_nic_get_stats64(struct net_device *netdev,
14411454
stats->rx_bytes = rx_bytes;
14421455
stats->rx_packets = rx_pkts;
14431456

1444-
stats->rx_errors = netdev->stats.rx_errors;
1445-
stats->multicast = netdev->stats.multicast;
1446-
stats->rx_length_errors = netdev->stats.rx_length_errors;
1447-
stats->rx_crc_errors = netdev->stats.rx_crc_errors;
1457+
stats->rx_errors = rx_errors;
1458+
stats->multicast = rx_multicast;
1459+
stats->rx_length_errors = rx_length_errors;
1460+
stats->rx_crc_errors = rx_crc_errors;
14481461
stats->rx_missed_errors = netdev->stats.rx_missed_errors;
14491462

1450-
stats->tx_errors = netdev->stats.tx_errors;
1451-
stats->rx_dropped = rx_drop + netdev->stats.rx_dropped;
1452-
stats->tx_dropped = tx_drop + netdev->stats.tx_dropped;
1463+
stats->tx_errors = tx_errors;
1464+
stats->rx_dropped = rx_drop;
1465+
stats->tx_dropped = tx_drop;
14531466
stats->collisions = netdev->stats.collisions;
14541467
stats->rx_over_errors = netdev->stats.rx_over_errors;
14551468
stats->rx_frame_errors = netdev->stats.rx_frame_errors;
@@ -2572,6 +2585,7 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
25722585
struct sk_buff **out_skb)
25732586
{
25742587
struct net_device *netdev = ring->tqp->handle->kinfo.netdev;
2588+
enum hns3_pkt_l2t_type l2_frame_type;
25752589
struct sk_buff *skb = ring->skb;
25762590
struct hns3_desc_cb *desc_cb;
25772591
struct hns3_desc *desc;
@@ -2680,7 +2694,12 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
26802694
return -EFAULT;
26812695
}
26822696

2697+
l2_frame_type = hnae3_get_field(l234info, HNS3_RXD_DMAC_M,
2698+
HNS3_RXD_DMAC_S);
26832699
u64_stats_update_begin(&ring->syncp);
2700+
if (l2_frame_type == HNS3_L2_TYPE_MULTICAST)
2701+
ring->stats.rx_multicast++;
2702+
26842703
ring->stats.rx_pkts++;
26852704
ring->stats.rx_bytes += skb->len;
26862705
u64_stats_update_end(&ring->syncp);
@@ -3378,6 +3397,11 @@ static void hns3_fini_ring(struct hns3_enet_ring *ring)
33783397
ring->desc_cb = NULL;
33793398
ring->next_to_clean = 0;
33803399
ring->next_to_use = 0;
3400+
ring->pending_buf = 0;
3401+
if (ring->skb) {
3402+
dev_kfree_skb_any(ring->skb);
3403+
ring->skb = NULL;
3404+
}
33813405
}
33823406

33833407
static int hns3_buf_size2type(u32 buf_size)
@@ -4144,6 +4168,7 @@ int hns3_set_channels(struct net_device *netdev,
41444168
{
41454169
struct hnae3_handle *h = hns3_get_handle(netdev);
41464170
struct hnae3_knic_private_info *kinfo = &h->kinfo;
4171+
bool rxfh_configured = netif_is_rxfh_configured(netdev);
41474172
u32 new_tqp_num = ch->combined_count;
41484173
u16 org_tqp_num;
41494174
int ret;
@@ -4171,9 +4196,10 @@ int hns3_set_channels(struct net_device *netdev,
41714196
return ret;
41724197

41734198
org_tqp_num = h->kinfo.num_tqps;
4174-
ret = h->ae_algo->ops->set_channels(h, new_tqp_num);
4199+
ret = h->ae_algo->ops->set_channels(h, new_tqp_num, rxfh_configured);
41754200
if (ret) {
4176-
ret = h->ae_algo->ops->set_channels(h, org_tqp_num);
4201+
ret = h->ae_algo->ops->set_channels(h, org_tqp_num,
4202+
rxfh_configured);
41774203
if (ret) {
41784204
/* If revert to old tqp failed, fatal error occurred */
41794205
dev_err(&netdev->dev,

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ enum hns3_nic_state {
202202

203203
#define HNS3_RING_EN_B 0
204204

205+
enum hns3_pkt_l2t_type {
206+
HNS3_L2_TYPE_UNICAST,
207+
HNS3_L2_TYPE_MULTICAST,
208+
HNS3_L2_TYPE_BROADCAST,
209+
HNS3_L2_TYPE_INVALID,
210+
};
211+
205212
enum hns3_pkt_l3t_type {
206213
HNS3_L3T_NONE,
207214
HNS3_L3T_IPV6,
@@ -376,6 +383,7 @@ struct ring_stats {
376383
u64 err_bd_num;
377384
u64 l2_err;
378385
u64 l3l4_csum_err;
386+
u64 rx_multicast;
379387
};
380388
};
381389
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ static const struct hns3_stats hns3_rxq_stats[] = {
4747
HNS3_TQP_STAT("err_bd_num", err_bd_num),
4848
HNS3_TQP_STAT("l2_err", l2_err),
4949
HNS3_TQP_STAT("l3l4_csum_err", l3l4_csum_err),
50+
HNS3_TQP_STAT("multicast", rx_multicast),
5051
};
5152

5253
#define HNS3_RXQ_STATS_COUNT ARRAY_SIZE(hns3_rxq_stats)

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,12 @@ static bool hclge_is_special_opcode(u16 opcode)
170170
/* these commands have several descriptors,
171171
* and use the first one to save opcode and return value
172172
*/
173-
u16 spec_opcode[3] = {HCLGE_OPC_STATS_64_BIT,
174-
HCLGE_OPC_STATS_32_BIT, HCLGE_OPC_STATS_MAC};
173+
u16 spec_opcode[] = {HCLGE_OPC_STATS_64_BIT,
174+
HCLGE_OPC_STATS_32_BIT,
175+
HCLGE_OPC_STATS_MAC,
176+
HCLGE_OPC_STATS_MAC_ALL,
177+
HCLGE_OPC_QUERY_32_BIT_REG,
178+
HCLGE_OPC_QUERY_64_BIT_REG};
175179
int i;
176180

177181
for (i = 0; i < ARRAY_SIZE(spec_opcode); i++) {
@@ -259,6 +263,10 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
259263

260264
if (desc_ret == HCLGE_CMD_EXEC_SUCCESS)
261265
retval = 0;
266+
else if (desc_ret == HCLGE_CMD_NO_AUTH)
267+
retval = -EPERM;
268+
else if (desc_ret == HCLGE_CMD_NOT_SUPPORTED)
269+
retval = -EOPNOTSUPP;
262270
else
263271
retval = -EIO;
264272
hw->cmq.last_status = desc_ret;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ struct hclge_cmq_ring {
3939
enum hclge_cmd_return_status {
4040
HCLGE_CMD_EXEC_SUCCESS = 0,
4141
HCLGE_CMD_NO_AUTH = 1,
42-
HCLGE_CMD_NOT_EXEC = 2,
42+
HCLGE_CMD_NOT_SUPPORTED = 2,
4343
HCLGE_CMD_QUEUE_FULL = 3,
4444
};
4545

@@ -82,6 +82,8 @@ enum hclge_opcode_type {
8282
HCLGE_OPC_STATS_64_BIT = 0x0030,
8383
HCLGE_OPC_STATS_32_BIT = 0x0031,
8484
HCLGE_OPC_STATS_MAC = 0x0032,
85+
HCLGE_OPC_QUERY_MAC_REG_NUM = 0x0033,
86+
HCLGE_OPC_STATS_MAC_ALL = 0x0034,
8587

8688
HCLGE_OPC_QUERY_REG_NUM = 0x0040,
8789
HCLGE_OPC_QUERY_32_BIT_REG = 0x0041,

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -162,15 +162,11 @@ static int hclge_map_update(struct hnae3_handle *h)
162162
struct hclge_dev *hdev = vport->back;
163163
int ret;
164164

165-
ret = hclge_tm_map_cfg(hdev);
165+
ret = hclge_tm_schd_setup_hw(hdev);
166166
if (ret)
167167
return ret;
168168

169-
ret = hclge_tm_schd_mode_hw(hdev);
170-
if (ret)
171-
return ret;
172-
173-
ret = hclge_pause_setup_hw(hdev);
169+
ret = hclge_pause_setup_hw(hdev, false);
174170
if (ret)
175171
return ret;
176172

@@ -300,6 +296,9 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
300296
hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE)
301297
return -EINVAL;
302298

299+
if (pfc->pfc_en == hdev->tm_info.pfc_en)
300+
return 0;
301+
303302
prio_tc = hdev->tm_info.prio_tc;
304303
pfc_map = 0;
305304

@@ -312,12 +311,10 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
312311
}
313312
}
314313

315-
if (pfc_map == hdev->tm_info.hw_pfc_map)
316-
return 0;
317-
318314
hdev->tm_info.hw_pfc_map = pfc_map;
315+
hdev->tm_info.pfc_en = pfc->pfc_en;
319316

320-
return hclge_pause_setup_hw(hdev);
317+
return hclge_pause_setup_hw(hdev, false);
321318
}
322319

323320
/* DCBX configuration */
@@ -365,7 +362,7 @@ static int hclge_setup_tc(struct hnae3_handle *h, u8 tc, u8 *prio_tc)
365362
hclge_tm_schd_info_update(hdev, tc);
366363
hclge_tm_prio_tc_info_update(hdev, prio_tc);
367364

368-
ret = hclge_tm_init_hw(hdev);
365+
ret = hclge_tm_init_hw(hdev, false);
369366
if (ret)
370367
return ret;
371368

0 commit comments

Comments
 (0)