diff options
Diffstat (limited to 'drivers/infiniband/hw/amso1100/c2_cq.c')
-rw-r--r-- | drivers/infiniband/hw/amso1100/c2_cq.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/infiniband/hw/amso1100/c2_cq.c b/drivers/infiniband/hw/amso1100/c2_cq.c index 5175c99ee586..d2b3366786d6 100644 --- a/drivers/infiniband/hw/amso1100/c2_cq.c +++ b/drivers/infiniband/hw/amso1100/c2_cq.c | |||
@@ -217,17 +217,19 @@ int c2_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry) | |||
217 | return npolled; | 217 | return npolled; |
218 | } | 218 | } |
219 | 219 | ||
220 | int c2_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify) | 220 | int c2_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags notify_flags) |
221 | { | 221 | { |
222 | struct c2_mq_shared __iomem *shared; | 222 | struct c2_mq_shared __iomem *shared; |
223 | struct c2_cq *cq; | 223 | struct c2_cq *cq; |
224 | unsigned long flags; | ||
225 | int ret = 0; | ||
224 | 226 | ||
225 | cq = to_c2cq(ibcq); | 227 | cq = to_c2cq(ibcq); |
226 | shared = cq->mq.peer; | 228 | shared = cq->mq.peer; |
227 | 229 | ||
228 | if (notify == IB_CQ_NEXT_COMP) | 230 | if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_NEXT_COMP) |
229 | writeb(C2_CQ_NOTIFICATION_TYPE_NEXT, &shared->notification_type); | 231 | writeb(C2_CQ_NOTIFICATION_TYPE_NEXT, &shared->notification_type); |
230 | else if (notify == IB_CQ_SOLICITED) | 232 | else if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED) |
231 | writeb(C2_CQ_NOTIFICATION_TYPE_NEXT_SE, &shared->notification_type); | 233 | writeb(C2_CQ_NOTIFICATION_TYPE_NEXT_SE, &shared->notification_type); |
232 | else | 234 | else |
233 | return -EINVAL; | 235 | return -EINVAL; |
@@ -241,7 +243,13 @@ int c2_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify notify) | |||
241 | */ | 243 | */ |
242 | readb(&shared->armed); | 244 | readb(&shared->armed); |
243 | 245 | ||
244 | return 0; | 246 | if (notify_flags & IB_CQ_REPORT_MISSED_EVENTS) { |
247 | spin_lock_irqsave(&cq->lock, flags); | ||
248 | ret = !c2_mq_empty(&cq->mq); | ||
249 | spin_unlock_irqrestore(&cq->lock, flags); | ||
250 | } | ||
251 | |||
252 | return ret; | ||
245 | } | 253 | } |
246 | 254 | ||
247 | static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq) | 255 | static void c2_free_cq_buf(struct c2_dev *c2dev, struct c2_mq *mq) |