From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail-qw0-f46.google.com ([209.85.216.46]:50902 "EHLO mail-qw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751154Ab1HNXY3 convert rfc822-to-8bit (ORCPT ); Sun, 14 Aug 2011 19:24:29 -0400 Received: by qwk3 with SMTP id 3so2250083qwk.19 for ; Sun, 14 Aug 2011 16:24:28 -0700 (PDT) MIME-Version: 1.0 In-Reply-To: <1313357250-8292-2-git-send-email-zajec5@gmail.com> References: <1313357250-8292-1-git-send-email-zajec5@gmail.com> <1313357250-8292-2-git-send-email-zajec5@gmail.com> From: =?ISO-8859-1?Q?G=E1bor_Stefanik?= Date: Mon, 15 Aug 2011 01:24:07 +0200 Message-ID: (sfid-20110815_012432_811512_E38F290F) Subject: Re: [PATCH 2/3] b43: LCN-PHY: implement disabling radio To: =?ISO-8859-2?Q?Rafa=B3_Mi=B3ecki?= Cc: linux-wireless@vger.kernel.org, "John W. Linville" , b43-dev@lists.infradead.org Content-Type: text/plain; charset=UTF-8 Sender: linux-wireless-owner@vger.kernel.org List-ID: 2011/8/14 Rafał Miłecki : > 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 > --- > 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@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/b43-dev > -- Vista: [V]iruses, [I]ntruders, [S]pyware, [T]rojans and [A]dware. :-) From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?ISO-8859-1?Q?G=E1bor_Stefanik?= Date: Mon, 15 Aug 2011 01:24:07 +0200 Subject: [PATCH 2/3] b43: LCN-PHY: implement disabling radio In-Reply-To: <1313357250-8292-2-git-send-email-zajec5@gmail.com> References: <1313357250-8292-1-git-send-email-zajec5@gmail.com> <1313357250-8292-2-git-send-email-zajec5@gmail.com> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: =?ISO-8859-2?Q?Rafa=B3_Mi=B3ecki?= Cc: linux-wireless@vger.kernel.org, "John W. Linville" , b43-dev@lists.infradead.org 2011/8/14 Rafa? Mi?ecki : > 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 > --- > 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. :-)