PUSCH is the one LTE channel that can carry user data and control information in the same transmission. The control part is not a single thing either. HARQ-ACK, RI and CQI each get their own coding, their own bit count and their own place in the subframe, and that is where the complexity comes from.
Two questions run through everything below. How many bits does each control stream get, and where does it join the data? The answers differ for each stream, and neither one is obvious from the processing figure alone.
Channel Coding Processing for PUSCH
As far as I know, PUSCH has the most complicated (in many cases confusing) structure. It means you have to spend a lot of time scratching head and being frustrated if you are PHY layer chipset developer or validation/verification engineer working at the area.
If you are not the engineer working at that area, don't even think of getting into details -:)
But at least it would be good to know the big picture of PUSCH structure and possible combination. Possible Composition of PUSCH can be categorized as below.
- i) User Data only
- ii) User Data + CQI
- iii) User Data + CQI + RI
First you have to know exactly at which situation each of these composition is used. (Normally you don't have much issues with troubleshooting the case i)). Once you specified a specific type, go through following procedure one by one as described in 36.212.
< 36.212 - Figure 5.2.2-1: Transport channel processing for UL-SCH >

36.212 Figure 5.2.2-1, upper half. The left column is the same chain the DL-SCH uses. Everything to the right of it is control information, and each stream is coded on its own.
- The left column runs a0 to f: Transport block CRC attachment, Code block segmentation, Channel coding, Rate matching, then Code block concatenation. A reader coming from the DL-SCH page will recognise every box.
- Three more Channel coding boxes stand to the right, one per control stream. Their inputs are written above them: o0 to oO-1 for CQI, o0RI or a pair for RI, and o0ACK or a pair or a longer vector for HARQ-ACK.
- So three control streams join the data path here, not the two the composition list above names. HARQ-ACK can accompany any of those combinations, which is why it gets a section of its own below.
- The black text is not part of the specification figure. It is a note of which 36.212 table governs each part, and the green arrows point each group at the coding block it belongs to.
The lower half of the same figure answers the second question. It shows where each stream actually meets the others, and the three streams do not meet the data at the same place.

36.212 Figure 5.2.2-1, lower half. CQI is multiplexed with the data. RI and HARQ-ACK skip that block and enter the Channel Interleaver directly, which is the structural difference between them.
- Two inputs reach Data and Control multiplexing: f0 to fG-1 from the data chain, and q0 to qQCQI-1 from the CQI coder. The output is g0 to gH-1.
- The RI and HARQ-ACK streams, qRI and qACK, bypass that block entirely. They arrive at the Channel Interleaver alongside g.
- That difference matters when you read a trace. CQI is carried as part of the multiplexed stream, while RI and HARQ-ACK are placed by the interleaver into positions of their own.
- The final output h is the sequence that goes on to scrambling and modulation. Everything on this page ends at h.
Channel Coding for HARQ ACK
HARQ-ACK is the smallest payload on PUSCH and the most heavily protected. One or two bits have to survive whatever the data around them survives, so the coding repeats them rather than compressing them. Figures 1 to 3 take that in order: what the repetition looks like, how many bits it produces, and where that number comes from.

Figure 1. One bit of HARQ-ACK, encoded. The table gives one block per modulation order, and the note says the block is repeated rather than extended.
- 36.212 Table 5.2.2.6-1 has two columns, Qm and Encoded HARQ-ACK. The rows are Qm = 2, 4 and 6, which are QPSK, 16QAM and 64QAM.
- Each entry starts with o0ACK and pads with y and x. The pattern grows with the modulation order, from [o0ACK y] at Qm = 2 to [o0ACK y x x x x] at Qm = 6.
- The green note under the table is the part that is easy to miss. Blocks are concatenated until the total reaches QACK, so the table alone does not tell you how long the output is.

Figure 2. Where the length comes from. QACK = Qm · Q′, so the modulation order enters the answer twice.
- Qm is annotated as the modulation depth of the transport block. The HARQ-ACK therefore inherits the modulation the data is using rather than choosing its own.
- QACK is annotated as the number of Ack/Nack data bits after channel coding, and it is the target the repetition in Figure 1 counts up to.
- Q′ is the remaining unknown, and it is the subject of Figure 3.

Figure 3. Q′ term by term. Every input is either the size of the grant, the size of the transport block, or one configured offset, and a minimum caps the result.
- The numbered callouts name the terms. (1) is the number of HARQ bits O and (2) is the scheduled bandwidth in subcarriers. (3) is the number of SC-FDMA symbols carrying PUSCH in the initial subframe.
- Callouts (4) and (5) expand that symbol count. The uplink slot holds 7 symbols, the value 36.211 Table 5.2.3-1 gives, and NSRS is 0 or 1 depending on whether a sounding symbol is taken.
- Callout (6) points at the only configured term, the beta offset, and names 36.213 Table 8.6.3-1 as its source. Raising it gives the HARQ-ACK more protection and leaves less room for data.
- The denominator is the total encoded transport block size, written as the sum of Kr over the C code blocks. So a larger transport block gives HARQ-ACK proportionally fewer symbols.
- The outer minimum with 4 · MscPUSCH is a ceiling. However bad the ratio becomes, HARQ-ACK cannot take more than four symbols worth of the allocation.

36.212 Tables 5.2.2.6-1 and 5.2.2.6-2. Two bits are not simply twice one bit. The two bit form carries three symbols, o0ACK, o1ACK and o2ACK.
- Table 5.2.2.6-1 repeats the single bit with filler. Table 5.2.2.6-2 introduces a third symbol, o2ACK, which carries the parity of the two.
- Both tables are indexed by Qm alone, so the pattern changes only with the modulation order.
- Both titles still match 36.212 v19.3.0 exactly, so these two screenshots can be read against the current release without adjustment.
Channel Coding for RI
RI uses the same encoding shape as HARQ-ACK and a different set of tables. The reason is that RI describes the transport block rather than acknowledging one, so the network has to decode it before it can interpret the data. The tables below cover one bit and two bits, then the mapping from those bits to a rank value.

36.212 Tables 5.2.2.6-3 to 5.2.2.6-6. The first two mirror the HARQ-ACK tables exactly. The last two are the part HARQ-ACK does not need, because a rank is a number rather than a yes or no.
- Tables 5.2.2.6-3 and 5.2.2.6-4 have the same shape as the HARQ-ACK pair, indexed by Qm and padded with x and y.
- Table 5.2.2.6-5 maps a single o0RI to a rank: 0 gives rank 1 and 1 gives rank 2.
- Table 5.2.2.6-6 maps the two bit pair to ranks 1 to 4, in the order 0,0 then 0,1 then 1,0 then 1,1. So the mapping is plain binary counting rather than a Gray code.
- All four titles still match 36.212 v19.3.0.
Channel Coding for CQI
CQI is the only control stream whose size is not fixed by a small table. How many bits it carries depends on the reporting mode, the number of antenna ports and the rank, so 36.212 needs a family of field tables rather than one. The screenshots below are those tables, grouped by reporting mode.

36.212 Tables 5.2.2.6.1-1 and 5.2.2.6.1-2, wideband reports. The bit width depends on the antenna port count and the rank, which is why a single number for CQI size does not exist.
- Wideband CQI codeword 0 is 4 bits in every column. Codeword 1 is 0 bits at rank 1 and 4 bits above it, because a second codeword only exists when there is a second layer.
- Precoding matrix indication is given as 2N or N for two ports and 4N for four, so it scales with the number of subbands rather than being fixed.
- The RI table underneath is much smaller. One bit for two ports, and one or two bits for four ports depending on the maximum layer count.

36.212 Tables 5.2.2.6.2-1 to 5.2.2.6.2-3, higher layer configured subband reports. The extra rows over the wideband case are the subband differential entries.
- Each table names the transmission modes it applies to in its title, which is the quickest way to find the right one.
- Subband differential CQI appears as 2N, so the report grows with the number of subbands the higher layers configured.
- Table 5.2.2.6.2-2 carries both codewords and their differentials, which makes it the largest of the three.

36.212 Tables 5.2.2.6.3-1 to 5.2.2.6.3-3, UE selected subband reports. These add a field the other two modes do not need, the position of the selected subbands.
- Position of the M selected subbands appears as L bits. The UE chooses which subbands to report, so it has to say which ones it chose.
- Subband differential CQI is a fixed 2 bits here rather than 2N, because only the selected subbands are reported.
- Precoding matrix indication reaches 8 bits for four antenna ports, the largest single field in any of these tables.
One caution before you take these three screenshots to the current specification. The encoding tables above are unchanged, but the CQI field tables have changed since. In 36.212 v19.3.0 the title of Table 5.2.2.6.1-1 reads Fields for channel quality information feedback for wideband CQI and subband PMI reports. The parenthetical CQI and RI forms shown here no longer appear anywhere in the specification.
The family has also grown. Release 19 adds lettered and suffixed variants such as 5.2.2.6.1-1A, 5.2.2.6.1-1B and 5.2.2.6.1-1-1 alongside the originals. So treat the screenshots as a correct snapshot of the release they were taken from, and look the table number up rather than trusting it to still be the only one.
One table is large enough that the page splits it across two screenshots. It is the basis the (32, O) block code is built from, and it is the reason a CQI report of any size can be encoded to a fixed 32 bits.


36.212 Table 5.2.2.6.4-1, shown in two parts. Eleven basis columns and thirty two rows, so any CQI payload up to 11 bits maps onto a 32 bit codeword.
- The columns run Mi,0 to Mi,10, which is eleven basis sequences. That is the largest O the code accepts.
- The rows run i = 0 to 31, which is the 32 in the code name. Row 20 appears at the end of the first screenshot and again at the start of the second, because that is where the capture was cut.
- Column Mi,0 is 1 in every row except the last. Reading a column downward is the quickest way to check a screenshot against the specification.
- The title still matches 36.212 v19.3.0.
Three control streams share the channel, not two : CQI, RI and HARQ-ACK each get their own coding block, and each has its own set of tables.Only CQI is multiplexed with the data : RI and HARQ-ACK bypass the multiplexer and are placed by the Channel Interleaver.The control size is computed, not configured : QACK follows from the grant size, the transport block size and one beta offset, so it changes with every allocation.The encoding tables are unchanged, the field tables are not : 5.2.2.6-1 to 5.2.2.6-6 and 5.2.2.6.4-1 still match Release 19, while the CQI field tables have been renamed and extended.
Reference
- TS 36.212 v19.3.0 (Release 19) - E-UTRA Multiplexing and channel coding. Clause 5.2.2 UL-SCH, and the 5.2.2.6 table family.