[PATCH 2/3] b43: LCN-PHY: implement disabling radio

Gábor Stefanik netrolller.3d at gmail.com
Sun Aug 14 19:24:07 EDT 2011


2011/8/14 Rafał Miłecki <zajec5 at gmail.com>:
> wl reads radio version, then disables it. That's how we found it in MMIO
> dump:
>  radio_read(0x0000) -> 0x0031 <-- RADIO READ WITHOUT 0x200 SET!
>  radio_read(0x0001) -> 0x0064 <-- RADIO READ WITHOUT 0x200 SET!
>  radio_read(0x0002) -> 0x0020 <-- RADIO READ WITHOUT 0x200 SET!
>  read32 0xfaafc120 -> 0x04000400
>  phy_read(0x044d) -> 0x0000
> phy_write(0x044d) <- 0x0000
>  phy_read(0x044c) -> 0x1fff
> phy_write(0x044c) <- 0x1fff
>  phy_read(0x04b7) -> 0x0000
> phy_write(0x04b7) <- 0x0000
>  phy_read(0x04b1) -> 0x0000
> phy_write(0x04b1) <- 0x0000
>  phy_read(0x04b0) -> 0x7dff
> phy_write(0x04b0) <- 0x7dff
>  phy_read(0x04fa) -> 0x0000
> phy_write(0x04fa) <- 0x0000
>  phy_read(0x04f9) -> 0x007f
> phy_write(0x04f9) <- 0x007f

Doesn't brcm80211 support this PHY? (Because then, reverse-engineering
wl is pointless.)

>
> Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
> ---
> OFC, MMIO hacks were used to find masks & sets.
>
> Sets were taken from:
>>>> Switch Radio(OFF) start
>  phy_read(0x044d) -> 0x0000
> phy_write(0x044d) <- 0x0000
>  phy_read(0x044c) -> 0x0000
> phy_write(0x044c) <- 0x1f00
>  phy_read(0x04b7) -> 0x0000
> phy_write(0x04b7) <- 0x0000
>  phy_read(0x04b1) -> 0x0000
> phy_write(0x04b1) <- 0x0000
>  phy_read(0x04b0) -> 0x0000
> phy_write(0x04b0) <- 0x0808
>  phy_read(0x04fa) -> 0x0000
> phy_write(0x04fa) <- 0x0000
>  phy_read(0x04f9) -> 0x0000
> phy_write(0x04f9) <- 0x0008
>>>> Switch Radio(OFF) end
>
> Masks were taken from:
>  phy_read(0x044d) -> 0xffff
> phy_write(0x044d) <- 0x83ff
>  phy_read(0x044c) -> 0xffff
> phy_write(0x044c) <- 0xffff
>  phy_read(0x04b7) -> 0xffff
> phy_write(0x04b7) <- 0x80ff
>  phy_read(0x04b1) -> 0xffff
> phy_write(0x04b1) <- 0xdfff
>  phy_read(0x04b0) -> 0xffff
> phy_write(0x04b0) <- 0xffff
>  phy_read(0x04fa) -> 0xffff
> phy_write(0x04fa) <- 0xfff7
>  phy_read(0x04f9) -> 0xffff
> phy_write(0x04f9) <- 0xffff
> ---
>  drivers/net/wireless/b43/phy_lcn.c |   23 +++++++++++++++++++++++
>  drivers/net/wireless/b43/phy_lcn.h |    9 +++++++++
>  2 files changed, 32 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/b43/phy_lcn.c b/drivers/net/wireless/b43/phy_lcn.c
> index 03944ad..69a93b5 100644
> --- a/drivers/net/wireless/b43/phy_lcn.c
> +++ b/drivers/net/wireless/b43/phy_lcn.c
> @@ -60,6 +60,27 @@ static void b43_phy_lcn_op_prepare_structs(struct b43_wldev *dev)
>        memset(phy_lcn, 0, sizeof(*phy_lcn));
>  }
>
> +static void b43_phy_lcn_op_software_rfkill(struct b43_wldev *dev,
> +                                       bool blocked)
> +{
> +       if (b43_read32(dev, B43_MMIO_MACCTL) & B43_MACCTL_ENABLED)
> +               b43err(dev->wl, "MAC not suspended\n");
> +
> +       if (blocked) {
> +               b43_phy_mask(dev, B43_PHY_LCN_RF_CTL2, ~0x7c00);
> +               b43_phy_set(dev, B43_PHY_LCN_RF_CTL1, 0x1f00);
> +
> +               b43_phy_mask(dev, B43_PHY_LCN_RF_CTL5, ~0x7f00);
> +               b43_phy_mask(dev, B43_PHY_LCN_RF_CTL4, ~0x2);
> +               b43_phy_set(dev, B43_PHY_LCN_RF_CTL3, 0x808);
> +
> +               b43_phy_mask(dev, B43_PHY_LCN_RF_CTL7, ~0x8);
> +               b43_phy_set(dev, B43_PHY_LCN_RF_CTL6, 0x8);
> +       } else {
> +               /* TODO */
> +       }
> +}
> +
>  static unsigned int b43_phy_lcn_op_get_default_chan(struct b43_wldev *dev)
>  {
>        if (b43_current_band(dev->wl) == IEEE80211_BAND_2GHZ)
> @@ -92,7 +113,9 @@ const struct b43_phy_operations b43_phyops_lcn = {
>        .phy_maskset            = b43_phy_lcn_op_maskset,
>        .radio_read             = b43_phy_lcn_op_radio_read,
>        .radio_write            = b43_phy_lcn_op_radio_write,
> +       */
>        .software_rfkill        = b43_phy_lcn_op_software_rfkill,
> +       /*
>        .switch_analog          = b43_phy_lcn_op_switch_analog,
>        .switch_channel         = b43_phy_lcn_op_switch_channel,
>        */
> diff --git a/drivers/net/wireless/b43/phy_lcn.h b/drivers/net/wireless/b43/phy_lcn.h
> index 9e1b291..89f13b2 100644
> --- a/drivers/net/wireless/b43/phy_lcn.h
> +++ b/drivers/net/wireless/b43/phy_lcn.h
> @@ -4,6 +4,15 @@
>  #include "phy_common.h"
>
>
> +#define B43_PHY_LCN_RF_CTL1                    B43_PHY_OFDM(0x04C)
> +#define B43_PHY_LCN_RF_CTL2                    B43_PHY_OFDM(0x04D)
> +#define B43_PHY_LCN_RF_CTL3                    B43_PHY_OFDM(0x0B0)
> +#define B43_PHY_LCN_RF_CTL4                    B43_PHY_OFDM(0x0B1)
> +#define B43_PHY_LCN_RF_CTL5                    B43_PHY_OFDM(0x0B7)
> +#define B43_PHY_LCN_RF_CTL6                    B43_PHY_OFDM(0x0F9)
> +#define B43_PHY_LCN_RF_CTL7                    B43_PHY_OFDM(0x0FA)
> +
> +
>  struct b43_phy_lcn {
>  };
>
> --
> 1.7.3.4
>
>
> _______________________________________________
> b43-dev mailing list
> b43-dev at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/b43-dev
>



-- 
Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-)



More information about the b43-dev mailing list