Lines Matching refs:nic
54 static inline u8 nicvf_netdev_qidx(struct nicvf *nic, u8 qidx) in nicvf_netdev_qidx() argument
56 if (nic->sqs_mode) in nicvf_netdev_qidx()
57 return qidx + ((nic->sqs_id + 1) * MAX_CMP_QUEUES_PER_QS); in nicvf_netdev_qidx()
62 static inline void nicvf_set_rx_frame_cnt(struct nicvf *nic, in nicvf_set_rx_frame_cnt() argument
66 nic->drv_stats.rx_frames_64++; in nicvf_set_rx_frame_cnt()
68 nic->drv_stats.rx_frames_127++; in nicvf_set_rx_frame_cnt()
70 nic->drv_stats.rx_frames_255++; in nicvf_set_rx_frame_cnt()
72 nic->drv_stats.rx_frames_511++; in nicvf_set_rx_frame_cnt()
74 nic->drv_stats.rx_frames_1023++; in nicvf_set_rx_frame_cnt()
76 nic->drv_stats.rx_frames_1518++; in nicvf_set_rx_frame_cnt()
78 nic->drv_stats.rx_frames_jumbo++; in nicvf_set_rx_frame_cnt()
91 void nicvf_reg_write(struct nicvf *nic, u64 offset, u64 val) in nicvf_reg_write() argument
93 writeq_relaxed(val, nic->reg_base + offset); in nicvf_reg_write()
96 u64 nicvf_reg_read(struct nicvf *nic, u64 offset) in nicvf_reg_read() argument
98 return readq_relaxed(nic->reg_base + offset); in nicvf_reg_read()
101 void nicvf_queue_reg_write(struct nicvf *nic, u64 offset, in nicvf_queue_reg_write() argument
104 void __iomem *addr = nic->reg_base + offset; in nicvf_queue_reg_write()
109 u64 nicvf_queue_reg_read(struct nicvf *nic, u64 offset, u64 qidx) in nicvf_queue_reg_read() argument
111 void __iomem *addr = nic->reg_base + offset; in nicvf_queue_reg_read()
117 static void nicvf_write_to_mbx(struct nicvf *nic, union nic_mbx *mbx) in nicvf_write_to_mbx() argument
121 nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 0, msg[0]); in nicvf_write_to_mbx()
122 nicvf_reg_write(nic, NIC_VF_PF_MAILBOX_0_1 + 8, msg[1]); in nicvf_write_to_mbx()
125 int nicvf_send_msg_to_pf(struct nicvf *nic, union nic_mbx *mbx) in nicvf_send_msg_to_pf() argument
130 nic->pf_acked = false; in nicvf_send_msg_to_pf()
131 nic->pf_nacked = false; in nicvf_send_msg_to_pf()
133 nicvf_write_to_mbx(nic, mbx); in nicvf_send_msg_to_pf()
136 while (!nic->pf_acked) { in nicvf_send_msg_to_pf()
137 if (nic->pf_nacked) in nicvf_send_msg_to_pf()
140 if (nic->pf_acked) in nicvf_send_msg_to_pf()
144 netdev_err(nic->netdev, in nicvf_send_msg_to_pf()
146 (mbx->msg.msg & 0xFF), nic->vf_id); in nicvf_send_msg_to_pf()
156 static int nicvf_check_pf_ready(struct nicvf *nic) in nicvf_check_pf_ready() argument
161 if (nicvf_send_msg_to_pf(nic, &mbx)) { in nicvf_check_pf_ready()
162 netdev_err(nic->netdev, in nicvf_check_pf_ready()
170 static void nicvf_read_bgx_stats(struct nicvf *nic, struct bgx_stats_msg *bgx) in nicvf_read_bgx_stats() argument
173 nic->bgx_stats.rx_stats[bgx->idx] = bgx->stats; in nicvf_read_bgx_stats()
175 nic->bgx_stats.tx_stats[bgx->idx] = bgx->stats; in nicvf_read_bgx_stats()
178 static void nicvf_handle_mbx_intr(struct nicvf *nic) in nicvf_handle_mbx_intr() argument
189 *mbx_data = nicvf_reg_read(nic, mbx_addr); in nicvf_handle_mbx_intr()
194 netdev_dbg(nic->netdev, "Mbox message: msg: 0x%x\n", mbx.msg.msg); in nicvf_handle_mbx_intr()
197 nic->pf_acked = true; in nicvf_handle_mbx_intr()
198 nic->vf_id = mbx.nic_cfg.vf_id & 0x7F; in nicvf_handle_mbx_intr()
199 nic->tns_mode = mbx.nic_cfg.tns_mode & 0x7F; in nicvf_handle_mbx_intr()
200 nic->node = mbx.nic_cfg.node_id; in nicvf_handle_mbx_intr()
201 if (!nic->set_mac_pending) in nicvf_handle_mbx_intr()
202 ether_addr_copy(nic->netdev->dev_addr, in nicvf_handle_mbx_intr()
204 nic->sqs_mode = mbx.nic_cfg.sqs_mode; in nicvf_handle_mbx_intr()
205 nic->loopback_supported = mbx.nic_cfg.loopback_supported; in nicvf_handle_mbx_intr()
206 nic->link_up = false; in nicvf_handle_mbx_intr()
207 nic->duplex = 0; in nicvf_handle_mbx_intr()
208 nic->speed = 0; in nicvf_handle_mbx_intr()
211 nic->pf_acked = true; in nicvf_handle_mbx_intr()
214 nic->pf_nacked = true; in nicvf_handle_mbx_intr()
217 nic->rss_info.rss_size = mbx.rss_size.ind_tbl_size; in nicvf_handle_mbx_intr()
218 nic->pf_acked = true; in nicvf_handle_mbx_intr()
221 nicvf_read_bgx_stats(nic, &mbx.bgx_stats); in nicvf_handle_mbx_intr()
222 nic->pf_acked = true; in nicvf_handle_mbx_intr()
225 nic->pf_acked = true; in nicvf_handle_mbx_intr()
226 nic->link_up = mbx.link_status.link_up; in nicvf_handle_mbx_intr()
227 nic->duplex = mbx.link_status.duplex; in nicvf_handle_mbx_intr()
228 nic->speed = mbx.link_status.speed; in nicvf_handle_mbx_intr()
229 if (nic->link_up) { in nicvf_handle_mbx_intr()
230 netdev_info(nic->netdev, "%s: Link is Up %d Mbps %s\n", in nicvf_handle_mbx_intr()
231 nic->netdev->name, nic->speed, in nicvf_handle_mbx_intr()
232 nic->duplex == DUPLEX_FULL ? in nicvf_handle_mbx_intr()
234 netif_carrier_on(nic->netdev); in nicvf_handle_mbx_intr()
235 netif_tx_start_all_queues(nic->netdev); in nicvf_handle_mbx_intr()
237 netdev_info(nic->netdev, "%s: Link is Down\n", in nicvf_handle_mbx_intr()
238 nic->netdev->name); in nicvf_handle_mbx_intr()
239 netif_carrier_off(nic->netdev); in nicvf_handle_mbx_intr()
240 netif_tx_stop_all_queues(nic->netdev); in nicvf_handle_mbx_intr()
244 nic->sqs_count = mbx.sqs_alloc.qs_count; in nicvf_handle_mbx_intr()
245 nic->pf_acked = true; in nicvf_handle_mbx_intr()
251 nic->snicvf[mbx.nicvf.sqs_id] = in nicvf_handle_mbx_intr()
253 nic->pf_acked = true; in nicvf_handle_mbx_intr()
260 nic->pnicvf = (struct nicvf *)mbx.nicvf.nicvf; in nicvf_handle_mbx_intr()
261 nic->pf_acked = true; in nicvf_handle_mbx_intr()
264 netdev_err(nic->netdev, in nicvf_handle_mbx_intr()
268 nicvf_clear_intr(nic, NICVF_INTR_MBOX, 0); in nicvf_handle_mbx_intr()
271 static int nicvf_hw_set_mac_addr(struct nicvf *nic, struct net_device *netdev) in nicvf_hw_set_mac_addr() argument
276 mbx.mac.vf_id = nic->vf_id; in nicvf_hw_set_mac_addr()
279 return nicvf_send_msg_to_pf(nic, &mbx); in nicvf_hw_set_mac_addr()
282 static void nicvf_config_cpi(struct nicvf *nic) in nicvf_config_cpi() argument
287 mbx.cpi_cfg.vf_id = nic->vf_id; in nicvf_config_cpi()
288 mbx.cpi_cfg.cpi_alg = nic->cpi_alg; in nicvf_config_cpi()
289 mbx.cpi_cfg.rq_cnt = nic->qs->rq_cnt; in nicvf_config_cpi()
291 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_config_cpi()
294 static void nicvf_get_rss_size(struct nicvf *nic) in nicvf_get_rss_size() argument
299 mbx.rss_size.vf_id = nic->vf_id; in nicvf_get_rss_size()
300 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_get_rss_size()
303 void nicvf_config_rss(struct nicvf *nic) in nicvf_config_rss() argument
306 struct nicvf_rss_info *rss = &nic->rss_info; in nicvf_config_rss()
310 mbx.rss_cfg.vf_id = nic->vf_id; in nicvf_config_rss()
322 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_config_rss()
328 void nicvf_set_rss_key(struct nicvf *nic) in nicvf_set_rss_key() argument
330 struct nicvf_rss_info *rss = &nic->rss_info; in nicvf_set_rss_key()
335 nicvf_reg_write(nic, key_addr, rss->key[idx]); in nicvf_set_rss_key()
340 static int nicvf_rss_init(struct nicvf *nic) in nicvf_rss_init() argument
342 struct nicvf_rss_info *rss = &nic->rss_info; in nicvf_rss_init()
345 nicvf_get_rss_size(nic); in nicvf_rss_init()
362 nicvf_set_rss_key(nic); in nicvf_rss_init()
365 nicvf_reg_write(nic, NIC_VNIC_RSS_CFG, rss->cfg); in nicvf_rss_init()
371 nic->rx_queues); in nicvf_rss_init()
372 nicvf_config_rss(nic); in nicvf_rss_init()
377 static void nicvf_request_sqs(struct nicvf *nic) in nicvf_request_sqs() argument
381 int sqs_count = nic->sqs_count; in nicvf_request_sqs()
385 if (nic->sqs_mode || !nic->sqs_count) in nicvf_request_sqs()
389 mbx.sqs_alloc.vf_id = nic->vf_id; in nicvf_request_sqs()
390 mbx.sqs_alloc.qs_count = nic->sqs_count; in nicvf_request_sqs()
391 if (nicvf_send_msg_to_pf(nic, &mbx)) { in nicvf_request_sqs()
393 nic->sqs_count = 0; in nicvf_request_sqs()
398 if (!nic->sqs_count) in nicvf_request_sqs()
401 if (nic->rx_queues > MAX_RCV_QUEUES_PER_QS) in nicvf_request_sqs()
402 rx_queues = nic->rx_queues - MAX_RCV_QUEUES_PER_QS; in nicvf_request_sqs()
403 if (nic->tx_queues > MAX_SND_QUEUES_PER_QS) in nicvf_request_sqs()
404 tx_queues = nic->tx_queues - MAX_SND_QUEUES_PER_QS; in nicvf_request_sqs()
407 for (sqs = 0; sqs < nic->sqs_count; sqs++) { in nicvf_request_sqs()
409 mbx.nicvf.vf_id = nic->vf_id; in nicvf_request_sqs()
411 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_request_sqs()
413 nic->snicvf[sqs]->sqs_id = sqs; in nicvf_request_sqs()
415 nic->snicvf[sqs]->qs->rq_cnt = MAX_RCV_QUEUES_PER_QS; in nicvf_request_sqs()
418 nic->snicvf[sqs]->qs->rq_cnt = rx_queues; in nicvf_request_sqs()
423 nic->snicvf[sqs]->qs->sq_cnt = MAX_SND_QUEUES_PER_QS; in nicvf_request_sqs()
426 nic->snicvf[sqs]->qs->sq_cnt = tx_queues; in nicvf_request_sqs()
430 nic->snicvf[sqs]->qs->cq_cnt = in nicvf_request_sqs()
431 max(nic->snicvf[sqs]->qs->rq_cnt, nic->snicvf[sqs]->qs->sq_cnt); in nicvf_request_sqs()
434 nicvf_open(nic->snicvf[sqs]->netdev); in nicvf_request_sqs()
438 if (sqs_count != nic->sqs_count) in nicvf_request_sqs()
439 nicvf_set_real_num_queues(nic->netdev, in nicvf_request_sqs()
440 nic->tx_queues, nic->rx_queues); in nicvf_request_sqs()
447 static void nicvf_send_vf_struct(struct nicvf *nic) in nicvf_send_vf_struct() argument
452 mbx.nicvf.sqs_mode = nic->sqs_mode; in nicvf_send_vf_struct()
453 mbx.nicvf.nicvf = (u64)nic; in nicvf_send_vf_struct()
454 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_send_vf_struct()
457 static void nicvf_get_primary_vf_struct(struct nicvf *nic) in nicvf_get_primary_vf_struct() argument
462 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_get_primary_vf_struct()
484 static int nicvf_init_resources(struct nicvf *nic) in nicvf_init_resources() argument
492 nicvf_qset_config(nic, true); in nicvf_init_resources()
495 err = nicvf_config_data_transfer(nic, true); in nicvf_init_resources()
497 netdev_err(nic->netdev, in nicvf_init_resources()
503 nicvf_write_to_mbx(nic, &mbx); in nicvf_init_resources()
513 struct nicvf *nic = netdev_priv(netdev); in nicvf_snd_pkt_handler() local
517 sq = &nic->qs->sq[cqe_tx->sq_idx]; in nicvf_snd_pkt_handler()
523 netdev_dbg(nic->netdev, in nicvf_snd_pkt_handler()
529 nicvf_check_cqe_tx_errs(nic, cq, cqe_tx); in nicvf_snd_pkt_handler()
573 struct nicvf *nic = netdev_priv(netdev); in nicvf_rcv_pkt_handler() local
577 rq_idx = nicvf_netdev_qidx(nic, cqe_rx->rq_idx); in nicvf_rcv_pkt_handler()
579 if (nic->sqs_mode) { in nicvf_rcv_pkt_handler()
581 nic = nic->pnicvf; in nicvf_rcv_pkt_handler()
582 netdev = nic->netdev; in nicvf_rcv_pkt_handler()
586 err = nicvf_check_cqe_rx_errs(nic, cq, cqe_rx); in nicvf_rcv_pkt_handler()
590 skb = nicvf_get_rcv_skb(nic, cqe_rx); in nicvf_rcv_pkt_handler()
592 netdev_dbg(nic->netdev, "Packet not received\n"); in nicvf_rcv_pkt_handler()
596 if (netif_msg_pktdata(nic)) { in nicvf_rcv_pkt_handler()
597 netdev_info(nic->netdev, "%s: skb 0x%p, len=%d\n", netdev->name, in nicvf_rcv_pkt_handler()
609 nicvf_set_rx_frame_cnt(nic, skb); in nicvf_rcv_pkt_handler()
639 struct nicvf *nic = netdev_priv(netdev); in nicvf_cq_intr_handler() local
640 struct queue_set *qs = nic->qs; in nicvf_cq_intr_handler()
649 cqe_count = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_STATUS, cq_idx); in nicvf_cq_intr_handler()
655 cqe_head = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_HEAD, cq_idx) >> 9; in nicvf_cq_intr_handler()
658 netdev_dbg(nic->netdev, "%s CQ%d cqe_count %d cqe_head %d\n", in nicvf_cq_intr_handler()
673 netdev_dbg(nic->netdev, "CQ%d cq_desc->cqe_type %d\n", in nicvf_cq_intr_handler()
695 netdev_dbg(nic->netdev, in nicvf_cq_intr_handler()
700 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_DOOR, in nicvf_cq_intr_handler()
709 netdev = nic->pnicvf->netdev; in nicvf_cq_intr_handler()
711 nicvf_netdev_qidx(nic, cq_idx)); in nicvf_cq_intr_handler()
712 nic = nic->pnicvf; in nicvf_cq_intr_handler()
715 nic->drv_stats.txq_wake++; in nicvf_cq_intr_handler()
716 if (netif_msg_tx_err(nic)) in nicvf_cq_intr_handler()
732 struct nicvf *nic = netdev_priv(netdev); in nicvf_poll() local
742 cq_head = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_HEAD, in nicvf_poll()
744 nicvf_clear_intr(nic, NICVF_INTR_CQ, cq->cq_idx); in nicvf_poll()
745 nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_HEAD, in nicvf_poll()
747 nicvf_enable_intr(nic, NICVF_INTR_CQ, cq->cq_idx); in nicvf_poll()
758 struct nicvf *nic = (struct nicvf *)data; in nicvf_handle_qs_err() local
759 struct queue_set *qs = nic->qs; in nicvf_handle_qs_err()
763 netif_tx_disable(nic->netdev); in nicvf_handle_qs_err()
767 status = nicvf_queue_reg_read(nic, NIC_QSET_CQ_0_7_STATUS, in nicvf_handle_qs_err()
772 nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_handle_qs_err()
773 nicvf_sq_disable(nic, qidx); in nicvf_handle_qs_err()
774 nicvf_cq_intr_handler(nic->netdev, qidx, NULL, 0); in nicvf_handle_qs_err()
775 nicvf_cmp_queue_config(nic, qs, qidx, true); in nicvf_handle_qs_err()
776 nicvf_sq_free_used_descs(nic->netdev, &qs->sq[qidx], qidx); in nicvf_handle_qs_err()
777 nicvf_sq_enable(nic, &qs->sq[qidx], qidx); in nicvf_handle_qs_err()
779 nicvf_enable_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_handle_qs_err()
782 netif_tx_start_all_queues(nic->netdev); in nicvf_handle_qs_err()
784 nicvf_enable_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_handle_qs_err()
787 static void nicvf_dump_intr_status(struct nicvf *nic) in nicvf_dump_intr_status() argument
789 if (netif_msg_intr(nic)) in nicvf_dump_intr_status()
790 netdev_info(nic->netdev, "%s: interrupt status 0x%llx\n", in nicvf_dump_intr_status()
791 nic->netdev->name, nicvf_reg_read(nic, NIC_VF_INT)); in nicvf_dump_intr_status()
796 struct nicvf *nic = (struct nicvf *)nicvf_irq; in nicvf_misc_intr_handler() local
799 nicvf_dump_intr_status(nic); in nicvf_misc_intr_handler()
801 intr = nicvf_reg_read(nic, NIC_VF_INT); in nicvf_misc_intr_handler()
806 nicvf_handle_mbx_intr(nic); in nicvf_misc_intr_handler()
814 struct nicvf *nic = cq_poll->nicvf; in nicvf_intr_handler() local
817 nicvf_dump_intr_status(nic); in nicvf_intr_handler()
820 nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_intr_handler()
826 nicvf_clear_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_intr_handler()
833 struct nicvf *nic = (struct nicvf *)nicvf_irq; in nicvf_rbdr_intr_handler() local
837 nicvf_dump_intr_status(nic); in nicvf_rbdr_intr_handler()
840 for (qidx = 0; qidx < nic->qs->rbdr_cnt; qidx++) { in nicvf_rbdr_intr_handler()
841 if (!nicvf_is_intr_enabled(nic, NICVF_INTR_RBDR, qidx)) in nicvf_rbdr_intr_handler()
843 nicvf_disable_intr(nic, NICVF_INTR_RBDR, qidx); in nicvf_rbdr_intr_handler()
844 tasklet_hi_schedule(&nic->rbdr_task); in nicvf_rbdr_intr_handler()
846 nicvf_clear_intr(nic, NICVF_INTR_RBDR, qidx); in nicvf_rbdr_intr_handler()
854 struct nicvf *nic = (struct nicvf *)nicvf_irq; in nicvf_qs_err_intr_handler() local
856 nicvf_dump_intr_status(nic); in nicvf_qs_err_intr_handler()
859 nicvf_disable_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_qs_err_intr_handler()
860 tasklet_hi_schedule(&nic->qs_err_task); in nicvf_qs_err_intr_handler()
861 nicvf_clear_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_qs_err_intr_handler()
866 static int nicvf_enable_msix(struct nicvf *nic) in nicvf_enable_msix() argument
870 nic->num_vec = NIC_VF_MSIX_VECTORS; in nicvf_enable_msix()
872 for (vec = 0; vec < nic->num_vec; vec++) in nicvf_enable_msix()
873 nic->msix_entries[vec].entry = vec; in nicvf_enable_msix()
875 ret = pci_enable_msix(nic->pdev, nic->msix_entries, nic->num_vec); in nicvf_enable_msix()
877 netdev_err(nic->netdev, in nicvf_enable_msix()
878 "Req for #%d msix vectors failed\n", nic->num_vec); in nicvf_enable_msix()
881 nic->msix_enabled = 1; in nicvf_enable_msix()
885 static void nicvf_disable_msix(struct nicvf *nic) in nicvf_disable_msix() argument
887 if (nic->msix_enabled) { in nicvf_disable_msix()
888 pci_disable_msix(nic->pdev); in nicvf_disable_msix()
889 nic->msix_enabled = 0; in nicvf_disable_msix()
890 nic->num_vec = 0; in nicvf_disable_msix()
894 static int nicvf_register_interrupts(struct nicvf *nic) in nicvf_register_interrupts() argument
900 sprintf(nic->irq_name[irq], "NICVF%d CQ%d", in nicvf_register_interrupts()
901 nic->vf_id, irq); in nicvf_register_interrupts()
904 sprintf(nic->irq_name[irq], "NICVF%d SQ%d", in nicvf_register_interrupts()
905 nic->vf_id, irq - NICVF_INTR_ID_SQ); in nicvf_register_interrupts()
908 sprintf(nic->irq_name[irq], "NICVF%d RBDR%d", in nicvf_register_interrupts()
909 nic->vf_id, irq - NICVF_INTR_ID_RBDR); in nicvf_register_interrupts()
912 for (irq = 0; irq < nic->qs->cq_cnt; irq++) { in nicvf_register_interrupts()
913 vector = nic->msix_entries[irq].vector; in nicvf_register_interrupts()
915 0, nic->irq_name[irq], nic->napi[irq]); in nicvf_register_interrupts()
918 nic->irq_allocated[irq] = true; in nicvf_register_interrupts()
923 irq < (NICVF_INTR_ID_RBDR + nic->qs->rbdr_cnt); irq++) { in nicvf_register_interrupts()
924 vector = nic->msix_entries[irq].vector; in nicvf_register_interrupts()
926 0, nic->irq_name[irq], nic); in nicvf_register_interrupts()
929 nic->irq_allocated[irq] = true; in nicvf_register_interrupts()
933 sprintf(nic->irq_name[NICVF_INTR_ID_QS_ERR], in nicvf_register_interrupts()
934 "NICVF%d Qset error", nic->vf_id); in nicvf_register_interrupts()
936 ret = request_irq(nic->msix_entries[irq].vector, in nicvf_register_interrupts()
938 0, nic->irq_name[irq], nic); in nicvf_register_interrupts()
940 nic->irq_allocated[irq] = true; in nicvf_register_interrupts()
944 netdev_err(nic->netdev, "request_irq failed, vector %d\n", irq); in nicvf_register_interrupts()
949 static void nicvf_unregister_interrupts(struct nicvf *nic) in nicvf_unregister_interrupts() argument
954 for (irq = 0; irq < nic->num_vec; irq++) { in nicvf_unregister_interrupts()
955 if (!nic->irq_allocated[irq]) in nicvf_unregister_interrupts()
959 free_irq(nic->msix_entries[irq].vector, nic->napi[irq]); in nicvf_unregister_interrupts()
961 free_irq(nic->msix_entries[irq].vector, nic); in nicvf_unregister_interrupts()
963 nic->irq_allocated[irq] = false; in nicvf_unregister_interrupts()
967 nicvf_disable_msix(nic); in nicvf_unregister_interrupts()
973 static int nicvf_register_misc_interrupt(struct nicvf *nic) in nicvf_register_misc_interrupt() argument
979 if (nic->msix_enabled) in nicvf_register_misc_interrupt()
983 if (!nicvf_enable_msix(nic)) in nicvf_register_misc_interrupt()
986 sprintf(nic->irq_name[irq], "%s Mbox", "NICVF"); in nicvf_register_misc_interrupt()
988 ret = request_irq(nic->msix_entries[irq].vector, in nicvf_register_misc_interrupt()
989 nicvf_misc_intr_handler, 0, nic->irq_name[irq], nic); in nicvf_register_misc_interrupt()
993 nic->irq_allocated[irq] = true; in nicvf_register_misc_interrupt()
996 nicvf_enable_intr(nic, NICVF_INTR_MBOX, 0); in nicvf_register_misc_interrupt()
999 if (!nicvf_check_pf_ready(nic)) { in nicvf_register_misc_interrupt()
1000 nicvf_disable_intr(nic, NICVF_INTR_MBOX, 0); in nicvf_register_misc_interrupt()
1001 nicvf_unregister_interrupts(nic); in nicvf_register_misc_interrupt()
1010 struct nicvf *nic = netdev_priv(netdev); in nicvf_xmit() local
1020 if (!netif_tx_queue_stopped(txq) && !nicvf_sq_append_skb(nic, skb)) { in nicvf_xmit()
1022 nic->drv_stats.txq_stop++; in nicvf_xmit()
1023 if (netif_msg_tx_err(nic)) in nicvf_xmit()
1033 static inline void nicvf_free_cq_poll(struct nicvf *nic) in nicvf_free_cq_poll() argument
1038 for (qidx = 0; qidx < nic->qs->cq_cnt; qidx++) { in nicvf_free_cq_poll()
1039 cq_poll = nic->napi[qidx]; in nicvf_free_cq_poll()
1042 nic->napi[qidx] = NULL; in nicvf_free_cq_poll()
1050 struct nicvf *nic = netdev_priv(netdev); in nicvf_stop() local
1051 struct queue_set *qs = nic->qs; in nicvf_stop()
1056 nicvf_send_msg_to_pf(nic, &mbx); in nicvf_stop()
1059 netif_tx_stop_all_queues(nic->netdev); in nicvf_stop()
1060 nic->link_up = false; in nicvf_stop()
1063 if (!nic->sqs_mode) { in nicvf_stop()
1064 for (qidx = 0; qidx < nic->sqs_count; qidx++) { in nicvf_stop()
1065 if (!nic->snicvf[qidx]) in nicvf_stop()
1067 nicvf_stop(nic->snicvf[qidx]->netdev); in nicvf_stop()
1068 nic->snicvf[qidx] = NULL; in nicvf_stop()
1074 nicvf_disable_intr(nic, NICVF_INTR_RBDR, qidx); in nicvf_stop()
1075 nicvf_clear_intr(nic, NICVF_INTR_RBDR, qidx); in nicvf_stop()
1077 nicvf_disable_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_stop()
1078 nicvf_clear_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_stop()
1081 for (irq = 0; irq < nic->num_vec; irq++) in nicvf_stop()
1082 synchronize_irq(nic->msix_entries[irq].vector); in nicvf_stop()
1084 tasklet_kill(&nic->rbdr_task); in nicvf_stop()
1085 tasklet_kill(&nic->qs_err_task); in nicvf_stop()
1086 if (nic->rb_work_scheduled) in nicvf_stop()
1087 cancel_delayed_work_sync(&nic->rbdr_work); in nicvf_stop()
1089 for (qidx = 0; qidx < nic->qs->cq_cnt; qidx++) { in nicvf_stop()
1090 cq_poll = nic->napi[qidx]; in nicvf_stop()
1097 nicvf_disable_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_stop()
1098 nicvf_clear_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_stop()
1106 nicvf_config_data_transfer(nic, false); in nicvf_stop()
1109 nicvf_qset_config(nic, false); in nicvf_stop()
1112 nicvf_disable_intr(nic, NICVF_INTR_MBOX, 0); in nicvf_stop()
1114 nicvf_unregister_interrupts(nic); in nicvf_stop()
1116 nicvf_free_cq_poll(nic); in nicvf_stop()
1119 nic->pnicvf = nic; in nicvf_stop()
1120 nic->sqs_count = 0; in nicvf_stop()
1128 struct nicvf *nic = netdev_priv(netdev); in nicvf_open() local
1129 struct queue_set *qs = nic->qs; in nicvf_open()
1132 nic->mtu = netdev->mtu; in nicvf_open()
1136 err = nicvf_register_misc_interrupt(nic); in nicvf_open()
1148 cq_poll->nicvf = nic; in nicvf_open()
1152 nic->napi[qidx] = cq_poll; in nicvf_open()
1158 nicvf_hw_set_mac_addr(nic, netdev); in nicvf_open()
1161 if (nic->set_mac_pending) { in nicvf_open()
1162 nic->set_mac_pending = false; in nicvf_open()
1163 nicvf_hw_set_mac_addr(nic, netdev); in nicvf_open()
1167 tasklet_init(&nic->qs_err_task, nicvf_handle_qs_err, in nicvf_open()
1168 (unsigned long)nic); in nicvf_open()
1171 tasklet_init(&nic->rbdr_task, nicvf_rbdr_task, in nicvf_open()
1172 (unsigned long)nic); in nicvf_open()
1173 INIT_DELAYED_WORK(&nic->rbdr_work, nicvf_rbdr_work); in nicvf_open()
1176 nic->cpi_alg = cpi_alg; in nicvf_open()
1177 if (!nic->sqs_mode) in nicvf_open()
1178 nicvf_config_cpi(nic); in nicvf_open()
1180 nicvf_request_sqs(nic); in nicvf_open()
1181 if (nic->sqs_mode) in nicvf_open()
1182 nicvf_get_primary_vf_struct(nic); in nicvf_open()
1185 if (!nic->sqs_mode) in nicvf_open()
1186 nicvf_rss_init(nic); in nicvf_open()
1188 err = nicvf_register_interrupts(nic); in nicvf_open()
1193 err = nicvf_init_resources(nic); in nicvf_open()
1200 nicvf_reg_write(nic, NIC_VF_INT, -1); in nicvf_open()
1202 nicvf_enable_intr(nic, NICVF_INTR_QS_ERR, 0); in nicvf_open()
1206 nicvf_enable_intr(nic, NICVF_INTR_CQ, qidx); in nicvf_open()
1210 nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx); in nicvf_open()
1212 nic->drv_stats.txq_stop = 0; in nicvf_open()
1213 nic->drv_stats.txq_wake = 0; in nicvf_open()
1217 nicvf_disable_intr(nic, NICVF_INTR_MBOX, 0); in nicvf_open()
1218 nicvf_unregister_interrupts(nic); in nicvf_open()
1219 tasklet_kill(&nic->qs_err_task); in nicvf_open()
1220 tasklet_kill(&nic->rbdr_task); in nicvf_open()
1223 cq_poll = nic->napi[qidx]; in nicvf_open()
1229 nicvf_free_cq_poll(nic); in nicvf_open()
1233 static int nicvf_update_hw_max_frs(struct nicvf *nic, int mtu) in nicvf_update_hw_max_frs() argument
1239 mbx.frs.vf_id = nic->vf_id; in nicvf_update_hw_max_frs()
1241 return nicvf_send_msg_to_pf(nic, &mbx); in nicvf_update_hw_max_frs()
1246 struct nicvf *nic = netdev_priv(netdev); in nicvf_change_mtu() local
1254 if (nicvf_update_hw_max_frs(nic, new_mtu)) in nicvf_change_mtu()
1257 nic->mtu = new_mtu; in nicvf_change_mtu()
1265 struct nicvf *nic = netdev_priv(netdev); in nicvf_set_mac_address() local
1272 if (nic->msix_enabled) { in nicvf_set_mac_address()
1273 if (nicvf_hw_set_mac_addr(nic, netdev)) in nicvf_set_mac_address()
1276 nic->set_mac_pending = true; in nicvf_set_mac_address()
1282 void nicvf_update_lmac_stats(struct nicvf *nic) in nicvf_update_lmac_stats() argument
1287 if (!netif_running(nic->netdev)) in nicvf_update_lmac_stats()
1291 mbx.bgx_stats.vf_id = nic->vf_id; in nicvf_update_lmac_stats()
1296 if (nicvf_send_msg_to_pf(nic, &mbx)) in nicvf_update_lmac_stats()
1307 if (nicvf_send_msg_to_pf(nic, &mbx)) in nicvf_update_lmac_stats()
1313 void nicvf_update_stats(struct nicvf *nic) in nicvf_update_stats() argument
1316 struct nicvf_hw_stats *stats = &nic->hw_stats; in nicvf_update_stats()
1317 struct nicvf_drv_stats *drv_stats = &nic->drv_stats; in nicvf_update_stats()
1318 struct queue_set *qs = nic->qs; in nicvf_update_stats()
1321 nicvf_reg_read(nic, NIC_VNIC_RX_STAT_0_13 | (reg << 3)) in nicvf_update_stats()
1323 nicvf_reg_read(nic, NIC_VNIC_TX_STAT_0_4 | (reg << 3)) in nicvf_update_stats()
1355 nicvf_update_rq_stats(nic, qidx); in nicvf_update_stats()
1357 nicvf_update_sq_stats(nic, qidx); in nicvf_update_stats()
1363 struct nicvf *nic = netdev_priv(netdev); in nicvf_get_stats64() local
1364 struct nicvf_hw_stats *hw_stats = &nic->hw_stats; in nicvf_get_stats64()
1365 struct nicvf_drv_stats *drv_stats = &nic->drv_stats; in nicvf_get_stats64()
1367 nicvf_update_stats(nic); in nicvf_get_stats64()
1383 struct nicvf *nic = netdev_priv(dev); in nicvf_tx_timeout() local
1385 if (netif_msg_tx_err(nic)) in nicvf_tx_timeout()
1389 schedule_work(&nic->reset_task); in nicvf_tx_timeout()
1394 struct nicvf *nic; in nicvf_reset_task() local
1396 nic = container_of(work, struct nicvf, reset_task); in nicvf_reset_task()
1398 if (!netif_running(nic->netdev)) in nicvf_reset_task()
1401 nicvf_stop(nic->netdev); in nicvf_reset_task()
1402 nicvf_open(nic->netdev); in nicvf_reset_task()
1403 nic->netdev->trans_start = jiffies; in nicvf_reset_task()
1406 static int nicvf_config_loopback(struct nicvf *nic, in nicvf_config_loopback() argument
1412 mbx.lbk.vf_id = nic->vf_id; in nicvf_config_loopback()
1415 return nicvf_send_msg_to_pf(nic, &mbx); in nicvf_config_loopback()
1421 struct nicvf *nic = netdev_priv(netdev); in nicvf_fix_features() local
1424 netif_running(netdev) && !nic->loopback_supported) in nicvf_fix_features()
1433 struct nicvf *nic = netdev_priv(netdev); in nicvf_set_features() local
1437 nicvf_config_vlan_stripping(nic, features); in nicvf_set_features()
1440 return nicvf_config_loopback(nic, features); in nicvf_set_features()
1461 struct nicvf *nic; in nicvf_probe() local
1508 nic = netdev_priv(netdev); in nicvf_probe()
1509 nic->netdev = netdev; in nicvf_probe()
1510 nic->pdev = pdev; in nicvf_probe()
1511 nic->pnicvf = nic; in nicvf_probe()
1512 nic->max_queues = qcount; in nicvf_probe()
1515 nic->reg_base = pcim_iomap(pdev, PCI_CFG_REG_BAR_NUM, 0); in nicvf_probe()
1516 if (!nic->reg_base) { in nicvf_probe()
1522 err = nicvf_set_qset_resources(nic); in nicvf_probe()
1527 err = nicvf_register_misc_interrupt(nic); in nicvf_probe()
1531 nicvf_send_vf_struct(nic); in nicvf_probe()
1534 if (nic->sqs_mode) in nicvf_probe()
1537 err = nicvf_set_real_num_queues(netdev, nic->tx_queues, nic->rx_queues); in nicvf_probe()
1555 INIT_WORK(&nic->reset_task, nicvf_reset_task); in nicvf_probe()
1563 nic->msg_enable = debug; in nicvf_probe()
1570 nicvf_unregister_interrupts(nic); in nicvf_probe()
1584 struct nicvf *nic; in nicvf_remove() local
1590 nic = netdev_priv(netdev); in nicvf_remove()
1591 pnetdev = nic->pnicvf->netdev; in nicvf_remove()
1598 nicvf_unregister_interrupts(nic); in nicvf_remove()