xref: /openbmc/linux/drivers/usb/misc/uss720.c (revision 57904291176fa16a981cefca5cbe1a0b50196792)
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  
47  struct 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  
56  struct 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  
destroy_priv(struct kref * kref)68  static 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  
destroy_async(struct kref * kref)78  static 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  
async_complete(struct urb * urb)96  static 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  
submit_async_request(struct parport_uss720_private * priv,__u8 request,__u8 requesttype,__u16 value,__u16 index,gfp_t mem_flags)123  static 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  
kill_all_async_requests_priv(struct parport_uss720_private * priv)176  static 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  
get_1284_register(struct parport * pp,unsigned char reg,unsigned char * val,gfp_t mem_flags)193  static 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  
set_1284_register(struct parport * pp,unsigned char reg,unsigned char val,gfp_t mem_flags)229  static 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 */
change_mode(struct parport * pp,int m)257  static 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   */
clear_epp_timeout(struct parport * pp)307  static 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
320  static 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  
parport_uss720_write_data(struct parport * pp,unsigned char d)335  static void parport_uss720_write_data(struct parport *pp, unsigned char d)
336  {
337  	set_1284_register(pp, 0, d, GFP_KERNEL);
338  }
339  
parport_uss720_read_data(struct parport * pp)340  static 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  
parport_uss720_write_control(struct parport * pp,unsigned char d)349  static 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  
parport_uss720_read_control(struct parport * pp)359  static 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  
parport_uss720_frob_control(struct parport * pp,unsigned char mask,unsigned char val)365  static 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  
parport_uss720_read_status(struct parport * pp)379  static 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  
parport_uss720_disable_irq(struct parport * pp)388  static 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  
parport_uss720_enable_irq(struct parport * pp)399  static 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  
parport_uss720_data_forward(struct parport * pp)410  static 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  
parport_uss720_data_reverse(struct parport * pp)421  static 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  
parport_uss720_init_state(struct pardevice * dev,struct parport_state * s)432  static 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  
parport_uss720_save_state(struct parport * pp,struct parport_state * s)438  static 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  
parport_uss720_restore_state(struct parport * pp,struct parport_state * s)450  static 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  
parport_uss720_epp_read_data(struct parport * pp,void * buf,size_t length,int flags)461  static 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  
parport_uss720_epp_write_data(struct parport * pp,const void * buf,size_t length,int flags)481  static 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 = 0;
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  
parport_uss720_epp_read_addr(struct parport * pp,void * buf,size_t length,int flags)520  static 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  
parport_uss720_epp_write_addr(struct parport * pp,const void * buf,size_t length,int flags)540  static 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  
parport_uss720_ecp_write_data(struct parport * pp,const void * buffer,size_t len,int flags)562  static 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 = 0;
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  
parport_uss720_ecp_read_data(struct parport * pp,void * buffer,size_t len,int flags)580  static 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 = 0;
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  
parport_uss720_ecp_write_addr(struct parport * pp,const void * buffer,size_t len,int flags)598  static 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  
parport_uss720_write_compat(struct parport * pp,const void * buffer,size_t len,int flags)613  static 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 = 0;
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  
633  static 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  
uss720_probe(struct usb_interface * intf,const struct usb_device_id * id)671  static 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 ret;
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  	ret = usb_set_interface(usbdev, intf->altsetting->desc.bInterfaceNumber, 2);
692  	dev_dbg(&intf->dev, "set interface result %d\n", ret);
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  
729  	/* The Belkin F5U002 Rev 2 P80453-B USB parallel port adapter shares the
730  	 * device ID 050d:0002 with some other device that works with this
731  	 * driver, but it itself does not. Detect and handle the bad cable
732  	 * here. */
733  	ret = get_1284_register(pp, 0, &reg, GFP_KERNEL);
734  	dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg);
735  	if (ret < 0)
736  		return ret;
737  
738  	ret = usb_find_last_int_in_endpoint(interface, &epd);
739  	if (!ret) {
740  		dev_dbg(&intf->dev, "epaddr %d interval %d\n",
741  				epd->bEndpointAddress, epd->bInterval);
742  	}
743  	parport_announce_port(pp);
744  
745  	usb_set_intfdata(intf, pp);
746  	return 0;
747  
748  probe_abort:
749  	kill_all_async_requests_priv(priv);
750  	kref_put(&priv->ref_count, destroy_priv);
751  	return -ENODEV;
752  }
753  
uss720_disconnect(struct usb_interface * intf)754  static void uss720_disconnect(struct usb_interface *intf)
755  {
756  	struct parport *pp = usb_get_intfdata(intf);
757  	struct parport_uss720_private *priv;
758  
759  	dev_dbg(&intf->dev, "disconnect\n");
760  	usb_set_intfdata(intf, NULL);
761  	if (pp) {
762  		priv = pp->private_data;
763  		priv->pp = NULL;
764  		dev_dbg(&intf->dev, "parport_remove_port\n");
765  		parport_remove_port(pp);
766  		parport_put_port(pp);
767  		kill_all_async_requests_priv(priv);
768  		kref_put(&priv->ref_count, destroy_priv);
769  	}
770  	dev_dbg(&intf->dev, "disconnect done\n");
771  }
772  
773  /* table of cables that work through this driver */
774  static const struct usb_device_id uss720_table[] = {
775  	{ USB_DEVICE(0x047e, 0x1001) },
776  	{ USB_DEVICE(0x04b8, 0x0002) },
777  	{ USB_DEVICE(0x04b8, 0x0003) },
778  	{ USB_DEVICE(0x050d, 0x0002) },
779  	{ USB_DEVICE(0x050d, 0x1202) },
780  	{ USB_DEVICE(0x0557, 0x2001) },
781  	{ USB_DEVICE(0x05ab, 0x0002) },
782  	{ USB_DEVICE(0x06c6, 0x0100) },
783  	{ USB_DEVICE(0x0729, 0x1284) },
784  	{ USB_DEVICE(0x1293, 0x0002) },
785  	{ }						/* Terminating entry */
786  };
787  
788  MODULE_DEVICE_TABLE (usb, uss720_table);
789  
790  
791  static struct usb_driver uss720_driver = {
792  	.name =		"uss720",
793  	.probe =	uss720_probe,
794  	.disconnect =	uss720_disconnect,
795  	.id_table =	uss720_table,
796  };
797  
798  /* --------------------------------------------------------------------- */
799  
800  MODULE_AUTHOR(DRIVER_AUTHOR);
801  MODULE_DESCRIPTION(DRIVER_DESC);
802  MODULE_LICENSE("GPL");
803  
uss720_init(void)804  static int __init uss720_init(void)
805  {
806  	int retval;
807  	retval = usb_register(&uss720_driver);
808  	if (retval)
809  		goto out;
810  
811  	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
812  	printk(KERN_INFO KBUILD_MODNAME ": NOTE: this is a special purpose "
813  	       "driver to allow nonstandard\n");
814  	printk(KERN_INFO KBUILD_MODNAME ": protocols (eg. bitbang) over "
815  	       "USS720 usb to parallel cables\n");
816  	printk(KERN_INFO KBUILD_MODNAME ": If you just want to connect to a "
817  	       "printer, use usblp instead\n");
818  out:
819  	return retval;
820  }
821  
uss720_cleanup(void)822  static void __exit uss720_cleanup(void)
823  {
824  	usb_deregister(&uss720_driver);
825  }
826  
827  module_init(uss720_init);
828  module_exit(uss720_cleanup);
829  
830  /* --------------------------------------------------------------------- */
831