aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2010-12-23 02:42:58 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-23 14:44:29 -0500
commit939b82e5bde56a98c72eccde2e3a88d32bffad4a (patch)
treee10e7ddaecef208d6fc0b11476a8943912663efc
parent8adc9240f98a816f7e9b3d93b9446a790110e062 (diff)
cnic: Improve ->iscsi_nl_msg_send()
1. Change first parameter from cnic_dev to ulp_handle which is the hba pointer. All other similar upcalls are using hba pointer. The callee can then directly reference the hba without conversion. 2. Change return value from void to int so that an error code can be passed back. This allows the operation to be retried. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-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