@@ -485,12 +485,19 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
485
485
unsigned int flowclen = 80 ;
486
486
struct fw_flowc_wr * flowc ;
487
487
int i ;
488
+ u16 vlan = ep -> l2t -> vlan ;
489
+ int nparams ;
490
+
491
+ if (vlan == CPL_L2T_VLAN_NONE )
492
+ nparams = 8 ;
493
+ else
494
+ nparams = 9 ;
488
495
489
496
skb = get_skb (skb , flowclen , GFP_KERNEL );
490
497
flowc = (struct fw_flowc_wr * )__skb_put (skb , flowclen );
491
498
492
499
flowc -> op_to_nparams = cpu_to_be32 (FW_WR_OP_V (FW_FLOWC_WR ) |
493
- FW_FLOWC_WR_NPARAMS_V (8 ));
500
+ FW_FLOWC_WR_NPARAMS_V (nparams ));
494
501
flowc -> flowid_len16 = cpu_to_be32 (FW_WR_LEN16_V (DIV_ROUND_UP (flowclen ,
495
502
16 )) | FW_WR_FLOWID_V (ep -> hwtid ));
496
503
@@ -511,9 +518,17 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
511
518
flowc -> mnemval [6 ].val = cpu_to_be32 (ep -> snd_win );
512
519
flowc -> mnemval [7 ].mnemonic = FW_FLOWC_MNEM_MSS ;
513
520
flowc -> mnemval [7 ].val = cpu_to_be32 (ep -> emss );
514
- /* Pad WR to 16 byte boundary */
515
- flowc -> mnemval [8 ].mnemonic = 0 ;
516
- flowc -> mnemval [8 ].val = 0 ;
521
+ if (nparams == 9 ) {
522
+ u16 pri ;
523
+
524
+ pri = (vlan & VLAN_PRIO_MASK ) >> VLAN_PRIO_SHIFT ;
525
+ flowc -> mnemval [8 ].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS ;
526
+ flowc -> mnemval [8 ].val = cpu_to_be32 (pri );
527
+ } else {
528
+ /* Pad WR to 16 byte boundary */
529
+ flowc -> mnemval [8 ].mnemonic = 0 ;
530
+ flowc -> mnemval [8 ].val = 0 ;
531
+ }
517
532
for (i = 0 ; i < 9 ; i ++ ) {
518
533
flowc -> mnemval [i ].r4 [0 ] = 0 ;
519
534
flowc -> mnemval [i ].r4 [1 ] = 0 ;
@@ -710,7 +725,7 @@ static int send_connect(struct c4iw_ep *ep)
710
725
L2T_IDX_V (ep -> l2t -> idx ) |
711
726
TX_CHAN_V (ep -> tx_chan ) |
712
727
SMAC_SEL_V (ep -> smac_idx ) |
713
- DSCP_V (ep -> tos ) |
728
+ DSCP_V (ep -> tos >> 2 ) |
714
729
ULP_MODE_V (ULP_MODE_TCPDDP ) |
715
730
RCV_BUFSIZ_V (win );
716
731
opt2 = RX_CHANNEL_V (0 ) |
@@ -1864,7 +1879,7 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid)
1864
1879
L2T_IDX_V (ep -> l2t -> idx ) |
1865
1880
TX_CHAN_V (ep -> tx_chan ) |
1866
1881
SMAC_SEL_V (ep -> smac_idx ) |
1867
- DSCP_V (ep -> tos ) |
1882
+ DSCP_V (ep -> tos >> 2 ) |
1868
1883
ULP_MODE_V (ULP_MODE_TCPDDP ) |
1869
1884
RCV_BUFSIZ_V (win ));
1870
1885
req -> tcb .opt2 = (__force __be32 ) (PACE_V (1 ) |
@@ -1928,7 +1943,7 @@ static void set_tcp_window(struct c4iw_ep *ep, struct port_info *pi)
1928
1943
1929
1944
static int import_ep (struct c4iw_ep * ep , int iptype , __u8 * peer_ip ,
1930
1945
struct dst_entry * dst , struct c4iw_dev * cdev ,
1931
- bool clear_mpa_v1 , enum chip_type adapter_type )
1946
+ bool clear_mpa_v1 , enum chip_type adapter_type , u8 tos )
1932
1947
{
1933
1948
struct neighbour * n ;
1934
1949
int err , step ;
@@ -1958,7 +1973,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
1958
1973
goto out ;
1959
1974
}
1960
1975
ep -> l2t = cxgb4_l2t_get (cdev -> rdev .lldi .l2t ,
1961
- n , pdev , 0 );
1976
+ n , pdev , rt_tos2priority ( tos ) );
1962
1977
if (!ep -> l2t )
1963
1978
goto out ;
1964
1979
ep -> mtu = pdev -> mtu ;
@@ -2041,7 +2056,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
2041
2056
if (ep -> com .cm_id -> local_addr .ss_family == AF_INET ) {
2042
2057
ep -> dst = find_route (ep -> com .dev , laddr -> sin_addr .s_addr ,
2043
2058
raddr -> sin_addr .s_addr , laddr -> sin_port ,
2044
- raddr -> sin_port , 0 );
2059
+ raddr -> sin_port , ep -> com . cm_id -> tos );
2045
2060
iptype = 4 ;
2046
2061
ra = (__u8 * )& raddr -> sin_addr ;
2047
2062
} else {
@@ -2058,7 +2073,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
2058
2073
goto fail3 ;
2059
2074
}
2060
2075
err = import_ep (ep , iptype , ra , ep -> dst , ep -> com .dev , false,
2061
- ep -> com .dev -> rdev .lldi .adapter_type );
2076
+ ep -> com .dev -> rdev .lldi .adapter_type ,
2077
+ ep -> com .cm_id -> tos );
2062
2078
if (err ) {
2063
2079
pr_err ("%s - cannot alloc l2e.\n" , __func__ );
2064
2080
goto fail4 ;
@@ -2069,7 +2085,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
2069
2085
ep -> l2t -> idx );
2070
2086
2071
2087
state_set (& ep -> com , CONNECTING );
2072
- ep -> tos = 0 ;
2088
+ ep -> tos = ep -> com . cm_id -> tos ;
2073
2089
2074
2090
/* send connect request to rnic */
2075
2091
err = send_connect (ep );
@@ -2391,6 +2407,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2391
2407
u16 peer_mss = ntohs (req -> tcpopt .mss );
2392
2408
int iptype ;
2393
2409
unsigned short hdrs ;
2410
+ u8 tos = PASS_OPEN_TOS_G (ntohl (req -> tos_stid ));
2394
2411
2395
2412
parent_ep = lookup_stid (t , stid );
2396
2413
if (!parent_ep ) {
@@ -2414,7 +2431,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2414
2431
ntohs (peer_port ), peer_mss );
2415
2432
dst = find_route (dev , * (__be32 * )local_ip , * (__be32 * )peer_ip ,
2416
2433
local_port , peer_port ,
2417
- PASS_OPEN_TOS_G ( ntohl ( req -> tos_stid )) );
2434
+ tos );
2418
2435
} else {
2419
2436
PDBG ("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"
2420
2437
, __func__ , parent_ep , hwtid ,
@@ -2440,7 +2457,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2440
2457
}
2441
2458
2442
2459
err = import_ep (child_ep , iptype , peer_ip , dst , dev , false,
2443
- parent_ep -> com .dev -> rdev .lldi .adapter_type );
2460
+ parent_ep -> com .dev -> rdev .lldi .adapter_type , tos );
2444
2461
if (err ) {
2445
2462
printk (KERN_ERR MOD "%s - failed to allocate l2t entry!\n" ,
2446
2463
__func__ );
@@ -2508,7 +2525,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
2508
2525
2509
2526
c4iw_get_ep (& parent_ep -> com );
2510
2527
child_ep -> parent_ep = parent_ep ;
2511
- child_ep -> tos = PASS_OPEN_TOS_G ( ntohl ( req -> tos_stid )) ;
2528
+ child_ep -> tos = tos ;
2512
2529
child_ep -> dst = dst ;
2513
2530
child_ep -> hwtid = hwtid ;
2514
2531
@@ -3202,7 +3219,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3202
3219
ra , ntohs (raddr -> sin_port ));
3203
3220
ep -> dst = find_route (dev , laddr -> sin_addr .s_addr ,
3204
3221
raddr -> sin_addr .s_addr , laddr -> sin_port ,
3205
- raddr -> sin_port , 0 );
3222
+ raddr -> sin_port , cm_id -> tos );
3206
3223
} else {
3207
3224
iptype = 6 ;
3208
3225
ra = (__u8 * )& raddr6 -> sin6_addr ;
@@ -3233,7 +3250,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3233
3250
}
3234
3251
3235
3252
err = import_ep (ep , iptype , ra , ep -> dst , ep -> com .dev , true,
3236
- ep -> com .dev -> rdev .lldi .adapter_type );
3253
+ ep -> com .dev -> rdev .lldi .adapter_type , cm_id -> tos );
3237
3254
if (err ) {
3238
3255
printk (KERN_ERR MOD "%s - cannot alloc l2e.\n" , __func__ );
3239
3256
goto fail3 ;
@@ -3244,7 +3261,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
3244
3261
ep -> l2t -> idx );
3245
3262
3246
3263
state_set (& ep -> com , CONNECTING );
3247
- ep -> tos = 0 ;
3264
+ ep -> tos = cm_id -> tos ;
3248
3265
3249
3266
/* send connect request to rnic */
3250
3267
err = send_connect (ep );
0 commit comments