diff options
author | Eddie Wai <waie@broadcom.com> | 2010-12-23 02:43:02 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-23 14:44:32 -0500 |
commit | 42ecbb8426aa229167d7f9d4b4e20f24bf42cb24 (patch) | |
tree | 5bddd73215b25274be3b6d7f4a9cb7a341b59a1b /drivers/net/cnic.c | |
parent | eaaa6e9c222d5c398488ed4216f0fd94e4b81759 (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.c | 16 |
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 | ||
325 | static void cnic_cm_upcall(struct cnic_local *, struct cnic_sock *, u8); | ||
326 | |||
325 | static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, | 327 | static 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(); |