Lines Matching refs:eq

97 static void eq_set_ci(struct mlx4_eq *eq, int req_not)  in eq_set_ci()  argument
99 __raw_writel((__force u32) cpu_to_be32((eq->cons_index & 0xffffff) | in eq_set_ci()
101 eq->doorbell); in eq_set_ci()
106 static struct mlx4_eqe *get_eqe(struct mlx4_eq *eq, u32 entry, u8 eqe_factor, in get_eqe() argument
110 unsigned long offset = (entry & (eq->nent - 1)) * eqe_size; in get_eqe()
118 …return eq->page_list[offset / PAGE_SIZE].buf + (offset + (eqe_factor ? MLX4_EQ_ENTRY_SIZE : 0)) % … in get_eqe()
121 static struct mlx4_eqe *next_eqe_sw(struct mlx4_eq *eq, u8 eqe_factor, u8 size) in next_eqe_sw() argument
123 struct mlx4_eqe *eqe = get_eqe(eq, eq->cons_index, eqe_factor, size); in next_eqe_sw()
124 return !!(eqe->owner & 0x80) ^ !!(eq->cons_index & eq->nent) ? NULL : eqe; in next_eqe_sw()
453 static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) in mlx4_eq_int() argument
471 while ((eqe = next_eqe_sw(eq, dev->caps.eqe_factor, eqe_size))) { in mlx4_eq_int()
502 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
530 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
642 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
658 mlx4_warn(dev, "EQ overrun on EQN %d\n", eq->eqn); in mlx4_eq_int()
726 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
727 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
730 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
751 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
752 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
754 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
763 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
764 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
767 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
771 ++eq->cons_index; in mlx4_eq_int()
783 eq_set_ci(eq, 0); in mlx4_eq_int()
788 eq_set_ci(eq, 1); in mlx4_eq_int()
795 tasklet_schedule(&eq->tasklet_ctx.task); in mlx4_eq_int()
810 work |= mlx4_eq_int(dev, &priv->eq_table.eq[i]); in mlx4_interrupt()
817 struct mlx4_eq *eq = eq_ptr; in mlx4_msi_x_interrupt() local
818 struct mlx4_dev *dev = eq->dev; in mlx4_msi_x_interrupt()
820 mlx4_eq_int(dev, eq); in mlx4_msi_x_interrupt()
886 static void __iomem *mlx4_get_eq_uar(struct mlx4_dev *dev, struct mlx4_eq *eq) in mlx4_get_eq_uar() argument
891 index = eq->eqn / 4 - dev->caps.reserved_eqs / 4; in mlx4_get_eq_uar()
896 ((eq->eqn / 4) << PAGE_SHIFT), in mlx4_get_eq_uar()
900 eq->eqn); in mlx4_get_eq_uar()
905 return priv->eq_table.uar_map[index] + 0x800 + 8 * (eq->eqn % 4); in mlx4_get_eq_uar()
921 u8 intr, struct mlx4_eq *eq) in mlx4_create_eq() argument
933 eq->dev = dev; in mlx4_create_eq()
934 eq->nent = roundup_pow_of_two(max(nent, 2)); in mlx4_create_eq()
938 npages = PAGE_ALIGN(eq->nent * dev->caps.eqe_size) / PAGE_SIZE; in mlx4_create_eq()
940 eq->page_list = kmalloc(npages * sizeof *eq->page_list, in mlx4_create_eq()
942 if (!eq->page_list) in mlx4_create_eq()
946 eq->page_list[i].buf = NULL; in mlx4_create_eq()
958 eq->page_list[i].buf = dma_alloc_coherent(&dev->persist-> in mlx4_create_eq()
962 if (!eq->page_list[i].buf) in mlx4_create_eq()
966 eq->page_list[i].map = t; in mlx4_create_eq()
968 memset(eq->page_list[i].buf, 0, PAGE_SIZE); in mlx4_create_eq()
971 eq->eqn = mlx4_bitmap_alloc(&priv->eq_table.bitmap); in mlx4_create_eq()
972 if (eq->eqn == -1) in mlx4_create_eq()
975 eq->doorbell = mlx4_get_eq_uar(dev, eq); in mlx4_create_eq()
976 if (!eq->doorbell) { in mlx4_create_eq()
981 err = mlx4_mtt_init(dev, npages, PAGE_SHIFT, &eq->mtt); in mlx4_create_eq()
985 err = mlx4_write_mtt(dev, &eq->mtt, 0, npages, dma_list); in mlx4_create_eq()
991 eq_context->log_eq_size = ilog2(eq->nent); in mlx4_create_eq()
995 mtt_addr = mlx4_mtt_addr(dev, &eq->mtt); in mlx4_create_eq()
999 err = mlx4_SW2HW_EQ(dev, mailbox, eq->eqn); in mlx4_create_eq()
1008 eq->cons_index = 0; in mlx4_create_eq()
1010 INIT_LIST_HEAD(&eq->tasklet_ctx.list); in mlx4_create_eq()
1011 INIT_LIST_HEAD(&eq->tasklet_ctx.process_list); in mlx4_create_eq()
1012 spin_lock_init(&eq->tasklet_ctx.lock); in mlx4_create_eq()
1013 tasklet_init(&eq->tasklet_ctx.task, mlx4_cq_tasklet_cb, in mlx4_create_eq()
1014 (unsigned long)&eq->tasklet_ctx); in mlx4_create_eq()
1019 mlx4_mtt_cleanup(dev, &eq->mtt); in mlx4_create_eq()
1022 mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR); in mlx4_create_eq()
1026 if (eq->page_list[i].buf) in mlx4_create_eq()
1028 eq->page_list[i].buf, in mlx4_create_eq()
1029 eq->page_list[i].map); in mlx4_create_eq()
1034 kfree(eq->page_list); in mlx4_create_eq()
1042 struct mlx4_eq *eq) in mlx4_free_eq() argument
1050 int npages = PAGE_ALIGN(dev->caps.eqe_size * eq->nent) / PAGE_SIZE; in mlx4_free_eq()
1052 err = mlx4_HW2SW_EQ(dev, eq->eqn); in mlx4_free_eq()
1056 synchronize_irq(eq->irq); in mlx4_free_eq()
1057 tasklet_disable(&eq->tasklet_ctx.task); in mlx4_free_eq()
1059 mlx4_mtt_cleanup(dev, &eq->mtt); in mlx4_free_eq()
1062 eq->page_list[i].buf, in mlx4_free_eq()
1063 eq->page_list[i].map); in mlx4_free_eq()
1065 kfree(eq->page_list); in mlx4_free_eq()
1066 mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR); in mlx4_free_eq()
1079 if (eq_table->eq[i].have_irq) { in mlx4_free_irqs()
1080 free_irq(eq_table->eq[i].irq, eq_table->eq + i); in mlx4_free_irqs()
1081 eq_table->eq[i].have_irq = 0; in mlx4_free_irqs()
1092 free_irq(priv->eq_table.eq[vec].irq, in mlx4_free_irqs()
1093 &priv->eq_table.eq[vec]); in mlx4_free_irqs()
1127 priv->eq_table.eq = kcalloc(dev->caps.num_eqs - dev->caps.reserved_eqs, in mlx4_alloc_eq_table()
1128 sizeof *priv->eq_table.eq, GFP_KERNEL); in mlx4_alloc_eq_table()
1129 if (!priv->eq_table.eq) in mlx4_alloc_eq_table()
1137 kfree(mlx4_priv(dev)->eq_table.eq); in mlx4_free_eq_table()
1191 &priv->eq_table.eq[i]); in mlx4_init_eq_table()
1200 &priv->eq_table.eq[dev->caps.num_comp_vectors]); in mlx4_init_eq_table()
1212 &priv->eq_table.eq[i]); in mlx4_init_eq_table()
1240 err = request_irq(priv->eq_table.eq[i].irq, in mlx4_init_eq_table()
1242 priv->eq_table.eq + i); in mlx4_init_eq_table()
1246 priv->eq_table.eq[i].have_irq = 1; in mlx4_init_eq_table()
1262 priv->eq_table.eq[dev->caps.num_comp_vectors].eqn); in mlx4_init_eq_table()
1265 priv->eq_table.eq[dev->caps.num_comp_vectors].eqn, err); in mlx4_init_eq_table()
1268 eq_set_ci(&priv->eq_table.eq[i], 1); in mlx4_init_eq_table()
1273 mlx4_free_eq(dev, &priv->eq_table.eq[dev->caps.num_comp_vectors]); in mlx4_init_eq_table()
1280 mlx4_free_eq(dev, &priv->eq_table.eq[i]); in mlx4_init_eq_table()
1303 priv->eq_table.eq[dev->caps.num_comp_vectors].eqn); in mlx4_cleanup_eq_table()
1308 mlx4_free_eq(dev, &priv->eq_table.eq[i]); in mlx4_cleanup_eq_table()
1344 priv->eq_table.eq[i].eqn); in mlx4_test_interrupts()
1358 priv->eq_table.eq[dev->caps.num_comp_vectors].eqn); in mlx4_test_interrupts()
1381 priv->eq_table.eq[vec].irq); in mlx4_assign_eq()
1386 err = request_irq(priv->eq_table.eq[vec].irq, in mlx4_assign_eq()
1389 priv->eq_table.eq + vec); in mlx4_assign_eq()
1398 eq_set_ci(&priv->eq_table.eq[vec], 1); in mlx4_assign_eq()
1417 return priv->eq_table.eq[vec].irq; in mlx4_eq_get_irq()
1432 free_irq(priv->eq_table.eq[vec].irq, in mlx4_release_eq()
1433 &priv->eq_table.eq[vec]); in mlx4_release_eq()