41#include <linux/module.h>
42#include <linux/moduleparam.h>
44#include <rdma/ib_verbs.h>
54 struct list_head *pos, *nxt;
57 mutex_lock(&uctx->
lock);
58 list_for_each_safe(pos, nxt, &uctx->
qpids) {
60 list_del_init(&
entry->entry);
71 list_for_each_safe(pos, nxt, &uctx->
cqids) {
73 list_del_init(&
entry->entry);
76 mutex_unlock(&uctx->
lock);
83 INIT_LIST_HEAD(&uctx->
qpids);
84 INIT_LIST_HEAD(&uctx->
cqids);
85 mutex_init(&uctx->
lock);
94 unsigned short ucq_density = 1 << sp->
iq_s_qpp;
95 unsigned short udb_density = 1 << sp->
eq_s_qpp;
105 if (udb_density != ucq_density) {
106 device_printf(sc->
dev,
"unsupported udb/ucq densities %u/%u\n",
107 udb_density, ucq_density);
113 device_printf(sc->
dev,
"%s: unsupported qp and cq id ranges "
114 "qp start %u size %u cq start %u size %u\n", __func__,
122 rdev->
qpmask = udb_density - 1;
124 rdev->
cqmask = ucq_density - 1;
139 device_printf(sc->
dev,
"error %d initializing resources\n", rc);
144 device_printf(sc->
dev,
"error %d initializing pbl pool\n", rc);
149 device_printf(sc->
dev,
"error %d initializing rqt pool\n", rc);
153 __get_free_page(GFP_KERNEL);
170 rdev->
free_workq = create_singlethread_workqueue(
"iw_cxgb4_free");
188static void c4iw_rdev_close(
struct c4iw_rdev *rdev)
200 c4iw_rdev_close(&iwsc->
rdev);
201 idr_destroy(&iwsc->
cqidr);
202 idr_destroy(&iwsc->
qpidr);
203 idr_destroy(&iwsc->
mmidr);
204 ib_dealloc_device(&iwsc->
ibdev);
213 iwsc = (
struct c4iw_dev *)ib_alloc_device(
sizeof(*iwsc));
215 device_printf(sc->
dev,
"Cannot allocate ib device.\n");
216 return (ERR_PTR(-ENOMEM));
243 rc = c4iw_rdev_open(&iwsc->
rdev);
245 device_printf(sc->
dev,
"Unable to open CXIO rdev (%d)\n", rc);
246 ib_dealloc_device(&iwsc->
ibdev);
247 return (ERR_PTR(rc));
250 idr_init(&iwsc->
cqidr);
251 idr_init(&iwsc->
qpidr);
252 idr_init(&iwsc->
mmidr);
253 spin_lock_init(&iwsc->
lock);
260static int c4iw_mod_load(
void);
261static int c4iw_mod_unload(
void);
262static int c4iw_activate(
struct adapter *);
263static int c4iw_deactivate(
struct adapter *);
264static void c4iw_async_event(
struct adapter *);
266static struct uld_info c4iw_uld_info = {
268 .activate = c4iw_activate,
269 .deactivate = c4iw_deactivate,
270 .async_event = c4iw_async_event,
274c4iw_activate(
struct adapter *sc)
282 device_printf(sc->
dev,
"No iWARP support for T4 devices, "
283 "please install T5 or above devices.\n");
288 KASSERT(0, (
"%s: RDMA already eanbled on sc %p", __func__, sc));
293 device_printf(sc->
dev,
294 "RDMA not supported or RDMA cap is not enabled.\n");
298 iwsc = c4iw_alloc(sc);
301 device_printf(sc->
dev,
"initialization failed: %d\n", rc);
309 device_printf(sc->
dev,
"RDMA registration failed: %d\n", rc);
318c4iw_deactivate(
struct adapter *sc)
332c4iw_async_event(
struct adapter *sc)
337 struct ib_event event = {0};
339 device_printf(sc->
dev,
340 "iWARP driver received FATAL ERROR event.\n");
342 event.event = IB_EVENT_DEVICE_FATAL;
343 event.device = &iwsc->
ibdev;
344 ib_dispatch_event(&event);
349c4iw_activate_all(
struct adapter *sc,
void *arg __unused)
363c4iw_deactivate_all(
struct adapter *sc,
void *arg __unused)
384 rc = t4_register_uld(&c4iw_uld_info);
403 if (t4_unregister_uld(&c4iw_uld_info) == EBUSY)
424 rc = c4iw_mod_load();
426 printf(
"iw_cxgbe: Chelsio T5/T6 RDMA driver loaded.\n");
430 rc = c4iw_mod_unload();
437 printf(
"t4_tom: compiled without TCP_OFFLOAD support.\n");
int begin_synchronized_op(struct adapter *, struct vi_info *, int, char *)
void t4_iterate(void(*)(struct adapter *, void *), void *)
#define ASSERT_SYNCHRONIZED_OP(sc)
void end_synchronized_op(struct adapter *, int)
static int is_t4(struct adapter *adap)
MODULE_VERSION(iw_cxgbe, 1)
MODULE_DEPEND(iw_cxgbe, t4nex, 1, 1, 1)
DECLARE_MODULE(iw_cxgbe, c4iw_mod_data, SI_SUB_EXEC, SI_ORDER_ANY)
static moduledata_t c4iw_mod_data
static int c4iw_modevent(module_t mod, int cmd, void *arg)
void c4iw_release_dev_ucontext(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx)
void c4iw_destroy_resource(struct c4iw_resource *rscp)
int c4iw_rqtpool_create(struct c4iw_rdev *rdev)
int c4iw_init_resource(struct c4iw_rdev *rdev, u32 nr_tpt, u32 nr_pdid)
void c4iw_pblpool_destroy(struct c4iw_rdev *rdev)
int c4iw_register_device(struct c4iw_dev *dev)
void c4iw_rqtpool_destroy(struct c4iw_rdev *rdev)
int __init c4iw_cm_init(void)
void c4iw_init_dev_ucontext(struct c4iw_rdev *rdev, struct c4iw_dev_ucontext *uctx)
static int c4iw_num_stags(struct c4iw_rdev *rdev)
void c4iw_unregister_device(struct c4iw_dev *dev)
void __exit c4iw_cm_term(void)
int c4iw_pblpool_create(struct c4iw_rdev *rdev)
void c4iw_put_resource(struct c4iw_id_table *id_table, u32 entry)
unsigned int max_ird_adapter
volatile uint8_t * udbs_base
struct resource * udbs_res
struct adapter_params params
struct c4iw_resource resource
struct t4_dev_status_page * status_page
struct c4iw_hw_queue hw_queue
struct workqueue_struct * free_workq
struct c4iw_dev_ucontext uctx
struct c4iw_id_table qid_table