@@ -587,24 +587,29 @@ static int send_flowc(struct c4iw_ep *ep)
587
587
{
588
588
struct fw_flowc_wr * flowc ;
589
589
struct sk_buff * skb = skb_dequeue (& ep -> com .ep_skb_list );
590
- int i ;
591
590
u16 vlan = ep -> l2t -> vlan ;
592
591
int nparams ;
592
+ int flowclen , flowclen16 ;
593
593
594
594
if (WARN_ON (!skb ))
595
595
return - ENOMEM ;
596
596
597
597
if (vlan == CPL_L2T_VLAN_NONE )
598
- nparams = 8 ;
599
- else
600
598
nparams = 9 ;
599
+ else
600
+ nparams = 10 ;
601
+
602
+ flowclen = offsetof(struct fw_flowc_wr , mnemval [nparams ]);
603
+ flowclen16 = DIV_ROUND_UP (flowclen , 16 );
604
+ flowclen = flowclen16 * 16 ;
601
605
602
- flowc = __skb_put (skb , FLOWC_LEN );
606
+ flowc = __skb_put (skb , flowclen );
607
+ memset (flowc , 0 , flowclen );
603
608
604
609
flowc -> op_to_nparams = cpu_to_be32 (FW_WR_OP_V (FW_FLOWC_WR ) |
605
610
FW_FLOWC_WR_NPARAMS_V (nparams ));
606
- flowc -> flowid_len16 = cpu_to_be32 (FW_WR_LEN16_V (DIV_ROUND_UP ( FLOWC_LEN ,
607
- 16 )) | FW_WR_FLOWID_V (ep -> hwtid ));
611
+ flowc -> flowid_len16 = cpu_to_be32 (FW_WR_LEN16_V (flowclen16 ) |
612
+ FW_WR_FLOWID_V (ep -> hwtid ));
608
613
609
614
flowc -> mnemval [0 ].mnemonic = FW_FLOWC_MNEM_PFNVFN ;
610
615
flowc -> mnemval [0 ].val = cpu_to_be32 (FW_PFVF_CMD_PFN_V
@@ -623,21 +628,13 @@ static int send_flowc(struct c4iw_ep *ep)
623
628
flowc -> mnemval [6 ].val = cpu_to_be32 (ep -> snd_win );
624
629
flowc -> mnemval [7 ].mnemonic = FW_FLOWC_MNEM_MSS ;
625
630
flowc -> mnemval [7 ].val = cpu_to_be32 (ep -> emss );
626
- if (nparams == 9 ) {
631
+ flowc -> mnemval [8 ].mnemonic = FW_FLOWC_MNEM_RCV_SCALE ;
632
+ flowc -> mnemval [8 ].val = cpu_to_be32 (ep -> snd_wscale );
633
+ if (nparams == 10 ) {
627
634
u16 pri ;
628
-
629
635
pri = (vlan & VLAN_PRIO_MASK ) >> VLAN_PRIO_SHIFT ;
630
- flowc -> mnemval [8 ].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS ;
631
- flowc -> mnemval [8 ].val = cpu_to_be32 (pri );
632
- } else {
633
- /* Pad WR to 16 byte boundary */
634
- flowc -> mnemval [8 ].mnemonic = 0 ;
635
- flowc -> mnemval [8 ].val = 0 ;
636
- }
637
- for (i = 0 ; i < 9 ; i ++ ) {
638
- flowc -> mnemval [i ].r4 [0 ] = 0 ;
639
- flowc -> mnemval [i ].r4 [1 ] = 0 ;
640
- flowc -> mnemval [i ].r4 [2 ] = 0 ;
636
+ flowc -> mnemval [9 ].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS ;
637
+ flowc -> mnemval [9 ].val = cpu_to_be32 (pri );
641
638
}
642
639
643
640
set_wr_txq (skb , CPL_PRIORITY_DATA , ep -> txq_idx );
@@ -1176,6 +1173,7 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
1176
1173
{
1177
1174
struct c4iw_ep * ep ;
1178
1175
struct cpl_act_establish * req = cplhdr (skb );
1176
+ unsigned short tcp_opt = ntohs (req -> tcp_opt );
1179
1177
unsigned int tid = GET_TID (req );
1180
1178
unsigned int atid = TID_TID_G (ntohl (req -> tos_atid ));
1181
1179
struct tid_info * t = dev -> rdev .lldi .tids ;
@@ -1196,8 +1194,9 @@ static int act_establish(struct c4iw_dev *dev, struct sk_buff *skb)
1196
1194
1197
1195
ep -> snd_seq = be32_to_cpu (req -> snd_isn );
1198
1196
ep -> rcv_seq = be32_to_cpu (req -> rcv_isn );
1197
+ ep -> snd_wscale = TCPOPT_SND_WSCALE_G (tcp_opt );
1199
1198
1200
- set_emss (ep , ntohs ( req -> tcp_opt ) );
1199
+ set_emss (ep , tcp_opt );
1201
1200
1202
1201
/* dealloc the atid */
1203
1202
remove_handle (ep -> com .dev , & ep -> com .dev -> atid_idr , atid );
@@ -2629,16 +2628,17 @@ static int pass_establish(struct c4iw_dev *dev, struct sk_buff *skb)
2629
2628
struct cpl_pass_establish * req = cplhdr (skb );
2630
2629
unsigned int tid = GET_TID (req );
2631
2630
int ret ;
2631
+ u16 tcp_opt = ntohs (req -> tcp_opt );
2632
2632
2633
2633
ep = get_ep_from_tid (dev , tid );
2634
2634
pr_debug ("ep %p tid %u\n" , ep , ep -> hwtid );
2635
2635
ep -> snd_seq = be32_to_cpu (req -> snd_isn );
2636
2636
ep -> rcv_seq = be32_to_cpu (req -> rcv_isn );
2637
+ ep -> snd_wscale = TCPOPT_SND_WSCALE_G (tcp_opt );
2637
2638
2638
- pr_debug ("ep %p hwtid %u tcp_opt 0x%02x\n" , ep , tid ,
2639
- ntohs (req -> tcp_opt ));
2639
+ pr_debug ("ep %p hwtid %u tcp_opt 0x%02x\n" , ep , tid , tcp_opt );
2640
2640
2641
- set_emss (ep , ntohs ( req -> tcp_opt ) );
2641
+ set_emss (ep , tcp_opt );
2642
2642
2643
2643
dst_confirm (ep -> dst );
2644
2644
mutex_lock (& ep -> com .mutex );
0 commit comments