Lines Matching refs:qcq

53 	struct ionic_qcq *qcq;  in ionic_dim_work()  local
57 qcq = container_of(dim, struct ionic_qcq, dim); in ionic_dim_work()
58 new_coal = ionic_coal_usec_to_hw(qcq->q.lif->ionic, cur_moder.usec); in ionic_dim_work()
61 if (qcq->intr.dim_coal_hw != new_coal) { in ionic_dim_work()
62 unsigned int qi = qcq->cq.bound_q->index; in ionic_dim_work()
63 struct ionic_lif *lif = qcq->q.lif; in ionic_dim_work()
65 qcq->intr.dim_coal_hw = new_coal; in ionic_dim_work()
69 qcq->intr.dim_coal_hw); in ionic_dim_work()
209 struct ionic_qcq *qcq = container_of(timer, struct ionic_qcq, napi_deadline); in ionic_napi_deadline() local
211 napi_schedule(&qcq->napi); in ionic_napi_deadline()
223 static int ionic_request_irq(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_request_irq() argument
225 struct ionic_intr_info *intr = &qcq->intr; in ionic_request_irq()
227 struct ionic_queue *q = &qcq->q; in ionic_request_irq()
239 0, intr->name, &qcq->napi); in ionic_request_irq()
266 static int ionic_qcq_enable(struct ionic_qcq *qcq) in ionic_qcq_enable() argument
268 struct ionic_queue *q = &qcq->q; in ionic_qcq_enable()
291 if (qcq->flags & IONIC_QCQ_F_INTR) in ionic_qcq_enable()
292 ionic_intr_clean(idev->intr_ctrl, qcq->intr.index); in ionic_qcq_enable()
298 if (qcq->napi.poll) in ionic_qcq_enable()
299 napi_enable(&qcq->napi); in ionic_qcq_enable()
301 if (qcq->flags & IONIC_QCQ_F_INTR) { in ionic_qcq_enable()
302 irq_set_affinity_hint(qcq->intr.vector, in ionic_qcq_enable()
303 &qcq->intr.affinity_mask); in ionic_qcq_enable()
304 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, in ionic_qcq_enable()
311 static int ionic_qcq_disable(struct ionic_lif *lif, struct ionic_qcq *qcq, int fw_err) in ionic_qcq_disable() argument
323 if (!qcq) { in ionic_qcq_disable()
328 q = &qcq->q; in ionic_qcq_disable()
330 if (qcq->flags & IONIC_QCQ_F_INTR) { in ionic_qcq_disable()
333 cancel_work_sync(&qcq->dim.work); in ionic_qcq_disable()
334 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, in ionic_qcq_disable()
336 synchronize_irq(qcq->intr.vector); in ionic_qcq_disable()
337 irq_set_affinity_hint(qcq->intr.vector, NULL); in ionic_qcq_disable()
338 napi_disable(&qcq->napi); in ionic_qcq_disable()
339 del_timer_sync(&qcq->napi_deadline); in ionic_qcq_disable()
357 static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_qcq_deinit() argument
361 if (!qcq) in ionic_lif_qcq_deinit()
364 if (!(qcq->flags & IONIC_QCQ_F_INITED)) in ionic_lif_qcq_deinit()
367 if (qcq->flags & IONIC_QCQ_F_INTR) { in ionic_lif_qcq_deinit()
368 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, in ionic_lif_qcq_deinit()
370 netif_napi_del(&qcq->napi); in ionic_lif_qcq_deinit()
373 qcq->flags &= ~IONIC_QCQ_F_INITED; in ionic_lif_qcq_deinit()
376 static void ionic_qcq_intr_free(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_qcq_intr_free() argument
378 if (!(qcq->flags & IONIC_QCQ_F_INTR) || qcq->intr.vector == 0) in ionic_qcq_intr_free()
381 irq_set_affinity_hint(qcq->intr.vector, NULL); in ionic_qcq_intr_free()
382 devm_free_irq(lif->ionic->dev, qcq->intr.vector, &qcq->napi); in ionic_qcq_intr_free()
383 qcq->intr.vector = 0; in ionic_qcq_intr_free()
384 ionic_intr_free(lif->ionic, qcq->intr.index); in ionic_qcq_intr_free()
385 qcq->intr.index = IONIC_INTR_INDEX_NOT_ASSIGNED; in ionic_qcq_intr_free()
388 static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_qcq_free() argument
392 if (!qcq) in ionic_qcq_free()
395 ionic_debugfs_del_qcq(qcq); in ionic_qcq_free()
397 if (qcq->q_base) { in ionic_qcq_free()
398 dma_free_coherent(dev, qcq->q_size, qcq->q_base, qcq->q_base_pa); in ionic_qcq_free()
399 qcq->q_base = NULL; in ionic_qcq_free()
400 qcq->q_base_pa = 0; in ionic_qcq_free()
403 if (qcq->cmb_q_base) { in ionic_qcq_free()
404 iounmap(qcq->cmb_q_base); in ionic_qcq_free()
405 ionic_put_cmb(lif, qcq->cmb_pgid, qcq->cmb_order); in ionic_qcq_free()
406 qcq->cmb_pgid = 0; in ionic_qcq_free()
407 qcq->cmb_order = 0; in ionic_qcq_free()
408 qcq->cmb_q_base = NULL; in ionic_qcq_free()
409 qcq->cmb_q_base_pa = 0; in ionic_qcq_free()
412 if (qcq->cq_base) { in ionic_qcq_free()
413 dma_free_coherent(dev, qcq->cq_size, qcq->cq_base, qcq->cq_base_pa); in ionic_qcq_free()
414 qcq->cq_base = NULL; in ionic_qcq_free()
415 qcq->cq_base_pa = 0; in ionic_qcq_free()
418 if (qcq->sg_base) { in ionic_qcq_free()
419 dma_free_coherent(dev, qcq->sg_size, qcq->sg_base, qcq->sg_base_pa); in ionic_qcq_free()
420 qcq->sg_base = NULL; in ionic_qcq_free()
421 qcq->sg_base_pa = 0; in ionic_qcq_free()
424 ionic_qcq_intr_free(lif, qcq); in ionic_qcq_free()
426 if (qcq->cq.info) { in ionic_qcq_free()
427 vfree(qcq->cq.info); in ionic_qcq_free()
428 qcq->cq.info = NULL; in ionic_qcq_free()
430 if (qcq->q.info) { in ionic_qcq_free()
431 vfree(qcq->q.info); in ionic_qcq_free()
432 qcq->q.info = NULL; in ionic_qcq_free()
487 static int ionic_alloc_qcq_interrupt(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_alloc_qcq_interrupt() argument
491 if (!(qcq->flags & IONIC_QCQ_F_INTR)) { in ionic_alloc_qcq_interrupt()
492 qcq->intr.index = IONIC_INTR_INDEX_NOT_ASSIGNED; in ionic_alloc_qcq_interrupt()
496 err = ionic_intr_alloc(lif, &qcq->intr); in ionic_alloc_qcq_interrupt()
499 qcq->q.name, err); in ionic_alloc_qcq_interrupt()
503 err = ionic_bus_get_irq(lif->ionic, qcq->intr.index); in ionic_alloc_qcq_interrupt()
506 qcq->q.name, err); in ionic_alloc_qcq_interrupt()
509 qcq->intr.vector = err; in ionic_alloc_qcq_interrupt()
510 ionic_intr_mask_assert(lif->ionic->idev.intr_ctrl, qcq->intr.index, in ionic_alloc_qcq_interrupt()
513 err = ionic_request_irq(lif, qcq); in ionic_alloc_qcq_interrupt()
520 qcq->intr.cpu = cpumask_local_spread(qcq->intr.index, in ionic_alloc_qcq_interrupt()
522 if (qcq->intr.cpu != -1) in ionic_alloc_qcq_interrupt()
523 cpumask_set_cpu(qcq->intr.cpu, &qcq->intr.affinity_mask); in ionic_alloc_qcq_interrupt()
525 netdev_dbg(lif->netdev, "%s: Interrupt index %d\n", qcq->q.name, qcq->intr.index); in ionic_alloc_qcq_interrupt()
529 ionic_intr_free(lif->ionic, qcq->intr.index); in ionic_alloc_qcq_interrupt()
540 unsigned int pid, struct ionic_qcq **qcq) in ionic_qcq_alloc() argument
551 *qcq = NULL; in ionic_qcq_alloc()
694 *qcq = new; in ionic_qcq_alloc()
779 static void ionic_qcq_sanitize(struct ionic_qcq *qcq) in ionic_qcq_sanitize() argument
781 qcq->q.tail_idx = 0; in ionic_qcq_sanitize()
782 qcq->q.head_idx = 0; in ionic_qcq_sanitize()
783 qcq->cq.tail_idx = 0; in ionic_qcq_sanitize()
784 qcq->cq.done_color = 1; in ionic_qcq_sanitize()
785 memset(qcq->q_base, 0, qcq->q_size); in ionic_qcq_sanitize()
786 if (qcq->cmb_q_base) in ionic_qcq_sanitize()
787 memset_io(qcq->cmb_q_base, 0, qcq->cmb_q_size); in ionic_qcq_sanitize()
788 memset(qcq->cq_base, 0, qcq->cq_size); in ionic_qcq_sanitize()
789 memset(qcq->sg_base, 0, qcq->sg_size); in ionic_qcq_sanitize()
792 static int ionic_lif_txq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_txq_init() argument
795 struct ionic_queue *q = &qcq->q; in ionic_lif_txq_init()
796 struct ionic_cq *cq = &qcq->cq; in ionic_lif_txq_init()
807 .intr_index = cpu_to_le16(qcq->intr.index), in ionic_lif_txq_init()
818 if (qcq->flags & IONIC_QCQ_F_CMB_RINGS) { in ionic_lif_txq_init()
820 ctx.cmd.q_init.ring_base = cpu_to_le64(qcq->cmb_q_base_pa); in ionic_lif_txq_init()
833 ionic_qcq_sanitize(qcq); in ionic_lif_txq_init()
850 netif_napi_add(lif->netdev, &qcq->napi, ionic_tx_napi); in ionic_lif_txq_init()
851 qcq->napi_qcq = qcq; in ionic_lif_txq_init()
852 timer_setup(&qcq->napi_deadline, ionic_napi_deadline, 0); in ionic_lif_txq_init()
855 qcq->flags |= IONIC_QCQ_F_INITED; in ionic_lif_txq_init()
860 static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq) in ionic_lif_rxq_init() argument
863 struct ionic_queue *q = &qcq->q; in ionic_lif_rxq_init()
864 struct ionic_cq *cq = &qcq->cq; in ionic_lif_rxq_init()
886 if (qcq->flags & IONIC_QCQ_F_CMB_RINGS) { in ionic_lif_rxq_init()
888 ctx.cmd.q_init.ring_base = cpu_to_le64(qcq->cmb_q_base_pa); in ionic_lif_rxq_init()
899 ionic_qcq_sanitize(qcq); in ionic_lif_rxq_init()
916 netif_napi_add(lif->netdev, &qcq->napi, ionic_rx_napi); in ionic_lif_rxq_init()
918 netif_napi_add(lif->netdev, &qcq->napi, ionic_txrx_napi); in ionic_lif_rxq_init()
920 qcq->napi_qcq = qcq; in ionic_lif_rxq_init()
921 timer_setup(&qcq->napi_deadline, ionic_napi_deadline, 0); in ionic_lif_rxq_init()
923 qcq->flags |= IONIC_QCQ_F_INITED; in ionic_lif_rxq_init()
3408 struct ionic_qcq *qcq; in ionic_lif_adminq_init() local
3413 qcq = lif->adminqcq; in ionic_lif_adminq_init()
3414 q = &qcq->q; in ionic_lif_adminq_init()
3417 ionic_dev_cmd_adminq_init(idev, qcq, lif->index, qcq->intr.index); in ionic_lif_adminq_init()
3436 netif_napi_add(lif->netdev, &qcq->napi, ionic_adminq_napi); in ionic_lif_adminq_init()
3438 qcq->napi_qcq = qcq; in ionic_lif_adminq_init()
3439 timer_setup(&qcq->napi_deadline, ionic_napi_deadline, 0); in ionic_lif_adminq_init()
3441 napi_enable(&qcq->napi); in ionic_lif_adminq_init()
3443 if (qcq->flags & IONIC_QCQ_F_INTR) in ionic_lif_adminq_init()
3444 ionic_intr_mask(idev->intr_ctrl, qcq->intr.index, in ionic_lif_adminq_init()
3447 qcq->flags |= IONIC_QCQ_F_INITED; in ionic_lif_adminq_init()
3454 struct ionic_qcq *qcq = lif->notifyqcq; in ionic_lif_notifyq_init() local
3456 struct ionic_queue *q = &qcq->q; in ionic_lif_notifyq_init()
3496 qcq->flags |= IONIC_QCQ_F_INITED; in ionic_lif_notifyq_init()