Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 11d85d7b authored by Alan Cox's avatar Alan Cox Committed by Live-CD User
Browse files

isicom: split the open method for the isicom device



Again moving towards being able to add a common open method

Signed-off-by: default avatarAlan Cox <alan@linux.intel.com>
parent a509a7e4
Loading
Loading
Loading
Loading
+24 −8
Original line number Diff line number Diff line
@@ -846,36 +846,52 @@ static int isicom_carrier_raised(struct tty_port *port)
	return (ip->status & ISI_DCD)?1 : 0;
}

static int isicom_open(struct tty_struct *tty, struct file *filp)
static struct tty_port *isicom_find_port(struct tty_struct *tty)
{
	struct isi_port *port;
	struct isi_board *card;
	unsigned int board;
	int error, line;
	int line = tty->index;

	line = tty->index;
	if (line < 0 || line > PORT_COUNT-1)
		return -ENODEV;
		return NULL;
	board = BOARD(line);
	card = &isi_card[board];

	if (!(card->status & FIRMWARE_LOADED))
		return -ENODEV;
		return NULL;

	/*  open on a port greater than the port count for the card !!! */
	if (line > ((board * 16) + card->port_count - 1))
		return -ENODEV;
		return NULL;

	port = &isi_ports[line];
	if (isicom_paranoia_check(port, tty->name, "isicom_open"))
		return -ENODEV;
		return NULL;

	return &port->port;
}
	
static int isicom_open(struct tty_struct *tty, struct file *filp)
{
	struct isi_port *port;
	struct isi_board *card;
	struct tty_port *tport;
	int error = 0;

	tport = isicom_find_port(tty);
	if (tport == NULL)
		return -ENODEV;
	port = container_of(tport, struct isi_port, port);
	card = &isi_card[BOARD(tty->index)];
	isicom_setup_board(card);

	/* FIXME: locking on port.count etc */
	port->port.count++;
	tty->driver_data = port;
	tty_port_tty_set(&port->port, tty);
	/* FIXME: Locking on Initialized flag */
	if (!test_bit(ASYNCB_INITIALIZED, &tport->flags))
		error = isicom_setup_port(tty);
	if (error == 0)
		error = tty_port_block_til_ready(&port->port, tty, filp);