diff options
author | Michael S. Tsirkin <mst@mellanox.co.il> | 2005-10-29 10:39:42 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2005-10-29 10:39:42 -0400 |
commit | affcd50546d4788b7849e2b2e2ec7bc50d64c5f8 (patch) | |
tree | e4e6a0f5f2203569b6ada4c101a146c3a4f24c28 /drivers/infiniband | |
parent | 89fbb69c4f285019ba5e029963dc11cc6beb078a (diff) |
[IB] mthca: report asynchronous CQ events
Implement reporting asynchronous CQ events in Mellanox HCA driver.
Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_cq.c | 31 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_dev.h | 4 | ||||
-rw-r--r-- | drivers/infiniband/hw/mthca/mthca_eq.c | 4 |
3 files changed, 36 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_cq.c b/drivers/infiniband/hw/mthca/mthca_cq.c index 8600b6c3e0c2..f98e23555826 100644 --- a/drivers/infiniband/hw/mthca/mthca_cq.c +++ b/drivers/infiniband/hw/mthca/mthca_cq.c | |||
@@ -208,7 +208,7 @@ static inline void update_cons_index(struct mthca_dev *dev, struct mthca_cq *cq, | |||
208 | } | 208 | } |
209 | } | 209 | } |
210 | 210 | ||
211 | void mthca_cq_event(struct mthca_dev *dev, u32 cqn) | 211 | void mthca_cq_completion(struct mthca_dev *dev, u32 cqn) |
212 | { | 212 | { |
213 | struct mthca_cq *cq; | 213 | struct mthca_cq *cq; |
214 | 214 | ||
@@ -224,6 +224,35 @@ void mthca_cq_event(struct mthca_dev *dev, u32 cqn) | |||
224 | cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); | 224 | cq->ibcq.comp_handler(&cq->ibcq, cq->ibcq.cq_context); |
225 | } | 225 | } |
226 | 226 | ||
227 | void mthca_cq_event(struct mthca_dev *dev, u32 cqn, | ||
228 | enum ib_event_type event_type) | ||
229 | { | ||
230 | struct mthca_cq *cq; | ||
231 | struct ib_event event; | ||
232 | |||
233 | spin_lock(&dev->cq_table.lock); | ||
234 | |||
235 | cq = mthca_array_get(&dev->cq_table.cq, cqn & (dev->limits.num_cqs - 1)); | ||
236 | |||
237 | if (cq) | ||
238 | atomic_inc(&cq->refcount); | ||
239 | spin_unlock(&dev->cq_table.lock); | ||
240 | |||
241 | if (!cq) { | ||
242 | mthca_warn(dev, "Async event for bogus CQ %08x\n", cqn); | ||
243 | return; | ||
244 | } | ||
245 | |||
246 | event.device = &dev->ib_dev; | ||
247 | event.event = event_type; | ||
248 | event.element.cq = &cq->ibcq; | ||
249 | if (cq->ibcq.event_handler) | ||
250 | cq->ibcq.event_handler(&event, cq->ibcq.cq_context); | ||
251 | |||
252 | if (atomic_dec_and_test(&cq->refcount)) | ||
253 | wake_up(&cq->wait); | ||
254 | } | ||
255 | |||
227 | void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn, | 256 | void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn, |
228 | struct mthca_srq *srq) | 257 | struct mthca_srq *srq) |
229 | { | 258 | { |
diff --git a/drivers/infiniband/hw/mthca/mthca_dev.h b/drivers/infiniband/hw/mthca/mthca_dev.h index 7e68bd4a3780..e7e5d3b4f004 100644 --- a/drivers/infiniband/hw/mthca/mthca_dev.h +++ b/drivers/infiniband/hw/mthca/mthca_dev.h | |||
@@ -460,7 +460,9 @@ int mthca_init_cq(struct mthca_dev *dev, int nent, | |||
460 | struct mthca_cq *cq); | 460 | struct mthca_cq *cq); |
461 | void mthca_free_cq(struct mthca_dev *dev, | 461 | void mthca_free_cq(struct mthca_dev *dev, |
462 | struct mthca_cq *cq); | 462 | struct mthca_cq *cq); |
463 | void mthca_cq_event(struct mthca_dev *dev, u32 cqn); | 463 | void mthca_cq_completion(struct mthca_dev *dev, u32 cqn); |
464 | void mthca_cq_event(struct mthca_dev *dev, u32 cqn, | ||
465 | enum ib_event_type event_type); | ||
464 | void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn, | 466 | void mthca_cq_clean(struct mthca_dev *dev, u32 cqn, u32 qpn, |
465 | struct mthca_srq *srq); | 467 | struct mthca_srq *srq); |
466 | 468 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_eq.c b/drivers/infiniband/hw/mthca/mthca_eq.c index e5a047a6dbeb..34d68e5a72d8 100644 --- a/drivers/infiniband/hw/mthca/mthca_eq.c +++ b/drivers/infiniband/hw/mthca/mthca_eq.c | |||
@@ -292,7 +292,7 @@ static int mthca_eq_int(struct mthca_dev *dev, struct mthca_eq *eq) | |||
292 | case MTHCA_EVENT_TYPE_COMP: | 292 | case MTHCA_EVENT_TYPE_COMP: |
293 | disarm_cqn = be32_to_cpu(eqe->event.comp.cqn) & 0xffffff; | 293 | disarm_cqn = be32_to_cpu(eqe->event.comp.cqn) & 0xffffff; |
294 | disarm_cq(dev, eq->eqn, disarm_cqn); | 294 | disarm_cq(dev, eq->eqn, disarm_cqn); |
295 | mthca_cq_event(dev, disarm_cqn); | 295 | mthca_cq_completion(dev, disarm_cqn); |
296 | break; | 296 | break; |
297 | 297 | ||
298 | case MTHCA_EVENT_TYPE_PATH_MIG: | 298 | case MTHCA_EVENT_TYPE_PATH_MIG: |
@@ -364,6 +364,8 @@ static int mthca_eq_int(struct mthca_dev *dev, struct mthca_eq *eq) | |||
364 | eqe->event.cq_err.syndrome == 1 ? | 364 | eqe->event.cq_err.syndrome == 1 ? |
365 | "overrun" : "access violation", | 365 | "overrun" : "access violation", |
366 | be32_to_cpu(eqe->event.cq_err.cqn) & 0xffffff); | 366 | be32_to_cpu(eqe->event.cq_err.cqn) & 0xffffff); |
367 | mthca_cq_event(dev, be32_to_cpu(eqe->event.cq_err.cqn), | ||
368 | IB_EVENT_CQ_ERR); | ||
367 | break; | 369 | break; |
368 | 370 | ||
369 | case MTHCA_EVENT_TYPE_EQ_OVERFLOW: | 371 | case MTHCA_EVENT_TYPE_EQ_OVERFLOW: |