Lines Matching refs:lif
33 static void ionic_link_status_check(struct ionic_lif *lif);
34 static void ionic_lif_handle_fw_down(struct ionic_lif *lif);
35 static void ionic_lif_handle_fw_up(struct ionic_lif *lif);
36 static void ionic_lif_set_netdev_info(struct ionic_lif *lif);
38 static void ionic_txrx_deinit(struct ionic_lif *lif);
39 static int ionic_txrx_init(struct ionic_lif *lif);
40 static int ionic_start_queues(struct ionic_lif *lif);
41 static void ionic_stop_queues(struct ionic_lif *lif);
42 static void ionic_lif_queue_identify(struct ionic_lif *lif);
53 new_coal = ionic_coal_usec_to_hw(qcq->q.lif->ionic, cur_moder.usec); in ionic_dim_work()
58 struct ionic_lif *lif = qcq->q.lif; in ionic_dim_work() local
62 ionic_intr_coal_init(lif->ionic->idev.intr_ctrl, in ionic_dim_work()
63 lif->rxqcqs[qi]->intr.index, in ionic_dim_work()
72 struct ionic_lif *lif = container_of(work, struct ionic_lif, deferred.work); in ionic_lif_deferred_work() local
73 struct ionic_deferred *def = &lif->deferred; in ionic_lif_deferred_work()
90 ionic_lif_rx_mode(lif); in ionic_lif_deferred_work()
93 ionic_link_status_check(lif); in ionic_lif_deferred_work()
97 ionic_lif_handle_fw_up(lif); in ionic_lif_deferred_work()
99 ionic_lif_handle_fw_down(lif); in ionic_lif_deferred_work()
105 mod_timer(&lif->ionic->watchdog_timer, jiffies + 1); in ionic_lif_deferred_work()
125 static void ionic_link_status_check(struct ionic_lif *lif) in ionic_link_status_check() argument
127 struct net_device *netdev = lif->netdev; in ionic_link_status_check()
131 if (!test_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state)) in ionic_link_status_check()
135 if (test_bit(IONIC_LIF_F_BROKEN, lif->state)) { in ionic_link_status_check()
136 clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state); in ionic_link_status_check()
140 link_status = le16_to_cpu(lif->info->status.link_status); in ionic_link_status_check()
147 mutex_lock(&lif->queue_lock); in ionic_link_status_check()
148 err = ionic_start_queues(lif); in ionic_link_status_check()
150 netdev_err(lif->netdev, in ionic_link_status_check()
152 set_bit(IONIC_LIF_F_BROKEN, lif->state); in ionic_link_status_check()
153 netif_carrier_off(lif->netdev); in ionic_link_status_check()
155 mutex_unlock(&lif->queue_lock); in ionic_link_status_check()
159 ionic_port_identify(lif->ionic); in ionic_link_status_check()
161 le32_to_cpu(lif->info->status.link_speed) / 1000); in ionic_link_status_check()
171 mutex_lock(&lif->queue_lock); in ionic_link_status_check()
172 ionic_stop_queues(lif); in ionic_link_status_check()
173 mutex_unlock(&lif->queue_lock); in ionic_link_status_check()
177 clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state); in ionic_link_status_check()
180 void ionic_link_status_check_request(struct ionic_lif *lif, bool can_sleep) in ionic_link_status_check_request() argument
185 if (test_and_set_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state)) in ionic_link_status_check_request()
191 clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state); in ionic_link_status_check_request()
196 ionic_lif_deferred_enqueue(&lif->deferred, work); in ionic_link_status_check_request()
198 ionic_link_status_check(lif); in ionic_link_status_check_request()
211 static int ionic_request_irq(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_request_irq() argument
214 struct device *dev = lif->ionic->dev; in ionic_request_irq()
218 if (lif->registered) in ionic_request_irq()
219 name = lif->netdev->name; in ionic_request_irq()
230 static int ionic_intr_alloc(struct ionic_lif *lif, struct ionic_intr_info *intr) in ionic_intr_alloc() argument
232 struct ionic *ionic = lif->ionic; in ionic_intr_alloc()
237 netdev_warn(lif->netdev, "%s: no intr, index=%d nintrs=%d\n", in ionic_intr_alloc()
257 struct ionic_lif *lif = q->lif; in ionic_qcq_enable() local
265 .lif_index = cpu_to_le16(lif->index), in ionic_qcq_enable()
272 idev = &lif->ionic->idev; in ionic_qcq_enable()
273 dev = lif->ionic->dev; in ionic_qcq_enable()
287 return ionic_adminq_post_wait(lif, &ctx); in ionic_qcq_enable()
293 struct ionic_lif *lif; in ionic_qcq_disable() local
308 lif = q->lif; in ionic_qcq_disable()
311 struct ionic_dev *idev = &lif->ionic->idev; in ionic_qcq_disable()
322 ctx.cmd.q_control.lif_index = cpu_to_le16(lif->index); in ionic_qcq_disable()
325 dev_dbg(lif->ionic->dev, "q_disable.index %d q_disable.qtype %d\n", in ionic_qcq_disable()
328 err = ionic_adminq_post_wait(lif, &ctx); in ionic_qcq_disable()
334 static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_qcq_deinit() argument
336 struct ionic_dev *idev = &lif->ionic->idev; in ionic_lif_qcq_deinit()
353 static void ionic_qcq_intr_free(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_qcq_intr_free() argument
359 devm_free_irq(lif->ionic->dev, qcq->intr.vector, &qcq->napi); in ionic_qcq_intr_free()
361 ionic_intr_free(lif->ionic, qcq->intr.index); in ionic_qcq_intr_free()
365 static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_qcq_free() argument
367 struct device *dev = lif->ionic->dev; in ionic_qcq_free()
392 ionic_qcq_intr_free(lif, qcq); in ionic_qcq_free()
404 static void ionic_qcqs_free(struct ionic_lif *lif) in ionic_qcqs_free() argument
406 struct device *dev = lif->ionic->dev; in ionic_qcqs_free()
410 if (lif->notifyqcq) { in ionic_qcqs_free()
411 ionic_qcq_free(lif, lif->notifyqcq); in ionic_qcqs_free()
412 devm_kfree(dev, lif->notifyqcq); in ionic_qcqs_free()
413 lif->notifyqcq = NULL; in ionic_qcqs_free()
416 if (lif->adminqcq) { in ionic_qcqs_free()
417 spin_lock_irqsave(&lif->adminq_lock, irqflags); in ionic_qcqs_free()
418 adminqcq = READ_ONCE(lif->adminqcq); in ionic_qcqs_free()
419 lif->adminqcq = NULL; in ionic_qcqs_free()
420 spin_unlock_irqrestore(&lif->adminq_lock, irqflags); in ionic_qcqs_free()
422 ionic_qcq_free(lif, adminqcq); in ionic_qcqs_free()
427 if (lif->rxqcqs) { in ionic_qcqs_free()
428 devm_kfree(dev, lif->rxqstats); in ionic_qcqs_free()
429 lif->rxqstats = NULL; in ionic_qcqs_free()
430 devm_kfree(dev, lif->rxqcqs); in ionic_qcqs_free()
431 lif->rxqcqs = NULL; in ionic_qcqs_free()
434 if (lif->txqcqs) { in ionic_qcqs_free()
435 devm_kfree(dev, lif->txqstats); in ionic_qcqs_free()
436 lif->txqstats = NULL; in ionic_qcqs_free()
437 devm_kfree(dev, lif->txqcqs); in ionic_qcqs_free()
438 lif->txqcqs = NULL; in ionic_qcqs_free()
446 ionic_intr_free(n_qcq->cq.lif->ionic, n_qcq->intr.index); in ionic_link_qcq_interrupts()
454 static int ionic_alloc_qcq_interrupt(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_alloc_qcq_interrupt() argument
463 err = ionic_intr_alloc(lif, &qcq->intr); in ionic_alloc_qcq_interrupt()
465 netdev_warn(lif->netdev, "no intr for %s: %d\n", in ionic_alloc_qcq_interrupt()
470 err = ionic_bus_get_irq(lif->ionic, qcq->intr.index); in ionic_alloc_qcq_interrupt()
472 netdev_warn(lif->netdev, "no vector for %s: %d\n", in ionic_alloc_qcq_interrupt()
477 ionic_intr_mask_assert(lif->ionic->idev.intr_ctrl, qcq->intr.index, in ionic_alloc_qcq_interrupt()
480 err = ionic_request_irq(lif, qcq); in ionic_alloc_qcq_interrupt()
482 netdev_warn(lif->netdev, "irq request failed %d\n", err); in ionic_alloc_qcq_interrupt()
488 dev_to_node(lif->ionic->dev)); in ionic_alloc_qcq_interrupt()
492 netdev_dbg(lif->netdev, "%s: Interrupt index %d\n", qcq->q.name, qcq->intr.index); in ionic_alloc_qcq_interrupt()
496 ionic_intr_free(lif->ionic, qcq->intr.index); in ionic_alloc_qcq_interrupt()
501 static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type, in ionic_qcq_alloc() argument
509 struct ionic_dev *idev = &lif->ionic->idev; in ionic_qcq_alloc()
510 struct device *dev = lif->ionic->dev; in ionic_qcq_alloc()
522 netdev_err(lif->netdev, "Cannot allocate queue structure\n"); in ionic_qcq_alloc()
533 netdev_err(lif->netdev, "Cannot allocate queue info\n"); in ionic_qcq_alloc()
539 new->q.max_sg_elems = lif->qtype_info[type].max_sg_elems; in ionic_qcq_alloc()
541 err = ionic_q_init(lif, idev, &new->q, index, name, num_descs, in ionic_qcq_alloc()
544 netdev_err(lif->netdev, "Cannot initialize queue\n"); in ionic_qcq_alloc()
548 err = ionic_alloc_qcq_interrupt(lif, new); in ionic_qcq_alloc()
555 netdev_err(lif->netdev, "Cannot allocate completion queue info\n"); in ionic_qcq_alloc()
560 err = ionic_cq_init(lif, &new->cq, &new->intr, num_descs, cq_desc_size); in ionic_qcq_alloc()
562 netdev_err(lif->netdev, "Cannot initialize completion queue\n"); in ionic_qcq_alloc()
577 netdev_err(lif->netdev, "Cannot allocate qcq DMA memory\n"); in ionic_qcq_alloc()
594 netdev_err(lif->netdev, "Cannot allocate queue DMA memory\n"); in ionic_qcq_alloc()
606 netdev_err(lif->netdev, "Cannot allocate cq DMA memory\n"); in ionic_qcq_alloc()
621 netdev_err(lif->netdev, "Cannot allocate sg DMA memory\n"); in ionic_qcq_alloc()
646 ionic_intr_free(lif->ionic, new->intr.index); in ionic_qcq_alloc()
657 static int ionic_qcqs_alloc(struct ionic_lif *lif) in ionic_qcqs_alloc() argument
659 struct device *dev = lif->ionic->dev; in ionic_qcqs_alloc()
664 err = ionic_qcq_alloc(lif, IONIC_QTYPE_ADMINQ, 0, "admin", flags, in ionic_qcqs_alloc()
668 0, lif->kern_pid, &lif->adminqcq); in ionic_qcqs_alloc()
671 ionic_debugfs_add_qcq(lif, lif->adminqcq); in ionic_qcqs_alloc()
673 if (lif->ionic->nnqs_per_lif) { in ionic_qcqs_alloc()
675 err = ionic_qcq_alloc(lif, IONIC_QTYPE_NOTIFYQ, 0, "notifyq", in ionic_qcqs_alloc()
679 0, lif->kern_pid, &lif->notifyqcq); in ionic_qcqs_alloc()
682 ionic_debugfs_add_qcq(lif, lif->notifyqcq); in ionic_qcqs_alloc()
685 ionic_link_qcq_interrupts(lif->adminqcq, lif->notifyqcq); in ionic_qcqs_alloc()
689 lif->txqcqs = devm_kcalloc(dev, lif->ionic->ntxqs_per_lif, in ionic_qcqs_alloc()
690 sizeof(*lif->txqcqs), GFP_KERNEL); in ionic_qcqs_alloc()
691 if (!lif->txqcqs) in ionic_qcqs_alloc()
693 lif->rxqcqs = devm_kcalloc(dev, lif->ionic->nrxqs_per_lif, in ionic_qcqs_alloc()
694 sizeof(*lif->rxqcqs), GFP_KERNEL); in ionic_qcqs_alloc()
695 if (!lif->rxqcqs) in ionic_qcqs_alloc()
698 lif->txqstats = devm_kcalloc(dev, lif->ionic->ntxqs_per_lif + 1, in ionic_qcqs_alloc()
699 sizeof(*lif->txqstats), GFP_KERNEL); in ionic_qcqs_alloc()
700 if (!lif->txqstats) in ionic_qcqs_alloc()
702 lif->rxqstats = devm_kcalloc(dev, lif->ionic->nrxqs_per_lif + 1, in ionic_qcqs_alloc()
703 sizeof(*lif->rxqstats), GFP_KERNEL); in ionic_qcqs_alloc()
704 if (!lif->rxqstats) in ionic_qcqs_alloc()
710 ionic_qcqs_free(lif); in ionic_qcqs_alloc()
725 static int ionic_lif_txq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_txq_init() argument
727 struct device *dev = lif->ionic->dev; in ionic_lif_txq_init()
734 .lif_index = cpu_to_le16(lif->index), in ionic_lif_txq_init()
736 .ver = lif->qtype_info[q->type].version, in ionic_lif_txq_init()
765 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_txq_init()
776 if (test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state)) in ionic_lif_txq_init()
777 netif_napi_add(lif->netdev, &qcq->napi, ionic_tx_napi, in ionic_lif_txq_init()
785 static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_rxq_init() argument
787 struct device *dev = lif->ionic->dev; in ionic_lif_rxq_init()
794 .lif_index = cpu_to_le16(lif->index), in ionic_lif_rxq_init()
796 .ver = lif->qtype_info[q->type].version, in ionic_lif_rxq_init()
821 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rxq_init()
832 if (test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state)) in ionic_lif_rxq_init()
833 netif_napi_add(lif->netdev, &qcq->napi, ionic_rx_napi, in ionic_lif_rxq_init()
836 netif_napi_add(lif->netdev, &qcq->napi, ionic_txrx_napi, in ionic_lif_rxq_init()
844 int ionic_lif_create_hwstamp_txq(struct ionic_lif *lif) in ionic_lif_create_hwstamp_txq() argument
852 if (lif->hwstamp_txq) in ionic_lif_create_hwstamp_txq()
861 if (lif->qtype_info[IONIC_QTYPE_TXQ].version >= 1 && in ionic_lif_create_hwstamp_txq()
862 lif->qtype_info[IONIC_QTYPE_TXQ].sg_desc_sz == sizeof(struct ionic_txq_sg_desc_v1)) in ionic_lif_create_hwstamp_txq()
867 txq_i = lif->ionic->ntxqs_per_lif; in ionic_lif_create_hwstamp_txq()
870 err = ionic_qcq_alloc(lif, IONIC_QTYPE_TXQ, txq_i, "hwstamp_tx", flags, in ionic_lif_create_hwstamp_txq()
872 lif->kern_pid, &txq); in ionic_lif_create_hwstamp_txq()
878 ionic_link_qcq_interrupts(lif->adminqcq, txq); in ionic_lif_create_hwstamp_txq()
879 ionic_debugfs_add_qcq(lif, txq); in ionic_lif_create_hwstamp_txq()
881 lif->hwstamp_txq = txq; in ionic_lif_create_hwstamp_txq()
883 if (netif_running(lif->netdev)) { in ionic_lif_create_hwstamp_txq()
884 err = ionic_lif_txq_init(lif, txq); in ionic_lif_create_hwstamp_txq()
888 if (test_bit(IONIC_LIF_F_UP, lif->state)) { in ionic_lif_create_hwstamp_txq()
898 ionic_lif_qcq_deinit(lif, txq); in ionic_lif_create_hwstamp_txq()
900 lif->hwstamp_txq = NULL; in ionic_lif_create_hwstamp_txq()
902 ionic_qcq_free(lif, txq); in ionic_lif_create_hwstamp_txq()
903 devm_kfree(lif->ionic->dev, txq); in ionic_lif_create_hwstamp_txq()
908 int ionic_lif_create_hwstamp_rxq(struct ionic_lif *lif) in ionic_lif_create_hwstamp_rxq() argument
916 if (lif->hwstamp_rxq) in ionic_lif_create_hwstamp_rxq()
926 rxq_i = lif->ionic->nrxqs_per_lif; in ionic_lif_create_hwstamp_rxq()
929 err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, rxq_i, "hwstamp_rx", flags, in ionic_lif_create_hwstamp_rxq()
931 lif->kern_pid, &rxq); in ionic_lif_create_hwstamp_rxq()
937 ionic_link_qcq_interrupts(lif->adminqcq, rxq); in ionic_lif_create_hwstamp_rxq()
938 ionic_debugfs_add_qcq(lif, rxq); in ionic_lif_create_hwstamp_rxq()
940 lif->hwstamp_rxq = rxq; in ionic_lif_create_hwstamp_rxq()
942 if (netif_running(lif->netdev)) { in ionic_lif_create_hwstamp_rxq()
943 err = ionic_lif_rxq_init(lif, rxq); in ionic_lif_create_hwstamp_rxq()
947 if (test_bit(IONIC_LIF_F_UP, lif->state)) { in ionic_lif_create_hwstamp_rxq()
958 ionic_lif_qcq_deinit(lif, rxq); in ionic_lif_create_hwstamp_rxq()
960 lif->hwstamp_rxq = NULL; in ionic_lif_create_hwstamp_rxq()
962 ionic_qcq_free(lif, rxq); in ionic_lif_create_hwstamp_rxq()
963 devm_kfree(lif->ionic->dev, rxq); in ionic_lif_create_hwstamp_rxq()
968 int ionic_lif_config_hwstamp_rxq_all(struct ionic_lif *lif, bool rx_all) in ionic_lif_config_hwstamp_rxq_all() argument
972 ionic_init_queue_params(lif, &qparam); in ionic_lif_config_hwstamp_rxq_all()
980 if (!netif_running(lif->netdev)) { in ionic_lif_config_hwstamp_rxq_all()
981 lif->rxq_features = qparam.rxq_features; in ionic_lif_config_hwstamp_rxq_all()
985 return ionic_reconfigure_queues(lif, &qparam); in ionic_lif_config_hwstamp_rxq_all()
988 int ionic_lif_set_hwstamp_txmode(struct ionic_lif *lif, u16 txstamp_mode) in ionic_lif_set_hwstamp_txmode() argument
994 .index = cpu_to_le16(lif->index), in ionic_lif_set_hwstamp_txmode()
1000 return ionic_adminq_post_wait(lif, &ctx); in ionic_lif_set_hwstamp_txmode()
1003 static void ionic_lif_del_hwstamp_rxfilt(struct ionic_lif *lif) in ionic_lif_del_hwstamp_rxfilt() argument
1009 .lif_index = cpu_to_le16(lif->index), in ionic_lif_del_hwstamp_rxfilt()
1016 spin_lock_bh(&lif->rx_filters.lock); in ionic_lif_del_hwstamp_rxfilt()
1018 f = ionic_rx_filter_rxsteer(lif); in ionic_lif_del_hwstamp_rxfilt()
1020 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_del_hwstamp_rxfilt()
1025 ionic_rx_filter_free(lif, f); in ionic_lif_del_hwstamp_rxfilt()
1027 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_del_hwstamp_rxfilt()
1029 netdev_dbg(lif->netdev, "rx_filter del RXSTEER (id %d)\n", filter_id); in ionic_lif_del_hwstamp_rxfilt()
1033 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_del_hwstamp_rxfilt()
1035 netdev_dbg(lif->netdev, "failed to delete rx_filter RXSTEER (id %d)\n", filter_id); in ionic_lif_del_hwstamp_rxfilt()
1038 static int ionic_lif_add_hwstamp_rxfilt(struct ionic_lif *lif, u64 pkt_class) in ionic_lif_add_hwstamp_rxfilt() argument
1044 .lif_index = cpu_to_le16(lif->index), in ionic_lif_add_hwstamp_rxfilt()
1053 if (!lif->hwstamp_rxq) in ionic_lif_add_hwstamp_rxfilt()
1056 qtype = lif->hwstamp_rxq->q.type; in ionic_lif_add_hwstamp_rxfilt()
1059 qid = lif->hwstamp_rxq->q.index; in ionic_lif_add_hwstamp_rxfilt()
1062 netdev_dbg(lif->netdev, "rx_filter add RXSTEER\n"); in ionic_lif_add_hwstamp_rxfilt()
1063 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_add_hwstamp_rxfilt()
1067 spin_lock_bh(&lif->rx_filters.lock); in ionic_lif_add_hwstamp_rxfilt()
1068 err = ionic_rx_filter_save(lif, 0, qid, 0, &ctx, IONIC_FILTER_STATE_SYNCED); in ionic_lif_add_hwstamp_rxfilt()
1069 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_add_hwstamp_rxfilt()
1074 int ionic_lif_set_hwstamp_rxfilt(struct ionic_lif *lif, u64 pkt_class) in ionic_lif_set_hwstamp_rxfilt() argument
1076 ionic_lif_del_hwstamp_rxfilt(lif); in ionic_lif_set_hwstamp_rxfilt()
1081 return ionic_lif_add_hwstamp_rxfilt(lif, pkt_class); in ionic_lif_set_hwstamp_rxfilt()
1091 struct ionic_lif *lif; in ionic_notifyq_service() local
1095 lif = q->info[0].cb_arg; in ionic_notifyq_service()
1096 netdev = lif->netdev; in ionic_notifyq_service()
1100 if ((s64)(eid - lif->last_eid) <= 0) in ionic_notifyq_service()
1103 lif->last_eid = eid; in ionic_notifyq_service()
1105 dev_dbg(lif->ionic->dev, "notifyq event:\n"); in ionic_notifyq_service()
1111 ionic_link_status_check_request(lif, CAN_NOT_SLEEP); in ionic_notifyq_service()
1116 netdev_err(lif->netdev, "Reset event dropped\n"); in ionic_notifyq_service()
1119 ionic_lif_deferred_enqueue(&lif->deferred, work); in ionic_notifyq_service()
1147 struct ionic_lif *lif = napi_to_cq(napi)->lif; in ionic_adminq_napi() local
1148 struct ionic_dev *idev = &lif->ionic->idev; in ionic_adminq_napi()
1158 if (lif->notifyqcq && lif->notifyqcq->flags & IONIC_QCQ_F_INITED) in ionic_adminq_napi()
1159 n_work = ionic_cq_service(&lif->notifyqcq->cq, budget, in ionic_adminq_napi()
1162 spin_lock_irqsave(&lif->adminq_lock, irqflags); in ionic_adminq_napi()
1163 if (lif->adminqcq && lif->adminqcq->flags & IONIC_QCQ_F_INITED) in ionic_adminq_napi()
1164 a_work = ionic_cq_service(&lif->adminqcq->cq, budget, in ionic_adminq_napi()
1166 spin_unlock_irqrestore(&lif->adminq_lock, irqflags); in ionic_adminq_napi()
1168 if (lif->hwstamp_rxq) in ionic_adminq_napi()
1169 rx_work = ionic_cq_service(&lif->hwstamp_rxq->cq, budget, in ionic_adminq_napi()
1172 if (lif->hwstamp_txq) in ionic_adminq_napi()
1173 tx_work = ionic_cq_service(&lif->hwstamp_txq->cq, budget, in ionic_adminq_napi()
1194 struct ionic_lif *lif = netdev_priv(netdev); in ionic_get_stats64() local
1198 ls = &lif->info->stats; in ionic_get_stats64()
1244 int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr) in ionic_lif_addr_add() argument
1250 .lif_index = cpu_to_le16(lif->index), in ionic_lif_addr_add()
1254 int nfilters = le32_to_cpu(lif->identity->eth.max_ucast_filters); in ionic_lif_addr_add()
1261 spin_lock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1262 f = ionic_rx_filter_by_addr(lif, addr); in ionic_lif_addr_add()
1266 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1274 err = ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, 0, &ctx, in ionic_lif_addr_add()
1277 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1281 netdev_dbg(lif->netdev, "rx_filter add ADDR %pM\n", addr); in ionic_lif_addr_add()
1286 if ((lif->nucast + lif->nmcast) >= nfilters) in ionic_lif_addr_add()
1289 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_addr_add()
1291 spin_lock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1294 f = ionic_rx_filter_by_addr(lif, addr); in ionic_lif_addr_add()
1297 set_bit(IONIC_LIF_F_FILTER_SYNC_NEEDED, lif->state); in ionic_lif_addr_add()
1300 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1309 lif->nmcast++; in ionic_lif_addr_add()
1311 lif->nucast++; in ionic_lif_addr_add()
1313 f = ionic_rx_filter_by_addr(lif, addr); in ionic_lif_addr_add()
1320 err = ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, 0, &ctx, in ionic_lif_addr_add()
1323 err = ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, 0, &ctx, in ionic_lif_addr_add()
1327 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_add()
1332 int ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr) in ionic_lif_addr_del() argument
1338 .lif_index = cpu_to_le16(lif->index), in ionic_lif_addr_del()
1345 spin_lock_bh(&lif->rx_filters.lock); in ionic_lif_addr_del()
1346 f = ionic_rx_filter_by_addr(lif, addr); in ionic_lif_addr_del()
1348 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_del()
1352 netdev_dbg(lif->netdev, "rx_filter del ADDR %pM (id %d)\n", in ionic_lif_addr_del()
1357 ionic_rx_filter_free(lif, f); in ionic_lif_addr_del()
1359 if (is_multicast_ether_addr(addr) && lif->nmcast) in ionic_lif_addr_del()
1360 lif->nmcast--; in ionic_lif_addr_del()
1361 else if (!is_multicast_ether_addr(addr) && lif->nucast) in ionic_lif_addr_del()
1362 lif->nucast--; in ionic_lif_addr_del()
1364 spin_unlock_bh(&lif->rx_filters.lock); in ionic_lif_addr_del()
1367 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_addr_del()
1389 void ionic_lif_rx_mode(struct ionic_lif *lif) in ionic_lif_rx_mode() argument
1391 struct net_device *netdev = lif->netdev; in ionic_lif_rx_mode()
1399 mutex_lock(&lif->config_lock); in ionic_lif_rx_mode()
1411 ionic_rx_filter_sync(lif); in ionic_lif_rx_mode()
1419 nfilters = le32_to_cpu(lif->identity->eth.max_ucast_filters); in ionic_lif_rx_mode()
1420 if ((lif->nucast + lif->nmcast) >= nfilters) { in ionic_lif_rx_mode()
1423 lif->uc_overflow = true; in ionic_lif_rx_mode()
1424 lif->mc_overflow = true; in ionic_lif_rx_mode()
1425 } else if (lif->uc_overflow) { in ionic_lif_rx_mode()
1426 lif->uc_overflow = false; in ionic_lif_rx_mode()
1427 lif->mc_overflow = false; in ionic_lif_rx_mode()
1435 lif->rx_mode, rx_mode); in ionic_lif_rx_mode()
1448 netdev_dbg(netdev, "lif%d %s\n", lif->index, buf); in ionic_lif_rx_mode()
1450 if (lif->rx_mode != rx_mode) { in ionic_lif_rx_mode()
1455 .lif_index = cpu_to_le16(lif->index), in ionic_lif_rx_mode()
1461 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rx_mode()
1466 lif->rx_mode = rx_mode; in ionic_lif_rx_mode()
1469 mutex_unlock(&lif->config_lock); in ionic_lif_rx_mode()
1474 struct ionic_lif *lif = netdev_priv(netdev); in ionic_ndo_set_rx_mode() local
1486 netdev_err(lif->netdev, "rxmode change dropped\n"); in ionic_ndo_set_rx_mode()
1490 netdev_dbg(lif->netdev, "deferred: rx_mode\n"); in ionic_ndo_set_rx_mode()
1491 ionic_lif_deferred_enqueue(&lif->deferred, work); in ionic_ndo_set_rx_mode()
1534 static int ionic_set_nic_features(struct ionic_lif *lif, in ionic_set_nic_features() argument
1537 struct device *dev = lif->ionic->dev; in ionic_set_nic_features()
1542 .index = cpu_to_le16(lif->index), in ionic_set_nic_features()
1554 if (lif->phc) in ionic_set_nic_features()
1557 err = ionic_adminq_post_wait(lif, &ctx); in ionic_set_nic_features()
1561 old_hw_features = lif->hw_features; in ionic_set_nic_features()
1562 lif->hw_features = le64_to_cpu(ctx.cmd.lif_setattr.features & in ionic_set_nic_features()
1565 if ((old_hw_features ^ lif->hw_features) & IONIC_ETH_HW_RX_HASH) in ionic_set_nic_features()
1566 ionic_lif_rss_config(lif, lif->rss_types, NULL, NULL); in ionic_set_nic_features()
1570 dev_info_once(lif->ionic->dev, "NIC is not supporting vlan offload, likely in SmartNIC mode\n"); in ionic_set_nic_features()
1572 if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG) in ionic_set_nic_features()
1574 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP) in ionic_set_nic_features()
1576 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER) in ionic_set_nic_features()
1578 if (lif->hw_features & IONIC_ETH_HW_RX_HASH) in ionic_set_nic_features()
1580 if (lif->hw_features & IONIC_ETH_HW_TX_SG) in ionic_set_nic_features()
1582 if (lif->hw_features & IONIC_ETH_HW_TX_CSUM) in ionic_set_nic_features()
1584 if (lif->hw_features & IONIC_ETH_HW_RX_CSUM) in ionic_set_nic_features()
1586 if (lif->hw_features & IONIC_ETH_HW_TSO) in ionic_set_nic_features()
1588 if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6) in ionic_set_nic_features()
1590 if (lif->hw_features & IONIC_ETH_HW_TSO_ECN) in ionic_set_nic_features()
1592 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE) in ionic_set_nic_features()
1594 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM) in ionic_set_nic_features()
1596 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4) in ionic_set_nic_features()
1598 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6) in ionic_set_nic_features()
1600 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP) in ionic_set_nic_features()
1602 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM) in ionic_set_nic_features()
1604 if (lif->hw_features & IONIC_ETH_HW_TIMESTAMP) in ionic_set_nic_features()
1610 static int ionic_init_nic_features(struct ionic_lif *lif) in ionic_init_nic_features() argument
1612 struct net_device *netdev = lif->netdev; in ionic_init_nic_features()
1627 if (lif->nxqs > 1) in ionic_init_nic_features()
1630 err = ionic_set_nic_features(lif, features); in ionic_init_nic_features()
1637 if (lif->hw_features & IONIC_ETH_HW_VLAN_TX_TAG) in ionic_init_nic_features()
1639 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_STRIP) in ionic_init_nic_features()
1641 if (lif->hw_features & IONIC_ETH_HW_VLAN_RX_FILTER) in ionic_init_nic_features()
1643 if (lif->hw_features & IONIC_ETH_HW_RX_HASH) in ionic_init_nic_features()
1645 if (lif->hw_features & IONIC_ETH_HW_TX_SG) in ionic_init_nic_features()
1648 if (lif->hw_features & IONIC_ETH_HW_TX_CSUM) in ionic_init_nic_features()
1650 if (lif->hw_features & IONIC_ETH_HW_RX_CSUM) in ionic_init_nic_features()
1652 if (lif->hw_features & IONIC_ETH_HW_TSO) in ionic_init_nic_features()
1654 if (lif->hw_features & IONIC_ETH_HW_TSO_IPV6) in ionic_init_nic_features()
1656 if (lif->hw_features & IONIC_ETH_HW_TSO_ECN) in ionic_init_nic_features()
1658 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE) in ionic_init_nic_features()
1660 if (lif->hw_features & IONIC_ETH_HW_TSO_GRE_CSUM) in ionic_init_nic_features()
1662 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP4) in ionic_init_nic_features()
1664 if (lif->hw_features & IONIC_ETH_HW_TSO_IPXIP6) in ionic_init_nic_features()
1666 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP) in ionic_init_nic_features()
1668 if (lif->hw_features & IONIC_ETH_HW_TSO_UDP_CSUM) in ionic_init_nic_features()
1684 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_features() local
1688 __func__, (u64)lif->netdev->features, (u64)features); in ionic_set_features()
1690 err = ionic_set_nic_features(lif, features); in ionic_set_features()
1721 static void ionic_stop_queues_reconfig(struct ionic_lif *lif) in ionic_stop_queues_reconfig() argument
1724 netif_device_detach(lif->netdev); in ionic_stop_queues_reconfig()
1725 ionic_stop_queues(lif); in ionic_stop_queues_reconfig()
1726 ionic_txrx_deinit(lif); in ionic_stop_queues_reconfig()
1729 static int ionic_start_queues_reconfig(struct ionic_lif *lif) in ionic_start_queues_reconfig() argument
1741 err = ionic_txrx_init(lif); in ionic_start_queues_reconfig()
1742 ionic_link_status_check_request(lif, CAN_NOT_SLEEP); in ionic_start_queues_reconfig()
1743 netif_device_attach(lif->netdev); in ionic_start_queues_reconfig()
1750 struct ionic_lif *lif = netdev_priv(netdev); in ionic_change_mtu() local
1755 .index = cpu_to_le16(lif->index), in ionic_change_mtu()
1762 err = ionic_adminq_post_wait(lif, &ctx); in ionic_change_mtu()
1772 mutex_lock(&lif->queue_lock); in ionic_change_mtu()
1773 ionic_stop_queues_reconfig(lif); in ionic_change_mtu()
1775 err = ionic_start_queues_reconfig(lif); in ionic_change_mtu()
1776 mutex_unlock(&lif->queue_lock); in ionic_change_mtu()
1783 struct ionic_lif *lif = container_of(ws, struct ionic_lif, tx_timeout_work); in ionic_tx_timeout_work() local
1785 if (test_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_tx_timeout_work()
1791 if (!netif_running(lif->netdev)) in ionic_tx_timeout_work()
1794 mutex_lock(&lif->queue_lock); in ionic_tx_timeout_work()
1795 ionic_stop_queues_reconfig(lif); in ionic_tx_timeout_work()
1796 ionic_start_queues_reconfig(lif); in ionic_tx_timeout_work()
1797 mutex_unlock(&lif->queue_lock); in ionic_tx_timeout_work()
1802 struct ionic_lif *lif = netdev_priv(netdev); in ionic_tx_timeout() local
1804 netdev_info(lif->netdev, "Tx Timeout triggered - txq %d\n", txqueue); in ionic_tx_timeout()
1805 schedule_work(&lif->tx_timeout_work); in ionic_tx_timeout()
1811 struct ionic_lif *lif = netdev_priv(netdev); in ionic_vlan_rx_add_vid() local
1816 .lif_index = cpu_to_le16(lif->index), in ionic_vlan_rx_add_vid()
1824 err = ionic_adminq_post_wait(lif, &ctx); in ionic_vlan_rx_add_vid()
1828 spin_lock_bh(&lif->rx_filters.lock); in ionic_vlan_rx_add_vid()
1829 err = ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, 0, &ctx, in ionic_vlan_rx_add_vid()
1831 spin_unlock_bh(&lif->rx_filters.lock); in ionic_vlan_rx_add_vid()
1839 struct ionic_lif *lif = netdev_priv(netdev); in ionic_vlan_rx_kill_vid() local
1844 .lif_index = cpu_to_le16(lif->index), in ionic_vlan_rx_kill_vid()
1849 spin_lock_bh(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
1851 f = ionic_rx_filter_by_vlan(lif, vid); in ionic_vlan_rx_kill_vid()
1853 spin_unlock_bh(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
1861 ionic_rx_filter_free(lif, f); in ionic_vlan_rx_kill_vid()
1862 spin_unlock_bh(&lif->rx_filters.lock); in ionic_vlan_rx_kill_vid()
1864 return ionic_adminq_post_wait(lif, &ctx); in ionic_vlan_rx_kill_vid()
1867 int ionic_lif_rss_config(struct ionic_lif *lif, const u16 types, in ionic_lif_rss_config() argument
1875 .rss.addr = cpu_to_le64(lif->rss_ind_tbl_pa), in ionic_lif_rss_config()
1880 if (lif->hw_features & IONIC_ETH_HW_RX_HASH) { in ionic_lif_rss_config()
1881 lif->rss_types = types; in ionic_lif_rss_config()
1886 memcpy(lif->rss_hash_key, key, IONIC_RSS_HASH_KEY_SIZE); in ionic_lif_rss_config()
1889 tbl_sz = le16_to_cpu(lif->ionic->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_rss_config()
1891 lif->rss_ind_tbl[i] = indir[i]; in ionic_lif_rss_config()
1894 memcpy(ctx.cmd.lif_setattr.rss.key, lif->rss_hash_key, in ionic_lif_rss_config()
1897 return ionic_adminq_post_wait(lif, &ctx); in ionic_lif_rss_config()
1900 static int ionic_lif_rss_init(struct ionic_lif *lif) in ionic_lif_rss_init() argument
1905 lif->rss_types = IONIC_RSS_TYPE_IPV4 | in ionic_lif_rss_init()
1913 tbl_sz = le16_to_cpu(lif->ionic->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_rss_init()
1915 lif->rss_ind_tbl[i] = ethtool_rxfh_indir_default(i, lif->nxqs); in ionic_lif_rss_init()
1917 return ionic_lif_rss_config(lif, lif->rss_types, NULL, NULL); in ionic_lif_rss_init()
1920 static void ionic_lif_rss_deinit(struct ionic_lif *lif) in ionic_lif_rss_deinit() argument
1924 tbl_sz = le16_to_cpu(lif->ionic->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_rss_deinit()
1925 memset(lif->rss_ind_tbl, 0, tbl_sz); in ionic_lif_rss_deinit()
1926 memset(lif->rss_hash_key, 0, IONIC_RSS_HASH_KEY_SIZE); in ionic_lif_rss_deinit()
1928 ionic_lif_rss_config(lif, 0x0, NULL, NULL); in ionic_lif_rss_deinit()
1931 static void ionic_lif_quiesce(struct ionic_lif *lif) in ionic_lif_quiesce() argument
1937 .index = cpu_to_le16(lif->index), in ionic_lif_quiesce()
1944 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_quiesce()
1946 netdev_err(lif->netdev, "lif quiesce failed %d\n", err); in ionic_lif_quiesce()
1949 static void ionic_txrx_disable(struct ionic_lif *lif) in ionic_txrx_disable() argument
1954 if (lif->txqcqs) { in ionic_txrx_disable()
1955 for (i = 0; i < lif->nxqs; i++) in ionic_txrx_disable()
1956 err = ionic_qcq_disable(lif->txqcqs[i], (err != -ETIMEDOUT)); in ionic_txrx_disable()
1959 if (lif->hwstamp_txq) in ionic_txrx_disable()
1960 err = ionic_qcq_disable(lif->hwstamp_txq, (err != -ETIMEDOUT)); in ionic_txrx_disable()
1962 if (lif->rxqcqs) { in ionic_txrx_disable()
1963 for (i = 0; i < lif->nxqs; i++) in ionic_txrx_disable()
1964 err = ionic_qcq_disable(lif->rxqcqs[i], (err != -ETIMEDOUT)); in ionic_txrx_disable()
1967 if (lif->hwstamp_rxq) in ionic_txrx_disable()
1968 err = ionic_qcq_disable(lif->hwstamp_rxq, (err != -ETIMEDOUT)); in ionic_txrx_disable()
1970 ionic_lif_quiesce(lif); in ionic_txrx_disable()
1973 static void ionic_txrx_deinit(struct ionic_lif *lif) in ionic_txrx_deinit() argument
1977 if (lif->txqcqs) { in ionic_txrx_deinit()
1978 for (i = 0; i < lif->nxqs && lif->txqcqs[i]; i++) { in ionic_txrx_deinit()
1979 ionic_lif_qcq_deinit(lif, lif->txqcqs[i]); in ionic_txrx_deinit()
1980 ionic_tx_flush(&lif->txqcqs[i]->cq); in ionic_txrx_deinit()
1981 ionic_tx_empty(&lif->txqcqs[i]->q); in ionic_txrx_deinit()
1985 if (lif->rxqcqs) { in ionic_txrx_deinit()
1986 for (i = 0; i < lif->nxqs && lif->rxqcqs[i]; i++) { in ionic_txrx_deinit()
1987 ionic_lif_qcq_deinit(lif, lif->rxqcqs[i]); in ionic_txrx_deinit()
1988 ionic_rx_empty(&lif->rxqcqs[i]->q); in ionic_txrx_deinit()
1991 lif->rx_mode = 0; in ionic_txrx_deinit()
1993 if (lif->hwstamp_txq) { in ionic_txrx_deinit()
1994 ionic_lif_qcq_deinit(lif, lif->hwstamp_txq); in ionic_txrx_deinit()
1995 ionic_tx_flush(&lif->hwstamp_txq->cq); in ionic_txrx_deinit()
1996 ionic_tx_empty(&lif->hwstamp_txq->q); in ionic_txrx_deinit()
1999 if (lif->hwstamp_rxq) { in ionic_txrx_deinit()
2000 ionic_lif_qcq_deinit(lif, lif->hwstamp_rxq); in ionic_txrx_deinit()
2001 ionic_rx_empty(&lif->hwstamp_rxq->q); in ionic_txrx_deinit()
2005 static void ionic_txrx_free(struct ionic_lif *lif) in ionic_txrx_free() argument
2009 if (lif->txqcqs) { in ionic_txrx_free()
2010 for (i = 0; i < lif->ionic->ntxqs_per_lif && lif->txqcqs[i]; i++) { in ionic_txrx_free()
2011 ionic_qcq_free(lif, lif->txqcqs[i]); in ionic_txrx_free()
2012 devm_kfree(lif->ionic->dev, lif->txqcqs[i]); in ionic_txrx_free()
2013 lif->txqcqs[i] = NULL; in ionic_txrx_free()
2017 if (lif->rxqcqs) { in ionic_txrx_free()
2018 for (i = 0; i < lif->ionic->nrxqs_per_lif && lif->rxqcqs[i]; i++) { in ionic_txrx_free()
2019 ionic_qcq_free(lif, lif->rxqcqs[i]); in ionic_txrx_free()
2020 devm_kfree(lif->ionic->dev, lif->rxqcqs[i]); in ionic_txrx_free()
2021 lif->rxqcqs[i] = NULL; in ionic_txrx_free()
2025 if (lif->hwstamp_txq) { in ionic_txrx_free()
2026 ionic_qcq_free(lif, lif->hwstamp_txq); in ionic_txrx_free()
2027 devm_kfree(lif->ionic->dev, lif->hwstamp_txq); in ionic_txrx_free()
2028 lif->hwstamp_txq = NULL; in ionic_txrx_free()
2031 if (lif->hwstamp_rxq) { in ionic_txrx_free()
2032 ionic_qcq_free(lif, lif->hwstamp_rxq); in ionic_txrx_free()
2033 devm_kfree(lif->ionic->dev, lif->hwstamp_rxq); in ionic_txrx_free()
2034 lif->hwstamp_rxq = NULL; in ionic_txrx_free()
2038 static int ionic_txrx_alloc(struct ionic_lif *lif) in ionic_txrx_alloc() argument
2044 num_desc = lif->ntxq_descs; in ionic_txrx_alloc()
2048 if (lif->qtype_info[IONIC_QTYPE_TXQ].version >= 1 && in ionic_txrx_alloc()
2049 lif->qtype_info[IONIC_QTYPE_TXQ].sg_desc_sz == in ionic_txrx_alloc()
2056 if (test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state)) in ionic_txrx_alloc()
2058 for (i = 0; i < lif->nxqs; i++) { in ionic_txrx_alloc()
2059 err = ionic_qcq_alloc(lif, IONIC_QTYPE_TXQ, i, "tx", flags, in ionic_txrx_alloc()
2061 lif->kern_pid, &lif->txqcqs[i]); in ionic_txrx_alloc()
2066 ionic_intr_coal_init(lif->ionic->idev.intr_ctrl, in ionic_txrx_alloc()
2067 lif->txqcqs[i]->intr.index, in ionic_txrx_alloc()
2068 lif->tx_coalesce_hw); in ionic_txrx_alloc()
2069 if (test_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state)) in ionic_txrx_alloc()
2070 lif->txqcqs[i]->intr.dim_coal_hw = lif->tx_coalesce_hw; in ionic_txrx_alloc()
2073 ionic_debugfs_add_qcq(lif, lif->txqcqs[i]); in ionic_txrx_alloc()
2078 num_desc = lif->nrxq_descs; in ionic_txrx_alloc()
2083 if (lif->rxq_features & IONIC_Q_F_2X_CQ_DESC) in ionic_txrx_alloc()
2086 for (i = 0; i < lif->nxqs; i++) { in ionic_txrx_alloc()
2087 err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, i, "rx", flags, in ionic_txrx_alloc()
2089 lif->kern_pid, &lif->rxqcqs[i]); in ionic_txrx_alloc()
2093 lif->rxqcqs[i]->q.features = lif->rxq_features; in ionic_txrx_alloc()
2095 ionic_intr_coal_init(lif->ionic->idev.intr_ctrl, in ionic_txrx_alloc()
2096 lif->rxqcqs[i]->intr.index, in ionic_txrx_alloc()
2097 lif->rx_coalesce_hw); in ionic_txrx_alloc()
2098 if (test_bit(IONIC_LIF_F_RX_DIM_INTR, lif->state)) in ionic_txrx_alloc()
2099 lif->rxqcqs[i]->intr.dim_coal_hw = lif->rx_coalesce_hw; in ionic_txrx_alloc()
2101 if (!test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state)) in ionic_txrx_alloc()
2102 ionic_link_qcq_interrupts(lif->rxqcqs[i], in ionic_txrx_alloc()
2103 lif->txqcqs[i]); in ionic_txrx_alloc()
2105 ionic_debugfs_add_qcq(lif, lif->rxqcqs[i]); in ionic_txrx_alloc()
2111 ionic_txrx_free(lif); in ionic_txrx_alloc()
2116 static int ionic_txrx_init(struct ionic_lif *lif) in ionic_txrx_init() argument
2121 for (i = 0; i < lif->nxqs; i++) { in ionic_txrx_init()
2122 err = ionic_lif_txq_init(lif, lif->txqcqs[i]); in ionic_txrx_init()
2126 err = ionic_lif_rxq_init(lif, lif->rxqcqs[i]); in ionic_txrx_init()
2128 ionic_lif_qcq_deinit(lif, lif->txqcqs[i]); in ionic_txrx_init()
2133 if (lif->netdev->features & NETIF_F_RXHASH) in ionic_txrx_init()
2134 ionic_lif_rss_init(lif); in ionic_txrx_init()
2136 ionic_lif_rx_mode(lif); in ionic_txrx_init()
2142 ionic_lif_qcq_deinit(lif, lif->txqcqs[i]); in ionic_txrx_init()
2143 ionic_lif_qcq_deinit(lif, lif->rxqcqs[i]); in ionic_txrx_init()
2149 static int ionic_txrx_enable(struct ionic_lif *lif) in ionic_txrx_enable() argument
2154 for (i = 0; i < lif->nxqs; i++) { in ionic_txrx_enable()
2155 if (!(lif->rxqcqs[i] && lif->txqcqs[i])) { in ionic_txrx_enable()
2156 dev_err(lif->ionic->dev, "%s: bad qcq %d\n", __func__, i); in ionic_txrx_enable()
2161 ionic_rx_fill(&lif->rxqcqs[i]->q); in ionic_txrx_enable()
2162 err = ionic_qcq_enable(lif->rxqcqs[i]); in ionic_txrx_enable()
2166 err = ionic_qcq_enable(lif->txqcqs[i]); in ionic_txrx_enable()
2168 derr = ionic_qcq_disable(lif->rxqcqs[i], (err != -ETIMEDOUT)); in ionic_txrx_enable()
2173 if (lif->hwstamp_rxq) { in ionic_txrx_enable()
2174 ionic_rx_fill(&lif->hwstamp_rxq->q); in ionic_txrx_enable()
2175 err = ionic_qcq_enable(lif->hwstamp_rxq); in ionic_txrx_enable()
2180 if (lif->hwstamp_txq) { in ionic_txrx_enable()
2181 err = ionic_qcq_enable(lif->hwstamp_txq); in ionic_txrx_enable()
2189 if (lif->hwstamp_rxq) in ionic_txrx_enable()
2190 derr = ionic_qcq_disable(lif->hwstamp_rxq, (derr != -ETIMEDOUT)); in ionic_txrx_enable()
2192 i = lif->nxqs; in ionic_txrx_enable()
2195 derr = ionic_qcq_disable(lif->txqcqs[i], (derr != -ETIMEDOUT)); in ionic_txrx_enable()
2196 derr = ionic_qcq_disable(lif->rxqcqs[i], (derr != -ETIMEDOUT)); in ionic_txrx_enable()
2202 static int ionic_start_queues(struct ionic_lif *lif) in ionic_start_queues() argument
2206 if (test_bit(IONIC_LIF_F_BROKEN, lif->state)) in ionic_start_queues()
2209 if (test_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_start_queues()
2212 if (test_and_set_bit(IONIC_LIF_F_UP, lif->state)) in ionic_start_queues()
2215 err = ionic_txrx_enable(lif); in ionic_start_queues()
2217 clear_bit(IONIC_LIF_F_UP, lif->state); in ionic_start_queues()
2220 netif_tx_wake_all_queues(lif->netdev); in ionic_start_queues()
2227 struct ionic_lif *lif = netdev_priv(netdev); in ionic_open() local
2231 if (test_and_clear_bit(IONIC_LIF_F_BROKEN, lif->state)) in ionic_open()
2234 mutex_lock(&lif->queue_lock); in ionic_open()
2236 err = ionic_txrx_alloc(lif); in ionic_open()
2240 err = ionic_txrx_init(lif); in ionic_open()
2244 err = netif_set_real_num_tx_queues(netdev, lif->nxqs); in ionic_open()
2248 err = netif_set_real_num_rx_queues(netdev, lif->nxqs); in ionic_open()
2254 err = ionic_start_queues(lif); in ionic_open()
2262 ionic_lif_hwstamp_recreate_queues(lif); in ionic_open()
2264 mutex_unlock(&lif->queue_lock); in ionic_open()
2269 ionic_txrx_deinit(lif); in ionic_open()
2271 ionic_txrx_free(lif); in ionic_open()
2273 mutex_unlock(&lif->queue_lock); in ionic_open()
2277 static void ionic_stop_queues(struct ionic_lif *lif) in ionic_stop_queues() argument
2279 if (!test_and_clear_bit(IONIC_LIF_F_UP, lif->state)) in ionic_stop_queues()
2282 netif_tx_disable(lif->netdev); in ionic_stop_queues()
2283 ionic_txrx_disable(lif); in ionic_stop_queues()
2288 struct ionic_lif *lif = netdev_priv(netdev); in ionic_stop() local
2290 if (test_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_stop()
2293 mutex_lock(&lif->queue_lock); in ionic_stop()
2294 ionic_stop_queues(lif); in ionic_stop()
2295 ionic_txrx_deinit(lif); in ionic_stop()
2296 ionic_txrx_free(lif); in ionic_stop()
2297 mutex_unlock(&lif->queue_lock); in ionic_stop()
2304 struct ionic_lif *lif = netdev_priv(netdev); in ionic_eth_ioctl() local
2308 return ionic_lif_hwstamp_set(lif, ifr); in ionic_eth_ioctl()
2310 return ionic_lif_hwstamp_get(lif, ifr); in ionic_eth_ioctl()
2319 struct ionic_lif *lif = netdev_priv(netdev); in ionic_get_vf_config() local
2320 struct ionic *ionic = lif->ionic; in ionic_get_vf_config()
2348 struct ionic_lif *lif = netdev_priv(netdev); in ionic_get_vf_stats() local
2349 struct ionic *ionic = lif->ionic; in ionic_get_vf_stats()
2384 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_mac() local
2385 struct ionic *ionic = lif->ionic; in ionic_set_vf_mac()
2411 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_vlan() local
2412 struct ionic *ionic = lif->ionic; in ionic_set_vf_vlan()
2446 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_rate() local
2447 struct ionic *ionic = lif->ionic; in ionic_set_vf_rate()
2465 lif->ionic->vfs[vf].maxrate = cpu_to_le32(tx_max); in ionic_set_vf_rate()
2474 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_spoofchk() local
2475 struct ionic *ionic = lif->ionic; in ionic_set_vf_spoofchk()
2499 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_trust() local
2500 struct ionic *ionic = lif->ionic; in ionic_set_vf_trust()
2524 struct ionic_lif *lif = netdev_priv(netdev); in ionic_set_vf_link_state() local
2525 struct ionic *ionic = lif->ionic; in ionic_set_vf_link_state()
2615 ionic_debugfs_add_qcq(a->q.lif, a); in ionic_swap_queues()
2618 int ionic_reconfigure_queues(struct ionic_lif *lif, in ionic_reconfigure_queues() argument
2628 if (qparam->nxqs != lif->nxqs || qparam->ntxq_descs != lif->ntxq_descs) { in ionic_reconfigure_queues()
2629 tx_qcqs = devm_kcalloc(lif->ionic->dev, lif->ionic->ntxqs_per_lif, in ionic_reconfigure_queues()
2636 if (qparam->nxqs != lif->nxqs || in ionic_reconfigure_queues()
2637 qparam->nrxq_descs != lif->nrxq_descs || in ionic_reconfigure_queues()
2638 qparam->rxq_features != lif->rxq_features) { in ionic_reconfigure_queues()
2639 rx_qcqs = devm_kcalloc(lif->ionic->dev, lif->ionic->nrxqs_per_lif, in ionic_reconfigure_queues()
2655 if (lif->qtype_info[IONIC_QTYPE_TXQ].version >= 1 && in ionic_reconfigure_queues()
2656 lif->qtype_info[IONIC_QTYPE_TXQ].sg_desc_sz == in ionic_reconfigure_queues()
2663 flags = lif->txqcqs[i]->flags & ~IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2664 err = ionic_qcq_alloc(lif, IONIC_QTYPE_TXQ, i, "tx", flags, in ionic_reconfigure_queues()
2666 lif->kern_pid, &tx_qcqs[i]); in ionic_reconfigure_queues()
2682 flags = lif->rxqcqs[i]->flags & ~IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2683 err = ionic_qcq_alloc(lif, IONIC_QTYPE_RXQ, i, "rx", flags, in ionic_reconfigure_queues()
2685 lif->kern_pid, &rx_qcqs[i]); in ionic_reconfigure_queues()
2694 ionic_stop_queues_reconfig(lif); in ionic_reconfigure_queues()
2696 if (qparam->nxqs != lif->nxqs) { in ionic_reconfigure_queues()
2697 err = netif_set_real_num_tx_queues(lif->netdev, qparam->nxqs); in ionic_reconfigure_queues()
2700 err = netif_set_real_num_rx_queues(lif->netdev, qparam->nxqs); in ionic_reconfigure_queues()
2702 netif_set_real_num_tx_queues(lif->netdev, lif->nxqs); in ionic_reconfigure_queues()
2709 lif->ntxq_descs = qparam->ntxq_descs; in ionic_reconfigure_queues()
2711 ionic_swap_queues(lif->txqcqs[i], tx_qcqs[i]); in ionic_reconfigure_queues()
2715 lif->nrxq_descs = qparam->nrxq_descs; in ionic_reconfigure_queues()
2717 ionic_swap_queues(lif->rxqcqs[i], rx_qcqs[i]); in ionic_reconfigure_queues()
2721 if (qparam->intr_split != test_bit(IONIC_LIF_F_SPLIT_INTR, lif->state) || in ionic_reconfigure_queues()
2722 qparam->nxqs != lif->nxqs) { in ionic_reconfigure_queues()
2724 set_bit(IONIC_LIF_F_SPLIT_INTR, lif->state); in ionic_reconfigure_queues()
2726 clear_bit(IONIC_LIF_F_SPLIT_INTR, lif->state); in ionic_reconfigure_queues()
2727 lif->tx_coalesce_usecs = lif->rx_coalesce_usecs; in ionic_reconfigure_queues()
2728 lif->tx_coalesce_hw = lif->rx_coalesce_hw; in ionic_reconfigure_queues()
2732 for (i = 0; i < lif->ionic->ntxqs_per_lif; i++) { in ionic_reconfigure_queues()
2733 ionic_qcq_intr_free(lif, lif->txqcqs[i]); in ionic_reconfigure_queues()
2734 ionic_qcq_intr_free(lif, lif->rxqcqs[i]); in ionic_reconfigure_queues()
2739 lif->rxqcqs[i]->flags |= IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2740 err = ionic_alloc_qcq_interrupt(lif, lif->rxqcqs[i]); in ionic_reconfigure_queues()
2741 ionic_intr_coal_init(lif->ionic->idev.intr_ctrl, in ionic_reconfigure_queues()
2742 lif->rxqcqs[i]->intr.index, in ionic_reconfigure_queues()
2743 lif->rx_coalesce_hw); in ionic_reconfigure_queues()
2746 lif->txqcqs[i]->flags |= IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2747 err = ionic_alloc_qcq_interrupt(lif, lif->txqcqs[i]); in ionic_reconfigure_queues()
2748 ionic_intr_coal_init(lif->ionic->idev.intr_ctrl, in ionic_reconfigure_queues()
2749 lif->txqcqs[i]->intr.index, in ionic_reconfigure_queues()
2750 lif->tx_coalesce_hw); in ionic_reconfigure_queues()
2751 if (test_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state)) in ionic_reconfigure_queues()
2752 lif->txqcqs[i]->intr.dim_coal_hw = lif->tx_coalesce_hw; in ionic_reconfigure_queues()
2754 lif->txqcqs[i]->flags &= ~IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2755 ionic_link_qcq_interrupts(lif->rxqcqs[i], lif->txqcqs[i]); in ionic_reconfigure_queues()
2763 ionic_debugfs_del_qcq(lif->txqcqs[i]); in ionic_reconfigure_queues()
2764 ionic_debugfs_add_qcq(lif, lif->txqcqs[i]); in ionic_reconfigure_queues()
2770 ionic_debugfs_del_qcq(lif->rxqcqs[i]); in ionic_reconfigure_queues()
2771 ionic_debugfs_add_qcq(lif, lif->rxqcqs[i]); in ionic_reconfigure_queues()
2775 swap(lif->nxqs, qparam->nxqs); in ionic_reconfigure_queues()
2776 swap(lif->rxq_features, qparam->rxq_features); in ionic_reconfigure_queues()
2781 ionic_start_queues_reconfig(lif); in ionic_reconfigure_queues()
2783 err = ionic_start_queues_reconfig(lif); in ionic_reconfigure_queues()
2790 ionic_qcq_free(lif, tx_qcqs[i]); in ionic_reconfigure_queues()
2791 devm_kfree(lif->ionic->dev, tx_qcqs[i]); in ionic_reconfigure_queues()
2796 ionic_qcq_free(lif, rx_qcqs[i]); in ionic_reconfigure_queues()
2797 devm_kfree(lif->ionic->dev, rx_qcqs[i]); in ionic_reconfigure_queues()
2804 devm_kfree(lif->ionic->dev, rx_qcqs); in ionic_reconfigure_queues()
2808 devm_kfree(lif->ionic->dev, tx_qcqs); in ionic_reconfigure_queues()
2815 for (i = lif->nxqs; i < lif->ionic->ntxqs_per_lif; i++) { in ionic_reconfigure_queues()
2816 lif->txqcqs[i]->flags &= ~IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2817 ionic_qcq_free(lif, lif->txqcqs[i]); in ionic_reconfigure_queues()
2819 lif->rxqcqs[i]->flags &= ~IONIC_QCQ_F_INTR; in ionic_reconfigure_queues()
2820 ionic_qcq_free(lif, lif->rxqcqs[i]); in ionic_reconfigure_queues()
2824 netdev_info(lif->netdev, "%s: failed %d\n", __func__, err); in ionic_reconfigure_queues()
2834 struct ionic_lif *lif; in ionic_lif_alloc() local
2842 netdev = alloc_etherdev_mqs(sizeof(*lif), in ionic_lif_alloc()
2852 lif = netdev_priv(netdev); in ionic_lif_alloc()
2853 lif->netdev = netdev; in ionic_lif_alloc()
2854 ionic->lif = lif; in ionic_lif_alloc()
2861 lif->identity = lid; in ionic_lif_alloc()
2862 lif->lif_type = IONIC_LIF_TYPE_CLASSIC; in ionic_lif_alloc()
2863 err = ionic_lif_identify(ionic, lif->lif_type, lif->identity); in ionic_lif_alloc()
2866 lif->lif_type, err); in ionic_lif_alloc()
2869 lif->netdev->min_mtu = max_t(unsigned int, ETH_MIN_MTU, in ionic_lif_alloc()
2870 le32_to_cpu(lif->identity->eth.min_frame_size)); in ionic_lif_alloc()
2871 lif->netdev->max_mtu = in ionic_lif_alloc()
2872 le32_to_cpu(lif->identity->eth.max_frame_size) - ETH_HLEN - VLAN_HLEN; in ionic_lif_alloc()
2874 lif->neqs = ionic->neqs_per_lif; in ionic_lif_alloc()
2875 lif->nxqs = ionic->ntxqs_per_lif; in ionic_lif_alloc()
2877 lif->ionic = ionic; in ionic_lif_alloc()
2878 lif->index = 0; in ionic_lif_alloc()
2881 lif->ntxq_descs = IONIC_MIN_TXRX_DESC; in ionic_lif_alloc()
2882 lif->nrxq_descs = IONIC_MIN_TXRX_DESC; in ionic_lif_alloc()
2884 lif->ntxq_descs = IONIC_DEF_TXRX_DESC; in ionic_lif_alloc()
2885 lif->nrxq_descs = IONIC_DEF_TXRX_DESC; in ionic_lif_alloc()
2889 lif->rx_coalesce_usecs = IONIC_ITR_COAL_USEC_DEFAULT; in ionic_lif_alloc()
2890 lif->rx_coalesce_hw = ionic_coal_usec_to_hw(lif->ionic, in ionic_lif_alloc()
2891 lif->rx_coalesce_usecs); in ionic_lif_alloc()
2892 lif->tx_coalesce_usecs = lif->rx_coalesce_usecs; in ionic_lif_alloc()
2893 lif->tx_coalesce_hw = lif->rx_coalesce_hw; in ionic_lif_alloc()
2894 set_bit(IONIC_LIF_F_RX_DIM_INTR, lif->state); in ionic_lif_alloc()
2895 set_bit(IONIC_LIF_F_TX_DIM_INTR, lif->state); in ionic_lif_alloc()
2897 snprintf(lif->name, sizeof(lif->name), "lif%u", lif->index); in ionic_lif_alloc()
2899 spin_lock_init(&lif->adminq_lock); in ionic_lif_alloc()
2901 spin_lock_init(&lif->deferred.lock); in ionic_lif_alloc()
2902 INIT_LIST_HEAD(&lif->deferred.list); in ionic_lif_alloc()
2903 INIT_WORK(&lif->deferred.work, ionic_lif_deferred_work); in ionic_lif_alloc()
2906 lif->info_sz = ALIGN(sizeof(*lif->info), PAGE_SIZE); in ionic_lif_alloc()
2907 lif->info = dma_alloc_coherent(dev, lif->info_sz, in ionic_lif_alloc()
2908 &lif->info_pa, GFP_KERNEL); in ionic_lif_alloc()
2909 if (!lif->info) { in ionic_lif_alloc()
2915 ionic_debugfs_add_lif(lif); in ionic_lif_alloc()
2918 ionic_lif_queue_identify(lif); in ionic_lif_alloc()
2919 err = ionic_qcqs_alloc(lif); in ionic_lif_alloc()
2924 tbl_sz = le16_to_cpu(lif->ionic->ident.lif.eth.rss_ind_tbl_sz); in ionic_lif_alloc()
2925 lif->rss_ind_tbl_sz = sizeof(*lif->rss_ind_tbl) * tbl_sz; in ionic_lif_alloc()
2926 lif->rss_ind_tbl = dma_alloc_coherent(dev, lif->rss_ind_tbl_sz, in ionic_lif_alloc()
2927 &lif->rss_ind_tbl_pa, in ionic_lif_alloc()
2930 if (!lif->rss_ind_tbl) { in ionic_lif_alloc()
2935 netdev_rss_key_fill(lif->rss_hash_key, IONIC_RSS_HASH_KEY_SIZE); in ionic_lif_alloc()
2937 ionic_lif_alloc_phc(lif); in ionic_lif_alloc()
2942 ionic_qcqs_free(lif); in ionic_lif_alloc()
2944 dma_free_coherent(dev, lif->info_sz, lif->info, lif->info_pa); in ionic_lif_alloc()
2945 lif->info = NULL; in ionic_lif_alloc()
2946 lif->info_pa = 0; in ionic_lif_alloc()
2948 free_netdev(lif->netdev); in ionic_lif_alloc()
2949 lif = NULL; in ionic_lif_alloc()
2956 static void ionic_lif_reset(struct ionic_lif *lif) in ionic_lif_reset() argument
2958 struct ionic_dev *idev = &lif->ionic->idev; in ionic_lif_reset()
2960 mutex_lock(&lif->ionic->dev_cmd_lock); in ionic_lif_reset()
2961 ionic_dev_cmd_lif_reset(idev, lif->index); in ionic_lif_reset()
2962 ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT); in ionic_lif_reset()
2963 mutex_unlock(&lif->ionic->dev_cmd_lock); in ionic_lif_reset()
2966 static void ionic_lif_handle_fw_down(struct ionic_lif *lif) in ionic_lif_handle_fw_down() argument
2968 struct ionic *ionic = lif->ionic; in ionic_lif_handle_fw_down()
2970 if (test_and_set_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_lif_handle_fw_down()
2975 netif_device_detach(lif->netdev); in ionic_lif_handle_fw_down()
2977 if (test_bit(IONIC_LIF_F_UP, lif->state)) { in ionic_lif_handle_fw_down()
2979 mutex_lock(&lif->queue_lock); in ionic_lif_handle_fw_down()
2980 ionic_stop_queues(lif); in ionic_lif_handle_fw_down()
2981 mutex_unlock(&lif->queue_lock); in ionic_lif_handle_fw_down()
2984 if (netif_running(lif->netdev)) { in ionic_lif_handle_fw_down()
2985 ionic_txrx_deinit(lif); in ionic_lif_handle_fw_down()
2986 ionic_txrx_free(lif); in ionic_lif_handle_fw_down()
2988 ionic_lif_deinit(lif); in ionic_lif_handle_fw_down()
2990 ionic_qcqs_free(lif); in ionic_lif_handle_fw_down()
2995 static void ionic_lif_handle_fw_up(struct ionic_lif *lif) in ionic_lif_handle_fw_up() argument
2997 struct ionic *ionic = lif->ionic; in ionic_lif_handle_fw_up()
3000 if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_lif_handle_fw_up()
3015 err = ionic_qcqs_alloc(lif); in ionic_lif_handle_fw_up()
3019 err = ionic_lif_init(lif); in ionic_lif_handle_fw_up()
3023 if (lif->registered) in ionic_lif_handle_fw_up()
3024 ionic_lif_set_netdev_info(lif); in ionic_lif_handle_fw_up()
3026 ionic_rx_filter_replay(lif); in ionic_lif_handle_fw_up()
3028 if (netif_running(lif->netdev)) { in ionic_lif_handle_fw_up()
3029 err = ionic_txrx_alloc(lif); in ionic_lif_handle_fw_up()
3033 err = ionic_txrx_init(lif); in ionic_lif_handle_fw_up()
3038 clear_bit(IONIC_LIF_F_FW_RESET, lif->state); in ionic_lif_handle_fw_up()
3039 ionic_link_status_check_request(lif, CAN_SLEEP); in ionic_lif_handle_fw_up()
3040 netif_device_attach(lif->netdev); in ionic_lif_handle_fw_up()
3044 ionic_lif_hwstamp_replay(lif); in ionic_lif_handle_fw_up()
3049 ionic_txrx_free(lif); in ionic_lif_handle_fw_up()
3051 ionic_lif_deinit(lif); in ionic_lif_handle_fw_up()
3053 ionic_qcqs_free(lif); in ionic_lif_handle_fw_up()
3058 void ionic_lif_free(struct ionic_lif *lif) in ionic_lif_free() argument
3060 struct device *dev = lif->ionic->dev; in ionic_lif_free()
3062 ionic_lif_free_phc(lif); in ionic_lif_free()
3065 dma_free_coherent(dev, lif->rss_ind_tbl_sz, lif->rss_ind_tbl, in ionic_lif_free()
3066 lif->rss_ind_tbl_pa); in ionic_lif_free()
3067 lif->rss_ind_tbl = NULL; in ionic_lif_free()
3068 lif->rss_ind_tbl_pa = 0; in ionic_lif_free()
3071 ionic_qcqs_free(lif); in ionic_lif_free()
3072 if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) in ionic_lif_free()
3073 ionic_lif_reset(lif); in ionic_lif_free()
3076 kfree(lif->identity); in ionic_lif_free()
3077 dma_free_coherent(dev, lif->info_sz, lif->info, lif->info_pa); in ionic_lif_free()
3078 lif->info = NULL; in ionic_lif_free()
3079 lif->info_pa = 0; in ionic_lif_free()
3082 ionic_bus_unmap_dbpage(lif->ionic, lif->kern_dbpage); in ionic_lif_free()
3083 lif->kern_dbpage = NULL; in ionic_lif_free()
3084 kfree(lif->dbid_inuse); in ionic_lif_free()
3085 lif->dbid_inuse = NULL; in ionic_lif_free()
3088 ionic_debugfs_del_lif(lif); in ionic_lif_free()
3089 free_netdev(lif->netdev); in ionic_lif_free()
3092 void ionic_lif_deinit(struct ionic_lif *lif) in ionic_lif_deinit() argument
3094 if (!test_and_clear_bit(IONIC_LIF_F_INITED, lif->state)) in ionic_lif_deinit()
3097 if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) { in ionic_lif_deinit()
3098 cancel_work_sync(&lif->deferred.work); in ionic_lif_deinit()
3099 cancel_work_sync(&lif->tx_timeout_work); in ionic_lif_deinit()
3100 ionic_rx_filters_deinit(lif); in ionic_lif_deinit()
3101 if (lif->netdev->features & NETIF_F_RXHASH) in ionic_lif_deinit()
3102 ionic_lif_rss_deinit(lif); in ionic_lif_deinit()
3105 napi_disable(&lif->adminqcq->napi); in ionic_lif_deinit()
3106 ionic_lif_qcq_deinit(lif, lif->notifyqcq); in ionic_lif_deinit()
3107 ionic_lif_qcq_deinit(lif, lif->adminqcq); in ionic_lif_deinit()
3109 mutex_destroy(&lif->config_lock); in ionic_lif_deinit()
3110 mutex_destroy(&lif->queue_lock); in ionic_lif_deinit()
3111 ionic_lif_reset(lif); in ionic_lif_deinit()
3114 static int ionic_lif_adminq_init(struct ionic_lif *lif) in ionic_lif_adminq_init() argument
3116 struct device *dev = lif->ionic->dev; in ionic_lif_adminq_init()
3123 idev = &lif->ionic->idev; in ionic_lif_adminq_init()
3124 qcq = lif->adminqcq; in ionic_lif_adminq_init()
3127 mutex_lock(&lif->ionic->dev_cmd_lock); in ionic_lif_adminq_init()
3128 ionic_dev_cmd_adminq_init(idev, qcq, lif->index, qcq->intr.index); in ionic_lif_adminq_init()
3129 err = ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT); in ionic_lif_adminq_init()
3131 mutex_unlock(&lif->ionic->dev_cmd_lock); in ionic_lif_adminq_init()
3133 netdev_err(lif->netdev, "adminq init failed %d\n", err); in ionic_lif_adminq_init()
3144 netif_napi_add(lif->netdev, &qcq->napi, ionic_adminq_napi, in ionic_lif_adminq_init()
3158 static int ionic_lif_notifyq_init(struct ionic_lif *lif) in ionic_lif_notifyq_init() argument
3160 struct ionic_qcq *qcq = lif->notifyqcq; in ionic_lif_notifyq_init()
3161 struct device *dev = lif->ionic->dev; in ionic_lif_notifyq_init()
3169 .lif_index = cpu_to_le16(lif->index), in ionic_lif_notifyq_init()
3171 .ver = lif->qtype_info[q->type].version, in ionic_lif_notifyq_init()
3175 .intr_index = cpu_to_le16(lif->adminqcq->intr.index), in ionic_lif_notifyq_init()
3187 err = ionic_adminq_post_wait(lif, &ctx); in ionic_lif_notifyq_init()
3191 lif->last_eid = 0; in ionic_lif_notifyq_init()
3200 q->info[0].cb_arg = lif; in ionic_lif_notifyq_init()
3207 static int ionic_station_set(struct ionic_lif *lif) in ionic_station_set() argument
3209 struct net_device *netdev = lif->netdev; in ionic_station_set()
3214 .index = cpu_to_le16(lif->index), in ionic_station_set()
3221 err = ionic_adminq_post_wait(lif, &ctx); in ionic_station_set()
3224 netdev_dbg(lif->netdev, "found initial MAC addr %pM\n", in ionic_station_set()
3237 ionic_lif_addr_add(lif, netdev->dev_addr); in ionic_station_set()
3244 netdev_warn(lif->netdev, "ignoring bad MAC addr from NIC %pM - err %d\n", in ionic_station_set()
3252 netdev_dbg(lif->netdev, "adding station MAC addr %pM\n", in ionic_station_set()
3254 ionic_lif_addr_add(lif, netdev->dev_addr); in ionic_station_set()
3259 int ionic_lif_init(struct ionic_lif *lif) in ionic_lif_init() argument
3261 struct ionic_dev *idev = &lif->ionic->idev; in ionic_lif_init()
3262 struct device *dev = lif->ionic->dev; in ionic_lif_init()
3267 mutex_lock(&lif->ionic->dev_cmd_lock); in ionic_lif_init()
3268 ionic_dev_cmd_lif_init(idev, lif->index, lif->info_pa); in ionic_lif_init()
3269 err = ionic_dev_cmd_wait(lif->ionic, DEVCMD_TIMEOUT); in ionic_lif_init()
3271 mutex_unlock(&lif->ionic->dev_cmd_lock); in ionic_lif_init()
3275 lif->hw_index = le16_to_cpu(comp.hw_index); in ionic_lif_init()
3276 mutex_init(&lif->queue_lock); in ionic_lif_init()
3277 mutex_init(&lif->config_lock); in ionic_lif_init()
3280 lif->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif); in ionic_lif_init()
3281 if (!lif->dbid_count) { in ionic_lif_init()
3286 lif->dbid_inuse = bitmap_alloc(lif->dbid_count, GFP_KERNEL); in ionic_lif_init()
3287 if (!lif->dbid_inuse) { in ionic_lif_init()
3293 set_bit(0, lif->dbid_inuse); in ionic_lif_init()
3294 lif->kern_pid = 0; in ionic_lif_init()
3296 dbpage_num = ionic_db_page_num(lif, lif->kern_pid); in ionic_lif_init()
3297 lif->kern_dbpage = ionic_bus_map_dbpage(lif->ionic, dbpage_num); in ionic_lif_init()
3298 if (!lif->kern_dbpage) { in ionic_lif_init()
3304 err = ionic_lif_adminq_init(lif); in ionic_lif_init()
3308 if (lif->ionic->nnqs_per_lif) { in ionic_lif_init()
3309 err = ionic_lif_notifyq_init(lif); in ionic_lif_init()
3314 err = ionic_init_nic_features(lif); in ionic_lif_init()
3318 if (!test_bit(IONIC_LIF_F_FW_RESET, lif->state)) { in ionic_lif_init()
3319 err = ionic_rx_filters_init(lif); in ionic_lif_init()
3324 err = ionic_station_set(lif); in ionic_lif_init()
3328 lif->rx_copybreak = IONIC_RX_COPYBREAK_DEFAULT; in ionic_lif_init()
3330 set_bit(IONIC_LIF_F_INITED, lif->state); in ionic_lif_init()
3332 INIT_WORK(&lif->tx_timeout_work, ionic_tx_timeout_work); in ionic_lif_init()
3337 ionic_lif_qcq_deinit(lif, lif->notifyqcq); in ionic_lif_init()
3339 ionic_lif_qcq_deinit(lif, lif->adminqcq); in ionic_lif_init()
3340 ionic_lif_reset(lif); in ionic_lif_init()
3341 ionic_bus_unmap_dbpage(lif->ionic, lif->kern_dbpage); in ionic_lif_init()
3342 lif->kern_dbpage = NULL; in ionic_lif_init()
3344 kfree(lif->dbid_inuse); in ionic_lif_init()
3345 lif->dbid_inuse = NULL; in ionic_lif_init()
3354 static void ionic_lif_set_netdev_info(struct ionic_lif *lif) in ionic_lif_set_netdev_info() argument
3360 .index = cpu_to_le16(lif->index), in ionic_lif_set_netdev_info()
3365 strlcpy(ctx.cmd.lif_setattr.name, lif->netdev->name, in ionic_lif_set_netdev_info()
3368 ionic_adminq_post_wait(lif, &ctx); in ionic_lif_set_netdev_info()
3384 struct ionic_lif *lif = ionic_netdev_lif(ndev); in ionic_lif_notify() local
3386 if (!lif || lif->ionic != ionic) in ionic_lif_notify()
3391 ionic_lif_set_netdev_info(lif); in ionic_lif_notify()
3398 int ionic_lif_register(struct ionic_lif *lif) in ionic_lif_register() argument
3402 ionic_lif_register_phc(lif); in ionic_lif_register()
3404 INIT_WORK(&lif->ionic->nb_work, ionic_lif_notify_work); in ionic_lif_register()
3406 lif->ionic->nb.notifier_call = ionic_lif_notify; in ionic_lif_register()
3408 err = register_netdevice_notifier(&lif->ionic->nb); in ionic_lif_register()
3410 lif->ionic->nb.notifier_call = NULL; in ionic_lif_register()
3413 err = register_netdev(lif->netdev); in ionic_lif_register()
3415 dev_err(lif->ionic->dev, "Cannot register net device, aborting\n"); in ionic_lif_register()
3416 ionic_lif_unregister_phc(lif); in ionic_lif_register()
3420 ionic_link_status_check_request(lif, CAN_SLEEP); in ionic_lif_register()
3421 lif->registered = true; in ionic_lif_register()
3422 ionic_lif_set_netdev_info(lif); in ionic_lif_register()
3427 void ionic_lif_unregister(struct ionic_lif *lif) in ionic_lif_unregister() argument
3429 if (lif->ionic->nb.notifier_call) { in ionic_lif_unregister()
3430 unregister_netdevice_notifier(&lif->ionic->nb); in ionic_lif_unregister()
3431 cancel_work_sync(&lif->ionic->nb_work); in ionic_lif_unregister()
3432 lif->ionic->nb.notifier_call = NULL; in ionic_lif_unregister()
3435 if (lif->netdev->reg_state == NETREG_REGISTERED) in ionic_lif_unregister()
3436 unregister_netdev(lif->netdev); in ionic_lif_unregister()
3438 ionic_lif_unregister_phc(lif); in ionic_lif_unregister()
3440 lif->registered = false; in ionic_lif_unregister()
3443 static void ionic_lif_queue_identify(struct ionic_lif *lif) in ionic_lif_queue_identify() argument
3446 struct ionic *ionic = lif->ionic; in ionic_lif_queue_identify()
3451 idev = &lif->ionic->idev; in ionic_lif_queue_identify()
3455 struct ionic_qtype_info *qti = &lif->qtype_info[qtype]; in ionic_lif_queue_identify()
3471 ionic_dev_cmd_queue_identify(idev, lif->lif_type, qtype, in ionic_lif_queue_identify()
3573 lc = &ident->lif.eth.config; in ionic_lif_size()
3575 neqs_per_lif = le32_to_cpu(ident->lif.rdma.eq_qtype.qid_count); in ionic_lif_size()