Message ID | 20170104175832.25996-4-zajec5@gmail.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Johannes Berg |
Headers | show |
On 4-1-2017 18:58, Rafał Miłecki wrote: > From: Rafał Miłecki <rafal@milecki.pl> > > There are some devices (e.g. Netgear R8000 home router) with one chipset > model used for different radios, some of them limited to subbands. NVRAM > entries don't contain any extra info on such limitations and firmware > reports full list of channels to us. We need to store extra limitation > info in DT to support such devices properly. > > Now there is a cfg80211 helper for reading such info use it in brcmfmac. > This patch adds check for channel being disabled with orig_flags which > is how this wiphy helper and wiphy_register work. > > Signed-off-by: Rafał Miłecki <rafal@milecki.pl> > --- > This patch should probably go through wireless-driver-next which is why > it got weird number 4/3. I'm sending it just as a proof of concept. > It was succesfully tested on SmartRG SR400ac with BCM43602. > > V4: Respect IEEE80211_CHAN_DISABLED in orig_flags > V5: Update commit message > V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work > with helper setting "flags" instead of "orig_flags". > --- > drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > index ccae3bb..a008ba5 100644 > --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c > @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, > band->band); > channel[index].hw_value = ch.control_ch_num; > > + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) > + continue; > + So to be clear this is still needed for subsequent calls to brcmf_setup_wiphybands(). The subsequent calls are done from the regulatory notifier. So I think we have an issue with this approach. Say the device comes up with US. That would set DISABLED flags for channels 12 to 14. With a country update to PL we would want to enable channels 12 and 13, right? The orig_flags are copied from the initial flags during wiphy_register() so it seems we will skip enabling 12 and 13. I think we should remove the check above and call wiphy_read_of_freq_limits() as a last step within brcmf_setup_wiphybands(). It means it is called every time, but it safeguards that the limits in DT are always applied. Regards, Arend > /* assuming the chanspecs order is HT20, > * HT40 upper, HT40 lower, and VHT80. > */ > @@ -6478,7 +6481,11 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp) > } > } > err = brcmf_setup_wiphybands(wiphy); > - return err; > + if (err) > + return err; > + wiphy_read_of_freq_limits(wiphy); > + > + return 0; > } > > static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) >
On 4 January 2017 at 21:07, Arend Van Spriel <arend.vanspriel@broadcom.com> wrote: > On 4-1-2017 18:58, Rafał Miłecki wrote: >> From: Rafał Miłecki <rafal@milecki.pl> >> >> There are some devices (e.g. Netgear R8000 home router) with one chipset >> model used for different radios, some of them limited to subbands. NVRAM >> entries don't contain any extra info on such limitations and firmware >> reports full list of channels to us. We need to store extra limitation >> info in DT to support such devices properly. >> >> Now there is a cfg80211 helper for reading such info use it in brcmfmac. >> This patch adds check for channel being disabled with orig_flags which >> is how this wiphy helper and wiphy_register work. >> >> Signed-off-by: Rafał Miłecki <rafal@milecki.pl> >> --- >> This patch should probably go through wireless-driver-next which is why >> it got weird number 4/3. I'm sending it just as a proof of concept. >> It was succesfully tested on SmartRG SR400ac with BCM43602. >> >> V4: Respect IEEE80211_CHAN_DISABLED in orig_flags >> V5: Update commit message >> V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work >> with helper setting "flags" instead of "orig_flags". >> --- >> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- >> 1 file changed, 8 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >> index ccae3bb..a008ba5 100644 >> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >> @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, >> band->band); >> channel[index].hw_value = ch.control_ch_num; >> >> + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) >> + continue; >> + > > So to be clear this is still needed for subsequent calls to > brcmf_setup_wiphybands(). The subsequent calls are done from the > regulatory notifier. So I think we have an issue with this approach. Say > the device comes up with US. That would set DISABLED flags for channels > 12 to 14. With a country update to PL we would want to enable channels > 12 and 13, right? The orig_flags are copied from the initial flags > during wiphy_register() so it seems we will skip enabling 12 and 13. I > think we should remove the check above and call > wiphy_read_of_freq_limits() as a last step within > brcmf_setup_wiphybands(). It means it is called every time, but it > safeguards that the limits in DT are always applied. I'm not exactly happy with channels management in brcmfmac. Before calling wiphy_register it already disables channels unavailable for current country. This results in setting IEEE80211_CHAN_DISABLED in orig_flags of channels that may become available later, after country change. Please note it happens even right now, without this patch. Maybe you can workaround this by ignoring orig_flags in custom regulatory code, but I'd just prefer to have it nicely handled in the first place. This is the next feature I'm going to work on. AFAIU this patch won't be applied for now (it's for wireless-drivers-next and we first need to get wiphy_read_of_freq_limits in that tree). By the time that happens I may have another patchset cleaning brcmfmac ready. And FWIW this patch wouldn't make things worse *at this point* as we don't really support country switching for any device yet. So I hope problem with channels in brcmfmac doesn't mean we need to postpone patches 1-3.
On 4-1-2017 22:19, Rafał Miłecki wrote: > On 4 January 2017 at 21:07, Arend Van Spriel > <arend.vanspriel@broadcom.com> wrote: >> On 4-1-2017 18:58, Rafał Miłecki wrote: >>> From: Rafał Miłecki <rafal@milecki.pl> >>> >>> There are some devices (e.g. Netgear R8000 home router) with one chipset >>> model used for different radios, some of them limited to subbands. NVRAM >>> entries don't contain any extra info on such limitations and firmware >>> reports full list of channels to us. We need to store extra limitation >>> info in DT to support such devices properly. >>> >>> Now there is a cfg80211 helper for reading such info use it in brcmfmac. >>> This patch adds check for channel being disabled with orig_flags which >>> is how this wiphy helper and wiphy_register work. >>> >>> Signed-off-by: Rafał Miłecki <rafal@milecki.pl> >>> --- >>> This patch should probably go through wireless-driver-next which is why >>> it got weird number 4/3. I'm sending it just as a proof of concept. >>> It was succesfully tested on SmartRG SR400ac with BCM43602. >>> >>> V4: Respect IEEE80211_CHAN_DISABLED in orig_flags >>> V5: Update commit message >>> V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work >>> with helper setting "flags" instead of "orig_flags". >>> --- >>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- >>> 1 file changed, 8 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>> index ccae3bb..a008ba5 100644 >>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>> @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, >>> band->band); >>> channel[index].hw_value = ch.control_ch_num; >>> >>> + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) >>> + continue; >>> + >> >> So to be clear this is still needed for subsequent calls to >> brcmf_setup_wiphybands(). The subsequent calls are done from the >> regulatory notifier. So I think we have an issue with this approach. Say >> the device comes up with US. That would set DISABLED flags for channels >> 12 to 14. With a country update to PL we would want to enable channels >> 12 and 13, right? The orig_flags are copied from the initial flags >> during wiphy_register() so it seems we will skip enabling 12 and 13. I >> think we should remove the check above and call >> wiphy_read_of_freq_limits() as a last step within >> brcmf_setup_wiphybands(). It means it is called every time, but it >> safeguards that the limits in DT are always applied. > > I'm not exactly happy with channels management in brcmfmac. Before > calling wiphy_register it already disables channels unavailable for > current country. This results in setting IEEE80211_CHAN_DISABLED in What do you mean by current country. There is none that we are aware off in the driver. So we obtain the channels for the current country/revision in the firmware and enable those before wiphy_register(). This all is within the probe/init sequence so I do not really see an issue. As the wiphy object is not yet registered there is no user-space awareness > orig_flags of channels that may become available later, after country > change. Please note it happens even right now, without this patch. Nope. As stated earlier the country setting in firmware is not updated unless you provide a *proper* mapping of user-space country code to firmware country code/revision. That is the reason, ie. firmware simply returns the same list of channels as nothing changed from its perspective. We may actually drop 11d support. > Maybe you can workaround this by ignoring orig_flags in custom > regulatory code, but I'd just prefer to have it nicely handled in the > first place. Please care to explain your ideas before putting any effort in this "feature". As the author of the code that makes you unhappy and as driver maintainer I would like to get a clearer picture of your point of view. What exactly is the issue that makes you unhappy. > This is the next feature I'm going to work on. AFAIU this patch won't > be applied for now (it's for wireless-drivers-next and we first need > to get wiphy_read_of_freq_limits in that tree). By the time that > happens I may have another patchset cleaning brcmfmac ready. And FWIW > this patch wouldn't make things worse *at this point* as we don't > really support country switching for any device yet. Now who is *we*? We as Broadcom can, because we know how to map the ISO 3166-1 country code to firmware country code/revision for a specific firmware release. Firmware uses its own regulatory rules which may differ from what regdb has. Now I know Intel submitted a mechanism to export firmware rules to regdb so maybe we should consider switching to that api if that has been upstreamed. Need to check. > So I hope problem with channels in brcmfmac doesn't mean we need to > postpone patches 1-3. I do not see any reason to postpone. Regards, Arend
On 5 January 2017 at 10:31, Arend Van Spriel <arend.vanspriel@broadcom.com> wrote: > On 4-1-2017 22:19, Rafał Miłecki wrote: >> On 4 January 2017 at 21:07, Arend Van Spriel >> <arend.vanspriel@broadcom.com> wrote: >>> On 4-1-2017 18:58, Rafał Miłecki wrote: >>>> From: Rafał Miłecki <rafal@milecki.pl> >>>> >>>> There are some devices (e.g. Netgear R8000 home router) with one chipset >>>> model used for different radios, some of them limited to subbands. NVRAM >>>> entries don't contain any extra info on such limitations and firmware >>>> reports full list of channels to us. We need to store extra limitation >>>> info in DT to support such devices properly. >>>> >>>> Now there is a cfg80211 helper for reading such info use it in brcmfmac. >>>> This patch adds check for channel being disabled with orig_flags which >>>> is how this wiphy helper and wiphy_register work. >>>> >>>> Signed-off-by: Rafał Miłecki <rafal@milecki.pl> >>>> --- >>>> This patch should probably go through wireless-driver-next which is why >>>> it got weird number 4/3. I'm sending it just as a proof of concept. >>>> It was succesfully tested on SmartRG SR400ac with BCM43602. >>>> >>>> V4: Respect IEEE80211_CHAN_DISABLED in orig_flags >>>> V5: Update commit message >>>> V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work >>>> with helper setting "flags" instead of "orig_flags". >>>> --- >>>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- >>>> 1 file changed, 8 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>> index ccae3bb..a008ba5 100644 >>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>> @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, >>>> band->band); >>>> channel[index].hw_value = ch.control_ch_num; >>>> >>>> + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) >>>> + continue; >>>> + >>> >>> So to be clear this is still needed for subsequent calls to >>> brcmf_setup_wiphybands(). The subsequent calls are done from the >>> regulatory notifier. So I think we have an issue with this approach. Say >>> the device comes up with US. That would set DISABLED flags for channels >>> 12 to 14. With a country update to PL we would want to enable channels >>> 12 and 13, right? The orig_flags are copied from the initial flags >>> during wiphy_register() so it seems we will skip enabling 12 and 13. I >>> think we should remove the check above and call >>> wiphy_read_of_freq_limits() as a last step within >>> brcmf_setup_wiphybands(). It means it is called every time, but it >>> safeguards that the limits in DT are always applied. >> >> I'm not exactly happy with channels management in brcmfmac. Before >> calling wiphy_register it already disables channels unavailable for >> current country. This results in setting IEEE80211_CHAN_DISABLED in > > What do you mean by current country. There is none that we are aware off > in the driver. So we obtain the channels for the current > country/revision in the firmware and enable those before > wiphy_register(). This all is within the probe/init sequence so I do not > really see an issue. As the wiphy object is not yet registered there is > no user-space awareness It seems I'm terrible as describing my patches/problems/ideas :( Here I used 1 inaccurate word and you couldn't understand my point. By "current country" I meant current region (and so a set of regulatory rules) used by the firmware. I believe firmware describes it using "ccode" and "regrev". Now, about the issue I see: AFAIU if you set IEEE80211_CHAN_DISABLED in "orig_flags" it's meant to be there for good. Some reference code that makes me believe so (reg.c): pr_debug("Disabling freq %d MHz for good\n", chan->center_freq); chan->orig_flags |= IEEE80211_CHAN_DISABLED; This is what happens with brcmfmac right now. If firmware doesn't report some channels, you set "flags" to IEEE80211_CHAN_DISABLED for them. Then you call wiphy_register which copies that "flags" to the "orig_flags". I read it as: we are never going to use these channels. Now, consider you support regdom change (I do with my local patches). You translate alpha2 to a proper firmware request (board specific!), you execute it and then firmware may allow you to use channels that you marked as disabled for good. You would need to mess with orig_flags to recover from this issue. Does my explanation make more sense of this issue now? >> orig_flags of channels that may become available later, after country >> change. Please note it happens even right now, without this patch. > > Nope. As stated earlier the country setting in firmware is not updated > unless you provide a *proper* mapping of user-space country code to > firmware country code/revision. That is the reason, ie. firmware simply > returns the same list of channels as nothing changed from its > perspective. We may actually drop 11d support. I implemented mapping support locally, this is the feature I'm talking about. >> Maybe you can workaround this by ignoring orig_flags in custom >> regulatory code, but I'd just prefer to have it nicely handled in the >> first place. > > Please care to explain your ideas before putting any effort in this > "feature". As the author of the code that makes you unhappy and as > driver maintainer I would like to get a clearer picture of your point of > view. What exactly is the issue that makes you unhappy. I meant that problem with "orig_flags" I described in the first paragraph. I wasn't trying to hide whatever issue I'm seeing, I swear ;) >> This is the next feature I'm going to work on. AFAIU this patch won't >> be applied for now (it's for wireless-drivers-next and we first need >> to get wiphy_read_of_freq_limits in that tree). By the time that >> happens I may have another patchset cleaning brcmfmac ready. And FWIW >> this patch wouldn't make things worse *at this point* as we don't >> really support country switching for any device yet. > > Now who is *we*? We as Broadcom can, because we know how to map the ISO > 3166-1 country code to firmware country code/revision for a specific > firmware release. Firmware uses its own regulatory rules which may > differ from what regdb has. Now I know Intel submitted a mechanism to > export firmware rules to regdb so maybe we should consider switching to > that api if that has been upstreamed. Need to check. We as a driver developers. Please read "we don't really support country switching for any device yet" as "brcmfmac doesn't really support country switching for any device yet" Does it help to get the context?
On 5-1-2017 11:02, Rafał Miłecki wrote: > On 5 January 2017 at 10:31, Arend Van Spriel > <arend.vanspriel@broadcom.com> wrote: >> On 4-1-2017 22:19, Rafał Miłecki wrote: >>> On 4 January 2017 at 21:07, Arend Van Spriel >>> <arend.vanspriel@broadcom.com> wrote: >>>> On 4-1-2017 18:58, Rafał Miłecki wrote: >>>>> From: Rafał Miłecki <rafal@milecki.pl> >>>>> >>>>> There are some devices (e.g. Netgear R8000 home router) with one chipset >>>>> model used for different radios, some of them limited to subbands. NVRAM >>>>> entries don't contain any extra info on such limitations and firmware >>>>> reports full list of channels to us. We need to store extra limitation >>>>> info in DT to support such devices properly. >>>>> >>>>> Now there is a cfg80211 helper for reading such info use it in brcmfmac. >>>>> This patch adds check for channel being disabled with orig_flags which >>>>> is how this wiphy helper and wiphy_register work. >>>>> >>>>> Signed-off-by: Rafał Miłecki <rafal@milecki.pl> >>>>> --- >>>>> This patch should probably go through wireless-driver-next which is why >>>>> it got weird number 4/3. I'm sending it just as a proof of concept. >>>>> It was succesfully tested on SmartRG SR400ac with BCM43602. >>>>> >>>>> V4: Respect IEEE80211_CHAN_DISABLED in orig_flags >>>>> V5: Update commit message >>>>> V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work >>>>> with helper setting "flags" instead of "orig_flags". >>>>> --- >>>>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- >>>>> 1 file changed, 8 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>> index ccae3bb..a008ba5 100644 >>>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>> @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, >>>>> band->band); >>>>> channel[index].hw_value = ch.control_ch_num; >>>>> >>>>> + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) >>>>> + continue; >>>>> + >>>> >>>> So to be clear this is still needed for subsequent calls to >>>> brcmf_setup_wiphybands(). The subsequent calls are done from the >>>> regulatory notifier. So I think we have an issue with this approach. Say >>>> the device comes up with US. That would set DISABLED flags for channels >>>> 12 to 14. With a country update to PL we would want to enable channels >>>> 12 and 13, right? The orig_flags are copied from the initial flags >>>> during wiphy_register() so it seems we will skip enabling 12 and 13. I >>>> think we should remove the check above and call >>>> wiphy_read_of_freq_limits() as a last step within >>>> brcmf_setup_wiphybands(). It means it is called every time, but it >>>> safeguards that the limits in DT are always applied. >>> >>> I'm not exactly happy with channels management in brcmfmac. Before >>> calling wiphy_register it already disables channels unavailable for >>> current country. This results in setting IEEE80211_CHAN_DISABLED in >> >> What do you mean by current country. There is none that we are aware off >> in the driver. So we obtain the channels for the current >> country/revision in the firmware and enable those before >> wiphy_register(). This all is within the probe/init sequence so I do not >> really see an issue. As the wiphy object is not yet registered there is >> no user-space awareness > > It seems I'm terrible as describing my patches/problems/ideas :( Here > I used 1 inaccurate word and you couldn't understand my point. Well. Because of our track record of miscommunication and other annoyances I want to be sure this time :-p > By "current country" I meant current region (and so a set of > regulatory rules) used by the firmware. I believe firmware describes > it using "ccode" and "regrev". > > Now, about the issue I see: > > AFAIU if you set IEEE80211_CHAN_DISABLED in "orig_flags" it's meant to > be there for good. Some reference code that makes me believe so Indeed. Admittedly, it is the first time I became aware of it when Johannes brought it up. > (reg.c): > pr_debug("Disabling freq %d MHz for good\n", chan->center_freq); > chan->orig_flags |= IEEE80211_CHAN_DISABLED; > > This is what happens with brcmfmac right now. If firmware doesn't > report some channels, you set "flags" to IEEE80211_CHAN_DISABLED for > them. Then you call wiphy_register which copies that "flags" to the > "orig_flags". I read it as: we are never going to use these channels. > > Now, consider you support regdom change (I do with my local patches). > You translate alpha2 to a proper firmware request (board specific!), > you execute it and then firmware may allow you to use channels that > you marked as disabled for good. You would need to mess with > orig_flags to recover from this issue. > > Does my explanation make more sense of this issue now? Sure. It seems we should leave all channels enabled and disable them after wiphy_register() based on firmware information. Or did you have something else in mind. DFS channels may need to pass a feature check in firmware and always be disabled otherwise. >>> orig_flags of channels that may become available later, after country >>> change. Please note it happens even right now, without this patch. >> >> Nope. As stated earlier the country setting in firmware is not updated >> unless you provide a *proper* mapping of user-space country code to >> firmware country code/revision. That is the reason, ie. firmware simply >> returns the same list of channels as nothing changed from its >> perspective. We may actually drop 11d support. > > I implemented mapping support locally, this is the feature I'm talking about. Ok. So this is not an upstream feature. Or are you getting the mapping from DT? >>> Maybe you can workaround this by ignoring orig_flags in custom >>> regulatory code, but I'd just prefer to have it nicely handled in the >>> first place. >> >> Please care to explain your ideas before putting any effort in this >> "feature". As the author of the code that makes you unhappy and as >> driver maintainer I would like to get a clearer picture of your point of >> view. What exactly is the issue that makes you unhappy. > > I meant that problem with "orig_flags" I described in the first > paragraph. I wasn't trying to hide whatever issue I'm seeing, I swear > ;) > > >>> This is the next feature I'm going to work on. AFAIU this patch won't >>> be applied for now (it's for wireless-drivers-next and we first need >>> to get wiphy_read_of_freq_limits in that tree). By the time that >>> happens I may have another patchset cleaning brcmfmac ready. And FWIW >>> this patch wouldn't make things worse *at this point* as we don't >>> really support country switching for any device yet. >> >> Now who is *we*? We as Broadcom can, because we know how to map the ISO >> 3166-1 country code to firmware country code/revision for a specific >> firmware release. Firmware uses its own regulatory rules which may >> differ from what regdb has. Now I know Intel submitted a mechanism to >> export firmware rules to regdb so maybe we should consider switching to >> that api if that has been upstreamed. Need to check. > > We as a driver developers. Please read > "we don't really support country switching for any device yet" > as > "brcmfmac doesn't really support country switching for any device yet" > > Does it help to get the context? I indeed prefer to talk about the driver instead of we. Indeed it is true due to the orig_flags behavior although that only seems to involve regulatory code. Could it be that brcmfmac undo that through the notifier? Regards, Arend
On 7 January 2017 at 13:52, Arend Van Spriel <arend.vanspriel@broadcom.com> wrote: > On 5-1-2017 11:02, Rafał Miłecki wrote: >> On 5 January 2017 at 10:31, Arend Van Spriel >> <arend.vanspriel@broadcom.com> wrote: >>> On 4-1-2017 22:19, Rafał Miłecki wrote: >>>> On 4 January 2017 at 21:07, Arend Van Spriel >>>> <arend.vanspriel@broadcom.com> wrote: >>>>> On 4-1-2017 18:58, Rafał Miłecki wrote: >>>>>> From: Rafał Miłecki <rafal@milecki.pl> >>>>>> >>>>>> There are some devices (e.g. Netgear R8000 home router) with one chipset >>>>>> model used for different radios, some of them limited to subbands. NVRAM >>>>>> entries don't contain any extra info on such limitations and firmware >>>>>> reports full list of channels to us. We need to store extra limitation >>>>>> info in DT to support such devices properly. >>>>>> >>>>>> Now there is a cfg80211 helper for reading such info use it in brcmfmac. >>>>>> This patch adds check for channel being disabled with orig_flags which >>>>>> is how this wiphy helper and wiphy_register work. >>>>>> >>>>>> Signed-off-by: Rafał Miłecki <rafal@milecki.pl> >>>>>> --- >>>>>> This patch should probably go through wireless-driver-next which is why >>>>>> it got weird number 4/3. I'm sending it just as a proof of concept. >>>>>> It was succesfully tested on SmartRG SR400ac with BCM43602. >>>>>> >>>>>> V4: Respect IEEE80211_CHAN_DISABLED in orig_flags >>>>>> V5: Update commit message >>>>>> V6: Call wiphy_read_of_freq_limits after brcmf_setup_wiphybands to make it work >>>>>> with helper setting "flags" instead of "orig_flags". >>>>>> --- >>>>>> drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | 9 ++++++++- >>>>>> 1 file changed, 8 insertions(+), 1 deletion(-) >>>>>> >>>>>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>>> index ccae3bb..a008ba5 100644 >>>>>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c >>>>>> @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, >>>>>> band->band); >>>>>> channel[index].hw_value = ch.control_ch_num; >>>>>> >>>>>> + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) >>>>>> + continue; >>>>>> + >>>>> >>>>> So to be clear this is still needed for subsequent calls to >>>>> brcmf_setup_wiphybands(). The subsequent calls are done from the >>>>> regulatory notifier. So I think we have an issue with this approach. Say >>>>> the device comes up with US. That would set DISABLED flags for channels >>>>> 12 to 14. With a country update to PL we would want to enable channels >>>>> 12 and 13, right? The orig_flags are copied from the initial flags >>>>> during wiphy_register() so it seems we will skip enabling 12 and 13. I >>>>> think we should remove the check above and call >>>>> wiphy_read_of_freq_limits() as a last step within >>>>> brcmf_setup_wiphybands(). It means it is called every time, but it >>>>> safeguards that the limits in DT are always applied. >>>> >>>> I'm not exactly happy with channels management in brcmfmac. Before >>>> calling wiphy_register it already disables channels unavailable for >>>> current country. This results in setting IEEE80211_CHAN_DISABLED in >>> >>> What do you mean by current country. There is none that we are aware off >>> in the driver. So we obtain the channels for the current >>> country/revision in the firmware and enable those before >>> wiphy_register(). This all is within the probe/init sequence so I do not >>> really see an issue. As the wiphy object is not yet registered there is >>> no user-space awareness >> >> It seems I'm terrible as describing my patches/problems/ideas :( Here >> I used 1 inaccurate word and you couldn't understand my point. > > Well. Because of our track record of miscommunication and other > annoyances I want to be sure this time :-p > >> By "current country" I meant current region (and so a set of >> regulatory rules) used by the firmware. I believe firmware describes >> it using "ccode" and "regrev". >> >> Now, about the issue I see: >> >> AFAIU if you set IEEE80211_CHAN_DISABLED in "orig_flags" it's meant to >> be there for good. Some reference code that makes me believe so > > Indeed. Admittedly, it is the first time I became aware of it when > Johannes brought it up. > >> (reg.c): >> pr_debug("Disabling freq %d MHz for good\n", chan->center_freq); >> chan->orig_flags |= IEEE80211_CHAN_DISABLED; >> >> This is what happens with brcmfmac right now. If firmware doesn't >> report some channels, you set "flags" to IEEE80211_CHAN_DISABLED for >> them. Then you call wiphy_register which copies that "flags" to the >> "orig_flags". I read it as: we are never going to use these channels. >> >> Now, consider you support regdom change (I do with my local patches). >> You translate alpha2 to a proper firmware request (board specific!), >> you execute it and then firmware may allow you to use channels that >> you marked as disabled for good. You would need to mess with >> orig_flags to recover from this issue. >> >> Does my explanation make more sense of this issue now? > > Sure. It seems we should leave all channels enabled and disable them > after wiphy_register() based on firmware information. Or did you have > something else in mind. DFS channels may need to pass a feature check in > firmware and always be disabled otherwise. I got in mind exactly what you described. I didn't look at DFS channels yet. >>>> orig_flags of channels that may become available later, after country >>>> change. Please note it happens even right now, without this patch. >>> >>> Nope. As stated earlier the country setting in firmware is not updated >>> unless you provide a *proper* mapping of user-space country code to >>> firmware country code/revision. That is the reason, ie. firmware simply >>> returns the same list of channels as nothing changed from its >>> perspective. We may actually drop 11d support. >> >> I implemented mapping support locally, this is the feature I'm talking about. > > Ok. So this is not an upstream feature. Or are you getting the mapping > from DT? I'll send patch next week. So far I put mapping table directly in a driver, but I think it's better to have this in DT. >>>> Maybe you can workaround this by ignoring orig_flags in custom >>>> regulatory code, but I'd just prefer to have it nicely handled in the >>>> first place. >>> >>> Please care to explain your ideas before putting any effort in this >>> "feature". As the author of the code that makes you unhappy and as >>> driver maintainer I would like to get a clearer picture of your point of >>> view. What exactly is the issue that makes you unhappy. >> >> I meant that problem with "orig_flags" I described in the first >> paragraph. I wasn't trying to hide whatever issue I'm seeing, I swear >> ;) >> >> >>>> This is the next feature I'm going to work on. AFAIU this patch won't >>>> be applied for now (it's for wireless-drivers-next and we first need >>>> to get wiphy_read_of_freq_limits in that tree). By the time that >>>> happens I may have another patchset cleaning brcmfmac ready. And FWIW >>>> this patch wouldn't make things worse *at this point* as we don't >>>> really support country switching for any device yet. >>> >>> Now who is *we*? We as Broadcom can, because we know how to map the ISO >>> 3166-1 country code to firmware country code/revision for a specific >>> firmware release. Firmware uses its own regulatory rules which may >>> differ from what regdb has. Now I know Intel submitted a mechanism to >>> export firmware rules to regdb so maybe we should consider switching to >>> that api if that has been upstreamed. Need to check. >> >> We as a driver developers. Please read >> "we don't really support country switching for any device yet" >> as >> "brcmfmac doesn't really support country switching for any device yet" >> >> Does it help to get the context? > > I indeed prefer to talk about the driver instead of we. Indeed it is > true due to the orig_flags behavior although that only seems to involve > regulatory code. Could it be that brcmfmac undo that through the notifier? I guess you could touch orig_flags, but I don't know if it's preferred way. This is probably question to Johannes & cfg80211 guys.
On 5 January 2017 at 11:02, Rafał Miłecki <zajec5@gmail.com> wrote: > On 5 January 2017 at 10:31, Arend Van Spriel > <arend.vanspriel@broadcom.com> wrote: >> On 4-1-2017 22:19, Rafał Miłecki wrote: >>> I'm not exactly happy with channels management in brcmfmac. Before >>> calling wiphy_register it already disables channels unavailable for >>> current country. This results in setting IEEE80211_CHAN_DISABLED in >> >> What do you mean by current country. There is none that we are aware off >> in the driver. So we obtain the channels for the current >> country/revision in the firmware and enable those before >> wiphy_register(). This all is within the probe/init sequence so I do not >> really see an issue. As the wiphy object is not yet registered there is >> no user-space awareness > > It seems I'm terrible as describing my patches/problems/ideas :( Here > I used 1 inaccurate word and you couldn't understand my point. > > By "current country" I meant current region (and so a set of > regulatory rules) used by the firmware. I believe firmware describes > it using "ccode" and "regrev". > > Now, about the issue I see: > > AFAIU if you set IEEE80211_CHAN_DISABLED in "orig_flags" it's meant to > be there for good. Some reference code that makes me believe so > (reg.c): > pr_debug("Disabling freq %d MHz for good\n", chan->center_freq); > chan->orig_flags |= IEEE80211_CHAN_DISABLED; > > This is what happens with brcmfmac right now. If firmware doesn't > report some channels, you set "flags" to IEEE80211_CHAN_DISABLED for > them. Then you call wiphy_register which copies that "flags" to the > "orig_flags". I read it as: we are never going to use these channels. > > Now, consider you support regdom change (I do with my local patches). > You translate alpha2 to a proper firmware request (board specific!), > you execute it and then firmware may allow you to use channels that > you marked as disabled for good. You would need to mess with > orig_flags to recover from this issue. I was wrong about this. Current notifier implementation in brcmfmac doesn't care about "orig_flags" and it just sets "flags" as it wants. This way it can enable even these channels that were believed to be disabled for good (DISABLED in "orig_flags"). For my test I booted SR400ac with ccode & regrev set to values that didn't allow me to use channels 149 - 165 (5735 - 5835). It matches my current country: country PL: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS # 60 GHz band channels 1-4, ref: Etsi En 302 567 (57000 - 66000 @ 2160), (40) Then I used "iw reg set ??" to set country that allows these channels. My locally modified brcmfmac driver sent proper "country" iovar to the firmware and queried it for the updated "chanspecs". See my debugging messages below: brcmfmac: [brcmf_construct_chaninfo] hw_value:34 orig_flags:0x101 flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:36 orig_flags:0x1a0 flags:0x0a0 brcmfmac: [brcmf_construct_chaninfo] hw_value:38 orig_flags:0x101 flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:40 orig_flags:0x190 flags:0x090 brcmfmac: [brcmf_construct_chaninfo] hw_value:42 orig_flags:0x101 flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:44 orig_flags:0x1a0 flags:0x0a0 brcmfmac: [brcmf_construct_chaninfo] hw_value:46 orig_flags:0x101 flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:48 orig_flags:0x190 flags:0x090 brcmfmac: [brcmf_construct_chaninfo] hw_value:52 orig_flags:0x1aa flags:0x0aa brcmfmac: [brcmf_construct_chaninfo] hw_value:56 orig_flags:0x19a flags:0x09a brcmfmac: [brcmf_construct_chaninfo] hw_value:60 orig_flags:0x1aa flags:0x0aa brcmfmac: [brcmf_construct_chaninfo] hw_value:64 orig_flags:0x19a flags:0x09a brcmfmac: [brcmf_construct_chaninfo] hw_value:100 orig_flags:0x1aa flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:104 orig_flags:0x19a flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:108 orig_flags:0x1aa flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:112 orig_flags:0x19a flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:116 orig_flags:0x1aa flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:120 orig_flags:0x19a flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:124 orig_flags:0x1aa flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:128 orig_flags:0x19a flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:132 orig_flags:0x1aa flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:136 orig_flags:0x19a flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:140 orig_flags:0x1ba flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:144 orig_flags:0x101 flags:0x001 brcmfmac: [brcmf_construct_chaninfo] hw_value:149 orig_flags:0x101 flags:0x0a0 brcmfmac: [brcmf_construct_chaninfo] hw_value:153 orig_flags:0x101 flags:0x090 brcmfmac: [brcmf_construct_chaninfo] hw_value:157 orig_flags:0x101 flags:0x0a0 brcmfmac: [brcmf_construct_chaninfo] hw_value:161 orig_flags:0x101 flags:0x090 brcmfmac: [brcmf_construct_chaninfo] hw_value:165 orig_flags:0x101 flags:0x0b0 As you can see brcmfmac dropped IEEE80211_CHAN_DISABLED (hint: 0x1) for channels 149 - 165 even though they were disabled according to the "orig_flags". So this patch with its if (channel->orig_flags & IEEE80211_CHAN_DISABLED) continue; could be considered some kind of regression. My change wouldn't allow enabling such channels anymore. Of course noone would notice this as noone uses country_codes table yet I guess (except for me locally). Anyway, this patch should be reworked to make sure it still allows implementing support for country_codes tables in the future.
On Sat, 2017-01-07 at 13:58 +0100, Rafał Miłecki wrote: > > I indeed prefer to talk about the driver instead of we. Indeed it > > is true due to the orig_flags behavior although that only seems to > > involve regulatory code. Could it be that brcmfmac undo that > > through the notifier? > > I guess you could touch orig_flags, but I don't know if it's > preferred way. This is probably question to Johannes & cfg80211 guys. Right now - before the OF patch - there can't really be any orig_flags with DISABLED since the driver doesn't set flags to DISABLED before registering, does it? While registering, flags are copied to orig_flags so the driver can register with flags like DFS or NO_IR already enabled - say the firmware requires that - and they will never be overwritten by cfg80211. Arguably, what the driver does today - before OF - isn't incorrect either, since it simply doesn't care about anything it registered with at all. However, with the OF, I argued (succesfully it seems :P) that the sensible thing to do was to register with the DISABLED flag and thereby "permanently" disable the channels that OF didn't think were usable, but in this case now the driver has to adhere to the cfg80211 logic of preserving orig_flags forever. johannes
On 9-1-2017 9:58, Johannes Berg wrote: > On Sat, 2017-01-07 at 13:58 +0100, Rafał Miłecki wrote: > >>> I indeed prefer to talk about the driver instead of we. Indeed it >>> is true due to the orig_flags behavior although that only seems to >>> involve regulatory code. Could it be that brcmfmac undo that >>> through the notifier? >> >> I guess you could touch orig_flags, but I don't know if it's >> preferred way. This is probably question to Johannes & cfg80211 guys. > > Right now - before the OF patch - there can't really be any orig_flags > with DISABLED since the driver doesn't set flags to DISABLED before > registering, does it? While registering, flags are copied to orig_flags > so the driver can register with flags like DFS or NO_IR already enabled > - say the firmware requires that - and they will never be overwritten > by cfg80211. Actually, in brcmfmac we do set channels to DISABLED before registering. I was blissfully unaware of the orig_flags when I added the channel setup in our probe sequence. > Arguably, what the driver does today - before OF - isn't incorrect > either, since it simply doesn't care about anything it registered with > at all. Given the statement above I think brcmfmac is incorrect. > However, with the OF, I argued (succesfully it seems :P) that the > sensible thing to do was to register with the DISABLED flag and thereby > "permanently" disable the channels that OF didn't think were usable, > but in this case now the driver has to adhere to the cfg80211 logic of > preserving orig_flags forever. By adhere you mean we should not enable channes for which orig_flags indicate DISABLED? Regards, Arend
On Mon, 2017-01-09 at 12:02 +0100, Arend Van Spriel wrote: > > However, with the OF, I argued (succesfully it seems :P) that the > > sensible thing to do was to register with the DISABLED flag and > > thereby > > "permanently" disable the channels that OF didn't think were > > usable, > > but in this case now the driver has to adhere to the cfg80211 logic > > of > > preserving orig_flags forever. > > By adhere you mean we should not enable channes for which orig_flags > indicate DISABLED? Well, the regulatory code will "OR" in all the orig_flags after modifications. If you don't use any of the others before registering, and you don't use any other helpers other than the OF one that we know sets only DISABLED, then keeping only the DISABLED flag would be OK - however, it should *also* be OK to always keep *all* of the orig_flags, just like the normal regulatory code would? johannes
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index ccae3bb..a008ba5 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -5886,6 +5886,9 @@ static int brcmf_construct_chaninfo(struct brcmf_cfg80211_info *cfg, band->band); channel[index].hw_value = ch.control_ch_num; + if (channel->orig_flags & IEEE80211_CHAN_DISABLED) + continue; + /* assuming the chanspecs order is HT20, * HT40 upper, HT40 lower, and VHT80. */ @@ -6478,7 +6481,11 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp) } } err = brcmf_setup_wiphybands(wiphy); - return err; + if (err) + return err; + wiphy_read_of_freq_limits(wiphy); + + return 0; } static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg)