forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/infiniband/hw/cxgb4/cm.c
....@@ -77,9 +77,9 @@
7777 module_param(enable_ecn, int, 0644);
7878 MODULE_PARM_DESC(enable_ecn, "Enable ECN (default=0/disabled)");
7979
80
-static int dack_mode = 1;
80
+static int dack_mode;
8181 module_param(dack_mode, int, 0644);
82
-MODULE_PARM_DESC(dack_mode, "Delayed ack mode (default=1)");
82
+MODULE_PARM_DESC(dack_mode, "Delayed ack mode (default=0)");
8383
8484 uint c4iw_max_read_depth = 32;
8585 module_param(c4iw_max_read_depth, int, 0644);
....@@ -331,20 +331,23 @@
331331 {
332332 unsigned long flags;
333333
334
- spin_lock_irqsave(&ep->com.dev->lock, flags);
335
- _remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid, 0);
336
- if (idr_is_empty(&ep->com.dev->hwtid_idr))
334
+ xa_lock_irqsave(&ep->com.dev->hwtids, flags);
335
+ __xa_erase(&ep->com.dev->hwtids, ep->hwtid);
336
+ if (xa_empty(&ep->com.dev->hwtids))
337337 wake_up(&ep->com.dev->wait);
338
- spin_unlock_irqrestore(&ep->com.dev->lock, flags);
338
+ xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);
339339 }
340340
341
-static void insert_ep_tid(struct c4iw_ep *ep)
341
+static int insert_ep_tid(struct c4iw_ep *ep)
342342 {
343343 unsigned long flags;
344
+ int err;
344345
345
- spin_lock_irqsave(&ep->com.dev->lock, flags);
346
- _insert_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep, ep->hwtid, 0);
347
- spin_unlock_irqrestore(&ep->com.dev->lock, flags);
346
+ xa_lock_irqsave(&ep->com.dev->hwtids, flags);
347
+ err = __xa_insert(&ep->com.dev->hwtids, ep->hwtid, ep, GFP_KERNEL);
348
+ xa_unlock_irqrestore(&ep->com.dev->hwtids, flags);
349
+
350
+ return err;
348351 }
349352
350353 /*
....@@ -355,11 +358,11 @@
355358 struct c4iw_ep *ep;
356359 unsigned long flags;
357360
358
- spin_lock_irqsave(&dev->lock, flags);
359
- ep = idr_find(&dev->hwtid_idr, tid);
361
+ xa_lock_irqsave(&dev->hwtids, flags);
362
+ ep = xa_load(&dev->hwtids, tid);
360363 if (ep)
361364 c4iw_get_ep(&ep->com);
362
- spin_unlock_irqrestore(&dev->lock, flags);
365
+ xa_unlock_irqrestore(&dev->hwtids, flags);
363366 return ep;
364367 }
365368
....@@ -372,11 +375,11 @@
372375 struct c4iw_listen_ep *ep;
373376 unsigned long flags;
374377
375
- spin_lock_irqsave(&dev->lock, flags);
376
- ep = idr_find(&dev->stid_idr, stid);
378
+ xa_lock_irqsave(&dev->stids, flags);
379
+ ep = xa_load(&dev->stids, stid);
377380 if (ep)
378381 c4iw_get_ep(&ep->com);
379
- spin_unlock_irqrestore(&dev->lock, flags);
382
+ xa_unlock_irqrestore(&dev->stids, flags);
380383 return ep;
381384 }
382385
....@@ -403,8 +406,7 @@
403406 ep->com.local_addr.ss_family);
404407 dst_release(ep->dst);
405408 cxgb4_l2t_release(ep->l2t);
406
- if (ep->mpa_skb)
407
- kfree_skb(ep->mpa_skb);
409
+ kfree_skb(ep->mpa_skb);
408410 }
409411 if (!skb_queue_empty(&ep->com.ep_skb_list))
410412 skb_queue_purge(&ep->com.ep_skb_list);
....@@ -556,7 +558,7 @@
556558 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
557559 (const u32 *)&sin6->sin6_addr.s6_addr, 1);
558560 }
559
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
561
+ xa_erase_irq(&ep->com.dev->atids, ep->atid);
560562 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
561563 queue_arp_failure_cpl(ep, skb, FAKE_CPL_PUT_EP_SAFE);
562564 }
....@@ -656,7 +658,33 @@
656658 return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
657659 }
658660
659
-static int send_abort(struct c4iw_ep *ep)
661
+static void read_tcb(struct c4iw_ep *ep)
662
+{
663
+ struct sk_buff *skb;
664
+ struct cpl_get_tcb *req;
665
+ int wrlen = roundup(sizeof(*req), 16);
666
+
667
+ skb = get_skb(NULL, sizeof(*req), GFP_KERNEL);
668
+ if (WARN_ON(!skb))
669
+ return;
670
+
671
+ set_wr_txq(skb, CPL_PRIORITY_CONTROL, ep->ctrlq_idx);
672
+ req = (struct cpl_get_tcb *) skb_put(skb, wrlen);
673
+ memset(req, 0, wrlen);
674
+ INIT_TP_WR(req, ep->hwtid);
675
+ OPCODE_TID(req) = cpu_to_be32(MK_OPCODE_TID(CPL_GET_TCB, ep->hwtid));
676
+ req->reply_ctrl = htons(REPLY_CHAN_V(0) | QUEUENO_V(ep->rss_qid));
677
+
678
+ /*
679
+ * keep a ref on the ep so the tcb is not unlocked before this
680
+ * cpl completes. The ref is released in read_tcb_rpl().
681
+ */
682
+ c4iw_get_ep(&ep->com);
683
+ if (WARN_ON(c4iw_ofld_send(&ep->com.dev->rdev, skb)))
684
+ c4iw_put_ep(&ep->com);
685
+}
686
+
687
+static int send_abort_req(struct c4iw_ep *ep)
660688 {
661689 u32 wrlen = roundup(sizeof(struct cpl_abort_req), 16);
662690 struct sk_buff *req_skb = skb_dequeue(&ep->com.ep_skb_list);
....@@ -669,6 +697,17 @@
669697 ep, abort_arp_failure);
670698
671699 return c4iw_l2t_send(&ep->com.dev->rdev, req_skb, ep->l2t);
700
+}
701
+
702
+static int send_abort(struct c4iw_ep *ep)
703
+{
704
+ if (!ep->com.qp || !ep->com.qp->srq) {
705
+ send_abort_req(ep);
706
+ return 0;
707
+ }
708
+ set_bit(ABORT_REQ_IN_PROGRESS, &ep->com.flags);
709
+ read_tcb(ep);
710
+ return 0;
672711 }
673712
674713 static int send_connect(struct c4iw_ep *ep)
....@@ -912,7 +951,7 @@
912951 mpalen = sizeof(*mpa) + ep->plen;
913952 if (mpa_rev_to_use == 2)
914953 mpalen += sizeof(struct mpa_v2_conn_params);
915
- wrlen = roundup(mpalen + sizeof *req, 16);
954
+ wrlen = roundup(mpalen + sizeof(*req), 16);
916955 skb = get_skb(skb, wrlen, GFP_KERNEL);
917956 if (!skb) {
918957 connect_reply_upcall(ep, -ENOMEM);
....@@ -956,8 +995,9 @@
956995 }
957996
958997 if (mpa_rev_to_use == 2) {
959
- mpa->private_data_size = htons(ntohs(mpa->private_data_size) +
960
- sizeof (struct mpa_v2_conn_params));
998
+ mpa->private_data_size =
999
+ htons(ntohs(mpa->private_data_size) +
1000
+ sizeof(struct mpa_v2_conn_params));
9611001 pr_debug("initiator ird %u ord %u\n", ep->ird,
9621002 ep->ord);
9631003 mpa_v2_params.ird = htons((u16)ep->ird);
....@@ -1016,7 +1056,7 @@
10161056 mpalen = sizeof(*mpa) + plen;
10171057 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn)
10181058 mpalen += sizeof(struct mpa_v2_conn_params);
1019
- wrlen = roundup(mpalen + sizeof *req, 16);
1059
+ wrlen = roundup(mpalen + sizeof(*req), 16);
10201060
10211061 skb = get_skb(NULL, wrlen, GFP_KERNEL);
10221062 if (!skb) {
....@@ -1047,8 +1087,9 @@
10471087
10481088 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {
10491089 mpa->flags |= MPA_ENHANCED_RDMA_CONN;
1050
- mpa->private_data_size = htons(ntohs(mpa->private_data_size) +
1051
- sizeof (struct mpa_v2_conn_params));
1090
+ mpa->private_data_size =
1091
+ htons(ntohs(mpa->private_data_size) +
1092
+ sizeof(struct mpa_v2_conn_params));
10521093 mpa_v2_params.ird = htons(((u16)ep->ird) |
10531094 (peer2peer ? MPA_V2_PEER2PEER_MODEL :
10541095 0));
....@@ -1095,7 +1136,7 @@
10951136 mpalen = sizeof(*mpa) + plen;
10961137 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn)
10971138 mpalen += sizeof(struct mpa_v2_conn_params);
1098
- wrlen = roundup(mpalen + sizeof *req, 16);
1139
+ wrlen = roundup(mpalen + sizeof(*req), 16);
10991140
11001141 skb = get_skb(NULL, wrlen, GFP_KERNEL);
11011142 if (!skb) {
....@@ -1130,8 +1171,9 @@
11301171
11311172 if (ep->mpa_attr.version == 2 && ep->mpa_attr.enhanced_rdma_conn) {
11321173 mpa->flags |= MPA_ENHANCED_RDMA_CONN;
1133
- mpa->private_data_size = htons(ntohs(mpa->private_data_size) +
1134
- sizeof (struct mpa_v2_conn_params));
1174
+ mpa->private_data_size =
1175
+ htons(ntohs(mpa->private_data_size) +
1176
+ sizeof(struct mpa_v2_conn_params));
11351177 mpa_v2_params.ird = htons((u16)ep->ird);
11361178 mpa_v2_params.ord = htons((u16)ep->ord);
11371179 if (peer2peer && (ep->mpa_attr.p2p_type !=
....@@ -1199,7 +1241,7 @@
11991241 set_emss(ep, tcp_opt);
12001242
12011243 /* dealloc the atid */
1202
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr, atid);
1244
+ xa_erase_irq(&ep->com.dev->atids, atid);
12031245 cxgb4_free_atid(t, atid);
12041246 set_bit(ACT_ESTAB, &ep->com.history);
12051247
....@@ -1852,14 +1894,11 @@
18521894 return 0;
18531895 }
18541896
1855
-static void complete_cached_srq_buffers(struct c4iw_ep *ep,
1856
- __be32 srqidx_status)
1897
+static void complete_cached_srq_buffers(struct c4iw_ep *ep, u32 srqidx)
18571898 {
18581899 enum chip_type adapter_type;
1859
- u32 srqidx;
18601900
18611901 adapter_type = ep->com.dev->rdev.lldi.adapter_type;
1862
- srqidx = ABORT_RSS_SRQIDX_G(be32_to_cpu(srqidx_status));
18631902
18641903 /*
18651904 * If this TCB had a srq buffer cached, then we must complete
....@@ -1877,6 +1916,7 @@
18771916
18781917 static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
18791918 {
1919
+ u32 srqidx;
18801920 struct c4iw_ep *ep;
18811921 struct cpl_abort_rpl_rss6 *rpl = cplhdr(skb);
18821922 int release = 0;
....@@ -1888,7 +1928,10 @@
18881928 return 0;
18891929 }
18901930
1891
- complete_cached_srq_buffers(ep, rpl->srqidx_status);
1931
+ if (ep->com.qp && ep->com.qp->srq) {
1932
+ srqidx = ABORT_RSS_SRQIDX_G(be32_to_cpu(rpl->srqidx_status));
1933
+ complete_cached_srq_buffers(ep, srqidx ? srqidx : ep->srqe_idx);
1934
+ }
18921935
18931936 pr_debug("ep %p tid %u\n", ep, ep->hwtid);
18941937 mutex_lock(&ep->com.mutex);
....@@ -2061,8 +2104,7 @@
20612104 }
20622105 ep->mtu = pdev->mtu;
20632106 ep->tx_chan = cxgb4_port_chan(pdev);
2064
- ep->smac_idx = cxgb4_tp_smt_idx(adapter_type,
2065
- cxgb4_port_viid(pdev));
2107
+ ep->smac_idx = ((struct port_info *)netdev_priv(pdev))->smt_idx;
20662108 step = cdev->rdev.lldi.ntxq /
20672109 cdev->rdev.lldi.nchan;
20682110 ep->txq_idx = cxgb4_port_idx(pdev) * step;
....@@ -2081,8 +2123,7 @@
20812123 goto out;
20822124 ep->mtu = dst_mtu(dst);
20832125 ep->tx_chan = cxgb4_port_chan(pdev);
2084
- ep->smac_idx = cxgb4_tp_smt_idx(adapter_type,
2085
- cxgb4_port_viid(pdev));
2126
+ ep->smac_idx = ((struct port_info *)netdev_priv(pdev))->smt_idx;
20862127 step = cdev->rdev.lldi.ntxq /
20872128 cdev->rdev.lldi.nchan;
20882129 ep->txq_idx = cxgb4_port_idx(pdev) * step;
....@@ -2149,7 +2190,9 @@
21492190 err = -ENOMEM;
21502191 goto fail2;
21512192 }
2152
- insert_handle(ep->com.dev, &ep->com.dev->atid_idr, ep, ep->atid);
2193
+ err = xa_insert_irq(&ep->com.dev->atids, ep->atid, ep, GFP_KERNEL);
2194
+ if (err)
2195
+ goto fail2a;
21532196
21542197 /* find a route */
21552198 if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) {
....@@ -2201,7 +2244,8 @@
22012244 fail4:
22022245 dst_release(ep->dst);
22032246 fail3:
2204
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
2247
+ xa_erase_irq(&ep->com.dev->atids, ep->atid);
2248
+fail2a:
22052249 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
22062250 fail2:
22072251 /*
....@@ -2284,8 +2328,7 @@
22842328 (const u32 *)
22852329 &sin6->sin6_addr.s6_addr, 1);
22862330 }
2287
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr,
2288
- atid);
2331
+ xa_erase_irq(&ep->com.dev->atids, atid);
22892332 cxgb4_free_atid(t, atid);
22902333 dst_release(ep->dst);
22912334 cxgb4_l2t_release(ep->l2t);
....@@ -2322,7 +2365,7 @@
23222365 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, GET_TID(rpl),
23232366 ep->com.local_addr.ss_family);
23242367
2325
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr, atid);
2368
+ xa_erase_irq(&ep->com.dev->atids, atid);
23262369 cxgb4_free_atid(t, atid);
23272370 dst_release(ep->dst);
23282371 cxgb4_l2t_release(ep->l2t);
....@@ -2482,7 +2525,7 @@
24822525 u16 peer_mss = ntohs(req->tcpopt.mss);
24832526 int iptype;
24842527 unsigned short hdrs;
2485
- u8 tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));
2528
+ u8 tos;
24862529
24872530 parent_ep = (struct c4iw_ep *)get_ep_from_stid(dev, stid);
24882531 if (!parent_ep) {
....@@ -2495,6 +2538,11 @@
24952538 pr_err("%s - listening ep not in LISTEN\n", __func__);
24962539 goto reject;
24972540 }
2541
+
2542
+ if (parent_ep->com.cm_id->tos_set)
2543
+ tos = parent_ep->com.cm_id->tos;
2544
+ else
2545
+ tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));
24982546
24992547 cxgb_get_4tuple(req, parent_ep->com.dev->rdev.lldi.adapter_type,
25002548 &iptype, local_ip, peer_ip, &local_port, &peer_port);
....@@ -2515,7 +2563,7 @@
25152563 ntohs(peer_port), peer_mss);
25162564 dst = cxgb_find_route6(&dev->rdev.lldi, get_real_dev,
25172565 local_ip, peer_ip, local_port, peer_port,
2518
- PASS_OPEN_TOS_G(ntohl(req->tos_stid)),
2566
+ tos,
25192567 ((struct sockaddr_in6 *)
25202568 &parent_ep->com.local_addr)->sin6_scope_id);
25212569 }
....@@ -2746,6 +2794,21 @@
27462794 return 0;
27472795 }
27482796
2797
+static void finish_peer_abort(struct c4iw_dev *dev, struct c4iw_ep *ep)
2798
+{
2799
+ complete_cached_srq_buffers(ep, ep->srqe_idx);
2800
+ if (ep->com.cm_id && ep->com.qp) {
2801
+ struct c4iw_qp_attributes attrs;
2802
+
2803
+ attrs.next_state = C4IW_QP_STATE_ERROR;
2804
+ c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
2805
+ C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
2806
+ }
2807
+ peer_abort_upcall(ep);
2808
+ release_ep_resources(ep);
2809
+ c4iw_put_ep(&ep->com);
2810
+}
2811
+
27492812 static int peer_abort(struct c4iw_dev *dev, struct sk_buff *skb)
27502813 {
27512814 struct cpl_abort_req_rss6 *req = cplhdr(skb);
....@@ -2756,6 +2819,7 @@
27562819 int release = 0;
27572820 unsigned int tid = GET_TID(req);
27582821 u8 status;
2822
+ u32 srqidx;
27592823
27602824 u32 len = roundup(sizeof(struct cpl_abort_rpl), 16);
27612825
....@@ -2774,8 +2838,6 @@
27742838 mutex_unlock(&dev->rdev.stats.lock);
27752839 goto deref_ep;
27762840 }
2777
-
2778
- complete_cached_srq_buffers(ep, req->srqidx_status);
27792841
27802842 pr_debug("ep %p tid %u state %u\n", ep, ep->hwtid,
27812843 ep->com.state);
....@@ -2823,8 +2885,24 @@
28232885 case MORIBUND:
28242886 case CLOSING:
28252887 stop_ep_timer(ep);
2826
- /*FALLTHROUGH*/
2888
+ fallthrough;
28272889 case FPDU_MODE:
2890
+ if (ep->com.qp && ep->com.qp->srq) {
2891
+ srqidx = ABORT_RSS_SRQIDX_G(
2892
+ be32_to_cpu(req->srqidx_status));
2893
+ if (srqidx) {
2894
+ complete_cached_srq_buffers(ep, srqidx);
2895
+ } else {
2896
+ /* Hold ep ref until finish_peer_abort() */
2897
+ c4iw_get_ep(&ep->com);
2898
+ __state_set(&ep->com, ABORTING);
2899
+ set_bit(PEER_ABORT_IN_PROGRESS, &ep->com.flags);
2900
+ read_tcb(ep);
2901
+ break;
2902
+
2903
+ }
2904
+ }
2905
+
28282906 if (ep->com.cm_id && ep->com.qp) {
28292907 attrs.next_state = C4IW_QP_STATE_ERROR;
28302908 ret = c4iw_modify_qp(ep->com.qp->rhp,
....@@ -2876,7 +2954,7 @@
28762954 (const u32 *)&sin6->sin6_addr.s6_addr,
28772955 1);
28782956 }
2879
- remove_handle(ep->com.dev, &ep->com.dev->hwtid_idr, ep->hwtid);
2957
+ xa_erase_irq(&ep->com.dev->hwtids, ep->hwtid);
28802958 cxgb4_remove_tid(ep->com.dev->rdev.lldi.tids, 0, ep->hwtid,
28812959 ep->com.local_addr.ss_family);
28822960 dst_release(ep->dst);
....@@ -2957,6 +3035,10 @@
29573035 C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
29583036 }
29593037
3038
+ /* As per draft-hilland-iwarp-verbs-v1.0, sec 6.2.3,
3039
+ * when entering the TERM state the RNIC MUST initiate a CLOSE.
3040
+ */
3041
+ c4iw_ep_disconnect(ep, 1, GFP_KERNEL);
29603042 c4iw_put_ep(&ep->com);
29613043 } else
29623044 pr_warn("TERM received tid %u no ep/qp\n", tid);
....@@ -3152,17 +3234,22 @@
31523234 int found = 0;
31533235 struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
31543236 struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
3237
+ const struct in_ifaddr *ifa;
31553238
31563239 ind = in_dev_get(dev->rdev.lldi.ports[0]);
31573240 if (!ind)
31583241 return -EADDRNOTAVAIL;
3159
- for_primary_ifa(ind) {
3242
+ rcu_read_lock();
3243
+ in_dev_for_each_ifa_rcu(ifa, ind) {
3244
+ if (ifa->ifa_flags & IFA_F_SECONDARY)
3245
+ continue;
31603246 laddr->sin_addr.s_addr = ifa->ifa_address;
31613247 raddr->sin_addr.s_addr = ifa->ifa_address;
31623248 found = 1;
31633249 break;
31643250 }
3165
- endfor_ifa(ind);
3251
+ rcu_read_unlock();
3252
+
31663253 in_dev_put(ind);
31673254 return found ? 0 : -EADDRNOTAVAIL;
31683255 }
....@@ -3195,7 +3282,7 @@
31953282
31963283 static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)
31973284 {
3198
- struct in6_addr uninitialized_var(addr);
3285
+ struct in6_addr addr;
31993286 struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
32003287 struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;
32013288
....@@ -3271,7 +3358,9 @@
32713358 err = -ENOMEM;
32723359 goto fail2;
32733360 }
3274
- insert_handle(dev, &dev->atid_idr, ep, ep->atid);
3361
+ err = xa_insert_irq(&dev->atids, ep->atid, ep, GFP_KERNEL);
3362
+ if (err)
3363
+ goto fail5;
32753364
32763365 memcpy(&ep->com.local_addr, &cm_id->m_local_addr,
32773366 sizeof(ep->com.local_addr));
....@@ -3359,7 +3448,8 @@
33593448 fail4:
33603449 dst_release(ep->dst);
33613450 fail3:
3362
- remove_handle(ep->com.dev, &ep->com.dev->atid_idr, ep->atid);
3451
+ xa_erase_irq(&ep->com.dev->atids, ep->atid);
3452
+fail5:
33633453 cxgb4_free_atid(ep->com.dev->rdev.lldi.tids, ep->atid);
33643454 fail2:
33653455 skb_queue_purge(&ep->com.ep_skb_list);
....@@ -3482,7 +3572,9 @@
34823572 err = -ENOMEM;
34833573 goto fail2;
34843574 }
3485
- insert_handle(dev, &dev->stid_idr, ep, ep->stid);
3575
+ err = xa_insert_irq(&dev->stids, ep->stid, ep, GFP_KERNEL);
3576
+ if (err)
3577
+ goto fail3;
34863578
34873579 state_set(&ep->com, LISTEN);
34883580 if (ep->com.local_addr.ss_family == AF_INET)
....@@ -3493,7 +3585,8 @@
34933585 cm_id->provider_data = ep;
34943586 goto out;
34953587 }
3496
- remove_handle(ep->com.dev, &ep->com.dev->stid_idr, ep->stid);
3588
+ xa_erase_irq(&ep->com.dev->stids, ep->stid);
3589
+fail3:
34973590 cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
34983591 ep->com.local_addr.ss_family);
34993592 fail2:
....@@ -3533,7 +3626,7 @@
35333626 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
35343627 (const u32 *)&sin6->sin6_addr.s6_addr, 1);
35353628 }
3536
- remove_handle(ep->com.dev, &ep->com.dev->stid_idr, ep->stid);
3629
+ xa_erase_irq(&ep->com.dev->stids, ep->stid);
35373630 cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
35383631 ep->com.local_addr.ss_family);
35393632 done:
....@@ -3667,7 +3760,7 @@
36673760 send_fw_act_open_req(ep, atid);
36683761 return;
36693762 }
3670
- /* fall through */
3763
+ fallthrough;
36713764 case FW_EADDRINUSE:
36723765 set_bit(ACT_RETRY_INUSE, &ep->com.history);
36733766 if (ep->retry_count++ < ACT_OPEN_RETRY_COUNT) {
....@@ -3693,7 +3786,7 @@
36933786 cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
36943787 (const u32 *)&sin6->sin6_addr.s6_addr, 1);
36953788 }
3696
- remove_handle(dev, &dev->atid_idr, atid);
3789
+ xa_erase_irq(&dev->atids, atid);
36973790 cxgb4_free_atid(dev->rdev.lldi.tids, atid);
36983791 dst_release(ep->dst);
36993792 cxgb4_l2t_release(ep->l2t);
....@@ -3724,6 +3817,80 @@
37243817 kfree_skb(rpl_skb);
37253818 }
37263819 return;
3820
+}
3821
+
3822
+static inline u64 t4_tcb_get_field64(__be64 *tcb, u16 word)
3823
+{
3824
+ u64 tlo = be64_to_cpu(tcb[((31 - word) / 2)]);
3825
+ u64 thi = be64_to_cpu(tcb[((31 - word) / 2) - 1]);
3826
+ u64 t;
3827
+ u32 shift = 32;
3828
+
3829
+ t = (thi << shift) | (tlo >> shift);
3830
+
3831
+ return t;
3832
+}
3833
+
3834
+static inline u32 t4_tcb_get_field32(__be64 *tcb, u16 word, u32 mask, u32 shift)
3835
+{
3836
+ u32 v;
3837
+ u64 t = be64_to_cpu(tcb[(31 - word) / 2]);
3838
+
3839
+ if (word & 0x1)
3840
+ shift += 32;
3841
+ v = (t >> shift) & mask;
3842
+ return v;
3843
+}
3844
+
3845
+static int read_tcb_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
3846
+{
3847
+ struct cpl_get_tcb_rpl *rpl = cplhdr(skb);
3848
+ __be64 *tcb = (__be64 *)(rpl + 1);
3849
+ unsigned int tid = GET_TID(rpl);
3850
+ struct c4iw_ep *ep;
3851
+ u64 t_flags_64;
3852
+ u32 rx_pdu_out;
3853
+
3854
+ ep = get_ep_from_tid(dev, tid);
3855
+ if (!ep)
3856
+ return 0;
3857
+ /* Examine the TF_RX_PDU_OUT (bit 49 of the t_flags) in order to
3858
+ * determine if there's a rx PDU feedback event pending.
3859
+ *
3860
+ * If that bit is set, it means we'll need to re-read the TCB's
3861
+ * rq_start value. The final value is the one present in a TCB
3862
+ * with the TF_RX_PDU_OUT bit cleared.
3863
+ */
3864
+
3865
+ t_flags_64 = t4_tcb_get_field64(tcb, TCB_T_FLAGS_W);
3866
+ rx_pdu_out = (t_flags_64 & TF_RX_PDU_OUT_V(1)) >> TF_RX_PDU_OUT_S;
3867
+
3868
+ c4iw_put_ep(&ep->com); /* from get_ep_from_tid() */
3869
+ c4iw_put_ep(&ep->com); /* from read_tcb() */
3870
+
3871
+ /* If TF_RX_PDU_OUT bit is set, re-read the TCB */
3872
+ if (rx_pdu_out) {
3873
+ if (++ep->rx_pdu_out_cnt >= 2) {
3874
+ WARN_ONCE(1, "tcb re-read() reached the guard limit, finishing the cleanup\n");
3875
+ goto cleanup;
3876
+ }
3877
+ read_tcb(ep);
3878
+ return 0;
3879
+ }
3880
+
3881
+ ep->srqe_idx = t4_tcb_get_field32(tcb, TCB_RQ_START_W, TCB_RQ_START_M,
3882
+ TCB_RQ_START_S);
3883
+cleanup:
3884
+ pr_debug("ep %p tid %u %016x\n", ep, ep->hwtid, ep->srqe_idx);
3885
+
3886
+ if (test_bit(PEER_ABORT_IN_PROGRESS, &ep->com.flags))
3887
+ finish_peer_abort(dev, ep);
3888
+ else if (test_bit(ABORT_REQ_IN_PROGRESS, &ep->com.flags))
3889
+ send_abort_req(ep);
3890
+ else
3891
+ WARN_ONCE(1, "unexpected state!");
3892
+
3893
+ return 0;
37273894 }
37283895
37293896 static int deferred_fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)
....@@ -3952,7 +4119,7 @@
39524119 } else {
39534120 vlan_eh = (struct vlan_ethhdr *)(req + 1);
39544121 iph = (struct iphdr *)(vlan_eh + 1);
3955
- skb->vlan_tci = ntohs(cpl->vlan);
4122
+ __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), ntohs(cpl->vlan));
39564123 }
39574124
39584125 if (iph->version != 0x4)
....@@ -4046,6 +4213,7 @@
40464213 [CPL_CLOSE_CON_RPL] = close_con_rpl,
40474214 [CPL_RDMA_TERMINATE] = terminate,
40484215 [CPL_FW4_ACK] = fw4_ack,
4216
+ [CPL_GET_TCB_RPL] = read_tcb_rpl,
40494217 [CPL_FW6_MSG] = deferred_fw6_msg,
40504218 [CPL_RX_PKT] = rx_pkt,
40514219 [FAKE_CPL_PUT_EP_SAFE] = _put_ep_safe,
....@@ -4277,6 +4445,7 @@
42774445 [CPL_RDMA_TERMINATE] = sched,
42784446 [CPL_FW4_ACK] = sched,
42794447 [CPL_SET_TCB_RPL] = set_tcb_rpl,
4448
+ [CPL_GET_TCB_RPL] = sched,
42804449 [CPL_FW6_MSG] = fw6_msg,
42814450 [CPL_RX_PKT] = sched
42824451 };