Carrier Aggregation (DL & UL) in 5G NR
Aggregating multiple component carriers for higher throughput — PCell/SCell roles, SCell activation, cross-carrier scheduling, and how DL and UL CA differ.
Carrier aggregation is sold as bandwidth and delivered as control. Adding a second or third component carrier is not primarily a physical-layer change -- the physical layer barely notices -- it is a set of decisions about which cell owns control: which carrier carries PUCCH, which carrier issues the grants for which, which cells are allowed to sleep and how fast they wake, which cells share a timing advance. This document covers the cell taxonomy precisely, the three spectrum arrangements, SCell configuration and the activation state machine, dormancy, cross-carrier scheduling and its blind-decode cost, PUCCH groups, HARQ and power under aggregation, timing advance groups, and twelve failure modes -- almost all of which are control-plane or activation-latency problems rather than throughput ones.
Contents
- 01Why Carrier Aggregation Exists, and Why Not One Wide Carrier
- 02The Cell Taxonomy, Precisely
- 03CA Types and Spectrum Arrangement
- 04Carrier Limits, Bandwidth Classes and Band Combinations
- 05Mixed Numerology and Bandwidth Parts Across Carriers
- 06SCell Configuration and Delta Semantics
- 07SCell Activation and Deactivation
- 08Dormancy, Hibernation and Fast Resume
- 09Cross-Carrier Scheduling
- 10PUCCH Groups and the PUCCH SCell
- 11HARQ Under Carrier Aggregation
- 12Uplink Power and PHR Under Carrier Aggregation
- 13Timing Advance Groups: pTAG and sTAG
- 14Measurement and CSI Load Under Carrier Aggregation
- 15Carrier Aggregation Versus Dual Connectivity
- 16Parameter and Timer Reference
- 17Failure Modes, and What Each Looks Like in a Log
- 18ASN.1 Structures
- 19Worked Arithmetic
- 20Illustrative Message Traces
- 21Release Deltas: Rel-15 to Rel-18
- 22Reading CA in Logs: A Checklist
- 23Glossary
- 24References
1. Why Carrier Aggregation Exists, and Why Not One Wide Carrier
The obvious question first. If a UE can be given 273 PRBs on a 100 MHz carrier and the operator holds 200 MHz, why not simply define a 200 MHz carrier and be done with it? The answer is a stack of constraints that have nothing to do with the air interface being incapable, and everything to do with spectrum, radio hardware and the licences that were actually won at auction.
| Constraint | What it rules out | What carrier aggregation does instead |
|---|---|---|
| Maximum channel bandwidth per band | FR1 tops out at 100 MHz of channel bandwidth per NR carrier, and most FR1 bands are capped well below that. There is no 200 MHz FR1 carrier to define TS 38.101-1 cl. 5.3. | Two or more 100 MHz carriers in the same band, aggregated. In FR2 the cap is 400 MHz per carrier, so FR2 reaches for CA later but for the same reason. |
| Fragmented holdings | A single carrier must be contiguous. An operator holding 60 MHz at one end of n78 and 60 MHz at the other cannot span the gap. | Intra-band non-contiguous CA: two carriers, one RF chain, one filter wide enough to cover both plus the gap. |
| Different propagation, same subscriber | One carrier lives at one frequency, so it has one coverage footprint. A 3.5 GHz carrier cannot also be a 700 MHz carrier. | Inter-band CA layers a low-band coverage carrier under a mid-band capacity carrier, and the UE is served by both at once rather than handed between them. |
| Legacy occupancy | Spectrum still carrying LTE cannot be included in a wider NR carrier until it is refarmed, which happens in slices. | Each refarmed slice becomes another component carrier, added to the band combination without touching the carriers already deployed. |
| Guard-band and filter economics | A very wide single carrier needs a power amplifier and filter flat across the whole span, and the whole span must be licensed to one operator with the same duplex arrangement. | Per-carrier RF requirements stay at values the industry already builds, and the aggregated requirements are defined separately per CA bandwidth class. |
| Regulatory duplex mismatch | TDD and FDD spectrum cannot be one carrier. n28 is FDD, n78 is TDD. | CA is indifferent: a serving cell's duplex mode is its own business. Only the timing and the uplink sharing rules care (§13). |
Table 1. Six reasons a wide single carrier is not an option, and what CA substitutes for each. Only the first is a specification limit; the rest are facts about the world that the specification has to accommodate.
So CA exists because spectrum arrives in pieces. But the reason it is hard is different, and it is the theme of this document: aggregating carriers forces a set of decisions about which cell owns control. Exactly one cell carries the PUCCH that acknowledges everything (or exactly two, if a second PUCCH group is configured). Exactly one cell issues the grants for any given carrier. Exactly one cell can declare radio link failure. Exactly one cell can be relied on to be there, because every other cell is allowed to be asleep. Those decisions are made in RRC configuration, enforced in MAC, and almost never visible in throughput counters -- which is why a CA problem in the field is nearly always a control-plane or activation-latency problem wearing a throughput problem's clothes.
1.1 What triggers CA, and when
CA is not established at connection setup. A UE arrives on one cell through Random Access, completes RRC setup, reports its capabilities, and only then can SCells be configured. The sequence, and the decisions along it, are:
- Capability. The UE's
UE-NR-Capabilitylists band combinations. Nothing outside that list may be configured. See the companion 26 UE Capability, which owns the feature-set machinery. - Measurement. The network needs to know the candidate SCell frequencies are actually receivable at this UE. Either a measurement on the SCell frequency (a
measObjectfor it, reported through an A4 or A1 event) or, for a co-sited carrier in the same band, an inference from the PCell measurement. See the companion 20 Measurements and Events. - Decision. A scheduler-internal threshold: buffer occupancy above some level, or a sustained PCell utilisation, or simply a policy of adding SCells to every UE that supports them.
- Configuration.
RRCReconfigurationwithsCellToAddModList(§6). The SCell now exists and is deactivated. - Activation. An SCell Activation/Deactivation MAC CE (§7). This is the step that costs tens of milliseconds and the step most often blamed on the wrong thing.
- Use. Only once the UE has settled AGC, acquired time and frequency tracking, and produced a CSI report can the scheduler put a sensible MCS on the new carrier. Until then the carrier is configured, activated, and worth nothing.
Steps 1 to 4 are fast, cheap, and fully visible in RRC logs. Steps 5 and 6 are slow, invisible, and where the throughput lives. Any analysis that stops at "the SCell was added successfully" has stopped one step before the interesting part.
2. The Cell Taxonomy, Precisely
Six terms, routinely used as if two or three of them were synonyms. They are not, and the differences decide what happens when things break. The distinction that matters most: some of these terms exist under carrier aggregation, and some exist only under dual connectivity.
SpCell is a role that different cells fill depending on which cell group you are talking about.| Term | Expansion | Exists in | What is unique to it |
|---|---|---|---|
| PCell | Primary Cell | CA and DC | ServCellIndex 0, always. The cell RRC connection establishment or re-establishment ran on. Carries PUCCH. The only cell whose radio problems become radio link failure TS 38.331 cl. 5.3.10. Always self-scheduled in Rel-15/16. Never deactivated, never dormant, never released while the connection lives. |
| SCell | Secondary Cell | CA and DC | Identified by sCellIndex 1..31. Added, activated, deactivated, made dormant and released at will. No SIB reading, no paging, no RLF. Needs a PCell (or PSCell) to exist under. |
| SpCell | Special Cell | A role, not a cell | In CA: means the PCell. In DC: means the PCell when you are talking about the MCG and the PSCell when you are talking about the SCG. Where a spec clause says SpCell, it means whichever of the two this cell group's control anchor is. |
| PSCell | Primary SCell (of the SCG) | DC only | The SCG's SpCell. The cell the UE runs Random Access towards on SCG addition. Carries the SCG's PUCCH. Has its own failure procedure (SCG failure) which is not RLF. Does not exist in plain CA at all. |
| MCG | Master Cell Group | CA and DC | The PCell plus its SCells. In plain CA this is the whole configuration, so the term is rarely used. |
| SCG | Secondary Cell Group | DC only | The PSCell plus its SCells, served by a second node with its own MAC entity and its own scheduler. |
| Serving cell | -- | CA and DC | The PCell and every configured SCell, whether activated or not. A deactivated SCell is still a serving cell -- which is why serving-cell counts in logs can be larger than the number of carriers doing anything. |
| PUCCH SCell | -- | CA and DC | An SCell whose uplink configuration includes a pucch-Config, making it the uplink anchor of a secondary PUCCH group (§10). It is the only SCell that carries other cells' feedback, and the only SCell that may not be made dormant. |
Table 2. The taxonomy as a table. Note that three of the eight entries are roles or groupings rather than cells, which is the root of most of the confusion.
The single most useful consequence of this table: there is no radio link failure on an SCell. RLM -- in-sync and out-of-sync evaluation against Qin and Qout, T310, N310, N311 -- runs on the SpCell only. An SCell whose radio has gone away produces no RLF, no re-establishment and no failure report. It produces silence, and eventually the network releases it because it saw no CSI and no HARQ-ACK. See the companion 16 RLM and RLF for what RLM does on the cell it does run on.
For what a cell means to RRC -- what state the UE is in, what context exists where -- see the companion 14 RRC States. For the dual connectivity case, where all of PSCell, SCG and the second MAC entity come into play, see the companion 28 NSA Attach Process, which walks an EN-DC establishment end to end. This document is about the CA case: one cell group, one MAC entity, one scheduler, one RRC connection.
3. CA Types and Spectrum Arrangement
Three arrangements, distinguished by where the carriers sit relative to each other. The distinction is not academic: it decides how many transceiver chains the UE needs, how much spectrum is lost to guard bands, whether one timing advance serves all carriers, and what the band combination string looks like in the capability message.
| Arrangement | Definition | RF cost at the UE | Timing | Example string |
|---|---|---|---|---|
| Intra-band contiguous | Two or more CCs in the same operating band, adjacent, with only a guard band between them | One transceiver chain, one local oscillator, one filter. The UE sees the aggregate as one wide signal and can use a single FFT if it is wide enough. | One TAG. Same site, same band, same path -- the timing advance is shared. | CA_n78C |
| Intra-band non-contiguous | Two or more CCs in the same band with a gap between them, usually because someone else holds the spectrum in between | One chain, but the filter and the ADC must span the whole gap, and the receiver must tolerate a strong unwanted signal sitting in the middle of its passband. This is the arrangement most likely to be missing from a UE's supported combinations. | Usually one TAG. | CA_n78A-n78A |
| Inter-band | CCs in different operating bands | One chain per band, sometimes one per carrier. Two antennas, two filters, two PAs on the uplink side. Cross-band intermodulation products become a real design constraint. | May need a second TAG -- see §13. Different bands can mean different radio units and different feeder delays. | CA_n28A-n78C |
Table 3. The three CA types. The RF column is why a UE's supported band combination list is shorter than the arithmetic of its band support suggests -- each combination is a distinct hardware claim, not a software one.
3.1 Guard bands and nominal channel spacing
A 100 MHz NR channel at 30 kHz SCS carries 273 PRBs. Those PRBs occupy 273 x 12 x 30 kHz = 98.28 MHz, so 1.72 MHz of the channel is guard band -- 0.86 MHz at each edge, against a specified minimum of 845 kHz TS 38.101-1 Table 5.3.3-1. Two such channels placed side by side at a centre spacing of exactly 100 MHz therefore leave 1.72 MHz of unused spectrum between the two PRB grids, which is nearly twice what either carrier needs on that side.
Intra-band contiguous CA is allowed to do better. The nominal channel spacing for adjacent aggregated carriers TS 38.101-1 cl. 5.4.1.2 is smaller than the sum of the half-bandwidths, because the two carriers' inner guard bands overlap and only one of them is actually needed: the neighbour is not an unrelated emitter, it is the same transmitter. Squeezing the spacing does not give either carrier more PRBs -- 273 is 273 -- it gives back roughly 0.9 MHz of spectrum at the outer edge of the pair, which matters when the operator's holding is fixed and a third carrier is trying to fit. §19.3 carries the arithmetic through.
Two consequences that catch people out. First, the carriers must still land on the channel raster, so the nominal spacing is quantised -- you cannot pick an arbitrary number, and the value your planning tool produces may not be configurable. Second, a non-contiguous intra-band pair gets none of this benefit: each carrier needs its full guard band on both sides, because on the inner side its neighbour is another licensee's transmitter.
3.2 What the arrangement does not change
Worth stating explicitly, because it is where intuition misleads. The arrangement changes RF, spectrum efficiency and timing. It does not change any of the protocol machinery in the rest of this document. An intra-band contiguous SCell is configured with the same SCellConfig, activated with the same MAC CE, made dormant the same way and scheduled with the same DCI as an inter-band SCell three gigahertz away. MAC and RRC do not know or care where the carrier is. Only the UE's RF, the TAG assignment and the band combination check care.
4. Carrier Limits, Bandwidth Classes and Band Combinations
NR supports up to 16 component carriers per direction, which is the number that gets quoted and the number that almost never appears in the field. The limits, in ascending order of how much they actually bind:
| Limit | Value | Where it comes from | How often it is the binding limit |
|---|---|---|---|
| Serving cells per cell group | 16 | TS 38.331 maxNrofServingCells is 32 across both cell groups, so 16 per group under NR-DC | Never. No deployment is near this. |
sCellIndex range | 1 .. 31 | SCellIndex ::= INTEGER (1..31); ServCellIndex ::= INTEGER (0..31) with 0 reserved for the PCell | Never, but it is why the activation MAC CE has a four-octet form (§7). |
| Carriers per PUCCH group | Implementation and codebook limited | The HARQ-ACK codebook has to fit in a PUCCH resource; a Type-1 codebook grows with the product of cells and PDSCH occasions (§11) | Occasionally, in large FR2 configurations. It is the reason a second PUCCH group exists. |
| CA bandwidth class | A letter per band, binding the number of CCs and the aggregated bandwidth together | TS 38.101-1 cl. 5.3A / TS 38.101-2 cl. 5.3A | Often. This is a per-band table and it is not generous. |
| Supported band combination | An explicit list in the UE capability | UE-NR-Capability -> rf-Parameters -> supportedBandCombinationList | Almost always. This is the real limit. |
pdcch-BlindDetectionCA | 2 .. 16 | UE capability; governs how the PDCCH monitoring budget is shared once more than four downlink cells are configured TS 38.213 cl. 10.1 | Whenever cross-carrier scheduling is in use with many carriers (§9). |
Table 4. Six limits on how much CA a UE can do, ordered by how often each is the one that actually stops you.
4.1 CA bandwidth classes
A CA bandwidth class is a letter that binds together, for one band, the maximum number of component carriers and the range of aggregated channel bandwidth. Class A is a single carrier. Class C is the familiar two-carrier intra-band case with an aggregated channel bandwidth in the 100-200 MHz range -- which is exactly the 2 x 100 MHz n78 configuration used as the running example in this document. Higher letters add carriers and widen the aggregate. The exact boundaries are per-band and change release to release, so read them from the current TS 38.101-1 clause 5.3A table rather than from memory.
The reason to care is that the class letter is not documentation -- it is part of the identifier the UE and the network exchange. A band combination is written band-by-band with a class letter appended, and the string is the contract:
| String | Reads as | What the UE is claiming |
|---|---|---|
CA_n78C | One band, class C | Two intra-band contiguous CCs in n78, aggregated bandwidth in the class-C range. One RF chain. |
CA_n78A-n78A | n78 twice, class A each | Two n78 CCs that are not contiguous. A different hardware claim from CA_n78C, and a UE can support one and not the other. |
CA_n28A-n78C | Two bands | One n28 CC plus two contiguous n78 CCs: three carriers, two RF chains, possibly two TAGs. |
CA_n28A-n78A-n78A | Two bands, three class-A entries | Three carriers with the two n78 carriers non-contiguous. Different again. |
DC_n28A_n78C | Dual connectivity, not CA | DC_ rather than CA_: the carriers are split across two cell groups with two MAC entities. See the companion 28 NSA Attach Process. |
Table 5. Band combination strings and what each one commits the UE to. The A/C distinction between the second and third rows is the difference between two hardware designs, not a naming detail.
4.2 The indirection that actually decides what a UE can do
Reading the supported band combination list is not enough, and this is where CA capability analysis goes wrong. Each entry in supportedBandCombinationList names a featureSetCombination by index. That index points into a featureSetCombinations list, which is a matrix of feature-set identifiers -- one per band per direction. Each of those identifiers points into featureSetsDownlink / featureSetsUplink, and those point at per-CC feature sets. The answer to "can this UE do 256QAM with four layers on the second n78 carrier of this combination?" is at the bottom of four levels of indirection, and it can legitimately differ between two combinations that contain the same bands.
The trap is assuming capability is a property of a band. It is a property of a (band combination, band within it, direction, carrier within the band) tuple. A UE can support 4x4 MIMO on n78 as a single carrier, 4x4 on the first n78 carrier of CA_n78C, and only 2x2 on the second -- and all three statements can be true simultaneously and correctly. If a second carrier is delivering half the expected throughput, dereference the feature set for that carrier in that combination before looking at the radio. The companion 26 UE Capability document owns this machinery and walks the dereference step by step.
The network's side of the contract is that it must not configure anything outside the list. It generally does not check very hard. §17 covers what happens when it configures a combination the UE never claimed: the UE is entitled to reject the reconfiguration, and different UEs reject it in usefully different ways.
5. Mixed Numerology and Bandwidth Parts Across Carriers
Component carriers do not have to share a subcarrier spacing. A UE can be configured with a 15 kHz FDD carrier in n28, a 30 kHz TDD carrier in n78 and a 120 kHz carrier in n258, all at once, and this is not an exotic case -- it is the normal consequence of layering bands whose channel bandwidths and delay spreads are different. The companion 02 Radio Frame Structure document covers numerology itself; what matters here is why mixing is allowed and what it costs.
5.1 Why mixing works: the boundaries are nested
It works because NR numerologies are powers of two apart and share a common frame timing. A radio frame is 10 ms and a subframe is 1 ms at every numerology, and a slot is 1 ms / 2^mu. So every 15 kHz slot boundary is also a 30 kHz slot boundary, a 60 kHz slot boundary and a 120 kHz slot boundary; the boundaries never drift and never need realigning. Two carriers in the same timing advance group also share SFN and subframe alignment, so a slot index on one carrier maps deterministically onto a slot index on the other.
Concretely: 1, 2, 4 and 8 slots per subframe at 15, 30, 60 and 120 kHz. A 15 kHz slot boundary coincides with every second 30 kHz boundary and every eighth 120 kHz boundary, always, with no accumulating error. That nesting is what makes mixed-numerology CA possible at all -- without it, a grant sent on one carrier could not name a slot on another.
5.2 The cost: the scheduler has to do arithmetic
The cost lands on cross-carrier scheduling (§9). When a grant is sent on a carrier with numerology mu_PDCCH and schedules data on a carrier with numerology mu_PDSCH, the slot offset in the DCI cannot simply be added: it has to be interpreted in the scheduled carrier's numerology after scaling the PDCCH slot index across TS 38.214 cl. 5.1.2.1.
PDSCH slot = floor( n * 2^mu_PDSCH / 2^mu_PDCCH ) + K0
PUSCH slot = floor( n * 2^mu_PUSCH / 2^mu_PDCCH ) + K2
n the slot on the scheduling cell that carried the PDCCH
mu_PDCCH numerology of the scheduling cell
mu_PDSCH numerology of the scheduled cell
K0, K2 slot offsets from the time-domain resource allocation,
expressed in the SCHEDULED cell's slotsA 15 kHz PCell (mu = 0) sends a grant in its slot 7 with K0 = 2, scheduling a 30 kHz SCell (mu = 1):
PDSCH slot = floor(7 x 2^1 / 2^0) + 2 = 14 + 2 = slot 16 on the SCell.
The same grant with the carriers swapped -- a 30 kHz scheduling cell in its slot 7 scheduling a 15 kHz cell, K0 = 2:
PDSCH slot = floor(7 x 2^0 / 2^1) + 2 = floor(3.5) + 2 = slot 5 on the scheduled cell.
Note the floor in the second case. Two consecutive PDCCH slots on the faster carrier map onto the same slot on the slower one, so the scheduler cannot issue grants with the same K0 in both slots 6 and 7 -- they would target one slot twice.
The other cost is UE processing time. Cross-carrier scheduling across a numerology boundary raises the minimum PDCCH-to-PDSCH and PDCCH-to-PUSCH offsets the UE can honour, because it has to finish decoding a grant in one timebase and act in another. Vendors handle this by never using aggressive K0 or K2 values across a numerology boundary, which quietly costs latency on exactly the carrier that was added for capacity.
5.3 Bandwidth parts are per carrier
Each serving cell carries its own bandwidth part configuration: up to four dedicated downlink BWPs and four uplink BWPs alongside the initial BWP, with one active downlink BWP and one active uplink BWP per serving cell at a time. There is no such thing as a BWP that spans carriers. A UE with three SCells has three independent BWP state machines running, each with its own bwp-InactivityTimer, its own defaultDownlinkBWP-Id and its own DCI bandwidth-part-indicator field. The companion 02 Radio Frame Structure document has the BWP grid.
Where BWP switching and SCell state interact, the interaction is not obvious:
- On activation, the UE makes
firstActiveDownlinkBWP-IdandfirstActiveUplinkBWP-Idthe active BWPs of that SCell. An activated SCell does not resume on whatever BWP it was on when it was last deactivated -- it always starts from the configured first-active BWP. If that BWP is narrow, the first grants on the newly activated carrier are narrow too, whatever the buffer looks like. - On deactivation, the BWP state is simply gone. A deactivated cell has no active BWP.
- Dormancy is implemented as a BWP switch (§8): the SCell's active downlink BWP becomes
dormantBWP-Id, a BWP on which the UE does not monitor PDCCH. The cell is still activated, so its tracking loops and its CSI machinery survive -- which is the entire point of dormancy. bwp-InactivityTimerexpiry falls back todefaultDownlinkBWP-Id, or to the initial BWP if no default is configured. Configure a dormant BWP and a default BWP that fight each other and you get an SCell oscillating between two narrow BWPs while the scheduler wonders why its grants keep shrinking.
A wide firstActiveDownlinkBWP-Id costs nothing while the SCell is deactivated -- there is no monitoring to pay for. Configuring a narrow first-active BWP on an SCell to save UE power is therefore usually a mistake: it saves nothing before activation and costs a BWP switch plus a re-widening after it, on top of the activation delay you were already paying. Save power with the deactivation timer or with dormancy, not with a narrow first-active BWP.
6. SCell Configuration and Delta Semantics
SCells are added, modified and released through CellGroupConfig inside RRCReconfiguration. Two lists do all the work:
| Field | Type | What it does | The subtlety |
|---|---|---|---|
sCellToAddModList | SEQUENCE (SIZE (1..31)) OF SCellConfig | Adds SCells that do not exist and modifies SCells that do | Which of the two it is depends only on whether the sCellIndex is already configured. There is no separate add and modify encoding. |
sCellToReleaseList | SEQUENCE (SIZE (1..31)) OF SCellIndex | Removes SCells entirely: the serving cell ceases to exist and its HARQ buffers and configuration are discarded | Processed before sCellToAddModList in the same message, which is what makes release-and-re-add in one message work. |
Table 6. The two SCell lists in CellGroupConfig TS 38.331 cl. 5.3.5.5.9.
6.1 SCellConfig
Each entry in the add-mod list is an SCellConfig:
| Field | Presence | What it carries | Why it matters |
|---|---|---|---|
sCellIndex | Mandatory | SCellIndex ::= INTEGER (1..31), the UE-specific index of this SCell | This is the C_i bit position in the activation MAC CE (§7) and the value the Carrier Indicator Field resolves to (§9). It is not a cell identity -- two UEs on the same physical carrier will generally have different sCellIndex values for it. |
sCellConfigCommon | Optional | A ServingCellConfigCommon: physCellId, downlinkConfigCommon with the frequency info and the initial BWP, uplinkConfigCommon, ssbSubcarrierSpacing, ssb-PositionsInBurst, tdd-UL-DL-ConfigurationCommon | This is what the UE would otherwise have read from the SCell's SIB1 -- and it never reads SIB1 on an SCell. Everything cell-common arrives here, over the PCell. Get it wrong and the UE hunts for SSBs that are not there. |
sCellConfigDedicated | Optional | A ServingCellConfig: the BWP lists, firstActiveDownlinkBWP-Id, bwp-InactivityTimer, pdsch-ServingCellConfig, csi-MeasConfig, crossCarrierSchedulingConfig, tag-Id, sCellDeactivationTimer, pathlossReferenceLinking, servingCellMO | Everything UE-specific. Most of the rest of this document is about fields that live in here. |
smtc | Optional | The SSB measurement timing configuration for this SCell | Where the UE looks for this SCell's SSBs, which also bounds how quickly it can settle after activation (§7.4). See the companion 21 Measurement Gaps and SMTC. |
sCellState | Optional, Rel-16 | ENUMERATED {activated} | Direct SCell activation. If present, the SCell is activated as the reconfiguration is applied, with no MAC CE at all -- one round trip removed from the activation budget. |
dormantBWP-Config | Optional, Rel-16 | dormantBWP-Id plus the within-Active-Time and outside-Active-Time dormancy configuration | Makes this SCell dormancy-capable and assigns it to a dormancy group (§8). |
Table 7. SCellConfig, abridged to the fields that decide behaviour. sCellConfigCommon and sCellConfigDedicated are both optional because a modification may change only one of them.
6.2 Delta semantics, and the one that bites
RRC reconfiguration in NR is a delta protocol and the rules compose in ways that are easy to get wrong. Within an RRCReconfiguration:
- A field that is present replaces the stored value.
- A field that is absent leaves the stored value untouched. It does not mean release, and it does not mean revert to default -- release requires an explicit release list or a
SetupReleaseset torelease. - A list with add-mod semantics is merged entry by entry, keyed on its index field, not replaced wholesale.
- Release lists are processed before add-mod lists in the same message.
The trap is the third rule applied to sCellConfigDedicated. Sending an SCellConfig for an already-configured sCellIndex means modify: the fields you included change and the fields you left out keep their old values. A vendor who intends a clean reconfiguration and simply resends a partial dedicated config gets a hybrid -- new BWPs with the old crossCarrierSchedulingConfig, or a new tag-Id with the old CSI configuration. The symptom is an SCell that behaves like neither the old nor the new configuration. If you mean replace, put the index in sCellToReleaseList and re-add it in the same message; rule four makes that safe and it is the standard idiom. The companion 15 RRC Procedures document covers delta configuration in general.
Note also what an SCell configuration does not contain: no RACH configuration the UE would use spontaneously, no paging configuration, no SI scheduling. An SCell is not a cell a UE could camp on; it is a set of resources described to the UE over the PCell. The one exception is Random Access ordered on an SCell to align a secondary timing advance group, covered in §13.
7. SCell Activation and Deactivation
A configured SCell starts life deactivated. In that state the UE does not monitor its PDCCH, does not report CSI for it, does not transmit SRS on it and cannot be granted anything on it. Moving it to activated is a MAC-layer act, and it is the single most operationally important mechanism in carrier aggregation.
7.1 The SCell Activation/Deactivation MAC CE
One MAC control element, two sizes, distinguished by their DL-SCH LCID TS 38.321 cl. 6.1.3.10:
- One octet, DL-SCH LCID 58. Covers
sCellIndex1 to 7. Used when no configured SCell has an index above 7 -- the common case in FR1 deployments. - Four octets, DL-SCH LCID 57. Covers
sCellIndex1 to 31. Used when any configured SCell has an index above 7. Note that this is about the index values in use, not the number of SCells: configure two SCells with indices 1 and 9 and you get the four-octet form. - Both are fixed-size CEs, so both use the one-octet R/R/LCID subheader shape -- see the companion 07 MAC PDU and Control Elements.
C_i maps to the SCell whose sCellIndex is i; there is no C_0, because ServCellIndex 0 is the PCell and the PCell cannot be deactivated.Two properties of this CE cause more field problems than anything else in carrier aggregation:
- It is an absolute bitmap, not a delta. Every
C_icorresponding to a configured SCell is obeyed. A CE with onlyC_2set does not "activate SCell 2" -- it activates SCell 2 and deactivates every other configured SCell. Bits for SCells that are not configured are ignored. - It is not acknowledged above HARQ. The only confirmation is the HARQ-ACK for the transport block that carried it. If that feedback is lost, or a NACK is falsely detected as an ACK, the network and the UE disagree about which carriers exist, and nothing in the protocol resolves the disagreement until the next CE.
| Octet 1 | Bits set | SCells activated | SCells deactivated |
|---|---|---|---|
0x0E | C3 C2 C1 | 1, 2, 3 | 4 .. 7, and 8 .. 31 in the long form |
0x02 | C1 | 1 | 2 .. 7 -- including any that were active |
0x00 | none | none | all of them |
0xFE | C7 .. C1 | 1 .. 7 | none in this octet |
0x04 | C2 | 2 | 1, and 3 .. 7 |
Table 8. Decoding Octet 1. The R bit is the least significant bit, so valid values are always even. The second row is the classic mistake: a scheduler wanting to add SCell 1 alongside an already active SCell 2 sends 0x02 and turns SCell 2 off.
7.2 What the UE does on activation
In the slot in which an activating CE takes effect, the UE TS 38.321 cl. 5.9:
- Applies
firstActiveDownlinkBWP-IdandfirstActiveUplinkBWP-Idas the active BWPs of that SCell. - Starts or restarts the
sCellDeactivationTimerfor that SCell. - Begins monitoring the SCell's PDCCH -- or, under cross-carrier scheduling, begins expecting grants for it on the scheduling cell.
- Triggers a power headroom report, because the set of cells sharing the UE's transmit power has changed (§12).
- Begins CSI reporting for the SCell, and SRS transmission on it if configured.
- Treats the SCell's HARQ entity as empty -- there is nothing buffered to recover.
Deactivation is the mirror image: stop the timer, stop monitoring PDCCH, stop CSI and SRS, flush every HARQ buffer for that cell, clear any configured downlink assignment and uplink grant on it, and abandon any ongoing Random Access on it. The HARQ flush is worth noticing -- a transport block in flight when the deactivation lands is lost, not retransmitted.
7.3 sCellDeactivationTimer
sCellDeactivationTimer sits in ServingCellConfig and applies only to serving cells without PUCCH; the PCell and any PUCCH SCell are never subject to it. It deactivates the SCell after a period with no activity, and it is restarted by activity -- a PDCCH indicating an uplink grant or a downlink assignment for that SCell, or a MAC PDU actually transmitted or received on a configured grant or assignment on it.
| Value | Slots at 30 kHz | Behaviour it produces | Where it fits |
|---|---|---|---|
ms20 | 40 | Aggressive. Any inter-burst gap above 20 ms deactivates the carrier, and the next burst pays the whole activation budget again. | Continuously loaded cells only. On bursty traffic it is actively harmful -- see §19.2. |
ms80 | 160 | Survives a short pause in a video stream or between page loads; deactivates during genuine idleness. | A defensible default for mixed traffic. |
ms160 | 320 | Survives most application-level think time. | Interactive traffic where reactivation latency is visible to the user. |
ms640 and above | 1280 and up | Effectively: stay activated unless the UE goes quiet for most of a second. | Fixed wireless access and other always-loaded cases where UE battery is not the constraint. |
Table 9. Representative sCellDeactivationTimer values; the full enumeration is in §16. The right value follows from the traffic's inter-burst gap distribution, not from a power policy in the abstract -- a timer shorter than the typical gap makes the carrier useless rather than merely idle.
7.4 The activation delay, and why it dominates
This is the part that decides whether CA delivers anything. The requirement in TS 38.133 clause 8.3.2 is structured as three additive terms -- a HARQ delay for the MAC CE, an activation time, and a CSI reporting delay -- and the middle term holds the milliseconds, because it contains everything the UE physically has to do to turn a cold carrier into a usable one:
| Step | What the UE is doing | Order of magnitude | What sets it |
|---|---|---|---|
| MAC CE delivery and HARQ | Receiving the CE and acknowledging it | 1 - 2 ms | K1 and the PUCCH occasion on the PCell |
| CE action delay | The specified delay before the CE takes effect | about 3 ms | Fixed by the MAC CE action timing rules |
| First SSB on the SCell | Waiting for an SSB burst to exist at all | 0 - 20 ms | ssb-PeriodicityServingCell and the SMTC |
| AGC settling | Setting receive gain for a carrier it has not been listening to | one SSB burst | Receiver design -- but it needs a real SSB |
| Time and frequency tracking | Acquiring fine timing and frequency offset, which usually needs a second SSB burst and therefore a second SSB period | 20 - 40 ms | SSB periodicity again. This is why a 20 ms SSB period costs so much more than a 5 ms one. |
| CSI-RS and CSI computation | Measuring a CSI-RS occasion and computing CQI, PMI and RI | 5 - 10 ms | CSI-RS periodicity and the UE's CSI computation delay |
| First CSI report | Getting the report to the gNB on its PUCCH group's uplink | 1 - 5 ms | CSI report periodicity |
| First usable grant | The scheduler finally has a channel estimate and can choose an MCS | -- | Nothing -- but everything above had to finish first |
Table 10. The activation budget, step by step. §19.2 sums a concrete instance. Values are order-of-magnitude and move with SSB periodicity, with whether the SCell is a known cell, and with receiver design.
Activation latency is the dominant practical CA impairment. Not coverage, not interference, not MIMO rank. A carrier that takes 50 ms to become usable contributes nothing to a 30 ms transaction, and modern traffic is mostly short transactions. Before investigating why an SCell is slow, establish how much of each burst it was usable for at all -- the answer is frequently none of it.
The gate is the first CSI report, not the activation. Until the scheduler has a CQI for the new carrier it must either not schedule it or schedule it at a guessed MCS. Vendors differ, and the difference is visible: one shows an SCell with zero PDSCH for 40 ms after activation, another shows PDSCH at MCS 4 with high initial BLER. Both are the same underlying condition -- no channel knowledge -- and neither is a fault.
8. Dormancy, Hibernation and Fast Resume
Rel-15 gave the network two SCell states and a bad trade between them. Deactivated is cheap for the UE and expensive to leave. Activated is instantly usable and expensive to hold, because the UE monitors PDCCH every slot, reports CSI on schedule and transmits SRS on a carrier it may not be using. Rel-16 added a third state that sits between them.
8.1 What dormancy actually is
A dormant SCell is still activated. Nothing in its MAC state changes; what changes is its active downlink bandwidth part, which becomes the BWP named by dormantBWP-Id. That BWP has no PDCCH configured on it, so the UE stops blind-decoding on the carrier -- which is where most of the power goes -- while its CSI reporting and its time and frequency tracking loops keep running. The AGC does not have to be re-set, the tracking loops do not have to re-converge, and the CSI is current or nearly so.
| Deactivated | Dormant | Activated | |
|---|---|---|---|
| PDCCH monitoring on the carrier | No | No | Yes |
| CSI reporting | No | Yes -- this is the point | Yes |
| SRS transmission | No | No | Yes, if configured |
| Time / frequency tracking maintained | No | Yes | Yes |
sCellDeactivationTimer running | No -- it already expired | Yes, and it can still expire and drop the cell to Deactivated | Yes |
| UE power cost | Lowest | Low -- close to deactivated | Highest |
| Time to first usable grant | Tens of ms (§7.4) | A BWP switch plus a CSI refresh -- single-digit ms | None |
| Signalled by | SCell Activation/Deactivation MAC CE | DCI: format 1_1 or 0_1 within Active Time, format 2_6 outside it | SCell Activation/Deactivation MAC CE, or sCellState at configuration |
| Applies to | Any SCell without PUCCH | Any SCell with dormantBWP-Config; never the PCell and never a PUCCH SCell | Any serving cell |
Table 11. The three states compared. The row that justifies the whole feature is time to first usable grant: dormancy buys back the activation budget without paying the activated-state power bill.
8.2 How dormancy is signalled
Dormancy is indicated in DCI rather than by a MAC CE, because the whole point is speed. Two mechanisms, chosen by whether the UE is inside DRX Active Time:
- Within DRX Active Time: an SCell dormancy indication field of up to 5 bits, one bit per dormancy group, in DCI format 1_1 (and 0_1) with the CRC scrambled by C-RNTI. The UE is already awake and decoding PDCCH on the scheduling cell, so the indication rides along with an ordinary grant.
- Outside DRX Active Time: a wake-up indication bit plus the same dormancy indication, in DCI format 2_6 with the CRC scrambled by PS-RNTI -- the power-saving channel. It arrives just before the next On Duration, so the UE learns both whether to wake at all and which SCell groups to bring out of dormancy before the On Duration starts. Combining the two decisions in one DCI is deliberate: both have to be made before the On Duration for either to save anything. See the companion 11 DRX.
The bits are per dormancy group, not per SCell. dormancyGroupWithinActiveTime and dormancyGroupOutsideActiveTime each assign an SCell to one of up to five groups, and one bit in the indication field toggles the whole group. This is the right granularity: SCells are usually added and removed in sets that make sense together -- the three FR2 carriers, or the pair of contiguous n78 carriers -- and a per-SCell bitmap would cost DCI payload for no benefit.
A UE with dormantBWP-Config on some SCells and not others, and dormancy groups assigned inconsistently, produces one of the most confusing symptoms in CA: a dormancy indication that appears to work on some carriers and be ignored on others. It is being ignored, correctly -- an SCell with no dormantBWP-Id has nowhere to go dormant to, so the bit for its group does nothing to it. Check dormantBWP-Config presence per SCell before suspecting the DCI.
8.3 Rel-17: making activation itself fast
Dormancy helps a carrier that has already been through activation once. Rel-17 attacks the first activation directly, on the observation that the expensive part is waiting for SSBs that arrive every 20 ms. If the network sends a temporary reference signal around the activation instead -- a short burst of tracking reference signal transmitted specifically to let the UE settle AGC and acquire time and frequency offset -- the UE does not have to wait for the SSB grid at all. Combined with Rel-16 direct activation via sCellState, this is enhanced direct SCell activation: the SCell is configured already activated, a temporary RS burst lets the UE settle immediately, and the first CSI report follows within a few milliseconds rather than after two SSB periods.
Both features are optional UE capabilities and both need network support. A network that configures sCellState = activated at a UE that does not support it, or that assumes a temporary RS the UE will not use, gets the Rel-15 timeline back with no error indication anywhere. If the measured activation delay looks like Rel-15 despite a Rel-17 configuration, check the capability before checking the configuration.
9. Cross-Carrier Scheduling
By default every serving cell schedules itself: grants for a carrier arrive on that carrier's PDCCH. Cross-carrier scheduling breaks that link, so that one cell's CORESET issues grants for several cells. It is configured per scheduled cell, in ServingCellConfig:
CrossCarrierSchedulingConfig ::= SEQUENCE {
schedulingCellInfo CHOICE {
own SEQUENCE { -- I schedule myself
cif-Presence BOOLEAN
},
other SEQUENCE { -- someone else schedules me
schedulingCellId ServCellIndex,
cif-InSchedulingCell INTEGER (1..7)
}
},
...
}Listing 1. CrossCarrierSchedulingConfig, TS 38.331. Abridged: the extension marker hides the Rel-16 and Rel-17 additions.
| Branch / field | Set on | Meaning | Consequence |
|---|---|---|---|
own with cif-Presence FALSE | A self-scheduled cell | This cell's DCIs have no Carrier Indicator Field and schedule only this cell | The default and the simplest case. DCI is one bit narrower. |
own with cif-Presence TRUE | A scheduling cell | This cell's DCIs carry a 3-bit CIF, so they can address this cell (CIF = 0) or a cell that has named it as schedulingCellId | Every DCI on this cell grows by 3 bits, including the ones that only schedule this cell. That changes the DCI size and therefore the blind-decode candidate sizes. |
other with schedulingCellId | A scheduled cell | Grants for this cell arrive on the named cell's PDCCH | This cell needs no CORESET, no search space and no PDCCH monitoring of its own. It also cannot be scheduled while the scheduling cell is deactivated. |
other with cif-InSchedulingCell | A scheduled cell | The CIF value, 1 to 7, that identifies this cell in the scheduling cell's DCIs | Must be unique among the cells that share one scheduling cell. It is not the same number as sCellIndex and there is no requirement that it match. |
Table 12. The four configuration outcomes. The distinction between sCellIndex and cif-InSchedulingCell is a routine source of confusion when decoding a DCI by hand.
9.1 The Carrier Indicator Field
The CIF is a 3-bit field at the front of the scheduling DCI formats TS 38.212 cl. 7.3.1. Three bits give eight values: 0 means the scheduling cell itself, and 1 to 7 identify up to seven other cells. That is the hard ceiling on how many cells one cell can schedule, and it is why cif-InSchedulingCell has range 1..7 rather than 1..31.
- The CIF is present in a DCI only if the cell carrying that DCI has
cif-PresenceTRUE. Presence is a property of the scheduling cell, not of the individual grant. - A DCI in a common search space -- the fallback formats 0_0 and 1_0 -- has no CIF and always schedules the cell it was found on. This is why the PCell can always be reached even if a cross-carrier configuration is broken.
- The CIF value is looked up against the scheduling cell's set of scheduled cells. A CIF value that no configured cell claims is an error the UE simply discards -- silently.
The PCell is always self-scheduled in Rel-15 and Rel-16. It has to be: the PCell carries the common search spaces that everything else falls back to, and a UE that could only be reached through an SCell would have no way back if that SCell were deactivated. Rel-17 relaxes this with an optional capability allowing an SCell to schedule the PCell, but the PCell's own common search spaces remain, precisely so the fallback path survives.
9.2 Why anyone does this
Three reasons, in decreasing order of how often they are the real one:
- PDCCH capacity balancing. A carrier with a wide bandwidth and a large CORESET can carry control for a carrier that has little room, or for one whose downlink is congested with control at the expense of data.
- Coverage. Control is more fragile than data. Putting all the PDCCH on the carrier with the best link budget -- typically the low-band PCell -- means a UE at the edge keeps receiving grants for a mid-band SCell it can still just about receive data on.
- Interference coordination. In a deployment where one carrier is heavily interfered, moving its control elsewhere keeps grants readable even when its own PDCCH would not be.
9.3 The blind-decode bill
Cross-carrier scheduling does not create PDCCH capacity, it moves it. The UE has a per-slot budget of PDCCH candidates and non-overlapping CCEs, and the budget is per scheduling cell -- so pushing three cells' grants onto one CORESET means three cells' candidates competing inside one cell's budget.
| mu | SCS | Max PDCCH candidates per slot | Max non-overlapping CCEs per slot |
|---|---|---|---|
| 0 | 15 kHz | 44 | 56 |
| 1 | 30 kHz | 36 | 56 |
| 2 | 60 kHz | 22 | 48 |
| 3 | 120 kHz | 20 | 32 |
Table 13. Per-serving-cell PDCCH monitoring limits TS 38.213 cl. 10.1. These are the numbers the candidate arithmetic in §19.4 has to fit inside. Beyond four configured downlink cells the UE reports pdcch-BlindDetectionCA and the limits are apportioned across cells rather than granted per cell.
This is the failure mode nobody sees. When the scheduler cannot fit all the grants it wants into the scheduling cell's budget, it does not report an error -- it simply issues fewer grants, and the cell that loses is whichever one the scheduler deprioritises. The SCell looks activated, its CSI reports are arriving, its radio is fine, and its throughput is a third of what it should be. The companion 08 Scheduling document has the blind-decode arithmetic in full; §19.4 works a three-cell example that does not fit.
The second invisible failure is simpler and worse: if the scheduling cell is deactivated, every cell it schedules is unreachable. Those cells remain activated -- the MAC state is untouched -- and they receive nothing, forever, because their grants were only ever going to arrive on a carrier the UE has stopped monitoring. Never configure a cell that has a sCellDeactivationTimer as a scheduling cell for anything, and if you must, make sure its timer is longer than every cell it schedules.
10. PUCCH Groups and the PUCCH SCell
Every downlink transport block needs a HARQ-ACK, and every CSI report needs an uplink resource to travel on. In the default carrier aggregation configuration, all of that uplink control information for all carriers is carried on the PCell's PUCCH. One uplink carrier acknowledges everything.
That works until it does not. Two situations break it, and both are common enough that the specification provides for a second uplink control anchor:
- Uplink reach. The PCell is usually chosen for coverage, which means low band, which means a narrow uplink. Three FR2 carriers' worth of HARQ-ACK and CSI arriving on a 20 MHz n28 uplink is a lot of UCI on a carrier that was picked because it was the only one that reached.
- PUCCH capacity. PUCCH resources are finite. A cell serving many CA-configured UEs, each acknowledging four carriers, runs out of PUCCH before it runs out of PDSCH -- and PUCCH exhaustion looks like downlink throughput loss, because a transport block that cannot be acknowledged cannot be considered delivered.
10.1 The two groups
A PUCCH group is a set of serving cells whose uplink control information is carried on the same uplink carrier. Two pieces of configuration create one: a pucch-Config in the uplink BWP configuration of the SCell that is to become the anchor, and a pucch-Cell in the PDSCH-ServingCellConfig of each SCell that is to send its feedback there, naming that anchor by ServCellIndex. An SCell with no pucch-Cell belongs to the primary group.
| Primary PUCCH group | Secondary PUCCH group | |
|---|---|---|
| Uplink anchor | The PCell | The PUCCH SCell |
| Always present? | Yes | No -- only when a PUCCH SCell is configured |
| Membership | The PCell plus every SCell not in the secondary group | The PUCCH SCell plus the SCells assigned to it |
| HARQ-ACK codebook | One codebook, spanning the cells of this group | A separate codebook, spanning the cells of this group. Rel-16 pdsch-HARQ-ACK-CodebookList allows a different codebook type per group. |
| What identifies the anchor | ServCellIndex 0 by definition | The SCell whose uplink BWP configuration contains a pucch-Config. That presence is what makes it a PUCCH SCell; the other cells of the group name it in pucch-Cell. |
| May it be deactivated? | The PCell never is | In practice no: deactivating the PUCCH SCell would strand its whole group's feedback. It is also never made dormant. |
Table 14. The two PUCCH groups. There are at most two -- this is not a general partitioning mechanism, it is one escape hatch.
10.2 What breaks when the grouping is wrong
The grouping is configuration, and configuration can disagree with reality in three ways:
| Mistake | What the UE does | What it looks like |
|---|---|---|
An SCell's pucch-Cell names a serving cell that is not configured, or one whose pucch-Config is missing | The UE has no uplink resource for that cell's feedback. Depending on implementation it either rejects the reconfiguration or reports nothing for that cell. | Either an RRCReconfigurationFailure, or an activated SCell that never produces a CSI report and never acknowledges a transport block. The latter is the quiet version and the one that costs a day of debugging. |
| FR2 carriers left in the primary group | Correct behaviour -- but all their feedback is multiplexed onto the low-band PCell uplink. | PUCCH occupancy on the PCell far above expectation, uplink-limited downlink throughput, and HARQ-ACK errors that rise with the number of active SCells rather than with any radio condition. |
| A PUCCH SCell that is allowed to deactivate | When its sCellDeactivationTimer expires, the whole secondary group loses its feedback path. | A cluster of SCells going useless together, at a timer boundary, with no radio event to explain it. |
Table 15. Three PUCCH grouping mistakes. All three present as downlink throughput problems and none of them is a downlink problem.
One field worth checking per SCell: pathlossReferenceLinking, which is ENUMERATED {pCell, sCell} and tells the UE whether to derive the pathloss for uplink power control on that cell from the PCell's downlink or from the SCell's own. Set it to pCell on an inter-band SCell whose path to the UE is genuinely different and the uplink power on that cell is computed from the wrong pathloss -- systematically too high or too low, never noisy, which is what makes it hard to spot. It is also a useful log marker: sCell on an SCell strongly suggests that cell was intended to be an independent uplink anchor.
11. HARQ Under Carrier Aggregation
HARQ is per serving cell. Each carrier gets its own HARQ entity with its own set of processes, its own soft buffer partition and its own retransmission state. Nothing is shared, and a retransmission for a transport block first sent on one carrier is always sent on that same carrier. The companion 05 HARQ document owns the mechanism; what follows is only what aggregation changes.
| Aspect | Single carrier | Under CA | Why |
|---|---|---|---|
| HARQ entities | One per direction | One per direction per serving cell | Processes are identified by a 4-bit HARQ process number that is only unique within a cell. Process 3 on the PCell and process 3 on SCell 1 are unrelated. |
| Processes per cell | 8 by default, or nrofHARQ-ProcessesForPDSCH if configured | The same, per cell -- so a 4-carrier UE can have 32 downlink processes in flight | This is the real reason CA needs UE memory: soft buffer scales with carriers times processes. |
| HARQ-ACK feedback | One codebook on the PUCCH of the only cell | One codebook per PUCCH group, spanning every cell in that group (§10) | The codebook is the place aggregation actually touches HARQ. |
| Retransmission carrier | Trivially the same carrier | The same carrier, always. There is no cross-carrier HARQ retransmission. | The soft buffer holding the failed attempt belongs to that cell. |
Table 16. HARQ under aggregation. Only the feedback is aggregated; the processes themselves are strictly per carrier.
11.1 The codebook, and why the DAI exists
The UE and the gNB must agree, bit for bit, on how many HARQ-ACK bits are in a PUCCH transmission and which transport block each bit refers to. With one carrier this is nearly trivial. With four carriers, each with several PDSCH occasions per feedback opportunity, it is the hardest agreement in the uplink -- and a disagreement of one bit corrupts every bit after it.
- A Type-1 (semi-static) codebook sizes itself from configuration: the set of candidate PDSCH occasions, times the serving cells, times the transport blocks per cell. It is robust -- both sides compute the same size without any dynamic signalling -- and it is wasteful, because it reserves bits for every occasion on every carrier whether anything was scheduled or not. With four carriers it gets large fast.
- A Type-2 (dynamic) codebook sizes itself from what was actually scheduled, using the Downlink Assignment Index carried in each DCI. Smaller, but now the size depends on the UE having received the DCIs.
- A Type-3 codebook (Rel-16) is a one-shot report of the HARQ-ACK state of every process on every configured cell, requested by DCI. It exists to recover from exactly the disagreement described above.
The counter DAI in each DCI numbers the assignments as they accumulate, ordered first by serving cell index and then by PDCCH monitoring occasion. The total DAI, present in DCI format 1_1 when carrier aggregation is configured, gives the total number of assignments across all serving cells up to and including the current monitoring occasion. That second field is there for aggregation and nothing else: with one carrier the counter DAI is sufficient, but with several, a UE that missed a grant on SCell 2 entirely would compute a codebook one entry short and misalign everything. The total DAI lets it notice the gap and pad correctly.
Spatial bundling (harq-ACK-SpatialBundlingPUCCH, and the PUSCH variant) replaces the two per-codeword ACK bits of a cell with their logical AND, halving the codebook for cells configured with two codewords. It is a codebook-size measure, not a reliability measure, and it costs throughput: one failed codeword now NACKs both, so both are retransmitted. Enable it because the codebook does not fit, not because it sounds tidy.
A Type-1 codebook mismatch under CA is the single nastiest HARQ failure in a log, because the symptom is not on the cell that caused it. Every bit after the misalignment refers to the wrong transport block, so ACKs and NACKs land on the wrong carriers, and you see elevated BLER on carriers that were never the problem. The tell is that the errors correlate with the number of active carriers rather than with any carrier's radio conditions. See the companion 05 HARQ document for the codebook construction in detail.
12. Uplink Power and PHR Under Carrier Aggregation
Downlink aggregation costs the UE receiver complexity. Uplink aggregation costs it something it cannot manufacture: transmit power. A UE has one power budget, set by its power class, and every uplink carrier draws from it. Configure two uplink carriers and the UE does not get twice the power -- it gets the same power, divided.
12.1 The two ceilings
P_CMAX,f,cis per carrier f on serving cell c, derived from that cell's configuredp-Max, the band's emission requirements and the UE power class. It bounds what a single carrier may transmit at, and it is the value a power headroom report is relative to.- The UE-wide and per-frequency-range ceilings -- the UE power class, and
p-NR-FR1inPhysicalCellGroupConfigfor the FR1 total -- bound the sum across simultaneous uplink transmissions. This is the limit that makes CA uplink a zero-sum game.
When the sum of what the UE wants to transmit exceeds the shared ceiling, it does not fail -- it prioritises and scales TS 38.213 cl. 7. The priority order is fixed and worth memorising, because it explains a great many uplink oddities: PUCCH carrying HARQ-ACK or SR comes first, then PUSCH carrying uplink control information, then ordinary PUSCH, then SRS. Within a category the PCell's transmission outranks an SCell's.
The consequence, stated plainly: adding an uplink SCell can reduce PCell uplink throughput. The power the SCell's PUSCH draws is power the PCell's PUSCH no longer has, and because the PCell carries the PUCCH, the PCell's control transmissions win the priority contest and its data transmissions lose it. If uplink throughput on the PCell drops when an uplink SCell is activated, that is not a fault -- that is the power budget doing arithmetic. It is also why many deployments configure downlink CA on three carriers and uplink on one.
12.2 Why the Multiple Entry PHR exists
A power headroom report tells the scheduler how much room the UE has left above its current transmission, so the scheduler can decide whether a larger grant would actually be transmitted at a usable power. With one uplink carrier one number suffices, and the Single Entry PHR (UL-SCH LCID 57) carries exactly that.
With several uplink carriers, one number is not just insufficient, it is meaningless -- headroom on the carrier the UE happened to be transmitting on says nothing about the carrier the scheduler wants to grant next, and the carriers share a budget so they are not independent either. The Multiple Entry PHR exists for this and only for this. Carrier aggregation is the reason it is in the specification.
| Form | LCID | Structure | When it is used |
|---|---|---|---|
| Single Entry PHR | 57 | Two octets: one PH value plus one P_CMAX,f,c | No uplink CA. One carrier, one number. |
| Multiple Entry PHR, one-octet bitmap | 56 | A 1-octet serving-cell bitmap covering ServCellIndex 1..7, then one or two octets per reported cell | Uplink CA with all serving cell indices at 7 or below. |
| Multiple Entry PHR, four-octet bitmap | 54 | A 4-octet bitmap covering ServCellIndex 1..31, then the per-cell entries | Uplink CA where any serving cell index exceeds 7 -- the same threshold rule as the activation MAC CE. |
Table 17. The three PHR forms. Note the same one-octet / four-octet split as the SCell activation CE, driven by the same index threshold. The companion 10 BSR, PHR and SR document owns the field layouts and the triggering rules.
Each entry in a Multiple Entry PHR carries a V bit distinguishing a real report -- measured on an actual transmission in that cell -- from a virtual one, computed from a reference format because the UE was not transmitting there. Virtual entries are the normal case for a carrier that has just been activated and has not yet been granted anything, and they are exactly as useful as a calculation can be: they tell the scheduler what the UE thinks it could do, not what it has done.
SCell activation triggers a PHR TS 38.321 cl. 5.4.6, and it does so because the set of cells sharing the power budget has just changed and every previously reported headroom value is now stale. If you see a Multiple Entry PHR arrive a few milliseconds after an activation CE, with mostly virtual entries, that is the mechanism working correctly. Its absence is the interesting case -- it suggests the activation did not take effect at the UE.
13. Timing Advance Groups: pTAG and sTAG
Uplink transmissions must arrive at the receiver inside its window. The UE achieves that by advancing its transmissions by N_TA, derived from timing advance commands -- the mechanism the companion 04 Timing Advance document covers in full. The question aggregation raises is whether one advance value can serve every carrier.
Usually yes. Carriers on the same band from the same radio unit travel the same path with the same feeder delay, so one N_TA is right for all of them. But not always, and the cases where it is not are precisely the inter-band ones:
- A low-band coverage carrier from a macro site aggregated with a mid-band carrier from a different site, or from a remote radio head at the far end of a fibre run.
- Carriers whose radio units have materially different internal delays -- different hardware generations sharing a UE.
- An FR2 carrier from a separate mmWave unit aggregated with an FR1 carrier from the macro.
Where the difference exceeds what the cyclic prefix can absorb, one advance value cannot serve both, and the carriers must be split into timing advance groups. A TAG is a set of serving cells that share an uplink timing advance and a timeAlignmentTimer.
| pTAG (primary TAG) | sTAG (secondary TAG) | |
|---|---|---|
| Contains | The SpCell -- in CA, the PCell -- and any SCells that share its timing | SCells only. Never the SpCell. |
tag-Id | 0 | 1 .. 3 (maxNrofTAGs is 4) |
| How the initial TA is obtained | From the Random Access that established the connection | From a Random Access on one of the SCells in that TAG, ordered by the network via a PDCCH order. This is the only circumstance in which a UE performs Random Access on an SCell. |
| Maintained by | Timing Advance Command MAC CEs with TAG Id = 0 | Timing Advance Command MAC CEs carrying that TAG's TAG Id |
timeAlignmentTimer expiry | All TAGs are treated as expired. Uplink on every serving cell is lost, all HARQ buffers are flushed, PUCCH and SRS are released, and the UE needs Random Access on the SpCell to recover. | Only that TAG's cells are affected: their HARQ buffers are flushed and their PUCCH and SRS resources released. The PCell is untouched, and there is no RLF. |
Table 18. pTAG and sTAG. The asymmetry in the last row is the important part: an sTAG losing timing is a local event, while the pTAG losing timing takes the whole uplink with it.
Assignment is per serving cell, through tag-Id in ServingCellConfig. Absence means the cell belongs to the pTAG.
A TAG misassignment is a slow, quiet failure. Put an inter-band SCell with a genuinely different path delay into the pTAG and its uplink arrives at the wrong time -- early or late by more than the receiver's tolerance -- so its PUSCH and SRS fail to decode. The downlink on that carrier is fine, its CSI reports arrive on the PCell PUCCH normally, and the only symptom is that nothing the UE transmits on that carrier is ever received. It reads like an uplink coverage problem and no amount of power fixes it. Look for a PDCCH-ordered Random Access on the SCell that never happened: if the SCell is in the pTAG, the network never ordered one, because in the pTAG it did not need to.
The Timing Advance Command MAC CE carries a 2-bit TAG Id alongside its 6-bit command, which is what makes per-TAG maintenance possible and is why the field exists at all in a single-carrier world where it is always zero. When decoding, do not assume the TAG Id is zero -- read it. A command intended for an sTAG applied to the pTAG would move the whole uplink.
14. Measurement and CSI Load Under Carrier Aggregation
Aggregation multiplies two reporting loads: the L3 measurement load that decides which carriers to use, and the L1 CSI load that decides how to use them. Both scale with carrier count, and both land on one uplink.
14.1 Measurement: one measObject per frequency
An SCell cannot be added on faith. The network needs evidence that the candidate frequency is receivable at this UE, which means a measObject for that frequency in the UE's measConfig and a reporting configuration that will produce something. In practice:
measObjectNRper frequency, keyed by SSB ARFCN. Two n78 carriers are two frequencies and need two measurement objects, even though they are adjacent and from the same radio.servingCellMOin each serving cell'sServingCellConfiglinks that cell to the measurement object covering its frequency, so measurements on a configured serving cell are attributed correctly rather than reported as a neighbour.- An A4 or A1 event on the candidate frequency is the usual trigger for SCell addition -- this frequency is now good enough to be worth adding. An A2 on a configured SCell's frequency is the usual trigger for releasing it. The companion 20 Measurements and Events document covers the event definitions.
- Measurement gaps may be needed to measure a candidate frequency the UE cannot receive while serving on its current carriers -- and a gap is a hole in every carrier's scheduling, not just the one being measured. See the companion 21 Measurement Gaps and SMTC.
A candidate SCell frequency with no measObject configured produces a specific and confusing outcome: the network never adds the SCell, everything looks healthy, and the UE reports nothing wrong because it was never asked. If a deployment shows CA working on some UEs and not others with identical capabilities, compare the measConfig before comparing anything else.
14.2 CSI: the reporting bill
Each serving cell has its own csi-MeasConfig, its own CSI-RS resources and its own report configurations. The reports are what makes each carrier schedulable, and they all have to fit in the uplink of their PUCCH group. The arithmetic is unforgiving:
Four serving cells, each with one periodic wideband CSI report every 5 ms, all in the primary PUCCH group:
4 cells x (1000 / 5) reports per second = 800 CSI reports per second per UE
At 30 kHz SCS a slot is 0.5 ms, so 5 ms is 10 slots: on average 0.4 CSI reports per slot per UE must find a PUCCH resource on the PCell. Twenty CA-configured UEs in the cell means eight CSI reports per slot competing for PUCCH, before a single HARQ-ACK is counted.
Halving the reporting rate to every 10 ms halves the bill and costs little on a slow-fading carrier -- but costs a great deal on a fast-fading one, where a stale CQI means a wrong MCS.
When reports collide, they are not all sent. TS 38.214 defines a priority order over CSI reports -- by report type first, and by serving cell index within a type -- and lower-priority reports are dropped. The practical consequence is a bias: the highest-indexed SCells lose their CSI reports first. A four-carrier UE under CSI congestion will show current CQI on the PCell and SCell 1, and increasingly stale CQI on SCells 2 and 3, which the scheduler then serves at a conservative MCS. The throughput distribution across carriers looks like a radio asymmetry and is a reporting-capacity artefact.
This is a good argument for a second PUCCH group that has nothing to do with coverage. Splitting the FR2 carriers into their own group gives their CSI reports their own uplink and their own priority contest, so they stop competing with the FR1 carriers' feedback. A configuration with two PUCCH groups often shows a more even CQI freshness across carriers than a single-group configuration with the same radio.
15. Carrier Aggregation Versus Dual Connectivity
Both aggregate carriers. They are not variants of one mechanism, and the choice between them is not about how much bandwidth you want -- it is about whether the carriers can be scheduled by the same scheduler in the same millisecond.
| Carrier aggregation | Dual connectivity | |
|---|---|---|
| Schedulers | One. A single scheduler decides every grant on every carrier in the same scheduling instant, with full knowledge of all of them. | Two. Each node schedules its own cell group, and neither sees the other's decisions in real time. |
| MAC entities | One | Two -- one per cell group |
| Control-plane anchor | The PCell. One RRC connection, one set of RRC state, one RLF. | The PCell for the master node; the PSCell is the SCG's anchor, with SRB3 optionally allowing direct SN signalling. SCG failure is reported over the MCG. |
| Backhaul assumption | Ideal. Carriers are in the same gNB, usually in the same gNB-DU. Coordination is internal. | Non-ideal tolerated. The nodes talk over Xn or X2 with tens of milliseconds of latency, so nothing time-critical crosses between them. |
| Latency tolerance between the aggregation points | Sub-millisecond -- the scheduler needs current buffer and channel state for all carriers to make one decision. | Tens of milliseconds. Split bearers reorder at PDCP, which is what absorbs the difference. |
| Where data is split | At MAC, per transport block, per slot. A single logical channel's data goes to whichever carrier has room. | At PDCP, per PDU. Reordering at the receiver is mandatory and adds delay. |
| Failure handling | SCell radio problems are invisible; the network releases the SCell. Only the PCell can cause RLF. | SCG failure is a defined procedure with its own report and its own recovery. See the companion 28 NSA Attach Process. |
| Uplink control | One PUCCH group, optionally two (§10) | One PUCCH per cell group -- the PCell and the PSCell each have one, necessarily. |
| Right tool when | Carriers are co-located and co-scheduled. Almost always the right answer inside one gNB. | Carriers are in different nodes, different RATs, or separated by backhaul that cannot carry per-slot coordination -- which is why EN-DC exists. |
Table 19. CA and DC compared on the axes that decide which one you can use. The first two rows determine everything below them.
The two compose. A UE in NR-DC has carrier aggregation within each cell group: the MCG is a PCell plus SCells and the SCG is a PSCell plus SCells, each cell group aggregating internally under its own scheduler. This is why the taxonomy in §2 has both kinds of term in it, and why ServCellIndex runs to 31 across 16-cell cell groups. When reading a log, establish how many cell groups exist before trying to interpret any serving cell index.
16. Parameter and Timer Reference
| ASN.1 field | Range or values | Typical | Effect |
|---|---|---|---|
sCellIndex | INTEGER (1..31) | 1, 2, 3 in order of addition | The UE-specific SCell index. Selects the C_i bit in the activation MAC CE. Values above 7 force the four-octet CE form. |
sCellState | ENUMERATED {activated} | absent (Rel-15 behaviour) | Rel-16 direct activation: if present the SCell is activated as the reconfiguration is applied, saving a MAC CE round trip. |
sCellDeactivationTimer | ENUMERATED {ms20, ms40, ms80, ms160, ms200, ms240, ms320, ms400, ms480, ms520, ms640, ms720, ms840, ms1280, spare2, spare1} | ms80 to ms160 | Inactivity timeout for an SCell without PUCCH. The dominant CA tuning parameter -- too short and every burst pays the activation budget (§19.2). |
firstActiveDownlinkBWP-Id | BWP-Id, INTEGER (0..4) | 1 | The downlink BWP made active when the SCell is activated. Not the BWP it was last on. |
firstActiveUplinkBWP-Id | BWP-Id, INTEGER (0..4) | 1 | The same for the uplink. |
defaultDownlinkBWP-Id | BWP-Id, INTEGER (0..4) | absent, meaning the initial BWP | Where bwp-InactivityTimer expiry lands. |
bwp-InactivityTimer | ENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80, ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, ...} | ms100 | Per serving cell. Falls back to the default BWP on expiry. Interacts with dormancy (§5.3). |
dormantBWP-Id | BWP-Id, INTEGER (0..4) | absent unless Rel-16 dormancy is used | The BWP an SCell moves to when made dormant. Its absence makes the SCell not dormancy-capable, and dormancy indications for its group are then ignored for that cell. |
dormancyGroupWithinActiveTime | INTEGER (0..4) | 0 | Which dormancy-indication bit in DCI 1_1 / 0_1 controls this SCell. |
dormancyGroupOutsideActiveTime | INTEGER (0..4) | 0 | The same for DCI 2_6, outside DRX Active Time. |
cif-Presence | BOOLEAN | FALSE | TRUE adds a 3-bit Carrier Indicator Field to every DCI on this cell, changing DCI sizes. Only TRUE on a cell that schedules others. |
schedulingCellId | ServCellIndex, INTEGER (0..31) | 0 (the PCell) when cross-carrier scheduling is used | Which cell's PDCCH carries this cell's grants. |
cif-InSchedulingCell | INTEGER (1..7) | 1, 2, 3 | The CIF value that identifies this cell in the scheduling cell's DCIs. Must be unique per scheduling cell. Not the same as sCellIndex. |
tag-Id | INTEGER (0..3) | 0 | Timing advance group membership. 0 is the pTAG. A non-zero value requires the network to order Random Access on an SCell of that TAG (§13). |
timeAlignmentTimer | ENUMERATED {ms500, ms750, ms1280, ms1920, ms2560, ms5120, ms10240, infinity} | ms1920 on the pTAG | Per TAG. Expiry on the pTAG loses the whole uplink; expiry on an sTAG loses only that group's cells. |
pathlossReferenceLinking | ENUMERATED {pCell, sCell} | sCell on inter-band SCells | Whether uplink power control on this SCell derives pathloss from the PCell downlink or from this cell's own. |
nrofHARQ-ProcessesForPDSCH | ENUMERATED {n2, n4, n6, n10, n12, n16} | absent, meaning 8 | Per serving cell. Multiplied by the carrier count, this is what sizes the UE's soft buffer requirement. |
pdsch-HARQ-ACK-Codebook | ENUMERATED {semiStatic, dynamic} | dynamic | Per cell group in Rel-15. Rel-16 pdsch-HARQ-ACK-CodebookList allows one value per PUCCH group. |
harq-ACK-SpatialBundlingPUCCH | ENUMERATED {true} | absent | Halves the codebook contribution of two-codeword cells at the cost of coupling their retransmissions (§11.1). |
servingCellMO | MeasObjectId, INTEGER (1..64) | one per serving cell frequency | Links the serving cell to the measurement object for its frequency, so its measurements are attributed to it. |
ssb-PeriodicityServingCell | ENUMERATED {ms5, ms10, ms20, ms40, ms80, ms160} | ms20 | Governs how long AGC and tracking take after activation -- the largest term in the activation budget (§7.4). |
pdcch-BlindDetectionCA | INTEGER (2..16) | UE-reported | How the PDCCH monitoring budget is apportioned once more than four downlink cells are configured. |
p-NR-FR1 | P-Max, INTEGER (-30..33) dBm | 23 dBm | Per cell group: the total FR1 uplink power the UE may use across all its carriers. |
p-Max | P-Max, INTEGER (-30..33) dBm | 23 dBm | Per serving cell, feeding P_CMAX,f,c (§12.1). |
Table 20. CA parameter reference. Enumerations marked with ... are abridged past the extension marker. Typical values are what many vendors ship, not specification defaults.
16.1 Timers, and what expiry costs
| Timer | Scope | Started / restarted by | Expiry does |
|---|---|---|---|
sCellDeactivationTimer | Per SCell without PUCCH | Started on activation; restarted by a PDCCH indicating a grant or assignment for that SCell, or a MAC PDU on a configured grant or assignment on it | Deactivates the SCell: PDCCH monitoring, CSI and SRS stop, HARQ buffers flush. The next use pays the full activation budget. |
bwp-InactivityTimer | Per serving cell | Restarted by PDCCH reception on the active BWP of that cell | Switches the cell's active downlink BWP to defaultDownlinkBWP-Id, or to the initial BWP if none is configured. |
timeAlignmentTimer (pTAG) | Per TAG, tag-Id 0 | Restarted by a Timing Advance Command MAC CE for that TAG, or by a RAR TA command | Treats all TAGs as expired: uplink lost on every serving cell, HARQ buffers flushed, PUCCH and SRS released. Recovery needs Random Access on the SpCell. |
timeAlignmentTimer (sTAG) | Per TAG, tag-Id 1..3 | The same, per TAG | Only that TAG's SCells lose uplink. HARQ flushed and SRS released for those cells. The PCell is unaffected and there is no RLF. |
drx-InactivityTimer and the DRX cycle | Per DRX group -- and a Rel-16 secondaryDRX-GroupConfig allows a second group, typically for FR2 SCells | See the companion 11 DRX document | Ends Active Time. Outside Active Time, dormancy is indicated by DCI 2_6 rather than 1_1 (§8.2). |
Table 21. The timers that govern CA behaviour. Only the first is specific to carrier aggregation; the rest are general mechanisms whose aggregate effect is what makes multi-carrier behaviour hard to predict from any one of them.
17. Failure Modes, and What Each Looks Like in a Log
This is the section to read first when something is wrong. Almost every row is quiet: the connection stays up, the PCell keeps working, no failure message is generated, and the only evidence is throughput that does not match the configuration. That is the defining characteristic of carrier aggregation faults, and it follows directly from the fact that an SCell has no failure procedure of its own.
| Failure | Detected by | What the UE and network do | What it looks like in a log |
|---|---|---|---|
| SCell configured but never activated | Nobody. It is not a failure at any layer. | UE: keeps the SCell in the deactivated state indefinitely. Network: never sends an activation CE, usually because the scheduler's activation threshold is never met. | sCellToAddModList present, RRCReconfigurationComplete returned, and no SCell Activation/Deactivation MAC CE anywhere afterwards. Serving cell count is 3, active carrier count is 1. Look at the scheduler's activation trigger, not at the radio. |
| Activation MAC CE lost, or its HARQ-ACK falsely detected as an ACK | Nobody, immediately. The network believes the SCell is active. | UE: SCell stays deactivated, monitors nothing. Network: issues grants for a carrier the UE is not watching, sees no HARQ feedback for them, and eventually blames the radio. | Grants for the SCell in the scheduler trace with a solid run of DTX (no HARQ feedback at all, as opposed to NACKs) from the very first one. DTX from the first grant is the signature -- a radio problem produces NACKs first. |
sCellDeactivationTimer firing under bursty traffic | Nobody. Everything works as specified. | UE: deactivates the SCell in each inter-burst gap. Network: re-activates it at the start of each burst and pays the activation budget every time. | Repeated activation CEs at burst boundaries, each followed by tens of milliseconds with no PDSCH on that carrier, then a deactivation. SCell throughput is a small fraction of the peak while its CQI, when it arrives at all, looks excellent (§19.2). |
Cross-carrier scheduling configured but cif-Presence is FALSE on the scheduling cell | The UE, on receiving the reconfiguration -- if it validates. Many do not. | UE: sees no CIF in the DCIs, so every grant on the scheduling cell applies to the scheduling cell. Network: believes it is scheduling three carriers. | The scheduling cell receives grants it was not meant to have, including some sized for a different carrier's bandwidth part, and the scheduled cells receive none. Often shows as PDSCH decode failures on the PCell alongside a completely idle SCell. |
| The scheduling cell is itself an SCell and gets deactivated | Nobody. | UE: stops monitoring the scheduling cell, so no cell it schedules can be reached. Those cells remain activated. Network: continues to believe several carriers are available. | A cluster of SCells going silent simultaneously at a deactivation timer boundary, all of them still reported as activated. The tell is the simultaneity: radio problems do not arrive on three carriers in the same slot. |
Duplicate cif-InSchedulingCell among cells sharing one scheduling cell | The UE, if it validates the configuration. | UE: the CIF value is ambiguous. Behaviour is implementation-defined and typically means one of the two cells is never scheduled. | One SCell with normal throughput and another, configured identically, with none. Compare the CIF values before comparing anything else. |
| PUCCH group misconfiguration -- an SCell assigned to a secondary group that has no usable PUCCH SCell | The UE, either at reconfiguration or silently. | UE: has no uplink resource for that cell's HARQ-ACK and CSI. Either rejects the reconfiguration or reports nothing for the cell. Network: gets no feedback and cannot schedule. | Either an RRCReconfigurationFailure, or -- the quiet version -- an SCell that is activated, has been activated long enough, and has never produced a single CSI report (§10.2). |
| A band combination the UE never claimed is configured anyway | The UE, at reconfiguration. | UE: entitled to fail the reconfiguration. Some UEs reject it cleanly, some accept it and then behave incorrectly on the unsupported carrier, and some accept it and drop the connection. | RRCReconfigurationFailure, or re-establishment shortly after an SCell addition, or an SCell that is activated and produces nonsensical CSI. Re-derive the combination string from the configuration and search for it in the capability message (§4.2). |
| TAG misassignment -- an inter-band SCell left in the pTAG | Nobody. The downlink is unaffected. | UE: applies the pTAG's N_TA to a carrier that needs a different one. Network: cannot decode that carrier's PUSCH or SRS. | Downlink on the SCell is healthy, CSI arrives normally on the PCell, and every uplink transmission on the SCell fails. No PDCCH-ordered Random Access on the SCell will be present, because in the pTAG none was needed (§13). |
| Blind-decode budget exceeded on the scheduling cell | Nobody. There is no error to report. | UE: monitors only what it was configured to monitor. Network: cannot fit all the grants it wants and silently issues fewer. | Scheduled cells running well below their capacity with excellent CQI, an unremarkable PCell, and PDCCH occupancy on the scheduling cell pinned near its limit. Scales with the number of cross-carrier scheduled cells, not with load (§19.4). |
| Mixed-numerology slot misalignment -- K0 or K2 chosen without the cross-numerology scaling | The UE, as an invalid or unschedulable grant. | UE: either discards the grant or receives on the wrong slot and decodes nothing. Network: sees NACK or DTX. | Failures that correlate exactly with the parity of the scheduling cell's slot number, because the floor in the scaling formula maps two PDCCH slots onto one PDSCH slot (§5.2). Parity-correlated failures are almost never a radio effect. |
| SCell radio problems -- the carrier genuinely degrades or disappears | Nobody, in the sense that matters. There is no RLF on an SCell. | UE: continues to monitor and report whatever it can. It does not declare failure, does not re-establish, and generates no failure report. Network: sees CSI degrade or stop and HARQ feedback stop, and eventually releases the SCell. | CSI reports for the cell degrading or ceasing, HARQ feedback going to DTX, then an RRCReconfiguration with an sCellToReleaseList. No failure message anywhere. This is why SCell failures are quiet -- the release is the only evidence, and it arrives after the fact. |
Table 22. Twelve CA failure modes. Note the second column: in seven of twelve the honest answer is nobody detects it, which is the single most important thing to internalise about carrier aggregation faults.
Sort these by how you would find them. Three are visible in RRC alone (never activated; unsupported combination; PUCCH grouping when it is rejected). Four need the MAC trace (lost CE; timer thrash; deactivated scheduling cell; duplicate CIF). Three need per-carrier CSI and HARQ statistics (quiet PUCCH grouping failure; SCell radio degradation; TAG misassignment). Two need PDCCH occupancy on the scheduling cell (blind-decode exhaustion; numerology misalignment). If you only have RRC logs you can rule out a quarter of this table and nothing more.
18. ASN.1 Structures
Abridged from TS 38.331. ... marks omitted fields, omitted enumeration members and extension markers; conditional presence tags are shown where they carry information.
18.1 The SCell lists and SCellConfig
CellGroupConfig ::= SEQUENCE {
cellGroupId CellGroupId,
rlc-BearerToAddModList SEQUENCE (SIZE(1..maxLC-ID)) OF RLC-BearerConfig OPTIONAL,
mac-CellGroupConfig MAC-CellGroupConfig OPTIONAL,
physicalCellGroupConfig PhysicalCellGroupConfig OPTIONAL,
spCellConfig SpCellConfig OPTIONAL,
sCellToAddModList SEQUENCE (SIZE (1..maxNrofSCells)) OF
SCellConfig OPTIONAL,
sCellToReleaseList SEQUENCE (SIZE (1..maxNrofSCells)) OF
SCellIndex OPTIONAL,
...
}
SCellConfig ::= SEQUENCE {
sCellIndex SCellIndex,
sCellConfigCommon ServingCellConfigCommon OPTIONAL,
sCellConfigDedicated ServingCellConfig OPTIONAL,
...,
[[ smtc SSB-MTC OPTIONAL ]],
[[ sCellState-r16 ENUMERATED {activated} OPTIONAL,
dormantBWP-Config-r16 SetupRelease { DormantBWP-Config-r16 } OPTIONAL,
... ]]
}
SCellIndex ::= INTEGER (1..31)
ServCellIndex ::= INTEGER (0..maxNrofServingCells-1) -- 0 is always the PCell
maxNrofSCells INTEGER ::= 31
maxNrofServingCells INTEGER ::= 32Listing 2. CellGroupConfig and SCellConfig. The double-bracket groups are the Rel-16 extensions; a decoder built against Rel-15 will skip them rather than fail, which is why a dormancy configuration can be present in a message and absent from your trace.
18.2 ServingCellConfig, the CA-relevant parts
ServingCellConfig ::= SEQUENCE {
tdd-UL-DL-ConfigurationDedicated TDD-UL-DL-ConfigDedicated OPTIONAL,
initialDownlinkBWP BWP-DownlinkDedicated OPTIONAL,
downlinkBWP-ToReleaseList SEQUENCE (SIZE (1..4)) OF BWP-Id OPTIONAL,
downlinkBWP-ToAddModList SEQUENCE (SIZE (1..4)) OF BWP-Downlink OPTIONAL,
firstActiveDownlinkBWP-Id BWP-Id OPTIONAL,
bwp-InactivityTimer ENUMERATED {ms2, ms3, ms4, ms5, ms6,
ms8, ms10, ms20, ms30, ms40, ms50,
ms60, ms80, ms100, ms200, ms300,
ms500, ms750, ms1280, ms1920,
ms2560, ...} OPTIONAL,
defaultDownlinkBWP-Id BWP-Id OPTIONAL,
uplinkConfig UplinkConfig OPTIONAL,
supplementaryUplink UplinkConfig OPTIONAL,
pdcch-ServingCellConfig SetupRelease {PDCCH-ServingCellConfig} OPTIONAL,
pdsch-ServingCellConfig SetupRelease {PDSCH-ServingCellConfig} OPTIONAL,
csi-MeasConfig SetupRelease {CSI-MeasConfig} OPTIONAL,
sCellDeactivationTimer ENUMERATED {ms20, ms40, ms80, ms160,
ms200, ms240, ms320, ms400, ms480,
ms520, ms640, ms720, ms840, ms1280,
spare2, spare1} OPTIONAL,
-- Cond ServingCellWithoutPUCCH
crossCarrierSchedulingConfig CrossCarrierSchedulingConfig OPTIONAL,
tag-Id TAG-Id,
pathlossReferenceLinking ENUMERATED {pCell, sCell} OPTIONAL,
servingCellMO MeasObjectId OPTIONAL,
...
}
PDSCH-ServingCellConfig ::= SEQUENCE {
codeBlockGroupTransmission SetupRelease {PDSCH-CodeBlockGroupTransmission} OPTIONAL,
xOverhead ENUMERATED {xOh6, xOh12, xOh18} OPTIONAL,
nrofHARQ-ProcessesForPDSCH ENUMERATED {n2, n4, n6, n10, n12, n16} OPTIONAL,
pucch-Cell ServCellIndex OPTIONAL,
-- Cond SCellAddOnly
...
}Listing 3. ServingCellConfig abridged to the CA-relevant fields, plus the PDSCH-ServingCellConfig that carries the per-cell HARQ process count. Note the conditional tag on sCellDeactivationTimer: it is only present for a serving cell without PUCCH, which is the specification's way of saying the PCell and the PUCCH SCell are never subject to it.
18.3 Cross-carrier scheduling, dormancy and the TAG
CrossCarrierSchedulingConfig ::= SEQUENCE {
schedulingCellInfo CHOICE {
own SEQUENCE {
cif-Presence BOOLEAN
},
other SEQUENCE {
schedulingCellId ServCellIndex,
cif-InSchedulingCell INTEGER (1..7)
}
},
...
}
DormantBWP-Config-r16 ::= SEQUENCE {
dormantBWP-Id-r16 BWP-Id OPTIONAL,
withinActiveTimeConfig-r16 SetupRelease {WithinActiveTimeConfig-r16} OPTIONAL,
outsideActiveTimeConfig-r16 SetupRelease {OutsideActiveTimeConfig-r16} OPTIONAL,
...
}
WithinActiveTimeConfig-r16 ::= SEQUENCE {
firstWithinActiveTimeBWP-Id-r16 BWP-Id OPTIONAL,
dormancyGroupWithinActiveTime-r16 INTEGER (0..4) OPTIONAL,
...
}
TAG-Config ::= SEQUENCE {
tag-ToReleaseList SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG-Id OPTIONAL,
tag-ToAddModList SEQUENCE (SIZE (1..maxNrofTAGs)) OF TAG OPTIONAL
}
TAG ::= SEQUENCE {
tag-Id TAG-Id,
timeAlignmentTimer TimeAlignmentTimer,
...
}
TAG-Id ::= INTEGER (0..maxNrofTAGs-1) -- maxNrofTAGs = 4
PhysicalCellGroupConfig ::= SEQUENCE {
harq-ACK-SpatialBundlingPUCCH ENUMERATED {true} OPTIONAL,
harq-ACK-SpatialBundlingPUSCH ENUMERATED {true} OPTIONAL,
p-NR-FR1 P-Max OPTIONAL,
pdsch-HARQ-ACK-Codebook ENUMERATED {semiStatic, dynamic},
...
}Listing 4. Cross-carrier scheduling, the Rel-16 dormancy configuration, the timing advance group configuration in MAC-CellGroupConfig, and the cell-group-wide HARQ and power fields. TAG-Config is the only one of these that lives outside ServingCellConfig -- membership is per cell but the groups themselves are per cell group.
19. Worked Arithmetic
19.1 Aggregate downlink throughput for a three-carrier configuration
The peak data rate formula in TS 38.306 sums a per-carrier term over the aggregated carriers. For each carrier:
rate_j = v_layers x Q_m x f x R_max x ( N_PRB x 12 / T_s ) x ( 1 - OH ) v_layers MIMO layers on this carrier Q_m modulation order 8 for 256QAM f scaling factor 1 unless the UE reports otherwise R_max 948/1024 = 0.92578 maximum code rate N_PRB PRBs at the carrier's bandwidth and SCS T_s symbol duration = 1e-3 / (14 x 2^mu) seconds OH overhead: 0.14 for FR1 downlink, 0.18 for FR2 downlink For TDD, multiply by the downlink symbol fraction of the pattern.
CC1 -- n78, 100 MHz, TDD, 30 kHz (mu = 1), 273 PRB, 4 layers, 256QAM
T_s = 1e-3 / (14 x 2) = 35.71 us, so 1 / T_s = 28 000 symbols/s
REs per second = 273 x 12 x 28 000 = 91.728 x 10^6
x 4 layers x 8 bits = 2 935.3 x 10^6
x 0.92578 = 2 717.4 x 10^6
x (1 - 0.14) = 2 337.0 Mbit/s (this is the FDD-equivalent figure)
TDD DDDSU with 10 downlink symbols in the S slot:
downlink fraction = (3 x 14 + 10) / (5 x 14) = 52/70 = 0.7429
2 337.0 x 0.7429 = 1 736 Mbit/s
CC2 -- identical second n78 carrier = 1 736 Mbit/s
CC3 -- n28, 20 MHz, FDD, 15 kHz (mu = 0), 106 PRB, 2 layers, 256QAM
1 / T_s = 14 000 symbols/s
REs per second = 106 x 12 x 14 000 = 17.808 x 10^6
x 2 x 8 x 0.92578 x 0.86 = 227 Mbit/s (FDD, no duty factor)
Aggregate = 1 736 + 1 736 + 227 = 3 699 Mbit/s
Single-carrier reference = 1 736 Mbit/s, so CA gives 2.13x.
Two things to take from that. First, the second n78 carrier doubles the rate and the n28 carrier adds 6 per cent -- yet the n28 carrier needs a full serving-cell configuration, its own measurement object, its own CSI chain, possibly its own timing advance group and its own activation budget. Measured per unit of configuration complexity it is the expensive carrier, and it is there for coverage rather than for those 227 Mbit/s.
Second, the whole calculation assumes every carrier is active with current CSI. §19.2 is what happens when that assumption fails.
1 CC is n78 100 MHz alone; each step adds the carrier named in the subtitle. The gap between the bars is the subject of this document.19.2 The activation budget, and what a short timer costs
Budget to the first usable grant. 30 kHz SCS, ssb-PeriodicityServingCell = ms20, unknown SCell, CSI-RS every 5 ms.
MAC CE decoded, HARQ-ACK at K1 = 4 slots ...... 2.0 ms (cum. 2.0)
MAC CE action delay .......................... 3.0 ms (cum. 5.0)
Wait for the next SSB burst (0-20, take 15) ... 15.0 ms (cum. 20.0)
Second SSB burst for fine time/freq tracking .. 20.0 ms (cum. 40.0)
CSI-RS occasion + CSI computation ............. 2.5 ms (cum. 42.5)
First CSI report reaches the gNB .............. 1.0 ms (cum. 43.5)
Total: about 43.5 ms from the decision to the first grant that uses a real channel estimate.
Note what dominates: 35 of the 43.5 ms is waiting for SSBs. Change ssb-PeriodicityServingCell to ms5 and those two terms fall to about 9 ms, taking the total to roughly 17.5 ms -- a bigger improvement than any other single change available.
What sCellDeactivationTimer = ms20 does to it. Traffic pattern: 20 ms bursts every 60 ms, so 40 ms of silence between them.
40 ms of silence > 20 ms timer, so the SCells deactivate after every burst.
Each burst: activation ordered at t = 0, first usable grant at t = 43.5 ms, burst ended at t = 20 ms.
Useful SCell time per burst = 0 ms. The SCells never carry a single transport block, but they do cost an activation CE, a PHR, CSI reporting and PDCCH monitoring on every burst.
Achieved rate = PCell only = 1 736 Mbit/s out of a 3 699 Mbit/s configuration.
With ms160 instead: 40 ms < 160 ms, so the timer never expires. From the second burst onward all three carriers are active and current: 3 699 Mbit/s. Cost: the UE monitors PDCCH and reports CSI on three carriers through the gaps as well as the bursts.
With Rel-16 dormancy instead: resume takes about 8.5 ms rather than 43.5, so 11.5 ms of each 20 ms burst runs at the full rate:
(8.5 x 1 736 + 11.5 x 3 699) / 20 = 2 865 Mbit/s average, at close to deactivated-state power.
That is the whole argument for dormancy in one calculation, and it is also the whole argument for not tuning sCellDeactivationTimer from a power-saving spreadsheet. A timer shorter than the traffic's inter-burst gap does not save power on the SCells -- it converts them from carriers into overhead.
19.3 Guard bands and usable PRBs for two adjacent 100 MHz carriers
One 100 MHz carrier at 30 kHz SCS
Transmission bandwidth configuration: N_RB = 273 TS 38.101-1 Table 5.3.2-1
Occupied bandwidth = 273 x 12 x 0.03 MHz = 98.28 MHz
Guard band total = 100 - 98.28 = 1.72 MHz, i.e. 0.86 MHz per edge
Minimum required per edge = 845 kHz TS 38.101-1 Table 5.3.3-1, so 0.86 MHz is just above the floor.
Two carriers placed at exactly 100 MHz centre spacing
Span, outer edge to outer edge ...... 200.00 MHz
Usable PRBs ......................... 273 + 273 = 546 PRB
Spectrum inside the pair not carrying PRBs:
outer guards 2 x 0.86 = 1.72 MHz
inner gap 1.72 MHz
total 3.44 MHz = 1.72 per cent of the span
The same two carriers at the nominal CA channel spacing
The inner guard bands overlap and only one is needed, because the neighbour is the same transmitter:
minimum inner gap ~ 0.845 MHz, so centre spacing ~ 98.28 + 0.845 = 99.125 MHz
Span = 0.86 + 98.28 + 0.845 + 98.28 + 0.86 = 199.125 MHz
Spectrum recovered = 0.875 MHz
Usable PRBs = 546 PRB -- unchanged
The gain is spectrum at the edge of the pair, not throughput. It matters when the holding is fixed: 199.5 MHz of contiguous n78 fits two 100 MHz carriers at nominal spacing and does not fit them at 100 MHz spacing.
The real spacing must also land on the channel raster, so the value is quantised and the recovered spectrum is a little less than 0.875 MHz in practice. And note the absent alternative: there is no single 200 MHz FR1 carrier and no 546-PRB FR1 channel bandwidth, so 546 PRB in FR1 means two carriers whether you want aggregation or not.
19.4 Blind decodes on a scheduling cell serving three carriers
Per-cell budget at 30 kHz (mu = 1) TS 38.213 cl. 10.1
PDCCH candidates per slot ......... 36
Non-overlapping CCEs per slot ..... 56
A comfortable UE-specific search space for one cell
nrofCandidates {AL1: n6, AL2: n6, AL4: n2, AL8: n2}
candidates = 6 + 6 + 2 + 2 = 16
CCEs = 6x1 + 6x2 + 2x4 + 2x8 = 6 + 12 + 8 + 16 = 42
Three cells scheduled from one CORESET, same search space each
candidates = 3 x 16 = 48 against a limit of 36 -> exceeded
CCEs = 3 x 42 = 126 against a limit of 56 -> exceeded by more than a factor of two
What actually fits
Trim each cell to {AL2: n2, AL4: n1, AL8: n1}
per cell: 4 candidates, 2x2 + 1x4 + 1x8 = 16 CCEs
three cells: 12 candidates, 48 CCEs -- inside both limits, with 24 candidates and 8 CCEs left for the common search spaces the PCell must still carry.
Four candidates per cell is not a comfortable place to be. PDCCH candidates are hashed per UE per slot, and with four candidates at three aggregation levels the probability that the scheduler cannot find a free candidate for a given UE in a given slot -- blocking -- becomes significant as the cell fills. That blocking shows up as fewer grants, not as errors. The companion 08 Scheduling document has the candidate hashing and the blocking arithmetic; the point here is that cross-carrier scheduling spends a budget that was already tight, and spends it on the one cell you can least afford to congest.
20. Illustrative Message Traces
Illustrative trace. Field names and encodings follow 3GPP; the values are constructed for this document and are not a capture from any deployed or lab network.
One UE throughout: PLMN 001-01, C-RNTI 0x4C21, PCell on n78 with physCellId 101, SCell 1 a second n78 carrier with physCellId 102, SCell 2 an n28 coverage carrier with physCellId 207. Cross-carrier scheduling from the PCell, and SCell 2 in a secondary timing advance group.
20.1 SCell addition
14:22:07.412 [RRC-DL] RRCReconfiguration (SRB1, DCCH)
rrc-TransactionIdentifier ........... 2
secondaryCellGroup / masterCellGroup: CellGroupConfig
cellGroupId ........................ 0
sCellToAddModList
SCellConfig [0]
sCellIndex ....................... 1
sCellConfigCommon
physCellId ...................... 102
downlinkConfigCommon
frequencyInfoDL
absoluteFrequencySSB ........... 643344 -- n78, ~3650 MHz
scs-SpecificCarrierList
subcarrierSpacing ............ kHz30
carrierBandwidth ............. 273 -- 100 MHz
ssbSubcarrierSpacing ............ kHz30
ssb-PositionsInBurst ............ 0xF0 -- 4 of 8 beams in use
ssb-PeriodicityServingCell ...... ms20 -- see the budget, §19.2
tdd-UL-DL-ConfigurationCommon ... DDDSU, 30 kHz
sCellConfigDedicated
firstActiveDownlinkBWP-Id ....... 1
bwp-InactivityTimer ............. ms100
sCellDeactivationTimer .......... ms160 -- deliberately not ms20
crossCarrierSchedulingConfig
schedulingCellInfo: other
schedulingCellId ............... 0 -- the PCell schedules it
cif-InSchedulingCell ........... 1
tag-Id .......................... 0 -- pTAG, same site/band
pathlossReferenceLinking ........ sCell
servingCellMO ................... 3
pdsch-ServingCellConfig
nrofHARQ-ProcessesForPDSCH ..... n16
smtc periodicityAndOffset sf20, duration sf1
SCellConfig [1]
sCellIndex ....................... 2
sCellConfigCommon
physCellId ...................... 207
downlinkConfigCommon / frequencyInfoDL
absoluteFrequencySSB ........... 151700 -- n28, ~758.5 MHz
subcarrierSpacing .............. kHz15
carrierBandwidth ............... 106 -- 20 MHz
ssb-PeriodicityServingCell ...... ms20
sCellConfigDedicated
firstActiveDownlinkBWP-Id ....... 1
sCellDeactivationTimer .......... ms160
crossCarrierSchedulingConfig
schedulingCellInfo: other
schedulingCellId ............... 0
cif-InSchedulingCell ........... 2
tag-Id .......................... 1 -- sTAG: different band
pathlossReferenceLinking ........ sCell
servingCellMO ................... 5
14:22:07.428 [RRC-UL] RRCReconfigurationComplete rrc-TransactionId 2
14:22:07.428 [MAC] serving cells: 3 activated: 1 (PCell only)Listing 5. Two SCells added in one message. Both are cross-carrier scheduled from the PCell with distinct CIF values, and SCell 2 is placed in a secondary TAG because it is in a different band. Note the last line: three serving cells, one active carrier.
20.2 Activation, and the bitmap decoded
14:22:09.104 [MAC-DL] PDSCH to C-RNTI 0x4C21, 3 octets
subPDU 1 R=0 R=0 LCID=58 -- SCell Activation/Deactivation, 1 octet
payload 0x06 = 0b0000_0110
bit 7 C7 = 0 bit 3 C3 = 0 -- SCell 3 not configured, ignored
bit 6 C6 = 0 bit 2 C2 = 1 -- ACTIVATE sCellIndex 2 (n28)
bit 5 C5 = 0 bit 1 C1 = 1 -- ACTIVATE sCellIndex 1 (n78)
bit 4 C4 = 0 bit 0 R = 0 -- reserved
subPDU 2 R=0 R=0 LCID=63 -- padding
14:22:09.106 [MAC] CE action delay elapsed; applying
sCellIndex 1: DEACTIVATED -> ACTIVATED activeDL-BWP 1 start sCellDeact ms160
sCellIndex 2: DEACTIVATED -> ACTIVATED activeDL-BWP 1 start sCellDeact ms160
14:22:09.106 [MAC-UL] PHR triggered by SCell activation
14:22:09.109 [MAC-UL] Multiple Entry PHR (LCID 56), 1-octet bitmap
bitmap 0x06 -- entries for ServCellIndex 1 and 2
entry ServCellIndex 0 P=0 V=0 PH=27 (real) P_CMAX,f,c = 23 dBm
entry ServCellIndex 1 P=0 V=1 PH=38 (virtual) -- not yet transmitting
entry ServCellIndex 2 P=0 V=1 PH=38 (virtual)
14:22:09.148 [PHY] SCell 1: SSB #2 acquired, AGC settled
14:22:09.168 [PHY] SCell 1: fine time/freq tracking converged
14:22:09.152 [PHY] SCell 2: SSB #0 acquired, AGC settled
14:22:09.172 [PHY] SCell 2: fine time/freq tracking converged
14:22:09.174 [MAC-UL] CSI report servCellIndex 1 CQI 12 RI 4 PMI i1=3
14:22:09.175 [MAC-UL] CSI report servCellIndex 2 CQI 11 RI 2
14:22:09.176 [MAC-DL] first PDSCH on SCell 1, MCS 25, 273 PRB
-- 72 ms from the reconfiguration, 70 ms from the activation CEListing 6. The activation, the PHR it triggers, and the 70 ms it takes before either carrier carries data. The two virtual PHR entries are correct: neither SCell has transmitted anything yet.
20.3 A cross-carrier grant
14:22:09.176 [PHY-DL] PDCCH on PCell, CORESET 1, USS, AL4, cand 2
DCI format 1_1, CRC scrambled by C-RNTI 0x4C21, 51 bits
carrierIndicator (CIF) ........... 1 -- 3 bits: SCell with
-- cif-InSchedulingCell = 1
-- i.e. sCellIndex 1, PCI 102
bandwidthPartIndicator ........... 1
frequencyDomainResourceAssign .... type1, RBstart 0, L_RB 273
timeDomainResourceAssign ......... row 2 -> K0=0, S=1, L=13
vrb-to-PRB-mapping ............... nonInterleaved
modulationCodingScheme ........... 25 -- 256QAM, from CQI 12
newDataIndicator ................. 1
redundancyVersion ................ 0
harqProcessNumber ................ 4 -- process 4 OF SCELL 1
downlinkAssignmentIndex .......... counter 1, total 2
tpc-PUCCH ........................ 0
pucch-ResourceIndicator .......... 3 -- resource on the PCell PUCCH
pdsch-HARQ_feedbackTiming (K1) ... 3
-- PDSCH is on SCell 1; HARQ-ACK is on the PCell (primary PUCCH group)
14:22:09.176 [PHY-DL] PDSCH received on SCell 1 (PCI 102), slot n+0
14:22:09.178 [PHY-UL] PUCCH on PCell, format 2, HARQ-ACK codebook 2 bits
bit 0 = ACK (PCell, DAI counter 0)
bit 1 = ACK (SCell 1, DAI counter 1)Listing 7. A grant decoded on one carrier, data received on another, feedback returned on a third resource on the first. Three things worth reading twice: the CIF is a CIF value and not an sCellIndex, the HARQ process number belongs to SCell 1's own entity, and the total DAI of 2 tells the UE the codebook has two bits in it.
20.4 The capability the configuration had to fit inside
14:21:58.006 [RRC-UL] UECapabilityInformation -> UE-NR-Capability
rf-Parameters
supportedBandListNR
[0] bandNR 28 modifiedMPR-Behaviour ... channelBWs-DL: fr1 20,15,10
[1] bandNR 78 modifiedMPR-Behaviour ... channelBWs-DL: fr1 100,80,60
supportedBandCombinationList
BandCombination [0] -- CA_n78C
bandList
[0] bandNR 78 ca-BandwidthClassDL: c ca-BandwidthClassUL: a
featureSetCombination ..... 0
BandCombination [1] -- CA_n28A-n78C <- the one in use here
bandList
[0] bandNR 28 ca-BandwidthClassDL: a ca-BandwidthClassUL: a
[1] bandNR 78 ca-BandwidthClassDL: c ca-BandwidthClassUL: a
featureSetCombination ..... 2
ca-ParametersNR
multipleTimingAdvance ..... supported -- sTAG is allowed
simultaneousRx-Tx ......... supported
supportedNumberTAG ........ n2
crossCarrierScheduling-OtherSCS ... supported
BandCombination [2] -- CA_n28A-n78A-n78A (non-contiguous)
... featureSetCombination 5
featureSetCombinations
[2] -- one entry per band, per direction
band 28: DL featureSetDownlinkId 4 UL featureSetUplinkId 2
band 78: DL featureSetDownlinkId 7 UL featureSetUplinkId 3
featureSetsDownlink
[7] featureSetListPerDownlinkCC = { 11, 12 } -- CC1 then CC2
featureSetsDownlinkPerCC
[11] supportedSubcarrierSpacingDL kHz30 maxNumberMIMO-LayersPDSCH fourLayers
supportedModulationOrderDL qam256
[12] supportedSubcarrierSpacingDL kHz30 maxNumberMIMO-LayersPDSCH fourLayers
supportedModulationOrderDL qam256
[4] supportedSubcarrierSpacingDL kHz15 maxNumberMIMO-LayersPDSCH twoLayers
supportedModulationOrderDL qam256Listing 8. A 3CC combination, dereferenced. Four levels: band combination to featureSetCombination 2, to per-band feature set 7, to the per-CC list {11, 12}, to the four-layer 256QAM claim that the throughput arithmetic in §19.1 depends on. The n28 carrier's per-CC entry caps it at two layers, which is where the 227 Mbit/s came from.
20.5 A dormancy indication
14:24:31.900 [MAC] drx-InactivityTimer expired -> outside Active Time
14:24:31.902 [PHY-DL] PDCCH on PCell, CORESET 0, Type3-CSS
DCI format 2_6, CRC scrambled by PS-RNTI 0x00A3
Wake-up indication ............... 1 -- do start the next On Duration
SCell dormancy indication ........ 0b10 -- 2 bits, one per dormancy group
group 0 -> 1 : leave dormancy (sCellIndex 1)
group 1 -> 0 : stay dormant (sCellIndex 2)
14:24:31.903 [MAC] sCellIndex 1: DORMANT -> ACTIVATED (non-dormant BWP)
activeDL-BWP: 0 (dormantBWP-Id) -> 1
sCellDeactivationTimer restarted
tracking loops were never lost; CSI is 5 ms old
14:24:31.905 [MAC-UL] CSI report servCellIndex 1 CQI 12 RI 4
14:24:31.911 [MAC-DL] PDSCH on SCell 1, MCS 25
-- 9 ms from the DCI to data, against 70 ms from a deactivated startListing 9. Dormancy resume outside DRX Active Time. The two-bit indication addresses dormancy groups, not SCells: SCell 1 is in group 0 and wakes, SCell 2 is in group 1 and stays dormant. Nine milliseconds against seventy is the whole value of the feature.
20.6 The failure case: activated, and useless
09:41:12.220 [RRC-DL] RRCReconfiguration sCellToAddModList
SCellConfig [0] sCellIndex 3 physCellId 311 (n258, FR2)
sCellConfigDedicated
firstActiveDownlinkBWP-Id ....... 1
sCellDeactivationTimer .......... ms160
pdsch-ServingCellConfig
pucch-Cell ..................... 4 -- secondary PUCCH group,
-- anchored on servCellIndex 4
csi-MeasConfig
csi-ReportConfigToAddModList [0]
reportConfigId ................ 4
reportConfigType: periodic
pucch-CSI-ResourceList
uplinkBandwidthPartId ........ 1
pucch-Resource ............... 9 -- on servCellIndex 4
-- (the intended PUCCH SCell)
09:41:12.236 [RRC-UL] RRCReconfigurationComplete
-- note: servCellIndex 4 is NOT configured in this cell group
09:41:13.004 [MAC-DL] SCell Activation/Deactivation CE, 0x08 -- C3 = 1
09:41:13.007 [MAC] sCellIndex 3: DEACTIVATED -> ACTIVATED
09:41:13.052 [PHY] SCell 3: SSB acquired, AGC settled
09:41:13.093 [PHY] SCell 3: tracking converged, CSI computed CQI 13
09:41:13.093 [MAC-UL] CSI report servCellIndex 3: NO RESOURCE
pucch-Resource 9 resolves to servCellIndex 4
-> report discarded, not transmitted
09:41:13.593 [MAC-UL] CSI report servCellIndex 3: NO RESOURCE (x100)
09:41:14.000 [SCHED] servCellIndex 3: no CQI available
policy = do not schedule without CSI
09:41:14.000 [SCHED] servCellIndex 3: PDSCH scheduled 0 slots of 2000
09:41:22.000 [SCHED] servCellIndex 3: activated 8.9 s, 0 bytes delivered
09:41:22.104 [RRC-DL] RRCReconfiguration sCellToReleaseList { 3 }
-- released for inactivity. No failure was ever reported by anyone.Listing 10. The characteristic CA failure. The SCell was configured correctly, activated correctly, acquired its SSBs correctly and computed CSI correctly -- and its CSI report pointed at a PUCCH resource on a serving cell that does not exist, so the scheduler never got a CQI and never scheduled it. Nine seconds later the network released it for inactivity. Every layer behaved as specified and the carrier delivered nothing.
Read the last trace again and note what is not in it: no RLF, no reconfiguration failure, no HARQ failure, no measurement report, no error code of any kind. The only anomalies are a repeated internal message about a discarded CSI report and a scheduler counter reading zero. If your log pipeline discards internal scheduler messages -- and many do -- this failure is completely invisible and presents solely as CA does not help on this UE.
21. Release Deltas: Rel-15 to Rel-18
| Release | Change | Why it matters when reading CA |
|---|---|---|
| Rel-15 | Baseline CA: up to 16 CCs, sCellToAddModList, the Activation/Deactivation MAC CE in both forms, cross-carrier scheduling with the CIF, two PUCCH groups, pTAG and sTAG, Multiple Entry PHR | Everything in §2 to §14 except dormancy is Rel-15. An SCell here is either off or fully on, and turning it on costs the full budget. |
| Rel-16 | SCell dormancy: dormantBWP-Config, dormancy groups, dormancy indication in DCI 1_1 / 0_1 within Active Time and DCI 2_6 outside it | A third state appears between deactivated and activated, and an SCell can change state without a MAC CE. A trace showing an SCell going quiet with no CE is dormancy, not deactivation (§8). |
| Rel-16 | Direct SCell activation: sCellState = activated in SCellConfig | An SCell can be activated by the reconfiguration that adds it, so the absence of an activation CE no longer means the SCell is inactive. |
| Rel-16 | Type-3 HARQ-ACK codebook: one-shot feedback for every process on every cell, requested by DCI | Gives a recovery path for the codebook mismatch described in §11.1, which previously had none. |
| Rel-16 | pdsch-HARQ-ACK-CodebookList -- a codebook type per PUCCH group; secondaryDRX-GroupConfig -- a second DRX group | Two PUCCH groups and two DRX groups can now be tuned independently, which is what makes an FR1 + FR2 configuration practical. |
| Rel-16 | Cross-carrier scheduling enhancements, including scheduling of and by cells with different numerologies and the pdcch-BlindDetectionCA budget rules | The blind-decode apportionment in §9.3 is where a large CA configuration stops behaving linearly. |
| Rel-17 | Enhanced direct SCell activation with a temporary tracking reference signal | The activation budget's dominant term -- waiting for SSBs -- can be bypassed. Measured activation delays split into two populations depending on whether both ends support it (§8.3). |
| Rel-17 | Cross-carrier scheduling from an SCell to the PCell, as an optional capability | The rule that the PCell is always self-scheduled is no longer absolute. Check the capability before assuming a PCell grant arrived on the PCell. |
| Rel-17 | CA enhancements for FR2 and for RedCap: RedCap UEs are single-carrier, so CA and RedCap are mutually exclusive in a way that is easy to forget | A RedCap UE with no SCells is not a CA failure. Confirm the UE type before investigating. |
| Rel-18 | Further activation-latency reduction work, and multi-cell scheduling with a single DCI -- one DCI carrying assignments for several cells | A single DCI scheduling multiple cells changes the blind-decode arithmetic fundamentally: the per-cell candidate cost of cross-carrier scheduling collapses. It also means a decoder that assumes one DCI equals one cell will mis-attribute grants. |
| Rel-18 | Network energy saving, including cell on/off patterns that interact with SCell activation | A carrier can now be off at the network end while the UE believes it is an activated SCell. Absence of SSBs on an activated SCell is no longer necessarily a fault. |
Table 23. CA-relevant changes by release. Every Rel-16 and later feature here is an optional capability at both ends -- confirm support in the capability exchange before concluding that a configuration is being honoured. See the companion 26 UE Capability.
22. Reading CA in Logs: A Checklist
- Count serving cells and active carriers separately. They are different numbers and the gap between them is the first thing worth knowing. Three serving cells with one active carrier is a completely different problem from three active carriers underperforming.
- Find the activation CE and decode the bitmap by hand. Do not trust a decoder's summary. Which
C_ibits are set, and does the set match the SCells you expect to be on? Remember the bitmap is absolute -- an unexpected zero is an instruction, not an omission (§7.1). - Measure the gap from the activation CE to the first CSI report for that cell, and from the CSI report to the first PDSCH. These two intervals are the activation budget and the scheduler's CSI policy respectively, and together they tell you whether the carrier was ever usable during the traffic you care about (§7.4).
- Compare
sCellDeactivationTimeragainst the traffic's inter-burst gaps. If the gaps are longer than the timer, every burst pays the budget again and the added carriers are contributing nothing. This is the most common CA fault in the field and it is a configuration value, not a radio condition (§19.2). - Establish who schedules whom. Read
crossCarrierSchedulingConfigfor every serving cell. Build the map: which cell isownwithcif-PresenceTRUE, which cells areother, and what CIF value each claims. Check the CIF values are unique. Then check whether any scheduling cell has a deactivation timer (§9). - Read the CIF in the DCI as a CIF, not as an
sCellIndex. They are different numbering spaces and there is no requirement that they agree. Resolve the CIF throughcif-InSchedulingCellevery time. - Work out the PUCCH group of every cell from
pucch-Cell, and follow each cell's HARQ-ACK and CSI to a real uplink resource on a real serving cell. The quiet failure in §20.6 is exactly this check failing, and nothing else in the log points at it. - Check
tag-Idon every inter-band SCell, and look for a PDCCH-ordered Random Access on the SCells of each sTAG. An inter-band SCell in the pTAG with no RACH is the TAG misassignment in §13, and it presents as an uplink-only failure on a healthy carrier. - Look at PDCCH occupancy on the scheduling cell, not on the scheduled cells. Scheduled cells running at a third of capacity with excellent CQI, while the scheduling cell's candidate and CCE usage sits near its limit, is blind-decode exhaustion (§19.4).
- Distinguish DTX from NACK on a new carrier. DTX from the very first grant means the UE was never monitoring -- a lost activation CE. NACKs that become DTX means the radio degraded. The two look similar in a summary counter and have nothing in common.
- Check whether failures correlate with slot parity on a mixed-numerology pair. They should not. If they do, the K0 or K2 values were chosen without the cross-numerology scaling of §5.2.
- Re-derive the band combination string from the configuration and find it in the capability message, then dereference the feature set for the specific carrier that is underperforming. A carrier delivering half its expected rate is often delivering exactly its claimed rate (§4.2).
23. Glossary
| Term | Expansion | Meaning in this document |
|---|---|---|
| CC | Component Carrier | One of the carriers being aggregated. Loosely interchangeable with serving cell, but a serving cell is the RRC/MAC object and a component carrier is the spectrum. |
| PCell | Primary Cell | ServCellIndex 0. Carries PUCCH, owns RLF, always self-scheduled in Rel-15/16, never deactivated (§2). |
| SCell | Secondary Cell | sCellIndex 1..31. Added, activated, made dormant, deactivated and released at the network's discretion. No RLF, no failure procedure. |
| SpCell | Special Cell | A role: the PCell in CA, and the PCell or PSCell depending on cell group in DC. Spec clauses say SpCell where either could apply. |
| PSCell | Primary SCell of the SCG | The SCG's control anchor under dual connectivity. Does not exist in plain CA. |
| PUCCH SCell | -- | The SCell whose uplink carries the secondary PUCCH group's HARQ-ACK and CSI. Never dormant, effectively never deactivated (§10). |
| PUCCH group | -- | A set of serving cells whose uplink control information travels on the same uplink carrier. At most two. |
| CIF | Carrier Indicator Field | 3 bits in DCI formats 0_1 and 1_1 identifying which serving cell a grant is for. 0 means the scheduling cell; 1..7 resolve through cif-InSchedulingCell (§9.1). |
| Scheduling cell | -- | The cell whose PDCCH carries another cell's grants. Named by schedulingCellId in the scheduled cell's configuration. |
| Dormant | -- | An SCell that is still activated but whose active downlink BWP is dormantBWP-Id, on which no PDCCH is monitored. Keeps CSI and tracking alive (§8). |
| TAG | Timing Advance Group | A set of serving cells sharing one uplink timing advance and one timeAlignmentTimer. tag-Id 0 is the pTAG; 1..3 are sTAGs (§13). |
| DAI | Downlink Assignment Index | Counter DAI numbers assignments across cells and occasions; total DAI gives the running total across all cells, and exists because of CA (§11.1). |
P_CMAX,f,c | UE maximum output power for carrier f on cell c | The per-carrier ceiling that power headroom is reported against. The shared UE-wide ceiling is a separate and usually tighter limit (§12). |
| MPHR | Multiple Entry PHR | The power headroom MAC CE with a per-serving-cell bitmap. Exists because of CA and for no other reason (§12.2). |
| Known / unknown SCell | -- | Whether the UE already has recent measurements of the SCell when it is activated. A known cell activates materially faster, and the distinction is why the same configuration produces two different activation delays. |
| CA bandwidth class | -- | A per-band letter binding the maximum CC count to a range of aggregated channel bandwidth. Appears in every band combination string (§4.1). |
24. References
- 3GPP TS 38.331 -- RRC protocol specification.
CellGroupConfig,SCellConfig,ServingCellConfig,ServingCellConfigCommon,CrossCarrierSchedulingConfig,DormantBWP-Config,TAG-Config,PhysicalCellGroupConfig,PDSCH-ServingCellConfig,PUCCH-Config; clause 5.3.5.5.9 (cell group configuration, SCell add/mod/release), clause 5.3.10 (radio link failure -- and its restriction to the SpCell). - 3GPP TS 38.321 -- MAC protocol specification. Clause 5.9 (activation and deactivation of SCells), clause 5.4.6 (power headroom reporting), clause 6.1.3.10 (SCell Activation/Deactivation MAC CE, both forms), clause 6.1.3.8 / 6.1.3.9 (Single and Multiple Entry PHR), Table 6.2.1-1 (DL-SCH LCID: 57 and 58), Table 6.2.1-2 (UL-SCH LCID: 54, 56, 57).
- 3GPP TS 38.213 -- Physical layer procedures for control. Clause 9 (uplink control information, HARQ-ACK codebooks, PUCCH groups), clause 10.1 (PDCCH monitoring, per-slot candidate and CCE limits, and the CA apportionment), clause 7 (uplink power control and the prioritisation that shares power across carriers).
- 3GPP TS 38.214 -- Physical layer procedures for data. Clause 5.1.2.1 (PDSCH time-domain allocation, including the cross-numerology slot mapping), clause 6.1.2.1 (the PUSCH equivalent), clause 5.2 (CSI reporting, including the report priority order).
- 3GPP TS 38.212 -- Multiplexing and channel coding. Clause 7.3.1 (DCI formats: the Carrier Indicator Field, the DAI fields, and the SCell dormancy indication in formats 1_1 and 2_6).
- 3GPP TS 38.300 -- NR overall description. Carrier aggregation and multi-connectivity in the overall architecture, and the layer-2 structure that one MAC entity per cell group implies.
- 3GPP TS 38.101-1 -- UE radio transmission and reception, FR1. Clause 5.3 (channel bandwidths, transmission bandwidth configuration N_RB, minimum guard bands), clause 5.3A (CA bandwidth classes and aggregated bandwidth), clause 5.4.1.2 (channel spacing for intra-band contiguous CA), clause 5.5A (band combination definitions).
- 3GPP TS 38.101-2 -- UE radio transmission and reception, FR2. The same clauses for FR2, where per-carrier bandwidths reach 400 MHz and the aggregated classes differ.
- 3GPP TS 38.133 -- Requirements for support of radio resource management. Clause 8.3.2 (SCell activation and deactivation delay requirements, and the known / unknown SCell distinction).
- 3GPP TS 38.306 -- UE radio access capabilities. The peak data rate formula summed over aggregated carriers, used in §19.1.
Companion documents in this set
- 02 Radio Frame Structure -- numerology, slots, the CRB grid and the BWP machinery that §5 assumes.
- 04 Timing Advance -- the timing advance loop that §13 splits into groups.
- 05 HARQ -- the codebooks, the DAI and the process model that §11 multiplies by the carrier count.
- 07 MAC PDU and Control Elements -- the subheader shapes and the complete LCID tables behind §7.1 and §12.2.
- 08 Scheduling -- CORESETs, search spaces and the blind-decode arithmetic that §9.3 and §19.4 spend.
- 10 BSR, PHR and SR -- the Multiple Entry PHR field layout and triggering rules referenced in §12.
- 11 DRX -- Active Time, and the DCI 2_6 power-saving channel that carries the dormancy indication in §8.2.
- 14 RRC States -- what a cell means to RRC, and why only the PCell can drive a state transition.
- 15 RRC Procedures -- reconfiguration and the delta-configuration semantics of §6.2.
- 16 RLM and RLF -- radio link monitoring on the SpCell, and therefore why there is none on an SCell.
- 20 Measurements and Events -- the events that trigger SCell addition and release, and
servingCellMO. - 21 Measurement Gaps and SMTC -- the SMTC that bounds SCell measurement and post-activation settling.
- 26 UE Capability -- band combinations, feature set combinations and the per-CC dereference that §4.2 depends on.
- 28 NSA Attach Process -- dual connectivity end to end: the PSCell, the SCG, and the second MAC entity that §15 compares against.