u32 msg_type = ISCSI_KEVENT_IF_DOWN;
        struct cnic_ulp_ops *ulp_ops;
        struct cnic_uio_dev *udev = cp->udev;
+       int rc = 0, retry = 0;
 
        if (!udev || udev->uio_dev == -1)
                return -ENODEV;
                path_req.pmtu = csk->mtu;
        }
 
-       rcu_read_lock();
-       ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]);
-       if (ulp_ops)
-               ulp_ops->iscsi_nl_send_msg(cp->dev, msg_type, buf, len);
-       rcu_read_unlock();
+       while (retry < 3) {
+               rc = 0;
+               rcu_read_lock();
+               ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]);
+               if (ulp_ops)
+                       rc = ulp_ops->iscsi_nl_send_msg(
+                               cp->ulp_handle[CNIC_ULP_ISCSI],
+                               msg_type, buf, len);
+               rcu_read_unlock();
+               if (rc == 0 || msg_type != ISCSI_KEVENT_PATH_REQ)
+                       break;
+
+               msleep(100);
+               retry++;
+       }
        return 0;
 }
 
 
        void (*cm_abort_complete)(struct cnic_sock *);
        void (*cm_remote_close)(struct cnic_sock *);
        void (*cm_remote_abort)(struct cnic_sock *);
-       void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type,
+       int (*iscsi_nl_send_msg)(void *ulp_ctx, u32 msg_type,
                                  char *data, u16 data_size);
        struct module *owner;
        atomic_t ref_count;
 
 }
 
 
-static void bnx2i_send_nl_mesg(struct cnic_dev *dev, u32 msg_type,
+static int bnx2i_send_nl_mesg(void *context, u32 msg_type,
                               char *buf, u16 buflen)
 {
-       struct bnx2i_hba *hba;
+       struct bnx2i_hba *hba = context;
+       int rc;
 
-       hba = bnx2i_find_hba_for_cnic(dev);
        if (!hba)
-               return;
+               return -ENODEV;
 
-       if (iscsi_offload_mesg(hba->shost, &bnx2i_iscsi_transport,
-                                  msg_type, buf, buflen))
+       rc = iscsi_offload_mesg(hba->shost, &bnx2i_iscsi_transport,
+                               msg_type, buf, buflen);
+       if (rc)
                printk(KERN_ALERT "bnx2i: private nl message send error\n");
 
+       return rc;
 }