Lines Matching refs:nic

30 static int nicvf_poll_reg(struct nicvf *nic, int qidx,  in nicvf_poll_reg()  argument
41 reg_val = nicvf_queue_reg_read(nic, reg, qidx); in nicvf_poll_reg()
47 netdev_err(nic->netdev, "Poll on reg 0x%llx failed\n", reg); in nicvf_poll_reg()
52 static int nicvf_alloc_q_desc_mem(struct nicvf *nic, struct q_desc_mem *dmem, in nicvf_alloc_q_desc_mem() argument
58 dmem->unalign_base = dma_zalloc_coherent(&nic->pdev->dev, dmem->size, in nicvf_alloc_q_desc_mem()
70 static void nicvf_free_q_desc_mem(struct nicvf *nic, struct q_desc_mem *dmem) in nicvf_free_q_desc_mem() argument
75 dma_free_coherent(&nic->pdev->dev, dmem->size, in nicvf_free_q_desc_mem()
86 static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, gfp_t gfp, in nicvf_alloc_rcv_buffer() argument
94 if (nic->rb_page) { in nicvf_alloc_rcv_buffer()
95 if ((nic->rb_page_offset + buf_len + buf_len) > in nicvf_alloc_rcv_buffer()
97 nic->rb_page = NULL; in nicvf_alloc_rcv_buffer()
99 nic->rb_page_offset += buf_len; in nicvf_alloc_rcv_buffer()
100 get_page(nic->rb_page); in nicvf_alloc_rcv_buffer()
105 if (!nic->rb_page) { in nicvf_alloc_rcv_buffer()
106 nic->rb_page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN, in nicvf_alloc_rcv_buffer()
108 if (!nic->rb_page) { in nicvf_alloc_rcv_buffer()
109 netdev_err(nic->netdev, in nicvf_alloc_rcv_buffer()
113 nic->rb_page_offset = 0; in nicvf_alloc_rcv_buffer()
116 data = (u64)page_address(nic->rb_page) + nic->rb_page_offset; in nicvf_alloc_rcv_buffer()
121 rinfo->page = nic->rb_page; in nicvf_alloc_rcv_buffer()
135 static struct sk_buff *nicvf_rb_ptr_to_skb(struct nicvf *nic, in nicvf_rb_ptr_to_skb() argument
160 static int nicvf_init_rbdr(struct nicvf *nic, struct rbdr *rbdr, in nicvf_init_rbdr() argument
168 err = nicvf_alloc_q_desc_mem(nic, &rbdr->dmem, ring_len, in nicvf_init_rbdr()
180 nic->rb_page = NULL; in nicvf_init_rbdr()
182 err = nicvf_alloc_rcv_buffer(nic, GFP_KERNEL, RCV_FRAG_LEN, in nicvf_init_rbdr()
194 static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr) in nicvf_free_rbdr() argument
227 nicvf_free_q_desc_mem(nic, &rbdr->dmem); in nicvf_free_rbdr()
232 static void nicvf_refill_rbdr(struct nicvf *nic, gfp_t gfp) in nicvf_refill_rbdr() argument
234 struct queue_set *qs = nic->qs; in nicvf_refill_rbdr()
253 qcount = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_STATUS0, rbdr_idx); in nicvf_refill_rbdr()
262 tail = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_TAIL, rbdr_idx) >> 3; in nicvf_refill_rbdr()
267 if (nicvf_alloc_rcv_buffer(nic, gfp, RCV_FRAG_LEN, &rbuf)) in nicvf_refill_rbdr()
281 nic->rb_alloc_fail = true; in nicvf_refill_rbdr()
283 nic->rb_alloc_fail = false; in nicvf_refill_rbdr()
286 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_DOOR, in nicvf_refill_rbdr()
290 if (!nic->rb_alloc_fail && rbdr->enable) in nicvf_refill_rbdr()
291 nicvf_enable_intr(nic, NICVF_INTR_RBDR, rbdr_idx); in nicvf_refill_rbdr()
300 struct nicvf *nic = container_of(work, struct nicvf, rbdr_work.work); in nicvf_rbdr_work() local
302 nicvf_refill_rbdr(nic, GFP_KERNEL); in nicvf_rbdr_work()
303 if (nic->rb_alloc_fail) in nicvf_rbdr_work()
304 schedule_delayed_work(&nic->rbdr_work, msecs_to_jiffies(10)); in nicvf_rbdr_work()
306 nic->rb_work_scheduled = false; in nicvf_rbdr_work()
312 struct nicvf *nic = (struct nicvf *)data; in nicvf_rbdr_task() local
314 nicvf_refill_rbdr(nic, GFP_ATOMIC); in nicvf_rbdr_task()
315 if (nic->rb_alloc_fail) { in nicvf_rbdr_task()
316 nic->rb_work_scheduled = true; in nicvf_rbdr_task()
317 schedule_delayed_work(&nic->rbdr_work, msecs_to_jiffies(10)); in nicvf_rbdr_task()
322 static int nicvf_init_cmp_queue(struct nicvf *nic, in nicvf_init_cmp_queue() argument
327 err = nicvf_alloc_q_desc_mem(nic, &cq->dmem, q_len, CMP_QUEUE_DESC_SIZE, in nicvf_init_cmp_queue()
334 nic->cq_coalesce_usecs = (CMP_QUEUE_TIMER_THRESH * 0.05) - 1; in nicvf_init_cmp_queue()
339 static void nicvf_free_cmp_queue(struct nicvf *nic, struct cmp_queue *cq) in nicvf_free_cmp_queue() argument
346 nicvf_free_q_desc_mem(nic, &cq->dmem); in nicvf_free_cmp_queue()
350 static int nicvf_init_snd_queue(struct nicvf *nic, in nicvf_init_snd_queue() argument
355 err = nicvf_alloc_q_desc_mem(nic, &sq->dmem, q_len, SND_QUEUE_DESC_SIZE, in nicvf_init_snd_queue()
370 sq->tso_hdrs = dma_alloc_coherent(&nic->pdev->dev, in nicvf_init_snd_queue()
379 static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq) in nicvf_free_snd_queue() argument
387 dma_free_coherent(&nic->pdev->dev, in nicvf_free_snd_queue()
392 nicvf_free_q_desc_mem(nic, &sq->dmem); in nicvf_free_snd_queue()
395 static void nicvf_reclaim_snd_queue(struct nicvf *nic, in nicvf_reclaim_snd_queue() argument
399 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, 0); in nicvf_reclaim_snd_queue()
401 if (nicvf_poll_reg(nic, qidx, NIC_QSET_SQ_0_7_STATUS, 21, 1, 0x01)) in nicvf_reclaim_snd_queue()
404 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, NICVF_SQ_RESET); in nicvf_reclaim_snd_queue()
407 static void nicvf_reclaim_rcv_queue(struct nicvf *nic, in nicvf_reclaim_rcv_queue() argument
414 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_reclaim_rcv_queue()
417 static void nicvf_reclaim_cmp_queue(struct nicvf *nic, in nicvf_reclaim_cmp_queue() argument
421 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG2, qidx, 0); in nicvf_reclaim_cmp_queue()
423 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, 0); in nicvf_reclaim_cmp_queue()
425 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, NICVF_CQ_RESET); in nicvf_reclaim_cmp_queue()
428 static void nicvf_reclaim_rbdr(struct nicvf *nic, in nicvf_reclaim_rbdr() argument
435 rbdr->head = nicvf_queue_reg_read(nic, in nicvf_reclaim_rbdr()
438 rbdr->tail = nicvf_queue_reg_read(nic, in nicvf_reclaim_rbdr()
445 fifo_state = nicvf_queue_reg_read(nic, NIC_QSET_RBDR_0_1_STATUS0, qidx); in nicvf_reclaim_rbdr()
447 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, in nicvf_reclaim_rbdr()
451 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, qidx, 0); in nicvf_reclaim_rbdr()
452 if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x00)) in nicvf_reclaim_rbdr()
455 tmp = nicvf_queue_reg_read(nic, in nicvf_reclaim_rbdr()
463 netdev_err(nic->netdev, in nicvf_reclaim_rbdr()
468 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, in nicvf_reclaim_rbdr()
471 if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x02)) in nicvf_reclaim_rbdr()
473 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, qidx, 0x00); in nicvf_reclaim_rbdr()
474 if (nicvf_poll_reg(nic, qidx, NIC_QSET_RBDR_0_1_STATUS0, 62, 2, 0x00)) in nicvf_reclaim_rbdr()
478 void nicvf_config_vlan_stripping(struct nicvf *nic, netdev_features_t features) in nicvf_config_vlan_stripping() argument
483 rq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_RQ_GEN_CFG, 0); in nicvf_config_vlan_stripping()
490 nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0, rq_cfg); in nicvf_config_vlan_stripping()
493 for (sqs = 0; sqs < nic->sqs_count; sqs++) in nicvf_config_vlan_stripping()
494 if (nic->snicvf[sqs]) in nicvf_config_vlan_stripping()
495 nicvf_queue_reg_write(nic->snicvf[sqs], in nicvf_config_vlan_stripping()
500 static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs, in nicvf_rcv_queue_config() argument
511 nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, 0); in nicvf_rcv_queue_config()
514 nicvf_reclaim_rcv_queue(nic, qs, qidx); in nicvf_rcv_queue_config()
535 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_rcv_queue_config()
539 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_rcv_queue_config()
546 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_rcv_queue_config()
548 nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0, 0x00); in nicvf_rcv_queue_config()
549 if (!nic->sqs_mode) in nicvf_rcv_queue_config()
550 nicvf_config_vlan_stripping(nic, nic->netdev->features); in nicvf_rcv_queue_config()
556 nicvf_queue_reg_write(nic, NIC_QSET_RQ_0_7_CFG, qidx, *(u64 *)&rq_cfg); in nicvf_rcv_queue_config()
560 void nicvf_cmp_queue_config(struct nicvf *nic, struct queue_set *qs, in nicvf_cmp_queue_config() argument
570 nicvf_reclaim_cmp_queue(nic, qs, qidx); in nicvf_cmp_queue_config()
575 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, NICVF_CQ_RESET); in nicvf_cmp_queue_config()
582 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_BASE, in nicvf_cmp_queue_config()
592 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG, qidx, *(u64 *)&cq_cfg); in nicvf_cmp_queue_config()
595 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_THRESH, qidx, cq->thresh); in nicvf_cmp_queue_config()
596 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_CFG2, in nicvf_cmp_queue_config()
601 static void nicvf_snd_queue_config(struct nicvf *nic, struct queue_set *qs, in nicvf_snd_queue_config() argument
612 nicvf_reclaim_snd_queue(nic, qs, qidx); in nicvf_snd_queue_config()
617 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, NICVF_SQ_RESET); in nicvf_snd_queue_config()
626 mbx.sq.sqs_mode = nic->sqs_mode; in nicvf_snd_queue_config()
628 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_snd_queue_config()
631 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_BASE, in nicvf_snd_queue_config()
641 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, *(u64 *)&sq_cfg); in nicvf_snd_queue_config()
644 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_THRESH, qidx, sq->thresh); in nicvf_snd_queue_config()
649 netif_set_xps_queue(nic->netdev, in nicvf_snd_queue_config()
655 static void nicvf_rbdr_config(struct nicvf *nic, struct queue_set *qs, in nicvf_rbdr_config() argument
662 nicvf_reclaim_rbdr(nic, rbdr, qidx); in nicvf_rbdr_config()
667 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_BASE, in nicvf_rbdr_config()
679 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_CFG, in nicvf_rbdr_config()
683 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_DOOR, in nicvf_rbdr_config()
687 nicvf_queue_reg_write(nic, NIC_QSET_RBDR_0_1_THRESH, in nicvf_rbdr_config()
692 void nicvf_qset_config(struct nicvf *nic, bool enable) in nicvf_qset_config() argument
695 struct queue_set *qs = nic->qs; in nicvf_qset_config()
699 netdev_warn(nic->netdev, in nicvf_qset_config()
705 qs->vnic_id = nic->vf_id; in nicvf_qset_config()
710 mbx.qs.sqs_count = nic->sqs_count; in nicvf_qset_config()
721 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_qset_config()
724 static void nicvf_free_resources(struct nicvf *nic) in nicvf_free_resources() argument
727 struct queue_set *qs = nic->qs; in nicvf_free_resources()
731 nicvf_free_rbdr(nic, &qs->rbdr[qidx]); in nicvf_free_resources()
735 nicvf_free_cmp_queue(nic, &qs->cq[qidx]); in nicvf_free_resources()
739 nicvf_free_snd_queue(nic, &qs->sq[qidx]); in nicvf_free_resources()
742 static int nicvf_alloc_resources(struct nicvf *nic) in nicvf_alloc_resources() argument
745 struct queue_set *qs = nic->qs; in nicvf_alloc_resources()
749 if (nicvf_init_rbdr(nic, &qs->rbdr[qidx], qs->rbdr_len, in nicvf_alloc_resources()
756 if (nicvf_init_snd_queue(nic, &qs->sq[qidx], qs->sq_len)) in nicvf_alloc_resources()
762 if (nicvf_init_cmp_queue(nic, &qs->cq[qidx], qs->cq_len)) in nicvf_alloc_resources()
768 nicvf_free_resources(nic); in nicvf_alloc_resources()
772 int nicvf_set_qset_resources(struct nicvf *nic) in nicvf_set_qset_resources() argument
776 qs = devm_kzalloc(&nic->pdev->dev, sizeof(*qs), GFP_KERNEL); in nicvf_set_qset_resources()
779 nic->qs = qs; in nicvf_set_qset_resources()
792 nic->rx_queues = qs->rq_cnt; in nicvf_set_qset_resources()
793 nic->tx_queues = qs->sq_cnt; in nicvf_set_qset_resources()
798 int nicvf_config_data_transfer(struct nicvf *nic, bool enable) in nicvf_config_data_transfer() argument
801 struct queue_set *qs = nic->qs; in nicvf_config_data_transfer()
808 if (nicvf_alloc_resources(nic)) in nicvf_config_data_transfer()
812 nicvf_snd_queue_config(nic, qs, qidx, enable); in nicvf_config_data_transfer()
814 nicvf_cmp_queue_config(nic, qs, qidx, enable); in nicvf_config_data_transfer()
816 nicvf_rbdr_config(nic, qs, qidx, enable); in nicvf_config_data_transfer()
818 nicvf_rcv_queue_config(nic, qs, qidx, enable); in nicvf_config_data_transfer()
821 nicvf_rcv_queue_config(nic, qs, qidx, disable); in nicvf_config_data_transfer()
823 nicvf_rbdr_config(nic, qs, qidx, disable); in nicvf_config_data_transfer()
825 nicvf_snd_queue_config(nic, qs, qidx, disable); in nicvf_config_data_transfer()
827 nicvf_cmp_queue_config(nic, qs, qidx, disable); in nicvf_config_data_transfer()
829 nicvf_free_resources(nic); in nicvf_config_data_transfer()
865 void nicvf_sq_enable(struct nicvf *nic, struct snd_queue *sq, int qidx) in nicvf_sq_enable() argument
869 sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx); in nicvf_sq_enable()
871 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg); in nicvf_sq_enable()
873 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR, qidx, 0); in nicvf_sq_enable()
876 void nicvf_sq_disable(struct nicvf *nic, int qidx) in nicvf_sq_disable() argument
880 sq_cfg = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_CFG, qidx); in nicvf_sq_disable()
882 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_CFG, qidx, sq_cfg); in nicvf_sq_disable()
890 struct nicvf *nic = netdev_priv(netdev); in nicvf_sq_free_used_descs() local
893 head = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_HEAD, qidx) >> 4; in nicvf_sq_free_used_descs()
894 tail = nicvf_queue_reg_read(nic, NIC_QSET_SQ_0_7_TAIL, qidx) >> 4; in nicvf_sq_free_used_descs()
959 static int nicvf_sq_subdesc_required(struct nicvf *nic, struct sk_buff *skb) in nicvf_sq_subdesc_required() argument
1037 static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq, in nicvf_sq_append_tso() argument
1097 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR, in nicvf_sq_append_tso()
1099 nic->drv_stats.tx_tso++; in nicvf_sq_append_tso()
1104 int nicvf_sq_append_skb(struct nicvf *nic, struct sk_buff *skb) in nicvf_sq_append_skb() argument
1116 if (!nic->snicvf[i - 1]) { in nicvf_sq_append_skb()
1117 netdev_warn(nic->netdev, in nicvf_sq_append_skb()
1122 nic = (struct nicvf *)nic->snicvf[i - 1]; in nicvf_sq_append_skb()
1126 qs = nic->qs; in nicvf_sq_append_skb()
1129 subdesc_cnt = nicvf_sq_subdesc_required(nic, skb); in nicvf_sq_append_skb()
1137 return nicvf_sq_append_tso(nic, sq, sq_num, qentry, skb); in nicvf_sq_append_skb()
1168 nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR, in nicvf_sq_append_skb()
1174 nic = nic->pnicvf; in nicvf_sq_append_skb()
1175 netdev_dbg(nic->netdev, "Not enough SQ descriptors to xmit pkt\n"); in nicvf_sq_append_skb()
1189 struct sk_buff *nicvf_get_rcv_skb(struct nicvf *nic, struct cqe_rx_t *cqe_rx) in nicvf_get_rcv_skb() argument
1202 netdev_dbg(nic->netdev, "%s rb_cnt %d rb0_ptr %llx rb0_sz %d\n", in nicvf_get_rcv_skb()
1209 skb = nicvf_rb_ptr_to_skb(nic, in nicvf_get_rcv_skb()
1218 skb_frag = nicvf_rb_ptr_to_skb(nic, *rb_ptrs, in nicvf_get_rcv_skb()
1242 void nicvf_enable_intr(struct nicvf *nic, int int_type, int q_idx) in nicvf_enable_intr() argument
1246 reg_val = nicvf_reg_read(nic, NIC_VF_ENA_W1S); in nicvf_enable_intr()
1271 netdev_err(nic->netdev, in nicvf_enable_intr()
1276 nicvf_reg_write(nic, NIC_VF_ENA_W1S, reg_val); in nicvf_enable_intr()
1280 void nicvf_disable_intr(struct nicvf *nic, int int_type, int q_idx) in nicvf_disable_intr() argument
1307 netdev_err(nic->netdev, in nicvf_disable_intr()
1312 nicvf_reg_write(nic, NIC_VF_ENA_W1C, reg_val); in nicvf_disable_intr()
1316 void nicvf_clear_intr(struct nicvf *nic, int int_type, int q_idx) in nicvf_clear_intr() argument
1343 netdev_err(nic->netdev, in nicvf_clear_intr()
1348 nicvf_reg_write(nic, NIC_VF_INT, reg_val); in nicvf_clear_intr()
1352 int nicvf_is_intr_enabled(struct nicvf *nic, int int_type, int q_idx) in nicvf_is_intr_enabled() argument
1357 reg_val = nicvf_reg_read(nic, NIC_VF_ENA_W1S); in nicvf_is_intr_enabled()
1382 netdev_err(nic->netdev, in nicvf_is_intr_enabled()
1390 void nicvf_update_rq_stats(struct nicvf *nic, int rq_idx) in nicvf_update_rq_stats() argument
1395 nicvf_reg_read(nic, NIC_QSET_RQ_0_7_STAT_0_1 |\ in nicvf_update_rq_stats()
1398 rq = &nic->qs->rq[rq_idx]; in nicvf_update_rq_stats()
1403 void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx) in nicvf_update_sq_stats() argument
1408 nicvf_reg_read(nic, NIC_QSET_SQ_0_7_STAT_0_1 |\ in nicvf_update_sq_stats()
1411 sq = &nic->qs->sq[sq_idx]; in nicvf_update_sq_stats()
1417 int nicvf_check_cqe_rx_errs(struct nicvf *nic, in nicvf_check_cqe_rx_errs() argument
1420 struct nicvf_hw_stats *stats = &nic->hw_stats; in nicvf_check_cqe_rx_errs()
1421 struct nicvf_drv_stats *drv_stats = &nic->drv_stats; in nicvf_check_cqe_rx_errs()
1428 if (netif_msg_rx_err(nic)) in nicvf_check_cqe_rx_errs()
1429 netdev_err(nic->netdev, in nicvf_check_cqe_rx_errs()
1431 nic->netdev->name, in nicvf_check_cqe_rx_errs()
1513 int nicvf_check_cqe_tx_errs(struct nicvf *nic, in nicvf_check_cqe_tx_errs() argument