|
From: Willy S. <sag...@us...> - 2002-04-08 16:45:40
|
The following file was modified in linux/drivers/char/bluetooth:
Name Old version New version Tag Comment
---- ----------- ----------- --- -------
bluetooth.c 1.225 1.226=20=20=20=20=20=20=20=20=20=20=20=20=20
The accompanying log:
Added READCLOCKOFFSET HCIPARKMODE HCISNIFFMODE WRITELINKPOLICY HCIHOLDMODE =
HCIREADNUMBROADCASTRETRANS HCIREADTRANSMITTPOWERLEVEL HCIREADRSSI HCIWRITEP=
AGETO
The diff of the modified file(s):
--- bluetooth.c 8 Mar 2002 09:41:42 -0000 1.225
+++ bluetooth.c 8 Apr 2002 09:15:21 -0000 1.226
@@ -46,7 +46,8 @@
#include <linux/termios.h>
#include <linux/tty.h>
#include <linux/module.h>
-#include <linux/malloc.h>
+//#include <linux/malloc.h>
+#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/timer.h>
@@ -535,6 +536,7 @@
}
}=09
=20
+=09
switch (cmd) {
case BT_SDP_REQUEST:
{
@@ -802,6 +804,31 @@
hci_set_connection_encryption_bd(param + 1, *param);
break;
}
+
+ case HCIREADCLOCKOFFSET:
+ {
+ /* Return parameters (4 bytes):
+ * | 2 bytes CLOCK OFFSET | 1 byte tmp | 2 bytes unused |
+ * if tmp < 0 then not valid CLOCK OFFSET=20
+ * else valid CLOCK OFFSET
+ */
+ u32 con_hdl;
+ s32 result;
+ u8 param[2];
+
+ BT_DRIVER(__FUNCTION__ ": HCIREADCLOCKOFFSET\n");=09
+
+ copy_from_user(param, (u8*)arg, 2);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff&(param[0]<<8));
+
+ result =3D hci_read_clock_offset(con_hdl);
+ put_user(result, (s32*)arg);
+ break;
+
+ }
+
+
+
/* Link Policy Commands */
=20=09
case HCISWITCHROLE:
@@ -814,6 +841,106 @@
break;
}
=20
+ case HCIPARKMODE:
+ {
+ /* Packet format received (6 bytes) params =3D
+ * | 2 bytes Con Hdl | 2 bytes Beacon Max Int | 2 bytes Beacon Min Int |
+ */
+ s32 result;
+ u8 param[6];
+ u16 con_hdl;
+ u16 Beacon_Max_Int, Beacon_Min_Int;
+
+ BT_DRIVER(__FUNCTION__ ": HCI_PARK_MODE\n");
+ copy_from_user(param, (u8*)arg, 6);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff00&(param[0]<<8));
+ Beacon_Max_Int =3D (0x0ff¶m[3]) + (0x0ff00&(param[2]<<8));=09=09
+ Beacon_Min_Int =3D (0x0ff¶m[5]) + (0x0ff00&(param[4]<<8));
+=09=09
+ result =3D hci_park_mode(con_hdl, Beacon_Max_Int, Beacon_Min_Int);
+ put_user(result, (s32*)arg);
+ break;
+ }
+
+
+ case HCISNIFFMODE:
+ {
+ /* Packet format received (10 bytes) params =3D
+ * | 2 bytes Con Hdl | 2 bytes Sniff Max Int | 2 bytes Sniff Min Int |
+ * 2 bytes Sniff_Attempt | 2 bytes Sniff_Timeout=20
+ */
+ s32 result;
+ u8 param[10];
+ u16 con_hdl;
+ u16 Sniff_Max_Int, Sniff_Min_Int, Sniff_Attempt, Sniff_Timeout;
+
+ BT_DRIVER(__FUNCTION__ ": HCI_PARK_MODE\n");
+ copy_from_user(param, (u8*)arg, 10);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff00&(param[0]<<8));
+ Sniff_Max_Int =3D (0x0ff¶m[3]) + (0x0ff00&(param[2]<<8));=09=09
+ Sniff_Min_Int =3D (0x0ff¶m[5]) + (0x0ff00&(param[4]<<8));
+ Sniff_Attempt =3D (0x0ff¶m[7]) + (0x0ff00&(param[6]<<8));
+ Sniff_Timeout =3D (0x0ff¶m[9]) + (0x0ff00&(param[8]<<8));
+=09=09
+ result =3D hci_sniff_mode(con_hdl, Sniff_Max_Int, Sniff_Min_Int, Sniff_A=
ttempt, Sniff_Timeout);
+ put_user(result, (s32*)arg);
+ break;
+ }
+
+ case HCIEXITPARKMODE:
+ {=09
+ s32 result;
+ u16 con_hdl;
+=20=20
+ BT_DRIVER(__FUNCTION__ ": HCI_EXIT_PARK_MODE\n");
+ GET_USER(con_hdl,(u16*)arg);
+=20=20=20=20=20=20=20=20=20=20=20=20=20
+ result =3D hci_exit_park_mode(con_hdl);
+ put_user(result, (s32*)arg);
+ break;
+ }
+
+ case HCIWRITELINKPOLICYSETTINGS:
+ {
+ /* Packet format received (4 bytes) params =3D
+ * | 2 bytes Con Hdl | 2 bytes Link Policy Settings
+ */
+ s32 result;
+ u16 con_hdl;
+ u16 link_policy_settings;
+ u8 param[4];
+
+ copy_from_user(param, (u8*)arg, 4);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff00&(param[0]<<8));
+ link_policy_settings =3D (0x0ff¶m[3]) + (0x0ff00&(param[2]=
<<8));=09
+
+ result =3D hci_write_link_policy_settings(con_hdl, link_po=
licy_settings);
+ put_user(result, (s32*)arg);
+ break;
+ }
+
+ case HCIHOLDMODE:
+ {
+ /* Packet format received (6 bytes) params =3D
+ * | 2 bytes Con Hdl | 2 bytes Hold Mode Max Interval | 2 bytes =
Hold Mode Max Interval | 2 bytes Hold Mode Min Interval
+ */
+ s32 result;
+ u16 con_hdl;
+ u16 hold_mode_max_interval;
+ u16 hold_mode_min_interval;
+ u8 param[6];
+
+ copy_from_user(param, (u8*)arg, 4);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff00&(param[0]<<8));
+ hold_mode_max_interval =3D (0x0ff¶m[3]) + (0x0ff00&(par=
am[2]<<8));=09
+ hold_mode_min_interval =3D (0x0ff¶m[5]) + (0x0ff00&(par=
am[4]<<8));
+
+ result =3D hci_hold_mode(con_hdl, hold_mode_max_interval, h=
old_mode_min_interval);=09
+
+ put_user(result, (s32*)arg);
+ break;=20=20=20=20=20=20=20=20=20=20=20=20=20=20
+ }
+
/* Host Controller & Baseband Commands */
=20
case HCIRESET:
@@ -972,11 +1099,89 @@
=20
/* The size of the filter is in the first two bytes */
filter_size =3D ((param[0] << 8) & 0xff00) | param [1];
-
hci_set_event_filter(¶m[2], filter_size);
break;
}=09
=20=09=09
+ case HCIREADNUMBROADCASTRETRANSMISSIONS:
+ {
+ u8 num_broadcast_retran[2];
+ s32 result;
+=20
+ BT_DRIVER(__FUNCTION__ ": HCIREADNUMBROACASTRETRANSMISSIONS\n");
+ result =3D hci_read_num_broadcast_restransmissions();
+ num_broadcast_retran[0] =3D (u8)(0x0ff&result);
+ num_broadcast_retran[1] =3D (u8)(0x0ff&(result>>8));
+ copy_to_user((u8*)arg, num_broadcast_retran, 2);
+ break;
+ }
+
+ case HCIWRITENUMBROADCASTRETRANSMISSIONS:
+ {
+ u8 status;
+ u8 num_broadcast_retran;
+ u32 result;
+
+ BT_DRIVER(__FUNCTION__ ": HCIREADNUMBROACASTRETRANSMISSIONS\n");
+ GET_USER(num_broadcast_retran, (u8*)arg);
+ result =3D hci_write_num_broadcast_restransmissions(num_broadcast_retran=
);
+ status =3D (u8)(0x0ff&result);
+ put_user(status, (u8*)arg);
+ break;
+ }
+ case HCIREADTRANSMITPOWERLEVEL:
+ {
+ /* Packet received format:
+ * | 2 bytes Connection Handle | 1 bite Type |
+ * Packet transmitted format:
+ * | 1 byte status | 1 byte Transmit Power Level | 1 byte unused |
+ */
+ u8 param[3];
+ u32 con_hdl;
+ u8 type;
+ s32 result;
+=09=09
+ BT_DRIVER(__FUNCTION__ ": HCIREADTRANSMITPOWERLEVEL\n");
+ copy_from_user(param, (u8*)arg, 3);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff&(param[0]<<8));
+ type =3D param[2];
+ result =3D hci_read_power_transmit_level(con_hdl, type);
+ param[0] =3D (0x0ff&result);
+ param[1] =3D 0x0ff&(result>>8);
+ copy_to_user((u8*)arg, param, 3);
+ break;
+ }
+
+
+ case HCIWRITELINKSUPERVISIONTO:
+ {
+ /* The vector param[2] is:
+ * param[0] =3D Connection Handle
+ * param[1] =3D Link Supervision Timeout
+ */
+ u32 param[2];
+ s32 result;
+
+ BT_DRIVER(__FUNCTION__ ": HCIWRITELINKSUPERVISIONTO\n");
+ copy_from_user(param, (u32*)arg, 8);
+ result =3D hci_write_link_supervision_to(param[0], param[1],1);
+ param[0] =3D result;
+ put_user(param[0], (u32*)arg);
+ break;
+ }
+=20=09=09
+ case HCIWRITEPAGETO:
+ {
+ u32 page_to;
+ s32 result;
+
+ BT_DRIVER(__FUNCTION__ ": HCIWRITEPAGETO\n");
+ GET_USER(page_to, (u32*)arg);
+ result =3D hci_write_page_to(page_to);
+ put_user(result, (s32*)arg);
+ break;
+ }
+
/* Informational Parameters */
=20
case HCIREADLOCALBDADDR:
@@ -996,6 +1201,30 @@
break;
}
=20
+ /* Status Parameters */
+ case HCIREADRSSI:
+ {
+ /* Return parameters (4 bytes):
+ * | 1 byte RSSI | 1 byte tmp | 2 bytes unused |
+ * if tmp < 0 then not valid RSSI=20
+ * else valid RSSI
+ */
+ u32 con_hdl;
+ u8 param[2];
+
+ BT_DRIVER(__FUNCTION__ ": HCIREADRSSI\n");
+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20
+ copy_from_user(param, (u8*)arg, 2);
+ con_hdl =3D (0x0ff¶m[1]) + (0x0ff&(param[0]<<8));
+
+ GET_USER(con_hdl, (u32*)arg);
+ tmp =3D hci_read_rssi(con_hdl);
+ put_user(tmp, (s32*)arg);
+=09=09=20=20
+ break;
+ }
+=20
+
case HCIREADCOUNTRYCODE:
BT_DRIVER(__FUNCTION__ ": HCIREADCOUNTRYCODE\n");
=20=09=09
@@ -1192,10 +1421,29 @@
#ifdef CONFIG_BLUETOOTH_PAN
case BNEPCONNECT:
{
+ s32 tmp;
+ u8 result[4];
+
copy_from_user(&bd_addr, (s32*)arg, size);
BT_DRIVER("BNEP connection to %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
bd_addr[0],bd_addr[1],bd_addr[2],bd_addr[3],bd_addr[4],bd_addr[5]);
- return bnep_connect_req(bd_addr);
+ tmp =3D bnep_connect_req(bd_addr);
+
+ result[0] =3D (tmp>>8)&0x0ff; // conn hdl
+ result[1] =3D (tmp>>16)&0x0ff; // conn hdl
+ result[2] =3D (tmp>>24)&0x0ff; // BNEP interface number
+
+ copy_to_user((s32*)arg, (u8*)result, 4);
+ return 0x0ff&tmp;
+ }
+
+ case BNEPDISCONNECT:
+ {
+ copy_from_user(&bd_addr, (s32*)arg, size);
+ BT_DRIVER("BNEP DISconnection from %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
+ bd_addr[0],bd_addr[1],bd_addr[2],bd_addr[3],bd_addr[4],bd_addr[5]);
+=20
+ return bnep_disconnect_req(bd_addr);
}
=20
#ifdef CONFIG_BLUETOOTH_UNPLUG_TEST
@@ -2494,6 +2742,7 @@
procfs_status =3D proc_register_dynamic(&proc_root, &bt_proc_doit);
#endif /* LINUX_VERSION_CODE */
=20
+
if (procfs_status < 0) {
D_ERR("Could not register proc file bt_status %d\n",=20
procfs_status);
@@ -2505,6 +2754,14 @@
D_ERR("Could not register proc file bnep_status %d\n",
procfs_status);
}
+#ifdef BNEP_PROC
+ procfs_status =3D bnep_create_proc_file();
+ if (procfs_status < 0) {
+ D_ERR("Could not register proc file bnep_proc %d\n",
+ procfs_status);
+ }
+
+#endif
#endif /* CONFIG_BLUETOOTH_PAN */
=20
#endif /* CONFIG_BLUETOOTH_PROC */
|