aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/cnic.c21
-rw-r--r--drivers/net/cnic_if.h2
-rw-r--r--drivers/scsi/bnx2i/bnx2i_hwi.c14
3 files changed, 25 insertions, 12 deletions
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c
index 3a7d3ce6db7b..9f80fb40380a 100644
--- a/drivers/net/cnic.c
+++ b/drivers/net/cnic.c
@@ -279,6 +279,7 @@ static int cnic_send_nlmsg(struct cnic_local *cp, u32 type,
279 u32 msg_type = ISCSI_KEVENT_IF_DOWN; 279 u32 msg_type = ISCSI_KEVENT_IF_DOWN;
280 struct cnic_ulp_ops *ulp_ops; 280 struct cnic_ulp_ops *ulp_ops;
281 struct cnic_uio_dev *udev = cp->udev; 281 struct cnic_uio_dev *udev = cp->udev;
282 int rc = 0, retry = 0;
282 283
283 if (!udev || udev->uio_dev == -1) 284 if (!udev || udev->uio_dev == -1)
284 return -ENODEV; 285 return -ENODEV;
@@ -303,11 +304,21 @@ static int cnic_send_nlmsg(struct cnic_local *cp, u32 type,
303 path_req.pmtu = csk->mtu; 304 path_req.pmtu = csk->mtu;
304 } 305 }
305 306
306 rcu_read_lock(); 307 while (retry < 3) {
307 ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]); 308 rc = 0;
308 if (ulp_ops) 309 rcu_read_lock();
309 ulp_ops->iscsi_nl_send_msg(cp->dev, msg_type, buf, len); 310 ulp_ops = rcu_dereference(cnic_ulp_tbl[CNIC_ULP_ISCSI]);
310 rcu_read_unlock(); 311 if (ulp_ops)
312 rc = ulp_ops->iscsi_nl_send_msg(
313 cp->ulp_handle[CNIC_ULP_ISCSI],
314 msg_type, buf, len);
315 rcu_read_unlock();
316 if (rc == 0 || msg_type != ISCSI_KEVENT_PATH_REQ)
317 break;
318
319 msleep(100);
320 retry++;
321 }
311 return 0; 322 return 0;
312} 323}
313 324
diff --git a/drivers/net/cnic_if.h b/drivers/net/cnic_if.h
index 0dbeaec4f03a..33333e735f95 100644
--- a/drivers/net/cnic_if.h
+++ b/drivers/net/cnic_if.h
@@ -301,7 +301,7 @@ struct cnic_ulp_ops {
301 void (*cm_abort_complete)(struct cnic_sock *); 301 void (*cm_abort_complete)(struct cnic_sock *);
302 void (*cm_remote_close)(struct cnic_sock *); 302 void (*cm_remote_close)(struct cnic_sock *);
303 void (*cm_remote_abort)(struct cnic_sock *); 303 void (*cm_remote_abort)(struct cnic_sock *);
304 void (*iscsi_nl_send_msg)(struct cnic_dev *dev, u32 msg_type, 304 int (*iscsi_nl_send_msg)(void *ulp_ctx, u32 msg_type,
305 char *data, u16 data_size); 305 char *data, u16 data_size);
306 struct module *owner; 306 struct module *owner;
307 atomic_t ref_count; 307 atomic_t ref_count;
diff --git a/drivers/scsi/bnx2i/bnx2i_hwi.c b/drivers/scsi/bnx2i/bnx2i_hwi.c
index 8d9dbb33972f..2f9622ebbd84 100644
--- a/drivers/scsi/bnx2i/bnx2i_hwi.c
+++ b/drivers/scsi/bnx2i/bnx2i_hwi.c
@@ -2346,19 +2346,21 @@ static void bnx2i_cm_remote_abort(struct cnic_sock *cm_sk)
2346} 2346}
2347 2347
2348 2348
2349static void bnx2i_send_nl_mesg(struct cnic_dev *dev, u32 msg_type, 2349static int bnx2i_send_nl_mesg(void *context, u32 msg_type,
2350 char *buf, u16 buflen) 2350 char *buf, u16 buflen)
2351{ 2351{
2352 struct bnx2i_hba *hba; 2352 struct bnx2i_hba *hba = context;
2353 int rc;
2353 2354
2354 hba = bnx2i_find_hba_for_cnic(dev);
2355 if (!hba) 2355 if (!hba)
2356 return; 2356 return -ENODEV;
2357 2357
2358 if (iscsi_offload_mesg(hba->shost, &bnx2i_iscsi_transport, 2358 rc = iscsi_offload_mesg(hba->shost, &bnx2i_iscsi_transport,
2359 msg_type, buf, buflen)) 2359 msg_type, buf, buflen);
2360 if (rc)
2360 printk(KERN_ALERT "bnx2i: private nl message send error\n"); 2361 printk(KERN_ALERT "bnx2i: private nl message send error\n");
2361 2362
2363 return rc;
2362} 2364}
2363 2365
2364 2366