>
Home5G NRCross-Layer TopicsCarrier Aggregation
🧠 Cross-Layer TopicsIntermediate

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.

📚 3GPP-basedTS 38.300TS 38.331TS 38.321

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
  1. 01Why Carrier Aggregation Exists, and Why Not One Wide Carrier
  2. 02The Cell Taxonomy, Precisely
  3. 03CA Types and Spectrum Arrangement
  4. 04Carrier Limits, Bandwidth Classes and Band Combinations
  5. 05Mixed Numerology and Bandwidth Parts Across Carriers
  6. 06SCell Configuration and Delta Semantics
  7. 07SCell Activation and Deactivation
  8. 08Dormancy, Hibernation and Fast Resume
  9. 09Cross-Carrier Scheduling
  10. 10PUCCH Groups and the PUCCH SCell
  11. 11HARQ Under Carrier Aggregation
  12. 12Uplink Power and PHR Under Carrier Aggregation
  13. 13Timing Advance Groups: pTAG and sTAG
  14. 14Measurement and CSI Load Under Carrier Aggregation
  15. 15Carrier Aggregation Versus Dual Connectivity
  16. 16Parameter and Timer Reference
  17. 17Failure Modes, and What Each Looks Like in a Log
  18. 18ASN.1 Structures
  19. 19Worked Arithmetic
  20. 20Illustrative Message Traces
  21. 21Release Deltas: Rel-15 to Rel-18
  22. 22Reading CA in Logs: A Checklist
  23. 23Glossary
  24. 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.

ConstraintWhat it rules outWhat carrier aggregation does instead
Maximum channel bandwidth per bandFR1 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 holdingsA 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 subscriberOne 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 occupancySpectrum 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 economicsA 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 mismatchTDD 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:

  1. Capability. The UE's UE-NR-Capability lists band combinations. Nothing outside that list may be configured. See the companion 26 UE Capability, which owns the feature-set machinery.
  2. Measurement. The network needs to know the candidate SCell frequencies are actually receivable at this UE. Either a measurement on the SCell frequency (a measObject for 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.
  3. 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.
  4. Configuration. RRCReconfiguration with sCellToAddModList (§6). The SCell now exists and is deactivated.
  5. 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.
  6. 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.
💡
Key point

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.

Figure 1. The taxonomy in one picture. The top row is everything plain CA gives you; the middle row exists only under dual connectivity; the bottom row is terminology, not hardware. SpCell is a role that different cells fill depending on which cell group you are talking about.
TermExpansionExists inWhat is unique to it
PCellPrimary CellCA and DCServCellIndex 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.
SCellSecondary CellCA and DCIdentified 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.
SpCellSpecial CellA role, not a cellIn 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.
PSCellPrimary SCell (of the SCG)DC onlyThe 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.
MCGMaster Cell GroupCA and DCThe PCell plus its SCells. In plain CA this is the whole configuration, so the term is rarely used.
SCGSecondary Cell GroupDC onlyThe PSCell plus its SCells, served by a second node with its own MAC entity and its own scheduler.
Serving cell--CA and DCThe 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 DCAn 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.

💡
Key point

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.

Figure 2. The three arrangements. Each row has its own frequency axis, so do not read across. The narrow gold slice in row 1 is the merged inner guard band that intra-band contiguous CA recovers -- roughly 0.9 MHz between two 100 MHz carriers, worked through in §19.3.
ArrangementDefinitionRF cost at the UETimingExample string
Intra-band contiguousTwo or more CCs in the same operating band, adjacent, with only a guard band between themOne 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-contiguousTwo or more CCs in the same band with a gap between them, usually because someone else holds the spectrum in betweenOne 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-bandCCs in different operating bandsOne 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.

📘
Spec detail

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:

LimitValueWhere it comes fromHow often it is the binding limit
Serving cells per cell group16TS 38.331 maxNrofServingCells is 32 across both cell groups, so 16 per group under NR-DCNever. No deployment is near this.
sCellIndex range1 .. 31SCellIndex ::= INTEGER (1..31); ServCellIndex ::= INTEGER (0..31) with 0 reserved for the PCellNever, but it is why the activation MAC CE has a four-octet form (§7).
Carriers per PUCCH groupImplementation and codebook limitedThe 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 classA letter per band, binding the number of CCs and the aggregated bandwidth togetherTS 38.101-1 cl. 5.3A / TS 38.101-2 cl. 5.3AOften. This is a per-band table and it is not generous.
Supported band combinationAn explicit list in the UE capabilityUE-NR-Capability -> rf-Parameters -> supportedBandCombinationListAlmost always. This is the real limit.
pdcch-BlindDetectionCA2 .. 16UE capability; governs how the PDCCH monitoring budget is shared once more than four downlink cells are configured TS 38.213 cl. 10.1Whenever 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:

StringReads asWhat the UE is claiming
CA_n78COne band, class CTwo intra-band contiguous CCs in n78, aggregated bandwidth in the class-C range. One RF chain.
CA_n78A-n78An78 twice, class A eachTwo 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-n78CTwo bandsOne n28 CC plus two contiguous n78 CCs: three carriers, two RF chains, possibly two TAGs.
CA_n28A-n78A-n78ATwo bands, three class-A entriesThree carriers with the two n78 carriers non-contiguous. Different again.
DC_n28A_n78CDual connectivity, not CADC_ 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.

⚠️
Common pitfall

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.

Cross-carrier slot mapping, TS 38.214 cl. 5.1.2.1 and 6.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 slots
🧮
Worked calculation

A 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-Id and firstActiveUplinkBWP-Id the 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-InactivityTimer expiry falls back to defaultDownlinkBWP-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.
⚠️
Common pitfall

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:

FieldTypeWhat it doesThe subtlety
sCellToAddModListSEQUENCE (SIZE (1..31)) OF SCellConfigAdds SCells that do not exist and modifies SCells that doWhich of the two it is depends only on whether the sCellIndex is already configured. There is no separate add and modify encoding.
sCellToReleaseListSEQUENCE (SIZE (1..31)) OF SCellIndexRemoves SCells entirely: the serving cell ceases to exist and its HARQ buffers and configuration are discardedProcessed 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:

FieldPresenceWhat it carriesWhy it matters
sCellIndexMandatorySCellIndex ::= INTEGER (1..31), the UE-specific index of this SCellThis 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.
sCellConfigCommonOptionalA ServingCellConfigCommon: physCellId, downlinkConfigCommon with the frequency info and the initial BWP, uplinkConfigCommon, ssbSubcarrierSpacing, ssb-PositionsInBurst, tdd-UL-DL-ConfigurationCommonThis 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.
sCellConfigDedicatedOptionalA ServingCellConfig: the BWP lists, firstActiveDownlinkBWP-Id, bwp-InactivityTimer, pdsch-ServingCellConfig, csi-MeasConfig, crossCarrierSchedulingConfig, tag-Id, sCellDeactivationTimer, pathlossReferenceLinking, servingCellMOEverything UE-specific. Most of the rest of this document is about fields that live in here.
smtcOptionalThe SSB measurement timing configuration for this SCellWhere 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.
sCellStateOptional, Rel-16ENUMERATED {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-ConfigOptional, Rel-16dormantBWP-Id plus the within-Active-Time and outside-Active-Time dormancy configurationMakes 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:

  1. A field that is present replaces the stored value.
  2. 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 SetupRelease set to release.
  3. A list with add-mod semantics is merged entry by entry, keyed on its index field, not replaced wholesale.
  4. Release lists are processed before add-mod lists in the same message.
⚠️
Common pitfall

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.

Figure 3. The full state space. Note what is not here: no failure state, no recovery state, no re-establishment. An SCell that stops working is released by the network and, if it is still wanted, re-added from scratch.

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 sCellIndex 1 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 sCellIndex 1 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.
Figure 4. The four-octet form. The one-octet form is byte-for-byte Octet 1 of this with LCID 58 instead of 57. 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_i corresponding to a configured SCell is obeyed. A CE with only C_2 set 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 1Bits setSCells activatedSCells deactivated
0x0EC3 C2 C11, 2, 34 .. 7, and 8 .. 31 in the long form
0x02C112 .. 7 -- including any that were active
0x00nonenoneall of them
0xFEC7 .. C11 .. 7none in this octet
0x04C221, 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:

  1. Applies firstActiveDownlinkBWP-Id and firstActiveUplinkBWP-Id as the active BWPs of that SCell.
  2. Starts or restarts the sCellDeactivationTimer for that SCell.
  3. Begins monitoring the SCell's PDCCH -- or, under cross-carrier scheduling, begins expecting grants for it on the scheduling cell.
  4. Triggers a power headroom report, because the set of cells sharing the UE's transmit power has changed (§12).
  5. Begins CSI reporting for the SCell, and SRS transmission on it if configured.
  6. 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.

ValueSlots at 30 kHzBehaviour it producesWhere it fits
ms2040Aggressive. 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.
ms80160Survives a short pause in a video stream or between page loads; deactivates during genuine idleness.A defensible default for mixed traffic.
ms160320Survives most application-level think time.Interactive traffic where reactivation latency is visible to the user.
ms640 and above1280 and upEffectively: 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:

StepWhat the UE is doingOrder of magnitudeWhat sets it
MAC CE delivery and HARQReceiving the CE and acknowledging it1 - 2 msK1 and the PUCCH occasion on the PCell
CE action delayThe specified delay before the CE takes effectabout 3 msFixed by the MAC CE action timing rules
First SSB on the SCellWaiting for an SSB burst to exist at all0 - 20 msssb-PeriodicityServingCell and the SMTC
AGC settlingSetting receive gain for a carrier it has not been listening toone SSB burstReceiver design -- but it needs a real SSB
Time and frequency trackingAcquiring fine timing and frequency offset, which usually needs a second SSB burst and therefore a second SSB period20 - 40 msSSB periodicity again. This is why a 20 ms SSB period costs so much more than a 5 ms one.
CSI-RS and CSI computationMeasuring a CSI-RS occasion and computing CQI, PMI and RI5 - 10 msCSI-RS periodicity and the UE's CSI computation delay
First CSI reportGetting the report to the gNB on its PUCCH group's uplink1 - 5 msCSI report periodicity
First usable grantThe 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.

Figure 5. Addition through to first grant, with the two stalls. Steps 1-4 take a few milliseconds and are fully logged. Everything between step 4 and step 7 takes tens of milliseconds and is invisible unless you are watching CSI reports.
💡
Key point

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.

🔍
What you see in logs

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.

DeactivatedDormantActivated
PDCCH monitoring on the carrierNoNoYes
CSI reportingNoYes -- this is the pointYes
SRS transmissionNoNoYes, if configured
Time / frequency tracking maintainedNoYesYes
sCellDeactivationTimer runningNo -- it already expiredYes, and it can still expire and drop the cell to DeactivatedYes
UE power costLowestLow -- close to deactivatedHighest
Time to first usable grantTens of ms (§7.4)A BWP switch plus a CSI refresh -- single-digit msNone
Signalled bySCell Activation/Deactivation MAC CEDCI: format 1_1 or 0_1 within Active Time, format 2_6 outside itSCell Activation/Deactivation MAC CE, or sCellState at configuration
Applies toAny SCell without PUCCHAny SCell with dormantBWP-Config; never the PCell and never a PUCCH SCellAny 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.

Figure 6. The same comparison as a timeline. The red band -- AGC and tracking on SSB -- is what dormancy eliminates, and it is the largest single term in the deactivated case because it is quantised by the SSB period.

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.

⚠️
Common pitfall

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.

🔄
Release delta

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 / fieldSet onMeaningConsequence
own with cif-Presence FALSEA self-scheduled cellThis cell's DCIs have no Carrier Indicator Field and schedule only this cellThe default and the simplest case. DCI is one bit narrower.
own with cif-Presence TRUEA scheduling cellThis cell's DCIs carry a 3-bit CIF, so they can address this cell (CIF = 0) or a cell that has named it as schedulingCellIdEvery 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 schedulingCellIdA scheduled cellGrants for this cell arrive on the named cell's PDCCHThis 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-InSchedulingCellA scheduled cellThe CIF value, 1 to 7, that identifies this cell in the scheduling cell's DCIsMust 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.

Figure 7. Three carriers, one CORESET. CC2 and CC3 have no PDCCH at all -- every grant they receive was decoded on CC1. Slot n+3 carries three grants in the space that would normally hold one cell's worth of candidates.

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-Presence TRUE. 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.
📘
Spec detail

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:

  1. 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.
  2. 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.
  3. 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.

muSCSMax PDCCH candidates per slotMax non-overlapping CCEs per slot
015 kHz4456
130 kHz3656
260 kHz2248
3120 kHz2032

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.

⚠️
Common pitfall

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 groupSecondary PUCCH group
Uplink anchorThe PCellThe PUCCH SCell
Always present?YesNo -- only when a PUCCH SCell is configured
MembershipThe PCell plus every SCell not in the secondary groupThe PUCCH SCell plus the SCells assigned to it
HARQ-ACK codebookOne codebook, spanning the cells of this groupA separate codebook, spanning the cells of this group. Rel-16 pdsch-HARQ-ACK-CodebookList allows a different codebook type per group.
What identifies the anchorServCellIndex 0 by definitionThe 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 isIn 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.

Figure 8. Routing in a six-cell FR1 + FR2 configuration. Each downlink cell contributes HARQ-ACK bits to exactly one codebook, and each codebook lands on exactly one uplink carrier. Follow the arrows backwards from a missing ACK and you find the cell that owns the problem.

10.2 What breaks when the grouping is wrong

The grouping is configuration, and configuration can disagree with reality in three ways:

MistakeWhat the UE doesWhat it looks like
An SCell's pucch-Cell names a serving cell that is not configured, or one whose pucch-Config is missingThe 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 groupCorrect 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 deactivateWhen 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.

🔍
What you see in logs

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.

AspectSingle carrierUnder CAWhy
HARQ entitiesOne per directionOne per direction per serving cellProcesses 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 cell8 by default, or nrofHARQ-ProcessesForPDSCH if configuredThe same, per cell -- so a 4-carrier UE can have 32 downlink processes in flightThis is the real reason CA needs UE memory: soft buffer scales with carriers times processes.
HARQ-ACK feedbackOne codebook on the PUCCH of the only cellOne codebook per PUCCH group, spanning every cell in that group (§10)The codebook is the place aggregation actually touches HARQ.
Retransmission carrierTrivially the same carrierThe 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.

📘
Spec detail

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.

🔍
What you see in logs

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.

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)
ContainsThe SpCell -- in CA, the PCell -- and any SCells that share its timingSCells only. Never the SpCell.
tag-Id01 .. 3 (maxNrofTAGs is 4)
How the initial TA is obtainedFrom the Random Access that established the connectionFrom 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 byTiming Advance Command MAC CEs with TAG Id = 0Timing Advance Command MAC CEs carrying that TAG's TAG Id
timeAlignmentTimer expiryAll 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.

⚠️
Common pitfall

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.

📘
Spec detail

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:

  • measObjectNR per 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.
  • servingCellMO in each serving cell's ServingCellConfig links 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.
⚠️
Common pitfall

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:

🧮
Worked calculation

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.

💡
Key point

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 aggregationDual connectivity
SchedulersOne. 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 entitiesOneTwo -- one per cell group
Control-plane anchorThe 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 assumptionIdeal. 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 pointsSub-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 splitAt 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 handlingSCell 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 controlOne PUCCH group, optionally two (§10)One PUCCH per cell group -- the PCell and the PSCell each have one, necessarily.
Right tool whenCarriers 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.

💡
Key point

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 fieldRange or valuesTypicalEffect
sCellIndexINTEGER (1..31)1, 2, 3 in order of additionThe UE-specific SCell index. Selects the C_i bit in the activation MAC CE. Values above 7 force the four-octet CE form.
sCellStateENUMERATED {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.
sCellDeactivationTimerENUMERATED {ms20, ms40, ms80, ms160, ms200, ms240, ms320, ms400, ms480, ms520, ms640, ms720, ms840, ms1280, spare2, spare1}ms80 to ms160Inactivity timeout for an SCell without PUCCH. The dominant CA tuning parameter -- too short and every burst pays the activation budget (§19.2).
firstActiveDownlinkBWP-IdBWP-Id, INTEGER (0..4)1The downlink BWP made active when the SCell is activated. Not the BWP it was last on.
firstActiveUplinkBWP-IdBWP-Id, INTEGER (0..4)1The same for the uplink.
defaultDownlinkBWP-IdBWP-Id, INTEGER (0..4)absent, meaning the initial BWPWhere bwp-InactivityTimer expiry lands.
bwp-InactivityTimerENUMERATED {ms2, ms3, ms4, ms5, ms6, ms8, ms10, ms20, ms30, ms40, ms50, ms60, ms80, ms100, ms200, ms300, ms500, ms750, ms1280, ms1920, ms2560, ...}ms100Per serving cell. Falls back to the default BWP on expiry. Interacts with dormancy (§5.3).
dormantBWP-IdBWP-Id, INTEGER (0..4)absent unless Rel-16 dormancy is usedThe 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.
dormancyGroupWithinActiveTimeINTEGER (0..4)0Which dormancy-indication bit in DCI 1_1 / 0_1 controls this SCell.
dormancyGroupOutsideActiveTimeINTEGER (0..4)0The same for DCI 2_6, outside DRX Active Time.
cif-PresenceBOOLEANFALSETRUE adds a 3-bit Carrier Indicator Field to every DCI on this cell, changing DCI sizes. Only TRUE on a cell that schedules others.
schedulingCellIdServCellIndex, INTEGER (0..31)0 (the PCell) when cross-carrier scheduling is usedWhich cell's PDCCH carries this cell's grants.
cif-InSchedulingCellINTEGER (1..7)1, 2, 3The CIF value that identifies this cell in the scheduling cell's DCIs. Must be unique per scheduling cell. Not the same as sCellIndex.
tag-IdINTEGER (0..3)0Timing 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).
timeAlignmentTimerENUMERATED {ms500, ms750, ms1280, ms1920, ms2560, ms5120, ms10240, infinity}ms1920 on the pTAGPer TAG. Expiry on the pTAG loses the whole uplink; expiry on an sTAG loses only that group's cells.
pathlossReferenceLinkingENUMERATED {pCell, sCell}sCell on inter-band SCellsWhether uplink power control on this SCell derives pathloss from the PCell downlink or from this cell's own.
nrofHARQ-ProcessesForPDSCHENUMERATED {n2, n4, n6, n10, n12, n16}absent, meaning 8Per serving cell. Multiplied by the carrier count, this is what sizes the UE's soft buffer requirement.
pdsch-HARQ-ACK-CodebookENUMERATED {semiStatic, dynamic}dynamicPer cell group in Rel-15. Rel-16 pdsch-HARQ-ACK-CodebookList allows one value per PUCCH group.
harq-ACK-SpatialBundlingPUCCHENUMERATED {true}absentHalves the codebook contribution of two-codeword cells at the cost of coupling their retransmissions (§11.1).
servingCellMOMeasObjectId, INTEGER (1..64)one per serving cell frequencyLinks the serving cell to the measurement object for its frequency, so its measurements are attributed to it.
ssb-PeriodicityServingCellENUMERATED {ms5, ms10, ms20, ms40, ms80, ms160}ms20Governs how long AGC and tracking take after activation -- the largest term in the activation budget (§7.4).
pdcch-BlindDetectionCAINTEGER (2..16)UE-reportedHow the PDCCH monitoring budget is apportioned once more than four downlink cells are configured.
p-NR-FR1P-Max, INTEGER (-30..33) dBm23 dBmPer cell group: the total FR1 uplink power the UE may use across all its carriers.
p-MaxP-Max, INTEGER (-30..33) dBm23 dBmPer 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

TimerScopeStarted / restarted byExpiry does
sCellDeactivationTimerPer SCell without PUCCHStarted 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 itDeactivates the SCell: PDCCH monitoring, CSI and SRS stop, HARQ buffers flush. The next use pays the full activation budget.
bwp-InactivityTimerPer serving cellRestarted by PDCCH reception on the active BWP of that cellSwitches the cell's active downlink BWP to defaultDownlinkBWP-Id, or to the initial BWP if none is configured.
timeAlignmentTimer (pTAG)Per TAG, tag-Id 0Restarted by a Timing Advance Command MAC CE for that TAG, or by a RAR TA commandTreats 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..3The same, per TAGOnly 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 cyclePer DRX group -- and a Rel-16 secondaryDRX-GroupConfig allows a second group, typically for FR2 SCellsSee the companion 11 DRX documentEnds 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.

FailureDetected byWhat the UE and network doWhat it looks like in a log
SCell configured but never activatedNobody. 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 ACKNobody, 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 trafficNobody. 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 cellThe 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 deactivatedNobody.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 cellThe 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 SCellThe 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 anywayThe 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 pTAGNobody. 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 cellNobody. 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 scalingThe 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 disappearsNobody, 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.

💡
Key point

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 ::= 32

Listing 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:

Peak data rate per carrier, TS 38.306
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.
🧮
Worked calculation

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.

Figure 9. The same arithmetic against carrier count, with the achieved figure beside it. 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

🧮
Worked calculation

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.

🧮
Worked calculation

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

🧮
Worked calculation

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

🧮
Worked calculation

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

🔍
ABOUT THESE 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

[RRC] RRCReconfiguration -- sCellToAddModList
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

[MAC] SCell Activation/Deactivation MAC CE + first CSI
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 CE

Listing 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

[PHY] DCI 1_1 with a Carrier Indicator Field
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

[RRC] UE-NR-Capability -- band combination excerpt
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 qam256

Listing 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

[PHY/MAC] DCI 2_6 -- wake-up and SCell dormancy
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 start

Listing 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

[RRC/MAC/SCHED] SCell activated, no CSI path, quietly released
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.

🔍
What you see in logs

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

ReleaseChangeWhy it matters when reading CA
Rel-15Baseline 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 PHREverything 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-16SCell dormancy: dormantBWP-Config, dormancy groups, dormancy indication in DCI 1_1 / 0_1 within Active Time and DCI 2_6 outside itA 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-16Direct SCell activation: sCellState = activated in SCellConfigAn 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-16Type-3 HARQ-ACK codebook: one-shot feedback for every process on every cell, requested by DCIGives a recovery path for the codebook mismatch described in §11.1, which previously had none.
Rel-16pdsch-HARQ-ACK-CodebookList -- a codebook type per PUCCH group; secondaryDRX-GroupConfig -- a second DRX groupTwo PUCCH groups and two DRX groups can now be tuned independently, which is what makes an FR1 + FR2 configuration practical.
Rel-16Cross-carrier scheduling enhancements, including scheduling of and by cells with different numerologies and the pdcch-BlindDetectionCA budget rulesThe blind-decode apportionment in §9.3 is where a large CA configuration stops behaving linearly.
Rel-17Enhanced direct SCell activation with a temporary tracking reference signalThe 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-17Cross-carrier scheduling from an SCell to the PCell, as an optional capabilityThe 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-17CA 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 forgetA RedCap UE with no SCells is not a CA failure. Confirm the UE type before investigating.
Rel-18Further activation-latency reduction work, and multi-cell scheduling with a single DCI -- one DCI carrying assignments for several cellsA 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-18Network energy saving, including cell on/off patterns that interact with SCell activationA 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

  1. 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.
  2. Find the activation CE and decode the bitmap by hand. Do not trust a decoder's summary. Which C_i bits 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).
  3. 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).
  4. Compare sCellDeactivationTimer against 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).
  5. Establish who schedules whom. Read crossCarrierSchedulingConfig for every serving cell. Build the map: which cell is own with cif-Presence TRUE, which cells are other, and what CIF value each claims. Check the CIF values are unique. Then check whether any scheduling cell has a deactivation timer (§9).
  6. 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 through cif-InSchedulingCell every time.
  7. 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.
  8. Check tag-Id on 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.
  9. 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).
  10. 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.
  11. 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.
  12. 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

TermExpansionMeaning in this document
CCComponent CarrierOne 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.
PCellPrimary CellServCellIndex 0. Carries PUCCH, owns RLF, always self-scheduled in Rel-15/16, never deactivated (§2).
SCellSecondary CellsCellIndex 1..31. Added, activated, made dormant, deactivated and released at the network's discretion. No RLF, no failure procedure.
SpCellSpecial CellA role: the PCell in CA, and the PCell or PSCell depending on cell group in DC. Spec clauses say SpCell where either could apply.
PSCellPrimary SCell of the SCGThe 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.
CIFCarrier Indicator Field3 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).
TAGTiming Advance GroupA set of serving cells sharing one uplink timing advance and one timeAlignmentTimer. tag-Id 0 is the pTAG; 1..3 are sTAGs (§13).
DAIDownlink Assignment IndexCounter 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,cUE maximum output power for carrier f on cell cThe per-carrier ceiling that power headroom is reported against. The shared UE-wide ceiling is a separate and usually tighter limit (§12).
MPHRMultiple Entry PHRThe 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.