!(ah_attr->ah_flags & IB_AH_GRH))
return -EINVAL;
}
- if (rdi->driver_f.check_ah(ibdev, ah_attr))
- return -EINVAL;
+ if (rdi->driver_f.check_ah)
+ return rdi->driver_f.check_ah(ibdev, ah_attr);
return 0;
}
EXPORT_SYMBOL(rvt_check_ah);
ah->attr = *ah_attr;
atomic_set(&ah->refcount, 0);
+ if (dev->driver_f.notify_new_ah)
+ dev->driver_f.notify_new_ah(pd->device, ah_attr, ah);
+
return &ah->ibah;
}
int nports;
};
-/*
- * Functions that drivers are required to support
- */
+/* Protection domain */
+struct rvt_pd {
+ struct ib_pd ibpd;
+ int user; /* non-zero if created from user space */
+};
+
+/* Address handle */
+struct rvt_ah {
+ struct ib_ah ibah;
+ struct ib_ah_attr attr;
+ atomic_t refcount;
+ u8 vl;
+ u8 log_pmtu;
+};
+
struct rvt_dev_info;
struct rvt_driver_provided {
/*
* instead drivers are responsible for setting the correct callback for
* this.
*/
+
+ /* -------------------*/
+ /* Required functions */
+ /* -------------------*/
int (*port_callback)(struct ib_device *, u8, struct kobject *);
const char * (*get_card_name)(struct rvt_dev_info *rdi);
struct pci_dev * (*get_pci_dev)(struct rvt_dev_info *rdi);
- int (*check_ah)(struct ib_device *, struct ib_ah_attr *);
-};
-/* Protection domain */
-struct rvt_pd {
- struct ib_pd ibpd;
- int user; /* non-zero if created from user space */
-};
-
-/* Address handle */
-struct rvt_ah {
- struct ib_ah ibah;
- struct ib_ah_attr attr;
- atomic_t refcount;
+ /*--------------------*/
+ /* Optional functions */
+ /*--------------------*/
+ int (*check_ah)(struct ib_device *, struct ib_ah_attr *);
+ void (*notify_new_ah)(struct ib_device *, struct ib_ah_attr *,
+ struct rvt_ah *);
};
struct rvt_dev_info {