aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorVipul Pandya <vipul@chelsio.com>2012-12-10 04:30:55 -0500
committerRoland Dreier <roland@purestorage.com>2012-12-20 02:03:11 -0500
commit1cab775c3e75f1250c965feafd061d696df36e53 (patch)
tree5c87879096499a1beb4ac557c31a5d0e9ae861eb /drivers/net
parent5be78ee924ae8fb2b4a5b8d012a7d003849337ee (diff)
RDMA/cxgb4: Fix LE hash collision bug for passive open connection
It establishes passive open connection through firmware work request. Passive open connection will go through this path as now instead of listening server we create a server filter which will redirect the incoming SYN packet to the offload queue. After this driver tries to establish the connection using firmware work request. Signed-off-by: Vipul Pandya <vipul@chelsio.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c9
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_msg.h46
2 files changed, 55 insertions, 0 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 888bc7fc7a38..a7830a1d8b89 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -3317,6 +3317,10 @@ int cxgb4_create_server_filter(const struct net_device *dev, unsigned int stid,
3317 3317
3318 adap = netdev2adap(dev); 3318 adap = netdev2adap(dev);
3319 3319
3320 /* Adjust stid to correct filter index */
3321 stid -= adap->tids.nstids;
3322 stid += adap->tids.nftids;
3323
3320 /* Check to make sure the filter requested is writable ... 3324 /* Check to make sure the filter requested is writable ...
3321 */ 3325 */
3322 f = &adap->tids.ftid_tab[stid]; 3326 f = &adap->tids.ftid_tab[stid];
@@ -3365,6 +3369,11 @@ int cxgb4_remove_server_filter(const struct net_device *dev, unsigned int stid,
3365 struct adapter *adap; 3369 struct adapter *adap;
3366 3370
3367 adap = netdev2adap(dev); 3371 adap = netdev2adap(dev);
3372
3373 /* Adjust stid to correct filter index */
3374 stid -= adap->tids.nstids;
3375 stid += adap->tids.nftids;
3376
3368 f = &adap->tids.ftid_tab[stid]; 3377 f = &adap->tids.ftid_tab[stid];
3369 /* Unlock the filter */ 3378 /* Unlock the filter */
3370 f->locked = 0; 3379 f->locked = 0;
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h b/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
index dcf6d61794ea..261d17703adc 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_msg.h
@@ -199,6 +199,18 @@ struct work_request_hdr {
199 199
200#define WR_HDR struct work_request_hdr wr 200#define WR_HDR struct work_request_hdr wr
201 201
202/* option 0 fields */
203#define S_MSS_IDX 60
204#define M_MSS_IDX 0xF
205#define V_MSS_IDX(x) ((__u64)(x) << S_MSS_IDX)
206#define G_MSS_IDX(x) (((x) >> S_MSS_IDX) & M_MSS_IDX)
207
208/* option 2 fields */
209#define S_RSS_QUEUE 0
210#define M_RSS_QUEUE 0x3FF
211#define V_RSS_QUEUE(x) ((x) << S_RSS_QUEUE)
212#define G_RSS_QUEUE(x) (((x) >> S_RSS_QUEUE) & M_RSS_QUEUE)
213
202struct cpl_pass_open_req { 214struct cpl_pass_open_req {
203 WR_HDR; 215 WR_HDR;
204 union opcode_tid ot; 216 union opcode_tid ot;
@@ -300,6 +312,9 @@ struct cpl_pass_establish {
300 union opcode_tid ot; 312 union opcode_tid ot;
301 __be32 rsvd; 313 __be32 rsvd;
302 __be32 tos_stid; 314 __be32 tos_stid;
315#define PASS_OPEN_TID(x) ((x) << 0)
316#define PASS_OPEN_TOS(x) ((x) << 24)
317#define GET_PASS_OPEN_TID(x) (((x) >> 0) & 0xFFFFFF)
303#define GET_POPEN_TID(x) ((x) & 0xffffff) 318#define GET_POPEN_TID(x) ((x) & 0xffffff)
304#define GET_POPEN_TOS(x) (((x) >> 24) & 0xff) 319#define GET_POPEN_TOS(x) (((x) >> 24) & 0xff)
305 __be16 mac_idx; 320 __be16 mac_idx;
@@ -545,6 +560,37 @@ struct cpl_rx_pkt {
545 __be16 err_vec; 560 __be16 err_vec;
546}; 561};
547 562
563/* rx_pkt.l2info fields */
564#define S_RX_ETHHDR_LEN 0
565#define M_RX_ETHHDR_LEN 0x1F
566#define V_RX_ETHHDR_LEN(x) ((x) << S_RX_ETHHDR_LEN)
567#define G_RX_ETHHDR_LEN(x) (((x) >> S_RX_ETHHDR_LEN) & M_RX_ETHHDR_LEN)
568
569#define S_RX_MACIDX 8
570#define M_RX_MACIDX 0x1FF
571#define V_RX_MACIDX(x) ((x) << S_RX_MACIDX)
572#define G_RX_MACIDX(x) (((x) >> S_RX_MACIDX) & M_RX_MACIDX)
573
574#define S_RXF_SYN 21
575#define V_RXF_SYN(x) ((x) << S_RXF_SYN)
576#define F_RXF_SYN V_RXF_SYN(1U)
577
578#define S_RX_CHAN 28
579#define M_RX_CHAN 0xF
580#define V_RX_CHAN(x) ((x) << S_RX_CHAN)
581#define G_RX_CHAN(x) (((x) >> S_RX_CHAN) & M_RX_CHAN)
582
583/* rx_pkt.hdr_len fields */
584#define S_RX_TCPHDR_LEN 0
585#define M_RX_TCPHDR_LEN 0x3F
586#define V_RX_TCPHDR_LEN(x) ((x) << S_RX_TCPHDR_LEN)
587#define G_RX_TCPHDR_LEN(x) (((x) >> S_RX_TCPHDR_LEN) & M_RX_TCPHDR_LEN)
588
589#define S_RX_IPHDR_LEN 6
590#define M_RX_IPHDR_LEN 0x3FF
591#define V_RX_IPHDR_LEN(x) ((x) << S_RX_IPHDR_LEN)
592#define G_RX_IPHDR_LEN(x) (((x) >> S_RX_IPHDR_LEN) & M_RX_IPHDR_LEN)
593
548struct cpl_trace_pkt { 594struct cpl_trace_pkt {
549 u8 opcode; 595 u8 opcode;
550 u8 intf; 596 u8 intf;