io_ti.c 71.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
/*
 * Edgeport USB Serial Converter driver
 *
 * Copyright (C) 2000-2002 Inside Out Networks, All rights reserved.
 * Copyright (C) 2001-2002 Greg Kroah-Hartman <greg@kroah.com>
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 2 of the License, or
 *	(at your option) any later version.
 *
 * Supports the following devices:
 *	EP/1 EP/2 EP/4 EP/21 EP/22 EP/221 EP/42 EP/421 WATCHPORT
 *
 * For questions or problems with this driver, contact Inside Out
 * Networks technical support, or Peter Berger <pberger@brimson.com>,
 * or Al Borchers <alborchers@steinerpoint.com>.
 */

#include <linux/kernel.h>
#include <linux/jiffies.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
#include <linux/tty_flip.h>
#include <linux/module.h>
#include <linux/spinlock.h>
29
#include <linux/mutex.h>
L
Linus Torvalds 已提交
30
#include <linux/serial.h>
31
#include <linux/swab.h>
32
#include <linux/kfifo.h>
L
Linus Torvalds 已提交
33
#include <linux/ioctl.h>
34
#include <linux/firmware.h>
35
#include <linux/uaccess.h>
L
Linus Torvalds 已提交
36
#include <linux/usb.h>
37
#include <linux/usb/serial.h>
L
Linus Torvalds 已提交
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

#include "io_16654.h"
#include "io_usbvend.h"
#include "io_ti.h"

#define DRIVER_AUTHOR "Greg Kroah-Hartman <greg@kroah.com> and David Iacovelli"
#define DRIVER_DESC "Edgeport USB Serial Driver"

#define EPROM_PAGE_SIZE		64


/* different hardware types */
#define HARDWARE_TYPE_930	0
#define HARDWARE_TYPE_TIUMP	1

53 54 55 56 57 58
/* IOCTL_PRIVATE_TI_GET_MODE Definitions */
#define	TI_MODE_CONFIGURING	0   /* Device has not entered start device */
#define	TI_MODE_BOOT		1   /* Staying in boot mode		   */
#define TI_MODE_DOWNLOAD	2   /* Made it to download mode		   */
#define TI_MODE_TRANSITIONING	3   /* Currently in boot mode but
				       transitioning to download mode	   */
L
Linus Torvalds 已提交
59 60 61 62 63 64 65 66 67 68

/* read urb state */
#define EDGE_READ_URB_RUNNING	0
#define EDGE_READ_URB_STOPPING	1
#define EDGE_READ_URB_STOPPED	2

#define EDGE_CLOSING_WAIT	4000	/* in .01 sec */


/* Product information read from the Edgeport */
69 70 71
struct product_info {
	int	TiMode;			/* Current TI Mode  */
	__u8	hardware_type;		/* Type of hardware */
L
Linus Torvalds 已提交
72 73 74 75 76 77 78 79 80
} __attribute__((packed));

struct edgeport_port {
	__u16 uart_base;
	__u16 dma_address;
	__u8 shadow_msr;
	__u8 shadow_mcr;
	__u8 shadow_lsr;
	__u8 lsr_mask;
81
	__u32 ump_read_timeout;		/* Number of milliseconds the UMP will
L
Linus Torvalds 已提交
82 83 84 85 86
					   wait without data before completing
					   a read short */
	int baud_rate;
	int close_pending;
	int lsr_event;
87

L
Linus Torvalds 已提交
88 89
	struct edgeport_serial	*edge_serial;
	struct usb_serial_port	*port;
90
	__u8 bUartMode;		/* Port type, 0: RS232, etc. */
L
Linus Torvalds 已提交
91 92 93 94 95 96 97
	spinlock_t ep_lock;
	int ep_read_urb_state;
	int ep_write_urb_in_use;
};

struct edgeport_serial {
	struct product_info product_info;
98 99 100
	u8 TI_I2C_Type;			/* Type of I2C in UMP */
	u8 TiReadI2C;			/* Set to TRUE if we have read the
					   I2c in Boot Mode */
101
	struct mutex es_lock;
L
Linus Torvalds 已提交
102 103 104 105 106 107
	int num_ports_open;
	struct usb_serial *serial;
};


/* Devices that this driver supports */
108
static const struct usb_device_id edgeport_1port_id_table[] = {
L
Linus Torvalds 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
	{ }
};

128
static const struct usb_device_id edgeport_2port_id_table[] = {
L
Linus Torvalds 已提交
129 130 131 132 133 134 135 136 137 138 139 140
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
141
	/* The 4, 8 and 16 port devices show up as multiple 2 port devices */
L
Linus Torvalds 已提交
142
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
143 144 145 146
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
L
Linus Torvalds 已提交
147 148 149 150
	{ }
};

/* Devices that this driver supports */
151
static const struct usb_device_id id_table_combined[] = {
L
Linus Torvalds 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_1) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_TI3410_EDGEPORT_1I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROXIMITY) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOTION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_MOISTURE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_TEMPERATURE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_HUMIDITY) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_POWER) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_LIGHT) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_RADIATION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_DISTANCE) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_ACCELERATION) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_WP_PROX_DIST) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_HP4CD) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_PLUS_PWR_PCI) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_2I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_421) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_42) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22I) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_221C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_22C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_21C) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_4S) },
181 182 183 184
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_8S) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416) },
	{ USB_DEVICE(USB_VENDOR_ID_ION, ION_DEVICE_ID_TI_EDGEPORT_416B) },
L
Linus Torvalds 已提交
185 186 187
	{ }
};

188
MODULE_DEVICE_TABLE(usb, id_table_combined);
L
Linus Torvalds 已提交
189

190 191 192
static unsigned char OperationalMajorVersion;
static unsigned char OperationalMinorVersion;
static unsigned short OperationalBuildNumber;
L
Linus Torvalds 已提交
193 194

static int closing_wait = EDGE_CLOSING_WAIT;
195
static bool ignore_cpu_rev;
196
static int default_uart_mode;		/* RS232 */
L
Linus Torvalds 已提交
197

J
Jiri Slaby 已提交
198 199
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
		int length);
L
Linus Torvalds 已提交
200 201 202 203

static void stop_read(struct edgeport_port *edge_port);
static int restart_read(struct edgeport_port *edge_port);

A
Alan Cox 已提交
204 205
static void edge_set_termios(struct tty_struct *tty,
		struct usb_serial_port *port, struct ktermios *old_termios);
206
static void edge_send(struct usb_serial_port *port, struct tty_struct *tty);
L
Linus Torvalds 已提交
207

208 209 210 211
/* sysfs attributes */
static int edge_create_sysfs_attrs(struct usb_serial_port *port);
static int edge_remove_sysfs_attrs(struct usb_serial_port *port);

L
Linus Torvalds 已提交
212

213 214
static int ti_vread_sync(struct usb_device *dev, __u8 request,
				__u16 value, __u16 index, u8 *data, int size)
L
Linus Torvalds 已提交
215 216 217
{
	int status;

218 219 220
	status = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), request,
			(USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN),
			value, index, data, size, 1000);
L
Linus Torvalds 已提交
221 222 223
	if (status < 0)
		return status;
	if (status != size) {
224 225
		dev_dbg(&dev->dev, "%s - wanted to write %d, but only wrote %d\n",
			__func__, size, status);
L
Linus Torvalds 已提交
226 227 228 229 230
		return -ECOMM;
	}
	return 0;
}

231 232
static int ti_vsend_sync(struct usb_device *dev, __u8 request,
				__u16 value, __u16 index, u8 *data, int size)
L
Linus Torvalds 已提交
233 234 235
{
	int status;

236 237 238
	status = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), request,
			(USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT),
			value, index, data, size, 1000);
L
Linus Torvalds 已提交
239 240 241
	if (status < 0)
		return status;
	if (status != size) {
242 243
		dev_dbg(&dev->dev, "%s - wanted to write %d, but only wrote %d\n",
			__func__, size, status);
L
Linus Torvalds 已提交
244 245 246 247 248
		return -ECOMM;
	}
	return 0;
}

249
static int send_cmd(struct usb_device *dev, __u8 command,
L
Linus Torvalds 已提交
250 251 252
				__u8 moduleid, __u16 value, u8 *data,
				int size)
{
253
	return ti_vsend_sync(dev, command, value, moduleid, data, size);
L
Linus Torvalds 已提交
254 255 256
}

/* clear tx/rx buffers and fifo in TI UMP */
257
static int purge_port(struct usb_serial_port *port, __u16 mask)
L
Linus Torvalds 已提交
258
{
259
	int port_number = port->port_number;
L
Linus Torvalds 已提交
260

261
	dev_dbg(&port->dev, "%s - port %d, mask %x\n", __func__, port_number, mask);
L
Linus Torvalds 已提交
262

263
	return send_cmd(port->serial->dev,
L
Linus Torvalds 已提交
264 265 266 267 268 269 270 271
					UMPC_PURGE_PORT,
					(__u8)(UMPM_UART1_PORT + port_number),
					mask,
					NULL,
					0);
}

/**
272
 * read_download_mem - Read edgeport memory from TI chip
L
Linus Torvalds 已提交
273 274 275 276 277 278
 * @dev: usb device pointer
 * @start_address: Device CPU address at which to read
 * @length: Length of above data
 * @address_type: Can read both XDATA and I2C
 * @buffer: pointer to input data buffer
 */
279
static int read_download_mem(struct usb_device *dev, int start_address,
L
Linus Torvalds 已提交
280 281 282 283
				int length, __u8 address_type, __u8 *buffer)
{
	int status = 0;
	__u8 read_length;
284
	u16 be_start_address;
285

286
	dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, length);
L
Linus Torvalds 已提交
287 288 289 290 291 292

	/* Read in blocks of 64 bytes
	 * (TI firmware can't handle more than 64 byte reads)
	 */
	while (length) {
		if (length > 64)
293
			read_length = 64;
L
Linus Torvalds 已提交
294 295 296 297
		else
			read_length = (__u8)length;

		if (read_length > 1) {
298
			dev_dbg(&dev->dev, "%s - @ %x for %d\n", __func__, start_address, read_length);
L
Linus Torvalds 已提交
299
		}
300 301 302 303 304
		/*
		 * NOTE: Must use swab as wIndex is sent in little-endian
		 *       byte order regardless of host byte order.
		 */
		be_start_address = swab16((u16)start_address);
305 306
		status = ti_vread_sync(dev, UMPC_MEMORY_READ,
					(__u16)address_type,
307
					be_start_address,
308
					buffer, read_length);
L
Linus Torvalds 已提交
309 310

		if (status) {
311
			dev_dbg(&dev->dev, "%s - ERROR %x\n", __func__, status);
L
Linus Torvalds 已提交
312 313 314
			return status;
		}

315
		if (read_length > 1)
316
			usb_serial_debug_data(&dev->dev, __func__, read_length, buffer);
L
Linus Torvalds 已提交
317 318 319 320 321 322

		/* Update pointers/length */
		start_address += read_length;
		buffer += read_length;
		length -= read_length;
	}
323

L
Linus Torvalds 已提交
324 325 326
	return status;
}

327 328
static int read_ram(struct usb_device *dev, int start_address,
						int length, __u8 *buffer)
L
Linus Torvalds 已提交
329
{
330 331
	return read_download_mem(dev, start_address, length,
					DTK_ADDR_SPACE_XDATA, buffer);
L
Linus Torvalds 已提交
332 333 334
}

/* Read edgeport memory to a given block */
335 336
static int read_boot_mem(struct edgeport_serial *serial,
				int start_address, int length, __u8 *buffer)
L
Linus Torvalds 已提交
337 338 339 340
{
	int status = 0;
	int i;

341 342 343 344
	for (i = 0; i < length; i++) {
		status = ti_vread_sync(serial->serial->dev,
				UMPC_MEMORY_READ, serial->TI_I2C_Type,
				(__u16)(start_address+i), &buffer[i], 0x01);
L
Linus Torvalds 已提交
345
		if (status) {
346
			dev_dbg(&serial->serial->dev->dev, "%s - ERROR %x\n", __func__, status);
L
Linus Torvalds 已提交
347 348 349 350
			return status;
		}
	}

351 352
	dev_dbg(&serial->serial->dev->dev, "%s - start_address = %x, length = %d\n",
		__func__, start_address, length);
353
	usb_serial_debug_data(&serial->serial->dev->dev, __func__, length, buffer);
L
Linus Torvalds 已提交
354 355 356 357 358 359 360

	serial->TiReadI2C = 1;

	return status;
}

/* Write given block to TI EPROM memory */
361 362
static int write_boot_mem(struct edgeport_serial *serial,
				int start_address, int length, __u8 *buffer)
L
Linus Torvalds 已提交
363 364 365
{
	int status = 0;
	int i;
366
	u8 *temp;
L
Linus Torvalds 已提交
367 368 369

	/* Must do a read before write */
	if (!serial->TiReadI2C) {
370
		temp = kmalloc(1, GFP_KERNEL);
371
		if (!temp)
372
			return -ENOMEM;
373

374 375
		status = read_boot_mem(serial, 0, 1, temp);
		kfree(temp);
L
Linus Torvalds 已提交
376 377 378 379
		if (status)
			return status;
	}

380 381 382 383
	for (i = 0; i < length; ++i) {
		status = ti_vsend_sync(serial->serial->dev,
				UMPC_MEMORY_WRITE, buffer[i],
				(__u16)(i + start_address), NULL, 0);
L
Linus Torvalds 已提交
384 385 386 387
		if (status)
			return status;
	}

388
	dev_dbg(&serial->serial->dev->dev, "%s - start_sddr = %x, length = %d\n", __func__, start_address, length);
389
	usb_serial_debug_data(&serial->serial->dev->dev, __func__, length, buffer);
L
Linus Torvalds 已提交
390 391 392 393 394 395

	return status;
}


/* Write edgeport I2C memory to TI chip	*/
396 397
static int write_i2c_mem(struct edgeport_serial *serial,
		int start_address, int length, __u8 address_type, __u8 *buffer)
L
Linus Torvalds 已提交
398
{
399
	struct device *dev = &serial->serial->dev->dev;
L
Linus Torvalds 已提交
400 401
	int status = 0;
	int write_length;
402
	u16 be_start_address;
L
Linus Torvalds 已提交
403 404

	/* We can only send a maximum of 1 aligned byte page at a time */
405

L
Lucas De Marchi 已提交
406
	/* calculate the number of bytes left in the first page */
407 408
	write_length = EPROM_PAGE_SIZE -
				(start_address & (EPROM_PAGE_SIZE - 1));
L
Linus Torvalds 已提交
409 410 411 412

	if (write_length > length)
		write_length = length;

413 414
	dev_dbg(dev, "%s - BytesInFirstPage Addr = %x, length = %d\n",
		__func__, start_address, write_length);
415
	usb_serial_debug_data(dev, __func__, write_length, buffer);
L
Linus Torvalds 已提交
416

417 418 419 420 421 422 423
	/*
	 * Write first page.
	 *
	 * NOTE: Must use swab as wIndex is sent in little-endian byte order
	 *       regardless of host byte order.
	 */
	be_start_address = swab16((u16)start_address);
424 425
	status = ti_vsend_sync(serial->serial->dev,
				UMPC_MEMORY_WRITE, (__u16)address_type,
426
				be_start_address,
427
				buffer,	write_length);
L
Linus Torvalds 已提交
428
	if (status) {
429
		dev_dbg(dev, "%s - ERROR %d\n", __func__, status);
L
Linus Torvalds 已提交
430 431 432 433 434 435 436
		return status;
	}

	length		-= write_length;
	start_address	+= write_length;
	buffer		+= write_length;

437 438
	/* We should be aligned now -- can write
	   max page size bytes at a time */
L
Linus Torvalds 已提交
439 440 441 442 443 444
	while (length) {
		if (length > EPROM_PAGE_SIZE)
			write_length = EPROM_PAGE_SIZE;
		else
			write_length = length;

445 446
		dev_dbg(dev, "%s - Page Write Addr = %x, length = %d\n",
			__func__, start_address, write_length);
447
		usb_serial_debug_data(dev, __func__, write_length, buffer);
L
Linus Torvalds 已提交
448

449 450 451 452 453 454 455
		/*
		 * Write next page.
		 *
		 * NOTE: Must use swab as wIndex is sent in little-endian byte
		 *       order regardless of host byte order.
		 */
		be_start_address = swab16((u16)start_address);
456 457
		status = ti_vsend_sync(serial->serial->dev, UMPC_MEMORY_WRITE,
				(__u16)address_type,
458
				be_start_address,
459
				buffer, write_length);
L
Linus Torvalds 已提交
460
		if (status) {
461
			dev_err(dev, "%s - ERROR %d\n", __func__, status);
L
Linus Torvalds 已提交
462 463
			return status;
		}
464

L
Linus Torvalds 已提交
465 466 467 468 469 470 471 472
		length		-= write_length;
		start_address	+= write_length;
		buffer		+= write_length;
	}
	return status;
}

/* Examine the UMP DMA registers and LSR
473
 *
L
Linus Torvalds 已提交
474 475 476 477
 * Check the MSBit of the X and Y DMA byte count registers.
 * A zero in this bit indicates that the TX DMA buffers are empty
 * then check the TX Empty bit in the UART.
 */
478
static int tx_active(struct edgeport_port *port)
L
Linus Torvalds 已提交
479 480 481 482 483 484
{
	int status;
	struct out_endpoint_desc_block *oedb;
	__u8 *lsr;
	int bytes_left = 0;

485
	oedb = kmalloc(sizeof(*oedb), GFP_KERNEL);
486
	if (!oedb)
L
Linus Torvalds 已提交
487 488
		return -ENOMEM;

489
	lsr = kmalloc(1, GFP_KERNEL);	/* Sigh, that's right, just one byte,
L
Linus Torvalds 已提交
490 491 492 493 494 495 496
					   as not all platforms can do DMA
					   from stack */
	if (!lsr) {
		kfree(oedb);
		return -ENOMEM;
	}
	/* Read the DMA Count Registers */
497 498
	status = read_ram(port->port->serial->dev, port->dma_address,
						sizeof(*oedb), (void *)oedb);
L
Linus Torvalds 已提交
499 500 501
	if (status)
		goto exit_is_tx_active;

502
	dev_dbg(&port->port->dev, "%s - XByteCount    0x%X\n", __func__, oedb->XByteCount);
L
Linus Torvalds 已提交
503 504

	/* and the LSR */
505 506
	status = read_ram(port->port->serial->dev,
			port->uart_base + UMPMEM_OFFS_UART_LSR, 1, lsr);
L
Linus Torvalds 已提交
507 508 509

	if (status)
		goto exit_is_tx_active;
510
	dev_dbg(&port->port->dev, "%s - LSR = 0x%X\n", __func__, *lsr);
511

L
Linus Torvalds 已提交
512
	/* If either buffer has data or we are transmitting then return TRUE */
513
	if ((oedb->XByteCount & 0x80) != 0)
L
Linus Torvalds 已提交
514 515
		bytes_left += 64;

516
	if ((*lsr & UMP_UART_LSR_TX_MASK) == 0)
L
Linus Torvalds 已提交
517 518 519 520
		bytes_left += 1;

	/* We return Not Active if we get any kind of error */
exit_is_tx_active:
521
	dev_dbg(&port->port->dev, "%s - return %d\n", __func__, bytes_left);
L
Linus Torvalds 已提交
522 523 524 525 526 527

	kfree(lsr);
	kfree(oedb);
	return bytes_left;
}

528
static int choose_config(struct usb_device *dev)
L
Linus Torvalds 已提交
529
{
530 531 532 533 534 535
	/*
	 * There may be multiple configurations on this device, in which case
	 * we would need to read and parse all of them to find out which one
	 * we want. However, we just support one config at this point,
	 * configuration # 1, which is Config Descriptor 0.
	 */
L
Linus Torvalds 已提交
536

537 538 539 540
	dev_dbg(&dev->dev, "%s - Number of Interfaces = %d\n",
		__func__, dev->config->desc.bNumInterfaces);
	dev_dbg(&dev->dev, "%s - MAX Power            = %d\n",
		__func__, dev->config->desc.bMaxPower * 2);
L
Linus Torvalds 已提交
541 542

	if (dev->config->desc.bNumInterfaces != 1) {
543
		dev_err(&dev->dev, "%s - bNumInterfaces is not 1, ERROR!\n", __func__);
L
Linus Torvalds 已提交
544 545 546 547 548 549
		return -ENODEV;
	}

	return 0;
}

550 551
static int read_rom(struct edgeport_serial *serial,
				int start_address, int length, __u8 *buffer)
L
Linus Torvalds 已提交
552 553 554 555
{
	int status;

	if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
556
		status = read_download_mem(serial->serial->dev,
L
Linus Torvalds 已提交
557 558 559 560 561
					       start_address,
					       length,
					       serial->TI_I2C_Type,
					       buffer);
	} else {
562 563
		status = read_boot_mem(serial, start_address, length,
								buffer);
L
Linus Torvalds 已提交
564 565 566 567
	}
	return status;
}

568 569
static int write_rom(struct edgeport_serial *serial, int start_address,
						int length, __u8 *buffer)
L
Linus Torvalds 已提交
570 571
{
	if (serial->product_info.TiMode == TI_MODE_BOOT)
572 573
		return write_boot_mem(serial, start_address, length,
								buffer);
L
Linus Torvalds 已提交
574 575

	if (serial->product_info.TiMode == TI_MODE_DOWNLOAD)
576 577
		return write_i2c_mem(serial, start_address, length,
						serial->TI_I2C_Type, buffer);
L
Linus Torvalds 已提交
578 579 580 581 582 583
	return -EINVAL;
}



/* Read a descriptor header from I2C based on type */
584 585
static int get_descriptor_addr(struct edgeport_serial *serial,
				int desc_type, struct ti_i2c_desc *rom_desc)
L
Linus Torvalds 已提交
586 587 588 589 590 591 592
{
	int start_address;
	int status;

	/* Search for requested descriptor in I2C */
	start_address = 2;
	do {
593
		status = read_rom(serial,
L
Linus Torvalds 已提交
594 595
				   start_address,
				   sizeof(struct ti_i2c_desc),
596
				   (__u8 *)rom_desc);
L
Linus Torvalds 已提交
597 598 599 600 601 602
		if (status)
			return 0;

		if (rom_desc->Type == desc_type)
			return start_address;

603 604
		start_address = start_address + sizeof(struct ti_i2c_desc) +
						le16_to_cpu(rom_desc->Size);
L
Linus Torvalds 已提交
605 606

	} while ((start_address < TI_MAX_I2C_SIZE) && rom_desc->Type);
607

L
Linus Torvalds 已提交
608 609 610 611
	return 0;
}

/* Validate descriptor checksum */
612
static int valid_csum(struct ti_i2c_desc *rom_desc, __u8 *buffer)
L
Linus Torvalds 已提交
613 614 615 616
{
	__u16 i;
	__u8 cs = 0;

617
	for (i = 0; i < le16_to_cpu(rom_desc->Size); i++)
L
Linus Torvalds 已提交
618
		cs = (__u8)(cs + buffer[i]);
619

L
Linus Torvalds 已提交
620
	if (cs != rom_desc->CheckSum) {
621
		pr_debug("%s - Mismatch %x - %x", __func__, rom_desc->CheckSum, cs);
L
Linus Torvalds 已提交
622 623 624 625 626 627
		return -EINVAL;
	}
	return 0;
}

/* Make sure that the I2C image is good */
628
static int check_i2c_image(struct edgeport_serial *serial)
L
Linus Torvalds 已提交
629 630 631 632 633 634 635 636
{
	struct device *dev = &serial->serial->dev->dev;
	int status = 0;
	struct ti_i2c_desc *rom_desc;
	int start_address = 2;
	__u8 *buffer;
	__u16 ttype;

637
	rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
638
	if (!rom_desc)
L
Linus Torvalds 已提交
639
		return -ENOMEM;
640

641
	buffer = kmalloc(TI_MAX_I2C_SIZE, GFP_KERNEL);
L
Linus Torvalds 已提交
642
	if (!buffer) {
643
		kfree(rom_desc);
L
Linus Torvalds 已提交
644 645 646
		return -ENOMEM;
	}

647 648
	/* Read the first byte (Signature0) must be 0x52 or 0x10 */
	status = read_rom(serial, 0, 1, buffer);
L
Linus Torvalds 已提交
649
	if (status)
650
		goto out;
L
Linus Torvalds 已提交
651 652

	if (*buffer != UMP5152 && *buffer != UMP3410) {
653
		dev_err(dev, "%s - invalid buffer signature\n", __func__);
L
Linus Torvalds 已提交
654
		status = -ENODEV;
655
		goto out;
L
Linus Torvalds 已提交
656 657 658
	}

	do {
659 660
		/* Validate the I2C */
		status = read_rom(serial,
L
Linus Torvalds 已提交
661 662 663 664 665 666
				start_address,
				sizeof(struct ti_i2c_desc),
				(__u8 *)rom_desc);
		if (status)
			break;

667
		if ((start_address + sizeof(struct ti_i2c_desc) +
668
			le16_to_cpu(rom_desc->Size)) > TI_MAX_I2C_SIZE) {
L
Linus Torvalds 已提交
669
			status = -ENODEV;
670
			dev_dbg(dev, "%s - structure too big, erroring out.\n", __func__);
L
Linus Torvalds 已提交
671 672 673
			break;
		}

674
		dev_dbg(dev, "%s Type = 0x%x\n", __func__, rom_desc->Type);
L
Linus Torvalds 已提交
675

676
		/* Skip type 2 record */
L
Linus Torvalds 已提交
677
		ttype = rom_desc->Type & 0x0f;
678 679 680 681 682
		if (ttype != I2C_DESC_TYPE_FIRMWARE_BASIC
			&& ttype != I2C_DESC_TYPE_FIRMWARE_AUTO) {
			/* Read the descriptor data */
			status = read_rom(serial, start_address +
						sizeof(struct ti_i2c_desc),
683 684
						le16_to_cpu(rom_desc->Size),
						buffer);
L
Linus Torvalds 已提交
685 686 687
			if (status)
				break;

688
			status = valid_csum(rom_desc, buffer);
L
Linus Torvalds 已提交
689 690 691
			if (status)
				break;
		}
692
		start_address = start_address + sizeof(struct ti_i2c_desc) +
693
						le16_to_cpu(rom_desc->Size);
L
Linus Torvalds 已提交
694

695 696
	} while ((rom_desc->Type != I2C_DESC_TYPE_ION) &&
				(start_address < TI_MAX_I2C_SIZE));
L
Linus Torvalds 已提交
697

698 699
	if ((rom_desc->Type != I2C_DESC_TYPE_ION) ||
				(start_address > TI_MAX_I2C_SIZE))
L
Linus Torvalds 已提交
700 701
		status = -ENODEV;

702 703 704
out:
	kfree(buffer);
	kfree(rom_desc);
L
Linus Torvalds 已提交
705 706 707
	return status;
}

708
static int get_manuf_info(struct edgeport_serial *serial, __u8 *buffer)
L
Linus Torvalds 已提交
709 710 711 712 713
{
	int status;
	int start_address;
	struct ti_i2c_desc *rom_desc;
	struct edge_ti_manuf_descriptor *desc;
714
	struct device *dev = &serial->serial->dev->dev;
L
Linus Torvalds 已提交
715

716
	rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
717
	if (!rom_desc)
L
Linus Torvalds 已提交
718
		return -ENOMEM;
719

720 721
	start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_ION,
								rom_desc);
L
Linus Torvalds 已提交
722 723

	if (!start_address) {
724
		dev_dbg(dev, "%s - Edge Descriptor not found in I2C\n", __func__);
L
Linus Torvalds 已提交
725 726 727 728
		status = -ENODEV;
		goto exit;
	}

729 730
	/* Read the descriptor data */
	status = read_rom(serial, start_address+sizeof(struct ti_i2c_desc),
731
					le16_to_cpu(rom_desc->Size), buffer);
L
Linus Torvalds 已提交
732 733
	if (status)
		goto exit;
734 735 736

	status = valid_csum(rom_desc, buffer);

L
Linus Torvalds 已提交
737
	desc = (struct edge_ti_manuf_descriptor *)buffer;
738 739 740 741 742 743
	dev_dbg(dev, "%s - IonConfig      0x%x\n", __func__, desc->IonConfig);
	dev_dbg(dev, "%s - Version          %d\n", __func__, desc->Version);
	dev_dbg(dev, "%s - Cpu/Board      0x%x\n", __func__, desc->CpuRev_BoardRev);
	dev_dbg(dev, "%s - NumPorts         %d\n", __func__, desc->NumPorts);
	dev_dbg(dev, "%s - NumVirtualPorts  %d\n", __func__, desc->NumVirtualPorts);
	dev_dbg(dev, "%s - TotalPorts       %d\n", __func__, desc->TotalPorts);
L
Linus Torvalds 已提交
744 745

exit:
746
	kfree(rom_desc);
L
Linus Torvalds 已提交
747 748 749 750
	return status;
}

/* Build firmware header used for firmware update */
751
static int build_i2c_fw_hdr(__u8 *header, struct device *dev)
L
Linus Torvalds 已提交
752 753 754 755
{
	__u8 *buffer;
	int buffer_size;
	int i;
756
	int err;
L
Linus Torvalds 已提交
757 758 759 760
	__u8 cs = 0;
	struct ti_i2c_desc *i2c_header;
	struct ti_i2c_image_header *img_header;
	struct ti_i2c_firmware_rec *firmware_rec;
761 762
	const struct firmware *fw;
	const char *fw_name = "edgeport/down3.bin";
L
Linus Torvalds 已提交
763

764 765 766 767 768 769 770 771 772 773 774 775 776 777 778
	/* In order to update the I2C firmware we must change the type 2 record
	 * to type 0xF2.  This will force the UMP to come up in Boot Mode.
	 * Then while in boot mode, the driver will download the latest
	 * firmware (padded to 15.5k) into the UMP ram.  And finally when the
	 * device comes back up in download mode the driver will cause the new
	 * firmware to be copied from the UMP Ram to I2C and the firmware will
	 * update the record type from 0xf2 to 0x02.
	 */

	/* Allocate a 15.5k buffer + 2 bytes for version number
	 * (Firmware Record) */
	buffer_size = (((1024 * 16) - 512 ) +
			sizeof(struct ti_i2c_firmware_rec));

	buffer = kmalloc(buffer_size, GFP_KERNEL);
779
	if (!buffer)
L
Linus Torvalds 已提交
780
		return -ENOMEM;
781

L
Linus Torvalds 已提交
782
	// Set entire image of 0xffs
783
	memset(buffer, 0xff, buffer_size);
L
Linus Torvalds 已提交
784

785 786
	err = request_firmware(&fw, fw_name, dev);
	if (err) {
787 788
		dev_err(dev, "Failed to load image \"%s\" err %d\n",
			fw_name, err);
789 790 791 792 793 794 795 796 797
		kfree(buffer);
		return err;
	}

	/* Save Download Version Number */
	OperationalMajorVersion = fw->data[0];
	OperationalMinorVersion = fw->data[1];
	OperationalBuildNumber = fw->data[2] | (fw->data[3] << 8);

798
	/* Copy version number into firmware record */
L
Linus Torvalds 已提交
799 800
	firmware_rec = (struct ti_i2c_firmware_rec *)buffer;

801 802
	firmware_rec->Ver_Major	= OperationalMajorVersion;
	firmware_rec->Ver_Minor	= OperationalMinorVersion;
L
Linus Torvalds 已提交
803

804
	/* Pointer to fw_down memory image */
805
	img_header = (struct ti_i2c_image_header *)&fw->data[4];
L
Linus Torvalds 已提交
806

807
	memcpy(buffer + sizeof(struct ti_i2c_firmware_rec),
808
		&fw->data[4 + sizeof(struct ti_i2c_image_header)],
L
Linus Torvalds 已提交
809 810
		le16_to_cpu(img_header->Length));

811 812
	release_firmware(fw);

L
Linus Torvalds 已提交
813 814 815 816
	for (i=0; i < buffer_size; i++) {
		cs = (__u8)(cs + buffer[i]);
	}

817
	kfree(buffer);
L
Linus Torvalds 已提交
818

819
	/* Build new header */
L
Linus Torvalds 已提交
820 821
	i2c_header =  (struct ti_i2c_desc *)header;
	firmware_rec =  (struct ti_i2c_firmware_rec*)i2c_header->Data;
822

L
Linus Torvalds 已提交
823
	i2c_header->Type	= I2C_DESC_TYPE_FIRMWARE_BLANK;
824
	i2c_header->Size	= cpu_to_le16(buffer_size);
L
Linus Torvalds 已提交
825
	i2c_header->CheckSum	= cs;
826 827
	firmware_rec->Ver_Major	= OperationalMajorVersion;
	firmware_rec->Ver_Minor	= OperationalMinorVersion;
L
Linus Torvalds 已提交
828 829 830 831 832

	return 0;
}

/* Try to figure out what type of I2c we have */
833
static int i2c_type_bootmode(struct edgeport_serial *serial)
L
Linus Torvalds 已提交
834
{
835
	struct device *dev = &serial->serial->dev->dev;
L
Linus Torvalds 已提交
836
	int status;
837 838 839
	u8 *data;

	data = kmalloc(1, GFP_KERNEL);
840
	if (!data)
841
		return -ENOMEM;
842 843 844

	/* Try to read type 2 */
	status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
845
				DTK_ADDR_SPACE_I2C_TYPE_II, 0, data, 0x01);
L
Linus Torvalds 已提交
846
	if (status)
847
		dev_dbg(dev, "%s - read 2 status error = %d\n", __func__, status);
L
Linus Torvalds 已提交
848
	else
849
		dev_dbg(dev, "%s - read 2 data = 0x%x\n", __func__, *data);
850
	if ((!status) && (*data == UMP5152 || *data == UMP3410)) {
851
		dev_dbg(dev, "%s - ROM_TYPE_II\n", __func__);
L
Linus Torvalds 已提交
852
		serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
853
		goto out;
L
Linus Torvalds 已提交
854 855
	}

856 857
	/* Try to read type 3 */
	status = ti_vread_sync(serial->serial->dev, UMPC_MEMORY_READ,
858
				DTK_ADDR_SPACE_I2C_TYPE_III, 0,	data, 0x01);
L
Linus Torvalds 已提交
859
	if (status)
860
		dev_dbg(dev, "%s - read 3 status error = %d\n", __func__, status);
L
Linus Torvalds 已提交
861
	else
862
		dev_dbg(dev, "%s - read 2 data = 0x%x\n", __func__, *data);
863
	if ((!status) && (*data == UMP5152 || *data == UMP3410)) {
864
		dev_dbg(dev, "%s - ROM_TYPE_III\n", __func__);
L
Linus Torvalds 已提交
865
		serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_III;
866
		goto out;
L
Linus Torvalds 已提交
867 868
	}

869
	dev_dbg(dev, "%s - Unknown\n", __func__);
L
Linus Torvalds 已提交
870
	serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
871 872 873 874
	status = -ENODEV;
out:
	kfree(data);
	return status;
L
Linus Torvalds 已提交
875 876
}

877 878
static int bulk_xfer(struct usb_serial *serial, void *buffer,
						int length, int *num_sent)
L
Linus Torvalds 已提交
879 880 881
{
	int status;

882 883 884 885
	status = usb_bulk_msg(serial->dev,
			usb_sndbulkpipe(serial->dev,
				serial->port[0]->bulk_out_endpointAddress),
			buffer, length, num_sent, 1000);
L
Linus Torvalds 已提交
886 887 888 889
	return status;
}

/* Download given firmware image to the device (IN BOOT MODE) */
890 891
static int download_code(struct edgeport_serial *serial, __u8 *image,
							int image_length)
L
Linus Torvalds 已提交
892 893 894 895 896 897
{
	int status = 0;
	int pos;
	int transfer;
	int done;

898
	/* Transfer firmware image */
L
Linus Torvalds 已提交
899
	for (pos = 0; pos < image_length; ) {
900
		/* Read the next buffer from file */
L
Linus Torvalds 已提交
901 902 903 904
		transfer = image_length - pos;
		if (transfer > EDGE_FW_BULK_MAX_PACKET_SIZE)
			transfer = EDGE_FW_BULK_MAX_PACKET_SIZE;

905 906 907
		/* Transfer data */
		status = bulk_xfer(serial->serial, &image[pos],
							transfer, &done);
L
Linus Torvalds 已提交
908 909
		if (status)
			break;
910
		/* Advance buffer pointer */
L
Linus Torvalds 已提交
911 912 913 914 915 916
		pos += done;
	}

	return status;
}

917 918
/* FIXME!!! */
static int config_boot_dev(struct usb_device *dev)
L
Linus Torvalds 已提交
919 920 921 922
{
	return 0;
}

923 924 925 926 927
static int ti_cpu_rev(struct edge_ti_manuf_descriptor *desc)
{
	return TI_GET_CPU_REVISION(desc->CpuRev_BoardRev);
}

L
Linus Torvalds 已提交
928 929
/**
 * DownloadTIFirmware - Download run-time operating firmware to the TI5052
930
 *
L
Linus Torvalds 已提交
931 932 933
 * This routine downloads the main operating code into the TI5052, using the
 * boot code already burned into E2PROM or ROM.
 */
934
static int download_fw(struct edgeport_serial *serial)
L
Linus Torvalds 已提交
935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
{
	struct device *dev = &serial->serial->dev->dev;
	int status = 0;
	int start_address;
	struct edge_ti_manuf_descriptor *ti_manuf_desc;
	struct usb_interface_descriptor *interface;
	int download_cur_ver;
	int download_new_ver;

	/* This routine is entered by both the BOOT mode and the Download mode
	 * We can determine which code is running by the reading the config
	 * descriptor and if we have only one bulk pipe it is in boot mode
	 */
	serial->product_info.hardware_type = HARDWARE_TYPE_TIUMP;

	/* Default to type 2 i2c */
	serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;

953
	status = choose_config(serial->serial->dev);
L
Linus Torvalds 已提交
954 955 956 957 958
	if (status)
		return status;

	interface = &serial->serial->interface->cur_altsetting->desc;
	if (!interface) {
959
		dev_err(dev, "%s - no interface set, error!\n", __func__);
L
Linus Torvalds 已提交
960 961 962
		return -ENODEV;
	}

963 964 965 966 967
	/*
	 * Setup initial mode -- the default mode 0 is TI_MODE_CONFIGURING
	 * if we have more than one endpoint we are definitely in download
	 * mode
	 */
L
Linus Torvalds 已提交
968 969 970
	if (interface->bNumEndpoints > 1)
		serial->product_info.TiMode = TI_MODE_DOWNLOAD;
	else
971
		/* Otherwise we will remain in configuring mode */
L
Linus Torvalds 已提交
972 973 974 975 976 977 978 979
		serial->product_info.TiMode = TI_MODE_CONFIGURING;

	/********************************************************************/
	/* Download Mode */
	/********************************************************************/
	if (serial->product_info.TiMode == TI_MODE_DOWNLOAD) {
		struct ti_i2c_desc *rom_desc;

980
		dev_dbg(dev, "%s - RUNNING IN DOWNLOAD MODE\n", __func__);
L
Linus Torvalds 已提交
981

982
		status = check_i2c_image(serial);
L
Linus Torvalds 已提交
983
		if (status) {
984
			dev_dbg(dev, "%s - DOWNLOAD MODE -- BAD I2C\n", __func__);
L
Linus Torvalds 已提交
985 986
			return status;
		}
987

L
Linus Torvalds 已提交
988 989 990
		/* Validate Hardware version number
		 * Read Manufacturing Descriptor from TI Based Edgeport
		 */
991
		ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
992
		if (!ti_manuf_desc)
L
Linus Torvalds 已提交
993
			return -ENOMEM;
994

995
		status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
L
Linus Torvalds 已提交
996
		if (status) {
997
			kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
998 999 1000
			return status;
		}

1001 1002
		/* Check version number of ION descriptor */
		if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
1003
			dev_dbg(dev, "%s - Wrong CPU Rev %d (Must be 2)\n",
1004 1005 1006 1007
				__func__, ti_cpu_rev(ti_manuf_desc));
			kfree(ti_manuf_desc);
			return -EINVAL;
  		}
L
Linus Torvalds 已提交
1008

1009
		rom_desc = kmalloc(sizeof(*rom_desc), GFP_KERNEL);
L
Linus Torvalds 已提交
1010
		if (!rom_desc) {
1011
			kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1012 1013 1014
			return -ENOMEM;
		}

1015 1016 1017 1018
		/* Search for type 2 record (firmware record) */
		start_address = get_descriptor_addr(serial,
				I2C_DESC_TYPE_FIRMWARE_BASIC, rom_desc);
		if (start_address != 0) {
L
Linus Torvalds 已提交
1019
			struct ti_i2c_firmware_rec *firmware_version;
1020
			u8 *record;
L
Linus Torvalds 已提交
1021

1022
			dev_dbg(dev, "%s - Found Type FIRMWARE (Type 2) record\n", __func__);
L
Linus Torvalds 已提交
1023

1024 1025
			firmware_version = kmalloc(sizeof(*firmware_version),
								GFP_KERNEL);
L
Linus Torvalds 已提交
1026
			if (!firmware_version) {
1027 1028
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1029 1030 1031
				return -ENOMEM;
			}

1032 1033 1034 1035 1036
			/* Validate version number
			 * Read the descriptor data
			 */
			status = read_rom(serial, start_address +
					sizeof(struct ti_i2c_desc),
L
Linus Torvalds 已提交
1037 1038 1039
					sizeof(struct ti_i2c_firmware_rec),
					(__u8 *)firmware_version);
			if (status) {
1040 1041 1042
				kfree(firmware_version);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1043 1044 1045
				return status;
			}

1046 1047 1048
			/* Check version number of download with current
			   version in I2c */
			download_cur_ver = (firmware_version->Ver_Major << 8) +
L
Linus Torvalds 已提交
1049
					   (firmware_version->Ver_Minor);
1050 1051
			download_new_ver = (OperationalMajorVersion << 8) +
					   (OperationalMinorVersion);
L
Linus Torvalds 已提交
1052

1053 1054 1055 1056 1057
			dev_dbg(dev, "%s - >> FW Versions Device %d.%d  Driver %d.%d\n",
				__func__, firmware_version->Ver_Major,
				firmware_version->Ver_Minor,
				OperationalMajorVersion,
				OperationalMinorVersion);
L
Linus Torvalds 已提交
1058

1059 1060
			/* Check if we have an old version in the I2C and
			   update if necessary */
1061
			if (download_cur_ver < download_new_ver) {
1062 1063 1064 1065 1066 1067
				dev_dbg(dev, "%s - Update I2C dld from %d.%d to %d.%d\n",
					__func__,
					firmware_version->Ver_Major,
					firmware_version->Ver_Minor,
					OperationalMajorVersion,
					OperationalMinorVersion);
1068

1069 1070 1071 1072 1073 1074 1075
				record = kmalloc(1, GFP_KERNEL);
				if (!record) {
					kfree(firmware_version);
					kfree(rom_desc);
					kfree(ti_manuf_desc);
					return -ENOMEM;
				}
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
				/* In order to update the I2C firmware we must
				 * change the type 2 record to type 0xF2. This
				 * will force the UMP to come up in Boot Mode.
				 * Then while in boot mode, the driver will
				 * download the latest firmware (padded to
				 * 15.5k) into the UMP ram. Finally when the
				 * device comes back up in download mode the
				 * driver will cause the new firmware to be
				 * copied from the UMP Ram to I2C and the
				 * firmware will update the record type from
				 * 0xf2 to 0x02.
				 */
1088
				*record = I2C_DESC_TYPE_FIRMWARE_BLANK;
L
Linus Torvalds 已提交
1089

1090 1091 1092
				/* Change the I2C Firmware record type to
				   0xf2 to trigger an update */
				status = write_rom(serial, start_address,
1093
						sizeof(*record), record);
L
Linus Torvalds 已提交
1094
				if (status) {
1095
					kfree(record);
1096 1097 1098
					kfree(firmware_version);
					kfree(rom_desc);
					kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1099 1100 1101
					return status;
				}

1102 1103 1104 1105 1106
				/* verify the write -- must do this in order
				 * for write to complete before we do the
				 * hardware reset
				 */
				status = read_rom(serial,
L
Linus Torvalds 已提交
1107
							start_address,
1108 1109
							sizeof(*record),
							record);
L
Linus Torvalds 已提交
1110
				if (status) {
1111
					kfree(record);
1112 1113 1114
					kfree(firmware_version);
					kfree(rom_desc);
					kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1115 1116 1117
					return status;
				}

1118
				if (*record != I2C_DESC_TYPE_FIRMWARE_BLANK) {
1119
					dev_err(dev, "%s - error resetting device\n", __func__);
1120
					kfree(record);
1121 1122 1123
					kfree(firmware_version);
					kfree(rom_desc);
					kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1124 1125 1126
					return -ENODEV;
				}

1127
				dev_dbg(dev, "%s - HARDWARE RESET\n", __func__);
L
Linus Torvalds 已提交
1128

1129 1130 1131 1132
				/* Reset UMP -- Back to BOOT MODE */
				status = ti_vsend_sync(serial->serial->dev,
						UMPC_HARDWARE_RESET,
						0, 0, NULL, 0);
L
Linus Torvalds 已提交
1133

1134
				dev_dbg(dev, "%s - HARDWARE RESET return %d\n", __func__, status);
L
Linus Torvalds 已提交
1135 1136

				/* return an error on purpose. */
1137
				kfree(record);
1138 1139 1140
				kfree(firmware_version);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1141 1142
				return -ENODEV;
			}
1143
			kfree(firmware_version);
L
Linus Torvalds 已提交
1144
		}
1145 1146 1147 1148
		/* Search for type 0xF2 record (firmware blank record) */
		else if ((start_address = get_descriptor_addr(serial, I2C_DESC_TYPE_FIRMWARE_BLANK, rom_desc)) != 0) {
#define HEADER_SIZE	(sizeof(struct ti_i2c_desc) + \
					sizeof(struct ti_i2c_firmware_rec))
L
Linus Torvalds 已提交
1149 1150 1151
			__u8 *header;
			__u8 *vheader;

1152
			header = kmalloc(HEADER_SIZE, GFP_KERNEL);
L
Linus Torvalds 已提交
1153
			if (!header) {
1154 1155
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1156 1157
				return -ENOMEM;
			}
1158 1159

			vheader = kmalloc(HEADER_SIZE, GFP_KERNEL);
L
Linus Torvalds 已提交
1160
			if (!vheader) {
1161 1162 1163
				kfree(header);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1164 1165
				return -ENOMEM;
			}
1166

1167
			dev_dbg(dev, "%s - Found Type BLANK FIRMWARE (Type F2) record\n", __func__);
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180

			/*
			 * In order to update the I2C firmware we must change
			 * the type 2 record to type 0xF2. This will force the
			 * UMP to come up in Boot Mode.  Then while in boot
			 * mode, the driver will download the latest firmware
			 * (padded to 15.5k) into the UMP ram. Finally when the
			 * device comes back up in download mode the driver
			 * will cause the new firmware to be copied from the
			 * UMP Ram to I2C and the firmware will update the
			 * record type from 0xf2 to 0x02.
			 */
			status = build_i2c_fw_hdr(header, dev);
L
Linus Torvalds 已提交
1181
			if (status) {
1182 1183 1184 1185
				kfree(vheader);
				kfree(header);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
1186
				return -EINVAL;
L
Linus Torvalds 已提交
1187 1188
			}

1189 1190 1191
			/* Update I2C with type 0xf2 record with correct
			   size and checksum */
			status = write_rom(serial,
L
Linus Torvalds 已提交
1192 1193 1194 1195
						start_address,
						HEADER_SIZE,
						header);
			if (status) {
1196 1197 1198 1199
				kfree(vheader);
				kfree(header);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
1200
				return -EINVAL;
L
Linus Torvalds 已提交
1201 1202
			}

1203 1204 1205 1206
			/* verify the write -- must do this in order for
			   write to complete before we do the hardware reset */
			status = read_rom(serial, start_address,
							HEADER_SIZE, vheader);
L
Linus Torvalds 已提交
1207 1208

			if (status) {
1209
				dev_dbg(dev, "%s - can't read header back\n", __func__);
1210 1211 1212 1213
				kfree(vheader);
				kfree(header);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1214 1215 1216
				return status;
			}
			if (memcmp(vheader, header, HEADER_SIZE)) {
1217
				dev_dbg(dev, "%s - write download record failed\n", __func__);
1218 1219 1220 1221
				kfree(vheader);
				kfree(header);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
1222
				return -EINVAL;
L
Linus Torvalds 已提交
1223 1224
			}

1225 1226
			kfree(vheader);
			kfree(header);
L
Linus Torvalds 已提交
1227

1228
			dev_dbg(dev, "%s - Start firmware update\n", __func__);
L
Linus Torvalds 已提交
1229

1230 1231 1232
			/* Tell firmware to copy download image into I2C */
			status = ti_vsend_sync(serial->serial->dev,
					UMPC_COPY_DNLD_TO_I2C, 0, 0, NULL, 0);
L
Linus Torvalds 已提交
1233

1234
		  	dev_dbg(dev, "%s - Update complete 0x%x\n", __func__, status);
L
Linus Torvalds 已提交
1235
			if (status) {
1236 1237 1238 1239 1240
				dev_err(dev,
					"%s - UMPC_COPY_DNLD_TO_I2C failed\n",
								__func__);
				kfree(rom_desc);
				kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1241 1242 1243 1244 1245
				return status;
			}
		}

		// The device is running the download code
1246 1247
		kfree(rom_desc);
		kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1248 1249 1250 1251 1252 1253
		return 0;
	}

	/********************************************************************/
	/* Boot Mode */
	/********************************************************************/
1254
	dev_dbg(dev, "%s - RUNNING IN BOOT MODE\n", __func__);
L
Linus Torvalds 已提交
1255

1256 1257
	/* Configure the TI device so we can use the BULK pipes for download */
	status = config_boot_dev(serial->serial->dev);
L
Linus Torvalds 已提交
1258 1259 1260
	if (status)
		return status;

1261 1262
	if (le16_to_cpu(serial->serial->dev->descriptor.idVendor)
							!= USB_VENDOR_ID_ION) {
1263 1264
		dev_dbg(dev, "%s - VID = 0x%x\n", __func__,
			le16_to_cpu(serial->serial->dev->descriptor.idVendor));
L
Linus Torvalds 已提交
1265
		serial->TI_I2C_Type = DTK_ADDR_SPACE_I2C_TYPE_II;
1266
		goto stayinbootmode;
L
Linus Torvalds 已提交
1267 1268
	}

1269 1270 1271 1272
	/* We have an ION device (I2c Must be programmed)
	   Determine I2C image type */
	if (i2c_type_bootmode(serial))
		goto stayinbootmode;
L
Linus Torvalds 已提交
1273

1274 1275
	/* Check for ION Vendor ID and that the I2C is valid */
	if (!check_i2c_image(serial)) {
L
Linus Torvalds 已提交
1276 1277 1278 1279 1280
		struct ti_i2c_image_header *header;
		int i;
		__u8 cs = 0;
		__u8 *buffer;
		int buffer_size;
1281 1282 1283
		int err;
		const struct firmware *fw;
		const char *fw_name = "edgeport/down3.bin";
L
Linus Torvalds 已提交
1284 1285 1286 1287

		/* Validate Hardware version number
		 * Read Manufacturing Descriptor from TI Based Edgeport
		 */
1288
		ti_manuf_desc = kmalloc(sizeof(*ti_manuf_desc), GFP_KERNEL);
1289
		if (!ti_manuf_desc)
L
Linus Torvalds 已提交
1290
			return -ENOMEM;
1291

1292
		status = get_manuf_info(serial, (__u8 *)ti_manuf_desc);
L
Linus Torvalds 已提交
1293
		if (status) {
1294 1295
			kfree(ti_manuf_desc);
			goto stayinbootmode;
L
Linus Torvalds 已提交
1296 1297
		}

1298 1299
		/* Check for version 2 */
		if (!ignore_cpu_rev && ti_cpu_rev(ti_manuf_desc) < 2) {
1300 1301
			dev_dbg(dev, "%s - Wrong CPU Rev %d (Must be 2)\n",
				__func__, ti_cpu_rev(ti_manuf_desc));
1302 1303
			kfree(ti_manuf_desc);
			goto stayinbootmode;
L
Linus Torvalds 已提交
1304 1305
		}

1306
		kfree(ti_manuf_desc);
L
Linus Torvalds 已提交
1307 1308

		/*
1309 1310 1311 1312 1313 1314 1315 1316 1317
		 * In order to update the I2C firmware we must change the type
		 * 2 record to type 0xF2. This will force the UMP to come up
		 * in Boot Mode.  Then while in boot mode, the driver will
		 * download the latest firmware (padded to 15.5k) into the
		 * UMP ram. Finally when the device comes back up in download
		 * mode the driver will cause the new firmware to be copied
		 * from the UMP Ram to I2C and the firmware will update the
		 * record type from 0xf2 to 0x02.
		 *
L
Linus Torvalds 已提交
1318 1319 1320 1321
		 * Do we really have to copy the whole firmware image,
		 * or could we do this in place!
		 */

1322 1323 1324 1325
		/* Allocate a 15.5k buffer + 3 byte header */
		buffer_size = (((1024 * 16) - 512) +
					sizeof(struct ti_i2c_image_header));
		buffer = kmalloc(buffer_size, GFP_KERNEL);
1326
		if (!buffer)
L
Linus Torvalds 已提交
1327
			return -ENOMEM;
1328 1329 1330

		/* Initialize the buffer to 0xff (pad the buffer) */
		memset(buffer, 0xff, buffer_size);
L
Linus Torvalds 已提交
1331

1332 1333
		err = request_firmware(&fw, fw_name, dev);
		if (err) {
1334 1335
			dev_err(dev, "Failed to load image \"%s\" err %d\n",
				fw_name, err);
1336 1337 1338 1339 1340
			kfree(buffer);
			return err;
		}
		memcpy(buffer, &fw->data[4], fw->size - 4);
		release_firmware(fw);
L
Linus Torvalds 已提交
1341

1342 1343
		for (i = sizeof(struct ti_i2c_image_header);
				i < buffer_size; i++) {
L
Linus Torvalds 已提交
1344 1345
			cs = (__u8)(cs + buffer[i]);
		}
1346

L
Linus Torvalds 已提交
1347
		header = (struct ti_i2c_image_header *)buffer;
1348 1349 1350 1351

		/* update length and checksum after padding */
		header->Length 	 = cpu_to_le16((__u16)(buffer_size -
					sizeof(struct ti_i2c_image_header)));
L
Linus Torvalds 已提交
1352 1353
		header->CheckSum = cs;

1354
		/* Download the operational code  */
1355
		dev_dbg(dev, "%s - Downloading operational code image (TI UMP)\n", __func__);
1356
		status = download_code(serial, buffer, buffer_size);
L
Linus Torvalds 已提交
1357

1358
		kfree(buffer);
L
Linus Torvalds 已提交
1359 1360

		if (status) {
1361
			dev_dbg(dev, "%s - Error downloading operational code image\n", __func__);
L
Linus Torvalds 已提交
1362 1363 1364
			return status;
		}

1365
		/* Device will reboot */
L
Linus Torvalds 已提交
1366 1367
		serial->product_info.TiMode = TI_MODE_TRANSITIONING;

1368
		dev_dbg(dev, "%s - Download successful -- Device rebooting...\n", __func__);
L
Linus Torvalds 已提交
1369 1370 1371 1372 1373

		/* return an error on purpose */
		return -ENODEV;
	}

1374 1375
stayinbootmode:
	/* Eprom is invalid or blank stay in boot mode */
1376
	dev_dbg(dev, "%s - STAYING IN BOOT MODE\n", __func__);
L
Linus Torvalds 已提交
1377 1378 1379 1380 1381 1382
	serial->product_info.TiMode = TI_MODE_BOOT;

	return 0;
}


1383
static int ti_do_config(struct edgeport_port *port, int feature, int on)
L
Linus Torvalds 已提交
1384
{
1385 1386
	int port_number = port->port->port_number;

1387 1388 1389 1390
	on = !!on;	/* 1 or 0 not bitmask */
	return send_cmd(port->port->serial->dev,
			feature, (__u8)(UMPM_UART1_PORT + port_number),
			on, NULL, 0);
L
Linus Torvalds 已提交
1391 1392 1393
}


1394
static int restore_mcr(struct edgeport_port *port, __u8 mcr)
L
Linus Torvalds 已提交
1395 1396 1397
{
	int status = 0;

1398
	dev_dbg(&port->port->dev, "%s - %x\n", __func__, mcr);
L
Linus Torvalds 已提交
1399

1400
	status = ti_do_config(port, UMPC_SET_CLR_DTR, mcr & MCR_DTR);
L
Linus Torvalds 已提交
1401 1402
	if (status)
		return status;
1403
	status = ti_do_config(port, UMPC_SET_CLR_RTS, mcr & MCR_RTS);
L
Linus Torvalds 已提交
1404 1405
	if (status)
		return status;
1406
	return ti_do_config(port, UMPC_SET_CLR_LOOPBACK, mcr & MCR_LOOPBACK);
L
Linus Torvalds 已提交
1407 1408 1409
}

/* Convert TI LSR to standard UART flags */
1410
static __u8 map_line_status(__u8 ti_lsr)
L
Linus Torvalds 已提交
1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
{
	__u8 lsr = 0;

#define MAP_FLAG(flagUmp, flagUart)    \
	if (ti_lsr & flagUmp) \
		lsr |= flagUart;

	MAP_FLAG(UMP_UART_LSR_OV_MASK, LSR_OVER_ERR)	/* overrun */
	MAP_FLAG(UMP_UART_LSR_PE_MASK, LSR_PAR_ERR)	/* parity error */
	MAP_FLAG(UMP_UART_LSR_FE_MASK, LSR_FRM_ERR)	/* framing error */
	MAP_FLAG(UMP_UART_LSR_BR_MASK, LSR_BREAK)	/* break detected */
1422 1423
	MAP_FLAG(UMP_UART_LSR_RX_MASK, LSR_RX_AVAIL)	/* rx data available */
	MAP_FLAG(UMP_UART_LSR_TX_MASK, LSR_TX_EMPTY)	/* tx hold reg empty */
L
Linus Torvalds 已提交
1424 1425 1426 1427 1428 1429

#undef MAP_FLAG

	return lsr;
}

1430
static void handle_new_msr(struct edgeport_port *edge_port, __u8 msr)
L
Linus Torvalds 已提交
1431 1432 1433 1434
{
	struct async_icount *icount;
	struct tty_struct *tty;

1435
	dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, msr);
L
Linus Torvalds 已提交
1436

1437 1438
	if (msr & (EDGEPORT_MSR_DELTA_CTS | EDGEPORT_MSR_DELTA_DSR |
			EDGEPORT_MSR_DELTA_RI | EDGEPORT_MSR_DELTA_CD)) {
1439
		icount = &edge_port->port->icount;
L
Linus Torvalds 已提交
1440 1441 1442 1443 1444 1445 1446 1447 1448 1449

		/* update input line counters */
		if (msr & EDGEPORT_MSR_DELTA_CTS)
			icount->cts++;
		if (msr & EDGEPORT_MSR_DELTA_DSR)
			icount->dsr++;
		if (msr & EDGEPORT_MSR_DELTA_CD)
			icount->dcd++;
		if (msr & EDGEPORT_MSR_DELTA_RI)
			icount->rng++;
1450
		wake_up_interruptible(&edge_port->port->port.delta_msr_wait);
L
Linus Torvalds 已提交
1451 1452 1453 1454 1455
	}

	/* Save the new modem status */
	edge_port->shadow_msr = msr & 0xf0;

A
Alan Cox 已提交
1456
	tty = tty_port_tty_get(&edge_port->port->port);
L
Linus Torvalds 已提交
1457 1458 1459 1460 1461 1462 1463 1464 1465
	/* handle CTS flow control */
	if (tty && C_CRTSCTS(tty)) {
		if (msr & EDGEPORT_MSR_CTS) {
			tty->hw_stopped = 0;
			tty_wakeup(tty);
		} else {
			tty->hw_stopped = 1;
		}
	}
A
Alan Cox 已提交
1466
	tty_kref_put(tty);
L
Linus Torvalds 已提交
1467 1468
}

1469 1470
static void handle_new_lsr(struct edgeport_port *edge_port, int lsr_data,
							__u8 lsr, __u8 data)
L
Linus Torvalds 已提交
1471 1472
{
	struct async_icount *icount;
1473 1474
	__u8 new_lsr = (__u8)(lsr & (__u8)(LSR_OVER_ERR | LSR_PAR_ERR |
						LSR_FRM_ERR | LSR_BREAK));
L
Linus Torvalds 已提交
1475

1476
	dev_dbg(&edge_port->port->dev, "%s - %02x\n", __func__, new_lsr);
L
Linus Torvalds 已提交
1477 1478 1479

	edge_port->shadow_lsr = lsr;

1480
	if (new_lsr & LSR_BREAK)
L
Linus Torvalds 已提交
1481 1482 1483 1484 1485 1486 1487
		/*
		 * Parity and Framing errors only count if they
		 * occur exclusive of a break being received.
		 */
		new_lsr &= (__u8)(LSR_OVER_ERR | LSR_BREAK);

	/* Place LSR data byte into Rx buffer */
J
Jiri Slaby 已提交
1488 1489
	if (lsr_data)
		edge_tty_recv(edge_port->port, &data, 1);
L
Linus Torvalds 已提交
1490 1491

	/* update input line counters */
1492
	icount = &edge_port->port->icount;
L
Linus Torvalds 已提交
1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503
	if (new_lsr & LSR_BREAK)
		icount->brk++;
	if (new_lsr & LSR_OVER_ERR)
		icount->overrun++;
	if (new_lsr & LSR_PAR_ERR)
		icount->parity++;
	if (new_lsr & LSR_FRM_ERR)
		icount->frame++;
}


1504
static void edge_interrupt_callback(struct urb *urb)
L
Linus Torvalds 已提交
1505
{
1506
	struct edgeport_serial *edge_serial = urb->context;
L
Linus Torvalds 已提交
1507 1508
	struct usb_serial_port *port;
	struct edgeport_port *edge_port;
1509
	struct device *dev;
L
Linus Torvalds 已提交
1510 1511 1512 1513
	unsigned char *data = urb->transfer_buffer;
	int length = urb->actual_length;
	int port_number;
	int function;
1514
	int retval;
L
Linus Torvalds 已提交
1515 1516
	__u8 lsr;
	__u8 msr;
1517
	int status = urb->status;
L
Linus Torvalds 已提交
1518

1519
	switch (status) {
L
Linus Torvalds 已提交
1520 1521 1522 1523 1524 1525 1526
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
1527
		dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
1528
		    __func__, status);
L
Linus Torvalds 已提交
1529 1530
		return;
	default:
1531
		dev_err(&urb->dev->dev, "%s - nonzero urb status received: "
1532
			"%d\n", __func__, status);
L
Linus Torvalds 已提交
1533 1534 1535 1536
		goto exit;
	}

	if (!length) {
1537
		dev_dbg(&urb->dev->dev, "%s - no data in urb\n", __func__);
L
Linus Torvalds 已提交
1538 1539
		goto exit;
	}
1540

1541
	dev = &edge_serial->serial->dev->dev;
1542
	usb_serial_debug_data(dev, __func__, length, data);
1543

L
Linus Torvalds 已提交
1544
	if (length != 2) {
1545
		dev_dbg(dev, "%s - expecting packet of size 2, got %d\n", __func__, length);
L
Linus Torvalds 已提交
1546 1547 1548
		goto exit;
	}

1549 1550
	port_number = TIUMP_GET_PORT_FROM_CODE(data[0]);
	function    = TIUMP_GET_FUNC_FROM_CODE(data[0]);
1551 1552
	dev_dbg(dev, "%s - port_number %d, function %d, info 0x%x\n", __func__,
		port_number, function, data[1]);
L
Linus Torvalds 已提交
1553 1554 1555
	port = edge_serial->serial->port[port_number];
	edge_port = usb_get_serial_port_data(port);
	if (!edge_port) {
1556
		dev_dbg(dev, "%s - edge_port not found\n", __func__);
L
Linus Torvalds 已提交
1557 1558 1559 1560
		return;
	}
	switch (function) {
	case TIUMP_INTERRUPT_CODE_LSR:
1561
		lsr = map_line_status(data[1]);
L
Linus Torvalds 已提交
1562
		if (lsr & UMP_UART_LSR_DATA_MASK) {
1563 1564
			/* Save the LSR event for bulk read
			   completion routine */
1565 1566
			dev_dbg(dev, "%s - LSR Event Port %u LSR Status = %02x\n",
				__func__, port_number, lsr);
L
Linus Torvalds 已提交
1567 1568 1569
			edge_port->lsr_event = 1;
			edge_port->lsr_mask = lsr;
		} else {
1570 1571
			dev_dbg(dev, "%s - ===== Port %d LSR Status = %02x ======\n",
				__func__, port_number, lsr);
1572
			handle_new_lsr(edge_port, 0, lsr, 0);
L
Linus Torvalds 已提交
1573 1574 1575
		}
		break;

1576
	case TIUMP_INTERRUPT_CODE_MSR:	/* MSR */
L
Linus Torvalds 已提交
1577 1578
		/* Copy MSR from UMP */
		msr = data[1];
1579 1580
		dev_dbg(dev, "%s - ===== Port %u MSR Status = %02x ======\n",
			__func__, port_number, msr);
1581
		handle_new_msr(edge_port, msr);
L
Linus Torvalds 已提交
1582 1583 1584
		break;

	default:
1585 1586 1587
		dev_err(&urb->dev->dev,
			"%s - Unknown Interrupt code from UMP %x\n",
			__func__, data[1]);
L
Linus Torvalds 已提交
1588
		break;
1589

L
Linus Torvalds 已提交
1590 1591 1592
	}

exit:
1593
	retval = usb_submit_urb(urb, GFP_ATOMIC);
1594
	if (retval)
1595 1596
		dev_err(&urb->dev->dev,
			"%s - usb_submit_urb failed with result %d\n",
1597
			 __func__, retval);
L
Linus Torvalds 已提交
1598 1599
}

1600
static void edge_bulk_in_callback(struct urb *urb)
L
Linus Torvalds 已提交
1601
{
1602
	struct edgeport_port *edge_port = urb->context;
1603
	struct device *dev = &edge_port->port->dev;
L
Linus Torvalds 已提交
1604
	unsigned char *data = urb->transfer_buffer;
1605
	int retval = 0;
L
Linus Torvalds 已提交
1606
	int port_number;
1607
	int status = urb->status;
L
Linus Torvalds 已提交
1608

1609
	switch (status) {
L
Linus Torvalds 已提交
1610 1611 1612 1613 1614 1615 1616
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
1617
		dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n", __func__, status);
L
Linus Torvalds 已提交
1618 1619
		return;
	default:
1620
		dev_err(&urb->dev->dev, "%s - nonzero read bulk status received: %d\n", __func__, status);
L
Linus Torvalds 已提交
1621 1622
	}

1623
	if (status == -EPIPE)
L
Linus Torvalds 已提交
1624 1625
		goto exit;

1626
	if (status) {
1627
		dev_err(&urb->dev->dev, "%s - stopping read!\n", __func__);
L
Linus Torvalds 已提交
1628 1629 1630
		return;
	}

1631
	port_number = edge_port->port->port_number;
L
Linus Torvalds 已提交
1632 1633 1634

	if (edge_port->lsr_event) {
		edge_port->lsr_event = 0;
1635 1636
		dev_dbg(dev, "%s ===== Port %u LSR Status = %02x, Data = %02x ======\n",
			__func__, port_number, edge_port->lsr_mask, *data);
1637
		handle_new_lsr(edge_port, 1, edge_port->lsr_mask, *data);
L
Linus Torvalds 已提交
1638 1639 1640 1641 1642
		/* Adjust buffer length/pointer */
		--urb->actual_length;
		++data;
	}

J
Jiri Slaby 已提交
1643
	if (urb->actual_length) {
1644
		usb_serial_debug_data(dev, __func__, urb->actual_length, data);
1645
		if (edge_port->close_pending)
1646
			dev_dbg(dev, "%s - close pending, dropping data on the floor\n",
1647 1648
								__func__);
		else
J
Jiri Slaby 已提交
1649
			edge_tty_recv(edge_port->port, data,
J
Jiri Slaby 已提交
1650
					urb->actual_length);
1651
		edge_port->port->icount.rx += urb->actual_length;
L
Linus Torvalds 已提交
1652 1653 1654 1655 1656
	}

exit:
	/* continue read unless stopped */
	spin_lock(&edge_port->ep_lock);
1657
	if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
1658
		retval = usb_submit_urb(urb, GFP_ATOMIC);
1659
	else if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPING)
L
Linus Torvalds 已提交
1660
		edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPED;
1661

L
Linus Torvalds 已提交
1662
	spin_unlock(&edge_port->ep_lock);
1663
	if (retval)
1664
		dev_err(dev, "%s - usb_submit_urb failed with result %d\n", __func__, retval);
L
Linus Torvalds 已提交
1665 1666
}

J
Jiri Slaby 已提交
1667 1668
static void edge_tty_recv(struct usb_serial_port *port, unsigned char *data,
		int length)
L
Linus Torvalds 已提交
1669
{
1670
	int queued;
L
Linus Torvalds 已提交
1671

J
Jiri Slaby 已提交
1672
	queued = tty_insert_flip_string(&port->port, data, length);
1673
	if (queued < length)
J
Jiri Slaby 已提交
1674
		dev_err(&port->dev, "%s - dropping data, %d bytes lost\n",
1675
			__func__, length - queued);
J
Jiri Slaby 已提交
1676
	tty_flip_buffer_push(&port->port);
L
Linus Torvalds 已提交
1677 1678
}

1679
static void edge_bulk_out_callback(struct urb *urb)
L
Linus Torvalds 已提交
1680
{
1681
	struct usb_serial_port *port = urb->context;
L
Linus Torvalds 已提交
1682
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
1683
	int status = urb->status;
A
Alan Cox 已提交
1684
	struct tty_struct *tty;
L
Linus Torvalds 已提交
1685 1686 1687

	edge_port->ep_write_urb_in_use = 0;

1688
	switch (status) {
L
Linus Torvalds 已提交
1689 1690 1691 1692 1693 1694 1695
	case 0:
		/* success */
		break;
	case -ECONNRESET:
	case -ENOENT:
	case -ESHUTDOWN:
		/* this urb is terminated, clean up */
1696
		dev_dbg(&urb->dev->dev, "%s - urb shutting down with status: %d\n",
1697
		    __func__, status);
L
Linus Torvalds 已提交
1698 1699
		return;
	default:
1700
		dev_err_console(port, "%s - nonzero write bulk status "
1701
			"received: %d\n", __func__, status);
L
Linus Torvalds 已提交
1702 1703 1704
	}

	/* send any buffered data */
A
Alan Cox 已提交
1705
	tty = tty_port_tty_get(&port->port);
1706
	edge_send(port, tty);
A
Alan Cox 已提交
1707
	tty_kref_put(tty);
L
Linus Torvalds 已提交
1708 1709
}

1710
static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)
L
Linus Torvalds 已提交
1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723
{
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	struct edgeport_serial *edge_serial;
	struct usb_device *dev;
	struct urb *urb;
	int port_number;
	int status;
	u16 open_settings;
	u8 transaction_timeout;

	if (edge_port == NULL)
		return -ENODEV;

1724
	port_number = port->port_number;
L
Linus Torvalds 已提交
1725 1726 1727 1728

	dev = port->serial->dev;

	/* turn off loopback */
1729
	status = ti_do_config(edge_port, UMPC_SET_CLR_LOOPBACK, 0);
L
Linus Torvalds 已提交
1730
	if (status) {
1731 1732
		dev_err(&port->dev,
				"%s - cannot send clear loopback command, %d\n",
1733
			__func__, status);
L
Linus Torvalds 已提交
1734 1735
		return status;
	}
1736

L
Linus Torvalds 已提交
1737
	/* set up the port settings */
A
Alan Cox 已提交
1738
	if (tty)
1739
		edge_set_termios(tty, port, &tty->termios);
L
Linus Torvalds 已提交
1740 1741 1742 1743 1744 1745

	/* open up the port */

	/* milliseconds to timeout for DMA transfer */
	transaction_timeout = 2;

1746 1747
	edge_port->ump_read_timeout =
				max(20, ((transaction_timeout * 3) / 2));
L
Linus Torvalds 已提交
1748

1749 1750 1751
	/* milliseconds to timeout for DMA transfer */
	open_settings = (u8)(UMP_DMA_MODE_CONTINOUS |
			     UMP_PIPE_TRANS_TIMEOUT_ENA |
L
Linus Torvalds 已提交
1752 1753
			     (transaction_timeout << 2));

1754
	dev_dbg(&port->dev, "%s - Sending UMPC_OPEN_PORT\n", __func__);
L
Linus Torvalds 已提交
1755 1756

	/* Tell TI to open and start the port */
1757 1758
	status = send_cmd(dev, UMPC_OPEN_PORT,
		(u8)(UMPM_UART1_PORT + port_number), open_settings, NULL, 0);
L
Linus Torvalds 已提交
1759
	if (status) {
1760 1761
		dev_err(&port->dev, "%s - cannot send open command, %d\n",
							__func__, status);
L
Linus Torvalds 已提交
1762 1763 1764 1765
		return status;
	}

	/* Start the DMA? */
1766 1767
	status = send_cmd(dev, UMPC_START_PORT,
		(u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0);
L
Linus Torvalds 已提交
1768
	if (status) {
1769 1770
		dev_err(&port->dev, "%s - cannot send start DMA command, %d\n",
							__func__, status);
L
Linus Torvalds 已提交
1771 1772 1773 1774
		return status;
	}

	/* Clear TX and RX buffers in UMP */
1775
	status = purge_port(port, UMP_PORT_DIR_OUT | UMP_PORT_DIR_IN);
L
Linus Torvalds 已提交
1776
	if (status) {
1777 1778 1779
		dev_err(&port->dev,
			"%s - cannot send clear buffers command, %d\n",
			__func__, status);
L
Linus Torvalds 已提交
1780 1781 1782 1783
		return status;
	}

	/* Read Initial MSR */
1784 1785 1786
	status = ti_vread_sync(dev, UMPC_READ_MSR, 0,
				(__u16)(UMPM_UART1_PORT + port_number),
				&edge_port->shadow_msr, 1);
L
Linus Torvalds 已提交
1787
	if (status) {
1788 1789
		dev_err(&port->dev, "%s - cannot send read MSR command, %d\n",
							__func__, status);
L
Linus Torvalds 已提交
1790 1791 1792
		return status;
	}

1793
	dev_dbg(&port->dev, "ShadowMSR 0x%X\n", edge_port->shadow_msr);
1794

L
Linus Torvalds 已提交
1795 1796
	/* Set Initial MCR */
	edge_port->shadow_mcr = MCR_RTS | MCR_DTR;
1797
	dev_dbg(&port->dev, "ShadowMCR 0x%X\n", edge_port->shadow_mcr);
L
Linus Torvalds 已提交
1798 1799

	edge_serial = edge_port->edge_serial;
1800
	if (mutex_lock_interruptible(&edge_serial->es_lock))
L
Linus Torvalds 已提交
1801 1802
		return -ERESTARTSYS;
	if (edge_serial->num_ports_open == 0) {
1803
		/* we are the first port to open, post the interrupt urb */
L
Linus Torvalds 已提交
1804 1805
		urb = edge_serial->serial->port[0]->interrupt_in_urb;
		if (!urb) {
1806 1807 1808
			dev_err(&port->dev,
				"%s - no interrupt urb present, exiting\n",
				__func__);
L
Linus Torvalds 已提交
1809
			status = -EINVAL;
1810
			goto release_es_lock;
L
Linus Torvalds 已提交
1811 1812
		}
		urb->context = edge_serial;
1813
		status = usb_submit_urb(urb, GFP_KERNEL);
L
Linus Torvalds 已提交
1814
		if (status) {
1815 1816 1817
			dev_err(&port->dev,
				"%s - usb_submit_urb failed with value %d\n",
					__func__, status);
1818
			goto release_es_lock;
L
Linus Torvalds 已提交
1819 1820 1821 1822 1823 1824 1825
		}
	}

	/*
	 * reset the data toggle on the bulk endpoints to work around bug in
	 * host controllers where things get out of sync some times
	 */
1826 1827
	usb_clear_halt(dev, port->write_urb->pipe);
	usb_clear_halt(dev, port->read_urb->pipe);
L
Linus Torvalds 已提交
1828 1829 1830 1831

	/* start up our bulk read urb */
	urb = port->read_urb;
	if (!urb) {
1832 1833
		dev_err(&port->dev, "%s - no read urb present, exiting\n",
								__func__);
L
Linus Torvalds 已提交
1834 1835 1836 1837 1838
		status = -EINVAL;
		goto unlink_int_urb;
	}
	edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
	urb->context = edge_port;
1839
	status = usb_submit_urb(urb, GFP_KERNEL);
L
Linus Torvalds 已提交
1840
	if (status) {
1841 1842 1843
		dev_err(&port->dev,
			"%s - read bulk usb_submit_urb failed with value %d\n",
				__func__, status);
L
Linus Torvalds 已提交
1844 1845 1846 1847 1848
		goto unlink_int_urb;
	}

	++edge_serial->num_ports_open;

1849
	goto release_es_lock;
L
Linus Torvalds 已提交
1850 1851 1852 1853

unlink_int_urb:
	if (edge_port->edge_serial->num_ports_open == 0)
		usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
1854 1855
release_es_lock:
	mutex_unlock(&edge_serial->es_lock);
L
Linus Torvalds 已提交
1856 1857 1858
	return status;
}

1859
static void edge_close(struct usb_serial_port *port)
L
Linus Torvalds 已提交
1860 1861 1862
{
	struct edgeport_serial *edge_serial;
	struct edgeport_port *edge_port;
1863
	struct usb_serial *serial = port->serial;
1864
	unsigned long flags;
L
Linus Torvalds 已提交
1865 1866 1867 1868
	int port_number;

	edge_serial = usb_get_serial_data(port->serial);
	edge_port = usb_get_serial_port_data(port);
1869
	if (edge_serial == NULL || edge_port == NULL)
L
Linus Torvalds 已提交
1870
		return;
1871 1872

	/* The bulkreadcompletion routine will check
L
Linus Torvalds 已提交
1873 1874 1875 1876 1877 1878
	 * this flag and dump add read data */
	edge_port->close_pending = 1;

	usb_kill_urb(port->read_urb);
	usb_kill_urb(port->write_urb);
	edge_port->ep_write_urb_in_use = 0;
1879
	spin_lock_irqsave(&edge_port->ep_lock, flags);
J
Johan Hovold 已提交
1880
	kfifo_reset_out(&port->write_fifo);
1881
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);
L
Linus Torvalds 已提交
1882

1883
	dev_dbg(&port->dev, "%s - send umpc_close_port\n", __func__);
1884
	port_number = port->port_number;
1885 1886
	send_cmd(serial->dev, UMPC_CLOSE_PORT,
		     (__u8)(UMPM_UART1_PORT + port_number), 0, NULL, 0);
1887

1888
	mutex_lock(&edge_serial->es_lock);
L
Linus Torvalds 已提交
1889 1890 1891 1892 1893 1894
	--edge_port->edge_serial->num_ports_open;
	if (edge_port->edge_serial->num_ports_open <= 0) {
		/* last port is now closed, let's shut down our interrupt urb */
		usb_kill_urb(port->serial->port[0]->interrupt_in_urb);
		edge_port->edge_serial->num_ports_open = 0;
	}
1895
	mutex_unlock(&edge_serial->es_lock);
L
Linus Torvalds 已提交
1896 1897 1898
	edge_port->close_pending = 0;
}

A
Alan Cox 已提交
1899 1900
static int edge_write(struct tty_struct *tty, struct usb_serial_port *port,
				const unsigned char *data, int count)
L
Linus Torvalds 已提交
1901 1902 1903 1904
{
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);

	if (count == 0) {
1905
		dev_dbg(&port->dev, "%s - write request of 0 bytes\n", __func__);
L
Linus Torvalds 已提交
1906 1907 1908 1909 1910 1911 1912 1913
		return 0;
	}

	if (edge_port == NULL)
		return -ENODEV;
	if (edge_port->close_pending == 1)
		return -ENODEV;

J
Johan Hovold 已提交
1914
	count = kfifo_in_locked(&port->write_fifo, data, count,
1915
							&edge_port->ep_lock);
1916
	edge_send(port, tty);
L
Linus Torvalds 已提交
1917 1918 1919 1920

	return count;
}

1921
static void edge_send(struct usb_serial_port *port, struct tty_struct *tty)
L
Linus Torvalds 已提交
1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933
{
	int count, result;
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	unsigned long flags;

	spin_lock_irqsave(&edge_port->ep_lock, flags);

	if (edge_port->ep_write_urb_in_use) {
		spin_unlock_irqrestore(&edge_port->ep_lock, flags);
		return;
	}

J
Johan Hovold 已提交
1934
	count = kfifo_out(&port->write_fifo,
L
Linus Torvalds 已提交
1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946
				port->write_urb->transfer_buffer,
				port->bulk_out_size);

	if (count == 0) {
		spin_unlock_irqrestore(&edge_port->ep_lock, flags);
		return;
	}

	edge_port->ep_write_urb_in_use = 1;

	spin_unlock_irqrestore(&edge_port->ep_lock, flags);

1947
	usb_serial_debug_data(&port->dev, __func__, count, port->write_urb->transfer_buffer);
L
Linus Torvalds 已提交
1948 1949

	/* set up our urb */
1950
	port->write_urb->transfer_buffer_length = count;
L
Linus Torvalds 已提交
1951 1952 1953 1954

	/* send the data out the bulk port */
	result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
	if (result) {
1955
		dev_err_console(port,
1956 1957
			"%s - failed submitting write urb, error %d\n",
				__func__, result);
L
Linus Torvalds 已提交
1958
		edge_port->ep_write_urb_in_use = 0;
1959 1960
		/* TODO: reschedule edge_send */
	} else
1961
		edge_port->port->icount.tx += count;
L
Linus Torvalds 已提交
1962 1963 1964

	/* wakeup any process waiting for writes to complete */
	/* there is now more room in the buffer for new writes */
1965
	if (tty)
L
Linus Torvalds 已提交
1966 1967 1968
		tty_wakeup(tty);
}

A
Alan Cox 已提交
1969
static int edge_write_room(struct tty_struct *tty)
L
Linus Torvalds 已提交
1970
{
A
Alan Cox 已提交
1971
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
1972 1973 1974 1975 1976
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int room = 0;
	unsigned long flags;

	if (edge_port == NULL)
1977
		return 0;
L
Linus Torvalds 已提交
1978
	if (edge_port->close_pending == 1)
1979
		return 0;
L
Linus Torvalds 已提交
1980 1981

	spin_lock_irqsave(&edge_port->ep_lock, flags);
J
Johan Hovold 已提交
1982
	room = kfifo_avail(&port->write_fifo);
L
Linus Torvalds 已提交
1983 1984
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);

1985
	dev_dbg(&port->dev, "%s - returns %d\n", __func__, room);
L
Linus Torvalds 已提交
1986 1987 1988
	return room;
}

A
Alan Cox 已提交
1989
static int edge_chars_in_buffer(struct tty_struct *tty)
L
Linus Torvalds 已提交
1990
{
A
Alan Cox 已提交
1991
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
1992 1993 1994 1995
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int chars = 0;
	unsigned long flags;
	if (edge_port == NULL)
1996
		return 0;
L
Linus Torvalds 已提交
1997 1998

	spin_lock_irqsave(&edge_port->ep_lock, flags);
J
Johan Hovold 已提交
1999
	chars = kfifo_len(&port->write_fifo);
L
Linus Torvalds 已提交
2000 2001
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);

2002
	dev_dbg(&port->dev, "%s - returns %d\n", __func__, chars);
L
Linus Torvalds 已提交
2003 2004 2005
	return chars;
}

2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
static bool edge_tx_empty(struct usb_serial_port *port)
{
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int ret;

	ret = tx_active(edge_port);
	if (ret > 0)
		return false;

	return true;
}

A
Alan Cox 已提交
2018
static void edge_throttle(struct tty_struct *tty)
L
Linus Torvalds 已提交
2019
{
A
Alan Cox 已提交
2020
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2021 2022 2023 2024 2025 2026 2027 2028 2029
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int status;

	if (edge_port == NULL)
		return;

	/* if we are implementing XON/XOFF, send the stop character */
	if (I_IXOFF(tty)) {
		unsigned char stop_char = STOP_CHAR(tty);
A
Alan Cox 已提交
2030 2031 2032 2033
		status = edge_write(tty, port, &stop_char, 1);
		if (status <= 0) {
			dev_err(&port->dev, "%s - failed to write stop character, %d\n", __func__, status);
		}
L
Linus Torvalds 已提交
2034 2035 2036 2037 2038 2039 2040 2041 2042
	}

	/* if we are implementing RTS/CTS, stop reads */
	/* and the Edgeport will clear the RTS line */
	if (C_CRTSCTS(tty))
		stop_read(edge_port);

}

A
Alan Cox 已提交
2043
static void edge_unthrottle(struct tty_struct *tty)
L
Linus Torvalds 已提交
2044
{
A
Alan Cox 已提交
2045
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2046 2047 2048 2049 2050 2051 2052 2053 2054
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int status;

	if (edge_port == NULL)
		return;

	/* if we are implementing XON/XOFF, send the start character */
	if (I_IXOFF(tty)) {
		unsigned char start_char = START_CHAR(tty);
A
Alan Cox 已提交
2055 2056 2057 2058
		status = edge_write(tty, port, &start_char, 1);
		if (status <= 0) {
			dev_err(&port->dev, "%s - failed to write start character, %d\n", __func__, status);
		}
L
Linus Torvalds 已提交
2059 2060 2061 2062 2063 2064
	}
	/* if we are implementing RTS/CTS, restart reads */
	/* are the Edgeport will assert the RTS line */
	if (C_CRTSCTS(tty)) {
		status = restart_read(edge_port);
		if (status)
2065 2066 2067
			dev_err(&port->dev,
				"%s - read bulk usb_submit_urb failed: %d\n",
							__func__, status);
L
Linus Torvalds 已提交
2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094
	}

}

static void stop_read(struct edgeport_port *edge_port)
{
	unsigned long flags;

	spin_lock_irqsave(&edge_port->ep_lock, flags);

	if (edge_port->ep_read_urb_state == EDGE_READ_URB_RUNNING)
		edge_port->ep_read_urb_state = EDGE_READ_URB_STOPPING;
	edge_port->shadow_mcr &= ~MCR_RTS;

	spin_unlock_irqrestore(&edge_port->ep_lock, flags);
}

static int restart_read(struct edgeport_port *edge_port)
{
	struct urb *urb;
	int status = 0;
	unsigned long flags;

	spin_lock_irqsave(&edge_port->ep_lock, flags);

	if (edge_port->ep_read_urb_state == EDGE_READ_URB_STOPPED) {
		urb = edge_port->port->read_urb;
2095
		status = usb_submit_urb(urb, GFP_ATOMIC);
L
Linus Torvalds 已提交
2096 2097 2098 2099 2100 2101 2102 2103 2104
	}
	edge_port->ep_read_urb_state = EDGE_READ_URB_RUNNING;
	edge_port->shadow_mcr |= MCR_RTS;

	spin_unlock_irqrestore(&edge_port->ep_lock, flags);

	return status;
}

A
Alan Cox 已提交
2105 2106
static void change_port_settings(struct tty_struct *tty,
		struct edgeport_port *edge_port, struct ktermios *old_termios)
L
Linus Torvalds 已提交
2107
{
2108
	struct device *dev = &edge_port->port->dev;
L
Linus Torvalds 已提交
2109 2110 2111 2112
	struct ump_uart_config *config;
	int baud;
	unsigned cflag;
	int status;
2113
	int port_number = edge_port->port->port_number;
L
Linus Torvalds 已提交
2114

A
Alan Cox 已提交
2115
	config = kmalloc (sizeof (*config), GFP_KERNEL);
L
Linus Torvalds 已提交
2116
	if (!config) {
2117
		tty->termios = *old_termios;
L
Linus Torvalds 已提交
2118 2119 2120
		return;
	}

2121
	cflag = tty->termios.c_cflag;
L
Linus Torvalds 已提交
2122 2123 2124 2125 2126 2127 2128 2129 2130

	config->wFlags = 0;

	/* These flags must be set */
	config->wFlags |= UMP_MASK_UART_FLAGS_RECEIVE_MS_INT;
	config->wFlags |= UMP_MASK_UART_FLAGS_AUTO_START_ON_ERR;
	config->bUartMode = (__u8)(edge_port->bUartMode);

	switch (cflag & CSIZE) {
2131 2132
	case CS5:
		    config->bDataBits = UMP_UART_CHAR5BITS;
2133
		    dev_dbg(dev, "%s - data bits = 5\n", __func__);
2134 2135 2136
		    break;
	case CS6:
		    config->bDataBits = UMP_UART_CHAR6BITS;
2137
		    dev_dbg(dev, "%s - data bits = 6\n", __func__);
2138 2139 2140
		    break;
	case CS7:
		    config->bDataBits = UMP_UART_CHAR7BITS;
2141
		    dev_dbg(dev, "%s - data bits = 7\n", __func__);
2142 2143 2144 2145
		    break;
	default:
	case CS8:
		    config->bDataBits = UMP_UART_CHAR8BITS;
2146
		    dev_dbg(dev, "%s - data bits = 8\n", __func__);
L
Linus Torvalds 已提交
2147 2148 2149 2150 2151 2152 2153
			    break;
	}

	if (cflag & PARENB) {
		if (cflag & PARODD) {
			config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
			config->bParity = UMP_UART_ODDPARITY;
2154
			dev_dbg(dev, "%s - parity = odd\n", __func__);
L
Linus Torvalds 已提交
2155 2156 2157
		} else {
			config->wFlags |= UMP_MASK_UART_FLAGS_PARITY;
			config->bParity = UMP_UART_EVENPARITY;
2158
			dev_dbg(dev, "%s - parity = even\n", __func__);
L
Linus Torvalds 已提交
2159 2160
		}
	} else {
2161
		config->bParity = UMP_UART_NOPARITY;
2162
		dev_dbg(dev, "%s - parity = none\n", __func__);
L
Linus Torvalds 已提交
2163 2164 2165 2166
	}

	if (cflag & CSTOPB) {
		config->bStopBits = UMP_UART_STOPBIT2;
2167
		dev_dbg(dev, "%s - stop bits = 2\n", __func__);
L
Linus Torvalds 已提交
2168 2169
	} else {
		config->bStopBits = UMP_UART_STOPBIT1;
2170
		dev_dbg(dev, "%s - stop bits = 1\n", __func__);
L
Linus Torvalds 已提交
2171 2172 2173 2174 2175 2176
	}

	/* figure out the flow control settings */
	if (cflag & CRTSCTS) {
		config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X_CTS_FLOW;
		config->wFlags |= UMP_MASK_UART_FLAGS_RTS_FLOW;
2177
		dev_dbg(dev, "%s - RTS/CTS is enabled\n", __func__);
L
Linus Torvalds 已提交
2178
	} else {
2179
		dev_dbg(dev, "%s - RTS/CTS is disabled\n", __func__);
L
Linus Torvalds 已提交
2180 2181 2182 2183
		tty->hw_stopped = 0;
		restart_read(edge_port);
	}

2184 2185 2186 2187
	/* if we are implementing XON/XOFF, set the start and stop
	   character in the device */
	config->cXon  = START_CHAR(tty);
	config->cXoff = STOP_CHAR(tty);
L
Linus Torvalds 已提交
2188

2189 2190 2191
	/* if we are implementing INBOUND XON/XOFF */
	if (I_IXOFF(tty)) {
		config->wFlags |= UMP_MASK_UART_FLAGS_IN_X;
2192 2193
		dev_dbg(dev, "%s - INBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x\n",
			__func__, config->cXon, config->cXoff);
2194
	} else
2195
		dev_dbg(dev, "%s - INBOUND XON/XOFF is disabled\n", __func__);
L
Linus Torvalds 已提交
2196

2197 2198 2199
	/* if we are implementing OUTBOUND XON/XOFF */
	if (I_IXON(tty)) {
		config->wFlags |= UMP_MASK_UART_FLAGS_OUT_X;
2200 2201
		dev_dbg(dev, "%s - OUTBOUND XON/XOFF is enabled, XON = %2x, XOFF = %2x\n",
			__func__, config->cXon, config->cXoff);
2202
	} else
2203
		dev_dbg(dev, "%s - OUTBOUND XON/XOFF is disabled\n", __func__);
L
Linus Torvalds 已提交
2204

2205
	tty->termios.c_cflag &= ~CMSPAR;
A
Alan Cox 已提交
2206

L
Linus Torvalds 已提交
2207 2208 2209 2210 2211
	/* Round the baud rate */
	baud = tty_get_baud_rate(tty);
	if (!baud) {
		/* pick a default, any default... */
		baud = 9600;
A
Alan Cox 已提交
2212 2213 2214
	} else
		tty_encode_baud_rate(tty, baud, baud);

L
Linus Torvalds 已提交
2215 2216 2217
	edge_port->baud_rate = baud;
	config->wBaudRate = (__u16)((461550L + baud/2) / baud);

A
Alan Cox 已提交
2218 2219
	/* FIXME: Recompute actual baud from divisor here */

2220
	dev_dbg(dev, "%s - baud rate = %d, wBaudRate = %d\n", __func__, baud, config->wBaudRate);
L
Linus Torvalds 已提交
2221

2222 2223 2224 2225 2226 2227 2228 2229
	dev_dbg(dev, "wBaudRate:   %d\n", (int)(461550L / config->wBaudRate));
	dev_dbg(dev, "wFlags:    0x%x\n", config->wFlags);
	dev_dbg(dev, "bDataBits:   %d\n", config->bDataBits);
	dev_dbg(dev, "bParity:     %d\n", config->bParity);
	dev_dbg(dev, "bStopBits:   %d\n", config->bStopBits);
	dev_dbg(dev, "cXon:        %d\n", config->cXon);
	dev_dbg(dev, "cXoff:       %d\n", config->cXoff);
	dev_dbg(dev, "bUartMode:   %d\n", config->bUartMode);
L
Linus Torvalds 已提交
2230 2231

	/* move the word values into big endian mode */
2232 2233
	cpu_to_be16s(&config->wFlags);
	cpu_to_be16s(&config->wBaudRate);
L
Linus Torvalds 已提交
2234

2235
	status = send_cmd(edge_port->port->serial->dev, UMPC_SET_CONFIG,
L
Linus Torvalds 已提交
2236
				(__u8)(UMPM_UART1_PORT + port_number),
2237 2238
				0, (__u8 *)config, sizeof(*config));
	if (status)
2239 2240
		dev_dbg(dev, "%s - error %d when trying to write config to device\n",
			__func__, status);
2241
	kfree(config);
L
Linus Torvalds 已提交
2242 2243
}

A
Alan Cox 已提交
2244
static void edge_set_termios(struct tty_struct *tty,
A
Alan Cox 已提交
2245
		struct usb_serial_port *port, struct ktermios *old_termios)
L
Linus Torvalds 已提交
2246 2247
{
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
A
Alan Cox 已提交
2248 2249
	unsigned int cflag;

2250
	cflag = tty->termios.c_cflag;
L
Linus Torvalds 已提交
2251

2252
	dev_dbg(&port->dev, "%s - clfag %08x iflag %08x\n", __func__,
2253
		tty->termios.c_cflag, tty->termios.c_iflag);
2254 2255
	dev_dbg(&port->dev, "%s - old clfag %08x old iflag %08x\n", __func__,
		old_termios->c_cflag, old_termios->c_iflag);
L
Linus Torvalds 已提交
2256 2257 2258 2259

	if (edge_port == NULL)
		return;
	/* change the port settings to the new ones specified */
A
Alan Cox 已提交
2260
	change_port_settings(tty, edge_port, old_termios);
L
Linus Torvalds 已提交
2261 2262
}

2263
static int edge_tiocmset(struct tty_struct *tty,
2264
					unsigned int set, unsigned int clear)
L
Linus Torvalds 已提交
2265
{
A
Alan Cox 已提交
2266
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2267 2268
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	unsigned int mcr;
2269
	unsigned long flags;
L
Linus Torvalds 已提交
2270

2271
	spin_lock_irqsave(&edge_port->ep_lock, flags);
L
Linus Torvalds 已提交
2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
	mcr = edge_port->shadow_mcr;
	if (set & TIOCM_RTS)
		mcr |= MCR_RTS;
	if (set & TIOCM_DTR)
		mcr |= MCR_DTR;
	if (set & TIOCM_LOOP)
		mcr |= MCR_LOOPBACK;

	if (clear & TIOCM_RTS)
		mcr &= ~MCR_RTS;
	if (clear & TIOCM_DTR)
		mcr &= ~MCR_DTR;
	if (clear & TIOCM_LOOP)
		mcr &= ~MCR_LOOPBACK;

	edge_port->shadow_mcr = mcr;
2288
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);
L
Linus Torvalds 已提交
2289

2290
	restore_mcr(edge_port, mcr);
L
Linus Torvalds 已提交
2291 2292 2293
	return 0;
}

2294
static int edge_tiocmget(struct tty_struct *tty)
L
Linus Torvalds 已提交
2295
{
A
Alan Cox 已提交
2296
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2297 2298 2299 2300
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	unsigned int result = 0;
	unsigned int msr;
	unsigned int mcr;
2301
	unsigned long flags;
L
Linus Torvalds 已提交
2302

2303 2304
	spin_lock_irqsave(&edge_port->ep_lock, flags);

L
Linus Torvalds 已提交
2305 2306 2307 2308 2309 2310 2311 2312 2313 2314
	msr = edge_port->shadow_msr;
	mcr = edge_port->shadow_mcr;
	result = ((mcr & MCR_DTR)	? TIOCM_DTR: 0)	  /* 0x002 */
		  | ((mcr & MCR_RTS)	? TIOCM_RTS: 0)   /* 0x004 */
		  | ((msr & EDGEPORT_MSR_CTS)	? TIOCM_CTS: 0)   /* 0x020 */
		  | ((msr & EDGEPORT_MSR_CD)	? TIOCM_CAR: 0)   /* 0x040 */
		  | ((msr & EDGEPORT_MSR_RI)	? TIOCM_RI:  0)   /* 0x080 */
		  | ((msr & EDGEPORT_MSR_DSR)	? TIOCM_DSR: 0);  /* 0x100 */


2315
	dev_dbg(&port->dev, "%s -- %x\n", __func__, result);
2316
	spin_unlock_irqrestore(&edge_port->ep_lock, flags);
L
Linus Torvalds 已提交
2317 2318 2319 2320

	return result;
}

2321 2322
static int get_serial_info(struct edgeport_port *edge_port,
				struct serial_struct __user *retinfo)
L
Linus Torvalds 已提交
2323 2324
{
	struct serial_struct tmp;
2325
	unsigned cwait;
L
Linus Torvalds 已提交
2326 2327 2328 2329

	if (!retinfo)
		return -EFAULT;

2330 2331
	cwait = edge_port->port->port.closing_wait;
	if (cwait != ASYNC_CLOSING_WAIT_NONE)
J
Johan Hovold 已提交
2332
		cwait = jiffies_to_msecs(cwait) / 10;
2333

L
Linus Torvalds 已提交
2334 2335 2336
	memset(&tmp, 0, sizeof(tmp));

	tmp.type		= PORT_16550A;
2337
	tmp.line		= edge_port->port->minor;
2338
	tmp.port		= edge_port->port->port_number;
L
Linus Torvalds 已提交
2339 2340 2341 2342 2343
	tmp.irq			= 0;
	tmp.flags		= ASYNC_SKIP_TEST | ASYNC_AUTO_IRQ;
	tmp.xmit_fifo_size	= edge_port->port->bulk_out_size;
	tmp.baud_base		= 9600;
	tmp.close_delay		= 5*HZ;
2344
	tmp.closing_wait	= cwait;
L
Linus Torvalds 已提交
2345 2346 2347 2348 2349 2350

	if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
		return -EFAULT;
	return 0;
}

2351
static int edge_ioctl(struct tty_struct *tty,
2352
					unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
2353
{
A
Alan Cox 已提交
2354
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2355 2356 2357
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);

	switch (cmd) {
2358
	case TIOCGSERIAL:
2359
		dev_dbg(&port->dev, "%s - TIOCGSERIAL\n", __func__);
2360 2361
		return get_serial_info(edge_port,
				(struct serial_struct __user *) arg);
L
Linus Torvalds 已提交
2362 2363 2364 2365
	}
	return -ENOIOCTLCMD;
}

A
Alan Cox 已提交
2366
static void edge_break(struct tty_struct *tty, int break_state)
L
Linus Torvalds 已提交
2367
{
A
Alan Cox 已提交
2368
	struct usb_serial_port *port = tty->driver_data;
L
Linus Torvalds 已提交
2369 2370
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	int status;
2371
	int bv = 0;	/* Off */
L
Linus Torvalds 已提交
2372

A
Alan Cox 已提交
2373
	if (break_state == -1)
2374 2375 2376
		bv = 1;	/* On */
	status = ti_do_config(edge_port, UMPC_SET_CLR_BREAK, bv);
	if (status)
2377 2378
		dev_dbg(&port->dev, "%s - error %d sending break set/clear command.\n",
			__func__, status);
L
Linus Torvalds 已提交
2379 2380
}

2381
static int edge_startup(struct usb_serial *serial)
L
Linus Torvalds 已提交
2382 2383 2384 2385 2386
{
	struct edgeport_serial *edge_serial;
	int status;

	/* create our private serial structure */
2387
	edge_serial = kzalloc(sizeof(struct edgeport_serial), GFP_KERNEL);
2388
	if (!edge_serial)
L
Linus Torvalds 已提交
2389
		return -ENOMEM;
2390

2391
	mutex_init(&edge_serial->es_lock);
L
Linus Torvalds 已提交
2392 2393 2394
	edge_serial->serial = serial;
	usb_set_serial_data(serial, edge_serial);

2395
	status = download_fw(edge_serial);
L
Linus Torvalds 已提交
2396
	if (status) {
2397
		kfree(edge_serial);
L
Linus Torvalds 已提交
2398 2399 2400 2401 2402 2403
		return status;
	}

	return 0;
}

2404
static void edge_disconnect(struct usb_serial *serial)
L
Linus Torvalds 已提交
2405
{
2406 2407 2408 2409
}

static void edge_release(struct usb_serial *serial)
{
2410 2411 2412 2413 2414
	kfree(usb_get_serial_data(serial));
}

static int edge_port_probe(struct usb_serial_port *port)
{
2415
	struct edgeport_port *edge_port;
2416
	int ret;
2417

2418 2419 2420 2421 2422 2423 2424 2425 2426
	edge_port = kzalloc(sizeof(*edge_port), GFP_KERNEL);
	if (!edge_port)
		return -ENOMEM;

	spin_lock_init(&edge_port->ep_lock);
	edge_port->port = port;
	edge_port->edge_serial = usb_get_serial_data(port->serial);
	edge_port->bUartMode = default_uart_mode;

2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446
	switch (port->port_number) {
	case 0:
		edge_port->uart_base = UMPMEM_BASE_UART1;
		edge_port->dma_address = UMPD_OEDB1_ADDRESS;
		break;
	case 1:
		edge_port->uart_base = UMPMEM_BASE_UART2;
		edge_port->dma_address = UMPD_OEDB2_ADDRESS;
		break;
	default:
		dev_err(&port->dev, "unknown port number\n");
		ret = -ENODEV;
		goto err;
	}

	dev_dbg(&port->dev,
		"%s - port_number = %d, uart_base = %04x, dma_address = %04x\n",
		__func__, port->port_number, edge_port->uart_base,
		edge_port->dma_address);

2447 2448
	usb_set_serial_port_data(port, edge_port);

2449
	ret = edge_create_sysfs_attrs(port);
2450 2451
	if (ret)
		goto err;
2452

2453
	port->port.closing_wait = msecs_to_jiffies(closing_wait * 10);
2454
	port->port.drain_delay = 1;
2455

2456
	return 0;
2457 2458 2459 2460
err:
	kfree(edge_port);

	return ret;
L
Linus Torvalds 已提交
2461 2462
}

2463 2464 2465 2466 2467 2468 2469 2470 2471 2472
static int edge_port_remove(struct usb_serial_port *port)
{
	struct edgeport_port *edge_port;

	edge_port = usb_get_serial_port_data(port);
	edge_remove_sysfs_attrs(port);
	kfree(edge_port);

	return 0;
}
L
Linus Torvalds 已提交
2473

2474 2475
/* Sysfs Attributes */

2476
static ssize_t uart_mode_show(struct device *dev,
2477 2478 2479 2480 2481 2482 2483 2484
	struct device_attribute *attr, char *buf)
{
	struct usb_serial_port *port = to_usb_serial_port(dev);
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);

	return sprintf(buf, "%d\n", edge_port->bUartMode);
}

2485
static ssize_t uart_mode_store(struct device *dev,
2486 2487 2488 2489 2490 2491
	struct device_attribute *attr, const char *valbuf, size_t count)
{
	struct usb_serial_port *port = to_usb_serial_port(dev);
	struct edgeport_port *edge_port = usb_get_serial_port_data(port);
	unsigned int v = simple_strtoul(valbuf, NULL, 0);

2492
	dev_dbg(dev, "%s: setting uart_mode = %d\n", __func__, v);
2493 2494 2495 2496

	if (v < 256)
		edge_port->bUartMode = v;
	else
2497
		dev_err(dev, "%s - uart_mode %d is invalid\n", __func__, v);
2498 2499 2500

	return count;
}
2501
static DEVICE_ATTR_RW(uart_mode);
2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514

static int edge_create_sysfs_attrs(struct usb_serial_port *port)
{
	return device_create_file(&port->dev, &dev_attr_uart_mode);
}

static int edge_remove_sysfs_attrs(struct usb_serial_port *port)
{
	device_remove_file(&port->dev, &dev_attr_uart_mode);
	return 0;
}


2515
static struct usb_serial_driver edgeport_1port_device = {
2516
	.driver = {
2517 2518
		.owner		= THIS_MODULE,
		.name		= "edgeport_ti_1",
2519
	},
2520
	.description		= "Edgeport TI 1 port adapter",
L
Linus Torvalds 已提交
2521 2522 2523 2524 2525 2526 2527
	.id_table		= edgeport_1port_id_table,
	.num_ports		= 1,
	.open			= edge_open,
	.close			= edge_close,
	.throttle		= edge_throttle,
	.unthrottle		= edge_unthrottle,
	.attach			= edge_startup,
2528 2529
	.disconnect		= edge_disconnect,
	.release		= edge_release,
2530 2531
	.port_probe		= edge_port_probe,
	.port_remove		= edge_port_remove,
L
Linus Torvalds 已提交
2532 2533 2534 2535
	.ioctl			= edge_ioctl,
	.set_termios		= edge_set_termios,
	.tiocmget		= edge_tiocmget,
	.tiocmset		= edge_tiocmset,
2536
	.tiocmiwait		= usb_serial_generic_tiocmiwait,
2537
	.get_icount		= usb_serial_generic_get_icount,
L
Linus Torvalds 已提交
2538 2539 2540
	.write			= edge_write,
	.write_room		= edge_write_room,
	.chars_in_buffer	= edge_chars_in_buffer,
2541
	.tx_empty		= edge_tx_empty,
L
Linus Torvalds 已提交
2542 2543 2544 2545 2546 2547
	.break_ctl		= edge_break,
	.read_int_callback	= edge_interrupt_callback,
	.read_bulk_callback	= edge_bulk_in_callback,
	.write_bulk_callback	= edge_bulk_out_callback,
};

2548
static struct usb_serial_driver edgeport_2port_device = {
2549
	.driver = {
2550 2551
		.owner		= THIS_MODULE,
		.name		= "edgeport_ti_2",
2552
	},
2553
	.description		= "Edgeport TI 2 port adapter",
L
Linus Torvalds 已提交
2554 2555 2556 2557 2558 2559 2560
	.id_table		= edgeport_2port_id_table,
	.num_ports		= 2,
	.open			= edge_open,
	.close			= edge_close,
	.throttle		= edge_throttle,
	.unthrottle		= edge_unthrottle,
	.attach			= edge_startup,
2561 2562
	.disconnect		= edge_disconnect,
	.release		= edge_release,
2563 2564
	.port_probe		= edge_port_probe,
	.port_remove		= edge_port_remove,
L
Linus Torvalds 已提交
2565 2566 2567 2568
	.ioctl			= edge_ioctl,
	.set_termios		= edge_set_termios,
	.tiocmget		= edge_tiocmget,
	.tiocmset		= edge_tiocmset,
2569
	.tiocmiwait		= usb_serial_generic_tiocmiwait,
2570
	.get_icount		= usb_serial_generic_get_icount,
L
Linus Torvalds 已提交
2571 2572 2573
	.write			= edge_write,
	.write_room		= edge_write_room,
	.chars_in_buffer	= edge_chars_in_buffer,
2574
	.tx_empty		= edge_tx_empty,
L
Linus Torvalds 已提交
2575 2576 2577 2578 2579 2580
	.break_ctl		= edge_break,
	.read_int_callback	= edge_interrupt_callback,
	.read_bulk_callback	= edge_bulk_in_callback,
	.write_bulk_callback	= edge_bulk_out_callback,
};

2581 2582 2583 2584
static struct usb_serial_driver * const serial_drivers[] = {
	&edgeport_1port_device, &edgeport_2port_device, NULL
};

2585
module_usb_serial_driver(serial_drivers, id_table_combined);
L
Linus Torvalds 已提交
2586 2587 2588 2589

MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL");
2590
MODULE_FIRMWARE("edgeport/down3.bin");
L
Linus Torvalds 已提交
2591 2592 2593 2594 2595

module_param(closing_wait, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");

module_param(ignore_cpu_rev, bool, S_IRUGO | S_IWUSR);
2596 2597
MODULE_PARM_DESC(ignore_cpu_rev,
			"Ignore the cpu revision when connecting to a device");
L
Linus Torvalds 已提交
2598

2599 2600
module_param(default_uart_mode, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(default_uart_mode, "Default uart_mode, 0=RS232, ...");