@@ -506,6 +506,7 @@ static int hci_uart_tty_open(struct tty_struct *tty)
/* disable alignment support by default */
hu->alignment = 1;
hu->padding = 0;
+ hu->proto_data = 0;
INIT_WORK(&hu->init_ready, hci_uart_init_work);
INIT_WORK(&hu->write_work, hci_uart_write_work);
@@ -795,6 +796,15 @@ static int hci_uart_tty_ioctl(struct tty_struct *tty, unsigned int cmd,
err = hu->hdev_flags;
break;
+ case HCIUARTSETPROTODATA:
+ if (test_bit(HCI_UART_PROTO_SET, &hu->flags)) {
+ err = -EBUSY;
+ } else {
+ hu->proto_data = arg;
+ BT_DBG("HCIUARTSETPROTODATA %lu okay.", arg);
+ }
+ break;
+
default:
err = n_tty_ioctl_helper(tty, cmd, arg);
break;
@@ -18,6 +18,8 @@
#define HCIUARTGETDEVICE _IOR('U', 202, int)
#define HCIUARTSETFLAGS _IOW('U', 203, int)
#define HCIUARTGETFLAGS _IOR('U', 204, int)
+/* Used prior to HCIUARTSETPROTO */
+#define HCIUARTSETPROTODATA _IOW('U', 205, unsigned long)
/* UART protocols */
#define HCI_UART_MAX_PROTO 12
@@ -71,6 +73,7 @@ struct hci_uart {
struct work_struct init_ready;
struct work_struct write_work;
+ unsigned long proto_data;
const struct hci_uart_proto *proto;
struct percpu_rw_semaphore proto_lock; /* Stop work for proto close */
void *priv;
HCIUARTSETPROTODATA is introduced to specify protocol specific settings prior to HCIUARTSETPROTO, for protocal QCA, it is used by tool btattch to specify soc type. Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com> --- drivers/bluetooth/hci_ldisc.c | 10 ++++++++++ drivers/bluetooth/hci_uart.h | 3 +++ 2 files changed, 13 insertions(+)