@@ -115,6 +115,7 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12
115
115
#define KDETH_HCRC_LOWER_MASK 0xff
116
116
117
117
#define AHG_KDETH_INTR_SHIFT 12
118
+ #define AHG_KDETH_SH_SHIFT 13
118
119
119
120
#define PBC2LRH (x ) ((((x) & 0xfff) << 2) - 4)
120
121
#define LRH2PBC (x ) ((((x) >> 2) + 1) & 0xfff)
@@ -144,8 +145,9 @@ MODULE_PARM_DESC(sdma_comp_size, "Size of User SDMA completion ring. Default: 12
144
145
#define KDETH_OM_LARGE 64
145
146
#define KDETH_OM_MAX_SIZE (1 << ((KDETH_OM_LARGE / KDETH_OM_SMALL) + 1))
146
147
147
- /* Last packet in the request */
148
- #define TXREQ_FLAGS_REQ_LAST_PKT BIT(0)
148
+ /* Tx request flag bits */
149
+ #define TXREQ_FLAGS_REQ_ACK BIT(0) /* Set the ACK bit in the header */
150
+ #define TXREQ_FLAGS_REQ_DISABLE_SH BIT(1) /* Disable header suppression */
149
151
150
152
/* SDMA request flag bits */
151
153
#define SDMA_REQ_FOR_THREAD 1
@@ -943,8 +945,13 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
943
945
tx -> busycount = 0 ;
944
946
INIT_LIST_HEAD (& tx -> list );
945
947
948
+ /*
949
+ * For the last packet set the ACK request
950
+ * and disable header suppression.
951
+ */
946
952
if (req -> seqnum == req -> info .npkts - 1 )
947
- tx -> flags |= TXREQ_FLAGS_REQ_LAST_PKT ;
953
+ tx -> flags |= (TXREQ_FLAGS_REQ_ACK |
954
+ TXREQ_FLAGS_REQ_DISABLE_SH );
948
955
949
956
/*
950
957
* Calculate the payload size - this is min of the fragment
@@ -963,11 +970,22 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
963
970
}
964
971
965
972
datalen = compute_data_length (req , tx );
973
+
974
+ /*
975
+ * Disable header suppression for the payload <= 8DWS.
976
+ * If there is an uncorrectable error in the receive
977
+ * data FIFO when the received payload size is less than
978
+ * or equal to 8DWS then the RxDmaDataFifoRdUncErr is
979
+ * not reported.There is set RHF.EccErr if the header
980
+ * is not suppressed.
981
+ */
966
982
if (!datalen ) {
967
983
SDMA_DBG (req ,
968
984
"Request has data but pkt len is 0" );
969
985
ret = - EFAULT ;
970
986
goto free_tx ;
987
+ } else if (datalen <= 32 ) {
988
+ tx -> flags |= TXREQ_FLAGS_REQ_DISABLE_SH ;
971
989
}
972
990
}
973
991
@@ -990,6 +1008,10 @@ static int user_sdma_send_pkts(struct user_sdma_request *req, unsigned maxpkts)
990
1008
LRH2PBC (lrhlen );
991
1009
tx -> hdr .pbc [0 ] = cpu_to_le16 (pbclen );
992
1010
}
1011
+ ret = check_header_template (req , & tx -> hdr ,
1012
+ lrhlen , datalen );
1013
+ if (ret )
1014
+ goto free_tx ;
993
1015
ret = sdma_txinit_ahg (& tx -> txreq ,
994
1016
SDMA_TXREQ_F_AHG_COPY ,
995
1017
sizeof (tx -> hdr ) + datalen ,
@@ -1351,7 +1373,7 @@ static int set_txreq_header(struct user_sdma_request *req,
1351
1373
req -> seqnum ));
1352
1374
1353
1375
/* Set ACK request on last packet */
1354
- if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_LAST_PKT ))
1376
+ if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_ACK ))
1355
1377
hdr -> bth [2 ] |= cpu_to_be32 (1UL << 31 );
1356
1378
1357
1379
/* Set the new offset */
@@ -1384,8 +1406,8 @@ static int set_txreq_header(struct user_sdma_request *req,
1384
1406
/* Set KDETH.TID based on value for this TID */
1385
1407
KDETH_SET (hdr -> kdeth .ver_tid_offset , TID ,
1386
1408
EXP_TID_GET (tidval , IDX ));
1387
- /* Clear KDETH.SH only on the last packet */
1388
- if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_LAST_PKT ))
1409
+ /* Clear KDETH.SH when DISABLE_SH flag is set */
1410
+ if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_DISABLE_SH ))
1389
1411
KDETH_SET (hdr -> kdeth .ver_tid_offset , SH , 0 );
1390
1412
/*
1391
1413
* Set the KDETH.OFFSET and KDETH.OM based on size of
@@ -1429,7 +1451,7 @@ static int set_txreq_header_ahg(struct user_sdma_request *req,
1429
1451
/* BTH.PSN and BTH.A */
1430
1452
val32 = (be32_to_cpu (hdr -> bth [2 ]) + req -> seqnum ) &
1431
1453
(HFI1_CAP_IS_KSET (EXTENDED_PSN ) ? 0x7fffffff : 0xffffff );
1432
- if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_LAST_PKT ))
1454
+ if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_ACK ))
1433
1455
val32 |= 1UL << 31 ;
1434
1456
AHG_HEADER_SET (req -> ahg , diff , 6 , 0 , 16 , cpu_to_be16 (val32 >> 16 ));
1435
1457
AHG_HEADER_SET (req -> ahg , diff , 6 , 16 , 16 , cpu_to_be16 (val32 & 0xffff ));
@@ -1468,19 +1490,23 @@ static int set_txreq_header_ahg(struct user_sdma_request *req,
1468
1490
AHG_HEADER_SET (req -> ahg , diff , 7 , 0 , 16 ,
1469
1491
((!!(req -> omfactor - KDETH_OM_SMALL )) << 15 |
1470
1492
((req -> tidoffset / req -> omfactor ) & 0x7fff )));
1471
- /* KDETH.TIDCtrl, KDETH.TID */
1493
+ /* KDETH.TIDCtrl, KDETH.TID, KDETH.Intr, KDETH.SH */
1472
1494
val = cpu_to_le16 (((EXP_TID_GET (tidval , CTRL ) & 0x3 ) << 10 ) |
1473
- (EXP_TID_GET (tidval , IDX ) & 0x3ff ));
1474
- /* Clear KDETH.SH on last packet */
1475
- if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_LAST_PKT )) {
1476
- val |= cpu_to_le16 (KDETH_GET (hdr -> kdeth .ver_tid_offset ,
1477
- INTR ) <<
1478
- AHG_KDETH_INTR_SHIFT );
1479
- val &= cpu_to_le16 (~(1U << 13 ));
1480
- AHG_HEADER_SET (req -> ahg , diff , 7 , 16 , 14 , val );
1495
+ (EXP_TID_GET (tidval , IDX ) & 0x3ff ));
1496
+
1497
+ if (unlikely (tx -> flags & TXREQ_FLAGS_REQ_DISABLE_SH )) {
1498
+ val |= cpu_to_le16 ((KDETH_GET (hdr -> kdeth .ver_tid_offset ,
1499
+ INTR ) <<
1500
+ AHG_KDETH_INTR_SHIFT ));
1481
1501
} else {
1482
- AHG_HEADER_SET (req -> ahg , diff , 7 , 16 , 12 , val );
1502
+ val |= KDETH_GET (hdr -> kdeth .ver_tid_offset , SH ) ?
1503
+ cpu_to_le16 (0x1 << AHG_KDETH_SH_SHIFT ) :
1504
+ cpu_to_le16 ((KDETH_GET (hdr -> kdeth .ver_tid_offset ,
1505
+ INTR ) <<
1506
+ AHG_KDETH_INTR_SHIFT ));
1483
1507
}
1508
+
1509
+ AHG_HEADER_SET (req -> ahg , diff , 7 , 16 , 14 , val );
1484
1510
}
1485
1511
1486
1512
trace_hfi1_sdma_user_header_ahg (pq -> dd , pq -> ctxt , pq -> subctxt ,
0 commit comments