diff options
| author | <jgarzik@pretzel.yyz.us> | 2005-06-04 00:40:40 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-06-04 00:40:40 -0400 |
| commit | ae20ea8525a80a863f70d332cf47b71bd9f54c1f (patch) | |
| tree | 9d3cedeb65db521a8436b545bd91641549a18d24 /drivers/usb | |
| parent | f497ba735fc9ff4e35a19641143708b3be1c7061 (diff) | |
| parent | 8be3de3fd8469154a2b3e18a4712032dac5b4a53 (diff) | |
Automatic merge of /spare/repo/linux-2.6/.git branch HEAD
Diffstat (limited to 'drivers/usb')
31 files changed, 1680 insertions, 2815 deletions
diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index 233f9229badb..2a1697bfd695 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c | |||
| @@ -386,6 +386,8 @@ static void speedtch_poll_status(struct speedtch_instance_data *instance) | |||
| 386 | if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) { | 386 | if (instance->u.atm_dev->signal != ATM_PHY_SIG_LOST) { |
| 387 | instance->u.atm_dev->signal = ATM_PHY_SIG_LOST; | 387 | instance->u.atm_dev->signal = ATM_PHY_SIG_LOST; |
| 388 | printk(KERN_NOTICE "ADSL line is down\n"); | 388 | printk(KERN_NOTICE "ADSL line is down\n"); |
| 389 | /* It'll never resync again unless we ask it to... */ | ||
| 390 | speedtch_start_synchro(instance); | ||
| 389 | } | 391 | } |
| 390 | break; | 392 | break; |
| 391 | 393 | ||
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index ec9b3bde8ae5..4d0c9e65cd03 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
| @@ -286,6 +286,37 @@ static ssize_t show_interface_string(struct device *dev, char *buf) | |||
| 286 | } | 286 | } |
| 287 | static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); | 287 | static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); |
| 288 | 288 | ||
| 289 | static ssize_t show_modalias(struct device *dev, char *buf) | ||
| 290 | { | ||
| 291 | struct usb_interface *intf; | ||
| 292 | struct usb_device *udev; | ||
| 293 | int len; | ||
| 294 | |||
| 295 | intf = to_usb_interface(dev); | ||
| 296 | udev = interface_to_usbdev(intf); | ||
| 297 | |||
| 298 | len = sprintf(buf, "usb:v%04Xp%04Xd%04Xdc%02Xdsc%02Xdp%02Xic", | ||
| 299 | le16_to_cpu(udev->descriptor.idVendor), | ||
| 300 | le16_to_cpu(udev->descriptor.idProduct), | ||
| 301 | le16_to_cpu(udev->descriptor.bcdDevice), | ||
| 302 | udev->descriptor.bDeviceClass, | ||
| 303 | udev->descriptor.bDeviceSubClass, | ||
| 304 | udev->descriptor.bDeviceProtocol); | ||
| 305 | buf += len; | ||
| 306 | |||
| 307 | if (udev->descriptor.bDeviceClass == 0) { | ||
| 308 | struct usb_host_interface *alt = intf->cur_altsetting; | ||
| 309 | |||
| 310 | return len + sprintf(buf, "%02Xisc%02Xip%02X\n", | ||
| 311 | alt->desc.bInterfaceClass, | ||
| 312 | alt->desc.bInterfaceSubClass, | ||
| 313 | alt->desc.bInterfaceProtocol); | ||
| 314 | } else { | ||
| 315 | return len + sprintf(buf, "*isc*ip*\n"); | ||
| 316 | } | ||
| 317 | } | ||
| 318 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); | ||
| 319 | |||
| 289 | static struct attribute *intf_attrs[] = { | 320 | static struct attribute *intf_attrs[] = { |
| 290 | &dev_attr_bInterfaceNumber.attr, | 321 | &dev_attr_bInterfaceNumber.attr, |
| 291 | &dev_attr_bAlternateSetting.attr, | 322 | &dev_attr_bAlternateSetting.attr, |
| @@ -293,6 +324,7 @@ static struct attribute *intf_attrs[] = { | |||
| 293 | &dev_attr_bInterfaceClass.attr, | 324 | &dev_attr_bInterfaceClass.attr, |
| 294 | &dev_attr_bInterfaceSubClass.attr, | 325 | &dev_attr_bInterfaceSubClass.attr, |
| 295 | &dev_attr_bInterfaceProtocol.attr, | 326 | &dev_attr_bInterfaceProtocol.attr, |
| 327 | &dev_attr_modalias.attr, | ||
| 296 | NULL, | 328 | NULL, |
| 297 | }; | 329 | }; |
| 298 | static struct attribute_group intf_attr_grp = { | 330 | static struct attribute_group intf_attr_grp = { |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 3196c3265ff5..19e598c9641f 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
| @@ -124,3 +124,14 @@ config USB_SL811_HCD | |||
| 124 | To compile this driver as a module, choose M here: the | 124 | To compile this driver as a module, choose M here: the |
| 125 | module will be called sl811-hcd. | 125 | module will be called sl811-hcd. |
| 126 | 126 | ||
| 127 | config USB_SL811_CS | ||
| 128 | tristate "CF/PCMCIA support for SL811HS HCD" | ||
| 129 | depends on USB_SL811_HCD && PCMCIA | ||
| 130 | default N | ||
| 131 | help | ||
| 132 | Wraps a PCMCIA driver around the SL811HS HCD, supporting the RATOC | ||
| 133 | REX-CFU1U CF card (often used with PDAs). If unsure, say N. | ||
| 134 | |||
| 135 | To compile this driver as a module, choose M here: the | ||
| 136 | module will be called "sl811_cs". | ||
| 137 | |||
diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile index a574ca06cf6b..5dbd3e7a27c7 100644 --- a/drivers/usb/host/Makefile +++ b/drivers/usb/host/Makefile | |||
| @@ -7,4 +7,5 @@ obj-$(CONFIG_USB_EHCI_HCD) += ehci-hcd.o | |||
| 7 | obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o | 7 | obj-$(CONFIG_USB_OHCI_HCD) += ohci-hcd.o |
| 8 | obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o | 8 | obj-$(CONFIG_USB_UHCI_HCD) += uhci-hcd.o |
| 9 | obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o | 9 | obj-$(CONFIG_USB_SL811_HCD) += sl811-hcd.o |
| 10 | obj-$(CONFIG_USB_SL811_CS) += sl811_cs.o | ||
| 10 | obj-$(CONFIG_ETRAX_ARCH_V10) += hc_crisv10.o | 11 | obj-$(CONFIG_ETRAX_ARCH_V10) += hc_crisv10.o |
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 02fefab3501e..429330bc38de 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
| @@ -72,6 +72,7 @@ static int ehci_hub_suspend (struct usb_hcd *hcd) | |||
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | /* turn off now-idle HC */ | 74 | /* turn off now-idle HC */ |
| 75 | del_timer_sync (&ehci->watchdog); | ||
| 75 | ehci_halt (ehci); | 76 | ehci_halt (ehci); |
| 76 | hcd->state = HC_STATE_SUSPENDED; | 77 | hcd->state = HC_STATE_SUSPENDED; |
| 77 | 78 | ||
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index a374b7692073..99d43f758ad0 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
| @@ -2,8 +2,8 @@ | |||
| 2 | * SL811HS HCD (Host Controller Driver) for USB. | 2 | * SL811HS HCD (Host Controller Driver) for USB. |
| 3 | * | 3 | * |
| 4 | * Copyright (C) 2004 Psion Teklogix (for NetBook PRO) | 4 | * Copyright (C) 2004 Psion Teklogix (for NetBook PRO) |
| 5 | * Copyright (C) 2004 David Brownell | 5 | * Copyright (C) 2004-2005 David Brownell |
| 6 | * | 6 | * |
| 7 | * Periodic scheduling is based on Roman's OHCI code | 7 | * Periodic scheduling is based on Roman's OHCI code |
| 8 | * Copyright (C) 1999 Roman Weissgaerber | 8 | * Copyright (C) 1999 Roman Weissgaerber |
| 9 | * | 9 | * |
| @@ -15,7 +15,7 @@ | |||
| 15 | * For documentation, see the SL811HS spec and the "SL811HS Embedded Host" | 15 | * For documentation, see the SL811HS spec and the "SL811HS Embedded Host" |
| 16 | * document (providing significant pieces missing from that spec); plus | 16 | * document (providing significant pieces missing from that spec); plus |
| 17 | * the SL811S spec if you want peripheral side info. | 17 | * the SL811S spec if you want peripheral side info. |
| 18 | */ | 18 | */ |
| 19 | 19 | ||
| 20 | /* | 20 | /* |
| 21 | * Status: Passed basic stress testing, works with hubs, mice, keyboards, | 21 | * Status: Passed basic stress testing, works with hubs, mice, keyboards, |
| @@ -67,7 +67,7 @@ | |||
| 67 | MODULE_DESCRIPTION("SL811HS USB Host Controller Driver"); | 67 | MODULE_DESCRIPTION("SL811HS USB Host Controller Driver"); |
| 68 | MODULE_LICENSE("GPL"); | 68 | MODULE_LICENSE("GPL"); |
| 69 | 69 | ||
| 70 | #define DRIVER_VERSION "15 Dec 2004" | 70 | #define DRIVER_VERSION "19 May 2005" |
| 71 | 71 | ||
| 72 | 72 | ||
| 73 | #ifndef DEBUG | 73 | #ifndef DEBUG |
| @@ -121,6 +121,10 @@ static void port_power(struct sl811 *sl811, int is_on) | |||
| 121 | /* reset as thoroughly as we can */ | 121 | /* reset as thoroughly as we can */ |
| 122 | if (sl811->board && sl811->board->reset) | 122 | if (sl811->board && sl811->board->reset) |
| 123 | sl811->board->reset(hcd->self.controller); | 123 | sl811->board->reset(hcd->self.controller); |
| 124 | else { | ||
| 125 | sl811_write(sl811, SL11H_CTLREG1, SL11H_CTL1MASK_SE0); | ||
| 126 | mdelay(20); | ||
| 127 | } | ||
| 124 | 128 | ||
| 125 | sl811_write(sl811, SL11H_IRQ_ENABLE, 0); | 129 | sl811_write(sl811, SL11H_IRQ_ENABLE, 0); |
| 126 | sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1); | 130 | sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1); |
| @@ -443,6 +447,7 @@ static void finish_request( | |||
| 443 | spin_lock(&urb->lock); | 447 | spin_lock(&urb->lock); |
| 444 | if (urb->status == -EINPROGRESS) | 448 | if (urb->status == -EINPROGRESS) |
| 445 | urb->status = status; | 449 | urb->status = status; |
| 450 | urb->hcpriv = NULL; | ||
| 446 | spin_unlock(&urb->lock); | 451 | spin_unlock(&urb->lock); |
| 447 | 452 | ||
| 448 | spin_unlock(&sl811->lock); | 453 | spin_unlock(&sl811->lock); |
| @@ -472,7 +477,7 @@ static void finish_request( | |||
| 472 | if (*prev) | 477 | if (*prev) |
| 473 | *prev = ep->next; | 478 | *prev = ep->next; |
| 474 | sl811->load[i] -= ep->load; | 479 | sl811->load[i] -= ep->load; |
| 475 | } | 480 | } |
| 476 | ep->branch = PERIODIC_SIZE; | 481 | ep->branch = PERIODIC_SIZE; |
| 477 | sl811->periodic_count--; | 482 | sl811->periodic_count--; |
| 478 | sl811_to_hcd(sl811)->self.bandwidth_allocated | 483 | sl811_to_hcd(sl811)->self.bandwidth_allocated |
| @@ -661,9 +666,9 @@ retry: | |||
| 661 | 666 | ||
| 662 | #ifdef QUIRK2 | 667 | #ifdef QUIRK2 |
| 663 | /* this may no longer be necessary ... */ | 668 | /* this may no longer be necessary ... */ |
| 664 | if (irqstat == 0 && ret == IRQ_NONE) { | 669 | if (irqstat == 0) { |
| 665 | irqstat = checkdone(sl811); | 670 | irqstat = checkdone(sl811); |
| 666 | if (irqstat /* && irq != ~0 */ ) | 671 | if (irqstat) |
| 667 | sl811->stat_lost++; | 672 | sl811->stat_lost++; |
| 668 | } | 673 | } |
| 669 | #endif | 674 | #endif |
| @@ -722,7 +727,8 @@ retry: | |||
| 722 | if (sl811->active_a) { | 727 | if (sl811->active_a) { |
| 723 | sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG), 0); | 728 | sl811_write(sl811, SL811_EP_A(SL11H_HOSTCTLREG), 0); |
| 724 | finish_request(sl811, sl811->active_a, | 729 | finish_request(sl811, sl811->active_a, |
| 725 | container_of(sl811->active_a->hep->urb_list.next, | 730 | container_of(sl811->active_a |
| 731 | ->hep->urb_list.next, | ||
| 726 | struct urb, urb_list), | 732 | struct urb, urb_list), |
| 727 | NULL, -ESHUTDOWN); | 733 | NULL, -ESHUTDOWN); |
| 728 | sl811->active_a = NULL; | 734 | sl811->active_a = NULL; |
| @@ -731,7 +737,8 @@ retry: | |||
| 731 | if (sl811->active_b) { | 737 | if (sl811->active_b) { |
| 732 | sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG), 0); | 738 | sl811_write(sl811, SL811_EP_B(SL11H_HOSTCTLREG), 0); |
| 733 | finish_request(sl811, sl811->active_b, | 739 | finish_request(sl811, sl811->active_b, |
| 734 | container_of(sl811->active_b->hep->urb_list.next, | 740 | container_of(sl811->active_b |
| 741 | ->hep->urb_list.next, | ||
| 735 | struct urb, urb_list), | 742 | struct urb, urb_list), |
| 736 | NULL, -ESHUTDOWN); | 743 | NULL, -ESHUTDOWN); |
| 737 | sl811->active_b = NULL; | 744 | sl811->active_b = NULL; |
| @@ -761,7 +768,7 @@ retry: | |||
| 761 | goto retry; | 768 | goto retry; |
| 762 | } | 769 | } |
| 763 | 770 | ||
| 764 | if (sl811->periodic_count == 0 && list_empty(&sl811->async)) | 771 | if (sl811->periodic_count == 0 && list_empty(&sl811->async)) |
| 765 | sofirq_off(sl811); | 772 | sofirq_off(sl811); |
| 766 | sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable); | 773 | sl811_write(sl811, SL11H_IRQ_ENABLE, sl811->irq_enable); |
| 767 | 774 | ||
| @@ -796,7 +803,7 @@ static int balance(struct sl811 *sl811, u16 period, u16 load) | |||
| 796 | } | 803 | } |
| 797 | if (j < PERIODIC_SIZE) | 804 | if (j < PERIODIC_SIZE) |
| 798 | continue; | 805 | continue; |
| 799 | branch = i; | 806 | branch = i; |
| 800 | } | 807 | } |
| 801 | } | 808 | } |
| 802 | return branch; | 809 | return branch; |
| @@ -890,6 +897,7 @@ static int sl811h_urb_enqueue( | |||
| 890 | break; | 897 | break; |
| 891 | } | 898 | } |
| 892 | 899 | ||
| 900 | ep->hep = hep; | ||
| 893 | hep->hcpriv = ep; | 901 | hep->hcpriv = ep; |
| 894 | } | 902 | } |
| 895 | 903 | ||
| @@ -961,15 +969,16 @@ fail: | |||
| 961 | static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) | 969 | static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) |
| 962 | { | 970 | { |
| 963 | struct sl811 *sl811 = hcd_to_sl811(hcd); | 971 | struct sl811 *sl811 = hcd_to_sl811(hcd); |
| 964 | struct usb_host_endpoint *hep = urb->hcpriv; | 972 | struct usb_host_endpoint *hep; |
| 965 | unsigned long flags; | 973 | unsigned long flags; |
| 966 | struct sl811h_ep *ep; | 974 | struct sl811h_ep *ep; |
| 967 | int retval = 0; | 975 | int retval = 0; |
| 968 | 976 | ||
| 977 | spin_lock_irqsave(&sl811->lock, flags); | ||
| 978 | hep = urb->hcpriv; | ||
| 969 | if (!hep) | 979 | if (!hep) |
| 970 | return -EINVAL; | 980 | goto fail; |
| 971 | 981 | ||
| 972 | spin_lock_irqsave(&sl811->lock, flags); | ||
| 973 | ep = hep->hcpriv; | 982 | ep = hep->hcpriv; |
| 974 | if (ep) { | 983 | if (ep) { |
| 975 | /* finish right away if this urb can't be active ... | 984 | /* finish right away if this urb can't be active ... |
| @@ -1017,6 +1026,7 @@ static int sl811h_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) | |||
| 1017 | VDBG("dequeue, urb %p active %s; wait4irq\n", urb, | 1026 | VDBG("dequeue, urb %p active %s; wait4irq\n", urb, |
| 1018 | (sl811->active_a == ep) ? "A" : "B"); | 1027 | (sl811->active_a == ep) ? "A" : "B"); |
| 1019 | } else | 1028 | } else |
| 1029 | fail: | ||
| 1020 | retval = -EINVAL; | 1030 | retval = -EINVAL; |
| 1021 | spin_unlock_irqrestore(&sl811->lock, flags); | 1031 | spin_unlock_irqrestore(&sl811->lock, flags); |
| 1022 | return retval; | 1032 | return retval; |
| @@ -1576,6 +1586,9 @@ sl811h_start(struct usb_hcd *hcd) | |||
| 1576 | if (sl811->board && sl811->board->power) | 1586 | if (sl811->board && sl811->board->power) |
| 1577 | hub_set_power_budget(udev, sl811->board->power * 2); | 1587 | hub_set_power_budget(udev, sl811->board->power * 2); |
| 1578 | 1588 | ||
| 1589 | /* enable power and interupts */ | ||
| 1590 | port_power(sl811, 1); | ||
| 1591 | |||
| 1579 | return 0; | 1592 | return 0; |
| 1580 | } | 1593 | } |
| 1581 | 1594 | ||
| @@ -1618,7 +1631,7 @@ static struct hc_driver sl811h_hc_driver = { | |||
| 1618 | 1631 | ||
| 1619 | /*-------------------------------------------------------------------------*/ | 1632 | /*-------------------------------------------------------------------------*/ |
| 1620 | 1633 | ||
| 1621 | static int __init_or_module | 1634 | static int __devexit |
| 1622 | sl811h_remove(struct device *dev) | 1635 | sl811h_remove(struct device *dev) |
| 1623 | { | 1636 | { |
| 1624 | struct usb_hcd *hcd = dev_get_drvdata(dev); | 1637 | struct usb_hcd *hcd = dev_get_drvdata(dev); |
| @@ -1631,21 +1644,20 @@ sl811h_remove(struct device *dev) | |||
| 1631 | remove_debug_file(sl811); | 1644 | remove_debug_file(sl811); |
| 1632 | usb_remove_hcd(hcd); | 1645 | usb_remove_hcd(hcd); |
| 1633 | 1646 | ||
| 1634 | iounmap(sl811->data_reg); | 1647 | /* some platforms may use IORESOURCE_IO */ |
| 1635 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); | 1648 | res = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| 1636 | release_mem_region(res->start, 1); | 1649 | if (res) |
| 1650 | iounmap(sl811->data_reg); | ||
| 1637 | 1651 | ||
| 1638 | iounmap(sl811->addr_reg); | ||
| 1639 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1652 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1640 | release_mem_region(res->start, 1); | 1653 | if (res) |
| 1654 | iounmap(sl811->addr_reg); | ||
| 1641 | 1655 | ||
| 1642 | usb_put_hcd(hcd); | 1656 | usb_put_hcd(hcd); |
| 1643 | return 0; | 1657 | return 0; |
| 1644 | } | 1658 | } |
| 1645 | 1659 | ||
| 1646 | #define resource_len(r) (((r)->end - (r)->start) + 1) | 1660 | static int __devinit |
| 1647 | |||
| 1648 | static int __init | ||
| 1649 | sl811h_probe(struct device *dev) | 1661 | sl811h_probe(struct device *dev) |
| 1650 | { | 1662 | { |
| 1651 | struct usb_hcd *hcd; | 1663 | struct usb_hcd *hcd; |
| @@ -1656,7 +1668,7 @@ sl811h_probe(struct device *dev) | |||
| 1656 | void __iomem *addr_reg; | 1668 | void __iomem *addr_reg; |
| 1657 | void __iomem *data_reg; | 1669 | void __iomem *data_reg; |
| 1658 | int retval; | 1670 | int retval; |
| 1659 | u8 tmp; | 1671 | u8 tmp, ioaddr = 0; |
| 1660 | 1672 | ||
| 1661 | /* basic sanity checks first. board-specific init logic should | 1673 | /* basic sanity checks first. board-specific init logic should |
| 1662 | * have initialized these three resources and probably board | 1674 | * have initialized these three resources and probably board |
| @@ -1664,13 +1676,8 @@ sl811h_probe(struct device *dev) | |||
| 1664 | * minimal sanity checking. | 1676 | * minimal sanity checking. |
| 1665 | */ | 1677 | */ |
| 1666 | pdev = container_of(dev, struct platform_device, dev); | 1678 | pdev = container_of(dev, struct platform_device, dev); |
| 1667 | if (pdev->num_resources < 3) | ||
| 1668 | return -ENODEV; | ||
| 1669 | |||
| 1670 | addr = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 1671 | data = platform_get_resource(pdev, IORESOURCE_MEM, 1); | ||
| 1672 | irq = platform_get_irq(pdev, 0); | 1679 | irq = platform_get_irq(pdev, 0); |
| 1673 | if (!addr || !data || irq < 0) | 1680 | if (pdev->num_resources < 3 || irq < 0) |
| 1674 | return -ENODEV; | 1681 | return -ENODEV; |
| 1675 | 1682 | ||
| 1676 | /* refuse to confuse usbcore */ | 1683 | /* refuse to confuse usbcore */ |
| @@ -1679,24 +1686,31 @@ sl811h_probe(struct device *dev) | |||
| 1679 | return -EINVAL; | 1686 | return -EINVAL; |
| 1680 | } | 1687 | } |
| 1681 | 1688 | ||
| 1682 | if (!request_mem_region(addr->start, 1, hcd_name)) { | 1689 | /* the chip may be wired for either kind of addressing */ |
| 1683 | retval = -EBUSY; | 1690 | addr = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1684 | goto err1; | 1691 | data = platform_get_resource(pdev, IORESOURCE_MEM, 1); |
| 1685 | } | 1692 | retval = -EBUSY; |
| 1686 | addr_reg = ioremap(addr->start, resource_len(addr)); | 1693 | if (!addr || !data) { |
| 1687 | if (addr_reg == NULL) { | 1694 | addr = platform_get_resource(pdev, IORESOURCE_IO, 0); |
| 1688 | retval = -ENOMEM; | 1695 | data = platform_get_resource(pdev, IORESOURCE_IO, 1); |
| 1689 | goto err2; | 1696 | if (!addr || !data) |
| 1690 | } | 1697 | return -ENODEV; |
| 1698 | ioaddr = 1; | ||
| 1699 | |||
| 1700 | addr_reg = (void __iomem *) addr->start; | ||
| 1701 | data_reg = (void __iomem *) data->start; | ||
| 1702 | } else { | ||
| 1703 | addr_reg = ioremap(addr->start, 1); | ||
| 1704 | if (addr_reg == NULL) { | ||
| 1705 | retval = -ENOMEM; | ||
| 1706 | goto err2; | ||
| 1707 | } | ||
| 1691 | 1708 | ||
| 1692 | if (!request_mem_region(data->start, 1, hcd_name)) { | 1709 | data_reg = ioremap(data->start, 1); |
| 1693 | retval = -EBUSY; | 1710 | if (data_reg == NULL) { |
| 1694 | goto err3; | 1711 | retval = -ENOMEM; |
| 1695 | } | 1712 | goto err4; |
| 1696 | data_reg = ioremap(data->start, resource_len(addr)); | 1713 | } |
| 1697 | if (data_reg == NULL) { | ||
| 1698 | retval = -ENOMEM; | ||
| 1699 | goto err4; | ||
| 1700 | } | 1714 | } |
| 1701 | 1715 | ||
| 1702 | /* allocate and initialize hcd */ | 1716 | /* allocate and initialize hcd */ |
| @@ -1737,12 +1751,14 @@ sl811h_probe(struct device *dev) | |||
| 1737 | goto err6; | 1751 | goto err6; |
| 1738 | } | 1752 | } |
| 1739 | 1753 | ||
| 1740 | /* sl811s would need a different handler for this irq */ | 1754 | /* The chip's IRQ is level triggered, active high. A requirement |
| 1741 | #ifdef CONFIG_ARM | 1755 | * for platform device setup is to cope with things like signal |
| 1742 | /* Cypress docs say the IRQ is IRQT_HIGH ... */ | 1756 | * inverters (e.g. CF is active low) or working only with edge |
| 1743 | set_irq_type(irq, IRQT_RISING); | 1757 | * triggers (e.g. most ARM CPUs). Initial driver stress testing |
| 1744 | #endif | 1758 | * was on a system with single edge triggering, so most sorts of |
| 1745 | retval = usb_add_hcd(hcd, irq, SA_INTERRUPT); | 1759 | * triggering arrangement should work. |
| 1760 | */ | ||
| 1761 | retval = usb_add_hcd(hcd, irq, SA_INTERRUPT | SA_SHIRQ); | ||
| 1746 | if (retval != 0) | 1762 | if (retval != 0) |
| 1747 | goto err6; | 1763 | goto err6; |
| 1748 | 1764 | ||
| @@ -1752,14 +1768,12 @@ sl811h_probe(struct device *dev) | |||
| 1752 | err6: | 1768 | err6: |
| 1753 | usb_put_hcd(hcd); | 1769 | usb_put_hcd(hcd); |
| 1754 | err5: | 1770 | err5: |
| 1755 | iounmap(data_reg); | 1771 | if (!ioaddr) |
| 1772 | iounmap(data_reg); | ||
| 1756 | err4: | 1773 | err4: |
| 1757 | release_mem_region(data->start, 1); | 1774 | if (!ioaddr) |
| 1758 | err3: | 1775 | iounmap(addr_reg); |
| 1759 | iounmap(addr_reg); | ||
| 1760 | err2: | 1776 | err2: |
| 1761 | release_mem_region(addr->start, 1); | ||
| 1762 | err1: | ||
| 1763 | DBG("init error, %d\n", retval); | 1777 | DBG("init error, %d\n", retval); |
| 1764 | return retval; | 1778 | return retval; |
| 1765 | } | 1779 | } |
| @@ -1767,7 +1781,7 @@ sl811h_probe(struct device *dev) | |||
| 1767 | #ifdef CONFIG_PM | 1781 | #ifdef CONFIG_PM |
| 1768 | 1782 | ||
| 1769 | /* for this device there's no useful distinction between the controller | 1783 | /* for this device there's no useful distinction between the controller |
| 1770 | * and its root hub, except that the root hub only gets direct PM calls | 1784 | * and its root hub, except that the root hub only gets direct PM calls |
| 1771 | * when CONFIG_USB_SUSPEND is enabled. | 1785 | * when CONFIG_USB_SUSPEND is enabled. |
| 1772 | */ | 1786 | */ |
| 1773 | 1787 | ||
| @@ -1821,20 +1835,22 @@ sl811h_resume(struct device *dev, u32 phase) | |||
| 1821 | #endif | 1835 | #endif |
| 1822 | 1836 | ||
| 1823 | 1837 | ||
| 1824 | static struct device_driver sl811h_driver = { | 1838 | /* this driver is exported so sl811_cs can depend on it */ |
| 1839 | struct device_driver sl811h_driver = { | ||
| 1825 | .name = (char *) hcd_name, | 1840 | .name = (char *) hcd_name, |
| 1826 | .bus = &platform_bus_type, | 1841 | .bus = &platform_bus_type, |
| 1827 | 1842 | ||
| 1828 | .probe = sl811h_probe, | 1843 | .probe = sl811h_probe, |
| 1829 | .remove = sl811h_remove, | 1844 | .remove = __devexit_p(sl811h_remove), |
| 1830 | 1845 | ||
| 1831 | .suspend = sl811h_suspend, | 1846 | .suspend = sl811h_suspend, |
| 1832 | .resume = sl811h_resume, | 1847 | .resume = sl811h_resume, |
| 1833 | }; | 1848 | }; |
| 1849 | EXPORT_SYMBOL(sl811h_driver); | ||
| 1834 | 1850 | ||
| 1835 | /*-------------------------------------------------------------------------*/ | 1851 | /*-------------------------------------------------------------------------*/ |
| 1836 | 1852 | ||
| 1837 | static int __init sl811h_init(void) | 1853 | static int __init sl811h_init(void) |
| 1838 | { | 1854 | { |
| 1839 | if (usb_disabled()) | 1855 | if (usb_disabled()) |
| 1840 | return -ENODEV; | 1856 | return -ENODEV; |
| @@ -1844,8 +1860,8 @@ static int __init sl811h_init(void) | |||
| 1844 | } | 1860 | } |
| 1845 | module_init(sl811h_init); | 1861 | module_init(sl811h_init); |
| 1846 | 1862 | ||
| 1847 | static void __exit sl811h_cleanup(void) | 1863 | static void __exit sl811h_cleanup(void) |
| 1848 | { | 1864 | { |
| 1849 | driver_unregister(&sl811h_driver); | 1865 | driver_unregister(&sl811h_driver); |
| 1850 | } | 1866 | } |
| 1851 | module_exit(sl811h_cleanup); | 1867 | module_exit(sl811h_cleanup); |
diff --git a/drivers/usb/host/sl811_cs.c b/drivers/usb/host/sl811_cs.c new file mode 100644 index 000000000000..6e173265095c --- /dev/null +++ b/drivers/usb/host/sl811_cs.c | |||
| @@ -0,0 +1,442 @@ | |||
| 1 | /* | ||
| 2 | * PCMCIA driver for SL811HS (as found in REX-CFU1U) | ||
| 3 | * Filename: sl811_cs.c | ||
| 4 | * Author: Yukio Yamamoto | ||
| 5 | * | ||
| 6 | * Port to sl811-hcd and 2.6.x by | ||
| 7 | * Botond Botyanszki <boti@rocketmail.com> | ||
| 8 | * Simon Pickering | ||
| 9 | * | ||
| 10 | * Last update: 2005-05-12 | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/kernel.h> | ||
| 14 | #include <linux/module.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/sched.h> | ||
| 17 | #include <linux/ptrace.h> | ||
| 18 | #include <linux/slab.h> | ||
| 19 | #include <linux/string.h> | ||
| 20 | #include <linux/timer.h> | ||
| 21 | #include <linux/ioport.h> | ||
| 22 | |||
| 23 | #include <pcmcia/version.h> | ||
| 24 | #include <pcmcia/cs_types.h> | ||
| 25 | #include <pcmcia/cs.h> | ||
| 26 | #include <pcmcia/cistpl.h> | ||
| 27 | #include <pcmcia/cisreg.h> | ||
| 28 | #include <pcmcia/ds.h> | ||
| 29 | |||
| 30 | #include <linux/usb_sl811.h> | ||
| 31 | |||
| 32 | MODULE_AUTHOR("Botond Botyanszki"); | ||
| 33 | MODULE_DESCRIPTION("REX-CFU1U PCMCIA driver for 2.6"); | ||
| 34 | MODULE_LICENSE("GPL"); | ||
| 35 | |||
| 36 | |||
| 37 | /*====================================================================*/ | ||
| 38 | /* MACROS */ | ||
| 39 | /*====================================================================*/ | ||
| 40 | |||
| 41 | #if defined(DEBUG) || defined(CONFIG_USB_DEBUG) || defined(PCMCIA_DEBUG) | ||
| 42 | |||
| 43 | static int pc_debug = 0; | ||
| 44 | module_param(pc_debug, int, 0644); | ||
| 45 | |||
| 46 | #define DBG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG "sl811_cs: " args) | ||
| 47 | |||
| 48 | #else | ||
| 49 | #define DBG(n, args...) do{}while(0) | ||
| 50 | #endif /* no debugging */ | ||
| 51 | |||
| 52 | #define INFO(args...) printk(KERN_INFO "sl811_cs: " args) | ||
| 53 | |||
| 54 | #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0444) | ||
| 55 | |||
| 56 | #define CS_CHECK(fn, ret) \ | ||
| 57 | do { \ | ||
| 58 | last_fn = (fn); \ | ||
| 59 | if ((last_ret = (ret)) != 0) \ | ||
| 60 | goto cs_failed; \ | ||
| 61 | } while (0) | ||
| 62 | |||
| 63 | /*====================================================================*/ | ||
| 64 | /* VARIABLES */ | ||
| 65 | /*====================================================================*/ | ||
| 66 | |||
| 67 | static const char driver_name[DEV_NAME_LEN] = "sl811_cs"; | ||
| 68 | |||
| 69 | static dev_link_t *dev_list = NULL; | ||
| 70 | |||
| 71 | static int irq_list[4] = { -1 }; | ||
| 72 | static int irq_list_count; | ||
| 73 | |||
| 74 | module_param_array(irq_list, int, &irq_list_count, 0444); | ||
| 75 | |||
| 76 | INT_MODULE_PARM(irq_mask, 0xdeb8); | ||
| 77 | |||
| 78 | typedef struct local_info_t { | ||
| 79 | dev_link_t link; | ||
| 80 | dev_node_t node; | ||
| 81 | } local_info_t; | ||
| 82 | |||
| 83 | /*====================================================================*/ | ||
| 84 | |||
| 85 | static void release_platform_dev(struct device * dev) | ||
| 86 | { | ||
| 87 | DBG(0, "sl811_cs platform_dev release\n"); | ||
| 88 | dev->parent = NULL; | ||
| 89 | } | ||
| 90 | |||
| 91 | static struct sl811_platform_data platform_data = { | ||
| 92 | .potpg = 100, | ||
| 93 | .power = 50, /* == 100mA */ | ||
| 94 | // .reset = ... FIXME: invoke CF reset on the card | ||
| 95 | }; | ||
| 96 | |||
| 97 | static struct resource resources[] = { | ||
| 98 | [0] = { | ||
| 99 | .flags = IORESOURCE_IRQ, | ||
| 100 | }, | ||
| 101 | [1] = { | ||
| 102 | // .name = "address", | ||
| 103 | .flags = IORESOURCE_IO, | ||
| 104 | }, | ||
| 105 | [2] = { | ||
| 106 | // .name = "data", | ||
| 107 | .flags = IORESOURCE_IO, | ||
| 108 | }, | ||
| 109 | }; | ||
| 110 | |||
| 111 | extern struct device_driver sl811h_driver; | ||
| 112 | |||
| 113 | static struct platform_device platform_dev = { | ||
| 114 | .id = -1, | ||
| 115 | .dev = { | ||
| 116 | .platform_data = &platform_data, | ||
| 117 | .release = release_platform_dev, | ||
| 118 | }, | ||
| 119 | .resource = resources, | ||
| 120 | .num_resources = ARRAY_SIZE(resources), | ||
| 121 | }; | ||
| 122 | |||
| 123 | static int sl811_hc_init(struct device *parent, ioaddr_t base_addr, int irq) | ||
| 124 | { | ||
| 125 | if (platform_dev.dev.parent) | ||
| 126 | return -EBUSY; | ||
| 127 | platform_dev.dev.parent = parent; | ||
| 128 | |||
| 129 | /* finish seting up the platform device */ | ||
| 130 | resources[0].start = irq; | ||
| 131 | |||
| 132 | resources[1].start = base_addr; | ||
| 133 | resources[1].end = base_addr; | ||
| 134 | |||
| 135 | resources[2].start = base_addr + 1; | ||
| 136 | resources[2].end = base_addr + 1; | ||
| 137 | |||
| 138 | /* The driver core will probe for us. We know sl811-hcd has been | ||
| 139 | * initialized already because of the link order dependency. | ||
| 140 | */ | ||
| 141 | platform_dev.name = sl811h_driver.name; | ||
| 142 | return platform_device_register(&platform_dev); | ||
| 143 | } | ||
| 144 | |||
| 145 | /*====================================================================*/ | ||
| 146 | |||
| 147 | static void sl811_cs_detach(dev_link_t *link) | ||
| 148 | { | ||
| 149 | dev_link_t **linkp; | ||
| 150 | |||
| 151 | DBG(0, "sl811_cs_detach(0x%p)\n", link); | ||
| 152 | |||
| 153 | /* Locate device structure */ | ||
| 154 | for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next) { | ||
| 155 | if (*linkp == link) | ||
| 156 | break; | ||
| 157 | } | ||
| 158 | if (*linkp == NULL) | ||
| 159 | return; | ||
| 160 | |||
| 161 | /* Break the link with Card Services */ | ||
| 162 | if (link->handle) | ||
| 163 | pcmcia_deregister_client(link->handle); | ||
| 164 | |||
| 165 | /* Unlink device structure, and free it */ | ||
| 166 | *linkp = link->next; | ||
| 167 | /* This points to the parent local_info_t struct */ | ||
| 168 | kfree(link->priv); | ||
| 169 | } | ||
| 170 | |||
| 171 | static void sl811_cs_release(dev_link_t * link) | ||
| 172 | { | ||
| 173 | |||
| 174 | DBG(0, "sl811_cs_release(0x%p)\n", link); | ||
| 175 | |||
| 176 | if (link->open) { | ||
| 177 | DBG(1, "sl811_cs: release postponed, '%s' still open\n", | ||
| 178 | link->dev->dev_name); | ||
| 179 | link->state |= DEV_STALE_CONFIG; | ||
| 180 | return; | ||
| 181 | } | ||
| 182 | |||
| 183 | /* Unlink the device chain */ | ||
| 184 | link->dev = NULL; | ||
| 185 | |||
| 186 | platform_device_unregister(&platform_dev); | ||
| 187 | pcmcia_release_configuration(link->handle); | ||
| 188 | if (link->io.NumPorts1) | ||
| 189 | pcmcia_release_io(link->handle, &link->io); | ||
| 190 | if (link->irq.AssignedIRQ) | ||
| 191 | pcmcia_release_irq(link->handle, &link->irq); | ||
| 192 | link->state &= ~DEV_CONFIG; | ||
| 193 | |||
| 194 | if (link->state & DEV_STALE_LINK) | ||
| 195 | sl811_cs_detach(link); | ||
| 196 | } | ||
| 197 | |||
| 198 | static void sl811_cs_config(dev_link_t *link) | ||
| 199 | { | ||
| 200 | client_handle_t handle = link->handle; | ||
| 201 | struct device *parent = &handle_to_dev(handle); | ||
| 202 | local_info_t *dev = link->priv; | ||
| 203 | tuple_t tuple; | ||
| 204 | cisparse_t parse; | ||
| 205 | int last_fn, last_ret; | ||
| 206 | u_char buf[64]; | ||
| 207 | config_info_t conf; | ||
| 208 | cistpl_cftable_entry_t dflt = { 0 }; | ||
| 209 | |||
| 210 | DBG(0, "sl811_cs_config(0x%p)\n", link); | ||
| 211 | |||
| 212 | tuple.DesiredTuple = CISTPL_CONFIG; | ||
| 213 | tuple.Attributes = 0; | ||
| 214 | tuple.TupleData = buf; | ||
| 215 | tuple.TupleDataMax = sizeof(buf); | ||
| 216 | tuple.TupleOffset = 0; | ||
| 217 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | ||
| 218 | CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple)); | ||
| 219 | CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse)); | ||
| 220 | link->conf.ConfigBase = parse.config.base; | ||
| 221 | link->conf.Present = parse.config.rmask[0]; | ||
| 222 | |||
| 223 | /* Configure card */ | ||
| 224 | link->state |= DEV_CONFIG; | ||
| 225 | |||
| 226 | /* Look up the current Vcc */ | ||
| 227 | CS_CHECK(GetConfigurationInfo, | ||
| 228 | pcmcia_get_configuration_info(handle, &conf)); | ||
| 229 | link->conf.Vcc = conf.Vcc; | ||
| 230 | |||
| 231 | tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY; | ||
| 232 | CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple)); | ||
| 233 | while (1) { | ||
| 234 | cistpl_cftable_entry_t *cfg = &(parse.cftable_entry); | ||
| 235 | |||
| 236 | if (pcmcia_get_tuple_data(handle, &tuple) != 0 | ||
| 237 | || pcmcia_parse_tuple(handle, &tuple, &parse) | ||
| 238 | != 0) | ||
| 239 | goto next_entry; | ||
| 240 | |||
| 241 | if (cfg->flags & CISTPL_CFTABLE_DEFAULT) { | ||
| 242 | dflt = *cfg; | ||
| 243 | } | ||
| 244 | |||
| 245 | if (cfg->index == 0) | ||
| 246 | goto next_entry; | ||
| 247 | |||
| 248 | link->conf.ConfigIndex = cfg->index; | ||
| 249 | |||
| 250 | /* Use power settings for Vcc and Vpp if present */ | ||
| 251 | /* Note that the CIS values need to be rescaled */ | ||
| 252 | if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) { | ||
| 253 | if (cfg->vcc.param[CISTPL_POWER_VNOM]/10000 | ||
| 254 | != conf.Vcc) | ||
| 255 | goto next_entry; | ||
| 256 | } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) { | ||
| 257 | if (dflt.vcc.param[CISTPL_POWER_VNOM]/10000 | ||
| 258 | != conf.Vcc) | ||
| 259 | goto next_entry; | ||
| 260 | } | ||
| 261 | |||
| 262 | if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
| 263 | link->conf.Vpp1 = link->conf.Vpp2 = | ||
| 264 | cfg->vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
| 265 | else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM)) | ||
| 266 | link->conf.Vpp1 = link->conf.Vpp2 = | ||
| 267 | dflt.vpp1.param[CISTPL_POWER_VNOM]/10000; | ||
| 268 | |||
| 269 | /* we need an interrupt */ | ||
| 270 | if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1) | ||
| 271 | link->conf.Attributes |= CONF_ENABLE_IRQ; | ||
| 272 | |||
| 273 | /* IO window settings */ | ||
| 274 | link->io.NumPorts1 = link->io.NumPorts2 = 0; | ||
| 275 | if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) { | ||
| 276 | cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io; | ||
| 277 | |||
| 278 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | ||
| 279 | link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | ||
| 280 | link->io.BasePort1 = io->win[0].base; | ||
| 281 | link->io.NumPorts1 = io->win[0].len; | ||
| 282 | |||
| 283 | if (pcmcia_request_io(link->handle, &link->io) != 0) | ||
| 284 | goto next_entry; | ||
| 285 | } | ||
| 286 | break; | ||
| 287 | |||
| 288 | next_entry: | ||
| 289 | if (link->io.NumPorts1) | ||
| 290 | pcmcia_release_io(link->handle, &link->io); | ||
| 291 | last_ret = pcmcia_get_next_tuple(handle, &tuple); | ||
| 292 | } | ||
| 293 | |||
| 294 | /* require an IRQ and two registers */ | ||
| 295 | if (!link->io.NumPorts1 || link->io.NumPorts1 < 2) | ||
| 296 | goto cs_failed; | ||
| 297 | if (link->conf.Attributes & CONF_ENABLE_IRQ) | ||
| 298 | CS_CHECK(RequestIRQ, | ||
| 299 | pcmcia_request_irq(link->handle, &link->irq)); | ||
| 300 | else | ||
| 301 | goto cs_failed; | ||
| 302 | |||
| 303 | CS_CHECK(RequestConfiguration, | ||
| 304 | pcmcia_request_configuration(link->handle, &link->conf)); | ||
| 305 | |||
| 306 | sprintf(dev->node.dev_name, driver_name); | ||
| 307 | dev->node.major = dev->node.minor = 0; | ||
| 308 | link->dev = &dev->node; | ||
| 309 | |||
| 310 | printk(KERN_INFO "%s: index 0x%02x: Vcc %d.%d", | ||
| 311 | dev->node.dev_name, link->conf.ConfigIndex, | ||
| 312 | link->conf.Vcc/10, link->conf.Vcc%10); | ||
| 313 | if (link->conf.Vpp1) | ||
| 314 | printk(", Vpp %d.%d", link->conf.Vpp1/10, link->conf.Vpp1%10); | ||
| 315 | printk(", irq %d", link->irq.AssignedIRQ); | ||
| 316 | printk(", io 0x%04x-0x%04x", link->io.BasePort1, | ||
| 317 | link->io.BasePort1+link->io.NumPorts1-1); | ||
| 318 | printk("\n"); | ||
| 319 | |||
| 320 | link->state &= ~DEV_CONFIG_PENDING; | ||
| 321 | |||
| 322 | if (sl811_hc_init(parent, link->io.BasePort1, link->irq.AssignedIRQ) | ||
| 323 | < 0) { | ||
| 324 | cs_failed: | ||
| 325 | printk("sl811_cs_config failed\n"); | ||
| 326 | cs_error(link->handle, last_fn, last_ret); | ||
| 327 | sl811_cs_release(link); | ||
| 328 | link->state &= ~DEV_CONFIG_PENDING; | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 332 | static int | ||
| 333 | sl811_cs_event(event_t event, int priority, event_callback_args_t *args) | ||
| 334 | { | ||
| 335 | dev_link_t *link = args->client_data; | ||
| 336 | |||
| 337 | DBG(1, "sl811_cs_event(0x%06x)\n", event); | ||
| 338 | |||
| 339 | switch (event) { | ||
| 340 | case CS_EVENT_CARD_REMOVAL: | ||
| 341 | link->state &= ~DEV_PRESENT; | ||
| 342 | if (link->state & DEV_CONFIG) | ||
| 343 | sl811_cs_release(link); | ||
| 344 | break; | ||
| 345 | |||
| 346 | case CS_EVENT_CARD_INSERTION: | ||
| 347 | link->state |= DEV_PRESENT | DEV_CONFIG_PENDING; | ||
| 348 | sl811_cs_config(link); | ||
| 349 | break; | ||
| 350 | |||
| 351 | case CS_EVENT_PM_SUSPEND: | ||
| 352 | link->state |= DEV_SUSPEND; | ||
| 353 | /* Fall through... */ | ||
| 354 | case CS_EVENT_RESET_PHYSICAL: | ||
| 355 | if (link->state & DEV_CONFIG) | ||
| 356 | pcmcia_release_configuration(link->handle); | ||
| 357 | break; | ||
| 358 | |||
| 359 | case CS_EVENT_PM_RESUME: | ||
| 360 | link->state &= ~DEV_SUSPEND; | ||
| 361 | /* Fall through... */ | ||
| 362 | case CS_EVENT_CARD_RESET: | ||
| 363 | if (link->state & DEV_CONFIG) | ||
| 364 | pcmcia_request_configuration(link->handle, &link->conf); | ||
| 365 | DBG(0, "reset sl811-hcd here?\n"); | ||
| 366 | break; | ||
| 367 | } | ||
| 368 | return 0; | ||
| 369 | } | ||
| 370 | |||
| 371 | static dev_link_t *sl811_cs_attach(void) | ||
| 372 | { | ||
| 373 | local_info_t *local; | ||
| 374 | dev_link_t *link; | ||
| 375 | client_reg_t client_reg; | ||
| 376 | int ret, i; | ||
| 377 | |||
| 378 | local = kmalloc(sizeof(local_info_t), GFP_KERNEL); | ||
| 379 | if (!local) | ||
| 380 | return NULL; | ||
| 381 | memset(local, 0, sizeof(local_info_t)); | ||
| 382 | link = &local->link; | ||
| 383 | link->priv = local; | ||
| 384 | |||
| 385 | /* Initialize */ | ||
| 386 | link->irq.Attributes = IRQ_TYPE_EXCLUSIVE; | ||
| 387 | link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID; | ||
| 388 | if (irq_list[0] == -1) | ||
| 389 | link->irq.IRQInfo2 = irq_mask; | ||
| 390 | else | ||
| 391 | for (i = 0; i < irq_list_count; i++) | ||
| 392 | link->irq.IRQInfo2 |= 1 << irq_list[i]; | ||
| 393 | link->irq.Handler = NULL; | ||
| 394 | |||
| 395 | link->conf.Attributes = 0; | ||
| 396 | link->conf.Vcc = 33; | ||
| 397 | link->conf.IntType = INT_MEMORY_AND_IO; | ||
| 398 | |||
| 399 | /* Register with Card Services */ | ||
| 400 | link->next = dev_list; | ||
| 401 | dev_list = link; | ||
| 402 | client_reg.dev_info = (dev_info_t *) &driver_name; | ||
| 403 | client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE; | ||
| 404 | client_reg.EventMask = | ||
| 405 | CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL | | ||
| 406 | CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET | | ||
| 407 | CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME; | ||
| 408 | client_reg.event_handler = &sl811_cs_event; | ||
| 409 | client_reg.Version = 0x0210; | ||
| 410 | client_reg.event_callback_args.client_data = link; | ||
| 411 | ret = pcmcia_register_client(&link->handle, &client_reg); | ||
| 412 | if (ret != CS_SUCCESS) { | ||
| 413 | cs_error(link->handle, RegisterClient, ret); | ||
| 414 | sl811_cs_detach(link); | ||
| 415 | return NULL; | ||
| 416 | } | ||
| 417 | |||
| 418 | return link; | ||
| 419 | } | ||
| 420 | |||
| 421 | static struct pcmcia_driver sl811_cs_driver = { | ||
| 422 | .owner = THIS_MODULE, | ||
| 423 | .drv = { | ||
| 424 | .name = (char *)driver_name, | ||
| 425 | }, | ||
| 426 | .attach = sl811_cs_attach, | ||
| 427 | .detach = sl811_cs_detach, | ||
| 428 | }; | ||
| 429 | |||
| 430 | /*====================================================================*/ | ||
| 431 | |||
| 432 | static int __init init_sl811_cs(void) | ||
| 433 | { | ||
| 434 | return pcmcia_register_driver(&sl811_cs_driver); | ||
| 435 | } | ||
| 436 | module_init(init_sl811_cs); | ||
| 437 | |||
| 438 | static void __exit exit_sl811_cs(void) | ||
| 439 | { | ||
| 440 | pcmcia_unregister_driver(&sl811_cs_driver); | ||
| 441 | } | ||
| 442 | module_exit(exit_sl811_cs); | ||
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index 869ff73690ac..2d8bd9dcc6ed 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
| @@ -1315,6 +1315,8 @@ void hid_init_reports(struct hid_device *hid) | |||
| 1315 | #define USB_DEVICE_ID_WACOM_INTUOS2 0x0040 | 1315 | #define USB_DEVICE_ID_WACOM_INTUOS2 0x0040 |
| 1316 | #define USB_DEVICE_ID_WACOM_VOLITO 0x0060 | 1316 | #define USB_DEVICE_ID_WACOM_VOLITO 0x0060 |
| 1317 | #define USB_DEVICE_ID_WACOM_PTU 0x0003 | 1317 | #define USB_DEVICE_ID_WACOM_PTU 0x0003 |
| 1318 | #define USB_DEVICE_ID_WACOM_INTUOS3 0x00B0 | ||
| 1319 | #define USB_DEVICE_ID_WACOM_CINTIQ 0x003F | ||
| 1318 | 1320 | ||
| 1319 | #define USB_VENDOR_ID_KBGEAR 0x084e | 1321 | #define USB_VENDOR_ID_KBGEAR 0x084e |
| 1320 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 | 1322 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 |
| @@ -1401,6 +1403,7 @@ void hid_init_reports(struct hid_device *hid) | |||
| 1401 | 1403 | ||
| 1402 | #define USB_VENDOR_ID_DELORME 0x1163 | 1404 | #define USB_VENDOR_ID_DELORME 0x1163 |
| 1403 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 | 1405 | #define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 |
| 1406 | #define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 | ||
| 1404 | 1407 | ||
| 1405 | #define USB_VENDOR_ID_MCC 0x09db | 1408 | #define USB_VENDOR_ID_MCC 0x09db |
| 1406 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 | 1409 | #define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 |
| @@ -1412,6 +1415,12 @@ void hid_init_reports(struct hid_device *hid) | |||
| 1412 | #define USB_VENDOR_ID_BTC 0x046e | 1415 | #define USB_VENDOR_ID_BTC 0x046e |
| 1413 | #define USB_DEVICE_ID_BTC_KEYBOARD 0x5303 | 1416 | #define USB_DEVICE_ID_BTC_KEYBOARD 0x5303 |
| 1414 | 1417 | ||
| 1418 | #define USB_VENDOR_ID_VERNIER 0x08f7 | ||
| 1419 | #define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 | ||
| 1420 | #define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 | ||
| 1421 | #define USB_DEVICE_ID_VERNIER_SKIP 0x0003 | ||
| 1422 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | ||
| 1423 | |||
| 1415 | 1424 | ||
| 1416 | /* | 1425 | /* |
| 1417 | * Alphabetically sorted blacklist by quirk type. | 1426 | * Alphabetically sorted blacklist by quirk type. |
| @@ -1437,6 +1446,7 @@ static struct hid_blacklist { | |||
| 1437 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE }, | 1446 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW28, HID_QUIRK_IGNORE }, |
| 1438 | { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE }, | 1447 | { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE }, |
| 1439 | { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE }, | 1448 | { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE }, |
| 1449 | { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE }, | ||
| 1440 | { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE }, | 1450 | { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE }, |
| 1441 | { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, | 1451 | { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, |
| 1442 | { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, | 1452 | { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, |
| @@ -1456,6 +1466,10 @@ static struct hid_blacklist { | |||
| 1456 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE }, | 1466 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE }, |
| 1457 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE }, | 1467 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE }, |
| 1458 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE }, | 1468 | { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE }, |
| 1469 | { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE }, | ||
| 1470 | { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE }, | ||
| 1471 | { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE }, | ||
| 1472 | { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE }, | ||
| 1459 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PENPARTNER, HID_QUIRK_IGNORE }, | 1473 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PENPARTNER, HID_QUIRK_IGNORE }, |
| 1460 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE, HID_QUIRK_IGNORE }, | 1474 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE, HID_QUIRK_IGNORE }, |
| 1461 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 1, HID_QUIRK_IGNORE }, | 1475 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_GRAPHIRE + 1, HID_QUIRK_IGNORE }, |
| @@ -1481,6 +1495,10 @@ static struct hid_blacklist { | |||
| 1481 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE }, | 1495 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS2 + 7, HID_QUIRK_IGNORE }, |
| 1482 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE }, | 1496 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_VOLITO, HID_QUIRK_IGNORE }, |
| 1483 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE }, | 1497 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_PTU, HID_QUIRK_IGNORE }, |
| 1498 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3, HID_QUIRK_IGNORE }, | ||
| 1499 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 1, HID_QUIRK_IGNORE }, | ||
| 1500 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_INTUOS3 + 2, HID_QUIRK_IGNORE }, | ||
| 1501 | { USB_VENDOR_ID_WACOM, USB_DEVICE_ID_WACOM_CINTIQ, HID_QUIRK_IGNORE }, | ||
| 1484 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, | 1502 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, |
| 1485 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, | 1503 | { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, |
| 1486 | 1504 | ||
diff --git a/drivers/usb/media/pwc/ChangeLog b/drivers/usb/media/pwc/ChangeLog deleted file mode 100644 index b2eb71a9afb5..000000000000 --- a/drivers/usb/media/pwc/ChangeLog +++ /dev/null | |||
| @@ -1,143 +0,0 @@ | |||
| 1 | 9.0.2 | ||
| 2 | |||
| 3 | * Adding #ifdef to compile PWC before and after 2.6.5 | ||
| 4 | |||
| 5 | 9.0.1 | ||
| 6 | |||
| 7 | 9.0 | ||
| 8 | |||
| 9 | |||
| 10 | 8.12 | ||
| 11 | |||
| 12 | * Implement motorized pan/tilt feature for Logitech QuickCam Orbit/Spere. | ||
| 13 | |||
| 14 | 8.11.1 | ||
| 15 | |||
| 16 | * Fix for PCVC720/40, would not be able to set videomode | ||
| 17 | * Fix for Samsung MPC models, appearantly they are based on a newer chipset | ||
| 18 | |||
| 19 | 8.11 | ||
| 20 | |||
| 21 | * 20 dev_hints (per request) | ||
| 22 | * Hot unplugging should be better, no more dangling pointers or memory leaks | ||
| 23 | * Added reserved Logitech webcam IDs | ||
| 24 | * Device now remembers size & fps between close()/open() | ||
| 25 | * Removed palette stuff altogether | ||
| 26 | |||
| 27 | 8.10.1 | ||
| 28 | |||
| 29 | * Added IDs for PCVC720K/40 and Creative Labs Webcam Pro | ||
| 30 | |||
| 31 | 8.10 | ||
| 32 | |||
| 33 | * Fixed ID for QuickCam Notebook pro | ||
| 34 | * Added GREALSIZE ioctl() call | ||
| 35 | * Fixed bug in case PWCX was not loaded and invalid size was set | ||
| 36 | |||
| 37 | 8.9 | ||
| 38 | |||
| 39 | * Merging with kernel 2.5.49 | ||
| 40 | * Adding IDs for QuickCam Zoom & QuickCam Notebook | ||
| 41 | |||
| 42 | 8.8 | ||
| 43 | |||
| 44 | * Fixing 'leds' parameter | ||
| 45 | * Adding IDs for Logitech QuickCam Pro 4000 | ||
| 46 | * Making URB init/cleanup a little nicer | ||
| 47 | |||
| 48 | 8.7 | ||
| 49 | |||
| 50 | * Incorporating changes in ioctl() parameter passing | ||
| 51 | * Also changes to URB mechanism | ||
| 52 | |||
| 53 | 8.6 | ||
| 54 | |||
| 55 | * Added ID's for Visionite VCS UM100 and UC300 | ||
| 56 | * Removed YUV420-interlaced palette altogether (was confusing) | ||
| 57 | * Removed MIRROR stuff as it didn't work anyway | ||
| 58 | * Fixed a problem with the 'leds' parameter (wouldn't blink) | ||
| 59 | * Added ioctl()s for advanced features: 'extended' whitebalance ioctl()s, | ||
| 60 | CONTOUR, BACKLIGHT, FLICKER, DYNNOISE. | ||
| 61 | * VIDIOCGCAP.name now contains real camera model name instead of | ||
| 62 | 'Philips xxx webcam' | ||
| 63 | * Added PROBE ioctl (see previous point & API doc) | ||
| 64 | |||
| 65 | 8.5 | ||
| 66 | |||
| 67 | * Adding IDs for Creative Labs Webcam 5 | ||
| 68 | * Adding IDs for SOTEC CMS-001 webcam | ||
| 69 | * Solving possible hang in VIDIOCSYNC when unplugging the cam | ||
| 70 | * Forgot to return structure in VIDIOCPWCGAWB, oops | ||
| 71 | * Time interval for the LEDs are now in milliseconds | ||
| 72 | |||
| 73 | 8.4 | ||
| 74 | |||
| 75 | * Fixing power_save option for Vesta range | ||
| 76 | * Handling new error codes in ISOC callback | ||
| 77 | * Adding dev_hint module parameter, to specify /dev/videoX device nodes | ||
| 78 | |||
| 79 | 8.3 | ||
| 80 | |||
| 81 | * Adding Samsung C10 and C30 cameras | ||
| 82 | * Removing palette module parameter | ||
| 83 | * Fixed typo in ID of QuickCam 3000 Pro | ||
| 84 | * Adding LED settings (blinking while in use) for ToUCam cameras. | ||
| 85 | * Turns LED off when camera is not in use. | ||
| 86 | |||
| 87 | 8.2 | ||
| 88 | |||
| 89 | * Making module more silent when trace = 0 | ||
| 90 | * Adding QuickCam 3000 Pro IDs | ||
| 91 | * Chrominance control for the Vesta cameras | ||
| 92 | * Hopefully fixed problems on machines with BIGMEM and > 1GB of RAM | ||
| 93 | * Included Oliver Neukem's lock_kernel() patch | ||
| 94 | * Allocates less memory for image buffers | ||
| 95 | * Adds ioctl()s for the whitebalancing | ||
| 96 | |||
| 97 | 8.1 | ||
| 98 | |||
| 99 | * Adding support for 750 | ||
| 100 | * Adding V4L GAUDIO/SAUDIO/UNIT ioctl() calls | ||
| 101 | |||
| 102 | 8.0 | ||
| 103 | * 'damage control' after inclusion in 2.4.5. | ||
| 104 | * Changed wait-queue mechanism in read/mmap/poll according to the book. | ||
| 105 | * Included YUV420P palette. | ||
| 106 | * Changed interface to decompressor module. | ||
| 107 | * Cleaned up pwc structure a bit. | ||
| 108 | |||
| 109 | 7.0 | ||
| 110 | |||
| 111 | * Fixed bug in vcvt_420i_yuyv; extra variables on stack were misaligned. | ||
| 112 | * There is now a clear error message when an image size is selected that | ||
| 113 | is only supported using the decompressor, and the decompressor isn't | ||
| 114 | loaded. | ||
| 115 | * When the decompressor wasn't loaded, selecting large image size | ||
| 116 | would create skewed or double images. | ||
| 117 | |||
| 118 | 6.3 | ||
| 119 | |||
| 120 | * Introduced spinlocks for the buffer pointer manipulation; a number of | ||
| 121 | reports seem to suggest the down()/up() semaphores were the cause of | ||
| 122 | lockups, since they are not suitable for interrupt/user locking. | ||
| 123 | * Separated decompressor and core code into 2 modules. | ||
| 124 | |||
| 125 | 6.2 | ||
| 126 | |||
| 127 | * Non-integral image sizes are now padded with gray or black. | ||
| 128 | * Added SHUTTERSPEED ioctl(). | ||
| 129 | * Fixed buglet in VIDIOCPWCSAGC; the function would always return an error, | ||
| 130 | even though the call succeeded. | ||
| 131 | * Added hotplug support for 2.4.*. | ||
| 132 | * Memory: the 645/646 uses less memory now. | ||
| 133 | |||
| 134 | 6.1 | ||
| 135 | |||
| 136 | * VIDIOCSPICT returns -EINVAL with invalid palettes. | ||
| 137 | * Added saturation control. | ||
| 138 | * Split decompressors from rest. | ||
| 139 | * Fixed bug that would reset the framerate to the default framerate if | ||
| 140 | the rate field was set to 0 (which is not what I intended, nl. do not | ||
| 141 | change the framerate!). | ||
| 142 | * VIDIOCPWCSCQUAL (setting compression quality) now takes effect immediately. | ||
| 143 | * Workaround for a bug in the 730 sensor. | ||
diff --git a/drivers/usb/media/pwc/Makefile b/drivers/usb/media/pwc/Makefile index e0b41ed4407f..2d93a775011a 100644 --- a/drivers/usb/media/pwc/Makefile +++ b/drivers/usb/media/pwc/Makefile | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | ifneq ($(KERNELRELEASE),) | 1 | ifneq ($(KERNELRELEASE),) |
| 2 | 2 | ||
| 3 | pwc-objs := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-dec1.o pwc-dec23.o pwc-kiara.o pwc-timon.o | 3 | pwc-objs := pwc-if.o pwc-misc.o pwc-ctrl.o pwc-uncompress.o pwc-timon.o pwc-kiara.o |
| 4 | 4 | ||
| 5 | obj-$(CONFIG_USB_PWC) += pwc.o | 5 | obj-$(CONFIG_USB_PWC) += pwc.o |
| 6 | 6 | ||
diff --git a/drivers/usb/media/pwc/pwc-ctrl.c b/drivers/usb/media/pwc/pwc-ctrl.c index 42ec468d52d6..53099190952c 100644 --- a/drivers/usb/media/pwc/pwc-ctrl.c +++ b/drivers/usb/media/pwc/pwc-ctrl.c | |||
| @@ -48,8 +48,6 @@ | |||
| 48 | #include "pwc-uncompress.h" | 48 | #include "pwc-uncompress.h" |
| 49 | #include "pwc-kiara.h" | 49 | #include "pwc-kiara.h" |
| 50 | #include "pwc-timon.h" | 50 | #include "pwc-timon.h" |
| 51 | #include "pwc-dec1.h" | ||
| 52 | #include "pwc-dec23.h" | ||
| 53 | 51 | ||
| 54 | /* Request types: video */ | 52 | /* Request types: video */ |
| 55 | #define SET_LUM_CTL 0x01 | 53 | #define SET_LUM_CTL 0x01 |
| @@ -246,7 +244,7 @@ static inline int set_video_mode_Nala(struct pwc_device *pdev, int size, int fra | |||
| 246 | switch(pdev->type) { | 244 | switch(pdev->type) { |
| 247 | case 645: | 245 | case 645: |
| 248 | case 646: | 246 | case 646: |
| 249 | pwc_dec1_init(pdev->type, pdev->release, buf, pdev->decompress_data); | 247 | /* pwc_dec1_init(pdev->type, pdev->release, buf, pdev->decompress_data); */ |
| 250 | break; | 248 | break; |
| 251 | 249 | ||
| 252 | case 675: | 250 | case 675: |
| @@ -256,7 +254,7 @@ static inline int set_video_mode_Nala(struct pwc_device *pdev, int size, int fra | |||
| 256 | case 730: | 254 | case 730: |
| 257 | case 740: | 255 | case 740: |
| 258 | case 750: | 256 | case 750: |
| 259 | pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); | 257 | /* pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */ |
| 260 | break; | 258 | break; |
| 261 | } | 259 | } |
| 262 | } | 260 | } |
| @@ -318,8 +316,8 @@ static inline int set_video_mode_Timon(struct pwc_device *pdev, int size, int fr | |||
| 318 | if (ret < 0) | 316 | if (ret < 0) |
| 319 | return ret; | 317 | return ret; |
| 320 | 318 | ||
| 321 | if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW) | 319 | /* if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW) |
| 322 | pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); | 320 | pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */ |
| 323 | 321 | ||
| 324 | pdev->cmd_len = 13; | 322 | pdev->cmd_len = 13; |
| 325 | memcpy(pdev->cmd_buf, buf, 13); | 323 | memcpy(pdev->cmd_buf, buf, 13); |
| @@ -397,8 +395,8 @@ static inline int set_video_mode_Kiara(struct pwc_device *pdev, int size, int fr | |||
| 397 | if (ret < 0) | 395 | if (ret < 0) |
| 398 | return ret; | 396 | return ret; |
| 399 | 397 | ||
| 400 | if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW) | 398 | /* if (pChoose->bandlength > 0 && pdev->vpalette != VIDEO_PALETTE_RAW) |
| 401 | pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); | 399 | pwc_dec23_init(pdev->type, pdev->release, buf, pdev->decompress_data); */ |
| 402 | 400 | ||
| 403 | pdev->cmd_len = 12; | 401 | pdev->cmd_len = 12; |
| 404 | memcpy(pdev->cmd_buf, buf, 12); | 402 | memcpy(pdev->cmd_buf, buf, 12); |
diff --git a/drivers/usb/media/pwc/pwc-dec1.c b/drivers/usb/media/pwc/pwc-dec1.c deleted file mode 100644 index 57d03d9178f6..000000000000 --- a/drivers/usb/media/pwc/pwc-dec1.c +++ /dev/null | |||
| @@ -1,42 +0,0 @@ | |||
| 1 | /* Linux driver for Philips webcam | ||
| 2 | Decompression for chipset version 1 | ||
| 3 | (C) 2004 Luc Saillard (luc@saillard.org) | ||
| 4 | |||
| 5 | NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx | ||
| 6 | driver and thus may have bugs that are not present in the original version. | ||
| 7 | Please send bug reports and support requests to <luc@saillard.org>. | ||
| 8 | The decompression routines have been implemented by reverse-engineering the | ||
| 9 | Nemosoft binary pwcx module. Caveat emptor. | ||
| 10 | |||
| 11 | This program is free software; you can redistribute it and/or modify | ||
| 12 | it under the terms of the GNU General Public License as published by | ||
| 13 | the Free Software Foundation; either version 2 of the License, or | ||
| 14 | (at your option) any later version. | ||
| 15 | |||
| 16 | This program is distributed in the hope that it will be useful, | ||
| 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | GNU General Public License for more details. | ||
| 20 | |||
| 21 | You should have received a copy of the GNU General Public License | ||
| 22 | along with this program; if not, write to the Free Software | ||
| 23 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | #include "pwc-dec1.h" | ||
| 29 | |||
| 30 | |||
| 31 | void pwc_dec1_init(int type, int release, void *buffer, void *table) | ||
| 32 | { | ||
| 33 | |||
| 34 | } | ||
| 35 | |||
| 36 | void pwc_dec1_exit(void) | ||
| 37 | { | ||
| 38 | |||
| 39 | |||
| 40 | |||
| 41 | } | ||
| 42 | |||
diff --git a/drivers/usb/media/pwc/pwc-dec1.h b/drivers/usb/media/pwc/pwc-dec1.h deleted file mode 100644 index a7ffd9c45a2c..000000000000 --- a/drivers/usb/media/pwc/pwc-dec1.h +++ /dev/null | |||
| @@ -1,36 +0,0 @@ | |||
| 1 | /* Linux driver for Philips webcam | ||
| 2 | (C) 2004 Luc Saillard (luc@saillard.org) | ||
| 3 | |||
| 4 | NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx | ||
| 5 | driver and thus may have bugs that are not present in the original version. | ||
| 6 | Please send bug reports and support requests to <luc@saillard.org>. | ||
| 7 | The decompression routines have been implemented by reverse-engineering the | ||
| 8 | Nemosoft binary pwcx module. Caveat emptor. | ||
| 9 | |||
| 10 | This program is free software; you can redistribute it and/or modify | ||
| 11 | it under the terms of the GNU General Public License as published by | ||
| 12 | the Free Software Foundation; either version 2 of the License, or | ||
| 13 | (at your option) any later version. | ||
| 14 | |||
| 15 | This program is distributed in the hope that it will be useful, | ||
| 16 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | GNU General Public License for more details. | ||
| 19 | |||
| 20 | You should have received a copy of the GNU General Public License | ||
| 21 | along with this program; if not, write to the Free Software | ||
| 22 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | |||
| 26 | |||
| 27 | #ifndef PWC_DEC1_H | ||
| 28 | #define PWC_DEC1_H | ||
| 29 | |||
| 30 | void pwc_dec1_init(int type, int release, void *buffer, void *private_data); | ||
| 31 | void pwc_dec1_exit(void); | ||
| 32 | |||
| 33 | #endif | ||
| 34 | |||
| 35 | |||
| 36 | |||
diff --git a/drivers/usb/media/pwc/pwc-dec23.c b/drivers/usb/media/pwc/pwc-dec23.c deleted file mode 100644 index 98fa3f7a9eff..000000000000 --- a/drivers/usb/media/pwc/pwc-dec23.c +++ /dev/null | |||
| @@ -1,623 +0,0 @@ | |||
| 1 | /* Linux driver for Philips webcam | ||
| 2 | Decompression for chipset version 2 et 3 | ||
| 3 | (C) 2004 Luc Saillard (luc@saillard.org) | ||
| 4 | |||
| 5 | NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx | ||
| 6 | driver and thus may have bugs that are not present in the original version. | ||
| 7 | Please send bug reports and support requests to <luc@saillard.org>. | ||
| 8 | The decompression routines have been implemented by reverse-engineering the | ||
| 9 | Nemosoft binary pwcx module. Caveat emptor. | ||
| 10 | |||
| 11 | This program is free software; you can redistribute it and/or modify | ||
| 12 | it under the terms of the GNU General Public License as published by | ||
| 13 | the Free Software Foundation; either version 2 of the License, or | ||
| 14 | (at your option) any later version. | ||
| 15 | |||
| 16 | This program is distributed in the hope that it will be useful, | ||
| 17 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 19 | GNU General Public License for more details. | ||
| 20 | |||
| 21 | You should have received a copy of the GNU General Public License | ||
| 22 | along with this program; if not, write to the Free Software | ||
| 23 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 24 | */ | ||
| 25 | |||
| 26 | #include "pwc-timon.h" | ||
| 27 | #include "pwc-kiara.h" | ||
| 28 | #include "pwc-dec23.h" | ||
| 29 | #include "pwc-ioctl.h" | ||
| 30 | |||
| 31 | #include <linux/string.h> | ||
| 32 | |||
| 33 | /**** | ||
| 34 | * | ||
| 35 | * | ||
| 36 | * | ||
| 37 | */ | ||
| 38 | |||
| 39 | |||
| 40 | static void fill_table_a000(unsigned int *p) | ||
| 41 | { | ||
| 42 | static unsigned int initial_values[12] = { | ||
| 43 | 0xFFAD9B00, 0xFFDDEE00, 0x00221200, 0x00526500, | ||
| 44 | 0xFFC21E00, 0x003DE200, 0xFF924B80, 0xFFD2A300, | ||
| 45 | 0x002D5D00, 0x006DB480, 0xFFED3E00, 0x0012C200 | ||
| 46 | }; | ||
| 47 | static unsigned int values_derivated[12] = { | ||
| 48 | 0x0000A4CA, 0x00004424, 0xFFFFBBDC, 0xFFFF5B36, | ||
| 49 | 0x00007BC4, 0xFFFF843C, 0x0000DB69, 0x00005ABA, | ||
| 50 | 0xFFFFA546, 0xFFFF2497, 0x00002584, 0xFFFFDA7C | ||
| 51 | }; | ||
| 52 | unsigned int temp_values[12]; | ||
| 53 | int i,j; | ||
| 54 | |||
| 55 | memcpy(temp_values,initial_values,sizeof(initial_values)); | ||
| 56 | for (i=0;i<256;i++) | ||
| 57 | { | ||
| 58 | for (j=0;j<12;j++) | ||
| 59 | { | ||
| 60 | *p++ = temp_values[j]; | ||
| 61 | temp_values[j] += values_derivated[j]; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 66 | static void fill_table_d000(unsigned char *p) | ||
| 67 | { | ||
| 68 | int bit,byte; | ||
| 69 | |||
| 70 | for (bit=0; bit<8; bit++) | ||
| 71 | { | ||
| 72 | unsigned char bitpower = 1<<bit; | ||
| 73 | unsigned char mask = bitpower-1; | ||
| 74 | for (byte=0; byte<256; byte++) | ||
| 75 | { | ||
| 76 | if (byte & bitpower) | ||
| 77 | *p++ = -(byte & mask); | ||
| 78 | else | ||
| 79 | *p++ = (byte & mask); | ||
| 80 | } | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | /* | ||
| 85 | * | ||
| 86 | * Kiara: 0 <= ver <= 7 | ||
| 87 | * Timon: 0 <= ver <= 15 | ||
| 88 | * | ||
| 89 | */ | ||
| 90 | static void fill_table_color(unsigned int version, const unsigned int *romtable, | ||
| 91 | unsigned char *p0004, | ||
| 92 | unsigned char *p8004) | ||
| 93 | { | ||
| 94 | const unsigned int *table; | ||
| 95 | unsigned char *p0, *p8; | ||
| 96 | int i,j,k; | ||
| 97 | int dl,bit,pw; | ||
| 98 | |||
| 99 | romtable += version*256; | ||
| 100 | |||
| 101 | for (i=0; i<2; i++) | ||
| 102 | { | ||
| 103 | table = romtable + i*128; | ||
| 104 | |||
| 105 | for (dl=0; dl<16; dl++) | ||
| 106 | { | ||
| 107 | p0 = p0004 + (i<<14) + (dl<<10); | ||
| 108 | p8 = p8004 + (i<<12) + (dl<<8); | ||
| 109 | |||
| 110 | for (j=0; j<8; j++ , table++, p0+=128) | ||
| 111 | { | ||
| 112 | for (k=0; k<16; k++) | ||
| 113 | { | ||
| 114 | if (k==0) | ||
| 115 | bit=1; | ||
| 116 | else if (k>=1 && k<3) | ||
| 117 | bit=(table[0]>>15)&7; | ||
| 118 | else if (k>=3 && k<6) | ||
| 119 | bit=(table[0]>>12)&7; | ||
| 120 | else if (k>=6 && k<10) | ||
| 121 | bit=(table[0]>>9)&7; | ||
| 122 | else if (k>=10 && k<13) | ||
| 123 | bit=(table[0]>>6)&7; | ||
| 124 | else if (k>=13 && k<15) | ||
| 125 | bit=(table[0]>>3)&7; | ||
| 126 | else | ||
| 127 | bit=(table[0])&7; | ||
| 128 | if (k == 0) | ||
| 129 | *(unsigned char *)p8++ = 8; | ||
| 130 | else | ||
| 131 | *(unsigned char *)p8++ = j - bit; | ||
| 132 | *(unsigned char *)p8++ = bit; | ||
| 133 | |||
| 134 | pw = 1<<bit; | ||
| 135 | p0[k+0x00] = (1*pw) + 0x80; | ||
| 136 | p0[k+0x10] = (2*pw) + 0x80; | ||
| 137 | p0[k+0x20] = (3*pw) + 0x80; | ||
| 138 | p0[k+0x30] = (4*pw) + 0x80; | ||
| 139 | p0[k+0x40] = (-pw) + 0x80; | ||
| 140 | p0[k+0x50] = (2*-pw) + 0x80; | ||
| 141 | p0[k+0x60] = (3*-pw) + 0x80; | ||
| 142 | p0[k+0x70] = (4*-pw) + 0x80; | ||
| 143 | } /* end of for (k=0; k<16; k++, p8++) */ | ||
| 144 | } /* end of for (j=0; j<8; j++ , table++) */ | ||
| 145 | } /* end of for (dl=0; dl<16; dl++) */ | ||
| 146 | } /* end of for (i=0; i<2; i++) */ | ||
| 147 | } | ||
| 148 | |||
| 149 | /* | ||
| 150 | * precision = (pdev->xx + pdev->yy) | ||
| 151 | * | ||
| 152 | */ | ||
| 153 | static void fill_table_dc00_d800(unsigned int precision, unsigned int *pdc00, unsigned int *pd800) | ||
| 154 | { | ||
| 155 | int i; | ||
| 156 | unsigned int offset1, offset2; | ||
| 157 | |||
| 158 | for(i=0,offset1=0x4000, offset2=0; i<256 ; i++,offset1+=0x7BC4, offset2+=0x7BC4) | ||
| 159 | { | ||
| 160 | unsigned int msb = offset1 >> 15; | ||
| 161 | |||
| 162 | if ( msb > 255) | ||
| 163 | { | ||
| 164 | if (msb) | ||
| 165 | msb=0; | ||
| 166 | else | ||
| 167 | msb=255; | ||
| 168 | } | ||
| 169 | |||
| 170 | *pdc00++ = msb << precision; | ||
| 171 | *pd800++ = offset2; | ||
| 172 | } | ||
| 173 | |||
| 174 | } | ||
| 175 | |||
| 176 | /* | ||
| 177 | * struct { | ||
| 178 | * unsigned char op; // operation to execute | ||
| 179 | * unsigned char bits; // bits use to perform operation | ||
| 180 | * unsigned char offset1; // offset to add to access in the table_0004 % 16 | ||
| 181 | * unsigned char offset2; // offset to add to access in the table_0004 | ||
| 182 | * } | ||
| 183 | * | ||
| 184 | */ | ||
| 185 | static unsigned int table_ops[] = { | ||
| 186 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x01,0x30, | ||
| 187 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x20, 0x01,0x00,0x00,0x00, | ||
| 188 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x00, | ||
| 189 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x00, 0x01,0x00,0x00,0x00, | ||
| 190 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x02,0x10, | ||
| 191 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x60, 0x01,0x00,0x00,0x00, | ||
| 192 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x40, | ||
| 193 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x40, 0x01,0x00,0x00,0x00, | ||
| 194 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x01,0x70, | ||
| 195 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x20, 0x01,0x00,0x00,0x00, | ||
| 196 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x00, | ||
| 197 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x00, 0x01,0x00,0x00,0x00, | ||
| 198 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x10, 0x00,0x06,0x02,0x50, | ||
| 199 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x01,0x60, 0x01,0x00,0x00,0x00, | ||
| 200 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x00, 0x00,0x04,0x01,0x50, 0x00,0x05,0x02,0x40, | ||
| 201 | 0x02,0x00,0x00,0x00, 0x00,0x03,0x01,0x40, 0x00,0x05,0x03,0x40, 0x01,0x00,0x00,0x00 | ||
| 202 | }; | ||
| 203 | |||
| 204 | /* | ||
| 205 | * TODO: multiply by 4 all values | ||
| 206 | * | ||
| 207 | */ | ||
| 208 | static unsigned int MulIdx[256] = { | ||
| 209 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
| 210 | 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, | ||
| 211 | 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, | ||
| 212 | 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, | ||
| 213 | 6, 7, 8, 9, 7,10,11, 8, 8,11,10, 7, 9, 8, 7, 6, | ||
| 214 | 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, 4, 5, 5, 4, | ||
| 215 | 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, 2, | ||
| 216 | 0, 3, 3, 0, 1, 2, 2, 1, 2, 1, 1, 2, 3, 0, 0, 3, | ||
| 217 | 0, 1, 2, 3, 3, 2, 1, 0, 3, 2, 1, 0, 0, 1, 2, 3, | ||
| 218 | 1, 1, 1, 1, 3, 3, 3, 3, 0, 0, 0, 0, 2, 2, 2, 2, | ||
| 219 | 7,10,11, 8, 9, 8, 7, 6, 6, 7, 8, 9, 8,11,10, 7, | ||
| 220 | 4, 5, 5, 4, 5, 4, 4, 5, 5, 4, 4, 5, 4, 5, 5, 4, | ||
| 221 | 7, 9, 6, 8,10, 8, 7,11,11, 7, 8,10, 8, 6, 9, 7, | ||
| 222 | 1, 3, 0, 2, 2, 0, 3, 1, 2, 0, 3, 1, 1, 3, 0, 2, | ||
| 223 | 1, 2, 2, 1, 3, 0, 0, 3, 0, 3, 3, 0, 2, 1, 1, 2, | ||
| 224 | 10, 8, 7,11, 8, 6, 9, 7, 7, 9, 6, 8,11, 7, 8,10 | ||
| 225 | }; | ||
| 226 | |||
| 227 | |||
| 228 | |||
| 229 | void pwc_dec23_init(int type, int release, unsigned char *mode, void *data) | ||
| 230 | { | ||
| 231 | int flags; | ||
| 232 | struct pwc_dec23_private *pdev = data; | ||
| 233 | release = release; | ||
| 234 | |||
| 235 | switch (type) | ||
| 236 | { | ||
| 237 | case 720: | ||
| 238 | case 730: | ||
| 239 | case 740: | ||
| 240 | case 750: | ||
| 241 | flags = mode[2]&0x18; /* our: flags = 8, mode[2]==e8 */ | ||
| 242 | if (flags==8) | ||
| 243 | pdev->zz = 7; | ||
| 244 | else if (flags==0x10) | ||
| 245 | pdev->zz = 8; | ||
| 246 | else | ||
| 247 | pdev->zz = 6; | ||
| 248 | flags = mode[2]>>5; /* our: 7 */ | ||
| 249 | |||
| 250 | fill_table_color(flags, (unsigned int *)KiaraRomTable, pdev->table_0004, pdev->table_8004); | ||
| 251 | break; | ||
| 252 | |||
| 253 | |||
| 254 | case 675: | ||
| 255 | case 680: | ||
| 256 | case 690: | ||
| 257 | flags = mode[2]&6; | ||
| 258 | if (flags==2) | ||
| 259 | pdev->zz = 7; | ||
| 260 | else if (flags==4) | ||
| 261 | pdev->zz = 8; | ||
| 262 | else | ||
| 263 | pdev->zz = 6; | ||
| 264 | flags = mode[2]>>3; | ||
| 265 | |||
| 266 | fill_table_color(flags, (unsigned int *)TimonRomTable, pdev->table_0004, pdev->table_8004); | ||
| 267 | break; | ||
| 268 | |||
| 269 | default: | ||
| 270 | /* Not supported */ | ||
| 271 | return; | ||
| 272 | } | ||
| 273 | |||
| 274 | /* * * * ** */ | ||
| 275 | pdev->xx = 8 - pdev->zz; | ||
| 276 | pdev->yy = 15 - pdev->xx; | ||
| 277 | pdev->zzmask = 0xFF>>pdev->xx; | ||
| 278 | //pdev->zzmask = (1U<<pdev->zz)-1; | ||
| 279 | |||
| 280 | |||
| 281 | fill_table_dc00_d800(pdev->xx + pdev->yy, pdev->table_dc00, pdev->table_d800); | ||
| 282 | fill_table_a000(pdev->table_a004); | ||
| 283 | fill_table_d000(pdev->table_d004); | ||
| 284 | } | ||
| 285 | |||
| 286 | |||
| 287 | /* | ||
| 288 | * To manage the stream, we keep in a 32 bits variables, | ||
| 289 | * the next bits in the stream. fill_reservoir() add to | ||
| 290 | * the reservoir at least wanted nbits. | ||
| 291 | * | ||
| 292 | * | ||
| 293 | */ | ||
| 294 | #define fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted) do { \ | ||
| 295 | while (nbits_in_reservoir<nbits_wanted) \ | ||
| 296 | { \ | ||
| 297 | reservoir |= (*(stream)++) << nbits_in_reservoir; \ | ||
| 298 | nbits_in_reservoir+=8; \ | ||
| 299 | } \ | ||
| 300 | } while(0); | ||
| 301 | |||
| 302 | #define get_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted,result) do { \ | ||
| 303 | fill_nbits(reservoir,nbits_in_reservoir,stream,nbits_wanted); \ | ||
| 304 | result = (reservoir) & ((1U<<nbits_wanted)-1); \ | ||
| 305 | reservoir >>= nbits_wanted; \ | ||
| 306 | nbits_in_reservoir -= nbits_wanted; \ | ||
| 307 | } while(0); | ||
| 308 | |||
| 309 | |||
| 310 | |||
| 311 | static void DecompressBand23(const struct pwc_dec23_private *pdev, | ||
| 312 | const unsigned char *rawyuv, | ||
| 313 | unsigned char *planar_y, | ||
| 314 | unsigned char *planar_u, | ||
| 315 | unsigned char *planar_v, | ||
| 316 | unsigned int image_x, /* aka number of pixels wanted ??? */ | ||
| 317 | unsigned int pixels_per_line, /* aka number of pixels per line */ | ||
| 318 | int flags) | ||
| 319 | { | ||
| 320 | |||
| 321 | |||
| 322 | unsigned int reservoir, nbits_in_reservoir; | ||
| 323 | int first_4_bits; | ||
| 324 | unsigned int bytes_per_channel; | ||
| 325 | int line_size; /* size of the line (4Y+U+V) */ | ||
| 326 | int passes; | ||
| 327 | const unsigned char *ptable0004, *ptable8004; | ||
| 328 | |||
| 329 | int even_line; | ||
| 330 | unsigned int temp_colors[16]; | ||
| 331 | int nblocks; | ||
| 332 | |||
| 333 | const unsigned char *stream; | ||
| 334 | unsigned char *dest_y, *dest_u=NULL, *dest_v=NULL; | ||
| 335 | unsigned int offset_to_plane_u, offset_to_plane_v; | ||
| 336 | |||
| 337 | int i; | ||
| 338 | |||
| 339 | |||
| 340 | reservoir = 0; | ||
| 341 | nbits_in_reservoir = 0; | ||
| 342 | stream = rawyuv+1; /* The first byte of the stream is skipped */ | ||
| 343 | even_line = 1; | ||
| 344 | |||
| 345 | get_nbits(reservoir,nbits_in_reservoir,stream,4,first_4_bits); | ||
| 346 | |||
| 347 | line_size = pixels_per_line*3; | ||
| 348 | |||
| 349 | for (passes=0;passes<2;passes++) | ||
| 350 | { | ||
| 351 | if (passes==0) | ||
| 352 | { | ||
| 353 | bytes_per_channel = pixels_per_line; | ||
| 354 | dest_y = planar_y; | ||
| 355 | nblocks = image_x/4; | ||
| 356 | } | ||
| 357 | else | ||
| 358 | { | ||
| 359 | /* Format planar: All Y, then all U, then all V */ | ||
| 360 | bytes_per_channel = pixels_per_line/2; | ||
| 361 | dest_u = planar_u; | ||
| 362 | dest_v = planar_v; | ||
| 363 | dest_y = dest_u; | ||
| 364 | nblocks = image_x/8; | ||
| 365 | } | ||
| 366 | |||
| 367 | offset_to_plane_u = bytes_per_channel*2; | ||
| 368 | offset_to_plane_v = bytes_per_channel*3; | ||
| 369 | /* | ||
| 370 | printf("bytes_per_channel = %d\n",bytes_per_channel); | ||
| 371 | printf("offset_to_plane_u = %d\n",offset_to_plane_u); | ||
| 372 | printf("offset_to_plane_v = %d\n",offset_to_plane_v); | ||
| 373 | */ | ||
| 374 | |||
| 375 | while (nblocks-->0) | ||
| 376 | { | ||
| 377 | unsigned int gray_index; | ||
| 378 | |||
| 379 | fill_nbits(reservoir,nbits_in_reservoir,stream,16); | ||
| 380 | gray_index = reservoir & pdev->zzmask; | ||
| 381 | reservoir >>= pdev->zz; | ||
| 382 | nbits_in_reservoir -= pdev->zz; | ||
| 383 | |||
| 384 | fill_nbits(reservoir,nbits_in_reservoir,stream,2); | ||
| 385 | |||
| 386 | if ( (reservoir & 3) == 0) | ||
| 387 | { | ||
| 388 | reservoir>>=2; | ||
| 389 | nbits_in_reservoir-=2; | ||
| 390 | for (i=0;i<16;i++) | ||
| 391 | temp_colors[i] = pdev->table_dc00[gray_index]; | ||
| 392 | |||
| 393 | } | ||
| 394 | else | ||
| 395 | { | ||
| 396 | unsigned int channel_v, offset1; | ||
| 397 | |||
| 398 | /* swap bit 0 and 2 of offset_OR */ | ||
| 399 | channel_v = ((reservoir & 1) << 2) | (reservoir & 2) | ((reservoir & 4)>>2); | ||
| 400 | reservoir>>=3; | ||
| 401 | nbits_in_reservoir-=3; | ||
| 402 | |||
| 403 | for (i=0;i<16;i++) | ||
| 404 | temp_colors[i] = pdev->table_d800[gray_index]; | ||
| 405 | |||
| 406 | ptable0004 = pdev->table_0004 + (passes*16384) + (first_4_bits*1024) + (channel_v*128); | ||
| 407 | ptable8004 = pdev->table_8004 + (passes*4096) + (first_4_bits*256) + (channel_v*32); | ||
| 408 | |||
| 409 | offset1 = 0; | ||
| 410 | while(1) | ||
| 411 | { | ||
| 412 | unsigned int index_in_table_ops, op, rows=0; | ||
| 413 | fill_nbits(reservoir,nbits_in_reservoir,stream,16); | ||
| 414 | |||
| 415 | /* mode is 0,1 or 2 */ | ||
| 416 | index_in_table_ops = (reservoir&0x3F); | ||
| 417 | op = table_ops[ index_in_table_ops*4 ]; | ||
| 418 | if (op == 2) | ||
| 419 | { | ||
| 420 | reservoir >>= 2; | ||
| 421 | nbits_in_reservoir -= 2; | ||
| 422 | break; /* exit the while(1) */ | ||
| 423 | } | ||
| 424 | if (op == 0) | ||
| 425 | { | ||
| 426 | unsigned int shift; | ||
| 427 | |||
| 428 | offset1 = (offset1 + table_ops[index_in_table_ops*4+2]) & 0x0F; | ||
| 429 | shift = table_ops[ index_in_table_ops*4+1 ]; | ||
| 430 | reservoir >>= shift; | ||
| 431 | nbits_in_reservoir -= shift; | ||
| 432 | rows = ptable0004[ offset1 + table_ops[index_in_table_ops*4+3] ]; | ||
| 433 | } | ||
| 434 | if (op == 1) | ||
| 435 | { | ||
| 436 | /* 10bits [ xxxx xxxx yyyy 000 ] | ||
| 437 | * yyy => offset in the table8004 | ||
| 438 | * xxx => offset in the tabled004 | ||
| 439 | */ | ||
| 440 | unsigned int mask, shift; | ||
| 441 | unsigned int col1, row1, total_bits; | ||
| 442 | |||
| 443 | offset1 = (offset1 + ((reservoir>>3)&0x0F)+1) & 0x0F; | ||
| 444 | |||
| 445 | col1 = (reservoir>>7) & 0xFF; | ||
| 446 | row1 = ptable8004 [ offset1*2 ]; | ||
| 447 | |||
| 448 | /* Bit mask table */ | ||
| 449 | mask = pdev->table_d004[ (row1<<8) + col1 ]; | ||
| 450 | shift = ptable8004 [ offset1*2 + 1]; | ||
| 451 | rows = ((mask << shift) + 0x80) & 0xFF; | ||
| 452 | |||
| 453 | total_bits = row1 + 8; | ||
| 454 | reservoir >>= total_bits; | ||
| 455 | nbits_in_reservoir -= total_bits; | ||
| 456 | } | ||
| 457 | { | ||
| 458 | const unsigned int *table_a004 = pdev->table_a004 + rows*12; | ||
| 459 | unsigned int *poffset = MulIdx + offset1*16; /* 64/4 (int) */ | ||
| 460 | for (i=0;i<16;i++) | ||
| 461 | { | ||
| 462 | temp_colors[i] += table_a004[ *poffset ]; | ||
| 463 | poffset++; | ||
| 464 | } | ||
| 465 | } | ||
| 466 | } | ||
| 467 | } | ||
| 468 | #define USE_SIGNED_INT_FOR_COLOR | ||
| 469 | #ifdef USE_SIGNED_INT_FOR_COLOR | ||
| 470 | # define CLAMP(x) ((x)>255?255:((x)<0?0:x)) | ||
| 471 | #else | ||
| 472 | # define CLAMP(x) ((x)>255?255:x) | ||
| 473 | #endif | ||
| 474 | |||
| 475 | if (passes == 0) | ||
| 476 | { | ||
| 477 | #ifdef USE_SIGNED_INT_FOR_COLOR | ||
| 478 | const int *c = temp_colors; | ||
| 479 | #else | ||
| 480 | const unsigned int *c = temp_colors; | ||
| 481 | #endif | ||
| 482 | unsigned char *d; | ||
| 483 | |||
| 484 | d = dest_y; | ||
| 485 | for (i=0;i<4;i++,c++) | ||
| 486 | *d++ = CLAMP((*c) >> pdev->yy); | ||
| 487 | |||
| 488 | d = dest_y + bytes_per_channel; | ||
| 489 | for (i=0;i<4;i++,c++) | ||
| 490 | *d++ = CLAMP((*c) >> pdev->yy); | ||
| 491 | |||
| 492 | d = dest_y + offset_to_plane_u; | ||
| 493 | for (i=0;i<4;i++,c++) | ||
| 494 | *d++ = CLAMP((*c) >> pdev->yy); | ||
| 495 | |||
| 496 | d = dest_y + offset_to_plane_v; | ||
| 497 | for (i=0;i<4;i++,c++) | ||
| 498 | *d++ = CLAMP((*c) >> pdev->yy); | ||
| 499 | |||
| 500 | dest_y += 4; | ||
| 501 | } | ||
| 502 | else if (passes == 1) | ||
| 503 | { | ||
| 504 | #ifdef USE_SIGNED_INT_FOR_COLOR | ||
| 505 | int *c1 = temp_colors; | ||
| 506 | int *c2 = temp_colors+4; | ||
| 507 | #else | ||
| 508 | unsigned int *c1 = temp_colors; | ||
| 509 | unsigned int *c2 = temp_colors+4; | ||
| 510 | #endif | ||
| 511 | unsigned char *d; | ||
| 512 | |||
| 513 | d = dest_y; | ||
| 514 | for (i=0;i<4;i++,c1++,c2++) | ||
| 515 | { | ||
| 516 | *d++ = CLAMP((*c1) >> pdev->yy); | ||
| 517 | *d++ = CLAMP((*c2) >> pdev->yy); | ||
| 518 | } | ||
| 519 | c1 = temp_colors+12; | ||
| 520 | //c2 = temp_colors+8; | ||
| 521 | d = dest_y + bytes_per_channel; | ||
| 522 | for (i=0;i<4;i++,c1++,c2++) | ||
| 523 | { | ||
| 524 | *d++ = CLAMP((*c1) >> pdev->yy); | ||
| 525 | *d++ = CLAMP((*c2) >> pdev->yy); | ||
| 526 | } | ||
| 527 | |||
| 528 | if (even_line) /* Each line, swap u/v */ | ||
| 529 | { | ||
| 530 | even_line=0; | ||
| 531 | dest_y = dest_v; | ||
| 532 | dest_u += 8; | ||
| 533 | } | ||
| 534 | else | ||
| 535 | { | ||
| 536 | even_line=1; | ||
| 537 | dest_y = dest_u; | ||
| 538 | dest_v += 8; | ||
| 539 | } | ||
| 540 | } | ||
| 541 | |||
| 542 | } /* end of while (nblocks-->0) */ | ||
| 543 | |||
| 544 | } /* end of for (passes=0;passes<2;passes++) */ | ||
| 545 | |||
| 546 | } | ||
| 547 | |||
| 548 | |||
| 549 | /** | ||
| 550 | * | ||
| 551 | * image: size of the image wanted | ||
| 552 | * view : size of the image returned by the camera | ||
| 553 | * offset: (x,y) to displayer image in the view | ||
| 554 | * | ||
| 555 | * src: raw data | ||
| 556 | * dst: image output | ||
| 557 | * flags: PWCX_FLAG_PLANAR | ||
| 558 | * pdev: private buffer | ||
| 559 | * bandlength: | ||
| 560 | * | ||
| 561 | */ | ||
| 562 | void pwc_dec23_decompress(const struct pwc_coord *image, | ||
| 563 | const struct pwc_coord *view, | ||
| 564 | const struct pwc_coord *offset, | ||
| 565 | const void *src, | ||
| 566 | void *dst, | ||
| 567 | int flags, | ||
| 568 | const void *data, | ||
| 569 | int bandlength) | ||
| 570 | { | ||
| 571 | const struct pwc_dec23_private *pdev = data; | ||
| 572 | unsigned char *pout, *pout_planar_y=NULL, *pout_planar_u=NULL, *pout_planar_v=NULL; | ||
| 573 | int i,n,stride,pixel_size; | ||
| 574 | |||
| 575 | |||
| 576 | if (flags & PWCX_FLAG_BAYER) | ||
| 577 | { | ||
| 578 | pout = dst + (view->x * offset->y) + offset->x; | ||
| 579 | pixel_size = view->x * 4; | ||
| 580 | } | ||
| 581 | else | ||
| 582 | { | ||
| 583 | n = view->x * view->y; | ||
| 584 | |||
| 585 | /* offset in Y plane */ | ||
| 586 | stride = view->x * offset->y; | ||
| 587 | pout_planar_y = dst + stride + offset->x; | ||
| 588 | |||
| 589 | /* offsets in U/V planes */ | ||
| 590 | stride = (view->x * offset->y)/4 + offset->x/2; | ||
| 591 | pout_planar_u = dst + n + + stride; | ||
| 592 | pout_planar_v = dst + n + n/4 + stride; | ||
| 593 | |||
| 594 | pixel_size = view->x * 4; | ||
| 595 | } | ||
| 596 | |||
| 597 | |||
| 598 | for (i=0;i<image->y;i+=4) | ||
| 599 | { | ||
| 600 | if (flags & PWCX_FLAG_BAYER) | ||
| 601 | { | ||
| 602 | //TODO: | ||
| 603 | //DecompressBandBayer(pdev,src,pout,image.x,view->x,flags); | ||
| 604 | src += bandlength; | ||
| 605 | pout += pixel_size; | ||
| 606 | } | ||
| 607 | else | ||
| 608 | { | ||
| 609 | DecompressBand23(pdev,src,pout_planar_y,pout_planar_u,pout_planar_v,image->x,view->x,flags); | ||
| 610 | src += bandlength; | ||
| 611 | pout_planar_y += pixel_size; | ||
| 612 | pout_planar_u += view->x; | ||
| 613 | pout_planar_v += view->x; | ||
| 614 | } | ||
| 615 | } | ||
| 616 | } | ||
| 617 | |||
| 618 | void pwc_dec23_exit(void) | ||
| 619 | { | ||
| 620 | /* Do nothing */ | ||
| 621 | |||
| 622 | } | ||
| 623 | |||
diff --git a/drivers/usb/media/pwc/pwc-dec23.h b/drivers/usb/media/pwc/pwc-dec23.h deleted file mode 100644 index 5b2aacdefa6c..000000000000 --- a/drivers/usb/media/pwc/pwc-dec23.h +++ /dev/null | |||
| @@ -1,58 +0,0 @@ | |||
| 1 | /* Linux driver for Philips webcam | ||
| 2 | (C) 2004 Luc Saillard (luc@saillard.org) | ||
| 3 | |||
| 4 | NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx | ||
| 5 | driver and thus may have bugs that are not present in the original version. | ||
| 6 | Please send bug reports and support requests to <luc@saillard.org>. | ||
| 7 | The decompression routines have been implemented by reverse-engineering the | ||
| 8 | Nemosoft binary pwcx module. Caveat emptor. | ||
| 9 | |||
| 10 | This program is free software; you can redistribute it and/or modify | ||
| 11 | it under the terms of the GNU General Public License as published by | ||
| 12 | the Free Software Foundation; either version 2 of the License, or | ||
| 13 | (at your option) any later version. | ||
| 14 | |||
| 15 | This program is distributed in the hope that it will be useful, | ||
| 16 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | GNU General Public License for more details. | ||
| 19 | |||
| 20 | You should have received a copy of the GNU General Public License | ||
| 21 | along with this program; if not, write to the Free Software | ||
| 22 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 23 | */ | ||
| 24 | |||
| 25 | #ifndef PWC_DEC23_H | ||
| 26 | #define PWC_DEC23_H | ||
| 27 | |||
| 28 | struct pwc_dec23_private | ||
| 29 | { | ||
| 30 | unsigned char xx,yy,zz,zzmask; | ||
| 31 | |||
| 32 | unsigned char table_0004[2*0x4000]; | ||
| 33 | unsigned char table_8004[2*0x1000]; | ||
| 34 | unsigned int table_a004[256*12]; | ||
| 35 | |||
| 36 | unsigned char table_d004[8*256]; | ||
| 37 | unsigned int table_d800[256]; | ||
| 38 | unsigned int table_dc00[256]; | ||
| 39 | }; | ||
| 40 | |||
| 41 | |||
| 42 | void pwc_dec23_init(int type, int release, unsigned char *buffer, void *private_data); | ||
| 43 | void pwc_dec23_exit(void); | ||
| 44 | void pwc_dec23_decompress(const struct pwc_coord *image, | ||
| 45 | const struct pwc_coord *view, | ||
| 46 | const struct pwc_coord *offset, | ||
| 47 | const void *src, | ||
| 48 | void *dst, | ||
| 49 | int flags, | ||
| 50 | const void *data, | ||
| 51 | int bandlength); | ||
| 52 | |||
| 53 | |||
| 54 | |||
| 55 | #endif | ||
| 56 | |||
| 57 | |||
| 58 | |||
diff --git a/drivers/usb/media/pwc/pwc-if.c b/drivers/usb/media/pwc/pwc-if.c index cca47f480a8b..5429ff3b9753 100644 --- a/drivers/usb/media/pwc/pwc-if.c +++ b/drivers/usb/media/pwc/pwc-if.c | |||
| @@ -68,8 +68,6 @@ | |||
| 68 | #include "pwc-ioctl.h" | 68 | #include "pwc-ioctl.h" |
| 69 | #include "pwc-kiara.h" | 69 | #include "pwc-kiara.h" |
| 70 | #include "pwc-timon.h" | 70 | #include "pwc-timon.h" |
| 71 | #include "pwc-dec23.h" | ||
| 72 | #include "pwc-dec1.h" | ||
| 73 | #include "pwc-uncompress.h" | 71 | #include "pwc-uncompress.h" |
| 74 | 72 | ||
| 75 | /* Function prototypes and driver templates */ | 73 | /* Function prototypes and driver templates */ |
| @@ -322,6 +320,7 @@ static int pwc_allocate_buffers(struct pwc_device *pdev) | |||
| 322 | case 730: | 320 | case 730: |
| 323 | case 740: | 321 | case 740: |
| 324 | case 750: | 322 | case 750: |
| 323 | #if 0 | ||
| 325 | Trace(TRACE_MEMORY,"private_data(%zu)\n",sizeof(struct pwc_dec23_private)); | 324 | Trace(TRACE_MEMORY,"private_data(%zu)\n",sizeof(struct pwc_dec23_private)); |
| 326 | kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL); /* Timon & Kiara */ | 325 | kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL); /* Timon & Kiara */ |
| 327 | break; | 326 | break; |
| @@ -330,6 +329,8 @@ static int pwc_allocate_buffers(struct pwc_device *pdev) | |||
| 330 | /* TODO & FIXME */ | 329 | /* TODO & FIXME */ |
| 331 | kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL); | 330 | kbuf = kmalloc(sizeof(struct pwc_dec23_private), GFP_KERNEL); |
| 332 | break; | 331 | break; |
| 332 | #endif | ||
| 333 | ; | ||
| 333 | } | 334 | } |
| 334 | if (kbuf == NULL) { | 335 | if (kbuf == NULL) { |
| 335 | Err("Failed to allocate decompress table.\n"); | 336 | Err("Failed to allocate decompress table.\n"); |
| @@ -1131,11 +1132,11 @@ static int pwc_video_close(struct inode *inode, struct file *file) | |||
| 1131 | case 730: | 1132 | case 730: |
| 1132 | case 740: | 1133 | case 740: |
| 1133 | case 750: | 1134 | case 750: |
| 1134 | pwc_dec23_exit(); /* Timon & Kiara */ | 1135 | /* pwc_dec23_exit(); *//* Timon & Kiara */ |
| 1135 | break; | 1136 | break; |
| 1136 | case 645: | 1137 | case 645: |
| 1137 | case 646: | 1138 | case 646: |
| 1138 | pwc_dec1_exit(); | 1139 | /* pwc_dec1_exit(); */ |
| 1139 | break; | 1140 | break; |
| 1140 | } | 1141 | } |
| 1141 | 1142 | ||
diff --git a/drivers/usb/media/pwc/pwc-kiara.c b/drivers/usb/media/pwc/pwc-kiara.c index 5485800efd83..c498c68bace1 100644 --- a/drivers/usb/media/pwc/pwc-kiara.c +++ b/drivers/usb/media/pwc/pwc-kiara.c | |||
| @@ -316,576 +316,3 @@ const struct Kiara_table_entry Kiara_table[PSZ_MAX][6][4] = | |||
| 316 | }, | 316 | }, |
| 317 | }; | 317 | }; |
| 318 | 318 | ||
| 319 | |||
| 320 | /* | ||
| 321 | * Rom table for kiara chips | ||
| 322 | * | ||
| 323 | * 32 roms tables (one for each resolution ?) | ||
| 324 | * 2 tables per roms (one for each passes) (Y, and U&V) | ||
| 325 | * 128 bytes per passes | ||
| 326 | */ | ||
| 327 | |||
| 328 | const unsigned int KiaraRomTable [8][2][16][8] = | ||
| 329 | { | ||
| 330 | { /* version 0 */ | ||
| 331 | { /* version 0, passes 0 */ | ||
| 332 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 333 | 0x00000000,0x00000000,0x00000001,0x00000001}, | ||
| 334 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 335 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 336 | {0x00000000,0x00000000,0x00000009,0x00000049, | ||
| 337 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 338 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 339 | 0x00000049,0x00000249,0x0000024a,0x00000049}, | ||
| 340 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 341 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 342 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 343 | 0x00000249,0x0000124a,0x0000024a,0x0000024a}, | ||
| 344 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 345 | 0x0000124a,0x00009252,0x00001252,0x00001252}, | ||
| 346 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 347 | 0x00009252,0x00009292,0x00009292,0x00009292}, | ||
| 348 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 349 | 0x00009292,0x00009292,0x00009493,0x000124db}, | ||
| 350 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 351 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 352 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 353 | 0x0000a493,0x000124db,0x000124db,0x000126dc}, | ||
| 354 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 355 | 0x000124db,0x000126dc,0x000136e4,0x000126dc}, | ||
| 356 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 357 | 0x000124db,0x000136e4,0x000136e4,0x000136e4}, | ||
| 358 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 359 | 0x000126dc,0x0001b724,0x0001b92d,0x0001b925}, | ||
| 360 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 361 | 0x000136e4,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 362 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 363 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 364 | }, | ||
| 365 | { /* version 0, passes 1 */ | ||
| 366 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 367 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 368 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 369 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 370 | {0x00000000,0x00000000,0x00000001,0x00000009, | ||
| 371 | 0x00000009,0x00000009,0x00000009,0x00000001}, | ||
| 372 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 373 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 374 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 375 | 0x00000049,0x00000049,0x0000024a,0x0000024a}, | ||
| 376 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 377 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 378 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 379 | 0x00000249,0x00000249,0x0000024a,0x00001252}, | ||
| 380 | {0x00000000,0x00000000,0x00000049,0x00001249, | ||
| 381 | 0x0000124a,0x0000124a,0x00001252,0x00009292}, | ||
| 382 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 383 | 0x00009252,0x00009252,0x00009292,0x00009493}, | ||
| 384 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 385 | 0x00009292,0x00009292,0x00009292,0x00009493}, | ||
| 386 | {0x00000000,0x00000000,0x00000249,0x00009292, | ||
| 387 | 0x00009492,0x00009493,0x0000a49b,0x00009493}, | ||
| 388 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 389 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 390 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 391 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 392 | {0x00000000,0x00000000,0x00009252,0x00009493, | ||
| 393 | 0x000126dc,0x000126dc,0x000136e4,0x000136e4}, | ||
| 394 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 395 | 0x000136e4,0x000136e4,0x0001b725,0x0001b724}, | ||
| 396 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 397 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 398 | } | ||
| 399 | }, | ||
| 400 | { /* version 1 */ | ||
| 401 | { /* version 1, passes 0 */ | ||
| 402 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 403 | 0x00000000,0x00000000,0x00000000,0x00000001}, | ||
| 404 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 405 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 406 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 407 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 408 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 409 | 0x00000049,0x00000249,0x0000024a,0x0000024a}, | ||
| 410 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 411 | 0x00000249,0x00000249,0x0000024a,0x00001252}, | ||
| 412 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 413 | 0x00000249,0x0000124a,0x00001252,0x00001252}, | ||
| 414 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 415 | 0x0000124a,0x0000124a,0x00009292,0x00009292}, | ||
| 416 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 417 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 418 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 419 | 0x00009252,0x00009292,0x00009292,0x00009292}, | ||
| 420 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 421 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 422 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 423 | 0x00009252,0x00009493,0x00009493,0x00009493}, | ||
| 424 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 425 | 0x00009292,0x00009493,0x00009493,0x00009493}, | ||
| 426 | {0x00000000,0x00000000,0x00000249,0x00009252, | ||
| 427 | 0x00009492,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 428 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 429 | 0x00009492,0x000124db,0x000124db,0x000124db}, | ||
| 430 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 431 | 0x0000a493,0x000126dc,0x000126dc,0x000126dc}, | ||
| 432 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 433 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 434 | }, | ||
| 435 | { /* version 1, passes 1 */ | ||
| 436 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 437 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 438 | {0x00000000,0x00000000,0x00000049,0x00000009, | ||
| 439 | 0x00000049,0x00000009,0x00000001,0x00000000}, | ||
| 440 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 441 | 0x00000049,0x00000049,0x00000049,0x00000000}, | ||
| 442 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 443 | 0x00000249,0x00000049,0x0000024a,0x00000001}, | ||
| 444 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 445 | 0x00000249,0x00000249,0x0000024a,0x00000001}, | ||
| 446 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 447 | 0x00000249,0x00000249,0x0000024a,0x00000001}, | ||
| 448 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 449 | 0x00000249,0x00000249,0x0000024a,0x00000009}, | ||
| 450 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 451 | 0x0000124a,0x0000124a,0x0000024a,0x00000009}, | ||
| 452 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 453 | 0x0000124a,0x0000124a,0x0000024a,0x00000009}, | ||
| 454 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 455 | 0x0000124a,0x00009252,0x00001252,0x00000049}, | ||
| 456 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 457 | 0x0000124a,0x00009292,0x00001252,0x00000049}, | ||
| 458 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 459 | 0x0000124a,0x00009292,0x00001252,0x00000049}, | ||
| 460 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 461 | 0x00009252,0x00009292,0x00001252,0x0000024a}, | ||
| 462 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 463 | 0x00009292,0x00009292,0x00001252,0x0000024a}, | ||
| 464 | {0x00000000,0x00000000,0x0000924a,0x0000924a, | ||
| 465 | 0x00009492,0x00009493,0x00009292,0x00001252}, | ||
| 466 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 467 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 468 | } | ||
| 469 | }, | ||
| 470 | { /* version 2 */ | ||
| 471 | { /* version 2, passes 0 */ | ||
| 472 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 473 | 0x00000049,0x00000049,0x0000024a,0x0000024a}, | ||
| 474 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 475 | 0x00000249,0x0000124a,0x00001252,0x00009292}, | ||
| 476 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 477 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 478 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 479 | 0x0000124a,0x00009292,0x00009493,0x00009493}, | ||
| 480 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 481 | 0x00009252,0x00009493,0x00009493,0x0000a49b}, | ||
| 482 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 483 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 484 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 485 | 0x00009292,0x00009493,0x0000a49b,0x000124db}, | ||
| 486 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 487 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 488 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 489 | 0x00009492,0x000124db,0x000124db,0x000126dc}, | ||
| 490 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 491 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 492 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 493 | 0x0000a493,0x000124db,0x000126dc,0x000136e4}, | ||
| 494 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 495 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 496 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 497 | 0x0001249b,0x000126dc,0x000136e4,0x000136e4}, | ||
| 498 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 499 | 0x000124db,0x000136e4,0x000136e4,0x0001b724}, | ||
| 500 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 501 | 0x000126dc,0x0001b724,0x0001b725,0x0001b925}, | ||
| 502 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 503 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 504 | }, | ||
| 505 | { /* version 2, passes 1 */ | ||
| 506 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 507 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 508 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 509 | 0x00000249,0x00000249,0x0000024a,0x00000049}, | ||
| 510 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 511 | 0x0000124a,0x0000124a,0x00001252,0x00000049}, | ||
| 512 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 513 | 0x0000124a,0x0000124a,0x00009292,0x0000024a}, | ||
| 514 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 515 | 0x00009252,0x00009292,0x00009292,0x0000024a}, | ||
| 516 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 517 | 0x00009252,0x00009292,0x0000a49b,0x0000024a}, | ||
| 518 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 519 | 0x00009292,0x00009493,0x0000a49b,0x00001252}, | ||
| 520 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 521 | 0x00009292,0x00009493,0x0000a49b,0x00001252}, | ||
| 522 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 523 | 0x00009492,0x0000a49b,0x0000a49b,0x00001252}, | ||
| 524 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 525 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 526 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 527 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 528 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 529 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 530 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 531 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 532 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 533 | 0x0000a493,0x000124db,0x0000a49b,0x00009493}, | ||
| 534 | {0x00000000,0x00000000,0x00009252,0x0000a49b, | ||
| 535 | 0x0001249b,0x000126dc,0x000124db,0x0000a49b}, | ||
| 536 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 537 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 538 | } | ||
| 539 | }, | ||
| 540 | { /* version 3 */ | ||
| 541 | { /* version 3, passes 0 */ | ||
| 542 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 543 | 0x0000124a,0x0000124a,0x00009292,0x00009292}, | ||
| 544 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 545 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 546 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 547 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 548 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 549 | 0x00009492,0x000124db,0x000126dc,0x000126dc}, | ||
| 550 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 551 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 552 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 553 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 554 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 555 | 0x0000a493,0x000126dc,0x000136e4,0x0001b724}, | ||
| 556 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 557 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 558 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 559 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 560 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 561 | 0x0001249b,0x000136e4,0x0001b725,0x0001b724}, | ||
| 562 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 563 | 0x000124db,0x000136e4,0x0001b725,0x0001b925}, | ||
| 564 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 565 | 0x000126dc,0x000136e4,0x0001b92d,0x0001b925}, | ||
| 566 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 567 | 0x000126dc,0x0001b724,0x0001b92d,0x0001c92d}, | ||
| 568 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 569 | 0x000126dc,0x0001b724,0x0001c96e,0x0001c92d}, | ||
| 570 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 571 | 0x000136e4,0x0001b925,0x00025bb6,0x00024b77}, | ||
| 572 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 573 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 574 | }, | ||
| 575 | { /* version 3, passes 1 */ | ||
| 576 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 577 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 578 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 579 | 0x00009252,0x00009292,0x00009292,0x00001252}, | ||
| 580 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 581 | 0x00009492,0x00009493,0x0000a49b,0x00001252}, | ||
| 582 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 583 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 584 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 585 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 586 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 587 | 0x0000a493,0x0000a49b,0x000126dc,0x00009292}, | ||
| 588 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 589 | 0x0000a493,0x0000a49b,0x000126dc,0x00009493}, | ||
| 590 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 591 | 0x0000a493,0x0000a49b,0x000126dc,0x00009493}, | ||
| 592 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 593 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 594 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 595 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 596 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 597 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 598 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 599 | 0x0001249b,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 600 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 601 | 0x000124db,0x000136e4,0x000126dc,0x000124db}, | ||
| 602 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 603 | 0x000136e4,0x000136e4,0x000126dc,0x000124db}, | ||
| 604 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 605 | 0x0001b724,0x0001b724,0x000136e4,0x000126dc}, | ||
| 606 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 607 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 608 | } | ||
| 609 | }, | ||
| 610 | { /* version 4 */ | ||
| 611 | { /* version 4, passes 0 */ | ||
| 612 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 613 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 614 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 615 | 0x00000249,0x00000249,0x0000024a,0x00000049}, | ||
| 616 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 617 | 0x0000124a,0x00009252,0x00001252,0x0000024a}, | ||
| 618 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 619 | 0x00009252,0x00009292,0x00009493,0x00001252}, | ||
| 620 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 621 | 0x00009292,0x00009493,0x00009493,0x00001252}, | ||
| 622 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 623 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 624 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 625 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 626 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 627 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 628 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 629 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 630 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 631 | 0x0001249b,0x000126dc,0x000126dc,0x000124db}, | ||
| 632 | {0x00000000,0x00000000,0x00009252,0x00009493, | ||
| 633 | 0x000124db,0x000136e4,0x000136e4,0x000126dc}, | ||
| 634 | {0x00000000,0x00000000,0x00009252,0x0000a49b, | ||
| 635 | 0x000124db,0x000136e4,0x000136e4,0x000126dc}, | ||
| 636 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 637 | 0x000126dc,0x000136e4,0x000136e4,0x000136e4}, | ||
| 638 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 639 | 0x000126dc,0x0001b724,0x0001b725,0x0001b724}, | ||
| 640 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 641 | 0x000136e4,0x0001b925,0x0001b92d,0x0001b925}, | ||
| 642 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 643 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 644 | }, | ||
| 645 | { /* version 4, passes 1 */ | ||
| 646 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 647 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 648 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 649 | 0x00000049,0x00000049,0x00000009,0x00000009}, | ||
| 650 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 651 | 0x0000124a,0x00000249,0x00000049,0x00000049}, | ||
| 652 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 653 | 0x0000124a,0x0000124a,0x00000049,0x00000049}, | ||
| 654 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 655 | 0x00009252,0x0000124a,0x0000024a,0x0000024a}, | ||
| 656 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 657 | 0x00009252,0x0000124a,0x0000024a,0x0000024a}, | ||
| 658 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 659 | 0x00009492,0x00009252,0x00001252,0x00001252}, | ||
| 660 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 661 | 0x0000a493,0x00009292,0x00009292,0x00001252}, | ||
| 662 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 663 | 0x0000a493,0x00009292,0x00009292,0x00009292}, | ||
| 664 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 665 | 0x0000a493,0x00009493,0x00009493,0x00009292}, | ||
| 666 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 667 | 0x0000a493,0x0000a49b,0x00009493,0x00009493}, | ||
| 668 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 669 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 670 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 671 | 0x0001249b,0x000124db,0x0000a49b,0x0000a49b}, | ||
| 672 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 673 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 674 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 675 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 676 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 677 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 678 | } | ||
| 679 | }, | ||
| 680 | { /* version 5 */ | ||
| 681 | { /* version 5, passes 0 */ | ||
| 682 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 683 | 0x00000249,0x00000249,0x00001252,0x00001252}, | ||
| 684 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 685 | 0x00009252,0x00009292,0x00009292,0x00001252}, | ||
| 686 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 687 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 688 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 689 | 0x0000a493,0x0000a49b,0x000124db,0x00009493}, | ||
| 690 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 691 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 692 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 693 | 0x0000a493,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 694 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 695 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 696 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 697 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 698 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 699 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 700 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 701 | 0x000126dc,0x0001b724,0x0001b725,0x000136e4}, | ||
| 702 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 703 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 704 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 705 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 706 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 707 | 0x000136e4,0x0001b925,0x0001c96e,0x0001b925}, | ||
| 708 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 709 | 0x0001b724,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 710 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 711 | 0x0001c924,0x0002496d,0x00025bb6,0x00024b77}, | ||
| 712 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 713 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 714 | }, | ||
| 715 | { /* version 5, passes 1 */ | ||
| 716 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 717 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 718 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 719 | 0x0000124a,0x0000124a,0x0000024a,0x0000024a}, | ||
| 720 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 721 | 0x00009252,0x00009252,0x0000024a,0x0000024a}, | ||
| 722 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 723 | 0x00009492,0x0000a49b,0x00001252,0x00001252}, | ||
| 724 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 725 | 0x0000a493,0x0000a49b,0x00001252,0x00001252}, | ||
| 726 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 727 | 0x0000a493,0x0000a49b,0x00009292,0x00001252}, | ||
| 728 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 729 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 730 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 731 | 0x0000a493,0x0000a49b,0x00009493,0x00009292}, | ||
| 732 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 733 | 0x0001249b,0x000124db,0x00009493,0x00009292}, | ||
| 734 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 735 | 0x0001249b,0x000124db,0x00009493,0x00009493}, | ||
| 736 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 737 | 0x000124db,0x000124db,0x0000a49b,0x00009493}, | ||
| 738 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 739 | 0x000126dc,0x000126dc,0x0000a49b,0x00009493}, | ||
| 740 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 741 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 742 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 743 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 744 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 745 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 746 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 747 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 748 | } | ||
| 749 | }, | ||
| 750 | { /* version 6 */ | ||
| 751 | { /* version 6, passes 0 */ | ||
| 752 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 753 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 754 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 755 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 756 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 757 | 0x0000a493,0x000124db,0x000124db,0x0000a49b}, | ||
| 758 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 759 | 0x0000a493,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 760 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 761 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 762 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 763 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 764 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 765 | 0x000126dc,0x0001b724,0x0001b725,0x000126dc}, | ||
| 766 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 767 | 0x000136e4,0x0001b724,0x0001b92d,0x000136e4}, | ||
| 768 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 769 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 770 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 771 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 772 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 773 | 0x000136e4,0x0001b925,0x0001b92d,0x0001b925}, | ||
| 774 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 775 | 0x0001b724,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 776 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 777 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001c92d}, | ||
| 778 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 779 | 0x0001b724,0x0001c92d,0x00024b76,0x0002496e}, | ||
| 780 | {0x00000000,0x00000000,0x00012492,0x000126db, | ||
| 781 | 0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 782 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 783 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 784 | }, | ||
| 785 | { /* version 6, passes 1 */ | ||
| 786 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 787 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 788 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 789 | 0x00009492,0x00009252,0x00001252,0x00001252}, | ||
| 790 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 791 | 0x0000a493,0x00009292,0x00001252,0x00001252}, | ||
| 792 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 793 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 794 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 795 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 796 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 797 | 0x0001249b,0x0000a49b,0x00009493,0x00009292}, | ||
| 798 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 799 | 0x000124db,0x000124db,0x00009493,0x00009493}, | ||
| 800 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 801 | 0x000124db,0x000124db,0x0000a49b,0x00009493}, | ||
| 802 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 803 | 0x000126dc,0x000124db,0x0000a49b,0x00009493}, | ||
| 804 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 805 | 0x000126dc,0x000126dc,0x0000a49b,0x0000a49b}, | ||
| 806 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 807 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 808 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 809 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 810 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 811 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 812 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 813 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 814 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 815 | 0x0001c924,0x0001b724,0x000136e4,0x000126dc}, | ||
| 816 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 817 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 818 | } | ||
| 819 | }, | ||
| 820 | { /* version 7 */ | ||
| 821 | { /* version 7, passes 0 */ | ||
| 822 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 823 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 824 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 825 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 826 | {0x00000000,0x00000000,0x00001249,0x0000a49b, | ||
| 827 | 0x0001249b,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 828 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 829 | 0x0001249b,0x000126dc,0x000136e4,0x0000a49b}, | ||
| 830 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 831 | 0x000126dc,0x000136e4,0x0001b725,0x000124db}, | ||
| 832 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 833 | 0x000136e4,0x0001b724,0x0001b725,0x000126dc}, | ||
| 834 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 835 | 0x000136e4,0x0001b724,0x0001b725,0x000126dc}, | ||
| 836 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 837 | 0x000136e4,0x0001b724,0x0001c96e,0x000136e4}, | ||
| 838 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 839 | 0x000136e4,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 840 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 841 | 0x000136e4,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 842 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 843 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b925}, | ||
| 844 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 845 | 0x0001b724,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 846 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 847 | 0x0001b924,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 848 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 849 | 0x0001b924,0x0001c92d,0x00024b76,0x0002496e}, | ||
| 850 | {0x00000000,0x00000000,0x00012492,0x000136db, | ||
| 851 | 0x00024924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 852 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 853 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 854 | }, | ||
| 855 | { /* version 7, passes 1 */ | ||
| 856 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 857 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 858 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 859 | 0x00009492,0x00009292,0x00001252,0x00001252}, | ||
| 860 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 861 | 0x0000a493,0x0000a49b,0x00001252,0x00001252}, | ||
| 862 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 863 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 864 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 865 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 866 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 867 | 0x000126dc,0x0000a49b,0x00009493,0x00009292}, | ||
| 868 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 869 | 0x000126dc,0x000124db,0x00009493,0x00009493}, | ||
| 870 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 871 | 0x000136e4,0x000124db,0x0000a49b,0x00009493}, | ||
| 872 | {0x00000000,0x00000000,0x0000924a,0x000136db, | ||
| 873 | 0x0001b724,0x000124db,0x0000a49b,0x00009493}, | ||
| 874 | {0x00000000,0x00000000,0x0000924a,0x000136db, | ||
| 875 | 0x0001b724,0x000126dc,0x0000a49b,0x0000a49b}, | ||
| 876 | {0x00000000,0x00000000,0x00009292,0x000136db, | ||
| 877 | 0x0001b724,0x000126dc,0x000124db,0x0000a49b}, | ||
| 878 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 879 | 0x0001b724,0x000126dc,0x000124db,0x0000a49b}, | ||
| 880 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 881 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 882 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 883 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 884 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 885 | 0x0001c924,0x0001b724,0x000136e4,0x000126dc}, | ||
| 886 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 887 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 888 | } | ||
| 889 | } | ||
| 890 | }; | ||
| 891 | |||
diff --git a/drivers/usb/media/pwc/pwc-timon.c b/drivers/usb/media/pwc/pwc-timon.c index f950a4e5ed96..dee967173d6c 100644 --- a/drivers/usb/media/pwc/pwc-timon.c +++ b/drivers/usb/media/pwc/pwc-timon.c | |||
| @@ -314,1133 +314,3 @@ const struct Timon_table_entry Timon_table[PSZ_MAX][6][4] = | |||
| 314 | }, | 314 | }, |
| 315 | }; | 315 | }; |
| 316 | 316 | ||
| 317 | /* | ||
| 318 | * 16 versions: | ||
| 319 | * 2 tables (one for Y, and one for U&V) | ||
| 320 | * 16 levels of details per tables | ||
| 321 | * 8 blocs | ||
| 322 | */ | ||
| 323 | |||
| 324 | const unsigned int TimonRomTable [16][2][16][8] = | ||
| 325 | { | ||
| 326 | { /* version 0 */ | ||
| 327 | { /* version 0, passes 0 */ | ||
| 328 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 329 | 0x00000000,0x00000000,0x00000000,0x00000001}, | ||
| 330 | {0x00000000,0x00000000,0x00000001,0x00000001, | ||
| 331 | 0x00000001,0x00000001,0x00000001,0x00000001}, | ||
| 332 | {0x00000000,0x00000000,0x00000001,0x00000001, | ||
| 333 | 0x00000001,0x00000009,0x00000009,0x00000009}, | ||
| 334 | {0x00000000,0x00000000,0x00000009,0x00000001, | ||
| 335 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 336 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 337 | 0x00000009,0x00000009,0x00000049,0x00000009}, | ||
| 338 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 339 | 0x00000009,0x00000049,0x00000049,0x00000049}, | ||
| 340 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 341 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 342 | {0x00000000,0x00000000,0x00000009,0x00000049, | ||
| 343 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 344 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 345 | 0x00000049,0x00000049,0x0000024a,0x0000024a}, | ||
| 346 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 347 | 0x00000049,0x00000249,0x0000024a,0x0000024a}, | ||
| 348 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 349 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 350 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 351 | 0x00000249,0x00000249,0x00001252,0x0000024a}, | ||
| 352 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 353 | 0x00000249,0x0000124a,0x00001252,0x0000024a}, | ||
| 354 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 355 | 0x00000249,0x0000124a,0x00001252,0x0000024a}, | ||
| 356 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 357 | 0x0000124a,0x00009252,0x00009292,0x00001252}, | ||
| 358 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 359 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 360 | }, | ||
| 361 | { /* version 0, passes 1 */ | ||
| 362 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 363 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 364 | {0x00000000,0x00000000,0x00000001,0x00000001, | ||
| 365 | 0x00000001,0x00000001,0x00000000,0x00000000}, | ||
| 366 | {0x00000000,0x00000000,0x00000009,0x00000001, | ||
| 367 | 0x00000001,0x00000009,0x00000000,0x00000000}, | ||
| 368 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 369 | 0x00000009,0x00000009,0x00000000,0x00000000}, | ||
| 370 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 371 | 0x00000009,0x00000009,0x00000001,0x00000000}, | ||
| 372 | {0x00000000,0x00000000,0x00000049,0x00000009, | ||
| 373 | 0x00000009,0x00000049,0x00000001,0x00000001}, | ||
| 374 | {0x00000000,0x00000000,0x00000049,0x00000009, | ||
| 375 | 0x00000009,0x00000049,0x00000001,0x00000001}, | ||
| 376 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 377 | 0x00000049,0x00000049,0x00000009,0x00000001}, | ||
| 378 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 379 | 0x00000049,0x00000049,0x00000009,0x00000001}, | ||
| 380 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 381 | 0x00000049,0x00000049,0x00000009,0x00000001}, | ||
| 382 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 383 | 0x00000049,0x00000049,0x00000009,0x00000009}, | ||
| 384 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 385 | 0x00000049,0x00000249,0x00000049,0x00000009}, | ||
| 386 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 387 | 0x00000049,0x00000249,0x00000049,0x00000009}, | ||
| 388 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 389 | 0x00000249,0x00000249,0x00000049,0x00000009}, | ||
| 390 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 391 | 0x0000124a,0x0000124a,0x0000024a,0x00000049}, | ||
| 392 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 393 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 394 | } | ||
| 395 | }, | ||
| 396 | { /* version 1 */ | ||
| 397 | { /* version 1, passes 0 */ | ||
| 398 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 399 | 0x00000000,0x00000000,0x00000000,0x00000001}, | ||
| 400 | {0x00000000,0x00000000,0x00000001,0x00000001, | ||
| 401 | 0x00000001,0x00000009,0x00000009,0x00000009}, | ||
| 402 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 403 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 404 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 405 | 0x00000009,0x00000049,0x00000049,0x00000049}, | ||
| 406 | {0x00000000,0x00000000,0x00000009,0x00000049, | ||
| 407 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 408 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 409 | 0x00000049,0x00000249,0x0000024a,0x0000024a}, | ||
| 410 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 411 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 412 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 413 | 0x00000249,0x00000249,0x0000024a,0x00001252}, | ||
| 414 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 415 | 0x00000249,0x0000124a,0x00001252,0x00001252}, | ||
| 416 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 417 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 418 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 419 | 0x0000124a,0x0000124a,0x00009292,0x00009292}, | ||
| 420 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 421 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 422 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 423 | 0x00009252,0x00009252,0x00009292,0x00009292}, | ||
| 424 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 425 | 0x00009292,0x00009493,0x00009493,0x00009493}, | ||
| 426 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 427 | 0x00009492,0x0000a49b,0x0000a49b,0x0000a49b}, | ||
| 428 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 429 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 430 | }, | ||
| 431 | { /* version 1, passes 1 */ | ||
| 432 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 433 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 434 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 435 | 0x00000009,0x00000001,0x00000001,0x00000000}, | ||
| 436 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 437 | 0x00000009,0x00000009,0x00000001,0x00000000}, | ||
| 438 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 439 | 0x00000049,0x00000009,0x00000001,0x00000000}, | ||
| 440 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 441 | 0x00000049,0x00000049,0x00000001,0x00000001}, | ||
| 442 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 443 | 0x00000049,0x00000049,0x00000009,0x00000001}, | ||
| 444 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 445 | 0x00000049,0x00000249,0x00000009,0x00000001}, | ||
| 446 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 447 | 0x00000249,0x00000249,0x00000009,0x00000009}, | ||
| 448 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 449 | 0x00000249,0x00000249,0x00000049,0x00000009}, | ||
| 450 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 451 | 0x00000249,0x0000124a,0x00000049,0x00000009}, | ||
| 452 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 453 | 0x00000249,0x0000124a,0x00000049,0x00000009}, | ||
| 454 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 455 | 0x00000249,0x0000124a,0x0000024a,0x00000049}, | ||
| 456 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 457 | 0x0000124a,0x0000124a,0x0000024a,0x00000049}, | ||
| 458 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 459 | 0x0000124a,0x0000124a,0x0000024a,0x00000049}, | ||
| 460 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 461 | 0x00009252,0x00009252,0x00001252,0x0000024a}, | ||
| 462 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 463 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 464 | } | ||
| 465 | }, | ||
| 466 | { /* version 2 */ | ||
| 467 | { /* version 2, passes 0 */ | ||
| 468 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 469 | 0x00000000,0x00000000,0x00000000,0x00000001}, | ||
| 470 | {0x00000000,0x00000000,0x00000009,0x00000009, | ||
| 471 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 472 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 473 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 474 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 475 | 0x00000049,0x00000249,0x0000024a,0x0000024a}, | ||
| 476 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 477 | 0x00000249,0x00000249,0x0000024a,0x00001252}, | ||
| 478 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 479 | 0x00000249,0x0000124a,0x00001252,0x00001252}, | ||
| 480 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 481 | 0x0000124a,0x0000124a,0x00009292,0x00009292}, | ||
| 482 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 483 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 484 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 485 | 0x00009252,0x00009292,0x00009292,0x00009292}, | ||
| 486 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 487 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 488 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 489 | 0x00009252,0x00009493,0x00009493,0x00009493}, | ||
| 490 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 491 | 0x00009292,0x00009493,0x00009493,0x00009493}, | ||
| 492 | {0x00000000,0x00000000,0x00000249,0x00009252, | ||
| 493 | 0x00009492,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 494 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 495 | 0x00009492,0x000124db,0x000124db,0x000124db}, | ||
| 496 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 497 | 0x0000a493,0x000126dc,0x000126dc,0x000126dc}, | ||
| 498 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 499 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 500 | }, | ||
| 501 | { /* version 2, passes 1 */ | ||
| 502 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 503 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 504 | {0x00000000,0x00000000,0x00000049,0x00000009, | ||
| 505 | 0x00000049,0x00000009,0x00000001,0x00000000}, | ||
| 506 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 507 | 0x00000049,0x00000049,0x00000049,0x00000000}, | ||
| 508 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 509 | 0x00000249,0x00000049,0x0000024a,0x00000001}, | ||
| 510 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 511 | 0x00000249,0x00000249,0x0000024a,0x00000001}, | ||
| 512 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 513 | 0x00000249,0x00000249,0x0000024a,0x00000001}, | ||
| 514 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 515 | 0x00000249,0x00000249,0x0000024a,0x00000009}, | ||
| 516 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 517 | 0x0000124a,0x0000124a,0x0000024a,0x00000009}, | ||
| 518 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 519 | 0x0000124a,0x0000124a,0x0000024a,0x00000009}, | ||
| 520 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 521 | 0x0000124a,0x00009252,0x00001252,0x00000049}, | ||
| 522 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 523 | 0x0000124a,0x00009292,0x00001252,0x00000049}, | ||
| 524 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 525 | 0x0000124a,0x00009292,0x00001252,0x00000049}, | ||
| 526 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 527 | 0x00009252,0x00009292,0x00001252,0x0000024a}, | ||
| 528 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 529 | 0x00009292,0x00009292,0x00001252,0x0000024a}, | ||
| 530 | {0x00000000,0x00000000,0x0000924a,0x0000924a, | ||
| 531 | 0x00009492,0x00009493,0x00009292,0x00001252}, | ||
| 532 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 533 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 534 | } | ||
| 535 | }, | ||
| 536 | { /* version 3 */ | ||
| 537 | { /* version 3, passes 0 */ | ||
| 538 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 539 | 0x00000000,0x00000000,0x00000000,0x00000001}, | ||
| 540 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 541 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 542 | {0x00000000,0x00000000,0x00000049,0x00000249, | ||
| 543 | 0x00000249,0x00000249,0x00001252,0x0000024a}, | ||
| 544 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 545 | 0x00000249,0x0000124a,0x00001252,0x00001252}, | ||
| 546 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 547 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 548 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 549 | 0x0000124a,0x00009292,0x00009292,0x00009493}, | ||
| 550 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 551 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 552 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 553 | 0x00009292,0x00009493,0x00009493,0x00009493}, | ||
| 554 | {0x00000000,0x00000000,0x00000249,0x00009252, | ||
| 555 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 556 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 557 | 0x00009292,0x0000a49b,0x0000a49b,0x0000a49b}, | ||
| 558 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 559 | 0x00009492,0x0000a49b,0x0000a49b,0x0000a49b}, | ||
| 560 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 561 | 0x00009492,0x0000a49b,0x000124db,0x000124db}, | ||
| 562 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 563 | 0x0000a493,0x0000a49b,0x000124db,0x000124db}, | ||
| 564 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 565 | 0x0001249b,0x000126dc,0x000136e4,0x000126dc}, | ||
| 566 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 567 | 0x000124db,0x000136e4,0x0001b725,0x000136e4}, | ||
| 568 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 569 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 570 | }, | ||
| 571 | { /* version 3, passes 1 */ | ||
| 572 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 573 | 0x00000000,0x00000000,0x00000000,0x00000000}, | ||
| 574 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 575 | 0x00000049,0x00000049,0x00000001,0x00000000}, | ||
| 576 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 577 | 0x00000249,0x00000249,0x00000049,0x00000001}, | ||
| 578 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 579 | 0x00000249,0x0000124a,0x00001252,0x00000001}, | ||
| 580 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 581 | 0x0000124a,0x0000124a,0x00001252,0x00000009}, | ||
| 582 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 583 | 0x0000124a,0x00009252,0x00009292,0x00000009}, | ||
| 584 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 585 | 0x0000124a,0x00009252,0x00009292,0x00000049}, | ||
| 586 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 587 | 0x00009252,0x00009252,0x00009292,0x00000049}, | ||
| 588 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 589 | 0x00009252,0x00009493,0x00009292,0x0000024a}, | ||
| 590 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 591 | 0x00009252,0x00009493,0x00009292,0x0000024a}, | ||
| 592 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 593 | 0x00009252,0x00009493,0x00009493,0x00001252}, | ||
| 594 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 595 | 0x00009292,0x00009493,0x00009493,0x00001252}, | ||
| 596 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 597 | 0x00009492,0x00009493,0x00009493,0x00009292}, | ||
| 598 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 599 | 0x00009492,0x0000a49b,0x00009493,0x00009292}, | ||
| 600 | {0x00000000,0x00000000,0x0000924a,0x00009292, | ||
| 601 | 0x0000a493,0x000124db,0x0000a49b,0x00009493}, | ||
| 602 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 603 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 604 | } | ||
| 605 | }, | ||
| 606 | { /* version 4 */ | ||
| 607 | { /* version 4, passes 0 */ | ||
| 608 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 609 | 0x00000049,0x00000049,0x0000024a,0x0000024a}, | ||
| 610 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 611 | 0x00000249,0x0000124a,0x00001252,0x00009292}, | ||
| 612 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 613 | 0x0000124a,0x00009252,0x00009292,0x00009292}, | ||
| 614 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 615 | 0x0000124a,0x00009292,0x00009493,0x00009493}, | ||
| 616 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 617 | 0x00009252,0x00009493,0x00009493,0x0000a49b}, | ||
| 618 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 619 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 620 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 621 | 0x00009292,0x00009493,0x0000a49b,0x000124db}, | ||
| 622 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 623 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 624 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 625 | 0x00009492,0x000124db,0x000124db,0x000126dc}, | ||
| 626 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 627 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 628 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 629 | 0x0000a493,0x000124db,0x000126dc,0x000136e4}, | ||
| 630 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 631 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 632 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 633 | 0x0001249b,0x000126dc,0x000136e4,0x000136e4}, | ||
| 634 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 635 | 0x000124db,0x000136e4,0x000136e4,0x0001b724}, | ||
| 636 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 637 | 0x000126dc,0x0001b724,0x0001b725,0x0001b925}, | ||
| 638 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 639 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 640 | }, | ||
| 641 | { /* version 4, passes 1 */ | ||
| 642 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 643 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 644 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 645 | 0x00000249,0x00000249,0x0000024a,0x00000049}, | ||
| 646 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 647 | 0x0000124a,0x0000124a,0x00001252,0x00000049}, | ||
| 648 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 649 | 0x0000124a,0x0000124a,0x00009292,0x0000024a}, | ||
| 650 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 651 | 0x00009252,0x00009292,0x00009292,0x0000024a}, | ||
| 652 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 653 | 0x00009252,0x00009292,0x0000a49b,0x0000024a}, | ||
| 654 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 655 | 0x00009292,0x00009493,0x0000a49b,0x00001252}, | ||
| 656 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 657 | 0x00009292,0x00009493,0x0000a49b,0x00001252}, | ||
| 658 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 659 | 0x00009492,0x0000a49b,0x0000a49b,0x00001252}, | ||
| 660 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 661 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 662 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 663 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 664 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 665 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 666 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 667 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 668 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 669 | 0x0000a493,0x000124db,0x0000a49b,0x00009493}, | ||
| 670 | {0x00000000,0x00000000,0x00009252,0x0000a49b, | ||
| 671 | 0x0001249b,0x000126dc,0x000124db,0x0000a49b}, | ||
| 672 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 673 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 674 | } | ||
| 675 | }, | ||
| 676 | { /* version 5 */ | ||
| 677 | { /* version 5, passes 0 */ | ||
| 678 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 679 | 0x00000249,0x0000124a,0x00001252,0x00009292}, | ||
| 680 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 681 | 0x0000124a,0x00009292,0x00009292,0x00009493}, | ||
| 682 | {0x00000000,0x00000000,0x00000249,0x0000924a, | ||
| 683 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 684 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 685 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 686 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 687 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 688 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 689 | 0x00009492,0x0000a49b,0x000124db,0x000124db}, | ||
| 690 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 691 | 0x0000a493,0x000124db,0x000124db,0x000126dc}, | ||
| 692 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 693 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 694 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 695 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 696 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 697 | 0x0001249b,0x000126dc,0x000136e4,0x000136e4}, | ||
| 698 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 699 | 0x0001249b,0x000126dc,0x000136e4,0x000136e4}, | ||
| 700 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 701 | 0x0001249b,0x000126dc,0x0001b725,0x0001b724}, | ||
| 702 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 703 | 0x000124db,0x000126dc,0x0001b725,0x0001b724}, | ||
| 704 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 705 | 0x000126dc,0x000136e4,0x0001b92d,0x0001b925}, | ||
| 706 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 707 | 0x000136e4,0x0001b724,0x0001c96e,0x0001c92d}, | ||
| 708 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 709 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 710 | }, | ||
| 711 | { /* version 5, passes 1 */ | ||
| 712 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 713 | 0x0000124a,0x00000249,0x0000024a,0x0000024a}, | ||
| 714 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 715 | 0x0000124a,0x0000124a,0x00001252,0x0000024a}, | ||
| 716 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 717 | 0x00009292,0x00009493,0x00009493,0x0000024a}, | ||
| 718 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 719 | 0x00009292,0x00009493,0x00009493,0x00001252}, | ||
| 720 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 721 | 0x00009292,0x00009493,0x0000a49b,0x00001252}, | ||
| 722 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 723 | 0x00009492,0x00009493,0x000124db,0x00001252}, | ||
| 724 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 725 | 0x00009492,0x00009493,0x000124db,0x00009292}, | ||
| 726 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 727 | 0x00009492,0x0000a49b,0x000124db,0x00009292}, | ||
| 728 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 729 | 0x0000a493,0x0000a49b,0x000124db,0x00009292}, | ||
| 730 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 731 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 732 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 733 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 734 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 735 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 736 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 737 | 0x0000a493,0x000124db,0x000124db,0x0000a49b}, | ||
| 738 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 739 | 0x000124db,0x000126dc,0x000124db,0x0000a49b}, | ||
| 740 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 741 | 0x000126dc,0x000136e4,0x000126dc,0x000124db}, | ||
| 742 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 743 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 744 | } | ||
| 745 | }, | ||
| 746 | { /* version 6 */ | ||
| 747 | { /* version 6, passes 0 */ | ||
| 748 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 749 | 0x0000124a,0x0000124a,0x00009292,0x00009292}, | ||
| 750 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 751 | 0x00009292,0x00009493,0x0000a49b,0x0000a49b}, | ||
| 752 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 753 | 0x00009492,0x0000a49b,0x0000a49b,0x000124db}, | ||
| 754 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 755 | 0x00009492,0x000124db,0x000126dc,0x000126dc}, | ||
| 756 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 757 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 758 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 759 | 0x0000a493,0x000126dc,0x000136e4,0x000136e4}, | ||
| 760 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 761 | 0x0000a493,0x000126dc,0x000136e4,0x0001b724}, | ||
| 762 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 763 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 764 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 765 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 766 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 767 | 0x0001249b,0x000136e4,0x0001b725,0x0001b724}, | ||
| 768 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 769 | 0x000124db,0x000136e4,0x0001b725,0x0001b925}, | ||
| 770 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 771 | 0x000126dc,0x000136e4,0x0001b92d,0x0001b925}, | ||
| 772 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 773 | 0x000126dc,0x0001b724,0x0001b92d,0x0001c92d}, | ||
| 774 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 775 | 0x000126dc,0x0001b724,0x0001c96e,0x0001c92d}, | ||
| 776 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 777 | 0x000136e4,0x0001b925,0x00025bb6,0x00024b77}, | ||
| 778 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 779 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 780 | }, | ||
| 781 | { /* version 6, passes 1 */ | ||
| 782 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 783 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 784 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 785 | 0x00009252,0x00009292,0x00009292,0x00001252}, | ||
| 786 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 787 | 0x00009492,0x00009493,0x0000a49b,0x00001252}, | ||
| 788 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 789 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 790 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 791 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 792 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 793 | 0x0000a493,0x0000a49b,0x000126dc,0x00009292}, | ||
| 794 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 795 | 0x0000a493,0x0000a49b,0x000126dc,0x00009493}, | ||
| 796 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 797 | 0x0000a493,0x0000a49b,0x000126dc,0x00009493}, | ||
| 798 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 799 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 800 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 801 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 802 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 803 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 804 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 805 | 0x0001249b,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 806 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 807 | 0x000124db,0x000136e4,0x000126dc,0x000124db}, | ||
| 808 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 809 | 0x000136e4,0x000136e4,0x000126dc,0x000124db}, | ||
| 810 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 811 | 0x0001b724,0x0001b724,0x000136e4,0x000126dc}, | ||
| 812 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 813 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 814 | } | ||
| 815 | }, | ||
| 816 | { /* version 7 */ | ||
| 817 | { /* version 7, passes 0 */ | ||
| 818 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 819 | 0x00009292,0x00009493,0x0000a49b,0x000124db}, | ||
| 820 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 821 | 0x0000a493,0x0000a49b,0x000124db,0x000126dc}, | ||
| 822 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 823 | 0x0000a493,0x000124db,0x000126dc,0x000136e4}, | ||
| 824 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 825 | 0x0000a493,0x000124db,0x000136e4,0x000136e4}, | ||
| 826 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 827 | 0x0001249b,0x000126dc,0x000136e4,0x000136e4}, | ||
| 828 | {0x00000000,0x00000000,0x00001249,0x0000a49b, | ||
| 829 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 830 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 831 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 832 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 833 | 0x000124db,0x000136e4,0x0001b725,0x0001b724}, | ||
| 834 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 835 | 0x000126dc,0x000136e4,0x0001b725,0x0001b925}, | ||
| 836 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 837 | 0x000126dc,0x0001b724,0x0001b92d,0x0001b925}, | ||
| 838 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 839 | 0x000126dc,0x0001b724,0x0001c96e,0x0001c92d}, | ||
| 840 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 841 | 0x000126dc,0x0001b724,0x0001c96e,0x0001c92d}, | ||
| 842 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 843 | 0x000136e4,0x0001b724,0x0001c96e,0x0002496e}, | ||
| 844 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 845 | 0x000136e4,0x0001b925,0x0001c96e,0x0002496e}, | ||
| 846 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 847 | 0x0001b724,0x0002496d,0x00025bb6,0x00025bbf}, | ||
| 848 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 849 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 850 | }, | ||
| 851 | { /* version 7, passes 1 */ | ||
| 852 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 853 | 0x00009252,0x00009292,0x00009292,0x00009292}, | ||
| 854 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 855 | 0x00009492,0x00009493,0x00009493,0x00009292}, | ||
| 856 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 857 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 858 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 859 | 0x0000a493,0x0000a49b,0x000124db,0x00009493}, | ||
| 860 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 861 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 862 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 863 | 0x0000a493,0x000124db,0x000136e4,0x00009493}, | ||
| 864 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 865 | 0x0000a493,0x000124db,0x000136e4,0x0000a49b}, | ||
| 866 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 867 | 0x0001249b,0x000124db,0x000136e4,0x0000a49b}, | ||
| 868 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 869 | 0x0001249b,0x000126dc,0x000136e4,0x0000a49b}, | ||
| 870 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 871 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 872 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 873 | 0x000126dc,0x000136e4,0x000136e4,0x000124db}, | ||
| 874 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 875 | 0x000126dc,0x000136e4,0x000136e4,0x000124db}, | ||
| 876 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 877 | 0x000136e4,0x000136e4,0x000136e4,0x000126dc}, | ||
| 878 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 879 | 0x000136e4,0x0001b724,0x000136e4,0x000126dc}, | ||
| 880 | {0x00000000,0x00000000,0x00012492,0x000126db, | ||
| 881 | 0x0001b724,0x0001b925,0x0001b725,0x000136e4}, | ||
| 882 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 883 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 884 | } | ||
| 885 | }, | ||
| 886 | { /* version 8 */ | ||
| 887 | { /* version 8, passes 0 */ | ||
| 888 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 889 | 0x00009292,0x00009493,0x0000a49b,0x000124db}, | ||
| 890 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 891 | 0x0000a493,0x000124db,0x000126dc,0x000126dc}, | ||
| 892 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 893 | 0x0000a493,0x000124db,0x000126dc,0x000136e4}, | ||
| 894 | {0x00000000,0x00000000,0x00001249,0x0000a49b, | ||
| 895 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 896 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 897 | 0x0001249b,0x000126dc,0x000136e4,0x0001b724}, | ||
| 898 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 899 | 0x000124db,0x000136e4,0x0001b725,0x0001b724}, | ||
| 900 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 901 | 0x000126dc,0x000136e4,0x0001b725,0x0001b925}, | ||
| 902 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 903 | 0x000126dc,0x0001b724,0x0001b92d,0x0001c92d}, | ||
| 904 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 905 | 0x000126dc,0x0001b724,0x0001b92d,0x0001c92d}, | ||
| 906 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 907 | 0x000126dc,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 908 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 909 | 0x000136e4,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 910 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 911 | 0x000136e4,0x0001b925,0x00024b76,0x00024b77}, | ||
| 912 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 913 | 0x000136e4,0x0001b925,0x00024b76,0x00025bbf}, | ||
| 914 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 915 | 0x000136e4,0x0001c92d,0x00024b76,0x00025bbf}, | ||
| 916 | {0x00000000,0x00000000,0x00012492,0x000136db, | ||
| 917 | 0x0001b724,0x00024b6d,0x0002ddb6,0x0002efff}, | ||
| 918 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 919 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 920 | }, | ||
| 921 | { /* version 8, passes 1 */ | ||
| 922 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 923 | 0x00009252,0x00009493,0x00009493,0x00009493}, | ||
| 924 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 925 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 926 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 927 | 0x0000a493,0x0000a49b,0x000124db,0x00009493}, | ||
| 928 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 929 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 930 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 931 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 932 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 933 | 0x0000a493,0x000124db,0x000136e4,0x000124db}, | ||
| 934 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 935 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 936 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 937 | 0x000126dc,0x000126dc,0x000136e4,0x000126dc}, | ||
| 938 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 939 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 940 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 941 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 942 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 943 | 0x000126dc,0x000136e4,0x000136e4,0x000136e4}, | ||
| 944 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 945 | 0x000136e4,0x0001b724,0x0001b725,0x000136e4}, | ||
| 946 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 947 | 0x000136e4,0x0001b925,0x0001b725,0x0001b724}, | ||
| 948 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 949 | 0x000136e4,0x0001b925,0x0001b725,0x0001b724}, | ||
| 950 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 951 | 0x0001b724,0x0002496d,0x0001b92d,0x0001b925}, | ||
| 952 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 953 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 954 | } | ||
| 955 | }, | ||
| 956 | { /* version 9 */ | ||
| 957 | { /* version 9, passes 0 */ | ||
| 958 | {0x00000000,0x00000000,0x00000049,0x00000049, | ||
| 959 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 960 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 961 | 0x00000249,0x00000249,0x0000024a,0x00000049}, | ||
| 962 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 963 | 0x0000124a,0x00009252,0x00001252,0x0000024a}, | ||
| 964 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 965 | 0x00009252,0x00009292,0x00009493,0x00001252}, | ||
| 966 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 967 | 0x00009292,0x00009493,0x00009493,0x00001252}, | ||
| 968 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 969 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 970 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 971 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 972 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 973 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 974 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 975 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 976 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 977 | 0x0001249b,0x000126dc,0x000126dc,0x000124db}, | ||
| 978 | {0x00000000,0x00000000,0x00009252,0x00009493, | ||
| 979 | 0x000124db,0x000136e4,0x000136e4,0x000126dc}, | ||
| 980 | {0x00000000,0x00000000,0x00009252,0x0000a49b, | ||
| 981 | 0x000124db,0x000136e4,0x000136e4,0x000126dc}, | ||
| 982 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 983 | 0x000126dc,0x000136e4,0x000136e4,0x000136e4}, | ||
| 984 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 985 | 0x000126dc,0x0001b724,0x0001b725,0x0001b724}, | ||
| 986 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 987 | 0x000136e4,0x0001b925,0x0001b92d,0x0001b925}, | ||
| 988 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 989 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 990 | }, | ||
| 991 | { /* version 9, passes 1 */ | ||
| 992 | {0x00000000,0x00000000,0x00000249,0x00000049, | ||
| 993 | 0x00000009,0x00000009,0x00000009,0x00000009}, | ||
| 994 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 995 | 0x00000049,0x00000049,0x00000009,0x00000009}, | ||
| 996 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 997 | 0x0000124a,0x00000249,0x00000049,0x00000049}, | ||
| 998 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 999 | 0x0000124a,0x0000124a,0x00000049,0x00000049}, | ||
| 1000 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1001 | 0x00009252,0x0000124a,0x0000024a,0x0000024a}, | ||
| 1002 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 1003 | 0x00009252,0x0000124a,0x0000024a,0x0000024a}, | ||
| 1004 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1005 | 0x00009492,0x00009252,0x00001252,0x00001252}, | ||
| 1006 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1007 | 0x0000a493,0x00009292,0x00009292,0x00001252}, | ||
| 1008 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1009 | 0x0000a493,0x00009292,0x00009292,0x00009292}, | ||
| 1010 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1011 | 0x0000a493,0x00009493,0x00009493,0x00009292}, | ||
| 1012 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1013 | 0x0000a493,0x0000a49b,0x00009493,0x00009493}, | ||
| 1014 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1015 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 1016 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1017 | 0x0001249b,0x000124db,0x0000a49b,0x0000a49b}, | ||
| 1018 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1019 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1020 | {0x00000000,0x00000000,0x00009252,0x000124db, | ||
| 1021 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1022 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1023 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1024 | } | ||
| 1025 | }, | ||
| 1026 | { /* version 10 */ | ||
| 1027 | { /* version 10, passes 0 */ | ||
| 1028 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 1029 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 1030 | {0x00000000,0x00000000,0x00000249,0x00001249, | ||
| 1031 | 0x00009252,0x00009292,0x00009292,0x0000024a}, | ||
| 1032 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1033 | 0x00009252,0x00009292,0x00009292,0x00001252}, | ||
| 1034 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 1035 | 0x00009492,0x00009493,0x0000a49b,0x00009292}, | ||
| 1036 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1037 | 0x00009492,0x000124db,0x000124db,0x00009292}, | ||
| 1038 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1039 | 0x0000a493,0x000124db,0x000124db,0x00009493}, | ||
| 1040 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1041 | 0x0000a493,0x000124db,0x000126dc,0x0000a49b}, | ||
| 1042 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1043 | 0x0000a493,0x000124db,0x000126dc,0x000124db}, | ||
| 1044 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1045 | 0x0001249b,0x000126dc,0x000126dc,0x000124db}, | ||
| 1046 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1047 | 0x000124db,0x000126dc,0x000136e4,0x000126dc}, | ||
| 1048 | {0x00000000,0x00000000,0x00009252,0x0000a49b, | ||
| 1049 | 0x000124db,0x000136e4,0x000136e4,0x000136e4}, | ||
| 1050 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1051 | 0x000126dc,0x000136e4,0x000136e4,0x000136e4}, | ||
| 1052 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 1053 | 0x000126dc,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 1054 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1055 | 0x000126dc,0x0001b925,0x0001b92d,0x0001b925}, | ||
| 1056 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1057 | 0x000136e4,0x0002496d,0x0001c96e,0x0001c92d}, | ||
| 1058 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1059 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1060 | }, | ||
| 1061 | { /* version 10, passes 1 */ | ||
| 1062 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 1063 | 0x00000049,0x00000049,0x00000049,0x00000049}, | ||
| 1064 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1065 | 0x0000124a,0x00000249,0x00000049,0x00000049}, | ||
| 1066 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1067 | 0x0000124a,0x00009252,0x0000024a,0x00000049}, | ||
| 1068 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1069 | 0x00009252,0x00009493,0x0000024a,0x0000024a}, | ||
| 1070 | {0x00000000,0x00000000,0x00001249,0x00009252, | ||
| 1071 | 0x00009492,0x00009493,0x00001252,0x0000024a}, | ||
| 1072 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1073 | 0x00009492,0x00009493,0x00001252,0x00001252}, | ||
| 1074 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1075 | 0x00009492,0x00009493,0x00009292,0x00001252}, | ||
| 1076 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1077 | 0x0000a493,0x00009493,0x00009292,0x00009292}, | ||
| 1078 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1079 | 0x0000a493,0x0000a49b,0x00009493,0x00009292}, | ||
| 1080 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1081 | 0x0000a493,0x0000a49b,0x00009493,0x00009292}, | ||
| 1082 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1083 | 0x0000a493,0x000124db,0x0000a49b,0x00009493}, | ||
| 1084 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1085 | 0x0000a493,0x000124db,0x0000a49b,0x00009493}, | ||
| 1086 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1087 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1088 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1089 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1090 | {0x00000000,0x00000000,0x00009252,0x000126db, | ||
| 1091 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1092 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1093 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1094 | } | ||
| 1095 | }, | ||
| 1096 | { /* version 11 */ | ||
| 1097 | { /* version 11, passes 0 */ | ||
| 1098 | {0x00000000,0x00000000,0x00000249,0x00000249, | ||
| 1099 | 0x00000249,0x00000249,0x00001252,0x00001252}, | ||
| 1100 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1101 | 0x00009252,0x00009292,0x00009292,0x00001252}, | ||
| 1102 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 1103 | 0x00009492,0x0000a49b,0x0000a49b,0x00009292}, | ||
| 1104 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1105 | 0x0000a493,0x0000a49b,0x000124db,0x00009493}, | ||
| 1106 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1107 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 1108 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1109 | 0x0000a493,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 1110 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1111 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 1112 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1113 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 1114 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1115 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 1116 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1117 | 0x000126dc,0x0001b724,0x0001b725,0x000136e4}, | ||
| 1118 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1119 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 1120 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 1121 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 1122 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1123 | 0x000136e4,0x0001b925,0x0001c96e,0x0001b925}, | ||
| 1124 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1125 | 0x0001b724,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 1126 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1127 | 0x0001c924,0x0002496d,0x00025bb6,0x00024b77}, | ||
| 1128 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1129 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1130 | }, | ||
| 1131 | { /* version 11, passes 1 */ | ||
| 1132 | {0x00000000,0x00000000,0x00001249,0x00000249, | ||
| 1133 | 0x00000249,0x00000249,0x0000024a,0x0000024a}, | ||
| 1134 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1135 | 0x0000124a,0x0000124a,0x0000024a,0x0000024a}, | ||
| 1136 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 1137 | 0x00009252,0x00009252,0x0000024a,0x0000024a}, | ||
| 1138 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1139 | 0x00009492,0x0000a49b,0x00001252,0x00001252}, | ||
| 1140 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1141 | 0x0000a493,0x0000a49b,0x00001252,0x00001252}, | ||
| 1142 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1143 | 0x0000a493,0x0000a49b,0x00009292,0x00001252}, | ||
| 1144 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1145 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 1146 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1147 | 0x0000a493,0x0000a49b,0x00009493,0x00009292}, | ||
| 1148 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1149 | 0x0001249b,0x000124db,0x00009493,0x00009292}, | ||
| 1150 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1151 | 0x0001249b,0x000124db,0x00009493,0x00009493}, | ||
| 1152 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1153 | 0x000124db,0x000124db,0x0000a49b,0x00009493}, | ||
| 1154 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1155 | 0x000126dc,0x000126dc,0x0000a49b,0x00009493}, | ||
| 1156 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1157 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1158 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 1159 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1160 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 1161 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1162 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1163 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1164 | } | ||
| 1165 | }, | ||
| 1166 | { /* version 12 */ | ||
| 1167 | { /* version 12, passes 0 */ | ||
| 1168 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1169 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 1170 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1171 | 0x0000a493,0x0000a49b,0x0000a49b,0x00009493}, | ||
| 1172 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1173 | 0x0000a493,0x000124db,0x000124db,0x0000a49b}, | ||
| 1174 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1175 | 0x0000a493,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 1176 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1177 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 1178 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1179 | 0x000126dc,0x000136e4,0x000136e4,0x000126dc}, | ||
| 1180 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1181 | 0x000126dc,0x0001b724,0x0001b725,0x000126dc}, | ||
| 1182 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1183 | 0x000136e4,0x0001b724,0x0001b92d,0x000136e4}, | ||
| 1184 | {0x00000000,0x00000000,0x00009492,0x0000a49b, | ||
| 1185 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 1186 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1187 | 0x000136e4,0x0001b724,0x0001b92d,0x0001b724}, | ||
| 1188 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1189 | 0x000136e4,0x0001b925,0x0001b92d,0x0001b925}, | ||
| 1190 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1191 | 0x0001b724,0x0001b925,0x0001c96e,0x0001c92d}, | ||
| 1192 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1193 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001c92d}, | ||
| 1194 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1195 | 0x0001b724,0x0001c92d,0x00024b76,0x0002496e}, | ||
| 1196 | {0x00000000,0x00000000,0x00012492,0x000126db, | ||
| 1197 | 0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 1198 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1199 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1200 | }, | ||
| 1201 | { /* version 12, passes 1 */ | ||
| 1202 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1203 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 1204 | {0x00000000,0x00000000,0x00001249,0x00009292, | ||
| 1205 | 0x00009492,0x00009252,0x00001252,0x00001252}, | ||
| 1206 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1207 | 0x0000a493,0x00009292,0x00001252,0x00001252}, | ||
| 1208 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1209 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 1210 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1211 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 1212 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1213 | 0x0001249b,0x0000a49b,0x00009493,0x00009292}, | ||
| 1214 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1215 | 0x000124db,0x000124db,0x00009493,0x00009493}, | ||
| 1216 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1217 | 0x000124db,0x000124db,0x0000a49b,0x00009493}, | ||
| 1218 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1219 | 0x000126dc,0x000124db,0x0000a49b,0x00009493}, | ||
| 1220 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1221 | 0x000126dc,0x000126dc,0x0000a49b,0x0000a49b}, | ||
| 1222 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1223 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1224 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 1225 | 0x000136e4,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1226 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 1227 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1228 | {0x00000000,0x00000000,0x00009492,0x000126db, | ||
| 1229 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1230 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1231 | 0x0001c924,0x0001b724,0x000136e4,0x000126dc}, | ||
| 1232 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1233 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1234 | } | ||
| 1235 | }, | ||
| 1236 | { /* version 13 */ | ||
| 1237 | { /* version 13, passes 0 */ | ||
| 1238 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1239 | 0x00009252,0x00009292,0x00009493,0x00009493}, | ||
| 1240 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1241 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 1242 | {0x00000000,0x00000000,0x00001249,0x0000a49b, | ||
| 1243 | 0x0001249b,0x000126dc,0x000126dc,0x0000a49b}, | ||
| 1244 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1245 | 0x0001249b,0x000126dc,0x000136e4,0x0000a49b}, | ||
| 1246 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1247 | 0x000126dc,0x000136e4,0x0001b725,0x000124db}, | ||
| 1248 | {0x00000000,0x00000000,0x00009292,0x0000a49b, | ||
| 1249 | 0x000136e4,0x0001b724,0x0001b725,0x000126dc}, | ||
| 1250 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 1251 | 0x000136e4,0x0001b724,0x0001b725,0x000126dc}, | ||
| 1252 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1253 | 0x000136e4,0x0001b724,0x0001c96e,0x000136e4}, | ||
| 1254 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1255 | 0x000136e4,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 1256 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1257 | 0x000136e4,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 1258 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1259 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b925}, | ||
| 1260 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1261 | 0x0001b724,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1262 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1263 | 0x0001b924,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1264 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1265 | 0x0001b924,0x0001c92d,0x00024b76,0x0002496e}, | ||
| 1266 | {0x00000000,0x00000000,0x00012492,0x000136db, | ||
| 1267 | 0x00024924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 1268 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1269 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1270 | }, | ||
| 1271 | { /* version 13, passes 1 */ | ||
| 1272 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1273 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 1274 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1275 | 0x00009492,0x00009292,0x00001252,0x00001252}, | ||
| 1276 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1277 | 0x0000a493,0x0000a49b,0x00001252,0x00001252}, | ||
| 1278 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1279 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 1280 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1281 | 0x0000a493,0x0000a49b,0x00009292,0x00009292}, | ||
| 1282 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1283 | 0x000126dc,0x0000a49b,0x00009493,0x00009292}, | ||
| 1284 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1285 | 0x000126dc,0x000124db,0x00009493,0x00009493}, | ||
| 1286 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1287 | 0x000136e4,0x000124db,0x0000a49b,0x00009493}, | ||
| 1288 | {0x00000000,0x00000000,0x0000924a,0x000136db, | ||
| 1289 | 0x0001b724,0x000124db,0x0000a49b,0x00009493}, | ||
| 1290 | {0x00000000,0x00000000,0x0000924a,0x000136db, | ||
| 1291 | 0x0001b724,0x000126dc,0x0000a49b,0x0000a49b}, | ||
| 1292 | {0x00000000,0x00000000,0x00009292,0x000136db, | ||
| 1293 | 0x0001b724,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1294 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1295 | 0x0001b724,0x000126dc,0x000124db,0x0000a49b}, | ||
| 1296 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1297 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1298 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1299 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1300 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 1301 | 0x0001c924,0x0001b724,0x000136e4,0x000126dc}, | ||
| 1302 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1303 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1304 | } | ||
| 1305 | }, | ||
| 1306 | { /* version 14 */ | ||
| 1307 | { /* version 14, passes 0 */ | ||
| 1308 | {0x00000000,0x00000000,0x00001249,0x0000924a, | ||
| 1309 | 0x00009292,0x00009493,0x00009493,0x00009493}, | ||
| 1310 | {0x00000000,0x00000000,0x00001249,0x0000a49b, | ||
| 1311 | 0x0000a493,0x000124db,0x000126dc,0x00009493}, | ||
| 1312 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1313 | 0x0001249b,0x000126dc,0x000136e4,0x0000a49b}, | ||
| 1314 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1315 | 0x000126dc,0x000136e4,0x0001b725,0x000124db}, | ||
| 1316 | {0x00000000,0x00000000,0x00009292,0x000124db, | ||
| 1317 | 0x000126dc,0x0001b724,0x0001b92d,0x000126dc}, | ||
| 1318 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1319 | 0x000136e4,0x0001b724,0x0001b92d,0x000126dc}, | ||
| 1320 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1321 | 0x000136e4,0x0001c92d,0x0001c96e,0x000136e4}, | ||
| 1322 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1323 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 1324 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1325 | 0x0001b724,0x0001c92d,0x00024b76,0x0001b925}, | ||
| 1326 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1327 | 0x0001b724,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1328 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1329 | 0x0001b724,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1330 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1331 | 0x0001b724,0x0001c92d,0x00024b76,0x0002496e}, | ||
| 1332 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1333 | 0x0001b924,0x0002496d,0x00024b76,0x00024b77}, | ||
| 1334 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1335 | 0x0001b924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 1336 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 1337 | 0x00024924,0x0002db6d,0x00036db6,0x0002efff}, | ||
| 1338 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1339 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1340 | }, | ||
| 1341 | { /* version 14, passes 1 */ | ||
| 1342 | {0x00000000,0x00000000,0x00001249,0x00001249, | ||
| 1343 | 0x0000124a,0x0000124a,0x00001252,0x00001252}, | ||
| 1344 | {0x00000000,0x00000000,0x0000924a,0x00009493, | ||
| 1345 | 0x0000a493,0x00009292,0x00001252,0x00001252}, | ||
| 1346 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1347 | 0x0000a493,0x0000a49b,0x00001252,0x00001252}, | ||
| 1348 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1349 | 0x0001249b,0x000136e4,0x00009292,0x00009292}, | ||
| 1350 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1351 | 0x0001249b,0x000136e4,0x00009292,0x00009292}, | ||
| 1352 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1353 | 0x000136e4,0x000136e4,0x00009493,0x00009292}, | ||
| 1354 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1355 | 0x0001b724,0x000136e4,0x00009493,0x00009493}, | ||
| 1356 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1357 | 0x0001b724,0x000136e4,0x0000a49b,0x00009493}, | ||
| 1358 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1359 | 0x0001b724,0x000136e4,0x0000a49b,0x00009493}, | ||
| 1360 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1361 | 0x0001b724,0x000136e4,0x0000a49b,0x0000a49b}, | ||
| 1362 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1363 | 0x0001b724,0x000136e4,0x000124db,0x0000a49b}, | ||
| 1364 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1365 | 0x0001b724,0x000136e4,0x000124db,0x0000a49b}, | ||
| 1366 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1367 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1368 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1369 | 0x0001b724,0x000136e4,0x000126dc,0x000124db}, | ||
| 1370 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 1371 | 0x0001c924,0x0001b724,0x000136e4,0x000126dc}, | ||
| 1372 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1373 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1374 | } | ||
| 1375 | }, | ||
| 1376 | { /* version 15 */ | ||
| 1377 | { /* version 15, passes 0 */ | ||
| 1378 | {0x00000000,0x00000000,0x00001249,0x00009493, | ||
| 1379 | 0x0000a493,0x0000a49b,0x000124db,0x000124db}, | ||
| 1380 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1381 | 0x0001249b,0x000126dc,0x000136e4,0x000124db}, | ||
| 1382 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1383 | 0x000126dc,0x0001b724,0x0001b725,0x000126dc}, | ||
| 1384 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1385 | 0x000136e4,0x0001b724,0x0001b92d,0x000126dc}, | ||
| 1386 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1387 | 0x000136e4,0x0001b925,0x0001c96e,0x000136e4}, | ||
| 1388 | {0x00000000,0x00000000,0x00009492,0x000124db, | ||
| 1389 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 1390 | {0x00000000,0x00000000,0x0000a492,0x000124db, | ||
| 1391 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b724}, | ||
| 1392 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1393 | 0x0001b724,0x0001c92d,0x0001c96e,0x0001b925}, | ||
| 1394 | {0x00000000,0x00000000,0x0000a492,0x000126db, | ||
| 1395 | 0x0001b924,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1396 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1397 | 0x0001b924,0x0001c92d,0x00024b76,0x0001c92d}, | ||
| 1398 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1399 | 0x0001b924,0x0002496d,0x00024b76,0x0002496e}, | ||
| 1400 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1401 | 0x0001c924,0x0002496d,0x00025bb6,0x00024b77}, | ||
| 1402 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1403 | 0x0001c924,0x00024b6d,0x00025bb6,0x00024b77}, | ||
| 1404 | {0x00000000,0x00000000,0x00012492,0x000136db, | ||
| 1405 | 0x0001c924,0x00024b6d,0x0002ddb6,0x00025bbf}, | ||
| 1406 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 1407 | 0x00024924,0x0002db6d,0x00036db6,0x0002efff}, | ||
| 1408 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1409 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1410 | }, | ||
| 1411 | { /* version 15, passes 1 */ | ||
| 1412 | {0x00000000,0x00000000,0x0000924a,0x0000924a, | ||
| 1413 | 0x00009292,0x00009292,0x00009292,0x00009292}, | ||
| 1414 | {0x00000000,0x00000000,0x0000924a,0x0000a49b, | ||
| 1415 | 0x0000a493,0x000124db,0x00009292,0x00009292}, | ||
| 1416 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1417 | 0x000124db,0x0001b724,0x00009493,0x00009493}, | ||
| 1418 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1419 | 0x000126dc,0x0001b724,0x00009493,0x00009493}, | ||
| 1420 | {0x00000000,0x00000000,0x0000924a,0x000124db, | ||
| 1421 | 0x000136e4,0x0001b724,0x0000a49b,0x0000a49b}, | ||
| 1422 | {0x00000000,0x00000000,0x00009292,0x000136db, | ||
| 1423 | 0x0001b724,0x0001b724,0x0000a49b,0x0000a49b}, | ||
| 1424 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1425 | 0x0001c924,0x0001b724,0x000124db,0x000124db}, | ||
| 1426 | {0x00000000,0x00000000,0x00009492,0x000136db, | ||
| 1427 | 0x0001c924,0x0001b724,0x000124db,0x000124db}, | ||
| 1428 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1429 | 0x0001c924,0x0001b724,0x000126dc,0x000126dc}, | ||
| 1430 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1431 | 0x0001c924,0x0001b925,0x000126dc,0x000126dc}, | ||
| 1432 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1433 | 0x0001c924,0x0001b925,0x000136e4,0x000136e4}, | ||
| 1434 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1435 | 0x0001c924,0x0001b925,0x000136e4,0x000136e4}, | ||
| 1436 | {0x00000000,0x00000000,0x0000a492,0x000136db, | ||
| 1437 | 0x0001c924,0x0001b925,0x0001b725,0x0001b724}, | ||
| 1438 | {0x00000000,0x00000000,0x00012492,0x000136db, | ||
| 1439 | 0x0001c924,0x0001b925,0x0001b725,0x0001b724}, | ||
| 1440 | {0x00000000,0x00000000,0x00012492,0x0001b6db, | ||
| 1441 | 0x00024924,0x0002496d,0x0001b92d,0x0001b925}, | ||
| 1442 | {0x00000000,0x00000000,0x00000000,0x00000000, | ||
| 1443 | 0x00000000,0x00000000,0x00000000,0x00000000} | ||
| 1444 | } | ||
| 1445 | } | ||
| 1446 | }; | ||
diff --git a/drivers/usb/media/pwc/pwc-uncompress.c b/drivers/usb/media/pwc/pwc-uncompress.c index c062e43b3ac5..bc3b1635eab0 100644 --- a/drivers/usb/media/pwc/pwc-uncompress.c +++ b/drivers/usb/media/pwc/pwc-uncompress.c | |||
| @@ -29,8 +29,6 @@ | |||
| 29 | 29 | ||
| 30 | #include "pwc.h" | 30 | #include "pwc.h" |
| 31 | #include "pwc-uncompress.h" | 31 | #include "pwc-uncompress.h" |
| 32 | #include "pwc-dec1.h" | ||
| 33 | #include "pwc-dec23.h" | ||
| 34 | 32 | ||
| 35 | int pwc_decompress(struct pwc_device *pdev) | 33 | int pwc_decompress(struct pwc_device *pdev) |
| 36 | { | 34 | { |
| @@ -122,6 +120,7 @@ int pwc_decompress(struct pwc_device *pdev) | |||
| 122 | 120 | ||
| 123 | switch (pdev->type) | 121 | switch (pdev->type) |
| 124 | { | 122 | { |
| 123 | #if 0 | ||
| 125 | case 675: | 124 | case 675: |
| 126 | case 680: | 125 | case 680: |
| 127 | case 690: | 126 | case 690: |
| @@ -137,6 +136,7 @@ int pwc_decompress(struct pwc_device *pdev) | |||
| 137 | case 645: | 136 | case 645: |
| 138 | case 646: | 137 | case 646: |
| 139 | /* TODO & FIXME */ | 138 | /* TODO & FIXME */ |
| 139 | #endif | ||
| 140 | return -ENXIO; /* No such device or address: missing decompressor */ | 140 | return -ENXIO; /* No such device or address: missing decompressor */ |
| 141 | break; | 141 | break; |
| 142 | } | 142 | } |
diff --git a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig index db64c908d4a7..b104430e2c6a 100644 --- a/drivers/usb/net/Kconfig +++ b/drivers/usb/net/Kconfig | |||
| @@ -219,17 +219,21 @@ config USB_EPSON2888 | |||
| 219 | by some sample firmware from Epson. | 219 | by some sample firmware from Epson. |
| 220 | 220 | ||
| 221 | config USB_ZAURUS | 221 | config USB_ZAURUS |
| 222 | boolean "Sharp Zaurus (stock ROMs)" | 222 | boolean "Sharp Zaurus (stock ROMs) and compatible" |
| 223 | depends on USB_USBNET | 223 | depends on USB_USBNET |
| 224 | select CRC32 | 224 | select CRC32 |
| 225 | default y | 225 | default y |
| 226 | help | 226 | help |
| 227 | Choose this option to support the usb networking links used by | 227 | Choose this option to support the usb networking links used by |
| 228 | Zaurus models like the SL-5000D, SL-5500, SL-5600, A-300, B-500. | 228 | Zaurus models like the SL-5000D, SL-5500, SL-5600, A-300, B-500. |
| 229 | 229 | This also supports some related device firmware, as used in some | |
| 230 | If you install an alternate ROM image, you may no longer need | 230 | PDAs from Olympus and some cell phones from Motorola. |
| 231 | to support this protocol. Only the "eth-fd" driver really needs | 231 | |
| 232 | this non-conformant variant of CDC Ethernet protocol. | 232 | If you install an alternate ROM image, such as the Linux 2.6 based |
| 233 | versions of OpenZaurus, you should no longer need to support this | ||
| 234 | protocol. Only the "eth-fd" or "net_fd" drivers in these devices | ||
| 235 | really need this non-conformant variant of CDC Ethernet (or in | ||
| 236 | some cases CDC MDLM) protocol, not "g_ether". | ||
| 233 | 237 | ||
| 234 | config USB_CDCETHER | 238 | config USB_CDCETHER |
| 235 | boolean "CDC Ethernet support (smart devices such as cable modems)" | 239 | boolean "CDC Ethernet support (smart devices such as cable modems)" |
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index f6bc6b3b333c..4cbb408af727 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c | |||
| @@ -1517,6 +1517,26 @@ static void cdc_unbind (struct usbnet *dev, struct usb_interface *intf) | |||
| 1517 | } | 1517 | } |
| 1518 | } | 1518 | } |
| 1519 | 1519 | ||
| 1520 | #endif /* NEED_GENERIC_CDC */ | ||
| 1521 | |||
| 1522 | |||
| 1523 | #ifdef CONFIG_USB_CDCETHER | ||
| 1524 | #define HAVE_HARDWARE | ||
| 1525 | |||
| 1526 | /*------------------------------------------------------------------------- | ||
| 1527 | * | ||
| 1528 | * Communications Device Class, Ethernet Control model | ||
| 1529 | * | ||
| 1530 | * Takes two interfaces. The DATA interface is inactive till an altsetting | ||
| 1531 | * is selected. Configuration data includes class descriptors. | ||
| 1532 | * | ||
| 1533 | * This should interop with whatever the 2.4 "CDCEther.c" driver | ||
| 1534 | * (by Brad Hards) talked with. | ||
| 1535 | * | ||
| 1536 | *-------------------------------------------------------------------------*/ | ||
| 1537 | |||
| 1538 | #include <linux/ctype.h> | ||
| 1539 | |||
| 1520 | 1540 | ||
| 1521 | static void dumpspeed (struct usbnet *dev, __le32 *speeds) | 1541 | static void dumpspeed (struct usbnet *dev, __le32 *speeds) |
| 1522 | { | 1542 | { |
| @@ -1567,26 +1587,6 @@ static void cdc_status (struct usbnet *dev, struct urb *urb) | |||
| 1567 | } | 1587 | } |
| 1568 | } | 1588 | } |
| 1569 | 1589 | ||
| 1570 | #endif /* NEED_GENERIC_CDC */ | ||
| 1571 | |||
| 1572 | |||
| 1573 | #ifdef CONFIG_USB_CDCETHER | ||
| 1574 | #define HAVE_HARDWARE | ||
| 1575 | |||
| 1576 | /*------------------------------------------------------------------------- | ||
| 1577 | * | ||
| 1578 | * Communications Device Class, Ethernet Control model | ||
| 1579 | * | ||
| 1580 | * Takes two interfaces. The DATA interface is inactive till an altsetting | ||
| 1581 | * is selected. Configuration data includes class descriptors. | ||
| 1582 | * | ||
| 1583 | * This should interop with whatever the 2.4 "CDCEther.c" driver | ||
| 1584 | * (by Brad Hards) talked with. | ||
| 1585 | * | ||
| 1586 | *-------------------------------------------------------------------------*/ | ||
| 1587 | |||
| 1588 | #include <linux/ctype.h> | ||
| 1589 | |||
| 1590 | static u8 nibble (unsigned char c) | 1590 | static u8 nibble (unsigned char c) |
| 1591 | { | 1591 | { |
| 1592 | if (likely (isdigit (c))) | 1592 | if (likely (isdigit (c))) |
| @@ -2765,7 +2765,7 @@ static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf) | |||
| 2765 | } | 2765 | } |
| 2766 | /* expect bcdVersion 1.0, ignore */ | 2766 | /* expect bcdVersion 1.0, ignore */ |
| 2767 | if (memcmp(&desc->bGUID, blan_guid, 16) | 2767 | if (memcmp(&desc->bGUID, blan_guid, 16) |
| 2768 | || memcmp(&desc->bGUID, blan_guid, 16) ) { | 2768 | && memcmp(&desc->bGUID, safe_guid, 16) ) { |
| 2769 | /* hey, this one might _really_ be MDLM! */ | 2769 | /* hey, this one might _really_ be MDLM! */ |
| 2770 | dev_dbg (&intf->dev, "MDLM guid\n"); | 2770 | dev_dbg (&intf->dev, "MDLM guid\n"); |
| 2771 | goto bad_desc; | 2771 | goto bad_desc; |
| @@ -2797,11 +2797,13 @@ static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf) | |||
| 2797 | * - bPad (ignored, for PADAFTER -- BLAN-only) | 2797 | * - bPad (ignored, for PADAFTER -- BLAN-only) |
| 2798 | * bits are: | 2798 | * bits are: |
| 2799 | * - 0x01 -- Zaurus framing (add CRC) | 2799 | * - 0x01 -- Zaurus framing (add CRC) |
| 2800 | * - 0x02 -- PADBEFORE | 2800 | * - 0x02 -- PADBEFORE (CRC includes some padding) |
| 2801 | * - 0x04 -- PADAFTER | 2801 | * - 0x04 -- PADAFTER (some padding after CRC) |
| 2802 | * - 0x08 -- "fermat" packet mangling (for hw bugs) | 2802 | * - 0x08 -- "fermat" packet mangling (for hw bugs) |
| 2803 | * the PADBEFORE appears not to matter; we interop | ||
| 2804 | * with devices that use it and those that don't. | ||
| 2803 | */ | 2805 | */ |
| 2804 | if (detail->bDetailData[1] != 0x01) { | 2806 | if ((detail->bDetailData[1] & ~02) != 0x01) { |
| 2805 | /* bmDataCapabilites == 0 would be fine too, | 2807 | /* bmDataCapabilites == 0 would be fine too, |
| 2806 | * but framing is minidriver-coupled for now. | 2808 | * but framing is minidriver-coupled for now. |
| 2807 | */ | 2809 | */ |
| @@ -4071,9 +4073,6 @@ static const struct usb_device_id products [] = { | |||
| 4071 | USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader | 4073 | USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader |
| 4072 | .driver_info = (unsigned long) &blob_info, | 4074 | .driver_info = (unsigned long) &blob_info, |
| 4073 | }, { | 4075 | }, { |
| 4074 | USB_DEVICE (0x22b8, 0x600c), // USBNET Motorola E680 | ||
| 4075 | .driver_info = (unsigned long) &linuxdev_info, | ||
| 4076 | }, { | ||
| 4077 | // Linux Ethernet/RNDIS gadget on pxa210/25x/26x | 4076 | // Linux Ethernet/RNDIS gadget on pxa210/25x/26x |
| 4078 | // e.g. Gumstix, current OpenZaurus, ... | 4077 | // e.g. Gumstix, current OpenZaurus, ... |
| 4079 | USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203), | 4078 | USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203), |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index bc798edf0358..9438909e87a5 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
| @@ -455,6 +455,17 @@ config USB_SERIAL_XIRCOM | |||
| 455 | To compile this driver as a module, choose M here: the | 455 | To compile this driver as a module, choose M here: the |
| 456 | module will be called keyspan_pda. | 456 | module will be called keyspan_pda. |
| 457 | 457 | ||
| 458 | config USB_SERIAL_OPTION | ||
| 459 | tristate "USB Option PCMCIA serial driver" | ||
| 460 | depends on USB_SERIAL && USB_OHCI_HCD && PCCARD | ||
| 461 | help | ||
| 462 | Say Y here if you want to use an Option card. This is a | ||
| 463 | GSM card, controlled by three serial ports which are connected | ||
| 464 | via an OHCI adapter located on a PC card. | ||
| 465 | |||
| 466 | To compile this driver as a module, choose M here: the | ||
| 467 | module will be called option. | ||
| 468 | |||
| 458 | config USB_SERIAL_OMNINET | 469 | config USB_SERIAL_OMNINET |
| 459 | tristate "USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL)" | 470 | tristate "USB ZyXEL omni.net LCD Plus Driver (EXPERIMENTAL)" |
| 460 | depends on USB_SERIAL && EXPERIMENTAL | 471 | depends on USB_SERIAL && EXPERIMENTAL |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index d56ff6d86cce..6c7cdcc99a9e 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
| @@ -32,6 +32,7 @@ obj-$(CONFIG_USB_SERIAL_KLSI) += kl5kusb105.o | |||
| 32 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o | 32 | obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o |
| 33 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o | 33 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o |
| 34 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o | 34 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o |
| 35 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o | ||
| 35 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o | 36 | obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o |
| 36 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o | 37 | obj-$(CONFIG_USB_SERIAL_SAFE) += safe_serial.o |
| 37 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o | 38 | obj-$(CONFIG_USB_SERIAL_TI) += ti_usb_3410_5052.o |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index 7e9bb63eb466..4ace9964fc6b 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
| @@ -7,6 +7,14 @@ | |||
| 7 | * modify it under the terms of the GNU General Public License version | 7 | * modify it under the terms of the GNU General Public License version |
| 8 | * 2 as published by the Free Software Foundation. | 8 | * 2 as published by the Free Software Foundation. |
| 9 | * | 9 | * |
| 10 | * Support to set flow control line levels using TIOCMGET and TIOCMSET | ||
| 11 | * thanks to Karl Hiramoto karl@hiramoto.org. RTSCTS hardware flow | ||
| 12 | * control thanks to Munir Nassar nassarmu@real-time.com | ||
| 13 | * | ||
| 14 | * Outstanding Issues: | ||
| 15 | * Buffers are not flushed when the port is opened. | ||
| 16 | * Multiple calls to write() may fail with "Resource temporarily unavailable" | ||
| 17 | * | ||
| 10 | */ | 18 | */ |
| 11 | 19 | ||
| 12 | #include <linux/config.h> | 20 | #include <linux/config.h> |
| @@ -24,7 +32,7 @@ | |||
| 24 | /* | 32 | /* |
| 25 | * Version Information | 33 | * Version Information |
| 26 | */ | 34 | */ |
| 27 | #define DRIVER_VERSION "v0.03" | 35 | #define DRIVER_VERSION "v0.04" |
| 28 | #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver" | 36 | #define DRIVER_DESC "Silicon Labs CP2101/CP2102 RS232 serial adaptor driver" |
| 29 | 37 | ||
| 30 | /* | 38 | /* |
| @@ -35,6 +43,9 @@ static void cp2101_cleanup(struct usb_serial_port*); | |||
| 35 | static void cp2101_close(struct usb_serial_port*, struct file*); | 43 | static void cp2101_close(struct usb_serial_port*, struct file*); |
| 36 | static void cp2101_get_termios(struct usb_serial_port*); | 44 | static void cp2101_get_termios(struct usb_serial_port*); |
| 37 | static void cp2101_set_termios(struct usb_serial_port*, struct termios*); | 45 | static void cp2101_set_termios(struct usb_serial_port*, struct termios*); |
| 46 | static int cp2101_tiocmget (struct usb_serial_port *, struct file *); | ||
| 47 | static int cp2101_tiocmset (struct usb_serial_port *, struct file *, | ||
| 48 | unsigned int, unsigned int); | ||
| 38 | static void cp2101_break_ctl(struct usb_serial_port*, int); | 49 | static void cp2101_break_ctl(struct usb_serial_port*, int); |
| 39 | static int cp2101_startup (struct usb_serial *); | 50 | static int cp2101_startup (struct usb_serial *); |
| 40 | static void cp2101_shutdown(struct usb_serial*); | 51 | static void cp2101_shutdown(struct usb_serial*); |
| @@ -43,9 +54,10 @@ static void cp2101_shutdown(struct usb_serial*); | |||
| 43 | static int debug; | 54 | static int debug; |
| 44 | 55 | ||
| 45 | static struct usb_device_id id_table [] = { | 56 | static struct usb_device_id id_table [] = { |
| 46 | {USB_DEVICE(0x10c4, 0xea60) }, /*Silicon labs factory default*/ | 57 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
| 47 | {USB_DEVICE(0x10ab, 0x10c5) }, /*Siemens MC60 Cable*/ | 58 | { USB_DEVICE(0x10C4, 0x80CA) }, /* Degree Controls Inc */ |
| 48 | { } /* Terminating Entry*/ | 59 | { USB_DEVICE(0x10AB, 0x10C5) }, /* Siemens MC60 Cable */ |
| 60 | { } /* Terminating Entry */ | ||
| 49 | }; | 61 | }; |
| 50 | 62 | ||
| 51 | MODULE_DEVICE_TABLE (usb, id_table); | 63 | MODULE_DEVICE_TABLE (usb, id_table); |
| @@ -70,32 +82,35 @@ static struct usb_serial_device_type cp2101_device = { | |||
| 70 | .close = cp2101_close, | 82 | .close = cp2101_close, |
| 71 | .break_ctl = cp2101_break_ctl, | 83 | .break_ctl = cp2101_break_ctl, |
| 72 | .set_termios = cp2101_set_termios, | 84 | .set_termios = cp2101_set_termios, |
| 85 | .tiocmget = cp2101_tiocmget, | ||
| 86 | .tiocmset = cp2101_tiocmset, | ||
| 73 | .attach = cp2101_startup, | 87 | .attach = cp2101_startup, |
| 74 | .shutdown = cp2101_shutdown, | 88 | .shutdown = cp2101_shutdown, |
| 75 | }; | 89 | }; |
| 76 | 90 | ||
| 77 | /*Config request types*/ | 91 | /* Config request types */ |
| 78 | #define REQTYPE_HOST_TO_DEVICE 0x41 | 92 | #define REQTYPE_HOST_TO_DEVICE 0x41 |
| 79 | #define REQTYPE_DEVICE_TO_HOST 0xc1 | 93 | #define REQTYPE_DEVICE_TO_HOST 0xc1 |
| 80 | 94 | ||
| 81 | /*Config SET requests. To GET, add 1 to the request number*/ | 95 | /* Config SET requests. To GET, add 1 to the request number */ |
| 82 | #define CP2101_UART 0x00 /*Enable / Disable*/ | 96 | #define CP2101_UART 0x00 /* Enable / Disable */ |
| 83 | #define CP2101_BAUDRATE 0x01 /*(BAUD_RATE_GEN_FREQ / baudrate)*/ | 97 | #define CP2101_BAUDRATE 0x01 /* (BAUD_RATE_GEN_FREQ / baudrate) */ |
| 84 | #define CP2101_BITS 0x03 /*0x(0)(data bits)(parity)(stop bits)*/ | 98 | #define CP2101_BITS 0x03 /* 0x(0)(databits)(parity)(stopbits) */ |
| 85 | #define CP2101_BREAK 0x05 /*On / Off*/ | 99 | #define CP2101_BREAK 0x05 /* On / Off */ |
| 86 | #define CP2101_DTRRTS 0x07 /*101 / 202 ???*/ | 100 | #define CP2101_CONTROL 0x07 /* Flow control line states */ |
| 87 | #define CP2101_CONFIG_16 0x13 /*16 bytes of config data ???*/ | 101 | #define CP2101_MODEMCTL 0x13 /* Modem controls */ |
| 88 | #define CP2101_CONFIG_6 0x19 /*6 bytes of config data ???*/ | 102 | #define CP2101_CONFIG_6 0x19 /* 6 bytes of config data ??? */ |
| 89 | 103 | ||
| 90 | /*CP2101_UART*/ | 104 | /* CP2101_UART */ |
| 91 | #define UART_ENABLE 0x0001 | 105 | #define UART_ENABLE 0x0001 |
| 92 | #define UART_DISABLE 0x0000 | 106 | #define UART_DISABLE 0x0000 |
| 93 | 107 | ||
| 94 | /*CP2101_BAUDRATE*/ | 108 | /* CP2101_BAUDRATE */ |
| 95 | #define BAUD_RATE_GEN_FREQ 0x384000 | 109 | #define BAUD_RATE_GEN_FREQ 0x384000 |
| 96 | 110 | ||
| 97 | /*CP2101_BITS*/ | 111 | /* CP2101_BITS */ |
| 98 | #define BITS_DATA_MASK 0X0f00 | 112 | #define BITS_DATA_MASK 0X0f00 |
| 113 | #define BITS_DATA_5 0X0500 | ||
| 99 | #define BITS_DATA_6 0X0600 | 114 | #define BITS_DATA_6 0X0600 |
| 100 | #define BITS_DATA_7 0X0700 | 115 | #define BITS_DATA_7 0X0700 |
| 101 | #define BITS_DATA_8 0X0800 | 116 | #define BITS_DATA_8 0X0800 |
| @@ -112,64 +127,137 @@ static struct usb_serial_device_type cp2101_device = { | |||
| 112 | #define BITS_STOP_1 0x0000 | 127 | #define BITS_STOP_1 0x0000 |
| 113 | #define BITS_STOP_1_5 0x0001 | 128 | #define BITS_STOP_1_5 0x0001 |
| 114 | #define BITS_STOP_2 0x0002 | 129 | #define BITS_STOP_2 0x0002 |
| 130 | |||
| 131 | /* CP2101_BREAK */ | ||
| 115 | #define BREAK_ON 0x0000 | 132 | #define BREAK_ON 0x0000 |
| 116 | #define BREAK_OFF 0x0001 | 133 | #define BREAK_OFF 0x0001 |
| 117 | 134 | ||
| 135 | /* CP2101_CONTROL */ | ||
| 136 | #define CONTROL_DTR 0x0001 | ||
| 137 | #define CONTROL_RTS 0x0002 | ||
| 138 | #define CONTROL_CTS 0x0010 | ||
| 139 | #define CONTROL_DSR 0x0020 | ||
| 140 | #define CONTROL_RING 0x0040 | ||
| 141 | #define CONTROL_DCD 0x0080 | ||
| 142 | #define CONTROL_WRITE_DTR 0x0100 | ||
| 143 | #define CONTROL_WRITE_RTS 0x0200 | ||
| 118 | 144 | ||
| 119 | static int cp2101_get_config(struct usb_serial_port* port, u8 request) | 145 | /* |
| 146 | * cp2101_get_config | ||
| 147 | * Reads from the CP2101 configuration registers | ||
| 148 | * 'size' is specified in bytes. | ||
| 149 | * 'data' is a pointer to a pre-allocated array of integers large | ||
| 150 | * enough to hold 'size' bytes (with 4 bytes to each integer) | ||
| 151 | */ | ||
| 152 | static int cp2101_get_config(struct usb_serial_port* port, u8 request, | ||
| 153 | unsigned int *data, int size) | ||
| 120 | { | 154 | { |
| 121 | struct usb_serial *serial = port->serial; | 155 | struct usb_serial *serial = port->serial; |
| 122 | unsigned char buf[4]; | 156 | u32 *buf; |
| 123 | unsigned int value; | 157 | int result, i, length; |
| 124 | int result, i; | 158 | |
| 159 | /* Number of integers required to contain the array */ | ||
| 160 | length = (((size - 1) | 3) + 1)/4; | ||
| 161 | |||
| 162 | buf = kmalloc (length * sizeof(u32), GFP_KERNEL); | ||
| 163 | memset(buf, 0, length * sizeof(u32)); | ||
| 164 | |||
| 165 | if (!buf) { | ||
| 166 | dev_err(&port->dev, "%s - out of memory.\n", __FUNCTION__); | ||
| 167 | return -ENOMEM; | ||
| 168 | } | ||
| 125 | 169 | ||
| 126 | /*For get requests, the request number must be incremented*/ | 170 | /* For get requests, the request number must be incremented */ |
| 127 | request++; | 171 | request++; |
| 128 | 172 | ||
| 129 | /*Issue the request, attempting to read 4 bytes*/ | 173 | /* Issue the request, attempting to read 'size' bytes */ |
| 130 | result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0), | 174 | result = usb_control_msg (serial->dev,usb_rcvctrlpipe (serial->dev, 0), |
| 131 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, | 175 | request, REQTYPE_DEVICE_TO_HOST, 0x0000, |
| 132 | 0, buf, 4, 300); | 176 | 0, buf, size, 300); |
| 133 | 177 | ||
| 134 | if (result < 0) { | 178 | /* Convert data into an array of integers */ |
| 135 | dev_err(&port->dev, "%s - Unable to send config request, " | 179 | for (i=0; i<length; i++) |
| 136 | "request=0x%x result=%d\n", | 180 | data[i] = le32_to_cpu(buf[i]); |
| 137 | __FUNCTION__, request, result); | ||
| 138 | return result; | ||
| 139 | } | ||
| 140 | 181 | ||
| 141 | /*Assemble each byte read into an integer value*/ | 182 | kfree(buf); |
| 142 | value = 0; | ||
| 143 | for (i=0; i<4 && i<result; i++) | ||
| 144 | value |= (buf[i] << (i * 8)); | ||
| 145 | 183 | ||
| 146 | dbg( " %s - request=0x%x result=%d value=0x%x", | 184 | if (result != size) { |
| 147 | __FUNCTION__, request, result, value); | 185 | dev_err(&port->dev, "%s - Unable to send config request, " |
| 186 | "request=0x%x size=%d result=%d\n", | ||
| 187 | __FUNCTION__, request, size, result); | ||
| 188 | return -EPROTO; | ||
| 189 | } | ||
| 148 | 190 | ||
| 149 | return value; | 191 | return 0; |
| 150 | } | 192 | } |
| 151 | 193 | ||
| 152 | static int cp2101_set_config(struct usb_serial_port* port, u8 request, u16 value) | 194 | /* |
| 195 | * cp2101_set_config | ||
| 196 | * Writes to the CP2101 configuration registers | ||
| 197 | * Values less than 16 bits wide are sent directly | ||
| 198 | * 'size' is specified in bytes. | ||
| 199 | */ | ||
| 200 | static int cp2101_set_config(struct usb_serial_port* port, u8 request, | ||
| 201 | unsigned int *data, int size) | ||
| 153 | { | 202 | { |
| 154 | struct usb_serial *serial = port->serial; | 203 | struct usb_serial *serial = port->serial; |
| 155 | int result; | 204 | u32 *buf; |
| 156 | result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), | 205 | int result, i, length; |
| 157 | request, REQTYPE_HOST_TO_DEVICE, value, | ||
| 158 | 0, NULL, 0, 300); | ||
| 159 | 206 | ||
| 160 | if (result <0) { | 207 | /* Number of integers required to contain the array */ |
| 161 | dev_err(&port->dev, "%s - Unable to send config request, " | 208 | length = (((size - 1) | 3) + 1)/4; |
| 162 | "request=0x%x value=0x%x result=%d\n", | 209 | |
| 163 | __FUNCTION__, request, value, result); | 210 | buf = kmalloc(length * sizeof(u32), GFP_KERNEL); |
| 164 | return result; | 211 | if (!buf) { |
| 212 | dev_err(&port->dev, "%s - out of memory.\n", | ||
| 213 | __FUNCTION__); | ||
| 214 | return -ENOMEM; | ||
| 215 | } | ||
| 216 | |||
| 217 | /* Array of integers into bytes */ | ||
| 218 | for (i = 0; i < length; i++) | ||
| 219 | buf[i] = cpu_to_le32(data[i]); | ||
| 220 | |||
| 221 | if (size > 2) { | ||
| 222 | result = usb_control_msg (serial->dev, | ||
| 223 | usb_sndctrlpipe(serial->dev, 0), | ||
| 224 | request, REQTYPE_HOST_TO_DEVICE, 0x0000, | ||
| 225 | 0, buf, size, 300); | ||
| 226 | } else { | ||
| 227 | result = usb_control_msg (serial->dev, | ||
| 228 | usb_sndctrlpipe(serial->dev, 0), | ||
| 229 | request, REQTYPE_HOST_TO_DEVICE, data[0], | ||
| 230 | 0, NULL, 0, 300); | ||
| 165 | } | 231 | } |
| 166 | 232 | ||
| 167 | dbg(" %s - request=0x%x value=0x%x result=%d", | 233 | kfree(buf); |
| 168 | __FUNCTION__, request, value, result); | 234 | |
| 235 | if ((size > 2 && result != size) || result < 0) { | ||
| 236 | dev_err(&port->dev, "%s - Unable to send request, " | ||
| 237 | "request=0x%x size=%d result=%d\n", | ||
| 238 | __FUNCTION__, request, size, result); | ||
| 239 | return -EPROTO; | ||
| 240 | } | ||
| 169 | 241 | ||
| 242 | /* Single data value */ | ||
| 243 | result = usb_control_msg (serial->dev, | ||
| 244 | usb_sndctrlpipe(serial->dev, 0), | ||
| 245 | request, REQTYPE_HOST_TO_DEVICE, data[0], | ||
| 246 | 0, NULL, 0, 300); | ||
| 170 | return 0; | 247 | return 0; |
| 171 | } | 248 | } |
| 172 | 249 | ||
| 250 | /* | ||
| 251 | * cp2101_set_config_single | ||
| 252 | * Convenience function for calling cp2101_set_config on single data values | ||
| 253 | * without requiring an integer pointer | ||
| 254 | */ | ||
| 255 | static inline int cp2101_set_config_single(struct usb_serial_port* port, | ||
| 256 | u8 request, unsigned int data) | ||
| 257 | { | ||
| 258 | return cp2101_set_config(port, request, &data, 2); | ||
| 259 | } | ||
| 260 | |||
| 173 | static int cp2101_open (struct usb_serial_port *port, struct file *filp) | 261 | static int cp2101_open (struct usb_serial_port *port, struct file *filp) |
| 174 | { | 262 | { |
| 175 | struct usb_serial *serial = port->serial; | 263 | struct usb_serial *serial = port->serial; |
| @@ -177,7 +265,7 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp) | |||
| 177 | 265 | ||
| 178 | dbg("%s - port %d", __FUNCTION__, port->number); | 266 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 179 | 267 | ||
| 180 | if (cp2101_set_config(port, CP2101_UART, UART_ENABLE)) { | 268 | if (cp2101_set_config_single(port, CP2101_UART, UART_ENABLE)) { |
| 181 | dev_err(&port->dev, "%s - Unable to enable UART\n", | 269 | dev_err(&port->dev, "%s - Unable to enable UART\n", |
| 182 | __FUNCTION__); | 270 | __FUNCTION__); |
| 183 | return -EPROTO; | 271 | return -EPROTO; |
| @@ -198,9 +286,12 @@ static int cp2101_open (struct usb_serial_port *port, struct file *filp) | |||
| 198 | return result; | 286 | return result; |
| 199 | } | 287 | } |
| 200 | 288 | ||
| 201 | /*Configure the termios structure*/ | 289 | /* Configure the termios structure */ |
| 202 | cp2101_get_termios(port); | 290 | cp2101_get_termios(port); |
| 203 | 291 | ||
| 292 | /* Set the DTR and RTS pins low */ | ||
| 293 | cp2101_tiocmset(port, NULL, TIOCM_DTR | TIOCM_RTS, 0); | ||
| 294 | |||
| 204 | return 0; | 295 | return 0; |
| 205 | } | 296 | } |
| 206 | 297 | ||
| @@ -228,16 +319,18 @@ static void cp2101_close (struct usb_serial_port *port, struct file * filp) | |||
| 228 | usb_kill_urb(port->write_urb); | 319 | usb_kill_urb(port->write_urb); |
| 229 | usb_kill_urb(port->read_urb); | 320 | usb_kill_urb(port->read_urb); |
| 230 | 321 | ||
| 231 | cp2101_set_config(port, CP2101_UART, UART_DISABLE); | 322 | cp2101_set_config_single(port, CP2101_UART, UART_DISABLE); |
| 232 | } | 323 | } |
| 233 | 324 | ||
| 234 | /* cp2101_get_termios*/ | 325 | /* |
| 235 | /* Reads the baud rate, data bits, parity and stop bits from the device*/ | 326 | * cp2101_get_termios |
| 236 | /* Corrects any unsupported values*/ | 327 | * Reads the baud rate, data bits, parity, stop bits and flow control mode |
| 237 | /* Configures the termios structure to reflect the state of the device*/ | 328 | * from the device, corrects any unsupported values, and configures the |
| 329 | * termios structure to reflect the state of the device | ||
| 330 | */ | ||
| 238 | static void cp2101_get_termios (struct usb_serial_port *port) | 331 | static void cp2101_get_termios (struct usb_serial_port *port) |
| 239 | { | 332 | { |
| 240 | unsigned int cflag; | 333 | unsigned int cflag, modem_ctl[4]; |
| 241 | int baud; | 334 | int baud; |
| 242 | int bits; | 335 | int bits; |
| 243 | 336 | ||
| @@ -249,15 +342,16 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 249 | } | 342 | } |
| 250 | cflag = port->tty->termios->c_cflag; | 343 | cflag = port->tty->termios->c_cflag; |
| 251 | 344 | ||
| 252 | baud = cp2101_get_config(port, CP2101_BAUDRATE); | 345 | cp2101_get_config(port, CP2101_BAUDRATE, &baud, 2); |
| 253 | /*Convert to baudrate*/ | 346 | /* Convert to baudrate */ |
| 254 | if (baud) | 347 | if (baud) |
| 255 | baud = BAUD_RATE_GEN_FREQ / baud; | 348 | baud = BAUD_RATE_GEN_FREQ / baud; |
| 256 | 349 | ||
| 257 | dbg("%s - baud rate = %d", __FUNCTION__, baud); | 350 | dbg("%s - baud rate = %d", __FUNCTION__, baud); |
| 258 | cflag &= ~CBAUD; | 351 | cflag &= ~CBAUD; |
| 259 | switch (baud) { | 352 | switch (baud) { |
| 260 | /* The baud rates which are commented out below | 353 | /* |
| 354 | * The baud rates which are commented out below | ||
| 261 | * appear to be supported by the device | 355 | * appear to be supported by the device |
| 262 | * but are non-standard | 356 | * but are non-standard |
| 263 | */ | 357 | */ |
| @@ -284,14 +378,18 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 284 | dbg("%s - Baud rate is not supported, " | 378 | dbg("%s - Baud rate is not supported, " |
| 285 | "using 9600 baud", __FUNCTION__); | 379 | "using 9600 baud", __FUNCTION__); |
| 286 | cflag |= B9600; | 380 | cflag |= B9600; |
| 287 | cp2101_set_config(port, CP2101_BAUDRATE, | 381 | cp2101_set_config_single(port, CP2101_BAUDRATE, |
| 288 | (BAUD_RATE_GEN_FREQ/9600)); | 382 | (BAUD_RATE_GEN_FREQ/9600)); |
| 289 | break; | 383 | break; |
| 290 | } | 384 | } |
| 291 | 385 | ||
| 292 | bits = cp2101_get_config(port, CP2101_BITS); | 386 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
| 293 | cflag &= ~CSIZE; | 387 | cflag &= ~CSIZE; |
| 294 | switch(bits & BITS_DATA_MASK) { | 388 | switch(bits & BITS_DATA_MASK) { |
| 389 | case BITS_DATA_5: | ||
| 390 | dbg("%s - data bits = 5", __FUNCTION__); | ||
| 391 | cflag |= CS5; | ||
| 392 | break; | ||
| 295 | case BITS_DATA_6: | 393 | case BITS_DATA_6: |
| 296 | dbg("%s - data bits = 6", __FUNCTION__); | 394 | dbg("%s - data bits = 6", __FUNCTION__); |
| 297 | cflag |= CS6; | 395 | cflag |= CS6; |
| @@ -310,7 +408,7 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 310 | cflag |= CS8; | 408 | cflag |= CS8; |
| 311 | bits &= ~BITS_DATA_MASK; | 409 | bits &= ~BITS_DATA_MASK; |
| 312 | bits |= BITS_DATA_8; | 410 | bits |= BITS_DATA_8; |
| 313 | cp2101_set_config(port, CP2101_BITS, bits); | 411 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 314 | break; | 412 | break; |
| 315 | default: | 413 | default: |
| 316 | dbg("%s - Unknown number of data bits, " | 414 | dbg("%s - Unknown number of data bits, " |
| @@ -318,7 +416,7 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 318 | cflag |= CS8; | 416 | cflag |= CS8; |
| 319 | bits &= ~BITS_DATA_MASK; | 417 | bits &= ~BITS_DATA_MASK; |
| 320 | bits |= BITS_DATA_8; | 418 | bits |= BITS_DATA_8; |
| 321 | cp2101_set_config(port, CP2101_BITS, bits); | 419 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 322 | break; | 420 | break; |
| 323 | } | 421 | } |
| 324 | 422 | ||
| @@ -341,21 +439,21 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 341 | "disabling parity)", __FUNCTION__); | 439 | "disabling parity)", __FUNCTION__); |
| 342 | cflag &= ~PARENB; | 440 | cflag &= ~PARENB; |
| 343 | bits &= ~BITS_PARITY_MASK; | 441 | bits &= ~BITS_PARITY_MASK; |
| 344 | cp2101_set_config(port, CP2101_BITS, bits); | 442 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 345 | break; | 443 | break; |
| 346 | case BITS_PARITY_SPACE: | 444 | case BITS_PARITY_SPACE: |
| 347 | dbg("%s - parity = SPACE (not supported, " | 445 | dbg("%s - parity = SPACE (not supported, " |
| 348 | "disabling parity)", __FUNCTION__); | 446 | "disabling parity)", __FUNCTION__); |
| 349 | cflag &= ~PARENB; | 447 | cflag &= ~PARENB; |
| 350 | bits &= ~BITS_PARITY_MASK; | 448 | bits &= ~BITS_PARITY_MASK; |
| 351 | cp2101_set_config(port, CP2101_BITS, bits); | 449 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 352 | break; | 450 | break; |
| 353 | default: | 451 | default: |
| 354 | dbg("%s - Unknown parity mode, " | 452 | dbg("%s - Unknown parity mode, " |
| 355 | "disabling parity", __FUNCTION__); | 453 | "disabling parity", __FUNCTION__); |
| 356 | cflag &= ~PARENB; | 454 | cflag &= ~PARENB; |
| 357 | bits &= ~BITS_PARITY_MASK; | 455 | bits &= ~BITS_PARITY_MASK; |
| 358 | cp2101_set_config(port, CP2101_BITS, bits); | 456 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 359 | break; | 457 | break; |
| 360 | } | 458 | } |
| 361 | 459 | ||
| @@ -366,9 +464,9 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 366 | break; | 464 | break; |
| 367 | case BITS_STOP_1_5: | 465 | case BITS_STOP_1_5: |
| 368 | dbg("%s - stop bits = 1.5 (not supported, " | 466 | dbg("%s - stop bits = 1.5 (not supported, " |
| 369 | "using 1 stop bit", __FUNCTION__); | 467 | "using 1 stop bit)", __FUNCTION__); |
| 370 | bits &= ~BITS_STOP_MASK; | 468 | bits &= ~BITS_STOP_MASK; |
| 371 | cp2101_set_config(port, CP2101_BITS, bits); | 469 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 372 | break; | 470 | break; |
| 373 | case BITS_STOP_2: | 471 | case BITS_STOP_2: |
| 374 | dbg("%s - stop bits = 2", __FUNCTION__); | 472 | dbg("%s - stop bits = 2", __FUNCTION__); |
| @@ -378,10 +476,19 @@ static void cp2101_get_termios (struct usb_serial_port *port) | |||
| 378 | dbg("%s - Unknown number of stop bits, " | 476 | dbg("%s - Unknown number of stop bits, " |
| 379 | "using 1 stop bit", __FUNCTION__); | 477 | "using 1 stop bit", __FUNCTION__); |
| 380 | bits &= ~BITS_STOP_MASK; | 478 | bits &= ~BITS_STOP_MASK; |
| 381 | cp2101_set_config(port, CP2101_BITS, bits); | 479 | cp2101_set_config(port, CP2101_BITS, &bits, 2); |
| 382 | break; | 480 | break; |
| 383 | } | 481 | } |
| 384 | 482 | ||
| 483 | cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); | ||
| 484 | if (modem_ctl[0] & 0x0008) { | ||
| 485 | dbg("%s - flow control = CRTSCTS", __FUNCTION__); | ||
| 486 | cflag |= CRTSCTS; | ||
| 487 | } else { | ||
| 488 | dbg("%s - flow control = NONE", __FUNCTION__); | ||
| 489 | cflag &= ~CRTSCTS; | ||
| 490 | } | ||
| 491 | |||
| 385 | port->tty->termios->c_cflag = cflag; | 492 | port->tty->termios->c_cflag = cflag; |
| 386 | } | 493 | } |
| 387 | 494 | ||
| @@ -389,8 +496,8 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 389 | struct termios *old_termios) | 496 | struct termios *old_termios) |
| 390 | { | 497 | { |
| 391 | unsigned int cflag, old_cflag=0; | 498 | unsigned int cflag, old_cflag=0; |
| 392 | int baud=0; | 499 | int baud=0, bits; |
| 393 | int bits; | 500 | unsigned int modem_ctl[4]; |
| 394 | 501 | ||
| 395 | dbg("%s - port %d", __FUNCTION__, port->number); | 502 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 396 | 503 | ||
| @@ -400,7 +507,7 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 400 | } | 507 | } |
| 401 | cflag = port->tty->termios->c_cflag; | 508 | cflag = port->tty->termios->c_cflag; |
| 402 | 509 | ||
| 403 | /* check that they really want us to change something */ | 510 | /* Check that they really want us to change something */ |
| 404 | if (old_termios) { | 511 | if (old_termios) { |
| 405 | if ((cflag == old_termios->c_cflag) && | 512 | if ((cflag == old_termios->c_cflag) && |
| 406 | (RELEVANT_IFLAG(port->tty->termios->c_iflag) | 513 | (RELEVANT_IFLAG(port->tty->termios->c_iflag) |
| @@ -415,7 +522,8 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 415 | /* If the baud rate is to be updated*/ | 522 | /* If the baud rate is to be updated*/ |
| 416 | if ((cflag & CBAUD) != (old_cflag & CBAUD)) { | 523 | if ((cflag & CBAUD) != (old_cflag & CBAUD)) { |
| 417 | switch (cflag & CBAUD) { | 524 | switch (cflag & CBAUD) { |
| 418 | /* The baud rates which are commented out below | 525 | /* |
| 526 | * The baud rates which are commented out below | ||
| 419 | * appear to be supported by the device | 527 | * appear to be supported by the device |
| 420 | * but are non-standard | 528 | * but are non-standard |
| 421 | */ | 529 | */ |
| @@ -448,18 +556,22 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 448 | if (baud) { | 556 | if (baud) { |
| 449 | dbg("%s - Setting baud rate to %d baud", __FUNCTION__, | 557 | dbg("%s - Setting baud rate to %d baud", __FUNCTION__, |
| 450 | baud); | 558 | baud); |
| 451 | if (cp2101_set_config(port, CP2101_BAUDRATE, | 559 | if (cp2101_set_config_single(port, CP2101_BAUDRATE, |
| 452 | (BAUD_RATE_GEN_FREQ / baud))) | 560 | (BAUD_RATE_GEN_FREQ / baud))) |
| 453 | dev_err(&port->dev, "Baud rate requested not " | 561 | dev_err(&port->dev, "Baud rate requested not " |
| 454 | "supported by device\n"); | 562 | "supported by device\n"); |
| 455 | } | 563 | } |
| 456 | } | 564 | } |
| 457 | 565 | ||
| 458 | /*If the number of data bits is to be updated*/ | 566 | /* If the number of data bits is to be updated */ |
| 459 | if ((cflag & CSIZE) != (old_cflag & CSIZE)) { | 567 | if ((cflag & CSIZE) != (old_cflag & CSIZE)) { |
| 460 | bits = cp2101_get_config(port, CP2101_BITS); | 568 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
| 461 | bits &= ~BITS_DATA_MASK; | 569 | bits &= ~BITS_DATA_MASK; |
| 462 | switch (cflag & CSIZE) { | 570 | switch (cflag & CSIZE) { |
| 571 | case CS5: | ||
| 572 | bits |= BITS_DATA_5; | ||
| 573 | dbg("%s - data bits = 5", __FUNCTION__); | ||
| 574 | break; | ||
| 463 | case CS6: | 575 | case CS6: |
| 464 | bits |= BITS_DATA_6; | 576 | bits |= BITS_DATA_6; |
| 465 | dbg("%s - data bits = 6", __FUNCTION__); | 577 | dbg("%s - data bits = 6", __FUNCTION__); |
| @@ -483,13 +595,13 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 483 | bits |= BITS_DATA_8; | 595 | bits |= BITS_DATA_8; |
| 484 | break; | 596 | break; |
| 485 | } | 597 | } |
| 486 | if (cp2101_set_config(port, CP2101_BITS, bits)) | 598 | if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) |
| 487 | dev_err(&port->dev, "Number of data bits requested " | 599 | dev_err(&port->dev, "Number of data bits requested " |
| 488 | "not supported by device\n"); | 600 | "not supported by device\n"); |
| 489 | } | 601 | } |
| 490 | 602 | ||
| 491 | if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) { | 603 | if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))) { |
| 492 | bits = cp2101_get_config(port, CP2101_BITS); | 604 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
| 493 | bits &= ~BITS_PARITY_MASK; | 605 | bits &= ~BITS_PARITY_MASK; |
| 494 | if (cflag & PARENB) { | 606 | if (cflag & PARENB) { |
| 495 | if (cflag & PARODD) { | 607 | if (cflag & PARODD) { |
| @@ -500,13 +612,13 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 500 | dbg("%s - parity = EVEN", __FUNCTION__); | 612 | dbg("%s - parity = EVEN", __FUNCTION__); |
| 501 | } | 613 | } |
| 502 | } | 614 | } |
| 503 | if (cp2101_set_config(port, CP2101_BITS, bits)) | 615 | if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) |
| 504 | dev_err(&port->dev, "Parity mode not supported " | 616 | dev_err(&port->dev, "Parity mode not supported " |
| 505 | "by device\n"); | 617 | "by device\n"); |
| 506 | } | 618 | } |
| 507 | 619 | ||
| 508 | if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) { | 620 | if ((cflag & CSTOPB) != (old_cflag & CSTOPB)) { |
| 509 | bits = cp2101_get_config(port, CP2101_BITS); | 621 | cp2101_get_config(port, CP2101_BITS, &bits, 2); |
| 510 | bits &= ~BITS_STOP_MASK; | 622 | bits &= ~BITS_STOP_MASK; |
| 511 | if (cflag & CSTOPB) { | 623 | if (cflag & CSTOPB) { |
| 512 | bits |= BITS_STOP_2; | 624 | bits |= BITS_STOP_2; |
| @@ -515,15 +627,90 @@ static void cp2101_set_termios (struct usb_serial_port *port, | |||
| 515 | bits |= BITS_STOP_1; | 627 | bits |= BITS_STOP_1; |
| 516 | dbg("%s - stop bits = 1", __FUNCTION__); | 628 | dbg("%s - stop bits = 1", __FUNCTION__); |
| 517 | } | 629 | } |
| 518 | if (cp2101_set_config(port, CP2101_BITS, bits)) | 630 | if (cp2101_set_config(port, CP2101_BITS, &bits, 2)) |
| 519 | dev_err(&port->dev, "Number of stop bits requested " | 631 | dev_err(&port->dev, "Number of stop bits requested " |
| 520 | "not supported by device\n"); | 632 | "not supported by device\n"); |
| 521 | } | 633 | } |
| 634 | |||
| 635 | if ((cflag & CRTSCTS) != (old_cflag & CRTSCTS)) { | ||
| 636 | cp2101_get_config(port, CP2101_MODEMCTL, modem_ctl, 16); | ||
| 637 | dbg("%s - read modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x", | ||
| 638 | __FUNCTION__, modem_ctl[0], modem_ctl[1], | ||
| 639 | modem_ctl[2], modem_ctl[3]); | ||
| 640 | |||
| 641 | if (cflag & CRTSCTS) { | ||
| 642 | modem_ctl[0] &= ~0x7B; | ||
| 643 | modem_ctl[0] |= 0x09; | ||
| 644 | modem_ctl[1] = 0x80; | ||
| 645 | dbg("%s - flow control = CRTSCTS", __FUNCTION__); | ||
| 646 | } else { | ||
| 647 | modem_ctl[0] &= ~0x7B; | ||
| 648 | modem_ctl[0] |= 0x01; | ||
| 649 | modem_ctl[1] |= 0x40; | ||
| 650 | dbg("%s - flow control = NONE", __FUNCTION__); | ||
| 651 | } | ||
| 652 | |||
| 653 | dbg("%s - write modem controls = 0x%.4x 0x%.4x 0x%.4x 0x%.4x", | ||
| 654 | __FUNCTION__, modem_ctl[0], modem_ctl[1], | ||
| 655 | modem_ctl[2], modem_ctl[3]); | ||
| 656 | cp2101_set_config(port, CP2101_MODEMCTL, modem_ctl, 16); | ||
| 657 | } | ||
| 658 | |||
| 659 | } | ||
| 660 | |||
| 661 | static int cp2101_tiocmset (struct usb_serial_port *port, struct file *file, | ||
| 662 | unsigned int set, unsigned int clear) | ||
| 663 | { | ||
| 664 | int control = 0; | ||
| 665 | |||
| 666 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
| 667 | |||
| 668 | if (set & TIOCM_RTS) { | ||
| 669 | control |= CONTROL_RTS; | ||
| 670 | control |= CONTROL_WRITE_RTS; | ||
| 671 | } | ||
| 672 | if (set & TIOCM_DTR) { | ||
| 673 | control |= CONTROL_DTR; | ||
| 674 | control |= CONTROL_WRITE_DTR; | ||
| 675 | } | ||
| 676 | if (clear & TIOCM_RTS) { | ||
| 677 | control &= ~CONTROL_RTS; | ||
| 678 | control |= CONTROL_WRITE_RTS; | ||
| 679 | } | ||
| 680 | if (clear & TIOCM_DTR) { | ||
| 681 | control &= ~CONTROL_DTR; | ||
| 682 | control |= CONTROL_WRITE_DTR; | ||
| 683 | } | ||
| 684 | |||
| 685 | dbg("%s - control = 0x%.4x", __FUNCTION__, control); | ||
| 686 | |||
| 687 | return cp2101_set_config(port, CP2101_CONTROL, &control, 2); | ||
| 688 | |||
| 689 | } | ||
| 690 | |||
| 691 | static int cp2101_tiocmget (struct usb_serial_port *port, struct file *file) | ||
| 692 | { | ||
| 693 | int control, result; | ||
| 694 | |||
| 695 | dbg("%s - port %d", __FUNCTION__, port->number); | ||
| 696 | |||
| 697 | cp2101_get_config(port, CP2101_CONTROL, &control, 1); | ||
| 698 | |||
| 699 | result = ((control & CONTROL_DTR) ? TIOCM_DTR : 0) | ||
| 700 | |((control & CONTROL_RTS) ? TIOCM_RTS : 0) | ||
| 701 | |((control & CONTROL_CTS) ? TIOCM_CTS : 0) | ||
| 702 | |((control & CONTROL_DSR) ? TIOCM_DSR : 0) | ||
| 703 | |((control & CONTROL_RING)? TIOCM_RI : 0) | ||
| 704 | |((control & CONTROL_DCD) ? TIOCM_CD : 0); | ||
| 705 | |||
| 706 | dbg("%s - control = 0x%.2x", __FUNCTION__, control); | ||
| 707 | |||
| 708 | return result; | ||
| 522 | } | 709 | } |
| 523 | 710 | ||
| 524 | static void cp2101_break_ctl (struct usb_serial_port *port, int break_state) | 711 | static void cp2101_break_ctl (struct usb_serial_port *port, int break_state) |
| 525 | { | 712 | { |
| 526 | u16 state; | 713 | int state; |
| 527 | 714 | ||
| 528 | dbg("%s - port %d", __FUNCTION__, port->number); | 715 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 529 | if (break_state == 0) | 716 | if (break_state == 0) |
| @@ -532,12 +719,12 @@ static void cp2101_break_ctl (struct usb_serial_port *port, int break_state) | |||
| 532 | state = BREAK_ON; | 719 | state = BREAK_ON; |
| 533 | dbg("%s - turning break %s", __FUNCTION__, | 720 | dbg("%s - turning break %s", __FUNCTION__, |
| 534 | state==BREAK_OFF ? "off" : "on"); | 721 | state==BREAK_OFF ? "off" : "on"); |
| 535 | cp2101_set_config(port, CP2101_BREAK, state); | 722 | cp2101_set_config(port, CP2101_BREAK, &state, 2); |
| 536 | } | 723 | } |
| 537 | 724 | ||
| 538 | static int cp2101_startup (struct usb_serial *serial) | 725 | static int cp2101_startup (struct usb_serial *serial) |
| 539 | { | 726 | { |
| 540 | /*CP2101 buffers behave strangely unless device is reset*/ | 727 | /* CP2101 buffers behave strangely unless device is reset */ |
| 541 | usb_reset_device(serial->dev); | 728 | usb_reset_device(serial->dev); |
| 542 | return 0; | 729 | return 0; |
| 543 | } | 730 | } |
| @@ -548,7 +735,7 @@ static void cp2101_shutdown (struct usb_serial *serial) | |||
| 548 | 735 | ||
| 549 | dbg("%s", __FUNCTION__); | 736 | dbg("%s", __FUNCTION__); |
| 550 | 737 | ||
| 551 | /* stop reads and writes on all ports */ | 738 | /* Stop reads and writes on all ports */ |
| 552 | for (i=0; i < serial->num_ports; ++i) { | 739 | for (i=0; i < serial->num_ports; ++i) { |
| 553 | cp2101_cleanup(serial->port[i]); | 740 | cp2101_cleanup(serial->port[i]); |
| 554 | } | 741 | } |
| @@ -560,16 +747,16 @@ static int __init cp2101_init (void) | |||
| 560 | 747 | ||
| 561 | retval = usb_serial_register(&cp2101_device); | 748 | retval = usb_serial_register(&cp2101_device); |
| 562 | if (retval) | 749 | if (retval) |
| 563 | return retval; /*Failed to register*/ | 750 | return retval; /* Failed to register */ |
| 564 | 751 | ||
| 565 | retval = usb_register(&cp2101_driver); | 752 | retval = usb_register(&cp2101_driver); |
| 566 | if (retval) { | 753 | if (retval) { |
| 567 | /*Failed to register*/ | 754 | /* Failed to register */ |
| 568 | usb_serial_deregister(&cp2101_device); | 755 | usb_serial_deregister(&cp2101_device); |
| 569 | return retval; | 756 | return retval; |
| 570 | } | 757 | } |
| 571 | 758 | ||
| 572 | /*Success*/ | 759 | /* Success */ |
| 573 | info(DRIVER_DESC " " DRIVER_VERSION); | 760 | info(DRIVER_DESC " " DRIVER_VERSION); |
| 574 | return 0; | 761 | return 0; |
| 575 | } | 762 | } |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index f34a9bb6a219..012e63e05806 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -89,6 +89,7 @@ static int interval; | |||
| 89 | 89 | ||
| 90 | static struct usb_device_id id_table_earthmate [] = { | 90 | static struct usb_device_id id_table_earthmate [] = { |
| 91 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, | 91 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, |
| 92 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | ||
| 92 | { } /* Terminating entry */ | 93 | { } /* Terminating entry */ |
| 93 | }; | 94 | }; |
| 94 | 95 | ||
| @@ -99,6 +100,7 @@ static struct usb_device_id id_table_cyphidcomrs232 [] = { | |||
| 99 | 100 | ||
| 100 | static struct usb_device_id id_table_combined [] = { | 101 | static struct usb_device_id id_table_combined [] = { |
| 101 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, | 102 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB) }, |
| 103 | { USB_DEVICE(VENDOR_ID_DELORME, PRODUCT_ID_EARTHMATEUSB_LT20) }, | ||
| 102 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, | 104 | { USB_DEVICE(VENDOR_ID_CYPRESS, PRODUCT_ID_CYPHIDCOM) }, |
| 103 | { } /* Terminating entry */ | 105 | { } /* Terminating entry */ |
| 104 | }; | 106 | }; |
diff --git a/drivers/usb/serial/cypress_m8.h b/drivers/usb/serial/cypress_m8.h index 1012ee6b19ce..1fa119efe41a 100644 --- a/drivers/usb/serial/cypress_m8.h +++ b/drivers/usb/serial/cypress_m8.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | /* DeLorme Earthmate USB - a GPS device */ | 13 | /* DeLorme Earthmate USB - a GPS device */ |
| 14 | #define VENDOR_ID_DELORME 0x1163 | 14 | #define VENDOR_ID_DELORME 0x1163 |
| 15 | #define PRODUCT_ID_EARTHMATEUSB 0x0100 | 15 | #define PRODUCT_ID_EARTHMATEUSB 0x0100 |
| 16 | #define PRODUCT_ID_EARTHMATEUSB_LT20 0x0200 | ||
| 16 | 17 | ||
| 17 | /* Cypress HID->COM RS232 Adapter */ | 18 | /* Cypress HID->COM RS232 Adapter */ |
| 18 | #define VENDOR_ID_CYPRESS 0x04b4 | 19 | #define VENDOR_ID_CYPRESS 0x04b4 |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 52394f08a947..051c3a77b41b 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -364,6 +364,7 @@ static struct usb_device_id id_table_8U232AM [] = { | |||
| 364 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) }, | 364 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_3, 0, 0x3ff) }, |
| 365 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) }, | 365 | { USB_DEVICE_VER(FTDI_VID, PROTEGO_SPECIAL_4, 0, 0x3ff) }, |
| 366 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) }, | 366 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0, 0x3ff) }, |
| 367 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0, 0x3ff) }, | ||
| 367 | { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) }, | 368 | { USB_DEVICE_VER(FTDI_VID, INSIDE_ACCESSO, 0, 0x3ff) }, |
| 368 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0, 0x3ff) }, | 369 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_VALUECAN_PID, 0, 0x3ff) }, |
| 369 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) }, | 370 | { USB_DEVICE_VER(INTREPID_VID, INTREPID_NEOVI_PID, 0, 0x3ff) }, |
| @@ -475,6 +476,7 @@ static struct usb_device_id id_table_FT232BM [] = { | |||
| 475 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, | 476 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, |
| 476 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, | 477 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, |
| 477 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) }, | 478 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UO100_PID, 0x400, 0xffff) }, |
| 479 | { USB_DEVICE_VER(FTDI_VID, FTDI_ELV_UM100_PID, 0x400, 0xffff) }, | ||
| 478 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, | 480 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, |
| 479 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, | 481 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, |
| 480 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, | 482 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, |
| @@ -618,6 +620,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 618 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, | 620 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88E_PID, 0x400, 0xffff) }, |
| 619 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, | 621 | { USB_DEVICE_VER(FTDI_VID, FTDI_GUDEADS_E88F_PID, 0x400, 0xffff) }, |
| 620 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, | 622 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, |
| 623 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, | ||
| 621 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, | 624 | { USB_DEVICE_VER(FTDI_VID, LINX_SDMUSBQSS_PID, 0x400, 0xffff) }, |
| 622 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, | 625 | { USB_DEVICE_VER(FTDI_VID, LINX_MASTERDEVEL2_PID, 0x400, 0xffff) }, |
| 623 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, | 626 | { USB_DEVICE_VER(FTDI_VID, LINX_FUTURE_0_PID, 0x400, 0xffff) }, |
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index a52bb13a9ce4..8866376823a5 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -144,6 +144,8 @@ | |||
| 144 | 144 | ||
| 145 | /* ELV USB Module UO100 (PID sent by Stefan Frings) */ | 145 | /* ELV USB Module UO100 (PID sent by Stefan Frings) */ |
| 146 | #define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */ | 146 | #define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */ |
| 147 | /* ELV USB Module UM100 (PID sent by Arnim Laeuger) */ | ||
| 148 | #define FTDI_ELV_UM100_PID 0xFB5A /* Product Id */ | ||
| 147 | 149 | ||
| 148 | /* | 150 | /* |
| 149 | * Definitions for ID TECH (www.idt-net.com) devices | 151 | * Definitions for ID TECH (www.idt-net.com) devices |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c new file mode 100644 index 000000000000..b722175f108f --- /dev/null +++ b/drivers/usb/serial/option.c | |||
| @@ -0,0 +1,729 @@ | |||
| 1 | /* | ||
| 2 | Option Card (PCMCIA to) USB to Serial Driver | ||
| 3 | |||
| 4 | Copyright (C) 2005 Matthias Urlichs <smurf@smurf.noris.de> | ||
| 5 | |||
| 6 | This driver is free software; you can redistribute it and/or modify | ||
| 7 | it under the terms of Version 2 of the GNU General Public License as | ||
| 8 | published by the Free Software Foundation. | ||
| 9 | |||
| 10 | Portions copied from the Keyspan driver by Hugh Blemings <hugh@blemings.org> | ||
| 11 | |||
| 12 | History: | ||
| 13 | |||
| 14 | 2005-05-19 v0.1 Initial version, based on incomplete docs | ||
| 15 | and analysis of misbehavior of the standard driver | ||
| 16 | 2005-05-20 v0.2 Extended the input buffer to avoid losing | ||
| 17 | random 64-byte chunks of data | ||
| 18 | 2005-05-21 v0.3 implemented chars_in_buffer() | ||
| 19 | turned on low_latency | ||
| 20 | simplified the code somewhat | ||
| 21 | */ | ||
| 22 | #define DRIVER_VERSION "v0.3" | ||
| 23 | #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>" | ||
| 24 | #define DRIVER_DESC "Option Card (PC-Card to) USB to Serial Driver" | ||
| 25 | |||
| 26 | #include <linux/config.h> | ||
| 27 | #include <linux/kernel.h> | ||
| 28 | #include <linux/jiffies.h> | ||
| 29 | #include <linux/errno.h> | ||
| 30 | #include <linux/tty.h> | ||
| 31 | #include <linux/tty_flip.h> | ||
| 32 | #include <linux/module.h> | ||
| 33 | #include <linux/usb.h> | ||
| 34 | #include "usb-serial.h" | ||
| 35 | |||
| 36 | /* Function prototypes */ | ||
| 37 | static int option_open (struct usb_serial_port *port, struct file *filp); | ||
| 38 | static void option_close (struct usb_serial_port *port, struct file *filp); | ||
| 39 | static int option_startup (struct usb_serial *serial); | ||
| 40 | static void option_shutdown (struct usb_serial *serial); | ||
| 41 | static void option_rx_throttle (struct usb_serial_port *port); | ||
| 42 | static void option_rx_unthrottle (struct usb_serial_port *port); | ||
| 43 | static int option_write_room (struct usb_serial_port *port); | ||
| 44 | |||
| 45 | static void option_instat_callback(struct urb *urb, struct pt_regs *regs); | ||
| 46 | |||
| 47 | |||
| 48 | static int option_write (struct usb_serial_port *port, | ||
| 49 | const unsigned char *buf, int count); | ||
| 50 | |||
| 51 | static int option_chars_in_buffer (struct usb_serial_port *port); | ||
| 52 | static int option_ioctl (struct usb_serial_port *port, struct file *file, | ||
| 53 | unsigned int cmd, unsigned long arg); | ||
| 54 | static void option_set_termios (struct usb_serial_port *port, | ||
| 55 | struct termios *old); | ||
| 56 | static void option_break_ctl (struct usb_serial_port *port, int break_state); | ||
| 57 | static int option_tiocmget (struct usb_serial_port *port, struct file *file); | ||
| 58 | static int option_tiocmset (struct usb_serial_port *port, struct file *file, | ||
| 59 | unsigned int set, unsigned int clear); | ||
| 60 | static int option_send_setup (struct usb_serial_port *port); | ||
| 61 | |||
| 62 | /* Vendor and product IDs */ | ||
| 63 | #define OPTION_VENDOR_ID 0x0AF0 | ||
| 64 | |||
| 65 | #define OPTION_PRODUCT_OLD 0x5000 | ||
| 66 | #define OPTION_PRODUCT_WLAN 0x6000 | ||
| 67 | |||
| 68 | static struct usb_device_id option_ids[] = { | ||
| 69 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, | ||
| 70 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_WLAN) }, | ||
| 71 | { } /* Terminating entry */ | ||
| 72 | }; | ||
| 73 | |||
| 74 | MODULE_DEVICE_TABLE(usb, option_ids); | ||
| 75 | |||
| 76 | static struct usb_driver option_driver = { | ||
| 77 | .owner = THIS_MODULE, | ||
| 78 | .name = "option", | ||
| 79 | .probe = usb_serial_probe, | ||
| 80 | .disconnect = usb_serial_disconnect, | ||
| 81 | .id_table = option_ids, | ||
| 82 | }; | ||
| 83 | |||
| 84 | /* The card has three separate interfaces, wich the serial driver | ||
| 85 | * recognizes separately, thus num_port=1. | ||
| 86 | */ | ||
| 87 | static struct usb_serial_device_type option_3port_device = { | ||
| 88 | .owner = THIS_MODULE, | ||
| 89 | .name = "Option 3-port card", | ||
| 90 | .short_name = "option", | ||
| 91 | .id_table = option_ids, | ||
| 92 | .num_interrupt_in = NUM_DONT_CARE, | ||
| 93 | .num_bulk_in = NUM_DONT_CARE, | ||
| 94 | .num_bulk_out = NUM_DONT_CARE, | ||
| 95 | .num_ports = 1, /* 3 */ | ||
| 96 | .open = option_open, | ||
| 97 | .close = option_close, | ||
| 98 | .write = option_write, | ||
| 99 | .write_room = option_write_room, | ||
| 100 | .chars_in_buffer = option_chars_in_buffer, | ||
| 101 | .throttle = option_rx_throttle, | ||
| 102 | .unthrottle = option_rx_unthrottle, | ||
| 103 | .ioctl = option_ioctl, | ||
| 104 | .set_termios = option_set_termios, | ||
| 105 | .break_ctl = option_break_ctl, | ||
| 106 | .tiocmget = option_tiocmget, | ||
| 107 | .tiocmset = option_tiocmset, | ||
| 108 | .attach = option_startup, | ||
| 109 | .shutdown = option_shutdown, | ||
| 110 | .read_int_callback = option_instat_callback, | ||
| 111 | }; | ||
| 112 | |||
| 113 | static int debug; | ||
| 114 | |||
| 115 | /* per port private data */ | ||
| 116 | |||
| 117 | #define N_IN_URB 4 | ||
| 118 | #define N_OUT_URB 1 | ||
| 119 | #define IN_BUFLEN 1024 | ||
| 120 | #define OUT_BUFLEN 1024 | ||
| 121 | |||
| 122 | struct option_port_private { | ||
| 123 | /* Input endpoints and buffer for this port */ | ||
| 124 | struct urb *in_urbs[N_IN_URB]; | ||
| 125 | char in_buffer[N_IN_URB][IN_BUFLEN]; | ||
| 126 | /* Output endpoints and buffer for this port */ | ||
| 127 | struct urb *out_urbs[N_OUT_URB]; | ||
| 128 | char out_buffer[N_OUT_URB][OUT_BUFLEN]; | ||
| 129 | |||
| 130 | /* Settings for the port */ | ||
| 131 | int rts_state; /* Handshaking pins (outputs) */ | ||
| 132 | int dtr_state; | ||
| 133 | int cts_state; /* Handshaking pins (inputs) */ | ||
| 134 | int dsr_state; | ||
| 135 | int dcd_state; | ||
| 136 | int ri_state; | ||
| 137 | // int break_on; | ||
| 138 | |||
| 139 | unsigned long tx_start_time[N_OUT_URB]; | ||
| 140 | }; | ||
| 141 | |||
| 142 | |||
| 143 | /* Functions used by new usb-serial code. */ | ||
| 144 | static int __init | ||
| 145 | option_init (void) | ||
| 146 | { | ||
| 147 | int retval; | ||
| 148 | retval = usb_serial_register(&option_3port_device); | ||
| 149 | if (retval) | ||
| 150 | goto failed_3port_device_register; | ||
| 151 | retval = usb_register(&option_driver); | ||
| 152 | if (retval) | ||
| 153 | goto failed_driver_register; | ||
| 154 | |||
| 155 | info(DRIVER_DESC ": " DRIVER_VERSION); | ||
| 156 | |||
| 157 | return 0; | ||
| 158 | |||
| 159 | failed_driver_register: | ||
| 160 | usb_serial_deregister (&option_3port_device); | ||
| 161 | failed_3port_device_register: | ||
| 162 | return retval; | ||
| 163 | } | ||
| 164 | |||
| 165 | static void __exit | ||
| 166 | option_exit (void) | ||
| 167 | { | ||
| 168 | usb_deregister (&option_driver); | ||
| 169 | usb_serial_deregister (&option_3port_device); | ||
| 170 | } | ||
| 171 | |||
| 172 | module_init(option_init); | ||
| 173 | module_exit(option_exit); | ||
| 174 | |||
| 175 | static void | ||
| 176 | option_rx_throttle (struct usb_serial_port *port) | ||
| 177 | { | ||
| 178 | dbg("%s", __FUNCTION__); | ||
| 179 | } | ||
| 180 | |||
| 181 | |||
| 182 | static void | ||
| 183 | option_rx_unthrottle (struct usb_serial_port *port) | ||
| 184 | { | ||
| 185 | dbg("%s", __FUNCTION__); | ||
| 186 | } | ||
| 187 | |||
| 188 | |||
| 189 | static void | ||
| 190 | option_break_ctl (struct usb_serial_port *port, int break_state) | ||
| 191 | { | ||
| 192 | /* Unfortunately, I don't know how to send a break */ | ||
| 193 | dbg("%s", __FUNCTION__); | ||
| 194 | } | ||
| 195 | |||
| 196 | |||
| 197 | static void | ||
| 198 | option_set_termios (struct usb_serial_port *port, | ||
| 199 | struct termios *old_termios) | ||
| 200 | { | ||
| 201 | dbg("%s", __FUNCTION__); | ||
| 202 | |||
| 203 | option_send_setup(port); | ||
| 204 | } | ||
| 205 | |||
| 206 | static int | ||
| 207 | option_tiocmget(struct usb_serial_port *port, struct file *file) | ||
| 208 | { | ||
| 209 | unsigned int value; | ||
| 210 | struct option_port_private *portdata; | ||
| 211 | |||
| 212 | portdata = usb_get_serial_port_data(port); | ||
| 213 | |||
| 214 | value = ((portdata->rts_state) ? TIOCM_RTS : 0) | | ||
| 215 | ((portdata->dtr_state) ? TIOCM_DTR : 0) | | ||
| 216 | ((portdata->cts_state) ? TIOCM_CTS : 0) | | ||
| 217 | ((portdata->dsr_state) ? TIOCM_DSR : 0) | | ||
| 218 | ((portdata->dcd_state) ? TIOCM_CAR : 0) | | ||
| 219 | ((portdata->ri_state) ? TIOCM_RNG : 0); | ||
| 220 | |||
| 221 | return value; | ||
| 222 | } | ||
| 223 | |||
| 224 | static int | ||
| 225 | option_tiocmset (struct usb_serial_port *port, struct file *file, | ||
| 226 | unsigned int set, unsigned int clear) | ||
| 227 | { | ||
| 228 | struct option_port_private *portdata; | ||
| 229 | |||
| 230 | portdata = usb_get_serial_port_data(port); | ||
| 231 | |||
| 232 | if (set & TIOCM_RTS) | ||
| 233 | portdata->rts_state = 1; | ||
| 234 | if (set & TIOCM_DTR) | ||
| 235 | portdata->dtr_state = 1; | ||
| 236 | |||
| 237 | if (clear & TIOCM_RTS) | ||
| 238 | portdata->rts_state = 0; | ||
| 239 | if (clear & TIOCM_DTR) | ||
| 240 | portdata->dtr_state = 0; | ||
| 241 | return option_send_setup(port); | ||
| 242 | } | ||
| 243 | |||
| 244 | static int | ||
| 245 | option_ioctl (struct usb_serial_port *port, struct file *file, | ||
| 246 | unsigned int cmd, unsigned long arg) | ||
| 247 | { | ||
| 248 | return -ENOIOCTLCMD; | ||
| 249 | } | ||
| 250 | |||
| 251 | /* Write */ | ||
| 252 | static int | ||
| 253 | option_write(struct usb_serial_port *port, | ||
| 254 | const unsigned char *buf, int count) | ||
| 255 | { | ||
| 256 | struct option_port_private *portdata; | ||
| 257 | int i; | ||
| 258 | int left, todo; | ||
| 259 | struct urb *this_urb = NULL; /* spurious */ | ||
| 260 | int err; | ||
| 261 | |||
| 262 | portdata = usb_get_serial_port_data(port); | ||
| 263 | |||
| 264 | dbg("%s: write (%d chars)", __FUNCTION__, count); | ||
| 265 | |||
| 266 | #if 0 | ||
| 267 | spin_lock(&port->lock); | ||
| 268 | if (port->write_urb_busy) { | ||
| 269 | spin_unlock(&port->lock); | ||
| 270 | dbg("%s: already writing", __FUNCTION__); | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | port->write_urb_busy = 1; | ||
| 274 | spin_unlock(&port->lock); | ||
| 275 | #endif | ||
| 276 | |||
| 277 | i = 0; | ||
| 278 | left = count; | ||
| 279 | while (left>0) { | ||
| 280 | todo = left; | ||
| 281 | if (todo > OUT_BUFLEN) | ||
| 282 | todo = OUT_BUFLEN; | ||
| 283 | |||
| 284 | for (;i < N_OUT_URB; i++) { | ||
| 285 | /* Check we have a valid urb/endpoint before we use it... */ | ||
| 286 | this_urb = portdata->out_urbs[i]; | ||
| 287 | if (this_urb->status != -EINPROGRESS) | ||
| 288 | break; | ||
| 289 | if (this_urb->transfer_flags & URB_ASYNC_UNLINK) | ||
| 290 | continue; | ||
| 291 | if (time_before(jiffies, portdata->tx_start_time[i] + 10 * HZ)) | ||
| 292 | continue; | ||
| 293 | this_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 294 | usb_unlink_urb(this_urb); | ||
| 295 | } | ||
| 296 | |||
| 297 | if (i == N_OUT_URB) { | ||
| 298 | /* no bulk out free! */ | ||
| 299 | dbg("%s: no output urb -- left %d", __FUNCTION__,count-left); | ||
| 300 | #if 0 | ||
| 301 | port->write_urb_busy = 0; | ||
| 302 | #endif | ||
| 303 | return count-left; | ||
| 304 | } | ||
| 305 | |||
| 306 | dbg("%s: endpoint %d buf %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), i); | ||
| 307 | |||
| 308 | memcpy (this_urb->transfer_buffer, buf, todo); | ||
| 309 | |||
| 310 | /* send the data out the bulk port */ | ||
| 311 | this_urb->transfer_buffer_length = todo; | ||
| 312 | |||
| 313 | this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 314 | this_urb->dev = port->serial->dev; | ||
| 315 | err = usb_submit_urb(this_urb, GFP_ATOMIC); | ||
| 316 | if (err) { | ||
| 317 | dbg("usb_submit_urb %p (write bulk) failed (%d,, has %d)", this_urb, err, this_urb->status); | ||
| 318 | continue; | ||
| 319 | } | ||
| 320 | portdata->tx_start_time[i] = jiffies; | ||
| 321 | buf += todo; | ||
| 322 | left -= todo; | ||
| 323 | } | ||
| 324 | |||
| 325 | count -= left; | ||
| 326 | #if 0 | ||
| 327 | port->write_urb_busy = 0; | ||
| 328 | #endif | ||
| 329 | dbg("%s: wrote (did %d)", __FUNCTION__, count); | ||
| 330 | return count; | ||
| 331 | } | ||
| 332 | |||
| 333 | static void | ||
| 334 | option_indat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 335 | { | ||
| 336 | int i, err; | ||
| 337 | int endpoint; | ||
| 338 | struct usb_serial_port *port; | ||
| 339 | struct tty_struct *tty; | ||
| 340 | unsigned char *data = urb->transfer_buffer; | ||
| 341 | |||
| 342 | dbg("%s: %p", __FUNCTION__, urb); | ||
| 343 | |||
| 344 | endpoint = usb_pipeendpoint(urb->pipe); | ||
| 345 | port = (struct usb_serial_port *) urb->context; | ||
| 346 | |||
| 347 | if (urb->status) { | ||
| 348 | dbg("%s: nonzero status: %d on endpoint %02x.", | ||
| 349 | __FUNCTION__, urb->status, endpoint); | ||
| 350 | } else { | ||
| 351 | tty = port->tty; | ||
| 352 | if (urb->actual_length) { | ||
| 353 | for (i = 0; i < urb->actual_length ; ++i) { | ||
| 354 | if (tty->flip.count >= TTY_FLIPBUF_SIZE) | ||
| 355 | tty_flip_buffer_push(tty); | ||
| 356 | tty_insert_flip_char(tty, data[i], 0); | ||
| 357 | } | ||
| 358 | tty_flip_buffer_push(tty); | ||
| 359 | } else { | ||
| 360 | dbg("%s: empty read urb received", __FUNCTION__); | ||
| 361 | } | ||
| 362 | |||
| 363 | /* Resubmit urb so we continue receiving */ | ||
| 364 | if (port->open_count && urb->status != -ESHUTDOWN) { | ||
| 365 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 366 | if (err) | ||
| 367 | printk(KERN_ERR "%s: resubmit read urb failed. (%d)", __FUNCTION__, err); | ||
| 368 | } | ||
| 369 | } | ||
| 370 | return; | ||
| 371 | } | ||
| 372 | |||
| 373 | static void | ||
| 374 | option_outdat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 375 | { | ||
| 376 | struct usb_serial_port *port; | ||
| 377 | |||
| 378 | dbg("%s", __FUNCTION__); | ||
| 379 | |||
| 380 | port = (struct usb_serial_port *) urb->context; | ||
| 381 | |||
| 382 | if (port->open_count) | ||
| 383 | schedule_work(&port->work); | ||
| 384 | } | ||
| 385 | |||
| 386 | static void | ||
| 387 | option_instat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 388 | { | ||
| 389 | int err; | ||
| 390 | struct usb_serial_port *port = (struct usb_serial_port *) urb->context; | ||
| 391 | struct option_port_private *portdata = usb_get_serial_port_data(port); | ||
| 392 | struct usb_serial *serial = port->serial; | ||
| 393 | |||
| 394 | dbg("%s", __FUNCTION__); | ||
| 395 | dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata); | ||
| 396 | |||
| 397 | if (urb->status == 0) { | ||
| 398 | struct usb_ctrlrequest *req_pkt = | ||
| 399 | (struct usb_ctrlrequest *)urb->transfer_buffer; | ||
| 400 | |||
| 401 | if (!req_pkt) { | ||
| 402 | dbg("%s: NULL req_pkt\n", __FUNCTION__); | ||
| 403 | return; | ||
| 404 | } | ||
| 405 | if ((req_pkt->bRequestType == 0xA1) && (req_pkt->bRequest == 0x20)) { | ||
| 406 | int old_dcd_state; | ||
| 407 | unsigned char signals = *((unsigned char *) | ||
| 408 | urb->transfer_buffer + sizeof(struct usb_ctrlrequest)); | ||
| 409 | |||
| 410 | dbg("%s: signal x%x", __FUNCTION__, signals); | ||
| 411 | |||
| 412 | old_dcd_state = portdata->dcd_state; | ||
| 413 | portdata->cts_state = 1; | ||
| 414 | portdata->dcd_state = ((signals & 0x01) ? 1 : 0); | ||
| 415 | portdata->dsr_state = ((signals & 0x02) ? 1 : 0); | ||
| 416 | portdata->ri_state = ((signals & 0x08) ? 1 : 0); | ||
| 417 | |||
| 418 | if (port->tty && !C_CLOCAL(port->tty) | ||
| 419 | && old_dcd_state && !portdata->dcd_state) { | ||
| 420 | tty_hangup(port->tty); | ||
| 421 | } | ||
| 422 | } else | ||
| 423 | dbg("%s: type %x req %x", __FUNCTION__, req_pkt->bRequestType,req_pkt->bRequest); | ||
| 424 | } else | ||
| 425 | dbg("%s: error %d", __FUNCTION__, urb->status); | ||
| 426 | |||
| 427 | /* Resubmit urb so we continue receiving IRQ data */ | ||
| 428 | if (urb->status != -ESHUTDOWN) { | ||
| 429 | urb->dev = serial->dev; | ||
| 430 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 431 | if (err) | ||
| 432 | dbg("%s: resubmit intr urb failed. (%d)", __FUNCTION__, err); | ||
| 433 | } | ||
| 434 | } | ||
| 435 | |||
| 436 | |||
| 437 | static int | ||
| 438 | option_write_room (struct usb_serial_port *port) | ||
| 439 | { | ||
| 440 | struct option_port_private *portdata; | ||
| 441 | int i; | ||
| 442 | int data_len = 0; | ||
| 443 | struct urb *this_urb; | ||
| 444 | |||
| 445 | portdata = usb_get_serial_port_data(port); | ||
| 446 | |||
| 447 | for (i=0; i < N_OUT_URB; i++) | ||
| 448 | this_urb = portdata->out_urbs[i]; | ||
| 449 | if (this_urb && this_urb->status != -EINPROGRESS) | ||
| 450 | data_len += OUT_BUFLEN; | ||
| 451 | |||
| 452 | dbg("%s: %d", __FUNCTION__, data_len); | ||
| 453 | return data_len; | ||
| 454 | } | ||
| 455 | |||
| 456 | |||
| 457 | static int | ||
| 458 | option_chars_in_buffer (struct usb_serial_port *port) | ||
| 459 | { | ||
| 460 | struct option_port_private *portdata; | ||
| 461 | int i; | ||
| 462 | int data_len = 0; | ||
| 463 | struct urb *this_urb; | ||
| 464 | |||
| 465 | portdata = usb_get_serial_port_data(port); | ||
| 466 | |||
| 467 | for (i=0; i < N_OUT_URB; i++) | ||
| 468 | this_urb = portdata->out_urbs[i]; | ||
| 469 | if (this_urb && this_urb->status == -EINPROGRESS) | ||
| 470 | data_len += this_urb->transfer_buffer_length; | ||
| 471 | |||
| 472 | dbg("%s: %d", __FUNCTION__, data_len); | ||
| 473 | return data_len; | ||
| 474 | } | ||
| 475 | |||
| 476 | |||
| 477 | static int | ||
| 478 | option_open (struct usb_serial_port *port, struct file *filp) | ||
| 479 | { | ||
| 480 | struct option_port_private *portdata; | ||
| 481 | struct usb_serial *serial = port->serial; | ||
| 482 | int i, err; | ||
| 483 | struct urb *urb; | ||
| 484 | |||
| 485 | portdata = usb_get_serial_port_data(port); | ||
| 486 | |||
| 487 | dbg("%s", __FUNCTION__); | ||
| 488 | |||
| 489 | /* Set some sane defaults */ | ||
| 490 | portdata->rts_state = 1; | ||
| 491 | portdata->dtr_state = 1; | ||
| 492 | |||
| 493 | /* Reset low level data toggle and start reading from endpoints */ | ||
| 494 | for (i = 0; i < N_IN_URB; i++) { | ||
| 495 | urb = portdata->in_urbs[i]; | ||
| 496 | if (! urb) | ||
| 497 | continue; | ||
| 498 | if (urb->dev != serial->dev) { | ||
| 499 | dbg("%s: dev %p != %p", __FUNCTION__, urb->dev, serial->dev); | ||
| 500 | continue; | ||
| 501 | } | ||
| 502 | |||
| 503 | /* make sure endpoint data toggle is synchronized with the device */ | ||
| 504 | |||
| 505 | usb_clear_halt(urb->dev, urb->pipe); | ||
| 506 | |||
| 507 | err = usb_submit_urb(urb, GFP_KERNEL); | ||
| 508 | if (err) { | ||
| 509 | dbg("%s: submit urb %d failed (%d) %d", __FUNCTION__, i, err, | ||
| 510 | urb->transfer_buffer_length); | ||
| 511 | } | ||
| 512 | } | ||
| 513 | |||
| 514 | /* Reset low level data toggle on out endpoints */ | ||
| 515 | for (i = 0; i < N_OUT_URB; i++) { | ||
| 516 | urb = portdata->out_urbs[i]; | ||
| 517 | if (! urb) | ||
| 518 | continue; | ||
| 519 | urb->dev = serial->dev; | ||
| 520 | /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ | ||
| 521 | } | ||
| 522 | |||
| 523 | port->tty->low_latency = 1; | ||
| 524 | |||
| 525 | option_send_setup(port); | ||
| 526 | |||
| 527 | return (0); | ||
| 528 | } | ||
| 529 | |||
| 530 | static inline void | ||
| 531 | stop_urb(struct urb *urb) | ||
| 532 | { | ||
| 533 | if (urb && urb->status == -EINPROGRESS) { | ||
| 534 | urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 535 | usb_kill_urb(urb); | ||
| 536 | } | ||
| 537 | } | ||
| 538 | |||
| 539 | static void | ||
| 540 | option_close(struct usb_serial_port *port, struct file *filp) | ||
| 541 | { | ||
| 542 | int i; | ||
| 543 | struct usb_serial *serial = port->serial; | ||
| 544 | struct option_port_private *portdata; | ||
| 545 | |||
| 546 | dbg("%s", __FUNCTION__); | ||
| 547 | portdata = usb_get_serial_port_data(port); | ||
| 548 | |||
| 549 | portdata->rts_state = 0; | ||
| 550 | portdata->dtr_state = 0; | ||
| 551 | |||
| 552 | if (serial->dev) { | ||
| 553 | option_send_setup(port); | ||
| 554 | |||
| 555 | /* Stop reading/writing urbs */ | ||
| 556 | for (i = 0; i < N_IN_URB; i++) | ||
| 557 | stop_urb(portdata->in_urbs[i]); | ||
| 558 | for (i = 0; i < N_OUT_URB; i++) | ||
| 559 | stop_urb(portdata->out_urbs[i]); | ||
| 560 | } | ||
| 561 | port->tty = NULL; | ||
| 562 | } | ||
| 563 | |||
| 564 | |||
| 565 | /* Helper functions used by option_setup_urbs */ | ||
| 566 | static struct urb * | ||
| 567 | option_setup_urb (struct usb_serial *serial, int endpoint, | ||
| 568 | int dir, void *ctx, char *buf, int len, | ||
| 569 | void (*callback)(struct urb *, struct pt_regs *regs)) | ||
| 570 | { | ||
| 571 | struct urb *urb; | ||
| 572 | |||
| 573 | if (endpoint == -1) | ||
| 574 | return NULL; /* endpoint not needed */ | ||
| 575 | |||
| 576 | urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */ | ||
| 577 | if (urb == NULL) { | ||
| 578 | dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint); | ||
| 579 | return NULL; | ||
| 580 | } | ||
| 581 | |||
| 582 | /* Fill URB using supplied data. */ | ||
| 583 | usb_fill_bulk_urb(urb, serial->dev, | ||
| 584 | usb_sndbulkpipe(serial->dev, endpoint) | dir, | ||
| 585 | buf, len, callback, ctx); | ||
| 586 | |||
| 587 | return urb; | ||
| 588 | } | ||
| 589 | |||
| 590 | /* Setup urbs */ | ||
| 591 | static void | ||
| 592 | option_setup_urbs(struct usb_serial *serial) | ||
| 593 | { | ||
| 594 | int j; | ||
| 595 | struct usb_serial_port *port; | ||
| 596 | struct option_port_private *portdata; | ||
| 597 | |||
| 598 | dbg("%s", __FUNCTION__); | ||
| 599 | |||
| 600 | port = serial->port[0]; | ||
| 601 | portdata = usb_get_serial_port_data(port); | ||
| 602 | |||
| 603 | /* Do indat endpoints first */ | ||
| 604 | for (j = 0; j <= N_IN_URB; ++j) { | ||
| 605 | portdata->in_urbs[j] = option_setup_urb (serial, | ||
| 606 | port->bulk_in_endpointAddress, USB_DIR_IN, port, | ||
| 607 | portdata->in_buffer[j], IN_BUFLEN, option_indat_callback); | ||
| 608 | } | ||
| 609 | |||
| 610 | /* outdat endpoints */ | ||
| 611 | for (j = 0; j <= N_OUT_URB; ++j) { | ||
| 612 | portdata->out_urbs[j] = option_setup_urb (serial, | ||
| 613 | port->bulk_out_endpointAddress, USB_DIR_OUT, port, | ||
| 614 | portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback); | ||
| 615 | } | ||
| 616 | } | ||
| 617 | |||
| 618 | |||
| 619 | static int | ||
| 620 | option_send_setup(struct usb_serial_port *port) | ||
| 621 | { | ||
| 622 | struct usb_serial *serial = port->serial; | ||
| 623 | struct option_port_private *portdata; | ||
| 624 | |||
| 625 | dbg("%s", __FUNCTION__); | ||
| 626 | |||
| 627 | portdata = usb_get_serial_port_data(port); | ||
| 628 | |||
| 629 | if (port->tty) { | ||
| 630 | int val = 0; | ||
| 631 | if (portdata->dtr_state) | ||
| 632 | val |= 0x01; | ||
| 633 | if (portdata->rts_state) | ||
| 634 | val |= 0x02; | ||
| 635 | |||
| 636 | return usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
| 637 | 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); | ||
| 638 | } | ||
| 639 | |||
| 640 | return 0; | ||
| 641 | } | ||
| 642 | |||
| 643 | |||
| 644 | static int | ||
| 645 | option_startup (struct usb_serial *serial) | ||
| 646 | { | ||
| 647 | int i, err; | ||
| 648 | struct usb_serial_port *port; | ||
| 649 | struct option_port_private *portdata; | ||
| 650 | |||
| 651 | dbg("%s", __FUNCTION__); | ||
| 652 | |||
| 653 | /* Now setup per port private data */ | ||
| 654 | for (i = 0; i < serial->num_ports; i++) { | ||
| 655 | port = serial->port[i]; | ||
| 656 | portdata = kmalloc(sizeof(struct option_port_private), GFP_KERNEL); | ||
| 657 | if (!portdata) { | ||
| 658 | dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i); | ||
| 659 | return (1); | ||
| 660 | } | ||
| 661 | memset(portdata, 0, sizeof(struct option_port_private)); | ||
| 662 | |||
| 663 | usb_set_serial_port_data(port, portdata); | ||
| 664 | |||
| 665 | if (! port->interrupt_in_urb) | ||
| 666 | continue; | ||
| 667 | err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | ||
| 668 | if (err) | ||
| 669 | dbg("%s: submit irq_in urb failed %d", __FUNCTION__, err); | ||
| 670 | } | ||
| 671 | |||
| 672 | option_setup_urbs(serial); | ||
| 673 | |||
| 674 | return (0); | ||
| 675 | } | ||
| 676 | |||
| 677 | static void | ||
| 678 | option_shutdown (struct usb_serial *serial) | ||
| 679 | { | ||
| 680 | int i, j; | ||
| 681 | struct usb_serial_port *port; | ||
| 682 | struct option_port_private *portdata; | ||
| 683 | |||
| 684 | dbg("%s", __FUNCTION__); | ||
| 685 | |||
| 686 | /* Stop reading/writing urbs */ | ||
| 687 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 688 | port = serial->port[i]; | ||
| 689 | portdata = usb_get_serial_port_data(port); | ||
| 690 | for (j = 0; j < N_IN_URB; j++) | ||
| 691 | stop_urb(portdata->in_urbs[j]); | ||
| 692 | for (j = 0; j < N_OUT_URB; j++) | ||
| 693 | stop_urb(portdata->out_urbs[j]); | ||
| 694 | } | ||
| 695 | |||
| 696 | /* Now free them */ | ||
| 697 | for (i = 0; i < serial->num_ports; ++i) { | ||
| 698 | port = serial->port[i]; | ||
| 699 | portdata = usb_get_serial_port_data(port); | ||
| 700 | |||
| 701 | for (j = 0; j < N_IN_URB; j++) { | ||
| 702 | if (portdata->in_urbs[j]) { | ||
| 703 | usb_free_urb(portdata->in_urbs[j]); | ||
| 704 | portdata->in_urbs[j] = NULL; | ||
| 705 | } | ||
| 706 | } | ||
| 707 | for (j = 0; j < N_OUT_URB; j++) { | ||
| 708 | if (portdata->out_urbs[j]) { | ||
| 709 | usb_free_urb(portdata->out_urbs[j]); | ||
| 710 | portdata->out_urbs[j] = NULL; | ||
| 711 | } | ||
| 712 | } | ||
| 713 | } | ||
| 714 | |||
| 715 | /* Now free per port private data */ | ||
| 716 | for (i = 0; i < serial->num_ports; i++) { | ||
| 717 | port = serial->port[i]; | ||
| 718 | kfree(usb_get_serial_port_data(port)); | ||
| 719 | } | ||
| 720 | } | ||
| 721 | |||
| 722 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 723 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
| 724 | MODULE_VERSION(DRIVER_VERSION); | ||
| 725 | MODULE_LICENSE("GPL"); | ||
| 726 | |||
| 727 | module_param(debug, bool, S_IRUGO | S_IWUSR); | ||
| 728 | MODULE_PARM_DESC(debug, "Debug messages"); | ||
| 729 | |||
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 4536f63faaea..5da76dd8fb28 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -1297,13 +1297,6 @@ static int __init usb_serial_init(void) | |||
| 1297 | goto exit_bus; | 1297 | goto exit_bus; |
| 1298 | } | 1298 | } |
| 1299 | 1299 | ||
| 1300 | /* register the generic driver, if we should */ | ||
| 1301 | result = usb_serial_generic_register(debug); | ||
| 1302 | if (result < 0) { | ||
| 1303 | err("%s - registering generic driver failed", __FUNCTION__); | ||
| 1304 | goto exit_generic; | ||
| 1305 | } | ||
| 1306 | |||
| 1307 | usb_serial_tty_driver->owner = THIS_MODULE; | 1300 | usb_serial_tty_driver->owner = THIS_MODULE; |
| 1308 | usb_serial_tty_driver->driver_name = "usbserial"; | 1301 | usb_serial_tty_driver->driver_name = "usbserial"; |
| 1309 | usb_serial_tty_driver->devfs_name = "usb/tts/"; | 1302 | usb_serial_tty_driver->devfs_name = "usb/tts/"; |
| @@ -1329,17 +1322,24 @@ static int __init usb_serial_init(void) | |||
| 1329 | goto exit_tty; | 1322 | goto exit_tty; |
| 1330 | } | 1323 | } |
| 1331 | 1324 | ||
| 1325 | /* register the generic driver, if we should */ | ||
| 1326 | result = usb_serial_generic_register(debug); | ||
| 1327 | if (result < 0) { | ||
| 1328 | err("%s - registering generic driver failed", __FUNCTION__); | ||
| 1329 | goto exit_generic; | ||
| 1330 | } | ||
| 1331 | |||
| 1332 | info(DRIVER_DESC " " DRIVER_VERSION); | 1332 | info(DRIVER_DESC " " DRIVER_VERSION); |
| 1333 | 1333 | ||
| 1334 | return result; | 1334 | return result; |
| 1335 | 1335 | ||
| 1336 | exit_generic: | ||
| 1337 | usb_deregister(&usb_serial_driver); | ||
| 1338 | |||
| 1336 | exit_tty: | 1339 | exit_tty: |
| 1337 | tty_unregister_driver(usb_serial_tty_driver); | 1340 | tty_unregister_driver(usb_serial_tty_driver); |
| 1338 | 1341 | ||
| 1339 | exit_reg_driver: | 1342 | exit_reg_driver: |
| 1340 | usb_serial_generic_deregister(); | ||
| 1341 | |||
| 1342 | exit_generic: | ||
| 1343 | bus_unregister(&usb_serial_bus_type); | 1343 | bus_unregister(&usb_serial_bus_type); |
| 1344 | 1344 | ||
| 1345 | exit_bus: | 1345 | exit_bus: |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index d2891f475793..9fcc7bd1fbe4 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -862,6 +862,15 @@ UNUSUAL_DEV( 0x090a, 0x1001, 0x0100, 0x0100, | |||
| 862 | US_SC_DEVICE, US_PR_BULK, NULL, | 862 | US_SC_DEVICE, US_PR_BULK, NULL, |
| 863 | US_FL_NEED_OVERRIDE ), | 863 | US_FL_NEED_OVERRIDE ), |
| 864 | 864 | ||
| 865 | /* Reported by Filippo Bardelli <filibard@libero.it> | ||
| 866 | * The device reports a subclass of RBC, which is wrong. | ||
| 867 | */ | ||
| 868 | UNUSUAL_DEV( 0x090a, 0x1050, 0x0100, 0x0100, | ||
| 869 | "Trumpion Microelectronics, Inc.", | ||
| 870 | "33520 USB Digital Voice Recorder", | ||
| 871 | US_SC_UFI, US_PR_DEVICE, NULL, | ||
| 872 | 0), | ||
| 873 | |||
| 865 | /* Trumpion Microelectronics MP3 player (felipe_alfaro@linuxmail.org) */ | 874 | /* Trumpion Microelectronics MP3 player (felipe_alfaro@linuxmail.org) */ |
| 866 | UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999, | 875 | UNUSUAL_DEV( 0x090a, 0x1200, 0x0000, 0x9999, |
| 867 | "Trumpion", | 876 | "Trumpion", |
