cnic: Call cm_connect_complete() immediately on error
authorEddie Wai <waie@broadcom.com>
Thu, 23 Dec 2010 07:43:02 +0000 (07:43 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 23 Dec 2010 19:44:32 +0000 (11:44 -0800)
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>
drivers/net/cnic.c

index 1240deaf24206eb6ffc3e29983dddb803632b499..36c1578a1b1ec6dce6e84fe39e1c40a1dbc87c5f 100644 (file)
@@ -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();