• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-WNDR4500v2-V1.0.0.60_1.0.38/src/linux/linux-2.6/drivers/infiniband/hw/mthca/

Lines Matching defs:srq

74 static void *get_wqe(struct mthca_srq *srq, int n)
76 if (srq->is_direct)
77 return srq->queue.direct.buf + (n << srq->wqe_shift);
79 return srq->queue.page_list[(n << srq->wqe_shift) >> PAGE_SHIFT].buf +
80 ((n << srq->wqe_shift) & (PAGE_SIZE - 1));
99 struct mthca_srq *srq,
104 context->wqe_base_ds = cpu_to_be64(1 << (srq->wqe_shift - 4));
106 context->lkey = cpu_to_be32(srq->mr.ibmr.lkey);
117 struct mthca_srq *srq,
124 max = srq->max;
126 context->state_logsize_srqn = cpu_to_be32(logsize << 24 | srq->srqn);
127 context->lkey = cpu_to_be32(srq->mr.ibmr.lkey);
128 context->db_index = cpu_to_be32(srq->db_index);
129 context->logstride_usrpage = cpu_to_be32((srq->wqe_shift - 4) << 29);
138 static void mthca_free_srq_buf(struct mthca_dev *dev, struct mthca_srq *srq)
140 mthca_buf_free(dev, srq->max << srq->wqe_shift, &srq->queue,
141 srq->is_direct, &srq->mr);
142 kfree(srq->wrid);
146 struct mthca_srq *srq)
156 srq->wrid = kmalloc(srq->max * sizeof (u64), GFP_KERNEL);
157 if (!srq->wrid)
160 err = mthca_buf_alloc(dev, srq->max << srq->wqe_shift,
162 &srq->queue, &srq->is_direct, pd, 1, &srq->mr);
164 kfree(srq->wrid);
173 for (i = 0; i < srq->max; ++i) {
174 wqe = get_wqe(srq, i);
176 *wqe_to_link(wqe) = i < srq->max - 1 ? i + 1 : -1;
179 (void *) scatter < wqe + (1 << srq->wqe_shift);
184 srq->last = get_wqe(srq, srq->max - 1);
190 struct ib_srq_attr *attr, struct mthca_srq *srq)
202 srq->max = attr->max_wr;
203 srq->max_gs = attr->max_sge;
204 srq->counter = 0;
207 srq->max = roundup_pow_of_two(srq->max + 1);
209 srq->max = srq->max + 1;
213 srq->max_gs * sizeof (struct mthca_data_seg)));
218 srq->wqe_shift = ilog2(ds);
220 srq->srqn = mthca_alloc(&dev->srq_table.alloc);
221 if (srq->srqn == -1)
225 err = mthca_table_get(dev, dev->srq_table.table, srq->srqn);
230 srq->db_index = mthca_alloc_db(dev, MTHCA_DB_TYPE_SRQ,
231 srq->srqn, &srq->db);
232 if (srq->db_index < 0) {
245 err = mthca_alloc_srq_buf(dev, pd, srq);
249 spin_lock_init(&srq->lock);
250 srq->refcount = 1;
251 init_waitqueue_head(&srq->wait);
252 mutex_init(&srq->mutex);
255 mthca_arbel_init_srq_context(dev, pd, srq, mailbox->buf);
257 mthca_tavor_init_srq_context(dev, pd, srq, mailbox->buf);
259 err = mthca_SW2HW_SRQ(dev, mailbox, srq->srqn, &status);
273 if (mthca_array_set(&dev->srq_table.srq,
274 srq->srqn & (dev->limits.num_srqs - 1),
275 srq)) {
283 srq->first_free = 0;
284 srq->last_free = srq->max - 1;
286 attr->max_wr = srq->max - 1;
287 attr->max_sge = srq->max_gs;
292 err = mthca_HW2SW_SRQ(dev, mailbox, srq->srqn, &status);
300 mthca_free_srq_buf(dev, srq);
307 mthca_free_db(dev, MTHCA_DB_TYPE_SRQ, srq->db_index);
310 mthca_table_put(dev, dev->srq_table.table, srq->srqn);
313 mthca_free(&dev->srq_table.alloc, srq->srqn);
318 static inline int get_srq_refcount(struct mthca_dev *dev, struct mthca_srq *srq)
323 c = srq->refcount;
329 void mthca_free_srq(struct mthca_dev *dev, struct mthca_srq *srq)
341 err = mthca_HW2SW_SRQ(dev, mailbox, srq->srqn, &status);
348 mthca_array_clear(&dev->srq_table.srq,
349 srq->srqn & (dev->limits.num_srqs - 1));
350 --srq->refcount;
353 wait_event(srq->wait, !get_srq_refcount(dev, srq));
355 if (!srq->ibsrq.uobject) {
356 mthca_free_srq_buf(dev, srq);
358 mthca_free_db(dev, MTHCA_DB_TYPE_SRQ, srq->db_index);
361 mthca_table_put(dev, dev->srq_table.table, srq->srqn);
362 mthca_free(&dev->srq_table.alloc, srq->srqn);
370 struct mthca_srq *srq = to_msrq(ibsrq);
379 u32 max_wr = mthca_is_memfree(dev) ? srq->max - 1 : srq->max;
383 mutex_lock(&srq->mutex);
384 ret = mthca_ARM_SRQ(dev, srq->srqn, attr->srq_limit, &status);
385 mutex_unlock(&srq->mutex);
399 struct mthca_srq *srq = to_msrq(ibsrq);
410 err = mthca_QUERY_SRQ(dev, srq->srqn, mailbox, &status);
422 srq_attr->max_wr = srq->max - 1;
423 srq_attr->max_sge = srq->max_gs;
434 struct mthca_srq *srq;
438 srq = mthca_array_get(&dev->srq_table.srq, srqn & (dev->limits.num_srqs - 1));
439 if (srq)
440 ++srq->refcount;
443 if (!srq) {
448 if (!srq->ibsrq.event_handler)
453 event.element.srq = &srq->ibsrq;
454 srq->ibsrq.event_handler(&event, srq->ibsrq.srq_context);
458 if (!--srq->refcount)
459 wake_up(&srq->wait);
466 void mthca_free_srq_wqe(struct mthca_srq *srq, u32 wqe_addr)
470 ind = wqe_addr >> srq->wqe_shift;
472 spin_lock(&srq->lock);
474 if (likely(srq->first_free >= 0))
475 *wqe_to_link(get_wqe(srq, srq->last_free)) = ind;
477 srq->first_free = ind;
479 *wqe_to_link(get_wqe(srq, ind)) = -1;
480 srq->last_free = ind;
482 spin_unlock(&srq->lock);
489 struct mthca_srq *srq = to_msrq(ibsrq);
501 spin_lock_irqsave(&srq->lock, flags);
503 first_ind = srq->first_free;
506 ind = srq->first_free;
509 mthca_err(dev, "SRQ %06x full\n", srq->srqn);
515 wqe = get_wqe(srq, ind);
519 mthca_err(dev, "SRQ %06x full\n", srq->srqn);
525 prev_wqe = srq->last;
526 srq->last = wqe;
534 if (unlikely(wr->num_sge > srq->max_gs)) {
537 srq->last = prev_wqe;
551 if (i < srq->max_gs) {
558 cpu_to_be32((ind << srq->wqe_shift) | 1);
563 srq->wrid[ind] = wr->wr_id;
564 srq->first_free = next_ind;
570 doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
571 doorbell[1] = cpu_to_be32(srq->srqn << 8);
583 first_ind = srq->first_free;
588 doorbell[0] = cpu_to_be32(first_ind << srq->wqe_shift);
589 doorbell[1] = cpu_to_be32((srq->srqn << 8) | nreq);
608 spin_unlock_irqrestore(&srq->lock, flags);
616 struct mthca_srq *srq = to_msrq(ibsrq);
625 spin_lock_irqsave(&srq->lock, flags);
628 ind = srq->first_free;
631 mthca_err(dev, "SRQ %06x full\n", srq->srqn);
637 wqe = get_wqe(srq, ind);
641 mthca_err(dev, "SRQ %06x full\n", srq->srqn);
648 cpu_to_be32((next_ind << srq->wqe_shift) | 1);
654 if (unlikely(wr->num_sge > srq->max_gs)) {
670 if (i < srq->max_gs) {
676 srq->wrid[ind] = wr->wr_id;
677 srq->first_free = next_ind;
681 srq->counter += nreq;
688 *srq->db = cpu_to_be32(srq->counter);
691 spin_unlock_irqrestore(&srq->lock, flags);
736 err = mthca_array_init(&dev->srq_table.srq,
749 mthca_array_cleanup(&dev->srq_table.srq, dev->limits.num_srqs);