cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

uss720.c (22341B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*****************************************************************************/
      3
      4/*
      5 *	uss720.c  --  USS720 USB Parport Cable.
      6 *
      7 *	Copyright (C) 1999, 2005, 2010
      8 *	    Thomas Sailer (t.sailer@alumni.ethz.ch)
      9 *
     10 *  Based on parport_pc.c
     11 *
     12 *  History:
     13 *   0.1  04.08.1999  Created
     14 *   0.2  07.08.1999  Some fixes mainly suggested by Tim Waugh
     15 *		      Interrupt handling currently disabled because
     16 *		      usb_request_irq crashes somewhere within ohci.c
     17 *		      for no apparent reason (that is for me, anyway)
     18 *		      ECP currently untested
     19 *   0.3  10.08.1999  fixing merge errors
     20 *   0.4  13.08.1999  Added Vendor/Product ID of Brad Hard's cable
     21 *   0.5  20.09.1999  usb_control_msg wrapper used
     22 *        Nov01.2000  usb_device_table support by Adam J. Richter
     23 *        08.04.2001  Identify version on module load.  gb
     24 *   0.6  02.09.2005  Fix "scheduling in interrupt" problem by making save/restore
     25 *                    context asynchronous
     26 *
     27 */
     28
     29/*****************************************************************************/
     30
     31#include <linux/module.h>
     32#include <linux/socket.h>
     33#include <linux/parport.h>
     34#include <linux/init.h>
     35#include <linux/usb.h>
     36#include <linux/delay.h>
     37#include <linux/completion.h>
     38#include <linux/kref.h>
     39#include <linux/slab.h>
     40#include <linux/sched/signal.h>
     41
     42#define DRIVER_AUTHOR "Thomas M. Sailer, t.sailer@alumni.ethz.ch"
     43#define DRIVER_DESC "USB Parport Cable driver for Cables using the Lucent Technologies USS720 Chip"
     44
     45/* --------------------------------------------------------------------- */
     46
     47struct parport_uss720_private {
     48	struct usb_device *usbdev;
     49	struct parport *pp;
     50	struct kref ref_count;
     51	__u8 reg[7];  /* USB registers */
     52	struct list_head asynclist;
     53	spinlock_t asynclock;
     54};
     55
     56struct uss720_async_request {
     57	struct parport_uss720_private *priv;
     58	struct kref ref_count;
     59	struct list_head asynclist;
     60	struct completion compl;
     61	struct urb *urb;
     62	struct usb_ctrlrequest *dr;
     63	__u8 reg[7];
     64};
     65
     66/* --------------------------------------------------------------------- */
     67
     68static void destroy_priv(struct kref *kref)
     69{
     70	struct parport_uss720_private *priv = container_of(kref, struct parport_uss720_private, ref_count);
     71
     72	dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n");
     73	usb_put_dev(priv->usbdev);
     74	priv->usbdev = NULL;
     75	kfree(priv);
     76}
     77
     78static void destroy_async(struct kref *kref)
     79{
     80	struct uss720_async_request *rq = container_of(kref, struct uss720_async_request, ref_count);
     81	struct parport_uss720_private *priv = rq->priv;
     82	unsigned long flags;
     83
     84	if (likely(rq->urb))
     85		usb_free_urb(rq->urb);
     86	kfree(rq->dr);
     87	spin_lock_irqsave(&priv->asynclock, flags);
     88	list_del_init(&rq->asynclist);
     89	spin_unlock_irqrestore(&priv->asynclock, flags);
     90	kfree(rq);
     91	kref_put(&priv->ref_count, destroy_priv);
     92}
     93
     94/* --------------------------------------------------------------------- */
     95
     96static void async_complete(struct urb *urb)
     97{
     98	struct uss720_async_request *rq;
     99	struct parport *pp;
    100	struct parport_uss720_private *priv;
    101	int status = urb->status;
    102
    103	rq = urb->context;
    104	priv = rq->priv;
    105	pp = priv->pp;
    106	if (status) {
    107		dev_err(&urb->dev->dev, "async_complete: urb error %d\n",
    108			status);
    109	} else if (rq->dr->bRequest == 3) {
    110		memcpy(priv->reg, rq->reg, sizeof(priv->reg));
    111#if 0
    112		dev_dbg(&priv->usbdev->dev, "async_complete regs %7ph\n",
    113			priv->reg);
    114#endif
    115		/* if nAck interrupts are enabled and we have an interrupt, call the interrupt procedure */
    116		if (rq->reg[2] & rq->reg[1] & 0x10 && pp)
    117			parport_generic_irq(pp);
    118	}
    119	complete(&rq->compl);
    120	kref_put(&rq->ref_count, destroy_async);
    121}
    122
    123static struct uss720_async_request *submit_async_request(struct parport_uss720_private *priv,
    124							 __u8 request, __u8 requesttype, __u16 value, __u16 index,
    125							 gfp_t mem_flags)
    126{
    127	struct usb_device *usbdev;
    128	struct uss720_async_request *rq;
    129	unsigned long flags;
    130	int ret;
    131
    132	if (!priv)
    133		return NULL;
    134	usbdev = priv->usbdev;
    135	if (!usbdev)
    136		return NULL;
    137	rq = kzalloc(sizeof(struct uss720_async_request), mem_flags);
    138	if (!rq)
    139		return NULL;
    140	kref_init(&rq->ref_count);
    141	INIT_LIST_HEAD(&rq->asynclist);
    142	init_completion(&rq->compl);
    143	kref_get(&priv->ref_count);
    144	rq->priv = priv;
    145	rq->urb = usb_alloc_urb(0, mem_flags);
    146	if (!rq->urb) {
    147		kref_put(&rq->ref_count, destroy_async);
    148		return NULL;
    149	}
    150	rq->dr = kmalloc(sizeof(*rq->dr), mem_flags);
    151	if (!rq->dr) {
    152		kref_put(&rq->ref_count, destroy_async);
    153		return NULL;
    154	}
    155	rq->dr->bRequestType = requesttype;
    156	rq->dr->bRequest = request;
    157	rq->dr->wValue = cpu_to_le16(value);
    158	rq->dr->wIndex = cpu_to_le16(index);
    159	rq->dr->wLength = cpu_to_le16((request == 3) ? sizeof(rq->reg) : 0);
    160	usb_fill_control_urb(rq->urb, usbdev, (requesttype & 0x80) ? usb_rcvctrlpipe(usbdev, 0) : usb_sndctrlpipe(usbdev, 0),
    161			     (unsigned char *)rq->dr,
    162			     (request == 3) ? rq->reg : NULL, (request == 3) ? sizeof(rq->reg) : 0, async_complete, rq);
    163	/* rq->urb->transfer_flags |= URB_ASYNC_UNLINK; */
    164	spin_lock_irqsave(&priv->asynclock, flags);
    165	list_add_tail(&rq->asynclist, &priv->asynclist);
    166	spin_unlock_irqrestore(&priv->asynclock, flags);
    167	kref_get(&rq->ref_count);
    168	ret = usb_submit_urb(rq->urb, mem_flags);
    169	if (!ret)
    170		return rq;
    171	destroy_async(&rq->ref_count);
    172	dev_err(&usbdev->dev, "submit_async_request submit_urb failed with %d\n", ret);
    173	return NULL;
    174}
    175
    176static unsigned int kill_all_async_requests_priv(struct parport_uss720_private *priv)
    177{
    178	struct uss720_async_request *rq;
    179	unsigned long flags;
    180	unsigned int ret = 0;
    181
    182	spin_lock_irqsave(&priv->asynclock, flags);
    183	list_for_each_entry(rq, &priv->asynclist, asynclist) {
    184		usb_unlink_urb(rq->urb);
    185		ret++;
    186	}
    187	spin_unlock_irqrestore(&priv->asynclock, flags);
    188	return ret;
    189}
    190
    191/* --------------------------------------------------------------------- */
    192
    193static int get_1284_register(struct parport *pp, unsigned char reg, unsigned char *val, gfp_t mem_flags)
    194{
    195	struct parport_uss720_private *priv;
    196	struct uss720_async_request *rq;
    197	static const unsigned char regindex[9] = {
    198		4, 0, 1, 5, 5, 0, 2, 3, 6
    199	};
    200	int ret;
    201
    202	if (!pp)
    203		return -EIO;
    204	priv = pp->private_data;
    205	rq = submit_async_request(priv, 3, 0xc0, ((unsigned int)reg) << 8, 0, mem_flags);
    206	if (!rq) {
    207		dev_err(&priv->usbdev->dev, "get_1284_register(%u) failed",
    208			(unsigned int)reg);
    209		return -EIO;
    210	}
    211	if (!val) {
    212		kref_put(&rq->ref_count, destroy_async);
    213		return 0;
    214	}
    215	if (wait_for_completion_timeout(&rq->compl, HZ)) {
    216		ret = rq->urb->status;
    217		*val = priv->reg[(reg >= 9) ? 0 : regindex[reg]];
    218		if (ret)
    219			printk(KERN_WARNING "get_1284_register: "
    220			       "usb error %d\n", ret);
    221		kref_put(&rq->ref_count, destroy_async);
    222		return ret;
    223	}
    224	printk(KERN_WARNING "get_1284_register timeout\n");
    225	kill_all_async_requests_priv(priv);
    226	return -EIO;
    227}
    228
    229static int set_1284_register(struct parport *pp, unsigned char reg, unsigned char val, gfp_t mem_flags)
    230{
    231	struct parport_uss720_private *priv;
    232	struct uss720_async_request *rq;
    233
    234	if (!pp)
    235		return -EIO;
    236	priv = pp->private_data;
    237	rq = submit_async_request(priv, 4, 0x40, (((unsigned int)reg) << 8) | val, 0, mem_flags);
    238	if (!rq) {
    239		dev_err(&priv->usbdev->dev, "set_1284_register(%u,%u) failed",
    240			(unsigned int)reg, (unsigned int)val);
    241		return -EIO;
    242	}
    243	kref_put(&rq->ref_count, destroy_async);
    244	return 0;
    245}
    246
    247/* --------------------------------------------------------------------- */
    248
    249/* ECR modes */
    250#define ECR_SPP 00
    251#define ECR_PS2 01
    252#define ECR_PPF 02
    253#define ECR_ECP 03
    254#define ECR_EPP 04
    255
    256/* Safely change the mode bits in the ECR */
    257static int change_mode(struct parport *pp, int m)
    258{
    259	struct parport_uss720_private *priv = pp->private_data;
    260	int mode;
    261	__u8 reg;
    262
    263	if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
    264		return -EIO;
    265	/* Bits <7:5> contain the mode. */
    266	mode = (priv->reg[2] >> 5) & 0x7;
    267	if (mode == m)
    268		return 0;
    269	/* We have to go through mode 000 or 001 */
    270	if (mode > ECR_PS2 && m > ECR_PS2)
    271		if (change_mode(pp, ECR_PS2))
    272			return -EIO;
    273
    274	if (m <= ECR_PS2 && !(priv->reg[1] & 0x20)) {
    275		/* This mode resets the FIFO, so we may
    276		 * have to wait for it to drain first. */
    277		unsigned long expire = jiffies + pp->physport->cad->timeout;
    278		switch (mode) {
    279		case ECR_PPF: /* Parallel Port FIFO mode */
    280		case ECR_ECP: /* ECP Parallel Port mode */
    281			/* Poll slowly. */
    282			for (;;) {
    283				if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
    284					return -EIO;
    285				if (priv->reg[2] & 0x01)
    286					break;
    287				if (time_after_eq (jiffies, expire))
    288					/* The FIFO is stuck. */
    289					return -EBUSY;
    290				msleep_interruptible(10);
    291				if (signal_pending (current))
    292					break;
    293			}
    294		}
    295	}
    296	/* Set the mode. */
    297	if (set_1284_register(pp, 6, m << 5, GFP_KERNEL))
    298		return -EIO;
    299	if (get_1284_register(pp, 6, &reg, GFP_KERNEL))
    300		return -EIO;
    301	return 0;
    302}
    303
    304/*
    305 * Clear TIMEOUT BIT in EPP MODE
    306 */
    307static int clear_epp_timeout(struct parport *pp)
    308{
    309	unsigned char stat;
    310
    311	if (get_1284_register(pp, 1, &stat, GFP_KERNEL))
    312		return 1;
    313	return stat & 1;
    314}
    315
    316/*
    317 * Access functions.
    318 */
    319#if 0
    320static int uss720_irq(int usbstatus, void *buffer, int len, void *dev_id)
    321{
    322	struct parport *pp = (struct parport *)dev_id;
    323	struct parport_uss720_private *priv = pp->private_data;	
    324
    325	if (usbstatus != 0 || len < 4 || !buffer)
    326		return 1;
    327	memcpy(priv->reg, buffer, 4);
    328	/* if nAck interrupts are enabled and we have an interrupt, call the interrupt procedure */
    329	if (priv->reg[2] & priv->reg[1] & 0x10)
    330		parport_generic_irq(pp);
    331	return 1;
    332}
    333#endif
    334
    335static void parport_uss720_write_data(struct parport *pp, unsigned char d)
    336{
    337	set_1284_register(pp, 0, d, GFP_KERNEL);
    338}
    339
    340static unsigned char parport_uss720_read_data(struct parport *pp)
    341{
    342	unsigned char ret;
    343
    344	if (get_1284_register(pp, 0, &ret, GFP_KERNEL))
    345		return 0;
    346	return ret;
    347}
    348
    349static void parport_uss720_write_control(struct parport *pp, unsigned char d)
    350{
    351	struct parport_uss720_private *priv = pp->private_data;	
    352
    353	d = (d & 0xf) | (priv->reg[1] & 0xf0);
    354	if (set_1284_register(pp, 2, d, GFP_KERNEL))
    355		return;
    356	priv->reg[1] = d;
    357}
    358
    359static unsigned char parport_uss720_read_control(struct parport *pp)
    360{
    361	struct parport_uss720_private *priv = pp->private_data;	
    362	return priv->reg[1] & 0xf; /* Use soft copy */
    363}
    364
    365static unsigned char parport_uss720_frob_control(struct parport *pp, unsigned char mask, unsigned char val)
    366{
    367	struct parport_uss720_private *priv = pp->private_data;	
    368	unsigned char d;
    369
    370	mask &= 0x0f;
    371	val &= 0x0f;
    372	d = (priv->reg[1] & (~mask)) ^ val;
    373	if (set_1284_register(pp, 2, d, GFP_ATOMIC))
    374		return 0;
    375	priv->reg[1] = d;
    376	return d & 0xf;
    377}
    378
    379static unsigned char parport_uss720_read_status(struct parport *pp)
    380{
    381	unsigned char ret;
    382
    383	if (get_1284_register(pp, 1, &ret, GFP_ATOMIC))
    384		return 0;
    385	return ret & 0xf8;
    386}
    387
    388static void parport_uss720_disable_irq(struct parport *pp)
    389{
    390	struct parport_uss720_private *priv = pp->private_data;	
    391	unsigned char d;
    392
    393	d = priv->reg[1] & ~0x10;
    394	if (set_1284_register(pp, 2, d, GFP_KERNEL))
    395		return;
    396	priv->reg[1] = d;
    397}
    398
    399static void parport_uss720_enable_irq(struct parport *pp)
    400{
    401	struct parport_uss720_private *priv = pp->private_data;	
    402	unsigned char d;
    403
    404	d = priv->reg[1] | 0x10;
    405	if (set_1284_register(pp, 2, d, GFP_KERNEL))
    406		return;
    407	priv->reg[1] = d;
    408}
    409
    410static void parport_uss720_data_forward (struct parport *pp)
    411{
    412	struct parport_uss720_private *priv = pp->private_data;	
    413	unsigned char d;
    414
    415	d = priv->reg[1] & ~0x20;
    416	if (set_1284_register(pp, 2, d, GFP_KERNEL))
    417		return;
    418	priv->reg[1] = d;
    419}
    420
    421static void parport_uss720_data_reverse (struct parport *pp)
    422{
    423	struct parport_uss720_private *priv = pp->private_data;	
    424	unsigned char d;
    425
    426	d = priv->reg[1] | 0x20;
    427	if (set_1284_register(pp, 2, d, GFP_KERNEL))
    428		return;
    429	priv->reg[1] = d;
    430}
    431
    432static void parport_uss720_init_state(struct pardevice *dev, struct parport_state *s)
    433{
    434	s->u.pc.ctr = 0xc | (dev->irq_func ? 0x10 : 0x0);
    435	s->u.pc.ecr = 0x24;
    436}
    437
    438static void parport_uss720_save_state(struct parport *pp, struct parport_state *s)
    439{
    440	struct parport_uss720_private *priv = pp->private_data;	
    441
    442#if 0
    443	if (get_1284_register(pp, 2, NULL, GFP_ATOMIC))
    444		return;
    445#endif
    446	s->u.pc.ctr = priv->reg[1];
    447	s->u.pc.ecr = priv->reg[2];
    448}
    449
    450static void parport_uss720_restore_state(struct parport *pp, struct parport_state *s)
    451{
    452	struct parport_uss720_private *priv = pp->private_data;
    453
    454	set_1284_register(pp, 2, s->u.pc.ctr, GFP_ATOMIC);
    455	set_1284_register(pp, 6, s->u.pc.ecr, GFP_ATOMIC);
    456	get_1284_register(pp, 2, NULL, GFP_ATOMIC);
    457	priv->reg[1] = s->u.pc.ctr;
    458	priv->reg[2] = s->u.pc.ecr;
    459}
    460
    461static size_t parport_uss720_epp_read_data(struct parport *pp, void *buf, size_t length, int flags)
    462{
    463	struct parport_uss720_private *priv = pp->private_data;	
    464	size_t got = 0;
    465
    466	if (change_mode(pp, ECR_EPP))
    467		return 0;
    468	for (; got < length; got++) {
    469		if (get_1284_register(pp, 4, (char *)buf, GFP_KERNEL))
    470			break;
    471		buf++;
    472		if (priv->reg[0] & 0x01) {
    473			clear_epp_timeout(pp);
    474			break;
    475		}
    476	}
    477	change_mode(pp, ECR_PS2);
    478	return got;
    479}
    480
    481static size_t parport_uss720_epp_write_data(struct parport *pp, const void *buf, size_t length, int flags)
    482{
    483#if 0
    484	struct parport_uss720_private *priv = pp->private_data;	
    485	size_t written = 0;
    486
    487	if (change_mode(pp, ECR_EPP))
    488		return 0;
    489	for (; written < length; written++) {
    490		if (set_1284_register(pp, 4, (char *)buf, GFP_KERNEL))
    491			break;
    492		((char*)buf)++;
    493		if (get_1284_register(pp, 1, NULL, GFP_KERNEL))
    494			break;
    495		if (priv->reg[0] & 0x01) {
    496			clear_epp_timeout(pp);
    497			break;
    498		}
    499	}
    500	change_mode(pp, ECR_PS2);
    501	return written;
    502#else
    503	struct parport_uss720_private *priv = pp->private_data;
    504	struct usb_device *usbdev = priv->usbdev;
    505	int rlen;
    506	int i;
    507
    508	if (!usbdev)
    509		return 0;
    510	if (change_mode(pp, ECR_EPP))
    511		return 0;
    512	i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buf, length, &rlen, 20000);
    513	if (i)
    514		printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %zu rlen %u\n", buf, length, rlen);
    515	change_mode(pp, ECR_PS2);
    516	return rlen;
    517#endif
    518}
    519
    520static size_t parport_uss720_epp_read_addr(struct parport *pp, void *buf, size_t length, int flags)
    521{
    522	struct parport_uss720_private *priv = pp->private_data;	
    523	size_t got = 0;
    524
    525	if (change_mode(pp, ECR_EPP))
    526		return 0;
    527	for (; got < length; got++) {
    528		if (get_1284_register(pp, 3, (char *)buf, GFP_KERNEL))
    529			break;
    530		buf++;
    531		if (priv->reg[0] & 0x01) {
    532			clear_epp_timeout(pp);
    533			break;
    534		}
    535	}
    536	change_mode(pp, ECR_PS2);
    537	return got;
    538}
    539
    540static size_t parport_uss720_epp_write_addr(struct parport *pp, const void *buf, size_t length, int flags)
    541{
    542	struct parport_uss720_private *priv = pp->private_data;	
    543	size_t written = 0;
    544
    545	if (change_mode(pp, ECR_EPP))
    546		return 0;
    547	for (; written < length; written++) {
    548		if (set_1284_register(pp, 3, *(char *)buf, GFP_KERNEL))
    549			break;
    550		buf++;
    551		if (get_1284_register(pp, 1, NULL, GFP_KERNEL))
    552			break;
    553		if (priv->reg[0] & 0x01) {
    554			clear_epp_timeout(pp);
    555			break;
    556		}
    557	}
    558	change_mode(pp, ECR_PS2);
    559	return written;
    560}
    561
    562static size_t parport_uss720_ecp_write_data(struct parport *pp, const void *buffer, size_t len, int flags)
    563{
    564	struct parport_uss720_private *priv = pp->private_data;
    565	struct usb_device *usbdev = priv->usbdev;
    566	int rlen;
    567	int i;
    568
    569	if (!usbdev)
    570		return 0;
    571	if (change_mode(pp, ECR_ECP))
    572		return 0;
    573	i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buffer, len, &rlen, 20000);
    574	if (i)
    575		printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %zu rlen %u\n", buffer, len, rlen);
    576	change_mode(pp, ECR_PS2);
    577	return rlen;
    578}
    579
    580static size_t parport_uss720_ecp_read_data(struct parport *pp, void *buffer, size_t len, int flags)
    581{
    582	struct parport_uss720_private *priv = pp->private_data;
    583	struct usb_device *usbdev = priv->usbdev;
    584	int rlen;
    585	int i;
    586
    587	if (!usbdev)
    588		return 0;
    589	if (change_mode(pp, ECR_ECP))
    590		return 0;
    591	i = usb_bulk_msg(usbdev, usb_rcvbulkpipe(usbdev, 2), buffer, len, &rlen, 20000);
    592	if (i)
    593		printk(KERN_ERR "uss720: recvbulk ep 2 buf %p len %zu rlen %u\n", buffer, len, rlen);
    594	change_mode(pp, ECR_PS2);
    595	return rlen;
    596}
    597
    598static size_t parport_uss720_ecp_write_addr(struct parport *pp, const void *buffer, size_t len, int flags)
    599{
    600	size_t written = 0;
    601
    602	if (change_mode(pp, ECR_ECP))
    603		return 0;
    604	for (; written < len; written++) {
    605		if (set_1284_register(pp, 5, *(char *)buffer, GFP_KERNEL))
    606			break;
    607		buffer++;
    608	}
    609	change_mode(pp, ECR_PS2);
    610	return written;
    611}
    612
    613static size_t parport_uss720_write_compat(struct parport *pp, const void *buffer, size_t len, int flags)
    614{
    615	struct parport_uss720_private *priv = pp->private_data;
    616	struct usb_device *usbdev = priv->usbdev;
    617	int rlen;
    618	int i;
    619
    620	if (!usbdev)
    621		return 0;
    622	if (change_mode(pp, ECR_PPF))
    623		return 0;
    624	i = usb_bulk_msg(usbdev, usb_sndbulkpipe(usbdev, 1), (void *)buffer, len, &rlen, 20000);
    625	if (i)
    626		printk(KERN_ERR "uss720: sendbulk ep 1 buf %p len %zu rlen %u\n", buffer, len, rlen);
    627	change_mode(pp, ECR_PS2);
    628	return rlen;
    629}
    630
    631/* --------------------------------------------------------------------- */
    632
    633static struct parport_operations parport_uss720_ops = 
    634{
    635	.owner =		THIS_MODULE,
    636	.write_data =		parport_uss720_write_data,
    637	.read_data =		parport_uss720_read_data,
    638
    639	.write_control =	parport_uss720_write_control,
    640	.read_control =		parport_uss720_read_control,
    641	.frob_control =		parport_uss720_frob_control,
    642
    643	.read_status =		parport_uss720_read_status,
    644
    645	.enable_irq =		parport_uss720_enable_irq,
    646	.disable_irq =		parport_uss720_disable_irq,
    647
    648	.data_forward =		parport_uss720_data_forward,
    649	.data_reverse =		parport_uss720_data_reverse,
    650
    651	.init_state =		parport_uss720_init_state,
    652	.save_state =		parport_uss720_save_state,
    653	.restore_state =	parport_uss720_restore_state,
    654
    655	.epp_write_data =	parport_uss720_epp_write_data,
    656	.epp_read_data =	parport_uss720_epp_read_data,
    657	.epp_write_addr =	parport_uss720_epp_write_addr,
    658	.epp_read_addr =	parport_uss720_epp_read_addr,
    659
    660	.ecp_write_data =	parport_uss720_ecp_write_data,
    661	.ecp_read_data =	parport_uss720_ecp_read_data,
    662	.ecp_write_addr =	parport_uss720_ecp_write_addr,
    663
    664	.compat_write_data =	parport_uss720_write_compat,
    665	.nibble_read_data =	parport_ieee1284_read_nibble,
    666	.byte_read_data =	parport_ieee1284_read_byte,
    667};
    668
    669/* --------------------------------------------------------------------- */
    670
    671static int uss720_probe(struct usb_interface *intf,
    672			const struct usb_device_id *id)
    673{
    674	struct usb_device *usbdev = usb_get_dev(interface_to_usbdev(intf));
    675	struct usb_host_interface *interface;
    676	struct usb_endpoint_descriptor *epd;
    677	struct parport_uss720_private *priv;
    678	struct parport *pp;
    679	unsigned char reg;
    680	int i;
    681
    682	dev_dbg(&intf->dev, "probe: vendor id 0x%x, device id 0x%x\n",
    683		le16_to_cpu(usbdev->descriptor.idVendor),
    684		le16_to_cpu(usbdev->descriptor.idProduct));
    685
    686	/* our known interfaces have 3 alternate settings */
    687	if (intf->num_altsetting != 3) {
    688		usb_put_dev(usbdev);
    689		return -ENODEV;
    690	}
    691	i = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2);
    692	dev_dbg(&intf->dev, "set interface result %d\n", i);
    693
    694	interface = intf->cur_altsetting;
    695
    696	if (interface->desc.bNumEndpoints < 3) {
    697		usb_put_dev(usbdev);
    698		return -ENODEV;
    699	}
    700
    701	/*
    702	 * Allocate parport interface 
    703	 */
    704	priv = kzalloc(sizeof(struct parport_uss720_private), GFP_KERNEL);
    705	if (!priv) {
    706		usb_put_dev(usbdev);
    707		return -ENOMEM;
    708	}
    709	priv->pp = NULL;
    710	priv->usbdev = usbdev;
    711	kref_init(&priv->ref_count);
    712	spin_lock_init(&priv->asynclock);
    713	INIT_LIST_HEAD(&priv->asynclist);
    714	pp = parport_register_port(0, PARPORT_IRQ_NONE, PARPORT_DMA_NONE, &parport_uss720_ops);
    715	if (!pp) {
    716		printk(KERN_WARNING "uss720: could not register parport\n");
    717		goto probe_abort;
    718	}
    719
    720	priv->pp = pp;
    721	pp->private_data = priv;
    722	pp->modes = PARPORT_MODE_PCSPP | PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP | PARPORT_MODE_ECP | PARPORT_MODE_COMPAT;
    723
    724	/* set the USS720 control register to manual mode, no ECP compression, enable all ints */
    725	set_1284_register(pp, 7, 0x00, GFP_KERNEL);
    726	set_1284_register(pp, 6, 0x30, GFP_KERNEL);  /* PS/2 mode */
    727	set_1284_register(pp, 2, 0x0c, GFP_KERNEL);
    728	/* debugging */
    729	get_1284_register(pp, 0, &reg, GFP_KERNEL);
    730	dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg);
    731
    732	i = usb_find_last_int_in_endpoint(interface, &epd);
    733	if (!i) {
    734		dev_dbg(&intf->dev, "epaddr %d interval %d\n",
    735				epd->bEndpointAddress, epd->bInterval);
    736	}
    737	parport_announce_port(pp);
    738
    739	usb_set_intfdata(intf, pp);
    740	return 0;
    741
    742probe_abort:
    743	kill_all_async_requests_priv(priv);
    744	kref_put(&priv->ref_count, destroy_priv);
    745	return -ENODEV;
    746}
    747
    748static void uss720_disconnect(struct usb_interface *intf)
    749{
    750	struct parport *pp = usb_get_intfdata(intf);
    751	struct parport_uss720_private *priv;
    752
    753	dev_dbg(&intf->dev, "disconnect\n");
    754	usb_set_intfdata(intf, NULL);
    755	if (pp) {
    756		priv = pp->private_data;
    757		priv->pp = NULL;
    758		dev_dbg(&intf->dev, "parport_remove_port\n");
    759		parport_remove_port(pp);
    760		parport_put_port(pp);
    761		kill_all_async_requests_priv(priv);
    762		kref_put(&priv->ref_count, destroy_priv);
    763	}
    764	dev_dbg(&intf->dev, "disconnect done\n");
    765}
    766
    767/* table of cables that work through this driver */
    768static const struct usb_device_id uss720_table[] = {
    769	{ USB_DEVICE(0x047e, 0x1001) },
    770	{ USB_DEVICE(0x04b8, 0x0002) },
    771	{ USB_DEVICE(0x04b8, 0x0003) },
    772	{ USB_DEVICE(0x050d, 0x0002) },
    773	{ USB_DEVICE(0x050d, 0x1202) },
    774	{ USB_DEVICE(0x0557, 0x2001) },
    775	{ USB_DEVICE(0x05ab, 0x0002) },
    776	{ USB_DEVICE(0x06c6, 0x0100) },
    777	{ USB_DEVICE(0x0729, 0x1284) },
    778	{ USB_DEVICE(0x1293, 0x0002) },
    779	{ }						/* Terminating entry */
    780};
    781
    782MODULE_DEVICE_TABLE (usb, uss720_table);
    783
    784
    785static struct usb_driver uss720_driver = {
    786	.name =		"uss720",
    787	.probe =	uss720_probe,
    788	.disconnect =	uss720_disconnect,
    789	.id_table =	uss720_table,
    790};
    791
    792/* --------------------------------------------------------------------- */
    793
    794MODULE_AUTHOR(DRIVER_AUTHOR);
    795MODULE_DESCRIPTION(DRIVER_DESC);
    796MODULE_LICENSE("GPL");
    797
    798static int __init uss720_init(void)
    799{
    800	int retval;
    801	retval = usb_register(&uss720_driver);
    802	if (retval)
    803		goto out;
    804
    805	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
    806	printk(KERN_INFO KBUILD_MODNAME ": NOTE: this is a special purpose "
    807	       "driver to allow nonstandard\n");
    808	printk(KERN_INFO KBUILD_MODNAME ": protocols (eg. bitbang) over "
    809	       "USS720 usb to parallel cables\n");
    810	printk(KERN_INFO KBUILD_MODNAME ": If you just want to connect to a "
    811	       "printer, use usblp instead\n");
    812out:
    813	return retval;
    814}
    815
    816static void __exit uss720_cleanup(void)
    817{
    818	usb_deregister(&uss720_driver);
    819}
    820
    821module_init(uss720_init);
    822module_exit(uss720_cleanup);
    823
    824/* --------------------------------------------------------------------- */