|
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 |
|