Search Linux Wireless

[PROPOSAL RFC] S1G Primary Channel Implementation Proposal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Johannes, Wireless,

One of the last remaining pieces within cfg80211/mac80211 to enable
complete S1G functionality is primary channel support. We've identified
a couple of potential implementation specific issues and would like
maintainer input prior to developing the patchset as it may be
mildly contentious.

Background
----------

The channelisation of an S1G PHY consists of two components, a center
frequency and a primary center frequency as per IEEE80211-2024 23.3.14.
The center frequency is equivalent to other PHY types, being the center
operating frequency for the operating channel and the primary center
frequency being the center frequency for the primary channel.

When an S1G PHY changes channel, it requires both the operating channel
and the primary channel parameters. The implementation of this will be
briefly mentioned at the end of this email.

S1G Channel Structure
---------------------

S1G has a hierarchical channel structure. Below is a snippet from the
IEEE80211-2020 Australian/US S1G band. The righthand side |*|
represents the FCC band edge. Above the == line are the designated
channel numbers and on the left column their respective bandwidths.

   |------|---------------------------------------------|*|
 c | 8MHz |  |                  44                   |  |*|
 h |------|---------------------------------------------|*|
 a | 4MHz |  |        40         |        48         |  |*|
 n |------|---------------------------------------------|*|
 n | 2MHz |  |   38    |   42    |   46    |   50    |  |*|
 e |------|---------------------------------------------|*|
 l | 1MHz |  | 37 | 39 | 41 | 43 | 45 | 47 | 49 | 51 |  |*|
   |======|=============================================|*|
   |******| 920  921  922  923  924  925  926  927  928 |*|
   |******|---------------------------------------------|*|
                           frequency (MHz)

S1G Channel Selection Example
-----------------------------

An example channel configuration would be an operating channel of 44 and
a primary channel of 37. The primary channel must be a 1MHz or 2MHz channel
and must exist as a primary subchannel within the operating channels band.
Using the sample above, operating channel 44 can have a 1MHz primary of
37, 39, 41, 43, 45, 47, 49 or 51 and same goes for the 2MHz channels. Whereas
an operating channel of 40 may only have primary 1MHz channels of 37, 39,
41 and 43.

Regulatory Emission Challenges
------------------------------

To control RF emissions during FCC compliance testing, hardware vendors
disable edge-band primary channels to meet emission requirements. [1], [2]
and [3] show 1MHz and 2MHz primary channels on band edges disabled. This,
however, does not prevent the operating channel from being used. This is due
to the OFDM envelope peaking near band centre, providing enough spectrum
roll-off to satisfy emission limits.

Using [3] as an example, primary channels 51, 50 and 49 are disabled during
testing, but operating channels 48 and 44 are still tested (both of which contain
the disabled primary channels). These configurations all passed FCC requirements.

Proposed Solution
-----------------

We propose a new flag within struct ieee80211_channel_flags called
IEEE80211_CHAN_S1G_NO_PRIMARY or something similar that tells the
wireless subsystem that this channel cannot be used as a primary channel,
but is not disabled. This is an important distinction as during subchannel
validation, if a single subchannel is disabled that operating channel cannot
be used (similar to VHT and other PHY types) but an operating channel can
be used if an edgeband 1MHz channel has the NO_PRIMARY flag but is _not_
disabled.

NB: While the existing for_each_subchan macro doesn't work for S1G channels
    given its fixed step size of 20MHz, this will be updated during
    the implementation.

It's also important to note that this can only apply to edgeband primary
channels for the current regdom. This validation will be performed upon
advertisement by the driver of the available channels for the S1G band.
Additionally, puncturing is not supported for S1G.

This will be an implementation detail, as this is not explicitly described
by the standard, but rather used by vendors to ensure FCC compliance.

Primary Channel Representation
------------------------------

One potential challenge with actually implementing primary channel support
is how and where the primary channel is described. Initially it was thought
that a channel definition could contain a separate struct ieee80211_channel
like such:

struct cfg80211_chan_def {
        struct ieee80211_channel *chan;
        [...]
        struct ieee80211_channel *s1g_pri_chan;
};

The obvious problem with this is that now a channel definition describes two
channels, though you could argue that to correctly describe an S1G channel
you require both components - which in some regards makes sense to put them
both in the channel definition. It does, however, require various API changes,
with the biggest one being cfg80211_chandef_create() to accept the new primary
channel parameter. An alternative is to create an S1G specific chandef creation
function which can then call the generic form.

Additionally, we can reuse cfg80211_chandef_valid() to perform validation as
both the operating channel and primary channel exist within the same
channel definition. By extension, many of the function that operate on a
chandef have access to both the primary channel and operating channel.
Definitely something to consider.

The second option is to treat them as two separate channel definitions. This
is probably more "correct" as after all a primary channel is a separate channel.
While this approach doesn't require many major API changes like the previous
method, it still has some negatives. Firstly, the need to carry a separate
channel definition in various places. Taking struct ieee80211_chanctx_conf as
an example:

struct ieee80211_chanctx_conf {
        struct cfg80211_chan_def def;
        [...]
        struct cfg80211_chan_def s1g_pri_def;
};

When building this new channel definition, we probably don't want to be using
_nl80211_parse_chandef() as it relies on the NL80211_ATTR_WIPHY_FREQ to find
the channel, where the primary channel center frequency will rely on a separate
attribute. Now we could, of course, add in another branch to handle this case,
but the function seems fairly overloaded as is and would be good to keep the
S1G specific case separate.

With all that said, we will obviously send up an initial patchset (probably
as an RFC and only once the TIM patchset has been accepted) but since we are
inquiring with regards to the new flag thought it couldn't hurt to get some
preliminary thoughts.

References
----------

[1] AsiaRF MM610X-001 FCC Radio Test Report
    Section 1.1.1
    https://fccid.io/TKZMM610X-001/Test-Report/TKZMM610X-001-Test-Rpt-6686112.pdf

[2] Silex Technology SX-NEWAH FCC Radio Test Report
    Section 2.2
    https://fccid.io/N6C-SXNEWAH/Test-Report/03-FCC-Test-Report-DTS-4734386.pdf

[3] Morse Micro MM6108-MF08651-US Electromagnetic Emissions Compliance Report
    Page 35
    https://fccid.io/2A74O-DB3F2B/Test-Report/TR-TERF2406001545E2-902-928MHz-s03-part-1-7640840

lachlan




[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux