[RFT][PATCH] b43: fix logic in GPIO configuration

Rafał Miłecki zajec5 at gmail.com
Wed Mar 7 02:23:05 EST 2012


W dniu 7 marca 2012 07:52 użytkownik Rafał Miłecki <zajec5 at gmail.com> napisał:
> W dniu 6 marca 2012 23:55 użytkownik Hauke Mehrtens <hauke at hauke-m.de> napisał:
>> On 03/06/2012 11:11 PM, Rafał Miłecki wrote:
>>> By using reverted mask we were taking over pins we were not supporsed to
>>> touch. After fixing this workaround for BCM5354 should not be needed
>>> anymore.
>>>
>>> Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
>>> ---
>>>  drivers/net/wireless/b43/main.c |    6 ++----
>>>  1 files changed, 2 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
>>> index 1d633f3..8a89885 100644
>>> --- a/drivers/net/wireless/b43/main.c
>>> +++ b/drivers/net/wireless/b43/main.c
>>> @@ -2706,8 +2706,6 @@ static int b43_gpio_init(struct b43_wldev *dev)
>>>               mask |= 0x0060;
>>>               set |= 0x0060;
>>>       }
>>> -     if (dev->dev->chip_id == 0x5354)
>>> -             set &= 0xff02;
>>>       if (0 /* FIXME: conditional unknown */ ) {
>>>               b43_write16(dev, B43_MMIO_GPIO_MASK,
>>>                           b43_read16(dev, B43_MMIO_GPIO_MASK)
>>> @@ -2730,7 +2728,7 @@ static int b43_gpio_init(struct b43_wldev *dev)
>>>       case B43_BUS_BCMA:
>>>               bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL,
>>>                               (bcma_cc_read32(&dev->dev->bdev->bus->drv_cc,
>>> -                                     BCMA_CC_GPIOCTL) & mask) | set);
>>> +                                     BCMA_CC_GPIOCTL) & ~mask) | set);
>>>               break;
>>>  #endif
>>>  #ifdef CONFIG_B43_SSB
>>> @@ -2739,7 +2737,7 @@ static int b43_gpio_init(struct b43_wldev *dev)
>>>               if (gpiodev)
>>>                       ssb_write32(gpiodev, B43_GPIO_CONTROL,
>>>                                   (ssb_read32(gpiodev, B43_GPIO_CONTROL)
>>> -                                 & mask) | set);
>>> +                                 & ~mask) | set);
>>>               break;
>>>  #endif
>>>       }
>>
>> Hi,
>>
>> This patch did not helped fixing my problem. The ucode still takes over
>> the GPIOs of the buttons with firmware version 666.2. I am getting the
>> following messages:
>>
>> [   83.620000] b43-phy0: Loading firmware version 666.2 (2011-02-23
>> 01:15:07)
>> [   83.624000] Init value of B43_GPIO_CONTROL: 0x0
>> [   83.632000] b43-phy0 debug: b2062: Using crystal tab entry 19200 kHz.
>> [   83.640000] hotplug_button: action: pressed, name: reset, seen: 17179652
>> [   83.644000] hotplug_button: action: pressed, name: ses, seen: 17179652
>> [   89.404000] b43-phy0 debug: Chip initialized
>
> Interesting/weird. I suspected there are some bits set in
> B43_GPIO_CONTROL we should not clean. And you just adjusted "set" to
> keep them set. But now it seems B43_GPIO_CONTROL is *zero* at the
> beginning and we actually have to *set* 0xFF00 to stop firmware
> touching them? Really tricky, I didn't suspect we may need to change
> default state of non-b43-related GPIOs.

Ahh, sorry. For all the time I believed the code you added was:
set |= 0xff02;

However the code you *really* added is:
set &= 0xff02;

Sorry for messing. OK, let's short analyze that. By default we set "set" to:
set = 0x0000000F;
so you code basically makes it
set = 0x00000002;

0x2 (BIT 1) is wlan led on your device. So you let firmware use wlan
led, but you stop it from touching power led (0x1), reset button (0x4)
and ses button (0x8). OK, it makes sense.

In the brcm80211 code there was unused si_gpioreserve function. I
guess it used to be called in some way like:
if (dev->dev->chip_id == 0x5354)
si_gpioreserve(sih, 0x2, 1+)

-- 
Rafał



More information about the b43-dev mailing list