diff options
author | Eddie Wai <waie@broadcom.com> | 2010-12-23 07:43:02 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-23 11:44:32 -0800 |
commit | 42ecbb8426aa229167d7f9d4b4e20f24bf42cb24 (patch) | |
tree | 5bddd73215b25274be3b6d7f4a9cb7a341b59a1b /drivers/net/cnic.c | |
parent | eaaa6e9c222d5c398488ed4216f0fd94e4b81759 (diff) | |
download | op-kernel-dev-42ecbb8426aa229167d7f9d4b4e20f24bf42cb24.zip op-kernel-dev-42ecbb8426aa229167d7f9d4b4e20f24bf42cb24.tar.gz |
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 1240dea..36c1578 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, return 0; } +static void cnic_cm_upcall(struct cnic_local *, struct cnic_sock *, u8); + static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, char *buf, u16 len) { @@ -351,7 +353,9 @@ static int cnic_iscsi_nl_msg_recv(struct cnic_dev *dev, u32 msg_type, } csk = &cp->csk_tbl[l5_cid]; csk_hold(csk); - if (cnic_in_use(csk)) { + if (cnic_in_use(csk) && + test_bit(SK_F_CONNECT_START, &csk->flags)) { + memcpy(csk->ha, path_resp->mac_addr, 6); if (test_bit(SK_F_IPV6, &csk->flags)) 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, else memcpy(&csk->src_ip[0], &path_resp->src.v4_addr, sizeof(struct in_addr)); - if (is_valid_ether_addr(csk->ha)) + + if (is_valid_ether_addr(csk->ha)) { cnic_cm_set_pg(csk); + } else if (!test_bit(SK_F_OFFLD_SCHED, &csk->flags) && + !test_bit(SK_F_OFFLD_COMPLETE, &csk->flags)) { + + cnic_cm_upcall(cp, csk, + L4_KCQE_OPCODE_VALUE_CONNECT_COMPLETE); + clear_bit(SK_F_CONNECT_START, &csk->flags); + } } csk_put(csk); rcu_read_unlock(); |