|
From: Mattias A. <mat...@us...> - 2001-06-13 12:23:54
|
The following file was modified in apps/bluetooth/experimental:
Name Old version New version Comment
---- ----------- ----------- -------
bt_vendor.c 1.18 1.19=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
* added init_failed() which is run whenever init_stack fails. The behaviour
is vendor dependent e.g for CSR we try changing IF (H4<->BCSP)
* extracted some code to separate function (csr_disable_deep_sleep())
* moved change IF check from csr_init_hw to init_failed
* changed some debug
The diff of the modified file(s):
--- bt_vendor.c 2001/06/08 15:53:18 1.18
+++ bt_vendor.c 2001/06/13 12:23:54 1.19
@@ -155,6 +155,52 @@
}
}
=20
+
+/*=20
+ * This function tries to recover stack if init failed=20
+ * For now all other vendors but CSR is left to restart=20
+ * btd but later on auto_probe on baudrate could be done.
+ */
+
+void
+init_failed(int bt_cfd, int phys_fd, int spd)
+{
+
+ static int did_restart =3D 0; /* only try once */=20=20
+=20
+ if (did_restart)
+ {
+ syslog(LOG_INFO, "Init failed after second try, giving up...");
+ exit(1);
+ }
+
+ sleep(1);
+
+ switch (hw_vendor())
+ {
+ case HW_CSR_H4:
+ case HW_CSR_BCSP:
+=20=20=20=20
+ /* Try changing interface BCSP<->H4 */
+ csr_change_if(bt_cfd, phys_fd, spd);=20=20=20=20
+ did_restart =3D 1;
+
+ /* Restart btd */
+ kill(getpid(), 10);=20
+ break;
+=20=20=20=20
+ default:
+ /* Restart btd */
+ syslog(LOG_INFO, "Init failed, lets try restarting btd");
+ did_restart =3D 1;
+
+ /* Restart btd */
+ kill(getpid(), 10);=20=20=20
+ break;
+ }
+}
+
+
int
hw_vendor(void)
{
@@ -262,20 +308,34 @@
memcpy(ps_vals, &msg[CSR_PSKEY_MSGHDR_SIZE], n_pars*2);
}
=20
+
+int csr_disable_deep_sleep(int bt_cfd)
+{
+ unsigned short ps_parbuf;
+
+ /* Make sure uart deep sleep is disabled when using BCSP */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_GETREQ, &ps_parbuf, 1);
+=20=20
+ if (ps_parbuf !=3D 0)
+ {
+ syslog(LOG_INFO, "Disabling deep sleep timer");
+ ps_parbuf =3D 0; /* disable deep sleep timer */
+ csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
+ CSR_PSKEY_SETREQ, &ps_parbuf, 1);=20=20=20=20
+ return 1;
+ }
+ return 0;
+}
+
/*=20
* Switches host interface in CSR HW (H4<->BCSP)=20
*/
=20
void csr_change_if(int bt_cfd, int phys_fd, int spd)
{
- static int did_restart =3D 0; /* only try once */
- unsigned short ps_parbuf[10];
-=20=20
- if (did_restart)
- return;
=20
- shutdown_stack(bt_cfd);
- sleep(1);
+ unsigned short ps_parbuf[10];
=20=20=20
if (hw_vendor() =3D=3D HW_CSR_H4)
{
@@ -298,17 +358,10 @@
=20
/* Make sure that deep sleep timer is disabled to=20
prevent problems when setting new ps keys */
- csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
- CSR_PSKEY_GETREQ, ps_parbuf, 1);
=20=20=20=20=20
- if (ps_parbuf[0] !=3D 0)
+ if (csr_disable_deep_sleep(bt_cfd))
{
- syslog(LOG_INFO, "Disabling deep sleep timer");
- ps_parbuf[0] =3D 0; /* disable deep sleep timer */
- csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
- CSR_PSKEY_SETREQ, ps_parbuf, 1);
reset_hw();
-
if (ioctl(bt_cfd, BTINITBCSP) < 0)
{
perror(__FUNCTION__);
@@ -355,11 +408,18 @@
fd_setup(phys_fd, 115200, USE_FLOW_CTRL, DONT_USE_BCSP);
=20
reset_hw();=20=20=20=20
+
sleep(1);
=20
/* Initialize stack */
init_stack(bt_cfd, spd);
=20
+ if (csr_disable_deep_sleep(bt_cfd))
+ {
+ reset_hw();
+ init_stack(bt_cfd, spd); /* reinitialize */
+ }
+
/* Read params for ps key PSKEY_HOSTIO_UART_PS_BLOCK */
csr_pskey(bt_cfd, PSKEY_HOSTIO_UART_PS_BLOCK,=20
CSR_PSKEY_GETREQ, ps_parbuf, 10);
@@ -387,11 +447,6 @@
syslog(LOG_ERR, __FUNCTION__ ": Unknown PS key parameter: %d", ps_pa=
rbuf[1]);
}
}
-
- did_restart =3D 1; /* Only try once */
-
- /* Restart btd */
- kill(getpid(), 10);
}
=20
/* fixme -- remove hardcoded values */
@@ -401,55 +456,25 @@
/* Connection setup, all devices, no auto accept */
unsigned char filter[3] =3D { 0x02, 0x00, 0x01 };
unsigned int wrscan =3D (PAGE_SCAN_ENABLE | INQUIRY_SCAN_ENABLE);
- unsigned char bd[6];
-=20=20
- /* Now test whether stack initialized ok
- Try reading local BD address */
-
- read_local_bd(bt_cfd, bd);
-=20=20
- if ((bd[0] =3D=3D 0) && (bd[1] =3D=3D 0) &&=20
- (bd[2] =3D=3D 0) && (bd[3] =3D=3D 0) &&
- (bd[4] =3D=3D 0) && (bd[5] =3D=3D 0))
- {
- syslog(LOG_INFO, "Stack failed to initialize, try changing interface");
- csr_change_if(bt_cfd, phys_fd, spd);
- }
-
- if (hw_vendor() =3D=3D HW_CSR_BCSP)
- {
- unsigned short ps_parbuf;
- /* Make sure uart deep sleep is disabled when using BCSP */
- csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
- CSR_PSKEY_GETREQ, &ps_parbuf, 1);
=20=20=20=20=20
- if (ps_parbuf !=3D 0)
- {
- syslog(LOG_INFO, "Disabling deep sleep timer");
- ps_parbuf =3D 0; /* disable deep sleep timer */
- csr_pskey(bt_cfd, PSKEY_UART_SLEEP_TIMEOUT,=20
- CSR_PSKEY_SETREQ, &ps_parbuf, 1);
-=20=20=20=20=20=20
- /* Restart btd */
- kill(getpid(), 10);
- }
- }
+ if ((hw_vendor() =3D=3D HW_CSR_BCSP) && (csr_disable_deep_sleep(bt_cfd)))
+ kill(getpid(), 10); /* Restart btd (and HW) to activate changes */
=20
- D(syslog(LOG_INFO, "Setting write_scan_enable in CSR module!"));
+ D(syslog(LOG_INFO, "Setting write_scan_enable in CSR module"));
=20
bt_write_scan_enable(bt_cfd, wrscan);
=20=20=20
/* improves reliability when doing a connect */
- D(syslog(LOG_INFO, "Setting write_pagescan_activity in CSR module!"));
+ D(syslog(LOG_INFO, "Setting write_pagescan_activity in CSR module"));
=20
bt_write_pagescan_activity(bt_cfd, 0x0800, 0x12);
=20
bt_set_event_filter(bt_cfd, filter);
=20
- D(syslog(LOG_INFO, "Setting baudrate in CSR module!"));
-
sleep(1);
=20=20=20
+ D(syslog(LOG_INFO, "Setting baudrate in CSR module [%d baud]", spd));
+
bt_set_baudrate(bt_cfd, spd);
=20
/* Now set phys device speed to whatever HW was set to use */
@@ -523,7 +548,7 @@
=20
sleep(1); // wait for HW...
=20
- D(syslog(LOG_INFO, "Setting baudrate in Ericsson module!"));
+ D(syslog(LOG_INFO, "Setting baudrate in Ericsson module"));
bt_set_baudrate(bt_cfd, spd);
usleep(10000);
=20
@@ -547,11 +572,11 @@
unsigned int wrscan =3D (PAGE_SCAN_ENABLE | INQUIRY_SCAN_ENABLE);
=20=20=20
sleep(1);
- D(syslog(LOG_INFO, "Setting write_scan_enable in Infineon module!"));
+ D(syslog(LOG_INFO, "Setting write_scan_enable in Infineon module"));
bt_write_scan_enable(bt_cfd, wrscan);
=20
sleep(1); // wait for HW...=20
- D(syslog(LOG_INFO, "Setting baudrate in Infineon module!"));
+ D(syslog(LOG_INFO, "Setting baudrate in Infineon module"));
bt_set_baudrate(bt_cfd, spd);
=20=20=20
/* Now set phys device speed to whatever HW was set to use */
@@ -576,12 +601,12 @@
unsigned char filter[3] =3D { 0x02, 0x00, 0x01 };
unsigned int wrscan =3D (PAGE_SCAN_ENABLE | INQUIRY_SCAN_ENABLE);
=20
- D(syslog(LOG_INFO, "Setting write_scan_enable in USB module!"));
+ D(syslog(LOG_INFO, "Setting write_scan_enable in USB module"));
=20
bt_write_scan_enable(bt_cfd, wrscan);
=20=20=20
/* improves reliability when doing a connect */
- D(syslog(LOG_INFO, "Setting write_pagescan_activity in USB module!"));
+ D(syslog(LOG_INFO, "Setting write_pagescan_activity in USB module"));
=20
bt_write_pagescan_activity(bt_cfd, 0x0800, 0x12);
=20
@@ -607,7 +632,7 @@
unsigned char filter[3] =3D { 0x02, 0x00, 0x01 };
unsigned int wrscan =3D (PAGE_SCAN_ENABLE | INQUIRY_SCAN_ENABLE);
=20
- D(syslog(LOG_INFO, "Setting write_scan_enable in generic module!"));
+ D(syslog(LOG_INFO, "Setting write_scan_enable in generic module"));
=20=20=20
bt_write_scan_enable(bt_cfd, wrscan);
bt_set_event_filter(bt_cfd, filter);
|