Hi, this patch took a while to track down. The brf6150.c from the
original Nokia n770 kernel source (kernel-source-2.6.16-2.6.16-osso29)
works. However, the brf6150.c that was added to the linux-omap tree on
the 8th feb 2006 (commit 9f43ca7f2eca4de6f145bc1d165df4a415546258)
does not (for this n770 anyway :).
In the linux-omap commit, there is a lot of new neat power management
code that uses two GPIOs: one for the host to signal the brf6150 when
to wake up and one for the brf6150 to signal the host to wake up.
The problem is that on the hardware I'm using these GPIOs do not
change, so the host never "wakes up", and consequently never schedules
packets to be transferred to the brf6150. I've tested the platform
GPIO library is working properly and appears to be.
The n770 code is configured to use the following brf6510 GPIOS:
reset:4, hostwake:61, btwake:194.
The attached patch forces this schedule, but isn't really a good patch
as the (non-functional) PM stuff is still in there.
Can anyone shed any light on this situation? Note that I am using the
brf6150fw.bin firmware binary from the
SU-18_2006SE_1.2006.26-8_PR_F5_MR0_ARM OS release.
The bluetooth firmware from SU-18_2006SE_2.2006.39-14_PR_F5_MR0_ARM is
corrupt (has loads of zero bytes at the start, which the code reveals
is invalid).
The bluetooth firmware from SU-18_2006SE_3.2006.49-2_PR_F5_MR0_ARM is
ALSO corrupt; this time its been truncated to 8192 bytes so the loader
runs off the end.
If this can't be resolved, and since I don't have any docs on the
brf6150 or newer firmware images, I'd be tempted to simply kill the PM
code since its not actually doing anything useful. I'd prefer to get
it to work though....
commit 3dd6f369919225473c77db006a60af0d1ca66ce4
Author: Andrew de Quincey <adq@xxxxxxxxxxxxx>
Date: Sat May 30 18:04:24 2009 +0100
schedule tx when packet submitted due to non-working power management GPIOs
diff --git a/drivers/bluetooth/brf6150.c b/drivers/bluetooth/brf6150.c
index 4f0112a..50caa74 100644
--- a/drivers/bluetooth/brf6150.c
+++ b/drivers/bluetooth/brf6150.c
@@ -187,6 +187,7 @@ static void brf6150_disable_pm_tx(struct brf6150_info *info)
}
if (gpio_get_value(info->btinfo->host_wakeup_gpio))
tasklet_schedule(&info->tx_task);
+ tasklet_schedule(&info->tx_task);
}
static void brf6150_pm_timer(unsigned long data)