diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/cnic.c | 21 | ||||
-rw-r--r-- | drivers/net/cnic_if.h | 2 | ||||
-rw-r--r-- | drivers/scsi/bnx2i/bnx2i_hwi.c | 14 |
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 | ||
2349 | static void bnx2i_send_nl_mesg(struct cnic_dev *dev, u32 msg_type, | 2349 | static 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 | ||