Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 325575
b: refs/heads/master
c: 62f228a
h: refs/heads/master
i:
  325573: dffe43b
  325571: c4c586c
  325567: cf75ad9
v: v3
  • Loading branch information
Jiri Slaby authored and Greg Kroah-Hartman committed Jun 12, 2012
1 parent 333d336 commit 11a3bf9
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 43 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e673927d8a210ab1db27047080fc1bdb47f7e372
refs/heads/master: 62f228acb807c370c3b1583bf0f1aa4ab8e19aca
1 change: 0 additions & 1 deletion trunk/include/net/irda/ircomm_tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ struct ircomm_tty_cb {

int state; /* Connect state */

struct tty_struct *tty;
struct ircomm_cb *ircomm; /* IrCOMM layer instance */

struct sk_buff *tx_skb; /* Transmit buffer */
Expand Down
5 changes: 0 additions & 5 deletions trunk/net/irda/ircomm/ircomm_param.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,6 @@ pi_param_info_t ircomm_param_info = { pi_major_call_table, 3, 0x0f, 4 };
*/
int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
{
struct tty_struct *tty;
unsigned long flags;
struct sk_buff *skb;
int count;
Expand All @@ -109,10 +108,6 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
IRDA_ASSERT(self != NULL, return -1;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);

tty = self->tty;
if (!tty)
return 0;

/* Make sure we don't send parameters for raw mode */
if (self->service_type == IRCOMM_3_WIRE_RAW)
return 0;
Expand Down
62 changes: 39 additions & 23 deletions trunk/net/irda/ircomm/ircomm_tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -242,18 +242,15 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
*
*/
static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
struct file *filp)
struct tty_struct *tty, struct file *filp)
{
DECLARE_WAITQUEUE(wait, current);
int retval;
int do_clocal = 0, extra_count = 0;
unsigned long flags;
struct tty_struct *tty;

IRDA_DEBUG(2, "%s()\n", __func__ );

tty = self->tty;

/*
* If non-blocking mode is set, or the port is not enabled,
* then make the check up front and then exit.
Expand Down Expand Up @@ -412,8 +409,8 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
self->port.count++;

tty->driver_data = self;
self->tty = tty;
spin_unlock_irqrestore(&self->port.lock, flags);
tty_port_tty_set(&self->port, tty);

IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name,
self->line, self->port.count);
Expand Down Expand Up @@ -467,7 +464,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
if (ret)
return ret;

ret = ircomm_tty_block_til_ready(self, filp);
ret = ircomm_tty_block_til_ready(self, tty, filp);
if (ret) {
IRDA_DEBUG(2,
"%s(), returning after block_til_ready with %d\n", __func__ ,
Expand Down Expand Up @@ -548,7 +545,6 @@ static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)

spin_lock_irqsave(&self->port.lock, flags);
tty->closing = 0;
self->tty = NULL;

if (self->port.blocked_open) {
if (self->port.close_delay) {
Expand All @@ -562,6 +558,7 @@ static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
self->port.flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
spin_unlock_irqrestore(&self->port.lock, flags);
wake_up_interruptible(&self->port.close_wait);
tty_port_tty_set(&self->port, NULL);
}

/*
Expand Down Expand Up @@ -604,7 +601,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
if (!self || self->magic != IRCOMM_TTY_MAGIC)
return;

tty = self->tty;
tty = tty_port_tty_get(&self->port);
if (!tty)
return;

Expand All @@ -625,7 +622,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
}

if (tty->hw_stopped)
return;
goto put;

/* Unlink transmit buffer */
spin_lock_irqsave(&self->spinlock, flags);
Expand All @@ -644,6 +641,8 @@ static void ircomm_tty_do_softint(struct work_struct *work)

/* Check if user (still) wants to be waken up */
tty_wakeup(tty);
put:
tty_kref_put(tty);
}

/*
Expand Down Expand Up @@ -1004,7 +1003,11 @@ static void ircomm_tty_hangup(struct tty_struct *tty)

spin_lock_irqsave(&self->port.lock, flags);
self->port.flags &= ~ASYNC_NORMAL_ACTIVE;
self->tty = NULL;
if (self->port.tty) {
set_bit(TTY_IO_ERROR, &self->port.tty->flags);
tty_kref_put(self->port.tty);
}
self->port.tty = NULL;
self->port.count = 0;
spin_unlock_irqrestore(&self->port.lock, flags);

Expand Down Expand Up @@ -1068,7 +1071,7 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
IRDA_ASSERT(self != NULL, return;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);

tty = self->tty;
tty = tty_port_tty_get(&self->port);

status = self->settings.dce;

Expand All @@ -1089,10 +1092,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
tty_hangup(tty);

/* Hangup will remote the tty, so better break out */
return;
goto put;
}
}
if (self->port.flags & ASYNC_CTS_FLOW) {
if (tty && self->port.flags & ASYNC_CTS_FLOW) {
if (tty->hw_stopped) {
if (status & IRCOMM_CTS) {
IRDA_DEBUG(2,
Expand All @@ -1103,7 +1106,7 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
wake_up_interruptible(&self->port.open_wait);

schedule_work(&self->tqueue);
return;
goto put;
}
} else {
if (!(status & IRCOMM_CTS)) {
Expand All @@ -1113,6 +1116,8 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
}
}
}
put:
tty_kref_put(tty);
}

/*
Expand All @@ -1125,14 +1130,16 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
struct sk_buff *skb)
{
struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
struct tty_struct *tty;

IRDA_DEBUG(2, "%s()\n", __func__ );

IRDA_ASSERT(self != NULL, return -1;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
IRDA_ASSERT(skb != NULL, return -1;);

if (!self->tty) {
tty = tty_port_tty_get(&self->port);
if (!tty) {
IRDA_DEBUG(0, "%s(), no tty!\n", __func__ );
return 0;
}
Expand All @@ -1143,7 +1150,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
* Devices like WinCE can do this, and since they don't send any
* params, we can just as well declare the hardware for running.
*/
if (self->tty->hw_stopped && (self->flow == FLOW_START)) {
if (tty->hw_stopped && (self->flow == FLOW_START)) {
IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ );
ircomm_param_request(self, IRCOMM_POLL, TRUE);

Expand All @@ -1156,8 +1163,9 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
* Use flip buffer functions since the code may be called from interrupt
* context
*/
tty_insert_flip_string(self->tty, skb->data, skb->len);
tty_flip_buffer_push(self->tty);
tty_insert_flip_string(tty, skb->data, skb->len);
tty_flip_buffer_push(tty);
tty_kref_put(tty);

/* No need to kfree_skb - see ircomm_ttp_data_indication() */

Expand Down Expand Up @@ -1208,28 +1216,33 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
IRDA_ASSERT(self != NULL, return;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);

tty = self->tty;
tty = tty_port_tty_get(&self->port);

switch (cmd) {
case FLOW_START:
IRDA_DEBUG(2, "%s(), hw start!\n", __func__ );
tty->hw_stopped = 0;
if (tty)
tty->hw_stopped = 0;

/* ircomm_tty_do_softint will take care of the rest */
schedule_work(&self->tqueue);
break;
default: /* If we get here, something is very wrong, better stop */
case FLOW_STOP:
IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ );
tty->hw_stopped = 1;
if (tty)
tty->hw_stopped = 1;
break;
}

tty_kref_put(tty);
self->flow = cmd;
}

#ifdef CONFIG_PROC_FS
static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
{
struct tty_struct *tty;
char sep;

seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]);
Expand Down Expand Up @@ -1356,9 +1369,12 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
seq_printf(m, "Max data size: %d\n", self->max_data_size);
seq_printf(m, "Max header size: %d\n", self->max_header_size);

if (self->tty)
tty = tty_port_tty_get(&self->port);
if (tty) {
seq_printf(m, "Hardware: %s\n",
self->tty->hw_stopped ? "Stopped" : "Running");
tty->hw_stopped ? "Stopped" : "Running");
tty_kref_put(tty);
}
}

static int ircomm_tty_proc_show(struct seq_file *m, void *v)
Expand Down
33 changes: 25 additions & 8 deletions trunk/net/irda/ircomm/ircomm_tty_attach.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,8 @@ static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
*/
int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
{
struct tty_struct *tty;

IRDA_DEBUG(0, "%s()\n", __func__ );

IRDA_ASSERT(self != NULL, return -1;);
Expand All @@ -142,7 +144,11 @@ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
}

/* Make sure nobody tries to write before the link is up */
self->tty->hw_stopped = 1;
tty = tty_port_tty_get(&self->port);
if (tty) {
tty->hw_stopped = 1;
tty_kref_put(tty);
}

ircomm_tty_ias_register(self);

Expand Down Expand Up @@ -398,23 +404,26 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap,
struct sk_buff *skb)
{
struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
struct tty_struct *tty;

IRDA_DEBUG(2, "%s()\n", __func__ );

IRDA_ASSERT(self != NULL, return;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);

if (!self->tty)
tty = tty_port_tty_get(&self->port);
if (!tty)
return;

/* This will stop control data transfers */
self->flow = FLOW_STOP;

/* Stop data transfers */
self->tty->hw_stopped = 1;
tty->hw_stopped = 1;

ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL,
NULL);
tty_kref_put(tty);
}

/*
Expand Down Expand Up @@ -550,12 +559,15 @@ void ircomm_tty_connect_indication(void *instance, void *sap,
*/
void ircomm_tty_link_established(struct ircomm_tty_cb *self)
{
struct tty_struct *tty;

IRDA_DEBUG(2, "%s()\n", __func__ );

IRDA_ASSERT(self != NULL, return;);
IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);

if (!self->tty)
tty = tty_port_tty_get(&self->port);
if (!tty)
return;

del_timer(&self->watchdog_timer);
Expand All @@ -569,17 +581,19 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
if ((self->port.flags & ASYNC_CTS_FLOW) &&
((self->settings.dce & IRCOMM_CTS) == 0)) {
IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ );
return;
goto put;
} else {
IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ );

self->tty->hw_stopped = 0;
tty->hw_stopped = 0;

/* Wake up processes blocked on open */
wake_up_interruptible(&self->port.open_wait);
}

schedule_work(&self->tqueue);
put:
tty_kref_put(tty);
}

/*
Expand Down Expand Up @@ -983,9 +997,12 @@ static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
self->settings.dce = IRCOMM_DELTA_CD;
ircomm_tty_check_modem_status(self);
} else {
struct tty_struct *tty = tty_port_tty_get(&self->port);
IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ );
if (self->tty)
tty_hangup(self->tty);
if (tty) {
tty_hangup(tty);
tty_kref_put(tty);
}
}
break;
default:
Expand Down
Loading

0 comments on commit 11a3bf9

Please sign in to comment.