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