Lines 58-63
struct rfcomm_dev {
Link Here
|
58 |
uint modem_status; |
58 |
uint modem_status; |
59 |
|
59 |
|
60 |
struct rfcomm_dlc *dlc; |
60 |
struct rfcomm_dlc *dlc; |
|
|
61 |
wait_queue_head_t conn_wait; |
61 |
|
62 |
|
62 |
struct device *tty_dev; |
63 |
struct device *tty_dev; |
63 |
|
64 |
|
Lines 124-130
static int rfcomm_dev_activate(struct tt
Link Here
|
124 |
{ |
125 |
{ |
125 |
struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port); |
126 |
struct rfcomm_dev *dev = container_of(port, struct rfcomm_dev, port); |
126 |
|
127 |
|
127 |
return rfcomm_dlc_open(dev->dlc, &dev->src, &dev->dst, dev->channel); |
128 |
DEFINE_WAIT(wait); |
|
|
129 |
int err; |
130 |
|
131 |
err = rfcomm_dlc_open(dev->dlc, &dev->src, &dev->dst, dev->channel); |
132 |
if (err) |
133 |
return err; |
134 |
|
135 |
while (1) { |
136 |
prepare_to_wait(&dev->conn_wait, &wait, TASK_INTERRUPTIBLE); |
137 |
|
138 |
if (dev->dlc->state == BT_CLOSED) { |
139 |
err = -dev->err; |
140 |
break; |
141 |
} |
142 |
|
143 |
if (dev->dlc->state == BT_CONNECTED) |
144 |
break; |
145 |
|
146 |
if (signal_pending(current)) { |
147 |
err = -ERESTARTSYS; |
148 |
break; |
149 |
} |
150 |
|
151 |
tty_unlock(tty); |
152 |
schedule(); |
153 |
tty_lock(tty); |
154 |
} |
155 |
|
156 |
finish_wait(&dev->conn_wait, &wait); |
157 |
|
158 |
if (!err) |
159 |
device_move(dev->tty_dev, rfcomm_get_device(dev), |
160 |
DPM_ORDER_DEV_AFTER_PARENT); |
161 |
|
162 |
return err; |
128 |
} |
163 |
} |
129 |
|
164 |
|
130 |
/* we block the open until the dlc->state becomes BT_CONNECTED */ |
165 |
/* we block the open until the dlc->state becomes BT_CONNECTED */ |
Lines 151-157
static const struct tty_port_operations
Link Here
|
151 |
.destruct = rfcomm_dev_destruct, |
186 |
.destruct = rfcomm_dev_destruct, |
152 |
.activate = rfcomm_dev_activate, |
187 |
.activate = rfcomm_dev_activate, |
153 |
.shutdown = rfcomm_dev_shutdown, |
188 |
.shutdown = rfcomm_dev_shutdown, |
154 |
.carrier_raised = rfcomm_dev_carrier_raised, |
|
|
155 |
}; |
189 |
}; |
156 |
|
190 |
|
157 |
static struct rfcomm_dev *__rfcomm_dev_get(int id) |
191 |
static struct rfcomm_dev *__rfcomm_dev_get(int id) |
Lines 258-263
static int rfcomm_dev_add(struct rfcomm_
Link Here
|
258 |
|
292 |
|
259 |
tty_port_init(&dev->port); |
293 |
tty_port_init(&dev->port); |
260 |
dev->port.ops = &rfcomm_port_ops; |
294 |
dev->port.ops = &rfcomm_port_ops; |
|
|
295 |
init_waitqueue_head(&dev->conn_wait); |
261 |
|
296 |
|
262 |
skb_queue_head_init(&dev->pending); |
297 |
skb_queue_head_init(&dev->pending); |
263 |
|
298 |
|
Lines 576-587
static void rfcomm_dev_state_change(stru
Link Here
|
576 |
BT_DBG("dlc %p dev %p err %d", dlc, dev, err); |
611 |
BT_DBG("dlc %p dev %p err %d", dlc, dev, err); |
577 |
|
612 |
|
578 |
dev->err = err; |
613 |
dev->err = err; |
579 |
if (dlc->state == BT_CONNECTED) { |
614 |
wake_up_interruptible(&dev->conn_wait); |
580 |
device_move(dev->tty_dev, rfcomm_get_device(dev), |
615 |
|
581 |
DPM_ORDER_DEV_AFTER_PARENT); |
616 |
if (dlc->state == BT_CLOSED) |
582 |
|
|
|
583 |
wake_up_interruptible(&dev->port.open_wait); |
584 |
} else if (dlc->state == BT_CLOSED) |
585 |
tty_port_tty_hangup(&dev->port, false); |
617 |
tty_port_tty_hangup(&dev->port, false); |
586 |
} |
618 |
} |
587 |
|
619 |
|
Lines 1104-1110
int __init rfcomm_init_ttys(void)
Link Here
|
1104 |
rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL; |
1136 |
rfcomm_tty_driver->subtype = SERIAL_TYPE_NORMAL; |
1105 |
rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; |
1137 |
rfcomm_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; |
1106 |
rfcomm_tty_driver->init_termios = tty_std_termios; |
1138 |
rfcomm_tty_driver->init_termios = tty_std_termios; |
1107 |
rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL; |
1139 |
rfcomm_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; |
1108 |
rfcomm_tty_driver->init_termios.c_lflag &= ~ICANON; |
1140 |
rfcomm_tty_driver->init_termios.c_lflag &= ~ICANON; |
1109 |
tty_set_operations(rfcomm_tty_driver, &rfcomm_ops); |
1141 |
tty_set_operations(rfcomm_tty_driver, &rfcomm_ops); |
1110 |
|
1142 |
|