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()
229 struct mlx4_eq *eq = &priv->eq_table.eq[vec]; in mlx4_set_eq_affinity_hint() local
231 if (!eq->affinity_mask || cpumask_empty(eq->affinity_mask)) in mlx4_set_eq_affinity_hint()
234 hint_err = irq_set_affinity_hint(eq->irq, eq->affinity_mask); in mlx4_set_eq_affinity_hint()
481 static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq) in mlx4_eq_int() argument
499 while ((eqe = next_eqe_sw(eq, dev->caps.eqe_factor, eqe_size))) { in mlx4_eq_int()
530 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
558 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
674 eq->eqn, eq->cons_index, ret); in mlx4_eq_int()
690 mlx4_warn(dev, "EQ overrun on EQN %d\n", eq->eqn); in mlx4_eq_int()
758 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
759 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
762 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
783 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
784 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
786 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
795 eqe->type, eqe->subtype, eq->eqn, in mlx4_eq_int()
796 eq->cons_index, eqe->owner, eq->nent, in mlx4_eq_int()
799 !!(eq->cons_index & eq->nent) ? "HW" : "SW"); in mlx4_eq_int()
803 ++eq->cons_index; in mlx4_eq_int()
815 eq_set_ci(eq, 0); in mlx4_eq_int()
820 eq_set_ci(eq, 1); in mlx4_eq_int()
827 tasklet_schedule(&eq->tasklet_ctx.task); in mlx4_eq_int()
842 work |= mlx4_eq_int(dev, &priv->eq_table.eq[i]); in mlx4_interrupt()
849 struct mlx4_eq *eq = eq_ptr; in mlx4_msi_x_interrupt() local
850 struct mlx4_dev *dev = eq->dev; in mlx4_msi_x_interrupt()
852 mlx4_eq_int(dev, eq); in mlx4_msi_x_interrupt()
918 static void __iomem *mlx4_get_eq_uar(struct mlx4_dev *dev, struct mlx4_eq *eq) in mlx4_get_eq_uar() argument
923 index = eq->eqn / 4 - dev->caps.reserved_eqs / 4; in mlx4_get_eq_uar()
928 ((eq->eqn / 4) << PAGE_SHIFT), in mlx4_get_eq_uar()
932 eq->eqn); in mlx4_get_eq_uar()
937 return priv->eq_table.uar_map[index] + 0x800 + 8 * (eq->eqn % 4); in mlx4_get_eq_uar()
953 u8 intr, struct mlx4_eq *eq) in mlx4_create_eq() argument
965 eq->dev = dev; in mlx4_create_eq()
966 eq->nent = roundup_pow_of_two(max(nent, 2)); in mlx4_create_eq()
970 npages = PAGE_ALIGN(eq->nent * dev->caps.eqe_size) / PAGE_SIZE; in mlx4_create_eq()
972 eq->page_list = kmalloc(npages * sizeof *eq->page_list, in mlx4_create_eq()
974 if (!eq->page_list) in mlx4_create_eq()
978 eq->page_list[i].buf = NULL; in mlx4_create_eq()
990 eq->page_list[i].buf = dma_alloc_coherent(&dev->persist-> in mlx4_create_eq()
994 if (!eq->page_list[i].buf) in mlx4_create_eq()
998 eq->page_list[i].map = t; in mlx4_create_eq()
1000 memset(eq->page_list[i].buf, 0, PAGE_SIZE); in mlx4_create_eq()
1003 eq->eqn = mlx4_bitmap_alloc(&priv->eq_table.bitmap); in mlx4_create_eq()
1004 if (eq->eqn == -1) in mlx4_create_eq()
1007 eq->doorbell = mlx4_get_eq_uar(dev, eq); in mlx4_create_eq()
1008 if (!eq->doorbell) { in mlx4_create_eq()
1013 err = mlx4_mtt_init(dev, npages, PAGE_SHIFT, &eq->mtt); in mlx4_create_eq()
1017 err = mlx4_write_mtt(dev, &eq->mtt, 0, npages, dma_list); in mlx4_create_eq()
1023 eq_context->log_eq_size = ilog2(eq->nent); in mlx4_create_eq()
1027 mtt_addr = mlx4_mtt_addr(dev, &eq->mtt); in mlx4_create_eq()
1031 err = mlx4_SW2HW_EQ(dev, mailbox, eq->eqn); in mlx4_create_eq()
1040 eq->cons_index = 0; in mlx4_create_eq()
1042 INIT_LIST_HEAD(&eq->tasklet_ctx.list); in mlx4_create_eq()
1043 INIT_LIST_HEAD(&eq->tasklet_ctx.process_list); in mlx4_create_eq()
1044 spin_lock_init(&eq->tasklet_ctx.lock); in mlx4_create_eq()
1045 tasklet_init(&eq->tasklet_ctx.task, mlx4_cq_tasklet_cb, in mlx4_create_eq()
1046 (unsigned long)&eq->tasklet_ctx); in mlx4_create_eq()
1051 mlx4_mtt_cleanup(dev, &eq->mtt); in mlx4_create_eq()
1054 mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR); in mlx4_create_eq()
1058 if (eq->page_list[i].buf) in mlx4_create_eq()
1060 eq->page_list[i].buf, in mlx4_create_eq()
1061 eq->page_list[i].map); in mlx4_create_eq()
1066 kfree(eq->page_list); in mlx4_create_eq()
1074 struct mlx4_eq *eq) in mlx4_free_eq() argument
1082 int npages = PAGE_ALIGN(dev->caps.eqe_size * eq->nent) / PAGE_SIZE; in mlx4_free_eq()
1084 err = mlx4_HW2SW_EQ(dev, eq->eqn); in mlx4_free_eq()
1088 synchronize_irq(eq->irq); in mlx4_free_eq()
1089 tasklet_disable(&eq->tasklet_ctx.task); in mlx4_free_eq()
1091 mlx4_mtt_cleanup(dev, &eq->mtt); in mlx4_free_eq()
1094 eq->page_list[i].buf, in mlx4_free_eq()
1095 eq->page_list[i].map); in mlx4_free_eq()
1097 kfree(eq->page_list); in mlx4_free_eq()
1098 mlx4_bitmap_free(&priv->eq_table.bitmap, eq->eqn, MLX4_USE_RR); in mlx4_free_eq()
1110 if (eq_table->eq[i].have_irq) { in mlx4_free_irqs()
1111 free_cpumask_var(eq_table->eq[i].affinity_mask); in mlx4_free_irqs()
1113 irq_set_affinity_hint(eq_table->eq[i].irq, NULL); in mlx4_free_irqs()
1115 free_irq(eq_table->eq[i].irq, eq_table->eq + i); in mlx4_free_irqs()
1116 eq_table->eq[i].have_irq = 0; in mlx4_free_irqs()
1148 priv->eq_table.eq = kcalloc(dev->caps.num_eqs - dev->caps.reserved_eqs, in mlx4_alloc_eq_table()
1149 sizeof *priv->eq_table.eq, GFP_KERNEL); in mlx4_alloc_eq_table()
1150 if (!priv->eq_table.eq) in mlx4_alloc_eq_table()
1158 kfree(mlx4_priv(dev)->eq_table.eq); in mlx4_free_eq_table()
1210 0, &priv->eq_table.eq[MLX4_EQ_ASYNC]); in mlx4_init_eq_table()
1212 struct mlx4_eq *eq = &priv->eq_table.eq[i]; in mlx4_init_eq_table() local
1214 int port = find_first_bit(eq->actv_ports.ports, in mlx4_init_eq_table()
1232 info->rmap, eq->irq); in mlx4_init_eq_table()
1242 eq); in mlx4_init_eq_table()
1259 err = request_irq(priv->eq_table.eq[MLX4_EQ_ASYNC].irq, in mlx4_init_eq_table()
1261 priv->eq_table.eq + MLX4_EQ_ASYNC); in mlx4_init_eq_table()
1265 priv->eq_table.eq[MLX4_EQ_ASYNC].have_irq = 1; in mlx4_init_eq_table()
1280 priv->eq_table.eq[MLX4_EQ_ASYNC].eqn); in mlx4_init_eq_table()
1283 priv->eq_table.eq[MLX4_EQ_ASYNC].eqn, err); in mlx4_init_eq_table()
1286 eq_set_ci(&priv->eq_table.eq[MLX4_EQ_ASYNC], 1); in mlx4_init_eq_table()
1292 mlx4_free_eq(dev, &priv->eq_table.eq[i--]); in mlx4_init_eq_table()
1323 priv->eq_table.eq[MLX4_EQ_ASYNC].eqn); in mlx4_cleanup_eq_table()
1336 mlx4_free_eq(dev, &priv->eq_table.eq[i]); in mlx4_cleanup_eq_table()
1368 if (!priv->eq_table.eq[i].have_irq) in mlx4_test_interrupts()
1376 priv->eq_table.eq[i].eqn); in mlx4_test_interrupts()
1390 priv->eq_table.eq[MLX4_EQ_ASYNC].eqn); in mlx4_test_interrupts()
1404 return test_bit(port - 1, priv->eq_table.eq[vector].actv_ports.ports); in mlx4_is_eq_vector_valid()
1416 priv->eq_table.eq[i].actv_ports.ports); in mlx4_get_eqs_per_port()
1430 return !!(bitmap_weight(priv->eq_table.eq[vector].actv_ports.ports, in mlx4_is_eq_shared()
1455 priv->eq_table.eq[requested_vector].actv_ports.ports)) { in mlx4_assign_eq()
1458 struct mlx4_eq *eq; in mlx4_assign_eq() local
1464 eq = &priv->eq_table.eq[requested_vector]; in mlx4_assign_eq()
1466 test_bit(port - 1, eq->actv_ports.ports)) { in mlx4_assign_eq()
1476 struct mlx4_eq *eq = &priv->eq_table.eq[i]; in mlx4_assign_eq() local
1478 if (min_ref_count_val > eq->ref_count && in mlx4_assign_eq()
1479 test_bit(port - 1, eq->actv_ports.ports)) { in mlx4_assign_eq()
1480 min_ref_count_val = eq->ref_count; in mlx4_assign_eq()
1501 err = request_irq(priv->eq_table.eq[*prequested_vector].irq, in mlx4_assign_eq()
1504 priv->eq_table.eq + *prequested_vector); in mlx4_assign_eq()
1513 eq_set_ci(&priv->eq_table.eq[*prequested_vector], 1); in mlx4_assign_eq()
1514 priv->eq_table.eq[*prequested_vector].have_irq = 1; in mlx4_assign_eq()
1519 priv->eq_table.eq[*prequested_vector].ref_count++; in mlx4_assign_eq()
1537 return priv->eq_table.eq[MLX4_CQ_TO_EQ_VECTOR(cq_vec)].irq; in mlx4_eq_get_irq()
1547 priv->eq_table.eq[eq_vec].ref_count--; in mlx4_release_eq()