static DECLARE_TASKLET(rpcrdma_tasklet_g, rpcrdma_run_tasklet, 0UL);
 
+static const char * const async_event[] = {
+       "CQ error",
+       "QP fatal error",
+       "QP request error",
+       "QP access error",
+       "communication established",
+       "send queue drained",
+       "path migration successful",
+       "path mig error",
+       "device fatal error",
+       "port active",
+       "port error",
+       "LID change",
+       "P_key change",
+       "SM change",
+       "SRQ error",
+       "SRQ limit reached",
+       "last WQE reached",
+       "client reregister",
+       "GID change",
+};
+
+#define ASYNC_MSG(status)                                      \
+       ((status) < ARRAY_SIZE(async_event) ?                   \
+               async_event[(status)] : "unknown async error")
+
 static void
 rpcrdma_schedule_tasklet(struct list_head *sched_list)
 {
 {
        struct rpcrdma_ep *ep = context;
 
-       dprintk("RPC:       %s: QP error %X on device %s ep %p\n",
-               __func__, event->event, event->device->name, context);
+       pr_err("RPC:       %s: %s on device %s ep %p\n",
+              __func__, ASYNC_MSG(event->event),
+               event->device->name, context);
        if (ep->rep_connected == 1) {
                ep->rep_connected = -EIO;
                ep->rep_func(ep);
 {
        struct rpcrdma_ep *ep = context;
 
-       dprintk("RPC:       %s: CQ error %X on device %s ep %p\n",
-               __func__, event->event, event->device->name, context);
+       pr_err("RPC:       %s: %s on device %s ep %p\n",
+              __func__, ASYNC_MSG(event->event),
+               event->device->name, context);
        if (ep->rep_connected == 1) {
                ep->rep_connected = -EIO;
                ep->rep_func(ep);