aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/cnic.c
diff options
context:
space:
mode:
authorEddie Wai <waie@broadcom.com>2010-12-23 02:43:02 -0500
committerDavid S. Miller <davem@davemloft.net>2010-12-23 14:44:32 -0500
commit42ecbb8426aa229167d7f9d4b4e20f24bf42cb24 (patch)
tree5bddd73215b25274be3b6d7f4a9cb7a341b59a1b /drivers/net/cnic.c
parenteaaa6e9c222d5c398488ed4216f0fd94e4b81759 (diff)
cnic: Call cm_connect_complete() immediately on error
If we get a path_resp error from userspace, call cm_connect_complete() immediately with error so that bnx2i can react to the error faster. Signed-off-by: Eddie Wai <waie@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/cnic.c')
-rw-r--r--drivers/net/cnic.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c
index 1240deaf2420..36c1578a1b1e 100644
--- a/drivers/net/cnic.c
+++ b/drivers/net/cnic.c
@@ -322,6 +322,8 @@ static int cnic_send_nlmsg(struct cnic_local *cp, u32 type,
322 return 0; 322 return 0;
323} 323}
324 324
325static void cnic_cm_upcall(struct cnic_local *, struct cnic_sock *, u8);
326
325static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, 327static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type,
326 char *buf, u16 len) 328 char *buf, u16 len)
327{ 329{
@@ -351,7 +353,9 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type,
351 } 353 }
352 csk = &cp->csk_tbl[l5_cid]; 354 csk = &cp->csk_tbl[l5_cid];
353 csk_hold(csk); 355 csk_hold(csk);
354 if (cnic_in_use(csk)) { 356 if (cnic_in_use(csk) &&
357 test_bit(SK_F_CONNECT_START, &csk->flags)) {
358
355 memcpy(csk->ha, path_resp->mac_addr, 6); 359 memcpy(csk->ha, path_resp->mac_addr, 6);
356 if (test_bit(SK_F_IPV6, &csk->flags)) 360 if (test_bit(SK_F_IPV6, &csk->flags))
357 memcpy(&csk->src_ip[0], &path_resp->src.v6_addr, 361 memcpy(&csk->src_ip[0], &path_resp->src.v6_addr,
@@ -359,8 +363,16 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type,
359 else 363 else
360 memcpy(&csk->src_ip[0], &path_resp->src.v4_addr, 364 memcpy(&csk->src_ip[0], &path_resp->src.v4_addr,
361 sizeof(struct in_addr)); 365 sizeof(struct in_addr));
362 if (is_valid_ether_addr(csk->ha)) 366
367 if (is_valid_ether_addr(csk->ha)) {
363 cnic_cm_set_pg(csk); 368 cnic_cm_set_pg(csk);
369 } else if (!test_bit(SK_F_OFFLD_SCHED, &csk->flags) &&
370 !test_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) {
371
372 cnic_cm_upcall(cp, csk,
373 L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE);
374 clear_bit(SK_F_CONNECT_START, &csk->flags);
375 }
364 } 376 }
365 csk_put(csk); 377 csk_put(csk);
366 rcu_read_unlock(); 378 rcu_read_unlock();