diff options
370 files changed, 13686 insertions, 18134 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 2e0a01b21fe0..5f95d4b3cab1 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -25,15 +25,6 @@ Who: Pavel Machek <pavel@suse.cz> | |||
| 25 | 25 | ||
| 26 | --------------------------- | 26 | --------------------------- |
| 27 | 27 | ||
| 28 | What: PCI Name Database (CONFIG_PCI_NAMES) | ||
| 29 | When: July 2005 | ||
| 30 | Why: It bloats the kernel unnecessarily, and is handled by userspace better | ||
| 31 | (pciutils supports it.) Will eliminate the need to try to keep the | ||
| 32 | pci.ids file in sync with the sf.net database all of the time. | ||
| 33 | Who: Greg Kroah-Hartman <gregkh@suse.de> | ||
| 34 | |||
| 35 | --------------------------- | ||
| 36 | |||
| 37 | What: io_remap_page_range() (macro or function) | 28 | What: io_remap_page_range() (macro or function) |
| 38 | When: September 2005 | 29 | When: September 2005 |
| 39 | Why: Replaced by io_remap_pfn_range() which allows more memory space | 30 | Why: Replaced by io_remap_pfn_range() which allows more memory space |
diff --git a/Documentation/filesystems/ntfs.txt b/Documentation/filesystems/ntfs.txt index eef4aca0c753..a5fbc8e897fa 100644 --- a/Documentation/filesystems/ntfs.txt +++ b/Documentation/filesystems/ntfs.txt | |||
| @@ -439,6 +439,18 @@ ChangeLog | |||
| 439 | 439 | ||
| 440 | Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. | 440 | Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. |
| 441 | 441 | ||
| 442 | 2.1.24: | ||
| 443 | - Support journals ($LogFile) which have been modified by chkdsk. This | ||
| 444 | means users can boot into Windows after we marked the volume dirty. | ||
| 445 | The Windows boot will run chkdsk and then reboot. The user can then | ||
| 446 | immediately boot into Linux rather than having to do a full Windows | ||
| 447 | boot first before rebooting into Linux and we will recognize such a | ||
| 448 | journal and empty it as it is clean by definition. | ||
| 449 | - Support journals ($LogFile) with only one restart page as well as | ||
| 450 | journals with two different restart pages. We sanity check both and | ||
| 451 | either use the only sane one or the more recent one of the two in the | ||
| 452 | case that both are valid. | ||
| 453 | - Lots of bug fixes and enhancements across the board. | ||
| 442 | 2.1.23: | 454 | 2.1.23: |
| 443 | - Stamp the user space journal, aka transaction log, aka $UsnJrnl, if | 455 | - Stamp the user space journal, aka transaction log, aka $UsnJrnl, if |
| 444 | it is present and active thus telling Windows and applications using | 456 | it is present and active thus telling Windows and applications using |
diff --git a/Documentation/input/yealink.txt b/Documentation/input/yealink.txt new file mode 100644 index 000000000000..85f095a7ad04 --- /dev/null +++ b/Documentation/input/yealink.txt | |||
| @@ -0,0 +1,203 @@ | |||
| 1 | Driver documentation for yealink usb-p1k phones | ||
| 2 | |||
| 3 | 0. Status | ||
| 4 | ~~~~~~~~~ | ||
| 5 | |||
| 6 | The p1k is a relatively cheap usb 1.1 phone with: | ||
| 7 | - keyboard full support, yealink.ko / input event API | ||
| 8 | - LCD full support, yealink.ko / sysfs API | ||
| 9 | - LED full support, yealink.ko / sysfs API | ||
| 10 | - dialtone full support, yealink.ko / sysfs API | ||
| 11 | - ringtone full support, yealink.ko / sysfs API | ||
| 12 | - audio playback full support, snd_usb_audio.ko / alsa API | ||
| 13 | - audio record full support, snd_usb_audio.ko / alsa API | ||
| 14 | |||
| 15 | For vendor documentation see http://www.yealink.com | ||
| 16 | |||
| 17 | |||
| 18 | 1. Compilation (stand alone version) | ||
| 19 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 20 | |||
| 21 | Currently only kernel 2.6.x.y versions are supported. | ||
| 22 | In order to build the yealink.ko module do: | ||
| 23 | |||
| 24 | make | ||
| 25 | |||
| 26 | If you encounter problems please check if in the MAKE_OPTS variable in | ||
| 27 | the Makefile is pointing to the location where your kernel sources | ||
| 28 | are located, default /usr/src/linux. | ||
| 29 | |||
| 30 | |||
| 31 | |||
| 32 | 2. keyboard features | ||
| 33 | ~~~~~~~~~~~~~~~~~~~~ | ||
| 34 | The current mapping in the kernel is provided by the map_p1k_to_key | ||
| 35 | function: | ||
| 36 | |||
| 37 | Physical USB-P1K button layout input events | ||
| 38 | |||
| 39 | |||
| 40 | up up | ||
| 41 | IN OUT left, right | ||
| 42 | down down | ||
| 43 | |||
| 44 | pickup C hangup enter, backspace, escape | ||
| 45 | 1 2 3 1, 2, 3 | ||
| 46 | 4 5 6 4, 5, 6, | ||
| 47 | 7 8 9 7, 8, 9, | ||
| 48 | * 0 # *, 0, #, | ||
| 49 | |||
| 50 | The "up" and "down" keys, are symbolised by arrows on the button. | ||
| 51 | The "pickup" and "hangup" keys are symbolised by a green and red phone | ||
| 52 | on the button. | ||
| 53 | |||
| 54 | |||
| 55 | 3. LCD features | ||
| 56 | ~~~~~~~~~~~~~~~ | ||
| 57 | The LCD is divided and organised as a 3 line display: | ||
| 58 | |||
| 59 | |[] [][] [][] [][] in |[][] | ||
| 60 | |[] M [][] D [][] : [][] out |[][] | ||
| 61 | store | ||
| 62 | |||
| 63 | NEW REP SU MO TU WE TH FR SA | ||
| 64 | |||
| 65 | [] [] [] [] [] [] [] [] [] [] [] [] | ||
| 66 | [] [] [] [] [] [] [] [] [] [] [] [] | ||
| 67 | |||
| 68 | |||
| 69 | Line 1 Format (see below) : 18.e8.M8.88...188 | ||
| 70 | Icon names : M D : IN OUT STORE | ||
| 71 | Line 2 Format : ......... | ||
| 72 | Icon name : NEW REP SU MO TU WE TH FR SA | ||
| 73 | Line 3 Format : 888888888888 | ||
| 74 | |||
| 75 | |||
| 76 | Format description: | ||
| 77 | From a user space perspective the world is seperated in "digits" and "icons". | ||
| 78 | A digit can have a character set, an icon can only be ON or OFF. | ||
| 79 | |||
| 80 | Format specifier | ||
| 81 | '8' : Generic 7 segment digit with individual addressable segments | ||
| 82 | |||
| 83 | Reduced capabillity 7 segm digit, when segments are hard wired together. | ||
| 84 | '1' : 2 segments digit only able to produce a 1. | ||
| 85 | 'e' : Most significant day of the month digit, | ||
| 86 | able to produce at least 1 2 3. | ||
| 87 | 'M' : Most significant minute digit, | ||
| 88 | able to produce at least 0 1 2 3 4 5. | ||
| 89 | |||
| 90 | Icons or pictograms: | ||
| 91 | '.' : For example like AM, PM, SU, a 'dot' .. or other single segment | ||
| 92 | elements. | ||
| 93 | |||
| 94 | |||
| 95 | 4. Driver usage | ||
| 96 | ~~~~~~~~~~~~~~~ | ||
| 97 | For userland the following interfaces are available using the sysfs interface: | ||
| 98 | /sys/.../ | ||
| 99 | line1 Read/Write, lcd line1 | ||
| 100 | line2 Read/Write, lcd line2 | ||
| 101 | line3 Read/Write, lcd line3 | ||
| 102 | |||
| 103 | get_icons Read, returns a set of available icons. | ||
| 104 | hide_icon Write, hide the element by writing the icon name. | ||
| 105 | show_icon Write, display the element by writing the icon name. | ||
| 106 | |||
| 107 | map_seg7 Read/Write, the 7 segments char set, common for all | ||
| 108 | yealink phones. (see map_to_7segment.h) | ||
| 109 | |||
| 110 | ringtone Write, upload binary representation of a ringtone, | ||
| 111 | see yealink.c. status EXPERIMENTAL due to potential | ||
| 112 | races between async. and sync usb calls. | ||
| 113 | |||
| 114 | |||
| 115 | 4.1 lineX | ||
| 116 | ~~~~~~~~~ | ||
| 117 | Reading /sys/../lineX will return the format string with its current value: | ||
| 118 | |||
| 119 | Example: | ||
| 120 | cat ./line3 | ||
| 121 | 888888888888 | ||
| 122 | Linux Rocks! | ||
| 123 | |||
| 124 | Writing to /sys/../lineX will set the coresponding LCD line. | ||
| 125 | - Excess characters are ignored. | ||
| 126 | - If less characters are written than allowed, the remaining digits are | ||
| 127 | unchanged. | ||
| 128 | - The tab '\t'and '\n' char does not overwrite the original content. | ||
| 129 | - Writing a space to an icon will always hide its content. | ||
| 130 | |||
| 131 | Example: | ||
| 132 | date +"%m.%e.%k:%M" | sed 's/^0/ /' > ./line1 | ||
| 133 | |||
| 134 | Will update the LCD with the current date & time. | ||
| 135 | |||
| 136 | |||
| 137 | 4.2 get_icons | ||
| 138 | ~~~~~~~~~~~~~ | ||
| 139 | Reading will return all available icon names and its current settings: | ||
| 140 | |||
| 141 | cat ./get_icons | ||
| 142 | on M | ||
| 143 | on D | ||
| 144 | on : | ||
| 145 | IN | ||
| 146 | OUT | ||
| 147 | STORE | ||
| 148 | NEW | ||
| 149 | REP | ||
| 150 | SU | ||
| 151 | MO | ||
| 152 | TU | ||
| 153 | WE | ||
| 154 | TH | ||
| 155 | FR | ||
| 156 | SA | ||
| 157 | LED | ||
| 158 | DIALTONE | ||
| 159 | RINGTONE | ||
| 160 | |||
| 161 | |||
| 162 | 4.3 show/hide icons | ||
| 163 | ~~~~~~~~~~~~~~~~~~~ | ||
| 164 | Writing to these files will update the state of the icon. | ||
| 165 | Only one icon at a time can be updated. | ||
| 166 | |||
| 167 | If an icon is also on a ./lineX the corresponding value is | ||
| 168 | updated with the first letter of the icon. | ||
| 169 | |||
| 170 | Example - light up the store icon: | ||
| 171 | echo -n "STORE" > ./show_icon | ||
| 172 | |||
| 173 | cat ./line1 | ||
| 174 | 18.e8.M8.88...188 | ||
| 175 | S | ||
| 176 | |||
| 177 | Example - sound the ringtone for 10 seconds: | ||
| 178 | echo -n RINGTONE > /sys/..../show_icon | ||
| 179 | sleep 10 | ||
| 180 | echo -n RINGTONE > /sys/..../hide_icon | ||
| 181 | |||
| 182 | |||
| 183 | 5. Sound features | ||
| 184 | ~~~~~~~~~~~~~~~~~ | ||
| 185 | Sound is supported by the ALSA driver: snd_usb_audio | ||
| 186 | |||
| 187 | One 16-bit channel with sample and playback rates of 8000 Hz is the practical | ||
| 188 | limit of the device. | ||
| 189 | |||
| 190 | Example - recording test: | ||
| 191 | arecord -v -d 10 -r 8000 -f S16_LE -t wav foobar.wav | ||
| 192 | |||
| 193 | Example - playback test: | ||
| 194 | aplay foobar.wav | ||
| 195 | |||
| 196 | |||
| 197 | 6. Credits & Acknowledgments | ||
| 198 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 199 | - Olivier Vandorpe, for starting the usbb2k-api project doing much of | ||
| 200 | the reverse engineering. | ||
| 201 | - Martin Diehl, for pointing out how to handle USB memory allocation. | ||
| 202 | - Dmitry Torokhov, for the numerous code reviews and suggestions. | ||
| 203 | |||
diff --git a/MAINTAINERS b/MAINTAINERS index 8e4e82921070..eaa46594f021 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -116,6 +116,12 @@ M: ajk@iehk.rwth-aachen.de | |||
| 116 | L: linux-hams@vger.kernel.org | 116 | L: linux-hams@vger.kernel.org |
| 117 | S: Maintained | 117 | S: Maintained |
| 118 | 118 | ||
| 119 | YEALINK PHONE DRIVER | ||
| 120 | P: Henk Vergonet | ||
| 121 | M: Henk.Vergonet@gmail.com | ||
| 122 | L: usbb2k-api-dev@nongnu.org | ||
| 123 | S: Maintained | ||
| 124 | |||
| 119 | 8139CP 10/100 FAST ETHERNET DRIVER | 125 | 8139CP 10/100 FAST ETHERNET DRIVER |
| 120 | P: Jeff Garzik | 126 | P: Jeff Garzik |
| 121 | M: jgarzik@pobox.com | 127 | M: jgarzik@pobox.com |
| @@ -1813,13 +1819,6 @@ M: hch@infradead.org | |||
| 1813 | L: linux-abi-devel@lists.sourceforge.net | 1819 | L: linux-abi-devel@lists.sourceforge.net |
| 1814 | S: Maintained | 1820 | S: Maintained |
| 1815 | 1821 | ||
| 1816 | PCI ID DATABASE | ||
| 1817 | P: Martin Mares | ||
| 1818 | M: mj@ucw.cz | ||
| 1819 | L: pciids-devel@lists.sourceforge.net | ||
| 1820 | W: http://pciids.sourceforge.net/ | ||
| 1821 | S: Maintained | ||
| 1822 | |||
| 1823 | PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES) | 1822 | PCI SOUND DRIVERS (ES1370, ES1371 and SONICVIBES) |
| 1824 | P: Thomas Sailer | 1823 | P: Thomas Sailer |
| 1825 | M: sailer@ife.ee.ethz.ch | 1824 | M: sailer@ife.ee.ethz.ch |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index 804727853d25..e32fee505220 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
| @@ -373,12 +373,11 @@ marvel_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |||
| 373 | irq += 0x80; /* offset for lsi */ | 373 | irq += 0x80; /* offset for lsi */ |
| 374 | 374 | ||
| 375 | #if 1 | 375 | #if 1 |
| 376 | printk("PCI:%d:%d:%d (hose %d) [%s] is using MSI\n", | 376 | printk("PCI:%d:%d:%d (hose %d) is using MSI\n", |
| 377 | dev->bus->number, | 377 | dev->bus->number, |
| 378 | PCI_SLOT(dev->devfn), | 378 | PCI_SLOT(dev->devfn), |
| 379 | PCI_FUNC(dev->devfn), | 379 | PCI_FUNC(dev->devfn), |
| 380 | hose->index, | 380 | hose->index); |
| 381 | pci_pretty_name (dev)); | ||
| 382 | printk(" %d message(s) from 0x%04x\n", | 381 | printk(" %d message(s) from 0x%04x\n", |
| 383 | 1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4), | 382 | 1 << ((msg_ctl & PCI_MSI_FLAGS_QSIZE) >> 4), |
| 384 | msg_dat); | 383 | msg_dat); |
diff --git a/arch/arm/common/locomo.c b/arch/arm/common/locomo.c index 51f430cc2fbf..2786f7c34b3f 100644 --- a/arch/arm/common/locomo.c +++ b/arch/arm/common/locomo.c | |||
| @@ -541,6 +541,103 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) | |||
| 541 | return ret; | 541 | return ret; |
| 542 | } | 542 | } |
| 543 | 543 | ||
| 544 | #ifdef CONFIG_PM | ||
| 545 | |||
| 546 | struct locomo_save_data { | ||
| 547 | u16 LCM_GPO; | ||
| 548 | u16 LCM_SPICT; | ||
| 549 | u16 LCM_GPE; | ||
| 550 | u16 LCM_ASD; | ||
| 551 | u16 LCM_SPIMD; | ||
| 552 | }; | ||
| 553 | |||
| 554 | static int locomo_suspend(struct device *dev, u32 pm_message_t, u32 level) | ||
| 555 | { | ||
| 556 | struct locomo *lchip = dev_get_drvdata(dev); | ||
| 557 | struct locomo_save_data *save; | ||
| 558 | unsigned long flags; | ||
| 559 | |||
| 560 | if (level != SUSPEND_DISABLE) | ||
| 561 | return 0; | ||
| 562 | |||
| 563 | save = kmalloc(sizeof(struct locomo_save_data), GFP_KERNEL); | ||
| 564 | if (!save) | ||
| 565 | return -ENOMEM; | ||
| 566 | |||
| 567 | dev->power.saved_state = (void *) save; | ||
| 568 | |||
| 569 | spin_lock_irqsave(&lchip->lock, flags); | ||
| 570 | |||
| 571 | save->LCM_GPO = locomo_readl(lchip->base + LOCOMO_GPO); /* GPIO */ | ||
| 572 | locomo_writel(0x00, lchip->base + LOCOMO_GPO); | ||
| 573 | save->LCM_SPICT = locomo_readl(lchip->base + LOCOMO_SPICT); /* SPI */ | ||
| 574 | locomo_writel(0x40, lchip->base + LOCOMO_SPICT); | ||
| 575 | save->LCM_GPE = locomo_readl(lchip->base + LOCOMO_GPE); /* GPIO */ | ||
| 576 | locomo_writel(0x00, lchip->base + LOCOMO_GPE); | ||
| 577 | save->LCM_ASD = locomo_readl(lchip->base + LOCOMO_ASD); /* ADSTART */ | ||
| 578 | locomo_writel(0x00, lchip->base + LOCOMO_ASD); | ||
| 579 | save->LCM_SPIMD = locomo_readl(lchip->base + LOCOMO_SPIMD); /* SPI */ | ||
| 580 | locomo_writel(0x3C14, lchip->base + LOCOMO_SPIMD); | ||
| 581 | |||
| 582 | locomo_writel(0x00, lchip->base + LOCOMO_PAIF); | ||
| 583 | locomo_writel(0x00, lchip->base + LOCOMO_DAC); | ||
| 584 | locomo_writel(0x00, lchip->base + LOCOMO_BACKLIGHT + LOCOMO_TC); | ||
| 585 | |||
| 586 | if ( (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT0) & 0x88) && (locomo_readl(lchip->base + LOCOMO_LED + LOCOMO_LPT1) & 0x88) ) | ||
| 587 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); /* CLK32 off */ | ||
| 588 | else | ||
| 589 | /* 18MHz already enabled, so no wait */ | ||
| 590 | locomo_writel(0xc1, lchip->base + LOCOMO_C32K); /* CLK32 on */ | ||
| 591 | |||
| 592 | locomo_writel(0x00, lchip->base + LOCOMO_TADC); /* 18MHz clock off*/ | ||
| 593 | locomo_writel(0x00, lchip->base + LOCOMO_AUDIO + LOCOMO_ACC); /* 22MHz/24MHz clock off */ | ||
| 594 | locomo_writel(0x00, lchip->base + LOCOMO_FRONTLIGHT + LOCOMO_ALS); /* FL */ | ||
| 595 | |||
| 596 | spin_unlock_irqrestore(&lchip->lock, flags); | ||
| 597 | |||
| 598 | return 0; | ||
| 599 | } | ||
| 600 | |||
| 601 | static int locomo_resume(struct device *dev, u32 level) | ||
| 602 | { | ||
| 603 | struct locomo *lchip = dev_get_drvdata(dev); | ||
| 604 | struct locomo_save_data *save; | ||
| 605 | unsigned long r; | ||
| 606 | unsigned long flags; | ||
| 607 | |||
| 608 | if (level != RESUME_ENABLE) | ||
| 609 | return 0; | ||
| 610 | |||
| 611 | save = (struct locomo_save_data *) dev->power.saved_state; | ||
| 612 | if (!save) | ||
| 613 | return 0; | ||
| 614 | |||
| 615 | spin_lock_irqsave(&lchip->lock, flags); | ||
| 616 | |||
| 617 | locomo_writel(save->LCM_GPO, lchip->base + LOCOMO_GPO); | ||
| 618 | locomo_writel(save->LCM_SPICT, lchip->base + LOCOMO_SPICT); | ||
| 619 | locomo_writel(save->LCM_GPE, lchip->base + LOCOMO_GPE); | ||
| 620 | locomo_writel(save->LCM_ASD, lchip->base + LOCOMO_ASD); | ||
| 621 | locomo_writel(save->LCM_SPIMD, lchip->base + LOCOMO_SPIMD); | ||
| 622 | |||
| 623 | locomo_writel(0x00, lchip->base + LOCOMO_C32K); | ||
| 624 | locomo_writel(0x90, lchip->base + LOCOMO_TADC); | ||
| 625 | |||
| 626 | locomo_writel(0, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KSC); | ||
| 627 | r = locomo_readl(lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
| 628 | r &= 0xFEFF; | ||
| 629 | locomo_writel(r, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KIC); | ||
| 630 | locomo_writel(0x1, lchip->base + LOCOMO_KEYBOARD + LOCOMO_KCMD); | ||
| 631 | |||
| 632 | spin_unlock_irqrestore(&lchip->lock, flags); | ||
| 633 | |||
| 634 | dev->power.saved_state = NULL; | ||
| 635 | kfree(save); | ||
| 636 | |||
| 637 | return 0; | ||
| 638 | } | ||
| 639 | #endif | ||
| 640 | |||
| 544 | /** | 641 | /** |
| 545 | * locomo_probe - probe for a single LoCoMo chip. | 642 | * locomo_probe - probe for a single LoCoMo chip. |
| 546 | * @phys_addr: physical address of device. | 643 | * @phys_addr: physical address of device. |
| @@ -707,6 +804,10 @@ static struct device_driver locomo_device_driver = { | |||
| 707 | .bus = &platform_bus_type, | 804 | .bus = &platform_bus_type, |
| 708 | .probe = locomo_probe, | 805 | .probe = locomo_probe, |
| 709 | .remove = locomo_remove, | 806 | .remove = locomo_remove, |
| 807 | #ifdef CONFIG_PM | ||
| 808 | .suspend = locomo_suspend, | ||
| 809 | .resume = locomo_resume, | ||
| 810 | #endif | ||
| 710 | }; | 811 | }; |
| 711 | 812 | ||
| 712 | /* | 813 | /* |
diff --git a/arch/arm/configs/s3c2410_defconfig b/arch/arm/configs/s3c2410_defconfig index 96a794d8de84..756348bf5170 100644 --- a/arch/arm/configs/s3c2410_defconfig +++ b/arch/arm/configs/s3c2410_defconfig | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | # | 1 | # |
| 2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
| 3 | # Linux kernel version: 2.6.12-git4 | 3 | # Linux kernel version: 2.6.13-git8 |
| 4 | # Wed Jun 22 15:56:42 2005 | 4 | # Thu Sep 8 19:24:02 2005 |
| 5 | # | 5 | # |
| 6 | CONFIG_ARM=y | 6 | CONFIG_ARM=y |
| 7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
| @@ -22,6 +22,7 @@ CONFIG_INIT_ENV_ARG_LIMIT=32 | |||
| 22 | # General setup | 22 | # General setup |
| 23 | # | 23 | # |
| 24 | CONFIG_LOCALVERSION="" | 24 | CONFIG_LOCALVERSION="" |
| 25 | CONFIG_LOCALVERSION_AUTO=y | ||
| 25 | CONFIG_SWAP=y | 26 | CONFIG_SWAP=y |
| 26 | CONFIG_SYSVIPC=y | 27 | CONFIG_SYSVIPC=y |
| 27 | # CONFIG_POSIX_MQUEUE is not set | 28 | # CONFIG_POSIX_MQUEUE is not set |
| @@ -31,6 +32,7 @@ CONFIG_SYSCTL=y | |||
| 31 | # CONFIG_HOTPLUG is not set | 32 | # CONFIG_HOTPLUG is not set |
| 32 | CONFIG_KOBJECT_UEVENT=y | 33 | CONFIG_KOBJECT_UEVENT=y |
| 33 | # CONFIG_IKCONFIG is not set | 34 | # CONFIG_IKCONFIG is not set |
| 35 | CONFIG_INITRAMFS_SOURCE="" | ||
| 34 | # CONFIG_EMBEDDED is not set | 36 | # CONFIG_EMBEDDED is not set |
| 35 | CONFIG_KALLSYMS=y | 37 | CONFIG_KALLSYMS=y |
| 36 | # CONFIG_KALLSYMS_ALL is not set | 38 | # CONFIG_KALLSYMS_ALL is not set |
| @@ -88,7 +90,9 @@ CONFIG_ARCH_S3C2410=y | |||
| 88 | # | 90 | # |
| 89 | # S3C24XX Implementations | 91 | # S3C24XX Implementations |
| 90 | # | 92 | # |
| 93 | CONFIG_MACH_ANUBIS=y | ||
| 91 | CONFIG_ARCH_BAST=y | 94 | CONFIG_ARCH_BAST=y |
| 95 | CONFIG_BAST_PC104_IRQ=y | ||
| 92 | CONFIG_ARCH_H1940=y | 96 | CONFIG_ARCH_H1940=y |
| 93 | CONFIG_MACH_N30=y | 97 | CONFIG_MACH_N30=y |
| 94 | CONFIG_ARCH_SMDK2410=y | 98 | CONFIG_ARCH_SMDK2410=y |
| @@ -112,6 +116,7 @@ CONFIG_S3C2410_DMA=y | |||
| 112 | # CONFIG_S3C2410_DMA_DEBUG is not set | 116 | # CONFIG_S3C2410_DMA_DEBUG is not set |
| 113 | # CONFIG_S3C2410_PM_DEBUG is not set | 117 | # CONFIG_S3C2410_PM_DEBUG is not set |
| 114 | # CONFIG_S3C2410_PM_CHECK is not set | 118 | # CONFIG_S3C2410_PM_CHECK is not set |
| 119 | CONFIG_PM_SIMTEC=y | ||
| 115 | CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 | 120 | CONFIG_S3C2410_LOWLEVEL_UART_PORT=0 |
| 116 | 121 | ||
| 117 | # | 122 | # |
| @@ -149,7 +154,15 @@ CONFIG_ISA_DMA_API=y | |||
| 149 | # | 154 | # |
| 150 | # CONFIG_SMP is not set | 155 | # CONFIG_SMP is not set |
| 151 | # CONFIG_PREEMPT is not set | 156 | # CONFIG_PREEMPT is not set |
| 152 | # CONFIG_DISCONTIGMEM is not set | 157 | # CONFIG_NO_IDLE_HZ is not set |
| 158 | # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set | ||
| 159 | CONFIG_SELECT_MEMORY_MODEL=y | ||
| 160 | CONFIG_FLATMEM_MANUAL=y | ||
| 161 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
| 162 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
| 163 | CONFIG_FLATMEM=y | ||
| 164 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
| 165 | # CONFIG_SPARSEMEM_STATIC is not set | ||
| 153 | CONFIG_ALIGNMENT_TRAP=y | 166 | CONFIG_ALIGNMENT_TRAP=y |
| 154 | 167 | ||
| 155 | # | 168 | # |
| @@ -186,6 +199,74 @@ CONFIG_PM=y | |||
| 186 | CONFIG_APM=y | 199 | CONFIG_APM=y |
| 187 | 200 | ||
| 188 | # | 201 | # |
| 202 | # Networking | ||
| 203 | # | ||
| 204 | CONFIG_NET=y | ||
| 205 | |||
| 206 | # | ||
| 207 | # Networking options | ||
| 208 | # | ||
| 209 | # CONFIG_PACKET is not set | ||
| 210 | CONFIG_UNIX=y | ||
| 211 | # CONFIG_NET_KEY is not set | ||
| 212 | CONFIG_INET=y | ||
| 213 | # CONFIG_IP_MULTICAST is not set | ||
| 214 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 215 | CONFIG_IP_FIB_HASH=y | ||
| 216 | CONFIG_IP_PNP=y | ||
| 217 | # CONFIG_IP_PNP_DHCP is not set | ||
| 218 | CONFIG_IP_PNP_BOOTP=y | ||
| 219 | # CONFIG_IP_PNP_RARP is not set | ||
| 220 | # CONFIG_NET_IPIP is not set | ||
| 221 | # CONFIG_NET_IPGRE is not set | ||
| 222 | # CONFIG_ARPD is not set | ||
| 223 | # CONFIG_SYN_COOKIES is not set | ||
| 224 | # CONFIG_INET_AH is not set | ||
| 225 | # CONFIG_INET_ESP is not set | ||
| 226 | # CONFIG_INET_IPCOMP is not set | ||
| 227 | # CONFIG_INET_TUNNEL is not set | ||
| 228 | CONFIG_INET_DIAG=y | ||
| 229 | CONFIG_INET_TCP_DIAG=y | ||
| 230 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
| 231 | CONFIG_TCP_CONG_BIC=y | ||
| 232 | # CONFIG_IPV6 is not set | ||
| 233 | # CONFIG_NETFILTER is not set | ||
| 234 | |||
| 235 | # | ||
| 236 | # DCCP Configuration (EXPERIMENTAL) | ||
| 237 | # | ||
| 238 | # CONFIG_IP_DCCP is not set | ||
| 239 | |||
| 240 | # | ||
| 241 | # SCTP Configuration (EXPERIMENTAL) | ||
| 242 | # | ||
| 243 | # CONFIG_IP_SCTP is not set | ||
| 244 | # CONFIG_ATM is not set | ||
| 245 | # CONFIG_BRIDGE is not set | ||
| 246 | # CONFIG_VLAN_8021Q is not set | ||
| 247 | # CONFIG_DECNET is not set | ||
| 248 | # CONFIG_LLC2 is not set | ||
| 249 | # CONFIG_IPX is not set | ||
| 250 | # CONFIG_ATALK is not set | ||
| 251 | # CONFIG_X25 is not set | ||
| 252 | # CONFIG_LAPB is not set | ||
| 253 | # CONFIG_NET_DIVERT is not set | ||
| 254 | # CONFIG_ECONET is not set | ||
| 255 | # CONFIG_WAN_ROUTER is not set | ||
| 256 | # CONFIG_NET_SCHED is not set | ||
| 257 | # CONFIG_NET_CLS_ROUTE is not set | ||
| 258 | |||
| 259 | # | ||
| 260 | # Network testing | ||
| 261 | # | ||
| 262 | # CONFIG_NET_PKTGEN is not set | ||
| 263 | # CONFIG_NETFILTER_NETLINK is not set | ||
| 264 | # CONFIG_HAMRADIO is not set | ||
| 265 | # CONFIG_IRDA is not set | ||
| 266 | # CONFIG_BT is not set | ||
| 267 | # CONFIG_IEEE80211 is not set | ||
| 268 | |||
| 269 | # | ||
| 189 | # Device Drivers | 270 | # Device Drivers |
| 190 | # | 271 | # |
| 191 | 272 | ||
| @@ -258,6 +339,7 @@ CONFIG_MTD_ROM=y | |||
| 258 | # CONFIG_MTD_IMPA7 is not set | 339 | # CONFIG_MTD_IMPA7 is not set |
| 259 | CONFIG_MTD_BAST=y | 340 | CONFIG_MTD_BAST=y |
| 260 | CONFIG_MTD_BAST_MAXSIZE=4 | 341 | CONFIG_MTD_BAST_MAXSIZE=4 |
| 342 | # CONFIG_MTD_PLATRAM is not set | ||
| 261 | 343 | ||
| 262 | # | 344 | # |
| 263 | # Self-contained MTD device drivers | 345 | # Self-contained MTD device drivers |
| @@ -312,7 +394,6 @@ CONFIG_BLK_DEV_RAM=y | |||
| 312 | CONFIG_BLK_DEV_RAM_COUNT=16 | 394 | CONFIG_BLK_DEV_RAM_COUNT=16 |
| 313 | CONFIG_BLK_DEV_RAM_SIZE=4096 | 395 | CONFIG_BLK_DEV_RAM_SIZE=4096 |
| 314 | CONFIG_BLK_DEV_INITRD=y | 396 | CONFIG_BLK_DEV_INITRD=y |
| 315 | CONFIG_INITRAMFS_SOURCE="" | ||
| 316 | # CONFIG_CDROM_PKTCDVD is not set | 397 | # CONFIG_CDROM_PKTCDVD is not set |
| 317 | 398 | ||
| 318 | # | 399 | # |
| @@ -354,6 +435,7 @@ CONFIG_BLK_DEV_IDE_BAST=y | |||
| 354 | # | 435 | # |
| 355 | # SCSI device support | 436 | # SCSI device support |
| 356 | # | 437 | # |
| 438 | # CONFIG_RAID_ATTRS is not set | ||
| 357 | # CONFIG_SCSI is not set | 439 | # CONFIG_SCSI is not set |
| 358 | 440 | ||
| 359 | # | 441 | # |
| @@ -376,70 +458,8 @@ CONFIG_BLK_DEV_IDE_BAST=y | |||
| 376 | # | 458 | # |
| 377 | 459 | ||
| 378 | # | 460 | # |
| 379 | # Networking support | 461 | # Network device support |
| 380 | # | ||
| 381 | CONFIG_NET=y | ||
| 382 | |||
| 383 | # | ||
| 384 | # Networking options | ||
| 385 | # | 462 | # |
| 386 | # CONFIG_PACKET is not set | ||
| 387 | CONFIG_UNIX=y | ||
| 388 | # CONFIG_NET_KEY is not set | ||
| 389 | CONFIG_INET=y | ||
| 390 | CONFIG_IP_FIB_HASH=y | ||
| 391 | # CONFIG_IP_FIB_TRIE is not set | ||
| 392 | # CONFIG_IP_MULTICAST is not set | ||
| 393 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
| 394 | CONFIG_IP_PNP=y | ||
| 395 | # CONFIG_IP_PNP_DHCP is not set | ||
| 396 | CONFIG_IP_PNP_BOOTP=y | ||
| 397 | # CONFIG_IP_PNP_RARP is not set | ||
| 398 | # CONFIG_NET_IPIP is not set | ||
| 399 | # CONFIG_NET_IPGRE is not set | ||
| 400 | # CONFIG_ARPD is not set | ||
| 401 | # CONFIG_SYN_COOKIES is not set | ||
| 402 | # CONFIG_INET_AH is not set | ||
| 403 | # CONFIG_INET_ESP is not set | ||
| 404 | # CONFIG_INET_IPCOMP is not set | ||
| 405 | # CONFIG_INET_TUNNEL is not set | ||
| 406 | CONFIG_IP_TCPDIAG=y | ||
| 407 | # CONFIG_IP_TCPDIAG_IPV6 is not set | ||
| 408 | # CONFIG_IPV6 is not set | ||
| 409 | # CONFIG_NETFILTER is not set | ||
| 410 | |||
| 411 | # | ||
| 412 | # SCTP Configuration (EXPERIMENTAL) | ||
| 413 | # | ||
| 414 | # CONFIG_IP_SCTP is not set | ||
| 415 | # CONFIG_ATM is not set | ||
| 416 | # CONFIG_BRIDGE is not set | ||
| 417 | # CONFIG_VLAN_8021Q is not set | ||
| 418 | # CONFIG_DECNET is not set | ||
| 419 | # CONFIG_LLC2 is not set | ||
| 420 | # CONFIG_IPX is not set | ||
| 421 | # CONFIG_ATALK is not set | ||
| 422 | # CONFIG_X25 is not set | ||
| 423 | # CONFIG_LAPB is not set | ||
| 424 | # CONFIG_NET_DIVERT is not set | ||
| 425 | # CONFIG_ECONET is not set | ||
| 426 | # CONFIG_WAN_ROUTER is not set | ||
| 427 | |||
| 428 | # | ||
| 429 | # QoS and/or fair queueing | ||
| 430 | # | ||
| 431 | # CONFIG_NET_SCHED is not set | ||
| 432 | # CONFIG_NET_CLS_ROUTE is not set | ||
| 433 | |||
| 434 | # | ||
| 435 | # Network testing | ||
| 436 | # | ||
| 437 | # CONFIG_NET_PKTGEN is not set | ||
| 438 | # CONFIG_NETPOLL is not set | ||
| 439 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 440 | # CONFIG_HAMRADIO is not set | ||
| 441 | # CONFIG_IRDA is not set | ||
| 442 | # CONFIG_BT is not set | ||
| 443 | CONFIG_NETDEVICES=y | 463 | CONFIG_NETDEVICES=y |
| 444 | # CONFIG_DUMMY is not set | 464 | # CONFIG_DUMMY is not set |
| 445 | # CONFIG_BONDING is not set | 465 | # CONFIG_BONDING is not set |
| @@ -447,6 +467,11 @@ CONFIG_NETDEVICES=y | |||
| 447 | # CONFIG_TUN is not set | 467 | # CONFIG_TUN is not set |
| 448 | 468 | ||
| 449 | # | 469 | # |
| 470 | # PHY device support | ||
| 471 | # | ||
| 472 | # CONFIG_PHYLIB is not set | ||
| 473 | |||
| 474 | # | ||
| 450 | # Ethernet (10 or 100Mbit) | 475 | # Ethernet (10 or 100Mbit) |
| 451 | # | 476 | # |
| 452 | CONFIG_NET_ETHERNET=y | 477 | CONFIG_NET_ETHERNET=y |
| @@ -480,6 +505,8 @@ CONFIG_DM9000=m | |||
| 480 | # CONFIG_SLIP is not set | 505 | # CONFIG_SLIP is not set |
| 481 | # CONFIG_SHAPER is not set | 506 | # CONFIG_SHAPER is not set |
| 482 | # CONFIG_NETCONSOLE is not set | 507 | # CONFIG_NETCONSOLE is not set |
| 508 | # CONFIG_NETPOLL is not set | ||
| 509 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
| 483 | 510 | ||
| 484 | # | 511 | # |
| 485 | # ISDN subsystem | 512 | # ISDN subsystem |
| @@ -562,7 +589,6 @@ CONFIG_SERIAL_8250_EXTENDED=y | |||
| 562 | CONFIG_SERIAL_8250_MANY_PORTS=y | 589 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 563 | CONFIG_SERIAL_8250_SHARE_IRQ=y | 590 | CONFIG_SERIAL_8250_SHARE_IRQ=y |
| 564 | # CONFIG_SERIAL_8250_DETECT_IRQ is not set | 591 | # CONFIG_SERIAL_8250_DETECT_IRQ is not set |
| 565 | # CONFIG_SERIAL_8250_MULTIPORT is not set | ||
| 566 | # CONFIG_SERIAL_8250_RSA is not set | 592 | # CONFIG_SERIAL_8250_RSA is not set |
| 567 | 593 | ||
| 568 | # | 594 | # |
| @@ -605,7 +631,6 @@ CONFIG_S3C2410_RTC=y | |||
| 605 | # | 631 | # |
| 606 | # Ftape, the floppy tape device driver | 632 | # Ftape, the floppy tape device driver |
| 607 | # | 633 | # |
| 608 | # CONFIG_DRM is not set | ||
| 609 | # CONFIG_RAW_DRIVER is not set | 634 | # CONFIG_RAW_DRIVER is not set |
| 610 | 635 | ||
| 611 | # | 636 | # |
| @@ -628,7 +653,7 @@ CONFIG_I2C_ALGOBIT=m | |||
| 628 | # | 653 | # |
| 629 | # I2C Hardware Bus support | 654 | # I2C Hardware Bus support |
| 630 | # | 655 | # |
| 631 | # CONFIG_I2C_ISA is not set | 656 | CONFIG_I2C_ISA=m |
| 632 | # CONFIG_I2C_PARPORT is not set | 657 | # CONFIG_I2C_PARPORT is not set |
| 633 | # CONFIG_I2C_PARPORT_LIGHT is not set | 658 | # CONFIG_I2C_PARPORT_LIGHT is not set |
| 634 | CONFIG_I2C_S3C2410=y | 659 | CONFIG_I2C_S3C2410=y |
| @@ -636,14 +661,33 @@ CONFIG_I2C_S3C2410=y | |||
| 636 | # CONFIG_I2C_PCA_ISA is not set | 661 | # CONFIG_I2C_PCA_ISA is not set |
| 637 | 662 | ||
| 638 | # | 663 | # |
| 639 | # Hardware Sensors Chip support | 664 | # Miscellaneous I2C Chip support |
| 640 | # | 665 | # |
| 641 | CONFIG_I2C_SENSOR=m | 666 | # CONFIG_SENSORS_DS1337 is not set |
| 667 | # CONFIG_SENSORS_DS1374 is not set | ||
| 668 | CONFIG_SENSORS_EEPROM=m | ||
| 669 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 670 | # CONFIG_SENSORS_PCA9539 is not set | ||
| 671 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 672 | # CONFIG_SENSORS_RTC8564 is not set | ||
| 673 | # CONFIG_SENSORS_MAX6875 is not set | ||
| 674 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 675 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 676 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 677 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 678 | |||
| 679 | # | ||
| 680 | # Hardware Monitoring support | ||
| 681 | # | ||
| 682 | CONFIG_HWMON=y | ||
| 683 | CONFIG_HWMON_VID=m | ||
| 642 | # CONFIG_SENSORS_ADM1021 is not set | 684 | # CONFIG_SENSORS_ADM1021 is not set |
| 643 | # CONFIG_SENSORS_ADM1025 is not set | 685 | # CONFIG_SENSORS_ADM1025 is not set |
| 644 | # CONFIG_SENSORS_ADM1026 is not set | 686 | # CONFIG_SENSORS_ADM1026 is not set |
| 645 | # CONFIG_SENSORS_ADM1031 is not set | 687 | # CONFIG_SENSORS_ADM1031 is not set |
| 688 | # CONFIG_SENSORS_ADM9240 is not set | ||
| 646 | # CONFIG_SENSORS_ASB100 is not set | 689 | # CONFIG_SENSORS_ASB100 is not set |
| 690 | # CONFIG_SENSORS_ATXP1 is not set | ||
| 647 | # CONFIG_SENSORS_DS1621 is not set | 691 | # CONFIG_SENSORS_DS1621 is not set |
| 648 | # CONFIG_SENSORS_FSCHER is not set | 692 | # CONFIG_SENSORS_FSCHER is not set |
| 649 | # CONFIG_SENSORS_FSCPOS is not set | 693 | # CONFIG_SENSORS_FSCPOS is not set |
| @@ -662,27 +706,21 @@ CONFIG_SENSORS_LM85=m | |||
| 662 | # CONFIG_SENSORS_LM92 is not set | 706 | # CONFIG_SENSORS_LM92 is not set |
| 663 | # CONFIG_SENSORS_MAX1619 is not set | 707 | # CONFIG_SENSORS_MAX1619 is not set |
| 664 | # CONFIG_SENSORS_PC87360 is not set | 708 | # CONFIG_SENSORS_PC87360 is not set |
| 665 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
| 666 | # CONFIG_SENSORS_SMSC47M1 is not set | 709 | # CONFIG_SENSORS_SMSC47M1 is not set |
| 710 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
| 667 | # CONFIG_SENSORS_W83781D is not set | 711 | # CONFIG_SENSORS_W83781D is not set |
| 712 | # CONFIG_SENSORS_W83792D is not set | ||
| 668 | # CONFIG_SENSORS_W83L785TS is not set | 713 | # CONFIG_SENSORS_W83L785TS is not set |
| 669 | # CONFIG_SENSORS_W83627HF is not set | 714 | # CONFIG_SENSORS_W83627HF is not set |
| 715 | # CONFIG_SENSORS_W83627EHF is not set | ||
| 716 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
| 670 | 717 | ||
| 671 | # | 718 | # |
| 672 | # Other I2C Chip support | 719 | # Misc devices |
| 673 | # | 720 | # |
| 674 | # CONFIG_SENSORS_DS1337 is not set | ||
| 675 | CONFIG_SENSORS_EEPROM=m | ||
| 676 | # CONFIG_SENSORS_PCF8574 is not set | ||
| 677 | # CONFIG_SENSORS_PCF8591 is not set | ||
| 678 | # CONFIG_SENSORS_RTC8564 is not set | ||
| 679 | # CONFIG_I2C_DEBUG_CORE is not set | ||
| 680 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
| 681 | # CONFIG_I2C_DEBUG_BUS is not set | ||
| 682 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
| 683 | 721 | ||
| 684 | # | 722 | # |
| 685 | # Misc devices | 723 | # Multimedia Capabilities Port drivers |
| 686 | # | 724 | # |
| 687 | 725 | ||
| 688 | # | 726 | # |
| @@ -731,7 +769,7 @@ CONFIG_DUMMY_CONSOLE=y | |||
| 731 | # USB support | 769 | # USB support |
| 732 | # | 770 | # |
| 733 | CONFIG_USB_ARCH_HAS_HCD=y | 771 | CONFIG_USB_ARCH_HAS_HCD=y |
| 734 | # CONFIG_USB_ARCH_HAS_OHCI is not set | 772 | CONFIG_USB_ARCH_HAS_OHCI=y |
| 735 | # CONFIG_USB is not set | 773 | # CONFIG_USB is not set |
| 736 | 774 | ||
| 737 | # | 775 | # |
| @@ -749,6 +787,7 @@ CONFIG_USB_ARCH_HAS_HCD=y | |||
| 749 | # | 787 | # |
| 750 | CONFIG_EXT2_FS=y | 788 | CONFIG_EXT2_FS=y |
| 751 | # CONFIG_EXT2_FS_XATTR is not set | 789 | # CONFIG_EXT2_FS_XATTR is not set |
| 790 | # CONFIG_EXT2_FS_XIP is not set | ||
| 752 | CONFIG_EXT3_FS=y | 791 | CONFIG_EXT3_FS=y |
| 753 | CONFIG_EXT3_FS_XATTR=y | 792 | CONFIG_EXT3_FS_XATTR=y |
| 754 | # CONFIG_EXT3_FS_POSIX_ACL is not set | 793 | # CONFIG_EXT3_FS_POSIX_ACL is not set |
| @@ -758,6 +797,7 @@ CONFIG_JBD=y | |||
| 758 | CONFIG_FS_MBCACHE=y | 797 | CONFIG_FS_MBCACHE=y |
| 759 | # CONFIG_REISERFS_FS is not set | 798 | # CONFIG_REISERFS_FS is not set |
| 760 | # CONFIG_JFS_FS is not set | 799 | # CONFIG_JFS_FS is not set |
| 800 | # CONFIG_FS_POSIX_ACL is not set | ||
| 761 | 801 | ||
| 762 | # | 802 | # |
| 763 | # XFS support | 803 | # XFS support |
| @@ -765,6 +805,7 @@ CONFIG_FS_MBCACHE=y | |||
| 765 | # CONFIG_XFS_FS is not set | 805 | # CONFIG_XFS_FS is not set |
| 766 | # CONFIG_MINIX_FS is not set | 806 | # CONFIG_MINIX_FS is not set |
| 767 | CONFIG_ROMFS_FS=y | 807 | CONFIG_ROMFS_FS=y |
| 808 | CONFIG_INOTIFY=y | ||
| 768 | # CONFIG_QUOTA is not set | 809 | # CONFIG_QUOTA is not set |
| 769 | CONFIG_DNOTIFY=y | 810 | CONFIG_DNOTIFY=y |
| 770 | # CONFIG_AUTOFS_FS is not set | 811 | # CONFIG_AUTOFS_FS is not set |
| @@ -791,11 +832,11 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | |||
| 791 | # | 832 | # |
| 792 | CONFIG_PROC_FS=y | 833 | CONFIG_PROC_FS=y |
| 793 | CONFIG_SYSFS=y | 834 | CONFIG_SYSFS=y |
| 794 | # CONFIG_DEVPTS_FS_XATTR is not set | ||
| 795 | # CONFIG_TMPFS is not set | 835 | # CONFIG_TMPFS is not set |
| 796 | # CONFIG_HUGETLBFS is not set | 836 | # CONFIG_HUGETLBFS is not set |
| 797 | # CONFIG_HUGETLB_PAGE is not set | 837 | # CONFIG_HUGETLB_PAGE is not set |
| 798 | CONFIG_RAMFS=y | 838 | CONFIG_RAMFS=y |
| 839 | # CONFIG_RELAYFS_FS is not set | ||
| 799 | 840 | ||
| 800 | # | 841 | # |
| 801 | # Miscellaneous filesystems | 842 | # Miscellaneous filesystems |
| @@ -812,8 +853,7 @@ CONFIG_JFFS_FS_VERBOSE=0 | |||
| 812 | # CONFIG_JFFS_PROC_FS is not set | 853 | # CONFIG_JFFS_PROC_FS is not set |
| 813 | CONFIG_JFFS2_FS=y | 854 | CONFIG_JFFS2_FS=y |
| 814 | CONFIG_JFFS2_FS_DEBUG=0 | 855 | CONFIG_JFFS2_FS_DEBUG=0 |
| 815 | # CONFIG_JFFS2_FS_NAND is not set | 856 | CONFIG_JFFS2_FS_WRITEBUFFER=y |
| 816 | # CONFIG_JFFS2_FS_NOR_ECC is not set | ||
| 817 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | 857 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set |
| 818 | CONFIG_JFFS2_ZLIB=y | 858 | CONFIG_JFFS2_ZLIB=y |
| 819 | CONFIG_JFFS2_RTIME=y | 859 | CONFIG_JFFS2_RTIME=y |
| @@ -835,6 +875,7 @@ CONFIG_NFS_FS=y | |||
| 835 | # CONFIG_NFSD is not set | 875 | # CONFIG_NFSD is not set |
| 836 | CONFIG_ROOT_NFS=y | 876 | CONFIG_ROOT_NFS=y |
| 837 | CONFIG_LOCKD=y | 877 | CONFIG_LOCKD=y |
| 878 | CONFIG_NFS_COMMON=y | ||
| 838 | CONFIG_SUNRPC=y | 879 | CONFIG_SUNRPC=y |
| 839 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 880 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
| 840 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 881 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
| @@ -920,6 +961,7 @@ CONFIG_NLS_DEFAULT="iso8859-1" | |||
| 920 | CONFIG_DEBUG_KERNEL=y | 961 | CONFIG_DEBUG_KERNEL=y |
| 921 | # CONFIG_MAGIC_SYSRQ is not set | 962 | # CONFIG_MAGIC_SYSRQ is not set |
| 922 | CONFIG_LOG_BUF_SHIFT=16 | 963 | CONFIG_LOG_BUF_SHIFT=16 |
| 964 | CONFIG_DETECT_SOFTLOCKUP=y | ||
| 923 | # CONFIG_SCHEDSTATS is not set | 965 | # CONFIG_SCHEDSTATS is not set |
| 924 | # CONFIG_DEBUG_SLAB is not set | 966 | # CONFIG_DEBUG_SLAB is not set |
| 925 | # CONFIG_DEBUG_SPINLOCK is not set | 967 | # CONFIG_DEBUG_SPINLOCK is not set |
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 112f1d68fb2b..e216ab8b9e8f 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c | |||
| @@ -354,7 +354,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 354 | 354 | ||
| 355 | static struct platform_device serial_device = { | 355 | static struct platform_device serial_device = { |
| 356 | .name = "serial8250", | 356 | .name = "serial8250", |
| 357 | .id = 0, | 357 | .id = PLAT8250_DEV_PLATFORM, |
| 358 | .dev = { | 358 | .dev = { |
| 359 | .platform_data = serial_platform_data, | 359 | .platform_data = serial_platform_data, |
| 360 | }, | 360 | }, |
diff --git a/arch/arm/mach-ebsa110/core.c b/arch/arm/mach-ebsa110/core.c index 23c4da10101b..5aeadfd72143 100644 --- a/arch/arm/mach-ebsa110/core.c +++ b/arch/arm/mach-ebsa110/core.c | |||
| @@ -219,7 +219,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 219 | 219 | ||
| 220 | static struct platform_device serial_device = { | 220 | static struct platform_device serial_device = { |
| 221 | .name = "serial8250", | 221 | .name = "serial8250", |
| 222 | .id = 0, | 222 | .id = PLAT8250_DEV_PLATFORM, |
| 223 | .dev = { | 223 | .dev = { |
| 224 | .platform_data = serial_platform_data, | 224 | .platform_data = serial_platform_data, |
| 225 | }, | 225 | }, |
diff --git a/arch/arm/mach-epxa10db/arch.c b/arch/arm/mach-epxa10db/arch.c index 7daa021676d0..44c56571d183 100644 --- a/arch/arm/mach-epxa10db/arch.c +++ b/arch/arm/mach-epxa10db/arch.c | |||
| @@ -52,7 +52,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 52 | 52 | ||
| 53 | static struct platform_device serial_device = { | 53 | static struct platform_device serial_device = { |
| 54 | .name = "serial8250", | 54 | .name = "serial8250", |
| 55 | .id = 0, | 55 | .id = PLAT8250_DEV_PLATFORM, |
| 56 | .dev = { | 56 | .dev = { |
| 57 | .platform_data = serial_platform_data, | 57 | .platform_data = serial_platform_data, |
| 58 | }, | 58 | }, |
diff --git a/arch/arm/mach-footbridge/isa.c b/arch/arm/mach-footbridge/isa.c index aa3a1fef563e..28846c7edaaf 100644 --- a/arch/arm/mach-footbridge/isa.c +++ b/arch/arm/mach-footbridge/isa.c | |||
| @@ -34,7 +34,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 34 | 34 | ||
| 35 | static struct platform_device serial_device = { | 35 | static struct platform_device serial_device = { |
| 36 | .name = "serial8250", | 36 | .name = "serial8250", |
| 37 | .id = 0, | 37 | .id = PLAT8250_DEV_PLATFORM, |
| 38 | .dev = { | 38 | .dev = { |
| 39 | .platform_data = serial_platform_data, | 39 | .platform_data = serial_platform_data, |
| 40 | }, | 40 | }, |
diff --git a/arch/arm/mach-h720x/cpu-h7202.c b/arch/arm/mach-h720x/cpu-h7202.c index 4b3199319e68..a4a7c0125d03 100644 --- a/arch/arm/mach-h720x/cpu-h7202.c +++ b/arch/arm/mach-h720x/cpu-h7202.c | |||
| @@ -90,7 +90,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 90 | 90 | ||
| 91 | static struct platform_device serial_device = { | 91 | static struct platform_device serial_device = { |
| 92 | .name = "serial8250", | 92 | .name = "serial8250", |
| 93 | .id = 0, | 93 | .id = PLAT8250_DEV_PLATFORM, |
| 94 | .dev = { | 94 | .dev = { |
| 95 | .platform_data = serial_platform_data, | 95 | .platform_data = serial_platform_data, |
| 96 | }, | 96 | }, |
diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 098c817a7fb8..74bd2fd602d4 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c | |||
| @@ -174,7 +174,7 @@ static struct resource ixp2000_uart_resource = { | |||
| 174 | 174 | ||
| 175 | static struct platform_device ixp2000_serial_device = { | 175 | static struct platform_device ixp2000_serial_device = { |
| 176 | .name = "serial8250", | 176 | .name = "serial8250", |
| 177 | .id = 0, | 177 | .id = PLAT8250_DEV_PLATFORM, |
| 178 | .dev = { | 178 | .dev = { |
| 179 | .platform_data = ixp2000_serial_port, | 179 | .platform_data = ixp2000_serial_port, |
| 180 | }, | 180 | }, |
diff --git a/arch/arm/mach-ixp4xx/coyote-setup.c b/arch/arm/mach-ixp4xx/coyote-setup.c index 8b2f25322452..050c92768913 100644 --- a/arch/arm/mach-ixp4xx/coyote-setup.c +++ b/arch/arm/mach-ixp4xx/coyote-setup.c | |||
| @@ -66,7 +66,7 @@ static struct plat_serial8250_port coyote_uart_data[] = { | |||
| 66 | 66 | ||
| 67 | static struct platform_device coyote_uart = { | 67 | static struct platform_device coyote_uart = { |
| 68 | .name = "serial8250", | 68 | .name = "serial8250", |
| 69 | .id = 0, | 69 | .id = PLAT8250_DEV_PLATFORM, |
| 70 | .dev = { | 70 | .dev = { |
| 71 | .platform_data = coyote_uart_data, | 71 | .platform_data = coyote_uart_data, |
| 72 | }, | 72 | }, |
diff --git a/arch/arm/mach-ixp4xx/gtwx5715-setup.c b/arch/arm/mach-ixp4xx/gtwx5715-setup.c index 3fd92c5cbaa8..29a6d02fa851 100644 --- a/arch/arm/mach-ixp4xx/gtwx5715-setup.c +++ b/arch/arm/mach-ixp4xx/gtwx5715-setup.c | |||
| @@ -93,7 +93,7 @@ static struct plat_serial8250_port gtwx5715_uart_platform_data[] = { | |||
| 93 | 93 | ||
| 94 | static struct platform_device gtwx5715_uart_device = { | 94 | static struct platform_device gtwx5715_uart_device = { |
| 95 | .name = "serial8250", | 95 | .name = "serial8250", |
| 96 | .id = 0, | 96 | .id = PLAT8250_DEV_PLATFORM, |
| 97 | .dev = { | 97 | .dev = { |
| 98 | .platform_data = gtwx5715_uart_platform_data, | 98 | .platform_data = gtwx5715_uart_platform_data, |
| 99 | }, | 99 | }, |
diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c index 6c14ff3c23a0..ae1fa099d5fa 100644 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c | |||
| @@ -96,7 +96,7 @@ static struct plat_serial8250_port ixdp425_uart_data[] = { | |||
| 96 | 96 | ||
| 97 | static struct platform_device ixdp425_uart = { | 97 | static struct platform_device ixdp425_uart = { |
| 98 | .name = "serial8250", | 98 | .name = "serial8250", |
| 99 | .id = 0, | 99 | .id = PLAT8250_DEV_PLATFORM, |
| 100 | .dev.platform_data = ixdp425_uart_data, | 100 | .dev.platform_data = ixdp425_uart_data, |
| 101 | .num_resources = 2, | 101 | .num_resources = 2, |
| 102 | .resource = ixdp425_uart_resources | 102 | .resource = ixdp425_uart_resources |
diff --git a/arch/arm/mach-omap1/Kconfig b/arch/arm/mach-omap1/Kconfig index 7408ac94f771..27fc2e8e5fca 100644 --- a/arch/arm/mach-omap1/Kconfig +++ b/arch/arm/mach-omap1/Kconfig | |||
| @@ -47,6 +47,14 @@ config MACH_OMAP_OSK | |||
| 47 | TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here | 47 | TI OMAP 5912 OSK (OMAP Starter Kit) board support. Say Y here |
| 48 | if you have such a board. | 48 | if you have such a board. |
| 49 | 49 | ||
| 50 | config OMAP_OSK_MISTRAL | ||
| 51 | bool "Mistral QVGA board Support" | ||
| 52 | depends on MACH_OMAP_OSK | ||
| 53 | help | ||
| 54 | The OSK supports an optional add-on board with a Quarter-VGA | ||
| 55 | touchscreen, PDA-ish buttons, a resume button, bicolor LED, | ||
| 56 | and camera connector. Say Y here if you have this board. | ||
| 57 | |||
| 50 | config MACH_OMAP_PERSEUS2 | 58 | config MACH_OMAP_PERSEUS2 |
| 51 | bool "TI Perseus2" | 59 | bool "TI Perseus2" |
| 52 | depends on ARCH_OMAP1 && ARCH_OMAP730 | 60 | depends on ARCH_OMAP1 && ARCH_OMAP730 |
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index d386fd913f0c..181a93deaaee 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | # Common support | 5 | # Common support |
| 6 | obj-y := io.o id.o irq.o time.o serial.o | 6 | obj-y := io.o id.o irq.o time.o serial.o devices.o |
| 7 | led-y := leds.o | 7 | led-y := leds.o |
| 8 | 8 | ||
| 9 | # Specific board support | 9 | # Specific board support |
| @@ -23,6 +23,7 @@ endif | |||
| 23 | 23 | ||
| 24 | # LEDs support | 24 | # LEDs support |
| 25 | led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o | 25 | led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o |
| 26 | led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o | ||
| 26 | led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o | 27 | led-$(CONFIG_MACH_OMAP_INNOVATOR) += leds-innovator.o |
| 27 | led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o | 28 | led-$(CONFIG_MACH_OMAP_PERSEUS2) += leds-h2p2-debug.o |
| 28 | led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o | 29 | led-$(CONFIG_MACH_OMAP_OSK) += leds-osk.o |
diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 122796ebe8f5..c209c7172a9a 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c | |||
| @@ -48,19 +48,43 @@ static struct omap_usb_config generic1510_usb_config __initdata = { | |||
| 48 | 48 | ||
| 49 | #if defined(CONFIG_ARCH_OMAP16XX) | 49 | #if defined(CONFIG_ARCH_OMAP16XX) |
| 50 | static struct omap_usb_config generic1610_usb_config __initdata = { | 50 | static struct omap_usb_config generic1610_usb_config __initdata = { |
| 51 | #ifdef CONFIG_USB_OTG | ||
| 52 | .otg = 1, | ||
| 53 | #endif | ||
| 51 | .register_host = 1, | 54 | .register_host = 1, |
| 52 | .register_dev = 1, | 55 | .register_dev = 1, |
| 53 | .hmc_mode = 16, | 56 | .hmc_mode = 16, |
| 54 | .pins[0] = 6, | 57 | .pins[0] = 6, |
| 55 | }; | 58 | }; |
| 59 | |||
| 60 | static struct omap_mmc_config generic_mmc_config __initdata = { | ||
| 61 | .mmc [0] = { | ||
| 62 | .enabled = 0, | ||
| 63 | .wire4 = 0, | ||
| 64 | .wp_pin = -1, | ||
| 65 | .power_pin = -1, | ||
| 66 | .switch_pin = -1, | ||
| 67 | }, | ||
| 68 | .mmc [1] = { | ||
| 69 | .enabled = 0, | ||
| 70 | .wire4 = 0, | ||
| 71 | .wp_pin = -1, | ||
| 72 | .power_pin = -1, | ||
| 73 | .switch_pin = -1, | ||
| 74 | }, | ||
| 75 | }; | ||
| 76 | |||
| 56 | #endif | 77 | #endif |
| 57 | 78 | ||
| 58 | static struct omap_board_config_kernel generic_config[] = { | 79 | static struct omap_board_config_kernel generic_config[] = { |
| 59 | { OMAP_TAG_USB, NULL }, | 80 | { OMAP_TAG_USB, NULL }, |
| 81 | { OMAP_TAG_MMC, &generic_mmc_config }, | ||
| 60 | }; | 82 | }; |
| 61 | 83 | ||
| 62 | static void __init omap_generic_init(void) | 84 | static void __init omap_generic_init(void) |
| 63 | { | 85 | { |
| 86 | const struct omap_uart_config *uart_conf; | ||
| 87 | |||
| 64 | /* | 88 | /* |
| 65 | * Make sure the serial ports are muxed on at this point. | 89 | * Make sure the serial ports are muxed on at this point. |
| 66 | * You have to mux them off in device drivers later on | 90 | * You have to mux them off in device drivers later on |
| @@ -76,6 +100,18 @@ static void __init omap_generic_init(void) | |||
| 76 | generic_config[0].data = &generic1610_usb_config; | 100 | generic_config[0].data = &generic1610_usb_config; |
| 77 | } | 101 | } |
| 78 | #endif | 102 | #endif |
| 103 | |||
| 104 | uart_conf = omap_get_config(OMAP_TAG_UART, struct omap_uart_config); | ||
| 105 | if (uart_conf != NULL) { | ||
| 106 | unsigned int enabled_ports, i; | ||
| 107 | |||
| 108 | enabled_ports = uart_conf->enabled_uarts; | ||
| 109 | for (i = 0; i < 3; i++) { | ||
| 110 | if (!(enabled_ports & (1 << i))) | ||
| 111 | generic_serial_ports[i] = 0; | ||
| 112 | } | ||
| 113 | } | ||
| 114 | |||
| 79 | omap_board_config = generic_config; | 115 | omap_board_config = generic_config; |
| 80 | omap_board_config_size = ARRAY_SIZE(generic_config); | 116 | omap_board_config_size = ARRAY_SIZE(generic_config); |
| 81 | omap_serial_init(generic_serial_ports); | 117 | omap_serial_init(generic_serial_ports); |
| @@ -83,7 +119,7 @@ static void __init omap_generic_init(void) | |||
| 83 | 119 | ||
| 84 | static void __init omap_generic_map_io(void) | 120 | static void __init omap_generic_map_io(void) |
| 85 | { | 121 | { |
| 86 | omap_map_common_io() | 122 | omap_map_common_io(); |
| 87 | } | 123 | } |
| 88 | 124 | ||
| 89 | MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") | 125 | MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710") |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index f4983ee95ab4..d46a70063b0c 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <asm/mach/map.h> | 33 | #include <asm/mach/map.h> |
| 34 | 34 | ||
| 35 | #include <asm/arch/gpio.h> | 35 | #include <asm/arch/gpio.h> |
| 36 | #include <asm/arch/mux.h> | ||
| 36 | #include <asm/arch/tc.h> | 37 | #include <asm/arch/tc.h> |
| 37 | #include <asm/arch/usb.h> | 38 | #include <asm/arch/usb.h> |
| 38 | #include <asm/arch/common.h> | 39 | #include <asm/arch/common.h> |
| @@ -80,8 +81,7 @@ static struct flash_platform_data h2_flash_data = { | |||
| 80 | }; | 81 | }; |
| 81 | 82 | ||
| 82 | static struct resource h2_flash_resource = { | 83 | static struct resource h2_flash_resource = { |
| 83 | .start = OMAP_CS2B_PHYS, | 84 | /* This is on CS3, wherever it's mapped */ |
| 84 | .end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1, | ||
| 85 | .flags = IORESOURCE_MEM, | 85 | .flags = IORESOURCE_MEM, |
| 86 | }; | 86 | }; |
| 87 | 87 | ||
| @@ -126,10 +126,9 @@ static void __init h2_init_smc91x(void) | |||
| 126 | printk("Error requesting gpio 0 for smc91x irq\n"); | 126 | printk("Error requesting gpio 0 for smc91x irq\n"); |
| 127 | return; | 127 | return; |
| 128 | } | 128 | } |
| 129 | omap_set_gpio_edge_ctrl(0, OMAP_GPIO_FALLING_EDGE); | ||
| 130 | } | 129 | } |
| 131 | 130 | ||
| 132 | void h2_init_irq(void) | 131 | static void __init h2_init_irq(void) |
| 133 | { | 132 | { |
| 134 | omap_init_irq(); | 133 | omap_init_irq(); |
| 135 | omap_gpio_init(); | 134 | omap_gpio_init(); |
| @@ -152,9 +151,13 @@ static struct omap_usb_config h2_usb_config __initdata = { | |||
| 152 | }; | 151 | }; |
| 153 | 152 | ||
| 154 | static struct omap_mmc_config h2_mmc_config __initdata = { | 153 | static struct omap_mmc_config h2_mmc_config __initdata = { |
| 155 | .mmc_blocks = 1, | 154 | .mmc [0] = { |
| 156 | .mmc1_power_pin = -1, /* tps65010 gpio3 */ | 155 | .enabled = 1, |
| 157 | .mmc1_switch_pin = OMAP_MPUIO(1), | 156 | .wire4 = 1, |
| 157 | .wp_pin = OMAP_MPUIO(3), | ||
| 158 | .power_pin = -1, /* tps65010 gpio3 */ | ||
| 159 | .switch_pin = OMAP_MPUIO(1), | ||
| 160 | }, | ||
| 158 | }; | 161 | }; |
| 159 | 162 | ||
| 160 | static struct omap_board_config_kernel h2_config[] = { | 163 | static struct omap_board_config_kernel h2_config[] = { |
| @@ -164,6 +167,16 @@ static struct omap_board_config_kernel h2_config[] = { | |||
| 164 | 167 | ||
| 165 | static void __init h2_init(void) | 168 | static void __init h2_init(void) |
| 166 | { | 169 | { |
| 170 | /* NOTE: revC boards support NAND-boot, which can put NOR on CS2B | ||
| 171 | * and NAND (either 16bit or 8bit) on CS3. | ||
| 172 | */ | ||
| 173 | h2_flash_resource.end = h2_flash_resource.start = omap_cs3_phys(); | ||
| 174 | h2_flash_resource.end += SZ_32M - 1; | ||
| 175 | |||
| 176 | /* MMC: card detect and WP */ | ||
| 177 | // omap_cfg_reg(U19_ARMIO1); /* CD */ | ||
| 178 | omap_cfg_reg(BALLOUT_V8_ARMIO3); /* WP */ | ||
| 179 | |||
| 167 | platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); | 180 | platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices)); |
| 168 | omap_board_config = h2_config; | 181 | omap_board_config = h2_config; |
| 169 | omap_board_config_size = ARRAY_SIZE(h2_config); | 182 | omap_board_config_size = ARRAY_SIZE(h2_config); |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 7cd419d61b40..2798613696fa 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
| @@ -82,8 +82,7 @@ static struct flash_platform_data h3_flash_data = { | |||
| 82 | }; | 82 | }; |
| 83 | 83 | ||
| 84 | static struct resource h3_flash_resource = { | 84 | static struct resource h3_flash_resource = { |
| 85 | .start = OMAP_CS2B_PHYS, | 85 | /* This is on CS3, wherever it's mapped */ |
| 86 | .end = OMAP_CS2B_PHYS + OMAP_CS2B_SIZE - 1, | ||
| 87 | .flags = IORESOURCE_MEM, | 86 | .flags = IORESOURCE_MEM, |
| 88 | }; | 87 | }; |
| 89 | 88 | ||
| @@ -161,13 +160,26 @@ static struct omap_usb_config h3_usb_config __initdata = { | |||
| 161 | .pins[1] = 3, | 160 | .pins[1] = 3, |
| 162 | }; | 161 | }; |
| 163 | 162 | ||
| 163 | static struct omap_mmc_config h3_mmc_config __initdata = { | ||
| 164 | .mmc[0] = { | ||
| 165 | .enabled = 1, | ||
| 166 | .power_pin = -1, /* tps65010 GPIO4 */ | ||
| 167 | .switch_pin = OMAP_MPUIO(1), | ||
| 168 | }, | ||
| 169 | }; | ||
| 170 | |||
| 164 | static struct omap_board_config_kernel h3_config[] = { | 171 | static struct omap_board_config_kernel h3_config[] = { |
| 165 | { OMAP_TAG_USB, &h3_usb_config }, | 172 | { OMAP_TAG_USB, &h3_usb_config }, |
| 173 | { OMAP_TAG_MMC, &h3_mmc_config }, | ||
| 166 | }; | 174 | }; |
| 167 | 175 | ||
| 168 | static void __init h3_init(void) | 176 | static void __init h3_init(void) |
| 169 | { | 177 | { |
| 178 | h3_flash_resource.end = h3_flash_resource.start = omap_cs3_phys(); | ||
| 179 | h3_flash_resource.end += OMAP_CS3_SIZE - 1; | ||
| 170 | (void) platform_add_devices(devices, ARRAY_SIZE(devices)); | 180 | (void) platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 181 | omap_board_config = h3_config; | ||
| 182 | omap_board_config_size = ARRAY_SIZE(h3_config); | ||
| 171 | } | 183 | } |
| 172 | 184 | ||
| 173 | static void __init h3_init_smc91x(void) | 185 | static void __init h3_init_smc91x(void) |
| @@ -177,7 +189,6 @@ static void __init h3_init_smc91x(void) | |||
| 177 | printk("Error requesting gpio 40 for smc91x irq\n"); | 189 | printk("Error requesting gpio 40 for smc91x irq\n"); |
| 178 | return; | 190 | return; |
| 179 | } | 191 | } |
| 180 | omap_set_gpio_edge_ctrl(40, OMAP_GPIO_FALLING_EDGE); | ||
| 181 | } | 192 | } |
| 182 | 193 | ||
| 183 | void h3_init_irq(void) | 194 | void h3_init_irq(void) |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 91de60a91ef8..df0312b596e4 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <asm/mach/flash.h> | 29 | #include <asm/mach/flash.h> |
| 30 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
| 31 | 31 | ||
| 32 | #include <asm/arch/mux.h> | ||
| 32 | #include <asm/arch/fpga.h> | 33 | #include <asm/arch/fpga.h> |
| 33 | #include <asm/arch/gpio.h> | 34 | #include <asm/arch/gpio.h> |
| 34 | #include <asm/arch/tc.h> | 35 | #include <asm/arch/tc.h> |
| @@ -173,7 +174,6 @@ static void __init innovator_init_smc91x(void) | |||
| 173 | printk("Error requesting gpio 0 for smc91x irq\n"); | 174 | printk("Error requesting gpio 0 for smc91x irq\n"); |
| 174 | return; | 175 | return; |
| 175 | } | 176 | } |
| 176 | omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE); | ||
| 177 | } | 177 | } |
| 178 | } | 178 | } |
| 179 | 179 | ||
| @@ -220,8 +220,19 @@ static struct omap_usb_config h2_usb_config __initdata = { | |||
| 220 | }; | 220 | }; |
| 221 | #endif | 221 | #endif |
| 222 | 222 | ||
| 223 | static struct omap_mmc_config innovator_mmc_config __initdata = { | ||
| 224 | .mmc [0] = { | ||
| 225 | .enabled = 1, | ||
| 226 | .wire4 = 1, | ||
| 227 | .wp_pin = OMAP_MPUIO(3), | ||
| 228 | .power_pin = -1, /* FPGA F3 UIO42 */ | ||
| 229 | .switch_pin = -1, /* FPGA F4 UIO43 */ | ||
| 230 | }, | ||
| 231 | }; | ||
| 232 | |||
| 223 | static struct omap_board_config_kernel innovator_config[] = { | 233 | static struct omap_board_config_kernel innovator_config[] = { |
| 224 | { OMAP_TAG_USB, NULL }, | 234 | { OMAP_TAG_USB, NULL }, |
| 235 | { OMAP_TAG_MMC, &innovator_mmc_config }, | ||
| 225 | }; | 236 | }; |
| 226 | 237 | ||
| 227 | static void __init innovator_init(void) | 238 | static void __init innovator_init(void) |
diff --git a/arch/arm/mach-omap1/board-netstar.c b/arch/arm/mach-omap1/board-netstar.c index 6750b2014092..d904e643f5ec 100644 --- a/arch/arm/mach-omap1/board-netstar.c +++ b/arch/arm/mach-omap1/board-netstar.c | |||
| @@ -75,16 +75,15 @@ static void __init netstar_init(void) | |||
| 75 | mdelay(50); /* 50ms until PHY ready */ | 75 | mdelay(50); /* 50ms until PHY ready */ |
| 76 | /* smc91x interrupt pin */ | 76 | /* smc91x interrupt pin */ |
| 77 | omap_request_gpio(8); | 77 | omap_request_gpio(8); |
| 78 | omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE); | ||
| 79 | 78 | ||
| 80 | omap_request_gpio(12); | 79 | omap_request_gpio(12); |
| 81 | omap_request_gpio(13); | 80 | omap_request_gpio(13); |
| 82 | omap_request_gpio(14); | 81 | omap_request_gpio(14); |
| 83 | omap_request_gpio(15); | 82 | omap_request_gpio(15); |
| 84 | omap_set_gpio_edge_ctrl(12, OMAP_GPIO_FALLING_EDGE); | 83 | set_irq_type(OMAP_GPIO_IRQ(12), IRQT_FALLING); |
| 85 | omap_set_gpio_edge_ctrl(13, OMAP_GPIO_FALLING_EDGE); | 84 | set_irq_type(OMAP_GPIO_IRQ(13), IRQT_FALLING); |
| 86 | omap_set_gpio_edge_ctrl(14, OMAP_GPIO_FALLING_EDGE); | 85 | set_irq_type(OMAP_GPIO_IRQ(14), IRQT_FALLING); |
| 87 | omap_set_gpio_edge_ctrl(15, OMAP_GPIO_FALLING_EDGE); | 86 | set_irq_type(OMAP_GPIO_IRQ(15), IRQT_FALLING); |
| 88 | 87 | ||
| 89 | platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices)); | 88 | platform_add_devices(netstar_devices, ARRAY_SIZE(netstar_devices)); |
| 90 | 89 | ||
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 6844e536c698..21103df50415 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
| @@ -29,11 +29,16 @@ | |||
| 29 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
| 30 | #include <linux/init.h> | 30 | #include <linux/init.h> |
| 31 | #include <linux/device.h> | 31 | #include <linux/device.h> |
| 32 | #include <linux/interrupt.h> | ||
| 33 | |||
| 34 | #include <linux/mtd/mtd.h> | ||
| 35 | #include <linux/mtd/partitions.h> | ||
| 32 | 36 | ||
| 33 | #include <asm/hardware.h> | 37 | #include <asm/hardware.h> |
| 34 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
| 35 | #include <asm/mach/arch.h> | 39 | #include <asm/mach/arch.h> |
| 36 | #include <asm/mach/map.h> | 40 | #include <asm/mach/map.h> |
| 41 | #include <asm/mach/flash.h> | ||
| 37 | 42 | ||
| 38 | #include <asm/arch/gpio.h> | 43 | #include <asm/arch/gpio.h> |
| 39 | #include <asm/arch/usb.h> | 44 | #include <asm/arch/usb.h> |
| @@ -41,12 +46,56 @@ | |||
| 41 | #include <asm/arch/tc.h> | 46 | #include <asm/arch/tc.h> |
| 42 | #include <asm/arch/common.h> | 47 | #include <asm/arch/common.h> |
| 43 | 48 | ||
| 44 | static struct map_desc osk5912_io_desc[] __initdata = { | 49 | static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0}; |
| 45 | { OMAP_OSK_NOR_FLASH_BASE, OMAP_OSK_NOR_FLASH_START, OMAP_OSK_NOR_FLASH_SIZE, | 50 | |
| 46 | MT_DEVICE }, | 51 | static struct mtd_partition osk_partitions[] = { |
| 52 | /* bootloader (U-Boot, etc) in first sector */ | ||
| 53 | { | ||
| 54 | .name = "bootloader", | ||
| 55 | .offset = 0, | ||
| 56 | .size = SZ_128K, | ||
| 57 | .mask_flags = MTD_WRITEABLE, /* force read-only */ | ||
| 58 | }, | ||
| 59 | /* bootloader params in the next sector */ | ||
| 60 | { | ||
| 61 | .name = "params", | ||
| 62 | .offset = MTDPART_OFS_APPEND, | ||
| 63 | .size = SZ_128K, | ||
| 64 | .mask_flags = 0, | ||
| 65 | }, { | ||
| 66 | .name = "kernel", | ||
| 67 | .offset = MTDPART_OFS_APPEND, | ||
| 68 | .size = SZ_2M, | ||
| 69 | .mask_flags = 0 | ||
| 70 | }, { | ||
| 71 | .name = "filesystem", | ||
| 72 | .offset = MTDPART_OFS_APPEND, | ||
| 73 | .size = MTDPART_SIZ_FULL, | ||
| 74 | .mask_flags = 0 | ||
| 75 | } | ||
| 47 | }; | 76 | }; |
| 48 | 77 | ||
| 49 | static int __initdata osk_serial_ports[OMAP_MAX_NR_PORTS] = {1, 0, 0}; | 78 | static struct flash_platform_data osk_flash_data = { |
| 79 | .map_name = "cfi_probe", | ||
| 80 | .width = 2, | ||
| 81 | .parts = osk_partitions, | ||
| 82 | .nr_parts = ARRAY_SIZE(osk_partitions), | ||
| 83 | }; | ||
| 84 | |||
| 85 | static struct resource osk_flash_resource = { | ||
| 86 | /* this is on CS3, wherever it's mapped */ | ||
| 87 | .flags = IORESOURCE_MEM, | ||
| 88 | }; | ||
| 89 | |||
| 90 | static struct platform_device osk5912_flash_device = { | ||
| 91 | .name = "omapflash", | ||
| 92 | .id = 0, | ||
| 93 | .dev = { | ||
| 94 | .platform_data = &osk_flash_data, | ||
| 95 | }, | ||
| 96 | .num_resources = 1, | ||
| 97 | .resource = &osk_flash_resource, | ||
| 98 | }; | ||
| 50 | 99 | ||
| 51 | static struct resource osk5912_smc91x_resources[] = { | 100 | static struct resource osk5912_smc91x_resources[] = { |
| 52 | [0] = { | 101 | [0] = { |
| @@ -86,9 +135,16 @@ static struct platform_device osk5912_cf_device = { | |||
| 86 | .resource = osk5912_cf_resources, | 135 | .resource = osk5912_cf_resources, |
| 87 | }; | 136 | }; |
| 88 | 137 | ||
| 138 | static struct platform_device osk5912_mcbsp1_device = { | ||
| 139 | .name = "omap_mcbsp", | ||
| 140 | .id = 1, | ||
| 141 | }; | ||
| 142 | |||
| 89 | static struct platform_device *osk5912_devices[] __initdata = { | 143 | static struct platform_device *osk5912_devices[] __initdata = { |
| 144 | &osk5912_flash_device, | ||
| 90 | &osk5912_smc91x_device, | 145 | &osk5912_smc91x_device, |
| 91 | &osk5912_cf_device, | 146 | &osk5912_cf_device, |
| 147 | &osk5912_mcbsp1_device, | ||
| 92 | }; | 148 | }; |
| 93 | 149 | ||
| 94 | static void __init osk_init_smc91x(void) | 150 | static void __init osk_init_smc91x(void) |
| @@ -97,7 +153,6 @@ static void __init osk_init_smc91x(void) | |||
| 97 | printk("Error requesting gpio 0 for smc91x irq\n"); | 153 | printk("Error requesting gpio 0 for smc91x irq\n"); |
| 98 | return; | 154 | return; |
| 99 | } | 155 | } |
| 100 | omap_set_gpio_edge_ctrl(0, OMAP_GPIO_RISING_EDGE); | ||
| 101 | 156 | ||
| 102 | /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */ | 157 | /* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */ |
| 103 | EMIFS_CCS(1) |= 0x2; | 158 | EMIFS_CCS(1) |= 0x2; |
| @@ -110,11 +165,11 @@ static void __init osk_init_cf(void) | |||
| 110 | printk("Error requesting gpio 62 for CF irq\n"); | 165 | printk("Error requesting gpio 62 for CF irq\n"); |
| 111 | return; | 166 | return; |
| 112 | } | 167 | } |
| 113 | /* it's really active-low */ | 168 | /* the CF I/O IRQ is really active-low */ |
| 114 | omap_set_gpio_edge_ctrl(62, OMAP_GPIO_FALLING_EDGE); | 169 | set_irq_type(OMAP_GPIO_IRQ(62), IRQT_FALLING); |
| 115 | } | 170 | } |
| 116 | 171 | ||
| 117 | void osk_init_irq(void) | 172 | static void __init osk_init_irq(void) |
| 118 | { | 173 | { |
| 119 | omap_init_irq(); | 174 | omap_init_irq(); |
| 120 | omap_gpio_init(); | 175 | omap_gpio_init(); |
| @@ -142,18 +197,69 @@ static struct omap_board_config_kernel osk_config[] = { | |||
| 142 | { OMAP_TAG_USB, &osk_usb_config }, | 197 | { OMAP_TAG_USB, &osk_usb_config }, |
| 143 | }; | 198 | }; |
| 144 | 199 | ||
| 200 | #ifdef CONFIG_OMAP_OSK_MISTRAL | ||
| 201 | |||
| 202 | #ifdef CONFIG_PM | ||
| 203 | static irqreturn_t | ||
| 204 | osk_mistral_wake_interrupt(int irq, void *ignored, struct pt_regs *regs) | ||
| 205 | { | ||
| 206 | return IRQ_HANDLED; | ||
| 207 | } | ||
| 208 | #endif | ||
| 209 | |||
| 210 | static void __init osk_mistral_init(void) | ||
| 211 | { | ||
| 212 | /* FIXME here's where to feed in framebuffer, touchpad, and | ||
| 213 | * keyboard setup ... not in the drivers for those devices! | ||
| 214 | * | ||
| 215 | * NOTE: we could actually tell if there's a Mistral board | ||
| 216 | * attached, e.g. by trying to read something from the ads7846. | ||
| 217 | * But this is too early for that... | ||
| 218 | */ | ||
| 219 | |||
| 220 | /* the sideways button (SW1) is for use as a "wakeup" button */ | ||
| 221 | omap_cfg_reg(N15_1610_MPUIO2); | ||
| 222 | if (omap_request_gpio(OMAP_MPUIO(2)) == 0) { | ||
| 223 | int ret = 0; | ||
| 224 | omap_set_gpio_direction(OMAP_MPUIO(2), 1); | ||
| 225 | set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING); | ||
| 226 | #ifdef CONFIG_PM | ||
| 227 | /* share the IRQ in case someone wants to use the | ||
| 228 | * button for more than wakeup from system sleep. | ||
| 229 | */ | ||
| 230 | ret = request_irq(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), | ||
| 231 | &osk_mistral_wake_interrupt, | ||
| 232 | SA_SHIRQ, "mistral_wakeup", | ||
| 233 | &osk_mistral_wake_interrupt); | ||
| 234 | if (ret != 0) { | ||
| 235 | omap_free_gpio(OMAP_MPUIO(2)); | ||
| 236 | printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n", | ||
| 237 | ret); | ||
| 238 | } else | ||
| 239 | enable_irq_wake(OMAP_GPIO_IRQ(OMAP_MPUIO(2))); | ||
| 240 | #endif | ||
| 241 | } else | ||
| 242 | printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n"); | ||
| 243 | } | ||
| 244 | #else | ||
| 245 | static void __init osk_mistral_init(void) { } | ||
| 246 | #endif | ||
| 247 | |||
| 145 | static void __init osk_init(void) | 248 | static void __init osk_init(void) |
| 146 | { | 249 | { |
| 250 | osk_flash_resource.end = osk_flash_resource.start = omap_cs3_phys(); | ||
| 251 | osk_flash_resource.end += SZ_32M - 1; | ||
| 147 | platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); | 252 | platform_add_devices(osk5912_devices, ARRAY_SIZE(osk5912_devices)); |
| 148 | omap_board_config = osk_config; | 253 | omap_board_config = osk_config; |
| 149 | omap_board_config_size = ARRAY_SIZE(osk_config); | 254 | omap_board_config_size = ARRAY_SIZE(osk_config); |
| 150 | USB_TRANSCEIVER_CTRL_REG |= (3 << 1); | 255 | USB_TRANSCEIVER_CTRL_REG |= (3 << 1); |
| 256 | |||
| 257 | osk_mistral_init(); | ||
| 151 | } | 258 | } |
| 152 | 259 | ||
| 153 | static void __init osk_map_io(void) | 260 | static void __init osk_map_io(void) |
| 154 | { | 261 | { |
| 155 | omap_map_common_io(); | 262 | omap_map_common_io(); |
| 156 | iotable_init(osk5912_io_desc, ARRAY_SIZE(osk5912_io_desc)); | ||
| 157 | omap_serial_init(osk_serial_ports); | 263 | omap_serial_init(osk_serial_ports); |
| 158 | } | 264 | } |
| 159 | 265 | ||
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 213317392d9b..107c68c8ab54 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <asm/mach/flash.h> | 24 | #include <asm/mach/flash.h> |
| 25 | #include <asm/mach/map.h> | 25 | #include <asm/mach/map.h> |
| 26 | 26 | ||
| 27 | #include <asm/arch/tc.h> | ||
| 27 | #include <asm/arch/gpio.h> | 28 | #include <asm/arch/gpio.h> |
| 28 | #include <asm/arch/mux.h> | 29 | #include <asm/arch/mux.h> |
| 29 | #include <asm/arch/fpga.h> | 30 | #include <asm/arch/fpga.h> |
| @@ -83,8 +84,8 @@ static struct flash_platform_data p2_flash_data = { | |||
| 83 | }; | 84 | }; |
| 84 | 85 | ||
| 85 | static struct resource p2_flash_resource = { | 86 | static struct resource p2_flash_resource = { |
| 86 | .start = OMAP_FLASH_0_START, | 87 | .start = OMAP_CS0_PHYS, |
| 87 | .end = OMAP_FLASH_0_START + OMAP_FLASH_0_SIZE - 1, | 88 | .end = OMAP_CS0_PHYS + SZ_32M - 1, |
| 88 | .flags = IORESOURCE_MEM, | 89 | .flags = IORESOURCE_MEM, |
| 89 | }; | 90 | }; |
| 90 | 91 | ||
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index e42281988990..bf30b1acda0b 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
| @@ -25,13 +25,14 @@ | |||
| 25 | #include <asm/hardware.h> | 25 | #include <asm/hardware.h> |
| 26 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
| 27 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
| 28 | #include <asm/mach/flash.h> | ||
| 28 | #include <asm/mach/map.h> | 29 | #include <asm/mach/map.h> |
| 29 | 30 | ||
| 31 | #include <asm/arch/common.h> | ||
| 30 | #include <asm/arch/gpio.h> | 32 | #include <asm/arch/gpio.h> |
| 31 | #include <asm/arch/tc.h> | ||
| 32 | #include <asm/arch/mux.h> | 33 | #include <asm/arch/mux.h> |
| 34 | #include <asm/arch/tc.h> | ||
| 33 | #include <asm/arch/usb.h> | 35 | #include <asm/arch/usb.h> |
| 34 | #include <asm/arch/common.h> | ||
| 35 | 36 | ||
| 36 | extern void omap_init_time(void); | 37 | extern void omap_init_time(void); |
| 37 | extern int omap_gpio_init(void); | 38 | extern int omap_gpio_init(void); |
| @@ -74,7 +75,7 @@ static struct plat_serial8250_port voiceblue_ports[] = { | |||
| 74 | 75 | ||
| 75 | static struct platform_device serial_device = { | 76 | static struct platform_device serial_device = { |
| 76 | .name = "serial8250", | 77 | .name = "serial8250", |
| 77 | .id = 1, | 78 | .id = PLAT8250_DEV_PLATFORM1, |
| 78 | .dev = { | 79 | .dev = { |
| 79 | .platform_data = voiceblue_ports, | 80 | .platform_data = voiceblue_ports, |
| 80 | }, | 81 | }, |
| @@ -86,6 +87,27 @@ static int __init ext_uart_init(void) | |||
| 86 | } | 87 | } |
| 87 | arch_initcall(ext_uart_init); | 88 | arch_initcall(ext_uart_init); |
| 88 | 89 | ||
| 90 | static struct flash_platform_data voiceblue_flash_data = { | ||
| 91 | .map_name = "cfi_probe", | ||
| 92 | .width = 2, | ||
| 93 | }; | ||
| 94 | |||
| 95 | static struct resource voiceblue_flash_resource = { | ||
| 96 | .start = OMAP_CS0_PHYS, | ||
| 97 | .end = OMAP_CS0_PHYS + SZ_32M - 1, | ||
| 98 | .flags = IORESOURCE_MEM, | ||
| 99 | }; | ||
| 100 | |||
| 101 | static struct platform_device voiceblue_flash_device = { | ||
| 102 | .name = "omapflash", | ||
| 103 | .id = 0, | ||
| 104 | .dev = { | ||
| 105 | .platform_data = &voiceblue_flash_data, | ||
| 106 | }, | ||
| 107 | .num_resources = 1, | ||
| 108 | .resource = &voiceblue_flash_resource, | ||
| 109 | }; | ||
| 110 | |||
| 89 | static struct resource voiceblue_smc91x_resources[] = { | 111 | static struct resource voiceblue_smc91x_resources[] = { |
| 90 | [0] = { | 112 | [0] = { |
| 91 | .start = OMAP_CS2_PHYS + 0x300, | 113 | .start = OMAP_CS2_PHYS + 0x300, |
| @@ -107,6 +129,7 @@ static struct platform_device voiceblue_smc91x_device = { | |||
| 107 | }; | 129 | }; |
| 108 | 130 | ||
| 109 | static struct platform_device *voiceblue_devices[] __initdata = { | 131 | static struct platform_device *voiceblue_devices[] __initdata = { |
| 132 | &voiceblue_flash_device, | ||
| 110 | &voiceblue_smc91x_device, | 133 | &voiceblue_smc91x_device, |
| 111 | }; | 134 | }; |
| 112 | 135 | ||
| @@ -119,8 +142,17 @@ static struct omap_usb_config voiceblue_usb_config __initdata = { | |||
| 119 | .pins[2] = 6, | 142 | .pins[2] = 6, |
| 120 | }; | 143 | }; |
| 121 | 144 | ||
| 145 | static struct omap_mmc_config voiceblue_mmc_config __initdata = { | ||
| 146 | .mmc[0] = { | ||
| 147 | .enabled = 1, | ||
| 148 | .power_pin = 2, | ||
| 149 | .switch_pin = -1, | ||
| 150 | }, | ||
| 151 | }; | ||
| 152 | |||
| 122 | static struct omap_board_config_kernel voiceblue_config[] = { | 153 | static struct omap_board_config_kernel voiceblue_config[] = { |
| 123 | { OMAP_TAG_USB, &voiceblue_usb_config }, | 154 | { OMAP_TAG_USB, &voiceblue_usb_config }, |
| 155 | { OMAP_TAG_MMC, &voiceblue_mmc_config }, | ||
| 124 | }; | 156 | }; |
| 125 | 157 | ||
| 126 | static void __init voiceblue_init_irq(void) | 158 | static void __init voiceblue_init_irq(void) |
| @@ -131,9 +163,6 @@ static void __init voiceblue_init_irq(void) | |||
| 131 | 163 | ||
| 132 | static void __init voiceblue_init(void) | 164 | static void __init voiceblue_init(void) |
| 133 | { | 165 | { |
| 134 | /* There is a good chance board is going up, so enable Power LED | ||
| 135 | * (it is connected through invertor) */ | ||
| 136 | omap_writeb(0x00, OMAP_LPG1_LCR); | ||
| 137 | /* Watchdog */ | 166 | /* Watchdog */ |
| 138 | omap_request_gpio(0); | 167 | omap_request_gpio(0); |
| 139 | /* smc91x reset */ | 168 | /* smc91x reset */ |
| @@ -145,7 +174,6 @@ static void __init voiceblue_init(void) | |||
| 145 | mdelay(50); /* 50ms until PHY ready */ | 174 | mdelay(50); /* 50ms until PHY ready */ |
| 146 | /* smc91x interrupt pin */ | 175 | /* smc91x interrupt pin */ |
| 147 | omap_request_gpio(8); | 176 | omap_request_gpio(8); |
| 148 | omap_set_gpio_edge_ctrl(8, OMAP_GPIO_RISING_EDGE); | ||
| 149 | /* 16C554 reset*/ | 177 | /* 16C554 reset*/ |
| 150 | omap_request_gpio(6); | 178 | omap_request_gpio(6); |
| 151 | omap_set_gpio_direction(6, 0); | 179 | omap_set_gpio_direction(6, 0); |
| @@ -155,14 +183,19 @@ static void __init voiceblue_init(void) | |||
| 155 | omap_request_gpio(13); | 183 | omap_request_gpio(13); |
| 156 | omap_request_gpio(14); | 184 | omap_request_gpio(14); |
| 157 | omap_request_gpio(15); | 185 | omap_request_gpio(15); |
| 158 | omap_set_gpio_edge_ctrl(12, OMAP_GPIO_RISING_EDGE); | 186 | set_irq_type(OMAP_GPIO_IRQ(12), IRQT_RISING); |
| 159 | omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); | 187 | set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING); |
| 160 | omap_set_gpio_edge_ctrl(14, OMAP_GPIO_RISING_EDGE); | 188 | set_irq_type(OMAP_GPIO_IRQ(14), IRQT_RISING); |
| 161 | omap_set_gpio_edge_ctrl(15, OMAP_GPIO_RISING_EDGE); | 189 | set_irq_type(OMAP_GPIO_IRQ(15), IRQT_RISING); |
| 162 | 190 | ||
| 163 | platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices)); | 191 | platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices)); |
| 164 | omap_board_config = voiceblue_config; | 192 | omap_board_config = voiceblue_config; |
| 165 | omap_board_config_size = ARRAY_SIZE(voiceblue_config); | 193 | omap_board_config_size = ARRAY_SIZE(voiceblue_config); |
| 194 | |||
| 195 | /* There is a good chance board is going up, so enable power LED | ||
| 196 | * (it is connected through invertor) */ | ||
| 197 | omap_writeb(0x00, OMAP_LPG1_LCR); | ||
| 198 | omap_writeb(0x00, OMAP_LPG1_PMR); /* Disable clock */ | ||
| 166 | } | 199 | } |
| 167 | 200 | ||
| 168 | static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1}; | 201 | static int __initdata omap_serial_ports[OMAP_MAX_NR_PORTS] = {1, 1, 1}; |
| @@ -184,9 +217,9 @@ static int panic_event(struct notifier_block *this, unsigned long event, | |||
| 184 | if (test_and_set_bit(MACHINE_PANICED, &machine_state)) | 217 | if (test_and_set_bit(MACHINE_PANICED, &machine_state)) |
| 185 | return NOTIFY_DONE; | 218 | return NOTIFY_DONE; |
| 186 | 219 | ||
| 187 | /* Flash Power LED | 220 | /* Flash power LED */ |
| 188 | * (TODO: Enable clock right way (enabled in bootloader already)) */ | ||
| 189 | omap_writeb(0x78, OMAP_LPG1_LCR); | 221 | omap_writeb(0x78, OMAP_LPG1_LCR); |
| 222 | omap_writeb(0x01, OMAP_LPG1_PMR); /* Enable clock */ | ||
| 190 | 223 | ||
| 191 | return NOTIFY_DONE; | 224 | return NOTIFY_DONE; |
| 192 | } | 225 | } |
| @@ -195,15 +228,14 @@ static struct notifier_block panic_block = { | |||
| 195 | .notifier_call = panic_event, | 228 | .notifier_call = panic_event, |
| 196 | }; | 229 | }; |
| 197 | 230 | ||
| 198 | static int __init setup_notifier(void) | 231 | static int __init voiceblue_setup(void) |
| 199 | { | 232 | { |
| 200 | /* Setup panic notifier */ | 233 | /* Setup panic notifier */ |
| 201 | notifier_chain_register(&panic_notifier_list, &panic_block); | 234 | notifier_chain_register(&panic_notifier_list, &panic_block); |
| 202 | 235 | ||
| 203 | return 0; | 236 | return 0; |
| 204 | } | 237 | } |
| 205 | 238 | postcore_initcall(voiceblue_setup); | |
| 206 | postcore_initcall(setup_notifier); | ||
| 207 | 239 | ||
| 208 | static int wdt_gpio_state; | 240 | static int wdt_gpio_state; |
| 209 | 241 | ||
diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c new file mode 100644 index 000000000000..e8b3981444cd --- /dev/null +++ b/arch/arm/mach-omap1/devices.c | |||
| @@ -0,0 +1,351 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/arm/mach-omap1/devices.c | ||
| 3 | * | ||
| 4 | * OMAP1 platform device setup/initialization | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <linux/config.h> | ||
| 13 | #include <linux/module.h> | ||
| 14 | #include <linux/kernel.h> | ||
| 15 | #include <linux/init.h> | ||
| 16 | #include <linux/device.h> | ||
| 17 | |||
| 18 | #include <asm/hardware.h> | ||
| 19 | #include <asm/io.h> | ||
| 20 | #include <asm/mach-types.h> | ||
| 21 | #include <asm/mach/map.h> | ||
| 22 | |||
| 23 | #include <asm/arch/tc.h> | ||
| 24 | #include <asm/arch/board.h> | ||
| 25 | #include <asm/arch/mux.h> | ||
| 26 | #include <asm/arch/gpio.h> | ||
| 27 | |||
| 28 | |||
| 29 | static void omap_nop_release(struct device *dev) | ||
| 30 | { | ||
| 31 | /* Nothing */ | ||
| 32 | } | ||
| 33 | |||
| 34 | /*-------------------------------------------------------------------------*/ | ||
| 35 | |||
| 36 | #if defined(CONFIG_I2C_OMAP) || defined(CONFIG_I2C_OMAP_MODULE) | ||
| 37 | |||
| 38 | #define OMAP_I2C_BASE 0xfffb3800 | ||
| 39 | |||
| 40 | static struct resource i2c_resources[] = { | ||
| 41 | { | ||
| 42 | .start = OMAP_I2C_BASE, | ||
| 43 | .end = OMAP_I2C_BASE + 0x3f, | ||
| 44 | .flags = IORESOURCE_MEM, | ||
| 45 | }, | ||
| 46 | { | ||
| 47 | .start = INT_I2C, | ||
| 48 | .flags = IORESOURCE_IRQ, | ||
| 49 | }, | ||
| 50 | }; | ||
| 51 | |||
| 52 | /* DMA not used; works around erratum writing to non-empty i2c fifo */ | ||
| 53 | |||
| 54 | static struct platform_device omap_i2c_device = { | ||
| 55 | .name = "i2c_omap", | ||
| 56 | .id = -1, | ||
| 57 | .dev = { | ||
| 58 | .release = omap_nop_release, | ||
| 59 | }, | ||
| 60 | .num_resources = ARRAY_SIZE(i2c_resources), | ||
| 61 | .resource = i2c_resources, | ||
| 62 | }; | ||
| 63 | |||
| 64 | static void omap_init_i2c(void) | ||
| 65 | { | ||
| 66 | /* FIXME define and use a boot tag, in case of boards that | ||
| 67 | * either don't wire up I2C, or chips that mux it differently... | ||
| 68 | * it can include clocking and address info, maybe more. | ||
| 69 | */ | ||
| 70 | omap_cfg_reg(I2C_SCL); | ||
| 71 | omap_cfg_reg(I2C_SDA); | ||
| 72 | |||
| 73 | (void) platform_device_register(&omap_i2c_device); | ||
| 74 | } | ||
| 75 | #else | ||
| 76 | static inline void omap_init_i2c(void) {} | ||
| 77 | #endif | ||
| 78 | |||
| 79 | /*-------------------------------------------------------------------------*/ | ||
| 80 | |||
| 81 | #if defined(CONFIG_OMAP1610_IR) || defined(CONFIG_OMAP161O_IR_MODULE) | ||
| 82 | |||
| 83 | static u64 irda_dmamask = 0xffffffff; | ||
| 84 | |||
| 85 | static struct platform_device omap1610ir_device = { | ||
| 86 | .name = "omap1610-ir", | ||
| 87 | .id = -1, | ||
| 88 | .dev = { | ||
| 89 | .release = omap_nop_release, | ||
| 90 | .dma_mask = &irda_dmamask, | ||
| 91 | }, | ||
| 92 | }; | ||
| 93 | |||
| 94 | static void omap_init_irda(void) | ||
| 95 | { | ||
| 96 | /* FIXME define and use a boot tag, members something like: | ||
| 97 | * u8 uart; // uart1, or uart3 | ||
| 98 | * ... but driver only handles uart3 for now | ||
| 99 | * s16 fir_sel; // gpio for SIR vs FIR | ||
| 100 | * ... may prefer a callback for SIR/MIR/FIR mode select; | ||
| 101 | * while h2 uses a GPIO, H3 uses a gpio expander | ||
| 102 | */ | ||
| 103 | if (machine_is_omap_h2() | ||
| 104 | || machine_is_omap_h3()) | ||
| 105 | (void) platform_device_register(&omap1610ir_device); | ||
| 106 | } | ||
| 107 | #else | ||
| 108 | static inline void omap_init_irda(void) {} | ||
| 109 | #endif | ||
| 110 | |||
| 111 | /*-------------------------------------------------------------------------*/ | ||
| 112 | |||
| 113 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | ||
| 114 | |||
| 115 | #define OMAP_MMC1_BASE 0xfffb7800 | ||
| 116 | #define OMAP_MMC2_BASE 0xfffb7c00 /* omap16xx only */ | ||
| 117 | |||
| 118 | static struct omap_mmc_conf mmc1_conf; | ||
| 119 | |||
| 120 | static u64 mmc1_dmamask = 0xffffffff; | ||
| 121 | |||
| 122 | static struct resource mmc1_resources[] = { | ||
| 123 | { | ||
| 124 | .start = IO_ADDRESS(OMAP_MMC1_BASE), | ||
| 125 | .end = IO_ADDRESS(OMAP_MMC1_BASE) + 0x7f, | ||
| 126 | .flags = IORESOURCE_MEM, | ||
| 127 | }, | ||
| 128 | { | ||
| 129 | .start = INT_MMC, | ||
| 130 | .flags = IORESOURCE_IRQ, | ||
| 131 | }, | ||
| 132 | }; | ||
| 133 | |||
| 134 | static struct platform_device mmc_omap_device1 = { | ||
| 135 | .name = "mmci-omap", | ||
| 136 | .id = 1, | ||
| 137 | .dev = { | ||
| 138 | .release = omap_nop_release, | ||
| 139 | .dma_mask = &mmc1_dmamask, | ||
| 140 | .platform_data = &mmc1_conf, | ||
| 141 | }, | ||
| 142 | .num_resources = ARRAY_SIZE(mmc1_resources), | ||
| 143 | .resource = mmc1_resources, | ||
| 144 | }; | ||
| 145 | |||
| 146 | #ifdef CONFIG_ARCH_OMAP16XX | ||
| 147 | |||
| 148 | static struct omap_mmc_conf mmc2_conf; | ||
| 149 | |||
| 150 | static u64 mmc2_dmamask = 0xffffffff; | ||
| 151 | |||
| 152 | static struct resource mmc2_resources[] = { | ||
| 153 | { | ||
| 154 | .start = IO_ADDRESS(OMAP_MMC2_BASE), | ||
| 155 | .end = IO_ADDRESS(OMAP_MMC2_BASE) + 0x7f, | ||
| 156 | .flags = IORESOURCE_MEM, | ||
| 157 | }, | ||
| 158 | { | ||
| 159 | .start = INT_1610_MMC2, | ||
| 160 | .flags = IORESOURCE_IRQ, | ||
| 161 | }, | ||
| 162 | }; | ||
| 163 | |||
| 164 | static struct platform_device mmc_omap_device2 = { | ||
| 165 | .name = "mmci-omap", | ||
| 166 | .id = 2, | ||
| 167 | .dev = { | ||
| 168 | .release = omap_nop_release, | ||
| 169 | .dma_mask = &mmc2_dmamask, | ||
| 170 | .platform_data = &mmc2_conf, | ||
| 171 | }, | ||
| 172 | .num_resources = ARRAY_SIZE(mmc2_resources), | ||
| 173 | .resource = mmc2_resources, | ||
| 174 | }; | ||
| 175 | #endif | ||
| 176 | |||
| 177 | static void __init omap_init_mmc(void) | ||
| 178 | { | ||
| 179 | const struct omap_mmc_config *mmc_conf; | ||
| 180 | const struct omap_mmc_conf *mmc; | ||
| 181 | |||
| 182 | /* NOTE: assumes MMC was never (wrongly) enabled */ | ||
| 183 | mmc_conf = omap_get_config(OMAP_TAG_MMC, struct omap_mmc_config); | ||
| 184 | if (!mmc_conf) | ||
| 185 | return; | ||
| 186 | |||
| 187 | /* block 1 is always available and has just one pinout option */ | ||
| 188 | mmc = &mmc_conf->mmc[0]; | ||
| 189 | if (mmc->enabled) { | ||
| 190 | omap_cfg_reg(MMC_CMD); | ||
| 191 | omap_cfg_reg(MMC_CLK); | ||
| 192 | omap_cfg_reg(MMC_DAT0); | ||
| 193 | if (cpu_is_omap1710()) { | ||
| 194 | omap_cfg_reg(M15_1710_MMC_CLKI); | ||
| 195 | omap_cfg_reg(P19_1710_MMC_CMDDIR); | ||
| 196 | omap_cfg_reg(P20_1710_MMC_DATDIR0); | ||
| 197 | } | ||
| 198 | if (mmc->wire4) { | ||
| 199 | omap_cfg_reg(MMC_DAT1); | ||
| 200 | /* NOTE: DAT2 can be on W10 (here) or M15 */ | ||
| 201 | if (!mmc->nomux) | ||
| 202 | omap_cfg_reg(MMC_DAT2); | ||
| 203 | omap_cfg_reg(MMC_DAT3); | ||
| 204 | } | ||
| 205 | mmc1_conf = *mmc; | ||
| 206 | (void) platform_device_register(&mmc_omap_device1); | ||
| 207 | } | ||
| 208 | |||
| 209 | #ifdef CONFIG_ARCH_OMAP16XX | ||
| 210 | /* block 2 is on newer chips, and has many pinout options */ | ||
| 211 | mmc = &mmc_conf->mmc[1]; | ||
| 212 | if (mmc->enabled) { | ||
| 213 | if (!mmc->nomux) { | ||
| 214 | omap_cfg_reg(Y8_1610_MMC2_CMD); | ||
| 215 | omap_cfg_reg(Y10_1610_MMC2_CLK); | ||
| 216 | omap_cfg_reg(R18_1610_MMC2_CLKIN); | ||
| 217 | omap_cfg_reg(W8_1610_MMC2_DAT0); | ||
| 218 | if (mmc->wire4) { | ||
| 219 | omap_cfg_reg(V8_1610_MMC2_DAT1); | ||
| 220 | omap_cfg_reg(W15_1610_MMC2_DAT2); | ||
| 221 | omap_cfg_reg(R10_1610_MMC2_DAT3); | ||
| 222 | } | ||
| 223 | |||
| 224 | /* These are needed for the level shifter */ | ||
| 225 | omap_cfg_reg(V9_1610_MMC2_CMDDIR); | ||
| 226 | omap_cfg_reg(V5_1610_MMC2_DATDIR0); | ||
| 227 | omap_cfg_reg(W19_1610_MMC2_DATDIR1); | ||
| 228 | } | ||
| 229 | |||
| 230 | /* Feedback clock must be set on OMAP-1710 MMC2 */ | ||
| 231 | if (cpu_is_omap1710()) | ||
| 232 | omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), | ||
| 233 | MOD_CONF_CTRL_1); | ||
| 234 | mmc2_conf = *mmc; | ||
| 235 | (void) platform_device_register(&mmc_omap_device2); | ||
| 236 | } | ||
| 237 | #endif | ||
| 238 | return; | ||
| 239 | } | ||
| 240 | #else | ||
| 241 | static inline void omap_init_mmc(void) {} | ||
| 242 | #endif | ||
| 243 | |||
| 244 | #if defined(CONFIG_OMAP_RTC) || defined(CONFIG_OMAP_RTC) | ||
| 245 | |||
| 246 | #define OMAP_RTC_BASE 0xfffb4800 | ||
| 247 | |||
| 248 | static struct resource rtc_resources[] = { | ||
| 249 | { | ||
| 250 | .start = OMAP_RTC_BASE, | ||
| 251 | .end = OMAP_RTC_BASE + 0x5f, | ||
| 252 | .flags = IORESOURCE_MEM, | ||
| 253 | }, | ||
| 254 | { | ||
| 255 | .start = INT_RTC_TIMER, | ||
| 256 | .flags = IORESOURCE_IRQ, | ||
| 257 | }, | ||
| 258 | { | ||
| 259 | .start = INT_RTC_ALARM, | ||
| 260 | .flags = IORESOURCE_IRQ, | ||
| 261 | }, | ||
| 262 | }; | ||
| 263 | |||
| 264 | static struct platform_device omap_rtc_device = { | ||
| 265 | .name = "omap_rtc", | ||
| 266 | .id = -1, | ||
| 267 | .dev = { | ||
| 268 | .release = omap_nop_release, | ||
| 269 | }, | ||
| 270 | .num_resources = ARRAY_SIZE(rtc_resources), | ||
| 271 | .resource = rtc_resources, | ||
| 272 | }; | ||
| 273 | |||
| 274 | static void omap_init_rtc(void) | ||
| 275 | { | ||
| 276 | (void) platform_device_register(&omap_rtc_device); | ||
| 277 | } | ||
| 278 | #else | ||
| 279 | static inline void omap_init_rtc(void) {} | ||
| 280 | #endif | ||
| 281 | |||
| 282 | /*-------------------------------------------------------------------------*/ | ||
| 283 | |||
| 284 | #if defined(CONFIG_OMAP16XX_WATCHDOG) || defined(CONFIG_OMAP16XX_WATCHDOG_MODULE) | ||
| 285 | |||
| 286 | #define OMAP_WDT_BASE 0xfffeb000 | ||
| 287 | |||
| 288 | static struct resource wdt_resources[] = { | ||
| 289 | { | ||
| 290 | .start = OMAP_WDT_BASE, | ||
| 291 | .end = OMAP_WDT_BASE + 0x4f, | ||
| 292 | .flags = IORESOURCE_MEM, | ||
| 293 | }, | ||
| 294 | }; | ||
| 295 | |||
| 296 | static struct platform_device omap_wdt_device = { | ||
| 297 | .name = "omap1610_wdt", | ||
| 298 | .id = -1, | ||
| 299 | .dev = { | ||
| 300 | .release = omap_nop_release, | ||
| 301 | }, | ||
| 302 | .num_resources = ARRAY_SIZE(wdt_resources), | ||
| 303 | .resource = wdt_resources, | ||
| 304 | }; | ||
| 305 | |||
| 306 | static void omap_init_wdt(void) | ||
| 307 | { | ||
| 308 | (void) platform_device_register(&omap_wdt_device); | ||
| 309 | } | ||
| 310 | #else | ||
| 311 | static inline void omap_init_wdt(void) {} | ||
| 312 | #endif | ||
| 313 | |||
| 314 | |||
| 315 | /*-------------------------------------------------------------------------*/ | ||
| 316 | |||
| 317 | /* | ||
| 318 | * This gets called after board-specific INIT_MACHINE, and initializes most | ||
| 319 | * on-chip peripherals accessible on this board (except for few like USB): | ||
| 320 | * | ||
| 321 | * (a) Does any "standard config" pin muxing needed. Board-specific | ||
| 322 | * code will have muxed GPIO pins and done "nonstandard" setup; | ||
| 323 | * that code could live in the boot loader. | ||
| 324 | * (b) Populating board-specific platform_data with the data drivers | ||
| 325 | * rely on to handle wiring variations. | ||
| 326 | * (c) Creating platform devices as meaningful on this board and | ||
| 327 | * with this kernel configuration. | ||
| 328 | * | ||
| 329 | * Claiming GPIOs, and setting their direction and initial values, is the | ||
| 330 | * responsibility of the device drivers. So is responding to probe(). | ||
| 331 | * | ||
| 332 | * Board-specific knowlege like creating devices or pin setup is to be | ||
| 333 | * kept out of drivers as much as possible. In particular, pin setup | ||
| 334 | * may be handled by the boot loader, and drivers should expect it will | ||
| 335 | * normally have been done by the time they're probed. | ||
| 336 | */ | ||
| 337 | static int __init omap_init_devices(void) | ||
| 338 | { | ||
| 339 | /* please keep these calls, and their implementations above, | ||
| 340 | * in alphabetical order so they're easier to sort through. | ||
| 341 | */ | ||
| 342 | omap_init_i2c(); | ||
| 343 | omap_init_irda(); | ||
| 344 | omap_init_mmc(); | ||
| 345 | omap_init_rtc(); | ||
| 346 | omap_init_wdt(); | ||
| 347 | |||
| 348 | return 0; | ||
| 349 | } | ||
| 350 | arch_initcall(omap_init_devices); | ||
| 351 | |||
diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index c12a78335625..aca2a120813a 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/fpga.c | 2 | * linux/arch/arm/mach-omap1/fpga.c |
| 3 | * | 3 | * |
| 4 | * Interrupt handler for OMAP-1510 Innovator FPGA | 4 | * Interrupt handler for OMAP-1510 Innovator FPGA |
| 5 | * | 5 | * |
| @@ -181,7 +181,7 @@ void omap1510_fpga_init_irq(void) | |||
| 181 | */ | 181 | */ |
| 182 | omap_request_gpio(13); | 182 | omap_request_gpio(13); |
| 183 | omap_set_gpio_direction(13, 1); | 183 | omap_set_gpio_direction(13, 1); |
| 184 | omap_set_gpio_edge_ctrl(13, OMAP_GPIO_RISING_EDGE); | 184 | set_irq_type(OMAP_GPIO_IRQ(13), IRQT_RISING); |
| 185 | set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux); | 185 | set_irq_chained_handler(OMAP1510_INT_FPGA, innovator_fpga_IRQ_demux); |
| 186 | } | 186 | } |
| 187 | 187 | ||
diff --git a/arch/arm/mach-omap1/io.c b/arch/arm/mach-omap1/io.c index 207df0fe934d..eb8261d7dead 100644 --- a/arch/arm/mach-omap1/io.c +++ b/arch/arm/mach-omap1/io.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | extern int clk_init(void); | 20 | extern int clk_init(void); |
| 21 | extern void omap_check_revision(void); | 21 | extern void omap_check_revision(void); |
| 22 | extern void omap_sram_init(void); | ||
| 22 | 23 | ||
| 23 | /* | 24 | /* |
| 24 | * The machine specific code may provide the extra mapping besides the | 25 | * The machine specific code may provide the extra mapping besides the |
| @@ -32,7 +33,6 @@ static struct map_desc omap_io_desc[] __initdata = { | |||
| 32 | static struct map_desc omap730_io_desc[] __initdata = { | 33 | static struct map_desc omap730_io_desc[] __initdata = { |
| 33 | { OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE }, | 34 | { OMAP730_DSP_BASE, OMAP730_DSP_START, OMAP730_DSP_SIZE, MT_DEVICE }, |
| 34 | { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE }, | 35 | { OMAP730_DSPREG_BASE, OMAP730_DSPREG_START, OMAP730_DSPREG_SIZE, MT_DEVICE }, |
| 35 | { OMAP730_SRAM_BASE, OMAP730_SRAM_START, OMAP730_SRAM_SIZE, MT_DEVICE } | ||
| 36 | }; | 36 | }; |
| 37 | #endif | 37 | #endif |
| 38 | 38 | ||
| @@ -40,27 +40,13 @@ static struct map_desc omap730_io_desc[] __initdata = { | |||
| 40 | static struct map_desc omap1510_io_desc[] __initdata = { | 40 | static struct map_desc omap1510_io_desc[] __initdata = { |
| 41 | { OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE }, | 41 | { OMAP1510_DSP_BASE, OMAP1510_DSP_START, OMAP1510_DSP_SIZE, MT_DEVICE }, |
| 42 | { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE }, | 42 | { OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_START, OMAP1510_DSPREG_SIZE, MT_DEVICE }, |
| 43 | { OMAP1510_SRAM_BASE, OMAP1510_SRAM_START, OMAP1510_SRAM_SIZE, MT_DEVICE } | ||
| 44 | }; | 43 | }; |
| 45 | #endif | 44 | #endif |
| 46 | 45 | ||
| 47 | #if defined(CONFIG_ARCH_OMAP16XX) | 46 | #if defined(CONFIG_ARCH_OMAP16XX) |
| 48 | static struct map_desc omap1610_io_desc[] __initdata = { | 47 | static struct map_desc omap16xx_io_desc[] __initdata = { |
| 49 | { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, | 48 | { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, |
| 50 | { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, | 49 | { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, |
| 51 | { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP1610_SRAM_SIZE, MT_DEVICE } | ||
| 52 | }; | ||
| 53 | |||
| 54 | static struct map_desc omap5912_io_desc[] __initdata = { | ||
| 55 | { OMAP16XX_DSP_BASE, OMAP16XX_DSP_START, OMAP16XX_DSP_SIZE, MT_DEVICE }, | ||
| 56 | { OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_START, OMAP16XX_DSPREG_SIZE, MT_DEVICE }, | ||
| 57 | /* | ||
| 58 | * The OMAP5912 has 250kByte internal SRAM. Because the mapping is baseed on page | ||
| 59 | * size (4kByte), it seems that the last 2kByte (=0x800) of the 250kByte are not mapped. | ||
| 60 | * Add additional 2kByte (0x800) so that the last page is mapped and the last 2kByte | ||
| 61 | * can be used. | ||
| 62 | */ | ||
| 63 | { OMAP16XX_SRAM_BASE, OMAP16XX_SRAM_START, OMAP5912_SRAM_SIZE + 0x800, MT_DEVICE } | ||
| 64 | }; | 50 | }; |
| 65 | #endif | 51 | #endif |
| 66 | 52 | ||
| @@ -86,14 +72,13 @@ static void __init _omap_map_io(void) | |||
| 86 | } | 72 | } |
| 87 | #endif | 73 | #endif |
| 88 | #if defined(CONFIG_ARCH_OMAP16XX) | 74 | #if defined(CONFIG_ARCH_OMAP16XX) |
| 89 | if (cpu_is_omap1610() || cpu_is_omap1710()) { | 75 | if (cpu_is_omap16xx()) { |
| 90 | iotable_init(omap1610_io_desc, ARRAY_SIZE(omap1610_io_desc)); | 76 | iotable_init(omap16xx_io_desc, ARRAY_SIZE(omap16xx_io_desc)); |
| 91 | } | ||
| 92 | if (cpu_is_omap5912()) { | ||
| 93 | iotable_init(omap5912_io_desc, ARRAY_SIZE(omap5912_io_desc)); | ||
| 94 | } | 77 | } |
| 95 | #endif | 78 | #endif |
| 96 | 79 | ||
| 80 | omap_sram_init(); | ||
| 81 | |||
| 97 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort | 82 | /* REVISIT: Refer to OMAP5910 Errata, Advisory SYS_1: "Timeout Abort |
| 98 | * on a Posted Write in the TIPB Bridge". | 83 | * on a Posted Write in the TIPB Bridge". |
| 99 | */ | 84 | */ |
| @@ -108,8 +93,9 @@ static void __init _omap_map_io(void) | |||
| 108 | /* | 93 | /* |
| 109 | * This should only get called from board specific init | 94 | * This should only get called from board specific init |
| 110 | */ | 95 | */ |
| 111 | void omap_map_common_io(void) | 96 | void __init omap_map_common_io(void) |
| 112 | { | 97 | { |
| 113 | if (!initialized) | 98 | if (!initialized) |
| 114 | _omap_map_io(); | 99 | _omap_map_io(); |
| 115 | } | 100 | } |
| 101 | |||
diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index afd5d67e4ae7..192ce6055faa 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/irq.c | 2 | * linux/arch/arm/mach-omap1/irq.c |
| 3 | * | 3 | * |
| 4 | * Interrupt handler for all OMAP boards | 4 | * Interrupt handler for all OMAP boards |
| 5 | * | 5 | * |
diff --git a/arch/arm/mach-omap1/leds-h2p2-debug.c b/arch/arm/mach-omap1/leds-h2p2-debug.c index ec0d8285f243..be283cda63dd 100644 --- a/arch/arm/mach-omap1/leds-h2p2-debug.c +++ b/arch/arm/mach-omap1/leds-h2p2-debug.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/leds-h2p2-debug.c | 2 | * linux/arch/arm/mach-omap1/leds-h2p2-debug.c |
| 3 | * | 3 | * |
| 4 | * Copyright 2003 by Texas Instruments Incorporated | 4 | * Copyright 2003 by Texas Instruments Incorporated |
| 5 | * | 5 | * |
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
| 14 | #include <linux/kernel_stat.h> | 14 | #include <linux/kernel_stat.h> |
| 15 | #include <linux/sched.h> | 15 | #include <linux/sched.h> |
| 16 | #include <linux/version.h> | ||
| 16 | 17 | ||
| 17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
| 18 | #include <asm/hardware.h> | 19 | #include <asm/hardware.h> |
diff --git a/arch/arm/mach-omap1/leds-innovator.c b/arch/arm/mach-omap1/leds-innovator.c index 8043b7d0f66e..c8ffd1ddcded 100644 --- a/arch/arm/mach-omap1/leds-innovator.c +++ b/arch/arm/mach-omap1/leds-innovator.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/leds-innovator.c | 2 | * linux/arch/arm/mach-omap1/leds-innovator.c |
| 3 | */ | 3 | */ |
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | #include <linux/init.h> | 5 | #include <linux/init.h> |
diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c index 4a0e8b9d4fc3..2c8bda847c18 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/leds-osk.c | 2 | * linux/arch/arm/mach-omap1/leds-osk.c |
| 3 | * | 3 | * |
| 4 | * LED driver for OSK, and optionally Mistral QVGA, boards | 4 | * LED driver for OSK, and optionally Mistral QVGA, boards |
| 5 | */ | 5 | */ |
| @@ -64,7 +64,7 @@ static void tps_work(void *unused) | |||
| 64 | 64 | ||
| 65 | static DECLARE_WORK(work, tps_work, NULL); | 65 | static DECLARE_WORK(work, tps_work, NULL); |
| 66 | 66 | ||
| 67 | #ifdef CONFIG_FB_OMAP | 67 | #ifdef CONFIG_OMAP_OSK_MISTRAL |
| 68 | 68 | ||
| 69 | /* For now, all system indicators require the Mistral board, since that | 69 | /* For now, all system indicators require the Mistral board, since that |
| 70 | * LED can be manipulated without a task context. This LED is either red, | 70 | * LED can be manipulated without a task context. This LED is either red, |
| @@ -127,7 +127,7 @@ void osk_leds_event(led_event_t evt) | |||
| 127 | hw_led_state = 0; | 127 | hw_led_state = 0; |
| 128 | break; | 128 | break; |
| 129 | 129 | ||
| 130 | #ifdef CONFIG_FB_OMAP | 130 | #ifdef CONFIG_OMAP_OSK_MISTRAL |
| 131 | 131 | ||
| 132 | case led_timer: | 132 | case led_timer: |
| 133 | hw_led_state ^= TIMER_LED; | 133 | hw_led_state ^= TIMER_LED; |
| @@ -144,7 +144,7 @@ void osk_leds_event(led_event_t evt) | |||
| 144 | mistral_setled(); | 144 | mistral_setled(); |
| 145 | break; | 145 | break; |
| 146 | 146 | ||
| 147 | #endif /* CONFIG_FB_OMAP */ | 147 | #endif /* CONFIG_OMAP_OSK_MISTRAL */ |
| 148 | 148 | ||
| 149 | /* "green" == tps LED1 (leftmost, normally power-good) | 149 | /* "green" == tps LED1 (leftmost, normally power-good) |
| 150 | * works only with DC adapter, not on battery power! | 150 | * works only with DC adapter, not on battery power! |
diff --git a/arch/arm/mach-omap1/leds.c b/arch/arm/mach-omap1/leds.c index 8ab21fe98e1b..5c6b1bb6e722 100644 --- a/arch/arm/mach-omap1/leds.c +++ b/arch/arm/mach-omap1/leds.c | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * linux/arch/arm/mach-omap/leds.c | 2 | * linux/arch/arm/mach-omap1/leds.c |
| 3 | * | 3 | * |
| 4 | * OMAP LEDs dispatcher | 4 | * OMAP LEDs dispatcher |
| 5 | */ | 5 | */ |
| @@ -20,7 +20,9 @@ omap_leds_init(void) | |||
| 20 | if (machine_is_omap_innovator()) | 20 | if (machine_is_omap_innovator()) |
| 21 | leds_event = innovator_leds_event; | 21 | leds_event = innovator_leds_event; |
| 22 | 22 | ||
| 23 | else if (machine_is_omap_h2() || machine_is_omap_perseus2()) | 23 | else if (machine_is_omap_h2() |
| 24 | || machine_is_omap_h3() | ||
| 25 | || machine_is_omap_perseus2()) | ||
| 24 | leds_event = h2p2_dbg_leds_event; | 26 | leds_event = h2p2_dbg_leds_event; |
| 25 | 27 | ||
| 26 | else if (machine_is_omap_osk()) | 28 | else if (machine_is_omap_osk()) |
| @@ -30,8 +32,12 @@ omap_leds_init(void) | |||
| 30 | return -1; | 32 | return -1; |
| 31 | 33 | ||
| 32 | if (machine_is_omap_h2() | 34 | if (machine_is_omap_h2() |
| 35 | || machine_is_omap_h3() | ||
| 33 | || machine_is_omap_perseus2() | 36 | || machine_is_omap_perseus2() |
| 34 | || machine_is_omap_osk()) { | 37 | #ifdef CONFIG_OMAP_OSK_MISTRAL |
| 38 | || machine_is_omap_osk() | ||
| 39 | #endif | ||
| 40 | ) { | ||
| 35 | 41 | ||
| 36 | /* LED1/LED2 pins can be used as GPIO (as done here), or by | 42 | /* LED1/LED2 pins can be used as GPIO (as done here), or by |
| 37 | * the LPG (works even in deep sleep!), to drive a bicolor | 43 | * the LPG (works even in deep sleep!), to drive a bicolor |
diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 214e5d17c8b5..40c4f7c40e73 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c | |||
| @@ -24,7 +24,11 @@ | |||
| 24 | 24 | ||
| 25 | #include <asm/arch/board.h> | 25 | #include <asm/arch/board.h> |
| 26 | #include <asm/arch/mux.h> | 26 | #include <asm/arch/mux.h> |
| 27 | #include <asm/arch/gpio.h> | ||
| 27 | #include <asm/arch/fpga.h> | 28 | #include <asm/arch/fpga.h> |
| 29 | #ifdef CONFIG_PM | ||
| 30 | #include <asm/arch/pm.h> | ||
| 31 | #endif | ||
| 28 | 32 | ||
| 29 | static struct clk * uart1_ck = NULL; | 33 | static struct clk * uart1_ck = NULL; |
| 30 | static struct clk * uart2_ck = NULL; | 34 | static struct clk * uart2_ck = NULL; |
| @@ -94,7 +98,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 94 | 98 | ||
| 95 | static struct platform_device serial_device = { | 99 | static struct platform_device serial_device = { |
| 96 | .name = "serial8250", | 100 | .name = "serial8250", |
| 97 | .id = 0, | 101 | .id = PLAT8250_DEV_PLATFORM, |
| 98 | .dev = { | 102 | .dev = { |
| 99 | .platform_data = serial_platform_data, | 103 | .platform_data = serial_platform_data, |
| 100 | }, | 104 | }, |
| @@ -193,6 +197,86 @@ void __init omap_serial_init(int ports[OMAP_MAX_NR_PORTS]) | |||
| 193 | } | 197 | } |
| 194 | } | 198 | } |
| 195 | 199 | ||
| 200 | #ifdef CONFIG_OMAP_SERIAL_WAKE | ||
| 201 | |||
| 202 | static irqreturn_t omap_serial_wake_interrupt(int irq, void *dev_id, | ||
| 203 | struct pt_regs *regs) | ||
| 204 | { | ||
| 205 | /* Need to do something with serial port right after wake-up? */ | ||
| 206 | return IRQ_HANDLED; | ||
| 207 | } | ||
| 208 | |||
| 209 | /* | ||
| 210 | * Reroutes serial RX lines to GPIO lines for the duration of | ||
| 211 | * sleep to allow waking up the device from serial port even | ||
| 212 | * in deep sleep. | ||
| 213 | */ | ||
| 214 | void omap_serial_wake_trigger(int enable) | ||
| 215 | { | ||
| 216 | if (!cpu_is_omap16xx()) | ||
| 217 | return; | ||
| 218 | |||
| 219 | if (uart1_ck != NULL) { | ||
| 220 | if (enable) | ||
| 221 | omap_cfg_reg(V14_16XX_GPIO37); | ||
| 222 | else | ||
| 223 | omap_cfg_reg(V14_16XX_UART1_RX); | ||
| 224 | } | ||
| 225 | if (uart2_ck != NULL) { | ||
| 226 | if (enable) | ||
| 227 | omap_cfg_reg(R9_16XX_GPIO18); | ||
| 228 | else | ||
| 229 | omap_cfg_reg(R9_16XX_UART2_RX); | ||
| 230 | } | ||
| 231 | if (uart3_ck != NULL) { | ||
| 232 | if (enable) | ||
| 233 | omap_cfg_reg(L14_16XX_GPIO49); | ||
| 234 | else | ||
| 235 | omap_cfg_reg(L14_16XX_UART3_RX); | ||
| 236 | } | ||
| 237 | } | ||
| 238 | |||
| 239 | static void __init omap_serial_set_port_wakeup(int gpio_nr) | ||
| 240 | { | ||
| 241 | int ret; | ||
| 242 | |||
| 243 | ret = omap_request_gpio(gpio_nr); | ||
| 244 | if (ret < 0) { | ||
| 245 | printk(KERN_ERR "Could not request UART wake GPIO: %i\n", | ||
| 246 | gpio_nr); | ||
| 247 | return; | ||
| 248 | } | ||
| 249 | omap_set_gpio_direction(gpio_nr, 1); | ||
| 250 | set_irq_type(OMAP_GPIO_IRQ(gpio_nr), IRQT_RISING); | ||
| 251 | ret = request_irq(OMAP_GPIO_IRQ(gpio_nr), &omap_serial_wake_interrupt, | ||
| 252 | 0, "serial wakeup", NULL); | ||
| 253 | if (ret) { | ||
| 254 | omap_free_gpio(gpio_nr); | ||
| 255 | printk(KERN_ERR "No interrupt for UART wake GPIO: %i\n", | ||
| 256 | gpio_nr); | ||
| 257 | return; | ||
| 258 | } | ||
| 259 | enable_irq_wake(OMAP_GPIO_IRQ(gpio_nr)); | ||
| 260 | } | ||
| 261 | |||
| 262 | static int __init omap_serial_wakeup_init(void) | ||
| 263 | { | ||
| 264 | if (!cpu_is_omap16xx()) | ||
| 265 | return 0; | ||
| 266 | |||
| 267 | if (uart1_ck != NULL) | ||
| 268 | omap_serial_set_port_wakeup(37); | ||
| 269 | if (uart2_ck != NULL) | ||
| 270 | omap_serial_set_port_wakeup(18); | ||
| 271 | if (uart3_ck != NULL) | ||
| 272 | omap_serial_set_port_wakeup(49); | ||
| 273 | |||
| 274 | return 0; | ||
| 275 | } | ||
| 276 | late_initcall(omap_serial_wakeup_init); | ||
| 277 | |||
| 278 | #endif /* CONFIG_OMAP_SERIAL_WAKE */ | ||
| 279 | |||
| 196 | static int __init omap_init(void) | 280 | static int __init omap_init(void) |
| 197 | { | 281 | { |
| 198 | return platform_device_register(&serial_device); | 282 | return platform_device_register(&serial_device); |
diff --git a/arch/arm/mach-omap1/time.c b/arch/arm/mach-omap1/time.c index d540539c9bbb..191a9b1ee9b7 100644 --- a/arch/arm/mach-omap1/time.c +++ b/arch/arm/mach-omap1/time.c | |||
| @@ -247,13 +247,6 @@ unsigned long long sched_clock(void) | |||
| 247 | #define OMAP_32K_TIMER_TCR 0x04 | 247 | #define OMAP_32K_TIMER_TCR 0x04 |
| 248 | 248 | ||
| 249 | #define OMAP_32K_TICKS_PER_HZ (32768 / HZ) | 249 | #define OMAP_32K_TICKS_PER_HZ (32768 / HZ) |
| 250 | #if (32768 % HZ) != 0 | ||
| 251 | /* We cannot ignore modulo. | ||
| 252 | * Potential error can be as high as several percent. | ||
| 253 | */ | ||
| 254 | #define OMAP_32K_TICK_MODULO (32768 % HZ) | ||
| 255 | static unsigned modulo_count = 0; /* Counts 1/HZ units */ | ||
| 256 | #endif | ||
| 257 | 250 | ||
| 258 | /* | 251 | /* |
| 259 | * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1 | 252 | * TRM says 1 / HZ = ( TVR + 1) / 32768, so TRV = (32768 / HZ) - 1 |
| @@ -296,13 +289,22 @@ static inline void omap_32k_timer_stop(void) | |||
| 296 | } | 289 | } |
| 297 | 290 | ||
| 298 | /* | 291 | /* |
| 299 | * Rounds down to nearest usec | 292 | * Rounds down to nearest usec. Note that this will overflow for larger values. |
| 300 | */ | 293 | */ |
| 301 | static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k) | 294 | static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k) |
| 302 | { | 295 | { |
| 303 | return (ticks_32k * 5*5*5*5*5*5) >> 9; | 296 | return (ticks_32k * 5*5*5*5*5*5) >> 9; |
| 304 | } | 297 | } |
| 305 | 298 | ||
| 299 | /* | ||
| 300 | * Rounds down to nearest nsec. | ||
| 301 | */ | ||
| 302 | static inline unsigned long long | ||
| 303 | omap_32k_ticks_to_nsecs(unsigned long ticks_32k) | ||
| 304 | { | ||
| 305 | return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9; | ||
| 306 | } | ||
| 307 | |||
| 306 | static unsigned long omap_32k_last_tick = 0; | 308 | static unsigned long omap_32k_last_tick = 0; |
| 307 | 309 | ||
| 308 | /* | 310 | /* |
| @@ -315,6 +317,15 @@ static unsigned long omap_32k_timer_gettimeoffset(void) | |||
| 315 | } | 317 | } |
| 316 | 318 | ||
| 317 | /* | 319 | /* |
| 320 | * Returns current time from boot in nsecs. It's OK for this to wrap | ||
| 321 | * around for now, as it's just a relative time stamp. | ||
| 322 | */ | ||
| 323 | unsigned long long sched_clock(void) | ||
| 324 | { | ||
| 325 | return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read()); | ||
| 326 | } | ||
| 327 | |||
| 328 | /* | ||
| 318 | * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this | 329 | * Timer interrupt for 32KHz timer. When dynamic tick is enabled, this |
| 319 | * function is also called from other interrupts to remove latency | 330 | * function is also called from other interrupts to remove latency |
| 320 | * issues with dynamic tick. In the dynamic tick case, we need to lock | 331 | * issues with dynamic tick. In the dynamic tick case, we need to lock |
| @@ -330,19 +341,6 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id, | |||
| 330 | now = omap_32k_sync_timer_read(); | 341 | now = omap_32k_sync_timer_read(); |
| 331 | 342 | ||
| 332 | while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) { | 343 | while (now - omap_32k_last_tick >= OMAP_32K_TICKS_PER_HZ) { |
| 333 | #ifdef OMAP_32K_TICK_MODULO | ||
| 334 | /* Modulo addition may put omap_32k_last_tick ahead of now | ||
| 335 | * and cause unwanted repetition of the while loop. | ||
| 336 | */ | ||
| 337 | if (unlikely(now - omap_32k_last_tick == ~0)) | ||
| 338 | break; | ||
| 339 | |||
| 340 | modulo_count += OMAP_32K_TICK_MODULO; | ||
| 341 | if (modulo_count > HZ) { | ||
| 342 | ++omap_32k_last_tick; | ||
| 343 | modulo_count -= HZ; | ||
| 344 | } | ||
| 345 | #endif | ||
| 346 | omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ; | 344 | omap_32k_last_tick += OMAP_32K_TICKS_PER_HZ; |
| 347 | timer_tick(regs); | 345 | timer_tick(regs); |
| 348 | } | 346 | } |
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index a10268618f74..e3587efec4bf 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c | |||
| @@ -140,7 +140,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 140 | 140 | ||
| 141 | static struct platform_device serial_device = { | 141 | static struct platform_device serial_device = { |
| 142 | .name = "serial8250", | 142 | .name = "serial8250", |
| 143 | .id = 0, | 143 | .id = PLAT8250_DEV_PLATFORM, |
| 144 | .dev = { | 144 | .dev = { |
| 145 | .platform_data = serial_platform_data, | 145 | .platform_data = serial_platform_data, |
| 146 | }, | 146 | }, |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index e9182242da95..1a3367da6408 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
| @@ -381,7 +381,7 @@ static struct plat_serial8250_port bast_sio_data[] = { | |||
| 381 | 381 | ||
| 382 | static struct platform_device bast_sio = { | 382 | static struct platform_device bast_sio = { |
| 383 | .name = "serial8250", | 383 | .name = "serial8250", |
| 384 | .id = 0, | 384 | .id = PLAT8250_DEV_PLATFORM, |
| 385 | .dev = { | 385 | .dev = { |
| 386 | .platform_data = &bast_sio_data, | 386 | .platform_data = &bast_sio_data, |
| 387 | }, | 387 | }, |
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index 924e8464c212..8f9ab2893df4 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c | |||
| @@ -221,7 +221,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 221 | 221 | ||
| 222 | static struct platform_device serial_device = { | 222 | static struct platform_device serial_device = { |
| 223 | .name = "serial8250", | 223 | .name = "serial8250", |
| 224 | .id = 0, | 224 | .id = PLAT8250_DEV_PLATFORM, |
| 225 | .dev = { | 225 | .dev = { |
| 226 | .platform_data = serial_platform_data, | 226 | .platform_data = serial_platform_data, |
| 227 | }, | 227 | }, |
diff --git a/arch/arm/mach-shark/core.c b/arch/arm/mach-shark/core.c index e737eae4521f..946c0d11c73b 100644 --- a/arch/arm/mach-shark/core.c +++ b/arch/arm/mach-shark/core.c | |||
| @@ -41,7 +41,7 @@ static struct plat_serial8250_port serial_platform_data[] = { | |||
| 41 | 41 | ||
| 42 | static struct platform_device serial_device = { | 42 | static struct platform_device serial_device = { |
| 43 | .name = "serial8250", | 43 | .name = "serial8250", |
| 44 | .id = 0, | 44 | .id = PLAT8250_DEV_PLATFORM, |
| 45 | .dev = { | 45 | .dev = { |
| 46 | .platform_data = serial_platform_data, | 46 | .platform_data = serial_platform_data, |
| 47 | }, | 47 | }, |
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index 191788fb18d1..b0208c992576 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -16,6 +16,58 @@ | |||
| 16 | #include <asm/tlbflush.h> | 16 | #include <asm/tlbflush.h> |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_CPU_CACHE_VIPT | 18 | #ifdef CONFIG_CPU_CACHE_VIPT |
| 19 | |||
| 20 | void flush_cache_mm(struct mm_struct *mm) | ||
| 21 | { | ||
| 22 | if (cache_is_vivt()) { | ||
| 23 | if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) | ||
| 24 | __cpuc_flush_user_all(); | ||
| 25 | return; | ||
| 26 | } | ||
| 27 | |||
| 28 | if (cache_is_vipt_aliasing()) { | ||
| 29 | asm( "mcr p15, 0, %0, c7, c14, 0\n" | ||
| 30 | " mcr p15, 0, %0, c7, c5, 0\n" | ||
| 31 | " mcr p15, 0, %0, c7, c10, 4" | ||
| 32 | : | ||
| 33 | : "r" (0) | ||
| 34 | : "cc"); | ||
| 35 | } | ||
| 36 | } | ||
| 37 | |||
| 38 | void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end) | ||
| 39 | { | ||
| 40 | if (cache_is_vivt()) { | ||
| 41 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) | ||
| 42 | __cpuc_flush_user_range(start & PAGE_MASK, PAGE_ALIGN(end), | ||
| 43 | vma->vm_flags); | ||
| 44 | return; | ||
| 45 | } | ||
| 46 | |||
| 47 | if (cache_is_vipt_aliasing()) { | ||
| 48 | asm( "mcr p15, 0, %0, c7, c14, 0\n" | ||
| 49 | " mcr p15, 0, %0, c7, c5, 0\n" | ||
| 50 | " mcr p15, 0, %0, c7, c10, 4" | ||
| 51 | : | ||
| 52 | : "r" (0) | ||
| 53 | : "cc"); | ||
| 54 | } | ||
| 55 | } | ||
| 56 | |||
| 57 | void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn) | ||
| 58 | { | ||
| 59 | if (cache_is_vivt()) { | ||
| 60 | if (cpu_isset(smp_processor_id(), vma->vm_mm->cpu_vm_mask)) { | ||
| 61 | unsigned long addr = user_addr & PAGE_MASK; | ||
| 62 | __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); | ||
| 63 | } | ||
| 64 | return; | ||
| 65 | } | ||
| 66 | |||
| 67 | if (cache_is_vipt_aliasing()) | ||
| 68 | flush_pfn_alias(pfn, user_addr); | ||
| 69 | } | ||
| 70 | |||
| 19 | #define ALIAS_FLUSH_START 0xffff4000 | 71 | #define ALIAS_FLUSH_START 0xffff4000 |
| 20 | 72 | ||
| 21 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | 73 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) |
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c index bf02b5026e62..8ef38544453c 100644 --- a/arch/i386/kernel/cpu/cpufreq/longhaul.c +++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c | |||
| @@ -467,11 +467,11 @@ static void __init longhaul_setup_voltagescaling(void) | |||
| 467 | } | 467 | } |
| 468 | 468 | ||
| 469 | if (vrmrev==0) { | 469 | if (vrmrev==0) { |
| 470 | dprintk ("VRM 8.5 \n"); | 470 | dprintk ("VRM 8.5\n"); |
| 471 | memcpy (voltage_table, vrm85scales, sizeof(voltage_table)); | 471 | memcpy (voltage_table, vrm85scales, sizeof(voltage_table)); |
| 472 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25; | 472 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/25; |
| 473 | } else { | 473 | } else { |
| 474 | dprintk ("Mobile VRM \n"); | 474 | dprintk ("Mobile VRM\n"); |
| 475 | memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table)); | 475 | memcpy (voltage_table, mobilevrmscales, sizeof(voltage_table)); |
| 476 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5; | 476 | numvscales = (voltage_table[maxvid]-voltage_table[minvid])/5; |
| 477 | } | 477 | } |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c index 327a55d4d1c6..c397b6220430 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-centrino.c | |||
| @@ -259,7 +259,7 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy) | |||
| 259 | 259 | ||
| 260 | if (model->op_points == NULL) { | 260 | if (model->op_points == NULL) { |
| 261 | /* Matched a non-match */ | 261 | /* Matched a non-match */ |
| 262 | dprintk(KERN_INFO PFX "no table support for CPU model \"%s\": \n", | 262 | dprintk(KERN_INFO PFX "no table support for CPU model \"%s\"\n", |
| 263 | cpu->x86_model_id); | 263 | cpu->x86_model_id); |
| 264 | #ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI | 264 | #ifndef CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI |
| 265 | dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); | 265 | dprintk(KERN_INFO PFX "try compiling with CONFIG_X86_SPEEDSTEP_CENTRINO_ACPI enabled\n"); |
| @@ -402,7 +402,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | |||
| 402 | 402 | ||
| 403 | for (i=0; i<p.state_count; i++) { | 403 | for (i=0; i<p.state_count; i++) { |
| 404 | if (p.states[i].control != p.states[i].status) { | 404 | if (p.states[i].control != p.states[i].status) { |
| 405 | dprintk("Different control (%x) and status values (%x)\n", | 405 | dprintk("Different control (%llu) and status values (%llu)\n", |
| 406 | p.states[i].control, p.states[i].status); | 406 | p.states[i].control, p.states[i].status); |
| 407 | result = -EINVAL; | 407 | result = -EINVAL; |
| 408 | goto err_unreg; | 408 | goto err_unreg; |
| @@ -415,7 +415,7 @@ static int centrino_cpu_init_acpi(struct cpufreq_policy *policy) | |||
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | if (p.states[i].core_frequency > p.states[0].core_frequency) { | 417 | if (p.states[i].core_frequency > p.states[0].core_frequency) { |
| 418 | dprintk("P%u has larger frequency (%u) than P0 (%u), skipping\n", i, | 418 | dprintk("P%u has larger frequency (%llu) than P0 (%llu), skipping\n", i, |
| 419 | p.states[i].core_frequency, p.states[0].core_frequency); | 419 | p.states[i].core_frequency, p.states[0].core_frequency); |
| 420 | p.states[i].core_frequency = 0; | 420 | p.states[i].core_frequency = 0; |
| 421 | continue; | 421 | continue; |
| @@ -498,13 +498,6 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | |||
| 498 | if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) | 498 | if (cpu->x86_vendor != X86_VENDOR_INTEL || !cpu_has(cpu, X86_FEATURE_EST)) |
| 499 | return -ENODEV; | 499 | return -ENODEV; |
| 500 | 500 | ||
| 501 | for (i = 0; i < N_IDS; i++) | ||
| 502 | if (centrino_verify_cpu_id(cpu, &cpu_ids[i])) | ||
| 503 | break; | ||
| 504 | |||
| 505 | if (i != N_IDS) | ||
| 506 | centrino_cpu[policy->cpu] = &cpu_ids[i]; | ||
| 507 | |||
| 508 | if (is_const_loops_cpu(policy->cpu)) { | 501 | if (is_const_loops_cpu(policy->cpu)) { |
| 509 | centrino_driver.flags |= CPUFREQ_CONST_LOOPS; | 502 | centrino_driver.flags |= CPUFREQ_CONST_LOOPS; |
| 510 | } | 503 | } |
| @@ -513,6 +506,13 @@ static int centrino_cpu_init(struct cpufreq_policy *policy) | |||
| 513 | if (policy->cpu != 0) | 506 | if (policy->cpu != 0) |
| 514 | return -ENODEV; | 507 | return -ENODEV; |
| 515 | 508 | ||
| 509 | for (i = 0; i < N_IDS; i++) | ||
| 510 | if (centrino_verify_cpu_id(cpu, &cpu_ids[i])) | ||
| 511 | break; | ||
| 512 | |||
| 513 | if (i != N_IDS) | ||
| 514 | centrino_cpu[policy->cpu] = &cpu_ids[i]; | ||
| 515 | |||
| 516 | if (!centrino_cpu[policy->cpu]) { | 516 | if (!centrino_cpu[policy->cpu]) { |
| 517 | dprintk(KERN_INFO PFX "found unsupported CPU with " | 517 | dprintk(KERN_INFO PFX "found unsupported CPU with " |
| 518 | "Enhanced SpeedStep: send /proc/cpuinfo to " | 518 | "Enhanced SpeedStep: send /proc/cpuinfo to " |
diff --git a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c index b25fb6b635ae..2718fb6f6aba 100644 --- a/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/i386/kernel/cpu/cpufreq/speedstep-smi.c | |||
| @@ -99,7 +99,7 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
| 99 | u32 function = GET_SPEEDSTEP_FREQS; | 99 | u32 function = GET_SPEEDSTEP_FREQS; |
| 100 | 100 | ||
| 101 | if (!(ist_info.event & 0xFFFF)) { | 101 | if (!(ist_info.event & 0xFFFF)) { |
| 102 | dprintk("bug #1422 -- can't read freqs from BIOS\n", result); | 102 | dprintk("bug #1422 -- can't read freqs from BIOS\n"); |
| 103 | return -ENODEV; | 103 | return -ENODEV; |
| 104 | } | 104 | } |
| 105 | 105 | ||
diff --git a/arch/i386/kernel/io_apic.c b/arch/i386/kernel/io_apic.c index 889eda2d7b17..1efdc76ae96d 100644 --- a/arch/i386/kernel/io_apic.c +++ b/arch/i386/kernel/io_apic.c | |||
| @@ -1634,9 +1634,9 @@ void disable_IO_APIC(void) | |||
| 1634 | clear_IO_APIC(); | 1634 | clear_IO_APIC(); |
| 1635 | 1635 | ||
| 1636 | /* | 1636 | /* |
| 1637 | * If the i82559 is routed through an IOAPIC | 1637 | * If the i8259 is routed through an IOAPIC |
| 1638 | * Put that IOAPIC in virtual wire mode | 1638 | * Put that IOAPIC in virtual wire mode |
| 1639 | * so legacy interrups can be delivered. | 1639 | * so legacy interrupts can be delivered. |
| 1640 | */ | 1640 | */ |
| 1641 | pin = find_isa_irq_pin(0, mp_ExtINT); | 1641 | pin = find_isa_irq_pin(0, mp_ExtINT); |
| 1642 | if (pin != -1) { | 1642 | if (pin != -1) { |
diff --git a/arch/i386/kernel/sigframe.h b/arch/i386/kernel/sigframe.h index d21b14f5c25c..0b2221711dad 100644 --- a/arch/i386/kernel/sigframe.h +++ b/arch/i386/kernel/sigframe.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | struct sigframe | 1 | struct sigframe |
| 2 | { | 2 | { |
| 3 | char *pretcode; | 3 | char __user *pretcode; |
| 4 | int sig; | 4 | int sig; |
| 5 | struct sigcontext sc; | 5 | struct sigcontext sc; |
| 6 | struct _fpstate fpstate; | 6 | struct _fpstate fpstate; |
| @@ -10,10 +10,10 @@ struct sigframe | |||
| 10 | 10 | ||
| 11 | struct rt_sigframe | 11 | struct rt_sigframe |
| 12 | { | 12 | { |
| 13 | char *pretcode; | 13 | char __user *pretcode; |
| 14 | int sig; | 14 | int sig; |
| 15 | struct siginfo *pinfo; | 15 | struct siginfo __user *pinfo; |
| 16 | void *puc; | 16 | void __user *puc; |
| 17 | struct siginfo info; | 17 | struct siginfo info; |
| 18 | struct ucontext uc; | 18 | struct ucontext uc; |
| 19 | struct _fpstate fpstate; | 19 | struct _fpstate fpstate; |
diff --git a/arch/i386/pci/i386.c b/arch/i386/pci/i386.c index 3cc480998a47..6d6338500c3c 100644 --- a/arch/i386/pci/i386.c +++ b/arch/i386/pci/i386.c | |||
| @@ -283,9 +283,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, | |||
| 283 | /* Write-combine setting is ignored, it is changed via the mtrr | 283 | /* Write-combine setting is ignored, it is changed via the mtrr |
| 284 | * interfaces on this platform. | 284 | * interfaces on this platform. |
| 285 | */ | 285 | */ |
| 286 | if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | 286 | if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, |
| 287 | vma->vm_end - vma->vm_start, | 287 | vma->vm_end - vma->vm_start, |
| 288 | vma->vm_page_prot)) | 288 | vma->vm_page_prot)) |
| 289 | return -EAGAIN; | 289 | return -EAGAIN; |
| 290 | 290 | ||
| 291 | return 0; | 291 | return 0; |
diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 00151a8320d8..ed25d66c8d50 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig | |||
| @@ -339,12 +339,6 @@ config IA64_PALINFO | |||
| 339 | To use this option, you have to ensure that the "/proc file system | 339 | To use this option, you have to ensure that the "/proc file system |
| 340 | support" (CONFIG_PROC_FS) is enabled, too. | 340 | support" (CONFIG_PROC_FS) is enabled, too. |
| 341 | 341 | ||
| 342 | config ACPI_DEALLOCATE_IRQ | ||
| 343 | bool | ||
| 344 | depends on ACPI | ||
| 345 | depends on IOSAPIC && EXPERIMENTAL | ||
| 346 | default y | ||
| 347 | |||
| 348 | source "drivers/firmware/Kconfig" | 342 | source "drivers/firmware/Kconfig" |
| 349 | 343 | ||
| 350 | source "fs/Kconfig.binfmt" | 344 | source "fs/Kconfig.binfmt" |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig index 1ca6e6e11b42..08112ab38468 100644 --- a/arch/ia64/configs/sn2_defconfig +++ b/arch/ia64/configs/sn2_defconfig | |||
| @@ -111,7 +111,6 @@ CONFIG_COMPAT=y | |||
| 111 | CONFIG_IA64_MCA_RECOVERY=y | 111 | CONFIG_IA64_MCA_RECOVERY=y |
| 112 | CONFIG_PERFMON=y | 112 | CONFIG_PERFMON=y |
| 113 | CONFIG_IA64_PALINFO=y | 113 | CONFIG_IA64_PALINFO=y |
| 114 | CONFIG_ACPI_DEALLOCATE_IRQ=y | ||
| 115 | 114 | ||
| 116 | # | 115 | # |
| 117 | # Firmware Drivers | 116 | # Firmware Drivers |
diff --git a/arch/ia64/configs/tiger_defconfig b/arch/ia64/configs/tiger_defconfig index 3ec94a12eac0..d452e18ac494 100644 --- a/arch/ia64/configs/tiger_defconfig +++ b/arch/ia64/configs/tiger_defconfig | |||
| @@ -109,7 +109,6 @@ CONFIG_COMPAT=y | |||
| 109 | CONFIG_IA64_MCA_RECOVERY=y | 109 | CONFIG_IA64_MCA_RECOVERY=y |
| 110 | CONFIG_PERFMON=y | 110 | CONFIG_PERFMON=y |
| 111 | CONFIG_IA64_PALINFO=y | 111 | CONFIG_IA64_PALINFO=y |
| 112 | CONFIG_ACPI_DEALLOCATE_IRQ=y | ||
| 113 | 112 | ||
| 114 | # | 113 | # |
| 115 | # Firmware Drivers | 114 | # Firmware Drivers |
diff --git a/arch/ia64/configs/zx1_defconfig b/arch/ia64/configs/zx1_defconfig index d4cf73d124bc..80b0e9eb7fb3 100644 --- a/arch/ia64/configs/zx1_defconfig +++ b/arch/ia64/configs/zx1_defconfig | |||
| @@ -109,7 +109,6 @@ CONFIG_COMPAT=y | |||
| 109 | CONFIG_IA64_MCA_RECOVERY=y | 109 | CONFIG_IA64_MCA_RECOVERY=y |
| 110 | CONFIG_PERFMON=y | 110 | CONFIG_PERFMON=y |
| 111 | CONFIG_IA64_PALINFO=y | 111 | CONFIG_IA64_PALINFO=y |
| 112 | CONFIG_ACPI_DEALLOCATE_IRQ=y | ||
| 113 | 112 | ||
| 114 | # | 113 | # |
| 115 | # Firmware Drivers | 114 | # Firmware Drivers |
diff --git a/arch/ia64/defconfig b/arch/ia64/defconfig index b6ec8d32c346..5da208115ea1 100644 --- a/arch/ia64/defconfig +++ b/arch/ia64/defconfig | |||
| @@ -99,7 +99,6 @@ CONFIG_COMPAT=y | |||
| 99 | CONFIG_IA64_MCA_RECOVERY=y | 99 | CONFIG_IA64_MCA_RECOVERY=y |
| 100 | CONFIG_PERFMON=y | 100 | CONFIG_PERFMON=y |
| 101 | CONFIG_IA64_PALINFO=y | 101 | CONFIG_IA64_PALINFO=y |
| 102 | CONFIG_ACPI_DEALLOCATE_IRQ=y | ||
| 103 | 102 | ||
| 104 | # | 103 | # |
| 105 | # Firmware Drivers | 104 | # Firmware Drivers |
| @@ -335,7 +334,7 @@ CONFIG_SCSI_SYM53C8XX_DEFAULT_TAGS=16 | |||
| 335 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 | 334 | CONFIG_SCSI_SYM53C8XX_MAX_TAGS=64 |
| 336 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set | 335 | # CONFIG_SCSI_SYM53C8XX_IOMAPPED is not set |
| 337 | # CONFIG_SCSI_IPR is not set | 336 | # CONFIG_SCSI_IPR is not set |
| 338 | CONFIG_SCSI_QLOGIC_FC=y | 337 | # CONFIG_SCSI_QLOGIC_FC is not set |
| 339 | # CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set | 338 | # CONFIG_SCSI_QLOGIC_FC_FIRMWARE is not set |
| 340 | CONFIG_SCSI_QLOGIC_1280=y | 339 | CONFIG_SCSI_QLOGIC_1280=y |
| 341 | # CONFIG_SCSI_QLOGIC_1280_1040 is not set | 340 | # CONFIG_SCSI_QLOGIC_1280_1040 is not set |
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c index 318787c84ac0..28a4529fdd60 100644 --- a/arch/ia64/kernel/acpi.c +++ b/arch/ia64/kernel/acpi.c | |||
| @@ -583,14 +583,12 @@ int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) | |||
| 583 | 583 | ||
| 584 | EXPORT_SYMBOL(acpi_register_gsi); | 584 | EXPORT_SYMBOL(acpi_register_gsi); |
| 585 | 585 | ||
| 586 | #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||
| 587 | void acpi_unregister_gsi(u32 gsi) | 586 | void acpi_unregister_gsi(u32 gsi) |
| 588 | { | 587 | { |
| 589 | iosapic_unregister_intr(gsi); | 588 | iosapic_unregister_intr(gsi); |
| 590 | } | 589 | } |
| 591 | 590 | ||
| 592 | EXPORT_SYMBOL(acpi_unregister_gsi); | 591 | EXPORT_SYMBOL(acpi_unregister_gsi); |
| 593 | #endif /* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||
| 594 | 592 | ||
| 595 | static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size) | 593 | static int __init acpi_parse_fadt(unsigned long phys_addr, unsigned long size) |
| 596 | { | 594 | { |
diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S index 9be53e1ea404..3c8821024509 100644 --- a/arch/ia64/kernel/entry.S +++ b/arch/ia64/kernel/entry.S | |||
| @@ -204,9 +204,6 @@ GLOBAL_ENTRY(ia64_switch_to) | |||
| 204 | (p6) br.cond.dpnt .map | 204 | (p6) br.cond.dpnt .map |
| 205 | ;; | 205 | ;; |
| 206 | .done: | 206 | .done: |
| 207 | (p6) ssm psr.ic // if we had to map, reenable the psr.ic bit FIRST!!! | ||
| 208 | ;; | ||
| 209 | (p6) srlz.d | ||
| 210 | ld8 sp=[r21] // load kernel stack pointer of new task | 207 | ld8 sp=[r21] // load kernel stack pointer of new task |
| 211 | mov IA64_KR(CURRENT)=in0 // update "current" application register | 208 | mov IA64_KR(CURRENT)=in0 // update "current" application register |
| 212 | mov r8=r13 // return pointer to previously running task | 209 | mov r8=r13 // return pointer to previously running task |
| @@ -234,6 +231,9 @@ GLOBAL_ENTRY(ia64_switch_to) | |||
| 234 | mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped... | 231 | mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped... |
| 235 | ;; | 232 | ;; |
| 236 | itr.d dtr[r25]=r23 // wire in new mapping... | 233 | itr.d dtr[r25]=r23 // wire in new mapping... |
| 234 | ssm psr.ic // reenable the psr.ic bit | ||
| 235 | ;; | ||
| 236 | srlz.d | ||
| 237 | br.cond.sptk .done | 237 | br.cond.sptk .done |
| 238 | END(ia64_switch_to) | 238 | END(ia64_switch_to) |
| 239 | 239 | ||
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c index a13df592ebf7..574084f343fa 100644 --- a/arch/ia64/kernel/iosapic.c +++ b/arch/ia64/kernel/iosapic.c | |||
| @@ -782,7 +782,6 @@ again: | |||
| 782 | return vector; | 782 | return vector; |
| 783 | } | 783 | } |
| 784 | 784 | ||
| 785 | #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||
| 786 | void | 785 | void |
| 787 | iosapic_unregister_intr (unsigned int gsi) | 786 | iosapic_unregister_intr (unsigned int gsi) |
| 788 | { | 787 | { |
| @@ -865,7 +864,6 @@ iosapic_unregister_intr (unsigned int gsi) | |||
| 865 | spin_unlock(&iosapic_lock); | 864 | spin_unlock(&iosapic_lock); |
| 866 | spin_unlock_irqrestore(&idesc->lock, flags); | 865 | spin_unlock_irqrestore(&idesc->lock, flags); |
| 867 | } | 866 | } |
| 868 | #endif /* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||
| 869 | 867 | ||
| 870 | /* | 868 | /* |
| 871 | * ACPI calls this when it finds an entry for a platform interrupt. | 869 | * ACPI calls this when it finds an entry for a platform interrupt. |
diff --git a/arch/ia64/lib/memcpy_mck.S b/arch/ia64/lib/memcpy_mck.S index 6f308e62c137..46c9331e7ab5 100644 --- a/arch/ia64/lib/memcpy_mck.S +++ b/arch/ia64/lib/memcpy_mck.S | |||
| @@ -625,8 +625,11 @@ EK(.ex_handler, (p17) st8 [dst1]=r39,8); \ | |||
| 625 | clrrrb | 625 | clrrrb |
| 626 | ;; | 626 | ;; |
| 627 | alloc saved_pfs_stack=ar.pfs,3,3,3,0 | 627 | alloc saved_pfs_stack=ar.pfs,3,3,3,0 |
| 628 | cmp.lt p8,p0=A,r0 | ||
| 628 | sub B = dst0, saved_in0 // how many byte copied so far | 629 | sub B = dst0, saved_in0 // how many byte copied so far |
| 629 | ;; | 630 | ;; |
| 631 | (p8) mov A = 0; // A shouldn't be negative, cap it | ||
| 632 | ;; | ||
| 630 | sub C = A, B | 633 | sub C = A, B |
| 631 | sub D = saved_in2, A | 634 | sub D = saved_in2, A |
| 632 | ;; | 635 | ;; |
diff --git a/arch/ia64/mm/fault.c b/arch/ia64/mm/fault.c index 24614869e866..3c32af910d60 100644 --- a/arch/ia64/mm/fault.c +++ b/arch/ia64/mm/fault.c | |||
| @@ -230,9 +230,6 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | |||
| 230 | return; | 230 | return; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | if (ia64_done_with_exception(regs)) | ||
| 234 | return; | ||
| 235 | |||
| 236 | /* | 233 | /* |
| 237 | * Since we have no vma's for region 5, we might get here even if the address is | 234 | * Since we have no vma's for region 5, we might get here even if the address is |
| 238 | * valid, due to the VHPT walker inserting a non present translation that becomes | 235 | * valid, due to the VHPT walker inserting a non present translation that becomes |
| @@ -243,6 +240,9 @@ ia64_do_page_fault (unsigned long address, unsigned long isr, struct pt_regs *re | |||
| 243 | if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address)) | 240 | if (REGION_NUMBER(address) == 5 && mapped_kernel_page_is_present(address)) |
| 244 | return; | 241 | return; |
| 245 | 242 | ||
| 243 | if (ia64_done_with_exception(regs)) | ||
| 244 | return; | ||
| 245 | |||
| 246 | /* | 246 | /* |
| 247 | * Oops. The kernel tried to access some bad page. We'll have to terminate things | 247 | * Oops. The kernel tried to access some bad page. We'll have to terminate things |
| 248 | * with extreme prejudice. | 248 | * with extreme prejudice. |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 9977c122e9fa..9b5de589b82f 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
| @@ -498,13 +498,11 @@ pcibios_enable_device (struct pci_dev *dev, int mask) | |||
| 498 | return acpi_pci_irq_enable(dev); | 498 | return acpi_pci_irq_enable(dev); |
| 499 | } | 499 | } |
| 500 | 500 | ||
| 501 | #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||
| 502 | void | 501 | void |
| 503 | pcibios_disable_device (struct pci_dev *dev) | 502 | pcibios_disable_device (struct pci_dev *dev) |
| 504 | { | 503 | { |
| 505 | acpi_pci_irq_disable(dev); | 504 | acpi_pci_irq_disable(dev); |
| 506 | } | 505 | } |
| 507 | #endif /* CONFIG_ACPI_DEALLOCATE_IRQ */ | ||
| 508 | 506 | ||
| 509 | void | 507 | void |
| 510 | pcibios_align_resource (void *data, struct resource *res, | 508 | pcibios_align_resource (void *data, struct resource *res, |
diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c index a594aca959e6..14908ad7db8c 100644 --- a/arch/ia64/sn/kernel/setup.c +++ b/arch/ia64/sn/kernel/setup.c | |||
| @@ -56,7 +56,7 @@ | |||
| 56 | 56 | ||
| 57 | DEFINE_PER_CPU(struct pda_s, pda_percpu); | 57 | DEFINE_PER_CPU(struct pda_s, pda_percpu); |
| 58 | 58 | ||
| 59 | #define MAX_PHYS_MEMORY (1UL << 49) /* 1 TB */ | 59 | #define MAX_PHYS_MEMORY (1UL << IA64_MAX_PHYS_BITS) /* Max physical address supported */ |
| 60 | 60 | ||
| 61 | lboard_t *root_lboard[MAX_COMPACT_NODES]; | 61 | lboard_t *root_lboard[MAX_COMPACT_NODES]; |
| 62 | 62 | ||
diff --git a/arch/ia64/sn/kernel/xpc_main.c b/arch/ia64/sn/kernel/xpc_main.c index bb1d5cf30440..ed7c21586e98 100644 --- a/arch/ia64/sn/kernel/xpc_main.c +++ b/arch/ia64/sn/kernel/xpc_main.c | |||
| @@ -885,6 +885,10 @@ xpc_init(void) | |||
| 885 | pid_t pid; | 885 | pid_t pid; |
| 886 | 886 | ||
| 887 | 887 | ||
| 888 | if (!ia64_platform_is("sn2")) { | ||
| 889 | return -ENODEV; | ||
| 890 | } | ||
| 891 | |||
| 888 | /* | 892 | /* |
| 889 | * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng | 893 | * xpc_remote_copy_buffer is used as a temporary buffer for bte_copy'ng |
| 890 | * both a partition's reserved page and its XPC variables. Its size was | 894 | * both a partition's reserved page and its XPC variables. Its size was |
diff --git a/arch/ia64/sn/kernel/xpnet.c b/arch/ia64/sn/kernel/xpnet.c index 78c13d676fa6..d0c2c114a459 100644 --- a/arch/ia64/sn/kernel/xpnet.c +++ b/arch/ia64/sn/kernel/xpnet.c | |||
| @@ -636,6 +636,10 @@ xpnet_init(void) | |||
| 636 | int result = -ENOMEM; | 636 | int result = -ENOMEM; |
| 637 | 637 | ||
| 638 | 638 | ||
| 639 | if (!ia64_platform_is("sn2")) { | ||
| 640 | return -ENODEV; | ||
| 641 | } | ||
| 642 | |||
| 639 | dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME); | 643 | dev_info(xpnet, "registering network device %s\n", XPNET_DEVICE_NAME); |
| 640 | 644 | ||
| 641 | /* | 645 | /* |
diff --git a/arch/m68knommu/platform/523x/Makefile b/arch/m68knommu/platform/523x/Makefile new file mode 100644 index 000000000000..c1578b016160 --- /dev/null +++ b/arch/m68knommu/platform/523x/Makefile | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | # | ||
| 2 | # Makefile for the m68knommu linux kernel. | ||
| 3 | # | ||
| 4 | |||
| 5 | # | ||
| 6 | # If you want to play with the HW breakpoints then you will | ||
| 7 | # need to add define this, which will give you a stack backtrace | ||
| 8 | # on the console port whenever a DBG interrupt occurs. You have to | ||
| 9 | # set up you HW breakpoints to trigger a DBG interrupt: | ||
| 10 | # | ||
| 11 | # EXTRA_CFLAGS += -DTRAP_DBG_INTERRUPT | ||
| 12 | # EXTRA_AFLAGS += -DTRAP_DBG_INTERRUPT | ||
| 13 | # | ||
| 14 | |||
| 15 | ifdef CONFIG_FULLDEBUG | ||
| 16 | AFLAGS += -DDEBUGGER_COMPATIBLE_CACHE=1 | ||
| 17 | endif | ||
| 18 | |||
| 19 | obj-y := config.o | ||
diff --git a/arch/m68knommu/platform/5272/config.c b/arch/m68knommu/platform/5272/config.c index 5cb28690f89a..cf36e7d007b9 100644 --- a/arch/m68knommu/platform/5272/config.c +++ b/arch/m68knommu/platform/5272/config.c | |||
| @@ -104,11 +104,11 @@ int mcf_timerirqpending(int timer) | |||
| 104 | 104 | ||
| 105 | void config_BSP(char *commandp, int size) | 105 | void config_BSP(char *commandp, int size) |
| 106 | { | 106 | { |
| 107 | #if 0 | 107 | #if defined (CONFIG_MOD5272) |
| 108 | volatile unsigned long *pivrp; | 108 | volatile unsigned char *pivrp; |
| 109 | 109 | ||
| 110 | /* Set base of device vectors to be 64 */ | 110 | /* Set base of device vectors to be 64 */ |
| 111 | pivrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PIVR); | 111 | pivrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_PIVR); |
| 112 | *pivrp = 0x40; | 112 | *pivrp = 0x40; |
| 113 | #endif | 113 | #endif |
| 114 | 114 | ||
diff --git a/arch/m68knommu/platform/5307/Makefile b/arch/m68knommu/platform/5307/Makefile index 84b6b70641e1..6fe5a2b8fb08 100644 --- a/arch/m68knommu/platform/5307/Makefile +++ b/arch/m68knommu/platform/5307/Makefile | |||
| @@ -19,6 +19,7 @@ endif | |||
| 19 | obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o | 19 | obj-$(CONFIG_COLDFIRE) += entry.o vectors.o ints.o |
| 20 | obj-$(CONFIG_M5206) += timers.o | 20 | obj-$(CONFIG_M5206) += timers.o |
| 21 | obj-$(CONFIG_M5206e) += timers.o | 21 | obj-$(CONFIG_M5206e) += timers.o |
| 22 | obj-$(CONFIG_M523x) += pit.o | ||
| 22 | obj-$(CONFIG_M5249) += timers.o | 23 | obj-$(CONFIG_M5249) += timers.o |
| 23 | obj-$(CONFIG_M527x) += pit.o | 24 | obj-$(CONFIG_M527x) += pit.o |
| 24 | obj-$(CONFIG_M5272) += timers.o | 25 | obj-$(CONFIG_M5272) += timers.o |
diff --git a/arch/m68knommu/platform/68328/config.c b/arch/m68knommu/platform/68328/config.c index fd7c93f86481..bcfa5d7fe1e2 100644 --- a/arch/m68knommu/platform/68328/config.c +++ b/arch/m68knommu/platform/68328/config.c | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | /***************************************************************************/ | ||
| 2 | |||
| 1 | /* | 3 | /* |
| 2 | * linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c | 4 | * linux/arch/m68knommu/platform/68328/config.c |
| 3 | * | 5 | * |
| 4 | * Copyright (C) 1993 Hamish Macdonald | 6 | * Copyright (C) 1993 Hamish Macdonald |
| 5 | * Copyright (C) 1999 D. Jeff Dionne | 7 | * Copyright (C) 1999 D. Jeff Dionne |
| @@ -11,6 +13,8 @@ | |||
| 11 | * VZ Support/Fixes Evan Stawnyczy <e@lineo.ca> | 13 | * VZ Support/Fixes Evan Stawnyczy <e@lineo.ca> |
| 12 | */ | 14 | */ |
| 13 | 15 | ||
| 16 | /***************************************************************************/ | ||
| 17 | |||
| 14 | #include <asm/dbg.h> | 18 | #include <asm/dbg.h> |
| 15 | #include <stdarg.h> | 19 | #include <stdarg.h> |
| 16 | #include <linux/config.h> | 20 | #include <linux/config.h> |
| @@ -29,76 +33,16 @@ | |||
| 29 | #include <asm/machdep.h> | 33 | #include <asm/machdep.h> |
| 30 | #include <asm/MC68328.h> | 34 | #include <asm/MC68328.h> |
| 31 | 35 | ||
| 36 | /***************************************************************************/ | ||
| 32 | 37 | ||
| 33 | void BSP_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) | 38 | void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); |
| 34 | { | 39 | void m68328_timer_tick(void); |
| 35 | 40 | unsigned long m68328_timer_gettimeoffset(void); | |
| 36 | #ifdef CONFIG_XCOPILOT_BUGS | 41 | void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); |
| 37 | /* | ||
| 38 | * The only thing I know is that CLK32 is not available on Xcopilot | ||
| 39 | * I have little idea about what frequency SYSCLK has on Xcopilot. | ||
| 40 | * The values for prescaler and compare registers were simply | ||
| 41 | * taken from the original source | ||
| 42 | */ | ||
| 43 | |||
| 44 | /* Restart mode, Enable int, SYSCLK, Enable timer */ | ||
| 45 | TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_SYSCLK | TCTL_TEN; | ||
| 46 | /* Set prescaler */ | ||
| 47 | TPRER2 = 2; | ||
| 48 | /* Set compare register */ | ||
| 49 | TCMP2 = 0xd7e4; | ||
| 50 | #else | ||
| 51 | /* Restart mode, Enable int, 32KHz, Enable timer */ | ||
| 52 | TCTL2 = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||
| 53 | /* Set prescaler (Divide 32KHz by 32)*/ | ||
| 54 | TPRER2 = 31; | ||
| 55 | /* Set compare register 32Khz / 32 / 10 = 100 */ | ||
| 56 | TCMP2 = 10; | ||
| 57 | #endif | ||
| 58 | |||
| 59 | request_irq(TMR2_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||
| 60 | } | ||
| 61 | |||
| 62 | void BSP_tick(void) | ||
| 63 | { | ||
| 64 | /* Reset Timer2 */ | ||
| 65 | TSTAT2 &= 0; | ||
| 66 | } | ||
| 67 | 42 | ||
| 68 | unsigned long BSP_gettimeoffset (void) | 43 | /***************************************************************************/ |
| 69 | { | ||
| 70 | return 0; | ||
| 71 | } | ||
| 72 | 44 | ||
| 73 | void BSP_gettod (int *yearp, int *monp, int *dayp, | 45 | void m68328_reset (void) |
| 74 | int *hourp, int *minp, int *secp) | ||
| 75 | { | ||
| 76 | } | ||
| 77 | |||
| 78 | int BSP_hwclk(int op, struct hwclk_time *t) | ||
| 79 | { | ||
| 80 | if (!op) { | ||
| 81 | /* read */ | ||
| 82 | } else { | ||
| 83 | /* write */ | ||
| 84 | } | ||
| 85 | return 0; | ||
| 86 | } | ||
| 87 | |||
| 88 | int BSP_set_clock_mmss (unsigned long nowtime) | ||
| 89 | { | ||
| 90 | #if 0 | ||
| 91 | short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||
| 92 | |||
| 93 | tod->second1 = real_seconds / 10; | ||
| 94 | tod->second2 = real_seconds % 10; | ||
| 95 | tod->minute1 = real_minutes / 10; | ||
| 96 | tod->minute2 = real_minutes % 10; | ||
| 97 | #endif | ||
| 98 | return 0; | ||
| 99 | } | ||
| 100 | |||
| 101 | void BSP_reset (void) | ||
| 102 | { | 46 | { |
| 103 | local_irq_disable(); | 47 | local_irq_disable(); |
| 104 | asm volatile ("moveal #0x10c00000, %a0;\n\t" | 48 | asm volatile ("moveal #0x10c00000, %a0;\n\t" |
| @@ -108,18 +52,22 @@ void BSP_reset (void) | |||
| 108 | "jmp (%a0);"); | 52 | "jmp (%a0);"); |
| 109 | } | 53 | } |
| 110 | 54 | ||
| 55 | /***************************************************************************/ | ||
| 56 | |||
| 111 | void config_BSP(char *command, int len) | 57 | void config_BSP(char *command, int len) |
| 112 | { | 58 | { |
| 113 | printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n"); | 59 | printk(KERN_INFO "\n68328 support D. Jeff Dionne <jeff@uclinux.org>\n"); |
| 114 | printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n"); | 60 | printk(KERN_INFO "68328 support Kenneth Albanowski <kjahds@kjshds.com>\n"); |
| 115 | printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n"); | 61 | printk(KERN_INFO "68328/Pilot support Bernhard Kuhn <kuhn@lpr.e-technik.tu-muenchen.de>\n"); |
| 116 | 62 | ||
| 117 | mach_sched_init = BSP_sched_init; | 63 | mach_sched_init = m68328_timer_init; |
| 118 | mach_tick = BSP_tick; | 64 | mach_tick = m68328_timer_tick; |
| 119 | mach_gettimeoffset = BSP_gettimeoffset; | 65 | mach_gettimeoffset = m68328_timer_gettimeoffset; |
| 120 | mach_gettod = BSP_gettod; | 66 | mach_gettod = m68328_timer_gettod; |
| 121 | mach_hwclk = NULL; | 67 | mach_hwclk = NULL; |
| 122 | mach_set_clock_mmss = NULL; | 68 | mach_set_clock_mmss = NULL; |
| 123 | mach_reset = BSP_reset; | 69 | mach_reset = m68328_reset; |
| 124 | *command = '\0'; | 70 | *command = '\0'; |
| 125 | } | 71 | } |
| 72 | |||
| 73 | /***************************************************************************/ | ||
diff --git a/arch/m68knommu/platform/68328/timers.c b/arch/m68knommu/platform/68328/timers.c new file mode 100644 index 000000000000..68c2cd6b0030 --- /dev/null +++ b/arch/m68knommu/platform/68328/timers.c | |||
| @@ -0,0 +1,106 @@ | |||
| 1 | /***************************************************************************/ | ||
| 2 | |||
| 3 | /* | ||
| 4 | * linux/arch/m68knommu/platform/68328/timers.c | ||
| 5 | * | ||
| 6 | * Copyright (C) 1993 Hamish Macdonald | ||
| 7 | * Copyright (C) 1999 D. Jeff Dionne | ||
| 8 | * Copyright (C) 2001 Georges Menie, Ken Desmet | ||
| 9 | * | ||
| 10 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 11 | * License. See the file COPYING in the main directory of this archive | ||
| 12 | * for more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | /***************************************************************************/ | ||
| 16 | |||
| 17 | #include <linux/config.h> | ||
| 18 | #include <linux/types.h> | ||
| 19 | #include <linux/kernel.h> | ||
| 20 | #include <linux/mm.h> | ||
| 21 | #include <asm/setup.h> | ||
| 22 | #include <asm/system.h> | ||
| 23 | #include <asm/pgtable.h> | ||
| 24 | #include <asm/irq.h> | ||
| 25 | #include <asm/machdep.h> | ||
| 26 | #include <asm/MC68VZ328.h> | ||
| 27 | |||
| 28 | /***************************************************************************/ | ||
| 29 | |||
| 30 | #if defined(CONFIG_DRAGEN2) | ||
| 31 | /* with a 33.16 MHz clock, this will give usec resolution to the time functions */ | ||
| 32 | #define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK | ||
| 33 | #define CLOCK_PRE 7 | ||
| 34 | #define TICKS_PER_JIFFY 41450 | ||
| 35 | |||
| 36 | #elif defined(CONFIG_XCOPILOT_BUGS) | ||
| 37 | /* | ||
| 38 | * The only thing I know is that CLK32 is not available on Xcopilot | ||
| 39 | * I have little idea about what frequency SYSCLK has on Xcopilot. | ||
| 40 | * The values for prescaler and compare registers were simply | ||
| 41 | * taken from the original source | ||
| 42 | */ | ||
| 43 | #define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK | ||
| 44 | #define CLOCK_PRE 2 | ||
| 45 | #define TICKS_PER_JIFFY 0xd7e4 | ||
| 46 | |||
| 47 | #else | ||
| 48 | /* default to using the 32Khz clock */ | ||
| 49 | #define CLOCK_SOURCE TCTL_CLKSOURCE_32KHZ | ||
| 50 | #define CLOCK_PRE 31 | ||
| 51 | #define TICKS_PER_JIFFY 10 | ||
| 52 | #endif | ||
| 53 | |||
| 54 | /***************************************************************************/ | ||
| 55 | |||
| 56 | void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)) | ||
| 57 | { | ||
| 58 | /* disable timer 1 */ | ||
| 59 | TCTL = 0; | ||
| 60 | |||
| 61 | /* set ISR */ | ||
| 62 | if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL)) | ||
| 63 | panic("Unable to attach timer interrupt\n"); | ||
| 64 | |||
| 65 | /* Restart mode, Enable int, Set clock source */ | ||
| 66 | TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE; | ||
| 67 | TPRER = CLOCK_PRE; | ||
| 68 | TCMP = TICKS_PER_JIFFY; | ||
| 69 | |||
| 70 | /* Enable timer 1 */ | ||
| 71 | TCTL |= TCTL_TEN; | ||
| 72 | } | ||
| 73 | |||
| 74 | /***************************************************************************/ | ||
| 75 | |||
| 76 | void m68328_timer_tick(void) | ||
| 77 | { | ||
| 78 | /* Reset Timer1 */ | ||
| 79 | TSTAT &= 0; | ||
| 80 | } | ||
| 81 | /***************************************************************************/ | ||
| 82 | |||
| 83 | unsigned long m68328_timer_gettimeoffset(void) | ||
| 84 | { | ||
| 85 | unsigned long ticks = TCN, offset = 0; | ||
| 86 | |||
| 87 | /* check for pending interrupt */ | ||
| 88 | if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM))) | ||
| 89 | offset = 1000000 / HZ; | ||
| 90 | ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY; | ||
| 91 | return ticks + offset; | ||
| 92 | } | ||
| 93 | |||
| 94 | /***************************************************************************/ | ||
| 95 | |||
| 96 | void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec) | ||
| 97 | { | ||
| 98 | long now = RTCTIME; | ||
| 99 | |||
| 100 | *year = *mon = *day = 1; | ||
| 101 | *hour = (now >> 24) % 24; | ||
| 102 | *min = (now >> 16) % 60; | ||
| 103 | *sec = now % 60; | ||
| 104 | } | ||
| 105 | |||
| 106 | /***************************************************************************/ | ||
diff --git a/arch/m68knommu/platform/68EZ328/config.c b/arch/m68knommu/platform/68EZ328/config.c index c21971971ff5..d8d56e5de310 100644 --- a/arch/m68knommu/platform/68EZ328/config.c +++ b/arch/m68knommu/platform/68EZ328/config.c | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | /***************************************************************************/ | ||
| 2 | |||
| 1 | /* | 3 | /* |
| 2 | * linux/arch/$(ARCH)/platform/$(PLATFORM)/config.c | 4 | * linux/arch/m68knommu/platform/68EZ328/config.c |
| 3 | * | 5 | * |
| 4 | * Copyright (C) 1993 Hamish Macdonald | 6 | * Copyright (C) 1993 Hamish Macdonald |
| 5 | * Copyright (C) 1999 D. Jeff Dionne | 7 | * Copyright (C) 1999 D. Jeff Dionne |
| @@ -9,6 +11,8 @@ | |||
| 9 | * for more details. | 11 | * for more details. |
| 10 | */ | 12 | */ |
| 11 | 13 | ||
| 14 | /***************************************************************************/ | ||
| 15 | |||
| 12 | #include <stdarg.h> | 16 | #include <stdarg.h> |
| 13 | #include <linux/config.h> | 17 | #include <linux/config.h> |
| 14 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| @@ -20,68 +24,22 @@ | |||
| 20 | #include <asm/setup.h> | 24 | #include <asm/setup.h> |
| 21 | #include <asm/system.h> | 25 | #include <asm/system.h> |
| 22 | #include <asm/pgtable.h> | 26 | #include <asm/pgtable.h> |
| 23 | #include <asm/irq.h> | ||
| 24 | #include <asm/machdep.h> | 27 | #include <asm/machdep.h> |
| 25 | #include <asm/MC68EZ328.h> | 28 | #include <asm/MC68EZ328.h> |
| 26 | #ifdef CONFIG_UCSIMM | 29 | #ifdef CONFIG_UCSIMM |
| 27 | #include <asm/bootstd.h> | 30 | #include <asm/bootstd.h> |
| 28 | #endif | 31 | #endif |
| 29 | #ifdef CONFIG_PILOT | ||
| 30 | #include "PalmV/romfs.h" | ||
| 31 | #endif | ||
| 32 | |||
| 33 | void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) | ||
| 34 | { | ||
| 35 | /* Restart mode, Enable int, 32KHz, Enable timer */ | ||
| 36 | TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||
| 37 | /* Set prescaler (Divide 32KHz by 32)*/ | ||
| 38 | TPRER = 31; | ||
| 39 | /* Set compare register 32Khz / 32 / 10 = 100 */ | ||
| 40 | TCMP = 10; | ||
| 41 | |||
| 42 | request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||
| 43 | } | ||
| 44 | |||
| 45 | void BSP_tick(void) | ||
| 46 | { | ||
| 47 | /* Reset Timer1 */ | ||
| 48 | TSTAT &= 0; | ||
| 49 | } | ||
| 50 | |||
| 51 | unsigned long BSP_gettimeoffset (void) | ||
| 52 | { | ||
| 53 | return 0; | ||
| 54 | } | ||
| 55 | 32 | ||
| 56 | void BSP_gettod (int *yearp, int *monp, int *dayp, | 33 | /***************************************************************************/ |
| 57 | int *hourp, int *minp, int *secp) | ||
| 58 | { | ||
| 59 | } | ||
| 60 | 34 | ||
| 61 | int BSP_hwclk(int op, struct hwclk_time *t) | 35 | void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); |
| 62 | { | 36 | void m68328_timer_tick(void); |
| 63 | if (!op) { | 37 | unsigned long m68328_timer_gettimeoffset(void); |
| 64 | /* read */ | 38 | void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); |
| 65 | } else { | ||
| 66 | /* write */ | ||
| 67 | } | ||
| 68 | return 0; | ||
| 69 | } | ||
| 70 | 39 | ||
| 71 | int BSP_set_clock_mmss (unsigned long nowtime) | 40 | /***************************************************************************/ |
| 72 | { | ||
| 73 | #if 0 | ||
| 74 | short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||
| 75 | 41 | ||
| 76 | tod->second1 = real_seconds / 10; | 42 | void m68ez328_reset(void) |
| 77 | tod->second2 = real_seconds % 10; | ||
| 78 | tod->minute1 = real_minutes / 10; | ||
| 79 | tod->minute2 = real_minutes % 10; | ||
| 80 | #endif | ||
| 81 | return 0; | ||
| 82 | } | ||
| 83 | |||
| 84 | void BSP_reset (void) | ||
| 85 | { | 43 | { |
| 86 | local_irq_disable(); | 44 | local_irq_disable(); |
| 87 | asm volatile (" | 45 | asm volatile (" |
| @@ -93,6 +51,8 @@ void BSP_reset (void) | |||
| 93 | "); | 51 | "); |
| 94 | } | 52 | } |
| 95 | 53 | ||
| 54 | /***************************************************************************/ | ||
| 55 | |||
| 96 | unsigned char *cs8900a_hwaddr; | 56 | unsigned char *cs8900a_hwaddr; |
| 97 | static int errno; | 57 | static int errno; |
| 98 | 58 | ||
| @@ -119,11 +79,13 @@ void config_BSP(char *command, int len) | |||
| 119 | else command[0] = 0; | 79 | else command[0] = 0; |
| 120 | #endif | 80 | #endif |
| 121 | 81 | ||
| 122 | mach_sched_init = BSP_sched_init; | 82 | mach_sched_init = m68328_timer_init; |
| 123 | mach_tick = BSP_tick; | 83 | mach_tick = m68328_timer_tick; |
| 124 | mach_gettimeoffset = BSP_gettimeoffset; | 84 | mach_gettimeoffset = m68328_timer_gettimeoffset; |
| 125 | mach_gettod = BSP_gettod; | 85 | mach_gettod = m68328_timer_gettod; |
| 126 | mach_hwclk = NULL; | 86 | mach_hwclk = NULL; |
| 127 | mach_set_clock_mmss = NULL; | 87 | mach_set_clock_mmss = NULL; |
| 128 | mach_reset = BSP_reset; | 88 | mach_reset = m68ez328_reset; |
| 129 | } | 89 | } |
| 90 | |||
| 91 | /***************************************************************************/ | ||
diff --git a/arch/m68knommu/platform/68VZ328/de2/config.c b/arch/m68knommu/platform/68VZ328/config.c index d0586197f113..d926524cdf82 100644 --- a/arch/m68knommu/platform/68VZ328/de2/config.c +++ b/arch/m68knommu/platform/68VZ328/config.c | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | /***************************************************************************/ | ||
| 2 | |||
| 1 | /* | 3 | /* |
| 2 | * linux/arch/m68knommu/platform/MC68VZ328/de2/config.c | 4 | * linux/arch/m68knommu/platform/68VZ328/config.c |
| 3 | * | 5 | * |
| 4 | * Copyright (C) 1993 Hamish Macdonald | 6 | * Copyright (C) 1993 Hamish Macdonald |
| 5 | * Copyright (C) 1999 D. Jeff Dionne | 7 | * Copyright (C) 1999 D. Jeff Dionne |
| @@ -10,6 +12,8 @@ | |||
| 10 | * for more details. | 12 | * for more details. |
| 11 | */ | 13 | */ |
| 12 | 14 | ||
| 15 | /***************************************************************************/ | ||
| 16 | |||
| 13 | #include <linux/config.h> | 17 | #include <linux/config.h> |
| 14 | #include <linux/types.h> | 18 | #include <linux/types.h> |
| 15 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
| @@ -25,66 +29,25 @@ | |||
| 25 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
| 26 | #include <asm/machdep.h> | 30 | #include <asm/machdep.h> |
| 27 | #include <asm/MC68VZ328.h> | 31 | #include <asm/MC68VZ328.h> |
| 32 | #include <asm/bootstd.h> | ||
| 28 | 33 | ||
| 29 | #ifdef CONFIG_INIT_LCD | 34 | #ifdef CONFIG_INIT_LCD |
| 30 | #include "screen.h" | 35 | #include "bootlogo.h" |
| 31 | #endif | 36 | #endif |
| 32 | 37 | ||
| 33 | /* with a 33.16 MHz clock, this will give usec resolution to the time functions */ | 38 | /***************************************************************************/ |
| 34 | #define CLOCK_SOURCE TCTL_CLKSOURCE_SYSCLK | ||
| 35 | #define CLOCK_PRE 7 | ||
| 36 | #define TICKS_PER_JIFFY 41450 | ||
| 37 | |||
| 38 | static void | ||
| 39 | dragen2_sched_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)) | ||
| 40 | { | ||
| 41 | /* disable timer 1 */ | ||
| 42 | TCTL = 0; | ||
| 43 | |||
| 44 | /* set ISR */ | ||
| 45 | if (request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL)) | ||
| 46 | panic("Unable to attach timer interrupt\n"); | ||
| 47 | |||
| 48 | /* Restart mode, Enable int, Set clock source */ | ||
| 49 | TCTL = TCTL_OM | TCTL_IRQEN | CLOCK_SOURCE; | ||
| 50 | TPRER = CLOCK_PRE; | ||
| 51 | TCMP = TICKS_PER_JIFFY; | ||
| 52 | |||
| 53 | /* Enable timer 1 */ | ||
| 54 | TCTL |= TCTL_TEN; | ||
| 55 | } | ||
| 56 | |||
| 57 | static void dragen2_tick(void) | ||
| 58 | { | ||
| 59 | /* Reset Timer1 */ | ||
| 60 | TSTAT &= 0; | ||
| 61 | } | ||
| 62 | |||
| 63 | static unsigned long dragen2_gettimeoffset(void) | ||
| 64 | { | ||
| 65 | unsigned long ticks = TCN, offset = 0; | ||
| 66 | |||
| 67 | /* check for pending interrupt */ | ||
| 68 | if (ticks < (TICKS_PER_JIFFY >> 1) && (ISR & (1 << TMR_IRQ_NUM))) | ||
| 69 | offset = 1000000 / HZ; | ||
| 70 | |||
| 71 | ticks = (ticks * 1000000 / HZ) / TICKS_PER_JIFFY; | ||
| 72 | 39 | ||
| 73 | return ticks + offset; | 40 | void m68328_timer_init(irqreturn_t (*timer_routine) (int, void *, struct pt_regs *)); |
| 74 | } | 41 | void m68328_timer_tick(void); |
| 42 | unsigned long m68328_timer_gettimeoffset(void); | ||
| 43 | void m68328_timer_gettod(int *year, int *mon, int *day, int *hour, int *min, int *sec); | ||
| 75 | 44 | ||
| 76 | static void dragen2_gettod(int *year, int *mon, int *day, int *hour, | 45 | /***************************************************************************/ |
| 77 | int *min, int *sec) | 46 | /* Init Drangon Engine hardware */ |
| 78 | { | 47 | /***************************************************************************/ |
| 79 | long now = RTCTIME; | 48 | #if defined(CONFIG_DRAGEN2) |
| 80 | 49 | ||
| 81 | *year = *mon = *day = 1; | 50 | static void m68vz328_reset(void) |
| 82 | *hour = (now >> 24) % 24; | ||
| 83 | *min = (now >> 16) % 60; | ||
| 84 | *sec = now % 60; | ||
| 85 | } | ||
| 86 | |||
| 87 | static void dragen2_reset(void) | ||
| 88 | { | 51 | { |
| 89 | local_irq_disable(); | 52 | local_irq_disable(); |
| 90 | 53 | ||
| @@ -103,7 +66,7 @@ static void dragen2_reset(void) | |||
| 103 | ); | 66 | ); |
| 104 | } | 67 | } |
| 105 | 68 | ||
| 106 | static void init_hardware(void) | 69 | static void init_hardware(char *command, int size) |
| 107 | { | 70 | { |
| 108 | #ifdef CONFIG_DIRECT_IO_ACCESS | 71 | #ifdef CONFIG_DIRECT_IO_ACCESS |
| 109 | SCR = 0x10; /* allow user access to internal registers */ | 72 | SCR = 0x10; /* allow user access to internal registers */ |
| @@ -170,6 +133,60 @@ static void init_hardware(void) | |||
| 170 | #endif | 133 | #endif |
| 171 | } | 134 | } |
| 172 | 135 | ||
| 136 | /***************************************************************************/ | ||
| 137 | /* Init RT-Control uCdimm hardware */ | ||
| 138 | /***************************************************************************/ | ||
| 139 | #elif defined(CONFIG_UCDIMM) | ||
| 140 | |||
| 141 | static void m68vz328_reset(void) | ||
| 142 | { | ||
| 143 | local_irq_disable(); | ||
| 144 | asm volatile (" | ||
| 145 | moveal #0x10c00000, %a0; | ||
| 146 | moveb #0, 0xFFFFF300; | ||
| 147 | moveal 0(%a0), %sp; | ||
| 148 | moveal 4(%a0), %a0; | ||
| 149 | jmp (%a0); | ||
| 150 | "); | ||
| 151 | } | ||
| 152 | |||
| 153 | unsigned char *cs8900a_hwaddr; | ||
| 154 | static int errno; | ||
| 155 | |||
| 156 | _bsc0(char *, getserialnum) | ||
| 157 | _bsc1(unsigned char *, gethwaddr, int, a) | ||
| 158 | _bsc1(char *, getbenv, char *, a) | ||
| 159 | |||
| 160 | static void init_hardware(char *command, int size) | ||
| 161 | { | ||
| 162 | char *p; | ||
| 163 | |||
| 164 | printk(KERN_INFO "uCdimm serial string [%s]\n", getserialnum()); | ||
| 165 | p = cs8900a_hwaddr = gethwaddr(0); | ||
| 166 | printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||
| 167 | p[0], p[1], p[2], p[3], p[4], p[5]); | ||
| 168 | p = getbenv("APPEND"); | ||
| 169 | if (p) | ||
| 170 | strcpy(p, command); | ||
| 171 | else | ||
| 172 | command[0] = 0; | ||
| 173 | } | ||
| 174 | |||
| 175 | /***************************************************************************/ | ||
| 176 | #else | ||
| 177 | |||
| 178 | static void m68vz328_reset(void) | ||
| 179 | { | ||
| 180 | } | ||
| 181 | |||
| 182 | static void init_hardware(char *command, int size) | ||
| 183 | { | ||
| 184 | } | ||
| 185 | |||
| 186 | /***************************************************************************/ | ||
| 187 | #endif | ||
| 188 | /***************************************************************************/ | ||
| 189 | |||
| 173 | void config_BSP(char *command, int size) | 190 | void config_BSP(char *command, int size) |
| 174 | { | 191 | { |
| 175 | printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); | 192 | printk(KERN_INFO "68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); |
| @@ -181,11 +198,13 @@ void config_BSP(char *command, int size) | |||
| 181 | memset(command, 0, size); | 198 | memset(command, 0, size); |
| 182 | #endif | 199 | #endif |
| 183 | 200 | ||
| 184 | init_hardware(); | 201 | init_hardware(command, size); |
| 185 | 202 | ||
| 186 | mach_sched_init = (void *)dragen2_sched_init; | 203 | mach_sched_init = (void *) m68328_timer_init; |
| 187 | mach_tick = dragen2_tick; | 204 | mach_tick = m68328_timer_tick; |
| 188 | mach_gettimeoffset = dragen2_gettimeoffset; | 205 | mach_gettimeoffset = m68328_timer_gettimeoffset; |
| 189 | mach_reset = dragen2_reset; | 206 | mach_gettod = m68328_timer_gettod; |
| 190 | mach_gettod = dragen2_gettod; | 207 | mach_reset = m68vz328_reset; |
| 191 | } | 208 | } |
| 209 | |||
| 210 | /***************************************************************************/ | ||
diff --git a/arch/m68knommu/platform/68VZ328/ucdimm/config.c b/arch/m68knommu/platform/68VZ328/ucdimm/config.c deleted file mode 100644 index 2deadaffd81e..000000000000 --- a/arch/m68knommu/platform/68VZ328/ucdimm/config.c +++ /dev/null | |||
| @@ -1,117 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/arch/m68knommu/platform/68VZ328/ucdimm/config.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 1993 Hamish Macdonald | ||
| 5 | * Copyright (C) 1999 D. Jeff Dionne | ||
| 6 | * | ||
| 7 | * This file is subject to the terms and conditions of the GNU General Public | ||
| 8 | * License. See the file COPYING in the main directory of this archive | ||
| 9 | * for more details. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <stdarg.h> | ||
| 13 | #include <linux/config.h> | ||
| 14 | #include <linux/types.h> | ||
| 15 | #include <linux/kernel.h> | ||
| 16 | #include <linux/mm.h> | ||
| 17 | #include <linux/tty.h> | ||
| 18 | #include <linux/console.h> | ||
| 19 | |||
| 20 | #include <asm/setup.h> | ||
| 21 | #include <asm/system.h> | ||
| 22 | #include <asm/pgtable.h> | ||
| 23 | #include <asm/irq.h> | ||
| 24 | #include <asm/machdep.h> | ||
| 25 | #include <asm/MC68VZ328.h> | ||
| 26 | #include <asm/bootstd.h> | ||
| 27 | |||
| 28 | void BSP_sched_init(void (*timer_routine)(int, void *, struct pt_regs *)) | ||
| 29 | { | ||
| 30 | /* Restart mode, Enable int, 32KHz, Enable timer */ | ||
| 31 | TCTL = TCTL_OM | TCTL_IRQEN | TCTL_CLKSOURCE_32KHZ | TCTL_TEN; | ||
| 32 | /* Set prescaler (Divide 32KHz by 32)*/ | ||
| 33 | TPRER = 31; | ||
| 34 | /* Set compare register 32Khz / 32 / 10 = 100 */ | ||
| 35 | TCMP = 10; | ||
| 36 | |||
| 37 | request_irq(TMR_IRQ_NUM, timer_routine, IRQ_FLG_LOCK, "timer", NULL); | ||
| 38 | } | ||
| 39 | |||
| 40 | void BSP_tick(void) | ||
| 41 | { | ||
| 42 | /* Reset Timer1 */ | ||
| 43 | TSTAT &= 0; | ||
| 44 | } | ||
| 45 | |||
| 46 | unsigned long BSP_gettimeoffset (void) | ||
| 47 | { | ||
| 48 | return 0; | ||
| 49 | } | ||
| 50 | |||
| 51 | void BSP_gettod (int *yearp, int *monp, int *dayp, | ||
| 52 | int *hourp, int *minp, int *secp) | ||
| 53 | { | ||
| 54 | } | ||
| 55 | |||
| 56 | int BSP_hwclk(int op, struct hwclk_time *t) | ||
| 57 | { | ||
| 58 | if (!op) { | ||
| 59 | /* read */ | ||
| 60 | } else { | ||
| 61 | /* write */ | ||
| 62 | } | ||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | |||
| 66 | int BSP_set_clock_mmss (unsigned long nowtime) | ||
| 67 | { | ||
| 68 | #if 0 | ||
| 69 | short real_seconds = nowtime % 60, real_minutes = (nowtime / 60) % 60; | ||
| 70 | |||
| 71 | tod->second1 = real_seconds / 10; | ||
| 72 | tod->second2 = real_seconds % 10; | ||
| 73 | tod->minute1 = real_minutes / 10; | ||
| 74 | tod->minute2 = real_minutes % 10; | ||
| 75 | #endif | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | |||
| 79 | void BSP_reset (void) | ||
| 80 | { | ||
| 81 | local_irq_disable(); | ||
| 82 | asm volatile (" | ||
| 83 | moveal #0x10c00000, %a0; | ||
| 84 | moveb #0, 0xFFFFF300; | ||
| 85 | moveal 0(%a0), %sp; | ||
| 86 | moveal 4(%a0), %a0; | ||
| 87 | jmp (%a0); | ||
| 88 | "); | ||
| 89 | } | ||
| 90 | |||
| 91 | unsigned char *cs8900a_hwaddr; | ||
| 92 | static int errno; | ||
| 93 | |||
| 94 | _bsc0(char *, getserialnum) | ||
| 95 | _bsc1(unsigned char *, gethwaddr, int, a) | ||
| 96 | _bsc1(char *, getbenv, char *, a) | ||
| 97 | |||
| 98 | void config_BSP(char *command, int len) | ||
| 99 | { | ||
| 100 | unsigned char *p; | ||
| 101 | |||
| 102 | printk(KERN_INFO "\n68VZ328 DragonBallVZ support (c) 2001 Lineo, Inc.\n"); | ||
| 103 | |||
| 104 | printk(KERN_INFO "uCdimm serial string [%s]\n",getserialnum()); | ||
| 105 | p = cs8900a_hwaddr = gethwaddr(0); | ||
| 106 | printk(KERN_INFO "uCdimm hwaddr %.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", | ||
| 107 | p[0], p[1], p[2], p[3], p[4], p[5]); | ||
| 108 | p = getbenv("APPEND"); | ||
| 109 | if (p) strcpy(p,command); | ||
| 110 | else command[0] = 0; | ||
| 111 | |||
| 112 | mach_sched_init = BSP_sched_init; | ||
| 113 | mach_tick = BSP_tick; | ||
| 114 | mach_gettimeoffset = BSP_gettimeoffset; | ||
| 115 | mach_gettod = BSP_gettod; | ||
| 116 | mach_reset = BSP_reset; | ||
| 117 | } | ||
diff --git a/arch/ppc/kernel/pci.c b/arch/ppc/kernel/pci.c index 7b3586a3bf30..854e45beb387 100644 --- a/arch/ppc/kernel/pci.c +++ b/arch/ppc/kernel/pci.c | |||
| @@ -80,7 +80,6 @@ fixup_broken_pcnet32(struct pci_dev* dev) | |||
| 80 | if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { | 80 | if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { |
| 81 | dev->vendor = PCI_VENDOR_ID_AMD; | 81 | dev->vendor = PCI_VENDOR_ID_AMD; |
| 82 | pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); | 82 | pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); |
| 83 | pci_name_device(dev); | ||
| 84 | } | 83 | } |
| 85 | } | 84 | } |
| 86 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); | 85 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); |
diff --git a/arch/ppc/kernel/syscalls.c b/arch/ppc/kernel/syscalls.c index 124313ce3c09..127f040de9de 100644 --- a/arch/ppc/kernel/syscalls.c +++ b/arch/ppc/kernel/syscalls.c | |||
| @@ -41,10 +41,6 @@ | |||
| 41 | #include <asm/ipc.h> | 41 | #include <asm/ipc.h> |
| 42 | #include <asm/semaphore.h> | 42 | #include <asm/semaphore.h> |
| 43 | 43 | ||
| 44 | void | ||
| 45 | check_bugs(void) | ||
| 46 | { | ||
| 47 | } | ||
| 48 | 44 | ||
| 49 | /* | 45 | /* |
| 50 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | 46 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. |
diff --git a/arch/ppc/syslib/mpc10x_common.c b/arch/ppc/syslib/mpc10x_common.c index 87065e2e4c5f..3e039706bdbc 100644 --- a/arch/ppc/syslib/mpc10x_common.c +++ b/arch/ppc/syslib/mpc10x_common.c | |||
| @@ -140,12 +140,12 @@ struct platform_device ppc_sys_platform_devices[] = { | |||
| 140 | }, | 140 | }, |
| 141 | [MPC10X_UART0] = { | 141 | [MPC10X_UART0] = { |
| 142 | .name = "serial8250", | 142 | .name = "serial8250", |
| 143 | .id = 0, | 143 | .id = PLAT8250_DEV_PLATFORM, |
| 144 | .dev.platform_data = serial_plat_uart0, | 144 | .dev.platform_data = serial_plat_uart0, |
| 145 | }, | 145 | }, |
| 146 | [MPC10X_UART1] = { | 146 | [MPC10X_UART1] = { |
| 147 | .name = "serial8250", | 147 | .name = "serial8250", |
| 148 | .id = 1, | 148 | .id = PLAT8250_DEV_PLATFORM1, |
| 149 | .dev.platform_data = serial_plat_uart1, | 149 | .dev.platform_data = serial_plat_uart1, |
| 150 | }, | 150 | }, |
| 151 | 151 | ||
diff --git a/arch/ppc/syslib/mpc83xx_devices.c b/arch/ppc/syslib/mpc83xx_devices.c index 5aaf0e58e1f9..95b3b8a7f0ba 100644 --- a/arch/ppc/syslib/mpc83xx_devices.c +++ b/arch/ppc/syslib/mpc83xx_devices.c | |||
| @@ -165,7 +165,7 @@ struct platform_device ppc_sys_platform_devices[] = { | |||
| 165 | }, | 165 | }, |
| 166 | [MPC83xx_DUART] = { | 166 | [MPC83xx_DUART] = { |
| 167 | .name = "serial8250", | 167 | .name = "serial8250", |
| 168 | .id = 0, | 168 | .id = PLAT8250_DEV_PLATFORM, |
| 169 | .dev.platform_data = serial_platform_data, | 169 | .dev.platform_data = serial_platform_data, |
| 170 | }, | 170 | }, |
| 171 | [MPC83xx_SEC2] = { | 171 | [MPC83xx_SEC2] = { |
diff --git a/arch/ppc/syslib/mpc85xx_devices.c b/arch/ppc/syslib/mpc85xx_devices.c index 8af322dd476a..bbc5ac0de878 100644 --- a/arch/ppc/syslib/mpc85xx_devices.c +++ b/arch/ppc/syslib/mpc85xx_devices.c | |||
| @@ -282,7 +282,7 @@ struct platform_device ppc_sys_platform_devices[] = { | |||
| 282 | }, | 282 | }, |
| 283 | [MPC85xx_DUART] = { | 283 | [MPC85xx_DUART] = { |
| 284 | .name = "serial8250", | 284 | .name = "serial8250", |
| 285 | .id = 0, | 285 | .id = PLAT8250_DEV_PLATFORM, |
| 286 | .dev.platform_data = serial_platform_data, | 286 | .dev.platform_data = serial_platform_data, |
| 287 | }, | 287 | }, |
| 288 | [MPC85xx_PERFMON] = { | 288 | [MPC85xx_PERFMON] = { |
diff --git a/arch/ppc64/Makefile b/arch/ppc64/Makefile index 8189953a372c..a91daa324e88 100644 --- a/arch/ppc64/Makefile +++ b/arch/ppc64/Makefile | |||
| @@ -89,11 +89,12 @@ drivers-$(CONFIG_OPROFILE) += arch/ppc64/oprofile/ | |||
| 89 | 89 | ||
| 90 | boot := arch/ppc64/boot | 90 | boot := arch/ppc64/boot |
| 91 | 91 | ||
| 92 | boottarget-$(CONFIG_PPC_PSERIES) := zImage zImage.initrd | 92 | boottargets-$(CONFIG_PPC_PSERIES) += zImage zImage.initrd |
| 93 | boottarget-$(CONFIG_PPC_MAPLE) := zImage zImage.initrd | 93 | boottargets-$(CONFIG_PPC_PMAC) += zImage.vmode zImage.initrd.vmode |
| 94 | boottarget-$(CONFIG_PPC_ISERIES) := vmlinux.sminitrd vmlinux.initrd vmlinux.sm | 94 | boottargets-$(CONFIG_PPC_MAPLE) += zImage zImage.initrd |
| 95 | boottarget-$(CONFIG_PPC_BPA) := zImage zImage.initrd | 95 | boottargets-$(CONFIG_PPC_ISERIES) += vmlinux.sminitrd vmlinux.initrd vmlinux.sm |
| 96 | $(boottarget-y): vmlinux | 96 | boottargets-$(CONFIG_PPC_BPA) += zImage zImage.initrd |
| 97 | $(boottargets-y): vmlinux | ||
| 97 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ | 98 | $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ |
| 98 | 99 | ||
| 99 | bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage | 100 | bootimage-$(CONFIG_PPC_PSERIES) := $(boot)/zImage |
| @@ -131,10 +132,12 @@ include3/asm: | |||
| 131 | $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm | 132 | $(Q)ln -fsn $(srctree)/include/asm-powerpc include3/asm |
| 132 | 133 | ||
| 133 | define archhelp | 134 | define archhelp |
| 134 | echo '* zImage - Compressed kernel image (arch/$(ARCH)/boot/zImage)' | 135 | echo ' zImage.vmode - Compressed kernel image (arch/$(ARCH)/boot/zImage.vmode)' |
| 135 | echo ' zImage.initrd- Compressed kernel image with initrd attached,' | 136 | echo ' zImage.initrd.vmode - Compressed kernel image with initrd attached,' |
| 136 | echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz' | 137 | echo ' sourced from arch/$(ARCH)/boot/ramdisk.image.gz' |
| 137 | echo ' (arch/$(ARCH)/boot/zImage.initrd)' | 138 | echo ' (arch/$(ARCH)/boot/zImage.initrd.vmode)' |
| 139 | echo ' zImage - zImage for pSeries machines' | ||
| 140 | echo ' zImage.initrd - zImage with initrd for pSeries machines' | ||
| 138 | endef | 141 | endef |
| 139 | 142 | ||
| 140 | CLEAN_FILES += include/asm-ppc64/offsets.h | 143 | CLEAN_FILES += include/asm-ppc64/offsets.h |
diff --git a/arch/ppc64/boot/Makefile b/arch/ppc64/boot/Makefile index 2c5f5e73d00c..33fdc8710891 100644 --- a/arch/ppc64/boot/Makefile +++ b/arch/ppc64/boot/Makefile | |||
| @@ -37,6 +37,9 @@ quiet_cmd_bootcc = BOOTCC $@ | |||
| 37 | quiet_cmd_bootas = BOOTAS $@ | 37 | quiet_cmd_bootas = BOOTAS $@ |
| 38 | cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $< | 38 | cmd_bootas = $(CROSS32CC) -Wp,-MD,$(depfile) $(BOOTAFLAGS) -c -o $@ $< |
| 39 | 39 | ||
| 40 | quiet_cmd_bootld = BOOTLD $@ | ||
| 41 | cmd_bootld = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(2) | ||
| 42 | |||
| 40 | $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c | 43 | $(patsubst %.c,%.o, $(filter %.c, $(src-boot))): %.o: %.c |
| 41 | $(call if_changed_dep,bootcc) | 44 | $(call if_changed_dep,bootcc) |
| 42 | $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S | 45 | $(patsubst %.S,%.o, $(filter %.S, $(src-boot))): %.o: %.S |
| @@ -53,7 +56,7 @@ src-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.c, $(section))) | |||
| 53 | gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section))) | 56 | gz-sec = $(foreach section, $(1), $(patsubst %,$(obj)/kernel-%.gz, $(section))) |
| 54 | 57 | ||
| 55 | hostprogs-y := addnote addRamDisk | 58 | hostprogs-y := addnote addRamDisk |
| 56 | targets += zImage zImage.initrd imagesize.c \ | 59 | targets += zImage.vmode zImage.initrd.vmode zImage zImage.initrd imagesize.c \ |
| 57 | $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \ | 60 | $(patsubst $(obj)/%,%, $(call obj-sec, $(required) $(initrd))) \ |
| 58 | $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \ | 61 | $(patsubst $(obj)/%,%, $(call src-sec, $(required) $(initrd))) \ |
| 59 | $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \ | 62 | $(patsubst $(obj)/%,%, $(call gz-sec, $(required) $(initrd))) \ |
| @@ -63,7 +66,7 @@ extra-y := initrd.o | |||
| 63 | quiet_cmd_ramdisk = RAMDISK $@ | 66 | quiet_cmd_ramdisk = RAMDISK $@ |
| 64 | cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@ | 67 | cmd_ramdisk = $(obj)/addRamDisk $(obj)/ramdisk.image.gz $< $@ |
| 65 | 68 | ||
| 66 | quiet_cmd_stripvm = STRIP $@ | 69 | quiet_cmd_stripvm = STRIP $@ |
| 67 | cmd_stripvm = $(STRIP) -s $< -o $@ | 70 | cmd_stripvm = $(STRIP) -s $< -o $@ |
| 68 | 71 | ||
| 69 | vmlinux.strip: vmlinux FORCE | 72 | vmlinux.strip: vmlinux FORCE |
| @@ -71,12 +74,20 @@ vmlinux.strip: vmlinux FORCE | |||
| 71 | $(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE | 74 | $(obj)/vmlinux.initrd: vmlinux.strip $(obj)/addRamDisk $(obj)/ramdisk.image.gz FORCE |
| 72 | $(call if_changed,ramdisk) | 75 | $(call if_changed,ramdisk) |
| 73 | 76 | ||
| 74 | addsection = $(CROSS32OBJCOPY) $(1) \ | 77 | quiet_cmd_addsection = ADDSEC $@ |
| 75 | --add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(patsubst %.o,%.gz, $(1)) \ | 78 | cmd_addsection = $(CROSS32OBJCOPY) $@ \ |
| 76 | --set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $(1)))=$(OBJCOPYFLAGS) | 79 | --add-section=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(patsubst %.o,%.gz, $@) \ |
| 80 | --set-section-flags=.kernel:$(strip $(patsubst $(obj)/kernel-%.o,%, $@))=$(OBJCOPYFLAGS) | ||
| 81 | |||
| 82 | quiet_cmd_imagesize = GENSIZE $@ | ||
| 83 | cmd_imagesize = ls -l vmlinux.strip | \ | ||
| 84 | awk '{printf "/* generated -- do not edit! */\n" "unsigned long vmlinux_filesize = %d;\n", $$5}' \ | ||
| 85 | > $(obj)/imagesize.c && \ | ||
| 86 | $(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \ | ||
| 87 | awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' >> $(obj)/imagesize.c | ||
| 77 | 88 | ||
| 78 | quiet_cmd_addnote = ADDNOTE $@ | 89 | quiet_cmd_addnote = ADDNOTE $@ |
| 79 | cmd_addnote = $(CROSS32LD) $(BOOTLFLAGS) -o $@ $(obj-boot) && $(obj)/addnote $@ | 90 | cmd_addnote = $(obj)/addnote $@ |
| 80 | 91 | ||
| 81 | $(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE | 92 | $(call gz-sec, $(required)): $(obj)/kernel-%.gz: % FORCE |
| 82 | $(call if_changed,gzip) | 93 | $(call if_changed,gzip) |
| @@ -85,28 +96,30 @@ $(obj)/kernel-initrd.gz: $(obj)/ramdisk.image.gz | |||
| 85 | cp -f $(obj)/ramdisk.image.gz $@ | 96 | cp -f $(obj)/ramdisk.image.gz $@ |
| 86 | 97 | ||
| 87 | $(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE | 98 | $(call src-sec, $(required) $(initrd)): $(obj)/kernel-%.c: $(obj)/kernel-%.gz FORCE |
| 88 | touch $@ | 99 | @touch $@ |
| 89 | 100 | ||
| 90 | $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE | 101 | $(call obj-sec, $(required) $(initrd)): $(obj)/kernel-%.o: $(obj)/kernel-%.c FORCE |
| 91 | $(call if_changed_dep,bootcc) | 102 | $(call if_changed_dep,bootcc) |
| 92 | $(call addsection, $@) | 103 | $(call cmd,addsection) |
| 104 | |||
| 105 | $(obj)/zImage.vmode: obj-boot += $(call obj-sec, $(required)) | ||
| 106 | $(obj)/zImage.vmode: $(call obj-sec, $(required)) $(obj-boot) FORCE | ||
| 107 | $(call cmd,bootld,$(obj-boot)) | ||
| 108 | |||
| 109 | $(obj)/zImage.initrd.vmode: obj-boot += $(call obj-sec, $(required) $(initrd)) | ||
| 110 | $(obj)/zImage.initrd.vmode: $(call obj-sec, $(required) $(initrd)) $(obj-boot) FORCE | ||
| 111 | $(call cmd,bootld,$(obj-boot)) | ||
| 93 | 112 | ||
| 94 | $(obj)/zImage: obj-boot += $(call obj-sec, $(required)) | 113 | $(obj)/zImage: $(obj)/zImage.vmode $(obj)/addnote FORCE |
| 95 | $(obj)/zImage: $(call obj-sec, $(required)) $(obj-boot) $(obj)/addnote FORCE | 114 | @cp -f $< $@ |
| 96 | $(call if_changed,addnote) | 115 | $(call if_changed,addnote) |
| 97 | 116 | ||
| 98 | $(obj)/zImage.initrd: obj-boot += $(call obj-sec, $(required) $(initrd)) | 117 | $(obj)/zImage.initrd: $(obj)/zImage.initrd.vmode $(obj)/addnote FORCE |
| 99 | $(obj)/zImage.initrd: $(call obj-sec, $(required) $(initrd)) $(obj-boot) $(obj)/addnote FORCE | 118 | @cp -f $< $@ |
| 100 | $(call if_changed,addnote) | 119 | $(call if_changed,addnote) |
| 101 | 120 | ||
| 102 | $(obj)/imagesize.c: vmlinux.strip | 121 | $(obj)/imagesize.c: vmlinux.strip |
| 103 | @echo Generating $@ | 122 | $(call cmd,imagesize) |
| 104 | ls -l vmlinux.strip | \ | ||
| 105 | awk '{printf "/* generated -- do not edit! */\n" \ | ||
| 106 | "unsigned long vmlinux_filesize = %d;\n", $$5}' > $(obj)/imagesize.c | ||
| 107 | $(CROSS_COMPILE)nm -n vmlinux | tail -n 1 | \ | ||
| 108 | awk '{printf "unsigned long vmlinux_memsize = 0x%s;\n", substr($$1,8)}' \ | ||
| 109 | >> $(obj)/imagesize.c | ||
| 110 | 123 | ||
| 111 | install: $(CONFIGURE) $(BOOTIMAGE) | 124 | install: $(CONFIGURE) $(BOOTIMAGE) |
| 112 | sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)" | 125 | sh -x $(srctree)/$(src)/install.sh "$(KERNELRELEASE)" vmlinux System.map "$(INSTALL_PATH)" "$(BOOTIMAGE)" |
diff --git a/arch/ppc64/boot/main.c b/arch/ppc64/boot/main.c index 99e68cfbe688..f7ec19a2d0b0 100644 --- a/arch/ppc64/boot/main.c +++ b/arch/ppc64/boot/main.c | |||
| @@ -23,7 +23,8 @@ extern void flush_cache(void *, unsigned long); | |||
| 23 | 23 | ||
| 24 | /* Value picked to match that used by yaboot */ | 24 | /* Value picked to match that used by yaboot */ |
| 25 | #define PROG_START 0x01400000 | 25 | #define PROG_START 0x01400000 |
| 26 | #define RAM_END (256<<20) // Fixme: use OF */ | 26 | #define RAM_END (512<<20) // Fixme: use OF */ |
| 27 | #define ONE_MB 0x100000 | ||
| 27 | 28 | ||
| 28 | static char *avail_ram; | 29 | static char *avail_ram; |
| 29 | static char *begin_avail, *end_avail; | 30 | static char *begin_avail, *end_avail; |
| @@ -32,6 +33,7 @@ static unsigned int heap_use; | |||
| 32 | static unsigned int heap_max; | 33 | static unsigned int heap_max; |
| 33 | 34 | ||
| 34 | extern char _start[]; | 35 | extern char _start[]; |
| 36 | extern char _end[]; | ||
| 35 | extern char _vmlinux_start[]; | 37 | extern char _vmlinux_start[]; |
| 36 | extern char _vmlinux_end[]; | 38 | extern char _vmlinux_end[]; |
| 37 | extern char _initrd_start[]; | 39 | extern char _initrd_start[]; |
| @@ -58,13 +60,13 @@ typedef void (*kernel_entry_t)( unsigned long, | |||
| 58 | 60 | ||
| 59 | #undef DEBUG | 61 | #undef DEBUG |
| 60 | 62 | ||
| 61 | static unsigned long claim_base = PROG_START; | 63 | static unsigned long claim_base; |
| 62 | 64 | ||
| 63 | static unsigned long try_claim(unsigned long size) | 65 | static unsigned long try_claim(unsigned long size) |
| 64 | { | 66 | { |
| 65 | unsigned long addr = 0; | 67 | unsigned long addr = 0; |
| 66 | 68 | ||
| 67 | for(; claim_base < RAM_END; claim_base += 0x100000) { | 69 | for(; claim_base < RAM_END; claim_base += ONE_MB) { |
| 68 | #ifdef DEBUG | 70 | #ifdef DEBUG |
| 69 | printf(" trying: 0x%08lx\n\r", claim_base); | 71 | printf(" trying: 0x%08lx\n\r", claim_base); |
| 70 | #endif | 72 | #endif |
| @@ -95,7 +97,26 @@ void start(unsigned long a1, unsigned long a2, void *promptr) | |||
| 95 | if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4) | 97 | if (getprop(chosen_handle, "stdin", &stdin, sizeof(stdin)) != 4) |
| 96 | exit(); | 98 | exit(); |
| 97 | 99 | ||
| 98 | printf("\n\rzImage starting: loaded at 0x%x\n\r", (unsigned)_start); | 100 | printf("\n\rzImage starting: loaded at 0x%lx\n\r", (unsigned long) _start); |
| 101 | |||
| 102 | /* | ||
| 103 | * The first available claim_base must be above the end of the | ||
| 104 | * the loaded kernel wrapper file (_start to _end includes the | ||
| 105 | * initrd image if it is present) and rounded up to a nice | ||
| 106 | * 1 MB boundary for good measure. | ||
| 107 | */ | ||
| 108 | |||
| 109 | claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); | ||
| 110 | |||
| 111 | #if defined(PROG_START) | ||
| 112 | /* | ||
| 113 | * Maintain a "magic" minimum address. This keeps some older | ||
| 114 | * firmware platforms running. | ||
| 115 | */ | ||
| 116 | |||
| 117 | if (claim_base < PROG_START) | ||
| 118 | claim_base = PROG_START; | ||
| 119 | #endif | ||
| 99 | 120 | ||
| 100 | /* | 121 | /* |
| 101 | * Now we try to claim some memory for the kernel itself | 122 | * Now we try to claim some memory for the kernel itself |
| @@ -105,7 +126,7 @@ void start(unsigned long a1, unsigned long a2, void *promptr) | |||
| 105 | * size... In practice we add 1Mb, that is enough, but we should really | 126 | * size... In practice we add 1Mb, that is enough, but we should really |
| 106 | * consider fixing the Makefile to put a _raw_ kernel in there ! | 127 | * consider fixing the Makefile to put a _raw_ kernel in there ! |
| 107 | */ | 128 | */ |
| 108 | vmlinux_memsize += 0x100000; | 129 | vmlinux_memsize += ONE_MB; |
| 109 | printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize); | 130 | printf("Allocating 0x%lx bytes for kernel ...\n\r", vmlinux_memsize); |
| 110 | vmlinux.addr = try_claim(vmlinux_memsize); | 131 | vmlinux.addr = try_claim(vmlinux_memsize); |
| 111 | if (vmlinux.addr == 0) { | 132 | if (vmlinux.addr == 0) { |
diff --git a/arch/ppc64/kernel/bpa_iic.c b/arch/ppc64/kernel/bpa_iic.c index c8f3dc3fad70..0aaa878e19d3 100644 --- a/arch/ppc64/kernel/bpa_iic.c +++ b/arch/ppc64/kernel/bpa_iic.c | |||
| @@ -205,6 +205,18 @@ static struct iic_regs __iomem *find_iic(int cpu) | |||
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | #ifdef CONFIG_SMP | 207 | #ifdef CONFIG_SMP |
| 208 | |||
| 209 | /* Use the highest interrupt priorities for IPI */ | ||
| 210 | static inline int iic_ipi_to_irq(int ipi) | ||
| 211 | { | ||
| 212 | return IIC_IPI_OFFSET + IIC_NUM_IPIS - 1 - ipi; | ||
| 213 | } | ||
| 214 | |||
| 215 | static inline int iic_irq_to_ipi(int irq) | ||
| 216 | { | ||
| 217 | return IIC_NUM_IPIS - 1 - (irq - IIC_IPI_OFFSET); | ||
| 218 | } | ||
| 219 | |||
| 208 | void iic_setup_cpu(void) | 220 | void iic_setup_cpu(void) |
| 209 | { | 221 | { |
| 210 | out_be64(&__get_cpu_var(iic).regs->prio, 0xff); | 222 | out_be64(&__get_cpu_var(iic).regs->prio, 0xff); |
| @@ -212,18 +224,20 @@ void iic_setup_cpu(void) | |||
| 212 | 224 | ||
| 213 | void iic_cause_IPI(int cpu, int mesg) | 225 | void iic_cause_IPI(int cpu, int mesg) |
| 214 | { | 226 | { |
| 215 | out_be64(&per_cpu(iic, cpu).regs->generate, mesg); | 227 | out_be64(&per_cpu(iic, cpu).regs->generate, (IIC_NUM_IPIS - 1 - mesg) << 4); |
| 216 | } | 228 | } |
| 217 | 229 | ||
| 218 | static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs) | 230 | static irqreturn_t iic_ipi_action(int irq, void *dev_id, struct pt_regs *regs) |
| 219 | { | 231 | { |
| 220 | 232 | smp_message_recv(iic_irq_to_ipi(irq), regs); | |
| 221 | smp_message_recv(irq - IIC_IPI_OFFSET, regs); | ||
| 222 | return IRQ_HANDLED; | 233 | return IRQ_HANDLED; |
| 223 | } | 234 | } |
| 224 | 235 | ||
| 225 | static void iic_request_ipi(int irq, const char *name) | 236 | static void iic_request_ipi(int ipi, const char *name) |
| 226 | { | 237 | { |
| 238 | int irq; | ||
| 239 | |||
| 240 | irq = iic_ipi_to_irq(ipi); | ||
| 227 | /* IPIs are marked SA_INTERRUPT as they must run with irqs | 241 | /* IPIs are marked SA_INTERRUPT as they must run with irqs |
| 228 | * disabled */ | 242 | * disabled */ |
| 229 | get_irq_desc(irq)->handler = &iic_pic; | 243 | get_irq_desc(irq)->handler = &iic_pic; |
| @@ -233,10 +247,10 @@ static void iic_request_ipi(int irq, const char *name) | |||
| 233 | 247 | ||
| 234 | void iic_request_IPIs(void) | 248 | void iic_request_IPIs(void) |
| 235 | { | 249 | { |
| 236 | iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_CALL_FUNCTION, "IPI-call"); | 250 | iic_request_ipi(PPC_MSG_CALL_FUNCTION, "IPI-call"); |
| 237 | iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_RESCHEDULE, "IPI-resched"); | 251 | iic_request_ipi(PPC_MSG_RESCHEDULE, "IPI-resched"); |
| 238 | #ifdef CONFIG_DEBUGGER | 252 | #ifdef CONFIG_DEBUGGER |
| 239 | iic_request_ipi(IIC_IPI_OFFSET + PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); | 253 | iic_request_ipi(PPC_MSG_DEBUGGER_BREAK, "IPI-debug"); |
| 240 | #endif /* CONFIG_DEBUGGER */ | 254 | #endif /* CONFIG_DEBUGGER */ |
| 241 | } | 255 | } |
| 242 | #endif /* CONFIG_SMP */ | 256 | #endif /* CONFIG_SMP */ |
diff --git a/arch/ppc64/kernel/eeh.c b/arch/ppc64/kernel/eeh.c index af5272fedadf..ba93fd731222 100644 --- a/arch/ppc64/kernel/eeh.c +++ b/arch/ppc64/kernel/eeh.c | |||
| @@ -202,10 +202,9 @@ static void pci_addr_cache_print(struct pci_io_addr_cache *cache) | |||
| 202 | while (n) { | 202 | while (n) { |
| 203 | struct pci_io_addr_range *piar; | 203 | struct pci_io_addr_range *piar; |
| 204 | piar = rb_entry(n, struct pci_io_addr_range, rb_node); | 204 | piar = rb_entry(n, struct pci_io_addr_range, rb_node); |
| 205 | printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s %s\n", | 205 | printk(KERN_DEBUG "PCI: %s addr range %d [%lx-%lx]: %s\n", |
| 206 | (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt, | 206 | (piar->flags & IORESOURCE_IO) ? "i/o" : "mem", cnt, |
| 207 | piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev), | 207 | piar->addr_lo, piar->addr_hi, pci_name(piar->pcidev)); |
| 208 | pci_pretty_name(piar->pcidev)); | ||
| 209 | cnt++; | 208 | cnt++; |
| 210 | n = rb_next(n); | 209 | n = rb_next(n); |
| 211 | } | 210 | } |
| @@ -255,22 +254,24 @@ pci_addr_cache_insert(struct pci_dev *dev, unsigned long alo, | |||
| 255 | static void __pci_addr_cache_insert_device(struct pci_dev *dev) | 254 | static void __pci_addr_cache_insert_device(struct pci_dev *dev) |
| 256 | { | 255 | { |
| 257 | struct device_node *dn; | 256 | struct device_node *dn; |
| 257 | struct pci_dn *pdn; | ||
| 258 | int i; | 258 | int i; |
| 259 | int inserted = 0; | 259 | int inserted = 0; |
| 260 | 260 | ||
| 261 | dn = pci_device_to_OF_node(dev); | 261 | dn = pci_device_to_OF_node(dev); |
| 262 | if (!dn) { | 262 | if (!dn) { |
| 263 | printk(KERN_WARNING "PCI: no pci dn found for dev=%s %s\n", | 263 | printk(KERN_WARNING "PCI: no pci dn found for dev=%s\n", |
| 264 | pci_name(dev), pci_pretty_name(dev)); | 264 | pci_name(dev)); |
| 265 | return; | 265 | return; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | /* Skip any devices for which EEH is not enabled. */ | 268 | /* Skip any devices for which EEH is not enabled. */ |
| 269 | if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) || | 269 | pdn = dn->data; |
| 270 | dn->eeh_mode & EEH_MODE_NOCHECK) { | 270 | if (!(pdn->eeh_mode & EEH_MODE_SUPPORTED) || |
| 271 | pdn->eeh_mode & EEH_MODE_NOCHECK) { | ||
| 271 | #ifdef DEBUG | 272 | #ifdef DEBUG |
| 272 | printk(KERN_INFO "PCI: skip building address cache for=%s %s\n", | 273 | printk(KERN_INFO "PCI: skip building address cache for=%s\n", |
| 273 | pci_name(dev), pci_pretty_name(dev)); | 274 | pci_name(dev)); |
| 274 | #endif | 275 | #endif |
| 275 | return; | 276 | return; |
| 276 | } | 277 | } |
| @@ -416,6 +417,7 @@ int eeh_unregister_notifier(struct notifier_block *nb) | |||
| 416 | static int read_slot_reset_state(struct device_node *dn, int rets[]) | 417 | static int read_slot_reset_state(struct device_node *dn, int rets[]) |
| 417 | { | 418 | { |
| 418 | int token, outputs; | 419 | int token, outputs; |
| 420 | struct pci_dn *pdn = dn->data; | ||
| 419 | 421 | ||
| 420 | if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) { | 422 | if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) { |
| 421 | token = ibm_read_slot_reset_state2; | 423 | token = ibm_read_slot_reset_state2; |
| @@ -425,8 +427,8 @@ static int read_slot_reset_state(struct device_node *dn, int rets[]) | |||
| 425 | outputs = 3; | 427 | outputs = 3; |
| 426 | } | 428 | } |
| 427 | 429 | ||
| 428 | return rtas_call(token, 3, outputs, rets, dn->eeh_config_addr, | 430 | return rtas_call(token, 3, outputs, rets, pdn->eeh_config_addr, |
| 429 | BUID_HI(dn->phb->buid), BUID_LO(dn->phb->buid)); | 431 | BUID_HI(pdn->phb->buid), BUID_LO(pdn->phb->buid)); |
| 430 | } | 432 | } |
| 431 | 433 | ||
| 432 | /** | 434 | /** |
| @@ -447,12 +449,12 @@ static void eeh_panic(struct pci_dev *dev, int reset_state) | |||
| 447 | * in light of potential corruption, we can use it here. | 449 | * in light of potential corruption, we can use it here. |
| 448 | */ | 450 | */ |
| 449 | if (panic_on_oops) | 451 | if (panic_on_oops) |
| 450 | panic("EEH: MMIO failure (%d) on device:%s %s\n", reset_state, | 452 | panic("EEH: MMIO failure (%d) on device:%s\n", reset_state, |
| 451 | pci_name(dev), pci_pretty_name(dev)); | 453 | pci_name(dev)); |
| 452 | else { | 454 | else { |
| 453 | __get_cpu_var(ignored_failures)++; | 455 | __get_cpu_var(ignored_failures)++; |
| 454 | printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s %s\n", | 456 | printk(KERN_INFO "EEH: Ignored MMIO failure (%d) on device:%s\n", |
| 455 | reset_state, pci_name(dev), pci_pretty_name(dev)); | 457 | reset_state, pci_name(dev)); |
| 456 | } | 458 | } |
| 457 | } | 459 | } |
| 458 | 460 | ||
| @@ -482,8 +484,8 @@ static void eeh_event_handler(void *dummy) | |||
| 482 | break; | 484 | break; |
| 483 | 485 | ||
| 484 | printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device " | 486 | printk(KERN_INFO "EEH: MMIO failure (%d), notifiying device " |
| 485 | "%s %s\n", event->reset_state, | 487 | "%s\n", event->reset_state, |
| 486 | pci_name(event->dev), pci_pretty_name(event->dev)); | 488 | pci_name(event->dev)); |
| 487 | 489 | ||
| 488 | atomic_set(&eeh_fail_count, 0); | 490 | atomic_set(&eeh_fail_count, 0); |
| 489 | notifier_call_chain (&eeh_notifier_chain, | 491 | notifier_call_chain (&eeh_notifier_chain, |
| @@ -535,6 +537,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 535 | unsigned long flags; | 537 | unsigned long flags; |
| 536 | int rc, reset_state; | 538 | int rc, reset_state; |
| 537 | struct eeh_event *event; | 539 | struct eeh_event *event; |
| 540 | struct pci_dn *pdn; | ||
| 538 | 541 | ||
| 539 | __get_cpu_var(total_mmio_ffs)++; | 542 | __get_cpu_var(total_mmio_ffs)++; |
| 540 | 543 | ||
| @@ -543,14 +546,15 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 543 | 546 | ||
| 544 | if (!dn) | 547 | if (!dn) |
| 545 | return 0; | 548 | return 0; |
| 549 | pdn = dn->data; | ||
| 546 | 550 | ||
| 547 | /* Access to IO BARs might get this far and still not want checking. */ | 551 | /* Access to IO BARs might get this far and still not want checking. */ |
| 548 | if (!(dn->eeh_mode & EEH_MODE_SUPPORTED) || | 552 | if (!pdn->eeh_capable || !(pdn->eeh_mode & EEH_MODE_SUPPORTED) || |
| 549 | dn->eeh_mode & EEH_MODE_NOCHECK) { | 553 | pdn->eeh_mode & EEH_MODE_NOCHECK) { |
| 550 | return 0; | 554 | return 0; |
| 551 | } | 555 | } |
| 552 | 556 | ||
| 553 | if (!dn->eeh_config_addr) { | 557 | if (!pdn->eeh_config_addr) { |
| 554 | return 0; | 558 | return 0; |
| 555 | } | 559 | } |
| 556 | 560 | ||
| @@ -558,7 +562,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 558 | * If we already have a pending isolation event for this | 562 | * If we already have a pending isolation event for this |
| 559 | * slot, we know it's bad already, we don't need to check... | 563 | * slot, we know it's bad already, we don't need to check... |
| 560 | */ | 564 | */ |
| 561 | if (dn->eeh_mode & EEH_MODE_ISOLATED) { | 565 | if (pdn->eeh_mode & EEH_MODE_ISOLATED) { |
| 562 | atomic_inc(&eeh_fail_count); | 566 | atomic_inc(&eeh_fail_count); |
| 563 | if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) { | 567 | if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) { |
| 564 | /* re-read the slot reset state */ | 568 | /* re-read the slot reset state */ |
| @@ -583,7 +587,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 583 | } | 587 | } |
| 584 | 588 | ||
| 585 | /* prevent repeated reports of this failure */ | 589 | /* prevent repeated reports of this failure */ |
| 586 | dn->eeh_mode |= EEH_MODE_ISOLATED; | 590 | pdn->eeh_mode |= EEH_MODE_ISOLATED; |
| 587 | 591 | ||
| 588 | reset_state = rets[0]; | 592 | reset_state = rets[0]; |
| 589 | 593 | ||
| @@ -591,9 +595,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
| 591 | memset(slot_errbuf, 0, eeh_error_buf_size); | 595 | memset(slot_errbuf, 0, eeh_error_buf_size); |
| 592 | 596 | ||
| 593 | rc = rtas_call(ibm_slot_error_detail, | 597 | rc = rtas_call(ibm_slot_error_detail, |
| 594 | 8, 1, NULL, dn->eeh_config_addr, | 598 | 8, 1, NULL, pdn->eeh_config_addr, |
| 595 | BUID_HI(dn->phb->buid), | 599 | BUID_HI(pdn->phb->buid), |
| 596 | BUID_LO(dn->phb->buid), NULL, 0, | 600 | BUID_LO(pdn->phb->buid), NULL, 0, |
| 597 | virt_to_phys(slot_errbuf), | 601 | virt_to_phys(slot_errbuf), |
| 598 | eeh_error_buf_size, | 602 | eeh_error_buf_size, |
| 599 | 1 /* Temporary Error */); | 603 | 1 /* Temporary Error */); |
| @@ -680,8 +684,9 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
| 680 | u32 *device_id = (u32 *)get_property(dn, "device-id", NULL); | 684 | u32 *device_id = (u32 *)get_property(dn, "device-id", NULL); |
| 681 | u32 *regs; | 685 | u32 *regs; |
| 682 | int enable; | 686 | int enable; |
| 687 | struct pci_dn *pdn = dn->data; | ||
| 683 | 688 | ||
| 684 | dn->eeh_mode = 0; | 689 | pdn->eeh_mode = 0; |
| 685 | 690 | ||
| 686 | if (status && strcmp(status, "ok") != 0) | 691 | if (status && strcmp(status, "ok") != 0) |
| 687 | return NULL; /* ignore devices with bad status */ | 692 | return NULL; /* ignore devices with bad status */ |
| @@ -692,7 +697,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
| 692 | 697 | ||
| 693 | /* There is nothing to check on PCI to ISA bridges */ | 698 | /* There is nothing to check on PCI to ISA bridges */ |
| 694 | if (dn->type && !strcmp(dn->type, "isa")) { | 699 | if (dn->type && !strcmp(dn->type, "isa")) { |
| 695 | dn->eeh_mode |= EEH_MODE_NOCHECK; | 700 | pdn->eeh_mode |= EEH_MODE_NOCHECK; |
| 696 | return NULL; | 701 | return NULL; |
| 697 | } | 702 | } |
| 698 | 703 | ||
| @@ -709,7 +714,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
| 709 | enable = 0; | 714 | enable = 0; |
| 710 | 715 | ||
| 711 | if (!enable) | 716 | if (!enable) |
| 712 | dn->eeh_mode |= EEH_MODE_NOCHECK; | 717 | pdn->eeh_mode |= EEH_MODE_NOCHECK; |
| 713 | 718 | ||
| 714 | /* Ok... see if this device supports EEH. Some do, some don't, | 719 | /* Ok... see if this device supports EEH. Some do, some don't, |
| 715 | * and the only way to find out is to check each and every one. */ | 720 | * and the only way to find out is to check each and every one. */ |
| @@ -722,8 +727,8 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
| 722 | EEH_ENABLE); | 727 | EEH_ENABLE); |
| 723 | if (ret == 0) { | 728 | if (ret == 0) { |
| 724 | eeh_subsystem_enabled = 1; | 729 | eeh_subsystem_enabled = 1; |
| 725 | dn->eeh_mode |= EEH_MODE_SUPPORTED; | 730 | pdn->eeh_mode |= EEH_MODE_SUPPORTED; |
| 726 | dn->eeh_config_addr = regs[0]; | 731 | pdn->eeh_config_addr = regs[0]; |
| 727 | #ifdef DEBUG | 732 | #ifdef DEBUG |
| 728 | printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name); | 733 | printk(KERN_DEBUG "EEH: %s: eeh enabled\n", dn->full_name); |
| 729 | #endif | 734 | #endif |
| @@ -731,10 +736,11 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
| 731 | 736 | ||
| 732 | /* This device doesn't support EEH, but it may have an | 737 | /* This device doesn't support EEH, but it may have an |
| 733 | * EEH parent, in which case we mark it as supported. */ | 738 | * EEH parent, in which case we mark it as supported. */ |
| 734 | if (dn->parent && (dn->parent->eeh_mode & EEH_MODE_SUPPORTED)) { | 739 | if (dn->parent && dn->parent->data |
| 740 | && (PCI_DN(dn->parent)->eeh_mode & EEH_MODE_SUPPORTED)) { | ||
| 735 | /* Parent supports EEH. */ | 741 | /* Parent supports EEH. */ |
| 736 | dn->eeh_mode |= EEH_MODE_SUPPORTED; | 742 | pdn->eeh_mode |= EEH_MODE_SUPPORTED; |
| 737 | dn->eeh_config_addr = dn->parent->eeh_config_addr; | 743 | pdn->eeh_config_addr = PCI_DN(dn->parent)->eeh_config_addr; |
| 738 | return NULL; | 744 | return NULL; |
| 739 | } | 745 | } |
| 740 | } | 746 | } |
| @@ -791,11 +797,13 @@ void __init eeh_init(void) | |||
| 791 | for (phb = of_find_node_by_name(NULL, "pci"); phb; | 797 | for (phb = of_find_node_by_name(NULL, "pci"); phb; |
| 792 | phb = of_find_node_by_name(phb, "pci")) { | 798 | phb = of_find_node_by_name(phb, "pci")) { |
| 793 | unsigned long buid; | 799 | unsigned long buid; |
| 800 | struct pci_dn *pci; | ||
| 794 | 801 | ||
| 795 | buid = get_phb_buid(phb); | 802 | buid = get_phb_buid(phb); |
| 796 | if (buid == 0) | 803 | if (buid == 0 || phb->data == NULL) |
| 797 | continue; | 804 | continue; |
| 798 | 805 | ||
| 806 | pci = phb->data; | ||
| 799 | info.buid_lo = BUID_LO(buid); | 807 | info.buid_lo = BUID_LO(buid); |
| 800 | info.buid_hi = BUID_HI(buid); | 808 | info.buid_hi = BUID_HI(buid); |
| 801 | traverse_pci_devices(phb, early_enable_eeh, &info); | 809 | traverse_pci_devices(phb, early_enable_eeh, &info); |
| @@ -824,9 +832,9 @@ void eeh_add_device_early(struct device_node *dn) | |||
| 824 | struct pci_controller *phb; | 832 | struct pci_controller *phb; |
| 825 | struct eeh_early_enable_info info; | 833 | struct eeh_early_enable_info info; |
| 826 | 834 | ||
| 827 | if (!dn) | 835 | if (!dn || !dn->data) |
| 828 | return; | 836 | return; |
| 829 | phb = dn->phb; | 837 | phb = PCI_DN(dn)->phb; |
| 830 | if (NULL == phb || 0 == phb->buid) { | 838 | if (NULL == phb || 0 == phb->buid) { |
| 831 | printk(KERN_WARNING "EEH: Expected buid but found none\n"); | 839 | printk(KERN_WARNING "EEH: Expected buid but found none\n"); |
| 832 | return; | 840 | return; |
| @@ -851,8 +859,7 @@ void eeh_add_device_late(struct pci_dev *dev) | |||
| 851 | return; | 859 | return; |
| 852 | 860 | ||
| 853 | #ifdef DEBUG | 861 | #ifdef DEBUG |
| 854 | printk(KERN_DEBUG "EEH: adding device %s %s\n", pci_name(dev), | 862 | printk(KERN_DEBUG "EEH: adding device %s\n", pci_name(dev)); |
| 855 | pci_pretty_name(dev)); | ||
| 856 | #endif | 863 | #endif |
| 857 | 864 | ||
| 858 | pci_addr_cache_insert_device (dev); | 865 | pci_addr_cache_insert_device (dev); |
| @@ -873,8 +880,7 @@ void eeh_remove_device(struct pci_dev *dev) | |||
| 873 | 880 | ||
| 874 | /* Unregister the device with the EEH/PCI address search system */ | 881 | /* Unregister the device with the EEH/PCI address search system */ |
| 875 | #ifdef DEBUG | 882 | #ifdef DEBUG |
| 876 | printk(KERN_DEBUG "EEH: remove device %s %s\n", pci_name(dev), | 883 | printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev)); |
| 877 | pci_pretty_name(dev)); | ||
| 878 | #endif | 884 | #endif |
| 879 | pci_addr_cache_remove_device(dev); | 885 | pci_addr_cache_remove_device(dev); |
| 880 | } | 886 | } |
diff --git a/arch/ppc64/kernel/iSeries_VpdInfo.c b/arch/ppc64/kernel/iSeries_VpdInfo.c index d11c732daf81..5d921792571f 100644 --- a/arch/ppc64/kernel/iSeries_VpdInfo.c +++ b/arch/ppc64/kernel/iSeries_VpdInfo.c | |||
| @@ -264,8 +264,5 @@ void __init iSeries_Device_Information(struct pci_dev *PciDev, int count) | |||
| 264 | printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ", | 264 | printk("%d. PCI: Bus%3d, Device%3d, Vendor %04X Frame%3d, Card %4s ", |
| 265 | count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor, | 265 | count, bus, PCI_SLOT(PciDev->devfn), PciDev->vendor, |
| 266 | frame, card); | 266 | frame, card); |
| 267 | if (pci_class_name(PciDev->class >> 8) == 0) | 267 | printk("0x%04X\n", (int)(PciDev->class >> 8)); |
| 268 | printk("0x%04X\n", (int)(PciDev->class >> 8)); | ||
| 269 | else | ||
| 270 | printk("%s\n", pci_class_name(PciDev->class >> 8)); | ||
| 271 | } | 268 | } |
diff --git a/arch/ppc64/kernel/iomap.c b/arch/ppc64/kernel/iomap.c index 153cc8b0f136..6160c8dbb7c5 100644 --- a/arch/ppc64/kernel/iomap.c +++ b/arch/ppc64/kernel/iomap.c | |||
| @@ -22,13 +22,23 @@ unsigned int fastcall ioread16(void __iomem *addr) | |||
| 22 | { | 22 | { |
| 23 | return readw(addr); | 23 | return readw(addr); |
| 24 | } | 24 | } |
| 25 | unsigned int fastcall ioread16be(void __iomem *addr) | ||
| 26 | { | ||
| 27 | return in_be16(addr); | ||
| 28 | } | ||
| 25 | unsigned int fastcall ioread32(void __iomem *addr) | 29 | unsigned int fastcall ioread32(void __iomem *addr) |
| 26 | { | 30 | { |
| 27 | return readl(addr); | 31 | return readl(addr); |
| 28 | } | 32 | } |
| 33 | unsigned int fastcall ioread32be(void __iomem *addr) | ||
| 34 | { | ||
| 35 | return in_be32(addr); | ||
| 36 | } | ||
| 29 | EXPORT_SYMBOL(ioread8); | 37 | EXPORT_SYMBOL(ioread8); |
| 30 | EXPORT_SYMBOL(ioread16); | 38 | EXPORT_SYMBOL(ioread16); |
| 39 | EXPORT_SYMBOL(ioread16be); | ||
| 31 | EXPORT_SYMBOL(ioread32); | 40 | EXPORT_SYMBOL(ioread32); |
| 41 | EXPORT_SYMBOL(ioread32be); | ||
| 32 | 42 | ||
| 33 | void fastcall iowrite8(u8 val, void __iomem *addr) | 43 | void fastcall iowrite8(u8 val, void __iomem *addr) |
| 34 | { | 44 | { |
| @@ -38,13 +48,23 @@ void fastcall iowrite16(u16 val, void __iomem *addr) | |||
| 38 | { | 48 | { |
| 39 | writew(val, addr); | 49 | writew(val, addr); |
| 40 | } | 50 | } |
| 51 | void fastcall iowrite16be(u16 val, void __iomem *addr) | ||
| 52 | { | ||
| 53 | out_be16(addr, val); | ||
| 54 | } | ||
| 41 | void fastcall iowrite32(u32 val, void __iomem *addr) | 55 | void fastcall iowrite32(u32 val, void __iomem *addr) |
| 42 | { | 56 | { |
| 43 | writel(val, addr); | 57 | writel(val, addr); |
| 44 | } | 58 | } |
| 59 | void fastcall iowrite32be(u32 val, void __iomem *addr) | ||
| 60 | { | ||
| 61 | out_be32(addr, val); | ||
| 62 | } | ||
| 45 | EXPORT_SYMBOL(iowrite8); | 63 | EXPORT_SYMBOL(iowrite8); |
| 46 | EXPORT_SYMBOL(iowrite16); | 64 | EXPORT_SYMBOL(iowrite16); |
| 65 | EXPORT_SYMBOL(iowrite16be); | ||
| 47 | EXPORT_SYMBOL(iowrite32); | 66 | EXPORT_SYMBOL(iowrite32); |
| 67 | EXPORT_SYMBOL(iowrite32be); | ||
| 48 | 68 | ||
| 49 | /* | 69 | /* |
| 50 | * These are the "repeat read/write" functions. Note the | 70 | * These are the "repeat read/write" functions. Note the |
| @@ -56,15 +76,15 @@ EXPORT_SYMBOL(iowrite32); | |||
| 56 | */ | 76 | */ |
| 57 | void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) | 77 | void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) |
| 58 | { | 78 | { |
| 59 | _insb((u8 __force *) addr, dst, count); | 79 | _insb((u8 __iomem *) addr, dst, count); |
| 60 | } | 80 | } |
| 61 | void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) | 81 | void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) |
| 62 | { | 82 | { |
| 63 | _insw_ns((u16 __force *) addr, dst, count); | 83 | _insw_ns((u16 __iomem *) addr, dst, count); |
| 64 | } | 84 | } |
| 65 | void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) | 85 | void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) |
| 66 | { | 86 | { |
| 67 | _insl_ns((u32 __force *) addr, dst, count); | 87 | _insl_ns((u32 __iomem *) addr, dst, count); |
| 68 | } | 88 | } |
| 69 | EXPORT_SYMBOL(ioread8_rep); | 89 | EXPORT_SYMBOL(ioread8_rep); |
| 70 | EXPORT_SYMBOL(ioread16_rep); | 90 | EXPORT_SYMBOL(ioread16_rep); |
| @@ -72,15 +92,15 @@ EXPORT_SYMBOL(ioread32_rep); | |||
| 72 | 92 | ||
| 73 | void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) | 93 | void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) |
| 74 | { | 94 | { |
| 75 | _outsb((u8 __force *) addr, src, count); | 95 | _outsb((u8 __iomem *) addr, src, count); |
| 76 | } | 96 | } |
| 77 | void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) | 97 | void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) |
| 78 | { | 98 | { |
| 79 | _outsw_ns((u16 __force *) addr, src, count); | 99 | _outsw_ns((u16 __iomem *) addr, src, count); |
| 80 | } | 100 | } |
| 81 | void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) | 101 | void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) |
| 82 | { | 102 | { |
| 83 | _outsl_ns((u32 __force *) addr, src, count); | 103 | _outsl_ns((u32 __iomem *) addr, src, count); |
| 84 | } | 104 | } |
| 85 | EXPORT_SYMBOL(iowrite8_rep); | 105 | EXPORT_SYMBOL(iowrite8_rep); |
| 86 | EXPORT_SYMBOL(iowrite16_rep); | 106 | EXPORT_SYMBOL(iowrite16_rep); |
diff --git a/arch/ppc64/kernel/iommu.c b/arch/ppc64/kernel/iommu.c index 845eebd1e28d..9032b6bfe036 100644 --- a/arch/ppc64/kernel/iommu.c +++ b/arch/ppc64/kernel/iommu.c | |||
| @@ -438,7 +438,8 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl) | |||
| 438 | 438 | ||
| 439 | void iommu_free_table(struct device_node *dn) | 439 | void iommu_free_table(struct device_node *dn) |
| 440 | { | 440 | { |
| 441 | struct iommu_table *tbl = dn->iommu_table; | 441 | struct pci_dn *pdn = dn->data; |
| 442 | struct iommu_table *tbl = pdn->iommu_table; | ||
| 442 | unsigned long bitmap_sz, i; | 443 | unsigned long bitmap_sz, i; |
| 443 | unsigned int order; | 444 | unsigned int order; |
| 444 | 445 | ||
diff --git a/arch/ppc64/kernel/maple_pci.c b/arch/ppc64/kernel/maple_pci.c index 53993999b265..5a8b4d8c2dd6 100644 --- a/arch/ppc64/kernel/maple_pci.c +++ b/arch/ppc64/kernel/maple_pci.c | |||
| @@ -447,9 +447,9 @@ void __init maple_pci_init(void) | |||
| 447 | */ | 447 | */ |
| 448 | if (u3_agp) { | 448 | if (u3_agp) { |
| 449 | struct device_node *np = u3_agp->arch_data; | 449 | struct device_node *np = u3_agp->arch_data; |
| 450 | np->busno = 0xf0; | 450 | PCI_DN(np)->busno = 0xf0; |
| 451 | for (np = np->child; np; np = np->sibling) | 451 | for (np = np->child; np; np = np->sibling) |
| 452 | np->busno = 0xf0; | 452 | PCI_DN(np)->busno = 0xf0; |
| 453 | } | 453 | } |
| 454 | 454 | ||
| 455 | /* Tell pci.c to use the common resource allocation mecanism */ | 455 | /* Tell pci.c to use the common resource allocation mecanism */ |
diff --git a/arch/ppc64/kernel/misc.S b/arch/ppc64/kernel/misc.S index 6d860c1d9fa0..c047663eb48d 100644 --- a/arch/ppc64/kernel/misc.S +++ b/arch/ppc64/kernel/misc.S | |||
| @@ -1431,9 +1431,9 @@ _GLOBAL(sys_call_table) | |||
| 1431 | .llong .sys_ni_syscall /* 195 - 32bit only stat64 */ | 1431 | .llong .sys_ni_syscall /* 195 - 32bit only stat64 */ |
| 1432 | .llong .sys_ni_syscall /* 32bit only lstat64 */ | 1432 | .llong .sys_ni_syscall /* 32bit only lstat64 */ |
| 1433 | .llong .sys_ni_syscall /* 32bit only fstat64 */ | 1433 | .llong .sys_ni_syscall /* 32bit only fstat64 */ |
| 1434 | .llong .sys_ni_syscall /* 32bit only pciconfig_read */ | 1434 | .llong .sys_pciconfig_read |
| 1435 | .llong .sys_ni_syscall /* 32bit only pciconfig_write */ | 1435 | .llong .sys_pciconfig_write |
| 1436 | .llong .sys_ni_syscall /* 32bit only pciconfig_iobase */ | 1436 | .llong .sys_pciconfig_iobase /* 200 - pciconfig_iobase */ |
| 1437 | .llong .sys_ni_syscall /* reserved for MacOnLinux */ | 1437 | .llong .sys_ni_syscall /* reserved for MacOnLinux */ |
| 1438 | .llong .sys_getdents64 | 1438 | .llong .sys_getdents64 |
| 1439 | .llong .sys_pivot_root | 1439 | .llong .sys_pivot_root |
diff --git a/arch/ppc64/kernel/pSeries_iommu.c b/arch/ppc64/kernel/pSeries_iommu.c index 9d5e1e7fc389..f0fd7fbd6531 100644 --- a/arch/ppc64/kernel/pSeries_iommu.c +++ b/arch/ppc64/kernel/pSeries_iommu.c | |||
| @@ -295,7 +295,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb, | |||
| 295 | struct iommu_table *tbl, | 295 | struct iommu_table *tbl, |
| 296 | unsigned int *dma_window) | 296 | unsigned int *dma_window) |
| 297 | { | 297 | { |
| 298 | tbl->it_busno = dn->bussubno; | 298 | tbl->it_busno = PCI_DN(dn)->bussubno; |
| 299 | 299 | ||
| 300 | /* TODO: Parse field size properties properly. */ | 300 | /* TODO: Parse field size properties properly. */ |
| 301 | tbl->it_size = (((unsigned long)dma_window[4] << 32) | | 301 | tbl->it_size = (((unsigned long)dma_window[4] << 32) | |
| @@ -311,6 +311,7 @@ static void iommu_table_setparms_lpar(struct pci_controller *phb, | |||
| 311 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) | 311 | static void iommu_bus_setup_pSeries(struct pci_bus *bus) |
| 312 | { | 312 | { |
| 313 | struct device_node *dn, *pdn; | 313 | struct device_node *dn, *pdn; |
| 314 | struct pci_dn *pci; | ||
| 314 | struct iommu_table *tbl; | 315 | struct iommu_table *tbl; |
| 315 | 316 | ||
| 316 | DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self); | 317 | DBG("iommu_bus_setup_pSeries, bus %p, bus->self %p\n", bus, bus->self); |
| @@ -325,6 +326,7 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
| 325 | */ | 326 | */ |
| 326 | 327 | ||
| 327 | dn = pci_bus_to_OF_node(bus); | 328 | dn = pci_bus_to_OF_node(bus); |
| 329 | pci = dn->data; | ||
| 328 | 330 | ||
| 329 | if (!bus->self) { | 331 | if (!bus->self) { |
| 330 | /* Root bus */ | 332 | /* Root bus */ |
| @@ -341,18 +343,18 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
| 341 | * alltogether. This leaves 768MB for the window. | 343 | * alltogether. This leaves 768MB for the window. |
| 342 | */ | 344 | */ |
| 343 | DBG("PHB has io-hole, reserving 256MB\n"); | 345 | DBG("PHB has io-hole, reserving 256MB\n"); |
| 344 | dn->phb->dma_window_size = 3 << 28; | 346 | pci->phb->dma_window_size = 3 << 28; |
| 345 | dn->phb->dma_window_base_cur = 1 << 28; | 347 | pci->phb->dma_window_base_cur = 1 << 28; |
| 346 | } else { | 348 | } else { |
| 347 | /* 1GB window by default */ | 349 | /* 1GB window by default */ |
| 348 | dn->phb->dma_window_size = 1 << 30; | 350 | pci->phb->dma_window_size = 1 << 30; |
| 349 | dn->phb->dma_window_base_cur = 0; | 351 | pci->phb->dma_window_base_cur = 0; |
| 350 | } | 352 | } |
| 351 | 353 | ||
| 352 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 354 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); |
| 353 | 355 | ||
| 354 | iommu_table_setparms(dn->phb, dn, tbl); | 356 | iommu_table_setparms(pci->phb, dn, tbl); |
| 355 | dn->iommu_table = iommu_init_table(tbl); | 357 | pci->iommu_table = iommu_init_table(tbl); |
| 356 | } else { | 358 | } else { |
| 357 | /* Do a 128MB table at root. This is used for the IDE | 359 | /* Do a 128MB table at root. This is used for the IDE |
| 358 | * controller on some SMP-mode POWER4 machines. It | 360 | * controller on some SMP-mode POWER4 machines. It |
| @@ -363,16 +365,16 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
| 363 | * Allocate at offset 128MB to avoid having to deal | 365 | * Allocate at offset 128MB to avoid having to deal |
| 364 | * with ISA holes; 128MB table for IDE is plenty. | 366 | * with ISA holes; 128MB table for IDE is plenty. |
| 365 | */ | 367 | */ |
| 366 | dn->phb->dma_window_size = 1 << 27; | 368 | pci->phb->dma_window_size = 1 << 27; |
| 367 | dn->phb->dma_window_base_cur = 1 << 27; | 369 | pci->phb->dma_window_base_cur = 1 << 27; |
| 368 | 370 | ||
| 369 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 371 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); |
| 370 | 372 | ||
| 371 | iommu_table_setparms(dn->phb, dn, tbl); | 373 | iommu_table_setparms(pci->phb, dn, tbl); |
| 372 | dn->iommu_table = iommu_init_table(tbl); | 374 | pci->iommu_table = iommu_init_table(tbl); |
| 373 | 375 | ||
| 374 | /* All child buses have 256MB tables */ | 376 | /* All child buses have 256MB tables */ |
| 375 | dn->phb->dma_window_size = 1 << 28; | 377 | pci->phb->dma_window_size = 1 << 28; |
| 376 | } | 378 | } |
| 377 | } else { | 379 | } else { |
| 378 | pdn = pci_bus_to_OF_node(bus->parent); | 380 | pdn = pci_bus_to_OF_node(bus->parent); |
| @@ -386,12 +388,12 @@ static void iommu_bus_setup_pSeries(struct pci_bus *bus) | |||
| 386 | 388 | ||
| 387 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); | 389 | tbl = kmalloc(sizeof(struct iommu_table), GFP_KERNEL); |
| 388 | 390 | ||
| 389 | iommu_table_setparms(dn->phb, dn, tbl); | 391 | iommu_table_setparms(pci->phb, dn, tbl); |
| 390 | 392 | ||
| 391 | dn->iommu_table = iommu_init_table(tbl); | 393 | pci->iommu_table = iommu_init_table(tbl); |
| 392 | } else { | 394 | } else { |
| 393 | /* Lower than first child or under python, use parent table */ | 395 | /* Lower than first child or under python, use parent table */ |
| 394 | dn->iommu_table = pdn->iommu_table; | 396 | pci->iommu_table = PCI_DN(pdn)->iommu_table; |
| 395 | } | 397 | } |
| 396 | } | 398 | } |
| 397 | } | 399 | } |
| @@ -401,6 +403,7 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus) | |||
| 401 | { | 403 | { |
| 402 | struct iommu_table *tbl; | 404 | struct iommu_table *tbl; |
| 403 | struct device_node *dn, *pdn; | 405 | struct device_node *dn, *pdn; |
| 406 | struct pci_dn *ppci; | ||
| 404 | unsigned int *dma_window = NULL; | 407 | unsigned int *dma_window = NULL; |
| 405 | 408 | ||
| 406 | DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); | 409 | DBG("iommu_bus_setup_pSeriesLP, bus %p, bus->self %p\n", bus, bus->self); |
| @@ -419,22 +422,24 @@ static void iommu_bus_setup_pSeriesLP(struct pci_bus *bus) | |||
| 419 | return; | 422 | return; |
| 420 | } | 423 | } |
| 421 | 424 | ||
| 422 | if (!pdn->iommu_table) { | 425 | ppci = pdn->data; |
| 426 | if (!ppci->iommu_table) { | ||
| 423 | /* Bussubno hasn't been copied yet. | 427 | /* Bussubno hasn't been copied yet. |
| 424 | * Do it now because iommu_table_setparms_lpar needs it. | 428 | * Do it now because iommu_table_setparms_lpar needs it. |
| 425 | */ | 429 | */ |
| 426 | pdn->bussubno = bus->number; | 430 | |
| 431 | ppci->bussubno = bus->number; | ||
| 427 | 432 | ||
| 428 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), | 433 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), |
| 429 | GFP_KERNEL); | 434 | GFP_KERNEL); |
| 430 | 435 | ||
| 431 | iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window); | 436 | iommu_table_setparms_lpar(ppci->phb, pdn, tbl, dma_window); |
| 432 | 437 | ||
| 433 | pdn->iommu_table = iommu_init_table(tbl); | 438 | ppci->iommu_table = iommu_init_table(tbl); |
| 434 | } | 439 | } |
| 435 | 440 | ||
| 436 | if (pdn != dn) | 441 | if (pdn != dn) |
| 437 | dn->iommu_table = pdn->iommu_table; | 442 | PCI_DN(dn)->iommu_table = ppci->iommu_table; |
| 438 | } | 443 | } |
| 439 | 444 | ||
| 440 | 445 | ||
| @@ -449,11 +454,11 @@ static void iommu_dev_setup_pSeries(struct pci_dev *dev) | |||
| 449 | */ | 454 | */ |
| 450 | mydn = dn = pci_device_to_OF_node(dev); | 455 | mydn = dn = pci_device_to_OF_node(dev); |
| 451 | 456 | ||
| 452 | while (dn && dn->iommu_table == NULL) | 457 | while (dn && dn->data && PCI_DN(dn)->iommu_table == NULL) |
| 453 | dn = dn->parent; | 458 | dn = dn->parent; |
| 454 | 459 | ||
| 455 | if (dn) { | 460 | if (dn && dn->data) { |
| 456 | mydn->iommu_table = dn->iommu_table; | 461 | PCI_DN(mydn)->iommu_table = PCI_DN(dn)->iommu_table; |
| 457 | } else { | 462 | } else { |
| 458 | DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name); | 463 | DBG("iommu_dev_setup_pSeries, dev %p (%s) has no iommu table\n", dev, dev->pretty_name); |
| 459 | } | 464 | } |
| @@ -463,10 +468,11 @@ static int iommu_reconfig_notifier(struct notifier_block *nb, unsigned long acti | |||
| 463 | { | 468 | { |
| 464 | int err = NOTIFY_OK; | 469 | int err = NOTIFY_OK; |
| 465 | struct device_node *np = node; | 470 | struct device_node *np = node; |
| 471 | struct pci_dn *pci = np->data; | ||
| 466 | 472 | ||
| 467 | switch (action) { | 473 | switch (action) { |
| 468 | case PSERIES_RECONFIG_REMOVE: | 474 | case PSERIES_RECONFIG_REMOVE: |
| 469 | if (np->iommu_table && | 475 | if (pci->iommu_table && |
| 470 | get_property(np, "ibm,dma-window", NULL)) | 476 | get_property(np, "ibm,dma-window", NULL)) |
| 471 | iommu_free_table(np); | 477 | iommu_free_table(np); |
| 472 | break; | 478 | break; |
| @@ -486,6 +492,7 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
| 486 | struct device_node *pdn, *dn; | 492 | struct device_node *pdn, *dn; |
| 487 | struct iommu_table *tbl; | 493 | struct iommu_table *tbl; |
| 488 | int *dma_window = NULL; | 494 | int *dma_window = NULL; |
| 495 | struct pci_dn *pci; | ||
| 489 | 496 | ||
| 490 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name); | 497 | DBG("iommu_dev_setup_pSeriesLP, dev %p (%s)\n", dev, dev->pretty_name); |
| 491 | 498 | ||
| @@ -497,8 +504,10 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
| 497 | */ | 504 | */ |
| 498 | dn = pci_device_to_OF_node(dev); | 505 | dn = pci_device_to_OF_node(dev); |
| 499 | 506 | ||
| 500 | for (pdn = dn; pdn && !pdn->iommu_table; pdn = pdn->parent) { | 507 | for (pdn = dn; pdn && pdn->data && !PCI_DN(pdn)->iommu_table; |
| 501 | dma_window = (unsigned int *)get_property(pdn, "ibm,dma-window", NULL); | 508 | pdn = pdn->parent) { |
| 509 | dma_window = (unsigned int *) | ||
| 510 | get_property(pdn, "ibm,dma-window", NULL); | ||
| 502 | if (dma_window) | 511 | if (dma_window) |
| 503 | break; | 512 | break; |
| 504 | } | 513 | } |
| @@ -515,20 +524,21 @@ static void iommu_dev_setup_pSeriesLP(struct pci_dev *dev) | |||
| 515 | DBG("Found DMA window, allocating table\n"); | 524 | DBG("Found DMA window, allocating table\n"); |
| 516 | } | 525 | } |
| 517 | 526 | ||
| 518 | if (!pdn->iommu_table) { | 527 | pci = pdn->data; |
| 528 | if (!pci->iommu_table) { | ||
| 519 | /* iommu_table_setparms_lpar needs bussubno. */ | 529 | /* iommu_table_setparms_lpar needs bussubno. */ |
| 520 | pdn->bussubno = pdn->phb->bus->number; | 530 | pci->bussubno = pci->phb->bus->number; |
| 521 | 531 | ||
| 522 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), | 532 | tbl = (struct iommu_table *)kmalloc(sizeof(struct iommu_table), |
| 523 | GFP_KERNEL); | 533 | GFP_KERNEL); |
| 524 | 534 | ||
| 525 | iommu_table_setparms_lpar(pdn->phb, pdn, tbl, dma_window); | 535 | iommu_table_setparms_lpar(pci->phb, pdn, tbl, dma_window); |
| 526 | 536 | ||
| 527 | pdn->iommu_table = iommu_init_table(tbl); | 537 | pci->iommu_table = iommu_init_table(tbl); |
| 528 | } | 538 | } |
| 529 | 539 | ||
| 530 | if (pdn != dn) | 540 | if (pdn != dn) |
| 531 | dn->iommu_table = pdn->iommu_table; | 541 | PCI_DN(dn)->iommu_table = pci->iommu_table; |
| 532 | } | 542 | } |
| 533 | 543 | ||
| 534 | static void iommu_bus_setup_null(struct pci_bus *b) { } | 544 | static void iommu_bus_setup_null(struct pci_bus *b) { } |
diff --git a/arch/ppc64/kernel/pci.c b/arch/ppc64/kernel/pci.c index d0d55c7908ef..8447dcc2c2b3 100644 --- a/arch/ppc64/kernel/pci.c +++ b/arch/ppc64/kernel/pci.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/bootmem.h> | 21 | #include <linux/bootmem.h> |
| 22 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
| 23 | #include <linux/list.h> | 23 | #include <linux/list.h> |
| 24 | #include <linux/syscalls.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/processor.h> | 26 | #include <asm/processor.h> |
| 26 | #include <asm/io.h> | 27 | #include <asm/io.h> |
| @@ -84,7 +85,6 @@ static void fixup_broken_pcnet32(struct pci_dev* dev) | |||
| 84 | if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { | 85 | if ((dev->class>>8 == PCI_CLASS_NETWORK_ETHERNET)) { |
| 85 | dev->vendor = PCI_VENDOR_ID_AMD; | 86 | dev->vendor = PCI_VENDOR_ID_AMD; |
| 86 | pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); | 87 | pci_write_config_word(dev, PCI_VENDOR_ID, PCI_VENDOR_ID_AMD); |
| 87 | pci_name_device(dev); | ||
| 88 | } | 88 | } |
| 89 | } | 89 | } |
| 90 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); | 90 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TRIDENT, PCI_ANY_ID, fixup_broken_pcnet32); |
| @@ -838,9 +838,11 @@ int pcibios_scan_all_fns(struct pci_bus *bus, int devfn) | |||
| 838 | * device tree. If they are then we need to scan all the | 838 | * device tree. If they are then we need to scan all the |
| 839 | * functions of this slot. | 839 | * functions of this slot. |
| 840 | */ | 840 | */ |
| 841 | for (dn = busdn->child; dn; dn = dn->sibling) | 841 | for (dn = busdn->child; dn; dn = dn->sibling) { |
| 842 | if ((dn->devfn >> 3) == (devfn >> 3)) | 842 | struct pci_dn *pdn = dn->data; |
| 843 | if (pdn && (pdn->devfn >> 3) == (devfn >> 3)) | ||
| 843 | return 1; | 844 | return 1; |
| 845 | } | ||
| 844 | 846 | ||
| 845 | return 0; | 847 | return 0; |
| 846 | } | 848 | } |
| @@ -983,3 +985,62 @@ void pci_resource_to_user(const struct pci_dev *dev, int bar, | |||
| 983 | } | 985 | } |
| 984 | 986 | ||
| 985 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 987 | #endif /* CONFIG_PPC_MULTIPLATFORM */ |
| 988 | |||
| 989 | |||
| 990 | #define IOBASE_BRIDGE_NUMBER 0 | ||
| 991 | #define IOBASE_MEMORY 1 | ||
| 992 | #define IOBASE_IO 2 | ||
| 993 | #define IOBASE_ISA_IO 3 | ||
| 994 | #define IOBASE_ISA_MEM 4 | ||
| 995 | |||
| 996 | long sys_pciconfig_iobase(long which, unsigned long in_bus, | ||
| 997 | unsigned long in_devfn) | ||
| 998 | { | ||
| 999 | struct pci_controller* hose; | ||
| 1000 | struct list_head *ln; | ||
| 1001 | struct pci_bus *bus = NULL; | ||
| 1002 | struct device_node *hose_node; | ||
| 1003 | |||
| 1004 | /* Argh ! Please forgive me for that hack, but that's the | ||
| 1005 | * simplest way to get existing XFree to not lockup on some | ||
| 1006 | * G5 machines... So when something asks for bus 0 io base | ||
| 1007 | * (bus 0 is HT root), we return the AGP one instead. | ||
| 1008 | */ | ||
| 1009 | #ifdef CONFIG_PPC_PMAC | ||
| 1010 | if (systemcfg->platform == PLATFORM_POWERMAC && | ||
| 1011 | machine_is_compatible("MacRISC4")) | ||
| 1012 | if (in_bus == 0) | ||
| 1013 | in_bus = 0xf0; | ||
| 1014 | #endif /* CONFIG_PPC_PMAC */ | ||
| 1015 | |||
| 1016 | /* That syscall isn't quite compatible with PCI domains, but it's | ||
| 1017 | * used on pre-domains setup. We return the first match | ||
| 1018 | */ | ||
| 1019 | |||
| 1020 | for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) { | ||
| 1021 | bus = pci_bus_b(ln); | ||
| 1022 | if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate)) | ||
| 1023 | break; | ||
| 1024 | bus = NULL; | ||
| 1025 | } | ||
| 1026 | if (bus == NULL || bus->sysdata == NULL) | ||
| 1027 | return -ENODEV; | ||
| 1028 | |||
| 1029 | hose_node = (struct device_node *)bus->sysdata; | ||
| 1030 | hose = PCI_DN(hose_node)->phb; | ||
| 1031 | |||
| 1032 | switch (which) { | ||
| 1033 | case IOBASE_BRIDGE_NUMBER: | ||
| 1034 | return (long)hose->first_busno; | ||
| 1035 | case IOBASE_MEMORY: | ||
| 1036 | return (long)hose->pci_mem_offset; | ||
| 1037 | case IOBASE_IO: | ||
| 1038 | return (long)hose->io_base_phys; | ||
| 1039 | case IOBASE_ISA_IO: | ||
| 1040 | return (long)isa_io_base; | ||
| 1041 | case IOBASE_ISA_MEM: | ||
| 1042 | return -EINVAL; | ||
| 1043 | } | ||
| 1044 | |||
| 1045 | return -EOPNOTSUPP; | ||
| 1046 | } | ||
diff --git a/arch/ppc64/kernel/pci.h b/arch/ppc64/kernel/pci.h index 26be78b13af1..5eb2cc320566 100644 --- a/arch/ppc64/kernel/pci.h +++ b/arch/ppc64/kernel/pci.h | |||
| @@ -34,7 +34,6 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre, | |||
| 34 | 34 | ||
| 35 | void pci_devs_phb_init(void); | 35 | void pci_devs_phb_init(void); |
| 36 | void pci_devs_phb_init_dynamic(struct pci_controller *phb); | 36 | void pci_devs_phb_init_dynamic(struct pci_controller *phb); |
| 37 | struct device_node *fetch_dev_dn(struct pci_dev *dev); | ||
| 38 | 37 | ||
| 39 | /* PCI address cache management routines */ | 38 | /* PCI address cache management routines */ |
| 40 | void pci_addr_cache_insert_device(struct pci_dev *dev); | 39 | void pci_addr_cache_insert_device(struct pci_dev *dev); |
diff --git a/arch/ppc64/kernel/pci_dn.c b/arch/ppc64/kernel/pci_dn.c index ec345462afc3..a86389d07d57 100644 --- a/arch/ppc64/kernel/pci_dn.c +++ b/arch/ppc64/kernel/pci_dn.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | #include <linux/pci.h> | 23 | #include <linux/pci.h> |
| 24 | #include <linux/string.h> | 24 | #include <linux/string.h> |
| 25 | #include <linux/init.h> | 25 | #include <linux/init.h> |
| 26 | #include <linux/slab.h> | ||
| 27 | #include <linux/bootmem.h> | ||
| 26 | 28 | ||
| 27 | #include <asm/io.h> | 29 | #include <asm/io.h> |
| 28 | #include <asm/prom.h> | 30 | #include <asm/prom.h> |
| @@ -40,16 +42,26 @@ static void * __devinit update_dn_pci_info(struct device_node *dn, void *data) | |||
| 40 | struct pci_controller *phb = data; | 42 | struct pci_controller *phb = data; |
| 41 | int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL); | 43 | int *type = (int *)get_property(dn, "ibm,pci-config-space-type", NULL); |
| 42 | u32 *regs; | 44 | u32 *regs; |
| 43 | 45 | struct pci_dn *pdn; | |
| 44 | dn->phb = phb; | 46 | |
| 47 | if (phb->is_dynamic) | ||
| 48 | pdn = kmalloc(sizeof(*pdn), GFP_KERNEL); | ||
| 49 | else | ||
| 50 | pdn = alloc_bootmem(sizeof(*pdn)); | ||
| 51 | if (pdn == NULL) | ||
| 52 | return NULL; | ||
| 53 | memset(pdn, 0, sizeof(*pdn)); | ||
| 54 | dn->data = pdn; | ||
| 55 | pdn->node = dn; | ||
| 56 | pdn->phb = phb; | ||
| 45 | regs = (u32 *)get_property(dn, "reg", NULL); | 57 | regs = (u32 *)get_property(dn, "reg", NULL); |
| 46 | if (regs) { | 58 | if (regs) { |
| 47 | /* First register entry is addr (00BBSS00) */ | 59 | /* First register entry is addr (00BBSS00) */ |
| 48 | dn->busno = (regs[0] >> 16) & 0xff; | 60 | pdn->busno = (regs[0] >> 16) & 0xff; |
| 49 | dn->devfn = (regs[0] >> 8) & 0xff; | 61 | pdn->devfn = (regs[0] >> 8) & 0xff; |
| 50 | } | 62 | } |
| 51 | 63 | ||
| 52 | dn->pci_ext_config_space = (type && *type == 1); | 64 | pdn->pci_ext_config_space = (type && *type == 1); |
| 53 | return NULL; | 65 | return NULL; |
| 54 | } | 66 | } |
| 55 | 67 | ||
| @@ -112,10 +124,15 @@ void *traverse_pci_devices(struct device_node *start, traverse_func pre, | |||
| 112 | void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb) | 124 | void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb) |
| 113 | { | 125 | { |
| 114 | struct device_node * dn = (struct device_node *) phb->arch_data; | 126 | struct device_node * dn = (struct device_node *) phb->arch_data; |
| 127 | struct pci_dn *pdn; | ||
| 115 | 128 | ||
| 116 | /* PHB nodes themselves must not match */ | 129 | /* PHB nodes themselves must not match */ |
| 117 | dn->devfn = dn->busno = -1; | 130 | update_dn_pci_info(dn, phb); |
| 118 | dn->phb = phb; | 131 | pdn = dn->data; |
| 132 | if (pdn) { | ||
| 133 | pdn->devfn = pdn->busno = -1; | ||
| 134 | pdn->phb = phb; | ||
| 135 | } | ||
| 119 | 136 | ||
| 120 | /* Update dn->phb ptrs for new phb and children devices */ | 137 | /* Update dn->phb ptrs for new phb and children devices */ |
| 121 | traverse_pci_devices(dn, update_dn_pci_info, phb); | 138 | traverse_pci_devices(dn, update_dn_pci_info, phb); |
| @@ -123,14 +140,17 @@ void __devinit pci_devs_phb_init_dynamic(struct pci_controller *phb) | |||
| 123 | 140 | ||
| 124 | /* | 141 | /* |
| 125 | * Traversal func that looks for a <busno,devfcn> value. | 142 | * Traversal func that looks for a <busno,devfcn> value. |
| 126 | * If found, the device_node is returned (thus terminating the traversal). | 143 | * If found, the pci_dn is returned (thus terminating the traversal). |
| 127 | */ | 144 | */ |
| 128 | static void *is_devfn_node(struct device_node *dn, void *data) | 145 | static void *is_devfn_node(struct device_node *dn, void *data) |
| 129 | { | 146 | { |
| 130 | int busno = ((unsigned long)data >> 8) & 0xff; | 147 | int busno = ((unsigned long)data >> 8) & 0xff; |
| 131 | int devfn = ((unsigned long)data) & 0xff; | 148 | int devfn = ((unsigned long)data) & 0xff; |
| 149 | struct pci_dn *pci = dn->data; | ||
| 132 | 150 | ||
| 133 | return ((devfn == dn->devfn) && (busno == dn->busno)) ? dn : NULL; | 151 | if (pci && (devfn == pci->devfn) && (busno == pci->busno)) |
| 152 | return dn; | ||
| 153 | return NULL; | ||
| 134 | } | 154 | } |
| 135 | 155 | ||
| 136 | /* | 156 | /* |
| @@ -149,13 +169,10 @@ static void *is_devfn_node(struct device_node *dn, void *data) | |||
| 149 | struct device_node *fetch_dev_dn(struct pci_dev *dev) | 169 | struct device_node *fetch_dev_dn(struct pci_dev *dev) |
| 150 | { | 170 | { |
| 151 | struct device_node *orig_dn = dev->sysdata; | 171 | struct device_node *orig_dn = dev->sysdata; |
| 152 | struct pci_controller *phb = orig_dn->phb; /* assume same phb as orig_dn */ | ||
| 153 | struct device_node *phb_dn; | ||
| 154 | struct device_node *dn; | 172 | struct device_node *dn; |
| 155 | unsigned long searchval = (dev->bus->number << 8) | dev->devfn; | 173 | unsigned long searchval = (dev->bus->number << 8) | dev->devfn; |
| 156 | 174 | ||
| 157 | phb_dn = phb->arch_data; | 175 | dn = traverse_pci_devices(orig_dn, is_devfn_node, (void *)searchval); |
| 158 | dn = traverse_pci_devices(phb_dn, is_devfn_node, (void *)searchval); | ||
| 159 | if (dn) | 176 | if (dn) |
| 160 | dev->sysdata = dn; | 177 | dev->sysdata = dn; |
| 161 | return dn; | 178 | return dn; |
| @@ -165,11 +182,13 @@ EXPORT_SYMBOL(fetch_dev_dn); | |||
| 165 | static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) | 182 | static int pci_dn_reconfig_notifier(struct notifier_block *nb, unsigned long action, void *node) |
| 166 | { | 183 | { |
| 167 | struct device_node *np = node; | 184 | struct device_node *np = node; |
| 185 | struct pci_dn *pci; | ||
| 168 | int err = NOTIFY_OK; | 186 | int err = NOTIFY_OK; |
| 169 | 187 | ||
| 170 | switch (action) { | 188 | switch (action) { |
| 171 | case PSERIES_RECONFIG_ADD: | 189 | case PSERIES_RECONFIG_ADD: |
| 172 | update_dn_pci_info(np, np->parent->phb); | 190 | pci = np->parent->data; |
| 191 | update_dn_pci_info(np, pci->phb); | ||
| 173 | break; | 192 | break; |
| 174 | default: | 193 | default: |
| 175 | err = NOTIFY_DONE; | 194 | err = NOTIFY_DONE; |
diff --git a/arch/ppc64/kernel/pci_iommu.c b/arch/ppc64/kernel/pci_iommu.c index ef0a62b916be..14647e09c9cd 100644 --- a/arch/ppc64/kernel/pci_iommu.c +++ b/arch/ppc64/kernel/pci_iommu.c | |||
| @@ -66,7 +66,7 @@ static inline struct iommu_table *devnode_table(struct device *dev) | |||
| 66 | #endif /* CONFIG_PPC_ISERIES */ | 66 | #endif /* CONFIG_PPC_ISERIES */ |
| 67 | 67 | ||
| 68 | #ifdef CONFIG_PPC_MULTIPLATFORM | 68 | #ifdef CONFIG_PPC_MULTIPLATFORM |
| 69 | return PCI_GET_DN(pdev)->iommu_table; | 69 | return PCI_DN(PCI_GET_DN(pdev))->iommu_table; |
| 70 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 70 | #endif /* CONFIG_PPC_MULTIPLATFORM */ |
| 71 | } | 71 | } |
| 72 | 72 | ||
diff --git a/arch/ppc64/kernel/pmac_feature.c b/arch/ppc64/kernel/pmac_feature.c index 98ed2bccab1a..eb4e6c3f694d 100644 --- a/arch/ppc64/kernel/pmac_feature.c +++ b/arch/ppc64/kernel/pmac_feature.c | |||
| @@ -674,6 +674,7 @@ void __init pmac_check_ht_link(void) | |||
| 674 | #if 0 /* Disabled for now */ | 674 | #if 0 /* Disabled for now */ |
| 675 | u32 ufreq, freq, ucfg, cfg; | 675 | u32 ufreq, freq, ucfg, cfg; |
| 676 | struct device_node *pcix_node; | 676 | struct device_node *pcix_node; |
| 677 | struct pci_dn *pdn; | ||
| 677 | u8 px_bus, px_devfn; | 678 | u8 px_bus, px_devfn; |
| 678 | struct pci_controller *px_hose; | 679 | struct pci_controller *px_hose; |
| 679 | 680 | ||
| @@ -687,9 +688,10 @@ void __init pmac_check_ht_link(void) | |||
| 687 | printk("No PCI-X bridge found\n"); | 688 | printk("No PCI-X bridge found\n"); |
| 688 | return; | 689 | return; |
| 689 | } | 690 | } |
| 690 | px_hose = pcix_node->phb; | 691 | pdn = pcix_node->data; |
| 691 | px_bus = pcix_node->busno; | 692 | px_hose = pdn->phb; |
| 692 | px_devfn = pcix_node->devfn; | 693 | px_bus = pdn->busno; |
| 694 | px_devfn = pdn->devfn; | ||
| 693 | 695 | ||
| 694 | early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg); | 696 | early_read_config_dword(px_hose, px_bus, px_devfn, 0xc4, &cfg); |
| 695 | early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq); | 697 | early_read_config_dword(px_hose, px_bus, px_devfn, 0xcc, &freq); |
diff --git a/arch/ppc64/kernel/pmac_pci.c b/arch/ppc64/kernel/pmac_pci.c index 71fe911ad183..d37bff2d7d40 100644 --- a/arch/ppc64/kernel/pmac_pci.c +++ b/arch/ppc64/kernel/pmac_pci.c | |||
| @@ -242,7 +242,7 @@ static int u3_ht_skip_device(struct pci_controller *hose, | |||
| 242 | else | 242 | else |
| 243 | busdn = hose->arch_data; | 243 | busdn = hose->arch_data; |
| 244 | for (dn = busdn->child; dn; dn = dn->sibling) | 244 | for (dn = busdn->child; dn; dn = dn->sibling) |
| 245 | if (dn->devfn == devfn) | 245 | if (dn->data && PCI_DN(dn)->devfn == devfn) |
| 246 | break; | 246 | break; |
| 247 | if (dn == NULL) | 247 | if (dn == NULL) |
| 248 | return -1; | 248 | return -1; |
| @@ -746,9 +746,9 @@ void __init pmac_pci_init(void) | |||
| 746 | */ | 746 | */ |
| 747 | if (u3_agp) { | 747 | if (u3_agp) { |
| 748 | struct device_node *np = u3_agp->arch_data; | 748 | struct device_node *np = u3_agp->arch_data; |
| 749 | np->busno = 0xf0; | 749 | PCI_DN(np)->busno = 0xf0; |
| 750 | for (np = np->child; np; np = np->sibling) | 750 | for (np = np->child; np; np = np->sibling) |
| 751 | np->busno = 0xf0; | 751 | PCI_DN(np)->busno = 0xf0; |
| 752 | } | 752 | } |
| 753 | 753 | ||
| 754 | pmac_check_ht_link(); | 754 | pmac_check_ht_link(); |
diff --git a/arch/ppc64/kernel/prom.c b/arch/ppc64/kernel/prom.c index 6ad5a8467f87..7035deb6de92 100644 --- a/arch/ppc64/kernel/prom.c +++ b/arch/ppc64/kernel/prom.c | |||
| @@ -1733,6 +1733,7 @@ static void of_node_release(struct kref *kref) | |||
| 1733 | kfree(node->intrs); | 1733 | kfree(node->intrs); |
| 1734 | kfree(node->addrs); | 1734 | kfree(node->addrs); |
| 1735 | kfree(node->full_name); | 1735 | kfree(node->full_name); |
| 1736 | kfree(node->data); | ||
| 1736 | kfree(node); | 1737 | kfree(node); |
| 1737 | } | 1738 | } |
| 1738 | 1739 | ||
diff --git a/arch/ppc64/kernel/rtas_pci.c b/arch/ppc64/kernel/rtas_pci.c index 1dccadaddd1d..4a9719b48abe 100644 --- a/arch/ppc64/kernel/rtas_pci.c +++ b/arch/ppc64/kernel/rtas_pci.c | |||
| @@ -48,7 +48,7 @@ static int write_pci_config; | |||
| 48 | static int ibm_read_pci_config; | 48 | static int ibm_read_pci_config; |
| 49 | static int ibm_write_pci_config; | 49 | static int ibm_write_pci_config; |
| 50 | 50 | ||
| 51 | static int config_access_valid(struct device_node *dn, int where) | 51 | static int config_access_valid(struct pci_dn *dn, int where) |
| 52 | { | 52 | { |
| 53 | if (where < 256) | 53 | if (where < 256) |
| 54 | return 1; | 54 | return 1; |
| @@ -78,15 +78,17 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va | |||
| 78 | int returnval = -1; | 78 | int returnval = -1; |
| 79 | unsigned long buid, addr; | 79 | unsigned long buid, addr; |
| 80 | int ret; | 80 | int ret; |
| 81 | struct pci_dn *pdn; | ||
| 81 | 82 | ||
| 82 | if (!dn) | 83 | if (!dn || !dn->data) |
| 83 | return PCIBIOS_DEVICE_NOT_FOUND; | 84 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 84 | if (!config_access_valid(dn, where)) | 85 | pdn = dn->data; |
| 86 | if (!config_access_valid(pdn, where)) | ||
| 85 | return PCIBIOS_BAD_REGISTER_NUMBER; | 87 | return PCIBIOS_BAD_REGISTER_NUMBER; |
| 86 | 88 | ||
| 87 | addr = ((where & 0xf00) << 20) | (dn->busno << 16) | | 89 | addr = ((where & 0xf00) << 20) | (pdn->busno << 16) | |
| 88 | (dn->devfn << 8) | (where & 0xff); | 90 | (pdn->devfn << 8) | (where & 0xff); |
| 89 | buid = dn->phb->buid; | 91 | buid = pdn->phb->buid; |
| 90 | if (buid) { | 92 | if (buid) { |
| 91 | ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval, | 93 | ret = rtas_call(ibm_read_pci_config, 4, 2, &returnval, |
| 92 | addr, buid >> 32, buid & 0xffffffff, size); | 94 | addr, buid >> 32, buid & 0xffffffff, size); |
| @@ -98,8 +100,8 @@ static int rtas_read_config(struct device_node *dn, int where, int size, u32 *va | |||
| 98 | if (ret) | 100 | if (ret) |
| 99 | return PCIBIOS_DEVICE_NOT_FOUND; | 101 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 100 | 102 | ||
| 101 | if (returnval == EEH_IO_ERROR_VALUE(size) | 103 | if (returnval == EEH_IO_ERROR_VALUE(size) && |
| 102 | && eeh_dn_check_failure (dn, NULL)) | 104 | eeh_dn_check_failure (dn, NULL)) |
| 103 | return PCIBIOS_DEVICE_NOT_FOUND; | 105 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 104 | 106 | ||
| 105 | return PCIBIOS_SUCCESSFUL; | 107 | return PCIBIOS_SUCCESSFUL; |
| @@ -118,24 +120,28 @@ static int rtas_pci_read_config(struct pci_bus *bus, | |||
| 118 | 120 | ||
| 119 | /* Search only direct children of the bus */ | 121 | /* Search only direct children of the bus */ |
| 120 | for (dn = busdn->child; dn; dn = dn->sibling) | 122 | for (dn = busdn->child; dn; dn = dn->sibling) |
| 121 | if (dn->devfn == devfn && of_device_available(dn)) | 123 | if (dn->data && PCI_DN(dn)->devfn == devfn |
| 124 | && of_device_available(dn)) | ||
| 122 | return rtas_read_config(dn, where, size, val); | 125 | return rtas_read_config(dn, where, size, val); |
| 126 | |||
| 123 | return PCIBIOS_DEVICE_NOT_FOUND; | 127 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 124 | } | 128 | } |
| 125 | 129 | ||
| 126 | static int rtas_write_config(struct device_node *dn, int where, int size, u32 val) | 130 | int rtas_write_config(struct device_node *dn, int where, int size, u32 val) |
| 127 | { | 131 | { |
| 128 | unsigned long buid, addr; | 132 | unsigned long buid, addr; |
| 129 | int ret; | 133 | int ret; |
| 134 | struct pci_dn *pdn; | ||
| 130 | 135 | ||
| 131 | if (!dn) | 136 | if (!dn || !dn->data) |
| 132 | return PCIBIOS_DEVICE_NOT_FOUND; | 137 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 133 | if (!config_access_valid(dn, where)) | 138 | pdn = dn->data; |
| 139 | if (!config_access_valid(pdn, where)) | ||
| 134 | return PCIBIOS_BAD_REGISTER_NUMBER; | 140 | return PCIBIOS_BAD_REGISTER_NUMBER; |
| 135 | 141 | ||
| 136 | addr = ((where & 0xf00) << 20) | (dn->busno << 16) | | 142 | addr = ((where & 0xf00) << 20) | (pdn->busno << 16) | |
| 137 | (dn->devfn << 8) | (where & 0xff); | 143 | (pdn->devfn << 8) | (where & 0xff); |
| 138 | buid = dn->phb->buid; | 144 | buid = pdn->phb->buid; |
| 139 | if (buid) { | 145 | if (buid) { |
| 140 | ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val); | 146 | ret = rtas_call(ibm_write_pci_config, 5, 1, NULL, addr, buid >> 32, buid & 0xffffffff, size, (ulong) val); |
| 141 | } else { | 147 | } else { |
| @@ -161,7 +167,8 @@ static int rtas_pci_write_config(struct pci_bus *bus, | |||
| 161 | 167 | ||
| 162 | /* Search only direct children of the bus */ | 168 | /* Search only direct children of the bus */ |
| 163 | for (dn = busdn->child; dn; dn = dn->sibling) | 169 | for (dn = busdn->child; dn; dn = dn->sibling) |
| 164 | if (dn->devfn == devfn && of_device_available(dn)) | 170 | if (dn->data && PCI_DN(dn)->devfn == devfn |
| 171 | && of_device_available(dn)) | ||
| 165 | return rtas_write_config(dn, where, size, val); | 172 | return rtas_write_config(dn, where, size, val); |
| 166 | return PCIBIOS_DEVICE_NOT_FOUND; | 173 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 167 | } | 174 | } |
diff --git a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c index d0bb68af0ea4..bfa8791c9807 100644 --- a/arch/ppc64/kernel/setup.c +++ b/arch/ppc64/kernel/setup.c | |||
| @@ -1283,7 +1283,7 @@ void __init generic_find_legacy_serial_ports(u64 *physport, | |||
| 1283 | 1283 | ||
| 1284 | static struct platform_device serial_device = { | 1284 | static struct platform_device serial_device = { |
| 1285 | .name = "serial8250", | 1285 | .name = "serial8250", |
| 1286 | .id = 0, | 1286 | .id = PLAT8250_DEV_PLATFORM, |
| 1287 | .dev = { | 1287 | .dev = { |
| 1288 | .platform_data = serial_ports, | 1288 | .platform_data = serial_ports, |
| 1289 | }, | 1289 | }, |
diff --git a/arch/ppc64/kernel/sys_ppc32.c b/arch/ppc64/kernel/sys_ppc32.c index 214914a95a50..e93c13458910 100644 --- a/arch/ppc64/kernel/sys_ppc32.c +++ b/arch/ppc64/kernel/sys_ppc32.c | |||
| @@ -708,62 +708,9 @@ asmlinkage int sys32_pciconfig_write(u32 bus, u32 dfn, u32 off, u32 len, u32 ubu | |||
| 708 | compat_ptr(ubuf)); | 708 | compat_ptr(ubuf)); |
| 709 | } | 709 | } |
| 710 | 710 | ||
| 711 | #define IOBASE_BRIDGE_NUMBER 0 | ||
| 712 | #define IOBASE_MEMORY 1 | ||
| 713 | #define IOBASE_IO 2 | ||
| 714 | #define IOBASE_ISA_IO 3 | ||
| 715 | #define IOBASE_ISA_MEM 4 | ||
| 716 | |||
| 717 | asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) | 711 | asmlinkage int sys32_pciconfig_iobase(u32 which, u32 in_bus, u32 in_devfn) |
| 718 | { | 712 | { |
| 719 | #ifdef CONFIG_PCI | 713 | return sys_pciconfig_iobase(which, in_bus, in_devfn); |
| 720 | struct pci_controller* hose; | ||
| 721 | struct list_head *ln; | ||
| 722 | struct pci_bus *bus = NULL; | ||
| 723 | struct device_node *hose_node; | ||
| 724 | |||
| 725 | /* Argh ! Please forgive me for that hack, but that's the | ||
| 726 | * simplest way to get existing XFree to not lockup on some | ||
| 727 | * G5 machines... So when something asks for bus 0 io base | ||
| 728 | * (bus 0 is HT root), we return the AGP one instead. | ||
| 729 | */ | ||
| 730 | #ifdef CONFIG_PPC_PMAC | ||
| 731 | if (systemcfg->platform == PLATFORM_POWERMAC && | ||
| 732 | machine_is_compatible("MacRISC4")) | ||
| 733 | if (in_bus == 0) | ||
| 734 | in_bus = 0xf0; | ||
| 735 | #endif /* CONFIG_PPC_PMAC */ | ||
| 736 | |||
| 737 | /* That syscall isn't quite compatible with PCI domains, but it's | ||
| 738 | * used on pre-domains setup. We return the first match | ||
| 739 | */ | ||
| 740 | |||
| 741 | for (ln = pci_root_buses.next; ln != &pci_root_buses; ln = ln->next) { | ||
| 742 | bus = pci_bus_b(ln); | ||
| 743 | if (in_bus >= bus->number && in_bus < (bus->number + bus->subordinate)) | ||
| 744 | break; | ||
| 745 | bus = NULL; | ||
| 746 | } | ||
| 747 | if (bus == NULL || bus->sysdata == NULL) | ||
| 748 | return -ENODEV; | ||
| 749 | |||
| 750 | hose_node = (struct device_node *)bus->sysdata; | ||
| 751 | hose = hose_node->phb; | ||
| 752 | |||
| 753 | switch (which) { | ||
| 754 | case IOBASE_BRIDGE_NUMBER: | ||
| 755 | return (long)hose->first_busno; | ||
| 756 | case IOBASE_MEMORY: | ||
| 757 | return (long)hose->pci_mem_offset; | ||
| 758 | case IOBASE_IO: | ||
| 759 | return (long)hose->io_base_phys; | ||
| 760 | case IOBASE_ISA_IO: | ||
| 761 | return (long)isa_io_base; | ||
| 762 | case IOBASE_ISA_MEM: | ||
| 763 | return -EINVAL; | ||
| 764 | } | ||
| 765 | #endif /* CONFIG_PCI */ | ||
| 766 | return -EOPNOTSUPP; | ||
| 767 | } | 714 | } |
| 768 | 715 | ||
| 769 | 716 | ||
diff --git a/arch/ppc64/kernel/syscalls.c b/arch/ppc64/kernel/syscalls.c index a8cbb202b8cd..05f16633bd2c 100644 --- a/arch/ppc64/kernel/syscalls.c +++ b/arch/ppc64/kernel/syscalls.c | |||
| @@ -46,10 +46,6 @@ | |||
| 46 | 46 | ||
| 47 | extern unsigned long wall_jiffies; | 47 | extern unsigned long wall_jiffies; |
| 48 | 48 | ||
| 49 | void | ||
| 50 | check_bugs(void) | ||
| 51 | { | ||
| 52 | } | ||
| 53 | 49 | ||
| 54 | /* | 50 | /* |
| 55 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. | 51 | * sys_ipc() is the de-multiplexer for the SysV IPC calls.. |
diff --git a/arch/ppc64/kernel/u3_iommu.c b/arch/ppc64/kernel/u3_iommu.c index b6e3bca4102d..41ea09cb9ac7 100644 --- a/arch/ppc64/kernel/u3_iommu.c +++ b/arch/ppc64/kernel/u3_iommu.c | |||
| @@ -276,7 +276,7 @@ static void iommu_dev_setup_u3(struct pci_dev *dev) | |||
| 276 | dn = pci_device_to_OF_node(dev); | 276 | dn = pci_device_to_OF_node(dev); |
| 277 | 277 | ||
| 278 | if (dn) | 278 | if (dn) |
| 279 | dn->iommu_table = &iommu_table_u3; | 279 | PCI_DN(dn)->iommu_table = &iommu_table_u3; |
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | static void iommu_bus_setup_u3(struct pci_bus *bus) | 282 | static void iommu_bus_setup_u3(struct pci_bus *bus) |
| @@ -291,7 +291,7 @@ static void iommu_bus_setup_u3(struct pci_bus *bus) | |||
| 291 | dn = pci_bus_to_OF_node(bus); | 291 | dn = pci_bus_to_OF_node(bus); |
| 292 | 292 | ||
| 293 | if (dn) | 293 | if (dn) |
| 294 | dn->iommu_table = &iommu_table_u3; | 294 | PCI_DN(dn)->iommu_table = &iommu_table_u3; |
| 295 | } | 295 | } |
| 296 | 296 | ||
| 297 | static void iommu_dev_setup_null(struct pci_dev *dev) { } | 297 | static void iommu_dev_setup_null(struct pci_dev *dev) { } |
diff --git a/arch/ppc64/kernel/udbg.c b/arch/ppc64/kernel/udbg.c index ed6766e21f5a..d49c3613c8ec 100644 --- a/arch/ppc64/kernel/udbg.c +++ b/arch/ppc64/kernel/udbg.c | |||
| @@ -158,14 +158,20 @@ static struct console udbg_console = { | |||
| 158 | .index = -1, | 158 | .index = -1, |
| 159 | }; | 159 | }; |
| 160 | 160 | ||
| 161 | static int early_console_initialized; | ||
| 162 | |||
| 161 | void __init disable_early_printk(void) | 163 | void __init disable_early_printk(void) |
| 162 | { | 164 | { |
| 165 | if (!early_console_initialized) | ||
| 166 | return; | ||
| 163 | unregister_console(&udbg_console); | 167 | unregister_console(&udbg_console); |
| 168 | early_console_initialized = 0; | ||
| 164 | } | 169 | } |
| 165 | 170 | ||
| 166 | /* called by setup_system */ | 171 | /* called by setup_system */ |
| 167 | void register_early_udbg_console(void) | 172 | void register_early_udbg_console(void) |
| 168 | { | 173 | { |
| 174 | early_console_initialized = 1; | ||
| 169 | register_console(&udbg_console); | 175 | register_console(&udbg_console); |
| 170 | } | 176 | } |
| 171 | 177 | ||
diff --git a/arch/ppc64/mm/init.c b/arch/ppc64/mm/init.c index a14ab87df491..c2157c9c3acb 100644 --- a/arch/ppc64/mm/init.c +++ b/arch/ppc64/mm/init.c | |||
| @@ -554,12 +554,12 @@ void __init do_init_bootmem(void) | |||
| 554 | * present. | 554 | * present. |
| 555 | */ | 555 | */ |
| 556 | for (i=0; i < lmb.memory.cnt; i++) | 556 | for (i=0; i < lmb.memory.cnt; i++) |
| 557 | free_bootmem(lmb_start_pfn(&lmb.memory, i), | 557 | free_bootmem(lmb.memory.region[i].base, |
| 558 | lmb_size_bytes(&lmb.memory, i)); | 558 | lmb_size_bytes(&lmb.memory, i)); |
| 559 | 559 | ||
| 560 | /* reserve the sections we're already using */ | 560 | /* reserve the sections we're already using */ |
| 561 | for (i=0; i < lmb.reserved.cnt; i++) | 561 | for (i=0; i < lmb.reserved.cnt; i++) |
| 562 | reserve_bootmem(lmb_start_pfn(&lmb.reserved, i), | 562 | reserve_bootmem(lmb.reserved.region[i].base, |
| 563 | lmb_size_bytes(&lmb.reserved, i)); | 563 | lmb_size_bytes(&lmb.reserved, i)); |
| 564 | 564 | ||
| 565 | for (i=0; i < lmb.memory.cnt; i++) | 565 | for (i=0; i < lmb.memory.cnt; i++) |
diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 3cd8dd25c9d7..c1ea6bcb77ce 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile | |||
| @@ -19,6 +19,7 @@ CFLAGS += -m31 | |||
| 19 | AFLAGS += -m31 | 19 | AFLAGS += -m31 |
| 20 | UTS_MACHINE := s390 | 20 | UTS_MACHINE := s390 |
| 21 | STACK_SIZE := 8192 | 21 | STACK_SIZE := 8192 |
| 22 | CHECKFLAGS += -D__s390__ | ||
| 22 | endif | 23 | endif |
| 23 | 24 | ||
| 24 | ifdef CONFIG_ARCH_S390X | 25 | ifdef CONFIG_ARCH_S390X |
| @@ -28,6 +29,7 @@ CFLAGS += -m64 | |||
| 28 | AFLAGS += -m64 | 29 | AFLAGS += -m64 |
| 29 | UTS_MACHINE := s390x | 30 | UTS_MACHINE := s390x |
| 30 | STACK_SIZE := 16384 | 31 | STACK_SIZE := 16384 |
| 32 | CHECKFLAGS += -D__s390__ -D__s390x__ | ||
| 31 | endif | 33 | endif |
| 32 | 34 | ||
| 33 | cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5) | 35 | cflags-$(CONFIG_MARCH_G5) += $(call cc-option,-march=g5) |
diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c index ec8bf4012c0c..2ff7c32ab0ce 100644 --- a/arch/sparc64/kernel/pci.c +++ b/arch/sparc64/kernel/pci.c | |||
| @@ -359,134 +359,17 @@ void pcibios_fixup_bus(struct pci_bus *pbus) | |||
| 359 | pbus->resource[1] = &pbm->mem_space; | 359 | pbus->resource[1] = &pbm->mem_space; |
| 360 | } | 360 | } |
| 361 | 361 | ||
| 362 | int pci_claim_resource(struct pci_dev *pdev, int resource) | 362 | struct resource *pcibios_select_root(struct pci_dev *pdev, struct resource *r) |
| 363 | { | 363 | { |
| 364 | struct pci_pbm_info *pbm = pdev->bus->sysdata; | 364 | struct pci_pbm_info *pbm = pdev->bus->sysdata; |
| 365 | struct resource *res = &pdev->resource[resource]; | 365 | struct resource *root = NULL; |
| 366 | struct resource *root; | ||
| 367 | |||
| 368 | if (!pbm) | ||
| 369 | return -EINVAL; | ||
| 370 | 366 | ||
| 371 | if (res->flags & IORESOURCE_IO) | 367 | if (r->flags & IORESOURCE_IO) |
| 372 | root = &pbm->io_space; | 368 | root = &pbm->io_space; |
| 373 | else | 369 | if (r->flags & IORESOURCE_MEM) |
| 374 | root = &pbm->mem_space; | 370 | root = &pbm->mem_space; |
| 375 | 371 | ||
| 376 | pbm->parent->resource_adjust(pdev, res, root); | 372 | return root; |
| 377 | |||
| 378 | return request_resource(root, res); | ||
| 379 | } | ||
| 380 | |||
| 381 | /* | ||
| 382 | * Given the PCI bus a device resides on, try to | ||
| 383 | * find an acceptable resource allocation for a | ||
| 384 | * specific device resource.. | ||
| 385 | */ | ||
| 386 | static int pci_assign_bus_resource(const struct pci_bus *bus, | ||
| 387 | struct pci_dev *dev, | ||
| 388 | struct resource *res, | ||
| 389 | unsigned long size, | ||
| 390 | unsigned long min, | ||
| 391 | int resno) | ||
| 392 | { | ||
| 393 | unsigned int type_mask; | ||
| 394 | int i; | ||
| 395 | |||
| 396 | type_mask = IORESOURCE_IO | IORESOURCE_MEM; | ||
| 397 | for (i = 0 ; i < 4; i++) { | ||
| 398 | struct resource *r = bus->resource[i]; | ||
| 399 | if (!r) | ||
| 400 | continue; | ||
| 401 | |||
| 402 | /* type_mask must match */ | ||
| 403 | if ((res->flags ^ r->flags) & type_mask) | ||
| 404 | continue; | ||
| 405 | |||
| 406 | /* Ok, try it out.. */ | ||
| 407 | if (allocate_resource(r, res, size, min, -1, size, NULL, NULL) < 0) | ||
| 408 | continue; | ||
| 409 | |||
| 410 | /* PCI config space updated by caller. */ | ||
| 411 | return 0; | ||
| 412 | } | ||
| 413 | return -EBUSY; | ||
| 414 | } | ||
| 415 | |||
| 416 | int pci_assign_resource(struct pci_dev *pdev, int resource) | ||
| 417 | { | ||
| 418 | struct pcidev_cookie *pcp = pdev->sysdata; | ||
| 419 | struct pci_pbm_info *pbm = pcp->pbm; | ||
| 420 | struct resource *res = &pdev->resource[resource]; | ||
| 421 | unsigned long min, size; | ||
| 422 | int err; | ||
| 423 | |||
| 424 | if (res->flags & IORESOURCE_IO) | ||
| 425 | min = pbm->io_space.start + 0x400UL; | ||
| 426 | else | ||
| 427 | min = pbm->mem_space.start; | ||
| 428 | |||
| 429 | size = res->end - res->start + 1; | ||
| 430 | |||
| 431 | err = pci_assign_bus_resource(pdev->bus, pdev, res, size, min, resource); | ||
| 432 | |||
| 433 | if (err < 0) { | ||
| 434 | printk("PCI: Failed to allocate resource %d for %s\n", | ||
| 435 | resource, pci_name(pdev)); | ||
| 436 | } else { | ||
| 437 | /* Update PCI config space. */ | ||
| 438 | pbm->parent->base_address_update(pdev, resource); | ||
| 439 | } | ||
| 440 | |||
| 441 | return err; | ||
| 442 | } | ||
| 443 | |||
| 444 | /* Sort resources by alignment */ | ||
| 445 | void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) | ||
| 446 | { | ||
| 447 | int i; | ||
| 448 | |||
| 449 | for (i = 0; i < PCI_NUM_RESOURCES; i++) { | ||
| 450 | struct resource *r; | ||
| 451 | struct resource_list *list, *tmp; | ||
| 452 | unsigned long r_align; | ||
| 453 | |||
| 454 | r = &dev->resource[i]; | ||
| 455 | r_align = r->end - r->start; | ||
| 456 | |||
| 457 | if (!(r->flags) || r->parent) | ||
| 458 | continue; | ||
| 459 | if (!r_align) { | ||
| 460 | printk(KERN_WARNING "PCI: Ignore bogus resource %d " | ||
| 461 | "[%lx:%lx] of %s\n", | ||
| 462 | i, r->start, r->end, pci_name(dev)); | ||
| 463 | continue; | ||
| 464 | } | ||
| 465 | r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start; | ||
| 466 | for (list = head; ; list = list->next) { | ||
| 467 | unsigned long align = 0; | ||
| 468 | struct resource_list *ln = list->next; | ||
| 469 | int idx; | ||
| 470 | |||
| 471 | if (ln) { | ||
| 472 | idx = ln->res - &ln->dev->resource[0]; | ||
| 473 | align = (idx < PCI_BRIDGE_RESOURCES) ? | ||
| 474 | ln->res->end - ln->res->start + 1 : | ||
| 475 | ln->res->start; | ||
| 476 | } | ||
| 477 | if (r_align > align) { | ||
| 478 | tmp = kmalloc(sizeof(*tmp), GFP_KERNEL); | ||
| 479 | if (!tmp) | ||
| 480 | panic("pdev_sort_resources(): " | ||
| 481 | "kmalloc() failed!\n"); | ||
| 482 | tmp->next = ln; | ||
| 483 | tmp->res = r; | ||
| 484 | tmp->dev = dev; | ||
| 485 | list->next = tmp; | ||
| 486 | break; | ||
| 487 | } | ||
| 488 | } | ||
| 489 | } | ||
| 490 | } | 373 | } |
| 491 | 374 | ||
| 492 | void pcibios_update_irq(struct pci_dev *pdev, int irq) | 375 | void pcibios_update_irq(struct pci_dev *pdev, int irq) |
diff --git a/arch/sparc64/kernel/pci_psycho.c b/arch/sparc64/kernel/pci_psycho.c index 91ab466d6c66..6ed1ef25e0ac 100644 --- a/arch/sparc64/kernel/pci_psycho.c +++ b/arch/sparc64/kernel/pci_psycho.c | |||
| @@ -307,7 +307,7 @@ static unsigned char psycho_pil_table[] = { | |||
| 307 | /*0x32*/15, /* Power Management */ | 307 | /*0x32*/15, /* Power Management */ |
| 308 | }; | 308 | }; |
| 309 | 309 | ||
| 310 | static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | 310 | static int psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) |
| 311 | { | 311 | { |
| 312 | int ret; | 312 | int ret; |
| 313 | 313 | ||
| @@ -344,9 +344,9 @@ static int __init psycho_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | |||
| 344 | return ret; | 344 | return ret; |
| 345 | } | 345 | } |
| 346 | 346 | ||
| 347 | static unsigned int __init psycho_irq_build(struct pci_pbm_info *pbm, | 347 | static unsigned int psycho_irq_build(struct pci_pbm_info *pbm, |
| 348 | struct pci_dev *pdev, | 348 | struct pci_dev *pdev, |
| 349 | unsigned int ino) | 349 | unsigned int ino) |
| 350 | { | 350 | { |
| 351 | struct ino_bucket *bucket; | 351 | struct ino_bucket *bucket; |
| 352 | unsigned long imap, iclr; | 352 | unsigned long imap, iclr; |
| @@ -1024,7 +1024,7 @@ static irqreturn_t psycho_pcierr_intr(int irq, void *dev_id, struct pt_regs *reg | |||
| 1024 | #define PSYCHO_CE_INO 0x2f | 1024 | #define PSYCHO_CE_INO 0x2f |
| 1025 | #define PSYCHO_PCIERR_A_INO 0x30 | 1025 | #define PSYCHO_PCIERR_A_INO 0x30 |
| 1026 | #define PSYCHO_PCIERR_B_INO 0x31 | 1026 | #define PSYCHO_PCIERR_B_INO 0x31 |
| 1027 | static void __init psycho_register_error_handlers(struct pci_controller_info *p) | 1027 | static void psycho_register_error_handlers(struct pci_controller_info *p) |
| 1028 | { | 1028 | { |
| 1029 | struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ | 1029 | struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ |
| 1030 | unsigned long base = p->pbm_A.controller_regs; | 1030 | unsigned long base = p->pbm_A.controller_regs; |
| @@ -1091,15 +1091,15 @@ static void __init psycho_register_error_handlers(struct pci_controller_info *p) | |||
| 1091 | } | 1091 | } |
| 1092 | 1092 | ||
| 1093 | /* PSYCHO boot time probing and initialization. */ | 1093 | /* PSYCHO boot time probing and initialization. */ |
| 1094 | static void __init psycho_resource_adjust(struct pci_dev *pdev, | 1094 | static void psycho_resource_adjust(struct pci_dev *pdev, |
| 1095 | struct resource *res, | 1095 | struct resource *res, |
| 1096 | struct resource *root) | 1096 | struct resource *root) |
| 1097 | { | 1097 | { |
| 1098 | res->start += root->start; | 1098 | res->start += root->start; |
| 1099 | res->end += root->start; | 1099 | res->end += root->start; |
| 1100 | } | 1100 | } |
| 1101 | 1101 | ||
| 1102 | static void __init psycho_base_address_update(struct pci_dev *pdev, int resource) | 1102 | static void psycho_base_address_update(struct pci_dev *pdev, int resource) |
| 1103 | { | 1103 | { |
| 1104 | struct pcidev_cookie *pcp = pdev->sysdata; | 1104 | struct pcidev_cookie *pcp = pdev->sysdata; |
| 1105 | struct pci_pbm_info *pbm = pcp->pbm; | 1105 | struct pci_pbm_info *pbm = pcp->pbm; |
| @@ -1144,7 +1144,7 @@ static void __init psycho_base_address_update(struct pci_dev *pdev, int resource | |||
| 1144 | pci_write_config_dword(pdev, where + 4, 0); | 1144 | pci_write_config_dword(pdev, where + 4, 0); |
| 1145 | } | 1145 | } |
| 1146 | 1146 | ||
| 1147 | static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | 1147 | static void pbm_config_busmastering(struct pci_pbm_info *pbm) |
| 1148 | { | 1148 | { |
| 1149 | u8 *addr; | 1149 | u8 *addr; |
| 1150 | 1150 | ||
| @@ -1161,8 +1161,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | |||
| 1161 | pci_config_write8(addr, 64); | 1161 | pci_config_write8(addr, 64); |
| 1162 | } | 1162 | } |
| 1163 | 1163 | ||
| 1164 | static void __init pbm_scan_bus(struct pci_controller_info *p, | 1164 | static void pbm_scan_bus(struct pci_controller_info *p, |
| 1165 | struct pci_pbm_info *pbm) | 1165 | struct pci_pbm_info *pbm) |
| 1166 | { | 1166 | { |
| 1167 | struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); | 1167 | struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); |
| 1168 | 1168 | ||
| @@ -1189,7 +1189,7 @@ static void __init pbm_scan_bus(struct pci_controller_info *p, | |||
| 1189 | pci_setup_busmastering(pbm, pbm->pci_bus); | 1189 | pci_setup_busmastering(pbm, pbm->pci_bus); |
| 1190 | } | 1190 | } |
| 1191 | 1191 | ||
| 1192 | static void __init psycho_scan_bus(struct pci_controller_info *p) | 1192 | static void psycho_scan_bus(struct pci_controller_info *p) |
| 1193 | { | 1193 | { |
| 1194 | pbm_config_busmastering(&p->pbm_B); | 1194 | pbm_config_busmastering(&p->pbm_B); |
| 1195 | p->pbm_B.is_66mhz_capable = 0; | 1195 | p->pbm_B.is_66mhz_capable = 0; |
| @@ -1204,7 +1204,7 @@ static void __init psycho_scan_bus(struct pci_controller_info *p) | |||
| 1204 | psycho_register_error_handlers(p); | 1204 | psycho_register_error_handlers(p); |
| 1205 | } | 1205 | } |
| 1206 | 1206 | ||
| 1207 | static void __init psycho_iommu_init(struct pci_controller_info *p) | 1207 | static void psycho_iommu_init(struct pci_controller_info *p) |
| 1208 | { | 1208 | { |
| 1209 | struct pci_iommu *iommu = p->pbm_A.iommu; | 1209 | struct pci_iommu *iommu = p->pbm_A.iommu; |
| 1210 | unsigned long tsbbase, i; | 1210 | unsigned long tsbbase, i; |
| @@ -1327,8 +1327,8 @@ static void psycho_controller_hwinit(struct pci_controller_info *p) | |||
| 1327 | psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp); | 1327 | psycho_write(p->pbm_A.controller_regs + PSYCHO_PCIB_DIAG, tmp); |
| 1328 | } | 1328 | } |
| 1329 | 1329 | ||
| 1330 | static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | 1330 | static void pbm_register_toplevel_resources(struct pci_controller_info *p, |
| 1331 | struct pci_pbm_info *pbm) | 1331 | struct pci_pbm_info *pbm) |
| 1332 | { | 1332 | { |
| 1333 | char *name = pbm->name; | 1333 | char *name = pbm->name; |
| 1334 | 1334 | ||
| @@ -1481,7 +1481,7 @@ static void psycho_pbm_init(struct pci_controller_info *p, | |||
| 1481 | 1481 | ||
| 1482 | #define PSYCHO_CONFIGSPACE 0x001000000UL | 1482 | #define PSYCHO_CONFIGSPACE 0x001000000UL |
| 1483 | 1483 | ||
| 1484 | void __init psycho_init(int node, char *model_name) | 1484 | void psycho_init(int node, char *model_name) |
| 1485 | { | 1485 | { |
| 1486 | struct linux_prom64_registers pr_regs[3]; | 1486 | struct linux_prom64_registers pr_regs[3]; |
| 1487 | struct pci_controller_info *p; | 1487 | struct pci_controller_info *p; |
diff --git a/arch/sparc64/kernel/pci_sabre.c b/arch/sparc64/kernel/pci_sabre.c index 52bf3431a422..0ee6bd5b9ac6 100644 --- a/arch/sparc64/kernel/pci_sabre.c +++ b/arch/sparc64/kernel/pci_sabre.c | |||
| @@ -554,7 +554,7 @@ static unsigned char sabre_pil_table[] = { | |||
| 554 | /*0x32*/15, /* Power Management */ | 554 | /*0x32*/15, /* Power Management */ |
| 555 | }; | 555 | }; |
| 556 | 556 | ||
| 557 | static int __init sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | 557 | static int sabre_ino_to_pil(struct pci_dev *pdev, unsigned int ino) |
| 558 | { | 558 | { |
| 559 | int ret; | 559 | int ret; |
| 560 | 560 | ||
| @@ -612,9 +612,9 @@ static void sabre_wsync_handler(struct ino_bucket *bucket, void *_arg1, void *_a | |||
| 612 | sabre_read(sync_reg); | 612 | sabre_read(sync_reg); |
| 613 | } | 613 | } |
| 614 | 614 | ||
| 615 | static unsigned int __init sabre_irq_build(struct pci_pbm_info *pbm, | 615 | static unsigned int sabre_irq_build(struct pci_pbm_info *pbm, |
| 616 | struct pci_dev *pdev, | 616 | struct pci_dev *pdev, |
| 617 | unsigned int ino) | 617 | unsigned int ino) |
| 618 | { | 618 | { |
| 619 | struct ino_bucket *bucket; | 619 | struct ino_bucket *bucket; |
| 620 | unsigned long imap, iclr; | 620 | unsigned long imap, iclr; |
| @@ -1009,7 +1009,7 @@ static irqreturn_t sabre_pcierr_intr(int irq, void *dev_id, struct pt_regs *regs | |||
| 1009 | #define SABRE_UE_INO 0x2e | 1009 | #define SABRE_UE_INO 0x2e |
| 1010 | #define SABRE_CE_INO 0x2f | 1010 | #define SABRE_CE_INO 0x2f |
| 1011 | #define SABRE_PCIERR_INO 0x30 | 1011 | #define SABRE_PCIERR_INO 0x30 |
| 1012 | static void __init sabre_register_error_handlers(struct pci_controller_info *p) | 1012 | static void sabre_register_error_handlers(struct pci_controller_info *p) |
| 1013 | { | 1013 | { |
| 1014 | struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ | 1014 | struct pci_pbm_info *pbm = &p->pbm_A; /* arbitrary */ |
| 1015 | unsigned long base = pbm->controller_regs; | 1015 | unsigned long base = pbm->controller_regs; |
| @@ -1056,9 +1056,9 @@ static void __init sabre_register_error_handlers(struct pci_controller_info *p) | |||
| 1056 | sabre_write(base + SABRE_PCICTRL, tmp); | 1056 | sabre_write(base + SABRE_PCICTRL, tmp); |
| 1057 | } | 1057 | } |
| 1058 | 1058 | ||
| 1059 | static void __init sabre_resource_adjust(struct pci_dev *pdev, | 1059 | static void sabre_resource_adjust(struct pci_dev *pdev, |
| 1060 | struct resource *res, | 1060 | struct resource *res, |
| 1061 | struct resource *root) | 1061 | struct resource *root) |
| 1062 | { | 1062 | { |
| 1063 | struct pci_pbm_info *pbm = pdev->bus->sysdata; | 1063 | struct pci_pbm_info *pbm = pdev->bus->sysdata; |
| 1064 | unsigned long base; | 1064 | unsigned long base; |
| @@ -1072,7 +1072,7 @@ static void __init sabre_resource_adjust(struct pci_dev *pdev, | |||
| 1072 | res->end += base; | 1072 | res->end += base; |
| 1073 | } | 1073 | } |
| 1074 | 1074 | ||
| 1075 | static void __init sabre_base_address_update(struct pci_dev *pdev, int resource) | 1075 | static void sabre_base_address_update(struct pci_dev *pdev, int resource) |
| 1076 | { | 1076 | { |
| 1077 | struct pcidev_cookie *pcp = pdev->sysdata; | 1077 | struct pcidev_cookie *pcp = pdev->sysdata; |
| 1078 | struct pci_pbm_info *pbm = pcp->pbm; | 1078 | struct pci_pbm_info *pbm = pcp->pbm; |
| @@ -1118,7 +1118,7 @@ static void __init sabre_base_address_update(struct pci_dev *pdev, int resource) | |||
| 1118 | pci_write_config_dword(pdev, where + 4, 0); | 1118 | pci_write_config_dword(pdev, where + 4, 0); |
| 1119 | } | 1119 | } |
| 1120 | 1120 | ||
| 1121 | static void __init apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus) | 1121 | static void apb_init(struct pci_controller_info *p, struct pci_bus *sabre_bus) |
| 1122 | { | 1122 | { |
| 1123 | struct pci_dev *pdev; | 1123 | struct pci_dev *pdev; |
| 1124 | 1124 | ||
| @@ -1181,7 +1181,7 @@ static struct pcidev_cookie *alloc_bridge_cookie(struct pci_pbm_info *pbm) | |||
| 1181 | return cookie; | 1181 | return cookie; |
| 1182 | } | 1182 | } |
| 1183 | 1183 | ||
| 1184 | static void __init sabre_scan_bus(struct pci_controller_info *p) | 1184 | static void sabre_scan_bus(struct pci_controller_info *p) |
| 1185 | { | 1185 | { |
| 1186 | static int once; | 1186 | static int once; |
| 1187 | struct pci_bus *sabre_bus, *pbus; | 1187 | struct pci_bus *sabre_bus, *pbus; |
| @@ -1262,9 +1262,9 @@ static void __init sabre_scan_bus(struct pci_controller_info *p) | |||
| 1262 | sabre_register_error_handlers(p); | 1262 | sabre_register_error_handlers(p); |
| 1263 | } | 1263 | } |
| 1264 | 1264 | ||
| 1265 | static void __init sabre_iommu_init(struct pci_controller_info *p, | 1265 | static void sabre_iommu_init(struct pci_controller_info *p, |
| 1266 | int tsbsize, unsigned long dvma_offset, | 1266 | int tsbsize, unsigned long dvma_offset, |
| 1267 | u32 dma_mask) | 1267 | u32 dma_mask) |
| 1268 | { | 1268 | { |
| 1269 | struct pci_iommu *iommu = p->pbm_A.iommu; | 1269 | struct pci_iommu *iommu = p->pbm_A.iommu; |
| 1270 | unsigned long tsbbase, i, order; | 1270 | unsigned long tsbbase, i, order; |
| @@ -1345,8 +1345,8 @@ static void __init sabre_iommu_init(struct pci_controller_info *p, | |||
| 1345 | } | 1345 | } |
| 1346 | } | 1346 | } |
| 1347 | 1347 | ||
| 1348 | static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | 1348 | static void pbm_register_toplevel_resources(struct pci_controller_info *p, |
| 1349 | struct pci_pbm_info *pbm) | 1349 | struct pci_pbm_info *pbm) |
| 1350 | { | 1350 | { |
| 1351 | char *name = pbm->name; | 1351 | char *name = pbm->name; |
| 1352 | unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; | 1352 | unsigned long ibase = p->pbm_A.controller_regs + SABRE_IOSPACE; |
| @@ -1415,7 +1415,7 @@ static void __init pbm_register_toplevel_resources(struct pci_controller_info *p | |||
| 1415 | &pbm->mem_space); | 1415 | &pbm->mem_space); |
| 1416 | } | 1416 | } |
| 1417 | 1417 | ||
| 1418 | static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin) | 1418 | static void sabre_pbm_init(struct pci_controller_info *p, int sabre_node, u32 dma_begin) |
| 1419 | { | 1419 | { |
| 1420 | struct pci_pbm_info *pbm; | 1420 | struct pci_pbm_info *pbm; |
| 1421 | char namebuf[128]; | 1421 | char namebuf[128]; |
| @@ -1552,7 +1552,7 @@ static void __init sabre_pbm_init(struct pci_controller_info *p, int sabre_node, | |||
| 1552 | } | 1552 | } |
| 1553 | } | 1553 | } |
| 1554 | 1554 | ||
| 1555 | void __init sabre_init(int pnode, char *model_name) | 1555 | void sabre_init(int pnode, char *model_name) |
| 1556 | { | 1556 | { |
| 1557 | struct linux_prom64_registers pr_regs[2]; | 1557 | struct linux_prom64_registers pr_regs[2]; |
| 1558 | struct pci_controller_info *p; | 1558 | struct pci_controller_info *p; |
diff --git a/arch/sparc64/kernel/pci_schizo.c b/arch/sparc64/kernel/pci_schizo.c index 6a182bb66281..331382e1a75d 100644 --- a/arch/sparc64/kernel/pci_schizo.c +++ b/arch/sparc64/kernel/pci_schizo.c | |||
| @@ -285,7 +285,7 @@ static unsigned char schizo_pil_table[] = { | |||
| 285 | /*0x3f*/0, /* Reserved for NewLink */ | 285 | /*0x3f*/0, /* Reserved for NewLink */ |
| 286 | }; | 286 | }; |
| 287 | 287 | ||
| 288 | static int __init schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) | 288 | static int schizo_ino_to_pil(struct pci_dev *pdev, unsigned int ino) |
| 289 | { | 289 | { |
| 290 | int ret; | 290 | int ret; |
| 291 | 291 | ||
| @@ -1221,7 +1221,7 @@ static irqreturn_t schizo_safarierr_intr(int irq, void *dev_id, struct pt_regs * | |||
| 1221 | * PCI bus units of the same Tomatillo. I still have not really | 1221 | * PCI bus units of the same Tomatillo. I still have not really |
| 1222 | * figured this out... | 1222 | * figured this out... |
| 1223 | */ | 1223 | */ |
| 1224 | static void __init tomatillo_register_error_handlers(struct pci_controller_info *p) | 1224 | static void tomatillo_register_error_handlers(struct pci_controller_info *p) |
| 1225 | { | 1225 | { |
| 1226 | struct pci_pbm_info *pbm; | 1226 | struct pci_pbm_info *pbm; |
| 1227 | unsigned int irq; | 1227 | unsigned int irq; |
| @@ -1359,7 +1359,7 @@ static void __init tomatillo_register_error_handlers(struct pci_controller_info | |||
| 1359 | (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); | 1359 | (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); |
| 1360 | } | 1360 | } |
| 1361 | 1361 | ||
| 1362 | static void __init schizo_register_error_handlers(struct pci_controller_info *p) | 1362 | static void schizo_register_error_handlers(struct pci_controller_info *p) |
| 1363 | { | 1363 | { |
| 1364 | struct pci_pbm_info *pbm; | 1364 | struct pci_pbm_info *pbm; |
| 1365 | unsigned int irq; | 1365 | unsigned int irq; |
| @@ -1505,7 +1505,7 @@ static void __init schizo_register_error_handlers(struct pci_controller_info *p) | |||
| 1505 | (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); | 1505 | (SCHIZO_SAFIRQCTRL_EN | (BUS_ERROR_UNMAP))); |
| 1506 | } | 1506 | } |
| 1507 | 1507 | ||
| 1508 | static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | 1508 | static void pbm_config_busmastering(struct pci_pbm_info *pbm) |
| 1509 | { | 1509 | { |
| 1510 | u8 *addr; | 1510 | u8 *addr; |
| 1511 | 1511 | ||
| @@ -1522,8 +1522,8 @@ static void __init pbm_config_busmastering(struct pci_pbm_info *pbm) | |||
| 1522 | pci_config_write8(addr, 64); | 1522 | pci_config_write8(addr, 64); |
| 1523 | } | 1523 | } |
| 1524 | 1524 | ||
| 1525 | static void __init pbm_scan_bus(struct pci_controller_info *p, | 1525 | static void pbm_scan_bus(struct pci_controller_info *p, |
| 1526 | struct pci_pbm_info *pbm) | 1526 | struct pci_pbm_info *pbm) |
| 1527 | { | 1527 | { |
| 1528 | struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); | 1528 | struct pcidev_cookie *cookie = kmalloc(sizeof(*cookie), GFP_KERNEL); |
| 1529 | 1529 | ||
| @@ -1550,8 +1550,8 @@ static void __init pbm_scan_bus(struct pci_controller_info *p, | |||
| 1550 | pci_setup_busmastering(pbm, pbm->pci_bus); | 1550 | pci_setup_busmastering(pbm, pbm->pci_bus); |
| 1551 | } | 1551 | } |
| 1552 | 1552 | ||
| 1553 | static void __init __schizo_scan_bus(struct pci_controller_info *p, | 1553 | static void __schizo_scan_bus(struct pci_controller_info *p, |
| 1554 | int chip_type) | 1554 | int chip_type) |
| 1555 | { | 1555 | { |
| 1556 | if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) { | 1556 | if (!p->pbm_B.prom_node || !p->pbm_A.prom_node) { |
| 1557 | printk("PCI: Only one PCI bus module of controller found.\n"); | 1557 | printk("PCI: Only one PCI bus module of controller found.\n"); |
| @@ -1577,17 +1577,17 @@ static void __init __schizo_scan_bus(struct pci_controller_info *p, | |||
| 1577 | schizo_register_error_handlers(p); | 1577 | schizo_register_error_handlers(p); |
| 1578 | } | 1578 | } |
| 1579 | 1579 | ||
| 1580 | static void __init schizo_scan_bus(struct pci_controller_info *p) | 1580 | static void schizo_scan_bus(struct pci_controller_info *p) |
| 1581 | { | 1581 | { |
| 1582 | __schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO); | 1582 | __schizo_scan_bus(p, PBM_CHIP_TYPE_SCHIZO); |
| 1583 | } | 1583 | } |
| 1584 | 1584 | ||
| 1585 | static void __init tomatillo_scan_bus(struct pci_controller_info *p) | 1585 | static void tomatillo_scan_bus(struct pci_controller_info *p) |
| 1586 | { | 1586 | { |
| 1587 | __schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO); | 1587 | __schizo_scan_bus(p, PBM_CHIP_TYPE_TOMATILLO); |
| 1588 | } | 1588 | } |
| 1589 | 1589 | ||
| 1590 | static void __init schizo_base_address_update(struct pci_dev *pdev, int resource) | 1590 | static void schizo_base_address_update(struct pci_dev *pdev, int resource) |
| 1591 | { | 1591 | { |
| 1592 | struct pcidev_cookie *pcp = pdev->sysdata; | 1592 | struct pcidev_cookie *pcp = pdev->sysdata; |
| 1593 | struct pci_pbm_info *pbm = pcp->pbm; | 1593 | struct pci_pbm_info *pbm = pcp->pbm; |
| @@ -1632,9 +1632,9 @@ static void __init schizo_base_address_update(struct pci_dev *pdev, int resource | |||
| 1632 | pci_write_config_dword(pdev, where + 4, 0); | 1632 | pci_write_config_dword(pdev, where + 4, 0); |
| 1633 | } | 1633 | } |
| 1634 | 1634 | ||
| 1635 | static void __init schizo_resource_adjust(struct pci_dev *pdev, | 1635 | static void schizo_resource_adjust(struct pci_dev *pdev, |
| 1636 | struct resource *res, | 1636 | struct resource *res, |
| 1637 | struct resource *root) | 1637 | struct resource *root) |
| 1638 | { | 1638 | { |
| 1639 | res->start += root->start; | 1639 | res->start += root->start; |
| 1640 | res->end += root->start; | 1640 | res->end += root->start; |
| @@ -1702,8 +1702,8 @@ static void schizo_determine_mem_io_space(struct pci_pbm_info *pbm) | |||
| 1702 | pbm->mem_space.start); | 1702 | pbm->mem_space.start); |
| 1703 | } | 1703 | } |
| 1704 | 1704 | ||
| 1705 | static void __init pbm_register_toplevel_resources(struct pci_controller_info *p, | 1705 | static void pbm_register_toplevel_resources(struct pci_controller_info *p, |
| 1706 | struct pci_pbm_info *pbm) | 1706 | struct pci_pbm_info *pbm) |
| 1707 | { | 1707 | { |
| 1708 | pbm->io_space.name = pbm->mem_space.name = pbm->name; | 1708 | pbm->io_space.name = pbm->mem_space.name = pbm->name; |
| 1709 | 1709 | ||
| @@ -1932,7 +1932,7 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm) | |||
| 1932 | #define TOMATILLO_PCI_IOC_TDIAG (0x2250UL) | 1932 | #define TOMATILLO_PCI_IOC_TDIAG (0x2250UL) |
| 1933 | #define TOMATILLO_PCI_IOC_DDIAG (0x2290UL) | 1933 | #define TOMATILLO_PCI_IOC_DDIAG (0x2290UL) |
| 1934 | 1934 | ||
| 1935 | static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) | 1935 | static void schizo_pbm_hw_init(struct pci_pbm_info *pbm) |
| 1936 | { | 1936 | { |
| 1937 | u64 tmp; | 1937 | u64 tmp; |
| 1938 | 1938 | ||
| @@ -1986,9 +1986,9 @@ static void __init schizo_pbm_hw_init(struct pci_pbm_info *pbm) | |||
| 1986 | } | 1986 | } |
| 1987 | } | 1987 | } |
| 1988 | 1988 | ||
| 1989 | static void __init schizo_pbm_init(struct pci_controller_info *p, | 1989 | static void schizo_pbm_init(struct pci_controller_info *p, |
| 1990 | int prom_node, u32 portid, | 1990 | int prom_node, u32 portid, |
| 1991 | int chip_type) | 1991 | int chip_type) |
| 1992 | { | 1992 | { |
| 1993 | struct linux_prom64_registers pr_regs[4]; | 1993 | struct linux_prom64_registers pr_regs[4]; |
| 1994 | unsigned int busrange[2]; | 1994 | unsigned int busrange[2]; |
| @@ -2145,7 +2145,7 @@ static inline int portid_compare(u32 x, u32 y, int chip_type) | |||
| 2145 | return (x == y); | 2145 | return (x == y); |
| 2146 | } | 2146 | } |
| 2147 | 2147 | ||
| 2148 | static void __init __schizo_init(int node, char *model_name, int chip_type) | 2148 | static void __schizo_init(int node, char *model_name, int chip_type) |
| 2149 | { | 2149 | { |
| 2150 | struct pci_controller_info *p; | 2150 | struct pci_controller_info *p; |
| 2151 | struct pci_iommu *iommu; | 2151 | struct pci_iommu *iommu; |
| @@ -2213,17 +2213,17 @@ static void __init __schizo_init(int node, char *model_name, int chip_type) | |||
| 2213 | schizo_pbm_init(p, node, portid, chip_type); | 2213 | schizo_pbm_init(p, node, portid, chip_type); |
| 2214 | } | 2214 | } |
| 2215 | 2215 | ||
| 2216 | void __init schizo_init(int node, char *model_name) | 2216 | void schizo_init(int node, char *model_name) |
| 2217 | { | 2217 | { |
| 2218 | __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO); | 2218 | __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO); |
| 2219 | } | 2219 | } |
| 2220 | 2220 | ||
| 2221 | void __init schizo_plus_init(int node, char *model_name) | 2221 | void schizo_plus_init(int node, char *model_name) |
| 2222 | { | 2222 | { |
| 2223 | __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS); | 2223 | __schizo_init(node, model_name, PBM_CHIP_TYPE_SCHIZO_PLUS); |
| 2224 | } | 2224 | } |
| 2225 | 2225 | ||
| 2226 | void __init tomatillo_init(int node, char *model_name) | 2226 | void tomatillo_init(int node, char *model_name) |
| 2227 | { | 2227 | { |
| 2228 | __schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO); | 2228 | __schizo_init(node, model_name, PBM_CHIP_TYPE_TOMATILLO); |
| 2229 | } | 2229 | } |
diff --git a/arch/sparc64/kernel/sparc64_ksyms.c b/arch/sparc64/kernel/sparc64_ksyms.c index d89fc24808d3..7d9a0f6c437d 100644 --- a/arch/sparc64/kernel/sparc64_ksyms.c +++ b/arch/sparc64/kernel/sparc64_ksyms.c | |||
| @@ -403,12 +403,3 @@ EXPORT_SYMBOL(xor_vis_4); | |||
| 403 | EXPORT_SYMBOL(xor_vis_5); | 403 | EXPORT_SYMBOL(xor_vis_5); |
| 404 | 404 | ||
| 405 | EXPORT_SYMBOL(prom_palette); | 405 | EXPORT_SYMBOL(prom_palette); |
| 406 | |||
| 407 | /* memory barriers */ | ||
| 408 | EXPORT_SYMBOL(mb); | ||
| 409 | EXPORT_SYMBOL(rmb); | ||
| 410 | EXPORT_SYMBOL(wmb); | ||
| 411 | EXPORT_SYMBOL(membar_storeload); | ||
| 412 | EXPORT_SYMBOL(membar_storeload_storestore); | ||
| 413 | EXPORT_SYMBOL(membar_storeload_loadload); | ||
| 414 | EXPORT_SYMBOL(membar_storestore_loadstore); | ||
diff --git a/arch/sparc64/lib/Makefile b/arch/sparc64/lib/Makefile index 6201f1040982..40dbeec7e5d6 100644 --- a/arch/sparc64/lib/Makefile +++ b/arch/sparc64/lib/Makefile | |||
| @@ -12,7 +12,7 @@ lib-y := PeeCeeI.o copy_page.o clear_page.o strlen.o strncmp.o \ | |||
| 12 | U1memcpy.o U1copy_from_user.o U1copy_to_user.o \ | 12 | U1memcpy.o U1copy_from_user.o U1copy_to_user.o \ |
| 13 | U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \ | 13 | U3memcpy.o U3copy_from_user.o U3copy_to_user.o U3patch.o \ |
| 14 | copy_in_user.o user_fixup.o memmove.o \ | 14 | copy_in_user.o user_fixup.o memmove.o \ |
| 15 | mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o mb.o | 15 | mcount.o ipcsum.o rwsem.o xor.o find_bit.o delay.o |
| 16 | 16 | ||
| 17 | lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o | 17 | lib-$(CONFIG_DEBUG_SPINLOCK) += debuglocks.o |
| 18 | lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o | 18 | lib-$(CONFIG_HAVE_DEC_LOCK) += dec_and_lock.o |
diff --git a/arch/sparc64/lib/mb.S b/arch/sparc64/lib/mb.S deleted file mode 100644 index 4004f748619f..000000000000 --- a/arch/sparc64/lib/mb.S +++ /dev/null | |||
| @@ -1,73 +0,0 @@ | |||
| 1 | /* mb.S: Out of line memory barriers. | ||
| 2 | * | ||
| 3 | * Copyright (C) 2005 David S. Miller (davem@davemloft.net) | ||
| 4 | */ | ||
| 5 | |||
| 6 | /* These are here in an effort to more fully work around | ||
| 7 | * Spitfire Errata #51. Essentially, if a memory barrier | ||
| 8 | * occurs soon after a mispredicted branch, the chip can stop | ||
| 9 | * executing instructions until a trap occurs. Therefore, if | ||
| 10 | * interrupts are disabled, the chip can hang forever. | ||
| 11 | * | ||
| 12 | * It used to be believed that the memory barrier had to be | ||
| 13 | * right in the delay slot, but a case has been traced | ||
| 14 | * recently wherein the memory barrier was one instruction | ||
| 15 | * after the branch delay slot and the chip still hung. The | ||
| 16 | * offending sequence was the following in sym_wakeup_done() | ||
| 17 | * of the sym53c8xx_2 driver: | ||
| 18 | * | ||
| 19 | * call sym_ccb_from_dsa, 0 | ||
| 20 | * movge %icc, 0, %l0 | ||
| 21 | * brz,pn %o0, .LL1303 | ||
| 22 | * mov %o0, %l2 | ||
| 23 | * membar #LoadLoad | ||
| 24 | * | ||
| 25 | * The branch has to be mispredicted for the bug to occur. | ||
| 26 | * Therefore, we put the memory barrier explicitly into a | ||
| 27 | * "branch always, predicted taken" delay slot to avoid the | ||
| 28 | * problem case. | ||
| 29 | */ | ||
| 30 | |||
| 31 | .text | ||
| 32 | |||
| 33 | 99: retl | ||
| 34 | nop | ||
| 35 | |||
| 36 | .globl mb | ||
| 37 | mb: ba,pt %xcc, 99b | ||
| 38 | membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad | ||
| 39 | .size mb, .-mb | ||
| 40 | |||
| 41 | .globl rmb | ||
| 42 | rmb: ba,pt %xcc, 99b | ||
| 43 | membar #LoadLoad | ||
| 44 | .size rmb, .-rmb | ||
| 45 | |||
| 46 | .globl wmb | ||
| 47 | wmb: ba,pt %xcc, 99b | ||
| 48 | membar #StoreStore | ||
| 49 | .size wmb, .-wmb | ||
| 50 | |||
| 51 | .globl membar_storeload | ||
| 52 | membar_storeload: | ||
| 53 | ba,pt %xcc, 99b | ||
| 54 | membar #StoreLoad | ||
| 55 | .size membar_storeload, .-membar_storeload | ||
| 56 | |||
| 57 | .globl membar_storeload_storestore | ||
| 58 | membar_storeload_storestore: | ||
| 59 | ba,pt %xcc, 99b | ||
| 60 | membar #StoreLoad | #StoreStore | ||
| 61 | .size membar_storeload_storestore, .-membar_storeload_storestore | ||
| 62 | |||
| 63 | .globl membar_storeload_loadload | ||
| 64 | membar_storeload_loadload: | ||
| 65 | ba,pt %xcc, 99b | ||
| 66 | membar #StoreLoad | #LoadLoad | ||
| 67 | .size membar_storeload_loadload, .-membar_storeload_loadload | ||
| 68 | |||
| 69 | .globl membar_storestore_loadstore | ||
| 70 | membar_storestore_loadstore: | ||
| 71 | ba,pt %xcc, 99b | ||
| 72 | membar #StoreStore | #LoadStore | ||
| 73 | .size membar_storestore_loadstore, .-membar_storestore_loadstore | ||
diff --git a/arch/um/Makefile-x86_64 b/arch/um/Makefile-x86_64 index baddb5d64ca5..436abbba409b 100644 --- a/arch/um/Makefile-x86_64 +++ b/arch/um/Makefile-x86_64 | |||
| @@ -8,6 +8,7 @@ START := 0x60000000 | |||
| 8 | #it's needed for headers to work! | 8 | #it's needed for headers to work! |
| 9 | CFLAGS += -U__$(SUBARCH)__ -fno-builtin | 9 | CFLAGS += -U__$(SUBARCH)__ -fno-builtin |
| 10 | USER_CFLAGS += -fno-builtin | 10 | USER_CFLAGS += -fno-builtin |
| 11 | CHECKFLAGS += -m64 | ||
| 11 | 12 | ||
| 12 | ELF_ARCH := i386:x86-64 | 13 | ELF_ARCH := i386:x86-64 |
| 13 | ELF_FORMAT := elf64-x86-64 | 14 | ELF_FORMAT := elf64-x86-64 |
diff --git a/arch/um/kernel/skas/include/uaccess-skas.h b/arch/um/kernel/skas/include/uaccess-skas.h index cd6c280482cb..6ee3f3902e68 100644 --- a/arch/um/kernel/skas/include/uaccess-skas.h +++ b/arch/um/kernel/skas/include/uaccess-skas.h | |||
| @@ -18,18 +18,18 @@ | |||
| 18 | ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \ | 18 | ((unsigned long) (addr) + (size) <= FIXADDR_USER_END) && \ |
| 19 | ((unsigned long) (addr) + (size) >= (unsigned long)(addr)))) | 19 | ((unsigned long) (addr) + (size) >= (unsigned long)(addr)))) |
| 20 | 20 | ||
| 21 | static inline int verify_area_skas(int type, const void * addr, | 21 | static inline int verify_area_skas(int type, const void __user * addr, |
| 22 | unsigned long size) | 22 | unsigned long size) |
| 23 | { | 23 | { |
| 24 | return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); | 24 | return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | extern int copy_from_user_skas(void *to, const void *from, int n); | 27 | extern int copy_from_user_skas(void *to, const void __user *from, int n); |
| 28 | extern int copy_to_user_skas(void *to, const void *from, int n); | 28 | extern int copy_to_user_skas(void __user *to, const void *from, int n); |
| 29 | extern int strncpy_from_user_skas(char *dst, const char *src, int count); | 29 | extern int strncpy_from_user_skas(char *dst, const char __user *src, int count); |
| 30 | extern int __clear_user_skas(void *mem, int len); | 30 | extern int __clear_user_skas(void __user *mem, int len); |
| 31 | extern int clear_user_skas(void *mem, int len); | 31 | extern int clear_user_skas(void __user *mem, int len); |
| 32 | extern int strnlen_user_skas(const void *str, int len); | 32 | extern int strnlen_user_skas(const void __user *str, int len); |
| 33 | 33 | ||
| 34 | #endif | 34 | #endif |
| 35 | 35 | ||
diff --git a/arch/um/kernel/tt/include/uaccess-tt.h b/arch/um/kernel/tt/include/uaccess-tt.h index 3fbb5fe26f49..aa6db384af80 100644 --- a/arch/um/kernel/tt/include/uaccess-tt.h +++ b/arch/um/kernel/tt/include/uaccess-tt.h | |||
| @@ -33,7 +33,7 @@ extern unsigned long uml_physmem; | |||
| 33 | (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \ | 33 | (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \ |
| 34 | (under_task_size(addr, size) || is_stack(addr, size)))) | 34 | (under_task_size(addr, size) || is_stack(addr, size)))) |
| 35 | 35 | ||
| 36 | static inline int verify_area_tt(int type, const void * addr, | 36 | static inline int verify_area_tt(int type, const void __user * addr, |
| 37 | unsigned long size) | 37 | unsigned long size) |
| 38 | { | 38 | { |
| 39 | return(access_ok_tt(type, addr, size) ? 0 : -EFAULT); | 39 | return(access_ok_tt(type, addr, size) ? 0 : -EFAULT); |
| @@ -50,12 +50,12 @@ extern int __do_clear_user(void *mem, size_t len, void **fault_addr, | |||
| 50 | extern int __do_strnlen_user(const char *str, unsigned long n, | 50 | extern int __do_strnlen_user(const char *str, unsigned long n, |
| 51 | void **fault_addr, void **fault_catcher); | 51 | void **fault_addr, void **fault_catcher); |
| 52 | 52 | ||
| 53 | extern int copy_from_user_tt(void *to, const void *from, int n); | 53 | extern int copy_from_user_tt(void *to, const void __user *from, int n); |
| 54 | extern int copy_to_user_tt(void *to, const void *from, int n); | 54 | extern int copy_to_user_tt(void __user *to, const void *from, int n); |
| 55 | extern int strncpy_from_user_tt(char *dst, const char *src, int count); | 55 | extern int strncpy_from_user_tt(char *dst, const char __user *src, int count); |
| 56 | extern int __clear_user_tt(void *mem, int len); | 56 | extern int __clear_user_tt(void __user *mem, int len); |
| 57 | extern int clear_user_tt(void *mem, int len); | 57 | extern int clear_user_tt(void __user *mem, int len); |
| 58 | extern int strnlen_user_tt(const void *str, int len); | 58 | extern int strnlen_user_tt(const void __user *str, int len); |
| 59 | 59 | ||
| 60 | #endif | 60 | #endif |
| 61 | 61 | ||
diff --git a/arch/um/scripts/Makefile.rules b/arch/um/scripts/Makefile.rules index 17f305b6bade..59a1291f477e 100644 --- a/arch/um/scripts/Makefile.rules +++ b/arch/um/scripts/Makefile.rules | |||
| @@ -9,6 +9,11 @@ USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) | |||
| 9 | 9 | ||
| 10 | $(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \ | 10 | $(USER_OBJS) : c_flags = -Wp,-MD,$(depfile) $(USER_CFLAGS) \ |
| 11 | $(CFLAGS_$(notdir $@)) | 11 | $(CFLAGS_$(notdir $@)) |
| 12 | $(USER_OBJS): cmd_checksrc = | ||
| 13 | $(USER_OBJS): quiet_cmd_checksrc = | ||
| 14 | $(USER_OBJS): cmd_force_checksrc = | ||
| 15 | $(USER_OBJS): quiet_cmd_force_checksrc = | ||
| 16 | |||
| 12 | 17 | ||
| 13 | # The stubs and unmap.o can't try to call mcount or update basic block data | 18 | # The stubs and unmap.o can't try to call mcount or update basic block data |
| 14 | define unprofile | 19 | define unprofile |
diff --git a/arch/x86_64/kernel/io_apic.c b/arch/x86_64/kernel/io_apic.c index 40e0aca088fb..5f1529be1237 100644 --- a/arch/x86_64/kernel/io_apic.c +++ b/arch/x86_64/kernel/io_apic.c | |||
| @@ -1167,9 +1167,9 @@ void disable_IO_APIC(void) | |||
| 1167 | clear_IO_APIC(); | 1167 | clear_IO_APIC(); |
| 1168 | 1168 | ||
| 1169 | /* | 1169 | /* |
| 1170 | * If the i82559 is routed through an IOAPIC | 1170 | * If the i8259 is routed through an IOAPIC |
| 1171 | * Put that IOAPIC in virtual wire mode | 1171 | * Put that IOAPIC in virtual wire mode |
| 1172 | * so legacy interrups can be delivered. | 1172 | * so legacy interrupts can be delivered. |
| 1173 | */ | 1173 | */ |
| 1174 | pin = find_isa_irq_pin(0, mp_ExtINT); | 1174 | pin = find_isa_irq_pin(0, mp_ExtINT); |
| 1175 | if (pin != -1) { | 1175 | if (pin != -1) { |
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 3998c9d35fe1..fe1e8126fbae 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig | |||
| @@ -250,8 +250,7 @@ config ACPI_CUSTOM_DSDT_FILE | |||
| 250 | Enter the full path name to the file wich includes the AmlCode declaration. | 250 | Enter the full path name to the file wich includes the AmlCode declaration. |
| 251 | 251 | ||
| 252 | config ACPI_BLACKLIST_YEAR | 252 | config ACPI_BLACKLIST_YEAR |
| 253 | int "Disable ACPI for systems before Jan 1st this year" | 253 | int "Disable ACPI for systems before Jan 1st this year" if X86 |
| 254 | depends on X86 | ||
| 255 | default 0 | 254 | default 0 |
| 256 | help | 255 | help |
| 257 | enter a 4-digit year, eg. 2001 to disable ACPI by default | 256 | enter a 4-digit year, eg. 2001 to disable ACPI by default |
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index a026567f5d18..aa0bf7ee008d 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
| @@ -16,9 +16,10 @@ | |||
| 16 | * -- verify the 13 conditions and do bulk resets | 16 | * -- verify the 13 conditions and do bulk resets |
| 17 | * -- kill last_pipe and simply do two-state clearing on both pipes | 17 | * -- kill last_pipe and simply do two-state clearing on both pipes |
| 18 | * -- verify protocol (bulk) from USB descriptors (maybe...) | 18 | * -- verify protocol (bulk) from USB descriptors (maybe...) |
| 19 | * -- highmem and sg | 19 | * -- highmem |
| 20 | * -- move top_sense and work_bcs into separate allocations (if they survive) | 20 | * -- move top_sense and work_bcs into separate allocations (if they survive) |
| 21 | * for cache purists and esoteric architectures. | 21 | * for cache purists and esoteric architectures. |
| 22 | * -- Allocate structure for LUN 0 before the first ub_sync_tur, avoid NULL. ? | ||
| 22 | * -- prune comments, they are too volumnous | 23 | * -- prune comments, they are too volumnous |
| 23 | * -- Exterminate P3 printks | 24 | * -- Exterminate P3 printks |
| 24 | * -- Resove XXX's | 25 | * -- Resove XXX's |
| @@ -171,7 +172,7 @@ struct bulk_cs_wrap { | |||
| 171 | */ | 172 | */ |
| 172 | struct ub_dev; | 173 | struct ub_dev; |
| 173 | 174 | ||
| 174 | #define UB_MAX_REQ_SG 1 | 175 | #define UB_MAX_REQ_SG 4 |
| 175 | #define UB_MAX_SECTORS 64 | 176 | #define UB_MAX_SECTORS 64 |
| 176 | 177 | ||
| 177 | /* | 178 | /* |
| @@ -234,13 +235,10 @@ struct ub_scsi_cmd { | |||
| 234 | 235 | ||
| 235 | int stat_count; /* Retries getting status. */ | 236 | int stat_count; /* Retries getting status. */ |
| 236 | 237 | ||
| 237 | /* | ||
| 238 | * We do not support transfers from highmem pages | ||
| 239 | * because the underlying USB framework does not do what we need. | ||
| 240 | */ | ||
| 241 | char *data; /* Requested buffer */ | ||
| 242 | unsigned int len; /* Requested length */ | 238 | unsigned int len; /* Requested length */ |
| 243 | // struct scatterlist sgv[UB_MAX_REQ_SG]; | 239 | unsigned int current_sg; |
| 240 | unsigned int nsg; /* sgv[nsg] */ | ||
| 241 | struct scatterlist sgv[UB_MAX_REQ_SG]; | ||
| 244 | 242 | ||
| 245 | struct ub_lun *lun; | 243 | struct ub_lun *lun; |
| 246 | void (*done)(struct ub_dev *, struct ub_scsi_cmd *); | 244 | void (*done)(struct ub_dev *, struct ub_scsi_cmd *); |
| @@ -389,17 +387,18 @@ struct ub_dev { | |||
| 389 | struct bulk_cs_wrap work_bcs; | 387 | struct bulk_cs_wrap work_bcs; |
| 390 | struct usb_ctrlrequest work_cr; | 388 | struct usb_ctrlrequest work_cr; |
| 391 | 389 | ||
| 390 | int sg_stat[UB_MAX_REQ_SG+1]; | ||
| 392 | struct ub_scsi_trace tr; | 391 | struct ub_scsi_trace tr; |
| 393 | }; | 392 | }; |
| 394 | 393 | ||
| 395 | /* | 394 | /* |
| 396 | */ | 395 | */ |
| 397 | static void ub_cleanup(struct ub_dev *sc); | 396 | static void ub_cleanup(struct ub_dev *sc); |
| 398 | static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq); | 397 | static int ub_request_fn_1(struct ub_lun *lun, struct request *rq); |
| 399 | static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | 398 | static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, |
| 400 | struct ub_scsi_cmd *cmd, struct request *rq); | 399 | struct ub_scsi_cmd *cmd, struct request *rq); |
| 401 | static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | 400 | static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, |
| 402 | struct request *rq); | 401 | struct ub_scsi_cmd *cmd, struct request *rq); |
| 403 | static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 402 | static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
| 404 | static void ub_end_rq(struct request *rq, int uptodate); | 403 | static void ub_end_rq(struct request *rq, int uptodate); |
| 405 | static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 404 | static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
| @@ -407,6 +406,7 @@ static void ub_urb_complete(struct urb *urb, struct pt_regs *pt); | |||
| 407 | static void ub_scsi_action(unsigned long _dev); | 406 | static void ub_scsi_action(unsigned long _dev); |
| 408 | static void ub_scsi_dispatch(struct ub_dev *sc); | 407 | static void ub_scsi_dispatch(struct ub_dev *sc); |
| 409 | static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 408 | static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
| 409 | static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | ||
| 410 | static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc); | 410 | static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc); |
| 411 | static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 411 | static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
| 412 | static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 412 | static void ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
| @@ -500,7 +500,8 @@ static void ub_cmdtr_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
| 500 | } | 500 | } |
| 501 | } | 501 | } |
| 502 | 502 | ||
| 503 | static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, char *page) | 503 | static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, |
| 504 | char *page) | ||
| 504 | { | 505 | { |
| 505 | struct usb_interface *intf; | 506 | struct usb_interface *intf; |
| 506 | struct ub_dev *sc; | 507 | struct ub_dev *sc; |
| @@ -523,6 +524,13 @@ static ssize_t ub_diag_show(struct device *dev, struct device_attribute *attr, c | |||
| 523 | cnt += sprintf(page + cnt, | 524 | cnt += sprintf(page + cnt, |
| 524 | "qlen %d qmax %d\n", | 525 | "qlen %d qmax %d\n", |
| 525 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); | 526 | sc->cmd_queue.qlen, sc->cmd_queue.qmax); |
| 527 | cnt += sprintf(page + cnt, | ||
| 528 | "sg %d %d %d %d %d\n", | ||
| 529 | sc->sg_stat[0], | ||
| 530 | sc->sg_stat[1], | ||
| 531 | sc->sg_stat[2], | ||
| 532 | sc->sg_stat[3], | ||
| 533 | sc->sg_stat[4]); | ||
| 526 | 534 | ||
| 527 | list_for_each (p, &sc->luns) { | 535 | list_for_each (p, &sc->luns) { |
| 528 | lun = list_entry(p, struct ub_lun, link); | 536 | lun = list_entry(p, struct ub_lun, link); |
| @@ -744,20 +752,20 @@ static struct ub_scsi_cmd *ub_cmdq_pop(struct ub_dev *sc) | |||
| 744 | * The request function is our main entry point | 752 | * The request function is our main entry point |
| 745 | */ | 753 | */ |
| 746 | 754 | ||
| 747 | static void ub_bd_rq_fn(request_queue_t *q) | 755 | static void ub_request_fn(request_queue_t *q) |
| 748 | { | 756 | { |
| 749 | struct ub_lun *lun = q->queuedata; | 757 | struct ub_lun *lun = q->queuedata; |
| 750 | struct request *rq; | 758 | struct request *rq; |
| 751 | 759 | ||
| 752 | while ((rq = elv_next_request(q)) != NULL) { | 760 | while ((rq = elv_next_request(q)) != NULL) { |
| 753 | if (ub_bd_rq_fn_1(lun, rq) != 0) { | 761 | if (ub_request_fn_1(lun, rq) != 0) { |
| 754 | blk_stop_queue(q); | 762 | blk_stop_queue(q); |
| 755 | break; | 763 | break; |
| 756 | } | 764 | } |
| 757 | } | 765 | } |
| 758 | } | 766 | } |
| 759 | 767 | ||
| 760 | static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | 768 | static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) |
| 761 | { | 769 | { |
| 762 | struct ub_dev *sc = lun->udev; | 770 | struct ub_dev *sc = lun->udev; |
| 763 | struct ub_scsi_cmd *cmd; | 771 | struct ub_scsi_cmd *cmd; |
| @@ -774,9 +782,8 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | |||
| 774 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); | 782 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); |
| 775 | 783 | ||
| 776 | blkdev_dequeue_request(rq); | 784 | blkdev_dequeue_request(rq); |
| 777 | |||
| 778 | if (blk_pc_request(rq)) { | 785 | if (blk_pc_request(rq)) { |
| 779 | rc = ub_cmd_build_packet(sc, cmd, rq); | 786 | rc = ub_cmd_build_packet(sc, lun, cmd, rq); |
| 780 | } else { | 787 | } else { |
| 781 | rc = ub_cmd_build_block(sc, lun, cmd, rq); | 788 | rc = ub_cmd_build_block(sc, lun, cmd, rq); |
| 782 | } | 789 | } |
| @@ -791,7 +798,7 @@ static int ub_bd_rq_fn_1(struct ub_lun *lun, struct request *rq) | |||
| 791 | cmd->back = rq; | 798 | cmd->back = rq; |
| 792 | 799 | ||
| 793 | cmd->tag = sc->tagcnt++; | 800 | cmd->tag = sc->tagcnt++; |
| 794 | if ((rc = ub_submit_scsi(sc, cmd)) != 0) { | 801 | if (ub_submit_scsi(sc, cmd) != 0) { |
| 795 | ub_put_cmd(lun, cmd); | 802 | ub_put_cmd(lun, cmd); |
| 796 | ub_end_rq(rq, 0); | 803 | ub_end_rq(rq, 0); |
| 797 | return 0; | 804 | return 0; |
| @@ -804,58 +811,31 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
| 804 | struct ub_scsi_cmd *cmd, struct request *rq) | 811 | struct ub_scsi_cmd *cmd, struct request *rq) |
| 805 | { | 812 | { |
| 806 | int ub_dir; | 813 | int ub_dir; |
| 807 | #if 0 /* We use rq->buffer for now */ | ||
| 808 | struct scatterlist *sg; | ||
| 809 | int n_elem; | 814 | int n_elem; |
| 810 | #endif | ||
| 811 | unsigned int block, nblks; | 815 | unsigned int block, nblks; |
| 812 | 816 | ||
| 813 | if (rq_data_dir(rq) == WRITE) | 817 | if (rq_data_dir(rq) == WRITE) |
| 814 | ub_dir = UB_DIR_WRITE; | 818 | ub_dir = UB_DIR_WRITE; |
| 815 | else | 819 | else |
| 816 | ub_dir = UB_DIR_READ; | 820 | ub_dir = UB_DIR_READ; |
| 821 | cmd->dir = ub_dir; | ||
| 817 | 822 | ||
| 818 | /* | 823 | /* |
| 819 | * get scatterlist from block layer | 824 | * get scatterlist from block layer |
| 820 | */ | 825 | */ |
| 821 | #if 0 /* We use rq->buffer for now */ | 826 | n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]); |
| 822 | sg = &cmd->sgv[0]; | ||
| 823 | n_elem = blk_rq_map_sg(q, rq, sg); | ||
| 824 | if (n_elem <= 0) { | 827 | if (n_elem <= 0) { |
| 825 | ub_put_cmd(lun, cmd); | 828 | printk(KERN_INFO "%s: failed request map (%d)\n", |
| 826 | ub_end_rq(rq, 0); | 829 | sc->name, n_elem); /* P3 */ |
| 827 | blk_start_queue(q); | 830 | return -1; /* request with no s/g entries? */ |
| 828 | return 0; /* request with no s/g entries? */ | ||
| 829 | } | 831 | } |
| 830 | 832 | if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */ | |
| 831 | if (n_elem != 1) { /* Paranoia */ | ||
| 832 | printk(KERN_WARNING "%s: request with %d segments\n", | 833 | printk(KERN_WARNING "%s: request with %d segments\n", |
| 833 | sc->name, n_elem); | 834 | sc->name, n_elem); |
| 834 | ub_put_cmd(lun, cmd); | ||
| 835 | ub_end_rq(rq, 0); | ||
| 836 | blk_start_queue(q); | ||
| 837 | return 0; | ||
| 838 | } | ||
| 839 | #endif | ||
| 840 | |||
| 841 | /* | ||
| 842 | * XXX Unfortunately, this check does not work. It is quite possible | ||
| 843 | * to get bogus non-null rq->buffer if you allow sg by mistake. | ||
| 844 | */ | ||
| 845 | if (rq->buffer == NULL) { | ||
| 846 | /* | ||
| 847 | * This must not happen if we set the queue right. | ||
| 848 | * The block level must create bounce buffers for us. | ||
| 849 | */ | ||
| 850 | static int do_print = 1; | ||
| 851 | if (do_print) { | ||
| 852 | printk(KERN_WARNING "%s: unmapped block request" | ||
| 853 | " flags 0x%lx sectors %lu\n", | ||
| 854 | sc->name, rq->flags, rq->nr_sectors); | ||
| 855 | do_print = 0; | ||
| 856 | } | ||
| 857 | return -1; | 835 | return -1; |
| 858 | } | 836 | } |
| 837 | cmd->nsg = n_elem; | ||
| 838 | sc->sg_stat[n_elem]++; | ||
| 859 | 839 | ||
| 860 | /* | 840 | /* |
| 861 | * build the command | 841 | * build the command |
| @@ -876,30 +856,15 @@ static int ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
| 876 | cmd->cdb[8] = nblks; | 856 | cmd->cdb[8] = nblks; |
| 877 | cmd->cdb_len = 10; | 857 | cmd->cdb_len = 10; |
| 878 | 858 | ||
| 879 | cmd->dir = ub_dir; | ||
| 880 | cmd->data = rq->buffer; | ||
| 881 | cmd->len = rq->nr_sectors * 512; | 859 | cmd->len = rq->nr_sectors * 512; |
| 882 | 860 | ||
| 883 | return 0; | 861 | return 0; |
| 884 | } | 862 | } |
| 885 | 863 | ||
| 886 | static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | 864 | static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, |
| 887 | struct request *rq) | 865 | struct ub_scsi_cmd *cmd, struct request *rq) |
| 888 | { | 866 | { |
| 889 | 867 | int n_elem; | |
| 890 | if (rq->data_len != 0 && rq->data == NULL) { | ||
| 891 | static int do_print = 1; | ||
| 892 | if (do_print) { | ||
| 893 | printk(KERN_WARNING "%s: unmapped packet request" | ||
| 894 | " flags 0x%lx length %d\n", | ||
| 895 | sc->name, rq->flags, rq->data_len); | ||
| 896 | do_print = 0; | ||
| 897 | } | ||
| 898 | return -1; | ||
| 899 | } | ||
| 900 | |||
| 901 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | ||
| 902 | cmd->cdb_len = rq->cmd_len; | ||
| 903 | 868 | ||
| 904 | if (rq->data_len == 0) { | 869 | if (rq->data_len == 0) { |
| 905 | cmd->dir = UB_DIR_NONE; | 870 | cmd->dir = UB_DIR_NONE; |
| @@ -908,8 +873,29 @@ static int ub_cmd_build_packet(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
| 908 | cmd->dir = UB_DIR_WRITE; | 873 | cmd->dir = UB_DIR_WRITE; |
| 909 | else | 874 | else |
| 910 | cmd->dir = UB_DIR_READ; | 875 | cmd->dir = UB_DIR_READ; |
| 876 | |||
| 877 | } | ||
| 878 | |||
| 879 | /* | ||
| 880 | * get scatterlist from block layer | ||
| 881 | */ | ||
| 882 | n_elem = blk_rq_map_sg(lun->disk->queue, rq, &cmd->sgv[0]); | ||
| 883 | if (n_elem < 0) { | ||
| 884 | printk(KERN_INFO "%s: failed request map (%d)\n", | ||
| 885 | sc->name, n_elem); /* P3 */ | ||
| 886 | return -1; | ||
| 911 | } | 887 | } |
| 912 | cmd->data = rq->data; | 888 | if (n_elem > UB_MAX_REQ_SG) { /* Paranoia */ |
| 889 | printk(KERN_WARNING "%s: request with %d segments\n", | ||
| 890 | sc->name, n_elem); | ||
| 891 | return -1; | ||
| 892 | } | ||
| 893 | cmd->nsg = n_elem; | ||
| 894 | sc->sg_stat[n_elem]++; | ||
| 895 | |||
| 896 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | ||
| 897 | cmd->cdb_len = rq->cmd_len; | ||
| 898 | |||
| 913 | cmd->len = rq->data_len; | 899 | cmd->len = rq->data_len; |
| 914 | 900 | ||
| 915 | return 0; | 901 | return 0; |
| @@ -919,24 +905,34 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 919 | { | 905 | { |
| 920 | struct request *rq = cmd->back; | 906 | struct request *rq = cmd->back; |
| 921 | struct ub_lun *lun = cmd->lun; | 907 | struct ub_lun *lun = cmd->lun; |
| 922 | struct gendisk *disk = lun->disk; | ||
| 923 | request_queue_t *q = disk->queue; | ||
| 924 | int uptodate; | 908 | int uptodate; |
| 925 | 909 | ||
| 926 | if (blk_pc_request(rq)) { | 910 | if (cmd->error == 0) { |
| 927 | /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ | ||
| 928 | memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); | ||
| 929 | rq->sense_len = UB_SENSE_SIZE; | ||
| 930 | } | ||
| 931 | |||
| 932 | if (cmd->error == 0) | ||
| 933 | uptodate = 1; | 911 | uptodate = 1; |
| 934 | else | 912 | |
| 913 | if (blk_pc_request(rq)) { | ||
| 914 | if (cmd->act_len >= rq->data_len) | ||
| 915 | rq->data_len = 0; | ||
| 916 | else | ||
| 917 | rq->data_len -= cmd->act_len; | ||
| 918 | } | ||
| 919 | } else { | ||
| 935 | uptodate = 0; | 920 | uptodate = 0; |
| 936 | 921 | ||
| 922 | if (blk_pc_request(rq)) { | ||
| 923 | /* UB_SENSE_SIZE is smaller than SCSI_SENSE_BUFFERSIZE */ | ||
| 924 | memcpy(rq->sense, sc->top_sense, UB_SENSE_SIZE); | ||
| 925 | rq->sense_len = UB_SENSE_SIZE; | ||
| 926 | if (sc->top_sense[0] != 0) | ||
| 927 | rq->errors = SAM_STAT_CHECK_CONDITION; | ||
| 928 | else | ||
| 929 | rq->errors = DID_ERROR << 16; | ||
| 930 | } | ||
| 931 | } | ||
| 932 | |||
| 937 | ub_put_cmd(lun, cmd); | 933 | ub_put_cmd(lun, cmd); |
| 938 | ub_end_rq(rq, uptodate); | 934 | ub_end_rq(rq, uptodate); |
| 939 | blk_start_queue(q); | 935 | blk_start_queue(lun->disk->queue); |
| 940 | } | 936 | } |
| 941 | 937 | ||
| 942 | static void ub_end_rq(struct request *rq, int uptodate) | 938 | static void ub_end_rq(struct request *rq, int uptodate) |
| @@ -1014,7 +1010,7 @@ static int ub_scsi_cmd_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1014 | sc->last_pipe = sc->send_bulk_pipe; | 1010 | sc->last_pipe = sc->send_bulk_pipe; |
| 1015 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, | 1011 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->send_bulk_pipe, |
| 1016 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); | 1012 | bcb, US_BULK_CB_WRAP_LEN, ub_urb_complete, sc); |
| 1017 | sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | 1013 | sc->work_urb.transfer_flags = 0; |
| 1018 | 1014 | ||
| 1019 | /* Fill what we shouldn't be filling, because usb-storage did so. */ | 1015 | /* Fill what we shouldn't be filling, because usb-storage did so. */ |
| 1020 | sc->work_urb.actual_length = 0; | 1016 | sc->work_urb.actual_length = 0; |
| @@ -1103,7 +1099,6 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1103 | { | 1099 | { |
| 1104 | struct urb *urb = &sc->work_urb; | 1100 | struct urb *urb = &sc->work_urb; |
| 1105 | struct bulk_cs_wrap *bcs; | 1101 | struct bulk_cs_wrap *bcs; |
| 1106 | int pipe; | ||
| 1107 | int rc; | 1102 | int rc; |
| 1108 | 1103 | ||
| 1109 | if (atomic_read(&sc->poison)) { | 1104 | if (atomic_read(&sc->poison)) { |
| @@ -1204,38 +1199,13 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1204 | goto Bad_End; | 1199 | goto Bad_End; |
| 1205 | } | 1200 | } |
| 1206 | 1201 | ||
| 1207 | if (cmd->dir == UB_DIR_NONE) { | 1202 | if (cmd->dir == UB_DIR_NONE || cmd->nsg < 1) { |
| 1208 | ub_state_stat(sc, cmd); | 1203 | ub_state_stat(sc, cmd); |
| 1209 | return; | 1204 | return; |
| 1210 | } | 1205 | } |
| 1211 | 1206 | ||
| 1212 | UB_INIT_COMPLETION(sc->work_done); | 1207 | // udelay(125); // usb-storage has this |
| 1213 | 1208 | ub_data_start(sc, cmd); | |
| 1214 | if (cmd->dir == UB_DIR_READ) | ||
| 1215 | pipe = sc->recv_bulk_pipe; | ||
| 1216 | else | ||
| 1217 | pipe = sc->send_bulk_pipe; | ||
| 1218 | sc->last_pipe = pipe; | ||
| 1219 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | ||
| 1220 | cmd->data, cmd->len, ub_urb_complete, sc); | ||
| 1221 | sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | ||
| 1222 | sc->work_urb.actual_length = 0; | ||
| 1223 | sc->work_urb.error_count = 0; | ||
| 1224 | sc->work_urb.status = 0; | ||
| 1225 | |||
| 1226 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | ||
| 1227 | /* XXX Clear stalls */ | ||
| 1228 | printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
| 1229 | ub_complete(&sc->work_done); | ||
| 1230 | ub_state_done(sc, cmd, rc); | ||
| 1231 | return; | ||
| 1232 | } | ||
| 1233 | |||
| 1234 | sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT; | ||
| 1235 | add_timer(&sc->work_timer); | ||
| 1236 | |||
| 1237 | cmd->state = UB_CMDST_DATA; | ||
| 1238 | ub_cmdtr_state(sc, cmd); | ||
| 1239 | 1209 | ||
| 1240 | } else if (cmd->state == UB_CMDST_DATA) { | 1210 | } else if (cmd->state == UB_CMDST_DATA) { |
| 1241 | if (urb->status == -EPIPE) { | 1211 | if (urb->status == -EPIPE) { |
| @@ -1257,16 +1227,22 @@ static void ub_scsi_urb_compl(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1257 | if (urb->status == -EOVERFLOW) { | 1227 | if (urb->status == -EOVERFLOW) { |
| 1258 | /* | 1228 | /* |
| 1259 | * A babble? Failure, but we must transfer CSW now. | 1229 | * A babble? Failure, but we must transfer CSW now. |
| 1230 | * XXX This is going to end in perpetual babble. Reset. | ||
| 1260 | */ | 1231 | */ |
| 1261 | cmd->error = -EOVERFLOW; /* A cheap trick... */ | 1232 | cmd->error = -EOVERFLOW; /* A cheap trick... */ |
| 1262 | } else { | 1233 | ub_state_stat(sc, cmd); |
| 1263 | if (urb->status != 0) | 1234 | return; |
| 1264 | goto Bad_End; | ||
| 1265 | } | 1235 | } |
| 1236 | if (urb->status != 0) | ||
| 1237 | goto Bad_End; | ||
| 1266 | 1238 | ||
| 1267 | cmd->act_len = urb->actual_length; | 1239 | cmd->act_len += urb->actual_length; |
| 1268 | ub_cmdtr_act_len(sc, cmd); | 1240 | ub_cmdtr_act_len(sc, cmd); |
| 1269 | 1241 | ||
| 1242 | if (++cmd->current_sg < cmd->nsg) { | ||
| 1243 | ub_data_start(sc, cmd); | ||
| 1244 | return; | ||
| 1245 | } | ||
| 1270 | ub_state_stat(sc, cmd); | 1246 | ub_state_stat(sc, cmd); |
| 1271 | 1247 | ||
| 1272 | } else if (cmd->state == UB_CMDST_STAT) { | 1248 | } else if (cmd->state == UB_CMDST_STAT) { |
| @@ -1401,6 +1377,46 @@ Bad_End: /* Little Excel is dead */ | |||
| 1401 | 1377 | ||
| 1402 | /* | 1378 | /* |
| 1403 | * Factorization helper for the command state machine: | 1379 | * Factorization helper for the command state machine: |
| 1380 | * Initiate a data segment transfer. | ||
| 1381 | */ | ||
| 1382 | static void ub_data_start(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | ||
| 1383 | { | ||
| 1384 | struct scatterlist *sg = &cmd->sgv[cmd->current_sg]; | ||
| 1385 | int pipe; | ||
| 1386 | int rc; | ||
| 1387 | |||
| 1388 | UB_INIT_COMPLETION(sc->work_done); | ||
| 1389 | |||
| 1390 | if (cmd->dir == UB_DIR_READ) | ||
| 1391 | pipe = sc->recv_bulk_pipe; | ||
| 1392 | else | ||
| 1393 | pipe = sc->send_bulk_pipe; | ||
| 1394 | sc->last_pipe = pipe; | ||
| 1395 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, pipe, | ||
| 1396 | page_address(sg->page) + sg->offset, sg->length, | ||
| 1397 | ub_urb_complete, sc); | ||
| 1398 | sc->work_urb.transfer_flags = 0; | ||
| 1399 | sc->work_urb.actual_length = 0; | ||
| 1400 | sc->work_urb.error_count = 0; | ||
| 1401 | sc->work_urb.status = 0; | ||
| 1402 | |||
| 1403 | if ((rc = usb_submit_urb(&sc->work_urb, GFP_ATOMIC)) != 0) { | ||
| 1404 | /* XXX Clear stalls */ | ||
| 1405 | printk("ub: data #%d submit failed (%d)\n", cmd->tag, rc); /* P3 */ | ||
| 1406 | ub_complete(&sc->work_done); | ||
| 1407 | ub_state_done(sc, cmd, rc); | ||
| 1408 | return; | ||
| 1409 | } | ||
| 1410 | |||
| 1411 | sc->work_timer.expires = jiffies + UB_DATA_TIMEOUT; | ||
| 1412 | add_timer(&sc->work_timer); | ||
| 1413 | |||
| 1414 | cmd->state = UB_CMDST_DATA; | ||
| 1415 | ub_cmdtr_state(sc, cmd); | ||
| 1416 | } | ||
| 1417 | |||
| 1418 | /* | ||
| 1419 | * Factorization helper for the command state machine: | ||
| 1404 | * Finish the command. | 1420 | * Finish the command. |
| 1405 | */ | 1421 | */ |
| 1406 | static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc) | 1422 | static void ub_state_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd, int rc) |
| @@ -1426,7 +1442,7 @@ static int __ub_state_stat(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1426 | sc->last_pipe = sc->recv_bulk_pipe; | 1442 | sc->last_pipe = sc->recv_bulk_pipe; |
| 1427 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, | 1443 | usb_fill_bulk_urb(&sc->work_urb, sc->dev, sc->recv_bulk_pipe, |
| 1428 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); | 1444 | &sc->work_bcs, US_BULK_CS_WRAP_LEN, ub_urb_complete, sc); |
| 1429 | sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | 1445 | sc->work_urb.transfer_flags = 0; |
| 1430 | sc->work_urb.actual_length = 0; | 1446 | sc->work_urb.actual_length = 0; |
| 1431 | sc->work_urb.error_count = 0; | 1447 | sc->work_urb.error_count = 0; |
| 1432 | sc->work_urb.status = 0; | 1448 | sc->work_urb.status = 0; |
| @@ -1484,6 +1500,7 @@ static void ub_state_stat_counted(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1484 | static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | 1500 | static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) |
| 1485 | { | 1501 | { |
| 1486 | struct ub_scsi_cmd *scmd; | 1502 | struct ub_scsi_cmd *scmd; |
| 1503 | struct scatterlist *sg; | ||
| 1487 | int rc; | 1504 | int rc; |
| 1488 | 1505 | ||
| 1489 | if (cmd->cdb[0] == REQUEST_SENSE) { | 1506 | if (cmd->cdb[0] == REQUEST_SENSE) { |
| @@ -1492,12 +1509,17 @@ static void ub_state_sense(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
| 1492 | } | 1509 | } |
| 1493 | 1510 | ||
| 1494 | scmd = &sc->top_rqs_cmd; | 1511 | scmd = &sc->top_rqs_cmd; |
| 1512 | memset(scmd, 0, sizeof(struct ub_scsi_cmd)); | ||
| 1495 | scmd->cdb[0] = REQUEST_SENSE; | 1513 | scmd->cdb[0] = REQUEST_SENSE; |
| 1496 | scmd->cdb[4] = UB_SENSE_SIZE; | 1514 | scmd->cdb[4] = UB_SENSE_SIZE; |
| 1497 | scmd->cdb_len = 6; | 1515 | scmd->cdb_len = 6; |
| 1498 | scmd->dir = UB_DIR_READ; | 1516 | scmd->dir = UB_DIR_READ; |
| 1499 | scmd->state = UB_CMDST_INIT; | 1517 | scmd->state = UB_CMDST_INIT; |
| 1500 | scmd->data = sc->top_sense; | 1518 | scmd->nsg = 1; |
| 1519 | sg = &scmd->sgv[0]; | ||
| 1520 | sg->page = virt_to_page(sc->top_sense); | ||
| 1521 | sg->offset = (unsigned int)sc->top_sense & (PAGE_SIZE-1); | ||
| 1522 | sg->length = UB_SENSE_SIZE; | ||
| 1501 | scmd->len = UB_SENSE_SIZE; | 1523 | scmd->len = UB_SENSE_SIZE; |
| 1502 | scmd->lun = cmd->lun; | 1524 | scmd->lun = cmd->lun; |
| 1503 | scmd->done = ub_top_sense_done; | 1525 | scmd->done = ub_top_sense_done; |
| @@ -1541,7 +1563,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
| 1541 | 1563 | ||
| 1542 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, | 1564 | usb_fill_control_urb(&sc->work_urb, sc->dev, sc->send_ctrl_pipe, |
| 1543 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); | 1565 | (unsigned char*) cr, NULL, 0, ub_urb_complete, sc); |
| 1544 | sc->work_urb.transfer_flags = URB_ASYNC_UNLINK; | 1566 | sc->work_urb.transfer_flags = 0; |
| 1545 | sc->work_urb.actual_length = 0; | 1567 | sc->work_urb.actual_length = 0; |
| 1546 | sc->work_urb.error_count = 0; | 1568 | sc->work_urb.error_count = 0; |
| 1547 | sc->work_urb.status = 0; | 1569 | sc->work_urb.status = 0; |
| @@ -1560,7 +1582,7 @@ static int ub_submit_clear_stall(struct ub_dev *sc, struct ub_scsi_cmd *cmd, | |||
| 1560 | */ | 1582 | */ |
| 1561 | static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd) | 1583 | static void ub_top_sense_done(struct ub_dev *sc, struct ub_scsi_cmd *scmd) |
| 1562 | { | 1584 | { |
| 1563 | unsigned char *sense = scmd->data; | 1585 | unsigned char *sense = sc->top_sense; |
| 1564 | struct ub_scsi_cmd *cmd; | 1586 | struct ub_scsi_cmd *cmd; |
| 1565 | 1587 | ||
| 1566 | /* | 1588 | /* |
| @@ -1852,6 +1874,7 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | |||
| 1852 | struct ub_capacity *ret) | 1874 | struct ub_capacity *ret) |
| 1853 | { | 1875 | { |
| 1854 | struct ub_scsi_cmd *cmd; | 1876 | struct ub_scsi_cmd *cmd; |
| 1877 | struct scatterlist *sg; | ||
| 1855 | char *p; | 1878 | char *p; |
| 1856 | enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 }; | 1879 | enum { ALLOC_SIZE = sizeof(struct ub_scsi_cmd) + 8 }; |
| 1857 | unsigned long flags; | 1880 | unsigned long flags; |
| @@ -1872,7 +1895,11 @@ static int ub_sync_read_cap(struct ub_dev *sc, struct ub_lun *lun, | |||
| 1872 | cmd->cdb_len = 10; | 1895 | cmd->cdb_len = 10; |
| 1873 | cmd->dir = UB_DIR_READ; | 1896 | cmd->dir = UB_DIR_READ; |
| 1874 | cmd->state = UB_CMDST_INIT; | 1897 | cmd->state = UB_CMDST_INIT; |
| 1875 | cmd->data = p; | 1898 | cmd->nsg = 1; |
| 1899 | sg = &cmd->sgv[0]; | ||
| 1900 | sg->page = virt_to_page(p); | ||
| 1901 | sg->offset = (unsigned int)p & (PAGE_SIZE-1); | ||
| 1902 | sg->length = 8; | ||
| 1876 | cmd->len = 8; | 1903 | cmd->len = 8; |
| 1877 | cmd->lun = lun; | 1904 | cmd->lun = lun; |
| 1878 | cmd->done = ub_probe_done; | 1905 | cmd->done = ub_probe_done; |
| @@ -2289,7 +2316,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum) | |||
| 2289 | disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */ | 2316 | disk->driverfs_dev = &sc->intf->dev; /* XXX Many to one ok? */ |
| 2290 | 2317 | ||
| 2291 | rc = -ENOMEM; | 2318 | rc = -ENOMEM; |
| 2292 | if ((q = blk_init_queue(ub_bd_rq_fn, &sc->lock)) == NULL) | 2319 | if ((q = blk_init_queue(ub_request_fn, &sc->lock)) == NULL) |
| 2293 | goto err_blkqinit; | 2320 | goto err_blkqinit; |
| 2294 | 2321 | ||
| 2295 | disk->queue = q; | 2322 | disk->queue = q; |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 2bc9d64db106..c29365d5b524 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
| @@ -80,7 +80,7 @@ config SERIAL_NONSTANDARD | |||
| 80 | 80 | ||
| 81 | config COMPUTONE | 81 | config COMPUTONE |
| 82 | tristate "Computone IntelliPort Plus serial support" | 82 | tristate "Computone IntelliPort Plus serial support" |
| 83 | depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP && (BROKEN || !SPARC32) | 83 | depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP |
| 84 | ---help--- | 84 | ---help--- |
| 85 | This driver supports the entire family of Intelliport II/Plus | 85 | This driver supports the entire family of Intelliport II/Plus |
| 86 | controllers with the exception of the MicroChannel controllers and | 86 | controllers with the exception of the MicroChannel controllers and |
| @@ -208,7 +208,7 @@ config SYNCLINK | |||
| 208 | 208 | ||
| 209 | config SYNCLINKMP | 209 | config SYNCLINKMP |
| 210 | tristate "SyncLink Multiport support" | 210 | tristate "SyncLink Multiport support" |
| 211 | depends on SERIAL_NONSTANDARD && (BROKEN || !SPARC32) | 211 | depends on SERIAL_NONSTANDARD |
| 212 | help | 212 | help |
| 213 | Enable support for the SyncLink Multiport (2 or 4 ports) | 213 | Enable support for the SyncLink Multiport (2 or 4 ports) |
| 214 | serial adapter, running asynchronous and HDLC communications up | 214 | serial adapter, running asynchronous and HDLC communications up |
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 59f589d733f9..0a7624a9b1c1 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
| @@ -429,7 +429,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev) | |||
| 429 | struct pci_dev *dev1; | 429 | struct pci_dev *dev1; |
| 430 | int i; | 430 | int i; |
| 431 | unsigned size = amd64_fetch_size(); | 431 | unsigned size = amd64_fetch_size(); |
| 432 | printk(KERN_INFO "Setting up ULi AGP. \n"); | 432 | printk(KERN_INFO "Setting up ULi AGP.\n"); |
| 433 | dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0)); | 433 | dev1 = pci_find_slot ((unsigned int)pdev->bus->number,PCI_DEVFN(0,0)); |
| 434 | if (dev1 == NULL) { | 434 | if (dev1 == NULL) { |
| 435 | printk(KERN_INFO PFX "Detected a ULi chipset, " | 435 | printk(KERN_INFO PFX "Detected a ULi chipset, " |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index f0079e991bdc..ac9da0ca36b7 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -319,7 +319,6 @@ int agp_copy_info(struct agp_bridge_data *bridge, struct agp_kern_info *info) | |||
| 319 | info->mode = bridge->mode & ~AGP3_RESERVED_MASK; | 319 | info->mode = bridge->mode & ~AGP3_RESERVED_MASK; |
| 320 | else | 320 | else |
| 321 | info->mode = bridge->mode & ~AGP2_RESERVED_MASK; | 321 | info->mode = bridge->mode & ~AGP2_RESERVED_MASK; |
| 322 | info->mode = bridge->mode; | ||
| 323 | info->aper_base = bridge->gart_bus_addr; | 322 | info->aper_base = bridge->gart_bus_addr; |
| 324 | info->aper_size = agp_return_size(); | 323 | info->aper_size = agp_return_size(); |
| 325 | info->max_memory = bridge->max_memory_agp; | 324 | info->max_memory = bridge->max_memory_agp; |
| @@ -356,7 +355,7 @@ int agp_bind_memory(struct agp_memory *curr, off_t pg_start) | |||
| 356 | return -EINVAL; | 355 | return -EINVAL; |
| 357 | 356 | ||
| 358 | if (curr->is_bound == TRUE) { | 357 | if (curr->is_bound == TRUE) { |
| 359 | printk (KERN_INFO PFX "memory %p is already bound!\n", curr); | 358 | printk(KERN_INFO PFX "memory %p is already bound!\n", curr); |
| 360 | return -EINVAL; | 359 | return -EINVAL; |
| 361 | } | 360 | } |
| 362 | if (curr->is_flushed == FALSE) { | 361 | if (curr->is_flushed == FALSE) { |
| @@ -391,7 +390,7 @@ int agp_unbind_memory(struct agp_memory *curr) | |||
| 391 | return -EINVAL; | 390 | return -EINVAL; |
| 392 | 391 | ||
| 393 | if (curr->is_bound != TRUE) { | 392 | if (curr->is_bound != TRUE) { |
| 394 | printk (KERN_INFO PFX "memory %p was not bound!\n", curr); | 393 | printk(KERN_INFO PFX "memory %p was not bound!\n", curr); |
| 395 | return -EINVAL; | 394 | return -EINVAL; |
| 396 | } | 395 | } |
| 397 | 396 | ||
| @@ -415,7 +414,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 415 | u32 tmp; | 414 | u32 tmp; |
| 416 | 415 | ||
| 417 | if (*requested_mode & AGP2_RESERVED_MASK) { | 416 | if (*requested_mode & AGP2_RESERVED_MASK) { |
| 418 | printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | 417 | printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); |
| 419 | *requested_mode &= ~AGP2_RESERVED_MASK; | 418 | *requested_mode &= ~AGP2_RESERVED_MASK; |
| 420 | } | 419 | } |
| 421 | 420 | ||
| @@ -423,7 +422,7 @@ static void agp_v2_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 423 | tmp = *requested_mode & 7; | 422 | tmp = *requested_mode & 7; |
| 424 | switch (tmp) { | 423 | switch (tmp) { |
| 425 | case 0: | 424 | case 0: |
| 426 | printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm); | 425 | printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to x1 mode.\n", current->comm); |
| 427 | *requested_mode |= AGPSTAT2_1X; | 426 | *requested_mode |= AGPSTAT2_1X; |
| 428 | break; | 427 | break; |
| 429 | case 1: | 428 | case 1: |
| @@ -493,18 +492,18 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 493 | u32 tmp; | 492 | u32 tmp; |
| 494 | 493 | ||
| 495 | if (*requested_mode & AGP3_RESERVED_MASK) { | 494 | if (*requested_mode & AGP3_RESERVED_MASK) { |
| 496 | printk (KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); | 495 | printk(KERN_INFO PFX "reserved bits set in mode 0x%x. Fixed.\n", *requested_mode); |
| 497 | *requested_mode &= ~AGP3_RESERVED_MASK; | 496 | *requested_mode &= ~AGP3_RESERVED_MASK; |
| 498 | } | 497 | } |
| 499 | 498 | ||
| 500 | /* Check the speed bits make sense. */ | 499 | /* Check the speed bits make sense. */ |
| 501 | tmp = *requested_mode & 7; | 500 | tmp = *requested_mode & 7; |
| 502 | if (tmp == 0) { | 501 | if (tmp == 0) { |
| 503 | printk (KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm); | 502 | printk(KERN_INFO PFX "%s tried to set rate=x0. Setting to AGP3 x4 mode.\n", current->comm); |
| 504 | *requested_mode |= AGPSTAT3_4X; | 503 | *requested_mode |= AGPSTAT3_4X; |
| 505 | } | 504 | } |
| 506 | if (tmp >= 3) { | 505 | if (tmp >= 3) { |
| 507 | printk (KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4); | 506 | printk(KERN_INFO PFX "%s tried to set rate=x%d. Setting to AGP3 x8 mode.\n", current->comm, tmp * 4); |
| 508 | *requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X; | 507 | *requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X; |
| 509 | } | 508 | } |
| 510 | 509 | ||
| @@ -533,7 +532,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 533 | * AGP2.x 4x -> AGP3.0 4x. | 532 | * AGP2.x 4x -> AGP3.0 4x. |
| 534 | */ | 533 | */ |
| 535 | if (*requested_mode & AGPSTAT2_4X) { | 534 | if (*requested_mode & AGPSTAT2_4X) { |
| 536 | printk (KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", | 535 | printk(KERN_INFO PFX "%s passes broken AGP3 flags (%x). Fixed.\n", |
| 537 | current->comm, *requested_mode); | 536 | current->comm, *requested_mode); |
| 538 | *requested_mode &= ~AGPSTAT2_4X; | 537 | *requested_mode &= ~AGPSTAT2_4X; |
| 539 | *requested_mode |= AGPSTAT3_4X; | 538 | *requested_mode |= AGPSTAT3_4X; |
| @@ -544,7 +543,7 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 544 | * but have been passed an AGP 2.x mode. | 543 | * but have been passed an AGP 2.x mode. |
| 545 | * Convert AGP 1x,2x,4x -> AGP 3.0 4x. | 544 | * Convert AGP 1x,2x,4x -> AGP 3.0 4x. |
| 546 | */ | 545 | */ |
| 547 | printk (KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", | 546 | printk(KERN_INFO PFX "%s passes broken AGP2 flags (%x) in AGP3 mode. Fixed.\n", |
| 548 | current->comm, *requested_mode); | 547 | current->comm, *requested_mode); |
| 549 | *requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X); | 548 | *requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X); |
| 550 | *requested_mode |= AGPSTAT3_4X; | 549 | *requested_mode |= AGPSTAT3_4X; |
| @@ -554,13 +553,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 554 | if (!(*bridge_agpstat & AGPSTAT3_8X)) { | 553 | if (!(*bridge_agpstat & AGPSTAT3_8X)) { |
| 555 | *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); | 554 | *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); |
| 556 | *bridge_agpstat |= AGPSTAT3_4X; | 555 | *bridge_agpstat |= AGPSTAT3_4X; |
| 557 | printk ("%s requested AGPx8 but bridge not capable.\n", current->comm); | 556 | printk(KERN_INFO PFX "%s requested AGPx8 but bridge not capable.\n", current->comm); |
| 558 | return; | 557 | return; |
| 559 | } | 558 | } |
| 560 | if (!(*vga_agpstat & AGPSTAT3_8X)) { | 559 | if (!(*vga_agpstat & AGPSTAT3_8X)) { |
| 561 | *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); | 560 | *bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD); |
| 562 | *bridge_agpstat |= AGPSTAT3_4X; | 561 | *bridge_agpstat |= AGPSTAT3_4X; |
| 563 | printk ("%s requested AGPx8 but graphic card not capable.\n", current->comm); | 562 | printk(KERN_INFO PFX "%s requested AGPx8 but graphic card not capable.\n", current->comm); |
| 564 | return; | 563 | return; |
| 565 | } | 564 | } |
| 566 | /* All set, bridge & device can do AGP x8*/ | 565 | /* All set, bridge & device can do AGP x8*/ |
| @@ -578,13 +577,13 @@ static void agp_v3_parse_one(u32 *requested_mode, u32 *bridge_agpstat, u32 *vga_ | |||
| 578 | if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X)) | 577 | if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X)) |
| 579 | *bridge_agpstat |= AGPSTAT3_4X; | 578 | *bridge_agpstat |= AGPSTAT3_4X; |
| 580 | else { | 579 | else { |
| 581 | printk (KERN_INFO PFX "Badness. Don't know which AGP mode to set. " | 580 | printk(KERN_INFO PFX "Badness. Don't know which AGP mode to set. " |
| 582 | "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n", | 581 | "[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n", |
| 583 | origbridge, origvga, *bridge_agpstat, *vga_agpstat); | 582 | origbridge, origvga, *bridge_agpstat, *vga_agpstat); |
| 584 | if (!(*bridge_agpstat & AGPSTAT3_4X)) | 583 | if (!(*bridge_agpstat & AGPSTAT3_4X)) |
| 585 | printk (KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); | 584 | printk(KERN_INFO PFX "Bridge couldn't do AGP x4.\n"); |
| 586 | if (!(*vga_agpstat & AGPSTAT3_4X)) | 585 | if (!(*vga_agpstat & AGPSTAT3_4X)) |
| 587 | printk (KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); | 586 | printk(KERN_INFO PFX "Graphic card couldn't do AGP x4.\n"); |
| 588 | return; | 587 | return; |
| 589 | } | 588 | } |
| 590 | } | 589 | } |
| @@ -622,7 +621,7 @@ u32 agp_collect_device_status(struct agp_bridge_data *bridge, u32 requested_mode | |||
| 622 | for (;;) { | 621 | for (;;) { |
| 623 | device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device); | 622 | device = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, device); |
| 624 | if (!device) { | 623 | if (!device) { |
| 625 | printk (KERN_INFO PFX "Couldn't find an AGP VGA controller.\n"); | 624 | printk(KERN_INFO PFX "Couldn't find an AGP VGA controller.\n"); |
| 626 | return 0; | 625 | return 0; |
| 627 | } | 626 | } |
| 628 | cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP); | 627 | cap_ptr = pci_find_capability(device, PCI_CAP_ID_AGP); |
| @@ -734,7 +733,7 @@ void agp_generic_enable(struct agp_bridge_data *bridge, u32 requested_mode) | |||
| 734 | pci_write_config_dword(bridge->dev, | 733 | pci_write_config_dword(bridge->dev, |
| 735 | bridge->capndx+AGPCTRL, temp); | 734 | bridge->capndx+AGPCTRL, temp); |
| 736 | 735 | ||
| 737 | printk (KERN_INFO PFX "Device is in legacy mode," | 736 | printk(KERN_INFO PFX "Device is in legacy mode," |
| 738 | " falling back to 2.x\n"); | 737 | " falling back to 2.x\n"); |
| 739 | } | 738 | } |
| 740 | } | 739 | } |
diff --git a/drivers/char/drm/drmP.h b/drivers/char/drm/drmP.h index 6f98701dfe15..121cc85f347e 100644 --- a/drivers/char/drm/drmP.h +++ b/drivers/char/drm/drmP.h | |||
| @@ -1071,5 +1071,9 @@ extern void *drm_calloc(size_t nmemb, size_t size, int area); | |||
| 1071 | extern unsigned long drm_core_get_map_ofs(drm_map_t *map); | 1071 | extern unsigned long drm_core_get_map_ofs(drm_map_t *map); |
| 1072 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); | 1072 | extern unsigned long drm_core_get_reg_ofs(struct drm_device *dev); |
| 1073 | 1073 | ||
| 1074 | #ifndef pci_pretty_name | ||
| 1075 | #define pci_pretty_name(dev) "" | ||
| 1076 | #endif | ||
| 1077 | |||
| 1074 | #endif /* __KERNEL__ */ | 1078 | #endif /* __KERNEL__ */ |
| 1075 | #endif | 1079 | #endif |
diff --git a/drivers/char/ip2main.c b/drivers/char/ip2main.c index cf0cd58d6305..066d7b5cb76d 100644 --- a/drivers/char/ip2main.c +++ b/drivers/char/ip2main.c | |||
| @@ -120,7 +120,6 @@ | |||
| 120 | 120 | ||
| 121 | #include <linux/vmalloc.h> | 121 | #include <linux/vmalloc.h> |
| 122 | #include <linux/init.h> | 122 | #include <linux/init.h> |
| 123 | #include <asm/serial.h> | ||
| 124 | 123 | ||
| 125 | #include <asm/uaccess.h> | 124 | #include <asm/uaccess.h> |
| 126 | 125 | ||
diff --git a/drivers/char/synclinkmp.c b/drivers/char/synclinkmp.c index ec949e4c070f..8982eafd0fb7 100644 --- a/drivers/char/synclinkmp.c +++ b/drivers/char/synclinkmp.c | |||
| @@ -55,7 +55,6 @@ | |||
| 55 | #include <linux/netdevice.h> | 55 | #include <linux/netdevice.h> |
| 56 | #include <linux/vmalloc.h> | 56 | #include <linux/vmalloc.h> |
| 57 | #include <linux/init.h> | 57 | #include <linux/init.h> |
| 58 | #include <asm/serial.h> | ||
| 59 | #include <linux/delay.h> | 58 | #include <linux/delay.h> |
| 60 | #include <linux/ioctl.h> | 59 | #include <linux/ioctl.h> |
| 61 | 60 | ||
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 10b014982381..109d62ccf651 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
| @@ -627,7 +627,7 @@ static int cpufreq_add_dev (struct sys_device * sys_dev) | |||
| 627 | 627 | ||
| 628 | ret = kobject_register(&policy->kobj); | 628 | ret = kobject_register(&policy->kobj); |
| 629 | if (ret) | 629 | if (ret) |
| 630 | goto err_out; | 630 | goto err_out_driver_exit; |
| 631 | 631 | ||
| 632 | /* set up files for this cpu device */ | 632 | /* set up files for this cpu device */ |
| 633 | drv_attr = cpufreq_driver->attr; | 633 | drv_attr = cpufreq_driver->attr; |
| @@ -673,6 +673,10 @@ err_out_unregister: | |||
| 673 | kobject_unregister(&policy->kobj); | 673 | kobject_unregister(&policy->kobj); |
| 674 | wait_for_completion(&policy->kobj_unregister); | 674 | wait_for_completion(&policy->kobj_unregister); |
| 675 | 675 | ||
| 676 | err_out_driver_exit: | ||
| 677 | if (cpufreq_driver->exit) | ||
| 678 | cpufreq_driver->exit(policy); | ||
| 679 | |||
| 676 | err_out: | 680 | err_out: |
| 677 | kfree(policy); | 681 | kfree(policy); |
| 678 | 682 | ||
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 6e9da1372225..8334496a7e0a 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -144,6 +144,22 @@ config I2C_I810 | |||
| 144 | This driver can also be built as a module. If so, the module | 144 | This driver can also be built as a module. If so, the module |
| 145 | will be called i2c-i810. | 145 | will be called i2c-i810. |
| 146 | 146 | ||
| 147 | config I2C_PXA | ||
| 148 | tristate "Intel PXA2XX I2C adapter (EXPERIMENTAL)" | ||
| 149 | depends on I2C && EXPERIMENTAL && ARCH_PXA | ||
| 150 | help | ||
| 151 | If you have devices in the PXA I2C bus, say yes to this option. | ||
| 152 | This driver can also be built as a module. If so, the module | ||
| 153 | will be called i2c-pxa. | ||
| 154 | |||
| 155 | config I2C_PXA_SLAVE | ||
| 156 | bool "Intel PXA2XX I2C Slave comms support" | ||
| 157 | depends on I2C_PXA | ||
| 158 | help | ||
| 159 | Support I2C slave mode communications on the PXA I2C bus. This | ||
| 160 | is necessary for systems where the PXA may be a target on the | ||
| 161 | I2C bus. | ||
| 162 | |||
| 147 | config I2C_PIIX4 | 163 | config I2C_PIIX4 |
| 148 | tristate "Intel PIIX4" | 164 | tristate "Intel PIIX4" |
| 149 | depends on I2C && PCI | 165 | depends on I2C && PCI |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 42d6d814da72..980b3e983670 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -28,6 +28,7 @@ obj-$(CONFIG_I2C_PARPORT_LIGHT) += i2c-parport-light.o | |||
| 28 | obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o | 28 | obj-$(CONFIG_I2C_PCA_ISA) += i2c-pca-isa.o |
| 29 | obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o | 29 | obj-$(CONFIG_I2C_PIIX4) += i2c-piix4.o |
| 30 | obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o | 30 | obj-$(CONFIG_I2C_PROSAVAGE) += i2c-prosavage.o |
| 31 | obj-$(CONFIG_I2C_PXA) += i2c-pxa.o | ||
| 31 | obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o | 32 | obj-$(CONFIG_I2C_RPXLITE) += i2c-rpx.o |
| 32 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o | 33 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o |
| 33 | obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o | 34 | obj-$(CONFIG_I2C_SAVAGE4) += i2c-savage4.o |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c new file mode 100644 index 000000000000..fdf53ce04248 --- /dev/null +++ b/drivers/i2c/busses/i2c-pxa.c | |||
| @@ -0,0 +1,1022 @@ | |||
| 1 | /* | ||
| 2 | * i2c_adap_pxa.c | ||
| 3 | * | ||
| 4 | * I2C adapter for the PXA I2C bus access. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2002 Intrinsyc Software Inc. | ||
| 7 | * Copyright (C) 2004-2005 Deep Blue Solutions Ltd. | ||
| 8 | * | ||
| 9 | * This program is free software; you can redistribute it and/or modify | ||
| 10 | * it under the terms of the GNU General Public License version 2 as | ||
| 11 | * published by the Free Software Foundation. | ||
| 12 | * | ||
| 13 | * History: | ||
| 14 | * Apr 2002: Initial version [CS] | ||
| 15 | * Jun 2002: Properly seperated algo/adap [FB] | ||
| 16 | * Jan 2003: Fixed several bugs concerning interrupt handling [Kai-Uwe Bloem] | ||
| 17 | * Jan 2003: added limited signal handling [Kai-Uwe Bloem] | ||
| 18 | * Sep 2004: Major rework to ensure efficient bus handling [RMK] | ||
| 19 | * Dec 2004: Added support for PXA27x and slave device probing [Liam Girdwood] | ||
| 20 | * Feb 2005: Rework slave mode handling [RMK] | ||
| 21 | */ | ||
| 22 | #include <linux/kernel.h> | ||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/i2c.h> | ||
| 25 | #include <linux/i2c-id.h> | ||
| 26 | #include <linux/init.h> | ||
| 27 | #include <linux/time.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/delay.h> | ||
| 30 | #include <linux/errno.h> | ||
| 31 | #include <linux/interrupt.h> | ||
| 32 | #include <linux/i2c-pxa.h> | ||
| 33 | |||
| 34 | #include <asm/hardware.h> | ||
| 35 | #include <asm/irq.h> | ||
| 36 | #include <asm/arch/i2c.h> | ||
| 37 | #include <asm/arch/pxa-regs.h> | ||
| 38 | |||
| 39 | struct pxa_i2c { | ||
| 40 | spinlock_t lock; | ||
| 41 | wait_queue_head_t wait; | ||
| 42 | struct i2c_msg *msg; | ||
| 43 | unsigned int msg_num; | ||
| 44 | unsigned int msg_idx; | ||
| 45 | unsigned int msg_ptr; | ||
| 46 | unsigned int slave_addr; | ||
| 47 | |||
| 48 | struct i2c_adapter adap; | ||
| 49 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 50 | struct i2c_slave_client *slave; | ||
| 51 | #endif | ||
| 52 | |||
| 53 | unsigned int irqlogidx; | ||
| 54 | u32 isrlog[32]; | ||
| 55 | u32 icrlog[32]; | ||
| 56 | }; | ||
| 57 | |||
| 58 | /* | ||
| 59 | * I2C Slave mode address | ||
| 60 | */ | ||
| 61 | #define I2C_PXA_SLAVE_ADDR 0x1 | ||
| 62 | |||
| 63 | #ifdef DEBUG | ||
| 64 | |||
| 65 | struct bits { | ||
| 66 | u32 mask; | ||
| 67 | const char *set; | ||
| 68 | const char *unset; | ||
| 69 | }; | ||
| 70 | #define BIT(m, s, u) { .mask = m, .set = s, .unset = u } | ||
| 71 | |||
| 72 | static inline void | ||
| 73 | decode_bits(const char *prefix, const struct bits *bits, int num, u32 val) | ||
| 74 | { | ||
| 75 | printk("%s %08x: ", prefix, val); | ||
| 76 | while (num--) { | ||
| 77 | const char *str = val & bits->mask ? bits->set : bits->unset; | ||
| 78 | if (str) | ||
| 79 | printk("%s ", str); | ||
| 80 | bits++; | ||
| 81 | } | ||
| 82 | } | ||
| 83 | |||
| 84 | static const struct bits isr_bits[] = { | ||
| 85 | BIT(ISR_RWM, "RX", "TX"), | ||
| 86 | BIT(ISR_ACKNAK, "NAK", "ACK"), | ||
| 87 | BIT(ISR_UB, "Bsy", "Rdy"), | ||
| 88 | BIT(ISR_IBB, "BusBsy", "BusRdy"), | ||
| 89 | BIT(ISR_SSD, "SlaveStop", NULL), | ||
| 90 | BIT(ISR_ALD, "ALD", NULL), | ||
| 91 | BIT(ISR_ITE, "TxEmpty", NULL), | ||
| 92 | BIT(ISR_IRF, "RxFull", NULL), | ||
| 93 | BIT(ISR_GCAD, "GenCall", NULL), | ||
| 94 | BIT(ISR_SAD, "SlaveAddr", NULL), | ||
| 95 | BIT(ISR_BED, "BusErr", NULL), | ||
| 96 | }; | ||
| 97 | |||
| 98 | static void decode_ISR(unsigned int val) | ||
| 99 | { | ||
| 100 | decode_bits(KERN_DEBUG "ISR", isr_bits, ARRAY_SIZE(isr_bits), val); | ||
| 101 | printk("\n"); | ||
| 102 | } | ||
| 103 | |||
| 104 | static const struct bits icr_bits[] = { | ||
| 105 | BIT(ICR_START, "START", NULL), | ||
| 106 | BIT(ICR_STOP, "STOP", NULL), | ||
| 107 | BIT(ICR_ACKNAK, "ACKNAK", NULL), | ||
| 108 | BIT(ICR_TB, "TB", NULL), | ||
| 109 | BIT(ICR_MA, "MA", NULL), | ||
| 110 | BIT(ICR_SCLE, "SCLE", "scle"), | ||
| 111 | BIT(ICR_IUE, "IUE", "iue"), | ||
| 112 | BIT(ICR_GCD, "GCD", NULL), | ||
| 113 | BIT(ICR_ITEIE, "ITEIE", NULL), | ||
| 114 | BIT(ICR_IRFIE, "IRFIE", NULL), | ||
| 115 | BIT(ICR_BEIE, "BEIE", NULL), | ||
| 116 | BIT(ICR_SSDIE, "SSDIE", NULL), | ||
| 117 | BIT(ICR_ALDIE, "ALDIE", NULL), | ||
| 118 | BIT(ICR_SADIE, "SADIE", NULL), | ||
| 119 | BIT(ICR_UR, "UR", "ur"), | ||
| 120 | }; | ||
| 121 | |||
| 122 | static void decode_ICR(unsigned int val) | ||
| 123 | { | ||
| 124 | decode_bits(KERN_DEBUG "ICR", icr_bits, ARRAY_SIZE(icr_bits), val); | ||
| 125 | printk("\n"); | ||
| 126 | } | ||
| 127 | |||
| 128 | static unsigned int i2c_debug = DEBUG; | ||
| 129 | |||
| 130 | static void i2c_pxa_show_state(struct pxa_i2c *i2c, int lno, const char *fname) | ||
| 131 | { | ||
| 132 | dev_dbg(&i2c->adap.dev, "state:%s:%d: ISR=%08x, ICR=%08x, IBMR=%02x\n", fname, lno, ISR, ICR, IBMR); | ||
| 133 | } | ||
| 134 | |||
| 135 | #define show_state(i2c) i2c_pxa_show_state(i2c, __LINE__, __FUNCTION__) | ||
| 136 | #else | ||
| 137 | #define i2c_debug 0 | ||
| 138 | |||
| 139 | #define show_state(i2c) do { } while (0) | ||
| 140 | #define decode_ISR(val) do { } while (0) | ||
| 141 | #define decode_ICR(val) do { } while (0) | ||
| 142 | #endif | ||
| 143 | |||
| 144 | #define eedbg(lvl, x...) do { if ((lvl) < 1) { printk(KERN_DEBUG "" x); } } while(0) | ||
| 145 | |||
| 146 | static void i2c_pxa_master_complete(struct pxa_i2c *i2c, int ret); | ||
| 147 | |||
| 148 | static void i2c_pxa_scream_blue_murder(struct pxa_i2c *i2c, const char *why) | ||
| 149 | { | ||
| 150 | unsigned int i; | ||
| 151 | printk("i2c: error: %s\n", why); | ||
| 152 | printk("i2c: msg_num: %d msg_idx: %d msg_ptr: %d\n", | ||
| 153 | i2c->msg_num, i2c->msg_idx, i2c->msg_ptr); | ||
| 154 | printk("i2c: ICR: %08x ISR: %08x\n" | ||
| 155 | "i2c: log: ", ICR, ISR); | ||
| 156 | for (i = 0; i < i2c->irqlogidx; i++) | ||
| 157 | printk("[%08x:%08x] ", i2c->isrlog[i], i2c->icrlog[i]); | ||
| 158 | printk("\n"); | ||
| 159 | } | ||
| 160 | |||
| 161 | static inline int i2c_pxa_is_slavemode(struct pxa_i2c *i2c) | ||
| 162 | { | ||
| 163 | return !(ICR & ICR_SCLE); | ||
| 164 | } | ||
| 165 | |||
| 166 | static void i2c_pxa_abort(struct pxa_i2c *i2c) | ||
| 167 | { | ||
| 168 | unsigned long timeout = jiffies + HZ/4; | ||
| 169 | |||
| 170 | if (i2c_pxa_is_slavemode(i2c)) { | ||
| 171 | dev_dbg(&i2c->adap.dev, "%s: called in slave mode\n", __func__); | ||
| 172 | return; | ||
| 173 | } | ||
| 174 | |||
| 175 | while (time_before(jiffies, timeout) && (IBMR & 0x1) == 0) { | ||
| 176 | unsigned long icr = ICR; | ||
| 177 | |||
| 178 | icr &= ~ICR_START; | ||
| 179 | icr |= ICR_ACKNAK | ICR_STOP | ICR_TB; | ||
| 180 | |||
| 181 | ICR = icr; | ||
| 182 | |||
| 183 | show_state(i2c); | ||
| 184 | |||
| 185 | msleep(1); | ||
| 186 | } | ||
| 187 | |||
| 188 | ICR &= ~(ICR_MA | ICR_START | ICR_STOP); | ||
| 189 | } | ||
| 190 | |||
| 191 | static int i2c_pxa_wait_bus_not_busy(struct pxa_i2c *i2c) | ||
| 192 | { | ||
| 193 | int timeout = DEF_TIMEOUT; | ||
| 194 | |||
| 195 | while (timeout-- && ISR & (ISR_IBB | ISR_UB)) { | ||
| 196 | if ((ISR & ISR_SAD) != 0) | ||
| 197 | timeout += 4; | ||
| 198 | |||
| 199 | msleep(2); | ||
| 200 | show_state(i2c); | ||
| 201 | } | ||
| 202 | |||
| 203 | if (timeout <= 0) | ||
| 204 | show_state(i2c); | ||
| 205 | |||
| 206 | return timeout <= 0 ? I2C_RETRY : 0; | ||
| 207 | } | ||
| 208 | |||
| 209 | static int i2c_pxa_wait_master(struct pxa_i2c *i2c) | ||
| 210 | { | ||
| 211 | unsigned long timeout = jiffies + HZ*4; | ||
| 212 | |||
| 213 | while (time_before(jiffies, timeout)) { | ||
| 214 | if (i2c_debug > 1) | ||
| 215 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", | ||
| 216 | __func__, (long)jiffies, ISR, ICR, IBMR); | ||
| 217 | |||
| 218 | if (ISR & ISR_SAD) { | ||
| 219 | if (i2c_debug > 0) | ||
| 220 | dev_dbg(&i2c->adap.dev, "%s: Slave detected\n", __func__); | ||
| 221 | goto out; | ||
| 222 | } | ||
| 223 | |||
| 224 | /* wait for unit and bus being not busy, and we also do a | ||
| 225 | * quick check of the i2c lines themselves to ensure they've | ||
| 226 | * gone high... | ||
| 227 | */ | ||
| 228 | if ((ISR & (ISR_UB | ISR_IBB)) == 0 && IBMR == 3) { | ||
| 229 | if (i2c_debug > 0) | ||
| 230 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); | ||
| 231 | return 1; | ||
| 232 | } | ||
| 233 | |||
| 234 | msleep(1); | ||
| 235 | } | ||
| 236 | |||
| 237 | if (i2c_debug > 0) | ||
| 238 | dev_dbg(&i2c->adap.dev, "%s: did not free\n", __func__); | ||
| 239 | out: | ||
| 240 | return 0; | ||
| 241 | } | ||
| 242 | |||
| 243 | static int i2c_pxa_set_master(struct pxa_i2c *i2c) | ||
| 244 | { | ||
| 245 | if (i2c_debug) | ||
| 246 | dev_dbg(&i2c->adap.dev, "setting to bus master\n"); | ||
| 247 | |||
| 248 | if ((ISR & (ISR_UB | ISR_IBB)) != 0) { | ||
| 249 | dev_dbg(&i2c->adap.dev, "%s: unit is busy\n", __func__); | ||
| 250 | if (!i2c_pxa_wait_master(i2c)) { | ||
| 251 | dev_dbg(&i2c->adap.dev, "%s: error: unit busy\n", __func__); | ||
| 252 | return I2C_RETRY; | ||
| 253 | } | ||
| 254 | } | ||
| 255 | |||
| 256 | ICR |= ICR_SCLE; | ||
| 257 | return 0; | ||
| 258 | } | ||
| 259 | |||
| 260 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 261 | static int i2c_pxa_wait_slave(struct pxa_i2c *i2c) | ||
| 262 | { | ||
| 263 | unsigned long timeout = jiffies + HZ*1; | ||
| 264 | |||
| 265 | /* wait for stop */ | ||
| 266 | |||
| 267 | show_state(i2c); | ||
| 268 | |||
| 269 | while (time_before(jiffies, timeout)) { | ||
| 270 | if (i2c_debug > 1) | ||
| 271 | dev_dbg(&i2c->adap.dev, "%s: %ld: ISR=%08x, ICR=%08x, IBMR=%02x\n", | ||
| 272 | __func__, (long)jiffies, ISR, ICR, IBMR); | ||
| 273 | |||
| 274 | if ((ISR & (ISR_UB|ISR_IBB|ISR_SAD)) == ISR_SAD || | ||
| 275 | (ICR & ICR_SCLE) == 0) { | ||
| 276 | if (i2c_debug > 1) | ||
| 277 | dev_dbg(&i2c->adap.dev, "%s: done\n", __func__); | ||
| 278 | return 1; | ||
| 279 | } | ||
| 280 | |||
| 281 | msleep(1); | ||
| 282 | } | ||
| 283 | |||
| 284 | if (i2c_debug > 0) | ||
| 285 | dev_dbg(&i2c->adap.dev, "%s: did not free\n", __func__); | ||
| 286 | return 0; | ||
| 287 | } | ||
| 288 | |||
| 289 | /* | ||
| 290 | * clear the hold on the bus, and take of anything else | ||
| 291 | * that has been configured | ||
| 292 | */ | ||
| 293 | static void i2c_pxa_set_slave(struct pxa_i2c *i2c, int errcode) | ||
| 294 | { | ||
| 295 | show_state(i2c); | ||
| 296 | |||
| 297 | if (errcode < 0) { | ||
| 298 | udelay(100); /* simple delay */ | ||
| 299 | } else { | ||
| 300 | /* we need to wait for the stop condition to end */ | ||
| 301 | |||
| 302 | /* if we where in stop, then clear... */ | ||
| 303 | if (ICR & ICR_STOP) { | ||
| 304 | udelay(100); | ||
| 305 | ICR &= ~ICR_STOP; | ||
| 306 | } | ||
| 307 | |||
| 308 | if (!i2c_pxa_wait_slave(i2c)) { | ||
| 309 | dev_err(&i2c->adap.dev, "%s: wait timedout\n", | ||
| 310 | __func__); | ||
| 311 | return; | ||
| 312 | } | ||
| 313 | } | ||
| 314 | |||
| 315 | ICR &= ~(ICR_STOP|ICR_ACKNAK|ICR_MA); | ||
| 316 | ICR &= ~ICR_SCLE; | ||
| 317 | |||
| 318 | if (i2c_debug) { | ||
| 319 | dev_dbg(&i2c->adap.dev, "ICR now %08x, ISR %08x\n", ICR, ISR); | ||
| 320 | decode_ICR(ICR); | ||
| 321 | } | ||
| 322 | } | ||
| 323 | #else | ||
| 324 | #define i2c_pxa_set_slave(i2c, err) do { } while (0) | ||
| 325 | #endif | ||
| 326 | |||
| 327 | static void i2c_pxa_reset(struct pxa_i2c *i2c) | ||
| 328 | { | ||
| 329 | pr_debug("Resetting I2C Controller Unit\n"); | ||
| 330 | |||
| 331 | /* abort any transfer currently under way */ | ||
| 332 | i2c_pxa_abort(i2c); | ||
| 333 | |||
| 334 | /* reset according to 9.8 */ | ||
| 335 | ICR = ICR_UR; | ||
| 336 | ISR = I2C_ISR_INIT; | ||
| 337 | ICR &= ~ICR_UR; | ||
| 338 | |||
| 339 | ISAR = i2c->slave_addr; | ||
| 340 | |||
| 341 | /* set control register values */ | ||
| 342 | ICR = I2C_ICR_INIT; | ||
| 343 | |||
| 344 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 345 | dev_info(&i2c->adap.dev, "Enabling slave mode\n"); | ||
| 346 | ICR |= ICR_SADIE | ICR_ALDIE | ICR_SSDIE; | ||
| 347 | #endif | ||
| 348 | |||
| 349 | i2c_pxa_set_slave(i2c, 0); | ||
| 350 | |||
| 351 | /* enable unit */ | ||
| 352 | ICR |= ICR_IUE; | ||
| 353 | udelay(100); | ||
| 354 | } | ||
| 355 | |||
| 356 | |||
| 357 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 358 | /* | ||
| 359 | * I2C EEPROM emulation. | ||
| 360 | */ | ||
| 361 | static struct i2c_eeprom_emu eeprom = { | ||
| 362 | .size = I2C_EEPROM_EMU_SIZE, | ||
| 363 | .watch = LIST_HEAD_INIT(eeprom.watch), | ||
| 364 | }; | ||
| 365 | |||
| 366 | struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void) | ||
| 367 | { | ||
| 368 | return &eeprom; | ||
| 369 | } | ||
| 370 | |||
| 371 | int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *emu, void *data, | ||
| 372 | unsigned int addr, unsigned int size, | ||
| 373 | struct i2c_eeprom_emu_watcher *watcher) | ||
| 374 | { | ||
| 375 | struct i2c_eeprom_emu_watch *watch; | ||
| 376 | unsigned long flags; | ||
| 377 | |||
| 378 | if (addr + size > emu->size) | ||
| 379 | return -EINVAL; | ||
| 380 | |||
| 381 | watch = kmalloc(sizeof(struct i2c_eeprom_emu_watch), GFP_KERNEL); | ||
| 382 | if (watch) { | ||
| 383 | watch->start = addr; | ||
| 384 | watch->end = addr + size - 1; | ||
| 385 | watch->ops = watcher; | ||
| 386 | watch->data = data; | ||
| 387 | |||
| 388 | local_irq_save(flags); | ||
| 389 | list_add(&watch->node, &emu->watch); | ||
| 390 | local_irq_restore(flags); | ||
| 391 | } | ||
| 392 | |||
| 393 | return watch ? 0 : -ENOMEM; | ||
| 394 | } | ||
| 395 | |||
| 396 | void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *emu, void *data, | ||
| 397 | struct i2c_eeprom_emu_watcher *watcher) | ||
| 398 | { | ||
| 399 | struct i2c_eeprom_emu_watch *watch, *n; | ||
| 400 | unsigned long flags; | ||
| 401 | |||
| 402 | list_for_each_entry_safe(watch, n, &emu->watch, node) { | ||
| 403 | if (watch->ops == watcher && watch->data == data) { | ||
| 404 | local_irq_save(flags); | ||
| 405 | list_del(&watch->node); | ||
| 406 | local_irq_restore(flags); | ||
| 407 | kfree(watch); | ||
| 408 | } | ||
| 409 | } | ||
| 410 | } | ||
| 411 | |||
| 412 | static void i2c_eeprom_emu_event(void *ptr, i2c_slave_event_t event) | ||
| 413 | { | ||
| 414 | struct i2c_eeprom_emu *emu = ptr; | ||
| 415 | |||
| 416 | eedbg(3, "i2c_eeprom_emu_event: %d\n", event); | ||
| 417 | |||
| 418 | switch (event) { | ||
| 419 | case I2C_SLAVE_EVENT_START_WRITE: | ||
| 420 | emu->seen_start = 1; | ||
| 421 | eedbg(2, "i2c_eeprom: write initiated\n"); | ||
| 422 | break; | ||
| 423 | |||
| 424 | case I2C_SLAVE_EVENT_START_READ: | ||
| 425 | emu->seen_start = 0; | ||
| 426 | eedbg(2, "i2c_eeprom: read initiated\n"); | ||
| 427 | break; | ||
| 428 | |||
| 429 | case I2C_SLAVE_EVENT_STOP: | ||
| 430 | emu->seen_start = 0; | ||
| 431 | eedbg(2, "i2c_eeprom: received stop\n"); | ||
| 432 | break; | ||
| 433 | |||
| 434 | default: | ||
| 435 | eedbg(0, "i2c_eeprom: unhandled event\n"); | ||
| 436 | break; | ||
| 437 | } | ||
| 438 | } | ||
| 439 | |||
| 440 | static int i2c_eeprom_emu_read(void *ptr) | ||
| 441 | { | ||
| 442 | struct i2c_eeprom_emu *emu = ptr; | ||
| 443 | int ret; | ||
| 444 | |||
| 445 | ret = emu->bytes[emu->ptr]; | ||
| 446 | emu->ptr = (emu->ptr + 1) % emu->size; | ||
| 447 | |||
| 448 | return ret; | ||
| 449 | } | ||
| 450 | |||
| 451 | static void i2c_eeprom_emu_write(void *ptr, unsigned int val) | ||
| 452 | { | ||
| 453 | struct i2c_eeprom_emu *emu = ptr; | ||
| 454 | struct i2c_eeprom_emu_watch *watch; | ||
| 455 | |||
| 456 | if (emu->seen_start != 0) { | ||
| 457 | eedbg(2, "i2c_eeprom_emu_write: setting ptr %02x\n", val); | ||
| 458 | emu->ptr = val; | ||
| 459 | emu->seen_start = 0; | ||
| 460 | return; | ||
| 461 | } | ||
| 462 | |||
| 463 | emu->bytes[emu->ptr] = val; | ||
| 464 | |||
| 465 | eedbg(1, "i2c_eeprom_emu_write: ptr=0x%02x, val=0x%02x\n", | ||
| 466 | emu->ptr, val); | ||
| 467 | |||
| 468 | list_for_each_entry(watch, &emu->watch, node) { | ||
| 469 | if (!watch->ops || !watch->ops->write) | ||
| 470 | continue; | ||
| 471 | if (watch->start <= emu->ptr && watch->end >= emu->ptr) | ||
| 472 | watch->ops->write(watch->data, emu->ptr, val); | ||
| 473 | } | ||
| 474 | |||
| 475 | emu->ptr = (emu->ptr + 1) % emu->size; | ||
| 476 | } | ||
| 477 | |||
| 478 | struct i2c_slave_client eeprom_client = { | ||
| 479 | .data = &eeprom, | ||
| 480 | .event = i2c_eeprom_emu_event, | ||
| 481 | .read = i2c_eeprom_emu_read, | ||
| 482 | .write = i2c_eeprom_emu_write | ||
| 483 | }; | ||
| 484 | |||
| 485 | /* | ||
| 486 | * PXA I2C Slave mode | ||
| 487 | */ | ||
| 488 | |||
| 489 | static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) | ||
| 490 | { | ||
| 491 | if (isr & ISR_BED) { | ||
| 492 | /* what should we do here? */ | ||
| 493 | } else { | ||
| 494 | int ret = i2c->slave->read(i2c->slave->data); | ||
| 495 | |||
| 496 | IDBR = ret; | ||
| 497 | ICR |= ICR_TB; /* allow next byte */ | ||
| 498 | } | ||
| 499 | } | ||
| 500 | |||
| 501 | static void i2c_pxa_slave_rxfull(struct pxa_i2c *i2c, u32 isr) | ||
| 502 | { | ||
| 503 | unsigned int byte = IDBR; | ||
| 504 | |||
| 505 | if (i2c->slave != NULL) | ||
| 506 | i2c->slave->write(i2c->slave->data, byte); | ||
| 507 | |||
| 508 | ICR |= ICR_TB; | ||
| 509 | } | ||
| 510 | |||
| 511 | static void i2c_pxa_slave_start(struct pxa_i2c *i2c, u32 isr) | ||
| 512 | { | ||
| 513 | int timeout; | ||
| 514 | |||
| 515 | if (i2c_debug > 0) | ||
| 516 | dev_dbg(&i2c->adap.dev, "SAD, mode is slave-%cx\n", | ||
| 517 | (isr & ISR_RWM) ? 'r' : 't'); | ||
| 518 | |||
| 519 | if (i2c->slave != NULL) | ||
| 520 | i2c->slave->event(i2c->slave->data, | ||
| 521 | (isr & ISR_RWM) ? I2C_SLAVE_EVENT_START_READ : I2C_SLAVE_EVENT_START_WRITE); | ||
| 522 | |||
| 523 | /* | ||
| 524 | * slave could interrupt in the middle of us generating a | ||
| 525 | * start condition... if this happens, we'd better back off | ||
| 526 | * and stop holding the poor thing up | ||
| 527 | */ | ||
| 528 | ICR &= ~(ICR_START|ICR_STOP); | ||
| 529 | ICR |= ICR_TB; | ||
| 530 | |||
| 531 | timeout = 0x10000; | ||
| 532 | |||
| 533 | while (1) { | ||
| 534 | if ((IBMR & 2) == 2) | ||
| 535 | break; | ||
| 536 | |||
| 537 | timeout--; | ||
| 538 | |||
| 539 | if (timeout <= 0) { | ||
| 540 | dev_err(&i2c->adap.dev, "timeout waiting for SCL high\n"); | ||
| 541 | break; | ||
| 542 | } | ||
| 543 | } | ||
| 544 | |||
| 545 | ICR &= ~ICR_SCLE; | ||
| 546 | } | ||
| 547 | |||
| 548 | static void i2c_pxa_slave_stop(struct pxa_i2c *i2c) | ||
| 549 | { | ||
| 550 | if (i2c_debug > 2) | ||
| 551 | dev_dbg(&i2c->adap.dev, "ISR: SSD (Slave Stop)\n"); | ||
| 552 | |||
| 553 | if (i2c->slave != NULL) | ||
| 554 | i2c->slave->event(i2c->slave->data, I2C_SLAVE_EVENT_STOP); | ||
| 555 | |||
| 556 | if (i2c_debug > 2) | ||
| 557 | dev_dbg(&i2c->adap.dev, "ISR: SSD (Slave Stop) acked\n"); | ||
| 558 | |||
| 559 | /* | ||
| 560 | * If we have a master-mode message waiting, | ||
| 561 | * kick it off now that the slave has completed. | ||
| 562 | */ | ||
| 563 | if (i2c->msg) | ||
| 564 | i2c_pxa_master_complete(i2c, I2C_RETRY); | ||
| 565 | } | ||
| 566 | #else | ||
| 567 | static void i2c_pxa_slave_txempty(struct pxa_i2c *i2c, u32 isr) | ||
| 568 | { | ||
| 569 | if (isr & ISR_BED) { | ||
| 570 | /* what should we do here? */ | ||
| 571 | } else { | ||
| 572 | IDBR = 0; | ||
| 573 | ICR |= ICR_TB; | ||
| 574 | } | ||
| 575 | } | ||
| 576 | |||
| 577 | static void i2c_pxa_slave_rxfull(struct pxa_i2c *i2c, u32 isr) | ||
| 578 | { | ||
| 579 | ICR |= ICR_TB | ICR_ACKNAK; | ||
| 580 | } | ||
| 581 | |||
| 582 | static void i2c_pxa_slave_start(struct pxa_i2c *i2c, u32 isr) | ||
| 583 | { | ||
| 584 | int timeout; | ||
| 585 | |||
| 586 | /* | ||
| 587 | * slave could interrupt in the middle of us generating a | ||
| 588 | * start condition... if this happens, we'd better back off | ||
| 589 | * and stop holding the poor thing up | ||
| 590 | */ | ||
| 591 | ICR &= ~(ICR_START|ICR_STOP); | ||
| 592 | ICR |= ICR_TB | ICR_ACKNAK; | ||
| 593 | |||
| 594 | timeout = 0x10000; | ||
| 595 | |||
| 596 | while (1) { | ||
| 597 | if ((IBMR & 2) == 2) | ||
| 598 | break; | ||
| 599 | |||
| 600 | timeout--; | ||
| 601 | |||
| 602 | if (timeout <= 0) { | ||
| 603 | dev_err(&i2c->adap.dev, "timeout waiting for SCL high\n"); | ||
| 604 | break; | ||
| 605 | } | ||
| 606 | } | ||
| 607 | |||
| 608 | ICR &= ~ICR_SCLE; | ||
| 609 | } | ||
| 610 | |||
| 611 | static void i2c_pxa_slave_stop(struct pxa_i2c *i2c) | ||
| 612 | { | ||
| 613 | if (i2c->msg) | ||
| 614 | i2c_pxa_master_complete(i2c, I2C_RETRY); | ||
| 615 | } | ||
| 616 | #endif | ||
| 617 | |||
| 618 | /* | ||
| 619 | * PXA I2C Master mode | ||
| 620 | */ | ||
| 621 | |||
| 622 | static inline unsigned int i2c_pxa_addr_byte(struct i2c_msg *msg) | ||
| 623 | { | ||
| 624 | unsigned int addr = (msg->addr & 0x7f) << 1; | ||
| 625 | |||
| 626 | if (msg->flags & I2C_M_RD) | ||
| 627 | addr |= 1; | ||
| 628 | |||
| 629 | return addr; | ||
| 630 | } | ||
| 631 | |||
| 632 | static inline void i2c_pxa_start_message(struct pxa_i2c *i2c) | ||
| 633 | { | ||
| 634 | u32 icr; | ||
| 635 | |||
| 636 | /* | ||
| 637 | * Step 1: target slave address into IDBR | ||
| 638 | */ | ||
| 639 | IDBR = i2c_pxa_addr_byte(i2c->msg); | ||
| 640 | |||
| 641 | /* | ||
| 642 | * Step 2: initiate the write. | ||
| 643 | */ | ||
| 644 | icr = ICR & ~(ICR_STOP | ICR_ALDIE); | ||
| 645 | ICR = icr | ICR_START | ICR_TB; | ||
| 646 | } | ||
| 647 | |||
| 648 | /* | ||
| 649 | * We are protected by the adapter bus semaphore. | ||
| 650 | */ | ||
| 651 | static int i2c_pxa_do_xfer(struct pxa_i2c *i2c, struct i2c_msg *msg, int num) | ||
| 652 | { | ||
| 653 | long timeout; | ||
| 654 | int ret; | ||
| 655 | |||
| 656 | /* | ||
| 657 | * Wait for the bus to become free. | ||
| 658 | */ | ||
| 659 | ret = i2c_pxa_wait_bus_not_busy(i2c); | ||
| 660 | if (ret) { | ||
| 661 | dev_err(&i2c->adap.dev, "i2c_pxa: timeout waiting for bus free\n"); | ||
| 662 | goto out; | ||
| 663 | } | ||
| 664 | |||
| 665 | /* | ||
| 666 | * Set master mode. | ||
| 667 | */ | ||
| 668 | ret = i2c_pxa_set_master(i2c); | ||
| 669 | if (ret) { | ||
| 670 | dev_err(&i2c->adap.dev, "i2c_pxa_set_master: error %d\n", ret); | ||
| 671 | goto out; | ||
| 672 | } | ||
| 673 | |||
| 674 | spin_lock_irq(&i2c->lock); | ||
| 675 | |||
| 676 | i2c->msg = msg; | ||
| 677 | i2c->msg_num = num; | ||
| 678 | i2c->msg_idx = 0; | ||
| 679 | i2c->msg_ptr = 0; | ||
| 680 | i2c->irqlogidx = 0; | ||
| 681 | |||
| 682 | i2c_pxa_start_message(i2c); | ||
| 683 | |||
| 684 | spin_unlock_irq(&i2c->lock); | ||
| 685 | |||
| 686 | /* | ||
| 687 | * The rest of the processing occurs in the interrupt handler. | ||
| 688 | */ | ||
| 689 | timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); | ||
| 690 | |||
| 691 | /* | ||
| 692 | * We place the return code in i2c->msg_idx. | ||
| 693 | */ | ||
| 694 | ret = i2c->msg_idx; | ||
| 695 | |||
| 696 | if (timeout == 0) | ||
| 697 | i2c_pxa_scream_blue_murder(i2c, "timeout"); | ||
| 698 | |||
| 699 | out: | ||
| 700 | return ret; | ||
| 701 | } | ||
| 702 | |||
| 703 | /* | ||
| 704 | * i2c_pxa_master_complete - complete the message and wake up. | ||
| 705 | */ | ||
| 706 | static void i2c_pxa_master_complete(struct pxa_i2c *i2c, int ret) | ||
| 707 | { | ||
| 708 | i2c->msg_ptr = 0; | ||
| 709 | i2c->msg = NULL; | ||
| 710 | i2c->msg_idx ++; | ||
| 711 | i2c->msg_num = 0; | ||
| 712 | if (ret) | ||
| 713 | i2c->msg_idx = ret; | ||
| 714 | wake_up(&i2c->wait); | ||
| 715 | } | ||
| 716 | |||
| 717 | static void i2c_pxa_irq_txempty(struct pxa_i2c *i2c, u32 isr) | ||
| 718 | { | ||
| 719 | u32 icr = ICR & ~(ICR_START|ICR_STOP|ICR_ACKNAK|ICR_TB); | ||
| 720 | |||
| 721 | again: | ||
| 722 | /* | ||
| 723 | * If ISR_ALD is set, we lost arbitration. | ||
| 724 | */ | ||
| 725 | if (isr & ISR_ALD) { | ||
| 726 | /* | ||
| 727 | * Do we need to do anything here? The PXA docs | ||
| 728 | * are vague about what happens. | ||
| 729 | */ | ||
| 730 | i2c_pxa_scream_blue_murder(i2c, "ALD set"); | ||
| 731 | |||
| 732 | /* | ||
| 733 | * We ignore this error. We seem to see spurious ALDs | ||
| 734 | * for seemingly no reason. If we handle them as I think | ||
| 735 | * they should, we end up causing an I2C error, which | ||
| 736 | * is painful for some systems. | ||
| 737 | */ | ||
| 738 | return; /* ignore */ | ||
| 739 | } | ||
| 740 | |||
| 741 | if (isr & ISR_BED) { | ||
| 742 | int ret = BUS_ERROR; | ||
| 743 | |||
| 744 | /* | ||
| 745 | * I2C bus error - either the device NAK'd us, or | ||
| 746 | * something more serious happened. If we were NAK'd | ||
| 747 | * on the initial address phase, we can retry. | ||
| 748 | */ | ||
| 749 | if (isr & ISR_ACKNAK) { | ||
| 750 | if (i2c->msg_ptr == 0 && i2c->msg_idx == 0) | ||
| 751 | ret = I2C_RETRY; | ||
| 752 | else | ||
| 753 | ret = XFER_NAKED; | ||
| 754 | } | ||
| 755 | i2c_pxa_master_complete(i2c, ret); | ||
| 756 | } else if (isr & ISR_RWM) { | ||
| 757 | /* | ||
| 758 | * Read mode. We have just sent the address byte, and | ||
| 759 | * now we must initiate the transfer. | ||
| 760 | */ | ||
| 761 | if (i2c->msg_ptr == i2c->msg->len - 1 && | ||
| 762 | i2c->msg_idx == i2c->msg_num - 1) | ||
| 763 | icr |= ICR_STOP | ICR_ACKNAK; | ||
| 764 | |||
| 765 | icr |= ICR_ALDIE | ICR_TB; | ||
| 766 | } else if (i2c->msg_ptr < i2c->msg->len) { | ||
| 767 | /* | ||
| 768 | * Write mode. Write the next data byte. | ||
| 769 | */ | ||
| 770 | IDBR = i2c->msg->buf[i2c->msg_ptr++]; | ||
| 771 | |||
| 772 | icr |= ICR_ALDIE | ICR_TB; | ||
| 773 | |||
| 774 | /* | ||
| 775 | * If this is the last byte of the last message, send | ||
| 776 | * a STOP. | ||
| 777 | */ | ||
| 778 | if (i2c->msg_ptr == i2c->msg->len && | ||
| 779 | i2c->msg_idx == i2c->msg_num - 1) | ||
| 780 | icr |= ICR_STOP; | ||
| 781 | } else if (i2c->msg_idx < i2c->msg_num - 1) { | ||
| 782 | /* | ||
| 783 | * Next segment of the message. | ||
| 784 | */ | ||
| 785 | i2c->msg_ptr = 0; | ||
| 786 | i2c->msg_idx ++; | ||
| 787 | i2c->msg++; | ||
| 788 | |||
| 789 | /* | ||
| 790 | * If we aren't doing a repeated start and address, | ||
| 791 | * go back and try to send the next byte. Note that | ||
| 792 | * we do not support switching the R/W direction here. | ||
| 793 | */ | ||
| 794 | if (i2c->msg->flags & I2C_M_NOSTART) | ||
| 795 | goto again; | ||
| 796 | |||
| 797 | /* | ||
| 798 | * Write the next address. | ||
| 799 | */ | ||
| 800 | IDBR = i2c_pxa_addr_byte(i2c->msg); | ||
| 801 | |||
| 802 | /* | ||
| 803 | * And trigger a repeated start, and send the byte. | ||
| 804 | */ | ||
| 805 | icr &= ~ICR_ALDIE; | ||
| 806 | icr |= ICR_START | ICR_TB; | ||
| 807 | } else { | ||
| 808 | if (i2c->msg->len == 0) { | ||
| 809 | /* | ||
| 810 | * Device probes have a message length of zero | ||
| 811 | * and need the bus to be reset before it can | ||
| 812 | * be used again. | ||
| 813 | */ | ||
| 814 | i2c_pxa_reset(i2c); | ||
| 815 | } | ||
| 816 | i2c_pxa_master_complete(i2c, 0); | ||
| 817 | } | ||
| 818 | |||
| 819 | i2c->icrlog[i2c->irqlogidx-1] = icr; | ||
| 820 | |||
| 821 | ICR = icr; | ||
| 822 | show_state(i2c); | ||
| 823 | } | ||
| 824 | |||
| 825 | static void i2c_pxa_irq_rxfull(struct pxa_i2c *i2c, u32 isr) | ||
| 826 | { | ||
| 827 | u32 icr = ICR & ~(ICR_START|ICR_STOP|ICR_ACKNAK|ICR_TB); | ||
| 828 | |||
| 829 | /* | ||
| 830 | * Read the byte. | ||
| 831 | */ | ||
| 832 | i2c->msg->buf[i2c->msg_ptr++] = IDBR; | ||
| 833 | |||
| 834 | if (i2c->msg_ptr < i2c->msg->len) { | ||
| 835 | /* | ||
| 836 | * If this is the last byte of the last | ||
| 837 | * message, send a STOP. | ||
| 838 | */ | ||
| 839 | if (i2c->msg_ptr == i2c->msg->len - 1) | ||
| 840 | icr |= ICR_STOP | ICR_ACKNAK; | ||
| 841 | |||
| 842 | icr |= ICR_ALDIE | ICR_TB; | ||
| 843 | } else { | ||
| 844 | i2c_pxa_master_complete(i2c, 0); | ||
| 845 | } | ||
| 846 | |||
| 847 | i2c->icrlog[i2c->irqlogidx-1] = icr; | ||
| 848 | |||
| 849 | ICR = icr; | ||
| 850 | } | ||
| 851 | |||
| 852 | static irqreturn_t i2c_pxa_handler(int this_irq, void *dev_id, struct pt_regs *regs) | ||
| 853 | { | ||
| 854 | struct pxa_i2c *i2c = dev_id; | ||
| 855 | u32 isr = ISR; | ||
| 856 | |||
| 857 | if (i2c_debug > 2 && 0) { | ||
| 858 | dev_dbg(&i2c->adap.dev, "%s: ISR=%08x, ICR=%08x, IBMR=%02x\n", | ||
| 859 | __func__, isr, ICR, IBMR); | ||
| 860 | decode_ISR(isr); | ||
| 861 | } | ||
| 862 | |||
| 863 | if (i2c->irqlogidx < sizeof(i2c->isrlog)/sizeof(u32)) | ||
| 864 | i2c->isrlog[i2c->irqlogidx++] = isr; | ||
| 865 | |||
| 866 | show_state(i2c); | ||
| 867 | |||
| 868 | /* | ||
| 869 | * Always clear all pending IRQs. | ||
| 870 | */ | ||
| 871 | ISR = isr & (ISR_SSD|ISR_ALD|ISR_ITE|ISR_IRF|ISR_SAD|ISR_BED); | ||
| 872 | |||
| 873 | if (isr & ISR_SAD) | ||
| 874 | i2c_pxa_slave_start(i2c, isr); | ||
| 875 | if (isr & ISR_SSD) | ||
| 876 | i2c_pxa_slave_stop(i2c); | ||
| 877 | |||
| 878 | if (i2c_pxa_is_slavemode(i2c)) { | ||
| 879 | if (isr & ISR_ITE) | ||
| 880 | i2c_pxa_slave_txempty(i2c, isr); | ||
| 881 | if (isr & ISR_IRF) | ||
| 882 | i2c_pxa_slave_rxfull(i2c, isr); | ||
| 883 | } else if (i2c->msg) { | ||
| 884 | if (isr & ISR_ITE) | ||
| 885 | i2c_pxa_irq_txempty(i2c, isr); | ||
| 886 | if (isr & ISR_IRF) | ||
| 887 | i2c_pxa_irq_rxfull(i2c, isr); | ||
| 888 | } else { | ||
| 889 | i2c_pxa_scream_blue_murder(i2c, "spurious irq"); | ||
| 890 | } | ||
| 891 | |||
| 892 | return IRQ_HANDLED; | ||
| 893 | } | ||
| 894 | |||
| 895 | |||
| 896 | static int i2c_pxa_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | ||
| 897 | { | ||
| 898 | struct pxa_i2c *i2c = adap->algo_data; | ||
| 899 | int ret, i; | ||
| 900 | |||
| 901 | for (i = adap->retries; i >= 0; i--) { | ||
| 902 | ret = i2c_pxa_do_xfer(i2c, msgs, num); | ||
| 903 | if (ret != I2C_RETRY) | ||
| 904 | goto out; | ||
| 905 | |||
| 906 | if (i2c_debug) | ||
| 907 | dev_dbg(&adap->dev, "Retrying transmission\n"); | ||
| 908 | udelay(100); | ||
| 909 | } | ||
| 910 | i2c_pxa_scream_blue_murder(i2c, "exhausted retries"); | ||
| 911 | ret = -EREMOTEIO; | ||
| 912 | out: | ||
| 913 | i2c_pxa_set_slave(i2c, ret); | ||
| 914 | return ret; | ||
| 915 | } | ||
| 916 | |||
| 917 | static struct i2c_algorithm i2c_pxa_algorithm = { | ||
| 918 | .name = "PXA-I2C-Algorithm", | ||
| 919 | .id = I2C_ALGO_PXA, | ||
| 920 | .master_xfer = i2c_pxa_xfer, | ||
| 921 | }; | ||
| 922 | |||
| 923 | static struct pxa_i2c i2c_pxa = { | ||
| 924 | .lock = SPIN_LOCK_UNLOCKED, | ||
| 925 | .wait = __WAIT_QUEUE_HEAD_INITIALIZER(i2c_pxa.wait), | ||
| 926 | .adap = { | ||
| 927 | .name = "pxa2xx-i2c", | ||
| 928 | .id = I2C_ALGO_PXA, | ||
| 929 | .algo = &i2c_pxa_algorithm, | ||
| 930 | .retries = 5, | ||
| 931 | }, | ||
| 932 | }; | ||
| 933 | |||
| 934 | static int i2c_pxa_probe(struct device *dev) | ||
| 935 | { | ||
| 936 | struct pxa_i2c *i2c = &i2c_pxa; | ||
| 937 | struct i2c_pxa_platform_data *plat = dev->platform_data; | ||
| 938 | int ret; | ||
| 939 | |||
| 940 | #ifdef CONFIG_PXA27x | ||
| 941 | pxa_gpio_mode(GPIO117_I2CSCL_MD); | ||
| 942 | pxa_gpio_mode(GPIO118_I2CSDA_MD); | ||
| 943 | udelay(100); | ||
| 944 | #endif | ||
| 945 | |||
| 946 | i2c->slave_addr = I2C_PXA_SLAVE_ADDR; | ||
| 947 | |||
| 948 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 949 | i2c->slave = &eeprom_client; | ||
| 950 | if (plat) { | ||
| 951 | i2c->slave_addr = plat->slave_addr; | ||
| 952 | if (plat->slave) | ||
| 953 | i2c->slave = plat->slave; | ||
| 954 | } | ||
| 955 | #endif | ||
| 956 | |||
| 957 | pxa_set_cken(CKEN14_I2C, 1); | ||
| 958 | ret = request_irq(IRQ_I2C, i2c_pxa_handler, SA_INTERRUPT, | ||
| 959 | "pxa2xx-i2c", i2c); | ||
| 960 | if (ret) | ||
| 961 | goto out; | ||
| 962 | |||
| 963 | i2c_pxa_reset(i2c); | ||
| 964 | |||
| 965 | i2c->adap.algo_data = i2c; | ||
| 966 | i2c->adap.dev.parent = dev; | ||
| 967 | |||
| 968 | ret = i2c_add_adapter(&i2c->adap); | ||
| 969 | if (ret < 0) { | ||
| 970 | printk(KERN_INFO "I2C: Failed to add bus\n"); | ||
| 971 | goto err_irq; | ||
| 972 | } | ||
| 973 | |||
| 974 | dev_set_drvdata(dev, i2c); | ||
| 975 | |||
| 976 | #ifdef CONFIG_I2C_PXA_SLAVE | ||
| 977 | printk(KERN_INFO "I2C: %s: PXA I2C adapter, slave address %d\n", | ||
| 978 | i2c->adap.dev.bus_id, i2c->slave_addr); | ||
| 979 | #else | ||
| 980 | printk(KERN_INFO "I2C: %s: PXA I2C adapter\n", | ||
| 981 | i2c->adap.dev.bus_id); | ||
| 982 | #endif | ||
| 983 | return 0; | ||
| 984 | |||
| 985 | err_irq: | ||
| 986 | free_irq(IRQ_I2C, i2c); | ||
| 987 | out: | ||
| 988 | return ret; | ||
| 989 | } | ||
| 990 | |||
| 991 | static int i2c_pxa_remove(struct device *dev) | ||
| 992 | { | ||
| 993 | struct pxa_i2c *i2c = dev_get_drvdata(dev); | ||
| 994 | |||
| 995 | dev_set_drvdata(dev, NULL); | ||
| 996 | |||
| 997 | i2c_del_adapter(&i2c->adap); | ||
| 998 | free_irq(IRQ_I2C, i2c); | ||
| 999 | pxa_set_cken(CKEN14_I2C, 0); | ||
| 1000 | |||
| 1001 | return 0; | ||
| 1002 | } | ||
| 1003 | |||
| 1004 | static struct device_driver i2c_pxa_driver = { | ||
| 1005 | .name = "pxa2xx-i2c", | ||
| 1006 | .bus = &platform_bus_type, | ||
| 1007 | .probe = i2c_pxa_probe, | ||
| 1008 | .remove = i2c_pxa_remove, | ||
| 1009 | }; | ||
| 1010 | |||
| 1011 | static int __init i2c_adap_pxa_init(void) | ||
| 1012 | { | ||
| 1013 | return driver_register(&i2c_pxa_driver); | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | static void i2c_adap_pxa_exit(void) | ||
| 1017 | { | ||
| 1018 | return driver_unregister(&i2c_pxa_driver); | ||
| 1019 | } | ||
| 1020 | |||
| 1021 | module_init(i2c_adap_pxa_init); | ||
| 1022 | module_exit(i2c_adap_pxa_exit); | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_main.c b/drivers/infiniband/hw/mthca/mthca_main.c index 3241d6c9dc11..ffbcd40418d5 100644 --- a/drivers/infiniband/hw/mthca/mthca_main.c +++ b/drivers/infiniband/hw/mthca/mthca_main.c | |||
| @@ -937,12 +937,12 @@ static int __devinit mthca_init_one(struct pci_dev *pdev, | |||
| 937 | ++mthca_version_printed; | 937 | ++mthca_version_printed; |
| 938 | } | 938 | } |
| 939 | 939 | ||
| 940 | printk(KERN_INFO PFX "Initializing %s (%s)\n", | 940 | printk(KERN_INFO PFX "Initializing %s\n", |
| 941 | pci_pretty_name(pdev), pci_name(pdev)); | 941 | pci_name(pdev)); |
| 942 | 942 | ||
| 943 | if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) { | 943 | if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) { |
| 944 | printk(KERN_ERR PFX "%s (%s) has invalid driver data %lx\n", | 944 | printk(KERN_ERR PFX "%s has invalid driver data %lx\n", |
| 945 | pci_pretty_name(pdev), pci_name(pdev), id->driver_data); | 945 | pci_name(pdev), id->driver_data); |
| 946 | return -ENODEV; | 946 | return -ENODEV; |
| 947 | } | 947 | } |
| 948 | 948 | ||
diff --git a/drivers/infiniband/hw/mthca/mthca_reset.c b/drivers/infiniband/hw/mthca/mthca_reset.c index 8ea801271a41..4f995391dd1d 100644 --- a/drivers/infiniband/hw/mthca/mthca_reset.c +++ b/drivers/infiniband/hw/mthca/mthca_reset.c | |||
| @@ -71,8 +71,8 @@ int mthca_reset(struct mthca_dev *mdev) | |||
| 71 | bridge)) != NULL) { | 71 | bridge)) != NULL) { |
| 72 | if (bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE && | 72 | if (bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE && |
| 73 | bridge->subordinate == mdev->pdev->bus) { | 73 | bridge->subordinate == mdev->pdev->bus) { |
| 74 | mthca_dbg(mdev, "Found bridge: %s (%s)\n", | 74 | mthca_dbg(mdev, "Found bridge: %s\n", |
| 75 | pci_pretty_name(bridge), pci_name(bridge)); | 75 | pci_name(bridge)); |
| 76 | break; | 76 | break; |
| 77 | } | 77 | } |
| 78 | } | 78 | } |
| @@ -83,8 +83,8 @@ int mthca_reset(struct mthca_dev *mdev) | |||
| 83 | * assume we're in no-bridge mode and hope for | 83 | * assume we're in no-bridge mode and hope for |
| 84 | * the best. | 84 | * the best. |
| 85 | */ | 85 | */ |
| 86 | mthca_warn(mdev, "No bridge found for %s (%s)\n", | 86 | mthca_warn(mdev, "No bridge found for %s\n", |
| 87 | pci_pretty_name(mdev->pdev), pci_name(mdev->pdev)); | 87 | pci_name(mdev->pdev)); |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | } | 90 | } |
diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c index 0a117c61cd18..ceae379a4d4c 100644 --- a/drivers/mmc/mmc.c +++ b/drivers/mmc/mmc.c | |||
| @@ -1079,13 +1079,17 @@ static void mmc_setup(struct mmc_host *host) | |||
| 1079 | /** | 1079 | /** |
| 1080 | * mmc_detect_change - process change of state on a MMC socket | 1080 | * mmc_detect_change - process change of state on a MMC socket |
| 1081 | * @host: host which changed state. | 1081 | * @host: host which changed state. |
| 1082 | * @delay: optional delay to wait before detection (jiffies) | ||
| 1082 | * | 1083 | * |
| 1083 | * All we know is that card(s) have been inserted or removed | 1084 | * All we know is that card(s) have been inserted or removed |
| 1084 | * from the socket(s). We don't know which socket or cards. | 1085 | * from the socket(s). We don't know which socket or cards. |
| 1085 | */ | 1086 | */ |
| 1086 | void mmc_detect_change(struct mmc_host *host) | 1087 | void mmc_detect_change(struct mmc_host *host, unsigned long delay) |
| 1087 | { | 1088 | { |
| 1088 | schedule_work(&host->detect); | 1089 | if (delay) |
| 1090 | schedule_delayed_work(&host->detect, delay); | ||
| 1091 | else | ||
| 1092 | schedule_work(&host->detect); | ||
| 1089 | } | 1093 | } |
| 1090 | 1094 | ||
| 1091 | EXPORT_SYMBOL(mmc_detect_change); | 1095 | EXPORT_SYMBOL(mmc_detect_change); |
| @@ -1189,7 +1193,7 @@ int mmc_add_host(struct mmc_host *host) | |||
| 1189 | ret = mmc_add_host_sysfs(host); | 1193 | ret = mmc_add_host_sysfs(host); |
| 1190 | if (ret == 0) { | 1194 | if (ret == 0) { |
| 1191 | mmc_power_off(host); | 1195 | mmc_power_off(host); |
| 1192 | mmc_detect_change(host); | 1196 | mmc_detect_change(host, 0); |
| 1193 | } | 1197 | } |
| 1194 | 1198 | ||
| 1195 | return ret; | 1199 | return ret; |
| @@ -1259,7 +1263,7 @@ EXPORT_SYMBOL(mmc_suspend_host); | |||
| 1259 | */ | 1263 | */ |
| 1260 | int mmc_resume_host(struct mmc_host *host) | 1264 | int mmc_resume_host(struct mmc_host *host) |
| 1261 | { | 1265 | { |
| 1262 | mmc_detect_change(host); | 1266 | mmc_detect_change(host, 0); |
| 1263 | 1267 | ||
| 1264 | return 0; | 1268 | return 0; |
| 1265 | } | 1269 | } |
diff --git a/drivers/mmc/mmci.c b/drivers/mmc/mmci.c index 716c4ef4faf6..91c74843dc0d 100644 --- a/drivers/mmc/mmci.c +++ b/drivers/mmc/mmci.c | |||
| @@ -442,7 +442,7 @@ static void mmci_check_status(unsigned long data) | |||
| 442 | 442 | ||
| 443 | status = host->plat->status(mmc_dev(host->mmc)); | 443 | status = host->plat->status(mmc_dev(host->mmc)); |
| 444 | if (status ^ host->oldstat) | 444 | if (status ^ host->oldstat) |
| 445 | mmc_detect_change(host->mmc); | 445 | mmc_detect_change(host->mmc, 0); |
| 446 | 446 | ||
| 447 | host->oldstat = status; | 447 | host->oldstat = status; |
| 448 | mod_timer(&host->timer, jiffies + HZ); | 448 | mod_timer(&host->timer, jiffies + HZ); |
diff --git a/drivers/mmc/pxamci.c b/drivers/mmc/pxamci.c index e99a53b09e32..b53af57074e3 100644 --- a/drivers/mmc/pxamci.c +++ b/drivers/mmc/pxamci.c | |||
| @@ -423,7 +423,9 @@ static void pxamci_dma_irq(int dma, void *devid, struct pt_regs *regs) | |||
| 423 | 423 | ||
| 424 | static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs) | 424 | static irqreturn_t pxamci_detect_irq(int irq, void *devid, struct pt_regs *regs) |
| 425 | { | 425 | { |
| 426 | mmc_detect_change(devid); | 426 | struct pxamci_host *host = mmc_priv(devid); |
| 427 | |||
| 428 | mmc_detect_change(devid, host->pdata->detect_delay); | ||
| 427 | return IRQ_HANDLED; | 429 | return IRQ_HANDLED; |
| 428 | } | 430 | } |
| 429 | 431 | ||
diff --git a/drivers/mmc/wbsd.c b/drivers/mmc/wbsd.c index dec01d38c782..a62c86fef5cc 100644 --- a/drivers/mmc/wbsd.c +++ b/drivers/mmc/wbsd.c | |||
| @@ -1122,7 +1122,7 @@ static void wbsd_detect_card(unsigned long data) | |||
| 1122 | 1122 | ||
| 1123 | DBG("Executing card detection\n"); | 1123 | DBG("Executing card detection\n"); |
| 1124 | 1124 | ||
| 1125 | mmc_detect_change(host->mmc); | 1125 | mmc_detect_change(host->mmc, 0); |
| 1126 | } | 1126 | } |
| 1127 | 1127 | ||
| 1128 | /* | 1128 | /* |
| @@ -1198,7 +1198,7 @@ static void wbsd_tasklet_card(unsigned long param) | |||
| 1198 | */ | 1198 | */ |
| 1199 | spin_unlock(&host->lock); | 1199 | spin_unlock(&host->lock); |
| 1200 | 1200 | ||
| 1201 | mmc_detect_change(host->mmc); | 1201 | mmc_detect_change(host->mmc, 0); |
| 1202 | } | 1202 | } |
| 1203 | else | 1203 | else |
| 1204 | spin_unlock(&host->lock); | 1204 | spin_unlock(&host->lock); |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 55a72c7ad001..83598e32179c 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
| @@ -14,8 +14,8 @@ | |||
| 14 | 14 | ||
| 15 | #define DRV_MODULE_NAME "bnx2" | 15 | #define DRV_MODULE_NAME "bnx2" |
| 16 | #define PFX DRV_MODULE_NAME ": " | 16 | #define PFX DRV_MODULE_NAME ": " |
| 17 | #define DRV_MODULE_VERSION "1.2.20" | 17 | #define DRV_MODULE_VERSION "1.2.21" |
| 18 | #define DRV_MODULE_RELDATE "August 22, 2005" | 18 | #define DRV_MODULE_RELDATE "September 7, 2005" |
| 19 | 19 | ||
| 20 | #define RUN_AT(x) (jiffies + (x)) | 20 | #define RUN_AT(x) (jiffies + (x)) |
| 21 | 21 | ||
| @@ -1533,6 +1533,7 @@ bnx2_msi(int irq, void *dev_instance, struct pt_regs *regs) | |||
| 1533 | struct net_device *dev = dev_instance; | 1533 | struct net_device *dev = dev_instance; |
| 1534 | struct bnx2 *bp = dev->priv; | 1534 | struct bnx2 *bp = dev->priv; |
| 1535 | 1535 | ||
| 1536 | prefetch(bp->status_blk); | ||
| 1536 | REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, | 1537 | REG_WR(bp, BNX2_PCICFG_INT_ACK_CMD, |
| 1537 | BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | | 1538 | BNX2_PCICFG_INT_ACK_CMD_USE_INT_HC_PARAM | |
| 1538 | BNX2_PCICFG_INT_ACK_CMD_MASK_INT); | 1539 | BNX2_PCICFG_INT_ACK_CMD_MASK_INT); |
| @@ -1558,7 +1559,7 @@ bnx2_interrupt(int irq, void *dev_instance, struct pt_regs *regs) | |||
| 1558 | * When using MSI, the MSI message will always complete after | 1559 | * When using MSI, the MSI message will always complete after |
| 1559 | * the status block write. | 1560 | * the status block write. |
| 1560 | */ | 1561 | */ |
| 1561 | if ((bp->status_blk->status_idx == bp->last_status_idx) || | 1562 | if ((bp->status_blk->status_idx == bp->last_status_idx) && |
| 1562 | (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & | 1563 | (REG_RD(bp, BNX2_PCICFG_MISC_STATUS) & |
| 1563 | BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) | 1564 | BNX2_PCICFG_MISC_STATUS_INTA_VALUE)) |
| 1564 | return IRQ_NONE; | 1565 | return IRQ_NONE; |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 9ad3f5740cd8..62857b6a6ee4 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #endif | 50 | #endif |
| 51 | #include <linux/workqueue.h> | 51 | #include <linux/workqueue.h> |
| 52 | #include <linux/crc32.h> | 52 | #include <linux/crc32.h> |
| 53 | #include <linux/prefetch.h> | ||
| 53 | 54 | ||
| 54 | /* Hardware data structures and register definitions automatically | 55 | /* Hardware data structures and register definitions automatically |
| 55 | * generated from RTL code. Do not modify. | 56 | * generated from RTL code. Do not modify. |
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c index 46e0022d3258..6c766fdc51a6 100644 --- a/drivers/net/irda/irda-usb.c +++ b/drivers/net/irda/irda-usb.c | |||
| @@ -267,7 +267,7 @@ static void irda_usb_change_speed_xbofs(struct irda_usb_cb *self) | |||
| 267 | frame, IRDA_USB_SPEED_MTU, | 267 | frame, IRDA_USB_SPEED_MTU, |
| 268 | speed_bulk_callback, self); | 268 | speed_bulk_callback, self); |
| 269 | urb->transfer_buffer_length = USB_IRDA_HEADER; | 269 | urb->transfer_buffer_length = USB_IRDA_HEADER; |
| 270 | urb->transfer_flags = URB_ASYNC_UNLINK; | 270 | urb->transfer_flags = 0; |
| 271 | 271 | ||
| 272 | /* Irq disabled -> GFP_ATOMIC */ | 272 | /* Irq disabled -> GFP_ATOMIC */ |
| 273 | if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { | 273 | if ((ret = usb_submit_urb(urb, GFP_ATOMIC))) { |
| @@ -401,15 +401,12 @@ static int irda_usb_hard_xmit(struct sk_buff *skb, struct net_device *netdev) | |||
| 401 | skb->data, IRDA_SKB_MAX_MTU, | 401 | skb->data, IRDA_SKB_MAX_MTU, |
| 402 | write_bulk_callback, skb); | 402 | write_bulk_callback, skb); |
| 403 | urb->transfer_buffer_length = skb->len; | 403 | urb->transfer_buffer_length = skb->len; |
| 404 | /* Note : unlink *must* be Asynchronous because of the code in | ||
| 405 | * irda_usb_net_timeout() -> call in irq - Jean II */ | ||
| 406 | urb->transfer_flags = URB_ASYNC_UNLINK; | ||
| 407 | /* This flag (URB_ZERO_PACKET) indicates that what we send is not | 404 | /* This flag (URB_ZERO_PACKET) indicates that what we send is not |
| 408 | * a continuous stream of data but separate packets. | 405 | * a continuous stream of data but separate packets. |
| 409 | * In this case, the USB layer will insert an empty USB frame (TD) | 406 | * In this case, the USB layer will insert an empty USB frame (TD) |
| 410 | * after each of our packets that is exact multiple of the frame size. | 407 | * after each of our packets that is exact multiple of the frame size. |
| 411 | * This is how the dongle will detect the end of packet - Jean II */ | 408 | * This is how the dongle will detect the end of packet - Jean II */ |
| 412 | urb->transfer_flags |= URB_ZERO_PACKET; | 409 | urb->transfer_flags = URB_ZERO_PACKET; |
| 413 | 410 | ||
| 414 | /* Generate min turn time. FIXME: can we do better than this? */ | 411 | /* Generate min turn time. FIXME: can we do better than this? */ |
| 415 | /* Trying to a turnaround time at this level is trying to measure | 412 | /* Trying to a turnaround time at this level is trying to measure |
| @@ -630,8 +627,6 @@ static void irda_usb_net_timeout(struct net_device *netdev) | |||
| 630 | * in completion handler, because urb->status will | 627 | * in completion handler, because urb->status will |
| 631 | * be -ENOENT. We will fix that at the next watchdog, | 628 | * be -ENOENT. We will fix that at the next watchdog, |
| 632 | * leaving more time to USB to recover... | 629 | * leaving more time to USB to recover... |
| 633 | * Also, we are in interrupt, so we need to have | ||
| 634 | * URB_ASYNC_UNLINK to work properly... | ||
| 635 | * Jean II */ | 630 | * Jean II */ |
| 636 | done = 1; | 631 | done = 1; |
| 637 | break; | 632 | break; |
| @@ -1008,9 +1003,7 @@ static int irda_usb_net_close(struct net_device *netdev) | |||
| 1008 | } | 1003 | } |
| 1009 | } | 1004 | } |
| 1010 | /* Cancel Tx and speed URB - need to be synchronous to avoid races */ | 1005 | /* Cancel Tx and speed URB - need to be synchronous to avoid races */ |
| 1011 | self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 1012 | usb_kill_urb(self->tx_urb); | 1006 | usb_kill_urb(self->tx_urb); |
| 1013 | self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 1014 | usb_kill_urb(self->speed_urb); | 1007 | usb_kill_urb(self->speed_urb); |
| 1015 | 1008 | ||
| 1016 | /* Stop and remove instance of IrLAP */ | 1009 | /* Stop and remove instance of IrLAP */ |
| @@ -1521,9 +1514,7 @@ static void irda_usb_disconnect(struct usb_interface *intf) | |||
| 1521 | usb_kill_urb(self->rx_urb[i]); | 1514 | usb_kill_urb(self->rx_urb[i]); |
| 1522 | /* Cancel Tx and speed URB. | 1515 | /* Cancel Tx and speed URB. |
| 1523 | * Toggle flags to make sure it's synchronous. */ | 1516 | * Toggle flags to make sure it's synchronous. */ |
| 1524 | self->tx_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 1525 | usb_kill_urb(self->tx_urb); | 1517 | usb_kill_urb(self->tx_urb); |
| 1526 | self->speed_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 1527 | usb_kill_urb(self->speed_urb); | 1518 | usb_kill_urb(self->speed_urb); |
| 1528 | } | 1519 | } |
| 1529 | 1520 | ||
diff --git a/drivers/net/irda/vlsi_ir.h b/drivers/net/irda/vlsi_ir.h index 414694abf588..741aecc655df 100644 --- a/drivers/net/irda/vlsi_ir.h +++ b/drivers/net/irda/vlsi_ir.h | |||
| @@ -69,14 +69,8 @@ typedef void irqreturn_t; | |||
| 69 | 69 | ||
| 70 | #else /* 2.5 or later */ | 70 | #else /* 2.5 or later */ |
| 71 | 71 | ||
| 72 | /* recent 2.5/2.6 stores pci device names at varying places ;-) */ | ||
| 73 | #ifdef CONFIG_PCI_NAMES | ||
| 74 | /* human readable name */ | ||
| 75 | #define PCIDEV_NAME(pdev) ((pdev)->pretty_name) | ||
| 76 | #else | ||
| 77 | /* whatever we get from the associated struct device - bus:slot:dev.fn id */ | 72 | /* whatever we get from the associated struct device - bus:slot:dev.fn id */ |
| 78 | #define PCIDEV_NAME(pdev) (pci_name(pdev)) | 73 | #define PCIDEV_NAME(pdev) (pci_name(pdev)) |
| 79 | #endif | ||
| 80 | 74 | ||
| 81 | #endif | 75 | #endif |
| 82 | 76 | ||
diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c index 97f723179f62..1b938bb9be3c 100644 --- a/drivers/parport/parport_pc.c +++ b/drivers/parport/parport_pc.c | |||
| @@ -3010,7 +3010,7 @@ static int __init parport_pc_init_superio (int autoirq, int autodma) | |||
| 3010 | struct pci_dev *pdev = NULL; | 3010 | struct pci_dev *pdev = NULL; |
| 3011 | int ret = 0; | 3011 | int ret = 0; |
| 3012 | 3012 | ||
| 3013 | while ((pdev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, pdev)) != NULL) { | 3013 | for_each_pci_dev(pdev) { |
| 3014 | id = pci_match_id(parport_pc_pci_tbl, pdev); | 3014 | id = pci_match_id(parport_pc_pci_tbl, pdev); |
| 3015 | if (id == NULL || id->driver_data >= last_sio) | 3015 | if (id == NULL || id->driver_data >= last_sio) |
| 3016 | continue; | 3016 | continue; |
diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig index 7f31991772ea..f187fd8aeed6 100644 --- a/drivers/pci/Kconfig +++ b/drivers/pci/Kconfig | |||
| @@ -30,23 +30,6 @@ config PCI_LEGACY_PROC | |||
| 30 | 30 | ||
| 31 | When in doubt, say N. | 31 | When in doubt, say N. |
| 32 | 32 | ||
| 33 | config PCI_NAMES | ||
| 34 | bool "PCI device name database" | ||
| 35 | depends on PCI | ||
| 36 | ---help--- | ||
| 37 | By default, the kernel contains a database of all known PCI device | ||
| 38 | names to make the information in /proc/pci, /proc/ioports and | ||
| 39 | similar files comprehensible to the user. | ||
| 40 | |||
| 41 | This database increases size of the kernel image by about 80KB. This | ||
| 42 | memory is freed after the system boots up if CONFIG_HOTPLUG is not set. | ||
| 43 | |||
| 44 | Anyway, if you are building an installation floppy or kernel for an | ||
| 45 | embedded system where kernel image size really matters, you can disable | ||
| 46 | this feature and you'll get device ID numbers instead of names. | ||
| 47 | |||
| 48 | When in doubt, say Y. | ||
| 49 | |||
| 50 | config PCI_DEBUG | 33 | config PCI_DEBUG |
| 51 | bool "PCI Debugging" | 34 | bool "PCI Debugging" |
| 52 | depends on PCI && DEBUG_KERNEL | 35 | depends on PCI && DEBUG_KERNEL |
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index 3657f6199c48..716df015f8d0 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile | |||
| @@ -3,14 +3,9 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \ | 5 | obj-y += access.o bus.o probe.o remove.o pci.o quirks.o \ |
| 6 | names.o pci-driver.o search.o pci-sysfs.o \ | 6 | pci-driver.o search.o pci-sysfs.o rom.o setup-res.o |
| 7 | rom.o | ||
| 8 | obj-$(CONFIG_PROC_FS) += proc.o | 7 | obj-$(CONFIG_PROC_FS) += proc.o |
| 9 | 8 | ||
| 10 | ifndef CONFIG_SPARC64 | ||
| 11 | obj-y += setup-res.o | ||
| 12 | endif | ||
| 13 | |||
| 14 | obj-$(CONFIG_HOTPLUG) += hotplug.o | 9 | obj-$(CONFIG_HOTPLUG) += hotplug.o |
| 15 | 10 | ||
| 16 | # Build the PCI Hotplug drivers if we were asked to | 11 | # Build the PCI Hotplug drivers if we were asked to |
| @@ -46,21 +41,6 @@ ifeq ($(CONFIG_PCI_DEBUG),y) | |||
| 46 | EXTRA_CFLAGS += -DDEBUG | 41 | EXTRA_CFLAGS += -DDEBUG |
| 47 | endif | 42 | endif |
| 48 | 43 | ||
| 49 | hostprogs-y := gen-devlist | ||
| 50 | |||
| 51 | # Dependencies on generated files need to be listed explicitly | ||
| 52 | $(obj)/names.o: $(obj)/devlist.h $(obj)/classlist.h | ||
| 53 | $(obj)/classlist.h: $(obj)/devlist.h | ||
| 54 | |||
| 55 | # And that's how to generate them | ||
| 56 | quiet_cmd_devlist = DEVLIST $@ | ||
| 57 | cmd_devlist = ( cd $(obj); ./gen-devlist ) < $< | ||
| 58 | $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist | ||
| 59 | $(call cmd,devlist) | ||
| 60 | |||
| 61 | # Files generated that shall be removed upon make clean | ||
| 62 | clean-files := devlist.h classlist.h | ||
| 63 | |||
| 64 | # Build PCI Express stuff if needed | 44 | # Build PCI Express stuff if needed |
| 65 | obj-$(CONFIG_PCIEPORTBUS) += pcie/ | 45 | obj-$(CONFIG_PCIEPORTBUS) += pcie/ |
| 66 | 46 | ||
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c index fb9a11243d2a..eed67d9e73bc 100644 --- a/drivers/pci/bus.c +++ b/drivers/pci/bus.c | |||
| @@ -140,16 +140,65 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus) | |||
| 140 | void pci_enable_bridges(struct pci_bus *bus) | 140 | void pci_enable_bridges(struct pci_bus *bus) |
| 141 | { | 141 | { |
| 142 | struct pci_dev *dev; | 142 | struct pci_dev *dev; |
| 143 | int retval; | ||
| 143 | 144 | ||
| 144 | list_for_each_entry(dev, &bus->devices, bus_list) { | 145 | list_for_each_entry(dev, &bus->devices, bus_list) { |
| 145 | if (dev->subordinate) { | 146 | if (dev->subordinate) { |
| 146 | pci_enable_device(dev); | 147 | retval = pci_enable_device(dev); |
| 147 | pci_set_master(dev); | 148 | pci_set_master(dev); |
| 148 | pci_enable_bridges(dev->subordinate); | 149 | pci_enable_bridges(dev->subordinate); |
| 149 | } | 150 | } |
| 150 | } | 151 | } |
| 151 | } | 152 | } |
| 152 | 153 | ||
| 154 | /** pci_walk_bus - walk devices on/under bus, calling callback. | ||
| 155 | * @top bus whose devices should be walked | ||
| 156 | * @cb callback to be called for each device found | ||
| 157 | * @userdata arbitrary pointer to be passed to callback. | ||
| 158 | * | ||
| 159 | * Walk the given bus, including any bridged devices | ||
| 160 | * on buses under this bus. Call the provided callback | ||
| 161 | * on each device found. | ||
| 162 | */ | ||
| 163 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), | ||
| 164 | void *userdata) | ||
| 165 | { | ||
| 166 | struct pci_dev *dev; | ||
| 167 | struct pci_bus *bus; | ||
| 168 | struct list_head *next; | ||
| 169 | |||
| 170 | bus = top; | ||
| 171 | spin_lock(&pci_bus_lock); | ||
| 172 | next = top->devices.next; | ||
| 173 | for (;;) { | ||
| 174 | if (next == &bus->devices) { | ||
| 175 | /* end of this bus, go up or finish */ | ||
| 176 | if (bus == top) | ||
| 177 | break; | ||
| 178 | next = bus->self->bus_list.next; | ||
| 179 | bus = bus->self->bus; | ||
| 180 | continue; | ||
| 181 | } | ||
| 182 | dev = list_entry(next, struct pci_dev, bus_list); | ||
| 183 | pci_dev_get(dev); | ||
| 184 | if (dev->subordinate) { | ||
| 185 | /* this is a pci-pci bridge, do its devices next */ | ||
| 186 | next = dev->subordinate->devices.next; | ||
| 187 | bus = dev->subordinate; | ||
| 188 | } else | ||
| 189 | next = dev->bus_list.next; | ||
| 190 | spin_unlock(&pci_bus_lock); | ||
| 191 | |||
| 192 | /* Run device routines with the bus unlocked */ | ||
| 193 | cb(dev, userdata); | ||
| 194 | |||
| 195 | spin_lock(&pci_bus_lock); | ||
| 196 | pci_dev_put(dev); | ||
| 197 | } | ||
| 198 | spin_unlock(&pci_bus_lock); | ||
| 199 | } | ||
| 200 | EXPORT_SYMBOL_GPL(pci_walk_bus); | ||
| 201 | |||
| 153 | EXPORT_SYMBOL(pci_bus_alloc_resource); | 202 | EXPORT_SYMBOL(pci_bus_alloc_resource); |
| 154 | EXPORT_SYMBOL_GPL(pci_bus_add_device); | 203 | EXPORT_SYMBOL_GPL(pci_bus_add_device); |
| 155 | EXPORT_SYMBOL(pci_bus_add_devices); | 204 | EXPORT_SYMBOL(pci_bus_add_devices); |
diff --git a/drivers/pci/gen-devlist.c b/drivers/pci/gen-devlist.c deleted file mode 100644 index 8abfc499fdef..000000000000 --- a/drivers/pci/gen-devlist.c +++ /dev/null | |||
| @@ -1,132 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Generate devlist.h and classlist.h from the PCI ID file. | ||
| 3 | * | ||
| 4 | * (c) 1999--2002 Martin Mares <mj@ucw.cz> | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <stdio.h> | ||
| 8 | #include <string.h> | ||
| 9 | |||
| 10 | #define MAX_NAME_SIZE 200 | ||
| 11 | |||
| 12 | static void | ||
| 13 | pq(FILE *f, const char *c, int len) | ||
| 14 | { | ||
| 15 | int i = 1; | ||
| 16 | while (*c && i != len) { | ||
| 17 | if (*c == '"') | ||
| 18 | fprintf(f, "\\\""); | ||
| 19 | else { | ||
| 20 | fputc(*c, f); | ||
| 21 | if (*c == '?' && c[1] == '?') { | ||
| 22 | /* Avoid trigraphs */ | ||
| 23 | fprintf(f, "\" \""); | ||
| 24 | } | ||
| 25 | } | ||
| 26 | c++; | ||
| 27 | i++; | ||
| 28 | } | ||
| 29 | } | ||
| 30 | |||
| 31 | int | ||
| 32 | main(void) | ||
| 33 | { | ||
| 34 | char line[1024], *c, *bra, vend[8]; | ||
| 35 | int vendors = 0; | ||
| 36 | int mode = 0; | ||
| 37 | int lino = 0; | ||
| 38 | int vendor_len = 0; | ||
| 39 | FILE *devf, *clsf; | ||
| 40 | |||
| 41 | devf = fopen("devlist.h", "w"); | ||
| 42 | clsf = fopen("classlist.h", "w"); | ||
| 43 | if (!devf || !clsf) { | ||
| 44 | fprintf(stderr, "Cannot create output file!\n"); | ||
| 45 | return 1; | ||
| 46 | } | ||
| 47 | |||
| 48 | while (fgets(line, sizeof(line)-1, stdin)) { | ||
| 49 | lino++; | ||
| 50 | if ((c = strchr(line, '\n'))) | ||
| 51 | *c = 0; | ||
| 52 | if (!line[0] || line[0] == '#') | ||
| 53 | continue; | ||
| 54 | if (line[1] == ' ') { | ||
| 55 | if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') { | ||
| 56 | vend[0] = line[2]; | ||
| 57 | vend[1] = line[3]; | ||
| 58 | vend[2] = 0; | ||
| 59 | mode = 2; | ||
| 60 | } else goto err; | ||
| 61 | } | ||
| 62 | else if (line[0] == '\t') { | ||
| 63 | if (line[1] == '\t') | ||
| 64 | continue; | ||
| 65 | switch (mode) { | ||
| 66 | case 1: | ||
| 67 | if (strlen(line) > 5 && line[5] == ' ') { | ||
| 68 | c = line + 5; | ||
| 69 | while (*c == ' ') | ||
| 70 | *c++ = 0; | ||
| 71 | if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) { | ||
| 72 | /* Too long, try cutting off long description */ | ||
| 73 | bra = strchr(c, '['); | ||
| 74 | if (bra && bra > c && bra[-1] == ' ') | ||
| 75 | bra[-1] = 0; | ||
| 76 | if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) { | ||
| 77 | fprintf(stderr, "Line %d: Device name too long. Name truncated.\n", lino); | ||
| 78 | fprintf(stderr, "%s\n", c); | ||
| 79 | /*return 1;*/ | ||
| 80 | } | ||
| 81 | } | ||
| 82 | fprintf(devf, "\tDEVICE(%s,%s,\"", vend, line+1); | ||
| 83 | pq(devf, c, MAX_NAME_SIZE - vendor_len - 1); | ||
| 84 | fputs("\")\n", devf); | ||
| 85 | } else goto err; | ||
| 86 | break; | ||
| 87 | case 2: | ||
| 88 | if (strlen(line) > 3 && line[3] == ' ') { | ||
| 89 | c = line + 3; | ||
| 90 | while (*c == ' ') | ||
| 91 | *c++ = 0; | ||
| 92 | fprintf(clsf, "CLASS(%s%s, \"%s\")\n", vend, line+1, c); | ||
| 93 | } else goto err; | ||
| 94 | break; | ||
| 95 | default: | ||
| 96 | goto err; | ||
| 97 | } | ||
| 98 | } else if (strlen(line) > 4 && line[4] == ' ') { | ||
| 99 | c = line + 4; | ||
| 100 | while (*c == ' ') | ||
| 101 | *c++ = 0; | ||
| 102 | if (vendors) | ||
| 103 | fputs("ENDVENDOR()\n\n", devf); | ||
| 104 | vendors++; | ||
| 105 | strcpy(vend, line); | ||
| 106 | vendor_len = strlen(c); | ||
| 107 | if (vendor_len + 24 > MAX_NAME_SIZE) { | ||
| 108 | fprintf(stderr, "Line %d: Vendor name too long\n", lino); | ||
| 109 | return 1; | ||
| 110 | } | ||
| 111 | fprintf(devf, "VENDOR(%s,\"", vend); | ||
| 112 | pq(devf, c, 0); | ||
| 113 | fputs("\")\n", devf); | ||
| 114 | mode = 1; | ||
| 115 | } else { | ||
| 116 | err: | ||
| 117 | fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line); | ||
| 118 | return 1; | ||
| 119 | } | ||
| 120 | } | ||
| 121 | fputs("ENDVENDOR()\n\ | ||
| 122 | \n\ | ||
| 123 | #undef VENDOR\n\ | ||
| 124 | #undef DEVICE\n\ | ||
| 125 | #undef ENDVENDOR\n", devf); | ||
| 126 | fputs("\n#undef CLASS\n", clsf); | ||
| 127 | |||
| 128 | fclose(devf); | ||
| 129 | fclose(clsf); | ||
| 130 | |||
| 131 | return 0; | ||
| 132 | } | ||
diff --git a/drivers/pci/hotplug/Makefile b/drivers/pci/hotplug/Makefile index 246586a3d91a..3c71e3077ff1 100644 --- a/drivers/pci/hotplug/Makefile +++ b/drivers/pci/hotplug/Makefile | |||
| @@ -41,8 +41,7 @@ acpiphp-objs := acpiphp_core.o \ | |||
| 41 | 41 | ||
| 42 | rpaphp-objs := rpaphp_core.o \ | 42 | rpaphp-objs := rpaphp_core.o \ |
| 43 | rpaphp_pci.o \ | 43 | rpaphp_pci.o \ |
| 44 | rpaphp_slot.o \ | 44 | rpaphp_slot.o |
| 45 | rpaphp_vio.o | ||
| 46 | 45 | ||
| 47 | rpadlpar_io-objs := rpadlpar_core.o \ | 46 | rpadlpar_io-objs := rpadlpar_core.o \ |
| 48 | rpadlpar_sysfs.o | 47 | rpadlpar_sysfs.o |
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index 2b92b9e8c910..061ead21ef14 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
| @@ -302,7 +302,7 @@ static inline void return_resource(struct pci_resource **head, struct pci_resour | |||
| 302 | 302 | ||
| 303 | static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) | 303 | static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) |
| 304 | { | 304 | { |
| 305 | snprintf(buffer, buffer_size, "%d", slot->number); | 305 | snprintf(buffer, buffer_size, "%04d_%04d", slot->bus, slot->number); |
| 306 | } | 306 | } |
| 307 | 307 | ||
| 308 | enum php_ctlr_type { | 308 | enum php_ctlr_type { |
diff --git a/drivers/pci/hotplug/rpadlpar_core.c b/drivers/pci/hotplug/rpadlpar_core.c index 86b384e42717..ad1017da8656 100644 --- a/drivers/pci/hotplug/rpadlpar_core.c +++ b/drivers/pci/hotplug/rpadlpar_core.c | |||
| @@ -19,33 +19,36 @@ | |||
| 19 | #include <asm/pci-bridge.h> | 19 | #include <asm/pci-bridge.h> |
| 20 | #include <asm/semaphore.h> | 20 | #include <asm/semaphore.h> |
| 21 | #include <asm/rtas.h> | 21 | #include <asm/rtas.h> |
| 22 | #include <asm/vio.h> | ||
| 22 | #include "../pci.h" | 23 | #include "../pci.h" |
| 23 | #include "rpaphp.h" | 24 | #include "rpaphp.h" |
| 24 | #include "rpadlpar.h" | 25 | #include "rpadlpar.h" |
| 25 | 26 | ||
| 26 | static DECLARE_MUTEX(rpadlpar_sem); | 27 | static DECLARE_MUTEX(rpadlpar_sem); |
| 27 | 28 | ||
| 29 | #define DLPAR_MODULE_NAME "rpadlpar_io" | ||
| 30 | |||
| 28 | #define NODE_TYPE_VIO 1 | 31 | #define NODE_TYPE_VIO 1 |
| 29 | #define NODE_TYPE_SLOT 2 | 32 | #define NODE_TYPE_SLOT 2 |
| 30 | #define NODE_TYPE_PHB 3 | 33 | #define NODE_TYPE_PHB 3 |
| 31 | 34 | ||
| 32 | static struct device_node *find_php_slot_vio_node(char *drc_name) | 35 | static struct device_node *find_vio_slot_node(char *drc_name) |
| 33 | { | 36 | { |
| 34 | struct device_node *child; | ||
| 35 | struct device_node *parent = of_find_node_by_name(NULL, "vdevice"); | 37 | struct device_node *parent = of_find_node_by_name(NULL, "vdevice"); |
| 36 | char *loc_code; | 38 | struct device_node *dn = NULL; |
| 39 | char *name; | ||
| 40 | int rc; | ||
| 37 | 41 | ||
| 38 | if (!parent) | 42 | if (!parent) |
| 39 | return NULL; | 43 | return NULL; |
| 40 | 44 | ||
| 41 | for (child = of_get_next_child(parent, NULL); | 45 | while ((dn = of_get_next_child(parent, dn))) { |
| 42 | child; child = of_get_next_child(parent, child)) { | 46 | rc = rpaphp_get_drc_props(dn, NULL, &name, NULL, NULL); |
| 43 | loc_code = get_property(child, "ibm,loc-code", NULL); | 47 | if ((rc == 0) && (!strcmp(drc_name, name))) |
| 44 | if (loc_code && !strncmp(loc_code, drc_name, strlen(drc_name))) | 48 | break; |
| 45 | return child; | ||
| 46 | } | 49 | } |
| 47 | 50 | ||
| 48 | return NULL; | 51 | return dn; |
| 49 | } | 52 | } |
| 50 | 53 | ||
| 51 | /* Find dlpar-capable pci node that contains the specified name and type */ | 54 | /* Find dlpar-capable pci node that contains the specified name and type */ |
| @@ -67,7 +70,7 @@ static struct device_node *find_php_slot_pci_node(char *drc_name, | |||
| 67 | return np; | 70 | return np; |
| 68 | } | 71 | } |
| 69 | 72 | ||
| 70 | static struct device_node *find_newly_added_node(char *drc_name, int *node_type) | 73 | static struct device_node *find_dlpar_node(char *drc_name, int *node_type) |
| 71 | { | 74 | { |
| 72 | struct device_node *dn; | 75 | struct device_node *dn; |
| 73 | 76 | ||
| @@ -83,7 +86,7 @@ static struct device_node *find_newly_added_node(char *drc_name, int *node_type) | |||
| 83 | return dn; | 86 | return dn; |
| 84 | } | 87 | } |
| 85 | 88 | ||
| 86 | dn = find_php_slot_vio_node(drc_name); | 89 | dn = find_vio_slot_node(drc_name); |
| 87 | if (dn) { | 90 | if (dn) { |
| 88 | *node_type = NODE_TYPE_VIO; | 91 | *node_type = NODE_TYPE_VIO; |
| 89 | return dn; | 92 | return dn; |
| @@ -92,14 +95,14 @@ static struct device_node *find_newly_added_node(char *drc_name, int *node_type) | |||
| 92 | return NULL; | 95 | return NULL; |
| 93 | } | 96 | } |
| 94 | 97 | ||
| 95 | static struct slot *find_slot(char *drc_name) | 98 | static struct slot *find_slot(struct device_node *dn) |
| 96 | { | 99 | { |
| 97 | struct list_head *tmp, *n; | 100 | struct list_head *tmp, *n; |
| 98 | struct slot *slot; | 101 | struct slot *slot; |
| 99 | 102 | ||
| 100 | list_for_each_safe(tmp, n, &rpaphp_slot_head) { | 103 | list_for_each_safe(tmp, n, &rpaphp_slot_head) { |
| 101 | slot = list_entry(tmp, struct slot, rpaphp_slot_list); | 104 | slot = list_entry(tmp, struct slot, rpaphp_slot_list); |
| 102 | if (strcmp(slot->location, drc_name) == 0) | 105 | if (slot->dn == dn) |
| 103 | return slot; | 106 | return slot; |
| 104 | } | 107 | } |
| 105 | 108 | ||
| @@ -131,7 +134,8 @@ static void rpadlpar_claim_one_bus(struct pci_bus *b) | |||
| 131 | static int pci_add_secondary_bus(struct device_node *dn, | 134 | static int pci_add_secondary_bus(struct device_node *dn, |
| 132 | struct pci_dev *bridge_dev) | 135 | struct pci_dev *bridge_dev) |
| 133 | { | 136 | { |
| 134 | struct pci_controller *hose = dn->phb; | 137 | struct pci_dn *pdn = dn->data; |
| 138 | struct pci_controller *hose = pdn->phb; | ||
| 135 | struct pci_bus *child; | 139 | struct pci_bus *child; |
| 136 | u8 sec_busno; | 140 | u8 sec_busno; |
| 137 | 141 | ||
| @@ -156,7 +160,7 @@ static int pci_add_secondary_bus(struct device_node *dn, | |||
| 156 | if (hose->last_busno < child->number) | 160 | if (hose->last_busno < child->number) |
| 157 | hose->last_busno = child->number; | 161 | hose->last_busno = child->number; |
| 158 | 162 | ||
| 159 | dn->bussubno = child->number; | 163 | pdn->bussubno = child->number; |
| 160 | 164 | ||
| 161 | /* ioremap() for child bus, which may or may not succeed */ | 165 | /* ioremap() for child bus, which may or may not succeed */ |
| 162 | remap_bus_range(child); | 166 | remap_bus_range(child); |
| @@ -164,13 +168,28 @@ static int pci_add_secondary_bus(struct device_node *dn, | |||
| 164 | return 0; | 168 | return 0; |
| 165 | } | 169 | } |
| 166 | 170 | ||
| 171 | static struct pci_dev *dlpar_find_new_dev(struct pci_bus *parent, | ||
| 172 | struct device_node *dev_dn) | ||
| 173 | { | ||
| 174 | struct pci_dev *tmp = NULL; | ||
| 175 | struct device_node *child_dn; | ||
| 176 | |||
| 177 | list_for_each_entry(tmp, &parent->devices, bus_list) { | ||
| 178 | child_dn = pci_device_to_OF_node(tmp); | ||
| 179 | if (child_dn == dev_dn) | ||
| 180 | return tmp; | ||
| 181 | } | ||
| 182 | return NULL; | ||
| 183 | } | ||
| 184 | |||
| 167 | static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn) | 185 | static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn) |
| 168 | { | 186 | { |
| 169 | struct pci_controller *hose = dn->phb; | 187 | struct pci_dn *pdn = dn->data; |
| 188 | struct pci_controller *hose = pdn->phb; | ||
| 170 | struct pci_dev *dev = NULL; | 189 | struct pci_dev *dev = NULL; |
| 171 | 190 | ||
| 172 | /* Scan phb bus for EADS device, adding new one to bus->devices */ | 191 | /* Scan phb bus for EADS device, adding new one to bus->devices */ |
| 173 | if (!pci_scan_single_device(hose->bus, dn->devfn)) { | 192 | if (!pci_scan_single_device(hose->bus, pdn->devfn)) { |
| 174 | printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__); | 193 | printk(KERN_ERR "%s: found no device on bus\n", __FUNCTION__); |
| 175 | return NULL; | 194 | return NULL; |
| 176 | } | 195 | } |
| @@ -179,49 +198,28 @@ static struct pci_dev *dlpar_pci_add_bus(struct device_node *dn) | |||
| 179 | pci_bus_add_devices(hose->bus); | 198 | pci_bus_add_devices(hose->bus); |
| 180 | 199 | ||
| 181 | /* Confirm new bridge dev was created */ | 200 | /* Confirm new bridge dev was created */ |
| 182 | dev = rpaphp_find_pci_dev(dn); | 201 | dev = dlpar_find_new_dev(hose->bus, dn); |
| 183 | if (!dev) { | 202 | if (dev) { |
| 184 | printk(KERN_ERR "%s: failed to add pci device\n", __FUNCTION__); | 203 | if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) { |
| 185 | return NULL; | 204 | printk(KERN_ERR "%s: unexpected header type %d\n", |
| 186 | } | 205 | __FUNCTION__, dev->hdr_type); |
| 206 | return NULL; | ||
| 207 | } | ||
| 187 | 208 | ||
| 188 | if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) { | 209 | if (pci_add_secondary_bus(dn, dev)) |
| 189 | printk(KERN_ERR "%s: unexpected header type %d\n", | 210 | return NULL; |
| 190 | __FUNCTION__, dev->hdr_type); | ||
| 191 | return NULL; | ||
| 192 | } | 211 | } |
| 193 | 212 | ||
| 194 | if (pci_add_secondary_bus(dn, dev)) | ||
| 195 | return NULL; | ||
| 196 | |||
| 197 | return dev; | 213 | return dev; |
| 198 | } | 214 | } |
| 199 | 215 | ||
| 200 | static int dlpar_pci_remove_bus(struct pci_dev *bridge_dev) | 216 | static int dlpar_add_pci_slot(char *drc_name, struct device_node *dn) |
| 201 | { | 217 | { |
| 202 | struct pci_bus *secondary_bus; | 218 | struct pci_dev *dev; |
| 219 | int rc; | ||
| 203 | 220 | ||
| 204 | if (!bridge_dev) { | 221 | if (rpaphp_find_pci_bus(dn)) |
| 205 | printk(KERN_ERR "%s: unexpected null device\n", | ||
| 206 | __FUNCTION__); | ||
| 207 | return -EINVAL; | 222 | return -EINVAL; |
| 208 | } | ||
| 209 | |||
| 210 | secondary_bus = bridge_dev->subordinate; | ||
| 211 | |||
| 212 | if (unmap_bus_range(secondary_bus)) { | ||
| 213 | printk(KERN_ERR "%s: failed to unmap bus range\n", | ||
| 214 | __FUNCTION__); | ||
| 215 | return -ERANGE; | ||
| 216 | } | ||
| 217 | |||
| 218 | pci_remove_bus_device(bridge_dev); | ||
| 219 | return 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | static inline int dlpar_add_pci_slot(char *drc_name, struct device_node *dn) | ||
| 223 | { | ||
| 224 | struct pci_dev *dev; | ||
| 225 | 223 | ||
| 226 | /* Add pci bus */ | 224 | /* Add pci bus */ |
| 227 | dev = dlpar_pci_add_bus(dn); | 225 | dev = dlpar_pci_add_bus(dn); |
| @@ -231,6 +229,21 @@ static inline int dlpar_add_pci_slot(char *drc_name, struct device_node *dn) | |||
| 231 | return -EIO; | 229 | return -EIO; |
| 232 | } | 230 | } |
| 233 | 231 | ||
| 232 | if (dn->child) { | ||
| 233 | rc = rpaphp_config_pci_adapter(dev->subordinate); | ||
| 234 | if (rc < 0) { | ||
| 235 | printk(KERN_ERR "%s: unable to enable slot %s\n", | ||
| 236 | __FUNCTION__, drc_name); | ||
| 237 | return -EIO; | ||
| 238 | } | ||
| 239 | } | ||
| 240 | |||
| 241 | /* Add hotplug slot */ | ||
| 242 | if (rpaphp_add_slot(dn)) { | ||
| 243 | printk(KERN_ERR "%s: unable to add hotplug slot %s\n", | ||
| 244 | __FUNCTION__, drc_name); | ||
| 245 | return -EIO; | ||
| 246 | } | ||
| 234 | return 0; | 247 | return 0; |
| 235 | } | 248 | } |
| 236 | 249 | ||
| @@ -255,47 +268,69 @@ static int dlpar_remove_root_bus(struct pci_controller *phb) | |||
| 255 | return 0; | 268 | return 0; |
| 256 | } | 269 | } |
| 257 | 270 | ||
| 258 | static int dlpar_remove_phb(struct slot *slot) | 271 | static int dlpar_remove_phb(char *drc_name, struct device_node *dn) |
| 259 | { | 272 | { |
| 260 | struct pci_controller *phb; | 273 | struct slot *slot; |
| 261 | struct device_node *dn; | 274 | struct pci_dn *pdn; |
| 262 | int rc = 0; | 275 | int rc = 0; |
| 263 | 276 | ||
| 264 | dn = slot->dn; | 277 | if (!rpaphp_find_pci_bus(dn)) |
| 265 | if (!dn) { | 278 | return -EINVAL; |
| 266 | printk(KERN_ERR "%s: unexpected NULL slot device node\n", | ||
| 267 | __FUNCTION__); | ||
| 268 | return -EIO; | ||
| 269 | } | ||
| 270 | |||
| 271 | phb = dn->phb; | ||
| 272 | if (!phb) { | ||
| 273 | printk(KERN_ERR "%s: unexpected NULL phb pointer\n", | ||
| 274 | __FUNCTION__); | ||
| 275 | return -EIO; | ||
| 276 | } | ||
| 277 | 279 | ||
| 278 | if (rpaphp_remove_slot(slot)) { | 280 | slot = find_slot(dn); |
| 279 | printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", | 281 | if (slot) { |
| 280 | __FUNCTION__, slot->location); | 282 | /* Remove hotplug slot */ |
| 281 | return -EIO; | 283 | if (rpaphp_remove_slot(slot)) { |
| 284 | printk(KERN_ERR | ||
| 285 | "%s: unable to remove hotplug slot %s\n", | ||
| 286 | __FUNCTION__, drc_name); | ||
| 287 | return -EIO; | ||
| 288 | } | ||
| 282 | } | 289 | } |
| 283 | 290 | ||
| 284 | rc = dlpar_remove_root_bus(phb); | 291 | pdn = dn->data; |
| 292 | BUG_ON(!pdn || !pdn->phb); | ||
| 293 | rc = dlpar_remove_root_bus(pdn->phb); | ||
| 285 | if (rc < 0) | 294 | if (rc < 0) |
| 286 | return rc; | 295 | return rc; |
| 287 | 296 | ||
| 297 | pdn->phb = NULL; | ||
| 298 | |||
| 288 | return 0; | 299 | return 0; |
| 289 | } | 300 | } |
| 290 | 301 | ||
| 291 | static int dlpar_add_phb(struct device_node *dn) | 302 | static int dlpar_add_phb(char *drc_name, struct device_node *dn) |
| 292 | { | 303 | { |
| 293 | struct pci_controller *phb; | 304 | struct pci_controller *phb; |
| 294 | 305 | ||
| 306 | if (PCI_DN(dn)->phb) { | ||
| 307 | /* PHB already exists */ | ||
| 308 | return -EINVAL; | ||
| 309 | } | ||
| 310 | |||
| 295 | phb = init_phb_dynamic(dn); | 311 | phb = init_phb_dynamic(dn); |
| 296 | if (!phb) | 312 | if (!phb) |
| 313 | return -EIO; | ||
| 314 | |||
| 315 | if (rpaphp_add_slot(dn)) { | ||
| 316 | printk(KERN_ERR "%s: unable to add hotplug slot %s\n", | ||
| 317 | __FUNCTION__, drc_name); | ||
| 318 | return -EIO; | ||
| 319 | } | ||
| 320 | return 0; | ||
| 321 | } | ||
| 322 | |||
| 323 | static int dlpar_add_vio_slot(char *drc_name, struct device_node *dn) | ||
| 324 | { | ||
| 325 | if (vio_find_node(dn)) | ||
| 297 | return -EINVAL; | 326 | return -EINVAL; |
| 298 | 327 | ||
| 328 | if (!vio_register_device_node(dn)) { | ||
| 329 | printk(KERN_ERR | ||
| 330 | "%s: failed to register vio node %s\n", | ||
| 331 | __FUNCTION__, drc_name); | ||
| 332 | return -EIO; | ||
| 333 | } | ||
| 299 | return 0; | 334 | return 0; |
| 300 | } | 335 | } |
| 301 | 336 | ||
| @@ -316,18 +351,13 @@ int dlpar_add_slot(char *drc_name) | |||
| 316 | { | 351 | { |
| 317 | struct device_node *dn = NULL; | 352 | struct device_node *dn = NULL; |
| 318 | int node_type; | 353 | int node_type; |
| 319 | int rc = 0; | 354 | int rc = -EIO; |
| 320 | 355 | ||
| 321 | if (down_interruptible(&rpadlpar_sem)) | 356 | if (down_interruptible(&rpadlpar_sem)) |
| 322 | return -ERESTARTSYS; | 357 | return -ERESTARTSYS; |
| 323 | 358 | ||
| 324 | /* Check for existing hotplug slot */ | 359 | /* Find newly added node */ |
| 325 | if (find_slot(drc_name)) { | 360 | dn = find_dlpar_node(drc_name, &node_type); |
| 326 | rc = -EINVAL; | ||
| 327 | goto exit; | ||
| 328 | } | ||
| 329 | |||
| 330 | dn = find_newly_added_node(drc_name, &node_type); | ||
| 331 | if (!dn) { | 361 | if (!dn) { |
| 332 | rc = -ENODEV; | 362 | rc = -ENODEV; |
| 333 | goto exit; | 363 | goto exit; |
| @@ -335,24 +365,17 @@ int dlpar_add_slot(char *drc_name) | |||
| 335 | 365 | ||
| 336 | switch (node_type) { | 366 | switch (node_type) { |
| 337 | case NODE_TYPE_VIO: | 367 | case NODE_TYPE_VIO: |
| 338 | /* Just add hotplug slot */ | 368 | rc = dlpar_add_vio_slot(drc_name, dn); |
| 339 | break; | 369 | break; |
| 340 | case NODE_TYPE_SLOT: | 370 | case NODE_TYPE_SLOT: |
| 341 | rc = dlpar_add_pci_slot(drc_name, dn); | 371 | rc = dlpar_add_pci_slot(drc_name, dn); |
| 342 | break; | 372 | break; |
| 343 | case NODE_TYPE_PHB: | 373 | case NODE_TYPE_PHB: |
| 344 | rc = dlpar_add_phb(dn); | 374 | rc = dlpar_add_phb(drc_name, dn); |
| 345 | break; | 375 | break; |
| 346 | default: | ||
| 347 | printk("%s: unexpected node type\n", __FUNCTION__); | ||
| 348 | return -EIO; | ||
| 349 | } | 376 | } |
| 350 | 377 | ||
| 351 | if (!rc && rpaphp_add_slot(dn)) { | 378 | printk(KERN_INFO "%s: slot %s added\n", DLPAR_MODULE_NAME, drc_name); |
| 352 | printk(KERN_ERR "%s: unable to add hotplug slot %s\n", | ||
| 353 | __FUNCTION__, drc_name); | ||
| 354 | rc = -EIO; | ||
| 355 | } | ||
| 356 | exit: | 379 | exit: |
| 357 | up(&rpadlpar_sem); | 380 | up(&rpadlpar_sem); |
| 358 | return rc; | 381 | return rc; |
| @@ -366,17 +389,17 @@ exit: | |||
| 366 | * of an I/O Slot. | 389 | * of an I/O Slot. |
| 367 | * Return Codes: | 390 | * Return Codes: |
| 368 | * 0 Success | 391 | * 0 Success |
| 369 | * -EIO Internal Error | 392 | * -EINVAL Vio dev doesn't exist |
| 370 | */ | 393 | */ |
| 371 | int dlpar_remove_vio_slot(struct slot *slot, char *drc_name) | 394 | static int dlpar_remove_vio_slot(char *drc_name, struct device_node *dn) |
| 372 | { | 395 | { |
| 373 | /* Remove hotplug slot */ | 396 | struct vio_dev *vio_dev; |
| 374 | 397 | ||
| 375 | if (rpaphp_remove_slot(slot)) { | 398 | vio_dev = vio_find_node(dn); |
| 376 | printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", | 399 | if (!vio_dev) |
| 377 | __FUNCTION__, drc_name); | 400 | return -EINVAL; |
| 378 | return -EIO; | 401 | |
| 379 | } | 402 | vio_unregister_device(vio_dev); |
| 380 | return 0; | 403 | return 0; |
| 381 | } | 404 | } |
| 382 | 405 | ||
| @@ -391,31 +414,34 @@ int dlpar_remove_vio_slot(struct slot *slot, char *drc_name) | |||
| 391 | * -ENODEV Not a valid drc_name | 414 | * -ENODEV Not a valid drc_name |
| 392 | * -EIO Internal PCI Error | 415 | * -EIO Internal PCI Error |
| 393 | */ | 416 | */ |
| 394 | int dlpar_remove_pci_slot(struct slot *slot, char *drc_name) | 417 | int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn) |
| 395 | { | 418 | { |
| 396 | struct pci_dev *bridge_dev; | 419 | struct pci_bus *bus; |
| 420 | struct slot *slot; | ||
| 397 | 421 | ||
| 398 | bridge_dev = slot->bridge; | 422 | bus = rpaphp_find_pci_bus(dn); |
| 399 | if (!bridge_dev) { | 423 | if (!bus) |
| 400 | printk(KERN_ERR "%s: unexpected null bridge device\n", | 424 | return -EINVAL; |
| 401 | __FUNCTION__); | ||
| 402 | return -EIO; | ||
| 403 | } | ||
| 404 | 425 | ||
| 405 | /* Remove hotplug slot */ | 426 | slot = find_slot(dn); |
| 406 | if (rpaphp_remove_slot(slot)) { | 427 | if (slot) { |
| 407 | printk(KERN_ERR "%s: unable to remove hotplug slot %s\n", | 428 | /* Remove hotplug slot */ |
| 408 | __FUNCTION__, drc_name); | 429 | if (rpaphp_remove_slot(slot)) { |
| 409 | return -EIO; | 430 | printk(KERN_ERR |
| 431 | "%s: unable to remove hotplug slot %s\n", | ||
| 432 | __FUNCTION__, drc_name); | ||
| 433 | return -EIO; | ||
| 434 | } | ||
| 410 | } | 435 | } |
| 411 | 436 | ||
| 412 | /* Remove pci bus */ | 437 | if (unmap_bus_range(bus)) { |
| 413 | 438 | printk(KERN_ERR "%s: failed to unmap bus range\n", | |
| 414 | if (dlpar_pci_remove_bus(bridge_dev)) { | 439 | __FUNCTION__); |
| 415 | printk(KERN_ERR "%s: unable to remove pci bus %s\n", | 440 | return -ERANGE; |
| 416 | __FUNCTION__, drc_name); | ||
| 417 | return -EIO; | ||
| 418 | } | 441 | } |
| 442 | |||
| 443 | BUG_ON(!bus->self); | ||
| 444 | pci_remove_bus_device(bus->self); | ||
| 419 | return 0; | 445 | return 0; |
| 420 | } | 446 | } |
| 421 | 447 | ||
| @@ -434,38 +460,31 @@ int dlpar_remove_pci_slot(struct slot *slot, char *drc_name) | |||
| 434 | */ | 460 | */ |
| 435 | int dlpar_remove_slot(char *drc_name) | 461 | int dlpar_remove_slot(char *drc_name) |
| 436 | { | 462 | { |
| 437 | struct slot *slot; | 463 | struct device_node *dn; |
| 464 | int node_type; | ||
| 438 | int rc = 0; | 465 | int rc = 0; |
| 439 | 466 | ||
| 440 | if (down_interruptible(&rpadlpar_sem)) | 467 | if (down_interruptible(&rpadlpar_sem)) |
| 441 | return -ERESTARTSYS; | 468 | return -ERESTARTSYS; |
| 442 | 469 | ||
| 443 | if (!find_php_slot_vio_node(drc_name) && | 470 | dn = find_dlpar_node(drc_name, &node_type); |
| 444 | !find_php_slot_pci_node(drc_name, "SLOT") && | 471 | if (!dn) { |
| 445 | !find_php_slot_pci_node(drc_name, "PHB")) { | ||
| 446 | rc = -ENODEV; | 472 | rc = -ENODEV; |
| 447 | goto exit; | 473 | goto exit; |
| 448 | } | 474 | } |
| 449 | 475 | ||
| 450 | slot = find_slot(drc_name); | 476 | switch (node_type) { |
| 451 | if (!slot) { | 477 | case NODE_TYPE_VIO: |
| 452 | rc = -EINVAL; | 478 | rc = dlpar_remove_vio_slot(drc_name, dn); |
| 453 | goto exit; | 479 | break; |
| 454 | } | 480 | case NODE_TYPE_PHB: |
| 455 | 481 | rc = dlpar_remove_phb(drc_name, dn); | |
| 456 | if (slot->type == PHB) { | 482 | break; |
| 457 | rc = dlpar_remove_phb(slot); | 483 | case NODE_TYPE_SLOT: |
| 458 | } else { | 484 | rc = dlpar_remove_pci_slot(drc_name, dn); |
| 459 | switch (slot->dev_type) { | 485 | break; |
| 460 | case PCI_DEV: | ||
| 461 | rc = dlpar_remove_pci_slot(slot, drc_name); | ||
| 462 | break; | ||
| 463 | |||
| 464 | case VIO_DEV: | ||
| 465 | rc = dlpar_remove_vio_slot(slot, drc_name); | ||
| 466 | break; | ||
| 467 | } | ||
| 468 | } | 486 | } |
| 487 | printk(KERN_INFO "%s: slot %s removed\n", DLPAR_MODULE_NAME, drc_name); | ||
| 469 | exit: | 488 | exit: |
| 470 | up(&rpadlpar_sem); | 489 | up(&rpadlpar_sem); |
| 471 | return rc; | 490 | return rc; |
diff --git a/drivers/pci/hotplug/rpaphp.h b/drivers/pci/hotplug/rpaphp.h index 81746e6e0e0f..61d94d1e29cb 100644 --- a/drivers/pci/hotplug/rpaphp.h +++ b/drivers/pci/hotplug/rpaphp.h | |||
| @@ -30,10 +30,6 @@ | |||
| 30 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
| 31 | #include "pci_hotplug.h" | 31 | #include "pci_hotplug.h" |
| 32 | 32 | ||
| 33 | #define PHB 2 | ||
| 34 | #define HOTPLUG 1 | ||
| 35 | #define EMBEDDED 0 | ||
| 36 | |||
| 37 | #define DR_INDICATOR 9002 | 33 | #define DR_INDICATOR 9002 |
| 38 | #define DR_ENTITY_SENSE 9003 | 34 | #define DR_ENTITY_SENSE 9003 |
| 39 | 35 | ||
| @@ -61,10 +57,6 @@ extern int debug; | |||
| 61 | #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg) | 57 | #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg) |
| 62 | #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) | 58 | #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg) |
| 63 | 59 | ||
| 64 | /* slot types */ | ||
| 65 | #define VIO_DEV 1 | ||
| 66 | #define PCI_DEV 2 | ||
| 67 | |||
| 68 | /* slot states */ | 60 | /* slot states */ |
| 69 | 61 | ||
| 70 | #define NOT_VALID 3 | 62 | #define NOT_VALID 3 |
| @@ -72,11 +64,6 @@ extern int debug; | |||
| 72 | #define CONFIGURED 1 | 64 | #define CONFIGURED 1 |
| 73 | #define EMPTY 0 | 65 | #define EMPTY 0 |
| 74 | 66 | ||
| 75 | struct rpaphp_pci_func { | ||
| 76 | struct pci_dev *pci_dev; | ||
| 77 | struct list_head sibling; | ||
| 78 | }; | ||
| 79 | |||
| 80 | /* | 67 | /* |
| 81 | * struct slot - slot information for each *physical* slot | 68 | * struct slot - slot information for each *physical* slot |
| 82 | */ | 69 | */ |
| @@ -88,15 +75,9 @@ struct slot { | |||
| 88 | u32 power_domain; | 75 | u32 power_domain; |
| 89 | char *name; | 76 | char *name; |
| 90 | char *location; | 77 | char *location; |
| 91 | u8 removable; | 78 | struct device_node *dn; |
| 92 | u8 dev_type; /* VIO or PCI */ | 79 | struct pci_bus *bus; |
| 93 | struct device_node *dn; /* slot's device_node in OFDT */ | 80 | struct list_head *pci_devs; |
| 94 | /* dn has phb info */ | ||
| 95 | struct pci_dev *bridge; /* slot's pci_dev in pci_devices */ | ||
| 96 | union { | ||
| 97 | struct list_head *pci_devs; /* pci_devs in PCI slot */ | ||
| 98 | struct vio_dev *vio_dev; /* vio_dev in VIO slot */ | ||
| 99 | } dev; | ||
| 100 | struct hotplug_slot *hotplug_slot; | 81 | struct hotplug_slot *hotplug_slot; |
| 101 | }; | 82 | }; |
| 102 | 83 | ||
| @@ -107,13 +88,13 @@ extern int num_slots; | |||
| 107 | /* function prototypes */ | 88 | /* function prototypes */ |
| 108 | 89 | ||
| 109 | /* rpaphp_pci.c */ | 90 | /* rpaphp_pci.c */ |
| 110 | extern struct pci_dev *rpaphp_find_pci_dev(struct device_node *dn); | 91 | extern struct pci_bus *rpaphp_find_pci_bus(struct device_node *dn); |
| 111 | extern int rpaphp_claim_resource(struct pci_dev *dev, int resource); | 92 | extern int rpaphp_claim_resource(struct pci_dev *dev, int resource); |
| 112 | extern int rpaphp_enable_pci_slot(struct slot *slot); | 93 | extern int rpaphp_enable_pci_slot(struct slot *slot); |
| 113 | extern int register_pci_slot(struct slot *slot); | 94 | extern int register_pci_slot(struct slot *slot); |
| 114 | extern int rpaphp_unconfig_pci_adapter(struct slot *slot); | 95 | extern int rpaphp_unconfig_pci_adapter(struct slot *slot); |
| 115 | extern int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value); | 96 | extern int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value); |
| 116 | extern struct hotplug_slot *rpaphp_find_hotplug_slot(struct pci_dev *dev); | 97 | extern int rpaphp_config_pci_adapter(struct pci_bus *bus); |
| 117 | 98 | ||
| 118 | /* rpaphp_core.c */ | 99 | /* rpaphp_core.c */ |
| 119 | extern int rpaphp_add_slot(struct device_node *dn); | 100 | extern int rpaphp_add_slot(struct device_node *dn); |
| @@ -121,12 +102,6 @@ extern int rpaphp_remove_slot(struct slot *slot); | |||
| 121 | extern int rpaphp_get_drc_props(struct device_node *dn, int *drc_index, | 102 | extern int rpaphp_get_drc_props(struct device_node *dn, int *drc_index, |
| 122 | char **drc_name, char **drc_type, int *drc_power_domain); | 103 | char **drc_name, char **drc_type, int *drc_power_domain); |
| 123 | 104 | ||
| 124 | /* rpaphp_vio.c */ | ||
| 125 | extern int rpaphp_get_vio_adapter_status(struct slot *slot, int is_init, u8 * value); | ||
| 126 | extern int rpaphp_unconfig_vio_adapter(struct slot *slot); | ||
| 127 | extern int register_vio_slot(struct device_node *dn); | ||
| 128 | extern int rpaphp_enable_vio_slot(struct slot *slot); | ||
| 129 | |||
| 130 | /* rpaphp_slot.c */ | 105 | /* rpaphp_slot.c */ |
| 131 | extern void dealloc_slot_struct(struct slot *slot); | 106 | extern void dealloc_slot_struct(struct slot *slot); |
| 132 | extern struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_name, int power_domain); | 107 | extern struct slot *alloc_slot_struct(struct device_node *dn, int drc_index, char *drc_name, int power_domain); |
diff --git a/drivers/pci/hotplug/rpaphp_core.c b/drivers/pci/hotplug/rpaphp_core.c index 29117a3a3287..c830ff0acdc3 100644 --- a/drivers/pci/hotplug/rpaphp_core.c +++ b/drivers/pci/hotplug/rpaphp_core.c | |||
| @@ -152,17 +152,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 * value) | |||
| 152 | int retval = 0; | 152 | int retval = 0; |
| 153 | 153 | ||
| 154 | down(&rpaphp_sem); | 154 | down(&rpaphp_sem); |
| 155 | /* have to go through this */ | 155 | retval = rpaphp_get_pci_adapter_status(slot, 0, value); |
| 156 | switch (slot->dev_type) { | ||
| 157 | case PCI_DEV: | ||
| 158 | retval = rpaphp_get_pci_adapter_status(slot, 0, value); | ||
| 159 | break; | ||
| 160 | case VIO_DEV: | ||
| 161 | retval = rpaphp_get_vio_adapter_status(slot, 0, value); | ||
| 162 | break; | ||
| 163 | default: | ||
| 164 | retval = -EINVAL; | ||
| 165 | } | ||
| 166 | up(&rpaphp_sem); | 156 | up(&rpaphp_sem); |
| 167 | return retval; | 157 | return retval; |
| 168 | } | 158 | } |
| @@ -317,34 +307,6 @@ static int is_php_dn(struct device_node *dn, int **indexes, int **names, | |||
| 317 | return 0; | 307 | return 0; |
| 318 | } | 308 | } |
| 319 | 309 | ||
| 320 | static int is_dr_dn(struct device_node *dn, int **indexes, int **names, | ||
| 321 | int **types, int **power_domains, int **my_drc_index) | ||
| 322 | { | ||
| 323 | int rc; | ||
| 324 | |||
| 325 | *my_drc_index = (int *) get_property(dn, "ibm,my-drc-index", NULL); | ||
| 326 | if(!*my_drc_index) | ||
| 327 | return (0); | ||
| 328 | |||
| 329 | if (!dn->parent) | ||
| 330 | return (0); | ||
| 331 | |||
| 332 | rc = get_children_props(dn->parent, indexes, names, types, | ||
| 333 | power_domains); | ||
| 334 | return (rc >= 0); | ||
| 335 | } | ||
| 336 | |||
| 337 | static inline int is_vdevice_root(struct device_node *dn) | ||
| 338 | { | ||
| 339 | return !strcmp(dn->name, "vdevice"); | ||
| 340 | } | ||
| 341 | |||
| 342 | int is_dlpar_type(const char *type_str) | ||
| 343 | { | ||
| 344 | /* Only register DLPAR-capable nodes of drc-type PHB or SLOT */ | ||
| 345 | return (!strcmp(type_str, "PHB") || !strcmp(type_str, "SLOT")); | ||
| 346 | } | ||
| 347 | |||
| 348 | /**************************************************************** | 310 | /**************************************************************** |
| 349 | * rpaphp not only registers PCI hotplug slots(HOTPLUG), | 311 | * rpaphp not only registers PCI hotplug slots(HOTPLUG), |
| 350 | * but also logical DR slots(EMBEDDED). | 312 | * but also logical DR slots(EMBEDDED). |
| @@ -356,54 +318,33 @@ int rpaphp_add_slot(struct device_node *dn) | |||
| 356 | { | 318 | { |
| 357 | struct slot *slot; | 319 | struct slot *slot; |
| 358 | int retval = 0; | 320 | int retval = 0; |
| 359 | int i, *my_drc_index, slot_type; | 321 | int i; |
| 360 | int *indexes, *names, *types, *power_domains; | 322 | int *indexes, *names, *types, *power_domains; |
| 361 | char *name, *type; | 323 | char *name, *type; |
| 362 | 324 | ||
| 363 | dbg("Entry %s: dn->full_name=%s\n", __FUNCTION__, dn->full_name); | 325 | dbg("Entry %s: dn->full_name=%s\n", __FUNCTION__, dn->full_name); |
| 364 | 326 | ||
| 365 | if (dn->parent && is_vdevice_root(dn->parent)) { | ||
| 366 | /* register a VIO device */ | ||
| 367 | retval = register_vio_slot(dn); | ||
| 368 | goto exit; | ||
| 369 | } | ||
| 370 | |||
| 371 | /* register PCI devices */ | 327 | /* register PCI devices */ |
| 372 | if (dn->name != 0 && strcmp(dn->name, "pci") == 0) { | 328 | if (dn->name != 0 && strcmp(dn->name, "pci") == 0) { |
| 373 | if (is_php_dn(dn, &indexes, &names, &types, &power_domains)) | 329 | if (!is_php_dn(dn, &indexes, &names, &types, &power_domains)) |
| 374 | slot_type = HOTPLUG; | 330 | goto exit; |
| 375 | else if (is_dr_dn(dn, &indexes, &names, &types, &power_domains, &my_drc_index)) | ||
| 376 | slot_type = EMBEDDED; | ||
| 377 | else goto exit; | ||
| 378 | 331 | ||
| 379 | name = (char *) &names[1]; | 332 | name = (char *) &names[1]; |
| 380 | type = (char *) &types[1]; | 333 | type = (char *) &types[1]; |
| 381 | for (i = 0; i < indexes[0]; i++, | 334 | for (i = 0; i < indexes[0]; i++, |
| 382 | name += (strlen(name) + 1), type += (strlen(type) + 1)) { | 335 | name += (strlen(name) + 1), type += (strlen(type) + 1)) { |
| 383 | 336 | ||
| 384 | if (slot_type == HOTPLUG || | 337 | if (!(slot = alloc_slot_struct(dn, indexes[i + 1], name, |
| 385 | (slot_type == EMBEDDED && | 338 | power_domains[i + 1]))) { |
| 386 | indexes[i + 1] == my_drc_index[0] && | 339 | retval = -ENOMEM; |
| 387 | is_dlpar_type(type))) { | 340 | goto exit; |
| 388 | if (!(slot = alloc_slot_struct(dn, indexes[i + 1], name, | 341 | } |
| 389 | power_domains[i + 1]))) { | 342 | slot->type = simple_strtoul(type, NULL, 10); |
| 390 | retval = -ENOMEM; | ||
| 391 | goto exit; | ||
| 392 | } | ||
| 393 | if (!strcmp(type, "PHB")) | ||
| 394 | slot->type = PHB; | ||
| 395 | else if (slot_type == EMBEDDED) | ||
| 396 | slot->type = EMBEDDED; | ||
| 397 | else | ||
| 398 | slot->type = simple_strtoul(type, NULL, 10); | ||
| 399 | 343 | ||
| 400 | dbg(" Found drc-index:0x%x drc-name:%s drc-type:%s\n", | 344 | dbg("Found drc-index:0x%x drc-name:%s drc-type:%s\n", |
| 401 | indexes[i + 1], name, type); | 345 | indexes[i + 1], name, type); |
| 402 | 346 | ||
| 403 | retval = register_pci_slot(slot); | 347 | retval = register_pci_slot(slot); |
| 404 | if (slot_type == EMBEDDED) | ||
| 405 | goto exit; | ||
| 406 | } | ||
| 407 | } | 348 | } |
| 408 | } | 349 | } |
| 409 | exit: | 350 | exit: |
| @@ -412,31 +353,6 @@ exit: | |||
| 412 | return retval; | 353 | return retval; |
| 413 | } | 354 | } |
| 414 | 355 | ||
| 415 | /* | ||
| 416 | * init_slots - initialize 'struct slot' structures for each slot | ||
| 417 | * | ||
| 418 | */ | ||
| 419 | static void init_slots(void) | ||
| 420 | { | ||
| 421 | struct device_node *dn; | ||
| 422 | |||
| 423 | for (dn = find_all_nodes(); dn; dn = dn->next) | ||
| 424 | rpaphp_add_slot(dn); | ||
| 425 | } | ||
| 426 | |||
| 427 | static int __init init_rpa(void) | ||
| 428 | { | ||
| 429 | |||
| 430 | init_MUTEX(&rpaphp_sem); | ||
| 431 | |||
| 432 | /* initialize internal data structure etc. */ | ||
| 433 | init_slots(); | ||
| 434 | if (!num_slots) | ||
| 435 | return -ENODEV; | ||
| 436 | |||
| 437 | return 0; | ||
| 438 | } | ||
| 439 | |||
| 440 | static void __exit cleanup_slots(void) | 356 | static void __exit cleanup_slots(void) |
| 441 | { | 357 | { |
| 442 | struct list_head *tmp, *n; | 358 | struct list_head *tmp, *n; |
| @@ -458,10 +374,18 @@ static void __exit cleanup_slots(void) | |||
| 458 | 374 | ||
| 459 | static int __init rpaphp_init(void) | 375 | static int __init rpaphp_init(void) |
| 460 | { | 376 | { |
| 377 | struct device_node *dn = NULL; | ||
| 378 | |||
| 461 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); | 379 | info(DRIVER_DESC " version: " DRIVER_VERSION "\n"); |
| 380 | init_MUTEX(&rpaphp_sem); | ||
| 462 | 381 | ||
| 463 | /* read all the PRA info from the system */ | 382 | while ((dn = of_find_node_by_type(dn, "pci"))) |
| 464 | return init_rpa(); | 383 | rpaphp_add_slot(dn); |
| 384 | |||
| 385 | if (!num_slots) | ||
| 386 | return -ENODEV; | ||
| 387 | |||
| 388 | return 0; | ||
| 465 | } | 389 | } |
| 466 | 390 | ||
| 467 | static void __exit rpaphp_exit(void) | 391 | static void __exit rpaphp_exit(void) |
| @@ -481,16 +405,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot) | |||
| 481 | 405 | ||
| 482 | dbg("ENABLING SLOT %s\n", slot->name); | 406 | dbg("ENABLING SLOT %s\n", slot->name); |
| 483 | down(&rpaphp_sem); | 407 | down(&rpaphp_sem); |
| 484 | switch (slot->dev_type) { | 408 | retval = rpaphp_enable_pci_slot(slot); |
| 485 | case PCI_DEV: | ||
| 486 | retval = rpaphp_enable_pci_slot(slot); | ||
| 487 | break; | ||
| 488 | case VIO_DEV: | ||
| 489 | retval = rpaphp_enable_vio_slot(slot); | ||
| 490 | break; | ||
| 491 | default: | ||
| 492 | retval = -EINVAL; | ||
| 493 | } | ||
| 494 | up(&rpaphp_sem); | 409 | up(&rpaphp_sem); |
| 495 | exit: | 410 | exit: |
| 496 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); | 411 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); |
| @@ -511,16 +426,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot) | |||
| 511 | 426 | ||
| 512 | dbg("DISABLING SLOT %s\n", slot->name); | 427 | dbg("DISABLING SLOT %s\n", slot->name); |
| 513 | down(&rpaphp_sem); | 428 | down(&rpaphp_sem); |
| 514 | switch (slot->dev_type) { | 429 | retval = rpaphp_unconfig_pci_adapter(slot); |
| 515 | case PCI_DEV: | ||
| 516 | retval = rpaphp_unconfig_pci_adapter(slot); | ||
| 517 | break; | ||
| 518 | case VIO_DEV: | ||
| 519 | retval = rpaphp_unconfig_vio_adapter(slot); | ||
| 520 | break; | ||
| 521 | default: | ||
| 522 | retval = -ENODEV; | ||
| 523 | } | ||
| 524 | up(&rpaphp_sem); | 430 | up(&rpaphp_sem); |
| 525 | exit: | 431 | exit: |
| 526 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); | 432 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); |
diff --git a/drivers/pci/hotplug/rpaphp_pci.c b/drivers/pci/hotplug/rpaphp_pci.c index d8305a935aab..49e4d10a6488 100644 --- a/drivers/pci/hotplug/rpaphp_pci.c +++ b/drivers/pci/hotplug/rpaphp_pci.c | |||
| @@ -30,22 +30,35 @@ | |||
| 30 | 30 | ||
| 31 | #include "rpaphp.h" | 31 | #include "rpaphp.h" |
| 32 | 32 | ||
| 33 | struct pci_dev *rpaphp_find_pci_dev(struct device_node *dn) | 33 | static struct pci_bus *find_bus_among_children(struct pci_bus *bus, |
| 34 | struct device_node *dn) | ||
| 34 | { | 35 | { |
| 35 | struct pci_dev *dev = NULL; | 36 | struct pci_bus *child = NULL; |
| 36 | char bus_id[BUS_ID_SIZE]; | 37 | struct list_head *tmp; |
| 38 | struct device_node *busdn; | ||
| 39 | |||
| 40 | busdn = pci_bus_to_OF_node(bus); | ||
| 41 | if (busdn == dn) | ||
| 42 | return bus; | ||
| 37 | 43 | ||
| 38 | sprintf(bus_id, "%04x:%02x:%02x.%d", dn->phb->global_number, | 44 | list_for_each(tmp, &bus->children) { |
| 39 | dn->busno, PCI_SLOT(dn->devfn), PCI_FUNC(dn->devfn)); | 45 | child = find_bus_among_children(pci_bus_b(tmp), dn); |
| 40 | for_each_pci_dev(dev) { | 46 | if (child) |
| 41 | if (!strcmp(pci_name(dev), bus_id)) { | ||
| 42 | break; | 47 | break; |
| 43 | } | ||
| 44 | } | 48 | } |
| 45 | return dev; | 49 | return child; |
| 46 | } | 50 | } |
| 47 | 51 | ||
| 48 | EXPORT_SYMBOL_GPL(rpaphp_find_pci_dev); | 52 | struct pci_bus *rpaphp_find_pci_bus(struct device_node *dn) |
| 53 | { | ||
| 54 | struct pci_dn *pdn = dn->data; | ||
| 55 | |||
| 56 | if (!pdn || !pdn->phb || !pdn->phb->bus) | ||
| 57 | return NULL; | ||
| 58 | |||
| 59 | return find_bus_among_children(pdn->phb->bus, dn); | ||
| 60 | } | ||
| 61 | EXPORT_SYMBOL_GPL(rpaphp_find_pci_bus); | ||
| 49 | 62 | ||
| 50 | int rpaphp_claim_resource(struct pci_dev *dev, int resource) | 63 | int rpaphp_claim_resource(struct pci_dev *dev, int resource) |
| 51 | { | 64 | { |
| @@ -69,11 +82,6 @@ int rpaphp_claim_resource(struct pci_dev *dev, int resource) | |||
| 69 | 82 | ||
| 70 | EXPORT_SYMBOL_GPL(rpaphp_claim_resource); | 83 | EXPORT_SYMBOL_GPL(rpaphp_claim_resource); |
| 71 | 84 | ||
| 72 | static struct pci_dev *rpaphp_find_bridge_pdev(struct slot *slot) | ||
| 73 | { | ||
| 74 | return rpaphp_find_pci_dev(slot->dn); | ||
| 75 | } | ||
| 76 | |||
| 77 | static int rpaphp_get_sensor_state(struct slot *slot, int *state) | 85 | static int rpaphp_get_sensor_state(struct slot *slot, int *state) |
| 78 | { | 86 | { |
| 79 | int rc; | 87 | int rc; |
| @@ -116,39 +124,27 @@ static int rpaphp_get_sensor_state(struct slot *slot, int *state) | |||
| 116 | */ | 124 | */ |
| 117 | int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value) | 125 | int rpaphp_get_pci_adapter_status(struct slot *slot, int is_init, u8 * value) |
| 118 | { | 126 | { |
| 127 | struct pci_bus *bus; | ||
| 119 | int state, rc; | 128 | int state, rc; |
| 120 | struct device_node *child_dn; | ||
| 121 | struct pci_dev *child_dev = NULL; | ||
| 122 | 129 | ||
| 123 | *value = NOT_VALID; | 130 | *value = NOT_VALID; |
| 124 | rc = rpaphp_get_sensor_state(slot, &state); | 131 | rc = rpaphp_get_sensor_state(slot, &state); |
| 125 | if (rc) | 132 | if (rc) |
| 126 | goto exit; | 133 | goto exit; |
| 127 | 134 | ||
| 128 | if ((state == EMPTY) || (slot->type == PHB)) { | 135 | if (state == EMPTY) |
| 129 | dbg("slot is empty\n"); | ||
| 130 | *value = EMPTY; | 136 | *value = EMPTY; |
| 131 | } | ||
| 132 | else if (state == PRESENT) { | 137 | else if (state == PRESENT) { |
| 133 | if (!is_init) { | 138 | if (!is_init) { |
| 134 | /* at run-time slot->state can be changed by */ | 139 | /* at run-time slot->state can be changed by */ |
| 135 | /* config/unconfig adapter */ | 140 | /* config/unconfig adapter */ |
| 136 | *value = slot->state; | 141 | *value = slot->state; |
| 137 | } else { | 142 | } else { |
| 138 | child_dn = slot->dn->child; | 143 | bus = rpaphp_find_pci_bus(slot->dn); |
| 139 | if (child_dn) | 144 | if (bus && !list_empty(&bus->devices)) |
| 140 | child_dev = rpaphp_find_pci_dev(child_dn); | 145 | *value = CONFIGURED; |
| 141 | 146 | else | |
| 142 | if (child_dev) | ||
| 143 | *value = CONFIGURED; | ||
| 144 | else if (!child_dn) | ||
| 145 | dbg("%s: %s is not valid OFDT node\n", | ||
| 146 | __FUNCTION__, slot->dn->full_name); | ||
| 147 | else { | ||
| 148 | err("%s: can't find pdev of adapter in slot[%s]\n", | ||
| 149 | __FUNCTION__, slot->dn->full_name); | ||
| 150 | *value = NOT_CONFIGURED; | 147 | *value = NOT_CONFIGURED; |
| 151 | } | ||
| 152 | } | 148 | } |
| 153 | } | 149 | } |
| 154 | exit: | 150 | exit: |
| @@ -186,39 +182,6 @@ rpaphp_fixup_new_pci_devices(struct pci_bus *bus, int fix_bus) | |||
| 186 | } | 182 | } |
| 187 | } | 183 | } |
| 188 | 184 | ||
| 189 | static int rpaphp_pci_config_bridge(struct pci_dev *dev); | ||
| 190 | |||
| 191 | /***************************************************************************** | ||
| 192 | rpaphp_pci_config_slot() will configure all devices under the | ||
| 193 | given slot->dn and return the the first pci_dev. | ||
| 194 | *****************************************************************************/ | ||
| 195 | static struct pci_dev * | ||
| 196 | rpaphp_pci_config_slot(struct device_node *dn, struct pci_bus *bus) | ||
| 197 | { | ||
| 198 | struct device_node *eads_first_child = dn->child; | ||
| 199 | struct pci_dev *dev = NULL; | ||
| 200 | int num; | ||
| 201 | |||
| 202 | dbg("Enter %s: dn=%s bus=%s\n", __FUNCTION__, dn->full_name, bus->name); | ||
| 203 | |||
| 204 | if (eads_first_child) { | ||
| 205 | /* pci_scan_slot should find all children of EADs */ | ||
| 206 | num = pci_scan_slot(bus, PCI_DEVFN(PCI_SLOT(eads_first_child->devfn), 0)); | ||
| 207 | if (num) { | ||
| 208 | rpaphp_fixup_new_pci_devices(bus, 1); | ||
| 209 | pci_bus_add_devices(bus); | ||
| 210 | } | ||
| 211 | dev = rpaphp_find_pci_dev(eads_first_child); | ||
| 212 | if (!dev) { | ||
| 213 | err("No new device found\n"); | ||
| 214 | return NULL; | ||
| 215 | } | ||
| 216 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
| 217 | rpaphp_pci_config_bridge(dev); | ||
| 218 | } | ||
| 219 | return dev; | ||
| 220 | } | ||
| 221 | |||
| 222 | static int rpaphp_pci_config_bridge(struct pci_dev *dev) | 185 | static int rpaphp_pci_config_bridge(struct pci_dev *dev) |
| 223 | { | 186 | { |
| 224 | u8 sec_busno; | 187 | u8 sec_busno; |
| @@ -252,6 +215,42 @@ static int rpaphp_pci_config_bridge(struct pci_dev *dev) | |||
| 252 | return 0; | 215 | return 0; |
| 253 | } | 216 | } |
| 254 | 217 | ||
| 218 | /***************************************************************************** | ||
| 219 | rpaphp_pci_config_slot() will configure all devices under the | ||
| 220 | given slot->dn and return the the first pci_dev. | ||
| 221 | *****************************************************************************/ | ||
| 222 | static struct pci_dev * | ||
| 223 | rpaphp_pci_config_slot(struct pci_bus *bus) | ||
| 224 | { | ||
| 225 | struct device_node *dn = pci_bus_to_OF_node(bus); | ||
| 226 | struct pci_dev *dev = NULL; | ||
| 227 | int slotno; | ||
| 228 | int num; | ||
| 229 | |||
| 230 | dbg("Enter %s: dn=%s bus=%s\n", __FUNCTION__, dn->full_name, bus->name); | ||
| 231 | if (!dn || !dn->child) | ||
| 232 | return NULL; | ||
| 233 | |||
| 234 | slotno = PCI_SLOT(PCI_DN(dn->child)->devfn); | ||
| 235 | |||
| 236 | /* pci_scan_slot should find all children */ | ||
| 237 | num = pci_scan_slot(bus, PCI_DEVFN(slotno, 0)); | ||
| 238 | if (num) { | ||
| 239 | rpaphp_fixup_new_pci_devices(bus, 1); | ||
| 240 | pci_bus_add_devices(bus); | ||
| 241 | } | ||
| 242 | if (list_empty(&bus->devices)) { | ||
| 243 | err("%s: No new device found\n", __FUNCTION__); | ||
| 244 | return NULL; | ||
| 245 | } | ||
| 246 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 247 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) | ||
| 248 | rpaphp_pci_config_bridge(dev); | ||
| 249 | } | ||
| 250 | |||
| 251 | return dev; | ||
| 252 | } | ||
| 253 | |||
| 255 | static void enable_eeh(struct device_node *dn) | 254 | static void enable_eeh(struct device_node *dn) |
| 256 | { | 255 | { |
| 257 | struct device_node *sib; | 256 | struct device_node *sib; |
| @@ -263,49 +262,44 @@ static void enable_eeh(struct device_node *dn) | |||
| 263 | 262 | ||
| 264 | } | 263 | } |
| 265 | 264 | ||
| 266 | static void print_slot_pci_funcs(struct slot *slot) | 265 | static void print_slot_pci_funcs(struct pci_bus *bus) |
| 267 | { | 266 | { |
| 267 | struct device_node *dn; | ||
| 268 | struct pci_dev *dev; | 268 | struct pci_dev *dev; |
| 269 | 269 | ||
| 270 | if (slot->dev_type == PCI_DEV) { | 270 | dn = pci_bus_to_OF_node(bus); |
| 271 | dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, slot->name); | 271 | if (!dn) |
| 272 | list_for_each_entry (dev, slot->dev.pci_devs, bus_list) | 272 | return; |
| 273 | dbg("\t%s\n", pci_name(dev)); | 273 | |
| 274 | } | 274 | dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, dn->full_name); |
| 275 | list_for_each_entry (dev, &bus->devices, bus_list) | ||
| 276 | dbg("\t%s\n", pci_name(dev)); | ||
| 275 | return; | 277 | return; |
| 276 | } | 278 | } |
| 277 | 279 | ||
| 278 | static int rpaphp_config_pci_adapter(struct slot *slot) | 280 | int rpaphp_config_pci_adapter(struct pci_bus *bus) |
| 279 | { | 281 | { |
| 280 | struct pci_bus *pci_bus; | 282 | struct device_node *dn = pci_bus_to_OF_node(bus); |
| 281 | struct pci_dev *dev; | 283 | struct pci_dev *dev; |
| 282 | int rc = -ENODEV; | 284 | int rc = -ENODEV; |
| 283 | 285 | ||
| 284 | dbg("Entry %s: slot[%s]\n", __FUNCTION__, slot->name); | 286 | dbg("Entry %s: slot[%s]\n", __FUNCTION__, dn->full_name); |
| 285 | 287 | if (!dn) | |
| 286 | if (slot->bridge) { | 288 | goto exit; |
| 287 | 289 | ||
| 288 | pci_bus = slot->bridge->subordinate; | 290 | enable_eeh(dn); |
| 289 | if (!pci_bus) { | 291 | dev = rpaphp_pci_config_slot(bus); |
| 290 | err("%s: can't find bus structure\n", __FUNCTION__); | 292 | if (!dev) { |
| 291 | goto exit; | 293 | err("%s: can't find any devices.\n", __FUNCTION__); |
| 292 | } | 294 | goto exit; |
| 293 | enable_eeh(slot->dn); | ||
| 294 | dev = rpaphp_pci_config_slot(slot->dn, pci_bus); | ||
| 295 | if (!dev) { | ||
| 296 | err("%s: can't find any devices.\n", __FUNCTION__); | ||
| 297 | goto exit; | ||
| 298 | } | ||
| 299 | print_slot_pci_funcs(slot); | ||
| 300 | rc = 0; | ||
| 301 | } else { | ||
| 302 | /* slot is not enabled */ | ||
| 303 | err("slot doesn't have pci_dev structure\n"); | ||
| 304 | } | 295 | } |
| 296 | print_slot_pci_funcs(bus); | ||
| 297 | rc = 0; | ||
| 305 | exit: | 298 | exit: |
| 306 | dbg("Exit %s: rc=%d\n", __FUNCTION__, rc); | 299 | dbg("Exit %s: rc=%d\n", __FUNCTION__, rc); |
| 307 | return rc; | 300 | return rc; |
| 308 | } | 301 | } |
| 302 | EXPORT_SYMBOL_GPL(rpaphp_config_pci_adapter); | ||
| 309 | 303 | ||
| 310 | static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev) | 304 | static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev) |
| 311 | { | 305 | { |
| @@ -327,13 +321,14 @@ static void rpaphp_eeh_remove_bus_device(struct pci_dev *dev) | |||
| 327 | 321 | ||
| 328 | int rpaphp_unconfig_pci_adapter(struct slot *slot) | 322 | int rpaphp_unconfig_pci_adapter(struct slot *slot) |
| 329 | { | 323 | { |
| 330 | struct pci_dev *dev; | 324 | struct pci_dev *dev, *tmp; |
| 331 | int retval = 0; | 325 | int retval = 0; |
| 332 | 326 | ||
| 333 | list_for_each_entry(dev, slot->dev.pci_devs, bus_list) | 327 | list_for_each_entry_safe(dev, tmp, slot->pci_devs, bus_list) { |
| 334 | rpaphp_eeh_remove_bus_device(dev); | 328 | rpaphp_eeh_remove_bus_device(dev); |
| 329 | pci_remove_bus_device(dev); | ||
| 330 | } | ||
| 335 | 331 | ||
| 336 | pci_remove_behind_bridge(slot->bridge); | ||
| 337 | slot->state = NOT_CONFIGURED; | 332 | slot->state = NOT_CONFIGURED; |
| 338 | info("%s: devices in slot[%s] unconfigured.\n", __FUNCTION__, | 333 | info("%s: devices in slot[%s] unconfigured.\n", __FUNCTION__, |
| 339 | slot->name); | 334 | slot->name); |
| @@ -356,66 +351,41 @@ static int setup_pci_hotplug_slot_info(struct slot *slot) | |||
| 356 | return 0; | 351 | return 0; |
| 357 | } | 352 | } |
| 358 | 353 | ||
| 359 | static int set_phb_slot_name(struct slot *slot) | 354 | static void set_slot_name(struct slot *slot) |
| 360 | { | 355 | { |
| 361 | struct device_node *dn; | 356 | struct pci_bus *bus = slot->bus; |
| 362 | struct pci_controller *phb; | 357 | struct pci_dev *bridge; |
| 363 | struct pci_bus *bus; | ||
| 364 | |||
| 365 | dn = slot->dn; | ||
| 366 | if (!dn) { | ||
| 367 | return -EINVAL; | ||
| 368 | } | ||
| 369 | phb = dn->phb; | ||
| 370 | if (!phb) { | ||
| 371 | return -EINVAL; | ||
| 372 | } | ||
| 373 | bus = phb->bus; | ||
| 374 | if (!bus) { | ||
| 375 | return -EINVAL; | ||
| 376 | } | ||
| 377 | 358 | ||
| 378 | sprintf(slot->name, "%04x:%02x:%02x.%x", pci_domain_nr(bus), | 359 | bridge = bus->self; |
| 379 | bus->number, 0, 0); | 360 | if (bridge) |
| 380 | return 0; | 361 | strcpy(slot->name, pci_name(bridge)); |
| 362 | else | ||
| 363 | sprintf(slot->name, "%04x:%02x:00.0", pci_domain_nr(bus), | ||
| 364 | bus->number); | ||
| 381 | } | 365 | } |
| 382 | 366 | ||
| 383 | static int setup_pci_slot(struct slot *slot) | 367 | static int setup_pci_slot(struct slot *slot) |
| 384 | { | 368 | { |
| 369 | struct device_node *dn = slot->dn; | ||
| 385 | struct pci_bus *bus; | 370 | struct pci_bus *bus; |
| 386 | int rc; | ||
| 387 | 371 | ||
| 388 | if (slot->type == PHB) { | 372 | BUG_ON(!dn); |
| 389 | rc = set_phb_slot_name(slot); | 373 | bus = rpaphp_find_pci_bus(dn); |
| 390 | if (rc < 0) { | 374 | if (!bus) { |
| 391 | err("%s: failed to set phb slot name\n", __FUNCTION__); | 375 | err("%s: no pci_bus for dn %s\n", __FUNCTION__, dn->full_name); |
| 392 | goto exit_rc; | 376 | goto exit_rc; |
| 393 | } | ||
| 394 | } else { | ||
| 395 | slot->bridge = rpaphp_find_bridge_pdev(slot); | ||
| 396 | if (!slot->bridge) { | ||
| 397 | /* slot being added doesn't have pci_dev yet */ | ||
| 398 | err("%s: no pci_dev for bridge dn %s\n", | ||
| 399 | __FUNCTION__, slot->name); | ||
| 400 | goto exit_rc; | ||
| 401 | } | ||
| 402 | |||
| 403 | bus = slot->bridge->subordinate; | ||
| 404 | if (!bus) | ||
| 405 | goto exit_rc; | ||
| 406 | slot->dev.pci_devs = &bus->devices; | ||
| 407 | |||
| 408 | dbg("%s set slot->name to %s\n", __FUNCTION__, | ||
| 409 | pci_name(slot->bridge)); | ||
| 410 | strcpy(slot->name, pci_name(slot->bridge)); | ||
| 411 | } | 377 | } |
| 412 | 378 | ||
| 379 | slot->bus = bus; | ||
| 380 | slot->pci_devs = &bus->devices; | ||
| 381 | set_slot_name(slot); | ||
| 382 | |||
| 413 | /* find slot's pci_dev if it's not empty */ | 383 | /* find slot's pci_dev if it's not empty */ |
| 414 | if (slot->hotplug_slot->info->adapter_status == EMPTY) { | 384 | if (slot->hotplug_slot->info->adapter_status == EMPTY) { |
| 415 | slot->state = EMPTY; /* slot is empty */ | 385 | slot->state = EMPTY; /* slot is empty */ |
| 416 | } else { | 386 | } else { |
| 417 | /* slot is occupied */ | 387 | /* slot is occupied */ |
| 418 | if (!(slot->dn->child)) { | 388 | if (!dn->child) { |
| 419 | /* non-empty slot has to have child */ | 389 | /* non-empty slot has to have child */ |
| 420 | err("%s: slot[%s]'s device_node doesn't have child for adapter\n", | 390 | err("%s: slot[%s]'s device_node doesn't have child for adapter\n", |
| 421 | __FUNCTION__, slot->name); | 391 | __FUNCTION__, slot->name); |
| @@ -425,7 +395,7 @@ static int setup_pci_slot(struct slot *slot) | |||
| 425 | if (slot->hotplug_slot->info->adapter_status == NOT_CONFIGURED) { | 395 | if (slot->hotplug_slot->info->adapter_status == NOT_CONFIGURED) { |
| 426 | dbg("%s CONFIGURING pci adapter in slot[%s]\n", | 396 | dbg("%s CONFIGURING pci adapter in slot[%s]\n", |
| 427 | __FUNCTION__, slot->name); | 397 | __FUNCTION__, slot->name); |
| 428 | if (rpaphp_config_pci_adapter(slot)) { | 398 | if (rpaphp_config_pci_adapter(slot->bus)) { |
| 429 | err("%s: CONFIG pci adapter failed\n", __FUNCTION__); | 399 | err("%s: CONFIG pci adapter failed\n", __FUNCTION__); |
| 430 | goto exit_rc; | 400 | goto exit_rc; |
| 431 | } | 401 | } |
| @@ -435,8 +405,8 @@ static int setup_pci_slot(struct slot *slot) | |||
| 435 | __FUNCTION__, slot->name); | 405 | __FUNCTION__, slot->name); |
| 436 | goto exit_rc; | 406 | goto exit_rc; |
| 437 | } | 407 | } |
| 438 | print_slot_pci_funcs(slot); | 408 | print_slot_pci_funcs(slot->bus); |
| 439 | if (!list_empty(slot->dev.pci_devs)) { | 409 | if (!list_empty(slot->pci_devs)) { |
| 440 | slot->state = CONFIGURED; | 410 | slot->state = CONFIGURED; |
| 441 | } else { | 411 | } else { |
| 442 | /* DLPAR add as opposed to | 412 | /* DLPAR add as opposed to |
| @@ -454,11 +424,6 @@ int register_pci_slot(struct slot *slot) | |||
| 454 | { | 424 | { |
| 455 | int rc = -EINVAL; | 425 | int rc = -EINVAL; |
| 456 | 426 | ||
| 457 | slot->dev_type = PCI_DEV; | ||
| 458 | if ((slot->type == EMBEDDED) || (slot->type == PHB)) | ||
| 459 | slot->removable = 0; | ||
| 460 | else | ||
| 461 | slot->removable = 1; | ||
| 462 | if (setup_pci_hotplug_slot_info(slot)) | 427 | if (setup_pci_hotplug_slot_info(slot)) |
| 463 | goto exit_rc; | 428 | goto exit_rc; |
| 464 | if (setup_pci_slot(slot)) | 429 | if (setup_pci_slot(slot)) |
| @@ -479,7 +444,7 @@ int rpaphp_enable_pci_slot(struct slot *slot) | |||
| 479 | /* if slot is not empty, enable the adapter */ | 444 | /* if slot is not empty, enable the adapter */ |
| 480 | if (state == PRESENT) { | 445 | if (state == PRESENT) { |
| 481 | dbg("%s : slot[%s] is occupied.\n", __FUNCTION__, slot->name); | 446 | dbg("%s : slot[%s] is occupied.\n", __FUNCTION__, slot->name); |
| 482 | retval = rpaphp_config_pci_adapter(slot); | 447 | retval = rpaphp_config_pci_adapter(slot->bus); |
| 483 | if (!retval) { | 448 | if (!retval) { |
| 484 | slot->state = CONFIGURED; | 449 | slot->state = CONFIGURED; |
| 485 | dbg("%s: PCI devices in slot[%s] has been configured\n", | 450 | dbg("%s: PCI devices in slot[%s] has been configured\n", |
| @@ -502,37 +467,3 @@ exit: | |||
| 502 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); | 467 | dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval); |
| 503 | return retval; | 468 | return retval; |
| 504 | } | 469 | } |
| 505 | |||
| 506 | struct hotplug_slot *rpaphp_find_hotplug_slot(struct pci_dev *dev) | ||
| 507 | { | ||
| 508 | struct list_head *tmp, *n; | ||
| 509 | struct slot *slot; | ||
| 510 | |||
| 511 | list_for_each_safe(tmp, n, &rpaphp_slot_head) { | ||
| 512 | struct pci_bus *bus; | ||
| 513 | struct list_head *ln; | ||
| 514 | |||
| 515 | slot = list_entry(tmp, struct slot, rpaphp_slot_list); | ||
| 516 | if (slot->bridge == NULL) { | ||
| 517 | if (slot->dev_type == PCI_DEV) { | ||
| 518 | printk(KERN_WARNING "PCI slot missing bridge %s %s \n", | ||
| 519 | slot->name, slot->location); | ||
| 520 | } | ||
| 521 | continue; | ||
| 522 | } | ||
| 523 | |||
| 524 | bus = slot->bridge->subordinate; | ||
| 525 | if (!bus) { | ||
| 526 | continue; /* should never happen? */ | ||
| 527 | } | ||
| 528 | for (ln = bus->devices.next; ln != &bus->devices; ln = ln->next) { | ||
| 529 | struct pci_dev *pdev = pci_dev_b(ln); | ||
| 530 | if (pdev == dev) | ||
| 531 | return slot->hotplug_slot; | ||
| 532 | } | ||
| 533 | } | ||
| 534 | |||
| 535 | return NULL; | ||
| 536 | } | ||
| 537 | |||
| 538 | EXPORT_SYMBOL_GPL(rpaphp_find_hotplug_slot); | ||
diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c index ff2cbf0652d8..0e8815495083 100644 --- a/drivers/pci/hotplug/rpaphp_slot.c +++ b/drivers/pci/hotplug/rpaphp_slot.c | |||
| @@ -30,35 +30,6 @@ | |||
| 30 | #include <asm/rtas.h> | 30 | #include <asm/rtas.h> |
| 31 | #include "rpaphp.h" | 31 | #include "rpaphp.h" |
| 32 | 32 | ||
| 33 | static ssize_t removable_read_file (struct hotplug_slot *php_slot, char *buf) | ||
| 34 | { | ||
| 35 | u8 value; | ||
| 36 | int retval = -ENOENT; | ||
| 37 | struct slot *slot = (struct slot *)php_slot->private; | ||
| 38 | |||
| 39 | if (!slot) | ||
| 40 | return retval; | ||
| 41 | |||
| 42 | value = slot->removable; | ||
| 43 | retval = sprintf (buf, "%d\n", value); | ||
| 44 | return retval; | ||
| 45 | } | ||
| 46 | |||
| 47 | static struct hotplug_slot_attribute hotplug_slot_attr_removable = { | ||
| 48 | .attr = {.name = "phy_removable", .mode = S_IFREG | S_IRUGO}, | ||
| 49 | .show = removable_read_file, | ||
| 50 | }; | ||
| 51 | |||
| 52 | static void rpaphp_sysfs_add_attr_removable (struct hotplug_slot *slot) | ||
| 53 | { | ||
| 54 | sysfs_create_file(&slot->kobj, &hotplug_slot_attr_removable.attr); | ||
| 55 | } | ||
| 56 | |||
| 57 | static void rpaphp_sysfs_remove_attr_removable (struct hotplug_slot *slot) | ||
| 58 | { | ||
| 59 | sysfs_remove_file(&slot->kobj, &hotplug_slot_attr_removable.attr); | ||
| 60 | } | ||
| 61 | |||
| 62 | static ssize_t location_read_file (struct hotplug_slot *php_slot, char *buf) | 33 | static ssize_t location_read_file (struct hotplug_slot *php_slot, char *buf) |
| 63 | { | 34 | { |
| 64 | char *value; | 35 | char *value; |
| @@ -176,9 +147,6 @@ int deregister_slot(struct slot *slot) | |||
| 176 | /* remove "phy_location" file */ | 147 | /* remove "phy_location" file */ |
| 177 | rpaphp_sysfs_remove_attr_location(php_slot); | 148 | rpaphp_sysfs_remove_attr_location(php_slot); |
| 178 | 149 | ||
| 179 | /* remove "phy_removable" file */ | ||
| 180 | rpaphp_sysfs_remove_attr_removable(php_slot); | ||
| 181 | |||
| 182 | retval = pci_hp_deregister(php_slot); | 150 | retval = pci_hp_deregister(php_slot); |
| 183 | if (retval) | 151 | if (retval) |
| 184 | err("Problem unregistering a slot %s\n", slot->name); | 152 | err("Problem unregistering a slot %s\n", slot->name); |
| @@ -212,21 +180,13 @@ int register_slot(struct slot *slot) | |||
| 212 | /* create "phy_locatoin" file */ | 180 | /* create "phy_locatoin" file */ |
| 213 | rpaphp_sysfs_add_attr_location(slot->hotplug_slot); | 181 | rpaphp_sysfs_add_attr_location(slot->hotplug_slot); |
| 214 | 182 | ||
| 215 | /* create "phy_removable" file */ | ||
| 216 | rpaphp_sysfs_add_attr_removable(slot->hotplug_slot); | ||
| 217 | |||
| 218 | /* add slot to our internal list */ | 183 | /* add slot to our internal list */ |
| 219 | dbg("%s adding slot[%s] to rpaphp_slot_list\n", | 184 | dbg("%s adding slot[%s] to rpaphp_slot_list\n", |
| 220 | __FUNCTION__, slot->name); | 185 | __FUNCTION__, slot->name); |
| 221 | 186 | ||
| 222 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); | 187 | list_add(&slot->rpaphp_slot_list, &rpaphp_slot_head); |
| 223 | 188 | info("Slot [%s](PCI location=%s) registered\n", slot->name, | |
| 224 | if (slot->dev_type == VIO_DEV) | 189 | slot->location); |
| 225 | info("Slot [%s](VIO location=%s) registered\n", | ||
| 226 | slot->name, slot->location); | ||
| 227 | else | ||
| 228 | info("Slot [%s](PCI location=%s) registered\n", | ||
| 229 | slot->name, slot->location); | ||
| 230 | num_slots++; | 190 | num_slots++; |
| 231 | return 0; | 191 | return 0; |
| 232 | } | 192 | } |
| @@ -235,21 +195,17 @@ int rpaphp_get_power_status(struct slot *slot, u8 * value) | |||
| 235 | { | 195 | { |
| 236 | int rc = 0, level; | 196 | int rc = 0, level; |
| 237 | 197 | ||
| 238 | if (slot->type == HOTPLUG) { | 198 | rc = rtas_get_power_level(slot->power_domain, &level); |
| 239 | rc = rtas_get_power_level(slot->power_domain, &level); | 199 | if (rc < 0) { |
| 240 | if (!rc) { | 200 | err("failed to get power-level for slot(%s), rc=0x%x\n", |
| 241 | dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n", | 201 | slot->location, rc); |
| 242 | __FUNCTION__, slot->name, slot->power_domain, level); | 202 | return rc; |
| 243 | *value = level; | ||
| 244 | } else | ||
| 245 | err("failed to get power-level for slot(%s), rc=0x%x\n", | ||
| 246 | slot->location, rc); | ||
| 247 | } else { | ||
| 248 | dbg("%s report POWER_ON for EMBEDDED or PHB slot %s\n", | ||
| 249 | __FUNCTION__, slot->location); | ||
| 250 | *value = (u8) POWER_ON; | ||
| 251 | } | 203 | } |
| 252 | 204 | ||
| 205 | dbg("%s the power level of slot %s(pwd-domain:0x%x) is %d\n", | ||
| 206 | __FUNCTION__, slot->name, slot->power_domain, level); | ||
| 207 | *value = level; | ||
| 208 | |||
| 253 | return rc; | 209 | return rc; |
| 254 | } | 210 | } |
| 255 | 211 | ||
diff --git a/drivers/pci/hotplug/rpaphp_vio.c b/drivers/pci/hotplug/rpaphp_vio.c deleted file mode 100644 index 74df6a305e64..000000000000 --- a/drivers/pci/hotplug/rpaphp_vio.c +++ /dev/null | |||
| @@ -1,129 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * RPA Hot Plug Virtual I/O device functions | ||
| 3 | * Copyright (C) 2004 Linda Xie <lxie@us.ibm.com> | ||
| 4 | * | ||
| 5 | * All rights reserved. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or (at | ||
| 10 | * your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, but | ||
| 13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 15 | * NON INFRINGEMENT. See the GNU General Public License for more | ||
| 16 | * details. | ||
| 17 | * | ||
| 18 | * You should have received a copy of the GNU General Public License | ||
| 19 | * along with this program; if not, write to the Free Software | ||
| 20 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
| 21 | * | ||
| 22 | * Send feedback to <lxie@us.ibm.com> | ||
| 23 | * | ||
| 24 | */ | ||
| 25 | #include <asm/vio.h> | ||
| 26 | #include "rpaphp.h" | ||
| 27 | |||
| 28 | /* | ||
| 29 | * get_vio_adapter_status - get the status of a slot | ||
| 30 | * | ||
| 31 | * status: | ||
| 32 | * | ||
| 33 | * 1-- adapter is configured | ||
| 34 | * 2-- adapter is not configured | ||
| 35 | * 3-- not valid | ||
| 36 | */ | ||
| 37 | inline int rpaphp_get_vio_adapter_status(struct slot *slot, int is_init, u8 *value) | ||
| 38 | { | ||
| 39 | *value = slot->state; | ||
| 40 | return 0; | ||
| 41 | } | ||
| 42 | |||
| 43 | int rpaphp_unconfig_vio_adapter(struct slot *slot) | ||
| 44 | { | ||
| 45 | int retval = 0; | ||
| 46 | |||
| 47 | dbg("Entry %s: slot[%s]\n", __FUNCTION__, slot->name); | ||
| 48 | if (!slot->dev.vio_dev) { | ||
| 49 | info("%s: no VIOA in slot[%s]\n", __FUNCTION__, slot->name); | ||
| 50 | retval = -EINVAL; | ||
| 51 | goto exit; | ||
| 52 | } | ||
| 53 | /* remove the device from the vio core */ | ||
| 54 | vio_unregister_device(slot->dev.vio_dev); | ||
| 55 | slot->state = NOT_CONFIGURED; | ||
| 56 | info("%s: adapter in slot[%s] unconfigured.\n", __FUNCTION__, slot->name); | ||
| 57 | exit: | ||
| 58 | dbg("Exit %s, rc=0x%x\n", __FUNCTION__, retval); | ||
| 59 | return retval; | ||
| 60 | } | ||
| 61 | |||
| 62 | static int setup_vio_hotplug_slot_info(struct slot *slot) | ||
| 63 | { | ||
| 64 | slot->hotplug_slot->info->power_status = 1; | ||
| 65 | rpaphp_get_vio_adapter_status(slot, 1, | ||
| 66 | &slot->hotplug_slot->info->adapter_status); | ||
| 67 | return 0; | ||
| 68 | } | ||
| 69 | |||
| 70 | int register_vio_slot(struct device_node *dn) | ||
| 71 | { | ||
| 72 | u32 *index; | ||
| 73 | char *name; | ||
| 74 | int rc = -EINVAL; | ||
| 75 | struct slot *slot = NULL; | ||
| 76 | |||
| 77 | rc = rpaphp_get_drc_props(dn, NULL, &name, NULL, NULL); | ||
| 78 | if (rc < 0) | ||
| 79 | goto exit_rc; | ||
| 80 | index = (u32 *) get_property(dn, "ibm,my-drc-index", NULL); | ||
| 81 | if (!index) | ||
| 82 | goto exit_rc; | ||
| 83 | if (!(slot = alloc_slot_struct(dn, *index, name, 0))) { | ||
| 84 | rc = -ENOMEM; | ||
| 85 | goto exit_rc; | ||
| 86 | } | ||
| 87 | slot->dev_type = VIO_DEV; | ||
| 88 | slot->dev.vio_dev = vio_find_node(dn); | ||
| 89 | if (slot->dev.vio_dev) { | ||
| 90 | /* | ||
| 91 | * rpaphp is the only owner of vio devices and | ||
| 92 | * does not need extra reference taken by | ||
| 93 | * vio_find_node | ||
| 94 | */ | ||
| 95 | put_device(&slot->dev.vio_dev->dev); | ||
| 96 | } else | ||
| 97 | slot->dev.vio_dev = vio_register_device_node(dn); | ||
| 98 | if (slot->dev.vio_dev) | ||
| 99 | slot->state = CONFIGURED; | ||
| 100 | else | ||
| 101 | slot->state = NOT_CONFIGURED; | ||
| 102 | if (setup_vio_hotplug_slot_info(slot)) | ||
| 103 | goto exit_rc; | ||
| 104 | strcpy(slot->name, slot->dev.vio_dev->dev.bus_id); | ||
| 105 | info("%s: registered VIO device[name=%s vio_dev=%p]\n", | ||
| 106 | __FUNCTION__, slot->name, slot->dev.vio_dev); | ||
| 107 | rc = register_slot(slot); | ||
| 108 | exit_rc: | ||
| 109 | if (rc && slot) | ||
| 110 | dealloc_slot_struct(slot); | ||
| 111 | return (rc); | ||
| 112 | } | ||
| 113 | |||
| 114 | int rpaphp_enable_vio_slot(struct slot *slot) | ||
| 115 | { | ||
| 116 | int retval = 0; | ||
| 117 | |||
| 118 | if ((slot->dev.vio_dev = vio_register_device_node(slot->dn))) { | ||
| 119 | info("%s: VIO adapter %s in slot[%s] has been configured\n", | ||
| 120 | __FUNCTION__, slot->dn->name, slot->name); | ||
| 121 | slot->state = CONFIGURED; | ||
| 122 | } else { | ||
| 123 | info("%s: no vio_dev struct for adapter in slot[%s]\n", | ||
| 124 | __FUNCTION__, slot->name); | ||
| 125 | slot->state = NOT_CONFIGURED; | ||
| 126 | } | ||
| 127 | |||
| 128 | return retval; | ||
| 129 | } | ||
diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c index 323041fd41dc..b1409441c1cd 100644 --- a/drivers/pci/hotplug/sgi_hotplug.c +++ b/drivers/pci/hotplug/sgi_hotplug.c | |||
| @@ -32,14 +32,15 @@ MODULE_LICENSE("GPL"); | |||
| 32 | MODULE_AUTHOR("SGI (prarit@sgi.com, dickie@sgi.com, habeck@sgi.com)"); | 32 | MODULE_AUTHOR("SGI (prarit@sgi.com, dickie@sgi.com, habeck@sgi.com)"); |
| 33 | MODULE_DESCRIPTION("SGI Altix Hot Plug PCI Controller Driver"); | 33 | MODULE_DESCRIPTION("SGI Altix Hot Plug PCI Controller Driver"); |
| 34 | 34 | ||
| 35 | #define PCIIO_ASIC_TYPE_TIOCA 4 | 35 | #define PCIIO_ASIC_TYPE_TIOCA 4 |
| 36 | #define PCI_SLOT_ALREADY_UP 2 /* slot already up */ | 36 | #define PCI_SLOT_ALREADY_UP 2 /* slot already up */ |
| 37 | #define PCI_SLOT_ALREADY_DOWN 3 /* slot already down */ | 37 | #define PCI_SLOT_ALREADY_DOWN 3 /* slot already down */ |
| 38 | #define PCI_L1_ERR 7 /* L1 console command error */ | 38 | #define PCI_L1_ERR 7 /* L1 console command error */ |
| 39 | #define PCI_EMPTY_33MHZ 15 /* empty 33 MHz bus */ | 39 | #define PCI_EMPTY_33MHZ 15 /* empty 33 MHz bus */ |
| 40 | #define PCI_L1_QSIZE 128 /* our L1 message buffer size */ | 40 | #define PCI_L1_QSIZE 128 /* our L1 message buffer size */ |
| 41 | #define SN_MAX_HP_SLOTS 32 /* max number of hotplug slots */ | 41 | #define SN_MAX_HP_SLOTS 32 /* max hotplug slots */ |
| 42 | #define SGI_HOTPLUG_PROM_REV 0x0420 /* Min. required PROM version */ | 42 | #define SGI_HOTPLUG_PROM_REV 0x0430 /* Min. required PROM version */ |
| 43 | #define SN_SLOT_NAME_SIZE 33 /* size of name string */ | ||
| 43 | 44 | ||
| 44 | /* internal list head */ | 45 | /* internal list head */ |
| 45 | static struct list_head sn_hp_list; | 46 | static struct list_head sn_hp_list; |
| @@ -51,6 +52,7 @@ struct slot { | |||
| 51 | /* this struct for glue internal only */ | 52 | /* this struct for glue internal only */ |
| 52 | struct hotplug_slot *hotplug_slot; | 53 | struct hotplug_slot *hotplug_slot; |
| 53 | struct list_head hp_list; | 54 | struct list_head hp_list; |
| 55 | char physical_path[SN_SLOT_NAME_SIZE]; | ||
| 54 | }; | 56 | }; |
| 55 | 57 | ||
| 56 | struct pcibr_slot_enable_resp { | 58 | struct pcibr_slot_enable_resp { |
| @@ -70,7 +72,7 @@ enum sn_pci_req_e { | |||
| 70 | 72 | ||
| 71 | static int enable_slot(struct hotplug_slot *slot); | 73 | static int enable_slot(struct hotplug_slot *slot); |
| 72 | static int disable_slot(struct hotplug_slot *slot); | 74 | static int disable_slot(struct hotplug_slot *slot); |
| 73 | static int get_power_status(struct hotplug_slot *slot, u8 *value); | 75 | static inline int get_power_status(struct hotplug_slot *slot, u8 *value); |
| 74 | 76 | ||
| 75 | static struct hotplug_slot_ops sn_hotplug_slot_ops = { | 77 | static struct hotplug_slot_ops sn_hotplug_slot_ops = { |
| 76 | .owner = THIS_MODULE, | 78 | .owner = THIS_MODULE, |
| @@ -81,6 +83,21 @@ static struct hotplug_slot_ops sn_hotplug_slot_ops = { | |||
| 81 | 83 | ||
| 82 | static DECLARE_MUTEX(sn_hotplug_sem); | 84 | static DECLARE_MUTEX(sn_hotplug_sem); |
| 83 | 85 | ||
| 86 | static ssize_t path_show (struct hotplug_slot *bss_hotplug_slot, | ||
| 87 | char *buf) | ||
| 88 | { | ||
| 89 | int retval = -ENOENT; | ||
| 90 | struct slot *slot = bss_hotplug_slot->private; | ||
| 91 | |||
| 92 | if (!slot) | ||
| 93 | return retval; | ||
| 94 | |||
| 95 | retval = sprintf (buf, "%s\n", slot->physical_path); | ||
| 96 | return retval; | ||
| 97 | } | ||
| 98 | |||
| 99 | static struct hotplug_slot_attribute sn_slot_path_attr = __ATTR_RO(path); | ||
| 100 | |||
| 84 | static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) | 101 | static int sn_pci_slot_valid(struct pci_bus *pci_bus, int device) |
| 85 | { | 102 | { |
| 86 | struct pcibus_info *pcibus_info; | 103 | struct pcibus_info *pcibus_info; |
| @@ -120,15 +137,15 @@ static int sn_pci_bus_valid(struct pci_bus *pci_bus) | |||
| 120 | /* Only register slots in I/O Bricks that support hotplug */ | 137 | /* Only register slots in I/O Bricks that support hotplug */ |
| 121 | bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); | 138 | bricktype = MODULE_GET_BTYPE(pcibus_info->pbi_moduleid); |
| 122 | switch (bricktype) { | 139 | switch (bricktype) { |
| 123 | case L1_BRICKTYPE_IX: | 140 | case L1_BRICKTYPE_IX: |
| 124 | case L1_BRICKTYPE_PX: | 141 | case L1_BRICKTYPE_PX: |
| 125 | case L1_BRICKTYPE_IA: | 142 | case L1_BRICKTYPE_IA: |
| 126 | case L1_BRICKTYPE_PA: | 143 | case L1_BRICKTYPE_PA: |
| 127 | return 1; | 144 | return 1; |
| 128 | break; | 145 | break; |
| 129 | default: | 146 | default: |
| 130 | return -EPERM; | 147 | return -EPERM; |
| 131 | break; | 148 | break; |
| 132 | } | 149 | } |
| 133 | 150 | ||
| 134 | return -EIO; | 151 | return -EIO; |
| @@ -142,13 +159,12 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot, | |||
| 142 | 159 | ||
| 143 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); | 160 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(pci_bus); |
| 144 | 161 | ||
| 145 | bss_hotplug_slot->private = kcalloc(1, sizeof(struct slot), | 162 | slot = kcalloc(1, sizeof(*slot), GFP_KERNEL); |
| 146 | GFP_KERNEL); | 163 | if (!slot) |
| 147 | if (!bss_hotplug_slot->private) | ||
| 148 | return -ENOMEM; | 164 | return -ENOMEM; |
| 149 | slot = (struct slot *)bss_hotplug_slot->private; | 165 | bss_hotplug_slot->private = slot; |
| 150 | 166 | ||
| 151 | bss_hotplug_slot->name = kmalloc(33, GFP_KERNEL); | 167 | bss_hotplug_slot->name = kmalloc(SN_SLOT_NAME_SIZE, GFP_KERNEL); |
| 152 | if (!bss_hotplug_slot->name) { | 168 | if (!bss_hotplug_slot->name) { |
| 153 | kfree(bss_hotplug_slot->private); | 169 | kfree(bss_hotplug_slot->private); |
| 154 | return -ENOMEM; | 170 | return -ENOMEM; |
| @@ -156,16 +172,16 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot, | |||
| 156 | 172 | ||
| 157 | slot->device_num = device; | 173 | slot->device_num = device; |
| 158 | slot->pci_bus = pci_bus; | 174 | slot->pci_bus = pci_bus; |
| 159 | 175 | sprintf(bss_hotplug_slot->name, "%04x:%02x:%02x", | |
| 160 | sprintf(bss_hotplug_slot->name, "module_%c%c%c%c%.2d_b_%d_s_%d", | 176 | pci_domain_nr(pci_bus), |
| 177 | ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf, | ||
| 178 | device + 1); | ||
| 179 | sprintf(slot->physical_path, "module_%c%c%c%c%.2d", | ||
| 161 | '0'+RACK_GET_CLASS(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), | 180 | '0'+RACK_GET_CLASS(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), |
| 162 | '0'+RACK_GET_GROUP(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), | 181 | '0'+RACK_GET_GROUP(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), |
| 163 | '0'+RACK_GET_NUM(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), | 182 | '0'+RACK_GET_NUM(MODULE_GET_RACK(pcibus_info->pbi_moduleid)), |
| 164 | MODULE_GET_BTCHAR(pcibus_info->pbi_moduleid), | 183 | MODULE_GET_BTCHAR(pcibus_info->pbi_moduleid), |
| 165 | MODULE_GET_BPOS(pcibus_info->pbi_moduleid), | 184 | MODULE_GET_BPOS(pcibus_info->pbi_moduleid)); |
| 166 | ((int)pcibus_info->pbi_buscommon.bs_persist_busnum) & 0xf, | ||
| 167 | device + 1); | ||
| 168 | |||
| 169 | slot->hotplug_slot = bss_hotplug_slot; | 185 | slot->hotplug_slot = bss_hotplug_slot; |
| 170 | list_add(&slot->hp_list, &sn_hp_list); | 186 | list_add(&slot->hp_list, &sn_hp_list); |
| 171 | 187 | ||
| @@ -175,14 +191,14 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot, | |||
| 175 | static struct hotplug_slot * sn_hp_destroy(void) | 191 | static struct hotplug_slot * sn_hp_destroy(void) |
| 176 | { | 192 | { |
| 177 | struct slot *slot; | 193 | struct slot *slot; |
| 178 | struct list_head *list; | ||
| 179 | struct hotplug_slot *bss_hotplug_slot = NULL; | 194 | struct hotplug_slot *bss_hotplug_slot = NULL; |
| 180 | 195 | ||
| 181 | list_for_each(list, &sn_hp_list) { | 196 | list_for_each_entry(slot, &sn_hp_list, hp_list) { |
| 182 | slot = list_entry(list, struct slot, hp_list); | ||
| 183 | bss_hotplug_slot = slot->hotplug_slot; | 197 | bss_hotplug_slot = slot->hotplug_slot; |
| 184 | list_del(&((struct slot *)bss_hotplug_slot->private)-> | 198 | list_del(&((struct slot *)bss_hotplug_slot->private)-> |
| 185 | hp_list); | 199 | hp_list); |
| 200 | sysfs_remove_file(&bss_hotplug_slot->kobj, | ||
| 201 | &sn_slot_path_attr.attr); | ||
| 186 | break; | 202 | break; |
| 187 | } | 203 | } |
| 188 | return bss_hotplug_slot; | 204 | return bss_hotplug_slot; |
| @@ -190,7 +206,6 @@ static struct hotplug_slot * sn_hp_destroy(void) | |||
| 190 | 206 | ||
| 191 | static void sn_bus_alloc_data(struct pci_dev *dev) | 207 | static void sn_bus_alloc_data(struct pci_dev *dev) |
| 192 | { | 208 | { |
| 193 | struct list_head *node; | ||
| 194 | struct pci_bus *subordinate_bus; | 209 | struct pci_bus *subordinate_bus; |
| 195 | struct pci_dev *child; | 210 | struct pci_dev *child; |
| 196 | 211 | ||
| @@ -199,66 +214,29 @@ static void sn_bus_alloc_data(struct pci_dev *dev) | |||
| 199 | /* Recursively sets up the sn_irq_info structs */ | 214 | /* Recursively sets up the sn_irq_info structs */ |
| 200 | if (dev->subordinate) { | 215 | if (dev->subordinate) { |
| 201 | subordinate_bus = dev->subordinate; | 216 | subordinate_bus = dev->subordinate; |
| 202 | list_for_each(node, &subordinate_bus->devices) { | 217 | list_for_each_entry(child, &subordinate_bus->devices, bus_list) |
| 203 | child = list_entry(node, struct pci_dev, bus_list); | ||
| 204 | sn_bus_alloc_data(child); | 218 | sn_bus_alloc_data(child); |
| 205 | } | ||
| 206 | } | 219 | } |
| 207 | } | 220 | } |
| 208 | 221 | ||
| 209 | static void sn_bus_free_data(struct pci_dev *dev) | 222 | static void sn_bus_free_data(struct pci_dev *dev) |
| 210 | { | 223 | { |
| 211 | struct list_head *node; | ||
| 212 | struct pci_bus *subordinate_bus; | 224 | struct pci_bus *subordinate_bus; |
| 213 | struct pci_dev *child; | 225 | struct pci_dev *child; |
| 214 | 226 | ||
| 215 | /* Recursively clean up sn_irq_info structs */ | 227 | /* Recursively clean up sn_irq_info structs */ |
| 216 | if (dev->subordinate) { | 228 | if (dev->subordinate) { |
| 217 | subordinate_bus = dev->subordinate; | 229 | subordinate_bus = dev->subordinate; |
| 218 | list_for_each(node, &subordinate_bus->devices) { | 230 | list_for_each_entry(child, &subordinate_bus->devices, bus_list) |
| 219 | child = list_entry(node, struct pci_dev, bus_list); | ||
| 220 | sn_bus_free_data(child); | 231 | sn_bus_free_data(child); |
| 221 | } | ||
| 222 | } | 232 | } |
| 223 | sn_pci_unfixup_slot(dev); | 233 | sn_pci_unfixup_slot(dev); |
| 224 | } | 234 | } |
| 225 | 235 | ||
| 226 | static u8 sn_power_status_get(struct hotplug_slot *bss_hotplug_slot) | ||
| 227 | { | ||
| 228 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | ||
| 229 | struct pcibus_info *pcibus_info; | ||
| 230 | u8 retval; | ||
| 231 | |||
| 232 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); | ||
| 233 | retval = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); | ||
| 234 | |||
| 235 | return retval ? 1 : 0; | ||
| 236 | } | ||
| 237 | |||
| 238 | static void sn_slot_mark_enable(struct hotplug_slot *bss_hotplug_slot, | ||
| 239 | int device_num) | ||
| 240 | { | ||
| 241 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | ||
| 242 | struct pcibus_info *pcibus_info; | ||
| 243 | |||
| 244 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); | ||
| 245 | pcibus_info->pbi_enabled_devices |= (1 << device_num); | ||
| 246 | } | ||
| 247 | |||
| 248 | static void sn_slot_mark_disable(struct hotplug_slot *bss_hotplug_slot, | ||
| 249 | int device_num) | ||
| 250 | { | ||
| 251 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | ||
| 252 | struct pcibus_info *pcibus_info; | ||
| 253 | |||
| 254 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); | ||
| 255 | pcibus_info->pbi_enabled_devices &= ~(1 << device_num); | ||
| 256 | } | ||
| 257 | |||
| 258 | static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, | 236 | static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, |
| 259 | int device_num) | 237 | int device_num) |
| 260 | { | 238 | { |
| 261 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | 239 | struct slot *slot = bss_hotplug_slot->private; |
| 262 | struct pcibus_info *pcibus_info; | 240 | struct pcibus_info *pcibus_info; |
| 263 | struct pcibr_slot_enable_resp resp; | 241 | struct pcibr_slot_enable_resp resp; |
| 264 | int rc; | 242 | int rc; |
| @@ -273,7 +251,7 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, | |||
| 273 | 251 | ||
| 274 | if (rc == PCI_SLOT_ALREADY_UP) { | 252 | if (rc == PCI_SLOT_ALREADY_UP) { |
| 275 | dev_dbg(slot->pci_bus->self, "is already active\n"); | 253 | dev_dbg(slot->pci_bus->self, "is already active\n"); |
| 276 | return -EPERM; | 254 | return 1; /* return 1 to user */ |
| 277 | } | 255 | } |
| 278 | 256 | ||
| 279 | if (rc == PCI_L1_ERR) { | 257 | if (rc == PCI_L1_ERR) { |
| @@ -290,7 +268,8 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, | |||
| 290 | return -EIO; | 268 | return -EIO; |
| 291 | } | 269 | } |
| 292 | 270 | ||
| 293 | sn_slot_mark_enable(bss_hotplug_slot, device_num); | 271 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); |
| 272 | pcibus_info->pbi_enabled_devices |= (1 << device_num); | ||
| 294 | 273 | ||
| 295 | return 0; | 274 | return 0; |
| 296 | } | 275 | } |
| @@ -298,7 +277,7 @@ static int sn_slot_enable(struct hotplug_slot *bss_hotplug_slot, | |||
| 298 | static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, | 277 | static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, |
| 299 | int device_num, int action) | 278 | int device_num, int action) |
| 300 | { | 279 | { |
| 301 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | 280 | struct slot *slot = bss_hotplug_slot->private; |
| 302 | struct pcibus_info *pcibus_info; | 281 | struct pcibus_info *pcibus_info; |
| 303 | struct pcibr_slot_disable_resp resp; | 282 | struct pcibr_slot_disable_resp resp; |
| 304 | int rc; | 283 | int rc; |
| @@ -307,43 +286,44 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, | |||
| 307 | 286 | ||
| 308 | rc = sal_pcibr_slot_disable(pcibus_info, device_num, action, &resp); | 287 | rc = sal_pcibr_slot_disable(pcibus_info, device_num, action, &resp); |
| 309 | 288 | ||
| 310 | if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_SLOT_ALREADY_DOWN) { | 289 | if ((action == PCI_REQ_SLOT_ELIGIBLE) && |
| 290 | (rc == PCI_SLOT_ALREADY_DOWN)) { | ||
| 311 | dev_dbg(slot->pci_bus->self, "Slot %s already inactive\n"); | 291 | dev_dbg(slot->pci_bus->self, "Slot %s already inactive\n"); |
| 312 | return -ENODEV; | 292 | return 1; /* return 1 to user */ |
| 313 | } | 293 | } |
| 314 | 294 | ||
| 315 | if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_EMPTY_33MHZ) { | 295 | if ((action == PCI_REQ_SLOT_ELIGIBLE) && (rc == PCI_EMPTY_33MHZ)) { |
| 316 | dev_dbg(slot->pci_bus->self, | 296 | dev_dbg(slot->pci_bus->self, |
| 317 | "Cannot remove last 33MHz card\n"); | 297 | "Cannot remove last 33MHz card\n"); |
| 318 | return -EPERM; | 298 | return -EPERM; |
| 319 | } | 299 | } |
| 320 | 300 | ||
| 321 | if (action == PCI_REQ_SLOT_ELIGIBLE && rc == PCI_L1_ERR) { | 301 | if ((action == PCI_REQ_SLOT_ELIGIBLE) && (rc == PCI_L1_ERR)) { |
| 322 | dev_dbg(slot->pci_bus->self, | 302 | dev_dbg(slot->pci_bus->self, |
| 323 | "L1 failure %d with message \n%s\n", | 303 | "L1 failure %d with message \n%s\n", |
| 324 | resp.resp_sub_errno, resp.resp_l1_msg); | 304 | resp.resp_sub_errno, resp.resp_l1_msg); |
| 325 | return -EPERM; | 305 | return -EPERM; |
| 326 | } | 306 | } |
| 327 | 307 | ||
| 328 | if (action == PCI_REQ_SLOT_ELIGIBLE && rc) { | 308 | if ((action == PCI_REQ_SLOT_ELIGIBLE) && rc) { |
| 329 | dev_dbg(slot->pci_bus->self, | 309 | dev_dbg(slot->pci_bus->self, |
| 330 | "remove failed with error %d sub-error %d\n", | 310 | "remove failed with error %d sub-error %d\n", |
| 331 | rc, resp.resp_sub_errno); | 311 | rc, resp.resp_sub_errno); |
| 332 | return -EIO; | 312 | return -EIO; |
| 333 | } | 313 | } |
| 334 | 314 | ||
| 335 | if (action == PCI_REQ_SLOT_ELIGIBLE && !rc) | 315 | if ((action == PCI_REQ_SLOT_ELIGIBLE) && !rc) |
| 336 | return 0; | 316 | return 0; |
| 337 | 317 | ||
| 338 | if (action == PCI_REQ_SLOT_DISABLE && !rc) { | 318 | if ((action == PCI_REQ_SLOT_DISABLE) && !rc) { |
| 339 | sn_slot_mark_disable(bss_hotplug_slot, device_num); | 319 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); |
| 320 | pcibus_info->pbi_enabled_devices &= ~(1 << device_num); | ||
| 340 | dev_dbg(slot->pci_bus->self, "remove successful\n"); | 321 | dev_dbg(slot->pci_bus->self, "remove successful\n"); |
| 341 | return 0; | 322 | return 0; |
| 342 | } | 323 | } |
| 343 | 324 | ||
| 344 | if (action == PCI_REQ_SLOT_DISABLE && rc) { | 325 | if ((action == PCI_REQ_SLOT_DISABLE) && rc) { |
| 345 | dev_dbg(slot->pci_bus->self,"remove failed rc = %d\n", rc); | 326 | dev_dbg(slot->pci_bus->self,"remove failed rc = %d\n", rc); |
| 346 | return rc; | ||
| 347 | } | 327 | } |
| 348 | 328 | ||
| 349 | return rc; | 329 | return rc; |
| @@ -351,7 +331,7 @@ static int sn_slot_disable(struct hotplug_slot *bss_hotplug_slot, | |||
| 351 | 331 | ||
| 352 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | 332 | static int enable_slot(struct hotplug_slot *bss_hotplug_slot) |
| 353 | { | 333 | { |
| 354 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | 334 | struct slot *slot = bss_hotplug_slot->private; |
| 355 | struct pci_bus *new_bus = NULL; | 335 | struct pci_bus *new_bus = NULL; |
| 356 | struct pci_dev *dev; | 336 | struct pci_dev *dev; |
| 357 | int func, num_funcs; | 337 | int func, num_funcs; |
| @@ -371,8 +351,8 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 371 | return rc; | 351 | return rc; |
| 372 | } | 352 | } |
| 373 | 353 | ||
| 374 | num_funcs = pci_scan_slot(slot->pci_bus, PCI_DEVFN(slot->device_num+1, | 354 | num_funcs = pci_scan_slot(slot->pci_bus, |
| 375 | PCI_FUNC(0))); | 355 | PCI_DEVFN(slot->device_num + 1, 0)); |
| 376 | if (!num_funcs) { | 356 | if (!num_funcs) { |
| 377 | dev_dbg(slot->pci_bus->self, "no device in slot\n"); | 357 | dev_dbg(slot->pci_bus->self, "no device in slot\n"); |
| 378 | up(&sn_hotplug_sem); | 358 | up(&sn_hotplug_sem); |
| @@ -391,8 +371,6 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 391 | dev = pci_get_slot(slot->pci_bus, | 371 | dev = pci_get_slot(slot->pci_bus, |
| 392 | PCI_DEVFN(slot->device_num + 1, | 372 | PCI_DEVFN(slot->device_num + 1, |
| 393 | PCI_FUNC(func))); | 373 | PCI_FUNC(func))); |
| 394 | |||
| 395 | |||
| 396 | if (dev) { | 374 | if (dev) { |
| 397 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 375 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { |
| 398 | unsigned char sec_bus; | 376 | unsigned char sec_bus; |
| @@ -431,7 +409,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 431 | 409 | ||
| 432 | static int disable_slot(struct hotplug_slot *bss_hotplug_slot) | 410 | static int disable_slot(struct hotplug_slot *bss_hotplug_slot) |
| 433 | { | 411 | { |
| 434 | struct slot *slot = (struct slot *)bss_hotplug_slot->private; | 412 | struct slot *slot = bss_hotplug_slot->private; |
| 435 | struct pci_dev *dev; | 413 | struct pci_dev *dev; |
| 436 | int func; | 414 | int func; |
| 437 | int rc; | 415 | int rc; |
| @@ -448,7 +426,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 448 | /* Free the SN resources assigned to the Linux device.*/ | 426 | /* Free the SN resources assigned to the Linux device.*/ |
| 449 | for (func = 0; func < 8; func++) { | 427 | for (func = 0; func < 8; func++) { |
| 450 | dev = pci_get_slot(slot->pci_bus, | 428 | dev = pci_get_slot(slot->pci_bus, |
| 451 | PCI_DEVFN(slot->device_num+1, | 429 | PCI_DEVFN(slot->device_num + 1, |
| 452 | PCI_FUNC(func))); | 430 | PCI_FUNC(func))); |
| 453 | if (dev) { | 431 | if (dev) { |
| 454 | /* | 432 | /* |
| @@ -477,10 +455,15 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot) | |||
| 477 | return rc; | 455 | return rc; |
| 478 | } | 456 | } |
| 479 | 457 | ||
| 480 | static int get_power_status(struct hotplug_slot *bss_hotplug_slot, u8 *value) | 458 | static inline int get_power_status(struct hotplug_slot *bss_hotplug_slot, |
| 459 | u8 *value) | ||
| 481 | { | 460 | { |
| 461 | struct slot *slot = bss_hotplug_slot->private; | ||
| 462 | struct pcibus_info *pcibus_info; | ||
| 463 | |||
| 464 | pcibus_info = SN_PCIBUS_BUSSOFT_INFO(slot->pci_bus); | ||
| 482 | down(&sn_hotplug_sem); | 465 | down(&sn_hotplug_sem); |
| 483 | *value = sn_power_status_get(bss_hotplug_slot); | 466 | *value = pcibus_info->pbi_enabled_devices & (1 << slot->device_num); |
| 484 | up(&sn_hotplug_sem); | 467 | up(&sn_hotplug_sem); |
| 485 | return 0; | 468 | return 0; |
| 486 | } | 469 | } |
| @@ -508,7 +491,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus) | |||
| 508 | if (sn_pci_slot_valid(pci_bus, device) != 1) | 491 | if (sn_pci_slot_valid(pci_bus, device) != 1) |
| 509 | continue; | 492 | continue; |
| 510 | 493 | ||
| 511 | bss_hotplug_slot = kcalloc(1,sizeof(struct hotplug_slot), | 494 | bss_hotplug_slot = kcalloc(1, sizeof(*bss_hotplug_slot), |
| 512 | GFP_KERNEL); | 495 | GFP_KERNEL); |
| 513 | if (!bss_hotplug_slot) { | 496 | if (!bss_hotplug_slot) { |
| 514 | rc = -ENOMEM; | 497 | rc = -ENOMEM; |
| @@ -516,7 +499,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus) | |||
| 516 | } | 499 | } |
| 517 | 500 | ||
| 518 | bss_hotplug_slot->info = | 501 | bss_hotplug_slot->info = |
| 519 | kcalloc(1,sizeof(struct hotplug_slot_info), | 502 | kcalloc(1, sizeof(struct hotplug_slot_info), |
| 520 | GFP_KERNEL); | 503 | GFP_KERNEL); |
| 521 | if (!bss_hotplug_slot->info) { | 504 | if (!bss_hotplug_slot->info) { |
| 522 | rc = -ENOMEM; | 505 | rc = -ENOMEM; |
| @@ -535,6 +518,11 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus) | |||
| 535 | rc = pci_hp_register(bss_hotplug_slot); | 518 | rc = pci_hp_register(bss_hotplug_slot); |
| 536 | if (rc) | 519 | if (rc) |
| 537 | goto register_err; | 520 | goto register_err; |
| 521 | |||
| 522 | rc = sysfs_create_file(&bss_hotplug_slot->kobj, | ||
| 523 | &sn_slot_path_attr.attr); | ||
| 524 | if (rc) | ||
| 525 | goto register_err; | ||
| 538 | } | 526 | } |
| 539 | dev_dbg(pci_bus->self, "Registered bus with hotplug\n"); | 527 | dev_dbg(pci_bus->self, "Registered bus with hotplug\n"); |
| 540 | return rc; | 528 | return rc; |
| @@ -564,14 +552,14 @@ static int sn_pci_hotplug_init(void) | |||
| 564 | int rc; | 552 | int rc; |
| 565 | int registered = 0; | 553 | int registered = 0; |
| 566 | 554 | ||
| 567 | INIT_LIST_HEAD(&sn_hp_list); | ||
| 568 | |||
| 569 | if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) { | 555 | if (sn_sal_rev() < SGI_HOTPLUG_PROM_REV) { |
| 570 | printk(KERN_ERR "%s: PROM version must be greater than 4.05\n", | 556 | printk(KERN_ERR "%s: PROM version must be greater than 4.30\n", |
| 571 | __FUNCTION__); | 557 | __FUNCTION__); |
| 572 | return -EPERM; | 558 | return -EPERM; |
| 573 | } | 559 | } |
| 574 | 560 | ||
| 561 | INIT_LIST_HEAD(&sn_hp_list); | ||
| 562 | |||
| 575 | while ((pci_bus = pci_find_next_bus(pci_bus))) { | 563 | while ((pci_bus = pci_find_next_bus(pci_bus))) { |
| 576 | if (!pci_bus->sysdata) | 564 | if (!pci_bus->sysdata) |
| 577 | continue; | 565 | continue; |
| @@ -584,9 +572,9 @@ static int sn_pci_hotplug_init(void) | |||
| 584 | dev_dbg(pci_bus->self, "valid hotplug bus\n"); | 572 | dev_dbg(pci_bus->self, "valid hotplug bus\n"); |
| 585 | 573 | ||
| 586 | rc = sn_hotplug_slot_register(pci_bus); | 574 | rc = sn_hotplug_slot_register(pci_bus); |
| 587 | if (!rc) | 575 | if (!rc) { |
| 588 | registered = 1; | 576 | registered = 1; |
| 589 | else { | 577 | } else { |
| 590 | registered = 0; | 578 | registered = 0; |
| 591 | break; | 579 | break; |
| 592 | } | 580 | } |
| @@ -599,9 +587,8 @@ static void sn_pci_hotplug_exit(void) | |||
| 599 | { | 587 | { |
| 600 | struct hotplug_slot *bss_hotplug_slot; | 588 | struct hotplug_slot *bss_hotplug_slot; |
| 601 | 589 | ||
| 602 | while ((bss_hotplug_slot = sn_hp_destroy())) { | 590 | while ((bss_hotplug_slot = sn_hp_destroy())) |
| 603 | pci_hp_deregister(bss_hotplug_slot); | 591 | pci_hp_deregister(bss_hotplug_slot); |
| 604 | } | ||
| 605 | 592 | ||
| 606 | if (!list_empty(&sn_hp_list)) | 593 | if (!list_empty(&sn_hp_list)) |
| 607 | printk(KERN_ERR "%s: internal list is not empty\n", __FILE__); | 594 | printk(KERN_ERR "%s: internal list is not empty\n", __FILE__); |
diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h index fe4d653da188..b7d1c61d6bbb 100644 --- a/drivers/pci/hotplug/shpchp.h +++ b/drivers/pci/hotplug/shpchp.h | |||
| @@ -411,7 +411,7 @@ static inline void return_resource(struct pci_resource **head, struct pci_resour | |||
| 411 | 411 | ||
| 412 | static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) | 412 | static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot) |
| 413 | { | 413 | { |
| 414 | snprintf(buffer, buffer_size, "%d", slot->number); | 414 | snprintf(buffer, buffer_size, "%04d_%04d", slot->bus, slot->number); |
| 415 | } | 415 | } |
| 416 | 416 | ||
| 417 | enum php_ctlr_type { | 417 | enum php_ctlr_type { |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 532f73bb2224..ee8677bda950 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -439,10 +439,7 @@ static void enable_msi_mode(struct pci_dev *dev, int pos, int type) | |||
| 439 | } | 439 | } |
| 440 | if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { | 440 | if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { |
| 441 | /* PCI Express Endpoint device detected */ | 441 | /* PCI Express Endpoint device detected */ |
| 442 | u16 cmd; | 442 | pci_intx(dev, 0); /* disable intx */ |
| 443 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
| 444 | cmd |= PCI_COMMAND_INTX_DISABLE; | ||
| 445 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
| 446 | } | 443 | } |
| 447 | } | 444 | } |
| 448 | 445 | ||
| @@ -461,10 +458,7 @@ void disable_msi_mode(struct pci_dev *dev, int pos, int type) | |||
| 461 | } | 458 | } |
| 462 | if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { | 459 | if (pci_find_capability(dev, PCI_CAP_ID_EXP)) { |
| 463 | /* PCI Express Endpoint device detected */ | 460 | /* PCI Express Endpoint device detected */ |
| 464 | u16 cmd; | 461 | pci_intx(dev, 1); /* enable intx */ |
| 465 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
| 466 | cmd &= ~PCI_COMMAND_INTX_DISABLE; | ||
| 467 | pci_write_config_word(dev, PCI_COMMAND, cmd); | ||
| 468 | } | 462 | } |
| 469 | } | 463 | } |
| 470 | 464 | ||
diff --git a/drivers/pci/names.c b/drivers/pci/names.c deleted file mode 100644 index ad224aada7c9..000000000000 --- a/drivers/pci/names.c +++ /dev/null | |||
| @@ -1,137 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * PCI Class and Device Name Tables | ||
| 3 | * | ||
| 4 | * Copyright 1993--1999 Drew Eckhardt, Frederic Potter, | ||
| 5 | * David Mosberger-Tang, Martin Mares | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <linux/config.h> | ||
| 9 | #include <linux/types.h> | ||
| 10 | #include <linux/kernel.h> | ||
| 11 | #include <linux/pci.h> | ||
| 12 | #include <linux/init.h> | ||
| 13 | |||
| 14 | #ifdef CONFIG_PCI_NAMES | ||
| 15 | |||
| 16 | struct pci_device_info { | ||
| 17 | unsigned short device; | ||
| 18 | unsigned short seen; | ||
| 19 | const char *name; | ||
| 20 | }; | ||
| 21 | |||
| 22 | struct pci_vendor_info { | ||
| 23 | unsigned short vendor; | ||
| 24 | unsigned short nr; | ||
| 25 | const char *name; | ||
| 26 | struct pci_device_info *devices; | ||
| 27 | }; | ||
| 28 | |||
| 29 | /* | ||
| 30 | * This is ridiculous, but we want the strings in | ||
| 31 | * the .init section so that they don't take up | ||
| 32 | * real memory.. Parse the same file multiple times | ||
| 33 | * to get all the info. | ||
| 34 | */ | ||
| 35 | #define VENDOR( vendor, name ) static char __vendorstr_##vendor[] __devinitdata = name; | ||
| 36 | #define ENDVENDOR() | ||
| 37 | #define DEVICE( vendor, device, name ) static char __devicestr_##vendor##device[] __devinitdata = name; | ||
| 38 | #include "devlist.h" | ||
| 39 | |||
| 40 | |||
| 41 | #define VENDOR( vendor, name ) static struct pci_device_info __devices_##vendor[] __devinitdata = { | ||
| 42 | #define ENDVENDOR() }; | ||
| 43 | #define DEVICE( vendor, device, name ) { 0x##device, 0, __devicestr_##vendor##device }, | ||
| 44 | #include "devlist.h" | ||
| 45 | |||
| 46 | static struct pci_vendor_info __devinitdata pci_vendor_list[] = { | ||
| 47 | #define VENDOR( vendor, name ) { 0x##vendor, sizeof(__devices_##vendor) / sizeof(struct pci_device_info), __vendorstr_##vendor, __devices_##vendor }, | ||
| 48 | #define ENDVENDOR() | ||
| 49 | #define DEVICE( vendor, device, name ) | ||
| 50 | #include "devlist.h" | ||
| 51 | }; | ||
| 52 | |||
| 53 | #define VENDORS (sizeof(pci_vendor_list)/sizeof(struct pci_vendor_info)) | ||
| 54 | |||
| 55 | void __devinit pci_name_device(struct pci_dev *dev) | ||
| 56 | { | ||
| 57 | const struct pci_vendor_info *vendor_p = pci_vendor_list; | ||
| 58 | int i = VENDORS; | ||
| 59 | char *name = dev->pretty_name; | ||
| 60 | |||
| 61 | do { | ||
| 62 | if (vendor_p->vendor == dev->vendor) | ||
| 63 | goto match_vendor; | ||
| 64 | vendor_p++; | ||
| 65 | } while (--i); | ||
| 66 | |||
| 67 | /* Couldn't find either the vendor nor the device */ | ||
| 68 | sprintf(name, "PCI device %04x:%04x", dev->vendor, dev->device); | ||
| 69 | return; | ||
| 70 | |||
| 71 | match_vendor: { | ||
| 72 | struct pci_device_info *device_p = vendor_p->devices; | ||
| 73 | int i = vendor_p->nr; | ||
| 74 | |||
| 75 | while (i > 0) { | ||
| 76 | if (device_p->device == dev->device) | ||
| 77 | goto match_device; | ||
| 78 | device_p++; | ||
| 79 | i--; | ||
| 80 | } | ||
| 81 | |||
| 82 | /* Ok, found the vendor, but unknown device */ | ||
| 83 | sprintf(name, "PCI device %04x:%04x (%." PCI_NAME_HALF "s)", | ||
| 84 | dev->vendor, dev->device, vendor_p->name); | ||
| 85 | return; | ||
| 86 | |||
| 87 | /* Full match */ | ||
| 88 | match_device: { | ||
| 89 | char *n = name + sprintf(name, "%s %s", | ||
| 90 | vendor_p->name, device_p->name); | ||
| 91 | int nr = device_p->seen + 1; | ||
| 92 | device_p->seen = nr; | ||
| 93 | if (nr > 1) | ||
| 94 | sprintf(n, " (#%d)", nr); | ||
| 95 | } | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | /* | ||
| 100 | * Class names. Not in .init section as they are needed in runtime. | ||
| 101 | */ | ||
| 102 | |||
| 103 | static u16 pci_class_numbers[] = { | ||
| 104 | #define CLASS(x,y) 0x##x, | ||
| 105 | #include "classlist.h" | ||
| 106 | }; | ||
| 107 | |||
| 108 | static char *pci_class_names[] = { | ||
| 109 | #define CLASS(x,y) y, | ||
| 110 | #include "classlist.h" | ||
| 111 | }; | ||
| 112 | |||
| 113 | char * | ||
| 114 | pci_class_name(u32 class) | ||
| 115 | { | ||
| 116 | int i; | ||
| 117 | |||
| 118 | for(i=0; i<sizeof(pci_class_numbers)/sizeof(pci_class_numbers[0]); i++) | ||
| 119 | if (pci_class_numbers[i] == class) | ||
| 120 | return pci_class_names[i]; | ||
| 121 | return NULL; | ||
| 122 | } | ||
| 123 | |||
| 124 | #else | ||
| 125 | |||
| 126 | void __devinit pci_name_device(struct pci_dev *dev) | ||
| 127 | { | ||
| 128 | } | ||
| 129 | |||
| 130 | char * | ||
| 131 | pci_class_name(u32 class) | ||
| 132 | { | ||
| 133 | return NULL; | ||
| 134 | } | ||
| 135 | |||
| 136 | #endif /* CONFIG_PCI_NAMES */ | ||
| 137 | |||
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index e4115a0d5ba6..0d0d533894e0 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -7,6 +7,7 @@ | |||
| 7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
| 8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
| 9 | #include <linux/device.h> | 9 | #include <linux/device.h> |
| 10 | #include <linux/mempolicy.h> | ||
| 10 | #include "pci.h" | 11 | #include "pci.h" |
| 11 | 12 | ||
| 12 | /* | 13 | /* |
| @@ -163,6 +164,34 @@ const struct pci_device_id *pci_match_device(struct pci_driver *drv, | |||
| 163 | return NULL; | 164 | return NULL; |
| 164 | } | 165 | } |
| 165 | 166 | ||
| 167 | static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | ||
| 168 | const struct pci_device_id *id) | ||
| 169 | { | ||
| 170 | int error; | ||
| 171 | #ifdef CONFIG_NUMA | ||
| 172 | /* Execute driver initialization on node where the | ||
| 173 | device's bus is attached to. This way the driver likely | ||
| 174 | allocates its local memory on the right node without | ||
| 175 | any need to change it. */ | ||
| 176 | struct mempolicy *oldpol; | ||
| 177 | cpumask_t oldmask = current->cpus_allowed; | ||
| 178 | int node = pcibus_to_node(dev->bus); | ||
| 179 | if (node >= 0 && node_online(node)) | ||
| 180 | set_cpus_allowed(current, node_to_cpumask(node)); | ||
| 181 | /* And set default memory allocation policy */ | ||
| 182 | oldpol = current->mempolicy; | ||
| 183 | current->mempolicy = &default_policy; | ||
| 184 | mpol_get(current->mempolicy); | ||
| 185 | #endif | ||
| 186 | error = drv->probe(dev, id); | ||
| 187 | #ifdef CONFIG_NUMA | ||
| 188 | set_cpus_allowed(current, oldmask); | ||
| 189 | mpol_free(current->mempolicy); | ||
| 190 | current->mempolicy = oldpol; | ||
| 191 | #endif | ||
| 192 | return error; | ||
| 193 | } | ||
| 194 | |||
| 166 | /** | 195 | /** |
| 167 | * __pci_device_probe() | 196 | * __pci_device_probe() |
| 168 | * | 197 | * |
| @@ -180,7 +209,7 @@ __pci_device_probe(struct pci_driver *drv, struct pci_dev *pci_dev) | |||
| 180 | 209 | ||
| 181 | id = pci_match_device(drv, pci_dev); | 210 | id = pci_match_device(drv, pci_dev); |
| 182 | if (id) | 211 | if (id) |
| 183 | error = drv->probe(pci_dev, id); | 212 | error = pci_call_probe(drv, pci_dev, id); |
| 184 | if (error >= 0) { | 213 | if (error >= 0) { |
| 185 | pci_dev->driver = drv; | 214 | pci_dev->driver = drv; |
| 186 | error = 0; | 215 | error = 0; |
| @@ -243,17 +272,19 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) | |||
| 243 | } | 272 | } |
| 244 | 273 | ||
| 245 | 274 | ||
| 246 | /* | 275 | /* |
| 247 | * Default resume method for devices that have no driver provided resume, | 276 | * Default resume method for devices that have no driver provided resume, |
| 248 | * or not even a driver at all. | 277 | * or not even a driver at all. |
| 249 | */ | 278 | */ |
| 250 | static void pci_default_resume(struct pci_dev *pci_dev) | 279 | static void pci_default_resume(struct pci_dev *pci_dev) |
| 251 | { | 280 | { |
| 281 | int retval; | ||
| 282 | |||
| 252 | /* restore the PCI config space */ | 283 | /* restore the PCI config space */ |
| 253 | pci_restore_state(pci_dev); | 284 | pci_restore_state(pci_dev); |
| 254 | /* if the device was enabled before suspend, reenable */ | 285 | /* if the device was enabled before suspend, reenable */ |
| 255 | if (pci_dev->is_enabled) | 286 | if (pci_dev->is_enabled) |
| 256 | pci_enable_device(pci_dev); | 287 | retval = pci_enable_device(pci_dev); |
| 257 | /* if the device was busmaster before the suspend, make it busmaster again */ | 288 | /* if the device was busmaster before the suspend, make it busmaster again */ |
| 258 | if (pci_dev->is_busmaster) | 289 | if (pci_dev->is_busmaster) |
| 259 | pci_set_master(pci_dev); | 290 | pci_set_master(pci_dev); |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index c62d2f043397..992db89adce7 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -222,6 +222,37 @@ pci_find_parent_resource(const struct pci_dev *dev, struct resource *res) | |||
| 222 | } | 222 | } |
| 223 | 223 | ||
| 224 | /** | 224 | /** |
| 225 | * pci_restore_bars - restore a devices BAR values (e.g. after wake-up) | ||
| 226 | * @dev: PCI device to have its BARs restored | ||
| 227 | * | ||
| 228 | * Restore the BAR values for a given device, so as to make it | ||
| 229 | * accessible by its driver. | ||
| 230 | */ | ||
| 231 | void | ||
| 232 | pci_restore_bars(struct pci_dev *dev) | ||
| 233 | { | ||
| 234 | int i, numres; | ||
| 235 | |||
| 236 | switch (dev->hdr_type) { | ||
| 237 | case PCI_HEADER_TYPE_NORMAL: | ||
| 238 | numres = 6; | ||
| 239 | break; | ||
| 240 | case PCI_HEADER_TYPE_BRIDGE: | ||
| 241 | numres = 2; | ||
| 242 | break; | ||
| 243 | case PCI_HEADER_TYPE_CARDBUS: | ||
| 244 | numres = 1; | ||
| 245 | break; | ||
| 246 | default: | ||
| 247 | /* Should never get here, but just in case... */ | ||
| 248 | return; | ||
| 249 | } | ||
| 250 | |||
| 251 | for (i = 0; i < numres; i ++) | ||
| 252 | pci_update_resource(dev, &dev->resource[i], i); | ||
| 253 | } | ||
| 254 | |||
| 255 | /** | ||
| 225 | * pci_set_power_state - Set the power state of a PCI device | 256 | * pci_set_power_state - Set the power state of a PCI device |
| 226 | * @dev: PCI device to be suspended | 257 | * @dev: PCI device to be suspended |
| 227 | * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering | 258 | * @state: PCI power state (D0, D1, D2, D3hot, D3cold) we're entering |
| @@ -239,7 +270,7 @@ int (*platform_pci_set_power_state)(struct pci_dev *dev, pci_power_t t); | |||
| 239 | int | 270 | int |
| 240 | pci_set_power_state(struct pci_dev *dev, pci_power_t state) | 271 | pci_set_power_state(struct pci_dev *dev, pci_power_t state) |
| 241 | { | 272 | { |
| 242 | int pm; | 273 | int pm, need_restore = 0; |
| 243 | u16 pmcsr, pmc; | 274 | u16 pmcsr, pmc; |
| 244 | 275 | ||
| 245 | /* bound the state we're entering */ | 276 | /* bound the state we're entering */ |
| @@ -263,7 +294,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 263 | return -EIO; | 294 | return -EIO; |
| 264 | 295 | ||
| 265 | pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); | 296 | pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc); |
| 266 | if ((pmc & PCI_PM_CAP_VER_MASK) > 2) { | 297 | if ((pmc & PCI_PM_CAP_VER_MASK) > 3) { |
| 267 | printk(KERN_DEBUG | 298 | printk(KERN_DEBUG |
| 268 | "PCI: %s has unsupported PM cap regs version (%u)\n", | 299 | "PCI: %s has unsupported PM cap regs version (%u)\n", |
| 269 | pci_name(dev), pmc & PCI_PM_CAP_VER_MASK); | 300 | pci_name(dev), pmc & PCI_PM_CAP_VER_MASK); |
| @@ -271,21 +302,22 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 271 | } | 302 | } |
| 272 | 303 | ||
| 273 | /* check if this device supports the desired state */ | 304 | /* check if this device supports the desired state */ |
| 274 | if (state == PCI_D1 || state == PCI_D2) { | 305 | if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1)) |
| 275 | if (state == PCI_D1 && !(pmc & PCI_PM_CAP_D1)) | 306 | return -EIO; |
| 276 | return -EIO; | 307 | else if (state == PCI_D2 && !(pmc & PCI_PM_CAP_D2)) |
| 277 | else if (state == PCI_D2 && !(pmc & PCI_PM_CAP_D2)) | 308 | return -EIO; |
| 278 | return -EIO; | 309 | |
| 279 | } | 310 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); |
| 280 | 311 | ||
| 281 | /* If we're in D3, force entire word to 0. | 312 | /* If we're in D3, force entire word to 0. |
| 282 | * This doesn't affect PME_Status, disables PME_En, and | 313 | * This doesn't affect PME_Status, disables PME_En, and |
| 283 | * sets PowerState to 0. | 314 | * sets PowerState to 0. |
| 284 | */ | 315 | */ |
| 285 | if (dev->current_state >= PCI_D3hot) | 316 | if (dev->current_state >= PCI_D3hot) { |
| 317 | if (!(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) | ||
| 318 | need_restore = 1; | ||
| 286 | pmcsr = 0; | 319 | pmcsr = 0; |
| 287 | else { | 320 | } else { |
| 288 | pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); | ||
| 289 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; | 321 | pmcsr &= ~PCI_PM_CTRL_STATE_MASK; |
| 290 | pmcsr |= state; | 322 | pmcsr |= state; |
| 291 | } | 323 | } |
| @@ -308,6 +340,22 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
| 308 | platform_pci_set_power_state(dev, state); | 340 | platform_pci_set_power_state(dev, state); |
| 309 | 341 | ||
| 310 | dev->current_state = state; | 342 | dev->current_state = state; |
| 343 | |||
| 344 | /* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT | ||
| 345 | * INTERFACE SPECIFICATION, REV. 1.2", a device transitioning | ||
| 346 | * from D3hot to D0 _may_ perform an internal reset, thereby | ||
| 347 | * going to "D0 Uninitialized" rather than "D0 Initialized". | ||
| 348 | * For example, at least some versions of the 3c905B and the | ||
| 349 | * 3c556B exhibit this behaviour. | ||
| 350 | * | ||
| 351 | * At least some laptop BIOSen (e.g. the Thinkpad T21) leave | ||
| 352 | * devices in a D3hot state at boot. Consequently, we need to | ||
| 353 | * restore at least the BARs so that the device will be | ||
| 354 | * accessible to its driver. | ||
| 355 | */ | ||
| 356 | if (need_restore) | ||
| 357 | pci_restore_bars(dev); | ||
| 358 | |||
| 311 | return 0; | 359 | return 0; |
| 312 | } | 360 | } |
| 313 | 361 | ||
| @@ -394,8 +442,11 @@ pci_enable_device_bars(struct pci_dev *dev, int bars) | |||
| 394 | { | 442 | { |
| 395 | int err; | 443 | int err; |
| 396 | 444 | ||
| 397 | pci_set_power_state(dev, PCI_D0); | 445 | err = pci_set_power_state(dev, PCI_D0); |
| 398 | if ((err = pcibios_enable_device(dev, bars)) < 0) | 446 | if (err < 0 && err != -EIO) |
| 447 | return err; | ||
| 448 | err = pcibios_enable_device(dev, bars); | ||
| 449 | if (err < 0) | ||
| 399 | return err; | 450 | return err; |
| 400 | return 0; | 451 | return 0; |
| 401 | } | 452 | } |
| @@ -747,6 +798,31 @@ pci_clear_mwi(struct pci_dev *dev) | |||
| 747 | } | 798 | } |
| 748 | } | 799 | } |
| 749 | 800 | ||
| 801 | /** | ||
| 802 | * pci_intx - enables/disables PCI INTx for device dev | ||
| 803 | * @dev: the PCI device to operate on | ||
| 804 | * @enable: boolean | ||
| 805 | * | ||
| 806 | * Enables/disables PCI INTx for device dev | ||
| 807 | */ | ||
| 808 | void | ||
| 809 | pci_intx(struct pci_dev *pdev, int enable) | ||
| 810 | { | ||
| 811 | u16 pci_command, new; | ||
| 812 | |||
| 813 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 814 | |||
| 815 | if (enable) { | ||
| 816 | new = pci_command & ~PCI_COMMAND_INTX_DISABLE; | ||
| 817 | } else { | ||
| 818 | new = pci_command | PCI_COMMAND_INTX_DISABLE; | ||
| 819 | } | ||
| 820 | |||
| 821 | if (new != pci_command) { | ||
| 822 | pci_write_config_word(pdev, PCI_COMMAND, new); | ||
| 823 | } | ||
| 824 | } | ||
| 825 | |||
| 750 | #ifndef HAVE_ARCH_PCI_SET_DMA_MASK | 826 | #ifndef HAVE_ARCH_PCI_SET_DMA_MASK |
| 751 | /* | 827 | /* |
| 752 | * These can be overridden by arch-specific implementations | 828 | * These can be overridden by arch-specific implementations |
| @@ -809,6 +885,7 @@ struct pci_dev *isa_bridge; | |||
| 809 | EXPORT_SYMBOL(isa_bridge); | 885 | EXPORT_SYMBOL(isa_bridge); |
| 810 | #endif | 886 | #endif |
| 811 | 887 | ||
| 888 | EXPORT_SYMBOL_GPL(pci_restore_bars); | ||
| 812 | EXPORT_SYMBOL(pci_enable_device_bars); | 889 | EXPORT_SYMBOL(pci_enable_device_bars); |
| 813 | EXPORT_SYMBOL(pci_enable_device); | 890 | EXPORT_SYMBOL(pci_enable_device); |
| 814 | EXPORT_SYMBOL(pci_disable_device); | 891 | EXPORT_SYMBOL(pci_disable_device); |
| @@ -823,6 +900,7 @@ EXPORT_SYMBOL(pci_request_region); | |||
| 823 | EXPORT_SYMBOL(pci_set_master); | 900 | EXPORT_SYMBOL(pci_set_master); |
| 824 | EXPORT_SYMBOL(pci_set_mwi); | 901 | EXPORT_SYMBOL(pci_set_mwi); |
| 825 | EXPORT_SYMBOL(pci_clear_mwi); | 902 | EXPORT_SYMBOL(pci_clear_mwi); |
| 903 | EXPORT_SYMBOL_GPL(pci_intx); | ||
| 826 | EXPORT_SYMBOL(pci_set_dma_mask); | 904 | EXPORT_SYMBOL(pci_set_dma_mask); |
| 827 | EXPORT_SYMBOL(pci_set_consistent_dma_mask); | 905 | EXPORT_SYMBOL(pci_set_consistent_dma_mask); |
| 828 | EXPORT_SYMBOL(pci_assign_resource); | 906 | EXPORT_SYMBOL(pci_assign_resource); |
diff --git a/drivers/pci/pci.ids b/drivers/pci/pci.ids deleted file mode 100644 index 1d2ef1e2ffc6..000000000000 --- a/drivers/pci/pci.ids +++ /dev/null | |||
| @@ -1,10180 +0,0 @@ | |||
| 1 | # | ||
| 2 | # List of PCI ID's | ||
| 3 | # | ||
| 4 | # Maintained by Martin Mares <mj@ucw.cz> and other volunteers from the | ||
| 5 | # Linux PCI ID's Project at http://pciids.sf.net/. New data are always | ||
| 6 | # welcome (if they are accurate), we're eagerly expecting new entries, | ||
| 7 | # so if you have anything to contribute, please visit the home page or | ||
| 8 | # send a diff -u against the most recent pci.ids to pci-ids@ucw.cz. | ||
| 9 | # | ||
| 10 | # Daily snapshot on Tue 2005-03-08 10:11:48 | ||
| 11 | # | ||
| 12 | |||
| 13 | # Vendors, devices and subsystems. Please keep sorted. | ||
| 14 | |||
| 15 | # Syntax: | ||
| 16 | # vendor vendor_name | ||
| 17 | # device device_name <-- single tab | ||
| 18 | # subvendor subdevice subsystem_name <-- two tabs | ||
| 19 | |||
| 20 | 0000 Gammagraphx, Inc. | ||
| 21 | 001a Ascend Communications, Inc. | ||
| 22 | 0033 Paradyne corp. | ||
| 23 | 003d Lockheed Martin-Marietta Corp | ||
| 24 | # Real TJN ID is e159, but they got it wrong several times --mj | ||
| 25 | 0059 Tiger Jet Network Inc. (Wrong ID) | ||
| 26 | 0070 Hauppauge computer works Inc. | ||
| 27 | 4000 WinTV PVR-350 | ||
| 28 | 4001 WinTV PVR-250 (v1) | ||
| 29 | 4009 WinTV PVR-250 | ||
| 30 | 4801 WinTV PVR-250 MCE | ||
| 31 | 0071 Nebula Electronics Ltd. | ||
| 32 | 0095 Silicon Image, Inc. (Wrong ID) | ||
| 33 | 0680 Ultra ATA/133 IDE RAID CONTROLLER CARD | ||
| 34 | 0100 Ncipher Corp Ltd | ||
| 35 | # 018a is not LevelOne but there is a board misprogrammed | ||
| 36 | 018a LevelOne | ||
| 37 | 0106 FPC-0106TX misprogrammed [RTL81xx] | ||
| 38 | # 021b is not Compaq but there is a board misprogrammed | ||
| 39 | 021b Compaq Computer Corporation | ||
| 40 | 8139 HNE-300 (RealTek RTL8139c) [iPaq Networking] | ||
| 41 | # http://www.davicom.com.tw/ | ||
| 42 | 0291 Davicom Semiconductor, Inc. | ||
| 43 | 8212 DM9102A(DM9102AE, SM9102AF) Ethernet 100/10 MBit(Rev 40) | ||
| 44 | # SpeedStream is Efficient Networks, Inc, a Siemens Company | ||
| 45 | 02ac SpeedStream | ||
| 46 | 1012 1012 PCMCIA 10/100 Ethernet Card [RTL81xx] | ||
| 47 | 0357 TTTech AG | ||
| 48 | 000a TTP-Monitoring Card V2.0 | ||
| 49 | 0432 SCM Microsystems, Inc. | ||
| 50 | 0001 Pluto2 DVB-T Receiver for PCMCIA [EasyWatch MobilSet] | ||
| 51 | 05e3 CyberDoor | ||
| 52 | 0701 CBD516 | ||
| 53 | 0675 Dynalink | ||
| 54 | 1700 IS64PH ISDN Adapter | ||
| 55 | 1702 IS64PH ISDN Adapter | ||
| 56 | # Wrong ID used in subsystem ID of VIA USB controllers. | ||
| 57 | 0925 VIA Technologies, Inc. (Wrong ID) | ||
| 58 | 09c1 Arris | ||
| 59 | 0704 CM 200E Cable Modem | ||
| 60 | 0a89 BREA Technologies Inc | ||
| 61 | 0b49 ASCII Corporation | ||
| 62 | # see http://homepage1.nifty.com/mcn/lab/machines/trance_vibrator/usbview.vib.txt | ||
| 63 | 064f Trance Vibrator | ||
| 64 | 0e11 Compaq Computer Corporation | ||
| 65 | 0001 PCI to EISA Bridge | ||
| 66 | 0002 PCI to ISA Bridge | ||
| 67 | 0046 Smart Array 64xx | ||
| 68 | 0e11 409a Smart Array 641 | ||
| 69 | 0e11 409b Smart Array 642 | ||
| 70 | 0e11 409c Smart Array 6400 | ||
| 71 | 0e11 409d Smart Array 6400 EM | ||
| 72 | 0049 NC7132 Gigabit Upgrade Module | ||
| 73 | 004a NC6136 Gigabit Server Adapter | ||
| 74 | 007c NC7770 1000BaseTX | ||
| 75 | 007d NC6770 1000BaseTX | ||
| 76 | 0085 NC7780 1000BaseTX | ||
| 77 | 00bb NC7760 | ||
| 78 | 00ca NC7771 | ||
| 79 | 00cb NC7781 | ||
| 80 | 00cf NC7772 | ||
| 81 | 00d0 NC7782 | ||
| 82 | 00d1 NC7783 | ||
| 83 | 00e3 NC7761 | ||
| 84 | 0508 Netelligent 4/16 Token Ring | ||
| 85 | 1000 Triflex/Pentium Bridge, Model 1000 | ||
| 86 | 2000 Triflex/Pentium Bridge, Model 2000 | ||
| 87 | 3032 QVision 1280/p | ||
| 88 | 3033 QVision 1280/p | ||
| 89 | 3034 QVision 1280/p | ||
| 90 | 4000 4000 [Triflex] | ||
| 91 | 4030 SMART-2/P | ||
| 92 | 4031 SMART-2SL | ||
| 93 | 4032 Smart Array 3200 | ||
| 94 | 4033 Smart Array 3100ES | ||
| 95 | 4034 Smart Array 221 | ||
| 96 | 4040 Integrated Array | ||
| 97 | 4048 Compaq Raid LC2 | ||
| 98 | 4050 Smart Array 4200 | ||
| 99 | 4051 Smart Array 4250ES | ||
| 100 | 4058 Smart Array 431 | ||
| 101 | 4070 Smart Array 5300 | ||
| 102 | 4080 Smart Array 5i | ||
| 103 | 4082 Smart Array 532 | ||
| 104 | 4083 Smart Array 5312 | ||
| 105 | 4091 Smart Array 6i | ||
| 106 | 409a Smart Array 641 | ||
| 107 | 409b Smart Array 642 | ||
| 108 | 409c Smart Array 6400 | ||
| 109 | 409d Smart Array 6400 EM | ||
| 110 | 6010 HotPlug PCI Bridge 6010 | ||
| 111 | 7020 USB Controller | ||
| 112 | a0ec Fibre Channel Host Controller | ||
| 113 | a0f0 Advanced System Management Controller | ||
| 114 | a0f3 Triflex PCI to ISA Bridge | ||
| 115 | a0f7 PCI Hotplug Controller | ||
| 116 | 8086 002a PCI Hotplug Controller A | ||
| 117 | 8086 002b PCI Hotplug Controller B | ||
| 118 | a0f8 ZFMicro Chipset USB | ||
| 119 | a0fc FibreChannel HBA Tachyon | ||
| 120 | ae10 Smart-2/P RAID Controller | ||
| 121 | 0e11 4030 Smart-2/P Array Controller | ||
| 122 | 0e11 4031 Smart-2SL Array Controller | ||
| 123 | 0e11 4032 Smart Array Controller | ||
| 124 | 0e11 4033 Smart 3100ES Array Controller | ||
| 125 | ae29 MIS-L | ||
| 126 | ae2a MPC | ||
| 127 | ae2b MIS-E | ||
| 128 | ae31 System Management Controller | ||
| 129 | ae32 Netelligent 10/100 TX PCI UTP | ||
| 130 | ae33 Triflex Dual EIDE Controller | ||
| 131 | ae34 Netelligent 10 T PCI UTP | ||
| 132 | ae35 Integrated NetFlex-3/P | ||
| 133 | ae40 Netelligent Dual 10/100 TX PCI UTP | ||
| 134 | ae43 Netelligent Integrated 10/100 TX UTP | ||
| 135 | ae69 CETUS-L | ||
| 136 | ae6c Northstar | ||
| 137 | ae6d NorthStar CPU to PCI Bridge | ||
| 138 | b011 Netelligent 10/100 TX Embedded UTP | ||
| 139 | b012 Netelligent 10 T/2 PCI UTP/Coax | ||
| 140 | b01e NC3120 Fast Ethernet NIC | ||
| 141 | b01f NC3122 Fast Ethernet NIC | ||
| 142 | b02f NC1120 Ethernet NIC | ||
| 143 | b030 Netelligent 10/100 TX UTP | ||
| 144 | b04a 10/100 TX PCI Intel WOL UTP Controller | ||
| 145 | b060 Smart Array 5300 Controller | ||
| 146 | b0c6 NC3161 Fast Ethernet NIC | ||
| 147 | b0c7 NC3160 Fast Ethernet NIC | ||
| 148 | b0d7 NC3121 Fast Ethernet NIC | ||
| 149 | b0dd NC3131 Fast Ethernet NIC | ||
| 150 | b0de NC3132 Fast Ethernet Module | ||
| 151 | b0df NC6132 Gigabit Module | ||
| 152 | b0e0 NC6133 Gigabit Module | ||
| 153 | b0e1 NC3133 Fast Ethernet Module | ||
| 154 | b123 NC6134 Gigabit NIC | ||
| 155 | b134 NC3163 Fast Ethernet NIC | ||
| 156 | b13c NC3162 Fast Ethernet NIC | ||
| 157 | b144 NC3123 Fast Ethernet NIC | ||
| 158 | b163 NC3134 Fast Ethernet NIC | ||
| 159 | b164 NC3165 Fast Ethernet Upgrade Module | ||
| 160 | b178 Smart Array 5i/532 | ||
| 161 | 0e11 4080 Smart Array 5i | ||
| 162 | 0e11 4082 Smart Array 532 | ||
| 163 | 0e11 4083 Smart Array 5312 | ||
| 164 | b1a4 NC7131 Gigabit Server Adapter | ||
| 165 | # HP Memory Hot-Plug Controller | ||
| 166 | b200 Memory Hot-Plug Controller | ||
| 167 | b203 Integrated Lights Out Controller | ||
| 168 | b204 Integrated Lights Out Processor | ||
| 169 | f130 NetFlex-3/P ThunderLAN 1.0 | ||
| 170 | f150 NetFlex-3/P ThunderLAN 2.3 | ||
| 171 | 0e55 HaSoTec GmbH | ||
| 172 | # Formerly NCR | ||
| 173 | 1000 LSI Logic / Symbios Logic | ||
| 174 | 0001 53c810 | ||
| 175 | 1000 1000 LSI53C810AE PCI to SCSI I/O Processor | ||
| 176 | 0002 53c820 | ||
| 177 | 0003 53c825 | ||
| 178 | 1000 1000 LSI53C825AE PCI to SCSI I/O Processor (Ultra Wide) | ||
| 179 | 0004 53c815 | ||
| 180 | 0005 53c810AP | ||
| 181 | 0006 53c860 | ||
| 182 | 1000 1000 LSI53C860E PCI to Ultra SCSI I/O Processor | ||
| 183 | 000a 53c1510 | ||
| 184 | 1000 1000 LSI53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Nonintelligent mode) | ||
| 185 | 000b 53C896/897 | ||
| 186 | 0e11 6004 EOB003 Series SCSI host adapter | ||
| 187 | 1000 1000 LSI53C896/7 PCI to Dual Channel Ultra2 SCSI Multifunction Controller | ||
| 188 | 1000 1010 LSI22910 PCI to Dual Channel Ultra2 SCSI host adapter | ||
| 189 | 1000 1020 LSI21002 PCI to Dual Channel Ultra2 SCSI host adapter | ||
| 190 | # multifunction PCI card: Dual U2W SCSI, dual 10/100TX, graphics | ||
| 191 | 13e9 1000 6221L-4U | ||
| 192 | 000c 53c895 | ||
| 193 | 1000 1010 LSI8951U PCI to Ultra2 SCSI host adapter | ||
| 194 | 1000 1020 LSI8952U PCI to Ultra2 SCSI host adapter | ||
| 195 | 1de1 3906 DC-390U2B SCSI adapter | ||
| 196 | 1de1 3907 DC-390U2W | ||
| 197 | 000d 53c885 | ||
| 198 | 000f 53c875 | ||
| 199 | 0e11 7004 Embedded Ultra Wide SCSI Controller | ||
| 200 | 1000 1000 LSI53C876/E PCI to Dual Channel SCSI Controller | ||
| 201 | 1000 1010 LSI22801 PCI to Dual Channel Ultra SCSI host adapter | ||
| 202 | 1000 1020 LSI22802 PCI to Dual Channel Ultra SCSI host adapter | ||
| 203 | 1092 8760 FirePort 40 Dual SCSI Controller | ||
| 204 | 1de1 3904 DC390F/U Ultra Wide SCSI Adapter | ||
| 205 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 206 | 4c53 1050 CT7 mainboard | ||
| 207 | 0010 53C1510 | ||
| 208 | 0e11 4040 Integrated Array Controller | ||
| 209 | 0e11 4048 RAID LC2 Controller | ||
| 210 | 1000 1000 53C1510 PCI to Dual Channel Wide Ultra2 SCSI Controller (Intelligent mode) | ||
| 211 | 0012 53c895a | ||
| 212 | 1000 1000 LSI53C895A PCI to Ultra2 SCSI Controller | ||
| 213 | 0013 53c875a | ||
| 214 | 1000 1000 LSI53C875A PCI to Ultra SCSI Controller | ||
| 215 | 0020 53c1010 Ultra3 SCSI Adapter | ||
| 216 | 1000 1000 LSI53C1010-33 PCI to Dual Channel Ultra160 SCSI Controller | ||
| 217 | 1de1 1020 DC-390U3W | ||
| 218 | 0021 53c1010 66MHz Ultra3 SCSI Adapter | ||
| 219 | 1000 1000 LSI53C1000/1000R/1010R/1010-66 PCI to Ultra160 SCSI Controller | ||
| 220 | 1000 1010 Asus TR-DLS onboard 53C1010-66 | ||
| 221 | 124b 1070 PMC-USCSI3 | ||
| 222 | 4c53 1080 CT8 mainboard | ||
| 223 | 4c53 1300 P017 mezzanine (32-bit PMC) | ||
| 224 | 4c53 1310 P017 mezzanine (64-bit PMC) | ||
| 225 | 0030 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 226 | 1028 0123 PowerEdge 2600 | ||
| 227 | 1028 014a PowerEdge 1750 | ||
| 228 | 1028 016c PowerEdge 1850 MPT Fusion SCSI/RAID (Perc 4) | ||
| 229 | 1028 0183 PowerEdge 1800 | ||
| 230 | 1028 1010 LSI U320 SCSI Controller | ||
| 231 | 0031 53c1030ZC PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 232 | 0032 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 233 | 1000 1000 LSI53C1020/1030 PCI-X to Ultra320 SCSI Controller | ||
| 234 | 0033 1030ZC_53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 235 | 0040 53c1035 PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 236 | 1000 0033 MegaRAID SCSI 320-2XR | ||
| 237 | 1000 0066 MegaRAID SCSI 320-2XRWS | ||
| 238 | 0041 53C1035ZC PCI-X Fusion-MPT Dual Ultra320 SCSI | ||
| 239 | 008f 53c875J | ||
| 240 | 1092 8000 FirePort 40 SCSI Controller | ||
| 241 | 1092 8760 FirePort 40 Dual SCSI Host Adapter | ||
| 242 | 0407 MegaRAID | ||
| 243 | 1000 0530 MegaRAID 530 SCSI 320-0X RAID Controller | ||
| 244 | 1000 0531 MegaRAID 531 SCSI 320-4X RAID Controller | ||
| 245 | 1000 0532 MegaRAID 532 SCSI 320-2X RAID Controller | ||
| 246 | 1028 0531 PowerEdge Expandable RAID Controller 4/QC | ||
| 247 | 1028 0533 PowerEdge Expandable RAID Controller 4/QC | ||
| 248 | 8086 0530 MegaRAID Intel RAID Controller SRCZCRX | ||
| 249 | 8086 0532 MegaRAID Intel RAID Controller SRCU42X | ||
| 250 | 0408 MegaRAID | ||
| 251 | 1000 0001 MegaRAID SCSI 320-1E RAID Controller | ||
| 252 | 1000 0002 MegaRAID SCSI 320-2E RAID Controller | ||
| 253 | 1025 004d MegaRAID ACER ROMB-2E RAID Controller | ||
| 254 | 1028 0001 PowerEdge RAID Controller PERC4e/SC | ||
| 255 | 1028 0002 PowerEdge RAID Controller PERC4e/DC | ||
| 256 | 1734 1065 FSC MegaRAID PCI Express ROMB | ||
| 257 | 8086 0002 MegaRAID Intel RAID Controller SRCU42E | ||
| 258 | 0409 MegaRAID | ||
| 259 | 1000 3004 MegaRAID SATA 300-4X RAID Controller | ||
| 260 | 1000 3008 MegaRAID SATA 300-8X RAID Controller | ||
| 261 | 8086 3008 MegaRAID RAID Controller SRCS28X | ||
| 262 | 8086 3431 MegaRAID RAID Controller Alief SROMBU42E | ||
| 263 | 8086 3499 MegaRAID RAID Controller Harwich SROMBU42E | ||
| 264 | 0621 FC909 Fibre Channel Adapter | ||
| 265 | 0622 FC929 Fibre Channel Adapter | ||
| 266 | 1000 1020 44929 O Dual Fibre Channel card | ||
| 267 | 0623 FC929 LAN | ||
| 268 | 0624 FC919 Fibre Channel Adapter | ||
| 269 | 0625 FC919 LAN | ||
| 270 | 0626 FC929X Fibre Channel Adapter | ||
| 271 | 1000 1010 7202-XP-LC Dual Fibre Channel card | ||
| 272 | 0627 FC929X LAN | ||
| 273 | 0628 FC919X Fibre Channel Adapter | ||
| 274 | 0629 FC919X LAN | ||
| 275 | 0701 83C885 NT50 DigitalScape Fast Ethernet | ||
| 276 | 0702 Yellowfin G-NIC gigabit ethernet | ||
| 277 | 1318 0000 PEI100X | ||
| 278 | 0804 SA2010 | ||
| 279 | 0805 SA2010ZC | ||
| 280 | 0806 SA2020 | ||
| 281 | 0807 SA2020ZC | ||
| 282 | 0901 61C102 | ||
| 283 | 1000 63C815 | ||
| 284 | 1960 MegaRAID | ||
| 285 | 1000 0518 MegaRAID 518 SCSI 320-2 Controller | ||
| 286 | 1000 0520 MegaRAID 520 SCSI 320-1 Controller | ||
| 287 | 1000 0522 MegaRAID 522 i4 133 RAID Controller | ||
| 288 | 1000 0523 MegaRAID SATA 150-6 RAID Controller | ||
| 289 | 1000 4523 MegaRAID SATA 150-4 RAID Controller | ||
| 290 | 1000 a520 MegaRAID ZCR SCSI 320-0 Controller | ||
| 291 | 1028 0518 MegaRAID 518 DELL PERC 4/DC RAID Controller | ||
| 292 | 1028 0520 MegaRAID 520 DELL PERC 4/SC RAID Controller | ||
| 293 | 1028 0531 PowerEdge Expandable RAID Controller 4/QC | ||
| 294 | 1028 0533 PowerEdge Expandable RAID Controller 4/QC | ||
| 295 | 8086 0520 MegaRAIDRAID Controller SRCU41L | ||
| 296 | 8086 0523 MegaRAID RAID Controller SRCS16 | ||
| 297 | 1001 Kolter Electronic | ||
| 298 | 0010 PCI 1616 Measurement card with 32 digital I/O lines | ||
| 299 | 0011 OPTO-PCI Opto-Isolated digital I/O board | ||
| 300 | 0012 PCI-AD/DA Analogue I/O board | ||
| 301 | 0013 PCI-OPTO-RELAIS Digital I/O board with relay outputs | ||
| 302 | 0014 PCI-Counter/Timer Counter Timer board | ||
| 303 | 0015 PCI-DAC416 Analogue output board | ||
| 304 | 0016 PCI-MFB Analogue I/O board | ||
| 305 | 0017 PROTO-3 PCI Prototyping board | ||
| 306 | 9100 INI-9100/9100W SCSI Host | ||
| 307 | 1002 ATI Technologies Inc | ||
| 308 | 3150 M24 1P [Radeon Mobility X600] | ||
| 309 | 3154 M24 1T [FireGL M24 GL] | ||
| 310 | 3e50 RV380 0x3e50 [Radeon X600] | ||
| 311 | 3e54 RV380 0x3e54 [FireGL V3200] | ||
| 312 | 3e70 RV380 [Radeon X600] Secondary | ||
| 313 | 4136 Radeon IGP 320 M | ||
| 314 | 4137 Radeon IGP330/340/350 | ||
| 315 | 4144 R300 AD [Radeon 9500 Pro] | ||
| 316 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 317 | 4145 R300 AE [Radeon 9700 Pro] | ||
| 318 | # New PCI ID provided by ATI developer relations (oops, correction to above) | ||
| 319 | 4146 R300 AF [Radeon 9700 Pro] | ||
| 320 | 4147 R300 AG [FireGL Z1/X1] | ||
| 321 | 4148 R350 AH [Radeon 9800] | ||
| 322 | 4149 R350 AI [Radeon 9800] | ||
| 323 | 414a R350 AJ [Radeon 9800] | ||
| 324 | 414b R350 AK [Fire GL X2] | ||
| 325 | # New PCI ID provided by ATI developer relations | ||
| 326 | 4150 RV350 AP [Radeon 9600] | ||
| 327 | 1002 0002 R9600 Pro primary (Asus OEM for HP) | ||
| 328 | 1002 0003 R9600 Pro secondary (Asus OEM for HP) | ||
| 329 | 1458 4024 Giga-Byte GV-R96128D Primary | ||
| 330 | 148c 2064 PowerColor R96A-C3N | ||
| 331 | 148c 2066 PowerColor R96A-C3N | ||
| 332 | 174b 7c19 Sapphire Atlantis Radeon 9600 Pro | ||
| 333 | 174b 7c29 GC-R9600PRO Primary [Sapphire] | ||
| 334 | 17ee 2002 Radeon 9600 256Mb Primary | ||
| 335 | 18bc 0101 GC-R9600PRO Primary | ||
| 336 | # New PCI ID provided by ATI developer relations | ||
| 337 | 4151 RV350 AQ [Radeon 9600] | ||
| 338 | 1043 c004 A9600SE | ||
| 339 | # New PCI ID provided by ATI developer relations | ||
| 340 | 4152 RV350 AR [Radeon 9600] | ||
| 341 | 1002 0002 Radeon 9600XT | ||
| 342 | 1043 c002 Radeon 9600 XT TVD | ||
| 343 | 174b 7c29 Sapphire Radeon 9600XT | ||
| 344 | 1787 4002 Radeon 9600 XT | ||
| 345 | 4153 RV350 AS [Radeon 9600 AS] | ||
| 346 | 4154 RV350 AT [Fire GL T2] | ||
| 347 | 4155 RV350 AU [Fire GL T2] | ||
| 348 | 4156 RV350 AV [Fire GL T2] | ||
| 349 | 4157 RV350 AW [Fire GL T2] | ||
| 350 | 4158 68800AX [Mach32] | ||
| 351 | # The PCI ID is unrelated to any DVI output. | ||
| 352 | 4164 R300 AD [Radeon 9500 Pro] (Secondary) | ||
| 353 | # New PCI ID info provided by ATI developer relations | ||
| 354 | 4165 R300 AE [Radeon 9700 Pro] (Secondary) | ||
| 355 | # New PCI ID info provided by ATI developer relations | ||
| 356 | 4166 R300 AF [Radeon 9700 Pro] (Secondary) | ||
| 357 | # New PCI ID provided by ATI developer relations | ||
| 358 | 4168 Radeon R350 [Radeon 9800] (Secondary) | ||
| 359 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 360 | 4170 RV350 AP [Radeon 9600] (Secondary) | ||
| 361 | 1458 4025 Giga-Byte GV-R96128D Secondary | ||
| 362 | 148c 2067 PowerColor R96A-C3N (Secondary) | ||
| 363 | 174b 7c28 GC-R9600PRO Secondary [Sapphire] | ||
| 364 | 17ee 2003 Radeon 9600 256Mb Secondary | ||
| 365 | 18bc 0100 GC-R9600PRO Secondary | ||
| 366 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 367 | 4171 RV350 AQ [Radeon 9600] (Secondary) | ||
| 368 | 1043 c005 A9600SE (Secondary) | ||
| 369 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 370 | 4172 RV350 AR [Radeon 9600] (Secondary) | ||
| 371 | 1002 0003 Radeon 9600XT (Secondary) | ||
| 372 | 1043 c003 A9600XT (Secondary) | ||
| 373 | 174b 7c28 Sapphire Radeon 9600XT (Secondary) | ||
| 374 | 1787 4003 Radeon 9600 XT (Secondary) | ||
| 375 | 4173 RV350 ?? [Radeon 9550] (Secondary) | ||
| 376 | 4237 Radeon 7000 IGP | ||
| 377 | 4242 R200 BB [Radeon All in Wonder 8500DV] | ||
| 378 | 1002 02aa Radeon 8500 AIW DV Edition | ||
| 379 | 4243 R200 BC [Radeon All in Wonder 8500] | ||
| 380 | 4336 Radeon Mobility U1 | ||
| 381 | 103c 0024 Pavilion ze4400 builtin Video | ||
| 382 | 4337 Radeon IGP 330M/340M/350M | ||
| 383 | 1014 053a ThinkPad R40e (2684-HVG) builtin VGA controller | ||
| 384 | 103c 0850 Radeon IGP 345M | ||
| 385 | 4341 IXP150 AC'97 Audio Controller | ||
| 386 | 4345 EHCI USB Controller | ||
| 387 | 4347 OHCI USB Controller #1 | ||
| 388 | 4348 OHCI USB Controller #2 | ||
| 389 | 4349 ATI Dual Channel Bus Master PCI IDE Controller | ||
| 390 | 434d IXP AC'97 Modem | ||
| 391 | 4353 ATI SMBus | ||
| 392 | 4354 215CT [Mach64 CT] | ||
| 393 | 4358 210888CX [Mach64 CX] | ||
| 394 | 4363 ATI SMBus | ||
| 395 | 436e ATI 436E Serial ATA Controller | ||
| 396 | 4372 ATI SMBus | ||
| 397 | 4376 Standard Dual Channel PCI IDE Controller ATI | ||
| 398 | 4379 ATI 4379 Serial ATA Controller | ||
| 399 | 437a ATI 437A Serial ATA Controller | ||
| 400 | 4437 Radeon Mobility 7000 IGP | ||
| 401 | 4554 210888ET [Mach64 ET] | ||
| 402 | 4654 Mach64 VT | ||
| 403 | 4742 3D Rage Pro AGP 1X/2X | ||
| 404 | 1002 0040 Rage Pro Turbo AGP 2X | ||
| 405 | 1002 0044 Rage Pro Turbo AGP 2X | ||
| 406 | 1002 0061 Rage Pro AIW AGP 2X | ||
| 407 | 1002 0062 Rage Pro AIW AGP 2X | ||
| 408 | 1002 0063 Rage Pro AIW AGP 2X | ||
| 409 | 1002 0080 Rage Pro Turbo AGP 2X | ||
| 410 | 1002 0084 Rage Pro Turbo AGP 2X | ||
| 411 | 1002 4742 Rage Pro Turbo AGP 2X | ||
| 412 | 1002 8001 Rage Pro Turbo AGP 2X | ||
| 413 | 1028 0082 Rage Pro Turbo AGP 2X | ||
| 414 | 1028 4082 Optiplex GX1 Onboard Display Adapter | ||
| 415 | 1028 8082 Rage Pro Turbo AGP 2X | ||
| 416 | 1028 c082 Rage Pro Turbo AGP 2X | ||
| 417 | 8086 4152 Xpert 98D AGP 2X | ||
| 418 | 8086 464a Rage Pro Turbo AGP 2X | ||
| 419 | 4744 3D Rage Pro AGP 1X | ||
| 420 | 1002 4744 Rage Pro Turbo AGP | ||
| 421 | 4747 3D Rage Pro | ||
| 422 | 4749 3D Rage Pro | ||
| 423 | 1002 0061 Rage Pro AIW | ||
| 424 | 1002 0062 Rage Pro AIW | ||
| 425 | 474c Rage XC | ||
| 426 | 474d Rage XL AGP 2X | ||
| 427 | 1002 0004 Xpert 98 RXL AGP 2X | ||
| 428 | 1002 0008 Xpert 98 RXL AGP 2X | ||
| 429 | 1002 0080 Rage XL AGP 2X | ||
| 430 | 1002 0084 Xpert 98 AGP 2X | ||
| 431 | 1002 474d Rage XL AGP | ||
| 432 | 1033 806a Rage XL AGP | ||
| 433 | 474e Rage XC AGP | ||
| 434 | 1002 474e Rage XC AGP | ||
| 435 | 474f Rage XL | ||
| 436 | 1002 0008 Rage XL | ||
| 437 | 1002 474f Rage XL | ||
| 438 | 4750 3D Rage Pro 215GP | ||
| 439 | 1002 0040 Rage Pro Turbo | ||
| 440 | 1002 0044 Rage Pro Turbo | ||
| 441 | 1002 0080 Rage Pro Turbo | ||
| 442 | 1002 0084 Rage Pro Turbo | ||
| 443 | 1002 4750 Rage Pro Turbo | ||
| 444 | 4751 3D Rage Pro 215GQ | ||
| 445 | 4752 Rage XL | ||
| 446 | 1002 0008 Rage XL | ||
| 447 | 1002 4752 Rage XL | ||
| 448 | 1002 8008 Rage XL | ||
| 449 | 1028 00ce PowerEdge 1400 | ||
| 450 | 1028 00d1 PowerEdge 2550 | ||
| 451 | 1028 00d9 PowerEdge 2500 | ||
| 452 | 8086 3411 SDS2 Mainboard | ||
| 453 | 8086 3427 S875WP1-E mainboard | ||
| 454 | 4753 Rage XC | ||
| 455 | 1002 4753 Rage XC | ||
| 456 | 4754 3D Rage I/II 215GT [Mach64 GT] | ||
| 457 | 4755 3D Rage II+ 215GTB [Mach64 GTB] | ||
| 458 | 4756 3D Rage IIC 215IIC [Mach64 GT IIC] | ||
| 459 | 1002 4756 Rage IIC | ||
| 460 | 4757 3D Rage IIC AGP | ||
| 461 | 1002 4757 Rage IIC AGP | ||
| 462 | 1028 0089 Rage 3D IIC | ||
| 463 | 1028 4082 Rage 3D IIC | ||
| 464 | 1028 8082 Rage 3D IIC | ||
| 465 | 1028 c082 Rage 3D IIC | ||
| 466 | 4758 210888GX [Mach64 GX] | ||
| 467 | 4759 3D Rage IIC | ||
| 468 | 475a 3D Rage IIC AGP | ||
| 469 | 1002 0084 Rage 3D Pro AGP 2x XPERT 98 | ||
| 470 | 1002 0087 Rage 3D IIC | ||
| 471 | 1002 475a Rage IIC AGP | ||
| 472 | 4964 Radeon RV250 Id [Radeon 9000] | ||
| 473 | 4965 Radeon RV250 Ie [Radeon 9000] | ||
| 474 | 4966 Radeon RV250 If [Radeon 9000] | ||
| 475 | 10f1 0002 RV250 If [Tachyon G9000 PRO] | ||
| 476 | 148c 2039 RV250 If [Radeon 9000 Pro "Evil Commando"] | ||
| 477 | 1509 9a00 RV250 If [Radeon 9000 "AT009"] | ||
| 478 | # New subdevice - 3D Prophet 9000 PCI by Hercules. AGP version probably would have same ID, so not specified. | ||
| 479 | 1681 0040 RV250 If [3D prophet 9000] | ||
| 480 | 174b 7176 RV250 If [Sapphire Radeon 9000 Pro] | ||
| 481 | 174b 7192 RV250 If [Radeon 9000 "Atlantis"] | ||
| 482 | 17af 2005 RV250 If [Excalibur Radeon 9000 Pro] | ||
| 483 | 17af 2006 RV250 If [Excalibur Radeon 9000] | ||
| 484 | 4967 Radeon RV250 Ig [Radeon 9000] | ||
| 485 | 496e Radeon RV250 [Radeon 9000] (Secondary) | ||
| 486 | 4a48 R420 JH [Radeon X800] | ||
| 487 | 4a49 R420 JI [Radeon X800PRO] | ||
| 488 | 4a4a R420 JJ [Radeon X800SE] | ||
| 489 | 4a4b R420 JK [Radeon X800] | ||
| 490 | 4a4c R420 JL [Radeon X800] | ||
| 491 | 4a4d R420 JM [FireGL X3] | ||
| 492 | 4a4e M18 JN [Radeon Mobility 9800] | ||
| 493 | 4a50 R420 JP [Radeon X800XT] | ||
| 494 | 4a70 R420 [X800XT-PE] (Secondary) | ||
| 495 | 4c42 3D Rage LT Pro AGP-133 | ||
| 496 | 0e11 b0e7 Rage LT Pro (Compaq Presario 5240) | ||
| 497 | 0e11 b0e8 Rage 3D LT Pro | ||
| 498 | 0e11 b10e 3D Rage LT Pro (Compaq Armada 1750) | ||
| 499 | 1002 0040 Rage LT Pro AGP 2X | ||
| 500 | 1002 0044 Rage LT Pro AGP 2X | ||
| 501 | 1002 4c42 Rage LT Pro AGP 2X | ||
| 502 | 1002 8001 Rage LT Pro AGP 2X | ||
| 503 | 1028 0085 Rage 3D LT Pro | ||
| 504 | 4c44 3D Rage LT Pro AGP-66 | ||
| 505 | 4c45 Rage Mobility M3 AGP | ||
| 506 | 4c46 Rage Mobility M3 AGP 2x | ||
| 507 | 1028 00b1 Latitude C600 | ||
| 508 | 4c47 3D Rage LT-G 215LG | ||
| 509 | 4c49 3D Rage LT Pro | ||
| 510 | 1002 0004 Rage LT Pro | ||
| 511 | 1002 0040 Rage LT Pro | ||
| 512 | 1002 0044 Rage LT Pro | ||
| 513 | 1002 4c49 Rage LT Pro | ||
| 514 | 4c4d Rage Mobility P/M AGP 2x | ||
| 515 | 0e11 b111 Armada M700 | ||
| 516 | 0e11 b160 Armada E500 | ||
| 517 | 1002 0084 Xpert 98 AGP 2X (Mobility) | ||
| 518 | 1014 0154 ThinkPad A20m | ||
| 519 | 1028 00aa Latitude CPt | ||
| 520 | 1028 00bb Latitude CPx | ||
| 521 | 4c4e Rage Mobility L AGP 2x | ||
| 522 | 4c50 3D Rage LT Pro | ||
| 523 | 1002 4c50 Rage LT Pro | ||
| 524 | 4c51 3D Rage LT Pro | ||
| 525 | 4c52 Rage Mobility P/M | ||
| 526 | 1033 8112 Versa Note VXi | ||
| 527 | 4c53 Rage Mobility L | ||
| 528 | 4c54 264LT [Mach64 LT] | ||
| 529 | 4c57 Radeon Mobility M7 LW [Radeon Mobility 7500] | ||
| 530 | 1014 0517 ThinkPad T30 | ||
| 531 | 1028 00e6 Radeon Mobility M7 LW (Dell Inspiron 8100) | ||
| 532 | 1028 012a Latitude C640 | ||
| 533 | 144d c006 Radeon Mobility M7 LW in vpr Matrix 170B4 | ||
| 534 | 4c58 Radeon RV200 LX [Mobility FireGL 7800 M7] | ||
| 535 | 4c59 Radeon Mobility M6 LY | ||
| 536 | 1014 0235 ThinkPad A30/A30p (2652/2653) | ||
| 537 | 1014 0239 ThinkPad X22/X23/X24 | ||
| 538 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 539 | 4c5a Radeon Mobility M6 LZ | ||
| 540 | 4c64 Radeon R250 Ld [Radeon Mobility 9000 M9] | ||
| 541 | 4c65 Radeon R250 Le [Radeon Mobility 9000 M9] | ||
| 542 | 4c66 Radeon R250 Lf [FireGL 9000] | ||
| 543 | 4c67 Radeon R250 Lg [Radeon Mobility 9000 M9] | ||
| 544 | # Secondary chip to the Lf | ||
| 545 | 4c6e Radeon R250 Ln [Radeon Mobility 9000 M9] [Secondary] | ||
| 546 | 4d46 Rage Mobility M4 AGP | ||
| 547 | 4d4c Rage Mobility M4 AGP | ||
| 548 | 4e44 Radeon R300 ND [Radeon 9700 Pro] | ||
| 549 | 4e45 Radeon R300 NE [Radeon 9500 Pro] | ||
| 550 | 1002 0002 Radeon R300 NE [Radeon 9500 Pro] | ||
| 551 | 1681 0002 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] | ||
| 552 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 553 | 4e46 RV350 NF [Radeon 9600] | ||
| 554 | 4e47 Radeon R300 NG [FireGL X1] | ||
| 555 | # (added pro) | ||
| 556 | 4e48 Radeon R350 [Radeon 9800 Pro] | ||
| 557 | # New PCI ID provided by ATI developer relations | ||
| 558 | 4e49 Radeon R350 [Radeon 9800] | ||
| 559 | 4e4a RV350 NJ [Radeon 9800 XT] | ||
| 560 | 4e4b R350 NK [Fire GL X2] | ||
| 561 | # New PCI ID provided by ATI developer relations | ||
| 562 | 4e50 RV350 [Mobility Radeon 9600 M10] | ||
| 563 | 1025 005a TravelMate 290 | ||
| 564 | 103c 088c nc8000 laptop | ||
| 565 | 103c 0890 nc6000 laptop | ||
| 566 | 1734 1055 Amilo M1420W | ||
| 567 | 4e51 M10 NQ [Radeon Mobility 9600] | ||
| 568 | 4e52 RV350 [Mobility Radeon 9600 M10] | ||
| 569 | 4e53 M10 NS [Radeon Mobility 9600] | ||
| 570 | 4e54 M10 NT [FireGL Mobility T2] | ||
| 571 | 4e56 M11 NV [FireGL Mobility T2e] | ||
| 572 | 4e64 Radeon R300 [Radeon 9700 Pro] (Secondary) | ||
| 573 | 4e65 Radeon R300 [Radeon 9500 Pro] (Secondary) | ||
| 574 | 1002 0003 Radeon R300 NE [Radeon 9500 Pro] | ||
| 575 | 1681 0003 Hercules 3D Prophet 9500 PRO [Radeon 9500 Pro] (Secondary) | ||
| 576 | # New PCI ID provided by ATI developer relations (correction to above) | ||
| 577 | 4e66 RV350 NF [Radeon 9600] (Secondary) | ||
| 578 | 4e67 Radeon R300 [FireGL X1] (Secondary) | ||
| 579 | # (added pro) | ||
| 580 | 4e68 Radeon R350 [Radeon 9800 Pro] (Secondary) | ||
| 581 | # New PCI ID provided by ATI developer relations | ||
| 582 | 4e69 Radeon R350 [Radeon 9800] (Secondary) | ||
| 583 | 4e6a RV350 NJ [Radeon 9800 XT] (Secondary) | ||
| 584 | 1002 4e71 ATI Technologies Inc M10 NQ [Radeon Mobility 9600] | ||
| 585 | 5041 Rage 128 PA/PRO | ||
| 586 | 5042 Rage 128 PB/PRO AGP 2x | ||
| 587 | 5043 Rage 128 PC/PRO AGP 4x | ||
| 588 | 5044 Rage 128 PD/PRO TMDS | ||
| 589 | 1002 0028 Rage 128 AIW | ||
| 590 | 1002 0029 Rage 128 AIW | ||
| 591 | 5045 Rage 128 PE/PRO AGP 2x TMDS | ||
| 592 | 5046 Rage 128 PF/PRO AGP 4x TMDS | ||
| 593 | 1002 0004 Rage Fury Pro | ||
| 594 | 1002 0008 Rage Fury Pro/Xpert 2000 Pro | ||
| 595 | 1002 0014 Rage Fury Pro | ||
| 596 | 1002 0018 Rage Fury Pro/Xpert 2000 Pro | ||
| 597 | 1002 0028 Rage 128 Pro AIW AGP | ||
| 598 | 1002 002a Rage 128 Pro AIW AGP | ||
| 599 | 1002 0048 Rage Fury Pro | ||
| 600 | 1002 2000 Rage Fury MAXX AGP 4x (TMDS) (VGA device) | ||
| 601 | 1002 2001 Rage Fury MAXX AGP 4x (TMDS) (Extra device?!) | ||
| 602 | 5047 Rage 128 PG/PRO | ||
| 603 | 5048 Rage 128 PH/PRO AGP 2x | ||
| 604 | 5049 Rage 128 PI/PRO AGP 4x | ||
| 605 | 504a Rage 128 PJ/PRO TMDS | ||
| 606 | 504b Rage 128 PK/PRO AGP 2x TMDS | ||
| 607 | 504c Rage 128 PL/PRO AGP 4x TMDS | ||
| 608 | 504d Rage 128 PM/PRO | ||
| 609 | 504e Rage 128 PN/PRO AGP 2x | ||
| 610 | 504f Rage 128 PO/PRO AGP 4x | ||
| 611 | 5050 Rage 128 PP/PRO TMDS [Xpert 128] | ||
| 612 | 1002 0008 Xpert 128 | ||
| 613 | 5051 Rage 128 PQ/PRO AGP 2x TMDS | ||
| 614 | 5052 Rage 128 PR/PRO AGP 4x TMDS | ||
| 615 | 5053 Rage 128 PS/PRO | ||
| 616 | 5054 Rage 128 PT/PRO AGP 2x | ||
| 617 | 5055 Rage 128 PU/PRO AGP 4x | ||
| 618 | 5056 Rage 128 PV/PRO TMDS | ||
| 619 | 5057 Rage 128 PW/PRO AGP 2x TMDS | ||
| 620 | 5058 Rage 128 PX/PRO AGP 4x TMDS | ||
| 621 | 5144 Radeon R100 QD [Radeon 7200] | ||
| 622 | 1002 0008 Radeon 7000/Radeon VE | ||
| 623 | 1002 0009 Radeon 7000/Radeon | ||
| 624 | 1002 000a Radeon 7000/Radeon | ||
| 625 | 1002 001a Radeon 7000/Radeon | ||
| 626 | 1002 0029 Radeon AIW | ||
| 627 | 1002 0038 Radeon 7000/Radeon | ||
| 628 | 1002 0039 Radeon 7000/Radeon | ||
| 629 | 1002 008a Radeon 7000/Radeon | ||
| 630 | 1002 00ba Radeon 7000/Radeon | ||
| 631 | 1002 0139 Radeon 7000/Radeon | ||
| 632 | 1002 028a Radeon 7000/Radeon | ||
| 633 | 1002 02aa Radeon AIW | ||
| 634 | 1002 053a Radeon 7000/Radeon | ||
| 635 | 5145 Radeon R100 QE | ||
| 636 | 5146 Radeon R100 QF | ||
| 637 | 5147 Radeon R100 QG | ||
| 638 | 5148 Radeon R200 QH [Radeon 8500] | ||
| 639 | 1002 010a FireGL 8800 64Mb | ||
| 640 | 1002 0152 FireGL 8800 128Mb | ||
| 641 | 1002 0162 FireGL 8700 32Mb | ||
| 642 | 1002 0172 FireGL 8700 64Mb | ||
| 643 | 5149 Radeon R200 QI | ||
| 644 | 514a Radeon R200 QJ | ||
| 645 | 514b Radeon R200 QK | ||
| 646 | 514c Radeon R200 QL [Radeon 8500 LE] | ||
| 647 | 1002 003a Radeon R200 QL [Radeon 8500 LE] | ||
| 648 | 1002 013a Radeon 8500 | ||
| 649 | 148c 2026 R200 QL [Radeon 8500 Evil Master II Multi Display Edition] | ||
| 650 | 1681 0010 Radeon 8500 [3D Prophet 8500 128Mb] | ||
| 651 | 174b 7149 Radeon R200 QL [Sapphire Radeon 8500 LE] | ||
| 652 | 514d Radeon R200 QM [Radeon 9100] | ||
| 653 | 514e Radeon R200 QN [Radeon 8500LE] | ||
| 654 | 514f Radeon R200 QO [Radeon 8500LE] | ||
| 655 | 5154 R200 QT [Radeon 8500] | ||
| 656 | 5155 R200 QU [Radeon 9100] | ||
| 657 | 5157 Radeon RV200 QW [Radeon 7500] | ||
| 658 | 1002 013a Radeon 7500 | ||
| 659 | 1002 103a Dell Optiplex GX260 | ||
| 660 | 1458 4000 RV200 QW [RADEON 7500 PRO MAYA AR] | ||
| 661 | 148c 2024 RV200 QW [Radeon 7500LE Dual Display] | ||
| 662 | 148c 2025 RV200 QW [Radeon 7500 Evil Master Multi Display Edition] | ||
| 663 | 148c 2036 RV200 QW [Radeon 7500 PCI Dual Display] | ||
| 664 | 174b 7146 RV200 QW [Radeon 7500 LE] | ||
| 665 | 174b 7147 RV200 QW [Sapphire Radeon 7500LE] | ||
| 666 | 174b 7161 Radeon RV200 QW [Radeon 7500 LE] | ||
| 667 | 17af 0202 RV200 QW [Excalibur Radeon 7500LE] | ||
| 668 | 5158 Radeon RV200 QX [Radeon 7500] | ||
| 669 | 5159 Radeon RV100 QY [Radeon 7000/VE] | ||
| 670 | 1002 000a Radeon 7000/Radeon VE | ||
| 671 | 1002 000b Radeon 7000 | ||
| 672 | 1002 0038 Radeon 7000/Radeon VE | ||
| 673 | 1002 003a Radeon 7000/Radeon VE | ||
| 674 | 1002 00ba Radeon 7000/Radeon VE | ||
| 675 | 1002 013a Radeon 7000/Radeon VE | ||
| 676 | 1458 4002 RV100 QY [RADEON 7000 PRO MAYA AV Series] | ||
| 677 | 148c 2003 RV100 QY [Radeon 7000 Multi-Display Edition] | ||
| 678 | 148c 2023 RV100 QY [Radeon 7000 Evil Master Multi-Display] | ||
| 679 | 174b 7112 RV100 QY [Sapphire Radeon VE 7000] | ||
| 680 | 174b 7c28 Sapphire Radeon VE 7000 DDR | ||
| 681 | 1787 0202 RV100 QY [Excalibur Radeon 7000] | ||
| 682 | 515a Radeon RV100 QZ [Radeon 7000/VE] | ||
| 683 | 5168 Radeon R200 Qh | ||
| 684 | 5169 Radeon R200 Qi | ||
| 685 | 516a Radeon R200 Qj | ||
| 686 | 516b Radeon R200 Qk | ||
| 687 | # This one is not in ATI documentation, but is in XFree86 source code | ||
| 688 | 516c Radeon R200 Ql | ||
| 689 | 5245 Rage 128 RE/SG | ||
| 690 | 1002 0008 Xpert 128 | ||
| 691 | 1002 0028 Rage 128 AIW | ||
| 692 | 1002 0029 Rage 128 AIW | ||
| 693 | 1002 0068 Rage 128 AIW | ||
| 694 | 5246 Rage 128 RF/SG AGP | ||
| 695 | 1002 0004 Magnum/Xpert 128/Xpert 99 | ||
| 696 | 1002 0008 Magnum/Xpert128/X99/Xpert2000 | ||
| 697 | 1002 0028 Rage 128 AIW AGP | ||
| 698 | 1002 0044 Rage Fury/Xpert 128/Xpert 2000 | ||
| 699 | 1002 0068 Rage 128 AIW AGP | ||
| 700 | 1002 0448 Rage Fury | ||
| 701 | 5247 Rage 128 RG | ||
| 702 | 524b Rage 128 RK/VR | ||
| 703 | 524c Rage 128 RL/VR AGP | ||
| 704 | 1002 0008 Xpert 99/Xpert 2000 | ||
| 705 | 1002 0088 Xpert 99 | ||
| 706 | 5345 Rage 128 SE/4x | ||
| 707 | 5346 Rage 128 SF/4x AGP 2x | ||
| 708 | 1002 0048 RAGE 128 16MB VGA TVOUT AMC PAL | ||
| 709 | 5347 Rage 128 SG/4x AGP 4x | ||
| 710 | 5348 Rage 128 SH | ||
| 711 | 534b Rage 128 SK/4x | ||
| 712 | 534c Rage 128 SL/4x AGP 2x | ||
| 713 | 534d Rage 128 SM/4x AGP 4x | ||
| 714 | 1002 0008 Xpert 99/Xpert 2000 | ||
| 715 | 1002 0018 Xpert 2000 | ||
| 716 | 534e Rage 128 4x | ||
| 717 | 5354 Mach 64 VT | ||
| 718 | 1002 5654 Mach 64 reference | ||
| 719 | 5446 Rage 128 Pro Ultra TF | ||
| 720 | 1002 0004 Rage Fury Pro | ||
| 721 | 1002 0008 Rage Fury Pro/Xpert 2000 Pro | ||
| 722 | 1002 0018 Rage Fury Pro/Xpert 2000 Pro | ||
| 723 | 1002 0028 Rage 128 AIW Pro AGP | ||
| 724 | 1002 0029 Rage 128 AIW | ||
| 725 | 1002 002a Rage 128 AIW Pro AGP | ||
| 726 | 1002 002b Rage 128 AIW | ||
| 727 | 1002 0048 Xpert 2000 Pro | ||
| 728 | 544c Rage 128 Pro Ultra TL | ||
| 729 | 5452 Rage 128 Pro Ultra TR | ||
| 730 | 1002 001c Rage 128 Pro 4XL | ||
| 731 | 103c 1279 Rage 128 Pro 4XL | ||
| 732 | 5453 Rage 128 Pro Ultra TS | ||
| 733 | 5454 Rage 128 Pro Ultra TT | ||
| 734 | 5455 Rage 128 Pro Ultra TU | ||
| 735 | 5460 M22 [Radeon Mobility M300] | ||
| 736 | 5464 M22 [FireGL GL] | ||
| 737 | 5548 R423 UH [Radeon X800 (PCIE)] | ||
| 738 | 5549 R423 UI [Radeon X800PRO (PCIE)] | ||
| 739 | 554a R423 UJ [Radeon X800LE (PCIE)] | ||
| 740 | 554b R423 UK [Radeon X800SE (PCIE)] | ||
| 741 | 5551 R423 UQ [FireGL V7200 (PCIE)] | ||
| 742 | 5552 R423 UR [FireGL V5100 (PCIE)] | ||
| 743 | 5554 R423 UT [FireGL V7100 (PCIE)] | ||
| 744 | 556b Radeon R423 UK (PCIE) [X800 SE] (Secondary) | ||
| 745 | 5654 264VT [Mach64 VT] | ||
| 746 | 1002 5654 Mach64VT Reference | ||
| 747 | 5655 264VT3 [Mach64 VT3] | ||
| 748 | 5656 264VT4 [Mach64 VT4] | ||
| 749 | 5830 RS300 Host Bridge | ||
| 750 | 5831 RS300 Host Bridge | ||
| 751 | 5832 RS300 Host Bridge | ||
| 752 | 5833 Radeon 9100 IGP Host Bridge | ||
| 753 | 5834 Radeon 9100 IGP | ||
| 754 | 5835 RS300M AGP [Radeon Mobility 9100IGP] | ||
| 755 | 5838 Radeon 9100 IGP AGP Bridge | ||
| 756 | 5941 RV280 [Radeon 9200] (Secondary) | ||
| 757 | 1458 4019 Gigabyte Radeon 9200 | ||
| 758 | 174b 7c12 Sapphire Radeon 9200 | ||
| 759 | # http://www.hightech.com.hk/html/9200.htm | ||
| 760 | 17af 200d Excalibur Radeon 9200 | ||
| 761 | 18bc 0050 GeXcube GC-R9200-C3 (Secondary) | ||
| 762 | 5944 RV280 [Radeon 9200 SE (PCI)] | ||
| 763 | 5960 RV280 [Radeon 9200 PRO] | ||
| 764 | 5961 RV280 [Radeon 9200] | ||
| 765 | 1002 2f72 All-in-Wonder 9200 Series | ||
| 766 | 1019 4c30 Radeon 9200 VIVO | ||
| 767 | 12ab 5961 YUAN SMARTVGA Radeon 9200 | ||
| 768 | 1458 4018 Gigabyte Radeon 9200 | ||
| 769 | 174b 7c13 Sapphire Radeon 9200 | ||
| 770 | # http://www.hightech.com.hk/html/9200.htm | ||
| 771 | 17af 200c Excalibur Radeon 9200 | ||
| 772 | 18bc 0050 Radeon 9200 Game Buster | ||
| 773 | 18bc 0051 GeXcube GC-R9200-C3 | ||
| 774 | 18bc 0053 Radeon 9200 Game Buster VIVO | ||
| 775 | 5962 RV280 [Radeon 9200] | ||
| 776 | 5964 RV280 [Radeon 9200 SE] | ||
| 777 | 1043 c006 ASUS Radeon 9200 SE / TD / 128M | ||
| 778 | 1458 4018 Radeon 9200 SE | ||
| 779 | 148c 2073 CN-AG92E | ||
| 780 | 174b 7c13 Sapphire Radeon 9200 SE | ||
| 781 | 1787 5964 Excalibur 9200SE VIVO 128M | ||
| 782 | 17af 2012 Radeon 9200 SE Excalibur | ||
| 783 | 18bc 0170 Sapphire Radeon 9200 SE 128MB Game Buster | ||
| 784 | # 128MB DDR, DVI/VGA/TV out | ||
| 785 | 18bc 0173 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] | ||
| 786 | 5b60 RV370 5B60 [Radeon X300 (PCIE)] | ||
| 787 | 1043 002a Extreme AX300SE-X | ||
| 788 | 1043 032e Extreme AX300/TD | ||
| 789 | 5b62 RV370 5B62 [Radeon X600 (PCIE)] | ||
| 790 | 5b64 RV370 5B64 [FireGL V3100 (PCIE)] | ||
| 791 | 5b65 RV370 5B65 [FireGL D1100 (PCIE)] | ||
| 792 | 5c61 M9+ 5C61 [Radeon Mobility 9200 (AGP)] | ||
| 793 | 5c63 M9+ 5C63 [Radeon Mobility 9200 (AGP)] | ||
| 794 | 5d44 RV280 [Radeon 9200 SE] (Secondary) | ||
| 795 | 1458 4019 Radeon 9200 SE (Secondary) | ||
| 796 | 174b 7c12 Sapphire Radeon 9200 SE (Secondary) | ||
| 797 | 1787 5965 Excalibur 9200SE VIVO 128M (Secondary) | ||
| 798 | 17af 2013 Radeon 9200 SE Excalibur (Secondary) | ||
| 799 | 18bc 0171 Radeon 9200 SE 128MB Game Buster (Secondary) | ||
| 800 | 18bc 0172 GC-R9200L(SE)-C3H [Radeon 9200 Game Buster] | ||
| 801 | 5d4d R480 [Radeon X850XT Platinum] | ||
| 802 | 5d57 R423 5F57 [Radeon X800XT (PCIE)] | ||
| 803 | 700f PCI Bridge [IGP 320M] | ||
| 804 | 7010 PCI Bridge [IGP 340M] | ||
| 805 | 7834 Radeon 9100 PRO IGP | ||
| 806 | 7835 Radeon Mobility 9200 IGP | ||
| 807 | 7c37 RV350 AQ [Radeon 9600 SE] | ||
| 808 | cab0 AGP Bridge [IGP 320M] | ||
| 809 | cab2 RS200/RS200M AGP Bridge [IGP 340M] | ||
| 810 | cbb2 RS200/RS200M AGP Bridge [IGP 340M] | ||
| 811 | 1003 ULSI Systems | ||
| 812 | 0201 US201 | ||
| 813 | 1004 VLSI Technology Inc | ||
| 814 | 0005 82C592-FC1 | ||
| 815 | 0006 82C593-FC1 | ||
| 816 | 0007 82C594-AFC2 | ||
| 817 | 0008 82C596/7 [Wildcat] | ||
| 818 | 0009 82C597-AFC2 | ||
| 819 | 000c 82C541 [Lynx] | ||
| 820 | 000d 82C543 [Lynx] | ||
| 821 | 0101 82C532 | ||
| 822 | 0102 82C534 [Eagle] | ||
| 823 | 0103 82C538 | ||
| 824 | 0104 82C535 | ||
| 825 | 0105 82C147 | ||
| 826 | 0200 82C975 | ||
| 827 | 0280 82C925 | ||
| 828 | 0304 QSound ThunderBird PCI Audio | ||
| 829 | 1004 0304 QSound ThunderBird PCI Audio | ||
| 830 | 122d 1206 DSP368 Audio | ||
| 831 | 1483 5020 XWave Thunder 3D Audio | ||
| 832 | 0305 QSound ThunderBird PCI Audio Gameport | ||
| 833 | 1004 0305 QSound ThunderBird PCI Audio Gameport | ||
| 834 | 122d 1207 DSP368 Audio Gameport | ||
| 835 | 1483 5021 XWave Thunder 3D Audio Gameport | ||
| 836 | 0306 QSound ThunderBird PCI Audio Support Registers | ||
| 837 | 1004 0306 QSound ThunderBird PCI Audio Support Registers | ||
| 838 | 122d 1208 DSP368 Audio Support Registers | ||
| 839 | 1483 5022 XWave Thunder 3D Audio Support Registers | ||
| 840 | 0307 Thunderbird | ||
| 841 | 0308 Thunderbird | ||
| 842 | 0702 VAS96011 [Golden Gate II] | ||
| 843 | 0703 Tollgate | ||
| 844 | 1005 Avance Logic Inc. [ALI] | ||
| 845 | 2064 ALG2032/2064 | ||
| 846 | 2128 ALG2364A | ||
| 847 | 2301 ALG2301 | ||
| 848 | 2302 ALG2302 | ||
| 849 | 2364 ALG2364 | ||
| 850 | 2464 ALG2364A | ||
| 851 | 2501 ALG2564A/25128A | ||
| 852 | 1006 Reply Group | ||
| 853 | 1007 NetFrame Systems Inc | ||
| 854 | 1008 Epson | ||
| 855 | 100a Phoenix Technologies | ||
| 856 | 100b National Semiconductor Corporation | ||
| 857 | 0001 DP83810 | ||
| 858 | 0002 87415/87560 IDE | ||
| 859 | 000e 87560 Legacy I/O | ||
| 860 | 000f FireWire Controller | ||
| 861 | 0011 NS87560 National PCI System I/O | ||
| 862 | 0012 USB Controller | ||
| 863 | 0020 DP83815 (MacPhyter) Ethernet Controller | ||
| 864 | 103c 0024 Pavilion ze4400 builtin Network | ||
| 865 | 1385 f311 FA311 / FA312 (FA311 with WoL HW) | ||
| 866 | 0022 DP83820 10/100/1000 Ethernet Controller | ||
| 867 | 0028 Geode GX2 Host Bridge | ||
| 868 | 002a CS5535 South Bridge | ||
| 869 | 002b CS5535 ISA bridge | ||
| 870 | 002d CS5535 IDE | ||
| 871 | 002e CS5535 Audio | ||
| 872 | 002f CS5535 USB | ||
| 873 | 0030 Geode GX2 Graphics Processor | ||
| 874 | 0035 DP83065 [Saturn] 10/100/1000 Ethernet Controller | ||
| 875 | 0500 SCx200 Bridge | ||
| 876 | 0501 SCx200 SMI | ||
| 877 | 0502 SCx200 IDE | ||
| 878 | 0503 SCx200 Audio | ||
| 879 | 0504 SCx200 Video | ||
| 880 | 0505 SCx200 XBus | ||
| 881 | 0510 SC1100 Bridge | ||
| 882 | 0511 SC1100 SMI | ||
| 883 | 0515 SC1100 XBus | ||
| 884 | d001 87410 IDE | ||
| 885 | 100c Tseng Labs Inc | ||
| 886 | 3202 ET4000/W32p rev A | ||
| 887 | 3205 ET4000/W32p rev B | ||
| 888 | 3206 ET4000/W32p rev C | ||
| 889 | 3207 ET4000/W32p rev D | ||
| 890 | 3208 ET6000 | ||
| 891 | 4702 ET6300 | ||
| 892 | 100d AST Research Inc | ||
| 893 | 100e Weitek | ||
| 894 | 9000 P9000 Viper | ||
| 895 | 9001 P9000 Viper | ||
| 896 | 9002 P9000 Viper | ||
| 897 | 9100 P9100 Viper Pro/SE | ||
| 898 | 1010 Video Logic, Ltd. | ||
| 899 | 1011 Digital Equipment Corporation | ||
| 900 | 0001 DECchip 21050 | ||
| 901 | 0002 DECchip 21040 [Tulip] | ||
| 902 | 0004 DECchip 21030 [TGA] | ||
| 903 | 0007 NVRAM [Zephyr NVRAM] | ||
| 904 | 0008 KZPSA [KZPSA] | ||
| 905 | 0009 DECchip 21140 [FasterNet] | ||
| 906 | 1025 0310 21140 Fast Ethernet | ||
| 907 | 10b8 2001 SMC9332BDT EtherPower 10/100 | ||
| 908 | 10b8 2002 SMC9332BVT EtherPower T4 10/100 | ||
| 909 | 10b8 2003 SMC9334BDT EtherPower 10/100 (1-port) | ||
| 910 | 1109 2400 ANA-6944A/TX Fast Ethernet | ||
| 911 | 1112 2300 RNS2300 Fast Ethernet | ||
| 912 | 1112 2320 RNS2320 Fast Ethernet | ||
| 913 | 1112 2340 RNS2340 Fast Ethernet | ||
| 914 | 1113 1207 EN-1207-TX Fast Ethernet | ||
| 915 | 1186 1100 DFE-500TX Fast Ethernet | ||
| 916 | 1186 1112 DFE-570TX Fast Ethernet | ||
| 917 | 1186 1140 DFE-660 Cardbus Ethernet 10/100 | ||
| 918 | 1186 1142 DFE-660 Cardbus Ethernet 10/100 | ||
| 919 | 11f6 0503 Freedomline Fast Ethernet | ||
| 920 | 1282 9100 AEF-380TXD Fast Ethernet | ||
| 921 | 1385 1100 FA310TX Fast Ethernet | ||
| 922 | 2646 0001 KNE100TX Fast Ethernet | ||
| 923 | 000a 21230 Video Codec | ||
| 924 | 000d PBXGB [TGA2] | ||
| 925 | 000f DEFPA | ||
| 926 | 0014 DECchip 21041 [Tulip Pass 3] | ||
| 927 | 1186 0100 DE-530+ | ||
| 928 | 0016 DGLPB [OPPO] | ||
| 929 | 0017 PV-PCI Graphics Controller (ZLXp-L) | ||
| 930 | 0019 DECchip 21142/43 | ||
| 931 | 1011 500a DE500A Fast Ethernet | ||
| 932 | 1011 500b DE500B Fast Ethernet | ||
| 933 | 1014 0001 10/100 EtherJet Cardbus | ||
| 934 | 1025 0315 ALN315 Fast Ethernet | ||
| 935 | 1033 800c PC-9821-CS01 100BASE-TX Interface Card | ||
| 936 | 1033 800d PC-9821NR-B06 100BASE-TX Interface Card | ||
| 937 | 108d 0016 Rapidfire 2327 10/100 Ethernet | ||
| 938 | 108d 0017 GoCard 2250 Ethernet 10/100 Cardbus | ||
| 939 | 10b8 2005 SMC8032DT Extreme Ethernet 10/100 | ||
| 940 | 10b8 8034 SMC8034 Extreme Ethernet 10/100 | ||
| 941 | 10ef 8169 Cardbus Fast Ethernet | ||
| 942 | 1109 2a00 ANA-6911A/TX Fast Ethernet | ||
| 943 | 1109 2b00 ANA-6911A/TXC Fast Ethernet | ||
| 944 | 1109 3000 ANA-6922/TX Fast Ethernet | ||
| 945 | 1113 1207 Cheetah Fast Ethernet | ||
| 946 | 1113 2220 Cardbus Fast Ethernet | ||
| 947 | 115d 0002 Cardbus Ethernet 10/100 | ||
| 948 | 1179 0203 Fast Ethernet | ||
| 949 | 1179 0204 Cardbus Fast Ethernet | ||
| 950 | 1186 1100 DFE-500TX Fast Ethernet | ||
| 951 | 1186 1101 DFE-500TX Fast Ethernet | ||
| 952 | 1186 1102 DFE-500TX Fast Ethernet | ||
| 953 | 1186 1112 DFE-570TX Quad Fast Ethernet | ||
| 954 | 1259 2800 AT-2800Tx Fast Ethernet | ||
| 955 | 1266 0004 Eagle Fast EtherMAX | ||
| 956 | 12af 0019 NetFlyer Cardbus Fast Ethernet | ||
| 957 | 1374 0001 Cardbus Ethernet Card 10/100 | ||
| 958 | 1374 0002 Cardbus Ethernet Card 10/100 | ||
| 959 | 1374 0007 Cardbus Ethernet Card 10/100 | ||
| 960 | 1374 0008 Cardbus Ethernet Card 10/100 | ||
| 961 | 1385 2100 FA510 | ||
| 962 | 1395 0001 10/100 Ethernet CardBus PC Card | ||
| 963 | 13d1 ab01 EtherFast 10/100 Cardbus (PCMPC200) | ||
| 964 | 14cb 0100 LNDL-100N 100Base-TX Ethernet PC Card | ||
| 965 | 8086 0001 EtherExpress PRO/100 Mobile CardBus 32 | ||
| 966 | 001a Farallon PN9000SX Gigabit Ethernet | ||
| 967 | 0021 DECchip 21052 | ||
| 968 | 0022 DECchip 21150 | ||
| 969 | 0023 DECchip 21150 | ||
| 970 | 0024 DECchip 21152 | ||
| 971 | 0025 DECchip 21153 | ||
| 972 | 0026 DECchip 21154 | ||
| 973 | 0034 56k Modem Cardbus | ||
| 974 | 1374 0003 56k Modem Cardbus | ||
| 975 | 0045 DECchip 21553 | ||
| 976 | 0046 DECchip 21554 | ||
| 977 | 0e11 4050 Integrated Smart Array | ||
| 978 | 0e11 4051 Integrated Smart Array | ||
| 979 | 0e11 4058 Integrated Smart Array | ||
| 980 | 103c 10c2 Hewlett-Packard NetRAID-4M | ||
| 981 | 12d9 000a IP Telephony card | ||
| 982 | 4c53 1050 CT7 mainboard | ||
| 983 | 4c53 1051 CE7 mainboard | ||
| 984 | 9005 0364 5400S (Mustang) | ||
| 985 | 9005 0365 5400S (Mustang) | ||
| 986 | 9005 1364 Dell PowerEdge RAID Controller 2 | ||
| 987 | 9005 1365 Dell PowerEdge RAID Controller 2 | ||
| 988 | e4bf 1000 CC8-1-BLUES | ||
| 989 | 1065 StrongARM DC21285 | ||
| 990 | 1069 0020 DAC960P / DAC1164P | ||
| 991 | 1012 Micronics Computers Inc | ||
| 992 | 1013 Cirrus Logic | ||
| 993 | 0038 GD 7548 | ||
| 994 | 0040 GD 7555 Flat Panel GUI Accelerator | ||
| 995 | 004c GD 7556 Video/Graphics LCD/CRT Ctrlr | ||
| 996 | 00a0 GD 5430/40 [Alpine] | ||
| 997 | 00a2 GD 5432 [Alpine] | ||
| 998 | 00a4 GD 5434-4 [Alpine] | ||
| 999 | 00a8 GD 5434-8 [Alpine] | ||
| 1000 | 00ac GD 5436 [Alpine] | ||
| 1001 | 00b0 GD 5440 | ||
| 1002 | 00b8 GD 5446 | ||
| 1003 | 00bc GD 5480 | ||
| 1004 | 1013 00bc CL-GD5480 | ||
| 1005 | 00d0 GD 5462 | ||
| 1006 | 00d2 GD 5462 [Laguna I] | ||
| 1007 | 00d4 GD 5464 [Laguna] | ||
| 1008 | 00d5 GD 5464 BD [Laguna] | ||
| 1009 | 00d6 GD 5465 [Laguna] | ||
| 1010 | 13ce 8031 Barco Metheus 2 Megapixel, Dual Head | ||
| 1011 | 13cf 8031 Barco Metheus 2 Megapixel, Dual Head | ||
| 1012 | 00e8 GD 5436U | ||
| 1013 | 1100 CL 6729 | ||
| 1014 | 1110 PD 6832 PCMCIA/CardBus Ctrlr | ||
| 1015 | 1112 PD 6834 PCMCIA/CardBus Ctrlr | ||
| 1016 | 1113 PD 6833 PCMCIA/CardBus Ctrlr | ||
| 1017 | 1200 GD 7542 [Nordic] | ||
| 1018 | 1202 GD 7543 [Viking] | ||
| 1019 | 1204 GD 7541 [Nordic Light] | ||
| 1020 | 4000 MD 5620 [CLM Data Fax Voice] | ||
| 1021 | 4400 CD 4400 | ||
| 1022 | 6001 CS 4610/11 [CrystalClear SoundFusion Audio Accelerator] | ||
| 1023 | 1014 1010 CS4610 SoundFusion Audio Accelerator | ||
| 1024 | 6003 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] | ||
| 1025 | 1013 4280 Crystal SoundFusion PCI Audio Accelerator | ||
| 1026 | 153b 1136 SiXPack 5.1+ | ||
| 1027 | 1681 0050 Game Theater XP | ||
| 1028 | 1681 a011 Fortissimo III 7.1 | ||
| 1029 | 6004 CS 4614/22/24 [CrystalClear SoundFusion Audio Accelerator] | ||
| 1030 | 6005 Crystal CS4281 PCI Audio | ||
| 1031 | 1013 4281 Crystal CS4281 PCI Audio | ||
| 1032 | 10cf 10a8 Crystal CS4281 PCI Audio | ||
| 1033 | 10cf 10a9 Crystal CS4281 PCI Audio | ||
| 1034 | 10cf 10aa Crystal CS4281 PCI Audio | ||
| 1035 | 10cf 10ab Crystal CS4281 PCI Audio | ||
| 1036 | 10cf 10ac Crystal CS4281 PCI Audio | ||
| 1037 | 10cf 10ad Crystal CS4281 PCI Audio | ||
| 1038 | 10cf 10b4 Crystal CS4281 PCI Audio | ||
| 1039 | 1179 0001 Crystal CS4281 PCI Audio | ||
| 1040 | 14c0 000c Crystal CS4281 PCI Audio | ||
| 1041 | 1014 IBM | ||
| 1042 | 0002 PCI to MCA Bridge | ||
| 1043 | 0005 Alta Lite | ||
| 1044 | 0007 Alta MP | ||
| 1045 | 000a Fire Coral | ||
| 1046 | 0017 CPU to PCI Bridge | ||
| 1047 | 0018 TR Auto LANstreamer | ||
| 1048 | 001b GXT-150P | ||
| 1049 | 001c Carrera | ||
| 1050 | 001d 82G2675 | ||
| 1051 | 0020 GXT1000 Graphics Adapter | ||
| 1052 | 0022 IBM27-82351 | ||
| 1053 | 002d Python | ||
| 1054 | # [official name in AIX 5] | ||
| 1055 | 002e SCSI RAID Adapter [ServeRAID] | ||
| 1056 | 1014 002e ServeRAID-3x | ||
| 1057 | 1014 022e ServeRAID-4H | ||
| 1058 | 0031 2 Port Serial Adapter | ||
| 1059 | # AS400 iSeries PCI sync serial card | ||
| 1060 | 1014 0031 2721 WAN IOA - 2 Port Sync Serial Adapter | ||
| 1061 | 0036 Miami | ||
| 1062 | 0037 82660 CPU to PCI Bridge | ||
| 1063 | 003a CPU to PCI Bridge | ||
| 1064 | 003c GXT250P/GXT255P Graphics Adapter | ||
| 1065 | 003e 16/4 Token ring UTP/STP controller | ||
| 1066 | 1014 003e Token-Ring Adapter | ||
| 1067 | 1014 00cd Token-Ring Adapter + Wake-On-LAN | ||
| 1068 | 1014 00ce 16/4 Token-Ring Adapter 2 | ||
| 1069 | 1014 00cf 16/4 Token-Ring Adapter Special | ||
| 1070 | 1014 00e4 High-Speed 100/16/4 Token-Ring Adapter | ||
| 1071 | 1014 00e5 16/4 Token-Ring Adapter 2 + Wake-On-LAN | ||
| 1072 | 1014 016d iSeries 2744 Card | ||
| 1073 | 0045 SSA Adapter | ||
| 1074 | 0046 MPIC interrupt controller | ||
| 1075 | 0047 PCI to PCI Bridge | ||
| 1076 | 0048 PCI to PCI Bridge | ||
| 1077 | 0049 Warhead SCSI Controller | ||
| 1078 | 004e ATM Controller (14104e00) | ||
| 1079 | 004f ATM Controller (14104f00) | ||
| 1080 | 0050 ATM Controller (14105000) | ||
| 1081 | 0053 25 MBit ATM Controller | ||
| 1082 | 0054 GXT500P/GXT550P Graphics Adapter | ||
| 1083 | 0057 MPEG PCI Bridge | ||
| 1084 | 005c i82557B 10/100 | ||
| 1085 | 005e GXT800P Graphics Adapter | ||
| 1086 | 007c ATM Controller (14107c00) | ||
| 1087 | 007d 3780IDSP [MWave] | ||
| 1088 | 008b EADS PCI to PCI Bridge | ||
| 1089 | 008e GXT3000P Graphics Adapter | ||
| 1090 | 0090 GXT 3000P | ||
| 1091 | 1014 008e GXT-3000P | ||
| 1092 | 0091 SSA Adapter | ||
| 1093 | 0095 20H2999 PCI Docking Bridge | ||
| 1094 | 0096 Chukar chipset SCSI controller | ||
| 1095 | 1014 0097 iSeries 2778 DASD IOA | ||
| 1096 | 1014 0098 iSeries 2763 DASD IOA | ||
| 1097 | 1014 0099 iSeries 2748 DASD IOA | ||
| 1098 | 009f PCI 4758 Cryptographic Accelerator | ||
| 1099 | 00a5 ATM Controller (1410a500) | ||
| 1100 | 00a6 ATM 155MBPS MM Controller (1410a600) | ||
| 1101 | 00b7 256-bit Graphics Rasterizer [Fire GL1] | ||
| 1102 | 1092 00b8 FireGL1 AGP 32Mb | ||
| 1103 | 00b8 GXT2000P Graphics Adapter | ||
| 1104 | 00be ATM 622MBPS Controller (1410be00) | ||
| 1105 | 00dc Advanced Systems Management Adapter (ASMA) | ||
| 1106 | 00fc CPC710 Dual Bridge and Memory Controller (PCI-64) | ||
| 1107 | 0104 Gigabit Ethernet-SX Adapter | ||
| 1108 | 0105 CPC710 Dual Bridge and Memory Controller (PCI-32) | ||
| 1109 | 010f Remote Supervisor Adapter (RSA) | ||
| 1110 | 0142 Yotta Video Compositor Input | ||
| 1111 | 1014 0143 Yotta Input Controller (ytin) | ||
| 1112 | 0144 Yotta Video Compositor Output | ||
| 1113 | 1014 0145 Yotta Output Controller (ytout) | ||
| 1114 | 0156 405GP PLB to PCI Bridge | ||
| 1115 | 015e 622Mbps ATM PCI Adapter | ||
| 1116 | 0160 64bit/66MHz PCI ATM 155 MMF | ||
| 1117 | 016e GXT4000P Graphics Adapter | ||
| 1118 | 0170 GXT6000P Graphics Adapter | ||
| 1119 | 017d GXT300P Graphics Adapter | ||
| 1120 | 0180 Snipe chipset SCSI controller | ||
| 1121 | 1014 0241 iSeries 2757 DASD IOA | ||
| 1122 | 1014 0264 Quad Channel PCI-X U320 SCSI RAID Adapter (2780) | ||
| 1123 | 0188 EADS-X PCI-X to PCI-X Bridge | ||
| 1124 | 01a7 PCI-X to PCI-X Bridge | ||
| 1125 | 01bd ServeRAID Controller | ||
| 1126 | 1014 01be ServeRAID-4M | ||
| 1127 | 1014 01bf ServeRAID-4L | ||
| 1128 | 1014 0208 ServeRAID-4Mx | ||
| 1129 | 1014 020e ServeRAID-4Lx | ||
| 1130 | 1014 022e ServeRAID-4H | ||
| 1131 | 1014 0258 ServeRAID-5i | ||
| 1132 | 1014 0259 ServeRAID-5i | ||
| 1133 | 01c1 64bit/66MHz PCI ATM 155 UTP | ||
| 1134 | 01e6 Cryptographic Accelerator | ||
| 1135 | 01ff 10/100 Mbps Ethernet | ||
| 1136 | 0219 Multiport Serial Adapter | ||
| 1137 | 1014 021a Dual RVX | ||
| 1138 | 1014 0251 Internal Modem/RVX | ||
| 1139 | 1014 0252 Quad Internal Modem | ||
| 1140 | 021b GXT6500P Graphics Adapter | ||
| 1141 | 021c GXT4500P Graphics Adapter | ||
| 1142 | 0233 GXT135P Graphics Adapter | ||
| 1143 | 0266 PCI-X Dual Channel SCSI | ||
| 1144 | 0268 Gigabit Ethernet-SX Adapter (PCI-X) | ||
| 1145 | 0269 10/100/1000 Base-TX Ethernet Adapter (PCI-X) | ||
| 1146 | 028c Citrine chipset SCSI controller | ||
| 1147 | 1014 028D Dual Channel PCI-X DDR SAS RAID Adapter (572E) | ||
| 1148 | 1014 02BE Dual Channel PCI-X DDR U320 SCSI RAID Adapter (571B) | ||
| 1149 | 1014 02C0 Dual Channel PCI-X DDR U320 SCSI Adapter (571A) | ||
| 1150 | 0302 X-Architecture Bridge [Summit] | ||
| 1151 | 0314 ZISC 036 Neural accelerator card | ||
| 1152 | ffff MPIC-2 interrupt controller | ||
| 1153 | 1015 LSI Logic Corp of Canada | ||
| 1154 | 1016 ICL Personal Systems | ||
| 1155 | 1017 SPEA Software AG | ||
| 1156 | 5343 SPEA 3D Accelerator | ||
| 1157 | 1018 Unisys Systems | ||
| 1158 | 1019 Elitegroup Computer Systems | ||
| 1159 | 101a AT&T GIS (NCR) | ||
| 1160 | 0005 100VG ethernet | ||
| 1161 | 101b Vitesse Semiconductor | ||
| 1162 | 101c Western Digital | ||
| 1163 | 0193 33C193A | ||
| 1164 | 0196 33C196A | ||
| 1165 | 0197 33C197A | ||
| 1166 | 0296 33C296A | ||
| 1167 | 3193 7193 | ||
| 1168 | 3197 7197 | ||
| 1169 | 3296 33C296A | ||
| 1170 | 4296 34C296 | ||
| 1171 | 9710 Pipeline 9710 | ||
| 1172 | 9712 Pipeline 9712 | ||
| 1173 | c24a 90C | ||
| 1174 | 101e American Megatrends Inc. | ||
| 1175 | 1960 MegaRAID | ||
| 1176 | 101e 0471 MegaRAID 471 Enterprise 1600 RAID Controller | ||
| 1177 | 101e 0475 MegaRAID 475 Express 500/500LC RAID Controller | ||
| 1178 | 101e 0477 MegaRAID 477 Elite 3100 RAID Controller | ||
| 1179 | 101e 0493 MegaRAID 493 Elite 1600 RAID Controller | ||
| 1180 | 101e 0494 MegaRAID 494 Elite 1650 RAID Controller | ||
| 1181 | 101e 0503 MegaRAID 503 Enterprise 1650 RAID Controller | ||
| 1182 | 101e 0511 MegaRAID 511 i4 IDE RAID Controller | ||
| 1183 | 101e 0522 MegaRAID 522 i4133 RAID Controller | ||
| 1184 | 1028 0471 PowerEdge RAID Controller 3/QC | ||
| 1185 | 1028 0475 PowerEdge RAID Controller 3/SC | ||
| 1186 | 1028 0493 PowerEdge RAID Controller 3/DC | ||
| 1187 | 1028 0511 PowerEdge Cost Effective RAID Controller ATA100/4Ch | ||
| 1188 | 9010 MegaRAID 428 Ultra RAID Controller | ||
| 1189 | 9030 EIDE Controller | ||
| 1190 | 9031 EIDE Controller | ||
| 1191 | 9032 EIDE & SCSI Controller | ||
| 1192 | 9033 SCSI Controller | ||
| 1193 | 9040 Multimedia card | ||
| 1194 | 9060 MegaRAID 434 Ultra GT RAID Controller | ||
| 1195 | 9063 MegaRAC | ||
| 1196 | 101e 0767 Dell Remote Assistant Card 2 | ||
| 1197 | 101f PictureTel | ||
| 1198 | 1020 Hitachi Computer Products | ||
| 1199 | 1021 OKI Electric Industry Co. Ltd. | ||
| 1200 | 1022 Advanced Micro Devices [AMD] | ||
| 1201 | 1100 K8 [Athlon64/Opteron] HyperTransport Technology Configuration | ||
| 1202 | 1101 K8 [Athlon64/Opteron] Address Map | ||
| 1203 | 1102 K8 [Athlon64/Opteron] DRAM Controller | ||
| 1204 | 1103 K8 [Athlon64/Opteron] Miscellaneous Control | ||
| 1205 | 2000 79c970 [PCnet32 LANCE] | ||
| 1206 | 1014 2000 NetFinity 10/100 Fast Ethernet | ||
| 1207 | 1022 2000 PCnet - Fast 79C971 | ||
| 1208 | 103c 104c Ethernet with LAN remote power Adapter | ||
| 1209 | 103c 1064 Ethernet with LAN remote power Adapter | ||
| 1210 | 103c 1065 Ethernet with LAN remote power Adapter | ||
| 1211 | 103c 106c Ethernet with LAN remote power Adapter | ||
| 1212 | 103c 106e Ethernet with LAN remote power Adapter | ||
| 1213 | 103c 10ea Ethernet with LAN remote power Adapter | ||
| 1214 | 1113 1220 EN1220 10/100 Fast Ethernet | ||
| 1215 | 1259 2450 AT-2450 10/100 Fast Ethernet | ||
| 1216 | 1259 2454 AT-2450v4 10Mb Ethernet Adapter | ||
| 1217 | 1259 2700 AT-2700TX 10/100 Fast Ethernet | ||
| 1218 | 1259 2701 AT-2700FX 100Mb Ethernet | ||
| 1219 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 1220 | 4c53 1010 CP5/CR6 mainboard | ||
| 1221 | 4c53 1020 VR6 mainboard | ||
| 1222 | 4c53 1030 PC5 mainboard | ||
| 1223 | 4c53 1040 CL7 mainboard | ||
| 1224 | 4c53 1060 PC7 mainboard | ||
| 1225 | 2001 79c978 [HomePNA] | ||
| 1226 | 1092 0a78 Multimedia Home Network Adapter | ||
| 1227 | 1668 0299 ActionLink Home Network Adapter | ||
| 1228 | 2003 Am 1771 MBW [Alchemy] | ||
| 1229 | 2020 53c974 [PCscsi] | ||
| 1230 | 2040 79c974 | ||
| 1231 | 3000 ELanSC520 Microcontroller | ||
| 1232 | 7006 AMD-751 [Irongate] System Controller | ||
| 1233 | 7007 AMD-751 [Irongate] AGP Bridge | ||
| 1234 | 700a AMD-IGR4 AGP Host to PCI Bridge | ||
| 1235 | 700b AMD-IGR4 PCI to PCI Bridge | ||
| 1236 | 700c AMD-760 MP [IGD4-2P] System Controller | ||
| 1237 | 700d AMD-760 MP [IGD4-2P] AGP Bridge | ||
| 1238 | 700e AMD-760 [IGD4-1P] System Controller | ||
| 1239 | 700f AMD-760 [IGD4-1P] AGP Bridge | ||
| 1240 | 7400 AMD-755 [Cobra] ISA | ||
| 1241 | 7401 AMD-755 [Cobra] IDE | ||
| 1242 | 7403 AMD-755 [Cobra] ACPI | ||
| 1243 | 7404 AMD-755 [Cobra] USB | ||
| 1244 | 7408 AMD-756 [Viper] ISA | ||
| 1245 | 7409 AMD-756 [Viper] IDE | ||
| 1246 | 740b AMD-756 [Viper] ACPI | ||
| 1247 | 740c AMD-756 [Viper] USB | ||
| 1248 | 7410 AMD-766 [ViperPlus] ISA | ||
| 1249 | 7411 AMD-766 [ViperPlus] IDE | ||
| 1250 | 7413 AMD-766 [ViperPlus] ACPI | ||
| 1251 | 7414 AMD-766 [ViperPlus] USB | ||
| 1252 | 7440 AMD-768 [Opus] ISA | ||
| 1253 | 1043 8044 A7M-D Mainboard | ||
| 1254 | 7441 AMD-768 [Opus] IDE | ||
| 1255 | 7443 AMD-768 [Opus] ACPI | ||
| 1256 | 1043 8044 A7M-D Mainboard | ||
| 1257 | 7445 AMD-768 [Opus] Audio | ||
| 1258 | 7446 AMD-768 [Opus] MC97 Modem (Smart Link HAMR5600 compatible) | ||
| 1259 | 7448 AMD-768 [Opus] PCI | ||
| 1260 | 7449 AMD-768 [Opus] USB | ||
| 1261 | 7450 AMD-8131 PCI-X Bridge | ||
| 1262 | 7451 AMD-8131 PCI-X APIC | ||
| 1263 | 7454 AMD-8151 System Controller | ||
| 1264 | 7455 AMD-8151 AGP Bridge | ||
| 1265 | 7460 AMD-8111 PCI | ||
| 1266 | 161f 3017 HDAMB | ||
| 1267 | 7461 AMD-8111 USB | ||
| 1268 | 7462 AMD-8111 Ethernet | ||
| 1269 | 7464 AMD-8111 USB | ||
| 1270 | 161f 3017 HDAMB | ||
| 1271 | 7468 AMD-8111 LPC | ||
| 1272 | 161f 3017 HDAMB | ||
| 1273 | 7469 AMD-8111 IDE | ||
| 1274 | 161f 3017 HDAMB | ||
| 1275 | 746a AMD-8111 SMBus 2.0 | ||
| 1276 | 746b AMD-8111 ACPI | ||
| 1277 | 161f 3017 HDAMB | ||
| 1278 | 746d AMD-8111 AC97 Audio | ||
| 1279 | 161f 3017 HDAMB | ||
| 1280 | 746e AMD-8111 MC97 Modem | ||
| 1281 | 756b AMD-8111 ACPI | ||
| 1282 | 1023 Trident Microsystems | ||
| 1283 | 0194 82C194 | ||
| 1284 | 2000 4DWave DX | ||
| 1285 | 2001 4DWave NX | ||
| 1286 | 122d 1400 Trident PCI288-Q3DII (NX) | ||
| 1287 | 2100 CyberBlade XP4m32 | ||
| 1288 | 2200 XGI Volari XP5 | ||
| 1289 | 8400 CyberBlade/i7 | ||
| 1290 | 1023 8400 CyberBlade i7 AGP | ||
| 1291 | 8420 CyberBlade/i7d | ||
| 1292 | 0e11 b15a CyberBlade i7 AGP | ||
| 1293 | 8500 CyberBlade/i1 | ||
| 1294 | 8520 CyberBlade i1 | ||
| 1295 | 0e11 b16e CyberBlade i1 AGP | ||
| 1296 | 1023 8520 CyberBlade i1 AGP | ||
| 1297 | 8620 CyberBlade/i1 | ||
| 1298 | 1014 0502 ThinkPad R30/T30 | ||
| 1299 | 8820 CyberBlade XPAi1 | ||
| 1300 | 9320 TGUI 9320 | ||
| 1301 | 9350 GUI Accelerator | ||
| 1302 | 9360 Flat panel GUI Accelerator | ||
| 1303 | 9382 Cyber 9382 [Reference design] | ||
| 1304 | 9383 Cyber 9383 [Reference design] | ||
| 1305 | 9385 Cyber 9385 [Reference design] | ||
| 1306 | 9386 Cyber 9386 | ||
| 1307 | 9388 Cyber 9388 | ||
| 1308 | 9397 Cyber 9397 | ||
| 1309 | 939a Cyber 9397DVD | ||
| 1310 | 9420 TGUI 9420 | ||
| 1311 | 9430 TGUI 9430 | ||
| 1312 | 9440 TGUI 9440 | ||
| 1313 | 9460 TGUI 9460 | ||
| 1314 | 9470 TGUI 9470 | ||
| 1315 | 9520 Cyber 9520 | ||
| 1316 | 9525 Cyber 9525 | ||
| 1317 | 10cf 1094 Lifebook C6155 | ||
| 1318 | 9540 Cyber 9540 | ||
| 1319 | 9660 TGUI 9660/938x/968x | ||
| 1320 | 9680 TGUI 9680 | ||
| 1321 | 9682 TGUI 9682 | ||
| 1322 | 9683 TGUI 9683 | ||
| 1323 | 9685 ProVIDIA 9685 | ||
| 1324 | 9750 3DImage 9750 | ||
| 1325 | 1014 9750 3DImage 9750 | ||
| 1326 | 1023 9750 3DImage 9750 | ||
| 1327 | 9753 TGUI 9753 | ||
| 1328 | 9754 TGUI 9754 | ||
| 1329 | 9759 TGUI 975 | ||
| 1330 | 9783 TGUI 9783 | ||
| 1331 | 9785 TGUI 9785 | ||
| 1332 | 9850 3DImage 9850 | ||
| 1333 | 9880 Blade 3D PCI/AGP | ||
| 1334 | 1023 9880 Blade 3D | ||
| 1335 | 9910 CyberBlade/XP | ||
| 1336 | 9930 CyberBlade/XPm | ||
| 1337 | 1024 Zenith Data Systems | ||
| 1338 | 1025 Acer Incorporated [ALI] | ||
| 1339 | 1435 M1435 | ||
| 1340 | 1445 M1445 | ||
| 1341 | 1449 M1449 | ||
| 1342 | 1451 M1451 | ||
| 1343 | 1461 M1461 | ||
| 1344 | 1489 M1489 | ||
| 1345 | 1511 M1511 | ||
| 1346 | 1512 ALI M1512 Aladdin | ||
| 1347 | 1513 M1513 | ||
| 1348 | 1521 ALI M1521 Aladdin III CPU Bridge | ||
| 1349 | 10b9 1521 ALI M1521 Aladdin III CPU Bridge | ||
| 1350 | 1523 ALI M1523 ISA Bridge | ||
| 1351 | 10b9 1523 ALI M1523 ISA Bridge | ||
| 1352 | 1531 M1531 Northbridge [Aladdin IV/IV+] | ||
| 1353 | 1533 M1533 PCI-to-ISA Bridge | ||
| 1354 | 10b9 1533 ALI M1533 Aladdin IV/V ISA South Bridge | ||
| 1355 | 1535 M1535 PCI Bridge + Super I/O + FIR | ||
| 1356 | 1541 M1541 Northbridge [Aladdin V] | ||
| 1357 | 10b9 1541 ALI M1541 Aladdin V/V+ AGP+PCI North Bridge | ||
| 1358 | 1542 M1542 Northbridge [Aladdin V] | ||
| 1359 | 1543 M1543 PCI-to-ISA Bridge + Super I/O + FIR | ||
| 1360 | 1561 M1561 Northbridge [Aladdin 7] | ||
| 1361 | 1621 M1621 Northbridge [Aladdin-Pro II] | ||
| 1362 | 1631 M1631 Northbridge+3D Graphics [Aladdin TNT2] | ||
| 1363 | 1641 M1641 Northbridge [Aladdin-Pro IV] | ||
| 1364 | 1647 M1647 [MaGiK1] PCI North Bridge | ||
| 1365 | 1671 M1671 Northbridge [ALADDiN-P4] | ||
| 1366 | 1672 Northbridge [CyberALADDiN-P4] | ||
| 1367 | 3141 M3141 | ||
| 1368 | 3143 M3143 | ||
| 1369 | 3145 M3145 | ||
| 1370 | 3147 M3147 | ||
| 1371 | 3149 M3149 | ||
| 1372 | 3151 M3151 | ||
| 1373 | 3307 M3307 MPEG-I Video Controller | ||
| 1374 | 3309 M3309 MPEG-II Video w/ Software Audio Decoder | ||
| 1375 | 3321 M3321 MPEG-II Audio/Video Decoder | ||
| 1376 | 5212 M4803 | ||
| 1377 | 5215 ALI PCI EIDE Controller | ||
| 1378 | 5217 M5217H | ||
| 1379 | 5219 M5219 | ||
| 1380 | 5225 M5225 | ||
| 1381 | 5229 M5229 | ||
| 1382 | 5235 M5235 | ||
| 1383 | 5237 M5237 PCI USB Host Controller | ||
| 1384 | 5240 EIDE Controller | ||
| 1385 | 5241 PCMCIA Bridge | ||
| 1386 | 5242 General Purpose Controller | ||
| 1387 | 5243 PCI to PCI Bridge Controller | ||
| 1388 | 5244 Floppy Disk Controller | ||
| 1389 | 5247 M1541 PCI to PCI Bridge | ||
| 1390 | 5251 M5251 P1394 Controller | ||
| 1391 | 5427 PCI to AGP Bridge | ||
| 1392 | 5451 M5451 PCI AC-Link Controller Audio Device | ||
| 1393 | 5453 M5453 PCI AC-Link Controller Modem Device | ||
| 1394 | 7101 M7101 PCI PMU Power Management Controller | ||
| 1395 | 10b9 7101 M7101 PCI PMU Power Management Controller | ||
| 1396 | 1028 Dell | ||
| 1397 | 0001 PowerEdge Expandable RAID Controller 2/Si | ||
| 1398 | 1028 0001 PowerEdge 2400 | ||
| 1399 | 0002 PowerEdge Expandable RAID Controller 3/Di | ||
| 1400 | 1028 0002 PowerEdge 4400 | ||
| 1401 | 0003 PowerEdge Expandable RAID Controller 3/Si | ||
| 1402 | 1028 0003 PowerEdge 2450 | ||
| 1403 | 0006 PowerEdge Expandable RAID Controller 3/Di | ||
| 1404 | 0007 Remote Access Card III | ||
| 1405 | 0008 Remote Access Card III | ||
| 1406 | 0009 Remote Access Card III: BMC/SMIC device not present | ||
| 1407 | 000a PowerEdge Expandable RAID Controller 3/Di | ||
| 1408 | 000c Embedded Remote Access or ERA/O | ||
| 1409 | 000d Embedded Remote Access: BMC/SMIC device | ||
| 1410 | 000e PowerEdge Expandable RAID controller 4/Di | ||
| 1411 | 000f PowerEdge Expandable RAID controller 4/Di | ||
| 1412 | 0010 Remote Access Card 4 | ||
| 1413 | 0011 Remote Access Card 4 Daughter Card | ||
| 1414 | 0012 Remote Access Card 4 Daughter Card Virtual UART | ||
| 1415 | 0013 PowerEdge Expandable RAID controller 4 | ||
| 1416 | 1028 016c PowerEdge Expandable RAID Controller 4e/Si | ||
| 1417 | 1028 016d PowerEdge Expandable RAID Controller 4e/Di | ||
| 1418 | 1028 016e PowerEdge Expandable RAID Controller 4e/Di | ||
| 1419 | 1028 016f PowerEdge Expandable RAID Controller 4e/Di | ||
| 1420 | 1028 0170 PowerEdge Expandable RAID Controller 4e/Di | ||
| 1421 | 0014 Remote Access Card 4 Daughter Card SMIC interface | ||
| 1422 | 1029 Siemens Nixdorf IS | ||
| 1423 | 102a LSI Logic | ||
| 1424 | 0000 HYDRA | ||
| 1425 | 0010 ASPEN | ||
| 1426 | 001f AHA-2940U2/U2W /7890/7891 SCSI Controllers | ||
| 1427 | 9005 000f 2940U2W SCSI Controller | ||
| 1428 | 9005 0106 2940U2W SCSI Controller | ||
| 1429 | 9005 a180 2940U2W SCSI Controller | ||
| 1430 | 00c5 AIC-7899 U160/m SCSI Controller | ||
| 1431 | 1028 00c5 PowerEdge 2550/2650/4600 | ||
| 1432 | 00cf AIC-7899P U160/m | ||
| 1433 | 1028 0106 PowerEdge 4600 | ||
| 1434 | 1028 0121 PowerEdge 2650 | ||
| 1435 | 102b Matrox Graphics, Inc. | ||
| 1436 | # DJ: I've a suspicion that 0010 is a duplicate of 0d10. | ||
| 1437 | 0010 MGA-I [Impression?] | ||
| 1438 | 0100 MGA 1064SG [Mystique] | ||
| 1439 | 0518 MGA-II [Athena] | ||
| 1440 | 0519 MGA 2064W [Millennium] | ||
| 1441 | 051a MGA 1064SG [Mystique] | ||
| 1442 | 102b 0100 MGA-1064SG Mystique | ||
| 1443 | 102b 1100 MGA-1084SG Mystique | ||
| 1444 | 102b 1200 MGA-1084SG Mystique | ||
| 1445 | 1100 102b MGA-1084SG Mystique | ||
| 1446 | 110a 0018 Scenic Pro C5 (D1025) | ||
| 1447 | 051b MGA 2164W [Millennium II] | ||
| 1448 | 102b 051b MGA-2164W Millennium II | ||
| 1449 | 102b 1100 MGA-2164W Millennium II | ||
| 1450 | 102b 1200 MGA-2164W Millennium II | ||
| 1451 | 051e MGA 1064SG [Mystique] AGP | ||
| 1452 | 051f MGA 2164W [Millennium II] AGP | ||
| 1453 | 0520 MGA G200 | ||
| 1454 | 102b dbc2 G200 Multi-Monitor | ||
| 1455 | 102b dbc8 G200 Multi-Monitor | ||
| 1456 | 102b dbe2 G200 Multi-Monitor | ||
| 1457 | 102b dbe8 G200 Multi-Monitor | ||
| 1458 | 102b ff03 Millennium G200 SD | ||
| 1459 | 102b ff04 Marvel G200 | ||
| 1460 | 0521 MGA G200 AGP | ||
| 1461 | 1014 ff03 Millennium G200 AGP | ||
| 1462 | 102b 48e9 Mystique G200 AGP | ||
| 1463 | 102b 48f8 Millennium G200 SD AGP | ||
| 1464 | 102b 4a60 Millennium G200 LE AGP | ||
| 1465 | 102b 4a64 Millennium G200 AGP | ||
| 1466 | 102b c93c Millennium G200 AGP | ||
| 1467 | 102b c9b0 Millennium G200 AGP | ||
| 1468 | 102b c9bc Millennium G200 AGP | ||
| 1469 | 102b ca60 Millennium G250 LE AGP | ||
| 1470 | 102b ca6c Millennium G250 AGP | ||
| 1471 | 102b dbbc Millennium G200 AGP | ||
| 1472 | 102b dbc2 Millennium G200 MMS (Dual G200) | ||
| 1473 | 102b dbc3 G200 Multi-Monitor | ||
| 1474 | 102b dbc8 Millennium G200 MMS (Dual G200) | ||
| 1475 | 102b dbd2 G200 Multi-Monitor | ||
| 1476 | 102b dbd3 G200 Multi-Monitor | ||
| 1477 | 102b dbd4 G200 Multi-Monitor | ||
| 1478 | 102b dbd5 G200 Multi-Monitor | ||
| 1479 | 102b dbd8 G200 Multi-Monitor | ||
| 1480 | 102b dbd9 G200 Multi-Monitor | ||
| 1481 | 102b dbe2 Millennium G200 MMS (Quad G200) | ||
| 1482 | 102b dbe3 G200 Multi-Monitor | ||
| 1483 | 102b dbe8 Millennium G200 MMS (Quad G200) | ||
| 1484 | 102b dbf2 G200 Multi-Monitor | ||
| 1485 | 102b dbf3 G200 Multi-Monitor | ||
| 1486 | 102b dbf4 G200 Multi-Monitor | ||
| 1487 | 102b dbf5 G200 Multi-Monitor | ||
| 1488 | 102b dbf8 G200 Multi-Monitor | ||
| 1489 | 102b dbf9 G200 Multi-Monitor | ||
| 1490 | 102b f806 Mystique G200 Video AGP | ||
| 1491 | 102b ff00 MGA-G200 AGP | ||
| 1492 | 102b ff02 Mystique G200 AGP | ||
| 1493 | 102b ff03 Millennium G200 AGP | ||
| 1494 | 102b ff04 Marvel G200 AGP | ||
| 1495 | 110a 0032 MGA-G200 AGP | ||
| 1496 | 0525 MGA G400 AGP | ||
| 1497 | 0e11 b16f MGA-G400 AGP | ||
| 1498 | 102b 0328 Millennium G400 16Mb SDRAM | ||
| 1499 | 102b 0338 Millennium G400 16Mb SDRAM | ||
| 1500 | 102b 0378 Millennium G400 32Mb SDRAM | ||
| 1501 | 102b 0541 Millennium G450 Dual Head | ||
| 1502 | 102b 0542 Millennium G450 Dual Head LX | ||
| 1503 | 102b 0543 Millennium G450 Single Head LX | ||
| 1504 | 102b 0641 Millennium G450 32Mb SDRAM Dual Head | ||
| 1505 | 102b 0642 Millennium G450 32Mb SDRAM Dual Head LX | ||
| 1506 | 102b 0643 Millennium G450 32Mb SDRAM Single Head LX | ||
| 1507 | 102b 07c0 Millennium G450 Dual Head LE | ||
| 1508 | 102b 07c1 Millennium G450 SDR Dual Head LE | ||
| 1509 | 102b 0d41 Millennium G450 Dual Head PCI | ||
| 1510 | 102b 0d42 Millennium G450 Dual Head LX PCI | ||
| 1511 | 102b 0d43 Millennium G450 32Mb Dual Head PCI | ||
| 1512 | 102b 0e00 Marvel G450 eTV | ||
| 1513 | 102b 0e01 Marvel G450 eTV | ||
| 1514 | 102b 0e02 Marvel G450 eTV | ||
| 1515 | 102b 0e03 Marvel G450 eTV | ||
| 1516 | 102b 0f80 Millennium G450 Low Profile | ||
| 1517 | 102b 0f81 Millennium G450 Low Profile | ||
| 1518 | 102b 0f82 Millennium G450 Low Profile DVI | ||
| 1519 | 102b 0f83 Millennium G450 Low Profile DVI | ||
| 1520 | 102b 19d8 Millennium G400 16Mb SGRAM | ||
| 1521 | 102b 19f8 Millennium G400 32Mb SGRAM | ||
| 1522 | 102b 2159 Millennium G400 Dual Head 16Mb | ||
| 1523 | 102b 2179 Millennium G400 MAX/Dual Head 32Mb | ||
| 1524 | 102b 217d Millennium G400 Dual Head Max | ||
| 1525 | 102b 23c0 Millennium G450 | ||
| 1526 | 102b 23c1 Millennium G450 | ||
| 1527 | 102b 23c2 Millennium G450 DVI | ||
| 1528 | 102b 23c3 Millennium G450 DVI | ||
| 1529 | 102b 2f58 Millennium G400 | ||
| 1530 | 102b 2f78 Millennium G400 | ||
| 1531 | 102b 3693 Marvel G400 AGP | ||
| 1532 | 102b 5dd0 4Sight II | ||
| 1533 | 102b 5f50 4Sight II | ||
| 1534 | 102b 5f51 4Sight II | ||
| 1535 | 102b 5f52 4Sight II | ||
| 1536 | 102b 9010 Millennium G400 Dual Head | ||
| 1537 | 1458 0400 GA-G400 | ||
| 1538 | 1705 0001 Millennium G450 32MB SGRAM | ||
| 1539 | 1705 0002 Millennium G450 16MB SGRAM | ||
| 1540 | 1705 0003 Millennium G450 32MB | ||
| 1541 | 1705 0004 Millennium G450 16MB | ||
| 1542 | 0527 MGA Parhelia AGP | ||
| 1543 | 102b 0840 Parhelia 128Mb | ||
| 1544 | 0d10 MGA Ultima/Impression | ||
| 1545 | 1000 MGA G100 [Productiva] | ||
| 1546 | 102b ff01 Productiva G100 | ||
| 1547 | 102b ff05 Productiva G100 Multi-Monitor | ||
| 1548 | 1001 MGA G100 [Productiva] AGP | ||
| 1549 | 102b 1001 MGA-G100 AGP | ||
| 1550 | 102b ff00 MGA-G100 AGP | ||
| 1551 | 102b ff01 MGA-G100 Productiva AGP | ||
| 1552 | 102b ff03 Millennium G100 AGP | ||
| 1553 | 102b ff04 MGA-G100 AGP | ||
| 1554 | 102b ff05 MGA-G100 Productiva AGP Multi-Monitor | ||
| 1555 | 110a 001e MGA-G100 AGP | ||
| 1556 | 2007 MGA Mistral | ||
| 1557 | 2527 MGA G550 AGP | ||
| 1558 | 102b 0f83 Millennium G550 | ||
| 1559 | 102b 0f84 Millennium G550 Dual Head DDR 32Mb | ||
| 1560 | 102b 1e41 Millennium G550 | ||
| 1561 | 2537 MGA G650 AGP | ||
| 1562 | 4536 VIA Framegrabber | ||
| 1563 | 6573 Shark 10/100 Multiport SwitchNIC | ||
| 1564 | 102c Chips and Technologies | ||
| 1565 | 00b8 F64310 | ||
| 1566 | 00c0 F69000 HiQVideo | ||
| 1567 | 102c 00c0 F69000 HiQVideo | ||
| 1568 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 1569 | 4c53 1010 CP5/CR6 mainboard | ||
| 1570 | 4c53 1020 VR6 mainboard | ||
| 1571 | 4c53 1030 PC5 mainboard | ||
| 1572 | 4c53 1050 CT7 mainboard | ||
| 1573 | 4c53 1051 CE7 mainboard | ||
| 1574 | 00d0 F65545 | ||
| 1575 | 00d8 F65545 | ||
| 1576 | 00dc F65548 | ||
| 1577 | 00e0 F65550 | ||
| 1578 | 00e4 F65554 | ||
| 1579 | 00e5 F65555 HiQVPro | ||
| 1580 | 0e11 b049 Armada 1700 Laptop Display Controller | ||
| 1581 | 00f0 F68554 | ||
| 1582 | 00f4 F68554 HiQVision | ||
| 1583 | 00f5 F68555 | ||
| 1584 | 0c30 F69030 | ||
| 1585 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 1586 | 4c53 1050 CT7 mainboard | ||
| 1587 | 4c53 1051 CE7 mainboard | ||
| 1588 | # C5C project cancelled | ||
| 1589 | 4c53 1080 CT8 mainboard | ||
| 1590 | 102d Wyse Technology Inc. | ||
| 1591 | 50dc 3328 Audio | ||
| 1592 | 102e Olivetti Advanced Technology | ||
| 1593 | 102f Toshiba America | ||
| 1594 | 0009 r4x00 | ||
| 1595 | 000a TX3927 MIPS RISC PCI Controller | ||
| 1596 | 0020 ATM Meteor 155 | ||
| 1597 | 102f 00f8 ATM Meteor 155 | ||
| 1598 | 0030 TC35815CF PCI 10/100 Mbit Ethernet Controller | ||
| 1599 | 0031 TC35815CF PCI 10/100 Mbit Ethernet Controller with WOL | ||
| 1600 | 0105 TC86C001 [goku-s] IDE | ||
| 1601 | 0106 TC86C001 [goku-s] USB 1.1 Host | ||
| 1602 | 0107 TC86C001 [goku-s] USB Device Controller | ||
| 1603 | 0108 TC86C001 [goku-s] I2C/SIO/GPIO Controller | ||
| 1604 | 0180 TX4927/38 MIPS RISC PCI Controller | ||
| 1605 | 0181 TX4925 MIPS RISC PCI Controller | ||
| 1606 | 0182 TX4937 MIPS RISC PCI Controller | ||
| 1607 | 1030 TMC Research | ||
| 1608 | 1031 Miro Computer Products AG | ||
| 1609 | 5601 DC20 ASIC | ||
| 1610 | 5607 Video I/O & motion JPEG compressor | ||
| 1611 | 5631 Media 3D | ||
| 1612 | 6057 MiroVideo DC10/DC30+ | ||
| 1613 | 1032 Compaq | ||
| 1614 | 1033 NEC Corporation | ||
| 1615 | 0000 Vr4181A USB Host or Function Control Unit | ||
| 1616 | 0001 PCI to 486-like bus Bridge | ||
| 1617 | 0002 PCI to VL98 Bridge | ||
| 1618 | 0003 ATM Controller | ||
| 1619 | 0004 R4000 PCI Bridge | ||
| 1620 | 0005 PCI to 486-like bus Bridge | ||
| 1621 | 0006 PC-9800 Graphic Accelerator | ||
| 1622 | 0007 PCI to UX-Bus Bridge | ||
| 1623 | 0008 PC-9800 Graphic Accelerator | ||
| 1624 | 0009 PCI to PC9800 Core-Graph Bridge | ||
| 1625 | 0016 PCI to VL Bridge | ||
| 1626 | 001a [Nile II] | ||
| 1627 | 0021 Vrc4373 [Nile I] | ||
| 1628 | 0029 PowerVR PCX1 | ||
| 1629 | 002a PowerVR 3D | ||
| 1630 | 002c Star Alpha 2 | ||
| 1631 | 002d PCI to C-bus Bridge | ||
| 1632 | 0035 USB | ||
| 1633 | 1179 0001 USB | ||
| 1634 | 12ee 7000 Root Hub | ||
| 1635 | 1799 0001 Root Hub | ||
| 1636 | 807d 0035 PCI-USB2 (OHCI subsystem) | ||
| 1637 | 003b PCI to C-bus Bridge | ||
| 1638 | 003e NAPCCARD Cardbus Controller | ||
| 1639 | 0046 PowerVR PCX2 [midas] | ||
| 1640 | 005a Vrc5074 [Nile 4] | ||
| 1641 | 0063 Firewarden | ||
| 1642 | 0067 PowerVR Neon 250 Chipset | ||
| 1643 | 1010 0020 PowerVR Neon 250 AGP 32Mb | ||
| 1644 | 1010 0080 PowerVR Neon 250 AGP 16Mb | ||
| 1645 | 1010 0088 PowerVR Neon 250 16Mb | ||
| 1646 | 1010 0090 PowerVR Neon 250 AGP 16Mb | ||
| 1647 | 1010 0098 PowerVR Neon 250 16Mb | ||
| 1648 | 1010 00a0 PowerVR Neon 250 AGP 32Mb | ||
| 1649 | 1010 00a8 PowerVR Neon 250 32Mb | ||
| 1650 | 1010 0120 PowerVR Neon 250 AGP 32Mb | ||
| 1651 | 0072 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr | ||
| 1652 | 0074 56k Voice Modem | ||
| 1653 | 1033 8014 RCV56ACF 56k Voice Modem | ||
| 1654 | 009b Vrc5476 | ||
| 1655 | 00a5 VRC4173 | ||
| 1656 | 00a6 VRC5477 AC97 | ||
| 1657 | 00cd IEEE 1394 [OrangeLink] Host Controller | ||
| 1658 | 12ee 8011 Root hub | ||
| 1659 | 00ce IEEE 1394 Host Controller | ||
| 1660 | 00df Vr4131 | ||
| 1661 | 00e0 USB 2.0 | ||
| 1662 | 0ee4 3383 Sitecom IEEE 1394 / USB2.0 Combo Card | ||
| 1663 | 12ee 7001 Root hub | ||
| 1664 | 1799 0002 Root Hub | ||
| 1665 | 807d 1043 PCI-USB2 (EHCI subsystem) | ||
| 1666 | 00e7 IEEE 1394 Host Controller | ||
| 1667 | 00f2 uPD72874 IEEE1394 OHCI 1.1 3-port PHY-Link Ctrlr | ||
| 1668 | 00f3 uPD6113x Multimedia Decoder/Processor [EMMA2] | ||
| 1669 | 010c VR7701 | ||
| 1670 | 1034 Framatome Connectors USA Inc. | ||
| 1671 | 1035 Comp. & Comm. Research Lab | ||
| 1672 | 1036 Future Domain Corp. | ||
| 1673 | 0000 TMC-18C30 [36C70] | ||
| 1674 | 1037 Hitachi Micro Systems | ||
| 1675 | 1038 AMP, Inc | ||
| 1676 | 1039 Silicon Integrated Systems [SiS] | ||
| 1677 | 0001 Virtual PCI-to-PCI bridge (AGP) | ||
| 1678 | 0002 SG86C202 | ||
| 1679 | 0006 85C501/2/3 | ||
| 1680 | 0008 SiS85C503/5513 (LPC Bridge) | ||
| 1681 | 0009 ACPI | ||
| 1682 | # source: http://members.datafast.net.au/dft0802/downloads/pcidevs.txt | ||
| 1683 | 0016 SiS961/2 SMBus Controller | ||
| 1684 | 0018 SiS85C503/5513 (LPC Bridge) | ||
| 1685 | # Controller for 2 PATA and 2 SATA channels | ||
| 1686 | 0180 RAID bus controller 180 SATA/PATA [SiS] | ||
| 1687 | 0181 SiS SATA | ||
| 1688 | 0200 5597/5598/6326 VGA | ||
| 1689 | 1039 0000 SiS5597 SVGA (Shared RAM) | ||
| 1690 | 0204 82C204 | ||
| 1691 | 0205 SG86C205 | ||
| 1692 | 0300 300/305 PCI/AGP VGA Display Adapter | ||
| 1693 | 107d 2720 Leadtek WinFast VR300 | ||
| 1694 | 0310 315H PCI/AGP VGA Display Adapter | ||
| 1695 | 0315 315 PCI/AGP VGA Display Adapter | ||
| 1696 | 0325 315PRO PCI/AGP VGA Display Adapter | ||
| 1697 | 0330 330 [Xabre] PCI/AGP VGA Display Adapter | ||
| 1698 | 0406 85C501/2 | ||
| 1699 | 0496 85C496 | ||
| 1700 | 0530 530 Host | ||
| 1701 | 0540 540 Host | ||
| 1702 | 0550 550 Host | ||
| 1703 | 0597 5513C | ||
| 1704 | 0601 85C601 | ||
| 1705 | 0620 620 Host | ||
| 1706 | 0630 630 Host | ||
| 1707 | 0633 633 Host | ||
| 1708 | 0635 635 Host | ||
| 1709 | 0645 SiS645 Host & Memory & AGP Controller | ||
| 1710 | 0646 SiS645DX Host & Memory & AGP Controller | ||
| 1711 | 0648 SiS 645xx | ||
| 1712 | 0650 650/M650 Host | ||
| 1713 | 0651 651 Host | ||
| 1714 | 0655 655 Host | ||
| 1715 | 0660 660 Host | ||
| 1716 | 0661 661FX/M661FX/M661MX Host | ||
| 1717 | 0730 730 Host | ||
| 1718 | 0733 733 Host | ||
| 1719 | 0735 735 Host | ||
| 1720 | 0740 740 Host | ||
| 1721 | 0741 741/741GX/M741 Host | ||
| 1722 | 0745 745 Host | ||
| 1723 | 0746 746 Host | ||
| 1724 | 0755 755 Host | ||
| 1725 | 0760 760/M760 Host | ||
| 1726 | 0900 SiS900 PCI Fast Ethernet | ||
| 1727 | 1019 0a14 K7S5A motherboard | ||
| 1728 | 1039 0900 SiS900 10/100 Ethernet Adapter | ||
| 1729 | 1043 8035 CUSI-FX motherboard | ||
| 1730 | 0961 SiS961 [MuTIOL Media IO] | ||
| 1731 | 0962 SiS962 [MuTIOL Media IO] | ||
| 1732 | 0963 SiS963 [MuTIOL Media IO] | ||
| 1733 | 0964 SiS964 [MuTIOL Media IO] | ||
| 1734 | 0965 SiS965 [MuTIOL Media IO] | ||
| 1735 | 3602 83C602 | ||
| 1736 | 5107 5107 | ||
| 1737 | 5300 SiS540 PCI Display Adapter | ||
| 1738 | 5315 550 PCI/AGP VGA Display Adapter | ||
| 1739 | 5401 486 PCI Chipset | ||
| 1740 | 5511 5511/5512 | ||
| 1741 | 5513 5513 [IDE] | ||
| 1742 | 1019 0970 P6STP-FL motherboard | ||
| 1743 | 1039 5513 SiS5513 EIDE Controller (A,B step) | ||
| 1744 | 1043 8035 CUSI-FX motherboard | ||
| 1745 | 5517 5517 | ||
| 1746 | 5571 5571 | ||
| 1747 | 5581 5581 Pentium Chipset | ||
| 1748 | 5582 5582 | ||
| 1749 | 5591 5591/5592 Host | ||
| 1750 | 5596 5596 Pentium Chipset | ||
| 1751 | 5597 5597 [SiS5582] | ||
| 1752 | 5600 5600 Host | ||
| 1753 | 6204 Video decoder & MPEG interface | ||
| 1754 | 6205 VGA Controller | ||
| 1755 | 6236 6236 3D-AGP | ||
| 1756 | 6300 630/730 PCI/AGP VGA Display Adapter | ||
| 1757 | 1019 0970 P6STP-FL motherboard | ||
| 1758 | 1043 8035 CUSI-FX motherboard | ||
| 1759 | 6306 530/620 PCI/AGP VGA Display Adapter | ||
| 1760 | 1039 6306 SiS530,620 GUI Accelerator+3D | ||
| 1761 | 6325 65x/M650/740 PCI/AGP VGA Display Adapter | ||
| 1762 | 6326 86C326 5598/6326 | ||
| 1763 | 1039 6326 SiS6326 GUI Accelerator | ||
| 1764 | 1092 0a50 SpeedStar A50 | ||
| 1765 | 1092 0a70 SpeedStar A70 | ||
| 1766 | 1092 4910 SpeedStar A70 | ||
| 1767 | 1092 4920 SpeedStar A70 | ||
| 1768 | 1569 6326 SiS6326 GUI Accelerator | ||
| 1769 | 6330 661/741/760 PCI/AGP VGA Display Adapter | ||
| 1770 | 1039 6330 [M]661xX/[M]741[GX]/[M]760 PCI/AGP VGA Adapter | ||
| 1771 | 7001 USB 1.0 Controller | ||
| 1772 | 1019 0a14 K7S5A motherboard | ||
| 1773 | 1039 7000 Onboard USB Controller | ||
| 1774 | 7002 USB 2.0 Controller | ||
| 1775 | 1509 7002 Onboard USB Controller | ||
| 1776 | 7007 FireWire Controller | ||
| 1777 | 7012 Sound Controller | ||
| 1778 | # There are may be different modem codecs here (Intel537 compatible and incompatible) | ||
| 1779 | 7013 AC'97 Modem Controller | ||
| 1780 | 7016 SiS7016 PCI Fast Ethernet Adapter | ||
| 1781 | 1039 7016 SiS7016 10/100 Ethernet Adapter | ||
| 1782 | 7018 SiS PCI Audio Accelerator | ||
| 1783 | 1014 01b6 SiS PCI Audio Accelerator | ||
| 1784 | 1014 01b7 SiS PCI Audio Accelerator | ||
| 1785 | 1019 7018 SiS PCI Audio Accelerator | ||
| 1786 | 1025 000e SiS PCI Audio Accelerator | ||
| 1787 | 1025 0018 SiS PCI Audio Accelerator | ||
| 1788 | 1039 7018 SiS PCI Audio Accelerator | ||
| 1789 | 1043 800b SiS PCI Audio Accelerator | ||
| 1790 | 1054 7018 SiS PCI Audio Accelerator | ||
| 1791 | 107d 5330 SiS PCI Audio Accelerator | ||
| 1792 | 107d 5350 SiS PCI Audio Accelerator | ||
| 1793 | 1170 3209 SiS PCI Audio Accelerator | ||
| 1794 | 1462 400a SiS PCI Audio Accelerator | ||
| 1795 | 14a4 2089 SiS PCI Audio Accelerator | ||
| 1796 | 14cd 2194 SiS PCI Audio Accelerator | ||
| 1797 | 14ff 1100 SiS PCI Audio Accelerator | ||
| 1798 | 152d 8808 SiS PCI Audio Accelerator | ||
| 1799 | 1558 1103 SiS PCI Audio Accelerator | ||
| 1800 | 1558 2200 SiS PCI Audio Accelerator | ||
| 1801 | 1563 7018 SiS PCI Audio Accelerator | ||
| 1802 | 15c5 0111 SiS PCI Audio Accelerator | ||
| 1803 | 270f a171 SiS PCI Audio Accelerator | ||
| 1804 | a0a0 0022 SiS PCI Audio Accelerator | ||
| 1805 | 7019 SiS7019 Audio Accelerator | ||
| 1806 | 103a Seiko Epson Corporation | ||
| 1807 | 103b Tatung Co. of America | ||
| 1808 | 103c Hewlett-Packard Company | ||
| 1809 | 1005 A4977A Visualize EG | ||
| 1810 | 1006 Visualize FX6 | ||
| 1811 | 1008 Visualize FX4 | ||
| 1812 | 100a Visualize FX2 | ||
| 1813 | 1028 Tach TL Fibre Channel Host Adapter | ||
| 1814 | 1029 Tach XL2 Fibre Channel Host Adapter | ||
| 1815 | 107e 000f Interphase 5560 Fibre Channel Adapter | ||
| 1816 | 9004 9210 1Gb/2Gb Family Fibre Channel Controller | ||
| 1817 | 9004 9211 1Gb/2Gb Family Fibre Channel Controller | ||
| 1818 | 102a Tach TS Fibre Channel Host Adapter | ||
| 1819 | 107e 000e Interphase 5540/5541 Fibre Channel Adapter | ||
| 1820 | 9004 9110 1Gb/2Gb Family Fibre Channel Controller | ||
| 1821 | 9004 9111 1Gb/2Gb Family Fibre Channel Controller | ||
| 1822 | 1030 J2585A DeskDirect 10/100VG NIC | ||
| 1823 | 1031 J2585B HP 10/100VG PCI LAN Adapter | ||
| 1824 | 103c 1040 J2973A DeskDirect 10BaseT NIC | ||
| 1825 | 103c 1041 J2585B DeskDirect 10/100VG NIC | ||
| 1826 | 103c 1042 J2970A DeskDirect 10BaseT/2 NIC | ||
| 1827 | 1040 J2973A DeskDirect 10BaseT NIC | ||
| 1828 | 1041 J2585B DeskDirect 10/100 NIC | ||
| 1829 | 1042 J2970A DeskDirect 10BaseT/2 NIC | ||
| 1830 | 1048 Diva Serial [GSP] Multiport UART | ||
| 1831 | 103c 1049 Tosca Console | ||
| 1832 | 103c 104a Tosca Secondary | ||
| 1833 | 103c 104b Maestro SP2 | ||
| 1834 | 103c 1223 Superdome Console | ||
| 1835 | 103c 1226 Keystone SP2 | ||
| 1836 | 103c 1227 Powerbar SP2 | ||
| 1837 | 103c 1282 Everest SP2 | ||
| 1838 | 103c 1301 Diva RMP3 | ||
| 1839 | 1054 PCI Local Bus Adapter | ||
| 1840 | 1064 79C970 PCnet Ethernet Controller | ||
| 1841 | 108b Visualize FXe | ||
| 1842 | 10c1 NetServer Smart IRQ Router | ||
| 1843 | 10ed TopTools Remote Control | ||
| 1844 | 10f0 rio System Bus Adapter | ||
| 1845 | 10f1 rio I/O Controller | ||
| 1846 | 1200 82557B 10/100 NIC | ||
| 1847 | 1219 NetServer PCI Hot-Plug Controller | ||
| 1848 | 121a NetServer SMIC Controller | ||
| 1849 | 121b NetServer Legacy COM Port Decoder | ||
| 1850 | 121c NetServer PCI COM Port Decoder | ||
| 1851 | 1229 zx1 System Bus Adapter | ||
| 1852 | 122a zx1 I/O Controller | ||
| 1853 | 122e zx1 Local Bus Adapter | ||
| 1854 | 127c sx1000 I/O Controller | ||
| 1855 | 1290 Auxiliary Diva Serial Port | ||
| 1856 | 12b4 zx1 QuickSilver AGP8x Local Bus Adapter | ||
| 1857 | 2910 E2910A PCIBus Exerciser | ||
| 1858 | 2925 E2925A 32 Bit, 33 MHzPCI Exerciser & Analyzer | ||
| 1859 | 103e Solliday Engineering | ||
| 1860 | 103f Synopsys/Logic Modeling Group | ||
| 1861 | 1040 Accelgraphics Inc. | ||
| 1862 | 1041 Computrend | ||
| 1863 | 1042 Micron | ||
| 1864 | 1000 PC Tech RZ1000 | ||
| 1865 | 1001 PC Tech RZ1001 | ||
| 1866 | 3000 Samurai_0 | ||
| 1867 | 3010 Samurai_1 | ||
| 1868 | 3020 Samurai_IDE | ||
| 1869 | 1043 ASUSTeK Computer Inc. | ||
| 1870 | 0675 ISDNLink P-IN100-ST-D | ||
| 1871 | 4015 v7100 SDRAM [GeForce2 MX] | ||
| 1872 | 4021 v7100 Combo Deluxe [GeForce2 MX + TV tuner] | ||
| 1873 | 4057 v8200 GeForce 3 | ||
| 1874 | 8043 v8240 PAL 128M [P4T] Motherboard | ||
| 1875 | 807b v9280/TD [Geforce4 TI4200 8X With TV-Out and DVI] | ||
| 1876 | 80bb v9180 Magic/T [GeForce4 MX440 AGP 8x 64MB TV-out] | ||
| 1877 | 80c5 nForce3 chipset motherboard [SK8N] | ||
| 1878 | 80df v9520 Magic/T | ||
| 1879 | 1044 Adaptec (formerly DPT) | ||
| 1880 | 1012 Domino RAID Engine | ||
| 1881 | a400 SmartCache/Raid I-IV Controller | ||
| 1882 | a500 PCI Bridge | ||
| 1883 | a501 SmartRAID V Controller | ||
| 1884 | 1044 c001 PM1554U2 Ultra2 Single Channel | ||
| 1885 | 1044 c002 PM1654U2 Ultra2 Single Channel | ||
| 1886 | 1044 c003 PM1564U3 Ultra3 Single Channel | ||
| 1887 | 1044 c004 PM1564U3 Ultra3 Dual Channel | ||
| 1888 | 1044 c005 PM1554U2 Ultra2 Single Channel (NON ACPI) | ||
| 1889 | 1044 c00a PM2554U2 Ultra2 Single Channel | ||
| 1890 | 1044 c00b PM2654U2 Ultra2 Single Channel | ||
| 1891 | 1044 c00c PM2664U3 Ultra3 Single Channel | ||
| 1892 | 1044 c00d PM2664U3 Ultra3 Dual Channel | ||
| 1893 | 1044 c00e PM2554U2 Ultra2 Single Channel (NON ACPI) | ||
| 1894 | 1044 c00f PM2654U2 Ultra2 Single Channel (NON ACPI) | ||
| 1895 | 1044 c014 PM3754U2 Ultra2 Single Channel (NON ACPI) | ||
| 1896 | 1044 c015 PM3755U2B Ultra2 Single Channel (NON ACPI) | ||
| 1897 | 1044 c016 PM3755F Fibre Channel (NON ACPI) | ||
| 1898 | 1044 c01e PM3757U2 Ultra2 Single Channel | ||
| 1899 | 1044 c01f PM3757U2 Ultra2 Dual Channel | ||
| 1900 | 1044 c020 PM3767U3 Ultra3 Dual Channel | ||
| 1901 | 1044 c021 PM3767U3 Ultra3 Quad Channel | ||
| 1902 | 1044 c028 PM2865U3 Ultra3 Single Channel | ||
| 1903 | 1044 c029 PM2865U3 Ultra3 Dual Channel | ||
| 1904 | 1044 c02a PM2865F Fibre Channel | ||
| 1905 | 1044 c03c 2000S Ultra3 Single Channel | ||
| 1906 | 1044 c03d 2000S Ultra3 Dual Channel | ||
| 1907 | 1044 c03e 2000F Fibre Channel | ||
| 1908 | 1044 c046 3000S Ultra3 Single Channel | ||
| 1909 | 1044 c047 3000S Ultra3 Dual Channel | ||
| 1910 | 1044 c048 3000F Fibre Channel | ||
| 1911 | 1044 c050 5000S Ultra3 Single Channel | ||
| 1912 | 1044 c051 5000S Ultra3 Dual Channel | ||
| 1913 | 1044 c052 5000F Fibre Channel | ||
| 1914 | 1044 c05a 2400A UDMA Four Channel | ||
| 1915 | 1044 c05b 2400A UDMA Four Channel DAC | ||
| 1916 | 1044 c064 3010S Ultra3 Dual Channel | ||
| 1917 | 1044 c065 3410S Ultra160 Four Channel | ||
| 1918 | 1044 c066 3010S Fibre Channel | ||
| 1919 | a511 SmartRAID V Controller | ||
| 1920 | 1044 c032 ASR-2005S I2O Zero Channel | ||
| 1921 | 1045 OPTi Inc. | ||
| 1922 | a0f8 82C750 [Vendetta] USB Controller | ||
| 1923 | c101 92C264 | ||
| 1924 | c178 92C178 | ||
| 1925 | c556 82X556 [Viper] | ||
| 1926 | c557 82C557 [Viper-M] | ||
| 1927 | c558 82C558 [Viper-M ISA+IDE] | ||
| 1928 | c567 82C750 [Vendetta], device 0 | ||
| 1929 | c568 82C750 [Vendetta], device 1 | ||
| 1930 | c569 82C579 [Viper XPress+ Chipset] | ||
| 1931 | c621 82C621 [Viper-M/N+] | ||
| 1932 | c700 82C700 [FireStar] | ||
| 1933 | c701 82C701 [FireStar Plus] | ||
| 1934 | c814 82C814 [Firebridge 1] | ||
| 1935 | c822 82C822 | ||
| 1936 | c824 82C824 | ||
| 1937 | c825 82C825 [Firebridge 2] | ||
| 1938 | c832 82C832 | ||
| 1939 | c861 82C861 | ||
| 1940 | c895 82C895 | ||
| 1941 | c935 EV1935 ECTIVA MachOne PCIAudio | ||
| 1942 | d568 82C825 [Firebridge 2] | ||
| 1943 | d721 IDE [FireStar] | ||
| 1944 | 1046 IPC Corporation, Ltd. | ||
| 1945 | 1047 Genoa Systems Corp | ||
| 1946 | 1048 Elsa AG | ||
| 1947 | 0c60 Gladiac MX | ||
| 1948 | 0d22 Quadro4 900XGL [ELSA GLoria4 900XGL] | ||
| 1949 | 1000 QuickStep 1000 | ||
| 1950 | 3000 QuickStep 3000 | ||
| 1951 | 8901 Gloria XL | ||
| 1952 | 1049 Fountain Technologies, Inc. | ||
| 1953 | # # nee SGS Thomson Microelectronics | ||
| 1954 | 104a STMicroelectronics | ||
| 1955 | 0008 STG 2000X | ||
| 1956 | 0009 STG 1764X | ||
| 1957 | 0010 STG4000 [3D Prophet Kyro Series] | ||
| 1958 | 0209 STPC Consumer/Industrial North- and Southbridge | ||
| 1959 | 020a STPC Atlas/ConsumerS/Consumer IIA Northbridge | ||
| 1960 | # From <http://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-stable/src/share/misc/pci_vendors> | ||
| 1961 | 0210 STPC Atlas ISA Bridge | ||
| 1962 | 021a STPC Consumer S Southbridge | ||
| 1963 | 021b STPC Consumer IIA Southbridge | ||
| 1964 | 0500 ST70137 [Unicorn] ADSL DMT Transceiver | ||
| 1965 | 0564 STPC Client Northbridge | ||
| 1966 | 0981 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 1967 | 1746 STG 1764X | ||
| 1968 | 2774 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 1969 | 3520 MPEG-II decoder card | ||
| 1970 | 55cc STPC Client Southbridge | ||
| 1971 | 104b BusLogic | ||
| 1972 | 0140 BT-946C (old) [multimaster 01] | ||
| 1973 | 1040 BT-946C (BA80C30) [MultiMaster 10] | ||
| 1974 | 8130 Flashpoint LT | ||
| 1975 | 104c Texas Instruments | ||
| 1976 | 0500 100 MBit LAN Controller | ||
| 1977 | 0508 TMS380C2X Compressor Interface | ||
| 1978 | 1000 Eagle i/f AS | ||
| 1979 | 104c PCI1510 PC card Cardbus Controller | ||
| 1980 | 3d04 TVP4010 [Permedia] | ||
| 1981 | 3d07 TVP4020 [Permedia 2] | ||
| 1982 | 1011 4d10 Comet | ||
| 1983 | 1040 000f AccelStar II | ||
| 1984 | 1040 0011 AccelStar II | ||
| 1985 | 1048 0a31 WINNER 2000 | ||
| 1986 | 1048 0a32 GLoria Synergy | ||
| 1987 | 1048 0a35 GLoria Synergy | ||
| 1988 | 107d 2633 WinFast 3D L2300 | ||
| 1989 | 1092 0127 FIRE GL 1000 PRO | ||
| 1990 | 1092 0136 FIRE GL 1000 PRO | ||
| 1991 | 1092 0141 FIRE GL 1000 PRO | ||
| 1992 | 1092 0146 FIRE GL 1000 PRO | ||
| 1993 | 1092 0148 FIRE GL 1000 PRO | ||
| 1994 | 1092 0149 FIRE GL 1000 PRO | ||
| 1995 | 1092 0152 FIRE GL 1000 PRO | ||
| 1996 | 1092 0154 FIRE GL 1000 PRO | ||
| 1997 | 1092 0155 FIRE GL 1000 PRO | ||
| 1998 | 1092 0156 FIRE GL 1000 PRO | ||
| 1999 | 1092 0157 FIRE GL 1000 PRO | ||
| 2000 | 1097 3d01 Jeronimo Pro | ||
| 2001 | 1102 100f Graphics Blaster Extreme | ||
| 2002 | 3d3d 0100 Reference Permedia 2 3D | ||
| 2003 | 8000 PCILynx/PCILynx2 IEEE 1394 Link Layer Controller | ||
| 2004 | e4bf 1010 CF1-1-SNARE | ||
| 2005 | e4bf 1020 CF1-2-SNARE | ||
| 2006 | 8009 FireWire Controller | ||
| 2007 | 104d 8032 8032 OHCI i.LINK (IEEE 1394) Controller | ||
| 2008 | 8017 PCI4410 FireWire Controller | ||
| 2009 | 8019 TSB12LV23 IEEE-1394 Controller | ||
| 2010 | 11bd 000a Studio DV500-1394 | ||
| 2011 | 11bd 000e Studio DV | ||
| 2012 | e4bf 1010 CF2-1-CYMBAL | ||
| 2013 | 8020 TSB12LV26 IEEE-1394 Controller (Link) | ||
| 2014 | 11bd 000f Studio DV500-1394 | ||
| 2015 | 8021 TSB43AA22 IEEE-1394 Controller (PHY/Link Integrated) | ||
| 2016 | 104d 80df Vaio PCG-FX403 | ||
| 2017 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 2018 | 8022 TSB43AB22 IEEE-1394a-2000 Controller (PHY/Link) | ||
| 2019 | 8023 TSB43AB22/A IEEE-1394a-2000 Controller (PHY/Link) | ||
| 2020 | 103c 088c nc8000 laptop | ||
| 2021 | 8024 TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link) | ||
| 2022 | 8025 TSB82AA2 IEEE-1394b Link Layer Controller | ||
| 2023 | 55aa 55aa FireWire 800 PCI Card | ||
| 2024 | 8026 TSB43AB21 IEEE-1394a-2000 Controller (PHY/Link) | ||
| 2025 | 8027 PCI4451 IEEE-1394 Controller | ||
| 2026 | 1028 00e6 PCI4451 IEEE-1394 Controller (Dell Inspiron 8100) | ||
| 2027 | 8029 PCI4510 IEEE-1394 Controller | ||
| 2028 | 1028 0163 Latitude D505 | ||
| 2029 | 1071 8160 MIM2900 | ||
| 2030 | 802b PCI7410,7510,7610 OHCI-Lynx Controller | ||
| 2031 | 1028 014e PCI7410,7510,7610 OHCI-Lynx Controller (Dell Latitude D800) | ||
| 2032 | 802e PCI7x20 1394a-2000 OHCI Two-Port PHY/Link-Layer Controller | ||
| 2033 | 8031 Texas Instruments PCIxx21/x515 Cardbus Controller | ||
| 2034 | 8032 Texas Instruments OHCI Compliant IEEE 1394 Host Controller | ||
| 2035 | 8033 Texas Instruments PCIxx21 Integrated FlashMedia Controller | ||
| 2036 | 8034 Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller | ||
| 2037 | 8035 Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Smart Card Controller (SMC) | ||
| 2038 | 8201 PCI1620 Firmware Loading Function | ||
| 2039 | 8204 PCI7410,7510,7610 PCI Firmware Loading Function | ||
| 2040 | 1028 014e Latitude D800 | ||
| 2041 | 8400 ACX 100 22Mbps Wireless Interface | ||
| 2042 | 00fc 16ec U.S. Robotics 22 Mbps Wireless PC Card (model 2210) | ||
| 2043 | 00fd 16ec U.S. Robotics 22Mbps Wireless PCI Adapter (model 2216) | ||
| 2044 | 1186 3b00 DWL-650+ PC Card cardbus 22Mbs Wireless Adapter [AirPlus] | ||
| 2045 | 1186 3b01 DWL-520+ 22Mbps PCI Wireless Adapter | ||
| 2046 | 8401 ACX 100 22Mbps Wireless Interface | ||
| 2047 | # OK, this info is almost useless as is, but at least it's known that it's a wireless card. More info requested from reporter (whi | ||
| 2048 | 9000 Wireless Interface (of unknown type) | ||
| 2049 | 9066 ACX 111 54Mbps Wireless Interface | ||
| 2050 | a001 TDC1570 | ||
| 2051 | a100 TDC1561 | ||
| 2052 | a102 TNETA1575 HyperSAR Plus w/PCI Host i/f & UTOPIA i/f | ||
| 2053 | a106 TMS320C6205 Fixed Point DSP | ||
| 2054 | 175c 5000 ASI50xx Audio Adapter | ||
| 2055 | 175c 8700 ASI87xx Radio Tuner card | ||
| 2056 | ac10 PCI1050 | ||
| 2057 | ac11 PCI1053 | ||
| 2058 | ac12 PCI1130 | ||
| 2059 | ac13 PCI1031 | ||
| 2060 | ac15 PCI1131 | ||
| 2061 | ac16 PCI1250 | ||
| 2062 | 1014 0092 ThinkPad 600 | ||
| 2063 | ac17 PCI1220 | ||
| 2064 | ac18 PCI1260 | ||
| 2065 | ac19 PCI1221 | ||
| 2066 | ac1a PCI1210 | ||
| 2067 | ac1b PCI1450 | ||
| 2068 | 0e11 b113 Armada M700 | ||
| 2069 | ac1c PCI1225 | ||
| 2070 | 0e11 b121 Armada E500 | ||
| 2071 | 1028 0088 Dell Computer Corporation Latitude CPi A400XT | ||
| 2072 | ac1d PCI1251A | ||
| 2073 | ac1e PCI1211 | ||
| 2074 | ac1f PCI1251B | ||
| 2075 | ac20 TI 2030 | ||
| 2076 | ac21 PCI2031 | ||
| 2077 | ac22 PCI2032 PCI Docking Bridge | ||
| 2078 | ac23 PCI2250 PCI-to-PCI Bridge | ||
| 2079 | ac28 PCI2050 PCI-to-PCI Bridge | ||
| 2080 | ac30 PCI1260 PC card Cardbus Controller | ||
| 2081 | ac40 PCI4450 PC card Cardbus Controller | ||
| 2082 | ac41 PCI4410 PC card Cardbus Controller | ||
| 2083 | ac42 PCI4451 PC card Cardbus Controller | ||
| 2084 | 1028 00e6 PCI4451 PC card CardBus Controller (Dell Inspiron 8100) | ||
| 2085 | ac44 PCI4510 PC card Cardbus Controller | ||
| 2086 | 1028 0163 Latitude D505 | ||
| 2087 | 1071 8160 MIM2000 | ||
| 2088 | ac46 PCI4520 PC card Cardbus Controller | ||
| 2089 | ac47 PCI7510 PC card Cardbus Controller | ||
| 2090 | 1028 014e Latitude D800 | ||
| 2091 | ac4a PCI7510,7610 PC card Cardbus Controller | ||
| 2092 | 1028 014e Latitude D800 | ||
| 2093 | ac50 PCI1410 PC card Cardbus Controller | ||
| 2094 | ac51 PCI1420 | ||
| 2095 | 1014 023b ThinkPad T23 (2647-4MG) | ||
| 2096 | 1028 00b1 Latitude C600 | ||
| 2097 | 1028 012a Latitude C640 | ||
| 2098 | 1033 80cd Versa Note VXi | ||
| 2099 | 10cf 1095 Lifebook C6155 | ||
| 2100 | e4bf 1000 CP2-2-HIPHOP | ||
| 2101 | ac52 PCI1451 PC card Cardbus Controller | ||
| 2102 | ac53 PCI1421 PC card Cardbus Controller | ||
| 2103 | ac54 PCI1620 PC Card Controller | ||
| 2104 | ac55 PCI1520 PC card Cardbus Controller | ||
| 2105 | 1014 0512 ThinkPad T30/T40 | ||
| 2106 | ac56 PCI1510 PC card Cardbus Controller | ||
| 2107 | 1014 0528 ThinkPad R40e (2684-HVG) Cardbus Controller | ||
| 2108 | ac60 PCI2040 PCI to DSP Bridge Controller | ||
| 2109 | 175c 5100 ASI51xx Audio Adapter | ||
| 2110 | 175c 6100 ASI61xx Audio Adapter | ||
| 2111 | 175c 6200 ASI62xx Audio Adapter | ||
| 2112 | ac8d PCI 7620 | ||
| 2113 | ac8e PCI7420 CardBus Controller | ||
| 2114 | ac8f PCI7420/PCI7620 Dual Socket CardBus and Smart Card Cont. w/ 1394a-2000 OHCI Two-Port PHY/Link-Layer Cont. and SD/MS-Pro Sockets | ||
| 2115 | fe00 FireWire Host Controller | ||
| 2116 | fe03 12C01A FireWire Host Controller | ||
| 2117 | 104d Sony Corporation | ||
| 2118 | 8004 DTL-H2500 [Playstation development board] | ||
| 2119 | 8009 CXD1947Q i.LINK Controller | ||
| 2120 | 8039 CXD3222 i.LINK Controller | ||
| 2121 | 8056 Rockwell HCF 56K modem | ||
| 2122 | 808a Memory Stick Controller | ||
| 2123 | 104e Oak Technology, Inc | ||
| 2124 | 0017 OTI-64017 | ||
| 2125 | 0107 OTI-107 [Spitfire] | ||
| 2126 | 0109 Video Adapter | ||
| 2127 | 0111 OTI-64111 [Spitfire] | ||
| 2128 | 0217 OTI-64217 | ||
| 2129 | 0317 OTI-64317 | ||
| 2130 | 104f Co-time Computer Ltd | ||
| 2131 | 1050 Winbond Electronics Corp | ||
| 2132 | 0000 NE2000 | ||
| 2133 | 0001 W83769F | ||
| 2134 | 0105 W82C105 | ||
| 2135 | 0840 W89C840 | ||
| 2136 | 1050 0001 W89C840 Ethernet Adapter | ||
| 2137 | 1050 0840 W89C840 Ethernet Adapter | ||
| 2138 | 0940 W89C940 | ||
| 2139 | 5a5a W89C940F | ||
| 2140 | 6692 W6692 | ||
| 2141 | 9921 W99200F MPEG-1 Video Encoder | ||
| 2142 | 9922 W99200F/W9922PF MPEG-1/2 Video Encoder | ||
| 2143 | 9970 W9970CF | ||
| 2144 | 1051 Anigma, Inc. | ||
| 2145 | 1052 ?Young Micro Systems | ||
| 2146 | 1053 Young Micro Systems | ||
| 2147 | 1054 Hitachi, Ltd | ||
| 2148 | 1055 Efar Microsystems | ||
| 2149 | 9130 SLC90E66 [Victory66] IDE | ||
| 2150 | 9460 SLC90E66 [Victory66] ISA | ||
| 2151 | 9462 SLC90E66 [Victory66] USB | ||
| 2152 | 9463 SLC90E66 [Victory66] ACPI | ||
| 2153 | 1056 ICL | ||
| 2154 | # Motorola made a mistake and used 1507 instead of 1057 in some chips. Please look at the 1507 entry as well when updating this. | ||
| 2155 | 1057 Motorola | ||
| 2156 | 0001 MPC105 [Eagle] | ||
| 2157 | 0002 MPC106 [Grackle] | ||
| 2158 | 0003 MPC8240 [Kahlua] | ||
| 2159 | 0004 MPC107 | ||
| 2160 | 0006 MPC8245 [Unity] | ||
| 2161 | 0008 MPC8540 | ||
| 2162 | 0009 MPC8560 | ||
| 2163 | 0100 MC145575 [HFC-PCI] | ||
| 2164 | 0431 KTI829c 100VG | ||
| 2165 | 1801 DSP56301 Digital Signal Processor | ||
| 2166 | 14fb 0101 Transas Radar Imitator Board [RIM] | ||
| 2167 | 14fb 0102 Transas Radar Imitator Board [RIM-2] | ||
| 2168 | 14fb 0202 Transas Radar Integrator Board [RIB-2] | ||
| 2169 | 14fb 0611 1 channel CAN bus Controller [CanPci-1] | ||
| 2170 | 14fb 0612 2 channels CAN bus Controller [CanPci-2] | ||
| 2171 | 14fb 0613 3 channels CAN bus Controller [CanPci-3] | ||
| 2172 | 14fb 0614 4 channels CAN bus Controller [CanPci-4] | ||
| 2173 | 14fb 0621 1 channel CAN bus Controller [CanPci2-1] | ||
| 2174 | 14fb 0622 2 channels CAN bus Controller [CanPci2-2] | ||
| 2175 | 14fb 0810 Transas VTS Radar Integrator Board [RIB-4] | ||
| 2176 | 175c 4200 ASI4215 Audio Adapter | ||
| 2177 | 175c 4300 ASI43xx Audio Adapter | ||
| 2178 | 175c 4400 ASI4401 Audio Adapter | ||
| 2179 | ecc0 0010 Darla | ||
| 2180 | ecc0 0020 Gina | ||
| 2181 | ecc0 0030 Layla rev.0 | ||
| 2182 | ecc0 0031 Layla rev.1 | ||
| 2183 | ecc0 0040 Darla24 rev.0 | ||
| 2184 | ecc0 0041 Darla24 rev.1 | ||
| 2185 | ecc0 0050 Gina24 rev.0 | ||
| 2186 | ecc0 0051 Gina24 rev.1 | ||
| 2187 | ecc0 0070 Mona rev.0 | ||
| 2188 | ecc0 0071 Mona rev.1 | ||
| 2189 | ecc0 0072 Mona rev.2 | ||
| 2190 | 18c0 MPC8265A/MPC8266 | ||
| 2191 | 18c1 MPC8271/MPC8272 | ||
| 2192 | 3410 DSP56361 Digital Signal Processor | ||
| 2193 | ecc0 0050 Gina24 rev.0 | ||
| 2194 | ecc0 0051 Gina24 rev.1 | ||
| 2195 | ecc0 0060 Layla24 | ||
| 2196 | ecc0 0070 Mona rev.0 | ||
| 2197 | ecc0 0071 Mona rev.1 | ||
| 2198 | ecc0 0072 Mona rev.2 | ||
| 2199 | ecc0 0080 Mia rev.0 | ||
| 2200 | ecc0 0081 Mia rev.1 | ||
| 2201 | ecc0 0090 Indigo | ||
| 2202 | ecc0 00a0 Indigo IO | ||
| 2203 | ecc0 00b0 Indigo DJ | ||
| 2204 | ecc0 0100 3G | ||
| 2205 | 4801 Raven | ||
| 2206 | 4802 Falcon | ||
| 2207 | 4803 Hawk | ||
| 2208 | 4806 CPX8216 | ||
| 2209 | 4d68 20268 | ||
| 2210 | 5600 SM56 PCI Modem | ||
| 2211 | 1057 0300 SM56 PCI Speakerphone Modem | ||
| 2212 | 1057 0301 SM56 PCI Voice Modem | ||
| 2213 | 1057 0302 SM56 PCI Fax Modem | ||
| 2214 | 1057 5600 SM56 PCI Voice modem | ||
| 2215 | 13d2 0300 SM56 PCI Speakerphone Modem | ||
| 2216 | 13d2 0301 SM56 PCI Voice modem | ||
| 2217 | 13d2 0302 SM56 PCI Fax Modem | ||
| 2218 | 1436 0300 SM56 PCI Speakerphone Modem | ||
| 2219 | 1436 0301 SM56 PCI Voice modem | ||
| 2220 | 1436 0302 SM56 PCI Fax Modem | ||
| 2221 | 144f 100c SM56 PCI Fax Modem | ||
| 2222 | 1494 0300 SM56 PCI Speakerphone Modem | ||
| 2223 | 1494 0301 SM56 PCI Voice modem | ||
| 2224 | 14c8 0300 SM56 PCI Speakerphone Modem | ||
| 2225 | 14c8 0302 SM56 PCI Fax Modem | ||
| 2226 | 1668 0300 SM56 PCI Speakerphone Modem | ||
| 2227 | 1668 0302 SM56 PCI Fax Modem | ||
| 2228 | 5803 MPC5200 | ||
| 2229 | 6400 MPC190 Security Processor (S1 family, encryption) | ||
| 2230 | 6405 MPC184 Security Processor (S1 family) | ||
| 2231 | 1058 Electronics & Telecommunications RSH | ||
| 2232 | 1059 Teknor Industrial Computers Inc | ||
| 2233 | 105a Promise Technology, Inc. | ||
| 2234 | # more correct description from promise linux sources | ||
| 2235 | 0d30 PDC20265 (FastTrak100 Lite/Ultra100) | ||
| 2236 | 105a 4d33 Ultra100 | ||
| 2237 | 0d38 20263 | ||
| 2238 | 105a 4d39 Fasttrak66 | ||
| 2239 | 1275 20275 | ||
| 2240 | 3318 PDC20318 (SATA150 TX4) | ||
| 2241 | 3319 PDC20319 (FastTrak S150 TX4) | ||
| 2242 | 8086 3427 S875WP1-E mainboard | ||
| 2243 | 3371 PDC20371 (FastTrak S150 TX2plus) | ||
| 2244 | 3373 PDC20378 (FastTrak 378/SATA 378) | ||
| 2245 | 1043 80f5 K8V Deluxe/PC-DL Deluxe motherboard | ||
| 2246 | 1462 702e K8T NEO FIS2R motherboard | ||
| 2247 | 3375 PDC20375 (SATA150 TX2plus) | ||
| 2248 | 3376 PDC20376 (FastTrak 376) | ||
| 2249 | 1043 809e A7V8X motherboard | ||
| 2250 | 3574 PDC20579 SATAII 150 IDE Controller | ||
| 2251 | 3d18 PDC20518/PDC40518 (SATAII 150 TX4) | ||
| 2252 | 3d75 PDC20575 (SATAII150 TX2plus) | ||
| 2253 | 4d30 PDC20267 (FastTrak100/Ultra100) | ||
| 2254 | 105a 4d33 Ultra100 | ||
| 2255 | 105a 4d39 FastTrak100 | ||
| 2256 | 4d33 20246 | ||
| 2257 | 105a 4d33 20246 IDE Controller | ||
| 2258 | 4d38 PDC20262 (FastTrak66/Ultra66) | ||
| 2259 | 105a 4d30 Ultra Device on SuperTrak | ||
| 2260 | 105a 4d33 Ultra66 | ||
| 2261 | 105a 4d39 FastTrak66 | ||
| 2262 | 4d68 PDC20268 (Ultra100 TX2) | ||
| 2263 | 105a 4d68 Ultra100TX2 | ||
| 2264 | 4d69 20269 | ||
| 2265 | 105a 4d68 Ultra133TX2 | ||
| 2266 | 5275 PDC20276 (MBFastTrak133 Lite) | ||
| 2267 | 105a 0275 SuperTrak SX6000 IDE | ||
| 2268 | 105a 1275 MBFastTrak133 Lite (tm) Controller (RAID mode) | ||
| 2269 | 1458 b001 MBUltra 133 | ||
| 2270 | 5300 DC5300 | ||
| 2271 | 6268 PDC20270 (FastTrak100 LP/TX2/TX4) | ||
| 2272 | 105a 4d68 FastTrak100 TX2 | ||
| 2273 | 6269 PDC20271 (FastTrak TX2000) | ||
| 2274 | 105a 6269 FastTrak TX2/TX2000 | ||
| 2275 | 6621 PDC20621 (FastTrak S150 SX4/FastTrak SX4000 lite) | ||
| 2276 | 6622 PDC20621 [SATA150 SX4] 4 Channel IDE RAID Controller | ||
| 2277 | 6626 PDC20618 (Ultra 618) | ||
| 2278 | 6629 PDC20619 (FastTrak TX4000) | ||
| 2279 | 7275 PDC20277 (SBFastTrak133 Lite) | ||
| 2280 | 105b Foxconn International, Inc. | ||
| 2281 | 105c Wipro Infotech Limited | ||
| 2282 | 105d Number 9 Computer Company | ||
| 2283 | 2309 Imagine 128 | ||
| 2284 | 2339 Imagine 128-II | ||
| 2285 | 105d 0000 Imagine 128 series 2 4Mb VRAM | ||
| 2286 | 105d 0001 Imagine 128 series 2 4Mb VRAM | ||
| 2287 | 105d 0002 Imagine 128 series 2 4Mb VRAM | ||
| 2288 | 105d 0003 Imagine 128 series 2 4Mb VRAM | ||
| 2289 | 105d 0004 Imagine 128 series 2 4Mb VRAM | ||
| 2290 | 105d 0005 Imagine 128 series 2 4Mb VRAM | ||
| 2291 | 105d 0006 Imagine 128 series 2 4Mb VRAM | ||
| 2292 | 105d 0007 Imagine 128 series 2 4Mb VRAM | ||
| 2293 | 105d 0008 Imagine 128 series 2e 4Mb DRAM | ||
| 2294 | 105d 0009 Imagine 128 series 2e 4Mb DRAM | ||
| 2295 | 105d 000a Imagine 128 series 2 8Mb VRAM | ||
| 2296 | 105d 000b Imagine 128 series 2 8Mb H-VRAM | ||
| 2297 | 11a4 000a Barco Metheus 5 Megapixel | ||
| 2298 | 13cc 0000 Barco Metheus 5 Megapixel | ||
| 2299 | 13cc 0004 Barco Metheus 5 Megapixel | ||
| 2300 | 13cc 0005 Barco Metheus 5 Megapixel | ||
| 2301 | 13cc 0006 Barco Metheus 5 Megapixel | ||
| 2302 | 13cc 0008 Barco Metheus 5 Megapixel | ||
| 2303 | 13cc 0009 Barco Metheus 5 Megapixel | ||
| 2304 | 13cc 000a Barco Metheus 5 Megapixel | ||
| 2305 | 13cc 000c Barco Metheus 5 Megapixel | ||
| 2306 | 493d Imagine 128 T2R [Ticket to Ride] | ||
| 2307 | 11a4 000a Barco Metheus 5 Megapixel, Dual Head | ||
| 2308 | 11a4 000b Barco Metheus 5 Megapixel, Dual Head | ||
| 2309 | 13cc 0002 Barco Metheus 4 Megapixel, Dual Head | ||
| 2310 | 13cc 0003 Barco Metheus 5 Megapixel, Dual Head | ||
| 2311 | 13cc 0007 Barco Metheus 5 Megapixel, Dual Head | ||
| 2312 | 13cc 0008 Barco Metheus 5 Megapixel, Dual Head | ||
| 2313 | 13cc 0009 Barco Metheus 5 Megapixel, Dual Head | ||
| 2314 | 13cc 000a Barco Metheus 5 Megapixel, Dual Head | ||
| 2315 | 5348 Revolution 4 | ||
| 2316 | 105d 0037 Revolution IV-FP AGP (For SGI 1600SW) | ||
| 2317 | 105e Vtech Computers Ltd | ||
| 2318 | 105f Infotronic America Inc | ||
| 2319 | 1060 United Microelectronics [UMC] | ||
| 2320 | 0001 UM82C881 | ||
| 2321 | 0002 UM82C886 | ||
| 2322 | 0101 UM8673F | ||
| 2323 | 0881 UM8881 | ||
| 2324 | 0886 UM8886F | ||
| 2325 | 0891 UM8891A | ||
| 2326 | 1001 UM886A | ||
| 2327 | 673a UM8886BF | ||
| 2328 | 673b EIDE Master/DMA | ||
| 2329 | 8710 UM8710 | ||
| 2330 | 886a UM8886A | ||
| 2331 | 8881 UM8881F | ||
| 2332 | 8886 UM8886F | ||
| 2333 | 888a UM8886A | ||
| 2334 | 8891 UM8891A | ||
| 2335 | 9017 UM9017F | ||
| 2336 | 9018 UM9018 | ||
| 2337 | 9026 UM9026 | ||
| 2338 | e881 UM8881N | ||
| 2339 | e886 UM8886N | ||
| 2340 | e88a UM8886N | ||
| 2341 | e891 UM8891N | ||
| 2342 | 1061 I.I.T. | ||
| 2343 | 0001 AGX016 | ||
| 2344 | 0002 IIT3204/3501 | ||
| 2345 | 1062 Maspar Computer Corp | ||
| 2346 | 1063 Ocean Office Automation | ||
| 2347 | 1064 Alcatel | ||
| 2348 | 1065 Texas Microsystems | ||
| 2349 | 1066 PicoPower Technology | ||
| 2350 | 0000 PT80C826 | ||
| 2351 | 0001 PT86C521 [Vesuvius v1] Host Bridge | ||
| 2352 | 0002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Master | ||
| 2353 | 0003 PT86C524 [Nile] PCI-to-PCI Bridge | ||
| 2354 | 0004 PT86C525 [Nile-II] PCI-to-PCI Bridge | ||
| 2355 | 0005 National PC87550 System Controller | ||
| 2356 | 8002 PT86C523 [Vesuvius v3] PCI-ISA Bridge Slave | ||
| 2357 | 1067 Mitsubishi Electric | ||
| 2358 | 0301 AccelGraphics AccelECLIPSE | ||
| 2359 | 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] | ||
| 2360 | 0308 Tornado 3000 [OEM Evans & Sutherland] | ||
| 2361 | 1002 VG500 [VolumePro Volume Rendering Accelerator] | ||
| 2362 | 1068 Diversified Technology | ||
| 2363 | 1069 Mylex Corporation | ||
| 2364 | 0001 DAC960P | ||
| 2365 | 0002 DAC960PD | ||
| 2366 | 0010 DAC960PG | ||
| 2367 | 0020 DAC960LA | ||
| 2368 | 0050 AcceleRAID 352/170/160 support Device | ||
| 2369 | b166 Gemstone chipset SCSI controller | ||
| 2370 | 1014 0242 iSeries 2872 DASD IOA | ||
| 2371 | 1014 0266 Dual Channel PCI-X U320 SCSI Adapter | ||
| 2372 | 1014 0278 Dual Channel PCI-X U320 SCSI RAID Adapter | ||
| 2373 | 1014 02d3 Dual Channel PCI-X U320 SCSI Adapter | ||
| 2374 | 1014 02d4 Dual Channel PCI-X U320 SCSI RAID Adapter | ||
| 2375 | ba55 eXtremeRAID 1100 support Device | ||
| 2376 | ba56 eXtremeRAID 2000/3000 support Device | ||
| 2377 | 106a Aten Research Inc | ||
| 2378 | 106b Apple Computer Inc. | ||
| 2379 | 0001 Bandit PowerPC host bridge | ||
| 2380 | 0002 Grand Central I/O | ||
| 2381 | 0003 Control Video | ||
| 2382 | 0004 PlanB Video-In | ||
| 2383 | 0007 O'Hare I/O | ||
| 2384 | 000c DOS on Mac | ||
| 2385 | 000e Hydra Mac I/O | ||
| 2386 | 0010 Heathrow Mac I/O | ||
| 2387 | 0017 Paddington Mac I/O | ||
| 2388 | 0018 UniNorth FireWire | ||
| 2389 | 0019 KeyLargo USB | ||
| 2390 | 001e UniNorth Internal PCI | ||
| 2391 | 001f UniNorth PCI | ||
| 2392 | 0020 UniNorth AGP | ||
| 2393 | 0021 UniNorth GMAC (Sun GEM) | ||
| 2394 | 0022 KeyLargo Mac I/O | ||
| 2395 | 0024 UniNorth/Pangea GMAC (Sun GEM) | ||
| 2396 | 0025 KeyLargo/Pangea Mac I/O | ||
| 2397 | 0026 KeyLargo/Pangea USB | ||
| 2398 | 0027 UniNorth/Pangea AGP | ||
| 2399 | 0028 UniNorth/Pangea PCI | ||
| 2400 | 0029 UniNorth/Pangea Internal PCI | ||
| 2401 | 002d UniNorth 1.5 AGP | ||
| 2402 | 002e UniNorth 1.5 PCI | ||
| 2403 | 002f UniNorth 1.5 Internal PCI | ||
| 2404 | 0030 UniNorth/Pangea FireWire | ||
| 2405 | 0031 UniNorth 2 FireWire | ||
| 2406 | 0032 UniNorth 2 GMAC (Sun GEM) | ||
| 2407 | 0033 UniNorth 2 ATA/100 | ||
| 2408 | 0034 UniNorth 2 AGP | ||
| 2409 | 0035 UniNorth 2 PCI | ||
| 2410 | 0036 UniNorth 2 Internal PCI | ||
| 2411 | 003b UniNorth/Intrepid ATA/100 | ||
| 2412 | 003e KeyLargo/Intrepid Mac I/O | ||
| 2413 | 003f KeyLargo/Intrepid USB | ||
| 2414 | 0040 K2 KeyLargo USB | ||
| 2415 | 0041 K2 KeyLargo Mac/IO | ||
| 2416 | 0042 K2 FireWire | ||
| 2417 | 0043 K2 ATA/100 | ||
| 2418 | 0045 K2 HT-PCI Bridge | ||
| 2419 | 0046 K2 HT-PCI Bridge | ||
| 2420 | 0047 K2 HT-PCI Bridge | ||
| 2421 | 0048 K2 HT-PCI Bridge | ||
| 2422 | 0049 K2 HT-PCI Bridge | ||
| 2423 | 004b U3 AGP | ||
| 2424 | 004c K2 GMAC (Sun GEM) | ||
| 2425 | 004f Shasta Mac I/O | ||
| 2426 | 0050 Shasta IDE | ||
| 2427 | 0051 Shasta (Sun GEM) | ||
| 2428 | 0052 Shasta Firewire | ||
| 2429 | 0053 Shasta PCI Bridge | ||
| 2430 | 0054 Shasta PCI Bridge | ||
| 2431 | 0055 Shasta PCI Bridge | ||
| 2432 | 0058 U3L AGP Bridge | ||
| 2433 | 1645 Tigon3 Gigabit Ethernet NIC (BCM5701) | ||
| 2434 | 106c Hynix Semiconductor | ||
| 2435 | 8801 Dual Pentium ISA/PCI Motherboard | ||
| 2436 | 8802 PowerPC ISA/PCI Motherboard | ||
| 2437 | 8803 Dual Window Graphics Accelerator | ||
| 2438 | 8804 LAN Controller | ||
| 2439 | 8805 100-BaseT LAN | ||
| 2440 | 106d Sequent Computer Systems | ||
| 2441 | 106e DFI, Inc | ||
| 2442 | 106f City Gate Development Ltd | ||
| 2443 | 1070 Daewoo Telecom Ltd | ||
| 2444 | 1071 Mitac | ||
| 2445 | 8160 Mitac 8060B Mobile Platform | ||
| 2446 | 1072 GIT Co Ltd | ||
| 2447 | 1073 Yamaha Corporation | ||
| 2448 | 0001 3D GUI Accelerator | ||
| 2449 | 0002 YGV615 [RPA3 3D-Graphics Controller] | ||
| 2450 | 0003 YMF-740 | ||
| 2451 | 0004 YMF-724 | ||
| 2452 | 1073 0004 YMF724-Based PCI Audio Adapter | ||
| 2453 | 0005 DS1 Audio | ||
| 2454 | 1073 0005 DS-XG PCI Audio CODEC | ||
| 2455 | 0006 DS1 Audio | ||
| 2456 | 0008 DS1 Audio | ||
| 2457 | 1073 0008 DS-XG PCI Audio CODEC | ||
| 2458 | 000a DS1L Audio | ||
| 2459 | 1073 0004 DS-XG PCI Audio CODEC | ||
| 2460 | 1073 000a DS-XG PCI Audio CODEC | ||
| 2461 | 000c YMF-740C [DS-1L Audio Controller] | ||
| 2462 | 107a 000c DS-XG PCI Audio CODEC | ||
| 2463 | 000d YMF-724F [DS-1 Audio Controller] | ||
| 2464 | 1073 000d DS-XG PCI Audio CODEC | ||
| 2465 | 0010 YMF-744B [DS-1S Audio Controller] | ||
| 2466 | 1073 0006 DS-XG PCI Audio CODEC | ||
| 2467 | 1073 0010 DS-XG PCI Audio CODEC | ||
| 2468 | 0012 YMF-754 [DS-1E Audio Controller] | ||
| 2469 | 1073 0012 DS-XG PCI Audio Codec | ||
| 2470 | 0020 DS-1 Audio | ||
| 2471 | 2000 DS2416 Digital Mixing Card | ||
| 2472 | 1073 2000 DS2416 Digital Mixing Card | ||
| 2473 | 1074 NexGen Microsystems | ||
| 2474 | 4e78 82c500/1 | ||
| 2475 | 1075 Advanced Integrations Research | ||
| 2476 | 1076 Chaintech Computer Co. Ltd | ||
| 2477 | 1077 QLogic Corp. | ||
| 2478 | 1016 ISP10160 Single Channel Ultra3 SCSI Processor | ||
| 2479 | 1020 ISP1020 Fast-wide SCSI | ||
| 2480 | 1022 ISP1022 Fast-wide SCSI | ||
| 2481 | 1080 ISP1080 SCSI Host Adapter | ||
| 2482 | 1216 ISP12160 Dual Channel Ultra3 SCSI Processor | ||
| 2483 | 101e 8471 QLA12160 on AMI MegaRAID | ||
| 2484 | 101e 8493 QLA12160 on AMI MegaRAID | ||
| 2485 | 1240 ISP1240 SCSI Host Adapter | ||
| 2486 | 1280 ISP1280 SCSI Host Adapter | ||
| 2487 | 2020 ISP2020A Fast!SCSI Basic Adapter | ||
| 2488 | 2100 QLA2100 64-bit Fibre Channel Adapter | ||
| 2489 | 1077 0001 QLA2100 64-bit Fibre Channel Adapter | ||
| 2490 | 2200 QLA2200 64-bit Fibre Channel Adapter | ||
| 2491 | 1077 0002 QLA2200 | ||
| 2492 | 2300 QLA2300 64-bit Fibre Channel Adapter | ||
| 2493 | 2312 QLA2312 Fibre Channel Adapter | ||
| 2494 | 1078 Cyrix Corporation | ||
| 2495 | 0000 5510 [Grappa] | ||
| 2496 | 0001 PCI Master | ||
| 2497 | 0002 5520 [Cognac] | ||
| 2498 | 0100 5530 Legacy [Kahlua] | ||
| 2499 | 0101 5530 SMI [Kahlua] | ||
| 2500 | 0102 5530 IDE [Kahlua] | ||
| 2501 | 0103 5530 Audio [Kahlua] | ||
| 2502 | 0104 5530 Video [Kahlua] | ||
| 2503 | 0400 ZFMicro PCI Bridge | ||
| 2504 | 0401 ZFMicro Chipset SMI | ||
| 2505 | 0402 ZFMicro Chipset IDE | ||
| 2506 | 0403 ZFMicro Expansion Bus | ||
| 2507 | 1079 I-Bus | ||
| 2508 | 107a NetWorth | ||
| 2509 | 107b Gateway 2000 | ||
| 2510 | 107c LG Electronics [Lucky Goldstar Co. Ltd] | ||
| 2511 | 107d LeadTek Research Inc. | ||
| 2512 | 0000 P86C850 | ||
| 2513 | 2134 WinFast 3D S320 II | ||
| 2514 | 2971 [GeForce FX 5900] WinFast A350 TDH MyViVo | ||
| 2515 | 107e Interphase Corporation | ||
| 2516 | 0001 5515 ATM Adapter [Flipper] | ||
| 2517 | 0002 100 VG AnyLan Controller | ||
| 2518 | 0004 5526 Fibre Channel Host Adapter | ||
| 2519 | 0005 x526 Fibre Channel Host Adapter | ||
| 2520 | 0008 5525/5575 ATM Adapter (155 Mbit) [Atlantic] | ||
| 2521 | 9003 5535-4P-BRI-ST | ||
| 2522 | 9007 5535-4P-BRI-U | ||
| 2523 | 9008 5535-1P-SR | ||
| 2524 | 900c 5535-1P-SR-ST | ||
| 2525 | 900e 5535-1P-SR-U | ||
| 2526 | 9011 5535-1P-PRI | ||
| 2527 | 9013 5535-2P-PRI | ||
| 2528 | 9023 5536-4P-BRI-ST | ||
| 2529 | 9027 5536-4P-BRI-U | ||
| 2530 | 9031 5536-1P-PRI | ||
| 2531 | 9033 5536-2P-PRI | ||
| 2532 | 107f Data Technology Corporation | ||
| 2533 | 0802 SL82C105 | ||
| 2534 | 1080 Contaq Microsystems | ||
| 2535 | 0600 82C599 | ||
| 2536 | c691 Cypress CY82C691 | ||
| 2537 | c693 82c693 | ||
| 2538 | 1081 Supermac Technology | ||
| 2539 | 0d47 Radius PCI to NuBUS Bridge | ||
| 2540 | 1082 EFA Corporation of America | ||
| 2541 | 1083 Forex Computer Corporation | ||
| 2542 | 0001 FR710 | ||
| 2543 | 1084 Parador | ||
| 2544 | 1085 Tulip Computers Int.B.V. | ||
| 2545 | 1086 J. Bond Computer Systems | ||
| 2546 | 1087 Cache Computer | ||
| 2547 | 1088 Microcomputer Systems (M) Son | ||
| 2548 | 1089 Data General Corporation | ||
| 2549 | # Formerly Bit3 Computer Corp. | ||
| 2550 | 108a SBS Technologies | ||
| 2551 | 0001 VME Bridge Model 617 | ||
| 2552 | 0010 VME Bridge Model 618 | ||
| 2553 | 0040 dataBLIZZARD | ||
| 2554 | 3000 VME Bridge Model 2706 | ||
| 2555 | 108c Oakleigh Systems Inc. | ||
| 2556 | 108d Olicom | ||
| 2557 | 0001 Token-Ring 16/4 PCI Adapter (3136/3137) | ||
| 2558 | 0002 16/4 Token Ring | ||
| 2559 | 0004 RapidFire 3139 Token-Ring 16/4 PCI Adapter | ||
| 2560 | 108d 0004 OC-3139/3140 RapidFire Token-Ring 16/4 Adapter | ||
| 2561 | 0005 GoCard 3250 Token-Ring 16/4 CardBus PC Card | ||
| 2562 | 0006 OC-3530 RapidFire Token-Ring 100 | ||
| 2563 | 0007 RapidFire 3141 Token-Ring 16/4 PCI Fiber Adapter | ||
| 2564 | 108d 0007 OC-3141 RapidFire Token-Ring 16/4 Adapter | ||
| 2565 | 0008 RapidFire 3540 HSTR 100/16/4 PCI Adapter | ||
| 2566 | 108d 0008 OC-3540 RapidFire HSTR 100/16/4 Adapter | ||
| 2567 | 0011 OC-2315 | ||
| 2568 | 0012 OC-2325 | ||
| 2569 | 0013 OC-2183/2185 | ||
| 2570 | 0014 OC-2326 | ||
| 2571 | 0019 OC-2327/2250 10/100 Ethernet Adapter | ||
| 2572 | 108d 0016 OC-2327 Rapidfire 10/100 Ethernet Adapter | ||
| 2573 | 108d 0017 OC-2250 GoCard 10/100 Ethernet Adapter | ||
| 2574 | 0021 OC-6151/6152 [RapidFire ATM 155] | ||
| 2575 | 0022 ATM Adapter | ||
| 2576 | 108e Sun Microsystems Computer Corp. | ||
| 2577 | 0001 EBUS | ||
| 2578 | 1000 EBUS | ||
| 2579 | 1001 Happy Meal | ||
| 2580 | 1100 RIO EBUS | ||
| 2581 | 1101 RIO GEM | ||
| 2582 | 1102 RIO 1394 | ||
| 2583 | 1103 RIO USB | ||
| 2584 | 1648 [bge] Gigabit Ethernet | ||
| 2585 | 2bad GEM | ||
| 2586 | 5000 Simba Advanced PCI Bridge | ||
| 2587 | 5043 SunPCI Co-processor | ||
| 2588 | 8000 Psycho PCI Bus Module | ||
| 2589 | 8001 Schizo PCI Bus Module | ||
| 2590 | 8002 Schizo+ PCI Bus Module | ||
| 2591 | a000 Ultra IIi | ||
| 2592 | a001 Ultra IIe | ||
| 2593 | a801 Tomatillo PCI Bus Module | ||
| 2594 | abba Cassini 10/100/1000 | ||
| 2595 | 108f Systemsoft | ||
| 2596 | 1090 Encore Computer Corporation | ||
| 2597 | 1091 Intergraph Corporation | ||
| 2598 | 0020 3D graphics processor | ||
| 2599 | 0021 3D graphics processor w/Texturing | ||
| 2600 | 0040 3D graphics frame buffer | ||
| 2601 | 0041 3D graphics frame buffer | ||
| 2602 | 0060 Proprietary bus bridge | ||
| 2603 | 00e4 Powerstorm 4D50T | ||
| 2604 | 0720 Motion JPEG codec | ||
| 2605 | 07a0 Sun Expert3D-Lite Graphics Accelerator | ||
| 2606 | 1091 Sun Expert3D Graphics Accelerator | ||
| 2607 | 1092 Diamond Multimedia Systems | ||
| 2608 | 00a0 Speedstar Pro SE | ||
| 2609 | 00a8 Speedstar 64 | ||
| 2610 | 0550 Viper V550 | ||
| 2611 | 08d4 Supra 2260 Modem | ||
| 2612 | 094c SupraExpress 56i Pro | ||
| 2613 | 1092 Viper V330 | ||
| 2614 | 6120 Maximum DVD | ||
| 2615 | 8810 Stealth SE | ||
| 2616 | 8811 Stealth 64/SE | ||
| 2617 | 8880 Stealth | ||
| 2618 | 8881 Stealth | ||
| 2619 | 88b0 Stealth 64 | ||
| 2620 | 88b1 Stealth 64 | ||
| 2621 | 88c0 Stealth 64 | ||
| 2622 | 88c1 Stealth 64 | ||
| 2623 | 88d0 Stealth 64 | ||
| 2624 | 88d1 Stealth 64 | ||
| 2625 | 88f0 Stealth 64 | ||
| 2626 | 88f1 Stealth 64 | ||
| 2627 | 9999 DMD-I0928-1 "Monster sound" sound chip | ||
| 2628 | 1093 National Instruments | ||
| 2629 | 0160 PCI-DIO-96 | ||
| 2630 | 0162 PCI-MIO-16XE-50 | ||
| 2631 | 1170 PCI-MIO-16XE-10 | ||
| 2632 | 1180 PCI-MIO-16E-1 | ||
| 2633 | 1190 PCI-MIO-16E-4 | ||
| 2634 | 1310 PCI-6602 | ||
| 2635 | 1330 PCI-6031E | ||
| 2636 | 1350 PCI-6071E | ||
| 2637 | 14e0 PCI-6110 | ||
| 2638 | 14f0 PCI-6111 | ||
| 2639 | 17d0 PCI-6503 | ||
| 2640 | 1870 PCI-6713 | ||
| 2641 | 1880 PCI-6711 | ||
| 2642 | 18b0 PCI-6052E | ||
| 2643 | 2410 PCI-6733 | ||
| 2644 | 2890 PCI-6036E | ||
| 2645 | 2a60 PCI-6023E | ||
| 2646 | 2a70 PCI-6024E | ||
| 2647 | 2a80 PCI-6025E | ||
| 2648 | 2c80 PCI-6035E | ||
| 2649 | 2ca0 PCI-6034E | ||
| 2650 | 70b8 PCI-6251 [M Series - High Speed Multifunction DAQ] | ||
| 2651 | b001 IMAQ-PCI-1408 | ||
| 2652 | b011 IMAQ-PXI-1408 | ||
| 2653 | b021 IMAQ-PCI-1424 | ||
| 2654 | b031 IMAQ-PCI-1413 | ||
| 2655 | b041 IMAQ-PCI-1407 | ||
| 2656 | b051 IMAQ-PXI-1407 | ||
| 2657 | b061 IMAQ-PCI-1411 | ||
| 2658 | b071 IMAQ-PCI-1422 | ||
| 2659 | b081 IMAQ-PXI-1422 | ||
| 2660 | b091 IMAQ-PXI-1411 | ||
| 2661 | c801 PCI-GPIB | ||
| 2662 | c831 PCI-GPIB bridge | ||
| 2663 | 1094 First International Computers [FIC] | ||
| 2664 | 1095 Silicon Image, Inc. (formerly CMD Technology Inc) | ||
| 2665 | 0240 Adaptec AAR-1210SA SATA HostRAID Controller | ||
| 2666 | 0640 PCI0640 | ||
| 2667 | 0643 PCI0643 | ||
| 2668 | 0646 PCI0646 | ||
| 2669 | 0647 PCI0647 | ||
| 2670 | 0648 PCI0648 | ||
| 2671 | 0649 SiI 0649 Ultra ATA/100 PCI to ATA Host Controller | ||
| 2672 | 0e11 005d Integrated Ultra ATA-100 Dual Channel Controller | ||
| 2673 | 0e11 007e Integrated Ultra ATA-100 IDE RAID Controller | ||
| 2674 | 101e 0649 AMI MegaRAID IDE 100 Controller | ||
| 2675 | 0650 PBC0650A | ||
| 2676 | 0670 USB0670 | ||
| 2677 | 1095 0670 USB0670 | ||
| 2678 | 0673 USB0673 | ||
| 2679 | 0680 PCI0680 Ultra ATA-133 Host Controller | ||
| 2680 | 1095 3680 Winic W-680 (Silicon Image 680 based) | ||
| 2681 | 3112 SiI 3112 [SATALink/SATARaid] Serial ATA Controller | ||
| 2682 | 1095 3112 SiI 3112 SATALink Controller | ||
| 2683 | 1095 6112 SiI 3112 SATARaid Controller | ||
| 2684 | 3114 SiI 3114 [SATALink/SATARaid] Serial ATA Controller | ||
| 2685 | 1095 3114 SiI 3114 SATALink Controller | ||
| 2686 | 1095 6114 SiI 3114 SATARaid Controller | ||
| 2687 | 3124 SiI 3124 PCI-X Serial ATA Controller | ||
| 2688 | 1095 3124 SiI 3124 PCI-X Serial ATA Controller | ||
| 2689 | 3512 SiI 3512 [SATALink/SATARaid] Serial ATA Controller | ||
| 2690 | 1095 3512 SiI 3512 SATALink Controller | ||
| 2691 | 1095 6512 SiI 3512 SATARaid Controller | ||
| 2692 | 1096 Alacron | ||
| 2693 | 1097 Appian Technology | ||
| 2694 | 1098 Quantum Designs (H.K.) Ltd | ||
| 2695 | 0001 QD-8500 | ||
| 2696 | 0002 QD-8580 | ||
| 2697 | 1099 Samsung Electronics Co., Ltd | ||
| 2698 | 109a Packard Bell | ||
| 2699 | 109b Gemlight Computer Ltd. | ||
| 2700 | 109c Megachips Corporation | ||
| 2701 | 109d Zida Technologies Ltd. | ||
| 2702 | 109e Brooktree Corporation | ||
| 2703 | 0350 Bt848 Video Capture | ||
| 2704 | 0351 Bt849A Video capture | ||
| 2705 | 0369 Bt878 Video Capture | ||
| 2706 | 1002 0001 TV-Wonder | ||
| 2707 | 1002 0003 TV-Wonder/VE | ||
| 2708 | 036c Bt879(??) Video Capture | ||
| 2709 | 13e9 0070 Win/TV (Video Section) | ||
| 2710 | 036e Bt878 Video Capture | ||
| 2711 | 0070 13eb WinTV Series | ||
| 2712 | 0070 ff01 Viewcast Osprey 200 | ||
| 2713 | 0071 0101 DigiTV PCI | ||
| 2714 | 107d 6606 WinFast TV 2000 | ||
| 2715 | 11bd 0012 PCTV pro (TV + FM stereo receiver) | ||
| 2716 | 11bd 001c PCTV Sat (DBC receiver) | ||
| 2717 | 127a 0001 Bt878 Mediastream Controller NTSC | ||
| 2718 | 127a 0002 Bt878 Mediastream Controller PAL BG | ||
| 2719 | 127a 0003 Bt878a Mediastream Controller PAL BG | ||
| 2720 | 127a 0048 Bt878/832 Mediastream Controller | ||
| 2721 | 144f 3000 MagicTView CPH060 - Video | ||
| 2722 | 1461 0002 TV98 Series (TV/No FM/Remote) | ||
| 2723 | 1461 0003 AverMedia UltraTV PCI 350 | ||
| 2724 | 1461 0004 AVerTV WDM Video Capture | ||
| 2725 | 1461 0761 AverTV DVB-T | ||
| 2726 | 14f1 0001 Bt878 Mediastream Controller NTSC | ||
| 2727 | 14f1 0002 Bt878 Mediastream Controller PAL BG | ||
| 2728 | 14f1 0003 Bt878a Mediastream Controller PAL BG | ||
| 2729 | 14f1 0048 Bt878/832 Mediastream Controller | ||
| 2730 | 1822 0001 VisionPlus DVB card | ||
| 2731 | 1851 1850 FlyVideo'98 - Video | ||
| 2732 | 1851 1851 FlyVideo II | ||
| 2733 | 1852 1852 FlyVideo'98 - Video (with FM Tuner) | ||
| 2734 | 270f fc00 Digitop DTT-1000 | ||
| 2735 | bd11 1200 PCTV pro (TV + FM stereo receiver) | ||
| 2736 | 036f Bt879 Video Capture | ||
| 2737 | 127a 0044 Bt879 Video Capture NTSC | ||
| 2738 | 127a 0122 Bt879 Video Capture PAL I | ||
| 2739 | 127a 0144 Bt879 Video Capture NTSC | ||
| 2740 | 127a 0222 Bt879 Video Capture PAL BG | ||
| 2741 | 127a 0244 Bt879a Video Capture NTSC | ||
| 2742 | 127a 0322 Bt879 Video Capture NTSC | ||
| 2743 | 127a 0422 Bt879 Video Capture NTSC | ||
| 2744 | 127a 1122 Bt879 Video Capture PAL I | ||
| 2745 | 127a 1222 Bt879 Video Capture PAL BG | ||
| 2746 | 127a 1322 Bt879 Video Capture NTSC | ||
| 2747 | 127a 1522 Bt879a Video Capture PAL I | ||
| 2748 | 127a 1622 Bt879a Video Capture PAL BG | ||
| 2749 | 127a 1722 Bt879a Video Capture NTSC | ||
| 2750 | 14f1 0044 Bt879 Video Capture NTSC | ||
| 2751 | 14f1 0122 Bt879 Video Capture PAL I | ||
| 2752 | 14f1 0144 Bt879 Video Capture NTSC | ||
| 2753 | 14f1 0222 Bt879 Video Capture PAL BG | ||
| 2754 | 14f1 0244 Bt879a Video Capture NTSC | ||
| 2755 | 14f1 0322 Bt879 Video Capture NTSC | ||
| 2756 | 14f1 0422 Bt879 Video Capture NTSC | ||
| 2757 | 14f1 1122 Bt879 Video Capture PAL I | ||
| 2758 | 14f1 1222 Bt879 Video Capture PAL BG | ||
| 2759 | 14f1 1322 Bt879 Video Capture NTSC | ||
| 2760 | 14f1 1522 Bt879a Video Capture PAL I | ||
| 2761 | 14f1 1622 Bt879a Video Capture PAL BG | ||
| 2762 | 14f1 1722 Bt879a Video Capture NTSC | ||
| 2763 | 1851 1850 FlyVideo'98 - Video | ||
| 2764 | 1851 1851 FlyVideo II | ||
| 2765 | 1852 1852 FlyVideo'98 - Video (with FM Tuner) | ||
| 2766 | 0370 Bt880 Video Capture | ||
| 2767 | 1851 1850 FlyVideo'98 | ||
| 2768 | 1851 1851 FlyVideo'98 EZ - video | ||
| 2769 | 1852 1852 FlyVideo'98 (with FM Tuner) | ||
| 2770 | 0878 Bt878 Audio Capture | ||
| 2771 | 0070 13eb WinTV Series | ||
| 2772 | 0070 ff01 Viewcast Osprey 200 | ||
| 2773 | 0071 0101 DigiTV PCI | ||
| 2774 | 1002 0001 TV-Wonder | ||
| 2775 | 1002 0003 TV-Wonder/VE | ||
| 2776 | 11bd 0012 PCTV pro (TV + FM stereo receiver, audio section) | ||
| 2777 | 11bd 001c PCTV Sat (DBC receiver) | ||
| 2778 | 127a 0001 Bt878 Video Capture (Audio Section) | ||
| 2779 | 127a 0002 Bt878 Video Capture (Audio Section) | ||
| 2780 | 127a 0003 Bt878 Video Capture (Audio Section) | ||
| 2781 | 127a 0048 Bt878 Video Capture (Audio Section) | ||
| 2782 | 13e9 0070 Win/TV (Audio Section) | ||
| 2783 | 144f 3000 MagicTView CPH060 - Audio | ||
| 2784 | 1461 0004 AVerTV WDM Audio Capture | ||
| 2785 | 1461 0761 AVerTV DVB-T | ||
| 2786 | 14f1 0001 Bt878 Video Capture (Audio Section) | ||
| 2787 | 14f1 0002 Bt878 Video Capture (Audio Section) | ||
| 2788 | 14f1 0003 Bt878 Video Capture (Audio Section) | ||
| 2789 | 14f1 0048 Bt878 Video Capture (Audio Section) | ||
| 2790 | 1822 0001 VisionPlus DVB Card | ||
| 2791 | 270f fc00 Digitop DTT-1000 | ||
| 2792 | bd11 1200 PCTV pro (TV + FM stereo receiver, audio section) | ||
| 2793 | 0879 Bt879 Audio Capture | ||
| 2794 | 127a 0044 Bt879 Video Capture (Audio Section) | ||
| 2795 | 127a 0122 Bt879 Video Capture (Audio Section) | ||
| 2796 | 127a 0144 Bt879 Video Capture (Audio Section) | ||
| 2797 | 127a 0222 Bt879 Video Capture (Audio Section) | ||
| 2798 | 127a 0244 Bt879 Video Capture (Audio Section) | ||
| 2799 | 127a 0322 Bt879 Video Capture (Audio Section) | ||
| 2800 | 127a 0422 Bt879 Video Capture (Audio Section) | ||
| 2801 | 127a 1122 Bt879 Video Capture (Audio Section) | ||
| 2802 | 127a 1222 Bt879 Video Capture (Audio Section) | ||
| 2803 | 127a 1322 Bt879 Video Capture (Audio Section) | ||
| 2804 | 127a 1522 Bt879 Video Capture (Audio Section) | ||
| 2805 | 127a 1622 Bt879 Video Capture (Audio Section) | ||
| 2806 | 127a 1722 Bt879 Video Capture (Audio Section) | ||
| 2807 | 14f1 0044 Bt879 Video Capture (Audio Section) | ||
| 2808 | 14f1 0122 Bt879 Video Capture (Audio Section) | ||
| 2809 | 14f1 0144 Bt879 Video Capture (Audio Section) | ||
| 2810 | 14f1 0222 Bt879 Video Capture (Audio Section) | ||
| 2811 | 14f1 0244 Bt879 Video Capture (Audio Section) | ||
| 2812 | 14f1 0322 Bt879 Video Capture (Audio Section) | ||
| 2813 | 14f1 0422 Bt879 Video Capture (Audio Section) | ||
| 2814 | 14f1 1122 Bt879 Video Capture (Audio Section) | ||
| 2815 | 14f1 1222 Bt879 Video Capture (Audio Section) | ||
| 2816 | 14f1 1322 Bt879 Video Capture (Audio Section) | ||
| 2817 | 14f1 1522 Bt879 Video Capture (Audio Section) | ||
| 2818 | 14f1 1622 Bt879 Video Capture (Audio Section) | ||
| 2819 | 14f1 1722 Bt879 Video Capture (Audio Section) | ||
| 2820 | 0880 Bt880 Audio Capture | ||
| 2821 | 2115 BtV 2115 Mediastream controller | ||
| 2822 | 2125 BtV 2125 Mediastream controller | ||
| 2823 | 2164 BtV 2164 | ||
| 2824 | 2165 BtV 2165 | ||
| 2825 | 8230 Bt8230 ATM Segment/Reassembly Ctrlr (SRC) | ||
| 2826 | 8472 Bt8472 | ||
| 2827 | 8474 Bt8474 | ||
| 2828 | 109f Trigem Computer Inc. | ||
| 2829 | 10a0 Meidensha Corporation | ||
| 2830 | 10a1 Juko Electronics Ind. Co. Ltd | ||
| 2831 | 10a2 Quantum Corporation | ||
| 2832 | 10a3 Everex Systems Inc | ||
| 2833 | 10a4 Globe Manufacturing Sales | ||
| 2834 | 10a5 Smart Link Ltd. | ||
| 2835 | 3052 SmartPCI562 56K Modem | ||
| 2836 | 5449 SmartPCI561 modem | ||
| 2837 | 10a6 Informtech Industrial Ltd. | ||
| 2838 | 10a7 Benchmarq Microelectronics | ||
| 2839 | 10a8 Sierra Semiconductor | ||
| 2840 | 0000 STB Horizon 64 | ||
| 2841 | 10a9 Silicon Graphics, Inc. | ||
| 2842 | 0001 Crosstalk to PCI Bridge | ||
| 2843 | 0002 Linc I/O controller | ||
| 2844 | 0003 IOC3 I/O controller | ||
| 2845 | 0004 O2 MACE | ||
| 2846 | 0005 RAD Audio | ||
| 2847 | 0006 HPCEX | ||
| 2848 | 0007 RPCEX | ||
| 2849 | 0008 DiVO VIP | ||
| 2850 | 0009 AceNIC Gigabit Ethernet | ||
| 2851 | 10a9 8002 AceNIC Gigabit Ethernet | ||
| 2852 | 0010 AMP Video I/O | ||
| 2853 | 0011 GRIP | ||
| 2854 | 0012 SGH PSHAC GSN | ||
| 2855 | 1001 Magic Carpet | ||
| 2856 | 1002 Lithium | ||
| 2857 | 1003 Dual JPEG 1 | ||
| 2858 | 1004 Dual JPEG 2 | ||
| 2859 | 1005 Dual JPEG 3 | ||
| 2860 | 1006 Dual JPEG 4 | ||
| 2861 | 1007 Dual JPEG 5 | ||
| 2862 | 1008 Cesium | ||
| 2863 | 100a IOC4 I/O controller | ||
| 2864 | 2001 Fibre Channel | ||
| 2865 | 2002 ASDE | ||
| 2866 | 8001 O2 1394 | ||
| 2867 | 8002 G-net NT | ||
| 2868 | 10aa ACC Microelectronics | ||
| 2869 | 0000 ACCM 2188 | ||
| 2870 | 10ab Digicom | ||
| 2871 | 10ac Honeywell IAC | ||
| 2872 | 10ad Symphony Labs | ||
| 2873 | 0001 W83769F | ||
| 2874 | 0003 SL82C103 | ||
| 2875 | 0005 SL82C105 | ||
| 2876 | 0103 SL82c103 | ||
| 2877 | 0105 SL82c105 | ||
| 2878 | 0565 W83C553 | ||
| 2879 | 10ae Cornerstone Technology | ||
| 2880 | 10af Micro Computer Systems Inc | ||
| 2881 | 10b0 CardExpert Technology | ||
| 2882 | 10b1 Cabletron Systems Inc | ||
| 2883 | 10b2 Raytheon Company | ||
| 2884 | 10b3 Databook Inc | ||
| 2885 | 3106 DB87144 | ||
| 2886 | b106 DB87144 | ||
| 2887 | 10b4 STB Systems Inc | ||
| 2888 | 1b1d Velocity 128 3D | ||
| 2889 | 10b4 237e Velocity 4400 | ||
| 2890 | 10b5 PLX Technology, Inc. | ||
| 2891 | 0001 i960 PCI bus interface | ||
| 2892 | 1076 VScom 800 8 port serial adaptor | ||
| 2893 | 1077 VScom 400 4 port serial adaptor | ||
| 2894 | 1078 VScom 210 2 port serial and 1 port parallel adaptor | ||
| 2895 | 1103 VScom 200 2 port serial adaptor | ||
| 2896 | 1146 VScom 010 1 port parallel adaptor | ||
| 2897 | 1147 VScom 020 2 port parallel adaptor | ||
| 2898 | 2724 Thales PCSM Security Card | ||
| 2899 | 8516 PEX 8516 Versatile PCI Express Switch | ||
| 2900 | 8532 PEX 8532 Versatile PCI Express Switch | ||
| 2901 | 9030 PCI <-> IOBus Bridge Hot Swap | ||
| 2902 | 10b5 2862 Alpermann+Velte PCL PCI LV (3V/5V): Timecode Reader Board | ||
| 2903 | 10b5 2906 Alpermann+Velte PCI TS (3V/5V): Time Synchronisation Board | ||
| 2904 | 10b5 2940 Alpermann+Velte PCL PCI D (3V/5V): Timecode Reader Board | ||
| 2905 | 10b5 3025 Alpermann+Velte PCL PCI L (3V/5V): Timecode Reader Board | ||
| 2906 | 10b5 3068 Alpermann+Velte PCL PCI HD (3V/5V): Timecode Reader Board | ||
| 2907 | 15ed 1002 MCCS 8-port Serial Hot Swap | ||
| 2908 | 15ed 1003 MCCS 16-port Serial Hot Swap | ||
| 2909 | 9036 9036 | ||
| 2910 | 9050 PCI <-> IOBus Bridge | ||
| 2911 | 10b5 1067 IXXAT CAN i165 | ||
| 2912 | 10b5 1172 IK220 (Heidenhain) | ||
| 2913 | 10b5 2036 SatPak GPS | ||
| 2914 | 10b5 2221 Alpermann+Velte PCL PCI LV: Timecode Reader Board | ||
| 2915 | 10b5 2273 SH-ARC SoHard ARCnet card | ||
| 2916 | 10b5 2431 Alpermann+Velte PCL PCI D: Timecode Reader Board | ||
| 2917 | 10b5 2905 Alpermann+Velte PCI TS: Time Synchronisation Board | ||
| 2918 | 10b5 9050 MP9050 | ||
| 2919 | 1498 0362 TPMC866 8 Channel Serial Card | ||
| 2920 | 1522 0001 RockForce 4 Port V.90 Data/Fax/Voice Modem | ||
| 2921 | 1522 0002 RockForce 2 Port V.90 Data/Fax/Voice Modem | ||
| 2922 | 1522 0003 RockForce 6 Port V.90 Data/Fax/Voice Modem | ||
| 2923 | 1522 0004 RockForce 8 Port V.90 Data/Fax/Voice Modem | ||
| 2924 | 1522 0010 RockForce2000 4 Port V.90 Data/Fax/Voice Modem | ||
| 2925 | 1522 0020 RockForce2000 2 Port V.90 Data/Fax/Voice Modem | ||
| 2926 | 15ed 1000 Macrolink MCCS 8-port Serial | ||
| 2927 | 15ed 1001 Macrolink MCCS 16-port Serial | ||
| 2928 | 15ed 1002 Macrolink MCCS 8-port Serial Hot Swap | ||
| 2929 | 15ed 1003 Macrolink MCCS 16-port Serial Hot Swap | ||
| 2930 | # Sorry, there was a typo | ||
| 2931 | 5654 2036 OpenSwitch 6 Telephony card | ||
| 2932 | # Sorry, there was a typo | ||
| 2933 | 5654 3132 OpenSwitch 12 Telephony card | ||
| 2934 | 5654 5634 OpenLine4 Telephony Card | ||
| 2935 | d531 c002 PCIntelliCAN 2xSJA1000 CAN bus | ||
| 2936 | d84d 4006 EX-4006 1P | ||
| 2937 | d84d 4008 EX-4008 1P EPP/ECP | ||
| 2938 | d84d 4014 EX-4014 2P | ||
| 2939 | d84d 4018 EX-4018 3P EPP/ECP | ||
| 2940 | d84d 4025 EX-4025 1S(16C550) RS-232 | ||
| 2941 | d84d 4027 EX-4027 1S(16C650) RS-232 | ||
| 2942 | d84d 4028 EX-4028 1S(16C850) RS-232 | ||
| 2943 | d84d 4036 EX-4036 2S(16C650) RS-232 | ||
| 2944 | d84d 4037 EX-4037 2S(16C650) RS-232 | ||
| 2945 | d84d 4038 EX-4038 2S(16C850) RS-232 | ||
| 2946 | d84d 4052 EX-4052 1S(16C550) RS-422/485 | ||
| 2947 | d84d 4053 EX-4053 2S(16C550) RS-422/485 | ||
| 2948 | d84d 4055 EX-4055 4S(16C550) RS-232 | ||
| 2949 | d84d 4058 EX-4055 4S(16C650) RS-232 | ||
| 2950 | d84d 4065 EX-4065 8S(16C550) RS-232 | ||
| 2951 | d84d 4068 EX-4068 8S(16C650) RS-232 | ||
| 2952 | d84d 4078 EX-4078 2S(16C552) RS-232+1P | ||
| 2953 | 9054 PCI <-> IOBus Bridge | ||
| 2954 | 10b5 2455 Wessex Techology PHIL-PCI | ||
| 2955 | 10b5 2696 Innes Corp AM Radcap card | ||
| 2956 | 10b5 2717 Innes Corp Auricon card | ||
| 2957 | 10b5 2844 Innes Corp TVS Encoder card | ||
| 2958 | 12d9 0002 PCI Prosody Card rev 1.5 | ||
| 2959 | 16df 0011 PIKA PrimeNet MM PCI | ||
| 2960 | 16df 0012 PIKA PrimeNet MM cPCI 8 | ||
| 2961 | 16df 0013 PIKA PrimeNet MM cPCI 8 (without CAS Signaling Option) | ||
| 2962 | 16df 0014 PIKA PrimeNet MM cPCI 4 | ||
| 2963 | 16df 0015 PIKA Daytona MM | ||
| 2964 | 16df 0016 PIKA InLine MM | ||
| 2965 | 9056 Francois | ||
| 2966 | 10b5 2979 CellinkBlade 11 - CPCI board VoATM AAL1 | ||
| 2967 | 9060 9060 | ||
| 2968 | 906d 9060SD | ||
| 2969 | 125c 0640 Aries 16000P | ||
| 2970 | 906e 9060ES | ||
| 2971 | 9080 9080 | ||
| 2972 | 103c 10eb (Agilent) E2777B 83K Series PCI based Optical Communication Interface | ||
| 2973 | 103c 10ec (Agilent) E6978-66442 PCI CIC | ||
| 2974 | 10b5 9080 9080 [real subsystem ID not set] | ||
| 2975 | 129d 0002 Aculab PCI Prosidy card | ||
| 2976 | 12d9 0002 PCI Prosody Card | ||
| 2977 | 12df 4422 4422PCI ["Do-All" Telemetry Data Aquisition System] | ||
| 2978 | bb04 B&B 3PCIOSD1A Isolated PCI Serial | ||
| 2979 | 10b6 Madge Networks | ||
| 2980 | 0001 Smart 16/4 PCI Ringnode | ||
| 2981 | 0002 Smart 16/4 PCI Ringnode Mk2 | ||
| 2982 | 10b6 0002 Smart 16/4 PCI Ringnode Mk2 | ||
| 2983 | 10b6 0006 16/4 CardBus Adapter | ||
| 2984 | 0003 Smart 16/4 PCI Ringnode Mk3 | ||
| 2985 | 0e11 b0fd Compaq NC4621 PCI, 4/16, WOL | ||
| 2986 | 10b6 0003 Smart 16/4 PCI Ringnode Mk3 | ||
| 2987 | 10b6 0007 Presto PCI Plus Adapter | ||
| 2988 | 0004 Smart 16/4 PCI Ringnode Mk1 | ||
| 2989 | 0006 16/4 Cardbus Adapter | ||
| 2990 | 10b6 0006 16/4 CardBus Adapter | ||
| 2991 | 0007 Presto PCI Adapter | ||
| 2992 | 10b6 0007 Presto PCI | ||
| 2993 | 0009 Smart 100/16/4 PCI-HS Ringnode | ||
| 2994 | 10b6 0009 Smart 100/16/4 PCI-HS Ringnode | ||
| 2995 | 000a Smart 100/16/4 PCI Ringnode | ||
| 2996 | 10b6 000a Smart 100/16/4 PCI Ringnode | ||
| 2997 | 000b 16/4 CardBus Adapter Mk2 | ||
| 2998 | 10b6 0008 16/4 CardBus Adapter Mk2 | ||
| 2999 | 10b6 000b 16/4 Cardbus Adapter Mk2 | ||
| 3000 | 000c RapidFire 3140V2 16/4 TR Adapter | ||
| 3001 | 10b6 000c RapidFire 3140V2 16/4 TR Adapter | ||
| 3002 | 1000 Collage 25/155 ATM Client Adapter | ||
| 3003 | 1001 Collage 155 ATM Server Adapter | ||
| 3004 | 10b7 3Com Corporation | ||
| 3005 | 0001 3c985 1000BaseSX (SX/TX) | ||
| 3006 | 0013 AR5212 802.11abg NIC (3CRDAG675) | ||
| 3007 | 10b7 2031 3CRDAG675 11a/b/g Wireless PCI Adapter | ||
| 3008 | 0910 3C910-A01 | ||
| 3009 | 1006 MINI PCI type 3B Data Fax Modem | ||
| 3010 | 1007 Mini PCI 56k Winmodem | ||
| 3011 | 10b7 615c Mini PCI 56K Modem | ||
| 3012 | 1201 3c982-TXM 10/100baseTX Dual Port A [Hydra] | ||
| 3013 | 1202 3c982-TXM 10/100baseTX Dual Port B [Hydra] | ||
| 3014 | 1700 3c940 10/100/1000Base-T [Marvell] | ||
| 3015 | 1043 80eb P4P800/K8V Deluxe motherboard | ||
| 3016 | 10b7 0010 3C940 Gigabit LOM Ethernet Adapter | ||
| 3017 | 10b7 0020 3C941 Gigabit LOM Ethernet Adapter | ||
| 3018 | 147b 1407 KV8-MAX3 motherboard | ||
| 3019 | 3390 3c339 TokenLink Velocity | ||
| 3020 | 3590 3c359 TokenLink Velocity XL | ||
| 3021 | 10b7 3590 TokenLink Velocity XL Adapter (3C359/359B) | ||
| 3022 | 4500 3c450 HomePNA [Tornado] | ||
| 3023 | 5055 3c555 Laptop Hurricane | ||
| 3024 | 5057 3c575 Megahertz 10/100 LAN CardBus [Boomerang] | ||
| 3025 | 10b7 5a57 3C575 Megahertz 10/100 LAN Cardbus PC Card | ||
| 3026 | 5157 3cCFE575BT Megahertz 10/100 LAN CardBus [Cyclone] | ||
| 3027 | 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card | ||
| 3028 | 5257 3cCFE575CT CardBus [Cyclone] | ||
| 3029 | 10b7 5c57 FE575C-3Com 10/100 LAN CardBus-Fast Ethernet | ||
| 3030 | 5900 3c590 10BaseT [Vortex] | ||
| 3031 | 5920 3c592 EISA 10mbps Demon/Vortex | ||
| 3032 | 5950 3c595 100BaseTX [Vortex] | ||
| 3033 | 5951 3c595 100BaseT4 [Vortex] | ||
| 3034 | 5952 3c595 100Base-MII [Vortex] | ||
| 3035 | 5970 3c597 EISA Fast Demon/Vortex | ||
| 3036 | 5b57 3c595 Megahertz 10/100 LAN CardBus [Boomerang] | ||
| 3037 | 10b7 5b57 3C575 Megahertz 10/100 LAN Cardbus PC Card | ||
| 3038 | 6000 3CRSHPW796 [OfficeConnect Wireless CardBus] | ||
| 3039 | 6001 3com 3CRWE154G72 [Office Connect Wireless LAN Adapter] | ||
| 3040 | 6055 3c556 Hurricane CardBus [Cyclone] | ||
| 3041 | 6056 3c556B CardBus [Tornado] | ||
| 3042 | 10b7 6556 10/100 Mini PCI Ethernet Adapter | ||
| 3043 | 6560 3cCFE656 CardBus [Cyclone] | ||
| 3044 | 10b7 656a 3CCFEM656 10/100 LAN+56K Modem CardBus | ||
| 3045 | 6561 3cCFEM656 10/100 LAN+56K Modem CardBus | ||
| 3046 | 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus | ||
| 3047 | 6562 3cCFEM656B 10/100 LAN+Winmodem CardBus [Cyclone] | ||
| 3048 | 10b7 656b 3CCFEM656B 10/100 LAN+56K Modem CardBus | ||
| 3049 | 6563 3cCFEM656B 10/100 LAN+56K Modem CardBus | ||
| 3050 | 10b7 656b 3CCFEM656 10/100 LAN+56K Modem CardBus | ||
| 3051 | 6564 3cXFEM656C 10/100 LAN+Winmodem CardBus [Tornado] | ||
| 3052 | 7646 3cSOHO100-TX Hurricane | ||
| 3053 | 7770 3CRWE777 PCI(PLX) Wireless Adaptor [Airconnect] | ||
| 3054 | 7940 3c803 FDDILink UTP Controller | ||
| 3055 | 7980 3c804 FDDILink SAS Controller | ||
| 3056 | 7990 3c805 FDDILink DAS Controller | ||
| 3057 | 80eb 3c940B 10/100/1000Base-T | ||
| 3058 | 8811 Token ring | ||
| 3059 | 9000 3c900 10BaseT [Boomerang] | ||
| 3060 | 9001 3c900 10Mbps Combo [Boomerang] | ||
| 3061 | 9004 3c900B-TPO Etherlink XL [Cyclone] | ||
| 3062 | 10b7 9004 3C900B-TPO Etherlink XL TPO 10Mb | ||
| 3063 | 9005 3c900B-Combo Etherlink XL [Cyclone] | ||
| 3064 | 10b7 9005 3C900B-Combo Etherlink XL Combo | ||
| 3065 | 9006 3c900B-TPC Etherlink XL [Cyclone] | ||
| 3066 | 900a 3c900B-FL 10base-FL [Cyclone] | ||
| 3067 | 9050 3c905 100BaseTX [Boomerang] | ||
| 3068 | 9051 3c905 100BaseT4 [Boomerang] | ||
| 3069 | 9055 3c905B 100BaseTX [Cyclone] | ||
| 3070 | 1028 0080 3C905B Fast Etherlink XL 10/100 | ||
| 3071 | 1028 0081 3C905B Fast Etherlink XL 10/100 | ||
| 3072 | 1028 0082 3C905B Fast Etherlink XL 10/100 | ||
| 3073 | 1028 0083 3C905B Fast Etherlink XL 10/100 | ||
| 3074 | 1028 0084 3C905B Fast Etherlink XL 10/100 | ||
| 3075 | 1028 0085 3C905B Fast Etherlink XL 10/100 | ||
| 3076 | 1028 0086 3C905B Fast Etherlink XL 10/100 | ||
| 3077 | 1028 0087 3C905B Fast Etherlink XL 10/100 | ||
| 3078 | 1028 0088 3C905B Fast Etherlink XL 10/100 | ||
| 3079 | 1028 0089 3C905B Fast Etherlink XL 10/100 | ||
| 3080 | 1028 0090 3C905B Fast Etherlink XL 10/100 | ||
| 3081 | 1028 0091 3C905B Fast Etherlink XL 10/100 | ||
| 3082 | 1028 0092 3C905B Fast Etherlink XL 10/100 | ||
| 3083 | 1028 0093 3C905B Fast Etherlink XL 10/100 | ||
| 3084 | 1028 0094 3C905B Fast Etherlink XL 10/100 | ||
| 3085 | 1028 0095 3C905B Fast Etherlink XL 10/100 | ||
| 3086 | 1028 0096 3C905B Fast Etherlink XL 10/100 | ||
| 3087 | 1028 0097 3C905B Fast Etherlink XL 10/100 | ||
| 3088 | 1028 0098 3C905B Fast Etherlink XL 10/100 | ||
| 3089 | 1028 0099 3C905B Fast Etherlink XL 10/100 | ||
| 3090 | 10b7 9055 3C905B Fast Etherlink XL 10/100 | ||
| 3091 | 9056 3c905B-T4 Fast EtherLink XL [Cyclone] | ||
| 3092 | 9058 3c905B Deluxe Etherlink 10/100/BNC [Cyclone] | ||
| 3093 | 905a 3c905B-FX Fast Etherlink XL FX 100baseFx [Cyclone] | ||
| 3094 | 9200 3c905C-TX/TX-M [Tornado] | ||
| 3095 | 1028 0095 3C920 Integrated Fast Ethernet Controller | ||
| 3096 | 1028 0097 3C920 Integrated Fast Ethernet Controller | ||
| 3097 | 1028 00fe Optiplex GX240 | ||
| 3098 | 1028 012a 3C920 Integrated Fast Ethernet Controller [Latitude C640] | ||
| 3099 | 10b7 1000 3C905C-TX Fast Etherlink for PC Management NIC | ||
| 3100 | 10b7 7000 10/100 Mini PCI Ethernet Adapter | ||
| 3101 | 10f1 2466 Tiger MPX S2466 (3C920 Integrated Fast Ethernet Controller) | ||
| 3102 | 9201 3C920B-EMB Integrated Fast Ethernet Controller [Tornado] | ||
| 3103 | 1043 80ab A7N8X Deluxe onboard 3C920B-EMB Integrated Fast Ethernet Controller | ||
| 3104 | 9202 3Com 3C920B-EMB-WNM Integrated Fast Ethernet Controller | ||
| 3105 | 9210 3C920B-EMB-WNM Integrated Fast Ethernet Controller | ||
| 3106 | 9300 3CSOHO100B-TX 910-A01 [tulip] | ||
| 3107 | 9800 3c980-TX Fast Etherlink XL Server Adapter [Cyclone] | ||
| 3108 | 10b7 9800 3c980-TX Fast Etherlink XL Server Adapter | ||
| 3109 | 9805 3c980-C 10/100baseTX NIC [Python-T] | ||
| 3110 | 10b7 1201 EtherLink Server 10/100 Dual Port A | ||
| 3111 | 10b7 1202 EtherLink Server 10/100 Dual Port B | ||
| 3112 | 10b7 9805 3c980 10/100baseTX NIC [Python-T] | ||
| 3113 | 10f1 2462 Thunder K7 S2462 | ||
| 3114 | 9900 3C990-TX [Typhoon] | ||
| 3115 | 9902 3CR990-TX-95 [Typhoon 56-bit] | ||
| 3116 | 9903 3CR990-TX-97 [Typhoon 168-bit] | ||
| 3117 | 9904 3C990B-TX-M/3C990BSVR [Typhoon2] | ||
| 3118 | 10b7 1000 3CR990B-TX-M [Typhoon2] | ||
| 3119 | 10b7 2000 3CR990BSVR [Typhoon2 Server] | ||
| 3120 | 9905 3CR990-FX-95/97/95 [Typhon Fiber] | ||
| 3121 | 10b7 1101 3CR990-FX-95 [Typhoon Fiber 56-bit] | ||
| 3122 | 10b7 1102 3CR990-FX-97 [Typhoon Fiber 168-bit] | ||
| 3123 | 10b7 2101 3CR990-FX-95 Server [Typhoon Fiber 56-bit] | ||
| 3124 | 10b7 2102 3CR990-FX-97 Server [Typhoon Fiber 168-bit] | ||
| 3125 | 9908 3CR990SVR95 [Typhoon Server 56-bit] | ||
| 3126 | 9909 3CR990SVR97 [Typhoon Server 168-bit] | ||
| 3127 | 990a 3C990SVR [Typhoon Server] | ||
| 3128 | 990b 3C990SVR [Typhoon Server] | ||
| 3129 | 10b8 Standard Microsystems Corp [SMC] | ||
| 3130 | 0005 83c170 EPIC/100 Fast Ethernet Adapter | ||
| 3131 | 1055 e000 LANEPIC 10/100 [EVB171Q-PCI] | ||
| 3132 | 1055 e002 LANEPIC 10/100 [EVB171G-PCI] | ||
| 3133 | 10b8 a011 EtherPower II 10/100 | ||
| 3134 | 10b8 a014 EtherPower II 10/100 | ||
| 3135 | 10b8 a015 EtherPower II 10/100 | ||
| 3136 | 10b8 a016 EtherPower II 10/100 | ||
| 3137 | 10b8 a017 EtherPower II 10/100 | ||
| 3138 | 0006 83c175 EPIC/100 Fast Ethernet Adapter | ||
| 3139 | 1055 e100 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3140 | 1055 e102 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3141 | 1055 e300 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3142 | 1055 e302 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3143 | 10b8 a012 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3144 | 13a2 8002 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3145 | 13a2 8006 LANEPIC Cardbus Fast Ethernet Adapter | ||
| 3146 | 1000 FDC 37c665 | ||
| 3147 | 1001 FDC 37C922 | ||
| 3148 | # 802.11g card | ||
| 3149 | 2802 SMC2802W [EZ Connect g] | ||
| 3150 | a011 83C170QF | ||
| 3151 | b106 SMC34C90 | ||
| 3152 | 10b9 ALi Corporation | ||
| 3153 | 0101 CMI8338/C3DX PCI Audio Device | ||
| 3154 | 0111 C-Media CMI8738/C3DX Audio Device (OEM) | ||
| 3155 | 10b9 0111 C-Media CMI8738/C3DX Audio Device (OEM) | ||
| 3156 | 0780 Multi-IO Card | ||
| 3157 | 0782 Multi-IO Card | ||
| 3158 | 1435 M1435 | ||
| 3159 | 1445 M1445 | ||
| 3160 | 1449 M1449 | ||
| 3161 | 1451 M1451 | ||
| 3162 | 1461 M1461 | ||
| 3163 | 1489 M1489 | ||
| 3164 | 1511 M1511 [Aladdin] | ||
| 3165 | 1512 M1512 [Aladdin] | ||
| 3166 | 1513 M1513 [Aladdin] | ||
| 3167 | 1521 M1521 [Aladdin III] | ||
| 3168 | 10b9 1521 ALI M1521 Aladdin III CPU Bridge | ||
| 3169 | 1523 M1523 | ||
| 3170 | 10b9 1523 ALI M1523 ISA Bridge | ||
| 3171 | 1531 M1531 [Aladdin IV] | ||
| 3172 | 1533 M1533 PCI to ISA Bridge [Aladdin IV] | ||
| 3173 | 1014 053b ThinkPad R40e (2684-HVG) PCI to ISA Bridge | ||
| 3174 | 10b9 1533 ALI M1533 Aladdin IV ISA Bridge | ||
| 3175 | 1541 M1541 | ||
| 3176 | 10b9 1541 ALI M1541 Aladdin V/V+ AGP System Controller | ||
| 3177 | 1543 M1543 | ||
| 3178 | 1563 M1563 HyperTransport South Bridge | ||
| 3179 | 1621 M1621 | ||
| 3180 | 1631 ALI M1631 PCI North Bridge Aladdin Pro III | ||
| 3181 | 1632 M1632M Northbridge+Trident | ||
| 3182 | 1641 ALI M1641 PCI North Bridge Aladdin Pro IV | ||
| 3183 | 1644 M1644/M1644T Northbridge+Trident | ||
| 3184 | 1646 M1646 Northbridge+Trident | ||
| 3185 | 1647 M1647 Northbridge [MAGiK 1 / MobileMAGiK 1] | ||
| 3186 | 1651 M1651/M1651T Northbridge [Aladdin-Pro 5/5M,Aladdin-Pro 5T/5TM] | ||
| 3187 | 1671 M1671 Super P4 Northbridge [AGP4X,PCI and SDR/DDR] | ||
| 3188 | 1672 M1672 Northbridge [CyberALADDiN-P4] | ||
| 3189 | 1681 M1681 P4 Northbridge [AGP8X,HyperTransport and SDR/DDR] | ||
| 3190 | 1687 M1687 K8 Northbridge [AGP8X and HyperTransport] | ||
| 3191 | 1689 M1689 K8 Northbridge [Super K8 Single Chip] | ||
| 3192 | 3141 M3141 | ||
| 3193 | 3143 M3143 | ||
| 3194 | 3145 M3145 | ||
| 3195 | 3147 M3147 | ||
| 3196 | 3149 M3149 | ||
| 3197 | 3151 M3151 | ||
| 3198 | 3307 M3307 | ||
| 3199 | 3309 M3309 | ||
| 3200 | 3323 M3325 Video/Audio Decoder | ||
| 3201 | 5212 M4803 | ||
| 3202 | 5215 MS4803 | ||
| 3203 | 5217 M5217H | ||
| 3204 | 5219 M5219 | ||
| 3205 | 5225 M5225 | ||
| 3206 | 5228 M5228 ALi ATA/RAID Controller | ||
| 3207 | 5229 M5229 IDE | ||
| 3208 | 1014 050f ThinkPad R30 | ||
| 3209 | 1014 053d ThinkPad R40e (2684-HVG) builtin IDE | ||
| 3210 | 103c 0024 Pavilion ze4400 builtin IDE | ||
| 3211 | 1043 8053 A7A266 Motherboard IDE | ||
| 3212 | 5235 M5225 | ||
| 3213 | 5237 USB 1.1 Controller | ||
| 3214 | 1014 0540 ThinkPad R40e (2684-HVG) builtin USB | ||
| 3215 | 103c 0024 Pavilion ze4400 builtin USB | ||
| 3216 | 5239 USB 2.0 Controller | ||
| 3217 | 5243 M1541 PCI to AGP Controller | ||
| 3218 | 5246 AGP8X Controller | ||
| 3219 | 5247 PCI to AGP Controller | ||
| 3220 | 5249 M5249 HTT to PCI Bridge | ||
| 3221 | 5251 M5251 P1394 OHCI 1.0 Controller | ||
| 3222 | 5253 M5253 P1394 OHCI 1.1 Controller | ||
| 3223 | 5261 M5261 Ethernet Controller | ||
| 3224 | 5263 M5263 Ethernet Controller | ||
| 3225 | 5281 ALi M5281 Serial ATA / RAID Host Controller | ||
| 3226 | 5287 ULi 5287 SATA | ||
| 3227 | 5289 ULi 5289 SATA | ||
| 3228 | 5450 Lucent Technologies Soft Modem AMR | ||
| 3229 | 5451 M5451 PCI AC-Link Controller Audio Device | ||
| 3230 | 1014 0506 ThinkPad R30 | ||
| 3231 | 1014 053e ThinkPad R40e (2684-HVG) builtin Audio | ||
| 3232 | 103c 0024 Pavilion ze4400 builtin Audio | ||
| 3233 | 10b9 5451 HP Compaq nc4010 (DY885AA#ABN) | ||
| 3234 | 5453 M5453 PCI AC-Link Controller Modem Device | ||
| 3235 | 5455 M5455 PCI AC-Link Controller Audio Device | ||
| 3236 | 5457 M5457 AC'97 Modem Controller | ||
| 3237 | 1014 0535 ThinkPad R40e (2684-HVG) builtin modem | ||
| 3238 | 103c 0024 Pavilion ze4400 builtin Modem Device | ||
| 3239 | # Same but more usefull for driver's lookup | ||
| 3240 | 5459 SmartLink SmartPCI561 56K Modem | ||
| 3241 | # SmartLink PCI SoftModem | ||
| 3242 | 545a SmartLink SmartPCI563 56K Modem | ||
| 3243 | 5471 M5471 Memory Stick Controller | ||
| 3244 | 5473 M5473 SD-MMC Controller | ||
| 3245 | 7101 M7101 Power Management Controller [PMU] | ||
| 3246 | 1014 0510 ThinkPad R30 | ||
| 3247 | 1014 053c ThinkPad R40e (2684-HVG) Power Management Controller | ||
| 3248 | 103c 0024 Pavilion ze4400 | ||
| 3249 | 10ba Mitsubishi Electric Corp. | ||
| 3250 | 0301 AccelGraphics AccelECLIPSE | ||
| 3251 | 0304 AccelGALAXY A2100 [OEM Evans & Sutherland] | ||
| 3252 | 0308 Tornado 3000 [OEM Evans & Sutherland] | ||
| 3253 | 1002 VG500 [VolumePro Volume Rendering Accelerator] | ||
| 3254 | 10bb Dapha Electronics Corporation | ||
| 3255 | 10bc Advanced Logic Research | ||
| 3256 | 10bd Surecom Technology | ||
| 3257 | 0e34 NE-34 | ||
| 3258 | 10be Tseng Labs International Co. | ||
| 3259 | 10bf Most Inc | ||
| 3260 | 10c0 Boca Research Inc. | ||
| 3261 | 10c1 ICM Co., Ltd. | ||
| 3262 | 10c2 Auspex Systems Inc. | ||
| 3263 | 10c3 Samsung Semiconductors, Inc. | ||
| 3264 | 1100 Smartether100 SC1100 LAN Adapter (i82557B) | ||
| 3265 | 10c4 Award Software International Inc. | ||
| 3266 | 10c5 Xerox Corporation | ||
| 3267 | 10c6 Rambus Inc. | ||
| 3268 | 10c7 Media Vision | ||
| 3269 | 10c8 Neomagic Corporation | ||
| 3270 | 0001 NM2070 [MagicGraph 128] | ||
| 3271 | 0002 NM2090 [MagicGraph 128V] | ||
| 3272 | 0003 NM2093 [MagicGraph 128ZV] | ||
| 3273 | 0004 NM2160 [MagicGraph 128XD] | ||
| 3274 | 1014 00ba MagicGraph 128XD | ||
| 3275 | 1025 1007 MagicGraph 128XD | ||
| 3276 | 1028 0074 MagicGraph 128XD | ||
| 3277 | 1028 0075 MagicGraph 128XD | ||
| 3278 | 1028 007d MagicGraph 128XD | ||
| 3279 | 1028 007e MagicGraph 128XD | ||
| 3280 | 1033 802f MagicGraph 128XD | ||
| 3281 | 104d 801b MagicGraph 128XD | ||
| 3282 | 104d 802f MagicGraph 128XD | ||
| 3283 | 104d 830b MagicGraph 128XD | ||
| 3284 | 10ba 0e00 MagicGraph 128XD | ||
| 3285 | 10c8 0004 MagicGraph 128XD | ||
| 3286 | 10cf 1029 MagicGraph 128XD | ||
| 3287 | 10f7 8308 MagicGraph 128XD | ||
| 3288 | 10f7 8309 MagicGraph 128XD | ||
| 3289 | 10f7 830b MagicGraph 128XD | ||
| 3290 | 10f7 830d MagicGraph 128XD | ||
| 3291 | 10f7 8312 MagicGraph 128XD | ||
| 3292 | 0005 NM2200 [MagicGraph 256AV] | ||
| 3293 | 1014 00dd ThinkPad 570 | ||
| 3294 | 1028 0088 Latitude CPi A | ||
| 3295 | 0006 NM2360 [MagicMedia 256ZX] | ||
| 3296 | 0016 NM2380 [MagicMedia 256XL+] | ||
| 3297 | 10c8 0016 MagicMedia 256XL+ | ||
| 3298 | 0025 NM2230 [MagicGraph 256AV+] | ||
| 3299 | 0083 NM2093 [MagicGraph 128ZV+] | ||
| 3300 | 8005 NM2200 [MagicMedia 256AV Audio] | ||
| 3301 | 0e11 b0d1 MagicMedia 256AV Audio Device on Discovery | ||
| 3302 | 0e11 b126 MagicMedia 256AV Audio Device on Durango | ||
| 3303 | 1014 00dd MagicMedia 256AV Audio Device on BlackTip Thinkpad | ||
| 3304 | 1025 1003 MagicMedia 256AV Audio Device on TravelMate 720 | ||
| 3305 | 1028 0088 Latitude CPi A | ||
| 3306 | 1028 008f MagicMedia 256AV Audio Device on Colorado Inspiron | ||
| 3307 | 103c 0007 MagicMedia 256AV Audio Device on Voyager II | ||
| 3308 | 103c 0008 MagicMedia 256AV Audio Device on Voyager III | ||
| 3309 | 103c 000d MagicMedia 256AV Audio Device on Omnibook 900 | ||
| 3310 | 10c8 8005 MagicMedia 256AV Audio Device on FireAnt | ||
| 3311 | 110a 8005 MagicMedia 256AV Audio Device | ||
| 3312 | 14c0 0004 MagicMedia 256AV Audio Device | ||
| 3313 | 8006 NM2360 [MagicMedia 256ZX Audio] | ||
| 3314 | 8016 NM2380 [MagicMedia 256XL+ Audio] | ||
| 3315 | 10c9 Dataexpert Corporation | ||
| 3316 | 10ca Fujitsu Microelectr., Inc. | ||
| 3317 | 10cb Omron Corporation | ||
| 3318 | # nee Mentor ARC Inc | ||
| 3319 | 10cc Mai Logic Incorporated | ||
| 3320 | 0660 Articia S Host Bridge | ||
| 3321 | 0661 Articia S PCI Bridge | ||
| 3322 | 10cd Advanced System Products, Inc | ||
| 3323 | 1100 ASC1100 | ||
| 3324 | 1200 ASC1200 [(abp940) Fast SCSI-II] | ||
| 3325 | 1300 ABP940-U / ABP960-U | ||
| 3326 | 10cd 1310 ASC1300 SCSI Adapter | ||
| 3327 | 2300 ABP940-UW | ||
| 3328 | 2500 ABP940-U2W | ||
| 3329 | 10ce Radius | ||
| 3330 | # nee Citicorp TTI | ||
| 3331 | 10cf Fujitsu Limited. | ||
| 3332 | 2001 mb86605 | ||
| 3333 | 10d1 FuturePlus Systems Corp. | ||
| 3334 | 10d2 Molex Incorporated | ||
| 3335 | 10d3 Jabil Circuit Inc | ||
| 3336 | 10d4 Hualon Microelectronics | ||
| 3337 | 10d5 Autologic Inc. | ||
| 3338 | 10d6 Cetia | ||
| 3339 | 10d7 BCM Advanced Research | ||
| 3340 | 10d8 Advanced Peripherals Labs | ||
| 3341 | 10d9 Macronix, Inc. [MXIC] | ||
| 3342 | 0431 MX98715 | ||
| 3343 | 0512 MX98713 | ||
| 3344 | 0531 MX987x5 | ||
| 3345 | 1186 1200 DFE-540TX ProFAST 10/100 Adapter | ||
| 3346 | 8625 MX86250 | ||
| 3347 | 8888 MX86200 | ||
| 3348 | 10da Compaq IPG-Austin | ||
| 3349 | 0508 TC4048 Token Ring 4/16 | ||
| 3350 | 3390 Tl3c3x9 | ||
| 3351 | 10db Rohm LSI Systems, Inc. | ||
| 3352 | 10dc CERN/ECP/EDU | ||
| 3353 | 0001 STAR/RD24 SCI-PCI (PMC) | ||
| 3354 | 0002 TAR/RD24 SCI-PCI (PMC) | ||
| 3355 | 0021 HIPPI destination | ||
| 3356 | 0022 HIPPI source | ||
| 3357 | 10dc ATT2C15-3 FPGA | ||
| 3358 | 10dd Evans & Sutherland | ||
| 3359 | 10de nVidia Corporation | ||
| 3360 | 0008 NV1 [EDGE 3D] | ||
| 3361 | 0009 NV1 [EDGE 3D] | ||
| 3362 | 0010 NV2 [Mutara V08] | ||
| 3363 | 0020 NV4 [RIVA TNT] | ||
| 3364 | 1043 0200 V3400 TNT | ||
| 3365 | 1048 0c18 Erazor II SGRAM | ||
| 3366 | 1048 0c1b Erazor II | ||
| 3367 | 1092 0550 Viper V550 | ||
| 3368 | 1092 0552 Viper V550 | ||
| 3369 | 1092 4804 Viper V550 | ||
| 3370 | 1092 4808 Viper V550 | ||
| 3371 | 1092 4810 Viper V550 | ||
| 3372 | 1092 4812 Viper V550 | ||
| 3373 | 1092 4815 Viper V550 | ||
| 3374 | 1092 4820 Viper V550 with TV out | ||
| 3375 | 1092 4822 Viper V550 | ||
| 3376 | 1092 4904 Viper V550 | ||
| 3377 | 1092 4914 Viper V550 | ||
| 3378 | 1092 8225 Viper V550 | ||
| 3379 | 10b4 273d Velocity 4400 | ||
| 3380 | 10b4 273e Velocity 4400 | ||
| 3381 | 10b4 2740 Velocity 4400 | ||
| 3382 | 10de 0020 Riva TNT | ||
| 3383 | 1102 1015 Graphics Blaster CT6710 | ||
| 3384 | 1102 1016 Graphics Blaster RIVA TNT | ||
| 3385 | 0028 NV5 [RIVA TNT2/TNT2 Pro] | ||
| 3386 | 1043 0200 AGP-V3800 SGRAM | ||
| 3387 | 1043 0201 AGP-V3800 SDRAM | ||
| 3388 | 1043 0205 PCI-V3800 | ||
| 3389 | 1043 4000 AGP-V3800PRO | ||
| 3390 | 1048 0c21 Synergy II | ||
| 3391 | 1048 0c31 Erazor III | ||
| 3392 | 107d 2134 WinFast 3D S320 II + TV-Out | ||
| 3393 | 1092 4804 Viper V770 | ||
| 3394 | 1092 4a00 Viper V770 | ||
| 3395 | 1092 4a02 Viper V770 Ultra | ||
| 3396 | 1092 5a00 RIVA TNT2/TNT2 Pro | ||
| 3397 | 1092 6a02 Viper V770 Ultra | ||
| 3398 | 1092 7a02 Viper V770 Ultra | ||
| 3399 | 10de 0005 RIVA TNT2 Pro | ||
| 3400 | 10de 000f Compaq NVIDIA TNT2 Pro | ||
| 3401 | 1102 1020 3D Blaster RIVA TNT2 | ||
| 3402 | 1102 1026 3D Blaster RIVA TNT2 Digital | ||
| 3403 | 14af 5810 Maxi Gamer Xentor | ||
| 3404 | 0029 NV5 [RIVA TNT2 Ultra] | ||
| 3405 | 1043 0200 AGP-V3800 Deluxe | ||
| 3406 | 1043 0201 AGP-V3800 Ultra SDRAM | ||
| 3407 | 1043 0205 PCI-V3800 Ultra | ||
| 3408 | 1102 1021 3D Blaster RIVA TNT2 Ultra | ||
| 3409 | 1102 1029 3D Blaster RIVA TNT2 Ultra | ||
| 3410 | 1102 102f 3D Blaster RIVA TNT2 Ultra | ||
| 3411 | 14af 5820 Maxi Gamer Xentor 32 | ||
| 3412 | 002a NV5 [Riva TnT2] | ||
| 3413 | 002b NV5 [Riva TnT2] | ||
| 3414 | 002c NV6 [Vanta/Vanta LT] | ||
| 3415 | 1043 0200 AGP-V3800 Combat SDRAM | ||
| 3416 | 1043 0201 AGP-V3800 Combat | ||
| 3417 | 1092 6820 Viper V730 | ||
| 3418 | 1102 1031 CT6938 VANTA 8MB | ||
| 3419 | 1102 1034 CT6894 VANTA 16MB | ||
| 3420 | 14af 5008 Maxi Gamer Phoenix 2 | ||
| 3421 | 002d NV5M64 [RIVA TNT2 Model 64/Model 64 Pro] | ||
| 3422 | 1043 0200 AGP-V3800M | ||
| 3423 | 1043 0201 AGP-V3800M | ||
| 3424 | 1048 0c3a Erazor III LT | ||
| 3425 | 10de 001e M64 AGP4x | ||
| 3426 | 1102 1023 CT6892 RIVA TNT2 Value | ||
| 3427 | 1102 1024 CT6932 RIVA TNT2 Value 32Mb | ||
| 3428 | 1102 102c CT6931 RIVA TNT2 Value [Jumper] | ||
| 3429 | 1462 8808 MSI-8808 | ||
| 3430 | 1554 1041 Pixelview RIVA TNT2 M64 | ||
| 3431 | 1569 002d Palit Microsystems Daytona TNT2 M64 | ||
| 3432 | 002e NV6 [Vanta] | ||
| 3433 | 002f NV6 [Vanta] | ||
| 3434 | 0034 MCP04 SMBus | ||
| 3435 | 0035 MCP04 IDE | ||
| 3436 | 0036 MCP04 Serial ATA Controller | ||
| 3437 | 0037 MCP04 Ethernet Controller | ||
| 3438 | 0038 MCP04 Ethernet Controller | ||
| 3439 | 003a MCP04 AC'97 Audio Controller | ||
| 3440 | 003b MCP04 USB Controller | ||
| 3441 | 003c MCP04 USB Controller | ||
| 3442 | 003d MCP04 PCI Bridge | ||
| 3443 | 003e MCP04 Serial ATA Controller | ||
| 3444 | 0040 nv40 [GeForce 6800 Ultra] | ||
| 3445 | 0041 NV40 [GeForce 6800] | ||
| 3446 | 0042 NV40.2 | ||
| 3447 | 0043 NV40.3 | ||
| 3448 | 0045 NV40 [GeForce 6800 GT] | ||
| 3449 | 0049 NV40GL | ||
| 3450 | 004e NV40GL [Quadro FX 4000] | ||
| 3451 | 0051 CK804 ISA Bridge | ||
| 3452 | 0052 CK804 SMBus | ||
| 3453 | 0053 CK804 IDE | ||
| 3454 | 0054 CK804 Serial ATA Controller | ||
| 3455 | 0055 CK804 Serial ATA Controller | ||
| 3456 | 0056 CK804 Ethernet Controller | ||
| 3457 | 0057 CK804 Ethernet Controller | ||
| 3458 | 0059 CK804 AC'97 Audio Controller | ||
| 3459 | 005a CK804 USB Controller | ||
| 3460 | 005b CK804 USB Controller | ||
| 3461 | 005c CK804 PCI Bridge | ||
| 3462 | 005d CK804 PCIE Bridge | ||
| 3463 | 005e CK804 Memory Controller | ||
| 3464 | 0060 nForce2 ISA Bridge | ||
| 3465 | 1043 80ad A7N8X Mainboard | ||
| 3466 | 0064 nForce2 SMBus (MCP) | ||
| 3467 | 0065 nForce2 IDE | ||
| 3468 | 0066 nForce2 Ethernet Controller | ||
| 3469 | 1043 80a7 A7N8X Mainboard onboard nForce2 Ethernet | ||
| 3470 | 0067 nForce2 USB Controller | ||
| 3471 | 1043 0c11 A7N8X Mainboard | ||
| 3472 | 0068 nForce2 USB Controller | ||
| 3473 | 1043 0c11 A7N8X Mainboard | ||
| 3474 | 006a nForce2 AC97 Audio Controler (MCP) | ||
| 3475 | 006b nForce Audio Processing Unit | ||
| 3476 | 10de 006b nForce2 MCP Audio Processing Unit | ||
| 3477 | 006c nForce2 External PCI Bridge | ||
| 3478 | 006d nForce2 PCI Bridge | ||
| 3479 | 006e nForce2 FireWire (IEEE 1394) Controller | ||
| 3480 | 0084 MCP2A SMBus | ||
| 3481 | 0085 MCP2A IDE | ||
| 3482 | 0086 MCP2A Ethernet Controller | ||
| 3483 | 0087 MCP2A USB Controller | ||
| 3484 | 0088 MCP2A USB Controller | ||
| 3485 | 008a MCP2S AC'97 Audio Controller | ||
| 3486 | 008b MCP2A PCI Bridge | ||
| 3487 | 008c MCP2A Ethernet Controller | ||
| 3488 | 008e nForce2 Serial ATA Controller | ||
| 3489 | 00a0 NV5 [Aladdin TNT2] | ||
| 3490 | 14af 5810 Maxi Gamer Xentor | ||
| 3491 | 00c0 NV41.0 | ||
| 3492 | 00c1 NV41.1 | ||
| 3493 | 00c2 NV41.2 | ||
| 3494 | 00c8 NV41.8 | ||
| 3495 | 00ce NV41GL | ||
| 3496 | 00d0 nForce3 LPC Bridge | ||
| 3497 | 00d1 nForce3 Host Bridge | ||
| 3498 | 00d2 nForce3 AGP Bridge | ||
| 3499 | 00d3 CK804 Memory Controller | ||
| 3500 | 00d4 nForce3 SMBus | ||
| 3501 | 00d5 nForce3 IDE | ||
| 3502 | 00d6 nForce3 Ethernet | ||
| 3503 | 00d7 nForce3 USB 1.1 | ||
| 3504 | 00d8 nForce3 USB 2.0 | ||
| 3505 | 00da nForce3 Audio | ||
| 3506 | 00dd nForce3 PCI Bridge | ||
| 3507 | 00df CK8S Ethernet Controller | ||
| 3508 | 00e0 nForce3 250Gb LPC Bridge | ||
| 3509 | 00e1 nForce3 250Gb Host Bridge | ||
| 3510 | 00e2 nForce3 250Gb AGP Host to PCI Bridge | ||
| 3511 | 00e3 CK8S Serial ATA Controller (v2.5) | ||
| 3512 | 00e4 nForce 250Gb PCI System Management | ||
| 3513 | 00e5 CK8S Parallel ATA Controller (v2.5) | ||
| 3514 | 00e6 CK8S Ethernet Controller | ||
| 3515 | 00e7 CK8S USB Controller | ||
| 3516 | 00e8 nForce3 EHCI USB 2.0 Controller | ||
| 3517 | 00ea nForce3 250Gb AC'97 Audio Controller | ||
| 3518 | 00ed nForce3 250Gb PCI-to-PCI Bridge | ||
| 3519 | 00ee CK8S Serial ATA Controller (v2.5) | ||
| 3520 | 00f0 NV40 [GeForce 6800/GeForce 6800 Ultra] | ||
| 3521 | 00f1 NV43 [GeForce 6600/GeForce 6600 GT] | ||
| 3522 | 00f2 NV43 [GeForce 6600 GT] | ||
| 3523 | 00f8 NV45GL [Quadro FX 3400] | ||
| 3524 | 00f9 NV40 [GeForce 6800 Ultra/GeForce 6800 GT] | ||
| 3525 | 1682 2120 GEFORCE 6800 GT PCI-E | ||
| 3526 | 00fa NV36 [GeForce PCX 5750] | ||
| 3527 | 00fb NV35 [GeForce PCX 5900] | ||
| 3528 | 00fc NV37GL [Quadro FX 330/GeForce PCX 5300] | ||
| 3529 | 00fd NV37GL [Quadro FX 330] | ||
| 3530 | 00fe NV38GL [Quadro FX 1300] | ||
| 3531 | 00ff NV18 [GeForce PCX 4300] | ||
| 3532 | 0100 NV10 [GeForce 256 SDR] | ||
| 3533 | 1043 0200 AGP-V6600 SGRAM | ||
| 3534 | 1043 0201 AGP-V6600 SDRAM | ||
| 3535 | 1043 4008 AGP-V6600 SGRAM | ||
| 3536 | 1043 4009 AGP-V6600 SDRAM | ||
| 3537 | 1102 102d CT6941 GeForce 256 | ||
| 3538 | 14af 5022 3D Prophet SE | ||
| 3539 | 0101 NV10DDR [GeForce 256 DDR] | ||
| 3540 | 1043 0202 AGP-V6800 DDR | ||
| 3541 | 1043 400a AGP-V6800 DDR SGRAM | ||
| 3542 | 1043 400b AGP-V6800 DDR SDRAM | ||
| 3543 | 107d 2822 WinFast GeForce 256 | ||
| 3544 | 1102 102e CT6971 GeForce 256 DDR | ||
| 3545 | 14af 5021 3D Prophet DDR-DVI | ||
| 3546 | 0103 NV10GL [Quadro] | ||
| 3547 | 0110 NV11 [GeForce2 MX/MX 400] | ||
| 3548 | 1043 4015 AGP-V7100 Pro | ||
| 3549 | 1043 4031 V7100 Pro with TV output | ||
| 3550 | 10de 0091 Dell OEM GeForce 2 MX 400 | ||
| 3551 | 1462 8817 MSI GeForce2 MX400 Pro32S [MS-8817] | ||
| 3552 | 14af 7102 3D Prophet II MX | ||
| 3553 | 14af 7103 3D Prophet II MX Dual-Display | ||
| 3554 | 0111 NV11DDR [GeForce2 MX 100 DDR/200 DDR] | ||
| 3555 | 0112 NV11 [GeForce2 Go] | ||
| 3556 | 0113 NV11GL [Quadro2 MXR/EX] | ||
| 3557 | 0140 NV43 [MSI NX6600GT-TD128E] | ||
| 3558 | 014f NV43 [GeForce 6200] | ||
| 3559 | 0150 NV15 [GeForce2 GTS/Pro] | ||
| 3560 | 1043 4016 V7700 AGP Video Card | ||
| 3561 | 107d 2840 WinFast GeForce2 GTS with TV output | ||
| 3562 | 107d 2842 WinFast GeForce 2 Pro | ||
| 3563 | 1462 8831 Creative GeForce2 Pro | ||
| 3564 | 0151 NV15DDR [GeForce2 Ti] | ||
| 3565 | 1043 405f V7700Ti | ||
| 3566 | 1462 5506 Creative 3D Blaster Geforce2 Titanium | ||
| 3567 | 0152 NV15BR [GeForce2 Ultra, Bladerunner] | ||
| 3568 | 1048 0c56 GLADIAC Ultra | ||
| 3569 | 0153 NV15GL [Quadro2 Pro] | ||
| 3570 | 0170 NV17 [GeForce4 MX 460] | ||
| 3571 | 0171 NV17 [GeForce4 MX 440] | ||
| 3572 | 10b0 0002 Gainward Pro/600 TV | ||
| 3573 | 1462 8661 G4MX440-VTP | ||
| 3574 | 1462 8730 MX440SES-T (MS-8873) | ||
| 3575 | 147b 8f00 Abit Siluro GeForce4MX440 | ||
| 3576 | 0172 NV17 [GeForce4 MX 420] | ||
| 3577 | 0173 NV17 [GeForce4 MX 440-SE] | ||
| 3578 | 0174 NV17 [GeForce4 440 Go] | ||
| 3579 | 0175 NV17 [GeForce4 420 Go] | ||
| 3580 | 0176 NV17 [GeForce4 420 Go 32M] | ||
| 3581 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 3582 | 0177 NV17 [GeForce4 460 Go] | ||
| 3583 | 0178 NV17GL [Quadro4 550 XGL] | ||
| 3584 | 0179 NV17 [GeForce4 440 Go 64M] | ||
| 3585 | 10de 0179 GeForce4 MX (Mac) | ||
| 3586 | 017a NV17GL [Quadro4 200/400 NVS] | ||
| 3587 | 017b NV17GL [Quadro4 550 XGL] | ||
| 3588 | 017c NV17GL [Quadro4 550 GoGL] | ||
| 3589 | 017d NV17 [GeForce4 410 Go 16M] | ||
| 3590 | 0181 NV18 [GeForce4 MX 440 AGP 8x] | ||
| 3591 | 1043 806f V9180 Magic | ||
| 3592 | 1462 8880 MS-StarForce GeForce4 MX 440 with AGP8X | ||
| 3593 | 1462 8900 MS-8890 GeForce 4 MX440 AGP8X | ||
| 3594 | 1462 9350 MSI Geforce4 MX T8X with AGP8X | ||
| 3595 | 147b 8f0d Siluro GF4 MX-8X | ||
| 3596 | 0182 NV18 [GeForce4 MX 440SE AGP 8x] | ||
| 3597 | 0183 NV18 [GeForce4 MX 420 AGP 8x] | ||
| 3598 | 0185 NV18 [GeForce4 MX 4000 AGP 8x] | ||
| 3599 | 0186 NV18M [GeForce4 448 Go] | ||
| 3600 | 0187 NV18M [GeForce4 488 Go] | ||
| 3601 | 0188 NV18GL [Quadro4 580 XGL] | ||
| 3602 | 018a NV18GL [Quadro4 NVS AGP 8x] | ||
| 3603 | 018b NV18GL [Quadro4 380 XGL] | ||
| 3604 | 018d NV18M [GeForce4 448 Go] | ||
| 3605 | 01a0 NVCrush11 [GeForce2 MX Integrated Graphics] | ||
| 3606 | 01a4 nForce CPU bridge | ||
| 3607 | 01ab nForce 420 Memory Controller (DDR) | ||
| 3608 | 01ac nForce 220/420 Memory Controller | ||
| 3609 | 01ad nForce 220/420 Memory Controller | ||
| 3610 | 01b0 nForce Audio | ||
| 3611 | 01b1 nForce Audio | ||
| 3612 | 01b2 nForce ISA Bridge | ||
| 3613 | 01b4 nForce PCI System Management | ||
| 3614 | 01b7 nForce AGP to PCI Bridge | ||
| 3615 | 01b8 nForce PCI-to-PCI bridge | ||
| 3616 | 01bc nForce IDE | ||
| 3617 | 01c1 nForce AC'97 Modem Controller | ||
| 3618 | 01c2 nForce USB Controller | ||
| 3619 | 01c3 nForce Ethernet Controller | ||
| 3620 | 01e0 nForce2 AGP (different version?) | ||
| 3621 | 01e8 nForce2 AGP | ||
| 3622 | 01ea nForce2 Memory Controller 0 | ||
| 3623 | 01eb nForce2 Memory Controller 1 | ||
| 3624 | 01ec nForce2 Memory Controller 2 | ||
| 3625 | 01ed nForce2 Memory Controller 3 | ||
| 3626 | 01ee nForce2 Memory Controller 4 | ||
| 3627 | 01ef nForce2 Memory Controller 5 | ||
| 3628 | 01f0 NV18 [GeForce4 MX - nForce GPU] | ||
| 3629 | 0200 NV20 [GeForce3] | ||
| 3630 | 1043 402f AGP-V8200 DDR | ||
| 3631 | 0201 NV20 [GeForce3 Ti 200] | ||
| 3632 | 0202 NV20 [GeForce3 Ti 500] | ||
| 3633 | 1043 405b V8200 T5 | ||
| 3634 | 1545 002f Xtasy 6964 | ||
| 3635 | 0203 NV20DCC [Quadro DCC] | ||
| 3636 | 0240 C51 PCI Express Bridge | ||
| 3637 | 0241 C51 PCI Express Bridge | ||
| 3638 | 0242 C51 PCI Express Bridge | ||
| 3639 | 0243 C51 PCI Express Bridge | ||
| 3640 | 0244 C51 PCI Express Bridge | ||
| 3641 | 0245 C51 PCI Express Bridge | ||
| 3642 | 0246 C51 PCI Express Bridge | ||
| 3643 | 0247 C51 PCI Express Bridge | ||
| 3644 | 0248 C51 PCI Express Bridge | ||
| 3645 | 0249 C51 PCI Express Bridge | ||
| 3646 | 024a C51 PCI Express Bridge | ||
| 3647 | 024b C51 PCI Express Bridge | ||
| 3648 | 024c C51 PCI Express Bridge | ||
| 3649 | 024d C51 PCI Express Bridge | ||
| 3650 | 024e C51 PCI Express Bridge | ||
| 3651 | 024f C51 PCI Express Bridge | ||
| 3652 | 0250 NV25 [GeForce4 Ti 4600] | ||
| 3653 | 0251 NV25 [GeForce4 Ti 4400] | ||
| 3654 | 1043 8023 v8440 GeForce 4 Ti4400 | ||
| 3655 | 0252 NV25 [GeForce4 Ti] | ||
| 3656 | 0253 NV25 [GeForce4 Ti 4200] | ||
| 3657 | 107d 2896 WinFast A250 LE TD (Dual VGA/TV-out/DVI) | ||
| 3658 | 147b 8f09 Siluro (Dual VGA/TV-out/DVI) | ||
| 3659 | 0258 NV25GL [Quadro4 900 XGL] | ||
| 3660 | 0259 NV25GL [Quadro4 750 XGL] | ||
| 3661 | 025b NV25GL [Quadro4 700 XGL] | ||
| 3662 | 0260 MCP51 LPC Bridge | ||
| 3663 | 0261 MCP51 LPC Bridge | ||
| 3664 | 0262 MCP51 LPC Bridge | ||
| 3665 | 0263 MCP51 LPC Bridge | ||
| 3666 | 0264 MCP51 SMBus | ||
| 3667 | 0265 MCP51 IDE | ||
| 3668 | 0266 MCP51 Serial ATA Controller | ||
| 3669 | 0267 MCP51 Serial ATA Controller | ||
| 3670 | 0268 MCP51 Ethernet Controller | ||
| 3671 | 0269 MCP51 Ethernet Controller | ||
| 3672 | 026a MCP51 MCI | ||
| 3673 | 026b MCP51 AC97 Audio Controller | ||
| 3674 | 026c MCP51 High Definition Audio | ||
| 3675 | 026d MCP51 USB Controller | ||
| 3676 | 026e MCP51 USB Controller | ||
| 3677 | 026f MCP51 PCI Bridge | ||
| 3678 | 0270 MCP51 Host Bridge | ||
| 3679 | 0271 MCP51 PMU | ||
| 3680 | 0272 MCP51 Memory Controller 0 | ||
| 3681 | 027e C51 Memory Controller 2 | ||
| 3682 | 027f C51 Memory Controller 3 | ||
| 3683 | 0280 NV28 [GeForce4 Ti 4800] | ||
| 3684 | 0281 NV28 [GeForce4 Ti 4200 AGP 8x] | ||
| 3685 | 0282 NV28 [GeForce4 Ti 4800 SE] | ||
| 3686 | 0286 NV28 [GeForce4 Ti 4200 Go AGP 8x] | ||
| 3687 | 0288 NV28GL [Quadro4 980 XGL] | ||
| 3688 | 0289 NV28GL [Quadro4 780 XGL] | ||
| 3689 | 028c NV28GLM [Quadro4 700 GoGL] | ||
| 3690 | 02f0 C51 Host Bridge | ||
| 3691 | 02f1 C51 Host Bridge | ||
| 3692 | 02f2 C51 Host Bridge | ||
| 3693 | 02f3 C51 Host Bridge | ||
| 3694 | 02f4 C51 Host Bridge | ||
| 3695 | 02f5 C51 Host Bridge | ||
| 3696 | 02f6 C51 Host Bridge | ||
| 3697 | 02f7 C51 Host Bridge | ||
| 3698 | 02f8 C51 Memory Controller 5 | ||
| 3699 | 02f9 C51 Memory Controller 4 | ||
| 3700 | 02fa C51 Memory Controller 0 | ||
| 3701 | 02fb C51 PCI Express Bridge | ||
| 3702 | 02fc C51 PCI Express Bridge | ||
| 3703 | 02fd C51 PCI Express Bridge | ||
| 3704 | 02fe C51 Memory Controller 1 | ||
| 3705 | 02ff C51 Host Bridge | ||
| 3706 | 0300 NV30 [GeForce FX] | ||
| 3707 | 0301 NV30 [GeForce FX 5800 Ultra] | ||
| 3708 | 0302 NV30 [GeForce FX 5800] | ||
| 3709 | 0308 NV30GL [Quadro FX 2000] | ||
| 3710 | 0309 NV30GL [Quadro FX 1000] | ||
| 3711 | 0311 NV31 [GeForce FX 5600 Ultra] | ||
| 3712 | 0312 NV31 [GeForce FX 5600] | ||
| 3713 | 0313 NV31 | ||
| 3714 | 0314 NV31 [GeForce FX 5600XT] | ||
| 3715 | 1043 814a V9560XT/TD | ||
| 3716 | 0316 NV31 | ||
| 3717 | 0317 NV31 | ||
| 3718 | 031a NV31M [GeForce FX Go 5600] | ||
| 3719 | 031b NV31M [GeForce FX Go5650] | ||
| 3720 | 031c NVIDIA Quadro FX 700 Go | ||
| 3721 | 031d NV31 | ||
| 3722 | 031e NV31 | ||
| 3723 | 031f NV31 | ||
| 3724 | 0320 NV34 [GeForce FX 5200] | ||
| 3725 | 0321 NV34 [GeForce FX 5200 Ultra] | ||
| 3726 | 0322 NV34 [GeForce FX 5200] | ||
| 3727 | 1462 9171 MS-8917 (FX5200-T128) | ||
| 3728 | 0323 NV34 [GeForce FX 5200LE] | ||
| 3729 | 0324 NV34M [GeForce FX Go 5200] | ||
| 3730 | 1071 8160 MIM2000 | ||
| 3731 | 0325 NV34M [GeForce FX Go5250] | ||
| 3732 | 0326 NV34 [GeForce FX 5500] | ||
| 3733 | 0327 NV34 [GeForce FX 5100] | ||
| 3734 | 0328 NV34M [GeForce FX Go 5200] | ||
| 3735 | 0329 NV34M [GeForce FX Go5200] | ||
| 3736 | 032a NV34GL [Quadro NVS 280 PCI] | ||
| 3737 | 032b NV34GL [Quadro FX 500/600 PCI] | ||
| 3738 | 032c NV34GLM [GeForce FX Go 5300] | ||
| 3739 | 032d NV34 [GeForce FX Go5100] | ||
| 3740 | 032f NV34 | ||
| 3741 | 0330 NV35 [GeForce FX 5900 Ultra] | ||
| 3742 | 0331 NV35 [GeForce FX 5900] | ||
| 3743 | 1043 8145 V9950GE | ||
| 3744 | 0332 NV35 [GeForce FX 5900XT] | ||
| 3745 | 0333 NV38 [GeForce FX 5950 Ultra] | ||
| 3746 | 0334 NV35 [GeForce FX 5900ZT] | ||
| 3747 | 0338 NV35GL [Quadro FX 3000] | ||
| 3748 | 033f NV35GL [Quadro FX 700] | ||
| 3749 | 0341 NV36.1 [GeForce FX 5700 Ultra] | ||
| 3750 | 0342 NV36.2 [GeForce FX 5700] | ||
| 3751 | 0343 NV36 [GeForce FX 5700LE] | ||
| 3752 | 0344 NV36.4 [GeForce FX 5700VE] | ||
| 3753 | 0345 NV36.5 | ||
| 3754 | 0347 NV36 [GeForce FX Go5700] | ||
| 3755 | 0348 NV36 [GeForce FX Go5700] | ||
| 3756 | 0349 NV36 | ||
| 3757 | 034b NV36 | ||
| 3758 | 034c NV36 [Quadro FX Go1000] | ||
| 3759 | 034e NV36GL [Quadro FX 1100] | ||
| 3760 | 034f NV36GL | ||
| 3761 | 10df Emulex Corporation | ||
| 3762 | 1ae5 LP6000 Fibre Channel Host Adapter | ||
| 3763 | 1ae6 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) | ||
| 3764 | 1ae7 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:2-3) | ||
| 3765 | f005 LP1150e Fibre Channel Host Adapter | ||
| 3766 | f085 LP850 Fibre Channel Host Adapter | ||
| 3767 | f095 LP952 Fibre Channel Host Adapter | ||
| 3768 | f098 LP982 Fibre Channel Host Adapter | ||
| 3769 | f0a5 LP1050 Fibre Channel Host Adapter | ||
| 3770 | f0d5 LP1150 Fibre Channel Host Adapter | ||
| 3771 | f100 LP11000e Fibre Channel Host Adapter | ||
| 3772 | f700 LP7000 Fibre Channel Host Adapter | ||
| 3773 | f701 LP 7000EFibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) | ||
| 3774 | f800 LP8000 Fibre Channel Host Adapter | ||
| 3775 | f801 LP 8000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) | ||
| 3776 | f900 LP9000 Fibre Channel Host Adapter | ||
| 3777 | f901 LP 9000 Fibre Channel Host Adapter Alternate ID (JX1:2-3, JX2:1-2) | ||
| 3778 | f980 LP9802 Fibre Channel Host Adapter | ||
| 3779 | f981 LP 9802 Fibre Channel Host Adapter Alternate ID | ||
| 3780 | f982 LP 9802 Fibre Channel Host Adapter Alternate ID | ||
| 3781 | fa00 LP10000 Fibre Channel Host Adapter | ||
| 3782 | fa01 LP101 Fibre Channel Host Adapter | ||
| 3783 | fd00 LP11000 Fibre Channel Host Adapter | ||
| 3784 | 10e0 Integrated Micro Solutions Inc. | ||
| 3785 | 5026 IMS5026/27/28 | ||
| 3786 | 5027 IMS5027 | ||
| 3787 | 5028 IMS5028 | ||
| 3788 | 8849 IMS8849 | ||
| 3789 | 8853 IMS8853 | ||
| 3790 | 9128 IMS9128 [Twin turbo 128] | ||
| 3791 | 10e1 Tekram Technology Co.,Ltd. | ||
| 3792 | 0391 TRM-S1040 | ||
| 3793 | 10e1 0391 DC-315U SCSI-3 Host Adapter | ||
| 3794 | 690c DC-690c | ||
| 3795 | dc29 DC-290 | ||
| 3796 | 10e2 Aptix Corporation | ||
| 3797 | 10e3 Tundra Semiconductor Corp. | ||
| 3798 | 0000 CA91C042 [Universe] | ||
| 3799 | 0860 CA91C860 [QSpan] | ||
| 3800 | 0862 CA91C862A [QSpan-II] | ||
| 3801 | 8260 CA91L8200B [Dual PCI PowerSpan II] | ||
| 3802 | 8261 CA91L8260B [Single PCI PowerSpan II] | ||
| 3803 | 10e4 Tandem Computers | ||
| 3804 | 10e5 Micro Industries Corporation | ||
| 3805 | 10e6 Gainbery Computer Products Inc. | ||
| 3806 | 10e7 Vadem | ||
| 3807 | 10e8 Applied Micro Circuits Corp. | ||
| 3808 | 1072 INES GPIB-PCI (AMCC5920 based) | ||
| 3809 | 2011 Q-Motion Video Capture/Edit board | ||
| 3810 | 4750 S5930 [Matchmaker] | ||
| 3811 | 5920 S5920 | ||
| 3812 | 8043 LANai4.x [Myrinet LANai interface chip] | ||
| 3813 | 8062 S5933_PARASTATION | ||
| 3814 | 807d S5933 [Matchmaker] | ||
| 3815 | 8088 Kongsberg Spacetec Format Synchronizer | ||
| 3816 | 8089 Kongsberg Spacetec Serial Output Board | ||
| 3817 | 809c S5933_HEPC3 | ||
| 3818 | 80d7 PCI-9112 | ||
| 3819 | 80d9 PCI-9118 | ||
| 3820 | 80da PCI-9812 | ||
| 3821 | 811a PCI-IEEE1355-DS-DE Interface | ||
| 3822 | 814c Fastcom ESCC-PCI (Commtech, Inc.) | ||
| 3823 | 8170 S5933 [Matchmaker] (Chipset Development Tool) | ||
| 3824 | # sold with Roper Scientifc(Photometrics) CoolSnap HQ camera | ||
| 3825 | 81e6 Multimedia video controller | ||
| 3826 | 8291 Fastcom 232/8-PCI (Commtech, Inc.) | ||
| 3827 | 82c4 Fastcom 422/4-PCI (Commtech, Inc.) | ||
| 3828 | 82c5 Fastcom 422/2-PCI (Commtech, Inc.) | ||
| 3829 | 82c6 Fastcom IG422/1-PCI (Commtech, Inc.) | ||
| 3830 | 82c7 Fastcom IG232/2-PCI (Commtech, Inc.) | ||
| 3831 | 82ca Fastcom 232/4-PCI (Commtech, Inc.) | ||
| 3832 | 82db AJA HDNTV HD SDI Framestore | ||
| 3833 | 82e2 Fastcom DIO24H-PCI (Commtech, Inc.) | ||
| 3834 | 8851 S5933 on Innes Corp FM Radio Capture card | ||
| 3835 | 10e9 Alps Electric Co., Ltd. | ||
| 3836 | 10ea Intergraphics Systems | ||
| 3837 | 1680 IGA-1680 | ||
| 3838 | 1682 IGA-1682 | ||
| 3839 | 1683 IGA-1683 | ||
| 3840 | 2000 CyberPro 2000 | ||
| 3841 | 2010 CyberPro 2000A | ||
| 3842 | 5000 CyberPro 5000 | ||
| 3843 | 5050 CyberPro 5050 | ||
| 3844 | 5202 CyberPro 5202 | ||
| 3845 | # CyberPro5202 Audio Function | ||
| 3846 | 5252 CyberPro5252 | ||
| 3847 | 10eb Artists Graphics | ||
| 3848 | 0101 3GA | ||
| 3849 | 8111 Twist3 Frame Grabber | ||
| 3850 | 10ec Realtek Semiconductor Co., Ltd. | ||
| 3851 | 8029 RTL-8029(AS) | ||
| 3852 | 10b8 2011 EZ-Card (SMC1208) | ||
| 3853 | 10ec 8029 RTL-8029(AS) | ||
| 3854 | 1113 1208 EN1208 | ||
| 3855 | 1186 0300 DE-528 | ||
| 3856 | 1259 2400 AT-2400 | ||
| 3857 | 8129 RTL-8129 | ||
| 3858 | 10ec 8129 RT8129 Fast Ethernet Adapter | ||
| 3859 | 8138 RT8139 (B/C) Cardbus Fast Ethernet Adapter | ||
| 3860 | 10ec 8138 RT8139 (B/C) Fast Ethernet Adapter | ||
| 3861 | 8139 RTL-8139/8139C/8139C+ | ||
| 3862 | 0357 000a TTP-Monitoring Card V2.0 | ||
| 3863 | 1025 005a TravelMate 290 | ||
| 3864 | 1025 8920 ALN-325 | ||
| 3865 | 1025 8921 ALN-325 | ||
| 3866 | 1071 8160 MIM2000 | ||
| 3867 | 10bd 0320 EP-320X-R | ||
| 3868 | 10ec 8139 RT8139 | ||
| 3869 | 1113 ec01 FNC-0107TX | ||
| 3870 | 1186 1300 DFE-538TX | ||
| 3871 | 1186 1320 SN5200 | ||
| 3872 | 1186 8139 DRN-32TX | ||
| 3873 | 11f6 8139 FN22-3(A) LinxPRO Ethernet Adapter | ||
| 3874 | 1259 2500 AT-2500TX | ||
| 3875 | 1259 2503 AT-2500TX/ACPI | ||
| 3876 | 1429 d010 ND010 | ||
| 3877 | 1432 9130 EN-9130TX | ||
| 3878 | 1436 8139 RT8139 | ||
| 3879 | 1458 e000 GA-7VM400M/7VT600 Motherboard | ||
| 3880 | 146c 1439 FE-1439TX | ||
| 3881 | 1489 6001 GF100TXRII | ||
| 3882 | 1489 6002 GF100TXRA | ||
| 3883 | 149c 139a LFE-8139ATX | ||
| 3884 | 149c 8139 LFE-8139TX | ||
| 3885 | 14cb 0200 LNR-100 Family 10/100 Base-TX Ethernet | ||
| 3886 | 1799 5000 F5D5000 PCI Card/Desktop Network PCI Card | ||
| 3887 | 2646 0001 EtheRx | ||
| 3888 | 8e2e 7000 KF-230TX | ||
| 3889 | 8e2e 7100 KF-230TX/2 | ||
| 3890 | a0a0 0007 ALN-325C | ||
| 3891 | 8169 RTL-8169 Gigabit Ethernet | ||
| 3892 | 1259 c107 CG-LAPCIGT | ||
| 3893 | 1371 434e ProG-2000L | ||
| 3894 | 1458 e000 GA-K8VT800 Pro Motherboard | ||
| 3895 | 1462 702c K8T NEO 2 motherboard | ||
| 3896 | 8180 RTL8180L 802.11b MAC | ||
| 3897 | 8197 SmartLAN56 56K Modem | ||
| 3898 | 10ed Ascii Corporation | ||
| 3899 | 7310 V7310 | ||
| 3900 | 10ee Xilinx Corporation | ||
| 3901 | 3fc0 RME Digi96 | ||
| 3902 | 3fc1 RME Digi96/8 | ||
| 3903 | 3fc2 RME Digi96/8 Pro | ||
| 3904 | 3fc3 RME Digi96/8 Pad | ||
| 3905 | 3fc4 RME Digi9652 (Hammerfall) | ||
| 3906 | 3fc5 RME Hammerfall DSP | ||
| 3907 | 3fc6 RME Hammerfall DSP MADI | ||
| 3908 | 8381 Ellips Santos Frame Grabber | ||
| 3909 | 10ef Racore Computer Products, Inc. | ||
| 3910 | 8154 M815x Token Ring Adapter | ||
| 3911 | 10f0 Peritek Corporation | ||
| 3912 | 10f1 Tyan Computer | ||
| 3913 | 10f2 Achme Computer, Inc. | ||
| 3914 | 10f3 Alaris, Inc. | ||
| 3915 | 10f4 S-MOS Systems, Inc. | ||
| 3916 | 10f5 NKK Corporation | ||
| 3917 | a001 NDR4000 [NR4600 Bridge] | ||
| 3918 | 10f6 Creative Electronic Systems SA | ||
| 3919 | 10f7 Matsushita Electric Industrial Co., Ltd. | ||
| 3920 | 10f8 Altos India Ltd | ||
| 3921 | 10f9 PC Direct | ||
| 3922 | 10fa Truevision | ||
| 3923 | 000c TARGA 1000 | ||
| 3924 | 10fb Thesys Gesellschaft für Mikroelektronik mbH | ||
| 3925 | 186f TH 6255 | ||
| 3926 | 10fc I-O Data Device, Inc. | ||
| 3927 | # What's in the cardbus end of a Sony ACR-A01 card, comes with newer Vaio CD-RW drives | ||
| 3928 | 0003 Cardbus IDE Controller | ||
| 3929 | 0005 Cardbus SCSI CBSC II | ||
| 3930 | 10fd Soyo Computer, Inc | ||
| 3931 | 10fe Fast Multimedia AG | ||
| 3932 | 10ff NCube | ||
| 3933 | 1100 Jazz Multimedia | ||
| 3934 | 1101 Initio Corporation | ||
| 3935 | 1060 INI-A100U2W | ||
| 3936 | 9100 INI-9100/9100W | ||
| 3937 | 9400 INI-940 | ||
| 3938 | 9401 INI-950 | ||
| 3939 | 9500 360P | ||
| 3940 | 9502 Initio INI-9100UW Ultra Wide SCSI Controller INIC-950P chip | ||
| 3941 | 1102 Creative Labs | ||
| 3942 | 0002 SB Live! EMU10k1 | ||
| 3943 | 1102 0020 CT4850 SBLive! Value | ||
| 3944 | 1102 0021 CT4620 SBLive! | ||
| 3945 | 1102 002f SBLive! mainboard implementation | ||
| 3946 | 1102 4001 E-mu APS | ||
| 3947 | 1102 8022 CT4780 SBLive! Value | ||
| 3948 | 1102 8023 CT4790 SoundBlaster PCI512 | ||
| 3949 | 1102 8024 CT4760 SBLive! | ||
| 3950 | 1102 8025 SBLive! Mainboard Implementation | ||
| 3951 | 1102 8026 CT4830 SBLive! Value | ||
| 3952 | 1102 8027 CT4832 SBLive! Value | ||
| 3953 | 1102 8028 CT4760 SBLive! OEM version | ||
| 3954 | 1102 8031 CT4831 SBLive! Value | ||
| 3955 | 1102 8040 CT4760 SBLive! | ||
| 3956 | 1102 8051 CT4850 SBLive! Value | ||
| 3957 | 1102 8061 SBLive! Player 5.1 | ||
| 3958 | 1102 8064 SB Live! 5.1 Model SB0100 | ||
| 3959 | 1102 8065 SBLive! 5.1 Digital Model SB0220 | ||
| 3960 | 1102 8067 SBLive! 5.1 eMicro 28028 | ||
| 3961 | 0004 SB Audigy | ||
| 3962 | 1102 0051 SB0090 Audigy Player | ||
| 3963 | 1102 0053 SB0090 Audigy Player/OEM | ||
| 3964 | 1102 0058 SB0090 Audigy Player/OEM | ||
| 3965 | 1102 1007 SB0240 Audigy 2 Platinum 6.1 | ||
| 3966 | 1102 2002 SB Audigy 2 ZS (SB0350) | ||
| 3967 | 0006 [SB Live! Value] EMU10k1X | ||
| 3968 | 0007 SB Audigy LS | ||
| 3969 | 1102 1001 SB0310 Audigy LS | ||
| 3970 | 1102 1002 SB0312 Audigy LS | ||
| 3971 | 1102 1006 SB0410 SBLive! 24-bit | ||
| 3972 | 0008 SB0400 Audigy2 Value | ||
| 3973 | 4001 SB Audigy FireWire Port | ||
| 3974 | 1102 0010 SB Audigy FireWire Port | ||
| 3975 | 7002 SB Live! MIDI/Game Port | ||
| 3976 | 1102 0020 Gameport Joystick | ||
| 3977 | 7003 SB Audigy MIDI/Game port | ||
| 3978 | 1102 0040 SB Audigy MIDI/Game Port | ||
| 3979 | 7004 [SB Live! Value] Input device controller | ||
| 3980 | 7005 SB Audigy LS MIDI/Game port | ||
| 3981 | 1102 1001 SB0310 Audigy LS MIDI/Game port | ||
| 3982 | 1102 1002 SB0312 Audigy LS MIDI/Game port | ||
| 3983 | 8064 SB0100 [SBLive! 5.1 OEM] | ||
| 3984 | 8938 Ectiva EV1938 | ||
| 3985 | 1033 80e5 SlimTower-Jim (NEC) | ||
| 3986 | 1071 7150 Mitac 7150 | ||
| 3987 | 110a 5938 Siemens Scenic Mobile 510PIII | ||
| 3988 | 13bd 100c Ceres-C (Sharp, Intel BX) | ||
| 3989 | 13bd 100d Sharp, Intel Banister | ||
| 3990 | 13bd 100e TwinHead P09S/P09S3 (Sharp) | ||
| 3991 | 13bd f6f1 Marlin (Sharp) | ||
| 3992 | 14ff 0e70 P88TE (TWINHEAD INTERNATIONAL Corp) | ||
| 3993 | 14ff c401 Notebook 9100/9200/2000 (TWINHEAD INTERNATIONAL Corp) | ||
| 3994 | 156d b400 G400 - Geo (AlphaTop (Taiwan)) | ||
| 3995 | 156d b550 G560 (AlphaTop (Taiwan)) | ||
| 3996 | 156d b560 G560 (AlphaTop (Taiwan)) | ||
| 3997 | 156d b700 G700/U700 (AlphaTop (Taiwan)) | ||
| 3998 | 156d b795 G795 (AlphaTop (Taiwan)) | ||
| 3999 | 156d b797 G797 (AlphaTop (Taiwan)) | ||
| 4000 | 1103 Triones Technologies, Inc. | ||
| 4001 | 0003 HPT343 | ||
| 4002 | 0004 HPT366/368/370/370A/372/372N | ||
| 4003 | 1103 0001 HPT370A | ||
| 4004 | 1103 0003 HPT343 / HPT345 / HPT363 UDMA33 | ||
| 4005 | 1103 0004 HPT366 UDMA66 (r1) / HPT368 UDMA66 (r2) / HPT370 UDMA100 (r3) / HPT370 UDMA100 RAID (r4) | ||
| 4006 | 1103 0005 HPT370 UDMA100 | ||
| 4007 | 1103 0006 HPT302 | ||
| 4008 | 1103 0007 HPT371 UDMA133 | ||
| 4009 | 1103 0008 HPT374 UDMA/ATA133 RAID Controller | ||
| 4010 | 0005 HPT372A/372N | ||
| 4011 | 0006 HPT302 | ||
| 4012 | 0007 HPT371/371N | ||
| 4013 | 0008 HPT374 | ||
| 4014 | 0009 HPT372N | ||
| 4015 | 1104 RasterOps Corp. | ||
| 4016 | 1105 Sigma Designs, Inc. | ||
| 4017 | 1105 REALmagic Xcard MPEG 1/2/3/4 DVD Decoder | ||
| 4018 | 8300 REALmagic Hollywood Plus DVD Decoder | ||
| 4019 | 8400 EM840x REALmagic DVD/MPEG-2 Audio/Video Decoder | ||
| 4020 | 8401 EM8401 REALmagic DVD/MPEG-2 A/V Decoder | ||
| 4021 | 8470 EM8470 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4022 | 8471 EM8471 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4023 | 8475 EM8475 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4024 | 8476 EM8476 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4025 | 8485 EM8485 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4026 | 8486 EM8486 REALmagic DVD/MPEG-4 A/V Decoder | ||
| 4027 | 1106 VIA Technologies, Inc. | ||
| 4028 | 0102 Embedded VIA Ethernet Controller | ||
| 4029 | 0130 VT6305 1394.A Controller | ||
| 4030 | 0305 VT8363/8365 [KT133/KM133] | ||
| 4031 | 1043 8033 A7V Mainboard | ||
| 4032 | 1043 803e A7V-E Mainboard | ||
| 4033 | 1043 8042 A7V133/A7V133-C Mainboard | ||
| 4034 | 147b a401 KT7/KT7-RAID/KT7A/KT7A-RAID Mainboard | ||
| 4035 | 0391 VT8371 [KX133] | ||
| 4036 | 0501 VT8501 [Apollo MVP4] | ||
| 4037 | 0505 VT82C505 | ||
| 4038 | # Shares chip with :0576. The VT82C576M has :1571 instead of :0561. | ||
| 4039 | 0561 VT82C576MV | ||
| 4040 | 0571 VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE | ||
| 4041 | 1019 0985 P6VXA Motherboard | ||
| 4042 | 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) | ||
| 4043 | 1043 8052 VT8233A Bus Master ATA100/66/33 IDE | ||
| 4044 | 1043 808c A7V8X motherboard | ||
| 4045 | 1043 80a1 A7V8X-X motherboard rev. 1.01 | ||
| 4046 | 1043 80ed A7V600 motherboard | ||
| 4047 | 1106 0571 VT82C586/B/VT82C686/A/B/VT8233/A/C/VT8235 PIPC Bus Master IDE | ||
| 4048 | 1179 0001 Magnia Z310 | ||
| 4049 | 1297 f641 FX41 motherboard | ||
| 4050 | 1458 5002 GA-7VAX Mainboard | ||
| 4051 | 1462 7020 K8T NEO 2 motherboard | ||
| 4052 | 147b 1407 KV8-MAX3 motherboard | ||
| 4053 | 1849 0571 K7VT2 motherboard | ||
| 4054 | 0576 VT82C576 3V [Apollo Master] | ||
| 4055 | 0585 VT82C585VP [Apollo VP1/VPX] | ||
| 4056 | 0586 VT82C586/A/B PCI-to-ISA [Apollo VP] | ||
| 4057 | 1106 0000 MVP3 ISA Bridge | ||
| 4058 | 0595 VT82C595 [Apollo VP2] | ||
| 4059 | 0596 VT82C596 ISA [Mobile South] | ||
| 4060 | 1106 0000 VT82C596/A/B PCI to ISA Bridge | ||
| 4061 | 1458 0596 VT82C596/A/B PCI to ISA Bridge | ||
| 4062 | 0597 VT82C597 [Apollo VP3] | ||
| 4063 | 0598 VT82C598 [Apollo MVP3] | ||
| 4064 | 0601 VT8601 [Apollo ProMedia] | ||
| 4065 | 0605 VT8605 [ProSavage PM133] | ||
| 4066 | 1043 802c CUV4X mainboard | ||
| 4067 | 0680 VT82C680 [Apollo P6] | ||
| 4068 | 0686 VT82C686 [Apollo Super South] | ||
| 4069 | 1019 0985 P6VXA Motherboard | ||
| 4070 | 1043 802c CUV4X mainboard | ||
| 4071 | 1043 8033 A7V Mainboard | ||
| 4072 | 1043 803e A7V-E Mainboard | ||
| 4073 | 1043 8040 A7M266 Mainboard | ||
| 4074 | 1043 8042 A7V133/A7V133-C Mainboard | ||
| 4075 | 1106 0000 VT82C686/A PCI to ISA Bridge | ||
| 4076 | 1106 0686 VT82C686/A PCI to ISA Bridge | ||
| 4077 | 1179 0001 Magnia Z310 | ||
| 4078 | 147b a702 KG7-Lite Mainboard | ||
| 4079 | 0691 VT82C693A/694x [Apollo PRO133x] | ||
| 4080 | 1019 0985 P6VXA Motherboard | ||
| 4081 | 1179 0001 Magnia Z310 | ||
| 4082 | 1458 0691 VT82C691 Apollo Pro System Controller | ||
| 4083 | 0693 VT82C693 [Apollo Pro Plus] | ||
| 4084 | 0698 VT82C693A [Apollo Pro133 AGP] | ||
| 4085 | 0926 VT82C926 [Amazon] | ||
| 4086 | 1000 VT82C570MV | ||
| 4087 | 1106 VT82C570MV | ||
| 4088 | 1571 VT82C576M/VT82C586 | ||
| 4089 | 1595 VT82C595/97 [Apollo VP2/97] | ||
| 4090 | 3022 CLE266 | ||
| 4091 | # This is *not* USB 2.0 as the existing entry suggests | ||
| 4092 | 3038 VT82xxxxx UHCI USB 1.1 Controller | ||
| 4093 | 0925 1234 USB Controller | ||
| 4094 | 1019 0985 P6VXA Motherboard | ||
| 4095 | 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) | ||
| 4096 | 1043 808c VT6202 USB2.0 4 port controller | ||
| 4097 | 1043 80a1 A7V8X-X motherboard | ||
| 4098 | 1043 80ed A7V600 motherboard | ||
| 4099 | 1179 0001 Magnia Z310 | ||
| 4100 | 1458 5004 GA-7VAX Mainboard | ||
| 4101 | 1462 7020 K8T NEO 2 motherboard | ||
| 4102 | 147b 1407 KV8-MAX3 motherboard | ||
| 4103 | 182d 201d CN-029 USB2.0 4 port PCI Card | ||
| 4104 | 3040 VT82C586B ACPI | ||
| 4105 | 3043 VT86C100A [Rhine] | ||
| 4106 | 10bd 0000 VT86C100A Fast Ethernet Adapter | ||
| 4107 | 1106 0100 VT86C100A Fast Ethernet Adapter | ||
| 4108 | 1186 1400 DFE-530TX rev A | ||
| 4109 | 3044 IEEE 1394 Host Controller | ||
| 4110 | 1025 005a TravelMate 290 | ||
| 4111 | 1458 1000 GA-7VT600-1394 Motherboard | ||
| 4112 | 1462 702d K8T NEO 2 motherboard | ||
| 4113 | 3050 VT82C596 Power Management | ||
| 4114 | 3051 VT82C596 Power Management | ||
| 4115 | 3053 VT6105M [Rhine-III] | ||
| 4116 | 3057 VT82C686 [Apollo Super ACPI] | ||
| 4117 | 1019 0985 P6VXA Motherboard | ||
| 4118 | 1043 8033 A7V Mainboard | ||
| 4119 | 1043 803e A7V-E Mainboard | ||
| 4120 | 1043 8040 A7M266 Mainboard | ||
| 4121 | 1043 8042 A7V133/A7V133-C Mainboard | ||
| 4122 | 1179 0001 Magnia Z310 | ||
| 4123 | 3058 VT82C686 AC97 Audio Controller | ||
| 4124 | 0e11 0097 SoundMax Digital Integrated Audio | ||
| 4125 | 0e11 b194 Soundmax integrated digital audio | ||
| 4126 | 1019 0985 P6VXA Motherboard | ||
| 4127 | 1043 1106 A7V133/A7V133-C Mainboard | ||
| 4128 | 1106 4511 Onboard Audio on EP7KXA | ||
| 4129 | 1458 7600 Onboard Audio | ||
| 4130 | 1462 3091 MS-6309 Onboard Audio | ||
| 4131 | 1462 3300 MS-6330 Onboard Audio | ||
| 4132 | 15dd 7609 Onboard Audio | ||
| 4133 | 3059 VT8233/A/8235/8237 AC97 Audio Controller | ||
| 4134 | 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) | ||
| 4135 | 1043 8095 A7V8X Motherboard (Realtek ALC650 codec) | ||
| 4136 | 1043 80a1 A7V8X-X Motherboard | ||
| 4137 | 1043 80b0 A7V600/K8V Deluxe motherboard (ADI AD1980 codec [SoundMAX]) | ||
| 4138 | 1106 3059 L7VMM2 Motherboard | ||
| 4139 | 1106 4161 K7VT2 motherboard | ||
| 4140 | 1297 c160 FX41 motherboard (Realtek ALC650 codec) | ||
| 4141 | 1458 a002 GA-7VAX Onboard Audio (Realtek ALC650) | ||
| 4142 | 1462 0080 K8T NEO 2 motherboard | ||
| 4143 | 1462 3800 KT266 onboard audio | ||
| 4144 | 147b 1407 KV8-MAX3 motherboard | ||
| 4145 | 3065 VT6102 [Rhine-II] | ||
| 4146 | 1043 80a1 A7V8X-X Motherboard | ||
| 4147 | 1106 0102 VT6102 [Rhine II] Embeded Ethernet Controller on VT8235 | ||
| 4148 | 1186 1400 DFE-530TX rev A | ||
| 4149 | 1186 1401 DFE-530TX rev B | ||
| 4150 | 13b9 1421 LD-10/100AL PCI Fast Ethernet Adapter (rev.B) | ||
| 4151 | # This hosts more than just the Intel 537 codec, it also hosts PCtel (SIL33) and SmartLink (SIL34) codecs | ||
| 4152 | 3068 AC'97 Modem Controller | ||
| 4153 | 1462 309e MS-6309 Saturn Motherboard | ||
| 4154 | 3074 VT8233 PCI to ISA Bridge | ||
| 4155 | 1043 8052 VT8233A | ||
| 4156 | 3091 VT8633 [Apollo Pro266] | ||
| 4157 | 3099 VT8366/A/7 [Apollo KT266/A/333] | ||
| 4158 | 1043 8064 A7V266-E Mainboard | ||
| 4159 | 1043 807f A7V333 Mainboard | ||
| 4160 | 1849 3099 K7VT2 motherboard | ||
| 4161 | 3101 VT8653 Host Bridge | ||
| 4162 | 3102 VT8662 Host Bridge | ||
| 4163 | 3103 VT8615 Host Bridge | ||
| 4164 | 3104 USB 2.0 | ||
| 4165 | 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) | ||
| 4166 | 1043 808c A7V8X motherboard | ||
| 4167 | 1043 80a1 A7V8X-X motherboard rev 1.01 | ||
| 4168 | 1043 80ed A7V600 motherboard | ||
| 4169 | 1297 f641 FX41 motherboard | ||
| 4170 | 1458 5004 GA-7VAX Mainboard | ||
| 4171 | 1462 7020 K8T NEO 2 motherboard | ||
| 4172 | 147b 1407 KV8-MAX3 motherboard | ||
| 4173 | 182d 201d CN-029 USB 2.0 4 port PCI Card | ||
| 4174 | 3106 VT6105 [Rhine-III] | ||
| 4175 | 1186 1403 DFE-530TX rev C | ||
| 4176 | 3108 S3 Unichrome Pro VGA Adapter | ||
| 4177 | 3109 VT8233C PCI to ISA Bridge | ||
| 4178 | 3112 VT8361 [KLE133] Host Bridge | ||
| 4179 | 3116 VT8375 [KM266/KL266] Host Bridge | ||
| 4180 | 1297 f641 FX41 motherboard | ||
| 4181 | 3118 S3 Unichrome Pro VGA Adapter | ||
| 4182 | 3119 VT6120/VT6121/VT6122 Gigabit Ethernet Adapter | ||
| 4183 | # found on EPIA M6000/9000 mainboard | ||
| 4184 | 3122 VT8623 [Apollo CLE266] integrated CastleRock graphics | ||
| 4185 | # found on EPIA M6000/9000 mainboard | ||
| 4186 | 3123 VT8623 [Apollo CLE266] | ||
| 4187 | 3128 VT8753 [P4X266 AGP] | ||
| 4188 | 3133 VT3133 Host Bridge | ||
| 4189 | 3147 VT8233A ISA Bridge | ||
| 4190 | 3148 P4M266 Host Bridge | ||
| 4191 | 3149 VIA VT6420 SATA RAID Controller | ||
| 4192 | 1043 80ed A7V600/K8V Deluxe motherboard | ||
| 4193 | 1458 b003 GA-7VM400AM(F) Motherboard | ||
| 4194 | 1462 7020 K8T Neo 2 Motherboard | ||
| 4195 | 147b 1407 KV8-MAX3 motherboard | ||
| 4196 | 3156 P/KN266 Host Bridge | ||
| 4197 | # on ASUS P4P800 | ||
| 4198 | 3164 VT6410 ATA133 RAID controller | ||
| 4199 | 3168 VT8374 P4X400 Host Controller/AGP Bridge | ||
| 4200 | 3177 VT8235 ISA Bridge | ||
| 4201 | 1019 0a81 L7VTA v1.0 Motherboard (KT400-8235) | ||
| 4202 | 1043 808c A7V8X motherboard | ||
| 4203 | 1043 80a1 A7V8X-X motherboard | ||
| 4204 | 1297 f641 FX41 motherboard | ||
| 4205 | 1458 5001 GA-7VAX Mainboard | ||
| 4206 | 1849 3177 K7VT2 motherboard | ||
| 4207 | 3178 ProSavageDDR P4N333 Host Bridge | ||
| 4208 | 3188 VT8385 [K8T800 AGP] Host Bridge | ||
| 4209 | 1043 80a3 K8V Deluxe motherboard | ||
| 4210 | 147b 1407 KV8-MAX3 motherboard | ||
| 4211 | 3189 VT8377 [KT400/KT600 AGP] Host Bridge | ||
| 4212 | 1043 807f A7V8X motherboard | ||
| 4213 | 1458 5000 GA-7VAX Mainboard | ||
| 4214 | 3204 K8M800 | ||
| 4215 | 3205 VT8378 [KM400/A] Chipset Host Bridge | ||
| 4216 | 1458 5000 GA-7VM400M Motherboard | ||
| 4217 | 3218 K8T800M Host Bridge | ||
| 4218 | 3227 VT8237 ISA bridge [KT600/K8T800 South] | ||
| 4219 | 1043 80ed A7V600 motherboard | ||
| 4220 | 1106 3227 DFI KT600-AL Motherboard | ||
| 4221 | 1458 5001 GA-7VT600 Motherboard | ||
| 4222 | 147b 1407 KV8-MAX3 motherboard | ||
| 4223 | 3249 VT6421 IDE RAID Controller | ||
| 4224 | 4149 VIA VT6420 (ATA133) Controller | ||
| 4225 | 5030 VT82C596 ACPI [Apollo PRO] | ||
| 4226 | 6100 VT85C100A [Rhine II] | ||
| 4227 | 7204 K8M800 | ||
| 4228 | # S3 Graphics UniChromeâ„¢ 2D/3D Graphics with motion compensation | ||
| 4229 | 7205 VT8378 [S3 UniChrome] Integrated Video | ||
| 4230 | 1458 d000 Gigabyte GA-7VM400(A)M(F) Motherboard | ||
| 4231 | 8231 VT8231 [PCI-to-ISA Bridge] | ||
| 4232 | 8235 VT8235 ACPI | ||
| 4233 | 8305 VT8363/8365 [KT133/KM133 AGP] | ||
| 4234 | 8391 VT8371 [KX133 AGP] | ||
| 4235 | 8501 VT8501 [Apollo MVP4 AGP] | ||
| 4236 | 8596 VT82C596 [Apollo PRO AGP] | ||
| 4237 | 8597 VT82C597 [Apollo VP3 AGP] | ||
| 4238 | 8598 VT82C598/694x [Apollo MVP3/Pro133x AGP] | ||
| 4239 | 1019 0985 P6VXA Motherboard | ||
| 4240 | 8601 VT8601 [Apollo ProMedia AGP] | ||
| 4241 | 8605 VT8605 [PM133 AGP] | ||
| 4242 | 8691 VT82C691 [Apollo Pro] | ||
| 4243 | 8693 VT82C693 [Apollo Pro Plus] PCI Bridge | ||
| 4244 | b091 VT8633 [Apollo Pro266 AGP] | ||
| 4245 | b099 VT8366/A/7 [Apollo KT266/A/333 AGP] | ||
| 4246 | b101 VT8653 AGP Bridge | ||
| 4247 | b102 VT8362 AGP Bridge | ||
| 4248 | b103 VT8615 AGP Bridge | ||
| 4249 | b112 VT8361 [KLE133] AGP Bridge | ||
| 4250 | b168 VT8235 PCI Bridge | ||
| 4251 | b188 VT8237 PCI bridge [K8T800 South] | ||
| 4252 | 147b 1407 KV8-MAX3 motherboard | ||
| 4253 | b198 VT8237 PCI Bridge | ||
| 4254 | # 32-Bit PCI bus master Ethernet MAC with standard MII interface | ||
| 4255 | d104 VT8237 Integrated Fast Ethernet Controller | ||
| 4256 | 1107 Stratus Computers | ||
| 4257 | 0576 VIA VT82C570MV [Apollo] (Wrong vendor ID!) | ||
| 4258 | 1108 Proteon, Inc. | ||
| 4259 | 0100 p1690plus_AA | ||
| 4260 | 0101 p1690plus_AB | ||
| 4261 | 0105 P1690Plus | ||
| 4262 | 0108 P1690Plus | ||
| 4263 | 0138 P1690Plus | ||
| 4264 | 0139 P1690Plus | ||
| 4265 | 013c P1690Plus | ||
| 4266 | 013d P1690Plus | ||
| 4267 | 1109 Cogent Data Technologies, Inc. | ||
| 4268 | 1400 EM110TX [EX110TX] | ||
| 4269 | 110a Siemens Nixdorf AG | ||
| 4270 | 0002 Pirahna 2-port | ||
| 4271 | 0005 Tulip controller, power management, switch extender | ||
| 4272 | 0006 FSC PINC (I/O-APIC) | ||
| 4273 | 0015 FSC Multiprocessor Interrupt Controller | ||
| 4274 | 001d FSC Copernicus Management Controller | ||
| 4275 | 007b FSC Remote Service Controller, mailbox device | ||
| 4276 | 007c FSC Remote Service Controller, shared memory device | ||
| 4277 | 007d FSC Remote Service Controller, SMIC device | ||
| 4278 | # Superfastcom-PCI (Commtech, Inc.) or DSCC4 WAN Adapter | ||
| 4279 | 2102 DSCC4 PEB/PEF 20534 DMA Supported Serial Communication Controller with 4 Channels | ||
| 4280 | 2104 Eicon Diva 2.02 compatible passive ISDN card | ||
| 4281 | 3142 SIMATIC NET CP 5613A1 (Profibus Adapter) | ||
| 4282 | 4021 SIMATIC NET CP 5512 (Profibus and MPI Cardbus Adapter) | ||
| 4283 | 4029 SIMATIC NET CP 5613A2 (Profibus Adapter) | ||
| 4284 | 4942 FPGA I-Bus Tracer for MBD | ||
| 4285 | 6120 SZB6120 | ||
| 4286 | 110b Chromatic Research Inc. | ||
| 4287 | 0001 Mpact Media Processor | ||
| 4288 | 0004 Mpact 2 | ||
| 4289 | 110c Mini-Max Technology, Inc. | ||
| 4290 | 110d Znyx Advanced Systems | ||
| 4291 | 110e CPU Technology | ||
| 4292 | 110f Ross Technology | ||
| 4293 | 1110 Powerhouse Systems | ||
| 4294 | 6037 Firepower Powerized SMP I/O ASIC | ||
| 4295 | 6073 Firepower Powerized SMP I/O ASIC | ||
| 4296 | 1111 Santa Cruz Operation | ||
| 4297 | # Also claimed to be RNS or Rockwell International, current PCISIG records list Osicom | ||
| 4298 | 1112 Osicom Technologies Inc | ||
| 4299 | 2200 FDDI Adapter | ||
| 4300 | 2300 Fast Ethernet Adapter | ||
| 4301 | 2340 4 Port Fast Ethernet Adapter | ||
| 4302 | 2400 ATM Adapter | ||
| 4303 | 1113 Accton Technology Corporation | ||
| 4304 | 1211 SMC2-1211TX | ||
| 4305 | 103c 1207 EN-1207D Fast Ethernet Adapter | ||
| 4306 | 1113 1211 EN-1207D Fast Ethernet Adapter | ||
| 4307 | 1216 EN-1216 Ethernet Adapter | ||
| 4308 | 1113 2242 EN2242 10/100 Ethernet Mini-PCI Card | ||
| 4309 | 111a 1020 SpeedStream 1020 PCI 10/100 Ethernet Adaptor [EN-1207F-TX ?] | ||
| 4310 | 1217 EN-1217 Ethernet Adapter | ||
| 4311 | 5105 10Mbps Network card | ||
| 4312 | 9211 EN-1207D Fast Ethernet Adapter | ||
| 4313 | 1113 9211 EN-1207D Fast Ethernet Adapter | ||
| 4314 | 9511 21x4x DEC-Tulip compatible Fast Ethernet | ||
| 4315 | d301 CPWNA100 (Philips wireless PCMCIA) | ||
| 4316 | ec02 SMC 1244TX v3 | ||
| 4317 | 1114 Atmel Corporation | ||
| 4318 | 0506 802.11b Wireless Network Adaptor (at76c506) | ||
| 4319 | 1115 3D Labs | ||
| 4320 | 1116 Data Translation | ||
| 4321 | 0022 DT3001 | ||
| 4322 | 0023 DT3002 | ||
| 4323 | 0024 DT3003 | ||
| 4324 | 0025 DT3004 | ||
| 4325 | 0026 DT3005 | ||
| 4326 | 0027 DT3001-PGL | ||
| 4327 | 0028 DT3003-PGL | ||
| 4328 | 1117 Datacube, Inc | ||
| 4329 | 9500 Max-1C SVGA card | ||
| 4330 | 9501 Max-1C image processing | ||
| 4331 | 1118 Berg Electronics | ||
| 4332 | 1119 ICP Vortex Computersysteme GmbH | ||
| 4333 | 0000 GDT 6000/6020/6050 | ||
| 4334 | 0001 GDT 6000B/6010 | ||
| 4335 | 0002 GDT 6110/6510 | ||
| 4336 | 0003 GDT 6120/6520 | ||
| 4337 | 0004 GDT 6530 | ||
| 4338 | 0005 GDT 6550 | ||
| 4339 | 0006 GDT 6117/6517 | ||
| 4340 | 0007 GDT 6127/6527 | ||
| 4341 | 0008 GDT 6537 | ||
| 4342 | 0009 GDT 6557/6557-ECC | ||
| 4343 | 000a GDT 6115/6515 | ||
| 4344 | 000b GDT 6125/6525 | ||
| 4345 | 000c GDT 6535 | ||
| 4346 | 000d GDT 6555 | ||
| 4347 | 0010 GDT 6115/6515 | ||
| 4348 | 0011 GDT 6125/6525 | ||
| 4349 | 0012 GDT 6535 | ||
| 4350 | 0013 GDT 6555/6555-ECC | ||
| 4351 | 0100 GDT 6117RP/6517RP | ||
| 4352 | 0101 GDT 6127RP/6527RP | ||
| 4353 | 0102 GDT 6537RP | ||
| 4354 | 0103 GDT 6557RP | ||
| 4355 | 0104 GDT 6111RP/6511RP | ||
| 4356 | 0105 GDT 6121RP/6521RP | ||
| 4357 | 0110 GDT 6117RD/6517RD | ||
| 4358 | 0111 GDT 6127RD/6527RD | ||
| 4359 | 0112 GDT 6537RD | ||
| 4360 | 0113 GDT 6557RD | ||
| 4361 | 0114 GDT 6111RD/6511RD | ||
| 4362 | 0115 GDT 6121RD/6521RD | ||
| 4363 | 0118 GDT 6118RD/6518RD/6618RD | ||
| 4364 | 0119 GDT 6128RD/6528RD/6628RD | ||
| 4365 | 011a GDT 6538RD/6638RD | ||
| 4366 | 011b GDT 6558RD/6658RD | ||
| 4367 | 0120 GDT 6117RP2/6517RP2 | ||
| 4368 | 0121 GDT 6127RP2/6527RP2 | ||
| 4369 | 0122 GDT 6537RP2 | ||
| 4370 | 0123 GDT 6557RP2 | ||
| 4371 | 0124 GDT 6111RP2/6511RP2 | ||
| 4372 | 0125 GDT 6121RP2/6521RP2 | ||
| 4373 | 0136 GDT 6113RS/6513RS | ||
| 4374 | 0137 GDT 6123RS/6523RS | ||
| 4375 | 0138 GDT 6118RS/6518RS/6618RS | ||
| 4376 | 0139 GDT 6128RS/6528RS/6628RS | ||
| 4377 | 013a GDT 6538RS/6638RS | ||
| 4378 | 013b GDT 6558RS/6658RS | ||
| 4379 | 013c GDT 6533RS/6633RS | ||
| 4380 | 013d GDT 6543RS/6643RS | ||
| 4381 | 013e GDT 6553RS/6653RS | ||
| 4382 | 013f GDT 6563RS/6663RS | ||
| 4383 | 0166 GDT 7113RN/7513RN/7613RN | ||
| 4384 | 0167 GDT 7123RN/7523RN/7623RN | ||
| 4385 | 0168 GDT 7118RN/7518RN/7518RN | ||
| 4386 | 0169 GDT 7128RN/7528RN/7628RN | ||
| 4387 | 016a GDT 7538RN/7638RN | ||
| 4388 | 016b GDT 7558RN/7658RN | ||
| 4389 | 016c GDT 7533RN/7633RN | ||
| 4390 | 016d GDT 7543RN/7643RN | ||
| 4391 | 016e GDT 7553RN/7653RN | ||
| 4392 | 016f GDT 7563RN/7663RN | ||
| 4393 | 01d6 GDT 4x13RZ | ||
| 4394 | 01d7 GDT 4x23RZ | ||
| 4395 | 01f6 GDT 8x13RZ | ||
| 4396 | 01f7 GDT 8x23RZ | ||
| 4397 | 01fc GDT 8x33RZ | ||
| 4398 | 01fd GDT 8x43RZ | ||
| 4399 | 01fe GDT 8x53RZ | ||
| 4400 | 01ff GDT 8x63RZ | ||
| 4401 | 0210 GDT 6519RD/6619RD | ||
| 4402 | 0211 GDT 6529RD/6629RD | ||
| 4403 | 0260 GDT 7519RN/7619RN | ||
| 4404 | 0261 GDT 7529RN/7629RN | ||
| 4405 | 02ff GDT MAXRP | ||
| 4406 | 0300 GDT NEWRX | ||
| 4407 | 111a Efficient Networks, Inc | ||
| 4408 | 0000 155P-MF1 (FPGA) | ||
| 4409 | 0002 155P-MF1 (ASIC) | ||
| 4410 | 0003 ENI-25P ATM | ||
| 4411 | 111a 0000 ENI-25p Miniport ATM Adapter | ||
| 4412 | 0005 SpeedStream (LANAI) | ||
| 4413 | 111a 0001 ENI-3010 ATM | ||
| 4414 | 111a 0009 ENI-3060 ADSL (VPI=0) | ||
| 4415 | 111a 0101 ENI-3010 ATM | ||
| 4416 | 111a 0109 ENI-3060CO ADSL (VPI=0) | ||
| 4417 | 111a 0809 ENI-3060 ADSL (VPI=0 or 8) | ||
| 4418 | 111a 0909 ENI-3060CO ADSL (VPI=0 or 8) | ||
| 4419 | 111a 0a09 ENI-3060 ADSL (VPI=<0..15>) | ||
| 4420 | 0007 SpeedStream ADSL | ||
| 4421 | 111a 1001 ENI-3061 ADSL [ASIC] | ||
| 4422 | 1203 SpeedStream 1023 Wireless PCI Adapter | ||
| 4423 | 111b Teledyne Electronic Systems | ||
| 4424 | 111c Tricord Systems Inc. | ||
| 4425 | 0001 Powerbis Bridge | ||
| 4426 | 111d Integrated Device Technology, Inc. | ||
| 4427 | 0001 IDT77201/77211 155Mbps ATM SAR Controller [NICStAR] | ||
| 4428 | 0003 IDT77222/77252 155Mbps ATM MICRO ABR SAR Controller | ||
| 4429 | 0004 IDT77V252 155Mbps ATM MICRO ABR SAR Controller | ||
| 4430 | 0005 IDT77V222 155Mbps ATM MICRO ABR SAR Controller | ||
| 4431 | 111e Eldec | ||
| 4432 | 111f Precision Digital Images | ||
| 4433 | 4a47 Precision MX Video engine interface | ||
| 4434 | 5243 Frame capture bus interface | ||
| 4435 | 1120 EMC Corporation | ||
| 4436 | 1121 Zilog | ||
| 4437 | 1122 Multi-tech Systems, Inc. | ||
| 4438 | 1123 Excellent Design, Inc. | ||
| 4439 | 1124 Leutron Vision AG | ||
| 4440 | 1125 Eurocore | ||
| 4441 | 1126 Vigra | ||
| 4442 | 1127 FORE Systems Inc | ||
| 4443 | 0200 ForeRunner PCA-200 ATM | ||
| 4444 | 0210 PCA-200PC | ||
| 4445 | 0250 ATM | ||
| 4446 | 0300 ForeRunner PCA-200EPC ATM | ||
| 4447 | 0310 ATM | ||
| 4448 | 0400 ForeRunnerHE ATM Adapter | ||
| 4449 | 1127 0400 ForeRunnerHE ATM | ||
| 4450 | 1129 Firmworks | ||
| 4451 | 112a Hermes Electronics Company, Ltd. | ||
| 4452 | 112b Linotype - Hell AG | ||
| 4453 | 112c Zenith Data Systems | ||
| 4454 | 112d Ravicad | ||
| 4455 | 112e Infomedia Microelectronics Inc. | ||
| 4456 | 112f Imaging Technology Inc | ||
| 4457 | 0000 MVC IC-PCI | ||
| 4458 | 0001 MVC IM-PCI Video frame grabber/processor | ||
| 4459 | 1130 Computervision | ||
| 4460 | 1131 Philips Semiconductors | ||
| 4461 | 1561 USB 1.1 Host Controller | ||
| 4462 | 1562 USB 2.0 Host Controller | ||
| 4463 | 3400 SmartPCI56(UCB1500) 56K Modem | ||
| 4464 | 5400 TriMedia TM1000/1100 | ||
| 4465 | 5402 TriMedia TM-1300 | ||
| 4466 | 1244 0f00 Fritz!Card DSL | ||
| 4467 | 7130 SAA7130 Video Broadcast Decoder | ||
| 4468 | 5168 0138 LiveView FlyVideo 2000 | ||
| 4469 | 7133 SAA713X Audio+video broadcast decoder | ||
| 4470 | 5168 0138 LifeView FlyVideo 3000 | ||
| 4471 | 5168 0212 LifeView FlyTV Platinum mini | ||
| 4472 | 5168 0502 LifeView FlyDVB-T Duo CardBus | ||
| 4473 | # PCI audio and video broadcast decoder (http://www.semiconductors.philips.com/pip/saa7134hl) | ||
| 4474 | 7134 SAA7134 | ||
| 4475 | 1043 4842 TV-FM Card 7134 | ||
| 4476 | 7135 SAA7135 Audio+video broadcast decoder | ||
| 4477 | 7145 SAA7145 | ||
| 4478 | 7146 SAA7146 | ||
| 4479 | 110a 0000 Fujitsu/Siemens DVB-C card rev1.5 | ||
| 4480 | 110a ffff Fujitsu/Siemens DVB-C card rev1.5 | ||
| 4481 | 1131 4f56 KNC1 DVB-S Budget | ||
| 4482 | 1131 4f61 Fujitsu-Siemens Activy DVB-S Budget | ||
| 4483 | 114b 2003 DVRaptor Video Edit/Capture Card | ||
| 4484 | 11bd 0006 DV500 Overlay | ||
| 4485 | 11bd 000a DV500 Overlay | ||
| 4486 | 11bd 000f DV500 Overlay | ||
| 4487 | 13c2 0000 Siemens/Technotrend/Hauppauge DVB card rev1.3 or rev1.5 | ||
| 4488 | 13c2 0001 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 | ||
| 4489 | 13c2 0002 Technotrend/Hauppauge DVB card rev2.1 | ||
| 4490 | 13c2 0003 Technotrend/Hauppauge DVB card rev2.1 | ||
| 4491 | 13c2 0004 Technotrend/Hauppauge DVB card rev2.1 | ||
| 4492 | 13c2 0006 Technotrend/Hauppauge DVB card rev1.3 or rev1.6 | ||
| 4493 | 13c2 0008 Technotrend/Hauppauge DVB-T | ||
| 4494 | 13c2 000a Octal/Technotrend DVB-C for iTV | ||
| 4495 | 13c2 1003 Technotrend-Budget / Hauppauge WinTV-NOVA-S DVB card | ||
| 4496 | 13c2 1004 Technotrend-Budget / Hauppauge WinTV-NOVA-C DVB card | ||
| 4497 | 13c2 1005 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card | ||
| 4498 | 13c2 100c Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card | ||
| 4499 | 13c2 100f Technotrend-Budget / Hauppauge WinTV-NOVA-CI DVB card | ||
| 4500 | 13c2 1011 Technotrend-Budget / Hauppauge WinTV-NOVA-T DVB card | ||
| 4501 | 13c2 1013 SATELCO Multimedia DVB | ||
| 4502 | 13c2 1102 Technotrend/Hauppauge DVB card rev2.1 | ||
| 4503 | 1132 Mitel Corp. | ||
| 4504 | # This is the new official company name. See disclaimer on www.eicon.com for details! | ||
| 4505 | 1133 Eicon Networks Corporation | ||
| 4506 | 7901 EiconCard S90 | ||
| 4507 | 7902 EiconCard S90 | ||
| 4508 | 7911 EiconCard S91 | ||
| 4509 | 7912 EiconCard S91 | ||
| 4510 | 7941 EiconCard S94 | ||
| 4511 | 7942 EiconCard S94 | ||
| 4512 | 7943 EiconCard S94 | ||
| 4513 | 7944 EiconCard S94 | ||
| 4514 | b921 EiconCard P92 | ||
| 4515 | b922 EiconCard P92 | ||
| 4516 | b923 EiconCard P92 | ||
| 4517 | e001 Diva Pro 2.0 S/T | ||
| 4518 | e002 Diva 2.0 S/T PCI | ||
| 4519 | e003 Diva Pro 2.0 U | ||
| 4520 | e004 Diva 2.0 U PCI | ||
| 4521 | e005 Diva 2.01 S/T PCI | ||
| 4522 | e006 Diva CT S/T PCI | ||
| 4523 | e007 Diva CT U PCI | ||
| 4524 | e008 Diva CT Lite S/T PCI | ||
| 4525 | e009 Diva CT Lite U PCI | ||
| 4526 | e00a Diva ISDN+V.90 PCI | ||
| 4527 | e00b Diva 2.02 PCI S/T | ||
| 4528 | e00c Diva 2.02 PCI U | ||
| 4529 | e00d Diva ISDN Pro 3.0 PCI | ||
| 4530 | e00e Diva ISDN+CT S/T PCI Rev 2 | ||
| 4531 | e010 Diva Server BRI-2M PCI | ||
| 4532 | 110a 0021 Fujitsu Siemens ISDN S0 | ||
| 4533 | 8001 0014 Diva Server BRI-2M PCI Cornet NQ | ||
| 4534 | e011 Diva Server BRI S/T Rev 2 | ||
| 4535 | e012 Diva Server 4BRI-8M PCI | ||
| 4536 | 8001 0014 Diva Server 4BRI-8M PCI Cornet NQ | ||
| 4537 | e013 Diva Server 4BRI Rev 2 | ||
| 4538 | 1133 1300 Diva Server V-4BRI-8 | ||
| 4539 | 1133 e013 Diva Server 4BRI-8M 2.0 PCI | ||
| 4540 | 8001 0014 Diva Server 4BRI-8M 2.0 PCI Cornet NQ | ||
| 4541 | e014 Diva Server PRI-30M PCI | ||
| 4542 | 0008 0100 Diva Server PRI-30M PCI | ||
| 4543 | 8001 0014 Diva Server PRI-30M PCI Cornet NQ | ||
| 4544 | e015 DIVA Server PRI Rev 2 | ||
| 4545 | 1133 e015 Diva Server PRI 2.0 PCI | ||
| 4546 | 8001 0014 Diva Server PRI 2.0 PCI Cornet NQ | ||
| 4547 | e016 Diva Server Voice 4BRI PCI | ||
| 4548 | 8001 0014 Diva Server PRI Cornet NQ | ||
| 4549 | e017 Diva Server Voice 4BRI Rev 2 | ||
| 4550 | 1133 e017 Diva Server Voice 4BRI-8M 2.0 PCI | ||
| 4551 | 8001 0014 Diva Server Voice 4BRI-8M 2.0 PCI Cornet NQ | ||
| 4552 | e018 Diva Server BRI-2M 2.0 PCI | ||
| 4553 | 1133 1800 Diva Server V-BRI-2 | ||
| 4554 | 1133 e018 Diva Server BRI-2M 2.0 PCI | ||
| 4555 | 8001 0014 Diva Server BRI-2M 2.0 PCI Cornet NQ | ||
| 4556 | e019 Diva Server Voice PRI Rev 2 | ||
| 4557 | 1133 e019 Diva Server Voice PRI 2.0 PCI | ||
| 4558 | 8001 0014 Diva Server Voice PRI 2.0 PCI Cornet NQ | ||
| 4559 | e01a Diva Server 2FX | ||
| 4560 | e01b Diva Server Voice BRI-2M 2.0 PCI | ||
| 4561 | 1133 e01b Diva Server Voice BRI-2M 2.0 PCI | ||
| 4562 | 8001 0014 Diva Server Voice BRI-2M 2.0 PCI Cornet NQ | ||
| 4563 | e01c Diva Server PRI Rev 3 | ||
| 4564 | 1133 1c01 Diva Server PRI/E1/T1-8 | ||
| 4565 | 1133 1c02 Diva Server PRI/T1-24 | ||
| 4566 | 1133 1c03 Diva Server PRI/E1-30 | ||
| 4567 | 1133 1c04 Diva Server PRI/E1/T1 | ||
| 4568 | 1133 1c05 Diva Server V-PRI/T1-24 | ||
| 4569 | 1133 1c06 Diva Server V-PRI/E1-30 | ||
| 4570 | 1133 1c07 Diva Server PRI/E1/T1-8 Cornet NQ | ||
| 4571 | 1133 1c08 Diva Server PRI/T1-24 Cornet NQ | ||
| 4572 | 1133 1c09 Diva Server PRI/E1-30 Cornet NQ | ||
| 4573 | 1133 1c0a Diva Server PRI/E1/T1 Cornet NQ | ||
| 4574 | 1133 1c0b Diva Server V-PRI/T1-24 Cornet NQ | ||
| 4575 | 1133 1c0c Diva Server V-PRI/E1-30 Cornet NQ | ||
| 4576 | e01e Diva Server 2PRI | ||
| 4577 | 1133 1e00 Diva Server V-2PRI/E1-60 | ||
| 4578 | 1133 1e01 Diva Server V-2PRI/T1-48 | ||
| 4579 | 1133 1e02 Diva Server 2PRI/E1-60 | ||
| 4580 | 1133 1e03 Diva Server 2PRI/T1-48 | ||
| 4581 | e020 Diva Server 4PRI | ||
| 4582 | 1133 2000 Diva Server V-4PRI/E1-120 | ||
| 4583 | 1133 2001 Diva Server V-4PRI/T1-96 | ||
| 4584 | 1133 2002 Diva Server 4PRI/E1-120 | ||
| 4585 | 1133 2003 Diva Server 4PRI/T1-96 | ||
| 4586 | e024 Diva Server Analog-4P | ||
| 4587 | 1133 2400 Diva Server V-Analog-4P | ||
| 4588 | 1133 e024 Diva Server Analog-4P | ||
| 4589 | e028 Diva Server Analog-8P | ||
| 4590 | 1133 2800 Diva Server V-Analog-8P | ||
| 4591 | 1133 e028 Diva Server Analog-8P | ||
| 4592 | 1134 Mercury Computer Systems | ||
| 4593 | 0001 Raceway Bridge | ||
| 4594 | 0002 Dual PCI to RapidIO Bridge | ||
| 4595 | 1135 Fuji Xerox Co Ltd | ||
| 4596 | 0001 Printer controller | ||
| 4597 | 1136 Momentum Data Systems | ||
| 4598 | 1137 Cisco Systems Inc | ||
| 4599 | 1138 Ziatech Corporation | ||
| 4600 | 8905 8905 [STD 32 Bridge] | ||
| 4601 | 1139 Dynamic Pictures, Inc | ||
| 4602 | 0001 VGA Compatable 3D Graphics | ||
| 4603 | 113a FWB Inc | ||
| 4604 | 113b Network Computing Devices | ||
| 4605 | 113c Cyclone Microsystems, Inc. | ||
| 4606 | 0000 PCI-9060 i960 Bridge | ||
| 4607 | 0001 PCI-SDK [PCI i960 Evaluation Platform] | ||
| 4608 | 0911 PCI-911 [i960Jx-based Intelligent I/O Controller] | ||
| 4609 | 0912 PCI-912 [i960CF-based Intelligent I/O Controller] | ||
| 4610 | 0913 PCI-913 | ||
| 4611 | 0914 PCI-914 [I/O Controller w/ secondary PCI bus] | ||
| 4612 | 113d Leading Edge Products Inc | ||
| 4613 | 113e Sanyo Electric Co - Computer Engineering Dept | ||
| 4614 | 113f Equinox Systems, Inc. | ||
| 4615 | 0808 SST-64P Adapter | ||
| 4616 | 1010 SST-128P Adapter | ||
| 4617 | 80c0 SST-16P DB Adapter | ||
| 4618 | 80c4 SST-16P RJ Adapter | ||
| 4619 | 80c8 SST-16P Adapter | ||
| 4620 | 8888 SST-4P Adapter | ||
| 4621 | 9090 SST-8P Adapter | ||
| 4622 | 1140 Intervoice Inc | ||
| 4623 | 1141 Crest Microsystem Inc | ||
| 4624 | 1142 Alliance Semiconductor Corporation | ||
| 4625 | 3210 AP6410 | ||
| 4626 | 6422 ProVideo 6422 | ||
| 4627 | 6424 ProVideo 6424 | ||
| 4628 | 6425 ProMotion AT25 | ||
| 4629 | 643d ProMotion AT3D | ||
| 4630 | 1143 NetPower, Inc | ||
| 4631 | 1144 Cincinnati Milacron | ||
| 4632 | 0001 Noservo controller | ||
| 4633 | 1145 Workbit Corporation | ||
| 4634 | 8007 NinjaSCSI-32 Workbit | ||
| 4635 | f007 NinjaSCSI-32 KME | ||
| 4636 | f010 NinjaSCSI-32 Workbit | ||
| 4637 | f012 NinjaSCSI-32 Logitec | ||
| 4638 | f013 NinjaSCSI-32 Logitec | ||
| 4639 | f015 NinjaSCSI-32 Melco | ||
| 4640 | 1146 Force Computers | ||
| 4641 | 1147 Interface Corp | ||
| 4642 | # Formerly (Schneider & Koch) | ||
| 4643 | 1148 SysKonnect | ||
| 4644 | 4000 FDDI Adapter | ||
| 4645 | 0e11 b03b Netelligent 100 FDDI DAS Fibre SC | ||
| 4646 | 0e11 b03c Netelligent 100 FDDI SAS Fibre SC | ||
| 4647 | 0e11 b03d Netelligent 100 FDDI DAS UTP | ||
| 4648 | 0e11 b03e Netelligent 100 FDDI SAS UTP | ||
| 4649 | 0e11 b03f Netelligent 100 FDDI SAS Fibre MIC | ||
| 4650 | 1148 5521 FDDI SK-5521 (SK-NET FDDI-UP) | ||
| 4651 | 1148 5522 FDDI SK-5522 (SK-NET FDDI-UP DAS) | ||
| 4652 | 1148 5541 FDDI SK-5541 (SK-NET FDDI-FP) | ||
| 4653 | 1148 5543 FDDI SK-5543 (SK-NET FDDI-LP) | ||
| 4654 | 1148 5544 FDDI SK-5544 (SK-NET FDDI-LP DAS) | ||
| 4655 | 1148 5821 FDDI SK-5821 (SK-NET FDDI-UP64) | ||
| 4656 | 1148 5822 FDDI SK-5822 (SK-NET FDDI-UP64 DAS) | ||
| 4657 | 1148 5841 FDDI SK-5841 (SK-NET FDDI-FP64) | ||
| 4658 | 1148 5843 FDDI SK-5843 (SK-NET FDDI-LP64) | ||
| 4659 | 1148 5844 FDDI SK-5844 (SK-NET FDDI-LP64 DAS) | ||
| 4660 | 4200 Token Ring adapter | ||
| 4661 | 4300 SK-98xx Gigabit Ethernet Server Adapter | ||
| 4662 | 1148 9821 SK-9821 Gigabit Ethernet Server Adapter (SK-NET GE-T) | ||
| 4663 | 1148 9822 SK-9822 Gigabit Ethernet Server Adapter (SK-NET GE-T dual link) | ||
| 4664 | 1148 9841 SK-9841 Gigabit Ethernet Server Adapter (SK-NET GE-LX) | ||
| 4665 | 1148 9842 SK-9842 Gigabit Ethernet Server Adapter (SK-NET GE-LX dual link) | ||
| 4666 | 1148 9843 SK-9843 Gigabit Ethernet Server Adapter (SK-NET GE-SX) | ||
| 4667 | 1148 9844 SK-9844 Gigabit Ethernet Server Adapter (SK-NET GE-SX dual link) | ||
| 4668 | 1148 9861 SK-9861 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition) | ||
| 4669 | 1148 9862 SK-9862 Gigabit Ethernet Server Adapter (SK-NET GE-SX Volition dual link) | ||
| 4670 | 1148 9871 SK-9871 Gigabit Ethernet Server Adapter (SK-NET GE-ZX) | ||
| 4671 | 1148 9872 SK-9872 Gigabit Ethernet Server Adapter (SK-NET GE-ZX dual link) | ||
| 4672 | 1259 2970 AT-2970SX Gigabit Ethernet Adapter | ||
| 4673 | 1259 2971 AT-2970LX Gigabit Ethernet Adapter | ||
| 4674 | 1259 2972 AT-2970TX Gigabit Ethernet Adapter | ||
| 4675 | 1259 2973 AT-2971SX Gigabit Ethernet Adapter | ||
| 4676 | 1259 2974 AT-2971T Gigabit Ethernet Adapter | ||
| 4677 | 1259 2975 AT-2970SX/2SC Gigabit Ethernet Adapter | ||
| 4678 | 1259 2976 AT-2970LX/2SC Gigabit Ethernet Adapter | ||
| 4679 | 1259 2977 AT-2970TX/2TX Gigabit Ethernet Adapter | ||
| 4680 | 4320 SK-98xx V2.0 Gigabit Ethernet Adapter | ||
| 4681 | 1148 0121 Marvell RDK-8001 Adapter | ||
| 4682 | 1148 0221 Marvell RDK-8002 Adapter | ||
| 4683 | 1148 0321 Marvell RDK-8003 Adapter | ||
| 4684 | 1148 0421 Marvell RDK-8004 Adapter | ||
| 4685 | 1148 0621 Marvell RDK-8006 Adapter | ||
| 4686 | 1148 0721 Marvell RDK-8007 Adapter | ||
| 4687 | 1148 0821 Marvell RDK-8008 Adapter | ||
| 4688 | 1148 0921 Marvell RDK-8009 Adapter | ||
| 4689 | 1148 1121 Marvell RDK-8011 Adapter | ||
| 4690 | 1148 1221 Marvell RDK-8012 Adapter | ||
| 4691 | 1148 3221 SK-9521 V2.0 10/100/1000Base-T Adapter | ||
| 4692 | 1148 5021 SK-9821 V2.0 Gigabit Ethernet 10/100/1000Base-T Adapter | ||
| 4693 | 1148 5041 SK-9841 V2.0 Gigabit Ethernet 1000Base-LX Adapter | ||
| 4694 | 1148 5043 SK-9843 V2.0 Gigabit Ethernet 1000Base-SX Adapter | ||
| 4695 | 1148 5051 SK-9851 V2.0 Gigabit Ethernet 1000Base-SX Adapter | ||
| 4696 | 1148 5061 SK-9861 V2.0 Gigabit Ethernet 1000Base-SX Adapter | ||
| 4697 | 1148 5071 SK-9871 V2.0 Gigabit Ethernet 1000Base-ZX Adapter | ||
| 4698 | 1148 9521 SK-9521 10/100/1000Base-T Adapter | ||
| 4699 | 4400 SK-9Dxx Gigabit Ethernet Adapter | ||
| 4700 | 4500 SK-9Mxx Gigabit Ethernet Adapter | ||
| 4701 | 9000 SK-9Sxx Gigabit Ethernet Server Adapter PCI-X | ||
| 4702 | 9843 [Fujitsu] Gigabit Ethernet | ||
| 4703 | 9e00 SK-9Exx 10/100/1000Base-T Adapter | ||
| 4704 | 1148 2100 SK-9E21 Server Adapter | ||
| 4705 | 1148 21d0 SK-9E21D 10/100/1000Base-T Adapter | ||
| 4706 | 1148 2200 SK-9E22 Server Adapter | ||
| 4707 | 1148 8100 SK-9E81 Server Adapter | ||
| 4708 | 1148 8200 SK-9E82 Server Adapter | ||
| 4709 | 1148 9100 SK-9E91 Server Adapter | ||
| 4710 | 1148 9200 SK-9E92 Server Adapter | ||
| 4711 | 1149 Win System Corporation | ||
| 4712 | 114a VMIC | ||
| 4713 | 5579 VMIPCI-5579 (Reflective Memory Card) | ||
| 4714 | 5587 VMIPCI-5587 (Reflective Memory Card) | ||
| 4715 | 6504 VMIC PCI 7755 FPGA | ||
| 4716 | 7587 VMIVME-7587 | ||
| 4717 | 114b Canopus Co., Ltd | ||
| 4718 | 114c Annabooks | ||
| 4719 | 114d IC Corporation | ||
| 4720 | 114e Nikon Systems Inc | ||
| 4721 | 114f Digi International | ||
| 4722 | 0002 AccelePort EPC | ||
| 4723 | 0003 RightSwitch SE-6 | ||
| 4724 | 0004 AccelePort Xem | ||
| 4725 | 0005 AccelePort Xr | ||
| 4726 | 0006 AccelePort Xr,C/X | ||
| 4727 | 0009 AccelePort Xr/J | ||
| 4728 | 000a AccelePort EPC/J | ||
| 4729 | 000c DataFirePRIme T1 (1-port) | ||
| 4730 | 000d SyncPort 2-Port (x.25/FR) | ||
| 4731 | 0011 AccelePort 8r EIA-232 (IBM) | ||
| 4732 | 0012 AccelePort 8r EIA-422 | ||
| 4733 | 0013 AccelePort Xr | ||
| 4734 | 0014 AccelePort 8r EIA-422 | ||
| 4735 | 0015 AccelePort Xem | ||
| 4736 | 0016 AccelePort EPC/X | ||
| 4737 | 0017 AccelePort C/X | ||
| 4738 | 001a DataFirePRIme E1 (1-port) | ||
| 4739 | 001b AccelePort C/X (IBM) | ||
| 4740 | 001d DataFire RAS T1/E1/PRI | ||
| 4741 | 114f 0050 DataFire RAS E1 Adapter | ||
| 4742 | 114f 0051 DataFire RAS Dual E1 Adapter | ||
| 4743 | 114f 0052 DataFire RAS T1 Adapter | ||
| 4744 | 114f 0053 DataFire RAS Dual T1 Adapter | ||
| 4745 | 0023 AccelePort RAS | ||
| 4746 | 0024 DataFire RAS B4 ST/U | ||
| 4747 | 114f 0030 DataFire RAS BRI U Adapter | ||
| 4748 | 114f 0031 DataFire RAS BRI S/T Adapter | ||
| 4749 | 0026 AccelePort 4r 920 | ||
| 4750 | 0027 AccelePort Xr 920 | ||
| 4751 | 0028 ClassicBoard 4 | ||
| 4752 | 0029 ClassicBoard 8 | ||
| 4753 | 0034 AccelePort 2r 920 | ||
| 4754 | 0035 DataFire DSP T1/E1/PRI cPCI | ||
| 4755 | 0040 AccelePort Xp | ||
| 4756 | 0042 AccelePort 2p | ||
| 4757 | 0043 AccelePort 4p | ||
| 4758 | 0044 AccelePort 8p | ||
| 4759 | 0045 AccelePort 16p | ||
| 4760 | 004e AccelePort 32p | ||
| 4761 | 0070 Datafire Micro V IOM2 (Europe) | ||
| 4762 | 0071 Datafire Micro V (Europe) | ||
| 4763 | 0072 Datafire Micro V IOM2 (North America) | ||
| 4764 | 0073 Datafire Micro V (North America) | ||
| 4765 | 00b0 Digi Neo 4 | ||
| 4766 | 00b1 Digi Neo 8 | ||
| 4767 | 00c8 Digi Neo 2 DB9 | ||
| 4768 | 00c9 Digi Neo 2 DB9 PRI | ||
| 4769 | 00ca Digi Neo 2 RJ45 | ||
| 4770 | 00cb Digi Neo 2 RJ45 PRI | ||
| 4771 | 00d0 ClassicBoard 4 422 | ||
| 4772 | 00d1 ClassicBoard 8 422 | ||
| 4773 | 6001 Avanstar | ||
| 4774 | 1150 Thinking Machines Corp | ||
| 4775 | 1151 JAE Electronics Inc. | ||
| 4776 | 1152 Megatek | ||
| 4777 | 1153 Land Win Electronic Corp | ||
| 4778 | 1154 Melco Inc | ||
| 4779 | 1155 Pine Technology Ltd | ||
| 4780 | 1156 Periscope Engineering | ||
| 4781 | 1157 Avsys Corporation | ||
| 4782 | 1158 Voarx R & D Inc | ||
| 4783 | 3011 Tokenet/vg 1001/10m anylan | ||
| 4784 | 9050 Lanfleet/Truevalue | ||
| 4785 | 9051 Lanfleet/Truevalue | ||
| 4786 | 1159 Mutech Corp | ||
| 4787 | 0001 MV-1000 | ||
| 4788 | 115a Harlequin Ltd | ||
| 4789 | 115b Parallax Graphics | ||
| 4790 | 115c Photron Ltd. | ||
| 4791 | 115d Xircom | ||
| 4792 | 0003 Cardbus Ethernet 10/100 | ||
| 4793 | 1014 0181 10/100 EtherJet Cardbus Adapter | ||
| 4794 | 1014 1181 10/100 EtherJet Cardbus Adapter | ||
| 4795 | 1014 8181 10/100 EtherJet Cardbus Adapter | ||
| 4796 | 1014 9181 10/100 EtherJet Cardbus Adapter | ||
| 4797 | 115d 0181 Cardbus Ethernet 10/100 | ||
| 4798 | 115d 1181 Cardbus Ethernet 10/100 | ||
| 4799 | 1179 0181 Cardbus Ethernet 10/100 | ||
| 4800 | 8086 8181 EtherExpress PRO/100 Mobile CardBus 32 Adapter | ||
| 4801 | 8086 9181 EtherExpress PRO/100 Mobile CardBus 32 Adapter | ||
| 4802 | 0005 Cardbus Ethernet 10/100 | ||
| 4803 | 1014 0182 10/100 EtherJet Cardbus Adapter | ||
| 4804 | 1014 1182 10/100 EtherJet Cardbus Adapter | ||
| 4805 | 115d 0182 Cardbus Ethernet 10/100 | ||
| 4806 | 115d 1182 Cardbus Ethernet 10/100 | ||
| 4807 | 0007 Cardbus Ethernet 10/100 | ||
| 4808 | 1014 0182 10/100 EtherJet Cardbus Adapter | ||
| 4809 | 1014 1182 10/100 EtherJet Cardbus Adapter | ||
| 4810 | 115d 0182 Cardbus Ethernet 10/100 | ||
| 4811 | 115d 1182 Cardbus Ethernet 10/100 | ||
| 4812 | 000b Cardbus Ethernet 10/100 | ||
| 4813 | 1014 0183 10/100 EtherJet Cardbus Adapter | ||
| 4814 | 115d 0183 Cardbus Ethernet 10/100 | ||
| 4815 | 000c Mini-PCI V.90 56k Modem | ||
| 4816 | 000f Cardbus Ethernet 10/100 | ||
| 4817 | 1014 0183 10/100 EtherJet Cardbus Adapter | ||
| 4818 | 115d 0183 Cardbus Ethernet 10/100 | ||
| 4819 | 00d4 Mini-PCI K56Flex Modem | ||
| 4820 | 0101 Cardbus 56k modem | ||
| 4821 | 115d 1081 Cardbus 56k Modem | ||
| 4822 | 0103 Cardbus Ethernet + 56k Modem | ||
| 4823 | 1014 9181 Cardbus 56k Modem | ||
| 4824 | 1115 1181 Cardbus Ethernet 100 + 56k Modem | ||
| 4825 | 115d 1181 CBEM56G-100 Ethernet + 56k Modem | ||
| 4826 | 8086 9181 PRO/100 LAN + Modem56 CardBus | ||
| 4827 | 115e Peer Protocols Inc | ||
| 4828 | 115f Maxtor Corporation | ||
| 4829 | 1160 Megasoft Inc | ||
| 4830 | 1161 PFU Limited | ||
| 4831 | 1162 OA Laboratory Co Ltd | ||
| 4832 | 1163 Rendition | ||
| 4833 | 0001 Verite 1000 | ||
| 4834 | 2000 Verite V2000/V2100/V2200 | ||
| 4835 | 1092 2000 Stealth II S220 | ||
| 4836 | 1164 Advanced Peripherals Technologies | ||
| 4837 | 1165 Imagraph Corporation | ||
| 4838 | 0001 Motion TPEG Recorder/Player with audio | ||
| 4839 | 1166 ServerWorks | ||
| 4840 | 0000 CMIC-LE | ||
| 4841 | 0005 CNB20-LE Host Bridge | ||
| 4842 | 0006 CNB20HE Host Bridge | ||
| 4843 | 0007 CNB20-LE Host Bridge | ||
| 4844 | 0008 CNB20HE Host Bridge | ||
| 4845 | 0009 CNB20LE Host Bridge | ||
| 4846 | 0010 CIOB30 | ||
| 4847 | 0011 CMIC-HE | ||
| 4848 | 0012 CMIC-WS Host Bridge (GC-LE chipset) | ||
| 4849 | 0013 CNB20-HE Host Bridge | ||
| 4850 | 0014 CMIC-LE Host Bridge (GC-LE chipset) | ||
| 4851 | 0015 CMIC-GC Host Bridge | ||
| 4852 | 0016 CMIC-GC Host Bridge | ||
| 4853 | 0017 GCNB-LE Host Bridge | ||
| 4854 | 0101 CIOB-X2 PCI-X I/O Bridge | ||
| 4855 | 0110 CIOB-E I/O Bridge with Gigabit Ethernet | ||
| 4856 | 0200 OSB4 South Bridge | ||
| 4857 | 0201 CSB5 South Bridge | ||
| 4858 | 4c53 1080 CT8 mainboard | ||
| 4859 | 0203 CSB6 South Bridge | ||
| 4860 | 0211 OSB4 IDE Controller | ||
| 4861 | 0212 CSB5 IDE Controller | ||
| 4862 | 4c53 1080 CT8 mainboard | ||
| 4863 | 0213 CSB6 RAID/IDE Controller | ||
| 4864 | 0217 CSB6 IDE Controller | ||
| 4865 | 0220 OSB4/CSB5 OHCI USB Controller | ||
| 4866 | 4c53 1080 CT8 mainboard | ||
| 4867 | 0221 CSB6 OHCI USB Controller | ||
| 4868 | 0225 CSB5 LPC bridge | ||
| 4869 | # cancelled | ||
| 4870 | 4c53 1080 CT8 mainboard | ||
| 4871 | 0227 GCLE-2 Host Bridge | ||
| 4872 | 0230 CSB5 LPC bridge | ||
| 4873 | 4c53 1080 CT8 mainboard | ||
| 4874 | 0240 K2 SATA | ||
| 4875 | 0241 K2 SATA | ||
| 4876 | 0242 K2 SATA | ||
| 4877 | 1167 Mutoh Industries Inc | ||
| 4878 | 1168 Thine Electronics Inc | ||
| 4879 | 1169 Centre for Development of Advanced Computing | ||
| 4880 | 116a Polaris Communications | ||
| 4881 | 6100 Bus/Tag Channel | ||
| 4882 | 6800 Escon Channel | ||
| 4883 | 7100 Bus/Tag Channel | ||
| 4884 | 7800 Escon Channel | ||
| 4885 | 116b Connectware Inc | ||
| 4886 | 116c Intelligent Resources Integrated Systems | ||
| 4887 | 116d Martin-Marietta | ||
| 4888 | 116e Electronics for Imaging | ||
| 4889 | 116f Workstation Technology | ||
| 4890 | 1170 Inventec Corporation | ||
| 4891 | 1171 Loughborough Sound Images Plc | ||
| 4892 | 1172 Altera Corporation | ||
| 4893 | 1173 Adobe Systems, Inc | ||
| 4894 | 1174 Bridgeport Machines | ||
| 4895 | 1175 Mitron Computer Inc. | ||
| 4896 | 1176 SBE Incorporated | ||
| 4897 | 1177 Silicon Engineering | ||
| 4898 | 1178 Alfa, Inc. | ||
| 4899 | afa1 Fast Ethernet Adapter | ||
| 4900 | 1179 Toshiba America Info Systems | ||
| 4901 | 0103 EX-IDE Type-B | ||
| 4902 | 0404 DVD Decoder card | ||
| 4903 | 0406 Tecra Video Capture device | ||
| 4904 | 0407 DVD Decoder card (Version 2) | ||
| 4905 | 0601 CPU to PCI bridge | ||
| 4906 | 0603 ToPIC95 PCI to CardBus Bridge for Notebooks | ||
| 4907 | 060a ToPIC95 | ||
| 4908 | 060f ToPIC97 | ||
| 4909 | 0617 ToPIC100 PCI to Cardbus Bridge with ZV Support | ||
| 4910 | 0618 CPU to PCI and PCI to ISA bridge | ||
| 4911 | # Claimed to be Lucent DSP1645 [Mars], but that's apparently incorrect. Does anyone know the correct ID? | ||
| 4912 | 0701 FIR Port | ||
| 4913 | 0804 TC6371AF SmartMedia Controller | ||
| 4914 | 0805 SD TypA Controller | ||
| 4915 | 0d01 FIR Port Type-DO | ||
| 4916 | 1179 0001 FIR Port Type-DO | ||
| 4917 | 117a A-Trend Technology | ||
| 4918 | 117b L G Electronics, Inc. | ||
| 4919 | 117c Atto Technology | ||
| 4920 | 117d Becton & Dickinson | ||
| 4921 | 117e T/R Systems | ||
| 4922 | 117f Integrated Circuit Systems | ||
| 4923 | 1180 Ricoh Co Ltd | ||
| 4924 | 0465 RL5c465 | ||
| 4925 | 0466 RL5c466 | ||
| 4926 | 0475 RL5c475 | ||
| 4927 | 144d c006 vpr Matrix 170B4 CardBus bridge | ||
| 4928 | 0476 RL5c476 II | ||
| 4929 | 1014 0185 ThinkPad A/T/X Series | ||
| 4930 | 104d 80df Vaio PCG-FX403 | ||
| 4931 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 4932 | 14ef 0220 PCD-RP-220S | ||
| 4933 | 0477 RL5c477 | ||
| 4934 | 0478 RL5c478 | ||
| 4935 | 1014 0184 ThinkPad A30p (2653-64G) | ||
| 4936 | 0522 R5C522 IEEE 1394 Controller | ||
| 4937 | 1014 01cf ThinkPad A30p (2653-64G) | ||
| 4938 | 0551 R5C551 IEEE 1394 Controller | ||
| 4939 | 144d c006 vpr Matrix 170B4 | ||
| 4940 | 0552 R5C552 IEEE 1394 Controller | ||
| 4941 | 1014 0511 ThinkPad A/T/X Series | ||
| 4942 | 0576 R5C576 SD Bus Host Adapter | ||
| 4943 | 0592 R5C592 Memory Stick Bus Host Adapter | ||
| 4944 | 1181 Telmatics International | ||
| 4945 | 1183 Fujikura Ltd | ||
| 4946 | 1184 Forks Inc | ||
| 4947 | 1185 Dataworld International Ltd | ||
| 4948 | 1186 D-Link System Inc | ||
| 4949 | 0100 DC21041 | ||
| 4950 | 1002 DL10050 Sundance Ethernet | ||
| 4951 | 1186 1002 DFE-550TX | ||
| 4952 | 1186 1012 DFE-580TX | ||
| 4953 | 1025 AirPlus Xtreme G DWL-G650 Adapter | ||
| 4954 | 1026 AirXpert DWL-AG650 Wireless Cardbus Adapter | ||
| 4955 | 1043 AirXpert DWL-AG650 Wireless Cardbus Adapter | ||
| 4956 | 1300 RTL8139 Ethernet | ||
| 4957 | 1186 1300 DFE-538TX 10/100 Ethernet Adapter | ||
| 4958 | 1186 1301 DFE-530TX+ 10/100 Ethernet Adapter | ||
| 4959 | 1340 DFE-690TXD CardBus PC Card | ||
| 4960 | 1541 DFE-680TXD CardBus PC Card | ||
| 4961 | 1561 DRP-32TXD Cardbus PC Card | ||
| 4962 | 2027 AirPlus Xtreme G DWL-G520 Adapter | ||
| 4963 | 3203 AirPlus Xtreme G DWL-G520 Adapter | ||
| 4964 | 3300 DWL-510 2.4GHz Wireless PCI Adapter | ||
| 4965 | 3a03 AirPro DWL-A650 Wireless Cardbus Adapter(rev.B) | ||
| 4966 | 3a04 AirPro DWL-AB650 Multimode Wireless Cardbus Adapter | ||
| 4967 | 3a05 AirPro DWL-AB520 Multimode Wireless PCI Adapter | ||
| 4968 | 3a07 AirXpert DWL-AG650 Wireless Cardbus Adapter | ||
| 4969 | 3a08 AirXpert DWL-AG520 Wireless PCI Adapter | ||
| 4970 | 3a10 AirXpert DWL-AG650 Wireless Cardbus Adapter(rev.B) | ||
| 4971 | 3a11 AirXpert DWL-AG520 Wireless PCI Adapter(rev.B) | ||
| 4972 | 3a12 AirPlus DWL-G650 Wireless Cardbus Adapter(rev.C) | ||
| 4973 | 3a13 AirPlus DWL-G520 Wireless PCI Adapter(rev.B) | ||
| 4974 | 3a14 AirPremier DWL-AG530 Wireless PCI Adapter | ||
| 4975 | 3a63 AirXpert DWL-AG660 Wireless Cardbus Adapter | ||
| 4976 | 3b05 DWL-G650+ CardBus PC Card | ||
| 4977 | 4000 DL2000-based Gigabit Ethernet | ||
| 4978 | 4300 DGE-528T Gigabit Ethernet Adapter | ||
| 4979 | 4c00 Gigabit Ethernet Adapter | ||
| 4980 | 1186 4c00 DGE-530T Gigabit Ethernet Adapter | ||
| 4981 | 8400 D-Link DWL-650+ CardBus PC Card | ||
| 4982 | 1187 Advanced Technology Laboratories, Inc. | ||
| 4983 | 1188 Shima Seiki Manufacturing Ltd. | ||
| 4984 | 1189 Matsushita Electronics Co Ltd | ||
| 4985 | 118a Hilevel Technology | ||
| 4986 | 118b Hypertec Pty Limited | ||
| 4987 | 118c Corollary, Inc | ||
| 4988 | 0014 PCIB [C-bus II to PCI bus host bridge chip] | ||
| 4989 | 1117 Intel 8-way XEON Profusion Chipset [Cache Coherency Filter] | ||
| 4990 | 118d BitFlow Inc | ||
| 4991 | 0001 Raptor-PCI framegrabber | ||
| 4992 | 0012 Model 12 Road Runner Frame Grabber | ||
| 4993 | 0014 Model 14 Road Runner Frame Grabber | ||
| 4994 | 0024 Model 24 Road Runner Frame Grabber | ||
| 4995 | 0044 Model 44 Road Runner Frame Grabber | ||
| 4996 | 0112 Model 12 Road Runner Frame Grabber | ||
| 4997 | 0114 Model 14 Road Runner Frame Grabber | ||
| 4998 | 0124 Model 24 Road Runner Frame Grabber | ||
| 4999 | 0144 Model 44 Road Runner Frame Grabber | ||
| 5000 | 0212 Model 12 Road Runner Frame Grabber | ||
| 5001 | 0214 Model 14 Road Runner Frame Grabber | ||
| 5002 | 0224 Model 24 Road Runner Frame Grabber | ||
| 5003 | 0244 Model 44 Road Runner Frame Grabber | ||
| 5004 | 0312 Model 12 Road Runner Frame Grabber | ||
| 5005 | 0314 Model 14 Road Runner Frame Grabber | ||
| 5006 | 0324 Model 24 Road Runner Frame Grabber | ||
| 5007 | 0344 Model 44 Road Runner Frame Grabber | ||
| 5008 | 118e Hermstedt GmbH | ||
| 5009 | 118f Green Logic | ||
| 5010 | 1190 Tripace | ||
| 5011 | c731 TP-910/920/940 PCI Ultra(Wide) SCSI Adapter | ||
| 5012 | 1191 Artop Electronic Corp | ||
| 5013 | 0003 SCSI Cache Host Adapter | ||
| 5014 | 0004 ATP8400 | ||
| 5015 | 0005 ATP850UF | ||
| 5016 | 0006 ATP860 NO-BIOS | ||
| 5017 | 0007 ATP860 | ||
| 5018 | 0008 ATP865 NO-ROM | ||
| 5019 | 0009 ATP865 | ||
| 5020 | 8002 AEC6710 SCSI-2 Host Adapter | ||
| 5021 | 8010 AEC6712UW SCSI | ||
| 5022 | 8020 AEC6712U SCSI | ||
| 5023 | 8030 AEC6712S SCSI | ||
| 5024 | 8040 AEC6712D SCSI | ||
| 5025 | 8050 AEC6712SUW SCSI | ||
| 5026 | 8060 AEC6712 SCSI | ||
| 5027 | 8080 AEC67160 SCSI | ||
| 5028 | 8081 AEC67160S SCSI | ||
| 5029 | 808a AEC67162 2-ch. LVD SCSI | ||
| 5030 | 1192 Densan Company Ltd | ||
| 5031 | 1193 Zeitnet Inc. | ||
| 5032 | 0001 1221 | ||
| 5033 | 0002 1225 | ||
| 5034 | 1194 Toucan Technology | ||
| 5035 | 1195 Ratoc System Inc | ||
| 5036 | 1196 Hytec Electronics Ltd | ||
| 5037 | 1197 Gage Applied Sciences, Inc. | ||
| 5038 | 010c CompuScope 82G 8bit 2GS/s Analog Input Card | ||
| 5039 | 1198 Lambda Systems Inc | ||
| 5040 | 1199 Attachmate Corporation | ||
| 5041 | 119a Mind Share, Inc. | ||
| 5042 | 119b Omega Micro Inc. | ||
| 5043 | 1221 82C092G | ||
| 5044 | 119c Information Technology Inst. | ||
| 5045 | 119d Bug, Inc. Sapporo Japan | ||
| 5046 | 119e Fujitsu Microelectronics Ltd. | ||
| 5047 | 0001 FireStream 155 | ||
| 5048 | 0003 FireStream 50 | ||
| 5049 | 119f Bull HN Information Systems | ||
| 5050 | 11a0 Convex Computer Corporation | ||
| 5051 | 11a1 Hamamatsu Photonics K.K. | ||
| 5052 | 11a2 Sierra Research and Technology | ||
| 5053 | 11a3 Deuretzbacher GmbH & Co. Eng. KG | ||
| 5054 | 11a4 Barco Graphics NV | ||
| 5055 | 11a5 Microunity Systems Eng. Inc | ||
| 5056 | 11a6 Pure Data Ltd. | ||
| 5057 | 11a7 Power Computing Corp. | ||
| 5058 | 11a8 Systech Corp. | ||
| 5059 | 11a9 InnoSys Inc. | ||
| 5060 | 4240 AMCC S933Q Intelligent Serial Card | ||
| 5061 | 11aa Actel | ||
| 5062 | # Formerly Galileo Technology, Inc. | ||
| 5063 | 11ab Marvell Technology Group Ltd. | ||
| 5064 | 0146 GT-64010/64010A System Controller | ||
| 5065 | 138f W8300 802.11 Adapter (rev 07) | ||
| 5066 | 1fa6 Marvell W8300 802.11 Adapter | ||
| 5067 | 1fa7 88W8310 and 88W8000G [Libertas] 802.11g client chipset | ||
| 5068 | 4320 Gigabit Ethernet Controller | ||
| 5069 | 1019 0f38 Marvell 88E8001 Gigabit Ethernet Controller (ECS) | ||
| 5070 | 1019 8001 Marvell 88E8001 Gigabit Ethernet Controller (ECS) | ||
| 5071 | 1043 173c Marvell 88E8001 Gigabit Ethernet Controller (Asus) | ||
| 5072 | 1043 811a Marvell 88E8001 Gigabit Ethernet Controller (Asus) | ||
| 5073 | 105b 0c19 Marvell 88E8001 Gigabit Ethernet Controller (Foxconn) | ||
| 5074 | 10b8 b452 SMC EZ Card 1000 (SMC9452TXV.2) | ||
| 5075 | 11ab 0121 Marvell RDK-8001 | ||
| 5076 | 11ab 0321 Marvell RDK-8003 | ||
| 5077 | 11ab 1021 Marvell RDK-8010 | ||
| 5078 | 11ab 5021 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (64 bit) | ||
| 5079 | 11ab 9521 Marvell Yukon Gigabit Ethernet 10/100/1000Base-T Controller (32 bit) | ||
| 5080 | 1458 e000 Marvell 88E8001 Gigabit Ethernet Controller (Gigabyte) | ||
| 5081 | 147b 1406 Marvell 88E8001 Gigabit Ethernet Controller (Abit) | ||
| 5082 | 15d4 0047 Marvell 88E8001 Gigabit Ethernet Controller (Iwill) | ||
| 5083 | 1695 9025 Marvell 88E8001 Gigabit Ethernet Controller (Epox) | ||
| 5084 | 17f2 1c03 Marvell 88E8001 Gigabit Ethernet Controller (Albatron) | ||
| 5085 | 270f 2803 Marvell 88E8001 Gigabit Ethernet Controller (Chaintech) | ||
| 5086 | 4350 Fast Ethernet Controller | ||
| 5087 | 1179 0001 Marvell 88E8035 Fast Ethernet Controller (Toshiba) | ||
| 5088 | 11ab 3521 Marvell RDK-8035 | ||
| 5089 | 1854 000d Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5090 | 1854 000e Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5091 | 1854 000f Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5092 | 1854 0011 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5093 | 1854 0012 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5094 | 1854 0016 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5095 | 1854 0017 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5096 | 1854 0018 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5097 | 1854 0019 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5098 | 1854 001c Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5099 | 1854 001e Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5100 | 1854 0020 Marvell 88E8035 Fast Ethernet Controller (LGE) | ||
| 5101 | 4351 Fast Ethernet Controller | ||
| 5102 | 107b 4009 Marvell 88E8036 Fast Ethernet Controller (Wistron) | ||
| 5103 | 10f7 8338 Marvell 88E8036 Fast Ethernet Controller (Panasonic) | ||
| 5104 | 1179 0001 Marvell 88E8036 Fast Ethernet Controller (Toshiba) | ||
| 5105 | 1179 ff00 Marvell 88E8036 Fast Ethernet Controller (Compal) | ||
| 5106 | 1179 ff10 Marvell 88E8036 Fast Ethernet Controller (Inventec) | ||
| 5107 | 11ab 3621 Marvell RDK-8036 | ||
| 5108 | 13d1 ac12 Abocom EFE3K - 10/100 Ethernet Expresscard | ||
| 5109 | 161f 203d Marvell 88E8036 Fast Ethernet Controller (Arima) | ||
| 5110 | 1854 000d Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5111 | 1854 000e Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5112 | 1854 000f Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5113 | 1854 0011 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5114 | 1854 0012 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5115 | 1854 0016 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5116 | 1854 0017 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5117 | 1854 0018 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5118 | 1854 0019 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5119 | 1854 001c Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5120 | 1854 001e Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5121 | 1854 0020 Marvell 88E8036 Fast Ethernet Controller (LGE) | ||
| 5122 | 4360 Gigabit Ethernet Controller | ||
| 5123 | 1043 8134 Marvell 88E8052 Gigabit Ethernet Controller (Asus) | ||
| 5124 | 107b 4009 Marvell 88E8052 Gigabit Ethernet Controller (Wistron) | ||
| 5125 | 11ab 5221 Marvell RDK-8052 | ||
| 5126 | 1458 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) | ||
| 5127 | 1462 052c Marvell 88E8052 Gigabit Ethernet Controller (MSI) | ||
| 5128 | 1849 8052 Marvell 88E8052 Gigabit Ethernet Controller (ASRock) | ||
| 5129 | 1940 e000 Marvell 88E8052 Gigabit Ethernet Controller (Gigabyte) | ||
| 5130 | a0a0 0509 Marvell 88E8052 Gigabit Ethernet Controller (Aopen) | ||
| 5131 | 4361 Gigabit Ethernet Controller | ||
| 5132 | 107b 3015 Marvell 88E8050 Gigabit Ethernet Controller (Gateway) | ||
| 5133 | 11ab 5021 Marvell 88E8050 Gigabit Ethernet Controller (Intel) | ||
| 5134 | 8086 3063 D925XCVLK mainboard | ||
| 5135 | 4362 Gigabit Ethernet Controller | ||
| 5136 | 103c 2a0d Marvell 88E8053 Gigabit Ethernet Controller (Asus) | ||
| 5137 | 1043 8142 Marvell 88E8053 Gigabit Ethernet Controller (Asus) | ||
| 5138 | 109f 3197 Marvell 88E8053 Gigabit Ethernet Controller (Trigem) | ||
| 5139 | 10f7 8338 Marvell 88E8053 Gigabit Ethernet Controller (Panasonic) | ||
| 5140 | 10fd a430 Marvell 88E8053 Gigabit Ethernet Controller (SOYO) | ||
| 5141 | 1179 0001 Marvell 88E8053 Gigabit Ethernet Controller (Toshiba) | ||
| 5142 | 1179 ff00 Marvell 88E8053 Gigabit Ethernet Controller (Compal) | ||
| 5143 | 1179 ff10 Marvell 88E8053 Gigabit Ethernet Controller (Inventec) | ||
| 5144 | 11ab 5321 Marvell RDK-8053 | ||
| 5145 | 1297 c240 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) | ||
| 5146 | 1297 c241 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) | ||
| 5147 | 1297 c242 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) | ||
| 5148 | 1297 c243 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) | ||
| 5149 | 1297 c244 Marvell 88E8053 Gigabit Ethernet Controller (Shuttle) | ||
| 5150 | 13d1 ac11 Abocom EGE5K - Giga Ethernet Expresscard | ||
| 5151 | 1458 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) | ||
| 5152 | 1462 058c Marvell 88E8053 Gigabit Ethernet Controller (MSI) | ||
| 5153 | 14c0 0012 Marvell 88E8053 Gigabit Ethernet Controller (Compal) | ||
| 5154 | 1558 04a0 Marvell 88E8053 Gigabit Ethernet Controller (Clevo) | ||
| 5155 | 15bd 1003 Marvell 88E8053 Gigabit Ethernet Controller (DFI) | ||
| 5156 | 161f 203c Marvell 88E8053 Gigabit Ethernet Controller (Arima) | ||
| 5157 | 161f 203d Marvell 88E8053 Gigabit Ethernet Controller (Arima) | ||
| 5158 | 1695 9029 Marvell 88E8053 Gigabit Ethernet Controller (Epox) | ||
| 5159 | 17f2 2c08 Marvell 88E8053 Gigabit Ethernet Controller (Albatron) | ||
| 5160 | 17ff 0585 Marvell 88E8053 Gigabit Ethernet Controller (Quanta) | ||
| 5161 | 1849 8053 Marvell 88E8053 Gigabit Ethernet Controller (ASRock) | ||
| 5162 | 1854 000b Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5163 | 1854 000c Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5164 | 1854 0010 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5165 | 1854 0013 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5166 | 1854 0014 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5167 | 1854 0015 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5168 | 1854 001a Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5169 | 1854 001b Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5170 | 1854 001d Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5171 | 1854 001f Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5172 | 1854 0021 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5173 | 1854 0022 Marvell 88E8053 Gigabit Ethernet Controller (LGE) | ||
| 5174 | 1940 e000 Marvell 88E8053 Gigabit Ethernet Controller (Gigabyte) | ||
| 5175 | 270f 2801 Marvell 88E8053 Gigabit Ethernet Controller (Chaintech) | ||
| 5176 | a0a0 0506 Marvell 88E8053 Gigabit Ethernet Controller (Aopen) | ||
| 5177 | 4611 GT-64115 System Controller | ||
| 5178 | 4620 GT-64120/64120A/64121A System Controller | ||
| 5179 | 4801 GT-48001 | ||
| 5180 | 5005 Belkin F5D5005 Gigabit Desktop Network PCI Card | ||
| 5181 | 5040 MV88SX5040 4-port SATA I PCI-X Controller | ||
| 5182 | 5041 MV88SX5041 4-port SATA I PCI-X Controller | ||
| 5183 | 5080 MV88SX5080 8-port SATA I PCI-X Controller | ||
| 5184 | 5081 MV88SX5081 8-port SATA I PCI-X Controller | ||
| 5185 | 6041 MV88SX6041 4-port SATA II PCI-X Controller | ||
| 5186 | 6081 MV88SX6081 8-port SATA II PCI-X Controller | ||
| 5187 | 6460 MV64360/64361/64362 System Controller | ||
| 5188 | f003 GT-64010 Primary Image Piranha Image Generator | ||
| 5189 | 11ac Canon Information Systems Research Aust. | ||
| 5190 | 11ad Lite-On Communications Inc | ||
| 5191 | 0002 LNE100TX | ||
| 5192 | 11ad 0002 LNE100TX | ||
| 5193 | 11ad 0003 LNE100TX | ||
| 5194 | 11ad f003 LNE100TX | ||
| 5195 | 11ad ffff LNE100TX | ||
| 5196 | 1385 f004 FA310TX | ||
| 5197 | c115 LNE100TX [Linksys EtherFast 10/100] | ||
| 5198 | 11ad c001 LNE100TX [ver 2.0] | ||
| 5199 | 11ae Aztech System Ltd | ||
| 5200 | 11af Avid Technology Inc. | ||
| 5201 | 0001 [Cinema] | ||
| 5202 | 11b0 V3 Semiconductor Inc. | ||
| 5203 | 0002 V300PSC | ||
| 5204 | 0292 V292PBC [Am29030/40 Bridge] | ||
| 5205 | 0960 V96xPBC | ||
| 5206 | c960 V96DPC | ||
| 5207 | 11b1 Apricot Computers | ||
| 5208 | 11b2 Eastman Kodak | ||
| 5209 | 11b3 Barr Systems Inc. | ||
| 5210 | 11b4 Leitch Technology International | ||
| 5211 | 11b5 Radstone Technology Plc | ||
| 5212 | 11b6 United Video Corp | ||
| 5213 | 11b7 Motorola | ||
| 5214 | 11b8 XPoint Technologies, Inc | ||
| 5215 | 0001 Quad PeerMaster | ||
| 5216 | 11b9 Pathlight Technology Inc. | ||
| 5217 | c0ed SSA Controller | ||
| 5218 | 11ba Videotron Corp | ||
| 5219 | 11bb Pyramid Technology | ||
| 5220 | 11bc Network Peripherals Inc | ||
| 5221 | 0001 NP-PCI | ||
| 5222 | 11bd Pinnacle Systems Inc. | ||
| 5223 | 11be International Microcircuits Inc | ||
| 5224 | 11bf Astrodesign, Inc. | ||
| 5225 | 11c0 Hewlett Packard | ||
| 5226 | 11c1 Agere Systems (former Lucent Microelectronics) | ||
| 5227 | 0440 56k WinModem | ||
| 5228 | 1033 8015 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5229 | 1033 8047 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5230 | 1033 804f LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5231 | 10cf 102c LB LT Modem V.90 56k | ||
| 5232 | 10cf 104a BIBLO LT Modem 56k | ||
| 5233 | 10cf 105f LB2 LT Modem V.90 56k | ||
| 5234 | 1179 0001 Internal V.90 Modem | ||
| 5235 | 11c1 0440 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5236 | 122d 4101 MDP7800-U Modem | ||
| 5237 | 122d 4102 MDP7800SP-U Modem | ||
| 5238 | 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5239 | 13e0 0440 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5240 | 13e0 0441 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5241 | 13e0 0450 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5242 | 13e0 f100 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5243 | 13e0 f101 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5244 | 144d 2101 LT56PV Modem | ||
| 5245 | 149f 0440 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5246 | 0441 56k WinModem | ||
| 5247 | 1033 804d LT WinModem 56k Data+Fax | ||
| 5248 | 1033 8065 LT WinModem 56k Data+Fax | ||
| 5249 | 1092 0440 Supra 56i | ||
| 5250 | 1179 0001 Internal V.90 Modem | ||
| 5251 | 11c1 0440 LT WinModem 56k Data+Fax | ||
| 5252 | 11c1 0441 LT WinModem 56k Data+Fax | ||
| 5253 | 122d 4100 MDP7800-U Modem | ||
| 5254 | 13e0 0040 LT WinModem 56k Data+Fax | ||
| 5255 | 13e0 0100 LT WinModem 56k Data+Fax | ||
| 5256 | 13e0 0410 LT WinModem 56k Data+Fax | ||
| 5257 | 13e0 0420 TelePath Internet 56k WinModem | ||
| 5258 | 13e0 0440 LT WinModem 56k Data+Fax | ||
| 5259 | 13e0 0443 LT WinModem 56k Data+Fax | ||
| 5260 | 13e0 f102 LT WinModem 56k Data+Fax | ||
| 5261 | 1416 9804 CommWave 56k Modem | ||
| 5262 | 141d 0440 LT WinModem 56k Data+Fax | ||
| 5263 | 144f 0441 Lucent 56k V.90 DF Modem | ||
| 5264 | 144f 0449 Lucent 56k V.90 DF Modem | ||
| 5265 | 144f 110d Lucent Win Modem | ||
| 5266 | 1468 0441 Presario 56k V.90 DF Modem | ||
| 5267 | 1668 0440 Lucent Win Modem | ||
| 5268 | 0442 56k WinModem | ||
| 5269 | 11c1 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5270 | 11c1 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5271 | 13e0 0412 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5272 | 13e0 0442 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5273 | 13fc 2471 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5274 | 144d 2104 LT56PT Modem | ||
| 5275 | 144f 1104 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5276 | 149f 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5277 | 1668 0440 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5278 | 0443 LT WinModem | ||
| 5279 | 0444 LT WinModem | ||
| 5280 | 0445 LT WinModem | ||
| 5281 | 8086 2203 PRO/100+ MiniPCI (probably an Ambit U98.003.C.00 combo card) | ||
| 5282 | 8086 2204 PRO/100+ MiniPCI on Armada E500 | ||
| 5283 | 0446 LT WinModem | ||
| 5284 | 0447 LT WinModem | ||
| 5285 | 0448 WinModem 56k | ||
| 5286 | 1014 0131 Lucent Win Modem | ||
| 5287 | 1033 8066 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5288 | 13e0 0030 56k Voice Modem | ||
| 5289 | 13e0 0040 LT WinModem 56k Data+Fax+Voice+Dsvd | ||
| 5290 | # Actiontech eth+modem card as used by Dell &c. | ||
| 5291 | 1668 2400 LT WinModem 56k (MiniPCI Ethernet+Modem) | ||
| 5292 | 0449 WinModem 56k | ||
| 5293 | 0e11 b14d 56k V.90 Modem | ||
| 5294 | 13e0 0020 LT WinModem 56k Data+Fax | ||
| 5295 | 13e0 0041 TelePath Internet 56k WinModem | ||
| 5296 | 1436 0440 Lucent Win Modem | ||
| 5297 | 144f 0449 Lucent 56k V.90 DFi Modem | ||
| 5298 | 1468 0410 IBM ThinkPad T23 (2647-4MG) | ||
| 5299 | 1468 0440 Lucent Win Modem | ||
| 5300 | 1468 0449 Presario 56k V.90 DFi Modem | ||
| 5301 | 044a F-1156IV WinModem (V90, 56KFlex) | ||
| 5302 | 10cf 1072 LB Global LT Modem | ||
| 5303 | 13e0 0012 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5304 | 13e0 0042 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5305 | 144f 1005 LT WinModem 56k Data+Fax+Voice+VoiceView+Dsvd | ||
| 5306 | 044b LT WinModem | ||
| 5307 | 044c LT WinModem | ||
| 5308 | 044d LT WinModem | ||
| 5309 | 044e LT WinModem | ||
| 5310 | 044f V90 WildWire Modem | ||
| 5311 | 0450 LT WinModem | ||
| 5312 | 1033 80a8 Versa Note Vxi | ||
| 5313 | 144f 4005 Magnia SG20 | ||
| 5314 | 0451 LT WinModem | ||
| 5315 | 0452 LT WinModem | ||
| 5316 | 0453 LT WinModem | ||
| 5317 | 0454 LT WinModem | ||
| 5318 | 0455 LT WinModem | ||
| 5319 | 0456 LT WinModem | ||
| 5320 | 0457 LT WinModem | ||
| 5321 | 0458 LT WinModem | ||
| 5322 | 0459 LT WinModem | ||
| 5323 | 045a LT WinModem | ||
| 5324 | 045c LT WinModem | ||
| 5325 | 0461 V90 WildWire Modem | ||
| 5326 | 0462 V90 WildWire Modem | ||
| 5327 | 0480 Venus Modem (V90, 56KFlex) | ||
| 5328 | 048c V.92 56K WinModem | ||
| 5329 | # InPorte Home Internal 56k Modem/fax/answering machine/SMS Features | ||
| 5330 | 048f V.92 56k WinModem | ||
| 5331 | 5801 USB | ||
| 5332 | 5802 USS-312 USB Controller | ||
| 5333 | # 4 port PCI USB Controller made by Agere (formely Lucent) | ||
| 5334 | 5803 USS-344S USB Controller | ||
| 5335 | 5811 FW323 | ||
| 5336 | 8086 524c D865PERL mainboard | ||
| 5337 | dead 0800 FireWire Host Bus Adapter | ||
| 5338 | ab10 WL60010 Wireless LAN MAC | ||
| 5339 | ab11 WL60040 Multimode Wireles LAN MAC | ||
| 5340 | 11c1 ab12 WaveLAN 11abg Cardbus card (Model 1102) | ||
| 5341 | 11c1 ab13 WaveLAN 11abg MiniPCI card (Model 0512) | ||
| 5342 | 11c1 ab15 WaveLAN 11abg Cardbus card (Model 1106) | ||
| 5343 | 11c1 ab16 WaveLAN 11abg MiniPCI card (Model 0516) | ||
| 5344 | ab20 ORiNOCO PCI Adapter | ||
| 5345 | ab21 Agere Wireless PCI Adapter | ||
| 5346 | ab30 Hermes2 Mini-PCI WaveLAN a/b/g | ||
| 5347 | 14cd 2012 Hermes2 Mini-PCI WaveLAN a/b/g | ||
| 5348 | 11c2 Sand Microelectronics | ||
| 5349 | 11c3 NEC Corporation | ||
| 5350 | 11c4 Document Technologies, Inc | ||
| 5351 | 11c5 Shiva Corporation | ||
| 5352 | 11c6 Dainippon Screen Mfg. Co. Ltd | ||
| 5353 | 11c7 D.C.M. Data Systems | ||
| 5354 | 11c8 Dolphin Interconnect Solutions AS | ||
| 5355 | 0658 PSB32 SCI-Adapter D31x | ||
| 5356 | d665 PSB64 SCI-Adapter D32x | ||
| 5357 | d667 PSB66 SCI-Adapter D33x | ||
| 5358 | 11c9 Magma | ||
| 5359 | 0010 16-line serial port w/- DMA | ||
| 5360 | 0011 4-line serial port w/- DMA | ||
| 5361 | 11ca LSI Systems, Inc | ||
| 5362 | 11cb Specialix Research Ltd. | ||
| 5363 | 2000 PCI_9050 | ||
| 5364 | 11cb 0200 SX | ||
| 5365 | 11cb b008 I/O8+ | ||
| 5366 | 4000 SUPI_1 | ||
| 5367 | 8000 T225 | ||
| 5368 | 11cc Michels & Kleberhoff Computer GmbH | ||
| 5369 | 11cd HAL Computer Systems, Inc. | ||
| 5370 | 11ce Netaccess | ||
| 5371 | 11cf Pioneer Electronic Corporation | ||
| 5372 | 11d0 Lockheed Martin Federal Systems-Manassas | ||
| 5373 | 11d1 Auravision | ||
| 5374 | 01f7 VxP524 | ||
| 5375 | 11d2 Intercom Inc. | ||
| 5376 | 11d3 Trancell Systems Inc | ||
| 5377 | 11d4 Analog Devices | ||
| 5378 | 1535 Blackfin BF535 processor | ||
| 5379 | 1805 SM56 PCI modem | ||
| 5380 | 1889 AD1889 sound chip | ||
| 5381 | 11d5 Ikon Corporation | ||
| 5382 | 0115 10115 | ||
| 5383 | 0117 10117 | ||
| 5384 | 11d6 Tekelec Telecom | ||
| 5385 | 11d7 Trenton Technology, Inc. | ||
| 5386 | 11d8 Image Technologies Development | ||
| 5387 | 11d9 TEC Corporation | ||
| 5388 | 11da Novell | ||
| 5389 | 11db Sega Enterprises Ltd | ||
| 5390 | 11dc Questra Corporation | ||
| 5391 | 11dd Crosfield Electronics Limited | ||
| 5392 | 11de Zoran Corporation | ||
| 5393 | 6057 ZR36057PQC Video cutting chipset | ||
| 5394 | 1031 7efe DC10 Plus | ||
| 5395 | 1031 fc00 MiroVIDEO DC50, Motion JPEG Capture/CODEC Board | ||
| 5396 | 13ca 4231 JPEG/TV Card | ||
| 5397 | 6120 ZR36120 | ||
| 5398 | 1328 f001 Cinemaster C DVD Decoder | ||
| 5399 | 11df New Wave PDG | ||
| 5400 | 11e0 Cray Communications A/S | ||
| 5401 | 11e1 GEC Plessey Semi Inc. | ||
| 5402 | 11e2 Samsung Information Systems America | ||
| 5403 | 11e3 Quicklogic Corporation | ||
| 5404 | 5030 PC Watchdog | ||
| 5405 | 11e4 Second Wave Inc | ||
| 5406 | 11e5 IIX Consulting | ||
| 5407 | 11e6 Mitsui-Zosen System Research | ||
| 5408 | 11e7 Toshiba America, Elec. Company | ||
| 5409 | 11e8 Digital Processing Systems Inc. | ||
| 5410 | 11e9 Highwater Designs Ltd. | ||
| 5411 | 11ea Elsag Bailey | ||
| 5412 | 11eb Formation Inc. | ||
| 5413 | 11ec Coreco Inc | ||
| 5414 | 11ed Mediamatics | ||
| 5415 | 11ee Dome Imaging Systems Inc | ||
| 5416 | 11ef Nicolet Technologies B.V. | ||
| 5417 | 11f0 Compu-Shack | ||
| 5418 | 4231 FDDI | ||
| 5419 | 4232 FASTline UTP Quattro | ||
| 5420 | 4233 FASTline FO | ||
| 5421 | 4234 FASTline UTP | ||
| 5422 | 4235 FASTline-II UTP | ||
| 5423 | 4236 FASTline-II FO | ||
| 5424 | 4731 GIGAline | ||
| 5425 | 11f1 Symbios Logic Inc | ||
| 5426 | 11f2 Picture Tel Japan K.K. | ||
| 5427 | 11f3 Keithley Metrabyte | ||
| 5428 | 11f4 Kinetic Systems Corporation | ||
| 5429 | 2915 CAMAC controller | ||
| 5430 | 11f5 Computing Devices International | ||
| 5431 | 11f6 Compex | ||
| 5432 | 0112 ENet100VG4 | ||
| 5433 | 0113 FreedomLine 100 | ||
| 5434 | 1401 ReadyLink 2000 | ||
| 5435 | 2011 RL100-ATX 10/100 | ||
| 5436 | 11f6 2011 RL100-ATX | ||
| 5437 | 2201 ReadyLink 100TX (Winbond W89C840) | ||
| 5438 | 11f6 2011 ReadyLink 100TX | ||
| 5439 | 9881 RL100TX Fast Ethernet | ||
| 5440 | 11f7 Scientific Atlanta | ||
| 5441 | 11f8 PMC-Sierra Inc. | ||
| 5442 | 7375 PM7375 [LASAR-155 ATM SAR] | ||
| 5443 | 11f9 I-Cube Inc | ||
| 5444 | 11fa Kasan Electronics Company, Ltd. | ||
| 5445 | 11fb Datel Inc | ||
| 5446 | 11fc Silicon Magic | ||
| 5447 | 11fd High Street Consultants | ||
| 5448 | 11fe Comtrol Corporation | ||
| 5449 | 0001 RocketPort 32 port w/external I/F | ||
| 5450 | 0002 RocketPort 8 port w/external I/F | ||
| 5451 | 0003 RocketPort 16 port w/external I/F | ||
| 5452 | 0004 RocketPort 4 port w/quad cable | ||
| 5453 | 0005 RocketPort 8 port w/octa cable | ||
| 5454 | 0006 RocketPort 8 port w/RJ11 connectors | ||
| 5455 | 0007 RocketPort 4 port w/RJ11 connectors | ||
| 5456 | 0008 RocketPort 8 port w/ DB78 SNI (Siemens) connector | ||
| 5457 | 0009 RocketPort 16 port w/ DB78 SNI (Siemens) connector | ||
| 5458 | 000a RocketPort Plus 4 port | ||
| 5459 | 000b RocketPort Plus 8 port | ||
| 5460 | 000c RocketModem 6 port | ||
| 5461 | 000d RocketModem 4-port | ||
| 5462 | 000e RocketPort Plus 2 port RS232 | ||
| 5463 | 000f RocketPort Plus 2 port RS422 | ||
| 5464 | 0801 RocketPort UPCI 32 port w/external I/F | ||
| 5465 | 0802 RocketPort UPCI 8 port w/external I/F | ||
| 5466 | 0803 RocketPort UPCI 16 port w/external I/F | ||
| 5467 | 0805 RocketPort UPCI 8 port w/octa cable | ||
| 5468 | 080c RocketModem III 8 port | ||
| 5469 | 080d RocketModem III 4 port | ||
| 5470 | 0903 RocketPort Compact PCI 16 port w/external I/F | ||
| 5471 | 8015 RocketPort 4-port UART 16954 | ||
| 5472 | 11ff Scion Corporation | ||
| 5473 | 0003 AG-5 | ||
| 5474 | 1200 CSS Corporation | ||
| 5475 | 1201 Vista Controls Corp | ||
| 5476 | 1202 Network General Corp. | ||
| 5477 | 4300 Gigabit Ethernet Adapter | ||
| 5478 | 1202 9841 SK-9841 LX | ||
| 5479 | 1202 9842 SK-9841 LX dual link | ||
| 5480 | 1202 9843 SK-9843 SX | ||
| 5481 | 1202 9844 SK-9843 SX dual link | ||
| 5482 | 1203 Bayer Corporation, Agfa Division | ||
| 5483 | 1204 Lattice Semiconductor Corporation | ||
| 5484 | 1205 Array Corporation | ||
| 5485 | 1206 Amdahl Corporation | ||
| 5486 | 1208 Parsytec GmbH | ||
| 5487 | 4853 HS-Link Device | ||
| 5488 | 1209 SCI Systems Inc | ||
| 5489 | 120a Synaptel | ||
| 5490 | 120b Adaptive Solutions | ||
| 5491 | 120c Technical Corp. | ||
| 5492 | 120d Compression Labs, Inc. | ||
| 5493 | 120e Cyclades Corporation | ||
| 5494 | 0100 Cyclom-Y below first megabyte | ||
| 5495 | 0101 Cyclom-Y above first megabyte | ||
| 5496 | 0102 Cyclom-4Y below first megabyte | ||
| 5497 | 0103 Cyclom-4Y above first megabyte | ||
| 5498 | 0104 Cyclom-8Y below first megabyte | ||
| 5499 | 0105 Cyclom-8Y above first megabyte | ||
| 5500 | 0200 Cyclades-Z below first megabyte | ||
| 5501 | 0201 Cyclades-Z above first megabyte | ||
| 5502 | 0300 PC300/RSV or /X21 (2 ports) | ||
| 5503 | 0301 PC300/RSV or /X21 (1 port) | ||
| 5504 | 0310 PC300/TE (2 ports) | ||
| 5505 | 0311 PC300/TE (1 port) | ||
| 5506 | 0320 PC300/TE-M (2 ports) | ||
| 5507 | 0321 PC300/TE-M (1 port) | ||
| 5508 | 0400 PC400 | ||
| 5509 | 120f Essential Communications | ||
| 5510 | 0001 Roadrunner serial HIPPI | ||
| 5511 | 1210 Hyperparallel Technologies | ||
| 5512 | 1211 Braintech Inc | ||
| 5513 | 1212 Kingston Technology Corp. | ||
| 5514 | 1213 Applied Intelligent Systems, Inc. | ||
| 5515 | 1214 Performance Technologies, Inc. | ||
| 5516 | 1215 Interware Co., Ltd | ||
| 5517 | 1216 Purup Prepress A/S | ||
| 5518 | 1217 O2 Micro, Inc. | ||
| 5519 | 6729 OZ6729 | ||
| 5520 | 673a OZ6730 | ||
| 5521 | 6832 OZ6832/6833 CardBus Controller | ||
| 5522 | 6836 OZ6836/6860 CardBus Controller | ||
| 5523 | 6872 OZ6812 CardBus Controller | ||
| 5524 | 6925 OZ6922 CardBus Controller | ||
| 5525 | 6933 OZ6933/711E1 CardBus/SmartCardBus Controller | ||
| 5526 | 1025 1016 Travelmate 612 TX | ||
| 5527 | 6972 OZ601/6912/711E0 CardBus/SmartCardBus Controller | ||
| 5528 | 1014 020c ThinkPad R30 | ||
| 5529 | 1179 0001 Magnia Z310 | ||
| 5530 | 7110 OZ711Mx 4-in-1 MemoryCardBus Accelerator | ||
| 5531 | 103c 088c nc8000 laptop | ||
| 5532 | 103c 0890 nc6000 laptop | ||
| 5533 | 7112 OZ711EC1/M1 SmartCardBus/MemoryCardBus Controller | ||
| 5534 | 7113 OZ711EC1 SmartCardBus Controller | ||
| 5535 | 7114 OZ711M1/MC1 4-in-1 MemoryCardBus Controller | ||
| 5536 | 7134 OZ711MP1/MS1 MemoryCardBus Controller | ||
| 5537 | 71e2 OZ711E2 SmartCardBus Controller | ||
| 5538 | 7212 OZ711M2 4-in-1 MemoryCardBus Controller | ||
| 5539 | 7213 OZ6933E CardBus Controller | ||
| 5540 | 7223 OZ711M3/MC3 4-in-1 MemoryCardBus Controller | ||
| 5541 | 103c 088c nc8000 laptop | ||
| 5542 | 103c 0890 nc6000 laptop | ||
| 5543 | 7233 OZ711MP3/MS3 4-in-1 MemoryCardBus Controller | ||
| 5544 | 1218 Hybricon Corp. | ||
| 5545 | 1219 First Virtual Corporation | ||
| 5546 | 121a 3Dfx Interactive, Inc. | ||
| 5547 | 0001 Voodoo | ||
| 5548 | 0002 Voodoo 2 | ||
| 5549 | 0003 Voodoo Banshee | ||
| 5550 | 1092 0003 Monster Fusion | ||
| 5551 | 1092 4000 Monster Fusion | ||
| 5552 | 1092 4002 Monster Fusion | ||
| 5553 | 1092 4801 Monster Fusion AGP | ||
| 5554 | 1092 4803 Monster Fusion AGP | ||
| 5555 | 1092 8030 Monster Fusion | ||
| 5556 | 1092 8035 Monster Fusion AGP | ||
| 5557 | 10b0 0001 Dragon 4000 | ||
| 5558 | 1102 1018 3D Blaster Banshee VE | ||
| 5559 | 121a 0001 Voodoo Banshee AGP | ||
| 5560 | 121a 0003 Voodoo Banshee AGP SGRAM | ||
| 5561 | 121a 0004 Voodoo Banshee | ||
| 5562 | 139c 0016 Raven | ||
| 5563 | 139c 0017 Raven | ||
| 5564 | 14af 0002 Maxi Gamer Phoenix | ||
| 5565 | 0004 Voodoo Banshee [Velocity 100] | ||
| 5566 | 0005 Voodoo 3 | ||
| 5567 | 121a 0004 Voodoo3 AGP | ||
| 5568 | 121a 0030 Voodoo3 AGP | ||
| 5569 | 121a 0031 Voodoo3 AGP | ||
| 5570 | 121a 0034 Voodoo3 AGP | ||
| 5571 | 121a 0036 Voodoo3 2000 PCI | ||
| 5572 | 121a 0037 Voodoo3 AGP | ||
| 5573 | 121a 0038 Voodoo3 AGP | ||
| 5574 | 121a 003a Voodoo3 AGP | ||
| 5575 | 121a 0044 Voodoo3 | ||
| 5576 | 121a 004b Velocity 100 | ||
| 5577 | 121a 004c Velocity 200 | ||
| 5578 | 121a 004d Voodoo3 AGP | ||
| 5579 | 121a 004e Voodoo3 AGP | ||
| 5580 | 121a 0051 Voodoo3 AGP | ||
| 5581 | 121a 0052 Voodoo3 AGP | ||
| 5582 | 121a 0060 Voodoo3 3500 TV (NTSC) | ||
| 5583 | 121a 0061 Voodoo3 3500 TV (PAL) | ||
| 5584 | 121a 0062 Voodoo3 3500 TV (SECAM) | ||
| 5585 | 0009 Voodoo 4 / Voodoo 5 | ||
| 5586 | 121a 0003 Voodoo5 PCI 5500 | ||
| 5587 | 121a 0009 Voodoo5 AGP 5500/6000 | ||
| 5588 | 0057 Voodoo 3/3000 [Avenger] | ||
| 5589 | 121b Advanced Telecommunications Modules | ||
| 5590 | 121c Nippon Texaco., Ltd | ||
| 5591 | 121d Lippert Automationstechnik GmbH | ||
| 5592 | 121e CSPI | ||
| 5593 | 121f Arcus Technology, Inc. | ||
| 5594 | 1220 Ariel Corporation | ||
| 5595 | 1220 AMCC 5933 TMS320C80 DSP/Imaging board | ||
| 5596 | 1221 Contec Co., Ltd | ||
| 5597 | 1222 Ancor Communications, Inc. | ||
| 5598 | 1223 Artesyn Communication Products | ||
| 5599 | 0003 PM/Link | ||
| 5600 | 0004 PM/T1 | ||
| 5601 | 0005 PM/E1 | ||
| 5602 | 0008 PM/SLS | ||
| 5603 | 0009 BajaSpan Resource Target | ||
| 5604 | 000a BajaSpan Section 0 | ||
| 5605 | 000b BajaSpan Section 1 | ||
| 5606 | 000c BajaSpan Section 2 | ||
| 5607 | 000d BajaSpan Section 3 | ||
| 5608 | 000e PM/PPC | ||
| 5609 | 1224 Interactive Images | ||
| 5610 | 1225 Power I/O, Inc. | ||
| 5611 | 1227 Tech-Source | ||
| 5612 | 0006 Raptor GFX 8P | ||
| 5613 | 1228 Norsk Elektro Optikk A/S | ||
| 5614 | 1229 Data Kinesis Inc. | ||
| 5615 | 122a Integrated Telecom | ||
| 5616 | 122b LG Industrial Systems Co., Ltd | ||
| 5617 | 122c Sican GmbH | ||
| 5618 | 122d Aztech System Ltd | ||
| 5619 | 1206 368DSP | ||
| 5620 | 1400 Trident PCI288-Q3DII (NX) | ||
| 5621 | 50dc 3328 Audio | ||
| 5622 | 122d 0001 3328 Audio | ||
| 5623 | 80da 3328 Audio | ||
| 5624 | 122d 0001 3328 Audio | ||
| 5625 | 122e Xyratex | ||
| 5626 | 122f Andrew Corporation | ||
| 5627 | 1230 Fishcamp Engineering | ||
| 5628 | 1231 Woodward McCoach, Inc. | ||
| 5629 | 1232 GPT Limited | ||
| 5630 | 1233 Bus-Tech, Inc. | ||
| 5631 | 1234 Technical Corp. | ||
| 5632 | 1235 Risq Modular Systems, Inc. | ||
| 5633 | 1236 Sigma Designs Corporation | ||
| 5634 | 0000 RealMagic64/GX | ||
| 5635 | 6401 REALmagic 64/GX (SD 6425) | ||
| 5636 | 1237 Alta Technology Corporation | ||
| 5637 | 1238 Adtran | ||
| 5638 | 1239 3DO Company | ||
| 5639 | 123a Visicom Laboratories, Inc. | ||
| 5640 | 123b Seeq Technology, Inc. | ||
| 5641 | 123c Century Systems, Inc. | ||
| 5642 | 123d Engineering Design Team, Inc. | ||
| 5643 | 0000 EasyConnect 8/32 | ||
| 5644 | 0002 EasyConnect 8/64 | ||
| 5645 | 0003 EasyIO | ||
| 5646 | 123e Simutech, Inc. | ||
| 5647 | 123f C-Cube Microsystems | ||
| 5648 | 00e4 MPEG | ||
| 5649 | 8120 E4? | ||
| 5650 | 11bd 0006 DV500 E4 | ||
| 5651 | 11bd 000a DV500 E4 | ||
| 5652 | 11bd 000f DV500 E4 | ||
| 5653 | 8888 Cinemaster C 3.0 DVD Decoder | ||
| 5654 | 1002 0001 Cinemaster C 3.0 DVD Decoder | ||
| 5655 | 1002 0002 Cinemaster C 3.0 DVD Decoder | ||
| 5656 | 1328 0001 Cinemaster C 3.0 DVD Decoder | ||
| 5657 | 1240 Marathon Technologies Corp. | ||
| 5658 | 1241 DSC Communications | ||
| 5659 | # Formerly Jaycor Networks, Inc. | ||
| 5660 | 1242 JNI Corporation | ||
| 5661 | 1560 JNIC-1560 PCI-X Fibre Channel Controller | ||
| 5662 | 1242 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter | ||
| 5663 | 1242 656a FCX-6562 PCI-X Fibre Channel Adapter | ||
| 5664 | 4643 FCI-1063 Fibre Channel Adapter | ||
| 5665 | 6562 FCX2-6562 Dual Channel PCI-X Fibre Channel Adapter | ||
| 5666 | 656a FCX-6562 PCI-X Fibre Channel Adapter | ||
| 5667 | 1243 Delphax | ||
| 5668 | 1244 AVM Audiovisuelles MKTG & Computer System GmbH | ||
| 5669 | 0700 B1 ISDN | ||
| 5670 | 0800 C4 ISDN | ||
| 5671 | 0a00 A1 ISDN [Fritz] | ||
| 5672 | 1244 0a00 FRITZ!Card ISDN Controller | ||
| 5673 | 0e00 Fritz!PCI v2.0 ISDN | ||
| 5674 | 1100 C2 ISDN | ||
| 5675 | 1200 T1 ISDN | ||
| 5676 | 2700 Fritz!Card DSL SL | ||
| 5677 | 2900 Fritz!Card DSL v2.0 | ||
| 5678 | 1245 A.P.D., S.A. | ||
| 5679 | 1246 Dipix Technologies, Inc. | ||
| 5680 | 1247 Xylon Research, Inc. | ||
| 5681 | 1248 Central Data Corporation | ||
| 5682 | 1249 Samsung Electronics Co., Ltd. | ||
| 5683 | 124a AEG Electrocom GmbH | ||
| 5684 | 124b SBS/Greenspring Modular I/O | ||
| 5685 | 0040 PCI-40A or cPCI-200 Quad IndustryPack carrier | ||
| 5686 | 124b 9080 PCI9080 Bridge | ||
| 5687 | 124c Solitron Technologies, Inc. | ||
| 5688 | 124d Stallion Technologies, Inc. | ||
| 5689 | 0000 EasyConnection 8/32 | ||
| 5690 | 0002 EasyConnection 8/64 | ||
| 5691 | 0003 EasyIO | ||
| 5692 | 0004 EasyConnection/RA | ||
| 5693 | 124e Cylink | ||
| 5694 | 124f Infortrend Technology, Inc. | ||
| 5695 | 0041 IFT-2000 Series RAID Controller | ||
| 5696 | 1250 Hitachi Microcomputer System Ltd | ||
| 5697 | 1251 VLSI Solutions Oy | ||
| 5698 | 1253 Guzik Technical Enterprises | ||
| 5699 | 1254 Linear Systems Ltd. | ||
| 5700 | 1255 Optibase Ltd | ||
| 5701 | 1110 MPEG Forge | ||
| 5702 | 1210 MPEG Fusion | ||
| 5703 | 2110 VideoPlex | ||
| 5704 | 2120 VideoPlex CC | ||
| 5705 | 2130 VideoQuest | ||
| 5706 | 1256 Perceptive Solutions, Inc. | ||
| 5707 | 4201 PCI-2220I | ||
| 5708 | 4401 PCI-2240I | ||
| 5709 | 5201 PCI-2000 | ||
| 5710 | 1257 Vertex Networks, Inc. | ||
| 5711 | 1258 Gilbarco, Inc. | ||
| 5712 | 1259 Allied Telesyn International | ||
| 5713 | 2560 AT-2560 Fast Ethernet Adapter (i82557B) | ||
| 5714 | a117 RTL81xx Fast Ethernet | ||
| 5715 | a120 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 5716 | 125a ABB Power Systems | ||
| 5717 | 125b Asix Electronics Corporation | ||
| 5718 | 1400 ALFA GFC2204 Fast Ethernet | ||
| 5719 | 125c Aurora Technologies, Inc. | ||
| 5720 | 0101 Saturn 4520P | ||
| 5721 | 0640 Aries 16000P | ||
| 5722 | 125d ESS Technology | ||
| 5723 | 0000 ES336H Fax Modem (Early Model) | ||
| 5724 | 1948 Solo? | ||
| 5725 | 1968 ES1968 Maestro 2 | ||
| 5726 | 1028 0085 ES1968 Maestro-2 PCI | ||
| 5727 | 1033 8051 ES1968 Maestro-2 Audiodrive | ||
| 5728 | 1969 ES1969 Solo-1 Audiodrive | ||
| 5729 | 1014 0166 ES1969 SOLO-1 AudioDrive on IBM Aptiva Mainboard | ||
| 5730 | 125d 8888 Solo-1 Audio Adapter | ||
| 5731 | 153b 111b Terratec 128i PCI | ||
| 5732 | 1978 ES1978 Maestro 2E | ||
| 5733 | 0e11 b112 Armada M700/E500 | ||
| 5734 | 1033 803c ES1978 Maestro-2E Audiodrive | ||
| 5735 | 1033 8058 ES1978 Maestro-2E Audiodrive | ||
| 5736 | 1092 4000 Monster Sound MX400 | ||
| 5737 | 1179 0001 ES1978 Maestro-2E Audiodrive | ||
| 5738 | 1988 ES1988 Allegro-1 | ||
| 5739 | 1092 4100 Sonic Impact S100 | ||
| 5740 | 125d 1988 ESS Allegro-1 Audiodrive | ||
| 5741 | 1989 ESS Modem | ||
| 5742 | 125d 1989 ESS Modem | ||
| 5743 | 1998 ES1983S Maestro-3i PCI Audio Accelerator | ||
| 5744 | 1028 00b1 Latitude C600 | ||
| 5745 | 1028 00e6 ES1983S Maestro-3i (Dell Inspiron 8100) | ||
| 5746 | 1999 ES1983S Maestro-3i PCI Modem Accelerator | ||
| 5747 | 199a ES1983S Maestro-3i PCI Audio Accelerator | ||
| 5748 | 199b ES1983S Maestro-3i PCI Modem Accelerator | ||
| 5749 | 2808 ES336H Fax Modem (Later Model) | ||
| 5750 | 2838 ES2838/2839 SuperLink Modem | ||
| 5751 | 2898 ES2898 Modem | ||
| 5752 | 125d 0424 ES56-PI Data Fax Modem | ||
| 5753 | 125d 0425 ES56T-PI Data Fax Modem | ||
| 5754 | 125d 0426 ES56V-PI Data Fax Modem | ||
| 5755 | 125d 0427 VW-PI Data Fax Modem | ||
| 5756 | 125d 0428 ES56ST-PI Data Fax Modem | ||
| 5757 | 125d 0429 ES56SV-PI Data Fax Modem | ||
| 5758 | 147a c001 ES56-PI Data Fax Modem | ||
| 5759 | 14fe 0428 ES56-PI Data Fax Modem | ||
| 5760 | 14fe 0429 ES56-PI Data Fax Modem | ||
| 5761 | 125e Specialvideo Engineering SRL | ||
| 5762 | 125f Concurrent Technologies, Inc. | ||
| 5763 | 1260 Intersil Corporation | ||
| 5764 | 3872 Prism 2.5 Wavelan chipset | ||
| 5765 | 1468 0202 LAN-Express IEEE 802.11b Wireless LAN | ||
| 5766 | 3873 Prism 2.5 Wavelan chipset | ||
| 5767 | 1186 3501 DWL-520 Wireless PCI Adapter | ||
| 5768 | 1186 3700 DWL-520 Wireless PCI Adapter, Rev E1 | ||
| 5769 | 1385 4105 MA311 802.11b wireless adapter | ||
| 5770 | 1668 0414 HWP01170-01 802.11b PCI Wireless Adapter | ||
| 5771 | 16a5 1601 AIR.mate PC-400 PCI Wireless LAN Adapter | ||
| 5772 | 1737 3874 WMP11 Wireless 802.11b PCI Adapter | ||
| 5773 | 8086 2513 Wireless 802.11b MiniPCI Adapter | ||
| 5774 | 3886 ISL3886 [Prism Javelin/Prism Xbow] | ||
| 5775 | 17cf 0037 Z-Com XG-901 and clones Wireless Adapter | ||
| 5776 | 3890 Intersil ISL3890 [Prism GT/Prism Duette] | ||
| 5777 | 10b8 2802 SMC2802W Wireless PCI Adapter | ||
| 5778 | 10b8 2835 SMC2835W Wireless Cardbus Adapter | ||
| 5779 | 10b8 a835 SMC2835W V2 Wireless Cardbus Adapter | ||
| 5780 | 1113 ee03 SMC2802W V2 Wireless PCI Adapter | ||
| 5781 | 1113 ee08 SMC2835W V3 EU Wireless Cardbus Adapter | ||
| 5782 | 1186 3202 DWL-G650 A1 Wireless Adapter | ||
| 5783 | 1259 c104 CG-WLCB54GT Wireless Adapter | ||
| 5784 | 1385 4800 WG511 Wireless Adapter | ||
| 5785 | 16a5 1605 ALLNET ALL0271 Wireless PCI Adapter | ||
| 5786 | 17cf 0014 Z-Com XG-600 and clones Wireless Adapter | ||
| 5787 | 17cf 0020 Z-Com XG-900 and clones Wireless Adapter | ||
| 5788 | 8130 HMP8130 NTSC/PAL Video Decoder | ||
| 5789 | 8131 HMP8131 NTSC/PAL Video Decoder | ||
| 5790 | 1261 Matsushita-Kotobuki Electronics Industries, Ltd. | ||
| 5791 | 1262 ES Computer Company, Ltd. | ||
| 5792 | 1263 Sonic Solutions | ||
| 5793 | 1264 Aval Nagasaki Corporation | ||
| 5794 | 1265 Casio Computer Co., Ltd. | ||
| 5795 | 1266 Microdyne Corporation | ||
| 5796 | 0001 NE10/100 Adapter (i82557B) | ||
| 5797 | 1910 NE2000Plus (RT8029) Ethernet Adapter | ||
| 5798 | 1266 1910 NE2000Plus Ethernet Adapter | ||
| 5799 | 1267 S. A. Telecommunications | ||
| 5800 | 5352 PCR2101 | ||
| 5801 | 5a4b Telsat Turbo | ||
| 5802 | 1268 Tektronix | ||
| 5803 | 1269 Thomson-CSF/TTM | ||
| 5804 | 126a Lexmark International, Inc. | ||
| 5805 | 126b Adax, Inc. | ||
| 5806 | 126c Northern Telecom | ||
| 5807 | 1211 10/100BaseTX [RTL81xx] | ||
| 5808 | 126c 802.11b Wireless Ethernet Adapter | ||
| 5809 | 126d Splash Technology, Inc. | ||
| 5810 | 126e Sumitomo Metal Industries, Ltd. | ||
| 5811 | 126f Silicon Motion, Inc. | ||
| 5812 | 0501 SM501 VoyagerGX | ||
| 5813 | 0710 SM710 LynxEM | ||
| 5814 | 0712 SM712 LynxEM+ | ||
| 5815 | 0720 SM720 Lynx3DM | ||
| 5816 | 0730 SM731 Cougar3DR | ||
| 5817 | 0810 SM810 LynxE | ||
| 5818 | 0811 SM811 LynxE | ||
| 5819 | 0820 SM820 Lynx3D | ||
| 5820 | 0910 SM910 | ||
| 5821 | 1270 Olympus Optical Co., Ltd. | ||
| 5822 | 1271 GW Instruments | ||
| 5823 | 1272 Telematics International | ||
| 5824 | 1273 Hughes Network Systems | ||
| 5825 | 0002 DirecPC | ||
| 5826 | 1274 Ensoniq | ||
| 5827 | 1171 ES1373 [AudioPCI] (also Creative Labs CT5803) | ||
| 5828 | 1371 ES1371 [AudioPCI-97] | ||
| 5829 | 0e11 0024 AudioPCI on Motherboard Compaq Deskpro | ||
| 5830 | 0e11 b1a7 ES1371, ES1373 AudioPCI | ||
| 5831 | 1033 80ac ES1371, ES1373 AudioPCI | ||
| 5832 | 1042 1854 Tazer | ||
| 5833 | 107b 8054 Tabor2 | ||
| 5834 | 1274 1371 Creative Sound Blaster AudioPCI64V, AudioPCI128 | ||
| 5835 | 1462 6470 ES1371, ES1373 AudioPCI On Motherboard MS-6147 1.1A | ||
| 5836 | 1462 6560 ES1371, ES1373 AudioPCI On Motherboard MS-6156 1.10 | ||
| 5837 | 1462 6630 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 1.0A | ||
| 5838 | 1462 6631 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 1.0A | ||
| 5839 | 1462 6632 ES1371, ES1373 AudioPCI On Motherboard MS-6163BX 2.0A | ||
| 5840 | 1462 6633 ES1371, ES1373 AudioPCI On Motherboard MS-6163VIA 2.0A | ||
| 5841 | 1462 6820 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00 | ||
| 5842 | 1462 6822 ES1371, ES1373 AudioPCI On Motherboard MS-6182 1.00A | ||
| 5843 | 1462 6830 ES1371, ES1373 AudioPCI On Motherboard MS-6183 1.00 | ||
| 5844 | 1462 6880 ES1371, ES1373 AudioPCI On Motherboard MS-6188 1.00 | ||
| 5845 | 1462 6900 ES1371, ES1373 AudioPCI On Motherboard MS-6190 1.00 | ||
| 5846 | 1462 6910 ES1371, ES1373 AudioPCI On Motherboard MS-6191 | ||
| 5847 | 1462 6930 ES1371, ES1373 AudioPCI On Motherboard MS-6193 | ||
| 5848 | 1462 6990 ES1371, ES1373 AudioPCI On Motherboard MS-6199BX 2.0A | ||
| 5849 | 1462 6991 ES1371, ES1373 AudioPCI On Motherboard MS-6199VIA 2.0A | ||
| 5850 | 14a4 2077 ES1371, ES1373 AudioPCI On Motherboard KR639 | ||
| 5851 | 14a4 2105 ES1371, ES1373 AudioPCI On Motherboard MR800 | ||
| 5852 | 14a4 2107 ES1371, ES1373 AudioPCI On Motherboard MR801 | ||
| 5853 | 14a4 2172 ES1371, ES1373 AudioPCI On Motherboard DR739 | ||
| 5854 | 1509 9902 ES1371, ES1373 AudioPCI On Motherboard KW11 | ||
| 5855 | 1509 9903 ES1371, ES1373 AudioPCI On Motherboard KW31 | ||
| 5856 | 1509 9904 ES1371, ES1373 AudioPCI On Motherboard KA11 | ||
| 5857 | 1509 9905 ES1371, ES1373 AudioPCI On Motherboard KC13 | ||
| 5858 | 152d 8801 ES1371, ES1373 AudioPCI On Motherboard CP810E | ||
| 5859 | 152d 8802 ES1371, ES1373 AudioPCI On Motherboard CP810 | ||
| 5860 | 152d 8803 ES1371, ES1373 AudioPCI On Motherboard P3810E | ||
| 5861 | 152d 8804 ES1371, ES1373 AudioPCI On Motherboard P3810-S | ||
| 5862 | 152d 8805 ES1371, ES1373 AudioPCI On Motherboard P3820-S | ||
| 5863 | 270f 2001 ES1371, ES1373 AudioPCI On Motherboard 6CTR | ||
| 5864 | 270f 2200 ES1371, ES1373 AudioPCI On Motherboard 6WTX | ||
| 5865 | 270f 3000 ES1371, ES1373 AudioPCI On Motherboard 6WSV | ||
| 5866 | 270f 3100 ES1371, ES1373 AudioPCI On Motherboard 6WIV2 | ||
| 5867 | 270f 3102 ES1371, ES1373 AudioPCI On Motherboard 6WIV | ||
| 5868 | 270f 7060 ES1371, ES1373 AudioPCI On Motherboard 6ASA2 | ||
| 5869 | 8086 4249 ES1371, ES1373 AudioPCI On Motherboard BI440ZX | ||
| 5870 | 8086 424c ES1371, ES1373 AudioPCI On Motherboard BL440ZX | ||
| 5871 | 8086 425a ES1371, ES1373 AudioPCI On Motherboard BZ440ZX | ||
| 5872 | 8086 4341 ES1371, ES1373 AudioPCI On Motherboard Cayman | ||
| 5873 | 8086 4343 ES1371, ES1373 AudioPCI On Motherboard Cape Cod | ||
| 5874 | 8086 4649 ES1371, ES1373 AudioPCI On Motherboard Fire Island | ||
| 5875 | 8086 464a ES1371, ES1373 AudioPCI On Motherboard FJ440ZX | ||
| 5876 | 8086 4d4f ES1371, ES1373 AudioPCI On Motherboard Montreal | ||
| 5877 | 8086 4f43 ES1371, ES1373 AudioPCI On Motherboard OC440LX | ||
| 5878 | 8086 5243 ES1371, ES1373 AudioPCI On Motherboard RC440BX | ||
| 5879 | 8086 5352 ES1371, ES1373 AudioPCI On Motherboard SunRiver | ||
| 5880 | 8086 5643 ES1371, ES1373 AudioPCI On Motherboard Vancouver | ||
| 5881 | 8086 5753 ES1371, ES1373 AudioPCI On Motherboard WS440BX | ||
| 5882 | 5000 ES1370 [AudioPCI] | ||
| 5883 | 5880 5880 AudioPCI | ||
| 5884 | 1274 2000 Creative Sound Blaster AudioPCI128 | ||
| 5885 | 1274 2003 Creative SoundBlaster AudioPCI 128 | ||
| 5886 | 1274 5880 Creative Sound Blaster AudioPCI128 | ||
| 5887 | 1274 8001 Sound Blaster 16PCI 4.1ch | ||
| 5888 | 1458 a000 5880 AudioPCI On Motherboard 6OXET | ||
| 5889 | 1462 6880 5880 AudioPCI On Motherboard MS-6188 1.00 | ||
| 5890 | 270f 2001 5880 AudioPCI On Motherboard 6CTR | ||
| 5891 | 270f 2200 5880 AudioPCI On Motherboard 6WTX | ||
| 5892 | 270f 7040 5880 AudioPCI On Motherboard 6ATA4 | ||
| 5893 | 1275 Network Appliance Corporation | ||
| 5894 | 1276 Switched Network Technologies, Inc. | ||
| 5895 | 1277 Comstream | ||
| 5896 | 1278 Transtech Parallel Systems Ltd. | ||
| 5897 | 0701 TPE3/TM3 PowerPC Node | ||
| 5898 | 0710 TPE5 PowerPC PCI board | ||
| 5899 | 1279 Transmeta Corporation | ||
| 5900 | 0295 Northbridge | ||
| 5901 | 0395 LongRun Northbridge | ||
| 5902 | 0396 SDRAM controller | ||
| 5903 | 0397 BIOS scratchpad | ||
| 5904 | 127a Rockwell International | ||
| 5905 | 1002 HCF 56k Data/Fax Modem | ||
| 5906 | 1092 094c SupraExpress 56i PRO [Diamond SUP2380] | ||
| 5907 | 122d 4002 HPG / MDP3858-U | ||
| 5908 | 122d 4005 MDP3858-E | ||
| 5909 | 122d 4007 MDP3858-A/-NZ | ||
| 5910 | 122d 4012 MDP3858-SA | ||
| 5911 | 122d 4017 MDP3858-W | ||
| 5912 | 122d 4018 MDP3858-W | ||
| 5913 | 127a 1002 Rockwell 56K D/F HCF Modem | ||
| 5914 | 1003 HCF 56k Data/Fax Modem | ||
| 5915 | 0e11 b0bc 229-DF Zephyr | ||
| 5916 | 0e11 b114 229-DF Cheetah | ||
| 5917 | 1033 802b 229-DF | ||
| 5918 | 13df 1003 PCI56RX Modem | ||
| 5919 | 13e0 0117 IBM | ||
| 5920 | 13e0 0147 IBM F-1156IV+/R3 Spain V.90 Modem | ||
| 5921 | 13e0 0197 IBM | ||
| 5922 | 13e0 01c7 IBM F-1156IV+/R3 WW V.90 Modem | ||
| 5923 | 13e0 01f7 IBM | ||
| 5924 | 1436 1003 IBM | ||
| 5925 | 1436 1103 IBM 5614PM3G V.90 Modem | ||
| 5926 | 1436 1602 Compaq 229-DF Ducati | ||
| 5927 | 1004 HCF 56k Data/Fax/Voice Modem | ||
| 5928 | 1048 1500 MicroLink 56k Modem | ||
| 5929 | 10cf 1059 Fujitsu 229-DFRT | ||
| 5930 | 1005 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 5931 | 1005 127a AOpen FM56-P | ||
| 5932 | 1033 8029 229-DFSV | ||
| 5933 | 1033 8054 Modem | ||
| 5934 | 10cf 103c Fujitsu | ||
| 5935 | 10cf 1055 Fujitsu 229-DFSV | ||
| 5936 | 10cf 1056 Fujitsu 229-DFSV | ||
| 5937 | 122d 4003 MDP3858SP-U | ||
| 5938 | 122d 4006 Packard Bell MDP3858V-E | ||
| 5939 | 122d 4008 MDP3858SP-A/SP-NZ | ||
| 5940 | 122d 4009 MDP3858SP-E | ||
| 5941 | 122d 4010 MDP3858V-U | ||
| 5942 | 122d 4011 MDP3858SP-SA | ||
| 5943 | 122d 4013 MDP3858V-A/V-NZ | ||
| 5944 | 122d 4015 MDP3858SP-W | ||
| 5945 | 122d 4016 MDP3858V-W | ||
| 5946 | 122d 4019 MDP3858V-SA | ||
| 5947 | 13df 1005 PCI56RVP Modem | ||
| 5948 | 13e0 0187 IBM | ||
| 5949 | 13e0 01a7 IBM | ||
| 5950 | 13e0 01b7 IBM DF-1156IV+/R3 Spain V.90 Modem | ||
| 5951 | 13e0 01d7 IBM DF-1156IV+/R3 WW V.90 Modem | ||
| 5952 | 1436 1005 IBM | ||
| 5953 | 1436 1105 IBM | ||
| 5954 | 1437 1105 IBM 5614PS3G V.90 Modem | ||
| 5955 | 1022 HCF 56k Modem | ||
| 5956 | 1436 1303 M3-5614PM3G V.90 Modem | ||
| 5957 | 1023 HCF 56k Data/Fax Modem | ||
| 5958 | 122d 4020 Packard Bell MDP3858-WE | ||
| 5959 | 122d 4023 MDP3858-UE | ||
| 5960 | 13e0 0247 IBM F-1156IV+/R6 Spain V.90 Modem | ||
| 5961 | 13e0 0297 IBM | ||
| 5962 | 13e0 02c7 IBM F-1156IV+/R6 WW V.90 Modem | ||
| 5963 | 1436 1203 IBM | ||
| 5964 | 1436 1303 IBM | ||
| 5965 | 1024 HCF 56k Data/Fax/Voice Modem | ||
| 5966 | 1025 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 5967 | 10cf 106a Fujitsu 235-DFSV | ||
| 5968 | 122d 4021 Packard Bell MDP3858V-WE | ||
| 5969 | 122d 4022 MDP3858SP-WE | ||
| 5970 | 122d 4024 MDP3858V-UE | ||
| 5971 | 122d 4025 MDP3858SP-UE | ||
| 5972 | 1026 HCF 56k PCI Speakerphone Modem | ||
| 5973 | 1032 HCF 56k Modem | ||
| 5974 | 1033 HCF 56k Modem | ||
| 5975 | 1034 HCF 56k Modem | ||
| 5976 | 1035 HCF 56k PCI Speakerphone Modem | ||
| 5977 | 1036 HCF 56k Modem | ||
| 5978 | 1085 HCF 56k Volcano PCI Modem | ||
| 5979 | 2005 HCF 56k Data/Fax Modem | ||
| 5980 | 104d 8044 229-DFSV | ||
| 5981 | 104d 8045 229-DFSV | ||
| 5982 | 104d 8055 PBE/Aztech 235W-DFSV | ||
| 5983 | 104d 8056 235-DFSV | ||
| 5984 | 104d 805a Modem | ||
| 5985 | 104d 805f Modem | ||
| 5986 | 104d 8074 Modem | ||
| 5987 | 2013 HSF 56k Data/Fax Modem | ||
| 5988 | 1179 0001 Modem | ||
| 5989 | 1179 ff00 Modem | ||
| 5990 | 2014 HSF 56k Data/Fax/Voice Modem | ||
| 5991 | 10cf 1057 Fujitsu Citicorp III | ||
| 5992 | 122d 4050 MSP3880-U | ||
| 5993 | 122d 4055 MSP3880-W | ||
| 5994 | 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 5995 | 10cf 1063 Fujitsu | ||
| 5996 | 10cf 1064 Fujitsu | ||
| 5997 | 1468 2015 Fujitsu | ||
| 5998 | 2016 HSF 56k Data/Fax/Voice/Spkp Modem | ||
| 5999 | 122d 4051 MSP3880V-W | ||
| 6000 | 122d 4052 MSP3880SP-W | ||
| 6001 | 122d 4054 MSP3880V-U | ||
| 6002 | 122d 4056 MSP3880SP-U | ||
| 6003 | 122d 4057 MSP3880SP-A | ||
| 6004 | 4311 Riptide HSF 56k PCI Modem | ||
| 6005 | 127a 4311 Ring Modular? Riptide HSF RT HP Dom | ||
| 6006 | 13e0 0210 HP-GVC | ||
| 6007 | 4320 Riptide PCI Audio Controller | ||
| 6008 | 1235 4320 Riptide PCI Audio Controller | ||
| 6009 | 4321 Riptide HCF 56k PCI Modem | ||
| 6010 | 1235 4321 Hewlett Packard DF | ||
| 6011 | 1235 4324 Hewlett Packard DF | ||
| 6012 | 13e0 0210 Hewlett Packard DF | ||
| 6013 | 144d 2321 Riptide | ||
| 6014 | 4322 Riptide PCI Game Controller | ||
| 6015 | 1235 4322 Riptide PCI Game Controller | ||
| 6016 | 8234 RapidFire 616X ATM155 Adapter | ||
| 6017 | 108d 0022 RapidFire 616X ATM155 Adapter | ||
| 6018 | 108d 0027 RapidFire 616X ATM155 Adapter | ||
| 6019 | 127b Pixera Corporation | ||
| 6020 | 127c Crosspoint Solutions, Inc. | ||
| 6021 | 127d Vela Research | ||
| 6022 | 127e Winnov, L.P. | ||
| 6023 | 127f Fujifilm | ||
| 6024 | 1280 Photoscript Group Ltd. | ||
| 6025 | 1281 Yokogawa Electric Corporation | ||
| 6026 | 1282 Davicom Semiconductor, Inc. | ||
| 6027 | 9009 Ethernet 100/10 MBit | ||
| 6028 | 9100 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6029 | 9102 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6030 | 9132 Ethernet 100/10 MBit | ||
| 6031 | 1283 Integrated Technology Express, Inc. | ||
| 6032 | 673a IT8330G | ||
| 6033 | 8212 IT/ITE8212 Dual channel ATA RAID controller (PCI version seems to be IT8212, embedded seems to be ITE8212) | ||
| 6034 | 1283 0001 IT/ITE8212 Dual channel ATA RAID controller | ||
| 6035 | 8330 IT8330G | ||
| 6036 | 8872 IT8874F PCI Dual Serial Port Controller | ||
| 6037 | 8888 IT8888F PCI to ISA Bridge with SMB | ||
| 6038 | 8889 IT8889F PCI to ISA Bridge | ||
| 6039 | e886 IT8330G | ||
| 6040 | 1284 Sahara Networks, Inc. | ||
| 6041 | 1285 Platform Technologies, Inc. | ||
| 6042 | 0100 AGOGO sound chip (aka ESS Maestro 1) | ||
| 6043 | 1286 Mazet GmbH | ||
| 6044 | 1287 M-Pact, Inc. | ||
| 6045 | 001e LS220D DVD Decoder | ||
| 6046 | 001f LS220C DVD Decoder | ||
| 6047 | 1288 Timestep Corporation | ||
| 6048 | 1289 AVC Technology, Inc. | ||
| 6049 | 128a Asante Technologies, Inc. | ||
| 6050 | 128b Transwitch Corporation | ||
| 6051 | 128c Retix Corporation | ||
| 6052 | 128d G2 Networks, Inc. | ||
| 6053 | 0021 ATM155 Adapter | ||
| 6054 | 128e Hoontech Corporation/Samho Multi Tech Ltd. | ||
| 6055 | 0008 ST128 WSS/SB | ||
| 6056 | 0009 ST128 SAM9407 | ||
| 6057 | 000a ST128 Game Port | ||
| 6058 | 000b ST128 MPU Port | ||
| 6059 | 000c ST128 Ctrl Port | ||
| 6060 | 128f Tateno Dennou, Inc. | ||
| 6061 | 1290 Sord Computer Corporation | ||
| 6062 | 1291 NCS Computer Italia | ||
| 6063 | 1292 Tritech Microelectronics Inc | ||
| 6064 | 1293 Media Reality Technology | ||
| 6065 | 1294 Rhetorex, Inc. | ||
| 6066 | 1295 Imagenation Corporation | ||
| 6067 | 1296 Kofax Image Products | ||
| 6068 | 1297 Holco Enterprise Co, Ltd/Shuttle Computer | ||
| 6069 | 1298 Spellcaster Telecommunications Inc. | ||
| 6070 | 1299 Knowledge Technology Lab. | ||
| 6071 | 129a VMetro, inc. | ||
| 6072 | 0615 PBT-615 PCI-X Bus Analyzer | ||
| 6073 | 129b Image Access | ||
| 6074 | 129c Jaycor | ||
| 6075 | 129d Compcore Multimedia, Inc. | ||
| 6076 | 129e Victor Company of Japan, Ltd. | ||
| 6077 | 129f OEC Medical Systems, Inc. | ||
| 6078 | 12a0 Allen-Bradley Company | ||
| 6079 | 12a1 Simpact Associates, Inc. | ||
| 6080 | 12a2 Newgen Systems Corporation | ||
| 6081 | 12a3 Lucent Technologies | ||
| 6082 | 8105 T8105 H100 Digital Switch | ||
| 6083 | 12a4 NTT Electronics Technology Company | ||
| 6084 | 12a5 Vision Dynamics Ltd. | ||
| 6085 | 12a6 Scalable Networks, Inc. | ||
| 6086 | 12a7 AMO GmbH | ||
| 6087 | 12a8 News Datacom | ||
| 6088 | 12a9 Xiotech Corporation | ||
| 6089 | 12aa SDL Communications, Inc. | ||
| 6090 | 12ab Yuan Yuan Enterprise Co., Ltd. | ||
| 6091 | 0002 AU8830 [Vortex2] Based Sound Card With A3D Support | ||
| 6092 | 3000 MPG-200C PCI DVD Decoder Card | ||
| 6093 | 12ac Measurex Corporation | ||
| 6094 | 12ad Multidata GmbH | ||
| 6095 | 12ae Alteon Networks Inc. | ||
| 6096 | 0001 AceNIC Gigabit Ethernet | ||
| 6097 | 1014 0104 Gigabit Ethernet-SX PCI Adapter | ||
| 6098 | 12ae 0001 Gigabit Ethernet-SX (Universal) | ||
| 6099 | 1410 0104 Gigabit Ethernet-SX PCI Adapter | ||
| 6100 | 0002 AceNIC Gigabit Ethernet (Copper) | ||
| 6101 | 10a9 8002 Acenic Gigabit Ethernet | ||
| 6102 | 12ae 0002 Gigabit Ethernet-T (3C986-T) | ||
| 6103 | 00fa Farallon PN9100-T Gigabit Ethernet | ||
| 6104 | 12af TDK USA Corp | ||
| 6105 | 12b0 Jorge Scientific Corp | ||
| 6106 | 12b1 GammaLink | ||
| 6107 | 12b2 General Signal Networks | ||
| 6108 | 12b3 Inter-Face Co Ltd | ||
| 6109 | 12b4 FutureTel Inc | ||
| 6110 | 12b5 Granite Systems Inc. | ||
| 6111 | 12b6 Natural Microsystems | ||
| 6112 | 12b7 Cognex Modular Vision Systems Div. - Acumen Inc. | ||
| 6113 | 12b8 Korg | ||
| 6114 | 12b9 3Com Corp, Modem Division (formerly US Robotics) | ||
| 6115 | 1006 WinModem | ||
| 6116 | 12b9 005c USR 56k Internal Voice WinModem (Model 3472) | ||
| 6117 | 12b9 005e USR 56k Internal WinModem (Models 662975) | ||
| 6118 | 12b9 0062 USR 56k Internal Voice WinModem (Model 662978) | ||
| 6119 | 12b9 0068 USR 56k Internal Voice WinModem (Model 5690) | ||
| 6120 | 12b9 007a USR 56k Internal Voice WinModem (Model 662974) | ||
| 6121 | 12b9 007f USR 56k Internal WinModem (Models 5698, 5699) | ||
| 6122 | 12b9 0080 USR 56k Internal WinModem (Models 2975, 3528) | ||
| 6123 | 12b9 0081 USR 56k Internal Voice WinModem (Models 2974, 3529) | ||
| 6124 | 12b9 0091 USR 56k Internal Voice WinModem (Model 2978) | ||
| 6125 | 1007 USR 56k Internal WinModem | ||
| 6126 | 12b9 00a3 USR 56k Internal WinModem (Model 3595) | ||
| 6127 | 1008 56K FaxModem Model 5610 | ||
| 6128 | 12b9 00a2 USR 56k Internal FAX Modem (Model 2977) | ||
| 6129 | 12b9 00aa USR 56k Internal Voice Modem (Model 2976) | ||
| 6130 | 12b9 00ab USR 56k Internal Voice Modem (Model 5609) | ||
| 6131 | 12b9 00ac USR 56k Internal Voice Modem (Model 3298) | ||
| 6132 | 12b9 00ad USR 56k Internal FAX Modem (Model 5610) | ||
| 6133 | 12ba BittWare, Inc. | ||
| 6134 | 12bb Nippon Unisoft Corporation | ||
| 6135 | 12bc Array Microsystems | ||
| 6136 | 12bd Computerm Corp. | ||
| 6137 | 12be Anchor Chips Inc. | ||
| 6138 | 3041 AN3041Q CO-MEM | ||
| 6139 | 3042 AN3042Q CO-MEM Lite | ||
| 6140 | 12be 3042 Anchor Chips Lite Evaluation Board | ||
| 6141 | 12bf Fujifilm Microdevices | ||
| 6142 | 12c0 Infimed | ||
| 6143 | 12c1 GMM Research Corp | ||
| 6144 | 12c2 Mentec Limited | ||
| 6145 | 12c3 Holtek Microelectronics Inc | ||
| 6146 | 0058 PCI NE2K Ethernet | ||
| 6147 | 5598 PCI NE2K Ethernet | ||
| 6148 | 12c4 Connect Tech Inc | ||
| 6149 | 0001 Blue HEAT/PCI 8 (RS232/CL/RJ11) | ||
| 6150 | 0002 Blue HEAT/PCI 4 (RS232) | ||
| 6151 | 0003 Blue HEAT/PCI 2 (RS232) | ||
| 6152 | 0004 Blue HEAT/PCI 8 (UNIV, RS485) | ||
| 6153 | 0005 Blue HEAT/PCI 4+4/6+2 (UNIV, RS232/485) | ||
| 6154 | 0006 Blue HEAT/PCI 4 (OPTO, RS485) | ||
| 6155 | 0007 Blue HEAT/PCI 2+2 (RS232/485) | ||
| 6156 | 0008 Blue HEAT/PCI 2 (OPTO, Tx, RS485) | ||
| 6157 | 0009 Blue HEAT/PCI 2+6 (RS232/485) | ||
| 6158 | 000a Blue HEAT/PCI 8 (Tx, RS485) | ||
| 6159 | 000b Blue HEAT/PCI 4 (Tx, RS485) | ||
| 6160 | 000c Blue HEAT/PCI 2 (20 MHz, RS485) | ||
| 6161 | 000d Blue HEAT/PCI 2 PTM | ||
| 6162 | 0100 NT960/PCI | ||
| 6163 | 0201 cPCI Titan - 2 Port | ||
| 6164 | 0202 cPCI Titan - 4 Port | ||
| 6165 | 0300 CTI PCI UART 2 (RS232) | ||
| 6166 | 0301 CTI PCI UART 4 (RS232) | ||
| 6167 | 0302 CTI PCI UART 8 (RS232) | ||
| 6168 | 0310 CTI PCI UART 1+1 (RS232/485) | ||
| 6169 | 0311 CTI PCI UART 2+2 (RS232/485) | ||
| 6170 | 0312 CTI PCI UART 4+4 (RS232/485) | ||
| 6171 | 0320 CTI PCI UART 2 | ||
| 6172 | 0321 CTI PCI UART 4 | ||
| 6173 | 0322 CTI PCI UART 8 | ||
| 6174 | 0330 CTI PCI UART 2 (RS485) | ||
| 6175 | 0331 CTI PCI UART 4 (RS485) | ||
| 6176 | 0332 CTI PCI UART 8 (RS485) | ||
| 6177 | 12c5 Picture Elements Incorporated | ||
| 6178 | 007e Imaging/Scanning Subsystem Engine | ||
| 6179 | 007f Imaging/Scanning Subsystem Engine | ||
| 6180 | 0081 PCIVST [Grayscale Thresholding Engine] | ||
| 6181 | 0085 Video Simulator/Sender | ||
| 6182 | 0086 THR2 Multi-scale Thresholder | ||
| 6183 | 12c6 Mitani Corporation | ||
| 6184 | 12c7 Dialogic Corp | ||
| 6185 | 12c8 G Force Co, Ltd | ||
| 6186 | 12c9 Gigi Operations | ||
| 6187 | 12ca Integrated Computing Engines | ||
| 6188 | 12cb Antex Electronics Corporation | ||
| 6189 | 12cc Pluto Technologies International | ||
| 6190 | 12cd Aims Lab | ||
| 6191 | 12ce Netspeed Inc. | ||
| 6192 | 12cf Prophet Systems, Inc. | ||
| 6193 | 12d0 GDE Systems, Inc. | ||
| 6194 | 12d1 PSITech | ||
| 6195 | 12d2 NVidia / SGS Thomson (Joint Venture) | ||
| 6196 | 0008 NV1 | ||
| 6197 | 0009 DAC64 | ||
| 6198 | 0018 Riva128 | ||
| 6199 | 1048 0c10 VICTORY Erazor | ||
| 6200 | 107b 8030 STB Velocity 128 | ||
| 6201 | 1092 0350 Viper V330 | ||
| 6202 | 1092 1092 Viper V330 | ||
| 6203 | 10b4 1b1b STB Velocity 128 | ||
| 6204 | 10b4 1b1d STB Velocity 128 | ||
| 6205 | 10b4 1b1e STB Velocity 128, PAL TV-Out | ||
| 6206 | 10b4 1b20 STB Velocity 128 Sapphire | ||
| 6207 | 10b4 1b21 STB Velocity 128 | ||
| 6208 | 10b4 1b22 STB Velocity 128 AGP, NTSC TV-Out | ||
| 6209 | 10b4 1b23 STB Velocity 128 AGP, PAL TV-Out | ||
| 6210 | 10b4 1b27 STB Velocity 128 DVD | ||
| 6211 | 10b4 1b88 MVP Pro 128 | ||
| 6212 | 10b4 222a STB Velocity 128 AGP | ||
| 6213 | 10b4 2230 STB Velocity 128 | ||
| 6214 | 10b4 2232 STB Velocity 128 | ||
| 6215 | 10b4 2235 STB Velocity 128 AGP | ||
| 6216 | 2a15 54a3 3DVision-SAGP / 3DexPlorer 3000 | ||
| 6217 | 0019 Riva128ZX | ||
| 6218 | 0020 TNT | ||
| 6219 | 0028 TNT2 | ||
| 6220 | 0029 UTNT2 | ||
| 6221 | 002c VTNT2 | ||
| 6222 | 00a0 ITNT2 | ||
| 6223 | 12d3 Vingmed Sound A/S | ||
| 6224 | 12d4 Ulticom (Formerly DGM&S) | ||
| 6225 | 0200 T1 Card | ||
| 6226 | 12d5 Equator Technologies Inc | ||
| 6227 | 0003 BSP16 | ||
| 6228 | 1000 BSP15 | ||
| 6229 | 12d6 Analogic Corp | ||
| 6230 | 12d7 Biotronic SRL | ||
| 6231 | 12d8 Pericom Semiconductor | ||
| 6232 | 12d9 Aculab PLC | ||
| 6233 | 0002 PCI Prosody | ||
| 6234 | 0004 cPCI Prosody | ||
| 6235 | 0005 Aculab E1/T1 PCI card | ||
| 6236 | 12da True Time Inc. | ||
| 6237 | 12db Annapolis Micro Systems, Inc | ||
| 6238 | 12dc Symicron Computer Communication Ltd. | ||
| 6239 | 12dd Management Graphics | ||
| 6240 | 12de Rainbow Technologies | ||
| 6241 | 0200 CryptoSwift CS200 | ||
| 6242 | 12df SBS Technologies Inc | ||
| 6243 | 12e0 Chase Research | ||
| 6244 | 0010 ST16C654 Quad UART | ||
| 6245 | 0020 ST16C654 Quad UART | ||
| 6246 | 0030 ST16C654 Quad UART | ||
| 6247 | 12e1 Nintendo Co, Ltd | ||
| 6248 | 12e2 Datum Inc. Bancomm-Timing Division | ||
| 6249 | 12e3 Imation Corp - Medical Imaging Systems | ||
| 6250 | 12e4 Brooktrout Technology Inc | ||
| 6251 | 12e5 Apex Semiconductor Inc | ||
| 6252 | 12e6 Cirel Systems | ||
| 6253 | 12e7 Sunsgroup Corporation | ||
| 6254 | 12e8 Crisc Corp | ||
| 6255 | 12e9 GE Spacenet | ||
| 6256 | 12ea Zuken | ||
| 6257 | 12eb Aureal Semiconductor | ||
| 6258 | 0001 Vortex 1 | ||
| 6259 | 104d 8036 AU8820 Vortex Digital Audio Processor | ||
| 6260 | 1092 2000 Sonic Impact A3D | ||
| 6261 | 1092 2100 Sonic Impact A3D | ||
| 6262 | 1092 2110 Sonic Impact A3D | ||
| 6263 | 1092 2200 Sonic Impact A3D | ||
| 6264 | 122d 1002 AU8820 Vortex Digital Audio Processor | ||
| 6265 | 12eb 0001 AU8820 Vortex Digital Audio Processor | ||
| 6266 | 5053 3355 Montego | ||
| 6267 | 0002 Vortex 2 | ||
| 6268 | 104d 8049 AU8830 Vortex 3D Digital Audio Processor | ||
| 6269 | 104d 807b AU8830 Vortex 3D Digital Audio Processor | ||
| 6270 | 1092 3000 Monster Sound II | ||
| 6271 | 1092 3001 Monster Sound II | ||
| 6272 | 1092 3002 Monster Sound II | ||
| 6273 | 1092 3003 Monster Sound II | ||
| 6274 | 1092 3004 Monster Sound II | ||
| 6275 | 12eb 0001 AU8830 Vortex 3D Digital Audio Processor | ||
| 6276 | 12eb 0002 AU8830 Vortex 3D Digital Audio Processor | ||
| 6277 | 12eb 0088 AU8830 Vortex 3D Digital Audio Processor | ||
| 6278 | 144d 3510 AU8830 Vortex 3D Digital Audio Processor | ||
| 6279 | 5053 3356 Montego II | ||
| 6280 | 0003 AU8810 Vortex Digital Audio Processor | ||
| 6281 | 104d 8049 AU8810 Vortex Digital Audio Processor | ||
| 6282 | 104d 8077 AU8810 Vortex Digital Audio Processor | ||
| 6283 | 109f 1000 AU8810 Vortex Digital Audio Processor | ||
| 6284 | 12eb 0003 AU8810 Vortex Digital Audio Processor | ||
| 6285 | 1462 6780 AU8810 Vortex Digital Audio Processor | ||
| 6286 | 14a4 2073 AU8810 Vortex Digital Audio Processor | ||
| 6287 | 14a4 2091 AU8810 Vortex Digital Audio Processor | ||
| 6288 | 14a4 2104 AU8810 Vortex Digital Audio Processor | ||
| 6289 | 14a4 2106 AU8810 Vortex Digital Audio Processor | ||
| 6290 | 8803 Vortex 56k Software Modem | ||
| 6291 | 12eb 8803 Vortex 56k Software Modem | ||
| 6292 | 12ec 3A International, Inc. | ||
| 6293 | 12ed Optivision Inc. | ||
| 6294 | 12ee Orange Micro | ||
| 6295 | 12ef Vienna Systems | ||
| 6296 | 12f0 Pentek | ||
| 6297 | 12f1 Sorenson Vision Inc | ||
| 6298 | 12f2 Gammagraphx, Inc. | ||
| 6299 | 12f3 Radstone Technology | ||
| 6300 | 12f4 Megatel | ||
| 6301 | 12f5 Forks | ||
| 6302 | 12f6 Dawson France | ||
| 6303 | 12f7 Cognex | ||
| 6304 | 12f8 Electronic Design GmbH | ||
| 6305 | 0002 VideoMaker | ||
| 6306 | 12f9 Four Fold Ltd | ||
| 6307 | 12fb Spectrum Signal Processing | ||
| 6308 | 12fc Capital Equipment Corp | ||
| 6309 | 12fd I2S | ||
| 6310 | 12fe ESD Electronic System Design GmbH | ||
| 6311 | 12ff Lexicon | ||
| 6312 | 1300 Harman International Industries Inc | ||
| 6313 | 1302 Computer Sciences Corp | ||
| 6314 | 1303 Innovative Integration | ||
| 6315 | 1304 Juniper Networks | ||
| 6316 | 1305 Netphone, Inc | ||
| 6317 | 1306 Duet Technologies | ||
| 6318 | # Formerly ComputerBoards | ||
| 6319 | 1307 Measurement Computing | ||
| 6320 | 0001 PCI-DAS1602/16 | ||
| 6321 | 000b PCI-DIO48H | ||
| 6322 | 000c PCI-PDISO8 | ||
| 6323 | 000d PCI-PDISO16 | ||
| 6324 | 000f PCI-DAS1200 | ||
| 6325 | 0010 PCI-DAS1602/12 | ||
| 6326 | 0014 PCI-DIO24H | ||
| 6327 | 0015 PCI-DIO24H/CTR3 | ||
| 6328 | 0016 PCI-DIO48H/CTR15 | ||
| 6329 | 0017 PCI-DIO96H | ||
| 6330 | 0018 PCI-CTR05 | ||
| 6331 | 0019 PCI-DAS1200/JR | ||
| 6332 | 001a PCI-DAS1001 | ||
| 6333 | 001b PCI-DAS1002 | ||
| 6334 | 001c PCI-DAS1602JR/16 | ||
| 6335 | 001d PCI-DAS6402/16 | ||
| 6336 | 001e PCI-DAS6402/12 | ||
| 6337 | 001f PCI-DAS16/M1 | ||
| 6338 | 0020 PCI-DDA02/12 | ||
| 6339 | 0021 PCI-DDA04/12 | ||
| 6340 | 0022 PCI-DDA08/12 | ||
| 6341 | 0023 PCI-DDA02/16 | ||
| 6342 | 0024 PCI-DDA04/16 | ||
| 6343 | 0025 PCI-DDA08/16 | ||
| 6344 | 0026 PCI-DAC04/12-HS | ||
| 6345 | 0027 PCI-DAC04/16-HS | ||
| 6346 | 0028 PCI-DIO24 | ||
| 6347 | 0029 PCI-DAS08 | ||
| 6348 | 002c PCI-INT32 | ||
| 6349 | 0033 PCI-DUAL-AC5 | ||
| 6350 | 0034 PCI-DAS-TC | ||
| 6351 | 0035 PCI-DAS64/M1/16 | ||
| 6352 | 0036 PCI-DAS64/M2/16 | ||
| 6353 | 0037 PCI-DAS64/M3/16 | ||
| 6354 | 004c PCI-DAS1000 | ||
| 6355 | 004d PCI-QUAD04 | ||
| 6356 | 0052 PCI-DAS4020/12 | ||
| 6357 | 005e PCI-DAS6025 | ||
| 6358 | 1308 Jato Technologies Inc. | ||
| 6359 | 0001 NetCelerator Adapter | ||
| 6360 | 1308 0001 NetCelerator Adapter | ||
| 6361 | 1309 AB Semiconductor Ltd | ||
| 6362 | 130a Mitsubishi Electric Microcomputer | ||
| 6363 | 130b Colorgraphic Communications Corp | ||
| 6364 | 130c Ambex Technologies, Inc | ||
| 6365 | 130d Accelerix Inc | ||
| 6366 | 130e Yamatake-Honeywell Co. Ltd | ||
| 6367 | 130f Advanet Inc | ||
| 6368 | 1310 Gespac | ||
| 6369 | 1311 Videoserver, Inc | ||
| 6370 | 1312 Acuity Imaging, Inc | ||
| 6371 | 1313 Yaskawa Electric Co. | ||
| 6372 | 1316 Teradyne Inc | ||
| 6373 | 1317 Linksys | ||
| 6374 | 0981 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6375 | 0985 NC100 Network Everywhere Fast Ethernet 10/100 | ||
| 6376 | 1985 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6377 | 2850 HSP MicroModem 56 | ||
| 6378 | 8201 ADMtek ADM8211 802.11b Wireless Interface | ||
| 6379 | 10b8 2635 SMC2635W 802.11b (11Mbps) wireless lan pcmcia (cardbus) card | ||
| 6380 | 1317 8201 SMC2635W 802.11b (11mbps) wireless lan pcmcia (cardbus) card | ||
| 6381 | 8211 ADMtek ADM8211 802.11b Wireless Interface | ||
| 6382 | 9511 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6383 | 1318 Packet Engines Inc. | ||
| 6384 | 0911 GNIC-II PCI Gigabit Ethernet [Hamachi] | ||
| 6385 | 1319 Fortemedia, Inc | ||
| 6386 | 0801 Xwave QS3000A [FM801] | ||
| 6387 | 0802 Xwave QS3000A [FM801 game port] | ||
| 6388 | 1000 FM801 PCI Audio | ||
| 6389 | 1001 FM801 PCI Joystick | ||
| 6390 | 131a Finisar Corp. | ||
| 6391 | 131c Nippon Electro-Sensory Devices Corp | ||
| 6392 | 131d Sysmic, Inc. | ||
| 6393 | 131e Xinex Networks Inc | ||
| 6394 | 131f Siig Inc | ||
| 6395 | 1000 CyberSerial (1-port) 16550 | ||
| 6396 | 1001 CyberSerial (1-port) 16650 | ||
| 6397 | 1002 CyberSerial (1-port) 16850 | ||
| 6398 | 1010 Duet 1S(16550)+1P | ||
| 6399 | 1011 Duet 1S(16650)+1P | ||
| 6400 | 1012 Duet 1S(16850)+1P | ||
| 6401 | 1020 CyberParallel (1-port) | ||
| 6402 | 1021 CyberParallel (2-port) | ||
| 6403 | 1030 CyberSerial (2-port) 16550 | ||
| 6404 | 1031 CyberSerial (2-port) 16650 | ||
| 6405 | 1032 CyberSerial (2-port) 16850 | ||
| 6406 | 1034 Trio 2S(16550)+1P | ||
| 6407 | 1035 Trio 2S(16650)+1P | ||
| 6408 | 1036 Trio 2S(16850)+1P | ||
| 6409 | 1050 CyberSerial (4-port) 16550 | ||
| 6410 | 1051 CyberSerial (4-port) 16650 | ||
| 6411 | 1052 CyberSerial (4-port) 16850 | ||
| 6412 | 2000 CyberSerial (1-port) 16550 | ||
| 6413 | 2001 CyberSerial (1-port) 16650 | ||
| 6414 | 2002 CyberSerial (1-port) 16850 | ||
| 6415 | 2010 Duet 1S(16550)+1P | ||
| 6416 | 2011 Duet 1S(16650)+1P | ||
| 6417 | 2012 Duet 1S(16850)+1P | ||
| 6418 | 2020 CyberParallel (1-port) | ||
| 6419 | 2021 CyberParallel (2-port) | ||
| 6420 | 2030 CyberSerial (2-port) 16550 | ||
| 6421 | 131f 2030 PCI Serial Card | ||
| 6422 | 2031 CyberSerial (2-port) 16650 | ||
| 6423 | 2032 CyberSerial (2-port) 16850 | ||
| 6424 | 2040 Trio 1S(16550)+2P | ||
| 6425 | 2041 Trio 1S(16650)+2P | ||
| 6426 | 2042 Trio 1S(16850)+2P | ||
| 6427 | 2050 CyberSerial (4-port) 16550 | ||
| 6428 | 2051 CyberSerial (4-port) 16650 | ||
| 6429 | 2052 CyberSerial (4-port) 16850 | ||
| 6430 | 2060 Trio 2S(16550)+1P | ||
| 6431 | 2061 Trio 2S(16650)+1P | ||
| 6432 | 2062 Trio 2S(16850)+1P | ||
| 6433 | 2081 CyberSerial (8-port) ST16654 | ||
| 6434 | 1320 Crypto AG | ||
| 6435 | 1321 Arcobel Graphics BV | ||
| 6436 | 1322 MTT Co., Ltd | ||
| 6437 | 1323 Dome Inc | ||
| 6438 | 1324 Sphere Communications | ||
| 6439 | 1325 Salix Technologies, Inc | ||
| 6440 | 1326 Seachange international | ||
| 6441 | 1327 Voss scientific | ||
| 6442 | 1328 quadrant international | ||
| 6443 | 1329 Productivity Enhancement | ||
| 6444 | 132a Microcom Inc. | ||
| 6445 | 132b Broadband Technologies | ||
| 6446 | 132c Micrel Inc | ||
| 6447 | 132d Integrated Silicon Solution, Inc. | ||
| 6448 | 1330 MMC Networks | ||
| 6449 | 1331 Radisys Corp. | ||
| 6450 | 0030 ENP-2611 | ||
| 6451 | 8200 82600 Host Bridge | ||
| 6452 | 8201 82600 IDE | ||
| 6453 | 8202 82600 USB | ||
| 6454 | 8210 82600 PCI Bridge | ||
| 6455 | 1332 Micro Memory | ||
| 6456 | 5415 MM-5415CN PCI Memory Module with Battery Backup | ||
| 6457 | 5425 MM-5425CN PCI 64/66 Memory Module with Battery Backup | ||
| 6458 | 1334 Redcreek Communications, Inc | ||
| 6459 | 1335 Videomail, Inc | ||
| 6460 | 1337 Third Planet Publishing | ||
| 6461 | 1338 BT Electronics | ||
| 6462 | 133a Vtel Corp | ||
| 6463 | 133b Softcom Microsystems | ||
| 6464 | 133c Holontech Corp | ||
| 6465 | 133d SS Technologies | ||
| 6466 | 133e Virtual Computer Corp | ||
| 6467 | 133f SCM Microsystems | ||
| 6468 | 1340 Atalla Corp | ||
| 6469 | 1341 Kyoto Microcomputer Co | ||
| 6470 | 1342 Promax Systems Inc | ||
| 6471 | 1343 Phylon Communications Inc | ||
| 6472 | 1344 Crucial Technology | ||
| 6473 | 1345 Arescom Inc | ||
| 6474 | 1347 Odetics | ||
| 6475 | 1349 Sumitomo Electric Industries, Ltd. | ||
| 6476 | 134a DTC Technology Corp. | ||
| 6477 | 0001 Domex 536 | ||
| 6478 | 0002 Domex DMX3194UP SCSI Adapter | ||
| 6479 | 134b ARK Research Corp. | ||
| 6480 | 134c Chori Joho System Co. Ltd | ||
| 6481 | 134d PCTel Inc | ||
| 6482 | 2189 HSP56 MicroModem | ||
| 6483 | 2486 2304WT V.92 MDC Modem | ||
| 6484 | 7890 HSP MicroModem 56 | ||
| 6485 | 134d 0001 PCT789 adapter | ||
| 6486 | 7891 HSP MicroModem 56 | ||
| 6487 | 134d 0001 HSP MicroModem 56 | ||
| 6488 | 7892 HSP MicroModem 56 | ||
| 6489 | 7893 HSP MicroModem 56 | ||
| 6490 | 7894 HSP MicroModem 56 | ||
| 6491 | 7895 HSP MicroModem 56 | ||
| 6492 | 7896 HSP MicroModem 56 | ||
| 6493 | 7897 HSP MicroModem 56 | ||
| 6494 | 134e CSTI | ||
| 6495 | 134f Algo System Co Ltd | ||
| 6496 | 1350 Systec Co. Ltd | ||
| 6497 | 1351 Sonix Inc | ||
| 6498 | 1353 Thales Idatys | ||
| 6499 | 0002 Proserver | ||
| 6500 | 0003 PCI-FUT | ||
| 6501 | 0004 PCI-S0 | ||
| 6502 | 0005 PCI-FUT-S0 | ||
| 6503 | 1354 Dwave System Inc | ||
| 6504 | 1355 Kratos Analytical Ltd | ||
| 6505 | 1356 The Logical Co | ||
| 6506 | 1359 Prisa Networks | ||
| 6507 | 135a Brain Boxes | ||
| 6508 | 135b Giganet Inc | ||
| 6509 | 135c Quatech Inc | ||
| 6510 | 0010 QSC-100 | ||
| 6511 | 0020 DSC-100 | ||
| 6512 | 0030 DSC-200/300 | ||
| 6513 | 0040 QSC-200/300 | ||
| 6514 | 0050 ESC-100D | ||
| 6515 | 0060 ESC-100M | ||
| 6516 | 00f0 MPAC-100 Syncronous Serial Card (Zilog 85230) | ||
| 6517 | 0170 QSCLP-100 | ||
| 6518 | 0180 DSCLP-100 | ||
| 6519 | 0190 SSCLP-100 | ||
| 6520 | 01a0 QSCLP-200/300 | ||
| 6521 | 01b0 DSCLP-200/300 | ||
| 6522 | 01c0 SSCLP-200/300 | ||
| 6523 | 135d ABB Network Partner AB | ||
| 6524 | 135e Sealevel Systems Inc | ||
| 6525 | 5101 Route 56.PCI - Multi-Protocol Serial Interface (Zilog Z16C32) | ||
| 6526 | 7101 Single Port RS-232/422/485/530 | ||
| 6527 | 7201 Dual Port RS-232/422/485 Interface | ||
| 6528 | 7202 Dual Port RS-232 Interface | ||
| 6529 | 7401 Four Port RS-232 Interface | ||
| 6530 | 7402 Four Port RS-422/485 Interface | ||
| 6531 | 7801 Eight Port RS-232 Interface | ||
| 6532 | 7804 Eight Port RS-232/422/485 Interface | ||
| 6533 | 8001 8001 Digital I/O Adapter | ||
| 6534 | 135f I-Data International A-S | ||
| 6535 | 1360 Meinberg Funkuhren | ||
| 6536 | 0101 PCI32 DCF77 Radio Clock | ||
| 6537 | 0102 PCI509 DCF77 Radio Clock | ||
| 6538 | 0103 PCI510 DCF77 Radio Clock | ||
| 6539 | 0201 GPS167PCI GPS Receiver | ||
| 6540 | 0202 GPS168PCI GPS Receiver | ||
| 6541 | 0203 GPS169PCI GPS Receiver | ||
| 6542 | 0301 TCR510PCI IRIG Receiver | ||
| 6543 | 1361 Soliton Systems K.K. | ||
| 6544 | 1362 Fujifacom Corporation | ||
| 6545 | 1363 Phoenix Technology Ltd | ||
| 6546 | 1364 ATM Communications Inc | ||
| 6547 | 1365 Hypercope GmbH | ||
| 6548 | 1366 Teijin Seiki Co. Ltd | ||
| 6549 | 1367 Hitachi Zosen Corporation | ||
| 6550 | 1368 Skyware Corporation | ||
| 6551 | 1369 Digigram | ||
| 6552 | 136a High Soft Tech | ||
| 6553 | 136b Kawasaki Steel Corporation | ||
| 6554 | ff01 KL5A72002 Motion JPEG | ||
| 6555 | 136c Adtek System Science Co Ltd | ||
| 6556 | 136d Gigalabs Inc | ||
| 6557 | 136f Applied Magic Inc | ||
| 6558 | 1370 ATL Products | ||
| 6559 | 1371 CNet Technology Inc | ||
| 6560 | 434e GigaCard Network Adapter | ||
| 6561 | 1371 434e N-Way PCI-Bus Giga-Card 1000/100/10Mbps(L) | ||
| 6562 | 1373 Silicon Vision Inc | ||
| 6563 | 1374 Silicom Ltd | ||
| 6564 | 1375 Argosystems Inc | ||
| 6565 | 1376 LMC | ||
| 6566 | 1377 Electronic Equipment Production & Distribution GmbH | ||
| 6567 | 1378 Telemann Co. Ltd | ||
| 6568 | 1379 Asahi Kasei Microsystems Co Ltd | ||
| 6569 | 137a Mark of the Unicorn Inc | ||
| 6570 | 0001 PCI-324 Audiowire Interface | ||
| 6571 | 137b PPT Vision | ||
| 6572 | 137c Iwatsu Electric Co Ltd | ||
| 6573 | 137d Dynachip Corporation | ||
| 6574 | 137e Patriot Scientific Corporation | ||
| 6575 | 137f Japan Satellite Systems Inc | ||
| 6576 | 1380 Sanritz Automation Co Ltd | ||
| 6577 | 1381 Brains Co. Ltd | ||
| 6578 | 1382 Marian - Electronic & Software | ||
| 6579 | 0001 ARC88 audio recording card | ||
| 6580 | 2008 Prodif 96 Pro sound system | ||
| 6581 | 2088 Marc 8 Midi sound system | ||
| 6582 | 20c8 Marc A sound system | ||
| 6583 | 4008 Marc 2 sound system | ||
| 6584 | 4010 Marc 2 Pro sound system | ||
| 6585 | 4048 Marc 4 MIDI sound system | ||
| 6586 | 4088 Marc 4 Digi sound system | ||
| 6587 | 4248 Marc X sound system | ||
| 6588 | 1383 Controlnet Inc | ||
| 6589 | 1384 Reality Simulation Systems Inc | ||
| 6590 | 1385 Netgear | ||
| 6591 | # Note: This lists as Atheros Communications, Inc. AR5212 802.11abg NIC because of Madwifi | ||
| 6592 | 0013 WG311T | ||
| 6593 | 311a GA511 Gigabit Ethernet | ||
| 6594 | 4100 802.11b Wireless Adapter (MA301) | ||
| 6595 | 4105 MA311 802.11b wireless adapter | ||
| 6596 | 4400 WAG511 802.11a/b/g Dual Band Wireless PC Card | ||
| 6597 | 4600 WAG511 802.11a/b/g Dual Band Wireless PC Card | ||
| 6598 | 4601 WAG511 802.11a/b/g Dual Band Wireless PC Card | ||
| 6599 | 4610 WAG511 802.11a/b/g Dual Band Wireless PC Card | ||
| 6600 | 4a00 WAG311 802.11a/g Wireless PCI Adapter | ||
| 6601 | 4c00 WG311v2 54 Mbps Wireless PCI Adapter | ||
| 6602 | 620a GA620 Gigabit Ethernet | ||
| 6603 | 622a GA622 | ||
| 6604 | 630a GA630 Gigabit Ethernet | ||
| 6605 | f004 FA310TX | ||
| 6606 | 1386 Video Domain Technologies | ||
| 6607 | 1387 Systran Corp | ||
| 6608 | 1388 Hitachi Information Technology Co Ltd | ||
| 6609 | 1389 Applicom International | ||
| 6610 | 0001 PCI1500PFB [Intelligent fieldbus adaptor] | ||
| 6611 | 138a Fusion Micromedia Corp | ||
| 6612 | 138b Tokimec Inc | ||
| 6613 | 138c Silicon Reality | ||
| 6614 | 138d Future Techno Designs pte Ltd | ||
| 6615 | 138e Basler GmbH | ||
| 6616 | 138f Patapsco Designs Inc | ||
| 6617 | 1390 Concept Development Inc | ||
| 6618 | 1391 Development Concepts Inc | ||
| 6619 | 1392 Medialight Inc | ||
| 6620 | 1393 Moxa Technologies Co Ltd | ||
| 6621 | 1040 Smartio C104H/PCI | ||
| 6622 | 1141 Industrio CP-114 | ||
| 6623 | 1680 Smartio C168H/PCI | ||
| 6624 | 2040 Intellio CP-204J | ||
| 6625 | 2180 Intellio C218 Turbo PCI | ||
| 6626 | 3200 Intellio C320 Turbo PCI | ||
| 6627 | 1394 Level One Communications | ||
| 6628 | 0001 LXT1001 Gigabit Ethernet | ||
| 6629 | 1394 0001 NetCelerator Adapter | ||
| 6630 | 1395 Ambicom Inc | ||
| 6631 | 1396 Cipher Systems Inc | ||
| 6632 | 1397 Cologne Chip Designs GmbH | ||
| 6633 | 2bd0 ISDN network controller [HFC-PCI] | ||
| 6634 | 1397 2bd0 ISDN Board | ||
| 6635 | e4bf 1000 CI1-1-Harp | ||
| 6636 | 1398 Clarion co. Ltd | ||
| 6637 | 1399 Rios systems Co Ltd | ||
| 6638 | 139a Alacritech Inc | ||
| 6639 | 0001 Quad Port 10/100 Server Accelerator | ||
| 6640 | 0003 Single Port 10/100 Server Accelerator | ||
| 6641 | 0005 Single Port Gigabit Server Accelerator | ||
| 6642 | 139b Mediasonic Multimedia Systems Ltd | ||
| 6643 | 139c Quantum 3d Inc | ||
| 6644 | 139d EPL limited | ||
| 6645 | 139e Media4 | ||
| 6646 | 139f Aethra s.r.l. | ||
| 6647 | 13a0 Crystal Group Inc | ||
| 6648 | 13a1 Kawasaki Heavy Industries Ltd | ||
| 6649 | 13a2 Ositech Communications Inc | ||
| 6650 | 13a3 Hifn Inc. | ||
| 6651 | 0005 7751 Security Processor | ||
| 6652 | 0006 6500 Public Key Processor | ||
| 6653 | 0007 7811 Security Processor | ||
| 6654 | 0012 7951 Security Processor | ||
| 6655 | 0014 78XX Security Processor | ||
| 6656 | 0016 8065 Security Processor | ||
| 6657 | 0017 8165 Security Processor | ||
| 6658 | 0018 8154 Security Processor | ||
| 6659 | 001d 7956 Security Processor | ||
| 6660 | 0020 7955 Security Processor | ||
| 6661 | 13a4 Rascom Inc | ||
| 6662 | 13a5 Audio Digital Imaging Inc | ||
| 6663 | 13a6 Videonics Inc | ||
| 6664 | 13a7 Teles AG | ||
| 6665 | 13a8 Exar Corp. | ||
| 6666 | 0154 XR17C154 Quad UART | ||
| 6667 | 0158 XR17C158 Octal UART | ||
| 6668 | 13a9 Siemens Medical Systems, Ultrasound Group | ||
| 6669 | 13aa Broadband Networks Inc | ||
| 6670 | 13ab Arcom Control Systems Ltd | ||
| 6671 | 13ac Motion Media Technology Ltd | ||
| 6672 | 13ad Nexus Inc | ||
| 6673 | 13ae ALD Technology Ltd | ||
| 6674 | 13af T.Sqware | ||
| 6675 | 13b0 Maxspeed Corp | ||
| 6676 | 13b1 Tamura corporation | ||
| 6677 | 13b2 Techno Chips Co. Ltd | ||
| 6678 | 13b3 Lanart Corporation | ||
| 6679 | 13b4 Wellbean Co Inc | ||
| 6680 | 13b5 ARM | ||
| 6681 | 13b6 Dlog GmbH | ||
| 6682 | 13b7 Logic Devices Inc | ||
| 6683 | 13b8 Nokia Telecommunications oy | ||
| 6684 | 13b9 Elecom Co Ltd | ||
| 6685 | 13ba Oxford Instruments | ||
| 6686 | 13bb Sanyo Technosound Co Ltd | ||
| 6687 | 13bc Bitran Corporation | ||
| 6688 | 13bd Sharp corporation | ||
| 6689 | 13be Miroku Jyoho Service Co. Ltd | ||
| 6690 | 13bf Sharewave Inc | ||
| 6691 | 13c0 Microgate Corporation | ||
| 6692 | 0010 SyncLink Adapter v1 | ||
| 6693 | 0020 SyncLink SCC Adapter | ||
| 6694 | 0030 SyncLink Multiport Adapter | ||
| 6695 | 0210 SyncLink Adapter v2 | ||
| 6696 | 13c1 3ware Inc | ||
| 6697 | 1000 3ware Inc 3ware 5xxx/6xxx-series PATA-RAID | ||
| 6698 | 1001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID | ||
| 6699 | 13c1 1001 3ware Inc 3ware 7xxx/8xxx-series PATA/SATA-RAID | ||
| 6700 | 1002 3ware Inc 3ware 9xxx-series SATA-RAID | ||
| 6701 | 13c2 Technotrend Systemtechnik GmbH | ||
| 6702 | 13c3 Janz Computer AG | ||
| 6703 | 13c4 Phase Metrics | ||
| 6704 | 13c5 Alphi Technology Corp | ||
| 6705 | 13c6 Condor Engineering Inc | ||
| 6706 | 0520 CEI-520 A429 Card | ||
| 6707 | 0620 CEI-620 A429 Card | ||
| 6708 | 0820 CEI-820 A429 Card | ||
| 6709 | 13c7 Blue Chip Technology Ltd | ||
| 6710 | 13c8 Apptech Inc | ||
| 6711 | 13c9 Eaton Corporation | ||
| 6712 | 13ca Iomega Corporation | ||
| 6713 | 13cb Yano Electric Co Ltd | ||
| 6714 | 13cc Metheus Corporation | ||
| 6715 | 13cd Compatible Systems Corporation | ||
| 6716 | 13ce Cocom A/S | ||
| 6717 | 13cf Studio Audio & Video Ltd | ||
| 6718 | 13d0 Techsan Electronics Co Ltd | ||
| 6719 | 2103 B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card | ||
| 6720 | 2200 B2C2 FlexCopIII DVB chip / Technisat SkyStar2 DVB card | ||
| 6721 | 13d1 Abocom Systems Inc | ||
| 6722 | ab02 ADMtek Centaur-C rev 17 [D-Link DFE-680TX] CardBus Fast Ethernet Adapter | ||
| 6723 | ab03 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6724 | ab06 RTL8139 [FE2000VX] CardBus Fast Ethernet Attached Port Adapter | ||
| 6725 | ab08 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 6726 | 13d2 Shark Multimedia Inc | ||
| 6727 | 13d3 IMC Networks | ||
| 6728 | 13d4 Graphics Microsystems Inc | ||
| 6729 | 13d5 Media 100 Inc | ||
| 6730 | 13d6 K.I. Technology Co Ltd | ||
| 6731 | 13d7 Toshiba Engineering Corporation | ||
| 6732 | 13d8 Phobos corporation | ||
| 6733 | 13d9 Apex PC Solutions Inc | ||
| 6734 | 13da Intresource Systems pte Ltd | ||
| 6735 | 13db Janich & Klass Computertechnik GmbH | ||
| 6736 | 13dc Netboost Corporation | ||
| 6737 | 13dd Multimedia Bundle Inc | ||
| 6738 | 13de ABB Robotics Products AB | ||
| 6739 | 13df E-Tech Inc | ||
| 6740 | 0001 PCI56RVP Modem | ||
| 6741 | 13df 0001 PCI56RVP Modem | ||
| 6742 | 13e0 GVC Corporation | ||
| 6743 | 13e1 Silicom Multimedia Systems Inc | ||
| 6744 | 13e2 Dynamics Research Corporation | ||
| 6745 | 13e3 Nest Inc | ||
| 6746 | 13e4 Calculex Inc | ||
| 6747 | 13e5 Telesoft Design Ltd | ||
| 6748 | 13e6 Argosy research Inc | ||
| 6749 | 13e7 NAC Incorporated | ||
| 6750 | 13e8 Chip Express Corporation | ||
| 6751 | 13e9 Intraserver Technology Inc | ||
| 6752 | 13ea Dallas Semiconductor | ||
| 6753 | 13eb Hauppauge Computer Works Inc | ||
| 6754 | 13ec Zydacron Inc | ||
| 6755 | 13ed Raytheion E-Systems | ||
| 6756 | 13ee Hayes Microcomputer Products Inc | ||
| 6757 | 13ef Coppercom Inc | ||
| 6758 | 13f0 Sundance Technology Inc | ||
| 6759 | 0201 ST201 Sundance Ethernet | ||
| 6760 | 13f1 Oce' - Technologies B.V. | ||
| 6761 | 13f2 Ford Microelectronics Inc | ||
| 6762 | 13f3 Mcdata Corporation | ||
| 6763 | 13f4 Troika Networks, Inc. | ||
| 6764 | 1401 Zentai Fibre Channel Adapter | ||
| 6765 | 13f5 Kansai Electric Co. Ltd | ||
| 6766 | 13f6 C-Media Electronics Inc | ||
| 6767 | 0011 CMI8738 | ||
| 6768 | 0100 CM8338A | ||
| 6769 | 13f6 ffff CMI8338/C3DX PCI Audio Device | ||
| 6770 | 0101 CM8338B | ||
| 6771 | 13f6 0101 CMI8338-031 PCI Audio Device | ||
| 6772 | 0111 CM8738 | ||
| 6773 | 1019 0970 P6STP-FL motherboard | ||
| 6774 | 1043 8035 CUSI-FX motherboard | ||
| 6775 | 1043 8077 CMI8738 6-channel audio controller | ||
| 6776 | 1043 80e2 CMI8738 6ch-MX | ||
| 6777 | 13f6 0111 CMI8738/C3DX PCI Audio Device | ||
| 6778 | 1681 a000 Gamesurround MUSE XL | ||
| 6779 | 0211 CM8738 | ||
| 6780 | 13f7 Wildfire Communications | ||
| 6781 | 13f8 Ad Lib Multimedia Inc | ||
| 6782 | 13f9 NTT Advanced Technology Corp. | ||
| 6783 | 13fa Pentland Systems Ltd | ||
| 6784 | 13fb Aydin Corp | ||
| 6785 | 13fc Computer Peripherals International | ||
| 6786 | 13fd Micro Science Inc | ||
| 6787 | 13fe Advantech Co. Ltd | ||
| 6788 | 1240 PCI-1240 4-channel stepper motor controller card w. Nova Electronics MCX314 | ||
| 6789 | 1600 PCI-1612 4-port RS-232/422/485 PCI Communication Card | ||
| 6790 | 1752 PCI-1752 | ||
| 6791 | 1754 PCI-1754 | ||
| 6792 | 1756 PCI-1756 | ||
| 6793 | 13ff Silicon Spice Inc | ||
| 6794 | 1400 Artx Inc | ||
| 6795 | 1401 9432 TX | ||
| 6796 | 1401 CR-Systems A/S | ||
| 6797 | 1402 Meilhaus Electronic GmbH | ||
| 6798 | 1403 Ascor Inc | ||
| 6799 | 1404 Fundamental Software Inc | ||
| 6800 | 1405 Excalibur Systems Inc | ||
| 6801 | 1406 Oce' Printing Systems GmbH | ||
| 6802 | 1407 Lava Computer mfg Inc | ||
| 6803 | 0100 Lava Dual Serial | ||
| 6804 | 0101 Lava Quatro A | ||
| 6805 | 0102 Lava Quatro B | ||
| 6806 | 0110 Lava DSerial-PCI Port A | ||
| 6807 | 0111 Lava DSerial-PCI Port B | ||
| 6808 | 0120 Quattro-PCI A | ||
| 6809 | 0121 Quattro-PCI B | ||
| 6810 | 0180 Lava Octo A | ||
| 6811 | 0181 Lava Octo B | ||
| 6812 | 0200 Lava Port Plus | ||
| 6813 | 0201 Lava Quad A | ||
| 6814 | 0202 Lava Quad B | ||
| 6815 | 0220 Lava Quattro PCI Ports A/B | ||
| 6816 | 0221 Lava Quattro PCI Ports C/D | ||
| 6817 | 0500 Lava Single Serial | ||
| 6818 | 0600 Lava Port 650 | ||
| 6819 | 8000 Lava Parallel | ||
| 6820 | 8001 Dual parallel port controller A | ||
| 6821 | 8002 Lava Dual Parallel port A | ||
| 6822 | 8003 Lava Dual Parallel port B | ||
| 6823 | 8800 BOCA Research IOPPAR | ||
| 6824 | 1408 Aloka Co. Ltd | ||
| 6825 | 1409 Timedia Technology Co Ltd | ||
| 6826 | 7168 PCI2S550 (Dual 16550 UART) | ||
| 6827 | 140a DSP Research Inc | ||
| 6828 | 140b Ramix Inc | ||
| 6829 | 140c Elmic Systems Inc | ||
| 6830 | 140d Matsushita Electric Works Ltd | ||
| 6831 | 140e Goepel Electronic GmbH | ||
| 6832 | 140f Salient Systems Corp | ||
| 6833 | 1410 Midas lab Inc | ||
| 6834 | 1411 Ikos Systems Inc | ||
| 6835 | # formerly IC Ensemble Inc. | ||
| 6836 | 1412 VIA Technologies Inc. | ||
| 6837 | 1712 ICE1712 [Envy24] PCI Multi-Channel I/O Controller | ||
| 6838 | 1412 1712 Hoontech ST Audio DSP 24 | ||
| 6839 | 1412 d630 M-Audio Delta 1010 | ||
| 6840 | 1412 d631 M-Audio Delta DiO | ||
| 6841 | 1412 d632 M-Audio Delta 66 | ||
| 6842 | 1412 d633 M-Audio Delta 44 | ||
| 6843 | 1412 d634 M-Audio Delta Audiophile | ||
| 6844 | 1412 d635 M-Audio Delta TDIF | ||
| 6845 | 1412 d637 M-Audio Delta RBUS | ||
| 6846 | 1412 d638 M-Audio Delta 410 | ||
| 6847 | 1412 d63b M-Audio Delta 1010LT | ||
| 6848 | 1412 d63c Digigram VX442 | ||
| 6849 | 1416 1712 Hoontech ST Audio DSP 24 Media 7.1 | ||
| 6850 | 153b 1115 EWS88 MT | ||
| 6851 | 153b 1125 EWS88 MT (Master) | ||
| 6852 | 153b 112b EWS88 D | ||
| 6853 | 153b 112c EWS88 D (Master) | ||
| 6854 | 153b 1130 EWX 24/96 | ||
| 6855 | 153b 1138 DMX 6fire 24/96 | ||
| 6856 | 153b 1151 PHASE88 | ||
| 6857 | 16ce 1040 Edirol DA-2496 | ||
| 6858 | 1724 VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller | ||
| 6859 | 1412 1724 AMP Ltd AUDIO2000 | ||
| 6860 | 1412 3630 M-Audio Revolution 7.1 | ||
| 6861 | 153b 1145 Aureon 7.1 Space | ||
| 6862 | 153b 1147 Aureon 5.1 Sky | ||
| 6863 | 153b 1153 Aureon 7.1 Universe | ||
| 6864 | 270f f641 ZNF3-150 | ||
| 6865 | 270f f645 ZNF3-250 | ||
| 6866 | 1413 Addonics | ||
| 6867 | 1414 Microsoft Corporation | ||
| 6868 | 1415 Oxford Semiconductor Ltd | ||
| 6869 | 8403 VScom 011H-EP1 1 port parallel adaptor | ||
| 6870 | 9501 OX16PCI954 (Quad 16950 UART) function 0 | ||
| 6871 | 131f 2050 CyberPro (4-port) | ||
| 6872 | # Model IO1085, Part No: JJ-P46012 | ||
| 6873 | 131f 2051 CyberSerial 4S Plus | ||
| 6874 | 15ed 2000 MCCR Serial p0-3 of 8 | ||
| 6875 | 15ed 2001 MCCR Serial p0-3 of 16 | ||
| 6876 | 950a EXSYS EX-41092 Dual 16950 Serial adapter | ||
| 6877 | 950b OXCB950 Cardbus 16950 UART | ||
| 6878 | 9510 OX16PCI954 (Quad 16950 UART) function 1 (Disabled) | ||
| 6879 | 9511 OX16PCI954 (Quad 16950 UART) function 1 | ||
| 6880 | 15ed 2000 MCCR Serial p4-7 of 8 | ||
| 6881 | 15ed 2001 MCCR Serial p4-15 of 16 | ||
| 6882 | 9521 OX16PCI952 (Dual 16950 UART) | ||
| 6883 | 1416 Multiwave Innovation pte Ltd | ||
| 6884 | 1417 Convergenet Technologies Inc | ||
| 6885 | 1418 Kyushu electronics systems Inc | ||
| 6886 | 1419 Excel Switching Corp | ||
| 6887 | 141a Apache Micro Peripherals Inc | ||
| 6888 | 141b Zoom Telephonics Inc | ||
| 6889 | 141d Digitan Systems Inc | ||
| 6890 | 141e Fanuc Ltd | ||
| 6891 | 141f Visiontech Ltd | ||
| 6892 | 1420 Psion Dacom plc | ||
| 6893 | 8002 Gold Card NetGlobal 56k+10/100Mb CardBus (Ethernet part) | ||
| 6894 | 8003 Gold Card NetGlobal 56k+10/100Mb CardBus (Modem part) | ||
| 6895 | 1421 Ads Technologies Inc | ||
| 6896 | 1422 Ygrec Systems Co Ltd | ||
| 6897 | 1423 Custom Technology Corp. | ||
| 6898 | 1424 Videoserver Connections | ||
| 6899 | 1425 Chelsio Communications Inc | ||
| 6900 | 1426 Storage Technology Corp. | ||
| 6901 | 1427 Better On-Line Solutions | ||
| 6902 | 1428 Edec Co Ltd | ||
| 6903 | 1429 Unex Technology Corp. | ||
| 6904 | 142a Kingmax Technology Inc | ||
| 6905 | 142b Radiolan | ||
| 6906 | 142c Minton Optic Industry Co Ltd | ||
| 6907 | 142d Pix stream Inc | ||
| 6908 | 142e Vitec Multimedia | ||
| 6909 | 4020 VM2-2 [Video Maker 2] MPEG1/2 Encoder | ||
| 6910 | 142f Radicom Research Inc | ||
| 6911 | 1430 ITT Aerospace/Communications Division | ||
| 6912 | 1431 Gilat Satellite Networks | ||
| 6913 | 1432 Edimax Computer Co. | ||
| 6914 | 9130 RTL81xx Fast Ethernet | ||
| 6915 | 1433 Eltec Elektronik GmbH | ||
| 6916 | 1435 Real Time Devices US Inc. | ||
| 6917 | 1436 CIS Technology Inc | ||
| 6918 | 1437 Nissin Inc Co | ||
| 6919 | 1438 Atmel-dream | ||
| 6920 | 1439 Outsource Engineering & Mfg. Inc | ||
| 6921 | 143a Stargate Solutions Inc | ||
| 6922 | 143b Canon Research Center, America | ||
| 6923 | 143c Amlogic Inc | ||
| 6924 | 143d Tamarack Microelectronics Inc | ||
| 6925 | 143e Jones Futurex Inc | ||
| 6926 | 143f Lightwell Co Ltd - Zax Division | ||
| 6927 | 1440 ALGOL Corp. | ||
| 6928 | 1441 AGIE Ltd | ||
| 6929 | 1442 Phoenix Contact GmbH & Co. | ||
| 6930 | 1443 Unibrain S.A. | ||
| 6931 | 1444 TRW | ||
| 6932 | 1445 Logical DO Ltd | ||
| 6933 | 1446 Graphin Co Ltd | ||
| 6934 | 1447 AIM GmBH | ||
| 6935 | 1448 Alesis Studio Electronics | ||
| 6936 | 1449 TUT Systems Inc | ||
| 6937 | 144a Adlink Technology | ||
| 6938 | 7296 PCI-7296 | ||
| 6939 | 7432 PCI-7432 | ||
| 6940 | 7433 PCI-7433 | ||
| 6941 | 7434 PCI-7434 | ||
| 6942 | 7841 PCI-7841 | ||
| 6943 | 8133 PCI-8133 | ||
| 6944 | 8164 PCI-8164 | ||
| 6945 | 8554 PCI-8554 | ||
| 6946 | 9111 PCI-9111 | ||
| 6947 | 9113 PCI-9113 | ||
| 6948 | 9114 PCI-9114 | ||
| 6949 | 144b Loronix Information Systems Inc | ||
| 6950 | 144c Catalina Research Inc | ||
| 6951 | 144d Samsung Electronics Co Ltd | ||
| 6952 | 144e OLITEC | ||
| 6953 | 144f Askey Computer Corp. | ||
| 6954 | 1450 Octave Communications Ind. | ||
| 6955 | 1451 SP3D Chip Design GmBH | ||
| 6956 | 1453 MYCOM Inc | ||
| 6957 | 1454 Altiga Networks | ||
| 6958 | 1455 Logic Plus Plus Inc | ||
| 6959 | 1456 Advanced Hardware Architectures | ||
| 6960 | 1457 Nuera Communications Inc | ||
| 6961 | 1458 Giga-byte Technology | ||
| 6962 | 0c11 K8NS Pro Mainboard | ||
| 6963 | 1459 DOOIN Electronics | ||
| 6964 | 145a Escalate Networks Inc | ||
| 6965 | 145b PRAIM SRL | ||
| 6966 | 145c Cryptek | ||
| 6967 | 145d Gallant Computer Inc | ||
| 6968 | 145e Aashima Technology B.V. | ||
| 6969 | 145f Baldor Electric Company | ||
| 6970 | 0001 NextMove PCI | ||
| 6971 | 1460 DYNARC INC | ||
| 6972 | 1461 Avermedia Technologies Inc | ||
| 6973 | 1462 Micro-Star International Co., Ltd. | ||
| 6974 | # MSI CB54G Wireless PC Card that seems to use the Broadcom 4306 Chipset | ||
| 6975 | 6819 Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [MSI CB54G] | ||
| 6976 | 6825 PCI Card wireless 11g [PC54G] | ||
| 6977 | 8725 NVIDIA NV25 [GeForce4 Ti 4600] VGA Adapter | ||
| 6978 | # MSI G4Ti4800, 128MB DDR SDRAM, TV-Out, DVI-I | ||
| 6979 | 9000 NVIDIA NV28 [GeForce4 Ti 4800] VGA Adapter | ||
| 6980 | 9110 GeFORCE FX5200 | ||
| 6981 | 9119 NVIDIA NV31 [GeForce FX 5600XT] VGA Adapter | ||
| 6982 | 9591 nVidia Corporation NV36 [GeForce FX 5700LE] | ||
| 6983 | 1463 Fast Corporation | ||
| 6984 | 1464 Interactive Circuits & Systems Ltd | ||
| 6985 | 1465 GN NETTEST Telecom DIV. | ||
| 6986 | 1466 Designpro Inc. | ||
| 6987 | 1467 DIGICOM SPA | ||
| 6988 | 1468 AMBIT Microsystem Corp. | ||
| 6989 | 1469 Cleveland Motion Controls | ||
| 6990 | 146a IFR | ||
| 6991 | 146b Parascan Technologies Ltd | ||
| 6992 | 146c Ruby Tech Corp. | ||
| 6993 | 1430 FE-1430TX Fast Ethernet PCI Adapter | ||
| 6994 | 146d Tachyon, INC. | ||
| 6995 | 146e Williams Electronics Games, Inc. | ||
| 6996 | 146f Multi Dimensional Consulting Inc | ||
| 6997 | 1470 Bay Networks | ||
| 6998 | 1471 Integrated Telecom Express Inc | ||
| 6999 | 1472 DAIKIN Industries, Ltd | ||
| 7000 | 1473 ZAPEX Technologies Inc | ||
| 7001 | 1474 Doug Carson & Associates | ||
| 7002 | 1475 PICAZO Communications | ||
| 7003 | 1476 MORTARA Instrument Inc | ||
| 7004 | 1477 Net Insight | ||
| 7005 | 1478 DIATREND Corporation | ||
| 7006 | 1479 TORAY Industries Inc | ||
| 7007 | 147a FORMOSA Industrial Computing | ||
| 7008 | 147b ABIT Computer Corp. | ||
| 7009 | 147c AWARE, Inc. | ||
| 7010 | 147d Interworks Computer Products | ||
| 7011 | 147e Matsushita Graphic Communication Systems, Inc. | ||
| 7012 | 147f NIHON UNISYS, Ltd. | ||
| 7013 | 1480 SCII Telecom | ||
| 7014 | 1481 BIOPAC Systems Inc | ||
| 7015 | 1482 ISYTEC - Integrierte Systemtechnik GmBH | ||
| 7016 | 1483 LABWAY Corporation | ||
| 7017 | 1484 Logic Corporation | ||
| 7018 | 1485 ERMA - Electronic GmBH | ||
| 7019 | 1486 L3 Communications Telemetry & Instrumentation | ||
| 7020 | 1487 MARQUETTE Medical Systems | ||
| 7021 | 1488 KONTRON Electronik GmBH | ||
| 7022 | 1489 KYE Systems Corporation | ||
| 7023 | 148a OPTO | ||
| 7024 | 148b INNOMEDIALOGIC Inc. | ||
| 7025 | 148c C.P. Technology Co. Ltd | ||
| 7026 | 148d DIGICOM Systems, Inc. | ||
| 7027 | 1003 HCF 56k Data/Fax Modem | ||
| 7028 | 148e OSI Plus Corporation | ||
| 7029 | 148f Plant Equipment, Inc. | ||
| 7030 | 1490 Stone Microsystems PTY Ltd. | ||
| 7031 | 1491 ZEAL Corporation | ||
| 7032 | 1492 Time Logic Corporation | ||
| 7033 | 1493 MAKER Communications | ||
| 7034 | 1494 WINTOP Technology, Inc. | ||
| 7035 | 1495 TOKAI Communications Industry Co. Ltd | ||
| 7036 | 1496 JOYTECH Computer Co., Ltd. | ||
| 7037 | 1497 SMA Regelsysteme GmBH | ||
| 7038 | 1498 TEWS Datentechnik GmBH | ||
| 7039 | 30c8 TPCI200 | ||
| 7040 | 1499 EMTEC CO., Ltd | ||
| 7041 | 149a ANDOR Technology Ltd | ||
| 7042 | 149b SEIKO Instruments Inc | ||
| 7043 | 149c OVISLINK Corp. | ||
| 7044 | 149d NEWTEK Inc | ||
| 7045 | 0001 Video Toaster for PC | ||
| 7046 | 149e Mapletree Networks Inc. | ||
| 7047 | 149f LECTRON Co Ltd | ||
| 7048 | 14a0 SOFTING GmBH | ||
| 7049 | 14a1 Systembase Co Ltd | ||
| 7050 | 14a2 Millennium Engineering Inc | ||
| 7051 | 14a3 Maverick Networks | ||
| 7052 | 14a4 GVC/BCM Advanced Research | ||
| 7053 | 14a5 XIONICS Document Technologies Inc | ||
| 7054 | 14a6 INOVA Computers GmBH & Co KG | ||
| 7055 | 14a7 MYTHOS Systems Inc | ||
| 7056 | 14a8 FEATRON Technologies Corporation | ||
| 7057 | 14a9 HIVERTEC Inc | ||
| 7058 | 14aa Advanced MOS Technology Inc | ||
| 7059 | 14ab Mentor Graphics Corp. | ||
| 7060 | 14ac Novaweb Technologies Inc | ||
| 7061 | 14ad Time Space Radio AB | ||
| 7062 | 14ae CTI, Inc | ||
| 7063 | 14af Guillemot Corporation | ||
| 7064 | 7102 3D Prophet II MX | ||
| 7065 | 14b0 BST Communication Technology Ltd | ||
| 7066 | 14b1 Nextcom K.K. | ||
| 7067 | 14b2 ENNOVATE Networks Inc | ||
| 7068 | 14b3 XPEED Inc | ||
| 7069 | 0000 DSL NIC | ||
| 7070 | 14b4 PHILIPS Business Electronics B.V. | ||
| 7071 | 14b5 Creamware GmBH | ||
| 7072 | 0200 Scope | ||
| 7073 | 0300 Pulsar | ||
| 7074 | 0400 PulsarSRB | ||
| 7075 | 0600 Pulsar2 | ||
| 7076 | 0800 DSP-Board | ||
| 7077 | 0900 DSP-Board | ||
| 7078 | 0a00 DSP-Board | ||
| 7079 | 0b00 DSP-Board | ||
| 7080 | 14b6 Quantum Data Corp. | ||
| 7081 | 14b7 PROXIM Inc | ||
| 7082 | 0001 Symphony 4110 | ||
| 7083 | 14b8 Techsoft Technology Co Ltd | ||
| 7084 | 14b9 AIRONET Wireless Communications | ||
| 7085 | 0001 PC4800 | ||
| 7086 | 0340 PC4800 | ||
| 7087 | 0350 PC4800 | ||
| 7088 | 4500 PC4500 | ||
| 7089 | 4800 Cisco Aironet 340 802.11b Wireless LAN Adapter/Aironet PC4800 | ||
| 7090 | a504 Cisco Aironet Wireless 802.11b | ||
| 7091 | a505 Cisco Aironet CB20a 802.11a Wireless LAN Adapter | ||
| 7092 | a506 Cisco Aironet Mini PCI b/g | ||
| 7093 | 14ba INTERNIX Inc. | ||
| 7094 | 14bb SEMTECH Corporation | ||
| 7095 | 14bc Globespan Semiconductor Inc. | ||
| 7096 | 14bd CARDIO Control N.V. | ||
| 7097 | 14be L3 Communications | ||
| 7098 | 14bf SPIDER Communications Inc. | ||
| 7099 | 14c0 COMPAL Electronics Inc | ||
| 7100 | 14c1 MYRICOM Inc. | ||
| 7101 | 8043 Myrinet 2000 Scalable Cluster Interconnect | ||
| 7102 | 14c2 DTK Computer | ||
| 7103 | 14c3 MEDIATEK Corp. | ||
| 7104 | 14c4 IWASAKI Information Systems Co Ltd | ||
| 7105 | 14c5 Automation Products AB | ||
| 7106 | 14c6 Data Race Inc | ||
| 7107 | 14c7 Modular Technology Holdings Ltd | ||
| 7108 | 14c8 Turbocomm Tech. Inc. | ||
| 7109 | 14c9 ODIN Telesystems Inc | ||
| 7110 | 14ca PE Logic Corp. | ||
| 7111 | 14cb Billionton Systems Inc | ||
| 7112 | 14cc NAKAYO Telecommunications Inc | ||
| 7113 | 14cd Universal Scientific Ind. | ||
| 7114 | 14ce Whistle Communications | ||
| 7115 | 14cf TEK Microsystems Inc. | ||
| 7116 | 14d0 Ericsson Axe R & D | ||
| 7117 | 14d1 Computer Hi-Tech Co Ltd | ||
| 7118 | 14d2 Titan Electronics Inc | ||
| 7119 | 8001 VScom 010L 1 port parallel adaptor | ||
| 7120 | 8002 VScom 020L 2 port parallel adaptor | ||
| 7121 | 8010 VScom 100L 1 port serial adaptor | ||
| 7122 | 8011 VScom 110L 1 port serial and 1 port parallel adaptor | ||
| 7123 | 8020 VScom 200L 1 port serial adaptor | ||
| 7124 | 8021 VScom 210L 2 port serial and 1 port parallel adaptor | ||
| 7125 | 8040 VScom 400L 4 port serial adaptor | ||
| 7126 | 8080 VScom 800L 8 port serial adaptor | ||
| 7127 | a000 VScom 010H 1 port parallel adaptor | ||
| 7128 | a001 VScom 100H 1 port serial adaptor | ||
| 7129 | a003 VScom 400H 4 port serial adaptor | ||
| 7130 | a004 VScom 400HF1 4 port serial adaptor | ||
| 7131 | a005 VScom 200H 2 port serial adaptor | ||
| 7132 | e001 VScom 010HV2 1 port parallel adaptor | ||
| 7133 | e010 VScom 100HV2 1 port serial adaptor | ||
| 7134 | e020 VScom 200HV2 2 port serial adaptor | ||
| 7135 | 14d3 CIRTECH (UK) Ltd | ||
| 7136 | 14d4 Panacom Technology Corp | ||
| 7137 | 14d5 Nitsuko Corporation | ||
| 7138 | 14d6 Accusys Inc | ||
| 7139 | 14d7 Hirakawa Hewtech Corp | ||
| 7140 | 14d8 HOPF Elektronik GmBH | ||
| 7141 | # Formerly SiPackets, Inc., formerly API NetWorks, Inc., formerly Alpha Processor, Inc. | ||
| 7142 | 14d9 Alliance Semiconductor Corporation | ||
| 7143 | 0010 AP1011/SP1011 HyperTransport-PCI Bridge [Sturgeon] | ||
| 7144 | 9000 AS90L10204/10208 HyperTransport to PCI-X Bridge | ||
| 7145 | 14da National Aerospace Laboratories | ||
| 7146 | 14db AFAVLAB Technology Inc | ||
| 7147 | 2120 TK9902 | ||
| 7148 | 14dc Amplicon Liveline Ltd | ||
| 7149 | 0000 PCI230 | ||
| 7150 | 0001 PCI242 | ||
| 7151 | 0002 PCI244 | ||
| 7152 | 0003 PCI247 | ||
| 7153 | 0004 PCI248 | ||
| 7154 | 0005 PCI249 | ||
| 7155 | 0006 PCI260 | ||
| 7156 | 0007 PCI224 | ||
| 7157 | 0008 PCI234 | ||
| 7158 | 0009 PCI236 | ||
| 7159 | 000a PCI272 | ||
| 7160 | 000b PCI215 | ||
| 7161 | 14dd Boulder Design Labs Inc | ||
| 7162 | 14de Applied Integration Corporation | ||
| 7163 | 14df ASIC Communications Corp | ||
| 7164 | 14e1 INVERTEX | ||
| 7165 | 14e2 INFOLIBRIA | ||
| 7166 | 14e3 AMTELCO | ||
| 7167 | 14e4 Broadcom Corporation | ||
| 7168 | 0800 Sentry5 Chipcommon I/O Controller | ||
| 7169 | 0804 Sentry5 PCI Bridge | ||
| 7170 | 0805 Sentry5 MIPS32 CPU | ||
| 7171 | 0806 Sentry5 Ethernet Controller | ||
| 7172 | 080b Sentry5 Crypto Accelerator | ||
| 7173 | 080f Sentry5 DDR/SDR RAM Controller | ||
| 7174 | 0811 Sentry5 External Interface Core | ||
| 7175 | 0816 BCM3302 Sentry5 MIPS32 CPU | ||
| 7176 | 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express | ||
| 7177 | 1644 NetXtreme BCM5700 Gigabit Ethernet | ||
| 7178 | 1014 0277 Broadcom Vigil B5700 1000Base-T | ||
| 7179 | 1028 00d1 Broadcom BCM5700 | ||
| 7180 | 1028 0106 Broadcom BCM5700 | ||
| 7181 | 1028 0109 Broadcom BCM5700 1000Base-T | ||
| 7182 | 1028 010a Broadcom BCM5700 1000BaseTX | ||
| 7183 | 10b7 1000 3C996-T 1000Base-T | ||
| 7184 | 10b7 1001 3C996B-T 1000Base-T | ||
| 7185 | 10b7 1002 3C996C-T 1000Base-T | ||
| 7186 | 10b7 1003 3C997-T 1000Base-T Dual Port | ||
| 7187 | 10b7 1004 3C996-SX 1000Base-SX | ||
| 7188 | 10b7 1005 3C997-SX 1000Base-SX Dual Port | ||
| 7189 | 10b7 1008 3C942 Gigabit LOM (31X31) | ||
| 7190 | 14e4 0002 NetXtreme 1000Base-SX | ||
| 7191 | 14e4 0003 NetXtreme 1000Base-SX | ||
| 7192 | 14e4 0004 NetXtreme 1000Base-T | ||
| 7193 | 14e4 1028 NetXtreme 1000BaseTX | ||
| 7194 | 14e4 1644 BCM5700 1000Base-T | ||
| 7195 | 1645 NetXtreme BCM5701 Gigabit Ethernet | ||
| 7196 | 0e11 007c NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) | ||
| 7197 | 0e11 007d NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) | ||
| 7198 | 0e11 0085 NC7780 Gigabit Server Adapter (embedded, WOL) | ||
| 7199 | 0e11 0099 NC7780 Gigabit Server Adapter (embedded, WOL) | ||
| 7200 | 0e11 009a NC7770 Gigabit Server Adapter (PCI-X, 10/100/1000-T) | ||
| 7201 | 0e11 00c1 NC6770 Gigabit Server Adapter (PCI-X, 1000-SX) | ||
| 7202 | 1028 0121 Broadcom BCM5701 1000Base-T | ||
| 7203 | 103c 128a HP 1000Base-T (PCI) [A7061A] | ||
| 7204 | 103c 128b HP 1000Base-SX (PCI) [A7073A] | ||
| 7205 | 103c 12a4 HP Core Lan 1000Base-T | ||
| 7206 | 103c 12c1 HP IOX Core Lan 1000Base-T [A7109AX] | ||
| 7207 | 10a9 8010 SGI IO9 Gigabit Ethernet (Copper) | ||
| 7208 | 10a9 8011 SGI Gigabit Ethernet (Copper) | ||
| 7209 | 10a9 8012 SGI Gigabit Ethernet (Fiber) | ||
| 7210 | 10b7 1004 3C996-SX 1000Base-SX | ||
| 7211 | 10b7 1006 3C996B-T 1000Base-T | ||
| 7212 | 10b7 1007 3C1000-T 1000Base-T | ||
| 7213 | 10b7 1008 3C940-BR01 1000Base-T | ||
| 7214 | 14e4 0001 BCM5701 1000Base-T | ||
| 7215 | 14e4 0005 BCM5701 1000Base-T | ||
| 7216 | 14e4 0006 BCM5701 1000Base-T | ||
| 7217 | 14e4 0007 BCM5701 1000Base-SX | ||
| 7218 | 14e4 0008 BCM5701 1000Base-T | ||
| 7219 | 14e4 8008 BCM5701 1000Base-T | ||
| 7220 | 1646 NetXtreme BCM5702 Gigabit Ethernet | ||
| 7221 | 0e11 00bb NC7760 1000BaseTX | ||
| 7222 | 1028 0126 Broadcom BCM5702 1000BaseTX | ||
| 7223 | 14e4 8009 BCM5702 1000BaseTX | ||
| 7224 | 1647 NetXtreme BCM5703 Gigabit Ethernet | ||
| 7225 | 0e11 0099 NC7780 1000BaseTX | ||
| 7226 | 0e11 009a NC7770 1000BaseTX | ||
| 7227 | 10a9 8010 SGI IO9 Gigabit Ethernet (Copper) | ||
| 7228 | 14e4 0009 BCM5703 1000BaseTX | ||
| 7229 | 14e4 000a BCM5703 1000BaseSX | ||
| 7230 | 14e4 000b BCM5703 1000BaseTX | ||
| 7231 | 14e4 8009 BCM5703 1000BaseTX | ||
| 7232 | 14e4 800a BCM5703 1000BaseTX | ||
| 7233 | 1648 NetXtreme BCM5704 Gigabit Ethernet | ||
| 7234 | 0e11 00cf NC7772 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7235 | 0e11 00d0 NC7782 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7236 | 0e11 00d1 NC7783 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7237 | 10b7 2000 3C998-T Dual Port 10/100/1000 PCI-X | ||
| 7238 | 10b7 3000 3C999-T Quad Port 10/100/1000 PCI-X | ||
| 7239 | 1166 1648 NetXtreme CIOB-E 1000Base-T | ||
| 7240 | 164a NetXtreme II BCM5706 Gigabit Ethernet | ||
| 7241 | 164d NetXtreme BCM5702FE Gigabit Ethernet | ||
| 7242 | 1653 NetXtreme BCM5705 Gigabit Ethernet | ||
| 7243 | 0e11 00e3 NC7761 Gigabit Server Adapter | ||
| 7244 | 1654 NetXtreme BCM5705_2 Gigabit Ethernet | ||
| 7245 | 0e11 00e3 NC7761 Gigabit Server Adapter | ||
| 7246 | 103c 3100 NC1020 HP ProLiant Gigabit Server Adapter 32 PCI | ||
| 7247 | 1659 NetXtreme BCM5721 Gigabit Ethernet PCI Express | ||
| 7248 | 165d NetXtreme BCM5705M Gigabit Ethernet | ||
| 7249 | 165e NetXtreme BCM5705M_2 Gigabit Ethernet | ||
| 7250 | 103c 088c nc8000 laptop | ||
| 7251 | 103c 0890 nc6000 laptop | ||
| 7252 | 166e 570x 10/100 Integrated Controller | ||
| 7253 | 1677 NetXtreme BCM5751 Gigabit Ethernet PCI Express | ||
| 7254 | 1028 0179 Optiplex GX280 | ||
| 7255 | 167d NetXtreme BCM5751M Gigabit Ethernet PCI Express | ||
| 7256 | 167e NetXtreme BCM5751F Fast Ethernet PCI Express | ||
| 7257 | 1696 NetXtreme BCM5782 Gigabit Ethernet | ||
| 7258 | 103c 12bc HP d530 CMT (DG746A) | ||
| 7259 | 14e4 000d NetXtreme BCM5782 1000Base-T | ||
| 7260 | 169c NetXtreme BCM5788 Gigabit Ethernet | ||
| 7261 | 169d NetLink BCM5789 Gigabit Ethernet PCI Express | ||
| 7262 | 16a6 NetXtreme BCM5702X Gigabit Ethernet | ||
| 7263 | 0e11 00bb NC7760 Gigabit Server Adapter (PCI-X, 10/100/1000-T) | ||
| 7264 | 1028 0126 BCM5702 1000Base-T | ||
| 7265 | 14e4 000c BCM5702 1000Base-T | ||
| 7266 | 14e4 8009 BCM5702 1000Base-T | ||
| 7267 | 16a7 NetXtreme BCM5703X Gigabit Ethernet | ||
| 7268 | 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7269 | 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7270 | 14e4 0009 NetXtreme BCM5703 1000Base-T | ||
| 7271 | 14e4 000a NetXtreme BCM5703 1000Base-SX | ||
| 7272 | 14e4 000b NetXtreme BCM5703 1000Base-T | ||
| 7273 | 14e4 800a NetXtreme BCM5703 1000Base-T | ||
| 7274 | 16a8 NetXtreme BCM5704S Gigabit Ethernet | ||
| 7275 | 10b7 2001 3C998-SX Dual Port 1000-SX PCI-X | ||
| 7276 | 16aa NetXtreme II BCM5706S Gigabit Ethernet | ||
| 7277 | 16c6 NetXtreme BCM5702A3 Gigabit Ethernet | ||
| 7278 | 10b7 1100 3C1000B-T 10/100/1000 PCI | ||
| 7279 | 14e4 000c BCM5702 1000Base-T | ||
| 7280 | 14e4 8009 BCM5702 1000Base-T | ||
| 7281 | 16c7 NetXtreme BCM5703 Gigabit Ethernet | ||
| 7282 | 0e11 00ca NC7771 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7283 | 0e11 00cb NC7781 Gigabit Server Adapter (PCI-X, 10,100,1000-T) | ||
| 7284 | 103c 12c3 HP Combo FC/GigE-SX [A9782A] | ||
| 7285 | 103c 12ca HP Combo FC/GigE-T [A9784A] | ||
| 7286 | 14e4 0009 NetXtreme BCM5703 1000Base-T | ||
| 7287 | 14e4 000a NetXtreme BCM5703 1000Base-SX | ||
| 7288 | 16dd NetLink BCM5781 Gigabit Ethernet PCI Express | ||
| 7289 | 16f7 NetXtreme BCM5753 Gigabit Ethernet PCI Express | ||
| 7290 | 16fd NetXtreme BCM5753M Gigabit Ethernet PCI Express | ||
| 7291 | 16fe NetXtreme BCM5753F Fast Ethernet PCI Express | ||
| 7292 | 170c BCM4401-B0 100Base-TX | ||
| 7293 | 170d NetXtreme BCM5901 100Base-TX | ||
| 7294 | 1014 0545 ThinkPad R40e (2684-HVG) builtin ethernet controller | ||
| 7295 | 170e NetXtreme BCM5901 100Base-TX | ||
| 7296 | 3352 BCM3352 | ||
| 7297 | 3360 BCM3360 | ||
| 7298 | 4210 BCM4210 iLine10 HomePNA 2.0 | ||
| 7299 | 4211 BCM4211 iLine10 HomePNA 2.0 + V.90 56k modem | ||
| 7300 | 4212 BCM4212 v.90 56k modem | ||
| 7301 | 4301 BCM4303 802.11b Wireless LAN Controller | ||
| 7302 | 1028 0407 TrueMobile 1180 Onboard WLAN | ||
| 7303 | 1043 0120 WL-103b Wireless LAN PC Card | ||
| 7304 | 4305 BCM4307 V.90 56k Modem | ||
| 7305 | 4306 BCM4307 Ethernet Controller | ||
| 7306 | 4307 BCM4307 802.11b Wireless LAN Controller | ||
| 7307 | 4310 BCM4310 Chipcommon I/OController | ||
| 7308 | 4312 BCM4310 UART | ||
| 7309 | 4313 BCM4310 Ethernet Controller | ||
| 7310 | 4315 BCM4310 USB Controller | ||
| 7311 | 4320 BCM4306 802.11b/g Wireless LAN Controller | ||
| 7312 | 1028 0001 TrueMobile 1300 WLAN Mini-PCI Card | ||
| 7313 | 1028 0003 Wireless 1350 WLAN Mini-PCI Card | ||
| 7314 | 1043 100f WL-100G | ||
| 7315 | 14e4 4320 Linksys WMP54G PCI | ||
| 7316 | 1737 4320 WPC54G | ||
| 7317 | 1799 7010 Belkin F5D7010 54g Wireless Network card | ||
| 7318 | 4321 BCM4306 802.11a Wireless LAN Controller | ||
| 7319 | 4322 BCM4306 UART | ||
| 7320 | 4324 BCM4309 802.11a/b/g | ||
| 7321 | 1028 0001 Truemobile 1400 | ||
| 7322 | 1028 0003 Truemobile 1450 MiniPCI | ||
| 7323 | 4325 BCM43xG 802.11b/g | ||
| 7324 | 1414 0003 Wireless Notebook Adapter MN-720 | ||
| 7325 | 1414 0004 Wireless PCI Adapter MN-730 | ||
| 7326 | # probably this is a correct ID... | ||
| 7327 | 4326 BCM4307 Chipcommon I/O Controller? | ||
| 7328 | 4401 BCM4401 100Base-T | ||
| 7329 | 1043 80a8 A7V8X motherboard | ||
| 7330 | 4402 BCM4402 Integrated 10/100BaseT | ||
| 7331 | 4403 BCM4402 V.90 56k Modem | ||
| 7332 | 4410 BCM4413 iLine32 HomePNA 2.0 | ||
| 7333 | 4411 BCM4413 V.90 56k modem | ||
| 7334 | 4412 BCM4412 10/100BaseT | ||
| 7335 | 4430 BCM44xx CardBus iLine32 HomePNA 2.0 | ||
| 7336 | 4432 BCM4432 CardBus 10/100BaseT | ||
| 7337 | 4610 BCM4610 Sentry5 PCI to SB Bridge | ||
| 7338 | 4611 BCM4610 Sentry5 iLine32 HomePNA 1.0 | ||
| 7339 | 4612 BCM4610 Sentry5 V.90 56k Modem | ||
| 7340 | 4613 BCM4610 Sentry5 Ethernet Controller | ||
| 7341 | 4614 BCM4610 Sentry5 External Interface | ||
| 7342 | 4615 BCM4610 Sentry5 USB Controller | ||
| 7343 | 4704 BCM4704 PCI to SB Bridge | ||
| 7344 | 4705 BCM4704 Sentry5 802.11b Wireless LAN Controller | ||
| 7345 | 4706 BCM4704 Sentry5 Ethernet Controller | ||
| 7346 | 4707 BCM4704 Sentry5 USB Controller | ||
| 7347 | 4708 BCM4704 Crypto Accelerator | ||
| 7348 | 4710 BCM4710 Sentry5 PCI to SB Bridge | ||
| 7349 | 4711 BCM47xx Sentry5 iLine32 HomePNA 2.0 | ||
| 7350 | 4712 BCM47xx V.92 56k modem | ||
| 7351 | 4713 Sentry5 Ethernet Controller | ||
| 7352 | 4714 BCM47xx Sentry5 External Interface | ||
| 7353 | 4715 Sentry5 USB Controller | ||
| 7354 | 4716 BCM47xx Sentry5 USB Host Controller | ||
| 7355 | 4717 BCM47xx Sentry5 USB Device Controller | ||
| 7356 | 4718 Sentry5 Crypto Accelerator | ||
| 7357 | 4720 BCM4712 MIPS CPU | ||
| 7358 | 5365 BCM5365P Sentry5 Host Bridge | ||
| 7359 | 5600 BCM5600 StrataSwitch 24+2 Ethernet Switch Controller | ||
| 7360 | 5605 BCM5605 StrataSwitch 24+2 Ethernet Switch Controller | ||
| 7361 | 5615 BCM5615 StrataSwitch 24+2 Ethernet Switch Controller | ||
| 7362 | 5625 BCM5625 StrataSwitch 24+2 Ethernet Switch Controller | ||
| 7363 | 5645 BCM5645 StrataSwitch 24+2 Ethernet Switch Controller | ||
| 7364 | 5670 BCM5670 8-Port 10GE Ethernet Switch Fabric | ||
| 7365 | 5680 BCM5680 G-Switch 8 Port Gigabit Ethernet Switch Controller | ||
| 7366 | 5690 BCM5690 12-port Multi-Layer Gigabit Ethernet Switch | ||
| 7367 | 5691 BCM5691 GE/10GE 8+2 Gigabit Ethernet Switch Controller | ||
| 7368 | 5820 BCM5820 Crypto Accelerator | ||
| 7369 | 5821 BCM5821 Crypto Accelerator | ||
| 7370 | 5822 BCM5822 Crypto Accelerator | ||
| 7371 | 5823 BCM5823 Crypto Accelerator | ||
| 7372 | 5824 BCM5824 Crypto Accelerator | ||
| 7373 | 5840 BCM5840 Crypto Accelerator | ||
| 7374 | 5841 BCM5841 Crypto Accelerator | ||
| 7375 | 5850 BCM5850 Crypto Accelerator | ||
| 7376 | 14e5 Pixelfusion Ltd | ||
| 7377 | 14e6 SHINING Technology Inc | ||
| 7378 | 14e7 3CX | ||
| 7379 | 14e8 RAYCER Inc | ||
| 7380 | 14e9 GARNETS System CO Ltd | ||
| 7381 | 14ea Planex Communications, Inc | ||
| 7382 | ab06 FNW-3603-TX CardBus Fast Ethernet | ||
| 7383 | ab07 RTL81xx RealTek Ethernet | ||
| 7384 | 14eb SEIKO EPSON Corp | ||
| 7385 | 14ec ACQIRIS | ||
| 7386 | 14ed DATAKINETICS Ltd | ||
| 7387 | 14ee MASPRO KENKOH Corp | ||
| 7388 | 14ef CARRY Computer ENG. CO Ltd | ||
| 7389 | 14f0 CANON RESEACH CENTRE FRANCE | ||
| 7390 | 14f1 Conexant | ||
| 7391 | 1002 HCF 56k Modem | ||
| 7392 | 1003 HCF 56k Modem | ||
| 7393 | 1004 HCF 56k Modem | ||
| 7394 | 1005 HCF 56k Modem | ||
| 7395 | 1006 HCF 56k Modem | ||
| 7396 | 1022 HCF 56k Modem | ||
| 7397 | 1023 HCF 56k Modem | ||
| 7398 | 1024 HCF 56k Modem | ||
| 7399 | 1025 HCF 56k Modem | ||
| 7400 | 1026 HCF 56k Modem | ||
| 7401 | 1032 HCF 56k Modem | ||
| 7402 | 1033 HCF 56k Data/Fax Modem | ||
| 7403 | 1033 8077 NEC | ||
| 7404 | 122d 4027 Dell Zeus - MDP3880-W(B) Data Fax Modem | ||
| 7405 | 122d 4030 Dell Mercury - MDP3880-U(B) Data Fax Modem | ||
| 7406 | 122d 4034 Dell Thor - MDP3880-W(U) Data Fax Modem | ||
| 7407 | 13e0 020d Dell Copper | ||
| 7408 | 13e0 020e Dell Silver | ||
| 7409 | 13e0 0261 IBM | ||
| 7410 | 13e0 0290 Compaq Goldwing | ||
| 7411 | 13e0 02a0 IBM | ||
| 7412 | 13e0 02b0 IBM | ||
| 7413 | 13e0 02c0 Compaq Scooter | ||
| 7414 | 13e0 02d0 IBM | ||
| 7415 | 144f 1500 IBM P85-DF (1) | ||
| 7416 | 144f 1501 IBM P85-DF (2) | ||
| 7417 | 144f 150a IBM P85-DF (3) | ||
| 7418 | 144f 150b IBM P85-DF Low Profile (1) | ||
| 7419 | 144f 1510 IBM P85-DF Low Profile (2) | ||
| 7420 | 1034 HCF 56k Data/Fax/Voice Modem | ||
| 7421 | 1035 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7422 | 10cf 1098 Fujitsu P85-DFSV | ||
| 7423 | 1036 HCF 56k Data/Fax/Voice/Spkp Modem | ||
| 7424 | 104d 8067 HCF 56k Modem | ||
| 7425 | 122d 4029 MDP3880SP-W | ||
| 7426 | 122d 4031 MDP3880SP-U | ||
| 7427 | 13e0 0209 Dell Titanium | ||
| 7428 | 13e0 020a Dell Graphite | ||
| 7429 | 13e0 0260 Gateway Red Owl | ||
| 7430 | 13e0 0270 Gateway White Horse | ||
| 7431 | 1052 HCF 56k Data/Fax Modem (Worldwide) | ||
| 7432 | 1053 HCF 56k Data/Fax Modem (Worldwide) | ||
| 7433 | 1054 HCF 56k Data/Fax/Voice Modem (Worldwide) | ||
| 7434 | 1055 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (Worldwide) | ||
| 7435 | 1056 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) | ||
| 7436 | 1057 HCF 56k Data/Fax/Voice/Spkp Modem (Worldwide) | ||
| 7437 | 1059 HCF 56k Data/Fax/Voice Modem (Worldwide) | ||
| 7438 | 1063 HCF 56k Data/Fax Modem | ||
| 7439 | 1064 HCF 56k Data/Fax/Voice Modem | ||
| 7440 | 1065 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7441 | 1066 HCF 56k Data/Fax/Voice/Spkp Modem | ||
| 7442 | 122d 4033 Dell Athena - MDP3900V-U | ||
| 7443 | 1433 HCF 56k Data/Fax Modem | ||
| 7444 | 1434 HCF 56k Data/Fax/Voice Modem | ||
| 7445 | 1435 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7446 | 1436 HCF 56k Data/Fax Modem | ||
| 7447 | 1453 HCF 56k Data/Fax Modem | ||
| 7448 | 13e0 0240 IBM | ||
| 7449 | 13e0 0250 IBM | ||
| 7450 | 144f 1502 IBM P95-DF (1) | ||
| 7451 | 144f 1503 IBM P95-DF (2) | ||
| 7452 | 1454 HCF 56k Data/Fax/Voice Modem | ||
| 7453 | 1455 HCF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7454 | 1456 HCF 56k Data/Fax/Voice/Spkp Modem | ||
| 7455 | 122d 4035 Dell Europa - MDP3900V-W | ||
| 7456 | 122d 4302 Dell MP3930V-W(C) MiniPCI | ||
| 7457 | 1610 ADSL AccessRunner PCI Arbitration Device | ||
| 7458 | 1611 AccessRunner PCI ADSL Interface Device | ||
| 7459 | 1620 ADSL AccessRunner V2 PCI Arbitration Device | ||
| 7460 | 1621 AccessRunner V2 PCI ADSL Interface Device | ||
| 7461 | 1622 AccessRunner V2 PCI ADSL Yukon WAN Adapter | ||
| 7462 | 1803 HCF 56k Modem | ||
| 7463 | 0e11 0023 623-LAN Grizzly | ||
| 7464 | 0e11 0043 623-LAN Yogi | ||
| 7465 | 1815 HCF 56k Modem | ||
| 7466 | 0e11 0022 Grizzly | ||
| 7467 | 0e11 0042 Yogi | ||
| 7468 | 2003 HSF 56k Data/Fax Modem | ||
| 7469 | 2004 HSF 56k Data/Fax/Voice Modem | ||
| 7470 | 2005 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7471 | 2006 HSF 56k Data/Fax/Voice/Spkp Modem | ||
| 7472 | 2013 HSF 56k Data/Fax Modem | ||
| 7473 | 0e11 b195 Bear | ||
| 7474 | 0e11 b196 Seminole 1 | ||
| 7475 | 0e11 b1be Seminole 2 | ||
| 7476 | 1025 8013 Acer | ||
| 7477 | 1033 809d NEC | ||
| 7478 | 1033 80bc NEC | ||
| 7479 | 155d 6793 HP | ||
| 7480 | 155d 8850 E Machines | ||
| 7481 | 2014 HSF 56k Data/Fax/Voice Modem | ||
| 7482 | 2015 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem | ||
| 7483 | 2016 HSF 56k Data/Fax/Voice/Spkp Modem | ||
| 7484 | 2043 HSF 56k Data/Fax Modem (WorldW SmartDAA) | ||
| 7485 | 2044 HSF 56k Data/Fax/Voice Modem (WorldW SmartDAA) | ||
| 7486 | 2045 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (WorldW SmartDAA) | ||
| 7487 | 2046 HSF 56k Data/Fax/Voice/Spkp Modem (WorldW SmartDAA) | ||
| 7488 | 2063 HSF 56k Data/Fax Modem (SmartDAA) | ||
| 7489 | 2064 HSF 56k Data/Fax/Voice Modem (SmartDAA) | ||
| 7490 | 2065 HSF 56k Data/Fax/Voice/Spkp (w/Handset) Modem (SmartDAA) | ||
| 7491 | 2066 HSF 56k Data/Fax/Voice/Spkp Modem (SmartDAA) | ||
| 7492 | 2093 HSF 56k Modem | ||
| 7493 | 155d 2f07 Legend | ||
| 7494 | 2143 HSF 56k Data/Fax/Cell Modem (Mob WorldW SmartDAA) | ||
| 7495 | 2144 HSF 56k Data/Fax/Voice/Cell Modem (Mob WorldW SmartDAA) | ||
| 7496 | 2145 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob WorldW SmartDAA) | ||
| 7497 | 2146 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob WorldW SmartDAA) | ||
| 7498 | 2163 HSF 56k Data/Fax/Cell Modem (Mob SmartDAA) | ||
| 7499 | 2164 HSF 56k Data/Fax/Voice/Cell Modem (Mob SmartDAA) | ||
| 7500 | 2165 HSF 56k Data/Fax/Voice/Spkp (w/HS)/Cell Modem (Mob SmartDAA) | ||
| 7501 | 2166 HSF 56k Data/Fax/Voice/Spkp/Cell Modem (Mob SmartDAA) | ||
| 7502 | 2343 HSF 56k Data/Fax CardBus Modem (Mob WorldW SmartDAA) | ||
| 7503 | 2344 HSF 56k Data/Fax/Voice CardBus Modem (Mob WorldW SmartDAA) | ||
| 7504 | 2345 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob WorldW SmartDAA) | ||
| 7505 | 2346 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob WorldW SmartDAA) | ||
| 7506 | 2363 HSF 56k Data/Fax CardBus Modem (Mob SmartDAA) | ||
| 7507 | 2364 HSF 56k Data/Fax/Voice CardBus Modem (Mob SmartDAA) | ||
| 7508 | 2365 HSF 56k Data/Fax/Voice/Spkp (w/HS) CardBus Modem (Mob SmartDAA) | ||
| 7509 | 2366 HSF 56k Data/Fax/Voice/Spkp CardBus Modem (Mob SmartDAA) | ||
| 7510 | 2443 HSF 56k Data/Fax Modem (Mob WorldW SmartDAA) | ||
| 7511 | 104d 8075 Modem | ||
| 7512 | 104d 8083 Modem | ||
| 7513 | 104d 8097 Modem | ||
| 7514 | 2444 HSF 56k Data/Fax/Voice Modem (Mob WorldW SmartDAA) | ||
| 7515 | 2445 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob WorldW SmartDAA) | ||
| 7516 | 2446 HSF 56k Data/Fax/Voice/Spkp Modem (Mob WorldW SmartDAA) | ||
| 7517 | 2463 HSF 56k Data/Fax Modem (Mob SmartDAA) | ||
| 7518 | 2464 HSF 56k Data/Fax/Voice Modem (Mob SmartDAA) | ||
| 7519 | 2465 HSF 56k Data/Fax/Voice/Spkp (w/HS) Modem (Mob SmartDAA) | ||
| 7520 | 2466 HSF 56k Data/Fax/Voice/Spkp Modem (Mob SmartDAA) | ||
| 7521 | 2f00 HSF 56k HSFi Modem | ||
| 7522 | 13e0 8d84 IBM HSFi V.90 | ||
| 7523 | 13e0 8d85 Compaq Stinger | ||
| 7524 | 14f1 2004 Dynalink 56PMi | ||
| 7525 | 2f02 HSF 56k HSFi Data/Fax | ||
| 7526 | 2f11 HSF 56k HSFi Modem | ||
| 7527 | 8234 RS8234 ATM SAR Controller [ServiceSAR Plus] | ||
| 7528 | 8800 CX22702 DVB-T 2k/8k | ||
| 7529 | 17de 08a1 XPert DVB-T PCI BDA DVBT 23880 Video Capture | ||
| 7530 | 8802 CX23883 Broadcast Decoder | ||
| 7531 | 17de 08a1 Xpert DVB-T PCI 2388x Transport Stream Capture | ||
| 7532 | 14f2 MOBILITY Electronics | ||
| 7533 | 0120 EV1000 bridge | ||
| 7534 | 0121 EV1000 Parallel port | ||
| 7535 | 0122 EV1000 Serial port | ||
| 7536 | 0123 EV1000 Keyboard controller | ||
| 7537 | 0124 EV1000 Mouse controller | ||
| 7538 | 14f3 BroadLogic | ||
| 7539 | 2030 2030 DVB-S Satellite Reciever | ||
| 7540 | 2050 2050 DVB-T Terrestrial (Cable) Reciever | ||
| 7541 | 2060 2060 ATSC Terrestrial (Cable) Reciever | ||
| 7542 | 14f4 TOKYO Electronic Industry CO Ltd | ||
| 7543 | 14f5 SOPAC Ltd | ||
| 7544 | 14f6 COYOTE Technologies LLC | ||
| 7545 | 14f7 WOLF Technology Inc | ||
| 7546 | 14f8 AUDIOCODES Inc | ||
| 7547 | 2077 TP-240 dual span E1 VoIP PCI card | ||
| 7548 | 14f9 AG COMMUNICATIONS | ||
| 7549 | 14fa WANDEL & GOCHERMANN | ||
| 7550 | 14fb TRANSAS MARINE (UK) Ltd | ||
| 7551 | 14fc Quadrics Ltd | ||
| 7552 | 0000 QsNet Elan3 Network Adapter | ||
| 7553 | 0001 QsNetII Elan4 Network Adapter | ||
| 7554 | 14fd JAPAN Computer Industry Inc | ||
| 7555 | 14fe ARCHTEK TELECOM Corp | ||
| 7556 | 14ff TWINHEAD INTERNATIONAL Corp | ||
| 7557 | 1500 DELTA Electronics, Inc | ||
| 7558 | 1360 RTL81xx RealTek Ethernet | ||
| 7559 | 1501 BANKSOFT CANADA Ltd | ||
| 7560 | 1502 MITSUBISHI ELECTRIC LOGISTICS SUPPORT Co Ltd | ||
| 7561 | 1503 KAWASAKI LSI USA Inc | ||
| 7562 | 1504 KAISER Electronics | ||
| 7563 | 1505 ITA INGENIEURBURO FUR TESTAUFGABEN GmbH | ||
| 7564 | 1506 CHAMELEON Systems Inc | ||
| 7565 | # Should be HTEC Ltd, but there are no known HTEC chips and 1507 is already used by mistake by Motorola (see vendor ID 1057). | ||
| 7566 | 1507 Motorola ?? / HTEC | ||
| 7567 | 0001 MPC105 [Eagle] | ||
| 7568 | 0002 MPC106 [Grackle] | ||
| 7569 | 0003 MPC8240 [Kahlua] | ||
| 7570 | 0100 MC145575 [HFC-PCI] | ||
| 7571 | 0431 KTI829c 100VG | ||
| 7572 | 4801 Raven | ||
| 7573 | 4802 Falcon | ||
| 7574 | 4803 Hawk | ||
| 7575 | 4806 CPX8216 | ||
| 7576 | 1508 HONDA CONNECTORS/MHOTRONICS Inc | ||
| 7577 | 1509 FIRST INTERNATIONAL Computer Inc | ||
| 7578 | 150a FORVUS RESEARCH Inc | ||
| 7579 | 150b YAMASHITA Systems Corp | ||
| 7580 | 150c KYOPAL CO Ltd | ||
| 7581 | 150d WARPSPPED Inc | ||
| 7582 | 150e C-PORT Corp | ||
| 7583 | 150f INTEC GmbH | ||
| 7584 | 1510 BEHAVIOR TECH Computer Corp | ||
| 7585 | 1511 CENTILLIUM Technology Corp | ||
| 7586 | 1512 ROSUN Technologies Inc | ||
| 7587 | 1513 Raychem | ||
| 7588 | 1514 TFL LAN Inc | ||
| 7589 | 1515 Advent design | ||
| 7590 | 1516 MYSON Technology Inc | ||
| 7591 | 0800 MTD-8xx 100/10M Ethernet PCI Adapter | ||
| 7592 | 0803 SURECOM EP-320X-S 100/10M Ethernet PCI Adapter | ||
| 7593 | 1320 10bd SURECOM EP-320X-S 100/10M Ethernet PCI Adapter | ||
| 7594 | 0891 MTD-8xx 100/10M Ethernet PCI Adapter | ||
| 7595 | 1517 ECHOTEK Corp | ||
| 7596 | 1518 PEP MODULAR Computers GmbH | ||
| 7597 | 1519 TELEFON AKTIEBOLAGET LM Ericsson | ||
| 7598 | 151a Globetek | ||
| 7599 | 1002 PCI-1002 | ||
| 7600 | 1004 PCI-1004 | ||
| 7601 | 1008 PCI-1008 | ||
| 7602 | 151b COMBOX Ltd | ||
| 7603 | 151c DIGITAL AUDIO LABS Inc | ||
| 7604 | 0003 Prodif T 2496 | ||
| 7605 | 4000 Prodif 88 | ||
| 7606 | 151d Fujitsu Computer Products Of America | ||
| 7607 | 151e MATRIX Corp | ||
| 7608 | 151f TOPIC SEMICONDUCTOR Corp | ||
| 7609 | 0000 TP560 Data/Fax/Voice 56k modem | ||
| 7610 | 1520 CHAPLET System Inc | ||
| 7611 | 1521 BELL Corp | ||
| 7612 | 1522 MainPine Ltd | ||
| 7613 | 0100 PCI <-> IOBus Bridge | ||
| 7614 | 1522 0200 RockForceDUO 2 Port V.92/V.44 Data/Fax/Voice Modem | ||
| 7615 | 1522 0300 RockForceQUATRO 4 Port V.92/V.44 Data/Fax/Voice Modem | ||
| 7616 | 1522 0400 RockForceDUO+ 2 Port V.92/V.44 Data/Fax/Voice Modem | ||
| 7617 | 1522 0500 RockForceQUATRO+ 4 Port V.92/V.44 Data/Fax/Voice Modem | ||
| 7618 | 1522 0600 RockForce+ 2 Port V.90 Data/Fax/Voice Modem | ||
| 7619 | 1522 0700 RockForce+ 4 Port V.90 Data/Fax/Voice Modem | ||
| 7620 | 1522 0800 RockForceOCTO+ 8 Port V.92/V.44 Data/Fax/Voice Modem | ||
| 7621 | 1522 0c00 RockForceDUO+ 2 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem | ||
| 7622 | 1522 0d00 RockForceQUATRO+ 4 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem | ||
| 7623 | # this is a correction to a recent entry. 1522:0E00 should be 1522:1D00 | ||
| 7624 | 1522 1d00 RockForceOCTO+ 8 Port V.92/V.44 Data, V.34 Super-G3 Fax, Voice Modem | ||
| 7625 | 1523 MUSIC Semiconductors | ||
| 7626 | 1524 ENE Technology Inc | ||
| 7627 | 0510 CB710 Memory Card Reader Controller | ||
| 7628 | 0610 PCI Smart Card Reader Controller | ||
| 7629 | 1211 CB1211 Cardbus Controller | ||
| 7630 | 1225 CB1225 Cardbus Controller | ||
| 7631 | 1410 CB1410 Cardbus Controller | ||
| 7632 | 1025 005a TravelMate 290 | ||
| 7633 | 1411 CB-710/2/4 Cardbus Controller | ||
| 7634 | 1412 CB-712/4 Cardbus Controller | ||
| 7635 | 1420 CB1420 Cardbus Controller | ||
| 7636 | 1421 CB-720/2/4 Cardbus Controller | ||
| 7637 | 1422 CB-722/4 Cardbus Controller | ||
| 7638 | 1525 IMPACT Technologies | ||
| 7639 | 1526 ISS, Inc | ||
| 7640 | 1527 SOLECTRON | ||
| 7641 | 1528 ACKSYS | ||
| 7642 | 1529 AMERICAN MICROSystems Inc | ||
| 7643 | 152a QUICKTURN DESIGN Systems | ||
| 7644 | 152b FLYTECH Technology CO Ltd | ||
| 7645 | 152c MACRAIGOR Systems LLC | ||
| 7646 | 152d QUANTA Computer Inc | ||
| 7647 | 152e MELEC Inc | ||
| 7648 | 152f PHILIPS - CRYPTO | ||
| 7649 | 1530 ACQIS Technology Inc | ||
| 7650 | 1531 CHRYON Corp | ||
| 7651 | 1532 ECHELON Corp | ||
| 7652 | 1533 BALTIMORE | ||
| 7653 | 1534 ROAD Corp | ||
| 7654 | 1535 EVERGREEN Technologies Inc | ||
| 7655 | 1537 DATALEX COMMUNCATIONS | ||
| 7656 | 1538 ARALION Inc | ||
| 7657 | 0303 ARS106S Ultra ATA 133/100/66 Host Controller | ||
| 7658 | 1539 ATELIER INFORMATIQUES et ELECTRONIQUE ETUDES S.A. | ||
| 7659 | 153a ONO SOKKI | ||
| 7660 | 153b TERRATEC Electronic GmbH | ||
| 7661 | 1144 Aureon 5.1 | ||
| 7662 | # Terratec seems to use several IDs for the same card. | ||
| 7663 | 1147 Aureon 5.1 Sky | ||
| 7664 | 1158 Philips Semiconductors SAA7134 (rev 01) [Terratec Cinergy 600 TV] | ||
| 7665 | 153c ANTAL Electronic | ||
| 7666 | 153d FILANET Corp | ||
| 7667 | 153e TECHWELL Inc | ||
| 7668 | 153f MIPS DENMARK | ||
| 7669 | 1540 PROVIDEO MULTIMEDIA Co Ltd | ||
| 7670 | 1541 MACHONE Communications | ||
| 7671 | 1542 VIVID Technology Inc | ||
| 7672 | 1543 SILICON Laboratories | ||
| 7673 | 3052 Intel 537 [Winmodem] | ||
| 7674 | 4c22 Si3036 MC'97 DAA | ||
| 7675 | 1544 DCM DATA Systems | ||
| 7676 | 1545 VISIONTEK | ||
| 7677 | 1546 IOI Technology Corp | ||
| 7678 | 1547 MITUTOYO Corp | ||
| 7679 | 1548 JET PROPULSION Laboratory | ||
| 7680 | 1549 INTERCONNECT Systems Solutions | ||
| 7681 | 154a MAX Technologies Inc | ||
| 7682 | 154b COMPUTEX Co Ltd | ||
| 7683 | 154c VISUAL Technology Inc | ||
| 7684 | 154d PAN INTERNATIONAL Industrial Corp | ||
| 7685 | 154e SERVOTEST Ltd | ||
| 7686 | 154f STRATABEAM Technology | ||
| 7687 | 1550 OPEN NETWORK Co Ltd | ||
| 7688 | 1551 SMART Electronic DEVELOPMENT GmBH | ||
| 7689 | 1552 RACAL AIRTECH Ltd | ||
| 7690 | 1553 CHICONY Electronics Co Ltd | ||
| 7691 | 1554 PROLINK Microsystems Corp | ||
| 7692 | 1555 GESYTEC GmBH | ||
| 7693 | 1556 PLD APPLICATIONS | ||
| 7694 | 1557 MEDIASTAR Co Ltd | ||
| 7695 | 1558 CLEVO/KAPOK Computer | ||
| 7696 | 1559 SI LOGIC Ltd | ||
| 7697 | 155a INNOMEDIA Inc | ||
| 7698 | 155b PROTAC INTERNATIONAL Corp | ||
| 7699 | 155c Cemax-Icon Inc | ||
| 7700 | 155d Mac System Co Ltd | ||
| 7701 | 155e LP Elektronik GmbH | ||
| 7702 | 155f Perle Systems Ltd | ||
| 7703 | 1560 Terayon Communications Systems | ||
| 7704 | 1561 Viewgraphics Inc | ||
| 7705 | 1562 Symbol Technologies | ||
| 7706 | 1563 A-Trend Technology Co Ltd | ||
| 7707 | 1564 Yamakatsu Electronics Industry Co Ltd | ||
| 7708 | 1565 Biostar Microtech Int'l Corp | ||
| 7709 | 1566 Ardent Technologies Inc | ||
| 7710 | 1567 Jungsoft | ||
| 7711 | 1568 DDK Electronics Inc | ||
| 7712 | 1569 Palit Microsystems Inc. | ||
| 7713 | 156a Avtec Systems | ||
| 7714 | 156b 2wire Inc | ||
| 7715 | 156c Vidac Electronics GmbH | ||
| 7716 | 156d Alpha-Top Corp | ||
| 7717 | 156e Alfa Inc | ||
| 7718 | 156f M-Systems Flash Disk Pioneers Ltd | ||
| 7719 | 1570 Lecroy Corp | ||
| 7720 | 1571 Contemporary Controls | ||
| 7721 | a001 CCSI PCI20-485 ARCnet | ||
| 7722 | a002 CCSI PCI20-485D ARCnet | ||
| 7723 | a003 CCSI PCI20-485X ARCnet | ||
| 7724 | a004 CCSI PCI20-CXB ARCnet | ||
| 7725 | a005 CCSI PCI20-CXS ARCnet | ||
| 7726 | a006 CCSI PCI20-FOG-SMA ARCnet | ||
| 7727 | a007 CCSI PCI20-FOG-ST ARCnet | ||
| 7728 | a008 CCSI PCI20-TB5 ARCnet | ||
| 7729 | a009 CCSI PCI20-5-485 5Mbit ARCnet | ||
| 7730 | a00a CCSI PCI20-5-485D 5Mbit ARCnet | ||
| 7731 | a00b CCSI PCI20-5-485X 5Mbit ARCnet | ||
| 7732 | a00c CCSI PCI20-5-FOG-ST 5Mbit ARCnet | ||
| 7733 | a00d CCSI PCI20-5-FOG-SMA 5Mbit ARCnet | ||
| 7734 | a201 CCSI PCI22-485 10Mbit ARCnet | ||
| 7735 | a202 CCSI PCI22-485D 10Mbit ARCnet | ||
| 7736 | a203 CCSI PCI22-485X 10Mbit ARCnet | ||
| 7737 | a204 CCSI PCI22-CHB 10Mbit ARCnet | ||
| 7738 | a205 CCSI PCI22-FOG_ST 10Mbit ARCnet | ||
| 7739 | a206 CCSI PCI22-THB 10Mbit ARCnet | ||
| 7740 | 1572 Otis Elevator Company | ||
| 7741 | 1573 Lattice - Vantis | ||
| 7742 | 1574 Fairchild Semiconductor | ||
| 7743 | 1575 Voltaire Advanced Data Security Ltd | ||
| 7744 | 1576 Viewcast COM | ||
| 7745 | 1578 HITT | ||
| 7746 | 5615 VPMK3 [Video Processor Mk III] | ||
| 7747 | 1579 Dual Technology Corp | ||
| 7748 | 157a Japan Elecronics Ind Inc | ||
| 7749 | 157b Star Multimedia Corp | ||
| 7750 | 157c Eurosoft (UK) | ||
| 7751 | 8001 Fix2000 PCI Y2K Compliance Card | ||
| 7752 | 157d Gemflex Networks | ||
| 7753 | 157e Transition Networks | ||
| 7754 | 157f PX Instruments Technology Ltd | ||
| 7755 | 1580 Primex Aerospace Co | ||
| 7756 | 1581 SEH Computertechnik GmbH | ||
| 7757 | 1582 Cytec Corp | ||
| 7758 | 1583 Inet Technologies Inc | ||
| 7759 | 1584 Uniwill Computer Corp | ||
| 7760 | 1585 Logitron | ||
| 7761 | 1586 Lancast Inc | ||
| 7762 | 1587 Konica Corp | ||
| 7763 | 1588 Solidum Systems Corp | ||
| 7764 | 1589 Atlantek Microsystems Pty Ltd | ||
| 7765 | 158a Digalog Systems Inc | ||
| 7766 | 158b Allied Data Technologies | ||
| 7767 | 158c Hitachi Semiconductor & Devices Sales Co Ltd | ||
| 7768 | 158d Point Multimedia Systems | ||
| 7769 | 158e Lara Technology Inc | ||
| 7770 | 158f Ditect Coop | ||
| 7771 | 1590 3pardata Inc | ||
| 7772 | 1591 ARN | ||
| 7773 | 1592 Syba Tech Ltd | ||
| 7774 | 0781 Multi-IO Card | ||
| 7775 | 0782 Parallel Port Card 2xEPP | ||
| 7776 | 0783 Multi-IO Card | ||
| 7777 | 0785 Multi-IO Card | ||
| 7778 | 0786 Multi-IO Card | ||
| 7779 | 0787 Multi-IO Card | ||
| 7780 | 0788 Multi-IO Card | ||
| 7781 | 078a Multi-IO Card | ||
| 7782 | 1593 Bops Inc | ||
| 7783 | 1594 Netgame Ltd | ||
| 7784 | 1595 Diva Systems Corp | ||
| 7785 | 1596 Folsom Research Inc | ||
| 7786 | 1597 Memec Design Services | ||
| 7787 | 1598 Granite Microsystems | ||
| 7788 | 1599 Delta Electronics Inc | ||
| 7789 | 159a General Instrument | ||
| 7790 | 159b Faraday Technology Corp | ||
| 7791 | 159c Stratus Computer Systems | ||
| 7792 | 159d Ningbo Harrison Electronics Co Ltd | ||
| 7793 | 159e A-Max Technology Co Ltd | ||
| 7794 | 159f Galea Network Security | ||
| 7795 | 15a0 Compumaster SRL | ||
| 7796 | 15a1 Geocast Network Systems | ||
| 7797 | 15a2 Catalyst Enterprises Inc | ||
| 7798 | 0001 TA700 PCI Bus Analyzer/Exerciser | ||
| 7799 | 15a3 Italtel | ||
| 7800 | 15a4 X-Net OY | ||
| 7801 | 15a5 Toyota Macs Inc | ||
| 7802 | 15a6 Sunlight Ultrasound Technologies Ltd | ||
| 7803 | 15a7 SSE Telecom Inc | ||
| 7804 | 15a8 Shanghai Communications Technologies Center | ||
| 7805 | 15aa Moreton Bay | ||
| 7806 | 15ab Bluesteel Networks Inc | ||
| 7807 | 15ac North Atlantic Instruments | ||
| 7808 | 15ad VMware Inc | ||
| 7809 | 0405 [VMware SVGA II] PCI Display Adapter | ||
| 7810 | 0710 Virtual SVGA | ||
| 7811 | 0720 VMware High-Speed Virtual NIC [vmxnet] | ||
| 7812 | 15ae Amersham Pharmacia Biotech | ||
| 7813 | 15b0 Zoltrix International Ltd | ||
| 7814 | 15b1 Source Technology Inc | ||
| 7815 | 15b2 Mosaid Technologies Inc | ||
| 7816 | 15b3 Mellanox Technologies | ||
| 7817 | 5274 MT21108 InfiniBridge | ||
| 7818 | 5a44 MT23108 InfiniHost | ||
| 7819 | 5a45 MT23108 [Infinihost HCA Flash Recovery] | ||
| 7820 | 5a46 MT23108 PCI Bridge | ||
| 7821 | 5e8c MT24204 [InfiniHost III Lx HCA] | ||
| 7822 | 5e8d MT24204 [InfiniHost III Lx HCA Flash Recovery] | ||
| 7823 | 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) | ||
| 7824 | 6279 MT25208 [InfiniHost III Ex HCA Flash Recovery] | ||
| 7825 | 6282 MT25208 InfiniHost III Ex | ||
| 7826 | 15b4 CCI/TRIAD | ||
| 7827 | 15b5 Cimetrics Inc | ||
| 7828 | 15b6 Texas Memory Systems Inc | ||
| 7829 | 15b7 Sandisk Corp | ||
| 7830 | 15b8 ADDI-DATA GmbH | ||
| 7831 | 15b9 Maestro Digital Communications | ||
| 7832 | 15ba Impacct Technology Corp | ||
| 7833 | 15bb Portwell Inc | ||
| 7834 | 15bc Agilent Technologies | ||
| 7835 | 2922 64 Bit, 133MHz PCI-X Exerciser & Protocol Checker | ||
| 7836 | 2928 64 Bit, 66MHz PCI Exerciser & Analyzer | ||
| 7837 | 2929 64 Bit, 133MHz PCI-X Analyzer & Exerciser | ||
| 7838 | 15bd DFI Inc | ||
| 7839 | 15be Sola Electronics | ||
| 7840 | 15bf High Tech Computer Corp (HTC) | ||
| 7841 | 15c0 BVM Ltd | ||
| 7842 | 15c1 Quantel | ||
| 7843 | 15c2 Newer Technology Inc | ||
| 7844 | 15c3 Taiwan Mycomp Co Ltd | ||
| 7845 | 15c4 EVSX Inc | ||
| 7846 | 15c5 Procomp Informatics Ltd | ||
| 7847 | 8010 1394b - 1394 Firewire 3-Port Host Adapter Card | ||
| 7848 | 15c6 Technical University of Budapest | ||
| 7849 | 15c7 Tateyama System Laboratory Co Ltd | ||
| 7850 | 0349 Tateyama C-PCI PLC/NC card Rev.01A | ||
| 7851 | 15c8 Penta Media Co Ltd | ||
| 7852 | 15c9 Serome Technology Inc | ||
| 7853 | 15ca Bitboys OY | ||
| 7854 | 15cb AG Electronics Ltd | ||
| 7855 | 15cc Hotrail Inc | ||
| 7856 | 15cd Dreamtech Co Ltd | ||
| 7857 | 15ce Genrad Inc | ||
| 7858 | 15cf Hilscher GmbH | ||
| 7859 | 15d1 Infineon Technologies AG | ||
| 7860 | 15d2 FIC (First International Computer Inc) | ||
| 7861 | 15d3 NDS Technologies Israel Ltd | ||
| 7862 | 15d4 Iwill Corp | ||
| 7863 | 15d5 Tatung Co | ||
| 7864 | 15d6 Entridia Corp | ||
| 7865 | 15d7 Rockwell-Collins Inc | ||
| 7866 | 15d8 Cybernetics Technology Co Ltd | ||
| 7867 | 15d9 Super Micro Computer Inc | ||
| 7868 | 15da Cyberfirm Inc | ||
| 7869 | 15db Applied Computing Systems Inc | ||
| 7870 | 15dc Litronic Inc | ||
| 7871 | 0001 Argus 300 PCI Cryptography Module | ||
| 7872 | 15dd Sigmatel Inc | ||
| 7873 | 15de Malleable Technologies Inc | ||
| 7874 | 15df Infinilink Corp | ||
| 7875 | 15e0 Cacheflow Inc | ||
| 7876 | 15e1 Voice Technologies Group Inc | ||
| 7877 | 15e2 Quicknet Technologies Inc | ||
| 7878 | 15e3 Networth Technologies Inc | ||
| 7879 | 15e4 VSN Systemen BV | ||
| 7880 | 15e5 Valley technologies Inc | ||
| 7881 | 15e6 Agere Inc | ||
| 7882 | 15e7 Get Engineering Corp | ||
| 7883 | 15e8 National Datacomm Corp | ||
| 7884 | 0130 Wireless PCI Card | ||
| 7885 | 15e9 Pacific Digital Corp | ||
| 7886 | 1841 ADMA-100 DiscStaQ ATA Controller | ||
| 7887 | 15ea Tokyo Denshi Sekei K.K. | ||
| 7888 | 15eb Drsearch GmbH | ||
| 7889 | 15ec Beckhoff GmbH | ||
| 7890 | 3101 FC3101 Profibus DP 1 Channel PCI | ||
| 7891 | 5102 FC5102 | ||
| 7892 | 15ed Macrolink Inc | ||
| 7893 | 15ee In Win Development Inc | ||
| 7894 | 15ef Intelligent Paradigm Inc | ||
| 7895 | 15f0 B-Tree Systems Inc | ||
| 7896 | 15f1 Times N Systems Inc | ||
| 7897 | 15f2 Diagnostic Instruments Inc | ||
| 7898 | 15f3 Digitmedia Corp | ||
| 7899 | 15f4 Valuesoft | ||
| 7900 | 15f5 Power Micro Research | ||
| 7901 | 15f6 Extreme Packet Device Inc | ||
| 7902 | 15f7 Banctec | ||
| 7903 | 15f8 Koga Electronics Co | ||
| 7904 | 15f9 Zenith Electronics Corp | ||
| 7905 | 15fa J.P. Axzam Corp | ||
| 7906 | 15fb Zilog Inc | ||
| 7907 | 15fc Techsan Electronics Co Ltd | ||
| 7908 | 15fd N-CUBED.NET | ||
| 7909 | 15fe Kinpo Electronics Inc | ||
| 7910 | 15ff Fastpoint Technologies Inc | ||
| 7911 | 1600 Northrop Grumman - Canada Ltd | ||
| 7912 | 1601 Tenta Technology | ||
| 7913 | 1602 Prosys-tec Inc | ||
| 7914 | 1603 Nokia Wireless Communications | ||
| 7915 | 1604 Central System Research Co Ltd | ||
| 7916 | 1605 Pairgain Technologies | ||
| 7917 | 1606 Europop AG | ||
| 7918 | 1607 Lava Semiconductor Manufacturing Inc | ||
| 7919 | 1608 Automated Wagering International | ||
| 7920 | 1609 Scimetric Instruments Inc | ||
| 7921 | 1612 Telesynergy Research Inc. | ||
| 7922 | 1619 FarSite Communications Ltd | ||
| 7923 | 0400 FarSync T2P (2 port X.21/V.35/V.24) | ||
| 7924 | 0440 FarSync T4P (4 port X.21/V.35/V.24) | ||
| 7925 | # www.rioworks.com | ||
| 7926 | 161f Rioworks | ||
| 7927 | 1626 TDK Semiconductor Corp. | ||
| 7928 | 8410 RTL81xx Fast Ethernet | ||
| 7929 | 1629 Kongsberg Spacetec AS | ||
| 7930 | 1003 Format synchronizer v3.0 | ||
| 7931 | 2002 Fast Universal Data Output | ||
| 7932 | # This seems to occur on their 802.11b Wireless card WMP-11 | ||
| 7933 | 1637 Linksys | ||
| 7934 | 3874 Linksys 802.11b WMP11 PCI Wireless card | ||
| 7935 | 1638 Standard Microsystems Corp [SMC] | ||
| 7936 | 1100 SMC2602W EZConnect / Addtron AWA-100 / Eumitcom PCI WL11000 | ||
| 7937 | 163c Smart Link Ltd. | ||
| 7938 | 3052 SmartLink SmartPCI562 56K Modem | ||
| 7939 | 5449 SmartPCI561 Modem | ||
| 7940 | 1657 Brocade Communications Systems, Inc. | ||
| 7941 | 165a Epix Inc | ||
| 7942 | c100 PIXCI(R) CL1 Camera Link Video Capture Board [custom QL5232] | ||
| 7943 | d200 PIXCI(R) D2X Digital Video Capture Board [custom QL5232] | ||
| 7944 | d300 PIXCI(R) D3X Digital Video Capture Board [custom QL5232] | ||
| 7945 | 165d Hsing Tech. Enterprise Co., Ltd. | ||
| 7946 | 1661 Worldspace Corp. | ||
| 7947 | 1668 Actiontec Electronics Inc | ||
| 7948 | 0100 Mini-PCI bridge | ||
| 7949 | # Formerly SiByte, Inc. | ||
| 7950 | 166d Broadcom Corporation | ||
| 7951 | 0001 SiByte BCM1125/1125H/1250 System-on-a-Chip PCI | ||
| 7952 | 0002 SiByte BCM1125H/1250 System-on-a-Chip HyperTransport | ||
| 7953 | 1677 Bernecker + Rainer | ||
| 7954 | 104e 5LS172.6 B&R Dual CAN Interface Card | ||
| 7955 | 12d7 5LS172.61 B&R Dual CAN Interface Card | ||
| 7956 | 167b ZyDAS Technology Corp. | ||
| 7957 | 2102 ZyDAS ZD1202 | ||
| 7958 | 187e 3406 ZyAIR B-122 CardBus 11Mbs Wireless LAN Card | ||
| 7959 | 1681 Hercules | ||
| 7960 | # More specs, more accurate desc. | ||
| 7961 | 0010 Hercules 3d Prophet II Ultra 64MB [ 350 MHz NV15BR core, 128-bit DDR @ 460 MHz, 1.5v AGP4x ] | ||
| 7962 | 1682 XFX Pine Group Inc. | ||
| 7963 | 1688 CastleNet Technology Inc. | ||
| 7964 | 1170 WLAN 802.11b card | ||
| 7965 | 168c Atheros Communications, Inc. | ||
| 7966 | 0007 AR5000 802.11a Wireless Adapter | ||
| 7967 | 0011 AR5210 802.11a NIC | ||
| 7968 | 0012 AR5211 802.11ab NIC | ||
| 7969 | 0013 AR5212 802.11abg NIC | ||
| 7970 | 1113 d301 Philips CPWNA100 Wireless CardBus adapter | ||
| 7971 | 1186 3202 D-link DWL-G650 B3 Wireless cardbus adapter | ||
| 7972 | 1186 3203 DWL-G520 Wireless PCI Adapter | ||
| 7973 | 1186 3a13 DWL-G520 Wireless PCI Adapter rev. B | ||
| 7974 | 1186 3a94 C54C Wireless 801.11g cardbus | ||
| 7975 | 1385 4d00 Netgear WG311T Wireless PCI Adapter | ||
| 7976 | 14b7 0a60 8482-WD ORiNOCO 11a/b/g Wireless PCI Adapter | ||
| 7977 | 168c 0013 WG511T Wireless CardBus Adapter | ||
| 7978 | 168c 1025 DWL-G650B2 Wireless CardBus Adapter | ||
| 7979 | 168c 1027 Netgate NL-3054CB ARIES b/g CardBus Adapter | ||
| 7980 | 168c 2026 Netgate 5354MP ARIES a(108Mb turbo)/b/g MiniPCI Adapter | ||
| 7981 | 168c 2041 Netgate 5354MP Plus ARIES2 b/g MiniPCI Adapter | ||
| 7982 | 168c 2042 Netgate 5354MP Plus ARIES2 a/b/g MiniPCI Adapter | ||
| 7983 | 1014 AR5212 802.11abg NIC | ||
| 7984 | 169c Netcell Corporation | ||
| 7985 | 0044 SyncRAID SR3000/5000 Series SATA RAID Controllers | ||
| 7986 | 16a5 Tekram Technology Co.,Ltd. | ||
| 7987 | 16ab Global Sun Technology Inc | ||
| 7988 | 1100 GL24110P | ||
| 7989 | 1101 PLX9052 PCMCIA-to-PCI Wireless LAN | ||
| 7990 | 1102 PCMCIA-to-PCI Wireless Network Bridge | ||
| 7991 | 8501 WL-8305 Wireless LAN PCI Adapter | ||
| 7992 | 16ae Safenet Inc | ||
| 7993 | 1141 SafeXcel-1141 | ||
| 7994 | 16b4 Aspex Semiconductor Ltd | ||
| 7995 | 16be Creatix Polymedia GmbH | ||
| 7996 | 16ca CENATEK Inc | ||
| 7997 | 0001 Rocket Drive DL | ||
| 7998 | 16cd Densitron Technologies | ||
| 7999 | 16ce Roland Corp. | ||
| 8000 | # www.pikatechnologies.com | ||
| 8001 | 16df PIKA Technologies Inc. | ||
| 8002 | 16e3 European Space Agency | ||
| 8003 | 1e0f LEON2FT Processor | ||
| 8004 | 16ec U.S. Robotics | ||
| 8005 | 00ff USR997900 10/100 Mbps PCI Network Card | ||
| 8006 | 0116 USR997902 10/100/1000 Mbps PCI Network Card | ||
| 8007 | 3685 Wireless Access PCI Adapter Model 022415 | ||
| 8008 | 16ed Sycron N. V. | ||
| 8009 | 1001 UMIO communication card | ||
| 8010 | 16f3 Jetway Information Co., Ltd. | ||
| 8011 | 16f4 Vweb Corp | ||
| 8012 | 8000 VW2010 | ||
| 8013 | 16f6 VideoTele.com, Inc. | ||
| 8014 | # www.internetmachines.com | ||
| 8015 | 1702 Internet Machines Corporation (IMC) | ||
| 8016 | 1705 Digital First, Inc. | ||
| 8017 | 170b NetOctave | ||
| 8018 | 0100 NSP2000-SSL crypto accelerator | ||
| 8019 | 170c YottaYotta Inc. | ||
| 8020 | # Seems to be a 2nd ID for Vitesse Semiconductor | ||
| 8021 | 1725 Vitesse Semiconductor | ||
| 8022 | 7174 VSC7174 PCI/PCI-X Serial ATA Host Bus Controller | ||
| 8023 | 172a Accelerated Encryption | ||
| 8024 | 1734 Fujitsu Siemens Computer GmbH | ||
| 8025 | 1737 Linksys | ||
| 8026 | 0013 WMP54G Wireless Pci Card | ||
| 8027 | 0015 WMP54GS Wireless Pci Card | ||
| 8028 | 1032 Gigabit Network Adapter | ||
| 8029 | 1737 0015 EG1032 v2 Instant Gigabit Network Adapter | ||
| 8030 | 1064 Gigabit Network Adapter | ||
| 8031 | 1737 0016 EG1064 v2 Instant Gigabit Network Adapter | ||
| 8032 | ab08 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 8033 | ab09 21x4x DEC-Tulip compatible 10/100 Ethernet | ||
| 8034 | 173b Altima (nee Broadcom) | ||
| 8035 | 03e8 AC1000 Gigabit Ethernet | ||
| 8036 | 03e9 AC1001 Gigabit Ethernet | ||
| 8037 | 03ea AC9100 Gigabit Ethernet | ||
| 8038 | 173b 0001 AC1002 | ||
| 8039 | 03eb AC1003 Gigabit Ethernet | ||
| 8040 | 1743 Peppercon AG | ||
| 8041 | 8139 ROL/F-100 Fast Ethernet Adapter with ROL | ||
| 8042 | 1749 RLX Technologies | ||
| 8043 | 174b PC Partner Limited | ||
| 8044 | 174d WellX Telecom SA | ||
| 8045 | 175c AudioScience Inc | ||
| 8046 | 175e Sanera Systems, Inc. | ||
| 8047 | 1787 Hightech Information System Ltd. | ||
| 8048 | # also used by Struck Innovative Systeme for joint developments | ||
| 8049 | 1796 Research Centre Juelich | ||
| 8050 | 0001 SIS1100 [Gigabit link] | ||
| 8051 | 0002 HOTlink | ||
| 8052 | 0003 Counter Timer | ||
| 8053 | 0004 CAMAC Controller | ||
| 8054 | 0005 PROFIBUS | ||
| 8055 | 0006 AMCC HOTlink | ||
| 8056 | 1797 JumpTec h, GMBH | ||
| 8057 | 1799 Belkin | ||
| 8058 | 6001 Wireless PCI Card - F5D6001 | ||
| 8059 | 6020 Wireless PCMCIA Card - F5D6020 | ||
| 8060 | 6060 Wireless PDA Card - F5D6060 | ||
| 8061 | 7000 Wireless PCI Card - F5D7000 | ||
| 8062 | 17a0 Genesys Logic, Inc | ||
| 8063 | 8033 GL880S USB 1.1 controller | ||
| 8064 | 8034 GL880S USB 2.0 controller | ||
| 8065 | 17af Hightech Information System Ltd. | ||
| 8066 | 17b3 Hawking Technologies | ||
| 8067 | ab08 PN672TX 10/100 Ethernet | ||
| 8068 | 17b4 Indra Networks, Inc. | ||
| 8069 | 0011 WebEnhance 100 GZIP Compression Card | ||
| 8070 | 17c0 Wistron Corp. | ||
| 8071 | 17c2 Newisys, Inc. | ||
| 8072 | 17cc NetChip Technology, Inc | ||
| 8073 | 2280 USB 2.0 | ||
| 8074 | 17d3 Areca Technology Corp. | ||
| 8075 | 1110 ARC-1110 4-Port PCI-X to SATA RAID Controller | ||
| 8076 | 1120 ARC-1120 8-Port PCI-X to SATA RAID Controller | ||
| 8077 | 1130 ARC-1130 12-Port PCI-X to SATA RAID Controller | ||
| 8078 | 1160 ARC-1160 16-Port PCI-X to SATA RAID Controller | ||
| 8079 | 1210 ARC-1210 4-Port PCI-Express to SATA RAID Controller | ||
| 8080 | 1220 ARC-1220 8-Port PCI-Express to SATA RAID Controller | ||
| 8081 | 1230 ARC-1230 12-Port PCI-Express to SATA RAID Controller | ||
| 8082 | 1260 ARC-1260 16-Port PCI-Express to SATA RAID Controller | ||
| 8083 | # S2io ships 10Gb PCI-X Ethernet adapters www.s2io.com | ||
| 8084 | 17d5 S2io Inc. | ||
| 8085 | 5831 Xframe 10 Gigabit Ethernet PCI-X | ||
| 8086 | 103c 12d5 HP PCI-X 133MHz 10GbE SR Fiber [AB287A] | ||
| 8087 | 17de KWorld Computer Co. Ltd. | ||
| 8088 | # http://www.connect3d.com | ||
| 8089 | 17ee Connect Components Ltd | ||
| 8090 | 17fe Linksys, A Division of Cisco Systems | ||
| 8091 | 2120 WMP11v4 802.11b PCI card | ||
| 8092 | 2220 [AirConn] INPROCOMM IPN 2220 Wireless LAN Adapter (rev 01) | ||
| 8093 | 1813 Ambient Technologies Inc | ||
| 8094 | 4000 HaM controllerless modem | ||
| 8095 | 16be 0001 V9x HAM Data Fax Modem | ||
| 8096 | 4100 HaM plus Data Fax Modem | ||
| 8097 | 16be 0002 V9x HAM 1394 | ||
| 8098 | 1814 RaLink | ||
| 8099 | 0101 Wireless PCI Adpator RT2400 / RT2460 | ||
| 8100 | 3306 1113 Quidway WL100M | ||
| 8101 | 0201 Ralink RT2500 802.11 Cardbus Reference Card | ||
| 8102 | 1371 001e CWC-854 Wireless-G CardBus Adapter | ||
| 8103 | 1371 001f CWM-854 Wireless-G Mini PCI Adapter | ||
| 8104 | 1371 0020 CWP-854 Wireless-G PCI Adapter | ||
| 8105 | 1458 e381 GN-WMKG 802.11b/g Wireless CardBus Adapter | ||
| 8106 | 1820 InfiniCon Systems Inc. | ||
| 8107 | 1822 Twinhan Technology Co. Ltd | ||
| 8108 | 182d SiteCom Europe BV | ||
| 8109 | # HFC-based ISDN card | ||
| 8110 | 3069 ISDN PCI DC-105V2 | ||
| 8111 | 9790 WL-121 Wireless Network Adapter 100g+ [Ver.3] | ||
| 8112 | 1830 Credence Systems Corporation | ||
| 8113 | 183b MikroM GmbH | ||
| 8114 | 08a7 MVC100 DVI | ||
| 8115 | 08a8 MVC101 SDI | ||
| 8116 | 08a9 MVC102 DVI+Audio | ||
| 8117 | 1849 ASRock Incorporation | ||
| 8118 | 1851 Microtune, Inc. | ||
| 8119 | 1852 Anritsu Corp. | ||
| 8120 | 185f Wistron NeWeb Corp. | ||
| 8121 | 1867 Topspin Communications | ||
| 8122 | 5a44 MT23108 PCI-X HCA | ||
| 8123 | 5a45 MT23108 PCI-X HCA flash recovery | ||
| 8124 | 5a46 MT23108 PCI-X HCA bridge | ||
| 8125 | 6278 MT25208 InfiniHost III Ex (Tavor compatibility mode) | ||
| 8126 | 6282 MT25208 InfiniHost III Ex | ||
| 8127 | 187e ZyXEL Communication Corporation | ||
| 8128 | 1888 Varisys Ltd | ||
| 8129 | 0301 VMFX1 FPGA PMC module | ||
| 8130 | 0601 VSM2 dual PMC carrier | ||
| 8131 | 0710 VS14x series PowerPC PCI board | ||
| 8132 | 0720 VS24x series PowerPC PCI board | ||
| 8133 | # found e.g. on KNC DVB-S card | ||
| 8134 | 1894 KNC One | ||
| 8135 | 1896 B&B Electronics Manufacturing Company, Inc. | ||
| 8136 | 18a1 Astute Networks Inc. | ||
| 8137 | 18ac DViCO Corporation | ||
| 8138 | d810 FusionHDTV 3 Gold | ||
| 8139 | 18b8 Ammasso | ||
| 8140 | b001 AMSO 1100 iWARP/RDMA Gigabit Ethernet Coprocessor | ||
| 8141 | 18bc Info-Tek Corp. | ||
| 8142 | # assigned to Octigabay System, which has been acquired by Cray | ||
| 8143 | 18c8 Cray Inc | ||
| 8144 | 18c9 ARVOO Engineering BV | ||
| 8145 | 18ca XGI - Xabre Graphics Inc | ||
| 8146 | 0040 Volari V8 | ||
| 8147 | 18e6 MPL AG | ||
| 8148 | 0001 OSCI [Octal Serial Communication Interface] | ||
| 8149 | 18f7 Commtech, Inc. | ||
| 8150 | 0001 Fastcom ESCC-PCI-335 | ||
| 8151 | 0002 Fastcom 422/4-PCI-335 | ||
| 8152 | 0004 Fastcom 422/2-PCI-335 | ||
| 8153 | 0005 Fastcom IGESCC-PCI-ISO/1 | ||
| 8154 | 000a Fastcom 232/4-PCI-335 | ||
| 8155 | 18fb Resilience Corporation | ||
| 8156 | 1924 Level 5 Networks Inc. | ||
| 8157 | 1966 Orad Hi-Tec Systems | ||
| 8158 | 1975 DVG64 family | ||
| 8159 | 1993 Innominate Security Technologies AG | ||
| 8160 | # http://www.progeny.net | ||
| 8161 | 19ae Progeny Systems Corporation | ||
| 8162 | 1a08 Sierra semiconductor | ||
| 8163 | 0000 SC15064 | ||
| 8164 | 1b13 Jaton Corp | ||
| 8165 | 1c1c Symphony | ||
| 8166 | 0001 82C101 | ||
| 8167 | 1d44 DPT | ||
| 8168 | a400 PM2x24/PM3224 | ||
| 8169 | 1de1 Tekram Technology Co.,Ltd. | ||
| 8170 | 0391 TRM-S1040 | ||
| 8171 | 2020 DC-390 | ||
| 8172 | 690c 690c | ||
| 8173 | dc29 DC290 | ||
| 8174 | 1fc0 Tumsan Oy | ||
| 8175 | 0300 E2200 Dual E1/Rawpipe Card | ||
| 8176 | 2000 Smart Link Ltd. | ||
| 8177 | 2001 Temporal Research Ltd | ||
| 8178 | 2003 Smart Link Ltd. | ||
| 8179 | 2004 Smart Link Ltd. | ||
| 8180 | 21c3 21st Century Computer Corp. | ||
| 8181 | 2348 Racore | ||
| 8182 | 2010 8142 100VG/AnyLAN | ||
| 8183 | 2646 Kingston Technologies | ||
| 8184 | 270b Xantel Corporation | ||
| 8185 | 270f Chaintech Computer Co. Ltd | ||
| 8186 | 2711 AVID Technology Inc. | ||
| 8187 | 2a15 3D Vision(???) | ||
| 8188 | 3000 Hansol Electronics Inc. | ||
| 8189 | 3142 Post Impression Systems. | ||
| 8190 | 3388 Hint Corp | ||
| 8191 | 0013 HiNT HC4 PCI to ISDN bridge, Multimedia audio controller | ||
| 8192 | 0014 HiNT HC4 PCI to ISDN bridge, Network controller | ||
| 8193 | 0020 HB6 Universal PCI-PCI bridge (transparent mode) | ||
| 8194 | 0021 HB6 Universal PCI-PCI bridge (non-transparent mode) | ||
| 8195 | 4c53 1050 CT7 mainboard | ||
| 8196 | 4c53 1080 CT8 mainboard | ||
| 8197 | 4c53 10a0 CA3/CR3 mainboard | ||
| 8198 | 4c53 3010 PPCI mezzanine (32-bit PMC) | ||
| 8199 | 4c53 3011 PPCI mezzanine (64-bit PMC) | ||
| 8200 | 0022 HiNT HB4 PCI-PCI Bridge (PCI6150) | ||
| 8201 | 0026 HB2 PCI-PCI Bridge | ||
| 8202 | 101a E.Band [AudioTrak Inca88] | ||
| 8203 | 101b E.Band [AudioTrak Inca88] | ||
| 8204 | 8011 VXPro II Chipset | ||
| 8205 | 3388 8011 VXPro II Chipset CPU to PCI Bridge | ||
| 8206 | 8012 VXPro II Chipset | ||
| 8207 | 3388 8012 VXPro II Chipset PCI to ISA Bridge | ||
| 8208 | 8013 VXPro II IDE | ||
| 8209 | 3388 8013 VXPro II Chipset EIDE Controller | ||
| 8210 | 3411 Quantum Designs (H.K.) Inc | ||
| 8211 | 3513 ARCOM Control Systems Ltd | ||
| 8212 | 3842 eVga.com. Corp. | ||
| 8213 | 38ef 4Links | ||
| 8214 | 3d3d 3DLabs | ||
| 8215 | 0001 GLINT 300SX | ||
| 8216 | 0002 GLINT 500TX | ||
| 8217 | 0003 GLINT Delta | ||
| 8218 | 0004 Permedia | ||
| 8219 | 0005 Permedia | ||
| 8220 | 0006 GLINT MX | ||
| 8221 | 0007 3D Extreme | ||
| 8222 | 0008 GLINT Gamma G1 | ||
| 8223 | 0009 Permedia II 2D+3D | ||
| 8224 | 1040 0011 AccelStar II | ||
| 8225 | 13e9 1000 6221L-4U | ||
| 8226 | 3d3d 0100 AccelStar II 3D Accelerator | ||
| 8227 | 3d3d 0111 Permedia 3:16 | ||
| 8228 | 3d3d 0114 Santa Ana | ||
| 8229 | 3d3d 0116 Oxygen GVX1 | ||
| 8230 | 3d3d 0119 Scirocco | ||
| 8231 | 3d3d 0120 Santa Ana PCL | ||
| 8232 | 3d3d 0125 Oxygen VX1 | ||
| 8233 | 3d3d 0127 Permedia3 Create! | ||
| 8234 | 000a GLINT R3 | ||
| 8235 | 3d3d 0121 Oxygen VX1 | ||
| 8236 | 000c GLINT R3 [Oxygen VX1] | ||
| 8237 | 3d3d 0144 Oxygen VX1-4X AGP [Permedia 4] | ||
| 8238 | 000d GLint R4 rev A | ||
| 8239 | 0011 GLint R4 rev B | ||
| 8240 | 0012 GLint R5 rev A | ||
| 8241 | 0013 GLint R5 rev B | ||
| 8242 | 0020 VP10 visual processor | ||
| 8243 | # P10 generic II | ||
| 8244 | 0022 VP10 visual processor | ||
| 8245 | 0024 VP9 visual processor | ||
| 8246 | 0100 Permedia II 2D+3D | ||
| 8247 | 07a1 Wildcat III 6210 | ||
| 8248 | 07a2 Sun XVR-500 Graphics Accelerator | ||
| 8249 | 07a3 Wildcat IV 7210 | ||
| 8250 | 1004 Permedia | ||
| 8251 | 3d04 Permedia | ||
| 8252 | ffff Glint VGA | ||
| 8253 | 4005 Avance Logic Inc. | ||
| 8254 | 0300 ALS300 PCI Audio Device | ||
| 8255 | 0308 ALS300+ PCI Audio Device | ||
| 8256 | 0309 PCI Input Controller | ||
| 8257 | 1064 ALG-2064 | ||
| 8258 | 2064 ALG-2064i | ||
| 8259 | 2128 ALG-2364A GUI Accelerator | ||
| 8260 | 2301 ALG-2301 | ||
| 8261 | 2302 ALG-2302 | ||
| 8262 | 2303 AVG-2302 GUI Accelerator | ||
| 8263 | 2364 ALG-2364A | ||
| 8264 | 2464 ALG-2464 | ||
| 8265 | 2501 ALG-2564A/25128A | ||
| 8266 | 4000 ALS4000 Audio Chipset | ||
| 8267 | 4005 4000 ALS4000 Audio Chipset | ||
| 8268 | 4710 ALC200/200P | ||
| 8269 | 4033 Addtron Technology Co, Inc. | ||
| 8270 | 1360 RTL8139 Ethernet | ||
| 8271 | 4143 Digital Equipment Corp | ||
| 8272 | 4144 Alpha Data | ||
| 8273 | 0044 ADM-XRCIIPro | ||
| 8274 | 416c Aladdin Knowledge Systems | ||
| 8275 | 0100 AladdinCARD | ||
| 8276 | 0200 CPC | ||
| 8277 | 4444 Internext Compression Inc | ||
| 8278 | 0016 iTVC16 (CX23416) MPEG-2 Encoder | ||
| 8279 | 0070 4009 WinTV PVR 250 | ||
| 8280 | 0070 8003 WinTV PVR 150 | ||
| 8281 | 0803 iTVC15 MPEG-2 Encoder | ||
| 8282 | 0070 4000 WinTV PVR-350 | ||
| 8283 | 0070 4001 WinTV PVR-250 | ||
| 8284 | # video capture card | ||
| 8285 | 1461 a3cf M179 | ||
| 8286 | 4468 Bridgeport machines | ||
| 8287 | 4594 Cogetec Informatique Inc | ||
| 8288 | 45fb Baldor Electric Company | ||
| 8289 | 4680 Umax Computer Corp | ||
| 8290 | 4843 Hercules Computer Technology Inc | ||
| 8291 | 4916 RedCreek Communications Inc | ||
| 8292 | 1960 RedCreek PCI adapter | ||
| 8293 | 4943 Growth Networks | ||
| 8294 | 494f ACCES I/O Products, Inc. | ||
| 8295 | 10e8 LPCI-COM-8SM | ||
| 8296 | 4978 Axil Computer Inc | ||
| 8297 | 4a14 NetVin | ||
| 8298 | 5000 NV5000SC | ||
| 8299 | 4a14 5000 RT8029-Based Ethernet Adapter | ||
| 8300 | 4b10 Buslogic Inc. | ||
| 8301 | 4c48 LUNG HWA Electronics | ||
| 8302 | 4c53 SBS Technologies | ||
| 8303 | 0000 PLUSTEST device | ||
| 8304 | 4c53 3000 PLUSTEST card (PC104+) | ||
| 8305 | 4c53 3001 PLUSTEST card (PMC) | ||
| 8306 | 0001 PLUSTEST-MM device | ||
| 8307 | 4c53 3002 PLUSTEST-MM card (PMC) | ||
| 8308 | 4ca1 Seanix Technology Inc | ||
| 8309 | 4d51 MediaQ Inc. | ||
| 8310 | 0200 MQ-200 | ||
| 8311 | 4d54 Microtechnica Co Ltd | ||
| 8312 | 4ddc ILC Data Device Corp | ||
| 8313 | 0100 DD-42924I5-300 (ARINC 429 Data Bus) | ||
| 8314 | 0801 BU-65570I1 MIL-STD-1553 Test and Simulation | ||
| 8315 | 0802 BU-65570I2 MIL-STD-1553 Test and Simulation | ||
| 8316 | 0811 BU-65572I1 MIL-STD-1553 Test and Simulation | ||
| 8317 | 0812 BU-65572I2 MIL-STD-1553 Test and Simulation | ||
| 8318 | 0881 BU-65570T1 MIL-STD-1553 Test and Simulation | ||
| 8319 | 0882 BU-65570T2 MIL-STD-1553 Test and Simulation | ||
| 8320 | 0891 BU-65572T1 MIL-STD-1553 Test and Simulation | ||
| 8321 | 0892 BU-65572T2 MIL-STD-1553 Test and Simulation | ||
| 8322 | 0901 BU-65565C1 MIL-STD-1553 Data Bus | ||
| 8323 | 0902 BU-65565C2 MIL-STD-1553 Data Bus | ||
| 8324 | 0903 BU-65565C3 MIL-STD-1553 Data Bus | ||
| 8325 | 0904 BU-65565C4 MIL-STD-1553 Data Bus | ||
| 8326 | 0b01 BU-65569I1 MIL-STD-1553 Data Bus | ||
| 8327 | 0b02 BU-65569I2 MIL-STD-1553 Data Bus | ||
| 8328 | 0b03 BU-65569I3 MIL-STD-1553 Data Bus | ||
| 8329 | 0b04 BU-65569I4 MIL-STD-1553 Data Bus | ||
| 8330 | 5046 GemTek Technology Corporation | ||
| 8331 | 1001 PCI Radio | ||
| 8332 | 5053 Voyetra Technologies | ||
| 8333 | 2010 Daytona Audio Adapter | ||
| 8334 | 5136 S S Technologies | ||
| 8335 | 5143 Qualcomm Inc | ||
| 8336 | 5145 Ensoniq (Old) | ||
| 8337 | 3031 Concert AudioPCI | ||
| 8338 | 5168 Animation Technologies Inc. | ||
| 8339 | 5301 Alliance Semiconductor Corp. | ||
| 8340 | 0001 ProMotion aT3D | ||
| 8341 | 5333 S3 Inc. | ||
| 8342 | 0551 Plato/PX (system) | ||
| 8343 | 5631 86c325 [ViRGE] | ||
| 8344 | 8800 86c866 [Vision 866] | ||
| 8345 | 8801 86c964 [Vision 964] | ||
| 8346 | 8810 86c764_0 [Trio 32 vers 0] | ||
| 8347 | 8811 86c764/765 [Trio32/64/64V+] | ||
| 8348 | 8812 86cM65 [Aurora64V+] | ||
| 8349 | 8813 86c764_3 [Trio 32/64 vers 3] | ||
| 8350 | 8814 86c767 [Trio 64UV+] | ||
| 8351 | 8815 86cM65 [Aurora 128] | ||
| 8352 | 883d 86c988 [ViRGE/VX] | ||
| 8353 | 8870 FireGL | ||
| 8354 | 8880 86c868 [Vision 868 VRAM] vers 0 | ||
| 8355 | 8881 86c868 [Vision 868 VRAM] vers 1 | ||
| 8356 | 8882 86c868 [Vision 868 VRAM] vers 2 | ||
| 8357 | 8883 86c868 [Vision 868 VRAM] vers 3 | ||
| 8358 | 88b0 86c928 [Vision 928 VRAM] vers 0 | ||
| 8359 | 88b1 86c928 [Vision 928 VRAM] vers 1 | ||
| 8360 | 88b2 86c928 [Vision 928 VRAM] vers 2 | ||
| 8361 | 88b3 86c928 [Vision 928 VRAM] vers 3 | ||
| 8362 | 88c0 86c864 [Vision 864 DRAM] vers 0 | ||
| 8363 | 88c1 86c864 [Vision 864 DRAM] vers 1 | ||
| 8364 | 88c2 86c864 [Vision 864-P DRAM] vers 2 | ||
| 8365 | 88c3 86c864 [Vision 864-P DRAM] vers 3 | ||
| 8366 | 88d0 86c964 [Vision 964 VRAM] vers 0 | ||
| 8367 | 88d1 86c964 [Vision 964 VRAM] vers 1 | ||
| 8368 | 88d2 86c964 [Vision 964-P VRAM] vers 2 | ||
| 8369 | 88d3 86c964 [Vision 964-P VRAM] vers 3 | ||
| 8370 | 88f0 86c968 [Vision 968 VRAM] rev 0 | ||
| 8371 | 88f1 86c968 [Vision 968 VRAM] rev 1 | ||
| 8372 | 88f2 86c968 [Vision 968 VRAM] rev 2 | ||
| 8373 | 88f3 86c968 [Vision 968 VRAM] rev 3 | ||
| 8374 | 8900 86c755 [Trio 64V2/DX] | ||
| 8375 | 5333 8900 86C775 Trio64V2/DX | ||
| 8376 | 8901 86c775/86c785 [Trio 64V2/DX or /GX] | ||
| 8377 | 5333 8901 86C775 Trio64V2/DX, 86C785 Trio64V2/GX | ||
| 8378 | 8902 Plato/PX | ||
| 8379 | 8903 Trio 3D business multimedia | ||
| 8380 | 8904 Trio 64 3D | ||
| 8381 | 1014 00db Integrated Trio3D | ||
| 8382 | 5333 8904 86C365 Trio3D AGP | ||
| 8383 | 8905 Trio 64V+ family | ||
| 8384 | 8906 Trio 64V+ family | ||
| 8385 | 8907 Trio 64V+ family | ||
| 8386 | 8908 Trio 64V+ family | ||
| 8387 | 8909 Trio 64V+ family | ||
| 8388 | 890a Trio 64V+ family | ||
| 8389 | 890b Trio 64V+ family | ||
| 8390 | 890c Trio 64V+ family | ||
| 8391 | 890d Trio 64V+ family | ||
| 8392 | 890e Trio 64V+ family | ||
| 8393 | 890f Trio 64V+ family | ||
| 8394 | 8a01 ViRGE/DX or /GX | ||
| 8395 | 0e11 b032 ViRGE/GX | ||
| 8396 | 10b4 1617 Nitro 3D | ||
| 8397 | 10b4 1717 Nitro 3D | ||
| 8398 | 5333 8a01 ViRGE/DX | ||
| 8399 | 8a10 ViRGE/GX2 | ||
| 8400 | 1092 8a10 Stealth 3D 4000 | ||
| 8401 | 8a13 86c368 [Trio 3D/2X] | ||
| 8402 | 5333 8a13 Trio3D/2X | ||
| 8403 | 8a20 86c794 [Savage 3D] | ||
| 8404 | 5333 8a20 86C391 Savage3D | ||
| 8405 | 8a21 86c390 [Savage 3D/MV] | ||
| 8406 | 5333 8a21 86C390 Savage3D/MV | ||
| 8407 | 8a22 Savage 4 | ||
| 8408 | 1033 8068 Savage 4 | ||
| 8409 | 1033 8069 Savage 4 | ||
| 8410 | 1033 8110 Savage4 LT | ||
| 8411 | 105d 0018 SR9 8Mb SDRAM | ||
| 8412 | 105d 002a SR9 Pro 16Mb SDRAM | ||
| 8413 | 105d 003a SR9 Pro 32Mb SDRAM | ||
| 8414 | 105d 092f SR9 Pro+ 16Mb SGRAM | ||
| 8415 | 1092 4207 Stealth III S540 | ||
| 8416 | 1092 4800 Stealth III S540 | ||
| 8417 | 1092 4807 SpeedStar A90 | ||
| 8418 | 1092 4808 Stealth III S540 | ||
| 8419 | 1092 4809 Stealth III S540 | ||
| 8420 | 1092 480e Stealth III S540 | ||
| 8421 | 1092 4904 Stealth III S520 | ||
| 8422 | 1092 4905 SpeedStar A200 | ||
| 8423 | 1092 4a09 Stealth III S540 | ||
| 8424 | 1092 4a0b Stealth III S540 Xtreme | ||
| 8425 | 1092 4a0f Stealth III S540 | ||
| 8426 | 1092 4e01 Stealth III S540 | ||
| 8427 | 1102 101d 3d Blaster Savage 4 | ||
| 8428 | 1102 101e 3d Blaster Savage 4 | ||
| 8429 | 5333 8100 86C394-397 Savage4 SDRAM 100 | ||
| 8430 | 5333 8110 86C394-397 Savage4 SDRAM 110 | ||
| 8431 | 5333 8125 86C394-397 Savage4 SDRAM 125 | ||
| 8432 | 5333 8143 86C394-397 Savage4 SDRAM 143 | ||
| 8433 | 5333 8a22 86C394-397 Savage4 | ||
| 8434 | 5333 8a2e 86C394-397 Savage4 32bit | ||
| 8435 | 5333 9125 86C394-397 Savage4 SGRAM 125 | ||
| 8436 | 5333 9143 86C394-397 Savage4 SGRAM 143 | ||
| 8437 | 8a23 Savage 4 | ||
| 8438 | 8a25 ProSavage PM133 | ||
| 8439 | 8a26 ProSavage KM133 | ||
| 8440 | 8c00 ViRGE/M3 | ||
| 8441 | 8c01 ViRGE/MX | ||
| 8442 | 1179 0001 ViRGE/MX | ||
| 8443 | 8c02 ViRGE/MX+ | ||
| 8444 | 8c03 ViRGE/MX+MV | ||
| 8445 | 8c10 86C270-294 Savage/MX-MV | ||
| 8446 | 8c11 82C270-294 Savage/MX | ||
| 8447 | 8c12 86C270-294 Savage/IX-MV | ||
| 8448 | 1014 017f ThinkPad T20 | ||
| 8449 | 1179 0001 86C584 SuperSavage/IXC Toshiba | ||
| 8450 | 8c13 86C270-294 Savage/IX | ||
| 8451 | 1179 0001 Magnia Z310 | ||
| 8452 | 8c22 SuperSavage MX/128 | ||
| 8453 | 8c24 SuperSavage MX/64 | ||
| 8454 | 8c26 SuperSavage MX/64C | ||
| 8455 | 8c2a SuperSavage IX/128 SDR | ||
| 8456 | 8c2b SuperSavage IX/128 DDR | ||
| 8457 | 8c2c SuperSavage IX/64 SDR | ||
| 8458 | 8c2d SuperSavage IX/64 DDR | ||
| 8459 | 8c2e SuperSavage IX/C SDR | ||
| 8460 | 1014 01fc ThinkPad T23 (2647-4MG) | ||
| 8461 | 8c2f SuperSavage IX/C DDR | ||
| 8462 | 8d01 86C380 [ProSavageDDR K4M266] | ||
| 8463 | 8d02 VT8636A [ProSavage KN133] AGP4X VGA Controller (TwisterK) | ||
| 8464 | 8d03 VT8751 [ProSavageDDR P4M266] | ||
| 8465 | 8d04 VT8375 [ProSavage8 KM266/KL266] | ||
| 8466 | 9102 86C410 Savage 2000 | ||
| 8467 | 1092 5932 Viper II Z200 | ||
| 8468 | 1092 5934 Viper II Z200 | ||
| 8469 | 1092 5952 Viper II Z200 | ||
| 8470 | 1092 5954 Viper II Z200 | ||
| 8471 | 1092 5a35 Viper II Z200 | ||
| 8472 | 1092 5a37 Viper II Z200 | ||
| 8473 | 1092 5a55 Viper II Z200 | ||
| 8474 | 1092 5a57 Viper II Z200 | ||
| 8475 | ca00 SonicVibes | ||
| 8476 | 544c Teralogic Inc | ||
| 8477 | 0350 TL880-based HDTV/ATSC tuner | ||
| 8478 | 5455 Technische University Berlin | ||
| 8479 | 4458 S5933 | ||
| 8480 | 5519 Cnet Technologies, Inc. | ||
| 8481 | 5544 Dunord Technologies | ||
| 8482 | 0001 I-30xx Scanner Interface | ||
| 8483 | 5555 Genroco, Inc | ||
| 8484 | 0003 TURBOstor HFP-832 [HiPPI NIC] | ||
| 8485 | 5654 VoiceTronix Pty Ltd | ||
| 8486 | 3132 OpenSwitch12 | ||
| 8487 | 5700 Netpower | ||
| 8488 | 5851 Exacq Technologies | ||
| 8489 | 6356 UltraStor | ||
| 8490 | 6374 c't Magazin für Computertechnik | ||
| 8491 | 6773 GPPCI | ||
| 8492 | 6409 Logitec Corp. | ||
| 8493 | 6666 Decision Computer International Co. | ||
| 8494 | 0001 PCCOM4 | ||
| 8495 | 0002 PCCOM8 | ||
| 8496 | 7604 O.N. Electronic Co Ltd. | ||
| 8497 | 7bde MIDAC Corporation | ||
| 8498 | 7fed PowerTV | ||
| 8499 | 8008 Quancom Electronic GmbH | ||
| 8500 | 0010 WDOG1 [PCI-Watchdog 1] | ||
| 8501 | 0011 PWDOG2 [PCI-Watchdog 2] | ||
| 8502 | # Wrong ID used in subsystem ID of AsusTek PCI-USB2 PCI card. | ||
| 8503 | 807d Asustek Computer, Inc. | ||
| 8504 | 8086 Intel Corporation | ||
| 8505 | 0007 82379AB | ||
| 8506 | 0008 Extended Express System Support Controller | ||
| 8507 | 0008 1000 WorldMark 4300 INCA ASIC | ||
| 8508 | 0039 21145 Fast Ethernet | ||
| 8509 | 0122 82437FX | ||
| 8510 | 0309 80303 I/O Processor PCI-to-PCI Bridge | ||
| 8511 | 030d 80312 I/O Companion Chip PCI-to-PCI Bridge | ||
| 8512 | 0326 6700/6702PXH I/OxAPIC Interrupt Controller A | ||
| 8513 | 0327 6700PXH I/OxAPIC Interrupt Controller B | ||
| 8514 | 0329 6700PXH PCI Express-to-PCI Bridge A | ||
| 8515 | 032a 6700PXH PCI Express-to-PCI Bridge B | ||
| 8516 | 032c 6702PXH PCI Express-to-PCI Bridge A | ||
| 8517 | # A-segment bridge | ||
| 8518 | 0330 80332 [Dobson] I/O processor | ||
| 8519 | # A-segment IOAPIC | ||
| 8520 | 0331 80332 [Dobson] I/O processor | ||
| 8521 | # B-segment bridge | ||
| 8522 | 0332 80332 [Dobson] I/O processor | ||
| 8523 | # B-segment IOAPIC | ||
| 8524 | 0333 80332 [Dobson] I/O processor | ||
| 8525 | # Address Translation Unit (ATU) | ||
| 8526 | 0334 80332 [Dobson] I/O processor | ||
| 8527 | # PCI-X bridge | ||
| 8528 | 0335 80331 [Lindsay] I/O processor | ||
| 8529 | # Address Translation Unit (ATU) | ||
| 8530 | 0336 80331 [Lindsay] I/O processor | ||
| 8531 | # A-segment bridge | ||
| 8532 | 0340 41210 [Lanai] Serial to Parallel PCI Bridge | ||
| 8533 | # B-segment bridge | ||
| 8534 | 0341 41210 [Lanai] Serial to Parallel PCI Bridge | ||
| 8535 | 0482 82375EB/SB PCI to EISA Bridge | ||
| 8536 | 0483 82424TX/ZX [Saturn] CPU to PCI bridge | ||
| 8537 | 0484 82378ZB/IB, 82379AB (SIO, SIO.A) PCI to ISA Bridge | ||
| 8538 | 0486 82425EX/ZX [Aries] PCIset with ISA bridge | ||
| 8539 | 04a3 82434LX/NX [Mercury/Neptune] Processor to PCI bridge | ||
| 8540 | 04d0 82437FX [Triton FX] | ||
| 8541 | 0500 E8870 Processor bus control | ||
| 8542 | 0501 E8870 Memory controller | ||
| 8543 | # and registers common to both SPs | ||
| 8544 | 0502 E8870 Scalability Port 0 | ||
| 8545 | # and global performance monitoring | ||
| 8546 | 0503 E8870 Scalability Port 1 | ||
| 8547 | 0510 E8870IO Hub Interface Port 0 registers (8-bit compatibility port) | ||
| 8548 | 0511 E8870IO Hub Interface Port 1 registers | ||
| 8549 | 0512 E8870IO Hub Interface Port 2 registers | ||
| 8550 | 0513 E8870IO Hub Interface Port 3 registers | ||
| 8551 | 0514 E8870IO Hub Interface Port 4 registers | ||
| 8552 | 0515 E8870IO General SIOH registers | ||
| 8553 | 0516 E8870IO RAS registers | ||
| 8554 | 0530 E8870SP Scalability Port 0 registers | ||
| 8555 | 0531 E8870SP Scalability Port 1 registers | ||
| 8556 | 0532 E8870SP Scalability Port 2 registers | ||
| 8557 | 0533 E8870SP Scalability Port 3 registers | ||
| 8558 | 0534 E8870SP Scalability Port 4 registers | ||
| 8559 | 0535 E8870SP Scalability Port 5 registers | ||
| 8560 | # (bi-interleave 0) and global registers that are neither per-port nor per-interleave | ||
| 8561 | 0536 E8870SP Interleave registers 0 and 1 | ||
| 8562 | # (bi-interleave 1) | ||
| 8563 | 0537 E8870SP Interleave registers 2 and 3 | ||
| 8564 | 0600 RAID Controller | ||
| 8565 | 8086 01c1 ICP Vortex GDT8546RZ | ||
| 8566 | 8086 01f7 SCRU32 | ||
| 8567 | # uninitialized SRCU32 RAID Controller | ||
| 8568 | 061f 80303 I/O Processor | ||
| 8569 | 0960 80960RP [i960 RP Microprocessor/Bridge] | ||
| 8570 | 0962 80960RM [i960RM Bridge] | ||
| 8571 | 0964 80960RP [i960 RP Microprocessor/Bridge] | ||
| 8572 | 1000 82542 Gigabit Ethernet Controller | ||
| 8573 | 0e11 b0df NC1632 Gigabit Ethernet Adapter (1000-SX) | ||
| 8574 | 0e11 b0e0 NC1633 Gigabit Ethernet Adapter (1000-LX) | ||
| 8575 | 0e11 b123 NC1634 Gigabit Ethernet Adapter (1000-SX) | ||
| 8576 | 1014 0119 Netfinity Gigabit Ethernet SX Adapter | ||
| 8577 | 8086 1000 PRO/1000 Gigabit Server Adapter | ||
| 8578 | 1001 82543GC Gigabit Ethernet Controller (Fiber) | ||
| 8579 | 0e11 004a NC6136 Gigabit Server Adapter | ||
| 8580 | 1014 01ea Netfinity Gigabit Ethernet SX Adapter | ||
| 8581 | 8086 1002 PRO/1000 F Server Adapter | ||
| 8582 | 8086 1003 PRO/1000 F Server Adapter | ||
| 8583 | 1002 Pro 100 LAN+Modem 56 Cardbus II | ||
| 8584 | 8086 200e Pro 100 LAN+Modem 56 Cardbus II | ||
| 8585 | 8086 2013 Pro 100 SR Mobile Combo Adapter | ||
| 8586 | 8086 2017 Pro 100 S Combo Mobile Adapter | ||
| 8587 | 1004 82543GC Gigabit Ethernet Controller (Copper) | ||
| 8588 | 0e11 0049 NC7132 Gigabit Upgrade Module | ||
| 8589 | 0e11 b1a4 NC7131 Gigabit Server Adapter | ||
| 8590 | 1014 10f2 Gigabit Ethernet Server Adapter | ||
| 8591 | 8086 1004 PRO/1000 T Server Adapter | ||
| 8592 | 8086 2004 PRO/1000 T Server Adapter | ||
| 8593 | 1008 82544EI Gigabit Ethernet Controller (Copper) | ||
| 8594 | 1014 0269 iSeries 1000/100/10 Ethernet Adapter | ||
| 8595 | 1028 011c PRO/1000 XT Network Connection | ||
| 8596 | 8086 1107 PRO/1000 XT Server Adapter | ||
| 8597 | 8086 2107 PRO/1000 XT Server Adapter | ||
| 8598 | 8086 2110 PRO/1000 XT Server Adapter | ||
| 8599 | 8086 3108 PRO/1000 XT Network Connection | ||
| 8600 | 1009 82544EI Gigabit Ethernet Controller (Fiber) | ||
| 8601 | 1014 0268 iSeries Gigabit Ethernet Adapter | ||
| 8602 | 8086 1109 PRO/1000 XF Server Adapter | ||
| 8603 | 8086 2109 PRO/1000 XF Server Adapter | ||
| 8604 | 100c 82544GC Gigabit Ethernet Controller (Copper) | ||
| 8605 | 8086 1112 PRO/1000 T Desktop Adapter | ||
| 8606 | 8086 2112 PRO/1000 T Desktop Adapter | ||
| 8607 | 100d 82544GC Gigabit Ethernet Controller (LOM) | ||
| 8608 | 1028 0123 PRO/1000 XT Network Connection | ||
| 8609 | 1079 891f 82544GC Based Network Connection | ||
| 8610 | 4c53 1080 CT8 mainboard | ||
| 8611 | 8086 110d 82544GC Based Network Connection | ||
| 8612 | 100e 82540EM Gigabit Ethernet Controller | ||
| 8613 | 1014 0265 PRO/1000 MT Network Connection | ||
| 8614 | 1014 0267 PRO/1000 MT Network Connection | ||
| 8615 | 1014 026a PRO/1000 MT Network Connection | ||
| 8616 | 1028 002e Optiplex GX260 | ||
| 8617 | 1028 0151 PRO/1000 MT Network Connection | ||
| 8618 | 107b 8920 PRO/1000 MT Desktop Adapter | ||
| 8619 | 8086 001e PRO/1000 MT Desktop Adapter | ||
| 8620 | 8086 002e PRO/1000 MT Desktop Adapter | ||
| 8621 | 100f 82545EM Gigabit Ethernet Controller (Copper) | ||
| 8622 | 1014 0269 iSeries 1000/100/10 Ethernet Adapter | ||
| 8623 | 1014 028e PRO/1000 MT Network Connection | ||
| 8624 | 8086 1000 PRO/1000 MT Network Connection | ||
| 8625 | 8086 1001 PRO/1000 MT Server Adapter | ||
| 8626 | 1010 82546EB Gigabit Ethernet Controller (Copper) | ||
| 8627 | 1014 027c PRO/1000 MT Dual Port Network Adapter | ||
| 8628 | 18fb 7872 RESlink-X | ||
| 8629 | 4c53 1080 CT8 mainboard | ||
| 8630 | 4c53 10a0 CA3/CR3 mainboard | ||
| 8631 | 8086 1011 PRO/1000 MT Dual Port Server Adapter | ||
| 8632 | 8086 101a PRO/1000 MT Dual Port Network Adapter | ||
| 8633 | 8086 3424 SE7501HG2 Mainboard | ||
| 8634 | 1011 82545EM Gigabit Ethernet Controller (Fiber) | ||
| 8635 | 1014 0268 iSeries Gigabit Ethernet Adapter | ||
| 8636 | 8086 1002 PRO/1000 MF Server Adapter | ||
| 8637 | 8086 1003 PRO/1000 MF Server Adapter (LX) | ||
| 8638 | 1012 82546EB Gigabit Ethernet Controller (Fiber) | ||
| 8639 | 8086 1012 PRO/1000 MF Dual Port Server Adapter | ||
| 8640 | 1013 82541EI Gigabit Ethernet Controller (Copper) | ||
| 8641 | 8086 0013 PRO/1000 MT Network Connection | ||
| 8642 | 8086 1013 IBM ThinkCentre Network Card | ||
| 8643 | 8086 1113 PRO/1000 MT Desktop Adapter | ||
| 8644 | 1014 82541ER Gigabit Ethernet Controller | ||
| 8645 | 1015 82540EM Gigabit Ethernet Controller (LOM) | ||
| 8646 | 1016 82540EP Gigabit Ethernet Controller (LOM) | ||
| 8647 | 1014 052c PRO/1000 MT Mobile Connection | ||
| 8648 | 1179 0001 PRO/1000 MT Mobile Connection | ||
| 8649 | 8086 1016 PRO/1000 MT Mobile Connection | ||
| 8650 | 1017 82540EP Gigabit Ethernet Controller (LOM) | ||
| 8651 | 8086 1017 PR0/1000 MT Desktop Connection | ||
| 8652 | # Update controller name from 82541EP to 82541EI | ||
| 8653 | 1018 82541EI Gigabit Ethernet Controller | ||
| 8654 | 8086 1018 PRO/1000 MT Desktop Adapter | ||
| 8655 | 1019 82547EI Gigabit Ethernet Controller (LOM) | ||
| 8656 | 1458 1019 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 8657 | 1458 e000 Intel Gigabit Ethernet (Kenai II) | ||
| 8658 | 8086 1019 PRO/1000 CT Desktop Connection | ||
| 8659 | 8086 301f D865PERL mainboard | ||
| 8660 | 8086 3427 S875WP1-E mainboard | ||
| 8661 | 101d 82546EB Gigabit Ethernet Controller | ||
| 8662 | 8086 1000 PRO/1000 MT Quad Port Server Adapter | ||
| 8663 | 101e 82540EP Gigabit Ethernet Controller (Mobile) | ||
| 8664 | 1014 0549 PRO/1000 MT Mobile Connection | ||
| 8665 | 1179 0001 PRO/1000 MT Mobile Connection | ||
| 8666 | 8086 101e PRO/1000 MT Mobile Connection | ||
| 8667 | 1026 82545GM Gigabit Ethernet Controller | ||
| 8668 | 8086 1000 PRO/1000 MT Server Connection | ||
| 8669 | 8086 1001 PRO/1000 MT Server Adapter | ||
| 8670 | 8086 1002 PRO/1000 MT Server Adapter | ||
| 8671 | 8086 1026 PRO/1000 MT Server Connection | ||
| 8672 | 1027 82545GM Gigabit Ethernet Controller | ||
| 8673 | 8086 1001 PRO/1000 MF Server Adapter(LX) | ||
| 8674 | 8086 1002 PRO/1000 MF Server Adapter(LX) | ||
| 8675 | 8086 1003 PRO/1000 MF Server Adapter(LX) | ||
| 8676 | 8086 1027 PRO/1000 MF Server Adapter | ||
| 8677 | 1028 82545GM Gigabit Ethernet Controller | ||
| 8678 | 8086 1028 PRO/1000 MB Server Adapter | ||
| 8679 | 1029 82559 Ethernet Controller | ||
| 8680 | 1030 82559 InBusiness 10/100 | ||
| 8681 | 1031 82801CAM (ICH3) PRO/100 VE (LOM) Ethernet Controller | ||
| 8682 | 1014 0209 ThinkPad A/T/X Series | ||
| 8683 | 104d 80e7 Vaio PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 8684 | 107b 5350 EtherExpress PRO/100 VE | ||
| 8685 | 1179 0001 EtherExpress PRO/100 VE | ||
| 8686 | 144d c000 EtherExpress PRO/100 VE | ||
| 8687 | 144d c001 EtherExpress PRO/100 VE | ||
| 8688 | 144d c003 EtherExpress PRO/100 VE | ||
| 8689 | 144d c006 vpr Matrix 170B4 | ||
| 8690 | 1032 82801CAM (ICH3) PRO/100 VE Ethernet Controller | ||
| 8691 | 1033 82801CAM (ICH3) PRO/100 VM (LOM) Ethernet Controller | ||
| 8692 | 1034 82801CAM (ICH3) PRO/100 VM Ethernet Controller | ||
| 8693 | 1035 82801CAM (ICH3)/82562EH (LOM) Ethernet Controller | ||
| 8694 | 1036 82801CAM (ICH3) 82562EH Ethernet Controller | ||
| 8695 | 1037 82801CAM (ICH3) Chipset Ethernet Controller | ||
| 8696 | 1038 82801CAM (ICH3) PRO/100 VM (KM) Ethernet Controller | ||
| 8697 | 1039 82801DB PRO/100 VE (LOM) Ethernet Controller | ||
| 8698 | 1014 0267 NetVista A30p | ||
| 8699 | 103a 82801DB PRO/100 VE (CNR) Ethernet Controller | ||
| 8700 | 103b 82801DB PRO/100 VM (LOM) Ethernet Controller | ||
| 8701 | 103c 82801DB PRO/100 VM (CNR) Ethernet Controller | ||
| 8702 | 103d 82801DB PRO/100 VE (MOB) Ethernet Controller | ||
| 8703 | 103e 82801DB PRO/100 VM (MOB) Ethernet Controller | ||
| 8704 | 1040 536EP Data Fax Modem | ||
| 8705 | 16be 1040 V.9X DSP Data Fax Modem | ||
| 8706 | 1043 PRO/Wireless LAN 2100 3B Mini PCI Adapter | ||
| 8707 | 8086 2527 MIM2000/Centrino | ||
| 8708 | 1048 PRO/10GbE LR Server Adapter | ||
| 8709 | 8086 a01f PRO/10GbE LR Server Adapter | ||
| 8710 | 8086 a11f PRO/10GbE LR Server Adapter | ||
| 8711 | 1050 82562EZ 10/100 Ethernet Controller | ||
| 8712 | 1462 728c 865PE Neo2 (MS-6728) | ||
| 8713 | 1462 758c MS-6758 (875P Neo) | ||
| 8714 | 8086 3020 D865PERL mainboard | ||
| 8715 | 8086 3427 S875WP1-E mainboard | ||
| 8716 | 1051 82801EB/ER (ICH5/ICH5R) integrated LAN Controller | ||
| 8717 | 1059 82551QM Ethernet Controller | ||
| 8718 | # ICH-6 Component | ||
| 8719 | 1064 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller | ||
| 8720 | # ICH-6 Component | ||
| 8721 | 1065 82562ET/EZ/GT/GZ - PRO/100 VE Ethernet Controller | ||
| 8722 | # ICH-6 Component | ||
| 8723 | 1066 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller | ||
| 8724 | # ICH-6 Component | ||
| 8725 | 1067 82562 EM/EX/GX - PRO/100 VM Ethernet Controller | ||
| 8726 | # ICH-6 Component | ||
| 8727 | 1068 82562ET/EZ/GT/GZ - PRO/100 VE (LOM) Ethernet Controller Mobile | ||
| 8728 | # ICH-6 Component | ||
| 8729 | 1069 82562 EM/EX/GX - PRO/100 VM (LOM) Ethernet Controller Mobile | ||
| 8730 | # ICH-6 Component | ||
| 8731 | 106a 82562G \t- PRO/100 VE (LOM) Ethernet Controller | ||
| 8732 | # ICH-6 Component | ||
| 8733 | 106b 82562G \t- PRO/100 VE Ethernet Controller Mobile | ||
| 8734 | 1075 82547GI Gigabit Ethernet Controller | ||
| 8735 | 1028 0165 PowerEdge 750 | ||
| 8736 | 8086 0075 PRO/1000 CT Network Connection | ||
| 8737 | 8086 1075 PRO/1000 CT Network Connection | ||
| 8738 | 1076 82541GI/PI Gigabit Ethernet Controller | ||
| 8739 | 1028 0165 PowerEdge 750 | ||
| 8740 | 8086 0076 PRO/1000 MT Network Connection | ||
| 8741 | 8086 1076 PRO/1000 MT Network Connection | ||
| 8742 | 8086 1176 PRO/1000 MT Desktop Adapter | ||
| 8743 | 8086 1276 PRO/1000 MT Desktop Adapter | ||
| 8744 | 1077 82541GI Gigabit Ethernet Controller | ||
| 8745 | 1179 0001 PRO/1000 MT Mobile Connection | ||
| 8746 | 8086 0077 PRO/1000 MT Mobile Connection | ||
| 8747 | 8086 1077 PRO/1000 MT Mobile Connection | ||
| 8748 | 1078 82541EI Gigabit Ethernet Controller | ||
| 8749 | 8086 1078 PRO/1000 MT Network Connection | ||
| 8750 | 1079 82546GB Gigabit Ethernet Controller | ||
| 8751 | 103c 12a6 HP Dual Port 1000Base-T [A9900A] | ||
| 8752 | 103c 12cf HP Core Dual Port 1000Base-T [AB352A] | ||
| 8753 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 8754 | 4c53 10b0 CL9 mainboard | ||
| 8755 | 8086 0079 PRO/1000 MT Dual Port Network Connection | ||
| 8756 | 8086 1079 PRO/1000 MT Dual Port Network Connection | ||
| 8757 | 8086 1179 PRO/1000 MT Dual Port Network Connection | ||
| 8758 | 8086 117a PRO/1000 MT Dual Port Server Adapter | ||
| 8759 | 107a 82546GB Gigabit Ethernet Controller | ||
| 8760 | 103c 12a8 HP Dual Port 1000base-SX [A9899A] | ||
| 8761 | 8086 107a PRO/1000 MF Dual Port Server Adapter | ||
| 8762 | 8086 127a PRO/1000 MF Dual Port Server Adapter | ||
| 8763 | 107b 82546GB Gigabit Ethernet Controller | ||
| 8764 | 8086 007b PRO/1000 MB Dual Port Server Connection | ||
| 8765 | 8086 107b PRO/1000 MB Dual Port Server Connection | ||
| 8766 | 1107 PRO/1000 MF Server Adapter (LX) | ||
| 8767 | 1130 82815 815 Chipset Host Bridge and Memory Controller Hub | ||
| 8768 | 1025 1016 Travelmate 612 TX | ||
| 8769 | 1043 8027 TUSL2-C Mainboard | ||
| 8770 | 104d 80df Vaio PCG-FX403 | ||
| 8771 | 8086 4532 D815EEA2 mainboard | ||
| 8772 | 8086 4557 D815EGEW Mainboard | ||
| 8773 | 1131 82815 815 Chipset AGP Bridge | ||
| 8774 | 1132 82815 CGC [Chipset Graphics Controller] | ||
| 8775 | 1025 1016 Travelmate 612 TX | ||
| 8776 | 104d 80df Vaio PCG-FX403 | ||
| 8777 | 8086 4532 D815EEA2 Mainboard | ||
| 8778 | 8086 4557 D815EGEW Mainboard | ||
| 8779 | 1161 82806AA PCI64 Hub Advanced Programmable Interrupt Controller | ||
| 8780 | 8086 1161 82806AA PCI64 Hub APIC | ||
| 8781 | 1162 Xscale 80200 Big Endian Companion Chip | ||
| 8782 | 1200 Intel IXP1200 Network Processor | ||
| 8783 | 172a 0000 AEP SSL Accelerator | ||
| 8784 | 1209 8255xER/82551IT Fast Ethernet Controller | ||
| 8785 | 4c53 1050 CT7 mainboard | ||
| 8786 | 4c53 1051 CE7 mainboard | ||
| 8787 | 4c53 1070 PC6 mainboard | ||
| 8788 | 1221 82092AA PCI to PCMCIA Bridge | ||
| 8789 | 1222 82092AA IDE Controller | ||
| 8790 | 1223 SAA7116 | ||
| 8791 | 1225 82452KX/GX [Orion] | ||
| 8792 | 1226 82596 PRO/10 PCI | ||
| 8793 | 1227 82865 EtherExpress PRO/100A | ||
| 8794 | 1228 82556 EtherExpress PRO/100 Smart | ||
| 8795 | # the revision field differentiates between them (1-3 is 82557, 4-5 is 82558, 6-8 is 82559, 9 is 82559ER) | ||
| 8796 | 1229 82557/8/9 [Ethernet Pro 100] | ||
| 8797 | 0e11 3001 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8798 | 0e11 3002 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8799 | 0e11 3003 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8800 | 0e11 3004 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8801 | 0e11 3005 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8802 | 0e11 3006 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8803 | 0e11 3007 82559 Fast Ethernet LOM with Alert on LAN* | ||
| 8804 | 0e11 b01e NC3120 Fast Ethernet NIC | ||
| 8805 | 0e11 b01f NC3122 Fast Ethernet NIC (dual port) | ||
| 8806 | 0e11 b02f NC1120 Ethernet NIC | ||
| 8807 | 0e11 b04a Netelligent 10/100TX NIC with Wake on LAN | ||
| 8808 | 0e11 b0c6 NC3161 Fast Ethernet NIC (embedded, WOL) | ||
| 8809 | 0e11 b0c7 NC3160 Fast Ethernet NIC (embedded) | ||
| 8810 | 0e11 b0d7 NC3121 Fast Ethernet NIC (WOL) | ||
| 8811 | 0e11 b0dd NC3131 Fast Ethernet NIC (dual port) | ||
| 8812 | 0e11 b0de NC3132 Fast Ethernet Module (dual port) | ||
| 8813 | 0e11 b0e1 NC3133 Fast Ethernet Module (100-FX) | ||
| 8814 | 0e11 b134 NC3163 Fast Ethernet NIC (embedded, WOL) | ||
| 8815 | 0e11 b13c NC3162 Fast Ethernet NIC (embedded) | ||
| 8816 | 0e11 b144 NC3123 Fast Ethernet NIC (WOL) | ||
| 8817 | 0e11 b163 NC3134 Fast Ethernet NIC (dual port) | ||
| 8818 | 0e11 b164 NC3135 Fast Ethernet Upgrade Module (dual port) | ||
| 8819 | 0e11 b1a4 NC7131 Gigabit Server Adapter | ||
| 8820 | 1014 005c 82558B Ethernet Pro 10/100 | ||
| 8821 | 1014 01bc 82559 Fast Ethernet LAN On Motherboard | ||
| 8822 | 1014 01f1 10/100 Ethernet Server Adapter | ||
| 8823 | 1014 01f2 10/100 Ethernet Server Adapter | ||
| 8824 | 1014 0207 Ethernet Pro/100 S | ||
| 8825 | 1014 0232 10/100 Dual Port Server Adapter | ||
| 8826 | 1014 023a ThinkPad R30 | ||
| 8827 | 1014 105c Netfinity 10/100 | ||
| 8828 | 1014 2205 ThinkPad A22p | ||
| 8829 | 1014 305c 10/100 EtherJet Management Adapter | ||
| 8830 | 1014 405c 10/100 EtherJet Adapter with Alert on LAN | ||
| 8831 | 1014 505c 10/100 EtherJet Secure Management Adapter | ||
| 8832 | 1014 605c 10/100 EtherJet Secure Management Adapter | ||
| 8833 | 1014 705c 10/100 Netfinity 10/100 Ethernet Security Adapter | ||
| 8834 | 1014 805c 10/100 Netfinity 10/100 Ethernet Security Adapter | ||
| 8835 | 1028 009b PowerEdge 2500/2550 | ||
| 8836 | 1028 00ce PowerEdge 1400 | ||
| 8837 | 1033 8000 PC-9821X-B06 | ||
| 8838 | 1033 8016 PK-UG-X006 | ||
| 8839 | 1033 801f PK-UG-X006 | ||
| 8840 | 1033 8026 PK-UG-X006 | ||
| 8841 | 1033 8063 82559-based Fast Ethernet Adapter | ||
| 8842 | 1033 8064 82559-based Fast Ethernet Adapter | ||
| 8843 | 103c 10c0 NetServer 10/100TX | ||
| 8844 | 103c 10c3 NetServer 10/100TX | ||
| 8845 | 103c 10ca NetServer 10/100TX | ||
| 8846 | 103c 10cb NetServer 10/100TX | ||
| 8847 | 103c 10e3 NetServer 10/100TX | ||
| 8848 | 103c 10e4 NetServer 10/100TX | ||
| 8849 | 103c 1200 NetServer 10/100TX | ||
| 8850 | 10c3 1100 SmartEther100 SC1100 | ||
| 8851 | 10cf 1115 8255x-based Ethernet Adapter (10/100) | ||
| 8852 | 10cf 1143 8255x-based Ethernet Adapter (10/100) | ||
| 8853 | 1179 0001 8255x-based Ethernet Adapter (10/100) | ||
| 8854 | 1179 0002 PCI FastEther LAN on Docker | ||
| 8855 | 1179 0003 8255x-based Fast Ethernet | ||
| 8856 | 1259 2560 AT-2560 100 | ||
| 8857 | 1259 2561 AT-2560 100 FX Ethernet Adapter | ||
| 8858 | 1266 0001 NE10/100 Adapter | ||
| 8859 | 13e9 1000 6221L-4U | ||
| 8860 | 144d 2501 SEM-2000 MiniPCI LAN Adapter | ||
| 8861 | 144d 2502 SEM-2100IL MiniPCI LAN Adapter | ||
| 8862 | 1668 1100 EtherExpress PRO/100B (TX) (MiniPCI Ethernet+Modem) | ||
| 8863 | 4c53 1080 CT8 mainboard | ||
| 8864 | 8086 0001 EtherExpress PRO/100B (TX) | ||
| 8865 | 8086 0002 EtherExpress PRO/100B (T4) | ||
| 8866 | 8086 0003 EtherExpress PRO/10+ | ||
| 8867 | 8086 0004 EtherExpress PRO/100 WfM | ||
| 8868 | 8086 0005 82557 10/100 | ||
| 8869 | 8086 0006 82557 10/100 with Wake on LAN | ||
| 8870 | 8086 0007 82558 10/100 Adapter | ||
| 8871 | 8086 0008 82558 10/100 with Wake on LAN | ||
| 8872 | 8086 0009 EtherExpress PRO/100+ | ||
| 8873 | 8086 000a EtherExpress PRO/100+ Management Adapter | ||
| 8874 | 8086 000b EtherExpress PRO/100+ | ||
| 8875 | 8086 000c EtherExpress PRO/100+ Management Adapter | ||
| 8876 | 8086 000d EtherExpress PRO/100+ Alert On LAN II* Adapter | ||
| 8877 | 8086 000e EtherExpress PRO/100+ Management Adapter with Alert On LAN* | ||
| 8878 | 8086 000f EtherExpress PRO/100 Desktop Adapter | ||
| 8879 | 8086 0010 EtherExpress PRO/100 S Management Adapter | ||
| 8880 | 8086 0011 EtherExpress PRO/100 S Management Adapter | ||
| 8881 | 8086 0012 EtherExpress PRO/100 S Advanced Management Adapter (D) | ||
| 8882 | 8086 0013 EtherExpress PRO/100 S Advanced Management Adapter (E) | ||
| 8883 | 8086 0030 EtherExpress PRO/100 Management Adapter with Alert On LAN* GC | ||
| 8884 | 8086 0031 EtherExpress PRO/100 Desktop Adapter | ||
| 8885 | 8086 0040 EtherExpress PRO/100 S Desktop Adapter | ||
| 8886 | 8086 0041 EtherExpress PRO/100 S Desktop Adapter | ||
| 8887 | 8086 0042 EtherExpress PRO/100 Desktop Adapter | ||
| 8888 | 8086 0050 EtherExpress PRO/100 S Desktop Adapter | ||
| 8889 | 8086 1009 EtherExpress PRO/100+ Server Adapter | ||
| 8890 | 8086 100c EtherExpress PRO/100+ Server Adapter (PILA8470B) | ||
| 8891 | 8086 1012 EtherExpress PRO/100 S Server Adapter (D) | ||
| 8892 | 8086 1013 EtherExpress PRO/100 S Server Adapter (E) | ||
| 8893 | 8086 1015 EtherExpress PRO/100 S Dual Port Server Adapter | ||
| 8894 | 8086 1017 EtherExpress PRO/100+ Dual Port Server Adapter | ||
| 8895 | 8086 1030 EtherExpress PRO/100+ Management Adapter with Alert On LAN* G Server | ||
| 8896 | 8086 1040 EtherExpress PRO/100 S Server Adapter | ||
| 8897 | 8086 1041 EtherExpress PRO/100 S Server Adapter | ||
| 8898 | 8086 1042 EtherExpress PRO/100 Server Adapter | ||
| 8899 | 8086 1050 EtherExpress PRO/100 S Server Adapter | ||
| 8900 | 8086 1051 EtherExpress PRO/100 Server Adapter | ||
| 8901 | 8086 1052 EtherExpress PRO/100 Server Adapter | ||
| 8902 | 8086 10f0 EtherExpress PRO/100+ Dual Port Adapter | ||
| 8903 | 8086 2009 EtherExpress PRO/100 S Mobile Adapter | ||
| 8904 | 8086 200d EtherExpress PRO/100 Cardbus | ||
| 8905 | 8086 200e EtherExpress PRO/100 LAN+V90 Cardbus Modem | ||
| 8906 | 8086 200f EtherExpress PRO/100 SR Mobile Adapter | ||
| 8907 | 8086 2010 EtherExpress PRO/100 S Mobile Combo Adapter | ||
| 8908 | 8086 2013 EtherExpress PRO/100 SR Mobile Combo Adapter | ||
| 8909 | 8086 2016 EtherExpress PRO/100 S Mobile Adapter | ||
| 8910 | 8086 2017 EtherExpress PRO/100 S Combo Mobile Adapter | ||
| 8911 | 8086 2018 EtherExpress PRO/100 SR Mobile Adapter | ||
| 8912 | 8086 2019 EtherExpress PRO/100 SR Combo Mobile Adapter | ||
| 8913 | 8086 2101 EtherExpress PRO/100 P Mobile Adapter | ||
| 8914 | 8086 2102 EtherExpress PRO/100 SP Mobile Adapter | ||
| 8915 | 8086 2103 EtherExpress PRO/100 SP Mobile Adapter | ||
| 8916 | 8086 2104 EtherExpress PRO/100 SP Mobile Adapter | ||
| 8917 | 8086 2105 EtherExpress PRO/100 SP Mobile Adapter | ||
| 8918 | 8086 2106 EtherExpress PRO/100 P Mobile Adapter | ||
| 8919 | 8086 2107 EtherExpress PRO/100 Network Connection | ||
| 8920 | 8086 2108 EtherExpress PRO/100 Network Connection | ||
| 8921 | 8086 2200 EtherExpress PRO/100 P Mobile Combo Adapter | ||
| 8922 | 8086 2201 EtherExpress PRO/100 P Mobile Combo Adapter | ||
| 8923 | 8086 2202 EtherExpress PRO/100 SP Mobile Combo Adapter | ||
| 8924 | 8086 2203 EtherExpress PRO/100+ MiniPCI | ||
| 8925 | 8086 2204 EtherExpress PRO/100+ MiniPCI | ||
| 8926 | 8086 2205 EtherExpress PRO/100 SP Mobile Combo Adapter | ||
| 8927 | 8086 2206 EtherExpress PRO/100 SP Mobile Combo Adapter | ||
| 8928 | 8086 2207 EtherExpress PRO/100 SP Mobile Combo Adapter | ||
| 8929 | 8086 2208 EtherExpress PRO/100 P Mobile Combo Adapter | ||
| 8930 | 8086 2402 EtherExpress PRO/100+ MiniPCI | ||
| 8931 | 8086 2407 EtherExpress PRO/100+ MiniPCI | ||
| 8932 | 8086 2408 EtherExpress PRO/100+ MiniPCI | ||
| 8933 | 8086 2409 EtherExpress PRO/100+ MiniPCI | ||
| 8934 | 8086 240f EtherExpress PRO/100+ MiniPCI | ||
| 8935 | 8086 2410 EtherExpress PRO/100+ MiniPCI | ||
| 8936 | 8086 2411 EtherExpress PRO/100+ MiniPCI | ||
| 8937 | 8086 2412 EtherExpress PRO/100+ MiniPCI | ||
| 8938 | 8086 2413 EtherExpress PRO/100+ MiniPCI | ||
| 8939 | 8086 3000 82559 Fast Ethernet LAN on Motherboard | ||
| 8940 | 8086 3001 82559 Fast Ethernet LOM with Basic Alert on LAN* | ||
| 8941 | 8086 3002 82559 Fast Ethernet LOM with Alert on LAN II* | ||
| 8942 | 8086 3006 EtherExpress PRO/100 S Network Connection | ||
| 8943 | 8086 3007 EtherExpress PRO/100 S Network Connection | ||
| 8944 | 8086 3008 EtherExpress PRO/100 Network Connection | ||
| 8945 | 8086 3010 EtherExpress PRO/100 S Network Connection | ||
| 8946 | 8086 3011 EtherExpress PRO/100 S Network Connection | ||
| 8947 | 8086 3012 EtherExpress PRO/100 Network Connection | ||
| 8948 | 8086 3411 SDS2 Mainboard | ||
| 8949 | 122d 430FX - 82437FX TSC [Triton I] | ||
| 8950 | 122e 82371FB PIIX ISA [Triton I] | ||
| 8951 | 1230 82371FB PIIX IDE [Triton I] | ||
| 8952 | 1231 DSVD Modem | ||
| 8953 | 1234 430MX - 82371MX Mobile PCI I/O IDE Xcelerator (MPIIX) | ||
| 8954 | 1235 430MX - 82437MX Mob. System Ctrlr (MTSC) & 82438MX Data Path (MTDP) | ||
| 8955 | 1237 440FX - 82441FX PMC [Natoma] | ||
| 8956 | 1239 82371FB PIIX IDE Interface | ||
| 8957 | 123b 82380PB PCI to PCI Docking Bridge | ||
| 8958 | 123c 82380AB (MISA) Mobile PCI-to-ISA Bridge | ||
| 8959 | 123d 683053 Programmable Interrupt Device | ||
| 8960 | # in" hidden" mode | ||
| 8961 | 123e 82466GX (IHPC) Integrated Hot-Plug Controller | ||
| 8962 | 123f 82466GX Integrated Hot-Plug Controller (IHPC) | ||
| 8963 | 1240 82752 (752) AGP Graphics Accelerator | ||
| 8964 | 124b 82380FB (MPCI2) Mobile Docking Controller | ||
| 8965 | 1250 430HX - 82439HX TXC [Triton II] | ||
| 8966 | 1360 82806AA PCI64 Hub PCI Bridge | ||
| 8967 | 1361 82806AA PCI64 Hub Controller (HRes) | ||
| 8968 | 8086 1361 82806AA PCI64 Hub Controller (HRes) | ||
| 8969 | 8086 8000 82806AA PCI64 Hub Controller (HRes) | ||
| 8970 | 1460 82870P2 P64H2 Hub PCI Bridge | ||
| 8971 | 1461 82870P2 P64H2 I/OxAPIC | ||
| 8972 | 15d9 3480 P4DP6 | ||
| 8973 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 8974 | 1462 82870P2 P64H2 Hot Plug Controller | ||
| 8975 | 1960 80960RP [i960RP Microprocessor] | ||
| 8976 | 101e 0431 MegaRAID 431 RAID Controller | ||
| 8977 | 101e 0438 MegaRAID 438 Ultra2 LVD RAID Controller | ||
| 8978 | 101e 0466 MegaRAID 466 Express Plus RAID Controller | ||
| 8979 | 101e 0467 MegaRAID 467 Enterprise 1500 RAID Controller | ||
| 8980 | 101e 0490 MegaRAID 490 Express 300 RAID Controller | ||
| 8981 | 101e 0762 MegaRAID 762 Express RAID Controller | ||
| 8982 | 101e 09a0 PowerEdge Expandable RAID Controller 2/SC | ||
| 8983 | 1028 0467 PowerEdge Expandable RAID Controller 2/DC | ||
| 8984 | 1028 1111 PowerEdge Expandable RAID Controller 2/SC | ||
| 8985 | 103c 03a2 MegaRAID | ||
| 8986 | 103c 10c6 MegaRAID 438, HP NetRAID-3Si | ||
| 8987 | 103c 10c7 MegaRAID T5, Integrated HP NetRAID | ||
| 8988 | 103c 10cc MegaRAID, Integrated HP NetRAID | ||
| 8989 | 103c 10cd HP NetRAID-1Si | ||
| 8990 | 105a 0000 SuperTrak | ||
| 8991 | 105a 2168 SuperTrak Pro | ||
| 8992 | 105a 5168 SuperTrak66/100 | ||
| 8993 | 1111 1111 MegaRAID 466, PowerEdge Expandable RAID Controller 2/SC | ||
| 8994 | 1111 1112 PowerEdge Expandable RAID Controller 2/SC | ||
| 8995 | 113c 03a2 MegaRAID | ||
| 8996 | e4bf 1010 CG1-RADIO | ||
| 8997 | e4bf 1020 CU2-QUARTET | ||
| 8998 | e4bf 1040 CU1-CHORUS | ||
| 8999 | e4bf 3100 CX1-BAND | ||
| 9000 | 1962 80960RM [i960RM Microprocessor] | ||
| 9001 | 105a 0000 SuperTrak SX6000 I2O CPU | ||
| 9002 | 1a21 82840 840 (Carmel) Chipset Host Bridge (Hub A) | ||
| 9003 | 1a23 82840 840 (Carmel) Chipset AGP Bridge | ||
| 9004 | 1a24 82840 840 (Carmel) Chipset PCI Bridge (Hub B) | ||
| 9005 | 1a30 82845 845 (Brookdale) Chipset Host Bridge | ||
| 9006 | 1028 010e Optiplex GX240 | ||
| 9007 | 1a31 82845 845 (Brookdale) Chipset AGP Bridge | ||
| 9008 | 2410 82801AA ISA Bridge (LPC) | ||
| 9009 | 2411 82801AA IDE | ||
| 9010 | 2412 82801AA USB | ||
| 9011 | 2413 82801AA SMBus | ||
| 9012 | 2415 82801AA AC'97 Audio | ||
| 9013 | 1028 0095 Precision Workstation 220 Integrated Digital Audio | ||
| 9014 | 11d4 0040 SoundMAX Integrated Digital Audio | ||
| 9015 | 11d4 0048 SoundMAX Integrated Digital Audio | ||
| 9016 | 11d4 5340 SoundMAX Integrated Digital Audio | ||
| 9017 | 2416 82801AA AC'97 Modem | ||
| 9018 | 2418 82801AA PCI Bridge | ||
| 9019 | 2420 82801AB ISA Bridge (LPC) | ||
| 9020 | 2421 82801AB IDE | ||
| 9021 | 2422 82801AB USB | ||
| 9022 | 2423 82801AB SMBus | ||
| 9023 | 2425 82801AB AC'97 Audio | ||
| 9024 | 11d4 0040 SoundMAX Integrated Digital Audio | ||
| 9025 | 11d4 0048 SoundMAX Integrated Digital Audio | ||
| 9026 | 2426 82801AB AC'97 Modem | ||
| 9027 | 2428 82801AB PCI Bridge | ||
| 9028 | 2440 82801BA ISA Bridge (LPC) | ||
| 9029 | 2442 82801BA/BAM USB (Hub #1) | ||
| 9030 | 1014 01c6 Netvista A40/A40p | ||
| 9031 | 1025 1016 Travelmate 612 TX | ||
| 9032 | 1028 010e Optiplex GX240 | ||
| 9033 | 1043 8027 TUSL2-C Mainboard | ||
| 9034 | 104d 80df Vaio PCG-FX403 | ||
| 9035 | 147b 0507 TH7II-RAID | ||
| 9036 | 8086 4532 D815EEA2 mainboard | ||
| 9037 | 8086 4557 D815EGEW Mainboard | ||
| 9038 | 2443 82801BA/BAM SMBus | ||
| 9039 | 1014 01c6 Netvista A40/A40p | ||
| 9040 | 1025 1016 Travelmate 612 TX | ||
| 9041 | 1028 010e Optiplex GX240 | ||
| 9042 | 1043 8027 TUSL2-C Mainboard | ||
| 9043 | 104d 80df Vaio PCG-FX403 | ||
| 9044 | 147b 0507 TH7II-RAID | ||
| 9045 | 8086 4532 D815EEA2 mainboard | ||
| 9046 | 8086 4557 D815EGEW Mainboard | ||
| 9047 | 2444 82801BA/BAM USB (Hub #2) | ||
| 9048 | 1025 1016 Travelmate 612 TX | ||
| 9049 | 1028 010e Optiplex GX240 | ||
| 9050 | 1043 8027 TUSL2-C Mainboard | ||
| 9051 | 104d 80df Vaio PCG-FX403 | ||
| 9052 | 147b 0507 TH7II-RAID | ||
| 9053 | 8086 4532 D815EEA2 mainboard | ||
| 9054 | 2445 82801BA/BAM AC'97 Audio | ||
| 9055 | 1014 01c6 Netvista A40/A40p | ||
| 9056 | 1025 1016 Travelmate 612 TX | ||
| 9057 | 104d 80df Vaio PCG-FX403 | ||
| 9058 | 1462 3370 STAC9721 AC | ||
| 9059 | 147b 0507 TH7II-RAID | ||
| 9060 | 8086 4557 D815EGEW Mainboard | ||
| 9061 | 2446 82801BA/BAM AC'97 Modem | ||
| 9062 | 1025 1016 Travelmate 612 TX | ||
| 9063 | 104d 80df Vaio PCG-FX403 | ||
| 9064 | 2448 82801 Mobile PCI Bridge | ||
| 9065 | 2449 82801BA/BAM/CA/CAM Ethernet Controller | ||
| 9066 | 0e11 0012 EtherExpress PRO/100 VM | ||
| 9067 | 0e11 0091 EtherExpress PRO/100 VE | ||
| 9068 | 1014 01ce EtherExpress PRO/100 VE | ||
| 9069 | 1014 01dc EtherExpress PRO/100 VE | ||
| 9070 | 1014 01eb EtherExpress PRO/100 VE | ||
| 9071 | 1014 01ec EtherExpress PRO/100 VE | ||
| 9072 | 1014 0202 EtherExpress PRO/100 VE | ||
| 9073 | 1014 0205 EtherExpress PRO/100 VE | ||
| 9074 | 1014 0217 EtherExpress PRO/100 VE | ||
| 9075 | 1014 0234 EtherExpress PRO/100 VE | ||
| 9076 | 1014 023d EtherExpress PRO/100 VE | ||
| 9077 | 1014 0244 EtherExpress PRO/100 VE | ||
| 9078 | 1014 0245 EtherExpress PRO/100 VE | ||
| 9079 | 1014 0265 PRO/100 VE Desktop Connection | ||
| 9080 | 1014 0267 PRO/100 VE Desktop Connection | ||
| 9081 | 1014 026a PRO/100 VE Desktop Connection | ||
| 9082 | 109f 315d EtherExpress PRO/100 VE | ||
| 9083 | 109f 3181 EtherExpress PRO/100 VE | ||
| 9084 | 1179 ff01 PRO/100 VE Network Connection | ||
| 9085 | 1186 7801 EtherExpress PRO/100 VE | ||
| 9086 | 144d 2602 HomePNA 1M CNR | ||
| 9087 | 8086 3010 EtherExpress PRO/100 VE | ||
| 9088 | 8086 3011 EtherExpress PRO/100 VM | ||
| 9089 | 8086 3012 82562EH based Phoneline | ||
| 9090 | 8086 3013 EtherExpress PRO/100 VE | ||
| 9091 | 8086 3014 EtherExpress PRO/100 VM | ||
| 9092 | 8086 3015 82562EH based Phoneline | ||
| 9093 | 8086 3016 EtherExpress PRO/100 P Mobile Combo | ||
| 9094 | 8086 3017 EtherExpress PRO/100 P Mobile | ||
| 9095 | 8086 3018 EtherExpress PRO/100 | ||
| 9096 | 244a 82801BAM IDE U100 | ||
| 9097 | 1025 1016 Travelmate 612TX | ||
| 9098 | 104d 80df Vaio PCG-FX403 | ||
| 9099 | 244b 82801BA IDE U100 | ||
| 9100 | 1014 01c6 Netvista A40/A40p | ||
| 9101 | 1028 010e Optiplex GX240 | ||
| 9102 | 1043 8027 TUSL2-C Mainboard | ||
| 9103 | 147b 0507 TH7II-RAID | ||
| 9104 | 8086 4532 D815EEA2 mainboard | ||
| 9105 | 8086 4557 D815EGEW Mainboard | ||
| 9106 | 244c 82801BAM ISA Bridge (LPC) | ||
| 9107 | 244e 82801 PCI Bridge | ||
| 9108 | 1014 0267 NetVista A30p | ||
| 9109 | 2450 82801E ISA Bridge (LPC) | ||
| 9110 | 2452 82801E USB | ||
| 9111 | 2453 82801E SMBus | ||
| 9112 | 2459 82801E Ethernet Controller 0 | ||
| 9113 | 245b 82801E IDE U100 | ||
| 9114 | 245d 82801E Ethernet Controller 1 | ||
| 9115 | 245e 82801E PCI Bridge | ||
| 9116 | 2480 82801CA LPC Interface Controller | ||
| 9117 | 2482 82801CA/CAM USB (Hub #1) | ||
| 9118 | 1014 0220 ThinkPad A/T/X Series | ||
| 9119 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9120 | 15d9 3480 P4DP6 | ||
| 9121 | 8086 1958 vpr Matrix 170B4 | ||
| 9122 | 8086 3424 SE7501HG2 Mainboard | ||
| 9123 | 8086 4541 Latitude C640 | ||
| 9124 | 2483 82801CA/CAM SMBus Controller | ||
| 9125 | 1014 0220 ThinkPad A/T/X Series | ||
| 9126 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9127 | 15d9 3480 P4DP6 | ||
| 9128 | 8086 1958 vpr Matrix 170B4 | ||
| 9129 | 2484 82801CA/CAM USB (Hub #2) | ||
| 9130 | 1014 0220 ThinkPad A/T/X Series | ||
| 9131 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9132 | 15d9 3480 P4DP6 | ||
| 9133 | 8086 1958 vpr Matrix 170B4 | ||
| 9134 | 2485 82801CA/CAM AC'97 Audio Controller | ||
| 9135 | 1013 5959 Crystal WMD Audio Codec | ||
| 9136 | 1014 0222 ThinkPad T23 (2647-4MG) or A30/A30p (2652/2653) | ||
| 9137 | 1014 0508 ThinkPad T30 | ||
| 9138 | 1014 051c ThinkPad A/T/X Series | ||
| 9139 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9140 | 144d c006 vpr Matrix 170B4 | ||
| 9141 | 2486 82801CA/CAM AC'97 Modem Controller | ||
| 9142 | 1014 0223 ThinkPad A/T/X Series | ||
| 9143 | 1014 0503 ThinkPad R31 2656BBG | ||
| 9144 | 1014 051a ThinkPad A/T/X Series | ||
| 9145 | 101f 1025 Acer 620 Series | ||
| 9146 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9147 | 1179 0001 Toshiba Satellite 1110 Z15 internal Modem | ||
| 9148 | 134d 4c21 Dell Inspiron 2100 internal modem | ||
| 9149 | 144d 2115 vpr Matrix 170B4 internal modem | ||
| 9150 | 14f1 5421 MD56ORD V.92 MDC Modem | ||
| 9151 | 2487 82801CA/CAM USB (Hub #3) | ||
| 9152 | 1014 0220 ThinkPad A/T/X Series | ||
| 9153 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9154 | 15d9 3480 P4DP6 | ||
| 9155 | 8086 1958 vpr Matrix 170B4 | ||
| 9156 | 248a 82801CAM IDE U100 | ||
| 9157 | 1014 0220 ThinkPad A/T/X Series | ||
| 9158 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9159 | 8086 1958 vpr Matrix 170B4 | ||
| 9160 | 8086 4541 Latitude C640 | ||
| 9161 | 248b 82801CA Ultra ATA Storage Controller | ||
| 9162 | 15d9 3480 P4DP6 | ||
| 9163 | 248c 82801CAM ISA Bridge (LPC) | ||
| 9164 | 24c0 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge | ||
| 9165 | 1014 0267 NetVista A30p | ||
| 9166 | 1462 5800 845PE Max (MS-6580) | ||
| 9167 | 24c1 82801DBL (ICH4-L) IDE Controller | ||
| 9168 | 24c2 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 | ||
| 9169 | 1014 0267 NetVista A30p | ||
| 9170 | 1025 005a TravelMate 290 | ||
| 9171 | 1028 0126 Optiplex GX260 | ||
| 9172 | 1028 0163 Latitude D505 | ||
| 9173 | 103c 088c nc8000 laptop | ||
| 9174 | 103c 0890 nc6000 laptop | ||
| 9175 | 1071 8160 MIM2000 | ||
| 9176 | 1462 5800 845PE Max (MS-6580) | ||
| 9177 | 1509 2990 Averatec 5110H laptop | ||
| 9178 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9179 | 24c3 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller | ||
| 9180 | 1014 0267 NetVista A30p | ||
| 9181 | 1025 005a TravelMate 290 | ||
| 9182 | 1028 0126 Optiplex GX260 | ||
| 9183 | 103c 088c nc8000 laptop | ||
| 9184 | 103c 0890 nc6000 laptop | ||
| 9185 | 1071 8160 MIM2000 | ||
| 9186 | 1458 24c2 GA-8PE667 Ultra | ||
| 9187 | 1462 5800 845PE Max (MS-6580) | ||
| 9188 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9189 | 24c4 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 | ||
| 9190 | 1014 0267 NetVista A30p | ||
| 9191 | 1025 005a TravelMate 290 | ||
| 9192 | 1028 0126 Optiplex GX260 | ||
| 9193 | 1028 0163 Latitude D505 | ||
| 9194 | 103c 088c nc8000 laptop | ||
| 9195 | 103c 0890 nc6000 laptop | ||
| 9196 | 1071 8160 MIM2000 | ||
| 9197 | 1462 5800 845PE Max (MS-6580) | ||
| 9198 | 1509 2990 Averatec 5110H | ||
| 9199 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9200 | 24c5 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller | ||
| 9201 | 0e11 00b8 Analog Devices Inc. codec [SoundMAX] | ||
| 9202 | 1014 0267 NetVista A30p | ||
| 9203 | 1025 005a TravelMate 290 | ||
| 9204 | 1028 0163 Latitude D505 | ||
| 9205 | 103c 088c nc8000 laptop | ||
| 9206 | 103c 0890 nc6000 laptop | ||
| 9207 | 1071 8160 MIM2000 | ||
| 9208 | 1458 a002 GA-8PE667 Ultra | ||
| 9209 | 1462 5800 845PE Max (MS-6580) | ||
| 9210 | 24c6 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller | ||
| 9211 | 1025 005a TravelMate 290 | ||
| 9212 | 103c 088c nc8000 laptop | ||
| 9213 | 103c 0890 nc6000 laptop | ||
| 9214 | 1071 8160 MIM2000 | ||
| 9215 | 24c7 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 | ||
| 9216 | 1014 0267 NetVista A30p | ||
| 9217 | 1025 005a TravelMate 290 | ||
| 9218 | 1028 0126 Optiplex GX260 | ||
| 9219 | 1028 0163 Latitude D505 | ||
| 9220 | 103c 088c nc8000 laptop | ||
| 9221 | 103c 0890 nc6000 laptop | ||
| 9222 | 1071 8160 MIM2000 | ||
| 9223 | 1462 5800 845PE Max (MS-6580) | ||
| 9224 | 1509 2990 Averatec 5110H | ||
| 9225 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9226 | 24ca 82801DBM (ICH4-M) IDE Controller | ||
| 9227 | 1025 005a TravelMate 290 | ||
| 9228 | 1028 0163 Latitude D505 | ||
| 9229 | 103c 088c nc8000 laptop | ||
| 9230 | 103c 0890 nc6000 laptop | ||
| 9231 | 1071 8160 MIM2000 | ||
| 9232 | 24cb 82801DB (ICH4) IDE Controller | ||
| 9233 | 1014 0267 NetVista A30p | ||
| 9234 | 1028 0126 Optiplex GX260 | ||
| 9235 | 1458 24c2 GA-8PE667 Ultra | ||
| 9236 | 1462 5800 845PE Max (MS-6580) | ||
| 9237 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9238 | 24cc 82801DBM (ICH4-M) LPC Interface Bridge | ||
| 9239 | 24cd 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller | ||
| 9240 | 1014 0267 NetVista A30p | ||
| 9241 | 1025 005a TravelMate 290 | ||
| 9242 | 1028 0126 Optiplex GX260 | ||
| 9243 | 1028 0163 Latitude D505 | ||
| 9244 | 103c 088c nc8000 laptop | ||
| 9245 | 103c 0890 nc6000 laptop | ||
| 9246 | 1071 8160 MIM2000 | ||
| 9247 | 1462 3981 845PE Max (MS-6580) | ||
| 9248 | 1509 1968 Averatec 5110H | ||
| 9249 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9250 | 24d0 82801EB/ER (ICH5/ICH5R) LPC Interface Bridge | ||
| 9251 | 24d1 82801EB (ICH5) SATA Controller | ||
| 9252 | 103c 12bc d530 CMT (DG746A) | ||
| 9253 | 1458 24d1 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9254 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9255 | 8086 3427 S875WP1-E mainboard | ||
| 9256 | 8086 524c D865PERL mainboard | ||
| 9257 | 24d2 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #1 | ||
| 9258 | 1028 0183 PowerEdge 1800 | ||
| 9259 | 103c 12bc d530 CMT (DG746A) | ||
| 9260 | 1043 80a6 P4P800 Mainboard | ||
| 9261 | 1458 24d2 GA-8IPE1000/8KNXP motherboard | ||
| 9262 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9263 | 8086 3427 S875WP1-E mainboard | ||
| 9264 | 8086 524c D865PERL mainboard | ||
| 9265 | 24d3 82801EB/ER (ICH5/ICH5R) SMBus Controller | ||
| 9266 | 1043 80a6 P4P800 Mainboard | ||
| 9267 | 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9268 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9269 | 8086 3427 S875WP1-E mainboard | ||
| 9270 | 8086 524c D865PERL mainboard | ||
| 9271 | 24d4 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #2 | ||
| 9272 | 1028 0183 PowerEdge 1800 | ||
| 9273 | 103c 12bc d530 CMT (DG746A) | ||
| 9274 | 1043 80a6 P4P800 Mainboard | ||
| 9275 | 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9276 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9277 | 8086 3427 S875WP1-E mainboard | ||
| 9278 | 8086 524c D865PERL mainboard | ||
| 9279 | 24d5 82801EB/ER (ICH5/ICH5R) AC'97 Audio Controller | ||
| 9280 | 103c 12bc Analog Devices codec [SoundMAX Integrated Digital Audio] | ||
| 9281 | 1043 80f3 P4P800 Mainboard | ||
| 9282 | # Again, I suppose they use the same in different subsystems | ||
| 9283 | 1458 a002 GA-8IPE1000/8KNXP motherboard | ||
| 9284 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9285 | 8086 a000 D865PERL mainboard | ||
| 9286 | 8086 e000 D865PERL mainboard | ||
| 9287 | 24d6 82801EB/ER (ICH5/ICH5R) AC'97 Modem Controller | ||
| 9288 | 24d7 82801EB/ER (ICH5/ICH5R) USB UHCI #3 | ||
| 9289 | 1028 0183 PowerEdge 1800 | ||
| 9290 | 103c 12bc d530 CMT (DG746A) | ||
| 9291 | 1043 80a6 P4P800 Mainboard | ||
| 9292 | 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9293 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9294 | 8086 3427 S875WP1-E mainboard | ||
| 9295 | 8086 524c D865PERL mainboard | ||
| 9296 | 24db 82801EB/ER (ICH5/ICH5R) IDE Controller | ||
| 9297 | 103c 12bc d530 CMT (DG746A) | ||
| 9298 | 1043 80a6 P4P800 Mainboard | ||
| 9299 | 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9300 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9301 | 1462 7580 MSI 875P | ||
| 9302 | 8086 24db P4C800 Mainboard | ||
| 9303 | 8086 3427 S875WP1-E mainboard | ||
| 9304 | 8086 524c D865PERL mainboard | ||
| 9305 | 24dc 82801EB (ICH5) LPC Interface Bridge | ||
| 9306 | 24dd 82801EB/ER (ICH5/ICH5R) USB2 EHCI Controller | ||
| 9307 | 1028 0183 PowerEdge 1800 | ||
| 9308 | 103c 12bc d530 CMT (DG746A) | ||
| 9309 | 1043 80a6 P4P800 Mainboard | ||
| 9310 | 1458 5006 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9311 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9312 | 8086 3427 S875WP1-E mainboard | ||
| 9313 | 8086 524c D865PERL mainboard | ||
| 9314 | 24de 82801EB/ER (ICH5/ICH5R) USB UHCI Controller #4 | ||
| 9315 | 1043 80a6 P4P800 Mainboard | ||
| 9316 | 1458 24d2 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9317 | 1462 7280 865PE Neo2 (MS-6728) | ||
| 9318 | 8086 3427 S875WP1-E mainboard | ||
| 9319 | 8086 524c D865PERL mainboard | ||
| 9320 | 24df 82801ER (ICH5R) SATA Controller | ||
| 9321 | 2500 82820 820 (Camino) Chipset Host Bridge (MCH) | ||
| 9322 | 1028 0095 Precision Workstation 220 Chipset | ||
| 9323 | 1043 801c P3C-2000 system chipset | ||
| 9324 | 2501 82820 820 (Camino) Chipset Host Bridge (MCH) | ||
| 9325 | 1043 801c P3C-2000 system chipset | ||
| 9326 | 250b 82820 820 (Camino) Chipset Host Bridge | ||
| 9327 | 250f 82820 820 (Camino) Chipset AGP Bridge | ||
| 9328 | 2520 82805AA MTH Memory Translator Hub | ||
| 9329 | 2521 82804AA MRH-S Memory Repeater Hub for SDRAM | ||
| 9330 | 2530 82850 850 (Tehama) Chipset Host Bridge (MCH) | ||
| 9331 | 147b 0507 TH7II-RAID | ||
| 9332 | 2531 82860 860 (Wombat) Chipset Host Bridge (MCH) | ||
| 9333 | 2532 82850 850 (Tehama) Chipset AGP Bridge | ||
| 9334 | 2533 82860 860 (Wombat) Chipset AGP Bridge | ||
| 9335 | 2534 82860 860 (Wombat) Chipset PCI Bridge | ||
| 9336 | 2540 E7500 Memory Controller Hub | ||
| 9337 | 15d9 3480 P4DP6 | ||
| 9338 | 2541 E7500/E7501 Host RASUM Controller | ||
| 9339 | 15d9 3480 P4DP6 | ||
| 9340 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9341 | 8086 3424 SE7501HG2 Mainboard | ||
| 9342 | 2543 E7500/E7501 Hub Interface B PCI-to-PCI Bridge | ||
| 9343 | 2544 E7500/E7501 Hub Interface B RASUM Controller | ||
| 9344 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9345 | 2545 E7500/E7501 Hub Interface C PCI-to-PCI Bridge | ||
| 9346 | 2546 E7500/E7501 Hub Interface C RASUM Controller | ||
| 9347 | 2547 E7500/E7501 Hub Interface D PCI-to-PCI Bridge | ||
| 9348 | 2548 E7500/E7501 Hub Interface D RASUM Controller | ||
| 9349 | 254c E7501 Memory Controller Hub | ||
| 9350 | 4c53 1090 Cx9 / Vx9 mainboard | ||
| 9351 | 8086 3424 SE7501HG2 Mainboard | ||
| 9352 | 2550 E7505 Memory Controller Hub | ||
| 9353 | 2551 E7505/E7205 Series RAS Controller | ||
| 9354 | 2552 E7505/E7205 PCI-to-AGP Bridge | ||
| 9355 | 2553 E7505 Hub Interface B PCI-to-PCI Bridge | ||
| 9356 | 2554 E7505 Hub Interface B PCI-to-PCI Bridge RAS Controller | ||
| 9357 | 255d E7205 Memory Controller Hub | ||
| 9358 | 2560 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface | ||
| 9359 | 1028 0126 Optiplex GX260 | ||
| 9360 | 1458 2560 GA-8PE667 Ultra | ||
| 9361 | 1462 5800 845PE Max (MS-6580) | ||
| 9362 | 2561 82845G/GL[Brookdale-G]/GE/PE Host-to-AGP Bridge | ||
| 9363 | 2562 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device | ||
| 9364 | 1014 0267 NetVista A30p | ||
| 9365 | 2570 82865G/PE/P DRAM Controller/Host-Hub Interface | ||
| 9366 | 1043 80f2 P4P800 Mainboard | ||
| 9367 | 1458 2570 GA-8IPE1000 Pro2 motherboard (865PE) | ||
| 9368 | 2571 82865G/PE/P PCI to AGP Controller | ||
| 9369 | 2572 82865G Integrated Graphics Controller | ||
| 9370 | 2573 82865G/PE/P PCI to CSA Bridge | ||
| 9371 | 2576 82865G/PE/P Processor to I/O Memory Interface | ||
| 9372 | 2578 82875P/E7210 Memory Controller Hub | ||
| 9373 | 1458 2578 GA-8KNXP motherboard (875P) | ||
| 9374 | 1462 7580 MS-6758 (875P Neo) | ||
| 9375 | # Motherboard P4SCE | ||
| 9376 | 15d9 4580 Super Micro Computer Inc. P4SCE | ||
| 9377 | 2579 82875P Processor to AGP Controller | ||
| 9378 | 257b 82875P/E7210 Processor to PCI to CSA Bridge | ||
| 9379 | 257e 82875P/E7210 Processor to I/O Memory Interface | ||
| 9380 | 2580 915G/P/GV/GL/PL/910GL Processor to I/O Controller | ||
| 9381 | 2581 915G/P/GV/GL/PL/910GL PCI Express Root Port | ||
| 9382 | 2582 82915G/GV/910GL Express Chipset Family Graphics Controller | ||
| 9383 | 1028 1079 Optiplex GX280 | ||
| 9384 | 2584 925X/XE Memory Controller Hub | ||
| 9385 | 2585 925X/XE PCI Express Root Port | ||
| 9386 | 2588 E7220/E7221 Memory Controller Hub | ||
| 9387 | 2589 E7220/E7221 PCI Express Root Port | ||
| 9388 | 258a E7221 Integrated Graphics Controller | ||
| 9389 | 2590 Mobile 915GM/PM/GMS/910GML Express Processor to DRAM Controller | ||
| 9390 | 2591 Mobile 915GM/PM Express PCI Express Root Port | ||
| 9391 | 2592 Mobile 915GM/GMS/910GML Express Graphics Controller | ||
| 9392 | 25a1 6300ESB LPC Interface Controller | ||
| 9393 | 25a2 6300ESB PATA Storage Controller | ||
| 9394 | 4c53 10b0 CL9 mainboard | ||
| 9395 | 25a3 6300ESB SATA Storage Controller | ||
| 9396 | 4c53 10b0 CL9 mainboard | ||
| 9397 | 25a4 6300ESB SMBus Controller | ||
| 9398 | 4c53 10b0 CL9 mainboard | ||
| 9399 | 25a6 6300ESB AC'97 Audio Controller | ||
| 9400 | 4c53 10b0 CL9 mainboard | ||
| 9401 | 25a7 6300ESB AC'97 Modem Controller | ||
| 9402 | 25a9 6300ESB USB Universal Host Controller | ||
| 9403 | 4c53 10b0 CL9 mainboard | ||
| 9404 | 25aa 6300ESB USB Universal Host Controller | ||
| 9405 | 4c53 10b0 CL9 mainboard | ||
| 9406 | 25ab 6300ESB Watchdog Timer | ||
| 9407 | 4c53 10b0 CL9 mainboard | ||
| 9408 | 25ac 6300ESB I/O Advanced Programmable Interrupt Controller | ||
| 9409 | 4c53 10b0 CL9 mainboard | ||
| 9410 | 25ad 6300ESB USB2 Enhanced Host Controller | ||
| 9411 | 25ae 6300ESB 64-bit PCI-X Bridge | ||
| 9412 | 25b0 6300ESB SATA RAID Controller | ||
| 9413 | 2600 E8500 Hub Interface | ||
| 9414 | 2601 E8500 PCI Express x4 Port D | ||
| 9415 | 2602 E8500 PCI Express x4 Port C0 | ||
| 9416 | 2603 E8500 PCI Express x4 Port C1 | ||
| 9417 | 2604 E8500 PCI Express x4 Port B0 | ||
| 9418 | 2605 E8500 PCI Express x4 Port B1 | ||
| 9419 | 2606 E8500 PCI Express x4 Port A0 | ||
| 9420 | 2607 E8500 PCI Express x4 Port A1 | ||
| 9421 | 2608 E8500 PCI Express x8 Port C | ||
| 9422 | 2609 E8500 PCI Express x8 Port B | ||
| 9423 | 260a E8500 PCI Express x8 Port A | ||
| 9424 | 260c E8500 IMI Registers | ||
| 9425 | 2610 E8500 System Bus, Boot, and Interrupt Registers | ||
| 9426 | 2611 E8500 Address Mapping Registers | ||
| 9427 | 2612 E8500 RAS Registers | ||
| 9428 | 2613 E8500 Reserved Registers | ||
| 9429 | 2614 E8500 Reserved Registers | ||
| 9430 | 2615 E8500 Miscellaneous Registers | ||
| 9431 | 2617 E8500 Reserved Registers | ||
| 9432 | 2618 E8500 Reserved Registers | ||
| 9433 | 2619 E8500 Reserved Registers | ||
| 9434 | 261a E8500 Reserved Registers | ||
| 9435 | 261b E8500 Reserved Registers | ||
| 9436 | 261c E8500 Reserved Registers | ||
| 9437 | 261d E8500 Reserved Registers | ||
| 9438 | 261e E8500 Reserved Registers | ||
| 9439 | 2620 E8500 eXternal Memory Bridge | ||
| 9440 | 2621 E8500 XMB Miscellaneous Registers | ||
| 9441 | 2622 E8500 XMB Memory Interleaving Registers | ||
| 9442 | 2623 E8500 XMB DDR Initialization and Calibration | ||
| 9443 | 2624 E8500 XMB Reserved Registers | ||
| 9444 | 2625 E8500 XMB Reserved Registers | ||
| 9445 | 2626 E8500 XMB Reserved Registers | ||
| 9446 | 2627 E8500 XMB Reserved Registers | ||
| 9447 | 2640 82801FB/FR (ICH6/ICH6R) LPC Interface Bridge | ||
| 9448 | 2641 82801FBM (ICH6M) LPC Interface Bridge | ||
| 9449 | 2642 82801FW/FRW (ICH6W/ICH6RW) LPC Interface Bridge | ||
| 9450 | 2651 82801FB/FW (ICH6/ICH6W) SATA Controller | ||
| 9451 | 1028 0179 Optiplex GX280 | ||
| 9452 | 2652 82801FR/FRW (ICH6R/ICH6RW) SATA Controller | ||
| 9453 | 2653 82801FBM (ICH6M) SATA Controller | ||
| 9454 | 2658 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #1 | ||
| 9455 | 1028 0179 Optiplex GX280 | ||
| 9456 | 2659 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #2 | ||
| 9457 | 1028 0179 Optiplex GX280 | ||
| 9458 | 265a 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #3 | ||
| 9459 | 1028 0179 Optiplex GX280 | ||
| 9460 | 265b 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB UHCI #4 | ||
| 9461 | 1028 0179 Optiplex GX280 | ||
| 9462 | 265c 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller | ||
| 9463 | 1028 0179 Optiplex GX280 | ||
| 9464 | 2660 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 1 | ||
| 9465 | 2662 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 2 | ||
| 9466 | 2664 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 3 | ||
| 9467 | 2666 82801FB/FBM/FR/FW/FRW (ICH6 Family) PCI Express Port 4 | ||
| 9468 | 2668 82801FB/FBM/FR/FW/FRW (ICH6 Family) High Definition Audio Controller | ||
| 9469 | 266a 82801FB/FBM/FR/FW/FRW (ICH6 Family) SMBus Controller | ||
| 9470 | 1028 0179 Optiplex GX280 | ||
| 9471 | 266c 82801FB/FBM/FR/FW/FRW (ICH6 Family) LAN Controller | ||
| 9472 | 266d 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Modem Controller | ||
| 9473 | 266e 82801FB/FBM/FR/FW/FRW (ICH6 Family) AC'97 Audio Controller | ||
| 9474 | 1028 0179 Optiplex GX280 | ||
| 9475 | 266f 82801FB/FBM/FR/FW/FRW (ICH6 Family) IDE Controller | ||
| 9476 | 2770 Memory Controller Hub | ||
| 9477 | 2771 PCI Express Graphics Port | ||
| 9478 | 2772 Integrated Graphics Controller | ||
| 9479 | 2774 Workstation Memory Controller Hub | ||
| 9480 | 2775 PCI Express Graphics Port | ||
| 9481 | 2776 Integrated Graphics Controller | ||
| 9482 | 2778 Server Memory Controller Hub | ||
| 9483 | 2779 PCI Express Root Port | ||
| 9484 | 2782 82915G Express Chipset Family Graphics Controller | ||
| 9485 | 2792 Mobile 915GM/GMS/910GML Express Graphics Controller | ||
| 9486 | 27b8 I/O Controller Hub LPC | ||
| 9487 | 27b9 Mobile I/O Controller Hub LPC | ||
| 9488 | 27c0 I/O Controller Hub SATA cc=IDE | ||
| 9489 | 27c1 I/O Controller Hub SATA cc=AHCI | ||
| 9490 | 27c3 I/O Controller Hub SATA cc=RAID | ||
| 9491 | 27c4 Mobile I/O Controller Hub SATA cc=IDE | ||
| 9492 | 27c5 Mobile I/O Controller Hub SATA cc=AHCI | ||
| 9493 | 27c8 I/O Controller Hub UHCI USB #1 | ||
| 9494 | 27c9 I/O Controller Hub UHCI USB #2 | ||
| 9495 | 27ca I/O Controller Hub UHCI USB #3 | ||
| 9496 | 27cb I/O Controller Hub UHCI USB #4 | ||
| 9497 | 27cc I/O Controller Hub EHCI USB | ||
| 9498 | 27d0 I/O Controller Hub PCI Express Port 1 | ||
| 9499 | 27d2 I/O Controller Hub PCI Express Port 2 | ||
| 9500 | 27d4 I/O Controller Hub PCI Express Port 3 | ||
| 9501 | 27d6 I/O Controller Hub PCI Express Port 4 | ||
| 9502 | 27d8 I/O Controller Hub High Definition Audio | ||
| 9503 | 27da I/O Controller Hub SMBus | ||
| 9504 | 27dc I/O Controller Hub LAN | ||
| 9505 | 27dd I/O Controller Hub AC'97 Modem | ||
| 9506 | 27de I/O Controller Hub AC'97 Audio | ||
| 9507 | 27df I/O Controller Hub PATA | ||
| 9508 | 27e0 I/O Controller Hub PCI Express Port 5 | ||
| 9509 | 27e2 I/O Controller Hub PCI Express Port 6 | ||
| 9510 | 3092 Integrated RAID | ||
| 9511 | 3200 GD31244 PCI-X SATA HBA | ||
| 9512 | 3340 82855PM Processor to I/O Controller | ||
| 9513 | 1025 005a TravelMate 290 | ||
| 9514 | 103c 088c nc8000 laptop | ||
| 9515 | 103c 0890 nc6000 laptop | ||
| 9516 | 3341 82855PM Processor to AGP Controller | ||
| 9517 | 3575 82830 830 Chipset Host Bridge | ||
| 9518 | 1014 021d ThinkPad A/T/X Series | ||
| 9519 | 104d 80e7 VAIO PCG-GR214EP/GR214MP/GR215MP/GR314MP/GR315MP | ||
| 9520 | 3576 82830 830 Chipset AGP Bridge | ||
| 9521 | 3577 82830 CGC [Chipset Graphics Controller] | ||
| 9522 | 1014 0513 ThinkPad A/T/X Series | ||
| 9523 | 3578 82830 830 Chipset Host Bridge | ||
| 9524 | 3580 82852/82855 GM/GME/PM/GMV Processor to I/O Controller | ||
| 9525 | 1028 0163 Latitude D505 | ||
| 9526 | 4c53 10b0 CL9 mainboard | ||
| 9527 | 3581 82852/82855 GM/GME/PM/GMV Processor to AGP Controller | ||
| 9528 | 3582 82852/855GM Integrated Graphics Device | ||
| 9529 | 1028 0163 Latitude D505 | ||
| 9530 | 4c53 10b0 CL9 mainboard | ||
| 9531 | 3584 82852/82855 GM/GME/PM/GMV Processor to I/O Controller | ||
| 9532 | 1028 0163 Latitude D505 | ||
| 9533 | 4c53 10b0 CL9 mainboard | ||
| 9534 | 3585 82852/82855 GM/GME/PM/GMV Processor to I/O Controller | ||
| 9535 | 1028 0163 Latitude D505 | ||
| 9536 | 4c53 10b0 CL9 mainboard | ||
| 9537 | 3590 E7520 Memory Controller Hub | ||
| 9538 | 3591 E7525/E7520 Error Reporting Registers | ||
| 9539 | 3592 E7320 Memory Controller Hub | ||
| 9540 | 3593 E7320 Error Reporting Registers | ||
| 9541 | 3594 E7520 DMA Controller | ||
| 9542 | 3595 E7525/E7520/E7320 PCI Express Port A | ||
| 9543 | 3596 E7525/E7520/E7320 PCI Express Port A1 | ||
| 9544 | 3597 E7525/E7520 PCI Express Port B | ||
| 9545 | 3598 E7520 PCI Express Port B1 | ||
| 9546 | 3599 E7520 PCI Express Port C | ||
| 9547 | 359a E7520 PCI Express Port C1 | ||
| 9548 | 359b E7525/E7520/E7320 Extended Configuration Registers | ||
| 9549 | 359e E7525 Memory Controller Hub | ||
| 9550 | 4220 PRO/Wireless 2200BG | ||
| 9551 | 4223 PRO/Wireless 2915ABG MiniPCI Adapter | ||
| 9552 | 5200 EtherExpress PRO/100 Intelligent Server | ||
| 9553 | 5201 EtherExpress PRO/100 Intelligent Server | ||
| 9554 | 8086 0001 EtherExpress PRO/100 Server Ethernet Adapter | ||
| 9555 | 530d 80310 IOP [IO Processor] | ||
| 9556 | 7000 82371SB PIIX3 ISA [Natoma/Triton II] | ||
| 9557 | 7010 82371SB PIIX3 IDE [Natoma/Triton II] | ||
| 9558 | 7020 82371SB PIIX3 USB [Natoma/Triton II] | ||
| 9559 | 7030 430VX - 82437VX TVX [Triton VX] | ||
| 9560 | 7050 Intel Intercast Video Capture Card | ||
| 9561 | 7100 430TX - 82439TX MTXC | ||
| 9562 | 7110 82371AB/EB/MB PIIX4 ISA | ||
| 9563 | 15ad 1976 virtualHW v3 | ||
| 9564 | 7111 82371AB/EB/MB PIIX4 IDE | ||
| 9565 | 15ad 1976 virtualHW v3 | ||
| 9566 | 7112 82371AB/EB/MB PIIX4 USB | ||
| 9567 | 15ad 1976 virtualHW v3 | ||
| 9568 | 7113 82371AB/EB/MB PIIX4 ACPI | ||
| 9569 | 15ad 1976 virtualHW v3 | ||
| 9570 | 7120 82810 GMCH [Graphics Memory Controller Hub] | ||
| 9571 | 4c53 1040 CL7 mainboard | ||
| 9572 | 4c53 1060 PC7 mainboard | ||
| 9573 | 7121 82810 CGC [Chipset Graphics Controller] | ||
| 9574 | 4c53 1040 CL7 mainboard | ||
| 9575 | 4c53 1060 PC7 mainboard | ||
| 9576 | 8086 4341 Cayman (CA810) Mainboard | ||
| 9577 | 7122 82810 DC-100 GMCH [Graphics Memory Controller Hub] | ||
| 9578 | 7123 82810 DC-100 CGC [Chipset Graphics Controller] | ||
| 9579 | 7124 82810E DC-133 GMCH [Graphics Memory Controller Hub] | ||
| 9580 | 7125 82810E DC-133 CGC [Chipset Graphics Controller] | ||
| 9581 | 7126 82810 DC-133 System and Graphics Controller | ||
| 9582 | 7128 82810-M DC-100 System and Graphics Controller | ||
| 9583 | 712a 82810-M DC-133 System and Graphics Controller | ||
| 9584 | 7180 440LX/EX - 82443LX/EX Host bridge | ||
| 9585 | 7181 440LX/EX - 82443LX/EX AGP bridge | ||
| 9586 | 7190 440BX/ZX/DX - 82443BX/ZX/DX Host bridge | ||
| 9587 | 0e11 0500 Armada 1750 Laptop System Chipset | ||
| 9588 | 0e11 b110 Armada M700/E500 | ||
| 9589 | 1179 0001 Toshiba Tecra 8100 Laptop System Chipset | ||
| 9590 | 15ad 1976 virtualHW v3 | ||
| 9591 | 4c53 1050 CT7 mainboard | ||
| 9592 | 4c53 1051 CE7 mainboard | ||
| 9593 | 7191 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge | ||
| 9594 | 7192 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled) | ||
| 9595 | 0e11 0460 Armada 1700 Laptop System Chipset | ||
| 9596 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 9597 | 7194 82440MX Host Bridge | ||
| 9598 | 1033 0000 Versa Note Vxi | ||
| 9599 | 4c53 10a0 CA3/CR3 mainboard | ||
| 9600 | 7195 82440MX AC'97 Audio Controller | ||
| 9601 | 1033 80cc Versa Note VXi | ||
| 9602 | 10cf 1099 QSound_SigmaTel Stac97 PCI Audio | ||
| 9603 | 11d4 0040 SoundMAX Integrated Digital Audio | ||
| 9604 | 11d4 0048 SoundMAX Integrated Digital Audio | ||
| 9605 | 7196 82440MX AC'97 Modem Controller | ||
| 9606 | 7198 82440MX ISA Bridge | ||
| 9607 | 7199 82440MX EIDE Controller | ||
| 9608 | 719a 82440MX USB Universal Host Controller | ||
| 9609 | 719b 82440MX Power Management Controller | ||
| 9610 | 71a0 440GX - 82443GX Host bridge | ||
| 9611 | 4c53 1050 CT7 mainboard | ||
| 9612 | 4c53 1051 CE7 mainboard | ||
| 9613 | 71a1 440GX - 82443GX AGP bridge | ||
| 9614 | 71a2 440GX - 82443GX Host bridge (AGP disabled) | ||
| 9615 | 4c53 1000 CC7/CR7/CP7/VC7/VP7/VR7 mainboard | ||
| 9616 | 7600 82372FB PIIX5 ISA | ||
| 9617 | 7601 82372FB PIIX5 IDE | ||
| 9618 | 7602 82372FB PIIX5 USB | ||
| 9619 | 7603 82372FB PIIX5 SMBus | ||
| 9620 | 7800 82740 (i740) AGP Graphics Accelerator | ||
| 9621 | 003d 0008 Starfighter AGP | ||
| 9622 | 003d 000b Starfighter AGP | ||
| 9623 | 1092 0100 Stealth II G460 | ||
| 9624 | 10b4 201a Lightspeed 740 | ||
| 9625 | 10b4 202f Lightspeed 740 | ||
| 9626 | 8086 0000 Terminator 2x/i | ||
| 9627 | 8086 0100 Intel740 Graphics Accelerator | ||
| 9628 | 84c4 450KX/GX [Orion] - 82454KX/GX PCI bridge | ||
| 9629 | 84c5 450KX/GX [Orion] - 82453KX/GX Memory controller | ||
| 9630 | 84ca 450NX - 82451NX Memory & I/O Controller | ||
| 9631 | 84cb 450NX - 82454NX/84460GX PCI Expander Bridge | ||
| 9632 | 84e0 460GX - 84460GX System Address Controller (SAC) | ||
| 9633 | 84e1 460GX - 84460GX System Data Controller (SDC) | ||
| 9634 | 84e2 460GX - 84460GX AGP Bridge (GXB function 2) | ||
| 9635 | 84e3 460GX - 84460GX Memory Address Controller (MAC) | ||
| 9636 | 84e4 460GX - 84460GX Memory Data Controller (MDC) | ||
| 9637 | 84e6 460GX - 82466GX Wide and fast PCI eXpander Bridge (WXB) | ||
| 9638 | 84ea 460GX - 84460GX AGP Bridge (GXB function 1) | ||
| 9639 | 8500 IXP4XX - Intel Network Processor family. IXP420, IXP421, IXP422, IXP425 and IXC1100 | ||
| 9640 | 1993 0dee mGuard-PCI AV#1 | ||
| 9641 | 1993 0def mGuard-PCI AV#0 | ||
| 9642 | 9000 IXP2000 Family Network Processor | ||
| 9643 | 9001 IXP2400 Network Processor | ||
| 9644 | 9004 IXP2800 Network Processor | ||
| 9645 | 9621 Integrated RAID | ||
| 9646 | 9622 Integrated RAID | ||
| 9647 | 9641 Integrated RAID | ||
| 9648 | 96a1 Integrated RAID | ||
| 9649 | # retail verson | ||
| 9650 | a01f PRO/10GbE LR Server Adapter | ||
| 9651 | # OEM version | ||
| 9652 | a11f PRO/10GbE LR Server Adapter | ||
| 9653 | b152 21152 PCI-to-PCI Bridge | ||
| 9654 | # observed, and documented in Intel revision note; new mask of 1011:0026 | ||
| 9655 | b154 21154 PCI-to-PCI Bridge | ||
| 9656 | b555 21555 Non transparent PCI-to-PCI Bridge | ||
| 9657 | 12d9 000a PCI VoIP Gateway | ||
| 9658 | 4c53 1050 CT7 mainboard | ||
| 9659 | 4c53 1051 CE7 mainboard | ||
| 9660 | e4bf 1000 CC8-1-BLUES | ||
| 9661 | ffff 450NX/GX [Orion] - 82453KX/GX Memory controller [BUG] | ||
| 9662 | 8401 TRENDware International Inc. | ||
| 9663 | 8800 Trigem Computer Inc. | ||
| 9664 | 2008 Video assistent component | ||
| 9665 | 8866 T-Square Design Inc. | ||
| 9666 | 8888 Silicon Magic | ||
| 9667 | # 8c4a is not Winbond but there is a board misprogrammed | ||
| 9668 | 8c4a Winbond | ||
| 9669 | 1980 W89C940 misprogrammed [ne2k] | ||
| 9670 | 8e0e Computone Corporation | ||
| 9671 | 8e2e KTI | ||
| 9672 | 3000 ET32P2 | ||
| 9673 | 9004 Adaptec | ||
| 9674 | 0078 AHA-2940U_CN | ||
| 9675 | 1078 AIC-7810 | ||
| 9676 | 1160 AIC-1160 [Family Fibre Channel Adapter] | ||
| 9677 | 2178 AIC-7821 | ||
| 9678 | 3860 AHA-2930CU | ||
| 9679 | 3b78 AHA-4844W/4844UW | ||
| 9680 | 5075 AIC-755x | ||
| 9681 | 5078 AHA-7850 | ||
| 9682 | 9004 7850 AHA-2904/Integrated AIC-7850 | ||
| 9683 | 5175 AIC-755x | ||
| 9684 | 5178 AIC-7851 | ||
| 9685 | 5275 AIC-755x | ||
| 9686 | 5278 AIC-7852 | ||
| 9687 | 5375 AIC-755x | ||
| 9688 | 5378 AIC-7850 | ||
| 9689 | 5475 AIC-755x | ||
| 9690 | 5478 AIC-7850 | ||
| 9691 | 5575 AVA-2930 | ||
| 9692 | 5578 AIC-7855 | ||
| 9693 | 5647 ANA-7711 TCP Offload Engine | ||
| 9694 | 9004 7710 ANA-7711F TCP Offload Engine - Optical | ||
| 9695 | 9004 7711 ANA-7711LP TCP Offload Engine - Copper | ||
| 9696 | 5675 AIC-755x | ||
| 9697 | 5678 AIC-7856 | ||
| 9698 | 5775 AIC-755x | ||
| 9699 | 5778 AIC-7850 | ||
| 9700 | 5800 AIC-5800 | ||
| 9701 | 5900 ANA-5910/5930/5940 ATM155 & 25 LAN Adapter | ||
| 9702 | 5905 ANA-5910A/5930A/5940A ATM Adapter | ||
| 9703 | 6038 AIC-3860 | ||
| 9704 | 6075 AIC-1480 / APA-1480 | ||
| 9705 | 9004 7560 AIC-1480 / APA-1480 Cardbus | ||
| 9706 | 6078 AIC-7860 | ||
| 9707 | 6178 AIC-7861 | ||
| 9708 | 9004 7861 AHA-2940AU Single | ||
| 9709 | 6278 AIC-7860 | ||
| 9710 | 6378 AIC-7860 | ||
| 9711 | 6478 AIC-786x | ||
| 9712 | 6578 AIC-786x | ||
| 9713 | 6678 AIC-786x | ||
| 9714 | 6778 AIC-786x | ||
| 9715 | 6915 ANA620xx/ANA69011A | ||
| 9716 | 9004 0008 ANA69011A/TX 10/100 | ||
| 9717 | 9004 0009 ANA69011A/TX 10/100 | ||
| 9718 | 9004 0010 ANA62022 2-port 10/100 | ||
| 9719 | 9004 0018 ANA62044 4-port 10/100 | ||
| 9720 | 9004 0019 ANA62044 4-port 10/100 | ||
| 9721 | 9004 0020 ANA62022 2-port 10/100 | ||
| 9722 | 9004 0028 ANA69011A/TX 10/100 | ||
| 9723 | 9004 8008 ANA69011A/TX 64 bit 10/100 | ||
| 9724 | 9004 8009 ANA69011A/TX 64 bit 10/100 | ||
| 9725 | 9004 8010 ANA62022 2-port 64 bit 10/100 | ||
| 9726 | 9004 8018 ANA62044 4-port 64 bit 10/100 | ||
| 9727 | 9004 8019 ANA62044 4-port 64 bit 10/100 | ||
| 9728 | 9004 8020 ANA62022 2-port 64 bit 10/100 | ||
| 9729 | 9004 8028 ANA69011A/TX 64 bit 10/100 | ||
| 9730 | 7078 AHA-294x / AIC-7870 | ||
| 9731 | 7178 AHA-2940/2940W / AIC-7871 | ||
| 9732 | 7278 AHA-3940/3940W / AIC-7872 | ||
| 9733 | 7378 AHA-3985 / AIC-7873 | ||
| 9734 | 7478 AHA-2944/2944W / AIC-7874 | ||
| 9735 | 7578 AHA-3944/3944W / AIC-7875 | ||
| 9736 | 7678 AHA-4944W/UW / AIC-7876 | ||
| 9737 | 7710 ANA-7711F Network Accelerator Card (NAC) - Optical | ||
| 9738 | 7711 ANA-7711C Network Accelerator Card (NAC) - Copper | ||
| 9739 | 7778 AIC-787x | ||
| 9740 | 7810 AIC-7810 | ||
| 9741 | 7815 AIC-7815 RAID+Memory Controller IC | ||
| 9742 | 9004 7815 ARO-1130U2 RAID Controller | ||
| 9743 | 9004 7840 AIC-7815 RAID+Memory Controller IC | ||
| 9744 | 7850 AIC-7850 | ||
| 9745 | 7855 AHA-2930 | ||
| 9746 | 7860 AIC-7860 | ||
| 9747 | 7870 AIC-7870 | ||
| 9748 | 7871 AHA-2940 | ||
| 9749 | 7872 AHA-3940 | ||
| 9750 | 7873 AHA-3980 | ||
| 9751 | 7874 AHA-2944 | ||
| 9752 | 7880 AIC-7880P | ||
| 9753 | 7890 AIC-7890 | ||
| 9754 | 7891 AIC-789x | ||
| 9755 | 7892 AIC-789x | ||
| 9756 | 7893 AIC-789x | ||
| 9757 | 7894 AIC-789x | ||
| 9758 | 7895 AHA-2940U/UW / AHA-39xx / AIC-7895 | ||
| 9759 | 9004 7890 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B | ||
| 9760 | 9004 7891 AHA-2940U/2940UW Dual | ||
| 9761 | 9004 7892 AHA-3940AU/AUW/AUWD/UWD | ||
| 9762 | 9004 7894 AHA-3944AUWD | ||
| 9763 | 9004 7895 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B | ||
| 9764 | 9004 7896 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B | ||
| 9765 | 9004 7897 AHA-2940U/2940UW Dual AHA-394xAU/AUW/AUWD AIC-7895B | ||
| 9766 | 7896 AIC-789x | ||
| 9767 | 7897 AIC-789x | ||
| 9768 | 8078 AIC-7880U | ||
| 9769 | 9004 7880 AIC-7880P Ultra/Ultra Wide SCSI Chipset | ||
| 9770 | 8178 AHA-2940U/UW/D / AIC-7881U | ||
| 9771 | 9004 7881 AHA-2940UW SCSI Host Adapter | ||
| 9772 | 8278 AHA-3940U/UW/UWD / AIC-7882U | ||
| 9773 | 8378 AHA-3940U/UW / AIC-7883U | ||
| 9774 | 8478 AHA-2944UW / AIC-7884U | ||
| 9775 | 8578 AHA-3944U/UWD / AIC-7885 | ||
| 9776 | 8678 AHA-4944UW / AIC-7886 | ||
| 9777 | 8778 AHA-2940UW Pro / AIC-788x | ||
| 9778 | 9004 7887 2940UW Pro Ultra-Wide SCSI Controller | ||
| 9779 | 8878 AHA-2930UW / AIC-7888 | ||
| 9780 | 9004 7888 AHA-2930UW SCSI Controller | ||
| 9781 | 8b78 ABA-1030 | ||
| 9782 | ec78 AHA-4944W/UW | ||
| 9783 | 9005 Adaptec | ||
| 9784 | 0010 AHA-2940U2/U2W | ||
| 9785 | 9005 2180 AHA-2940U2 SCSI Controller | ||
| 9786 | 9005 8100 AHA-2940U2B SCSI Controller | ||
| 9787 | 9005 a100 AHA-2940U2B SCSI Controller | ||
| 9788 | 9005 a180 AHA-2940U2W SCSI Controller | ||
| 9789 | 9005 e100 AHA-2950U2B SCSI Controller | ||
| 9790 | 0011 AHA-2930U2 | ||
| 9791 | 0013 78902 | ||
| 9792 | 9005 0003 AAA-131U2 Array1000 1 Channel RAID Controller | ||
| 9793 | 9005 000f AIC7890_ARO | ||
| 9794 | 001f AHA-2940U2/U2W / 7890/7891 | ||
| 9795 | 9005 000f 2940U2W SCSI Controller | ||
| 9796 | 9005 a180 2940U2W SCSI Controller | ||
| 9797 | 0020 AIC-7890 | ||
| 9798 | 002f AIC-7890 | ||
| 9799 | 0030 AIC-7890 | ||
| 9800 | 003f AIC-7890 | ||
| 9801 | 0050 AHA-3940U2x/395U2x | ||
| 9802 | 9005 f500 AHA-3950U2B | ||
| 9803 | 9005 ffff AHA-3950U2B | ||
| 9804 | 0051 AHA-3950U2D | ||
| 9805 | 9005 b500 AHA-3950U2D | ||
| 9806 | 0053 AIC-7896 SCSI Controller | ||
| 9807 | 9005 ffff AIC-7896 SCSI Controller mainboard implementation | ||
| 9808 | 005f AIC-7896U2/7897U2 | ||
| 9809 | 0080 AIC-7892A U160/m | ||
| 9810 | 0e11 e2a0 Compaq 64-Bit/66MHz Wide Ultra3 SCSI Adapter | ||
| 9811 | 9005 6220 AHA-29160C | ||
| 9812 | 9005 62a0 29160N Ultra160 SCSI Controller | ||
| 9813 | 9005 e220 29160LP Low Profile Ultra160 SCSI Controller | ||
| 9814 | 9005 e2a0 29160 Ultra160 SCSI Controller | ||
| 9815 | 0081 AIC-7892B U160/m | ||
| 9816 | 9005 62a1 19160 Ultra160 SCSI Controller | ||
| 9817 | 0083 AIC-7892D U160/m | ||
| 9818 | 008f AIC-7892P U160/m | ||
| 9819 | 1179 0001 Magnia Z310 | ||
| 9820 | 15d9 9005 Onboard SCSI Host Adapter | ||
| 9821 | 00c0 AHA-3960D / AIC-7899A U160/m | ||
| 9822 | 0e11 f620 Compaq 64-Bit/66MHz Dual Channel Wide Ultra3 SCSI Adapter | ||
| 9823 | 9005 f620 AHA-3960D U160/m | ||
| 9824 | 00c1 AIC-7899B U160/m | ||
| 9825 | 00c3 AIC-7899D U160/m | ||
| 9826 | 00c5 RAID subsystem HBA | ||
| 9827 | 1028 00c5 PowerEdge 2400,2500,2550,4400 | ||
| 9828 | 00cf AIC-7899P U160/m | ||
| 9829 | 1028 00ce PowerEdge 1400 | ||
| 9830 | 1028 00d1 PowerEdge 2550 | ||
| 9831 | 1028 00d9 PowerEdge 2500 | ||
| 9832 | 10f1 2462 Thunder K7 S2462 | ||
| 9833 | 15d9 9005 Onboard SCSI Host Adapter | ||
| 9834 | 8086 3411 SDS2 Mainboard | ||
| 9835 | 0250 ServeRAID Controller | ||
| 9836 | 1014 0279 ServeRAID-xx | ||
| 9837 | 1014 028c ServeRAID-xx | ||
| 9838 | # from kernel sources | ||
| 9839 | 0279 ServeRAID 6M | ||
| 9840 | 0283 AAC-RAID | ||
| 9841 | 9005 0283 Catapult | ||
| 9842 | 0284 AAC-RAID | ||
| 9843 | 9005 0284 Tomcat | ||
| 9844 | 0285 AAC-RAID | ||
| 9845 | 0e11 0295 SATA 6Ch (Bearcat) | ||
| 9846 | 1014 02f2 ServeRAID 8i | ||
| 9847 | 1028 0287 PowerEdge Expandable RAID Controller 320/DC | ||
| 9848 | 1028 0291 CERC SATA RAID 2 PCI SATA 6ch (DellCorsair) | ||
| 9849 | 103c 3227 AAR-2610SA | ||
| 9850 | 17aa 0286 Legend S220 (Legend Crusader) | ||
| 9851 | 17aa 0287 Legend S230 (Legend Vulcan) | ||
| 9852 | 9005 0285 2200S (Vulcan) | ||
| 9853 | 9005 0286 2120S (Crusader) | ||
| 9854 | 9005 0287 2200S (Vulcan-2m) | ||
| 9855 | 9005 0288 3230S (Harrier) | ||
| 9856 | 9005 0289 3240S (Tornado) | ||
| 9857 | 9005 028a ASR-2020S PCI-X ZCR (Skyhawk) | ||
| 9858 | 9005 028b ASR-2020S SO-DIMM PCI-X ZCR (Terminator) | ||
| 9859 | 9005 0290 AAR-2410SA PCI SATA 4ch (Jaguar II) | ||
| 9860 | 9005 0292 AAR-2810SA PCI SATA 8ch (Corsair-8) | ||
| 9861 | 9005 0293 AAR-21610SA PCI SATA 16ch (Corsair-16) | ||
| 9862 | 9005 0294 ESD SO-DIMM PCI-X SATA ZCR (Prowler) | ||
| 9863 | 0286 AAC-RAID (Rocket) | ||
| 9864 | 9005 028c ASR-2230S + ASR-2230SLP PCI-X (Lancer) | ||
| 9865 | 0503 Scamp chipset SCSI controller | ||
| 9866 | 1014 02BF Quad Channel PCI-X DDR U320 SCSI RAID Adapter (571E) | ||
| 9867 | 8000 ASC-29320A U320 | ||
| 9868 | 800f AIC-7901 U320 | ||
| 9869 | 8010 ASC-39320 U320 | ||
| 9870 | 8011 ASC-32320D U320 | ||
| 9871 | 0e11 00ac ASC-39320D U320 | ||
| 9872 | 9005 0041 ASC-39320D U320 | ||
| 9873 | 8012 ASC-29320 U320 | ||
| 9874 | 8013 ASC-29320B U320 | ||
| 9875 | 8014 ASC-29320LP U320 | ||
| 9876 | 8015 ASC-39320B U320 | ||
| 9877 | 8016 ASC-39320A U320 | ||
| 9878 | 8017 ASC-29320ALP U320 | ||
| 9879 | 801c ASC-39320D U320 | ||
| 9880 | 801d AIC-7902B U320 | ||
| 9881 | 801e AIC-7901A U320 | ||
| 9882 | 801f AIC-7902 U320 | ||
| 9883 | 8080 ASC-29320A U320 w/HostRAID | ||
| 9884 | 808f AIC-7901 U320 w/HostRAID | ||
| 9885 | 8090 ASC-39320 U320 w/HostRAID | ||
| 9886 | 8091 ASC-39320D U320 w/HostRAID | ||
| 9887 | 8092 ASC-29320 U320 w/HostRAID | ||
| 9888 | 8093 ASC-29320B U320 w/HostRAID | ||
| 9889 | 8094 ASC-29320LP U320 w/HostRAID | ||
| 9890 | 8095 ASC-39320(B) U320 w/HostRAID | ||
| 9891 | 8096 ASC-39320A U320 w/HostRAID | ||
| 9892 | 8097 ASC-29320ALP U320 w/HostRAID | ||
| 9893 | 809c ASC-39320D(B) U320 w/HostRAID | ||
| 9894 | 809d AIC-7902(B) U320 w/HostRAID | ||
| 9895 | 809e AIC-7901A U320 w/HostRAID | ||
| 9896 | 809f AIC-7902 U320 w/HostRAID | ||
| 9897 | 907f Atronics | ||
| 9898 | 2015 IDE-2015PL | ||
| 9899 | 919a Gigapixel Corp | ||
| 9900 | 9412 Holtek | ||
| 9901 | 6565 6565 | ||
| 9902 | 9699 Omni Media Technology Inc | ||
| 9903 | 6565 6565 | ||
| 9904 | 9710 NetMos Technology | ||
| 9905 | 7780 USB IRDA-port | ||
| 9906 | 9705 PCI 9705 Parallel Port | ||
| 9907 | 9715 PCI 9715 Dual Parallel Port | ||
| 9908 | 9735 PCI 9735 Multi-I/O Controller | ||
| 9909 | 1000 0002 0P2S (2 serial) | ||
| 9910 | 1000 0012 1P2S (1 parallel + 2 serial) | ||
| 9911 | 9745 PCI 9745 Multi-I/O Controller | ||
| 9912 | 1000 0002 0P2S (2 serial) | ||
| 9913 | 1000 0012 1P2S (1 parallel + 2 serial) | ||
| 9914 | 9755 PCI 9755 Parallel Port and ISA Bridge | ||
| 9915 | 9805 PCI 9805 Parallel Port | ||
| 9916 | 9815 PCI 9815 Dual Parallel Port | ||
| 9917 | 1000 0020 2P0S (2 port parallel adaptor) | ||
| 9918 | 9835 PCI 9835 Multi-I/O Controller | ||
| 9919 | 1000 0002 0P2S (16C550 UART) | ||
| 9920 | 1000 0012 1P2S | ||
| 9921 | 9845 PCI 9845 Multi-I/O Controller | ||
| 9922 | 1000 0004 0P4S (4 port 16550A serial card) | ||
| 9923 | 1000 0006 0P6S (6 port 16550A serial card) | ||
| 9924 | 1000 0014 1P4S (4 port 16550A serial card + parallel) | ||
| 9925 | 9855 PCI 9855 Multi-I/O Controller | ||
| 9926 | 1000 0014 1P4S | ||
| 9927 | 9902 Stargen Inc. | ||
| 9928 | 0001 SG2010 PCI over Starfabric Bridge | ||
| 9929 | 0002 SG2010 PCI to Starfabric Gateway | ||
| 9930 | 0003 SG1010 Starfabric Switch and PCI Bridge | ||
| 9931 | a0a0 AOPEN Inc. | ||
| 9932 | a0f1 UNISYS Corporation | ||
| 9933 | a200 NEC Corporation | ||
| 9934 | a259 Hewlett Packard | ||
| 9935 | a25b Hewlett Packard GmbH PL24-MKT | ||
| 9936 | a304 Sony | ||
| 9937 | a727 3Com Corporation | ||
| 9938 | 0013 3CRPAG175 Wireless PC Card | ||
| 9939 | aa42 Scitex Digital Video | ||
| 9940 | ac1e Digital Receiver Technology Inc | ||
| 9941 | ac3d Actuality Systems | ||
| 9942 | aecb Adrienne Electronics Corporation | ||
| 9943 | b1b3 Shiva Europe Limited | ||
| 9944 | # Pinnacle should be 11bd, but they got it wrong several times --mj | ||
| 9945 | bd11 Pinnacle Systems, Inc. (Wrong ID) | ||
| 9946 | c001 TSI Telsys | ||
| 9947 | c0a9 Micron/Crucial Technology | ||
| 9948 | c0de Motorola | ||
| 9949 | c0fe Motion Engineering, Inc. | ||
| 9950 | ca50 Varian Australia Pty Ltd | ||
| 9951 | cafe Chrysalis-ITS | ||
| 9952 | cccc Catapult Communications | ||
| 9953 | cddd Tyzx, Inc. | ||
| 9954 | 0101 DeepSea 1 High Speed Stereo Vision Frame Grabber | ||
| 9955 | 0200 DeepSea 2 High Speed Stereo Vision Frame Grabber | ||
| 9956 | d4d4 Dy4 Systems Inc | ||
| 9957 | 0601 PCI Mezzanine Card | ||
| 9958 | d531 I+ME ACTIA GmbH | ||
| 9959 | d84d Exsys | ||
| 9960 | dead Indigita Corporation | ||
| 9961 | deaf Middle Digital Inc. | ||
| 9962 | 9050 PC Weasel Virtual VGA | ||
| 9963 | 9051 PC Weasel Serial Port | ||
| 9964 | 9052 PC Weasel Watchdog Timer | ||
| 9965 | e000 Winbond | ||
| 9966 | e000 W89C940 | ||
| 9967 | # see also : http://www.schoenfeld.de/inside/Inside_CWMK3.txt maybe a misuse of TJN id or it use the TJN 3XX chip for other applic | ||
| 9968 | e159 Tiger Jet Network Inc. | ||
| 9969 | 0001 Tiger3XX Modem/ISDN interface | ||
| 9970 | 0059 0001 128k ISDN-S/T Adapter | ||
| 9971 | 0059 0003 128k ISDN-U Adapter | ||
| 9972 | 0002 Tiger100APC ISDN chipset | ||
| 9973 | e4bf EKF Elektronik GmbH | ||
| 9974 | # Innovative and scalable network IC vendor | ||
| 9975 | e55e Essence Technology, Inc. | ||
| 9976 | ea01 Eagle Technology | ||
| 9977 | # The main chip of all these devices is by Xilinx -> It could also be a Xilinx ID. | ||
| 9978 | ea60 RME | ||
| 9979 | 9896 Digi32 | ||
| 9980 | 9897 Digi32 Pro | ||
| 9981 | 9898 Digi32/8 | ||
| 9982 | eabb Aashima Technology B.V. | ||
| 9983 | eace Endace Measurement Systems, Ltd | ||
| 9984 | 3100 DAG 3.10 OC-3/OC-12 | ||
| 9985 | 3200 DAG 3.2x OC-3/OC-12 | ||
| 9986 | 320e DAG 3.2E Fast Ethernet | ||
| 9987 | 340e DAG 3.4E Fast Ethernet | ||
| 9988 | 341e DAG 3.41E Fast Ethernet | ||
| 9989 | 3500 DAG 3.5 OC-3/OC-12 | ||
| 9990 | 351c DAG 3.5ECM Fast Ethernet | ||
| 9991 | 4100 DAG 4.10 OC-48 | ||
| 9992 | 4110 DAG 4.11 OC-48 | ||
| 9993 | 4220 DAG 4.2 OC-48 | ||
| 9994 | 422e DAG 4.2E Dual Gigabit Ethernet | ||
| 9995 | ec80 Belkin Corporation | ||
| 9996 | ec00 F5D6000 | ||
| 9997 | ecc0 Echo Digital Audio Corporation | ||
| 9998 | edd8 ARK Logic Inc | ||
| 9999 | a091 1000PV [Stingray] | ||
| 10000 | a099 2000PV [Stingray] | ||
| 10001 | a0a1 2000MT | ||
| 10002 | a0a9 2000MI | ||
| 10003 | f1d0 AJA Video | ||
| 10004 | # All boards I have seen have this ID not efac, though all docs say efac... | ||
| 10005 | cafe KONA SD SMPTE 259M I/O | ||
| 10006 | efac KONA SD SMPTE 259M I/O | ||
| 10007 | facd KONA HD SMPTE 292M I/O | ||
| 10008 | fa57 Interagon AS | ||
| 10009 | 0001 PMC [Pattern Matching Chip] | ||
| 10010 | febd Ultraview Corp. | ||
| 10011 | feda Broadcom Inc (nee Epigram) | ||
| 10012 | a0fa BCM4210 iLine10 HomePNA 2.0 | ||
| 10013 | a10e BCM4230 iLine10 HomePNA 2.0 | ||
| 10014 | # IT & Telecom company, develops PCI Trunk cards <www.fedetec.es> | ||
| 10015 | fede Fedetec Inc. | ||
| 10016 | 0003 TABIC PCI v3 | ||
| 10017 | fffe VMWare Inc | ||
| 10018 | 0405 Virtual SVGA 4.0 | ||
| 10019 | 0710 Virtual SVGA | ||
| 10020 | ffff Illegal Vendor ID | ||
| 10021 | |||
| 10022 | |||
| 10023 | # List of known device classes, subclasses and programming interfaces | ||
| 10024 | |||
| 10025 | # Syntax: | ||
| 10026 | # C class class_name | ||
| 10027 | # subclass subclass_name <-- single tab | ||
| 10028 | # prog-if prog-if_name <-- two tabs | ||
| 10029 | |||
| 10030 | C 00 Unclassified device | ||
| 10031 | 00 Non-VGA unclassified device | ||
| 10032 | 01 VGA compatible unclassified device | ||
| 10033 | C 01 Mass storage controller | ||
| 10034 | 00 SCSI storage controller | ||
| 10035 | 01 IDE interface | ||
| 10036 | 02 Floppy disk controller | ||
| 10037 | 03 IPI bus controller | ||
| 10038 | 04 RAID bus controller | ||
| 10039 | 80 Unknown mass storage controller | ||
| 10040 | C 02 Network controller | ||
| 10041 | 00 Ethernet controller | ||
| 10042 | 01 Token ring network controller | ||
| 10043 | 02 FDDI network controller | ||
| 10044 | 03 ATM network controller | ||
| 10045 | 04 ISDN controller | ||
| 10046 | 80 Network controller | ||
| 10047 | C 03 Display controller | ||
| 10048 | 00 VGA compatible controller | ||
| 10049 | 00 VGA | ||
| 10050 | 01 8514 | ||
| 10051 | 01 XGA compatible controller | ||
| 10052 | 02 3D controller | ||
| 10053 | 80 Display controller | ||
| 10054 | C 04 Multimedia controller | ||
| 10055 | 00 Multimedia video controller | ||
| 10056 | 01 Multimedia audio controller | ||
| 10057 | 02 Computer telephony device | ||
| 10058 | 80 Multimedia controller | ||
| 10059 | C 05 Memory controller | ||
| 10060 | 00 RAM memory | ||
| 10061 | 01 FLASH memory | ||
| 10062 | 80 Memory controller | ||
| 10063 | C 06 Bridge | ||
| 10064 | 00 Host bridge | ||
| 10065 | 01 ISA bridge | ||
| 10066 | 02 EISA bridge | ||
| 10067 | 03 MicroChannel bridge | ||
| 10068 | 04 PCI bridge | ||
| 10069 | 00 Normal decode | ||
| 10070 | 01 Subtractive decode | ||
| 10071 | 05 PCMCIA bridge | ||
| 10072 | 06 NuBus bridge | ||
| 10073 | 07 CardBus bridge | ||
| 10074 | 08 RACEway bridge | ||
| 10075 | 00 Transparent mode | ||
| 10076 | 01 Endpoint mode | ||
| 10077 | 09 Semi-transparent PCI-to-PCI bridge | ||
| 10078 | 40 Primary bus towards host CPU | ||
| 10079 | 80 Secondary bus towards host CPU | ||
| 10080 | 0a InfiniBand to PCI host bridge | ||
| 10081 | 80 Bridge | ||
| 10082 | C 07 Communication controller | ||
| 10083 | 00 Serial controller | ||
| 10084 | 00 8250 | ||
| 10085 | 01 16450 | ||
| 10086 | 02 16550 | ||
| 10087 | 03 16650 | ||
| 10088 | 04 16750 | ||
| 10089 | 05 16850 | ||
| 10090 | 06 16950 | ||
| 10091 | 01 Parallel controller | ||
| 10092 | 00 SPP | ||
| 10093 | 01 BiDir | ||
| 10094 | 02 ECP | ||
| 10095 | 03 IEEE1284 | ||
| 10096 | fe IEEE1284 Target | ||
| 10097 | 02 Multiport serial controller | ||
| 10098 | 03 Modem | ||
| 10099 | 00 Generic | ||
| 10100 | 01 Hayes/16450 | ||
| 10101 | 02 Hayes/16550 | ||
| 10102 | 03 Hayes/16650 | ||
| 10103 | 04 Hayes/16750 | ||
| 10104 | 80 Communication controller | ||
| 10105 | C 08 Generic system peripheral | ||
| 10106 | 00 PIC | ||
| 10107 | 00 8259 | ||
| 10108 | 01 ISA PIC | ||
| 10109 | 02 EISA PIC | ||
| 10110 | 10 IO-APIC | ||
| 10111 | 20 IO(X)-APIC | ||
| 10112 | 01 DMA controller | ||
| 10113 | 00 8237 | ||
| 10114 | 01 ISA DMA | ||
| 10115 | 02 EISA DMA | ||
| 10116 | 02 Timer | ||
| 10117 | 00 8254 | ||
| 10118 | 01 ISA Timer | ||
| 10119 | 02 EISA Timers | ||
| 10120 | 03 RTC | ||
| 10121 | 00 Generic | ||
| 10122 | 01 ISA RTC | ||
| 10123 | 04 PCI Hot-plug controller | ||
| 10124 | 80 System peripheral | ||
| 10125 | C 09 Input device controller | ||
| 10126 | 00 Keyboard controller | ||
| 10127 | 01 Digitizer Pen | ||
| 10128 | 02 Mouse controller | ||
| 10129 | 03 Scanner controller | ||
| 10130 | 04 Gameport controller | ||
| 10131 | 00 Generic | ||
| 10132 | 10 Extended | ||
| 10133 | 80 Input device controller | ||
| 10134 | C 0a Docking station | ||
| 10135 | 00 Generic Docking Station | ||
| 10136 | 80 Docking Station | ||
| 10137 | C 0b Processor | ||
| 10138 | 00 386 | ||
| 10139 | 01 486 | ||
| 10140 | 02 Pentium | ||
| 10141 | 10 Alpha | ||
| 10142 | 20 Power PC | ||
| 10143 | 30 MIPS | ||
| 10144 | 40 Co-processor | ||
| 10145 | C 0c Serial bus controller | ||
| 10146 | 00 FireWire (IEEE 1394) | ||
| 10147 | 00 Generic | ||
| 10148 | 10 OHCI | ||
| 10149 | 01 ACCESS Bus | ||
| 10150 | 02 SSA | ||
| 10151 | 03 USB Controller | ||
| 10152 | 00 UHCI | ||
| 10153 | 10 OHCI | ||
| 10154 | 20 EHCI | ||
| 10155 | 80 Unspecified | ||
| 10156 | fe USB Device | ||
| 10157 | 04 Fibre Channel | ||
| 10158 | 05 SMBus | ||
| 10159 | 06 InfiniBand | ||
| 10160 | C 0d Wireless controller | ||
| 10161 | 00 IRDA controller | ||
| 10162 | 01 Consumer IR controller | ||
| 10163 | 10 RF controller | ||
| 10164 | 80 Wireless controller | ||
| 10165 | C 0e Intelligent controller | ||
| 10166 | 00 I2O | ||
| 10167 | C 0f Satellite communications controller | ||
| 10168 | 00 Satellite TV controller | ||
| 10169 | 01 Satellite audio communication controller | ||
| 10170 | 03 Satellite voice communication controller | ||
| 10171 | 04 Satellite data communication controller | ||
| 10172 | C 10 Encryption controller | ||
| 10173 | 00 Network and computing encryption device | ||
| 10174 | 10 Entertainment encryption device | ||
| 10175 | 80 Encryption controller | ||
| 10176 | C 11 Signal processing controller | ||
| 10177 | 00 DPIO module | ||
| 10178 | 01 Performance counters | ||
| 10179 | 10 Communication synchronizer | ||
| 10180 | 80 Signal processing controller | ||
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 30bac7ed7c16..3c565ce7f77b 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
| @@ -90,15 +90,19 @@ static void pcie_portdrv_save_config(struct pci_dev *dev) | |||
| 90 | pci_save_msi_state(dev); | 90 | pci_save_msi_state(dev); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | static void pcie_portdrv_restore_config(struct pci_dev *dev) | 93 | static int pcie_portdrv_restore_config(struct pci_dev *dev) |
| 94 | { | 94 | { |
| 95 | struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); | 95 | struct pcie_port_device_ext *p_ext = pci_get_drvdata(dev); |
| 96 | int retval; | ||
| 96 | 97 | ||
| 97 | pci_restore_state(dev); | 98 | pci_restore_state(dev); |
| 98 | if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE) | 99 | if (p_ext->interrupt_mode == PCIE_PORT_MSI_MODE) |
| 99 | pci_restore_msi_state(dev); | 100 | pci_restore_msi_state(dev); |
| 100 | pci_enable_device(dev); | 101 | retval = pci_enable_device(dev); |
| 102 | if (retval) | ||
| 103 | return retval; | ||
| 101 | pci_set_master(dev); | 104 | pci_set_master(dev); |
| 105 | return 0; | ||
| 102 | } | 106 | } |
| 103 | 107 | ||
| 104 | /* | 108 | /* |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 93e8a878ea95..b9c9b03919d4 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -584,7 +584,7 @@ static int pci_setup_device(struct pci_dev * dev) | |||
| 584 | dev->vendor, dev->device, class, dev->hdr_type); | 584 | dev->vendor, dev->device, class, dev->hdr_type); |
| 585 | 585 | ||
| 586 | /* "Unknown power state" */ | 586 | /* "Unknown power state" */ |
| 587 | dev->current_state = 4; | 587 | dev->current_state = PCI_UNKNOWN; |
| 588 | 588 | ||
| 589 | /* Early fixups, before probing the BARs */ | 589 | /* Early fixups, before probing the BARs */ |
| 590 | pci_fixup_device(pci_fixup_early, dev); | 590 | pci_fixup_device(pci_fixup_early, dev); |
| @@ -757,8 +757,6 @@ pci_scan_device(struct pci_bus *bus, int devfn) | |||
| 757 | dev->dev.release = pci_release_dev; | 757 | dev->dev.release = pci_release_dev; |
| 758 | pci_dev_get(dev); | 758 | pci_dev_get(dev); |
| 759 | 759 | ||
| 760 | pci_name_device(dev); | ||
| 761 | |||
| 762 | dev->dev.dma_mask = &dev->dma_mask; | 760 | dev->dev.dma_mask = &dev->dma_mask; |
| 763 | dev->dev.coherent_dma_mask = 0xffffffffull; | 761 | dev->dev.coherent_dma_mask = 0xffffffffull; |
| 764 | 762 | ||
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 7988fc8df3fd..9613f666c110 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c | |||
| @@ -474,7 +474,7 @@ static int show_dev_config(struct seq_file *m, void *v) | |||
| 474 | struct pci_dev *first_dev; | 474 | struct pci_dev *first_dev; |
| 475 | struct pci_driver *drv; | 475 | struct pci_driver *drv; |
| 476 | u32 class_rev; | 476 | u32 class_rev; |
| 477 | unsigned char latency, min_gnt, max_lat, *class; | 477 | unsigned char latency, min_gnt, max_lat; |
| 478 | int reg; | 478 | int reg; |
| 479 | 479 | ||
| 480 | first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); | 480 | first_dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, NULL); |
| @@ -490,16 +490,8 @@ static int show_dev_config(struct seq_file *m, void *v) | |||
| 490 | pci_read_config_byte (dev, PCI_MAX_LAT, &max_lat); | 490 | pci_read_config_byte (dev, PCI_MAX_LAT, &max_lat); |
| 491 | seq_printf(m, " Bus %2d, device %3d, function %2d:\n", | 491 | seq_printf(m, " Bus %2d, device %3d, function %2d:\n", |
| 492 | dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); | 492 | dev->bus->number, PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn)); |
| 493 | class = pci_class_name(class_rev >> 16); | 493 | seq_printf(m, " Class %04x", class_rev >> 16); |
| 494 | if (class) | ||
| 495 | seq_printf(m, " %s", class); | ||
| 496 | else | ||
| 497 | seq_printf(m, " Class %04x", class_rev >> 16); | ||
| 498 | #ifdef CONFIG_PCI_NAMES | ||
| 499 | seq_printf(m, ": %s", dev->pretty_name); | ||
| 500 | #else | ||
| 501 | seq_printf(m, ": PCI device %04x:%04x", dev->vendor, dev->device); | 494 | seq_printf(m, ": PCI device %04x:%04x", dev->vendor, dev->device); |
| 502 | #endif | ||
| 503 | seq_printf(m, " (rev %d).\n", class_rev & 0xff); | 495 | seq_printf(m, " (rev %d).\n", class_rev & 0xff); |
| 504 | 496 | ||
| 505 | if (dev->irq) | 497 | if (dev->irq) |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 140354a2aa72..4f0c1bd3674a 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -245,12 +245,19 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsi | |||
| 245 | { | 245 | { |
| 246 | region &= ~(size-1); | 246 | region &= ~(size-1); |
| 247 | if (region) { | 247 | if (region) { |
| 248 | struct pci_bus_region bus_region; | ||
| 248 | struct resource *res = dev->resource + nr; | 249 | struct resource *res = dev->resource + nr; |
| 249 | 250 | ||
| 250 | res->name = pci_name(dev); | 251 | res->name = pci_name(dev); |
| 251 | res->start = region; | 252 | res->start = region; |
| 252 | res->end = region + size - 1; | 253 | res->end = region + size - 1; |
| 253 | res->flags = IORESOURCE_IO; | 254 | res->flags = IORESOURCE_IO; |
| 255 | |||
| 256 | /* Convert from PCI bus to resource space. */ | ||
| 257 | bus_region.start = res->start; | ||
| 258 | bus_region.end = res->end; | ||
| 259 | pcibios_bus_to_resource(dev, res, &bus_region); | ||
| 260 | |||
| 254 | pci_claim_resource(dev, nr); | 261 | pci_claim_resource(dev, nr); |
| 255 | } | 262 | } |
| 256 | } | 263 | } |
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c index 5598b4714f77..50d6685dcbcc 100644 --- a/drivers/pci/setup-res.c +++ b/drivers/pci/setup-res.c | |||
| @@ -26,7 +26,7 @@ | |||
| 26 | #include "pci.h" | 26 | #include "pci.h" |
| 27 | 27 | ||
| 28 | 28 | ||
| 29 | static void | 29 | void |
| 30 | pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) | 30 | pci_update_resource(struct pci_dev *dev, struct resource *res, int resno) |
| 31 | { | 31 | { |
| 32 | struct pci_bus_region region; | 32 | struct pci_bus_region region; |
| @@ -97,10 +97,7 @@ pci_claim_resource(struct pci_dev *dev, int resource) | |||
| 97 | char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge"; | 97 | char *dtype = resource < PCI_BRIDGE_RESOURCES ? "device" : "bridge"; |
| 98 | int err; | 98 | int err; |
| 99 | 99 | ||
| 100 | if (res->flags & IORESOURCE_IO) | 100 | root = pcibios_select_root(dev, res); |
| 101 | root = &ioport_resource; | ||
| 102 | if (res->flags & IORESOURCE_MEM) | ||
| 103 | root = &iomem_resource; | ||
| 104 | 101 | ||
| 105 | err = -EINVAL; | 102 | err = -EINVAL; |
| 106 | if (root != NULL) | 103 | if (root != NULL) |
diff --git a/drivers/scsi/ahci.c b/drivers/scsi/ahci.c index 320df6cd3def..c2c8fa828e24 100644 --- a/drivers/scsi/ahci.c +++ b/drivers/scsi/ahci.c | |||
| @@ -865,22 +865,6 @@ static int ahci_host_init(struct ata_probe_ent *probe_ent) | |||
| 865 | return 0; | 865 | return 0; |
| 866 | } | 866 | } |
| 867 | 867 | ||
| 868 | /* move to PCI layer, integrate w/ MSI stuff */ | ||
| 869 | static void pci_intx(struct pci_dev *pdev, int enable) | ||
| 870 | { | ||
| 871 | u16 pci_command, new; | ||
| 872 | |||
| 873 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 874 | |||
| 875 | if (enable) | ||
| 876 | new = pci_command & ~PCI_COMMAND_INTX_DISABLE; | ||
| 877 | else | ||
| 878 | new = pci_command | PCI_COMMAND_INTX_DISABLE; | ||
| 879 | |||
| 880 | if (new != pci_command) | ||
| 881 | pci_write_config_word(pdev, PCI_COMMAND, pci_command); | ||
| 882 | } | ||
| 883 | |||
| 884 | static void ahci_print_info(struct ata_probe_ent *probe_ent) | 868 | static void ahci_print_info(struct ata_probe_ent *probe_ent) |
| 885 | { | 869 | { |
| 886 | struct ahci_host_priv *hpriv = probe_ent->private_data; | 870 | struct ahci_host_priv *hpriv = probe_ent->private_data; |
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 5f8688529041..87e0c36f1554 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
| @@ -568,18 +568,6 @@ static void piix_set_dmamode (struct ata_port *ap, struct ata_device *adev) | |||
| 568 | } | 568 | } |
| 569 | } | 569 | } |
| 570 | 570 | ||
| 571 | /* move to PCI layer, integrate w/ MSI stuff */ | ||
| 572 | static void pci_enable_intx(struct pci_dev *pdev) | ||
| 573 | { | ||
| 574 | u16 pci_command; | ||
| 575 | |||
| 576 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 577 | if (pci_command & PCI_COMMAND_INTX_DISABLE) { | ||
| 578 | pci_command &= ~PCI_COMMAND_INTX_DISABLE; | ||
| 579 | pci_write_config_word(pdev, PCI_COMMAND, pci_command); | ||
| 580 | } | ||
| 581 | } | ||
| 582 | |||
| 583 | #define AHCI_PCI_BAR 5 | 571 | #define AHCI_PCI_BAR 5 |
| 584 | #define AHCI_GLOBAL_CTL 0x04 | 572 | #define AHCI_GLOBAL_CTL 0x04 |
| 585 | #define AHCI_ENABLE (1 << 31) | 573 | #define AHCI_ENABLE (1 << 31) |
| @@ -677,7 +665,7 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 677 | * message-signalled interrupts currently). | 665 | * message-signalled interrupts currently). |
| 678 | */ | 666 | */ |
| 679 | if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR) | 667 | if (port_info[0]->host_flags & PIIX_FLAG_CHECKINTR) |
| 680 | pci_enable_intx(pdev); | 668 | pci_intx(pdev, 1); |
| 681 | 669 | ||
| 682 | if (combined) { | 670 | if (combined) { |
| 683 | port_info[sata_chan] = &piix_port_info[ent->driver_data]; | 671 | port_info[sata_chan] = &piix_port_info[ent->driver_data]; |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index f97e3afa97d9..ea76fe44585e 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
| @@ -699,22 +699,6 @@ static int mv_host_init(struct ata_probe_ent *probe_ent) | |||
| 699 | return rc; | 699 | return rc; |
| 700 | } | 700 | } |
| 701 | 701 | ||
| 702 | /* move to PCI layer, integrate w/ MSI stuff */ | ||
| 703 | static void pci_intx(struct pci_dev *pdev, int enable) | ||
| 704 | { | ||
| 705 | u16 pci_command, new; | ||
| 706 | |||
| 707 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 708 | |||
| 709 | if (enable) | ||
| 710 | new = pci_command & ~PCI_COMMAND_INTX_DISABLE; | ||
| 711 | else | ||
| 712 | new = pci_command | PCI_COMMAND_INTX_DISABLE; | ||
| 713 | |||
| 714 | if (new != pci_command) | ||
| 715 | pci_write_config_word(pdev, PCI_COMMAND, pci_command); | ||
| 716 | } | ||
| 717 | |||
| 718 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | 702 | static int mv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) |
| 719 | { | 703 | { |
| 720 | static int printed_version = 0; | 704 | static int printed_version = 0; |
diff --git a/drivers/scsi/sata_sis.c b/drivers/scsi/sata_sis.c index 7d1aaa99aaae..a63f93186e41 100644 --- a/drivers/scsi/sata_sis.c +++ b/drivers/scsi/sata_sis.c | |||
| @@ -55,7 +55,7 @@ enum { | |||
| 55 | SIS180_SATA1_OFS = 0x10, /* offset from sata0->sata1 phy regs */ | 55 | SIS180_SATA1_OFS = 0x10, /* offset from sata0->sata1 phy regs */ |
| 56 | SIS182_SATA1_OFS = 0x20, /* offset from sata0->sata1 phy regs */ | 56 | SIS182_SATA1_OFS = 0x20, /* offset from sata0->sata1 phy regs */ |
| 57 | SIS_PMR = 0x90, /* port mapping register */ | 57 | SIS_PMR = 0x90, /* port mapping register */ |
| 58 | SIS_PMR_COMBINED = 0x30, | 58 | SIS_PMR_COMBINED = 0x30, |
| 59 | 59 | ||
| 60 | /* random bits */ | 60 | /* random bits */ |
| 61 | SIS_FLAG_CFGSCR = (1 << 30), /* host flag: SCRs via PCI cfg */ | 61 | SIS_FLAG_CFGSCR = (1 << 30), /* host flag: SCRs via PCI cfg */ |
| @@ -147,11 +147,13 @@ static unsigned int get_scr_cfg_addr(unsigned int port_no, unsigned int sc_reg, | |||
| 147 | { | 147 | { |
| 148 | unsigned int addr = SIS_SCR_BASE + (4 * sc_reg); | 148 | unsigned int addr = SIS_SCR_BASE + (4 * sc_reg); |
| 149 | 149 | ||
| 150 | if (port_no) | 150 | if (port_no) { |
| 151 | if (device == 0x182) | 151 | if (device == 0x182) |
| 152 | addr += SIS182_SATA1_OFS; | 152 | addr += SIS182_SATA1_OFS; |
| 153 | else | 153 | else |
| 154 | addr += SIS180_SATA1_OFS; | 154 | addr += SIS180_SATA1_OFS; |
| 155 | } | ||
| 156 | |||
| 155 | return addr; | 157 | return addr; |
| 156 | } | 158 | } |
| 157 | 159 | ||
| @@ -166,10 +168,10 @@ static u32 sis_scr_cfg_read (struct ata_port *ap, unsigned int sc_reg) | |||
| 166 | return 0xffffffff; | 168 | return 0xffffffff; |
| 167 | 169 | ||
| 168 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 170 | pci_read_config_byte(pdev, SIS_PMR, &pmr); |
| 169 | 171 | ||
| 170 | pci_read_config_dword(pdev, cfg_addr, &val); | 172 | pci_read_config_dword(pdev, cfg_addr, &val); |
| 171 | 173 | ||
| 172 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) | 174 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) |
| 173 | pci_read_config_dword(pdev, cfg_addr+0x10, &val2); | 175 | pci_read_config_dword(pdev, cfg_addr+0x10, &val2); |
| 174 | 176 | ||
| 175 | return val|val2; | 177 | return val|val2; |
| @@ -185,7 +187,7 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val) | |||
| 185 | return; | 187 | return; |
| 186 | 188 | ||
| 187 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 189 | pci_read_config_byte(pdev, SIS_PMR, &pmr); |
| 188 | 190 | ||
| 189 | pci_write_config_dword(pdev, cfg_addr, val); | 191 | pci_write_config_dword(pdev, cfg_addr, val); |
| 190 | 192 | ||
| 191 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) | 193 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) |
| @@ -195,7 +197,7 @@ static void sis_scr_cfg_write (struct ata_port *ap, unsigned int scr, u32 val) | |||
| 195 | static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg) | 197 | static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg) |
| 196 | { | 198 | { |
| 197 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); | 199 | struct pci_dev *pdev = to_pci_dev(ap->host_set->dev); |
| 198 | u32 val,val2; | 200 | u32 val, val2 = 0; |
| 199 | u8 pmr; | 201 | u8 pmr; |
| 200 | 202 | ||
| 201 | if (sc_reg > SCR_CONTROL) | 203 | if (sc_reg > SCR_CONTROL) |
| @@ -209,9 +211,9 @@ static u32 sis_scr_read (struct ata_port *ap, unsigned int sc_reg) | |||
| 209 | val = inl(ap->ioaddr.scr_addr + (sc_reg * 4)); | 211 | val = inl(ap->ioaddr.scr_addr + (sc_reg * 4)); |
| 210 | 212 | ||
| 211 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) | 213 | if ((pdev->device == 0x182) || (pmr & SIS_PMR_COMBINED)) |
| 212 | val2 = inl(ap->ioaddr.scr_addr + (sc_reg * 4)+0x10); | 214 | val2 = inl(ap->ioaddr.scr_addr + (sc_reg * 4) + 0x10); |
| 213 | 215 | ||
| 214 | return val|val2; | 216 | return val | val2; |
| 215 | } | 217 | } |
| 216 | 218 | ||
| 217 | static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | 219 | static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) |
| @@ -223,7 +225,7 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 223 | return; | 225 | return; |
| 224 | 226 | ||
| 225 | pci_read_config_byte(pdev, SIS_PMR, &pmr); | 227 | pci_read_config_byte(pdev, SIS_PMR, &pmr); |
| 226 | 228 | ||
| 227 | if (ap->flags & SIS_FLAG_CFGSCR) | 229 | if (ap->flags & SIS_FLAG_CFGSCR) |
| 228 | sis_scr_cfg_write(ap, sc_reg, val); | 230 | sis_scr_cfg_write(ap, sc_reg, val); |
| 229 | else { | 231 | else { |
| @@ -233,18 +235,6 @@ static void sis_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 233 | } | 235 | } |
| 234 | } | 236 | } |
| 235 | 237 | ||
| 236 | /* move to PCI layer, integrate w/ MSI stuff */ | ||
| 237 | static void pci_enable_intx(struct pci_dev *pdev) | ||
| 238 | { | ||
| 239 | u16 pci_command; | ||
| 240 | |||
| 241 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 242 | if (pci_command & PCI_COMMAND_INTX_DISABLE) { | ||
| 243 | pci_command &= ~PCI_COMMAND_INTX_DISABLE; | ||
| 244 | pci_write_config_word(pdev, PCI_COMMAND, pci_command); | ||
| 245 | } | ||
| 246 | } | ||
| 247 | |||
| 248 | static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | 238 | static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) |
| 249 | { | 239 | { |
| 250 | struct ata_probe_ent *probe_ent = NULL; | 240 | struct ata_probe_ent *probe_ent = NULL; |
| @@ -319,7 +309,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 319 | } | 309 | } |
| 320 | 310 | ||
| 321 | pci_set_master(pdev); | 311 | pci_set_master(pdev); |
| 322 | pci_enable_intx(pdev); | 312 | pci_intx(pdev, 1); |
| 323 | 313 | ||
| 324 | /* FIXME: check ata_device_add return value */ | 314 | /* FIXME: check ata_device_add return value */ |
| 325 | ata_device_add(probe_ent); | 315 | ata_device_add(probe_ent); |
diff --git a/drivers/scsi/sata_uli.c b/drivers/scsi/sata_uli.c index 42e13ed8eb5b..4c9fb8b71be1 100644 --- a/drivers/scsi/sata_uli.c +++ b/drivers/scsi/sata_uli.c | |||
| @@ -176,18 +176,6 @@ static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val) | |||
| 176 | uli_scr_cfg_write(ap, sc_reg, val); | 176 | uli_scr_cfg_write(ap, sc_reg, val); |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | /* move to PCI layer, integrate w/ MSI stuff */ | ||
| 180 | static void pci_enable_intx(struct pci_dev *pdev) | ||
| 181 | { | ||
| 182 | u16 pci_command; | ||
| 183 | |||
| 184 | pci_read_config_word(pdev, PCI_COMMAND, &pci_command); | ||
| 185 | if (pci_command & PCI_COMMAND_INTX_DISABLE) { | ||
| 186 | pci_command &= ~PCI_COMMAND_INTX_DISABLE; | ||
| 187 | pci_write_config_word(pdev, PCI_COMMAND, pci_command); | ||
| 188 | } | ||
| 189 | } | ||
| 190 | |||
| 191 | static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | 179 | static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) |
| 192 | { | 180 | { |
| 193 | struct ata_probe_ent *probe_ent; | 181 | struct ata_probe_ent *probe_ent; |
| @@ -260,7 +248,7 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 260 | } | 248 | } |
| 261 | 249 | ||
| 262 | pci_set_master(pdev); | 250 | pci_set_master(pdev); |
| 263 | pci_enable_intx(pdev); | 251 | pci_intx(pdev, 1); |
| 264 | 252 | ||
| 265 | /* FIXME: check ata_device_add return value */ | 253 | /* FIXME: check ata_device_add return value */ |
| 266 | ata_device_add(probe_ent); | 254 | ata_device_add(probe_ent); |
diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c index 30a0a3d10145..5b65e208893b 100644 --- a/drivers/serial/8250.c +++ b/drivers/serial/8250.c | |||
| @@ -2536,7 +2536,7 @@ static int __init serial8250_init(void) | |||
| 2536 | goto out; | 2536 | goto out; |
| 2537 | 2537 | ||
| 2538 | serial8250_isa_devs = platform_device_register_simple("serial8250", | 2538 | serial8250_isa_devs = platform_device_register_simple("serial8250", |
| 2539 | -1, NULL, 0); | 2539 | PLAT8250_DEV_LEGACY, NULL, 0); |
| 2540 | if (IS_ERR(serial8250_isa_devs)) { | 2540 | if (IS_ERR(serial8250_isa_devs)) { |
| 2541 | ret = PTR_ERR(serial8250_isa_devs); | 2541 | ret = PTR_ERR(serial8250_isa_devs); |
| 2542 | goto unreg; | 2542 | goto unreg; |
diff --git a/drivers/serial/8250_accent.c b/drivers/serial/8250_accent.c index 1f2c276063ef..9c10262f2469 100644 --- a/drivers/serial/8250_accent.c +++ b/drivers/serial/8250_accent.c | |||
| @@ -29,7 +29,7 @@ static struct plat_serial8250_port accent_data[] = { | |||
| 29 | 29 | ||
| 30 | static struct platform_device accent_device = { | 30 | static struct platform_device accent_device = { |
| 31 | .name = "serial8250", | 31 | .name = "serial8250", |
| 32 | .id = 2, | 32 | .id = PLAT8250_DEV_ACCENT, |
| 33 | .dev = { | 33 | .dev = { |
| 34 | .platform_data = accent_data, | 34 | .platform_data = accent_data, |
| 35 | }, | 35 | }, |
diff --git a/drivers/serial/8250_boca.c b/drivers/serial/8250_boca.c index 465c9ea1e7a3..3bfe0f7b26fb 100644 --- a/drivers/serial/8250_boca.c +++ b/drivers/serial/8250_boca.c | |||
| @@ -43,7 +43,7 @@ static struct plat_serial8250_port boca_data[] = { | |||
| 43 | 43 | ||
| 44 | static struct platform_device boca_device = { | 44 | static struct platform_device boca_device = { |
| 45 | .name = "serial8250", | 45 | .name = "serial8250", |
| 46 | .id = 3, | 46 | .id = PLAT8250_DEV_BOCA, |
| 47 | .dev = { | 47 | .dev = { |
| 48 | .platform_data = boca_data, | 48 | .platform_data = boca_data, |
| 49 | }, | 49 | }, |
diff --git a/drivers/serial/8250_fourport.c b/drivers/serial/8250_fourport.c index e9b4d908ef42..6375d68b7913 100644 --- a/drivers/serial/8250_fourport.c +++ b/drivers/serial/8250_fourport.c | |||
| @@ -35,7 +35,7 @@ static struct plat_serial8250_port fourport_data[] = { | |||
| 35 | 35 | ||
| 36 | static struct platform_device fourport_device = { | 36 | static struct platform_device fourport_device = { |
| 37 | .name = "serial8250", | 37 | .name = "serial8250", |
| 38 | .id = 1, | 38 | .id = PLAT8250_DEV_FOURPORT, |
| 39 | .dev = { | 39 | .dev = { |
| 40 | .platform_data = fourport_data, | 40 | .platform_data = fourport_data, |
| 41 | }, | 41 | }, |
diff --git a/drivers/serial/8250_hub6.c b/drivers/serial/8250_hub6.c index 77f396f84b4c..daf569cd3c8f 100644 --- a/drivers/serial/8250_hub6.c +++ b/drivers/serial/8250_hub6.c | |||
| @@ -40,7 +40,7 @@ static struct plat_serial8250_port hub6_data[] = { | |||
| 40 | 40 | ||
| 41 | static struct platform_device hub6_device = { | 41 | static struct platform_device hub6_device = { |
| 42 | .name = "serial8250", | 42 | .name = "serial8250", |
| 43 | .id = 4, | 43 | .id = PLAT8250_DEV_HUB6, |
| 44 | .dev = { | 44 | .dev = { |
| 45 | .platform_data = hub6_data, | 45 | .platform_data = hub6_data, |
| 46 | }, | 46 | }, |
diff --git a/drivers/serial/8250_mca.c b/drivers/serial/8250_mca.c index f0c40d68b8c1..ac205256d5f3 100644 --- a/drivers/serial/8250_mca.c +++ b/drivers/serial/8250_mca.c | |||
| @@ -44,7 +44,7 @@ static struct plat_serial8250_port mca_data[] = { | |||
| 44 | 44 | ||
| 45 | static struct platform_device mca_device = { | 45 | static struct platform_device mca_device = { |
| 46 | .name = "serial8250", | 46 | .name = "serial8250", |
| 47 | .id = 5, | 47 | .id = PLAT8250_DEV_MCA, |
| 48 | .dev = { | 48 | .dev = { |
| 49 | .platform_data = mca_data, | 49 | .platform_data = mca_data, |
| 50 | }, | 50 | }, |
diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 8e184e2641cb..79861ee12a29 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c | |||
| @@ -715,13 +715,11 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, | |||
| 715 | usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), | 715 | usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), |
| 716 | instance->rcv_buf, PAGE_SIZE, | 716 | instance->rcv_buf, PAGE_SIZE, |
| 717 | cxacru_blocking_completion, &instance->rcv_done, 1); | 717 | cxacru_blocking_completion, &instance->rcv_done, 1); |
| 718 | instance->rcv_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 719 | 718 | ||
| 720 | usb_fill_int_urb(instance->snd_urb, | 719 | usb_fill_int_urb(instance->snd_urb, |
| 721 | usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), | 720 | usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), |
| 722 | instance->snd_buf, PAGE_SIZE, | 721 | instance->snd_buf, PAGE_SIZE, |
| 723 | cxacru_blocking_completion, &instance->snd_done, 4); | 722 | cxacru_blocking_completion, &instance->snd_done, 4); |
| 724 | instance->snd_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 725 | 723 | ||
| 726 | init_MUTEX(&instance->cm_serialize); | 724 | init_MUTEX(&instance->cm_serialize); |
| 727 | 725 | ||
diff --git a/drivers/usb/class/Kconfig b/drivers/usb/class/Kconfig index 0561d0234f23..333e39bb105f 100644 --- a/drivers/usb/class/Kconfig +++ b/drivers/usb/class/Kconfig | |||
| @@ -4,9 +4,22 @@ | |||
| 4 | comment "USB Device Class drivers" | 4 | comment "USB Device Class drivers" |
| 5 | depends on USB | 5 | depends on USB |
| 6 | 6 | ||
| 7 | config OBSOLETE_OSS_USB_DRIVER | ||
| 8 | bool "Obsolete OSS USB drivers" | ||
| 9 | depends on USB && SOUND | ||
| 10 | help | ||
| 11 | This option enables support for the obsolete USB Audio and Midi | ||
| 12 | drivers that are scheduled for removal in the near future since | ||
| 13 | there are ALSA drivers for the same hardware. | ||
| 14 | |||
| 15 | Please contact Adrian Bunk <bunk@stusta.de> if you had to | ||
| 16 | say Y here because of missing support in the ALSA drivers. | ||
| 17 | |||
| 18 | If unsure, say N. | ||
| 19 | |||
| 7 | config USB_AUDIO | 20 | config USB_AUDIO |
| 8 | tristate "USB Audio support" | 21 | tristate "USB Audio support" |
| 9 | depends on USB && SOUND | 22 | depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER |
| 10 | help | 23 | help |
| 11 | Say Y here if you want to connect USB audio equipment such as | 24 | Say Y here if you want to connect USB audio equipment such as |
| 12 | speakers to your computer's USB port. You only need this if you use | 25 | speakers to your computer's USB port. You only need this if you use |
| @@ -40,10 +53,12 @@ config USB_BLUETOOTH_TTY | |||
| 40 | 53 | ||
| 41 | config USB_MIDI | 54 | config USB_MIDI |
| 42 | tristate "USB MIDI support" | 55 | tristate "USB MIDI support" |
| 43 | depends on USB && SOUND | 56 | depends on USB && SOUND && OBSOLETE_OSS_USB_DRIVER |
| 44 | ---help--- | 57 | ---help--- |
| 45 | Say Y here if you want to connect a USB MIDI device to your | 58 | Say Y here if you want to connect a USB MIDI device to your |
| 46 | computer's USB port. This driver is for devices that comply with | 59 | computer's USB port. You only need this if you use the OSS |
| 60 | sound system; USB MIDI devices are supported by ALSA's USB | ||
| 61 | audio driver. This driver is for devices that comply with | ||
| 47 | 'Universal Serial Bus Device Class Definition for MIDI Device'. | 62 | 'Universal Serial Bus Device Class Definition for MIDI Device'. |
| 48 | 63 | ||
| 49 | The following devices are known to work: | 64 | The following devices are known to work: |
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 7ce43fb8118a..e195709c9c7f 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
| @@ -310,8 +310,9 @@ static int usblp_check_status(struct usblp *usblp, int err) | |||
| 310 | 310 | ||
| 311 | error = usblp_read_status (usblp, usblp->statusbuf); | 311 | error = usblp_read_status (usblp, usblp->statusbuf); |
| 312 | if (error < 0) { | 312 | if (error < 0) { |
| 313 | err("usblp%d: error %d reading printer status", | 313 | if (printk_ratelimit()) |
| 314 | usblp->minor, error); | 314 | err("usblp%d: error %d reading printer status", |
| 315 | usblp->minor, error); | ||
| 315 | return 0; | 316 | return 0; |
| 316 | } | 317 | } |
| 317 | 318 | ||
| @@ -604,7 +605,9 @@ static int usblp_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
| 604 | 605 | ||
| 605 | case LPGETSTATUS: | 606 | case LPGETSTATUS: |
| 606 | if (usblp_read_status(usblp, usblp->statusbuf)) { | 607 | if (usblp_read_status(usblp, usblp->statusbuf)) { |
| 607 | err("usblp%d: failed reading printer status", usblp->minor); | 608 | if (printk_ratelimit()) |
| 609 | err("usblp%d: failed reading printer status", | ||
| 610 | usblp->minor); | ||
| 608 | retval = -EIO; | 611 | retval = -EIO; |
| 609 | goto done; | 612 | goto done; |
| 610 | } | 613 | } |
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile index 9e8c377b8161..d5503cf0bf74 100644 --- a/drivers/usb/core/Makefile +++ b/drivers/usb/core/Makefile | |||
| @@ -3,14 +3,14 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | usbcore-objs := usb.o hub.o hcd.o urb.o message.o \ | 5 | usbcore-objs := usb.o hub.o hcd.o urb.o message.o \ |
| 6 | config.o file.o buffer.o sysfs.o | 6 | config.o file.o buffer.o sysfs.o devio.o |
| 7 | 7 | ||
| 8 | ifeq ($(CONFIG_PCI),y) | 8 | ifeq ($(CONFIG_PCI),y) |
| 9 | usbcore-objs += hcd-pci.o | 9 | usbcore-objs += hcd-pci.o |
| 10 | endif | 10 | endif |
| 11 | 11 | ||
| 12 | ifeq ($(CONFIG_USB_DEVICEFS),y) | 12 | ifeq ($(CONFIG_USB_DEVICEFS),y) |
| 13 | usbcore-objs += devio.o inode.o devices.o | 13 | usbcore-objs += inode.o devices.o |
| 14 | endif | 14 | endif |
| 15 | 15 | ||
| 16 | obj-$(CONFIG_USB) += usbcore.o | 16 | obj-$(CONFIG_USB) += usbcore.o |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index f86bf1454e21..b4265aa7d45e 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/module.h> | 43 | #include <linux/module.h> |
| 44 | #include <linux/usb.h> | 44 | #include <linux/usb.h> |
| 45 | #include <linux/usbdevice_fs.h> | 45 | #include <linux/usbdevice_fs.h> |
| 46 | #include <linux/cdev.h> | ||
| 46 | #include <asm/uaccess.h> | 47 | #include <asm/uaccess.h> |
| 47 | #include <asm/byteorder.h> | 48 | #include <asm/byteorder.h> |
| 48 | #include <linux/moduleparam.h> | 49 | #include <linux/moduleparam.h> |
| @@ -50,6 +51,10 @@ | |||
| 50 | #include "hcd.h" /* for usbcore internals */ | 51 | #include "hcd.h" /* for usbcore internals */ |
| 51 | #include "usb.h" | 52 | #include "usb.h" |
| 52 | 53 | ||
| 54 | #define USB_MAXBUS 64 | ||
| 55 | #define USB_DEVICE_MAX USB_MAXBUS * 128 | ||
| 56 | static struct class *usb_device_class; | ||
| 57 | |||
| 53 | struct async { | 58 | struct async { |
| 54 | struct list_head asynclist; | 59 | struct list_head asynclist; |
| 55 | struct dev_state *ps; | 60 | struct dev_state *ps; |
| @@ -71,6 +76,8 @@ MODULE_PARM_DESC (usbfs_snoop, "true to log all usbfs traffic"); | |||
| 71 | dev_info( dev , format , ## arg); \ | 76 | dev_info( dev , format , ## arg); \ |
| 72 | } while (0) | 77 | } while (0) |
| 73 | 78 | ||
| 79 | #define USB_DEVICE_DEV MKDEV(USB_DEVICE_MAJOR, 0) | ||
| 80 | |||
| 74 | 81 | ||
| 75 | #define MAX_USBFS_BUFFER_SIZE 16384 | 82 | #define MAX_USBFS_BUFFER_SIZE 16384 |
| 76 | 83 | ||
| @@ -487,7 +494,7 @@ static int check_ctrlrecip(struct dev_state *ps, unsigned int requesttype, unsig | |||
| 487 | */ | 494 | */ |
| 488 | static int usbdev_open(struct inode *inode, struct file *file) | 495 | static int usbdev_open(struct inode *inode, struct file *file) |
| 489 | { | 496 | { |
| 490 | struct usb_device *dev; | 497 | struct usb_device *dev = NULL; |
| 491 | struct dev_state *ps; | 498 | struct dev_state *ps; |
| 492 | int ret; | 499 | int ret; |
| 493 | 500 | ||
| @@ -501,11 +508,16 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
| 501 | 508 | ||
| 502 | lock_kernel(); | 509 | lock_kernel(); |
| 503 | ret = -ENOENT; | 510 | ret = -ENOENT; |
| 504 | dev = usb_get_dev(inode->u.generic_ip); | 511 | /* check if we are called from a real node or usbfs */ |
| 512 | if (imajor(inode) == USB_DEVICE_MAJOR) | ||
| 513 | dev = usbdev_lookup_minor(iminor(inode)); | ||
| 514 | if (!dev) | ||
| 515 | dev = inode->u.generic_ip; | ||
| 505 | if (!dev) { | 516 | if (!dev) { |
| 506 | kfree(ps); | 517 | kfree(ps); |
| 507 | goto out; | 518 | goto out; |
| 508 | } | 519 | } |
| 520 | usb_get_dev(dev); | ||
| 509 | ret = 0; | 521 | ret = 0; |
| 510 | ps->dev = dev; | 522 | ps->dev = dev; |
| 511 | ps->file = file; | 523 | ps->file = file; |
| @@ -1226,7 +1238,6 @@ static int proc_ioctl (struct dev_state *ps, void __user *arg) | |||
| 1226 | int retval = 0; | 1238 | int retval = 0; |
| 1227 | struct usb_interface *intf = NULL; | 1239 | struct usb_interface *intf = NULL; |
| 1228 | struct usb_driver *driver = NULL; | 1240 | struct usb_driver *driver = NULL; |
| 1229 | int i; | ||
| 1230 | 1241 | ||
| 1231 | /* get input parameters and alloc buffer */ | 1242 | /* get input parameters and alloc buffer */ |
| 1232 | if (copy_from_user(&ctrl, arg, sizeof (ctrl))) | 1243 | if (copy_from_user(&ctrl, arg, sizeof (ctrl))) |
| @@ -1258,15 +1269,6 @@ static int proc_ioctl (struct dev_state *ps, void __user *arg) | |||
| 1258 | /* disconnect kernel driver from interface */ | 1269 | /* disconnect kernel driver from interface */ |
| 1259 | case USBDEVFS_DISCONNECT: | 1270 | case USBDEVFS_DISCONNECT: |
| 1260 | 1271 | ||
| 1261 | /* don't allow the user to unbind the hub driver from | ||
| 1262 | * a hub with children to manage */ | ||
| 1263 | for (i = 0; i < ps->dev->maxchild; ++i) { | ||
| 1264 | if (ps->dev->children[i]) | ||
| 1265 | retval = -EBUSY; | ||
| 1266 | } | ||
| 1267 | if (retval) | ||
| 1268 | break; | ||
| 1269 | |||
| 1270 | down_write(&usb_bus_type.subsys.rwsem); | 1272 | down_write(&usb_bus_type.subsys.rwsem); |
| 1271 | if (intf->dev.driver) { | 1273 | if (intf->dev.driver) { |
| 1272 | driver = to_usb_driver(intf->dev.driver); | 1274 | driver = to_usb_driver(intf->dev.driver); |
| @@ -1477,3 +1479,79 @@ struct file_operations usbfs_device_file_operations = { | |||
| 1477 | .open = usbdev_open, | 1479 | .open = usbdev_open, |
| 1478 | .release = usbdev_release, | 1480 | .release = usbdev_release, |
| 1479 | }; | 1481 | }; |
| 1482 | |||
| 1483 | struct usb_device *usbdev_lookup_minor(int minor) | ||
| 1484 | { | ||
| 1485 | struct class_device *class_dev; | ||
| 1486 | struct usb_device *dev = NULL; | ||
| 1487 | |||
| 1488 | down(&usb_device_class->sem); | ||
| 1489 | list_for_each_entry(class_dev, &usb_device_class->children, node) { | ||
| 1490 | if (class_dev->devt == MKDEV(USB_DEVICE_MAJOR, minor)) { | ||
| 1491 | dev = class_dev->class_data; | ||
| 1492 | break; | ||
| 1493 | } | ||
| 1494 | } | ||
| 1495 | up(&usb_device_class->sem); | ||
| 1496 | |||
| 1497 | return dev; | ||
| 1498 | }; | ||
| 1499 | |||
| 1500 | void usbdev_add(struct usb_device *dev) | ||
| 1501 | { | ||
| 1502 | int minor = ((dev->bus->busnum-1) * 128) + (dev->devnum-1); | ||
| 1503 | |||
| 1504 | dev->class_dev = class_device_create(usb_device_class, | ||
| 1505 | MKDEV(USB_DEVICE_MAJOR, minor), &dev->dev, | ||
| 1506 | "usbdev%d.%d", dev->bus->busnum, dev->devnum); | ||
| 1507 | |||
| 1508 | dev->class_dev->class_data = dev; | ||
| 1509 | } | ||
| 1510 | |||
| 1511 | void usbdev_remove(struct usb_device *dev) | ||
| 1512 | { | ||
| 1513 | class_device_unregister(dev->class_dev); | ||
| 1514 | } | ||
| 1515 | |||
| 1516 | static struct cdev usb_device_cdev = { | ||
| 1517 | .kobj = {.name = "usb_device", }, | ||
| 1518 | .owner = THIS_MODULE, | ||
| 1519 | }; | ||
| 1520 | |||
| 1521 | int __init usbdev_init(void) | ||
| 1522 | { | ||
| 1523 | int retval; | ||
| 1524 | |||
| 1525 | retval = register_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX, | ||
| 1526 | "usb_device"); | ||
| 1527 | if (retval) { | ||
| 1528 | err("unable to register minors for usb_device"); | ||
| 1529 | goto out; | ||
| 1530 | } | ||
| 1531 | cdev_init(&usb_device_cdev, &usbfs_device_file_operations); | ||
| 1532 | retval = cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX); | ||
| 1533 | if (retval) { | ||
| 1534 | err("unable to get usb_device major %d", USB_DEVICE_MAJOR); | ||
| 1535 | unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX); | ||
| 1536 | goto out; | ||
| 1537 | } | ||
| 1538 | usb_device_class = class_create(THIS_MODULE, "usb_device"); | ||
| 1539 | if (IS_ERR(usb_device_class)) { | ||
| 1540 | err("unable to register usb_device class"); | ||
| 1541 | retval = PTR_ERR(usb_device_class); | ||
| 1542 | usb_device_class = NULL; | ||
| 1543 | cdev_del(&usb_device_cdev); | ||
| 1544 | unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX); | ||
| 1545 | } | ||
| 1546 | |||
| 1547 | out: | ||
| 1548 | return retval; | ||
| 1549 | } | ||
| 1550 | |||
| 1551 | void usbdev_cleanup(void) | ||
| 1552 | { | ||
| 1553 | class_destroy(usb_device_class); | ||
| 1554 | cdev_del(&usb_device_cdev); | ||
| 1555 | unregister_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX); | ||
| 1556 | } | ||
| 1557 | |||
diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c index fc056062c960..cbb451d227d2 100644 --- a/drivers/usb/core/hcd-pci.c +++ b/drivers/usb/core/hcd-pci.c | |||
| @@ -121,10 +121,6 @@ int usb_hcd_pci_probe (struct pci_dev *dev, const struct pci_device_id *id) | |||
| 121 | } | 121 | } |
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | #ifdef CONFIG_PCI_NAMES | ||
| 125 | hcd->product_desc = dev->pretty_name; | ||
| 126 | #endif | ||
| 127 | |||
| 128 | pci_set_master (dev); | 124 | pci_set_master (dev); |
| 129 | 125 | ||
| 130 | retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ); | 126 | retval = usb_add_hcd (hcd, dev->irq, SA_SHIRQ); |
| @@ -264,8 +260,10 @@ int usb_hcd_pci_suspend (struct pci_dev *dev, pm_message_t message) | |||
| 264 | retval = pci_set_power_state (dev, PCI_D3hot); | 260 | retval = pci_set_power_state (dev, PCI_D3hot); |
| 265 | if (retval == 0) { | 261 | if (retval == 0) { |
| 266 | dev_dbg (hcd->self.controller, "--> PCI D3\n"); | 262 | dev_dbg (hcd->self.controller, "--> PCI D3\n"); |
| 267 | pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup); | 263 | retval = pci_enable_wake (dev, PCI_D3hot, hcd->remote_wakeup); |
| 268 | pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup); | 264 | if (retval) |
| 265 | break; | ||
| 266 | retval = pci_enable_wake (dev, PCI_D3cold, hcd->remote_wakeup); | ||
| 269 | } else if (retval < 0) { | 267 | } else if (retval < 0) { |
| 270 | dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n", | 268 | dev_dbg (&dev->dev, "PCI D3 suspend fail, %d\n", |
| 271 | retval); | 269 | retval); |
| @@ -339,8 +337,20 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 339 | dev->current_state); | 337 | dev->current_state); |
| 340 | } | 338 | } |
| 341 | #endif | 339 | #endif |
| 342 | pci_enable_wake (dev, dev->current_state, 0); | 340 | retval = pci_enable_wake (dev, dev->current_state, 0); |
| 343 | pci_enable_wake (dev, PCI_D3cold, 0); | 341 | if (retval) { |
| 342 | dev_err(hcd->self.controller, | ||
| 343 | "can't enable_wake to %d, %d!\n", | ||
| 344 | dev->current_state, retval); | ||
| 345 | return retval; | ||
| 346 | } | ||
| 347 | retval = pci_enable_wake (dev, PCI_D3cold, 0); | ||
| 348 | if (retval) { | ||
| 349 | dev_err(hcd->self.controller, | ||
| 350 | "can't enable_wake to %d, %d!\n", | ||
| 351 | PCI_D3cold, retval); | ||
| 352 | return retval; | ||
| 353 | } | ||
| 344 | } else { | 354 | } else { |
| 345 | /* Same basic cases: clean (powered/not), dirty */ | 355 | /* Same basic cases: clean (powered/not), dirty */ |
| 346 | dev_dbg(hcd->self.controller, "PCI legacy resume\n"); | 356 | dev_dbg(hcd->self.controller, "PCI legacy resume\n"); |
| @@ -380,7 +390,7 @@ int usb_hcd_pci_resume (struct pci_dev *dev) | |||
| 380 | usb_hc_died (hcd); | 390 | usb_hc_died (hcd); |
| 381 | } | 391 | } |
| 382 | 392 | ||
| 383 | pci_enable_device(dev); | 393 | retval = pci_enable_device(dev); |
| 384 | return retval; | 394 | return retval; |
| 385 | } | 395 | } |
| 386 | EXPORT_SYMBOL (usb_hcd_pci_resume); | 396 | EXPORT_SYMBOL (usb_hcd_pci_resume); |
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 28055f95645b..ac451fa7e4d2 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
| @@ -339,11 +339,11 @@ extern int usb_check_bandwidth (struct usb_device *dev, struct urb *urb); | |||
| 339 | * to preallocate bandwidth) | 339 | * to preallocate bandwidth) |
| 340 | */ | 340 | */ |
| 341 | #define USB2_HOST_DELAY 5 /* nsec, guess */ | 341 | #define USB2_HOST_DELAY 5 /* nsec, guess */ |
| 342 | #define HS_NSECS(bytes) ( ((55 * 8 * 2083)/1000) \ | 342 | #define HS_NSECS(bytes) ( ((55 * 8 * 2083) \ |
| 343 | + ((2083UL * (3167 + BitTime (bytes)))/1000) \ | 343 | + (2083UL * (3 + BitTime(bytes))))/1000 \ |
| 344 | + USB2_HOST_DELAY) | 344 | + USB2_HOST_DELAY) |
| 345 | #define HS_NSECS_ISO(bytes) ( ((38 * 8 * 2083)/1000) \ | 345 | #define HS_NSECS_ISO(bytes) ( ((38 * 8 * 2083) \ |
| 346 | + ((2083UL * (3167 + BitTime (bytes)))/1000) \ | 346 | + (2083UL * (3 + BitTime(bytes))))/1000 \ |
| 347 | + USB2_HOST_DELAY) | 347 | + USB2_HOST_DELAY) |
| 348 | #define HS_USECS(bytes) NS_TO_US (HS_NSECS(bytes)) | 348 | #define HS_USECS(bytes) NS_TO_US (HS_NSECS(bytes)) |
| 349 | #define HS_USECS_ISO(bytes) NS_TO_US (HS_NSECS_ISO(bytes)) | 349 | #define HS_USECS_ISO(bytes) NS_TO_US (HS_NSECS_ISO(bytes)) |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index c9412daff682..758c7f0ed159 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -492,6 +492,23 @@ static int hub_hub_status(struct usb_hub *hub, | |||
| 492 | return ret; | 492 | return ret; |
| 493 | } | 493 | } |
| 494 | 494 | ||
| 495 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
| 496 | { | ||
| 497 | struct usb_device *hdev = hub->hdev; | ||
| 498 | int ret; | ||
| 499 | |||
| 500 | if (hdev->children[port1-1] && set_state) { | ||
| 501 | usb_set_device_state(hdev->children[port1-1], | ||
| 502 | USB_STATE_NOTATTACHED); | ||
| 503 | } | ||
| 504 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
| 505 | if (ret) | ||
| 506 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
| 507 | port1, ret); | ||
| 508 | |||
| 509 | return ret; | ||
| 510 | } | ||
| 511 | |||
| 495 | static int hub_configure(struct usb_hub *hub, | 512 | static int hub_configure(struct usb_hub *hub, |
| 496 | struct usb_endpoint_descriptor *endpoint) | 513 | struct usb_endpoint_descriptor *endpoint) |
| 497 | { | 514 | { |
| @@ -610,19 +627,33 @@ static int hub_configure(struct usb_hub *hub, | |||
| 610 | break; | 627 | break; |
| 611 | } | 628 | } |
| 612 | 629 | ||
| 630 | /* Note 8 FS bit times == (8 bits / 12000000 bps) ~= 666ns */ | ||
| 613 | switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { | 631 | switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) { |
| 614 | case 0x00: | 632 | case HUB_TTTT_8_BITS: |
| 615 | if (hdev->descriptor.bDeviceProtocol != 0) | 633 | if (hdev->descriptor.bDeviceProtocol != 0) { |
| 616 | dev_dbg(hub_dev, "TT requires at most 8 FS bit times\n"); | 634 | hub->tt.think_time = 666; |
| 635 | dev_dbg(hub_dev, "TT requires at most %d " | ||
| 636 | "FS bit times (%d ns)\n", | ||
| 637 | 8, hub->tt.think_time); | ||
| 638 | } | ||
| 617 | break; | 639 | break; |
| 618 | case 0x20: | 640 | case HUB_TTTT_16_BITS: |
| 619 | dev_dbg(hub_dev, "TT requires at most 16 FS bit times\n"); | 641 | hub->tt.think_time = 666 * 2; |
| 642 | dev_dbg(hub_dev, "TT requires at most %d " | ||
| 643 | "FS bit times (%d ns)\n", | ||
| 644 | 16, hub->tt.think_time); | ||
| 620 | break; | 645 | break; |
| 621 | case 0x40: | 646 | case HUB_TTTT_24_BITS: |
| 622 | dev_dbg(hub_dev, "TT requires at most 24 FS bit times\n"); | 647 | hub->tt.think_time = 666 * 3; |
| 648 | dev_dbg(hub_dev, "TT requires at most %d " | ||
| 649 | "FS bit times (%d ns)\n", | ||
| 650 | 24, hub->tt.think_time); | ||
| 623 | break; | 651 | break; |
| 624 | case 0x60: | 652 | case HUB_TTTT_32_BITS: |
| 625 | dev_dbg(hub_dev, "TT requires at most 32 FS bit times\n"); | 653 | hub->tt.think_time = 666 * 4; |
| 654 | dev_dbg(hub_dev, "TT requires at most %d " | ||
| 655 | "FS bit times (%d ns)\n", | ||
| 656 | 32, hub->tt.think_time); | ||
| 626 | break; | 657 | break; |
| 627 | } | 658 | } |
| 628 | 659 | ||
| @@ -712,20 +743,36 @@ fail: | |||
| 712 | 743 | ||
| 713 | static unsigned highspeed_hubs; | 744 | static unsigned highspeed_hubs; |
| 714 | 745 | ||
| 746 | /* Called after the hub driver is unbound from a hub with children */ | ||
| 747 | static void hub_remove_children_work(void *__hub) | ||
| 748 | { | ||
| 749 | struct usb_hub *hub = __hub; | ||
| 750 | struct usb_device *hdev = hub->hdev; | ||
| 751 | int i; | ||
| 752 | |||
| 753 | kfree(hub); | ||
| 754 | |||
| 755 | usb_lock_device(hdev); | ||
| 756 | for (i = 0; i < hdev->maxchild; ++i) { | ||
| 757 | if (hdev->children[i]) | ||
| 758 | usb_disconnect(&hdev->children[i]); | ||
| 759 | } | ||
| 760 | usb_unlock_device(hdev); | ||
| 761 | usb_put_dev(hdev); | ||
| 762 | } | ||
| 763 | |||
| 715 | static void hub_disconnect(struct usb_interface *intf) | 764 | static void hub_disconnect(struct usb_interface *intf) |
| 716 | { | 765 | { |
| 717 | struct usb_hub *hub = usb_get_intfdata (intf); | 766 | struct usb_hub *hub = usb_get_intfdata (intf); |
| 718 | struct usb_device *hdev; | 767 | struct usb_device *hdev; |
| 768 | int n, port1; | ||
| 719 | 769 | ||
| 720 | if (!hub) | 770 | usb_set_intfdata (intf, NULL); |
| 721 | return; | ||
| 722 | hdev = hub->hdev; | 771 | hdev = hub->hdev; |
| 723 | 772 | ||
| 724 | if (hdev->speed == USB_SPEED_HIGH) | 773 | if (hdev->speed == USB_SPEED_HIGH) |
| 725 | highspeed_hubs--; | 774 | highspeed_hubs--; |
| 726 | 775 | ||
| 727 | usb_set_intfdata (intf, NULL); | ||
| 728 | |||
| 729 | hub_quiesce(hub); | 776 | hub_quiesce(hub); |
| 730 | usb_free_urb(hub->urb); | 777 | usb_free_urb(hub->urb); |
| 731 | hub->urb = NULL; | 778 | hub->urb = NULL; |
| @@ -746,8 +793,27 @@ static void hub_disconnect(struct usb_interface *intf) | |||
| 746 | hub->buffer = NULL; | 793 | hub->buffer = NULL; |
| 747 | } | 794 | } |
| 748 | 795 | ||
| 749 | /* Free the memory */ | 796 | /* If there are any children then this is an unbind only, not a |
| 750 | kfree(hub); | 797 | * physical disconnection. The active ports must be disabled |
| 798 | * and later on we must call usb_disconnect(). We can't call | ||
| 799 | * it now because we may not hold the hub's device lock. | ||
| 800 | */ | ||
| 801 | n = 0; | ||
| 802 | for (port1 = 1; port1 <= hdev->maxchild; ++port1) { | ||
| 803 | if (hdev->children[port1 - 1]) { | ||
| 804 | ++n; | ||
| 805 | hub_port_disable(hub, port1, 1); | ||
| 806 | } | ||
| 807 | } | ||
| 808 | |||
| 809 | if (n == 0) | ||
| 810 | kfree(hub); | ||
| 811 | else { | ||
| 812 | /* Reuse the hub->leds work_struct for our own purposes */ | ||
| 813 | INIT_WORK(&hub->leds, hub_remove_children_work, hub); | ||
| 814 | schedule_work(&hub->leds); | ||
| 815 | usb_get_dev(hdev); | ||
| 816 | } | ||
| 751 | } | 817 | } |
| 752 | 818 | ||
| 753 | static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) | 819 | static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id) |
| @@ -1051,6 +1117,7 @@ void usb_disconnect(struct usb_device **pdev) | |||
| 1051 | dev_dbg (&udev->dev, "unregistering device\n"); | 1117 | dev_dbg (&udev->dev, "unregistering device\n"); |
| 1052 | release_address(udev); | 1118 | release_address(udev); |
| 1053 | usbfs_remove_device(udev); | 1119 | usbfs_remove_device(udev); |
| 1120 | usbdev_remove(udev); | ||
| 1054 | usb_remove_sysfs_dev_files(udev); | 1121 | usb_remove_sysfs_dev_files(udev); |
| 1055 | 1122 | ||
| 1056 | /* Avoid races with recursively_mark_NOTATTACHED() */ | 1123 | /* Avoid races with recursively_mark_NOTATTACHED() */ |
| @@ -1290,6 +1357,7 @@ int usb_new_device(struct usb_device *udev) | |||
| 1290 | /* USB device state == configured ... usable */ | 1357 | /* USB device state == configured ... usable */ |
| 1291 | 1358 | ||
| 1292 | /* add a /proc/bus/usb entry */ | 1359 | /* add a /proc/bus/usb entry */ |
| 1360 | usbdev_add(udev); | ||
| 1293 | usbfs_add_device(udev); | 1361 | usbfs_add_device(udev); |
| 1294 | return 0; | 1362 | return 0; |
| 1295 | 1363 | ||
| @@ -1428,23 +1496,6 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
| 1428 | return status; | 1496 | return status; |
| 1429 | } | 1497 | } |
| 1430 | 1498 | ||
| 1431 | static int hub_port_disable(struct usb_hub *hub, int port1, int set_state) | ||
| 1432 | { | ||
| 1433 | struct usb_device *hdev = hub->hdev; | ||
| 1434 | int ret; | ||
| 1435 | |||
| 1436 | if (hdev->children[port1-1] && set_state) { | ||
| 1437 | usb_set_device_state(hdev->children[port1-1], | ||
| 1438 | USB_STATE_NOTATTACHED); | ||
| 1439 | } | ||
| 1440 | ret = clear_port_feature(hdev, port1, USB_PORT_FEAT_ENABLE); | ||
| 1441 | if (ret) | ||
| 1442 | dev_err(hub->intfdev, "cannot disable port %d (err = %d)\n", | ||
| 1443 | port1, ret); | ||
| 1444 | |||
| 1445 | return ret; | ||
| 1446 | } | ||
| 1447 | |||
| 1448 | /* | 1499 | /* |
| 1449 | * Disable a port and mark a logical connnect-change event, so that some | 1500 | * Disable a port and mark a logical connnect-change event, so that some |
| 1450 | * time later khubd will disconnect() any existing usb_device on the port | 1501 | * time later khubd will disconnect() any existing usb_device on the port |
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 53bf5649621e..e7fa9b5a521e 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h | |||
| @@ -157,6 +157,12 @@ enum hub_led_mode { | |||
| 157 | 157 | ||
| 158 | struct usb_device; | 158 | struct usb_device; |
| 159 | 159 | ||
| 160 | /* Transaction Translator Think Times, in bits */ | ||
| 161 | #define HUB_TTTT_8_BITS 0x00 | ||
| 162 | #define HUB_TTTT_16_BITS 0x20 | ||
| 163 | #define HUB_TTTT_24_BITS 0x40 | ||
| 164 | #define HUB_TTTT_32_BITS 0x60 | ||
| 165 | |||
| 160 | /* | 166 | /* |
| 161 | * As of USB 2.0, full/low speed devices are segregated into trees. | 167 | * As of USB 2.0, full/low speed devices are segregated into trees. |
| 162 | * One type grows from USB 1.1 host controllers (OHCI, UHCI etc). | 168 | * One type grows from USB 1.1 host controllers (OHCI, UHCI etc). |
| @@ -170,6 +176,7 @@ struct usb_device; | |||
| 170 | struct usb_tt { | 176 | struct usb_tt { |
| 171 | struct usb_device *hub; /* upstream highspeed hub */ | 177 | struct usb_device *hub; /* upstream highspeed hub */ |
| 172 | int multi; /* true means one TT per port */ | 178 | int multi; /* true means one TT per port */ |
| 179 | unsigned think_time; /* think time in ns */ | ||
| 173 | 180 | ||
| 174 | /* for control/bulk error recovery (CLEAR_TT_BUFFER) */ | 181 | /* for control/bulk error recovery (CLEAR_TT_BUFFER) */ |
| 175 | spinlock_t lock; | 182 | spinlock_t lock; |
diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c index c3e3a95d3804..640f41e47029 100644 --- a/drivers/usb/core/inode.c +++ b/drivers/usb/core/inode.c | |||
| @@ -728,15 +728,9 @@ int __init usbfs_init(void) | |||
| 728 | { | 728 | { |
| 729 | int retval; | 729 | int retval; |
| 730 | 730 | ||
| 731 | retval = usb_register(&usbfs_driver); | ||
| 732 | if (retval) | ||
| 733 | return retval; | ||
| 734 | |||
| 735 | retval = register_filesystem(&usb_fs_type); | 731 | retval = register_filesystem(&usb_fs_type); |
| 736 | if (retval) { | 732 | if (retval) |
| 737 | usb_deregister(&usbfs_driver); | ||
| 738 | return retval; | 733 | return retval; |
| 739 | } | ||
| 740 | 734 | ||
| 741 | /* create mount point for usbfs */ | 735 | /* create mount point for usbfs */ |
| 742 | usbdir = proc_mkdir("usb", proc_bus); | 736 | usbdir = proc_mkdir("usb", proc_bus); |
| @@ -746,7 +740,6 @@ int __init usbfs_init(void) | |||
| 746 | 740 | ||
| 747 | void usbfs_cleanup(void) | 741 | void usbfs_cleanup(void) |
| 748 | { | 742 | { |
| 749 | usb_deregister(&usbfs_driver); | ||
| 750 | unregister_filesystem(&usb_fs_type); | 743 | unregister_filesystem(&usb_fs_type); |
| 751 | if (usbdir) | 744 | if (usbdir) |
| 752 | remove_proc_entry("usb", proc_bus); | 745 | remove_proc_entry("usb", proc_bus); |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 88d1b376f67c..c47c8052b486 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -48,7 +48,6 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length) | |||
| 48 | 48 | ||
| 49 | init_completion(&done); | 49 | init_completion(&done); |
| 50 | urb->context = &done; | 50 | urb->context = &done; |
| 51 | urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 52 | urb->actual_length = 0; | 51 | urb->actual_length = 0; |
| 53 | status = usb_submit_urb(urb, GFP_NOIO); | 52 | status = usb_submit_urb(urb, GFP_NOIO); |
| 54 | 53 | ||
| @@ -266,7 +265,9 @@ static void sg_complete (struct urb *urb, struct pt_regs *regs) | |||
| 266 | continue; | 265 | continue; |
| 267 | if (found) { | 266 | if (found) { |
| 268 | status = usb_unlink_urb (io->urbs [i]); | 267 | status = usb_unlink_urb (io->urbs [i]); |
| 269 | if (status != -EINPROGRESS && status != -EBUSY) | 268 | if (status != -EINPROGRESS |
| 269 | && status != -ENODEV | ||
| 270 | && status != -EBUSY) | ||
| 270 | dev_err (&io->dev->dev, | 271 | dev_err (&io->dev->dev, |
| 271 | "%s, unlink --> %d\n", | 272 | "%s, unlink --> %d\n", |
| 272 | __FUNCTION__, status); | 273 | __FUNCTION__, status); |
| @@ -357,8 +358,7 @@ int usb_sg_init ( | |||
| 357 | if (!io->urbs) | 358 | if (!io->urbs) |
| 358 | goto nomem; | 359 | goto nomem; |
| 359 | 360 | ||
| 360 | urb_flags = URB_ASYNC_UNLINK | URB_NO_TRANSFER_DMA_MAP | 361 | urb_flags = URB_NO_TRANSFER_DMA_MAP | URB_NO_INTERRUPT; |
| 361 | | URB_NO_INTERRUPT; | ||
| 362 | if (usb_pipein (pipe)) | 362 | if (usb_pipein (pipe)) |
| 363 | urb_flags |= URB_SHORT_NOT_OK; | 363 | urb_flags |= URB_SHORT_NOT_OK; |
| 364 | 364 | ||
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index c0feee25ff0a..c846fefb7386 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
| @@ -309,9 +309,8 @@ int usb_submit_urb(struct urb *urb, unsigned mem_flags) | |||
| 309 | unsigned int allowed; | 309 | unsigned int allowed; |
| 310 | 310 | ||
| 311 | /* enforce simple/standard policy */ | 311 | /* enforce simple/standard policy */ |
| 312 | allowed = URB_ASYNC_UNLINK; // affects later unlinks | 312 | allowed = (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP | |
| 313 | allowed |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); | 313 | URB_NO_INTERRUPT); |
| 314 | allowed |= URB_NO_INTERRUPT; | ||
| 315 | switch (temp) { | 314 | switch (temp) { |
| 316 | case PIPE_BULK: | 315 | case PIPE_BULK: |
| 317 | if (is_out) | 316 | if (is_out) |
| @@ -400,14 +399,8 @@ int usb_submit_urb(struct urb *urb, unsigned mem_flags) | |||
| 400 | * canceled (rather than any other code) and will quickly be removed | 399 | * canceled (rather than any other code) and will quickly be removed |
| 401 | * from host controller data structures. | 400 | * from host controller data structures. |
| 402 | * | 401 | * |
| 403 | * In the past, clearing the URB_ASYNC_UNLINK transfer flag for the | 402 | * This request is always asynchronous. |
| 404 | * URB indicated that the request was synchronous. This usage is now | 403 | * Success is indicated by returning -EINPROGRESS, |
| 405 | * deprecated; if the flag is clear the call will be forwarded to | ||
| 406 | * usb_kill_urb() and the return value will be 0. In the future, drivers | ||
| 407 | * should call usb_kill_urb() directly for synchronous unlinking. | ||
| 408 | * | ||
| 409 | * When the URB_ASYNC_UNLINK transfer flag for the URB is set, this | ||
| 410 | * request is asynchronous. Success is indicated by returning -EINPROGRESS, | ||
| 411 | * at which time the URB will normally have been unlinked but not yet | 404 | * at which time the URB will normally have been unlinked but not yet |
| 412 | * given back to the device driver. When it is called, the completion | 405 | * given back to the device driver. When it is called, the completion |
| 413 | * function will see urb->status == -ECONNRESET. Failure is indicated | 406 | * function will see urb->status == -ECONNRESET. Failure is indicated |
| @@ -453,17 +446,6 @@ int usb_unlink_urb(struct urb *urb) | |||
| 453 | { | 446 | { |
| 454 | if (!urb) | 447 | if (!urb) |
| 455 | return -EINVAL; | 448 | return -EINVAL; |
| 456 | if (!(urb->transfer_flags & URB_ASYNC_UNLINK)) { | ||
| 457 | #ifdef CONFIG_DEBUG_KERNEL | ||
| 458 | if (printk_ratelimit()) { | ||
| 459 | printk(KERN_NOTICE "usb_unlink_urb() is deprecated for " | ||
| 460 | "synchronous unlinks. Use usb_kill_urb() instead.\n"); | ||
| 461 | WARN_ON(1); | ||
| 462 | } | ||
| 463 | #endif | ||
| 464 | usb_kill_urb(urb); | ||
| 465 | return 0; | ||
| 466 | } | ||
| 467 | if (!(urb->dev && urb->dev->bus && urb->dev->bus->op)) | 449 | if (!(urb->dev && urb->dev->bus && urb->dev->bus->op)) |
| 468 | return -ENODEV; | 450 | return -ENODEV; |
| 469 | return urb->dev->bus->op->unlink_urb(urb, -ECONNRESET); | 451 | return urb->dev->bus->op->unlink_urb(urb, -ECONNRESET); |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 2cddd8a00437..087af73a59dd 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
| @@ -65,6 +65,16 @@ static int generic_probe (struct device *dev) | |||
| 65 | } | 65 | } |
| 66 | static int generic_remove (struct device *dev) | 66 | static int generic_remove (struct device *dev) |
| 67 | { | 67 | { |
| 68 | struct usb_device *udev = to_usb_device(dev); | ||
| 69 | |||
| 70 | /* if this is only an unbind, not a physical disconnect, then | ||
| 71 | * unconfigure the device */ | ||
| 72 | if (udev->state == USB_STATE_CONFIGURED) | ||
| 73 | usb_set_configuration(udev, 0); | ||
| 74 | |||
| 75 | /* in case the call failed or the device was suspended */ | ||
| 76 | if (udev->state >= USB_STATE_CONFIGURED) | ||
| 77 | usb_disable_device(udev, 0); | ||
| 68 | return 0; | 78 | return 0; |
| 69 | } | 79 | } |
| 70 | 80 | ||
| @@ -912,7 +922,7 @@ int usb_trylock_device(struct usb_device *udev) | |||
| 912 | * is neither BINDING nor BOUND. Rather than sleeping to wait for the | 922 | * is neither BINDING nor BOUND. Rather than sleeping to wait for the |
| 913 | * lock, the routine polls repeatedly. This is to prevent deadlock with | 923 | * lock, the routine polls repeatedly. This is to prevent deadlock with |
| 914 | * disconnect; in some drivers (such as usb-storage) the disconnect() | 924 | * disconnect; in some drivers (such as usb-storage) the disconnect() |
| 915 | * callback will block waiting for a device reset to complete. | 925 | * or suspend() method will block waiting for a device reset to complete. |
| 916 | * | 926 | * |
| 917 | * Returns a negative error code for failure, otherwise 1 or 0 to indicate | 927 | * Returns a negative error code for failure, otherwise 1 or 0 to indicate |
| 918 | * that the device will or will not have to be unlocked. (0 can be | 928 | * that the device will or will not have to be unlocked. (0 can be |
| @@ -922,6 +932,8 @@ int usb_trylock_device(struct usb_device *udev) | |||
| 922 | int usb_lock_device_for_reset(struct usb_device *udev, | 932 | int usb_lock_device_for_reset(struct usb_device *udev, |
| 923 | struct usb_interface *iface) | 933 | struct usb_interface *iface) |
| 924 | { | 934 | { |
| 935 | unsigned long jiffies_expire = jiffies + HZ; | ||
| 936 | |||
| 925 | if (udev->state == USB_STATE_NOTATTACHED) | 937 | if (udev->state == USB_STATE_NOTATTACHED) |
| 926 | return -ENODEV; | 938 | return -ENODEV; |
| 927 | if (udev->state == USB_STATE_SUSPENDED) | 939 | if (udev->state == USB_STATE_SUSPENDED) |
| @@ -938,6 +950,12 @@ int usb_lock_device_for_reset(struct usb_device *udev, | |||
| 938 | } | 950 | } |
| 939 | 951 | ||
| 940 | while (!usb_trylock_device(udev)) { | 952 | while (!usb_trylock_device(udev)) { |
| 953 | |||
| 954 | /* If we can't acquire the lock after waiting one second, | ||
| 955 | * we're probably deadlocked */ | ||
| 956 | if (time_after(jiffies, jiffies_expire)) | ||
| 957 | return -EBUSY; | ||
| 958 | |||
| 941 | msleep(15); | 959 | msleep(15); |
| 942 | if (udev->state == USB_STATE_NOTATTACHED) | 960 | if (udev->state == USB_STATE_NOTATTACHED) |
| 943 | return -ENODEV; | 961 | return -ENODEV; |
| @@ -1478,13 +1496,18 @@ static int __init usb_init(void) | |||
| 1478 | retval = usb_major_init(); | 1496 | retval = usb_major_init(); |
| 1479 | if (retval) | 1497 | if (retval) |
| 1480 | goto major_init_failed; | 1498 | goto major_init_failed; |
| 1499 | retval = usb_register(&usbfs_driver); | ||
| 1500 | if (retval) | ||
| 1501 | goto driver_register_failed; | ||
| 1502 | retval = usbdev_init(); | ||
| 1503 | if (retval) | ||
| 1504 | goto usbdevice_init_failed; | ||
| 1481 | retval = usbfs_init(); | 1505 | retval = usbfs_init(); |
| 1482 | if (retval) | 1506 | if (retval) |
| 1483 | goto fs_init_failed; | 1507 | goto fs_init_failed; |
| 1484 | retval = usb_hub_init(); | 1508 | retval = usb_hub_init(); |
| 1485 | if (retval) | 1509 | if (retval) |
| 1486 | goto hub_init_failed; | 1510 | goto hub_init_failed; |
| 1487 | |||
| 1488 | retval = driver_register(&usb_generic_driver); | 1511 | retval = driver_register(&usb_generic_driver); |
| 1489 | if (!retval) | 1512 | if (!retval) |
| 1490 | goto out; | 1513 | goto out; |
| @@ -1493,7 +1516,11 @@ static int __init usb_init(void) | |||
| 1493 | hub_init_failed: | 1516 | hub_init_failed: |
| 1494 | usbfs_cleanup(); | 1517 | usbfs_cleanup(); |
| 1495 | fs_init_failed: | 1518 | fs_init_failed: |
| 1496 | usb_major_cleanup(); | 1519 | usbdev_cleanup(); |
| 1520 | usbdevice_init_failed: | ||
| 1521 | usb_deregister(&usbfs_driver); | ||
| 1522 | driver_register_failed: | ||
| 1523 | usb_major_cleanup(); | ||
| 1497 | major_init_failed: | 1524 | major_init_failed: |
| 1498 | usb_host_cleanup(); | 1525 | usb_host_cleanup(); |
| 1499 | host_init_failed: | 1526 | host_init_failed: |
| @@ -1514,6 +1541,8 @@ static void __exit usb_exit(void) | |||
| 1514 | driver_unregister(&usb_generic_driver); | 1541 | driver_unregister(&usb_generic_driver); |
| 1515 | usb_major_cleanup(); | 1542 | usb_major_cleanup(); |
| 1516 | usbfs_cleanup(); | 1543 | usbfs_cleanup(); |
| 1544 | usb_deregister(&usbfs_driver); | ||
| 1545 | usbdev_cleanup(); | ||
| 1517 | usb_hub_cleanup(); | 1546 | usb_hub_cleanup(); |
| 1518 | usb_host_cleanup(); | 1547 | usb_host_cleanup(); |
| 1519 | bus_unregister(&usb_bus_type); | 1548 | bus_unregister(&usb_bus_type); |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 2c690f6d4c18..83d48c8133af 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
| @@ -37,6 +37,11 @@ extern struct file_operations usbfs_devices_fops; | |||
| 37 | extern struct file_operations usbfs_device_file_operations; | 37 | extern struct file_operations usbfs_device_file_operations; |
| 38 | extern void usbfs_conn_disc_event(void); | 38 | extern void usbfs_conn_disc_event(void); |
| 39 | 39 | ||
| 40 | extern int usbdev_init(void); | ||
| 41 | extern void usbdev_cleanup(void); | ||
| 42 | extern void usbdev_add(struct usb_device *dev); | ||
| 43 | extern void usbdev_remove(struct usb_device *dev); | ||
| 44 | extern struct usb_device *usbdev_lookup_minor(int minor); | ||
| 40 | 45 | ||
| 41 | struct dev_state { | 46 | struct dev_state { |
| 42 | struct list_head list; /* state list */ | 47 | struct list_head list; /* state list */ |
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 8509e955007d..49459e33e952 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
| @@ -2181,6 +2181,7 @@ eth_bind (struct usb_gadget *gadget) | |||
| 2181 | u8 cdc = 1, zlp = 1, rndis = 1; | 2181 | u8 cdc = 1, zlp = 1, rndis = 1; |
| 2182 | struct usb_ep *in_ep, *out_ep, *status_ep = NULL; | 2182 | struct usb_ep *in_ep, *out_ep, *status_ep = NULL; |
| 2183 | int status = -ENOMEM; | 2183 | int status = -ENOMEM; |
| 2184 | int gcnum; | ||
| 2184 | 2185 | ||
| 2185 | /* these flags are only ever cleared; compiler take note */ | 2186 | /* these flags are only ever cleared; compiler take note */ |
| 2186 | #ifndef DEV_CONFIG_CDC | 2187 | #ifndef DEV_CONFIG_CDC |
| @@ -2194,44 +2195,26 @@ eth_bind (struct usb_gadget *gadget) | |||
| 2194 | * standard protocol is _strongly_ preferred for interop purposes. | 2195 | * standard protocol is _strongly_ preferred for interop purposes. |
| 2195 | * (By everyone except Microsoft.) | 2196 | * (By everyone except Microsoft.) |
| 2196 | */ | 2197 | */ |
| 2197 | if (gadget_is_net2280 (gadget)) { | 2198 | if (gadget_is_pxa (gadget)) { |
| 2198 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201); | ||
| 2199 | } else if (gadget_is_dummy (gadget)) { | ||
| 2200 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0202); | ||
| 2201 | } else if (gadget_is_pxa (gadget)) { | ||
| 2202 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203); | ||
| 2203 | /* pxa doesn't support altsettings */ | 2199 | /* pxa doesn't support altsettings */ |
| 2204 | cdc = 0; | 2200 | cdc = 0; |
| 2205 | } else if (gadget_is_sh(gadget)) { | 2201 | } else if (gadget_is_sh(gadget)) { |
| 2206 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204); | ||
| 2207 | /* sh doesn't support multiple interfaces or configs */ | 2202 | /* sh doesn't support multiple interfaces or configs */ |
| 2208 | cdc = 0; | 2203 | cdc = 0; |
| 2209 | rndis = 0; | 2204 | rndis = 0; |
| 2210 | } else if (gadget_is_sa1100 (gadget)) { | 2205 | } else if (gadget_is_sa1100 (gadget)) { |
| 2211 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205); | ||
| 2212 | /* hardware can't write zlps */ | 2206 | /* hardware can't write zlps */ |
| 2213 | zlp = 0; | 2207 | zlp = 0; |
| 2214 | /* sa1100 CAN do CDC, without status endpoint ... we use | 2208 | /* sa1100 CAN do CDC, without status endpoint ... we use |
| 2215 | * non-CDC to be compatible with ARM Linux-2.4 "usb-eth". | 2209 | * non-CDC to be compatible with ARM Linux-2.4 "usb-eth". |
| 2216 | */ | 2210 | */ |
| 2217 | cdc = 0; | 2211 | cdc = 0; |
| 2218 | } else if (gadget_is_goku (gadget)) { | 2212 | } |
| 2219 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206); | 2213 | |
| 2220 | } else if (gadget_is_mq11xx (gadget)) { | 2214 | gcnum = usb_gadget_controller_number (gadget); |
| 2221 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207); | 2215 | if (gcnum >= 0) |
| 2222 | } else if (gadget_is_omap (gadget)) { | 2216 | device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum); |
| 2223 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208); | 2217 | else { |
| 2224 | } else if (gadget_is_lh7a40x(gadget)) { | ||
| 2225 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209); | ||
| 2226 | } else if (gadget_is_n9604(gadget)) { | ||
| 2227 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210); | ||
| 2228 | } else if (gadget_is_pxa27x(gadget)) { | ||
| 2229 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211); | ||
| 2230 | } else if (gadget_is_s3c2410(gadget)) { | ||
| 2231 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0212); | ||
| 2232 | } else if (gadget_is_at91(gadget)) { | ||
| 2233 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0213); | ||
| 2234 | } else { | ||
| 2235 | /* can't assume CDC works. don't want to default to | 2218 | /* can't assume CDC works. don't want to default to |
| 2236 | * anything less functional on CDC-capable hardware, | 2219 | * anything less functional on CDC-capable hardware, |
| 2237 | * so we fail in this case. | 2220 | * so we fail in this case. |
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c index 4f57085619b4..a41d9d4baee3 100644 --- a/drivers/usb/gadget/file_storage.c +++ b/drivers/usb/gadget/file_storage.c | |||
| @@ -3713,6 +3713,7 @@ static void fsg_unbind(struct usb_gadget *gadget) | |||
| 3713 | static int __init check_parameters(struct fsg_dev *fsg) | 3713 | static int __init check_parameters(struct fsg_dev *fsg) |
| 3714 | { | 3714 | { |
| 3715 | int prot; | 3715 | int prot; |
| 3716 | int gcnum; | ||
| 3716 | 3717 | ||
| 3717 | /* Store the default values */ | 3718 | /* Store the default values */ |
| 3718 | mod_data.transport_type = USB_PR_BULK; | 3719 | mod_data.transport_type = USB_PR_BULK; |
| @@ -3724,33 +3725,13 @@ static int __init check_parameters(struct fsg_dev *fsg) | |||
| 3724 | mod_data.can_stall = 0; | 3725 | mod_data.can_stall = 0; |
| 3725 | 3726 | ||
| 3726 | if (mod_data.release == 0xffff) { // Parameter wasn't set | 3727 | if (mod_data.release == 0xffff) { // Parameter wasn't set |
| 3727 | if (gadget_is_net2280(fsg->gadget)) | ||
| 3728 | mod_data.release = 0x0301; | ||
| 3729 | else if (gadget_is_dummy(fsg->gadget)) | ||
| 3730 | mod_data.release = 0x0302; | ||
| 3731 | else if (gadget_is_pxa(fsg->gadget)) | ||
| 3732 | mod_data.release = 0x0303; | ||
| 3733 | else if (gadget_is_sh(fsg->gadget)) | ||
| 3734 | mod_data.release = 0x0304; | ||
| 3735 | |||
| 3736 | /* The sa1100 controller is not supported */ | 3728 | /* The sa1100 controller is not supported */ |
| 3737 | 3729 | if (gadget_is_sa1100(fsg->gadget)) | |
| 3738 | else if (gadget_is_goku(fsg->gadget)) | 3730 | gcnum = -1; |
| 3739 | mod_data.release = 0x0306; | 3731 | else |
| 3740 | else if (gadget_is_mq11xx(fsg->gadget)) | 3732 | gcnum = usb_gadget_controller_number(fsg->gadget); |
| 3741 | mod_data.release = 0x0307; | 3733 | if (gcnum >= 0) |
| 3742 | else if (gadget_is_omap(fsg->gadget)) | 3734 | mod_data.release = 0x0300 + gcnum; |
| 3743 | mod_data.release = 0x0308; | ||
| 3744 | else if (gadget_is_lh7a40x(fsg->gadget)) | ||
| 3745 | mod_data.release = 0x0309; | ||
| 3746 | else if (gadget_is_n9604(fsg->gadget)) | ||
| 3747 | mod_data.release = 0x0310; | ||
| 3748 | else if (gadget_is_pxa27x(fsg->gadget)) | ||
| 3749 | mod_data.release = 0x0311; | ||
| 3750 | else if (gadget_is_s3c2410(gadget)) | ||
| 3751 | mod_data.release = 0x0312; | ||
| 3752 | else if (gadget_is_at91(fsg->gadget)) | ||
| 3753 | mod_data.release = 0x0313; | ||
| 3754 | else { | 3735 | else { |
| 3755 | WARN(fsg, "controller '%s' not recognized\n", | 3736 | WARN(fsg, "controller '%s' not recognized\n", |
| 3756 | fsg->gadget->name); | 3737 | fsg->gadget->name); |
diff --git a/drivers/usb/gadget/gadget_chips.h b/drivers/usb/gadget/gadget_chips.h index ea2eb52c766d..8cbae21d84b9 100644 --- a/drivers/usb/gadget/gadget_chips.h +++ b/drivers/usb/gadget/gadget_chips.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | * | 5 | * |
| 6 | * This could eventually work like the ARM mach_is_*() stuff, driven by | 6 | * This could eventually work like the ARM mach_is_*() stuff, driven by |
| 7 | * some config file that gets updated as new hardware is supported. | 7 | * some config file that gets updated as new hardware is supported. |
| 8 | * (And avoiding the runtime comparisons in typical one-choice cases.) | ||
| 8 | * | 9 | * |
| 9 | * NOTE: some of these controller drivers may not be available yet. | 10 | * NOTE: some of these controller drivers may not be available yet. |
| 10 | */ | 11 | */ |
| @@ -86,7 +87,61 @@ | |||
| 86 | #define gadget_is_at91(g) 0 | 87 | #define gadget_is_at91(g) 0 |
| 87 | #endif | 88 | #endif |
| 88 | 89 | ||
| 90 | #ifdef CONFIG_USB_GADGET_IMX | ||
| 91 | #define gadget_is_imx(g) !strcmp("imx_udc", (g)->name) | ||
| 92 | #else | ||
| 93 | #define gadget_is_imx(g) 0 | ||
| 94 | #endif | ||
| 95 | |||
| 89 | // CONFIG_USB_GADGET_SX2 | 96 | // CONFIG_USB_GADGET_SX2 |
| 90 | // CONFIG_USB_GADGET_AU1X00 | 97 | // CONFIG_USB_GADGET_AU1X00 |
| 91 | // ... | 98 | // ... |
| 92 | 99 | ||
| 100 | |||
| 101 | /** | ||
| 102 | * usb_gadget_controller_number - support bcdDevice id convention | ||
| 103 | * @gadget: the controller being driven | ||
| 104 | * | ||
| 105 | * Return a 2-digit BCD value associated with the peripheral controller, | ||
| 106 | * suitable for use as part of a bcdDevice value, or a negative error code. | ||
| 107 | * | ||
| 108 | * NOTE: this convention is purely optional, and has no meaning in terms of | ||
| 109 | * any USB specification. If you want to use a different convention in your | ||
| 110 | * gadget driver firmware -- maybe a more formal revision ID -- feel free. | ||
| 111 | * | ||
| 112 | * Hosts see these bcdDevice numbers, and are allowed (but not encouraged!) | ||
| 113 | * to change their behavior accordingly. For example it might help avoiding | ||
| 114 | * some chip bug. | ||
| 115 | */ | ||
| 116 | static inline int usb_gadget_controller_number(struct usb_gadget *gadget) | ||
| 117 | { | ||
| 118 | if (gadget_is_net2280(gadget)) | ||
| 119 | return 0x01; | ||
| 120 | else if (gadget_is_dummy(gadget)) | ||
| 121 | return 0x02; | ||
| 122 | else if (gadget_is_pxa(gadget)) | ||
| 123 | return 0x03; | ||
| 124 | else if (gadget_is_sh(gadget)) | ||
| 125 | return 0x04; | ||
| 126 | else if (gadget_is_sa1100(gadget)) | ||
| 127 | return 0x05; | ||
| 128 | else if (gadget_is_goku(gadget)) | ||
| 129 | return 0x06; | ||
| 130 | else if (gadget_is_mq11xx(gadget)) | ||
| 131 | return 0x07; | ||
| 132 | else if (gadget_is_omap(gadget)) | ||
| 133 | return 0x08; | ||
| 134 | else if (gadget_is_lh7a40x(gadget)) | ||
| 135 | return 0x09; | ||
| 136 | else if (gadget_is_n9604(gadget)) | ||
| 137 | return 0x10; | ||
| 138 | else if (gadget_is_pxa27x(gadget)) | ||
| 139 | return 0x11; | ||
| 140 | else if (gadget_is_s3c2410(gadget)) | ||
| 141 | return 0x12; | ||
| 142 | else if (gadget_is_at91(gadget)) | ||
| 143 | return 0x13; | ||
| 144 | else if (gadget_is_imx(gadget)) | ||
| 145 | return 0x14; | ||
| 146 | return -ENOENT; | ||
| 147 | } | ||
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index 9e4f1c6935a5..c925d9222f53 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
| @@ -1422,49 +1422,20 @@ static int gs_bind(struct usb_gadget *gadget) | |||
| 1422 | int ret; | 1422 | int ret; |
| 1423 | struct usb_ep *ep; | 1423 | struct usb_ep *ep; |
| 1424 | struct gs_dev *dev; | 1424 | struct gs_dev *dev; |
| 1425 | int gcnum; | ||
| 1425 | 1426 | ||
| 1426 | /* device specific */ | 1427 | /* Some controllers can't support CDC ACM: |
| 1427 | if (gadget_is_net2280(gadget)) { | 1428 | * - sh doesn't support multiple interfaces or configs; |
| 1428 | gs_device_desc.bcdDevice = | 1429 | * - sa1100 doesn't have a third interrupt endpoint |
| 1429 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0001); | 1430 | */ |
| 1430 | } else if (gadget_is_pxa(gadget)) { | 1431 | if (gadget_is_sh(gadget) || gadget_is_sa1100(gadget)) |
| 1431 | gs_device_desc.bcdDevice = | ||
| 1432 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0002); | ||
| 1433 | } else if (gadget_is_sh(gadget)) { | ||
| 1434 | gs_device_desc.bcdDevice = | ||
| 1435 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0003); | ||
| 1436 | /* sh doesn't support multiple interfaces or configs */ | ||
| 1437 | use_acm = 0; | 1432 | use_acm = 0; |
| 1438 | } else if (gadget_is_sa1100(gadget)) { | 1433 | |
| 1439 | gs_device_desc.bcdDevice = | 1434 | gcnum = usb_gadget_controller_number(gadget); |
| 1440 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0004); | 1435 | if (gcnum >= 0) |
| 1441 | /* sa1100 doesn't support necessary endpoints */ | ||
| 1442 | use_acm = 0; | ||
| 1443 | } else if (gadget_is_goku(gadget)) { | ||
| 1444 | gs_device_desc.bcdDevice = | ||
| 1445 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0005); | ||
| 1446 | } else if (gadget_is_mq11xx(gadget)) { | ||
| 1447 | gs_device_desc.bcdDevice = | ||
| 1448 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0006); | ||
| 1449 | } else if (gadget_is_omap(gadget)) { | ||
| 1450 | gs_device_desc.bcdDevice = | ||
| 1451 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0007); | ||
| 1452 | } else if (gadget_is_lh7a40x(gadget)) { | ||
| 1453 | gs_device_desc.bcdDevice = | ||
| 1454 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0008); | ||
| 1455 | } else if (gadget_is_n9604(gadget)) { | ||
| 1456 | gs_device_desc.bcdDevice = | ||
| 1457 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0009); | ||
| 1458 | } else if (gadget_is_pxa27x(gadget)) { | ||
| 1459 | gs_device_desc.bcdDevice = | ||
| 1460 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0011); | ||
| 1461 | } else if (gadget_is_s3c2410(gadget)) { | ||
| 1462 | gs_device_desc.bcdDevice = | ||
| 1463 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0012); | ||
| 1464 | } else if (gadget_is_at91(gadget)) { | ||
| 1465 | gs_device_desc.bcdDevice = | 1436 | gs_device_desc.bcdDevice = |
| 1466 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0013); | 1437 | cpu_to_le16(GS_VERSION_NUM | gcnum); |
| 1467 | } else { | 1438 | else { |
| 1468 | printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n", | 1439 | printk(KERN_WARNING "gs_bind: controller '%s' not recognized\n", |
| 1469 | gadget->name); | 1440 | gadget->name); |
| 1470 | /* unrecognized, but safe unless bulk is REALLY quirky */ | 1441 | /* unrecognized, but safe unless bulk is REALLY quirky */ |
diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c index bb9b2d94eed5..6890e773b2a2 100644 --- a/drivers/usb/gadget/zero.c +++ b/drivers/usb/gadget/zero.c | |||
| @@ -1139,6 +1139,13 @@ zero_bind (struct usb_gadget *gadget) | |||
| 1139 | { | 1139 | { |
| 1140 | struct zero_dev *dev; | 1140 | struct zero_dev *dev; |
| 1141 | struct usb_ep *ep; | 1141 | struct usb_ep *ep; |
| 1142 | int gcnum; | ||
| 1143 | |||
| 1144 | /* FIXME this can't yet work right with SH ... it has only | ||
| 1145 | * one configuration, numbered one. | ||
| 1146 | */ | ||
| 1147 | if (gadget_is_sh(gadget)) | ||
| 1148 | return -ENODEV; | ||
| 1142 | 1149 | ||
| 1143 | /* Bulk-only drivers like this one SHOULD be able to | 1150 | /* Bulk-only drivers like this one SHOULD be able to |
| 1144 | * autoconfigure on any sane usb controller driver, | 1151 | * autoconfigure on any sane usb controller driver, |
| @@ -1161,43 +1168,10 @@ autoconf_fail: | |||
| 1161 | EP_OUT_NAME = ep->name; | 1168 | EP_OUT_NAME = ep->name; |
| 1162 | ep->driver_data = ep; /* claim */ | 1169 | ep->driver_data = ep; /* claim */ |
| 1163 | 1170 | ||
| 1164 | 1171 | gcnum = usb_gadget_controller_number (gadget); | |
| 1165 | /* | 1172 | if (gcnum >= 0) |
| 1166 | * DRIVER POLICY CHOICE: you may want to do this differently. | 1173 | device_desc.bcdDevice = cpu_to_le16 (0x0200 + gcnum); |
| 1167 | * One thing to avoid is reusing a bcdDevice revision code | 1174 | else { |
| 1168 | * with different host-visible configurations or behavior | ||
| 1169 | * restrictions -- using ep1in/ep2out vs ep1out/ep3in, etc | ||
| 1170 | */ | ||
| 1171 | if (gadget_is_net2280 (gadget)) { | ||
| 1172 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0201); | ||
| 1173 | } else if (gadget_is_pxa (gadget)) { | ||
| 1174 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0203); | ||
| 1175 | #if 0 | ||
| 1176 | } else if (gadget_is_sh(gadget)) { | ||
| 1177 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0204); | ||
| 1178 | /* SH has only one configuration; see "loopdefault" */ | ||
| 1179 | device_desc.bNumConfigurations = 1; | ||
| 1180 | /* FIXME make 1 == default.bConfigurationValue */ | ||
| 1181 | #endif | ||
| 1182 | } else if (gadget_is_sa1100 (gadget)) { | ||
| 1183 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0205); | ||
| 1184 | } else if (gadget_is_goku (gadget)) { | ||
| 1185 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0206); | ||
| 1186 | } else if (gadget_is_mq11xx (gadget)) { | ||
| 1187 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0207); | ||
| 1188 | } else if (gadget_is_omap (gadget)) { | ||
| 1189 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0208); | ||
| 1190 | } else if (gadget_is_lh7a40x(gadget)) { | ||
| 1191 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0209); | ||
| 1192 | } else if (gadget_is_n9604(gadget)) { | ||
| 1193 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0210); | ||
| 1194 | } else if (gadget_is_pxa27x(gadget)) { | ||
| 1195 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0211); | ||
| 1196 | } else if (gadget_is_s3c2410(gadget)) { | ||
| 1197 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0212); | ||
| 1198 | } else if (gadget_is_at91(gadget)) { | ||
| 1199 | device_desc.bcdDevice = __constant_cpu_to_le16 (0x0213); | ||
| 1200 | } else { | ||
| 1201 | /* gadget zero is so simple (for now, no altsettings) that | 1175 | /* gadget zero is so simple (for now, no altsettings) that |
| 1202 | * it SHOULD NOT have problems with bulk-capable hardware. | 1176 | * it SHOULD NOT have problems with bulk-capable hardware. |
| 1203 | * so warn about unrcognized controllers, don't panic. | 1177 | * so warn about unrcognized controllers, don't panic. |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 149b13fc0a71..2507e898af09 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -549,7 +549,9 @@ static int ehci_start (struct usb_hcd *hcd) | |||
| 549 | hcd->can_wakeup = (port_wake & 1) != 0; | 549 | hcd->can_wakeup = (port_wake & 1) != 0; |
| 550 | 550 | ||
| 551 | /* help hc dma work well with cachelines */ | 551 | /* help hc dma work well with cachelines */ |
| 552 | pci_set_mwi (pdev); | 552 | retval = pci_set_mwi(pdev); |
| 553 | if (retval) | ||
| 554 | ehci_dbg(ehci, "unable to enable MWI - not fatal.\n"); | ||
| 553 | } | 555 | } |
| 554 | #endif | 556 | #endif |
| 555 | 557 | ||
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 20df01a79b2e..940d38ca7d91 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -677,6 +677,9 @@ qh_make ( | |||
| 677 | goto done; | 677 | goto done; |
| 678 | } | 678 | } |
| 679 | } else { | 679 | } else { |
| 680 | struct usb_tt *tt = urb->dev->tt; | ||
| 681 | int think_time; | ||
| 682 | |||
| 680 | /* gap is f(FS/LS transfer times) */ | 683 | /* gap is f(FS/LS transfer times) */ |
| 681 | qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed, | 684 | qh->gap_uf = 1 + usb_calc_bus_time (urb->dev->speed, |
| 682 | is_input, 0, maxp) / (125 * 1000); | 685 | is_input, 0, maxp) / (125 * 1000); |
| @@ -690,6 +693,10 @@ qh_make ( | |||
| 690 | qh->c_usecs = HS_USECS (0); | 693 | qh->c_usecs = HS_USECS (0); |
| 691 | } | 694 | } |
| 692 | 695 | ||
| 696 | think_time = tt ? tt->think_time : 0; | ||
| 697 | qh->tt_usecs = NS_TO_US (think_time + | ||
| 698 | usb_calc_bus_time (urb->dev->speed, | ||
| 699 | is_input, 0, max_packet (maxp))); | ||
| 693 | qh->period = urb->interval; | 700 | qh->period = urb->interval; |
| 694 | } | 701 | } |
| 695 | } | 702 | } |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 4c972b57c7c3..ccc7300baa6d 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -700,6 +700,7 @@ iso_stream_init ( | |||
| 700 | 700 | ||
| 701 | } else { | 701 | } else { |
| 702 | u32 addr; | 702 | u32 addr; |
| 703 | int think_time; | ||
| 703 | 704 | ||
| 704 | addr = dev->ttport << 24; | 705 | addr = dev->ttport << 24; |
| 705 | if (!ehci_is_TDI(ehci) | 706 | if (!ehci_is_TDI(ehci) |
| @@ -709,6 +710,9 @@ iso_stream_init ( | |||
| 709 | addr |= epnum << 8; | 710 | addr |= epnum << 8; |
| 710 | addr |= dev->devnum; | 711 | addr |= dev->devnum; |
| 711 | stream->usecs = HS_USECS_ISO (maxp); | 712 | stream->usecs = HS_USECS_ISO (maxp); |
| 713 | think_time = dev->tt ? dev->tt->think_time : 0; | ||
| 714 | stream->tt_usecs = NS_TO_US (think_time + usb_calc_bus_time ( | ||
| 715 | dev->speed, is_input, 1, maxp)); | ||
| 712 | if (is_input) { | 716 | if (is_input) { |
| 713 | u32 tmp; | 717 | u32 tmp; |
| 714 | 718 | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index a7542157534c..20c9b550097d 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
| @@ -421,6 +421,7 @@ struct ehci_qh { | |||
| 421 | u8 usecs; /* intr bandwidth */ | 421 | u8 usecs; /* intr bandwidth */ |
| 422 | u8 gap_uf; /* uframes split/csplit gap */ | 422 | u8 gap_uf; /* uframes split/csplit gap */ |
| 423 | u8 c_usecs; /* ... split completion bw */ | 423 | u8 c_usecs; /* ... split completion bw */ |
| 424 | u16 tt_usecs; /* tt downstream bandwidth */ | ||
| 424 | unsigned short period; /* polling interval */ | 425 | unsigned short period; /* polling interval */ |
| 425 | unsigned short start; /* where polling starts */ | 426 | unsigned short start; /* where polling starts */ |
| 426 | #define NO_FRAME ((unsigned short)~0) /* pick new start */ | 427 | #define NO_FRAME ((unsigned short)~0) /* pick new start */ |
| @@ -479,6 +480,7 @@ struct ehci_iso_stream { | |||
| 479 | */ | 480 | */ |
| 480 | u8 interval; | 481 | u8 interval; |
| 481 | u8 usecs, c_usecs; | 482 | u8 usecs, c_usecs; |
| 483 | u16 tt_usecs; | ||
| 482 | u16 maxp; | 484 | u16 maxp; |
| 483 | u16 raw_mask; | 485 | u16 raw_mask; |
| 484 | unsigned bandwidth; | 486 | unsigned bandwidth; |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 75128c371800..41bbae83fc71 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
| @@ -83,7 +83,7 @@ | |||
| 83 | #include "../core/hcd.h" | 83 | #include "../core/hcd.h" |
| 84 | #include "isp116x.h" | 84 | #include "isp116x.h" |
| 85 | 85 | ||
| 86 | #define DRIVER_VERSION "08 Apr 2005" | 86 | #define DRIVER_VERSION "05 Aug 2005" |
| 87 | #define DRIVER_DESC "ISP116x USB Host Controller Driver" | 87 | #define DRIVER_DESC "ISP116x USB Host Controller Driver" |
| 88 | 88 | ||
| 89 | MODULE_DESCRIPTION(DRIVER_DESC); | 89 | MODULE_DESCRIPTION(DRIVER_DESC); |
| @@ -629,14 +629,12 @@ static irqreturn_t isp116x_irq(struct usb_hcd *hcd, struct pt_regs *regs) | |||
| 629 | ERR("Unrecoverable error\n"); | 629 | ERR("Unrecoverable error\n"); |
| 630 | /* What should we do here? Reset? */ | 630 | /* What should we do here? Reset? */ |
| 631 | } | 631 | } |
| 632 | if (intstat & HCINT_RHSC) { | 632 | if (intstat & HCINT_RHSC) |
| 633 | isp116x->rhstatus = | 633 | /* When root hub or any of its ports is going |
| 634 | isp116x_read_reg32(isp116x, HCRHSTATUS); | 634 | to come out of suspend, it may take more |
| 635 | isp116x->rhport[0] = | 635 | than 10ms for status bits to stabilize. */ |
| 636 | isp116x_read_reg32(isp116x, HCRHPORT1); | 636 | mod_timer(&hcd->rh_timer, jiffies |
| 637 | isp116x->rhport[1] = | 637 | + msecs_to_jiffies(20) + 1); |
| 638 | isp116x_read_reg32(isp116x, HCRHPORT2); | ||
| 639 | } | ||
| 640 | if (intstat & HCINT_RD) { | 638 | if (intstat & HCINT_RD) { |
| 641 | DBG("---- remote wakeup\n"); | 639 | DBG("---- remote wakeup\n"); |
| 642 | schedule_work(&isp116x->rh_resume); | 640 | schedule_work(&isp116x->rh_resume); |
| @@ -925,20 +923,27 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
| 925 | { | 923 | { |
| 926 | struct isp116x *isp116x = hcd_to_isp116x(hcd); | 924 | struct isp116x *isp116x = hcd_to_isp116x(hcd); |
| 927 | int ports, i, changed = 0; | 925 | int ports, i, changed = 0; |
| 926 | unsigned long flags; | ||
| 928 | 927 | ||
| 929 | if (!HC_IS_RUNNING(hcd->state)) | 928 | if (!HC_IS_RUNNING(hcd->state)) |
| 930 | return -ESHUTDOWN; | 929 | return -ESHUTDOWN; |
| 931 | 930 | ||
| 932 | ports = isp116x->rhdesca & RH_A_NDP; | 931 | /* Report no status change now, if we are scheduled to be |
| 932 | called later */ | ||
| 933 | if (timer_pending(&hcd->rh_timer)) | ||
| 934 | return 0; | ||
| 933 | 935 | ||
| 934 | /* init status */ | 936 | ports = isp116x->rhdesca & RH_A_NDP; |
| 937 | spin_lock_irqsave(&isp116x->lock, flags); | ||
| 938 | isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); | ||
| 935 | if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) | 939 | if (isp116x->rhstatus & (RH_HS_LPSC | RH_HS_OCIC)) |
| 936 | buf[0] = changed = 1; | 940 | buf[0] = changed = 1; |
| 937 | else | 941 | else |
| 938 | buf[0] = 0; | 942 | buf[0] = 0; |
| 939 | 943 | ||
| 940 | for (i = 0; i < ports; i++) { | 944 | for (i = 0; i < ports; i++) { |
| 941 | u32 status = isp116x->rhport[i]; | 945 | u32 status = isp116x->rhport[i] = |
| 946 | isp116x_read_reg32(isp116x, i ? HCRHPORT2 : HCRHPORT1); | ||
| 942 | 947 | ||
| 943 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC | 948 | if (status & (RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC |
| 944 | | RH_PS_OCIC | RH_PS_PRSC)) { | 949 | | RH_PS_OCIC | RH_PS_PRSC)) { |
| @@ -947,6 +952,7 @@ static int isp116x_hub_status_data(struct usb_hcd *hcd, char *buf) | |||
| 947 | continue; | 952 | continue; |
| 948 | } | 953 | } |
| 949 | } | 954 | } |
| 955 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
| 950 | return changed; | 956 | return changed; |
| 951 | } | 957 | } |
| 952 | 958 | ||
| @@ -1463,10 +1469,6 @@ static int isp116x_sw_reset(struct isp116x *isp116x) | |||
| 1463 | return ret; | 1469 | return ret; |
| 1464 | } | 1470 | } |
| 1465 | 1471 | ||
| 1466 | /* | ||
| 1467 | Reset. Tries to perform platform-specific hardware | ||
| 1468 | reset first; falls back to software reset. | ||
| 1469 | */ | ||
| 1470 | static int isp116x_reset(struct usb_hcd *hcd) | 1472 | static int isp116x_reset(struct usb_hcd *hcd) |
| 1471 | { | 1473 | { |
| 1472 | struct isp116x *isp116x = hcd_to_isp116x(hcd); | 1474 | struct isp116x *isp116x = hcd_to_isp116x(hcd); |
| @@ -1474,17 +1476,7 @@ static int isp116x_reset(struct usb_hcd *hcd) | |||
| 1474 | u16 clkrdy = 0; | 1476 | u16 clkrdy = 0; |
| 1475 | int ret = 0, timeout = 15 /* ms */ ; | 1477 | int ret = 0, timeout = 15 /* ms */ ; |
| 1476 | 1478 | ||
| 1477 | if (isp116x->board && isp116x->board->reset) { | 1479 | ret = isp116x_sw_reset(isp116x); |
| 1478 | /* Hardware reset */ | ||
| 1479 | isp116x->board->reset(hcd->self.controller, 1); | ||
| 1480 | msleep(10); | ||
| 1481 | if (isp116x->board->clock) | ||
| 1482 | isp116x->board->clock(hcd->self.controller, 1); | ||
| 1483 | msleep(1); | ||
| 1484 | isp116x->board->reset(hcd->self.controller, 0); | ||
| 1485 | } else | ||
| 1486 | ret = isp116x_sw_reset(isp116x); | ||
| 1487 | |||
| 1488 | if (ret) | 1480 | if (ret) |
| 1489 | return ret; | 1481 | return ret; |
| 1490 | 1482 | ||
| @@ -1501,10 +1493,7 @@ static int isp116x_reset(struct usb_hcd *hcd) | |||
| 1501 | ERR("Clock not ready after 20ms\n"); | 1493 | ERR("Clock not ready after 20ms\n"); |
| 1502 | /* After sw_reset the clock won't report to be ready, if | 1494 | /* After sw_reset the clock won't report to be ready, if |
| 1503 | H_WAKEUP pin is high. */ | 1495 | H_WAKEUP pin is high. */ |
| 1504 | if (!isp116x->board || !isp116x->board->reset) | 1496 | ERR("Please make sure that the H_WAKEUP pin is pulled low!\n"); |
| 1505 | ERR("The driver does not support hardware wakeup.\n"); | ||
| 1506 | ERR("Please make sure that the H_WAKEUP pin " | ||
| 1507 | "is pulled low!\n"); | ||
| 1508 | ret = -ENODEV; | 1497 | ret = -ENODEV; |
| 1509 | } | 1498 | } |
| 1510 | return ret; | 1499 | return ret; |
| @@ -1527,15 +1516,7 @@ static void isp116x_stop(struct usb_hcd *hcd) | |||
| 1527 | isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); | 1516 | isp116x_write_reg32(isp116x, HCRHSTATUS, RH_HS_LPS); |
| 1528 | spin_unlock_irqrestore(&isp116x->lock, flags); | 1517 | spin_unlock_irqrestore(&isp116x->lock, flags); |
| 1529 | 1518 | ||
| 1530 | /* Put the chip into reset state */ | 1519 | isp116x_sw_reset(isp116x); |
| 1531 | if (isp116x->board && isp116x->board->reset) | ||
| 1532 | isp116x->board->reset(hcd->self.controller, 0); | ||
| 1533 | else | ||
| 1534 | isp116x_sw_reset(isp116x); | ||
| 1535 | |||
| 1536 | /* Stop the clock */ | ||
| 1537 | if (isp116x->board && isp116x->board->clock) | ||
| 1538 | isp116x->board->clock(hcd->self.controller, 0); | ||
| 1539 | } | 1520 | } |
| 1540 | 1521 | ||
| 1541 | /* | 1522 | /* |
| @@ -1561,6 +1542,9 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1561 | return -ENODEV; | 1542 | return -ENODEV; |
| 1562 | } | 1543 | } |
| 1563 | 1544 | ||
| 1545 | /* To be removed in future */ | ||
| 1546 | hcd->uses_new_polling = 1; | ||
| 1547 | |||
| 1564 | isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); | 1548 | isp116x_write_reg16(isp116x, HCITLBUFLEN, ISP116x_ITL_BUFSIZE); |
| 1565 | isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); | 1549 | isp116x_write_reg16(isp116x, HCATLBUFLEN, ISP116x_ATL_BUFSIZE); |
| 1566 | 1550 | ||
| @@ -1569,7 +1553,7 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1569 | if (board->sel15Kres) | 1553 | if (board->sel15Kres) |
| 1570 | val |= HCHWCFG_15KRSEL; | 1554 | val |= HCHWCFG_15KRSEL; |
| 1571 | /* Remote wakeup won't work without working clock */ | 1555 | /* Remote wakeup won't work without working clock */ |
| 1572 | if (board->clknotstop || board->remote_wakeup_enable) | 1556 | if (board->remote_wakeup_enable) |
| 1573 | val |= HCHWCFG_CLKNOTSTOP; | 1557 | val |= HCHWCFG_CLKNOTSTOP; |
| 1574 | if (board->oc_enable) | 1558 | if (board->oc_enable) |
| 1575 | val |= HCHWCFG_ANALOG_OC; | 1559 | val |= HCHWCFG_ANALOG_OC; |
| @@ -1580,16 +1564,13 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1580 | isp116x_write_reg16(isp116x, HCHWCFG, val); | 1564 | isp116x_write_reg16(isp116x, HCHWCFG, val); |
| 1581 | 1565 | ||
| 1582 | /* ----- Root hub conf */ | 1566 | /* ----- Root hub conf */ |
| 1583 | val = 0; | 1567 | val = (25 << 24) & RH_A_POTPGT; |
| 1584 | /* AN10003_1.pdf recommends NPS to be always 1 */ | 1568 | /* AN10003_1.pdf recommends RH_A_NPS (no power switching) to |
| 1585 | if (board->no_power_switching) | 1569 | be always set. Yet, instead, we request individual port |
| 1586 | val |= RH_A_NPS; | 1570 | power switching. */ |
| 1587 | if (board->power_switching_mode) | 1571 | val |= RH_A_PSM; |
| 1588 | val |= RH_A_PSM; | 1572 | /* Report overcurrent per port */ |
| 1589 | if (board->potpg) | 1573 | val |= RH_A_OCPM; |
| 1590 | val |= (board->potpg << 24) & RH_A_POTPGT; | ||
| 1591 | else | ||
| 1592 | val |= (25 << 24) & RH_A_POTPGT; | ||
| 1593 | isp116x_write_reg32(isp116x, HCRHDESCA, val); | 1574 | isp116x_write_reg32(isp116x, HCRHDESCA, val); |
| 1594 | isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); | 1575 | isp116x->rhdesca = isp116x_read_reg32(isp116x, HCRHDESCA); |
| 1595 | 1576 | ||
| @@ -1619,9 +1600,6 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1619 | 1600 | ||
| 1620 | /* Go operational */ | 1601 | /* Go operational */ |
| 1621 | val = HCCONTROL_USB_OPER; | 1602 | val = HCCONTROL_USB_OPER; |
| 1622 | /* Remote wakeup connected - NOT SUPPORTED */ | ||
| 1623 | /* if (board->remote_wakeup_connected) | ||
| 1624 | val |= HCCONTROL_RWC; */ | ||
| 1625 | if (board->remote_wakeup_enable) | 1603 | if (board->remote_wakeup_enable) |
| 1626 | val |= HCCONTROL_RWE; | 1604 | val |= HCCONTROL_RWE; |
| 1627 | isp116x_write_reg32(isp116x, HCCONTROL, val); | 1605 | isp116x_write_reg32(isp116x, HCCONTROL, val); |
| @@ -1670,7 +1648,7 @@ static int __init_or_module isp116x_remove(struct device *dev) | |||
| 1670 | struct platform_device *pdev; | 1648 | struct platform_device *pdev; |
| 1671 | struct resource *res; | 1649 | struct resource *res; |
| 1672 | 1650 | ||
| 1673 | if(!hcd) | 1651 | if (!hcd) |
| 1674 | return 0; | 1652 | return 0; |
| 1675 | isp116x = hcd_to_isp116x(hcd); | 1653 | isp116x = hcd_to_isp116x(hcd); |
| 1676 | pdev = container_of(dev, struct platform_device, dev); | 1654 | pdev = container_of(dev, struct platform_device, dev); |
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index 17964c39d06a..251533363028 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c | |||
| @@ -14,8 +14,6 @@ | |||
| 14 | * This file is licenced under the GPL. | 14 | * This file is licenced under the GPL. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <asm/usb.h> | ||
| 18 | |||
| 19 | /* configure so an HC device and id are always provided */ | 17 | /* configure so an HC device and id are always provided */ |
| 20 | /* always called with process context; sleeping is OK */ | 18 | /* always called with process context; sleeping is OK */ |
| 21 | 19 | ||
| @@ -23,9 +21,7 @@ | |||
| 23 | * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs | 21 | * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs |
| 24 | * Context: !in_interrupt() | 22 | * Context: !in_interrupt() |
| 25 | * | 23 | * |
| 26 | * Allocates basic resources for this USB host controller, and | 24 | * Allocates basic resources for this USB host controller. |
| 27 | * then invokes the start() method for the HCD associated with it | ||
| 28 | * through the hotplug entry's driver_data. | ||
| 29 | * | 25 | * |
| 30 | * Store this function in the HCD's struct pci_driver as probe(). | 26 | * Store this function in the HCD's struct pci_driver as probe(). |
| 31 | */ | 27 | */ |
| @@ -37,7 +33,6 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, | |||
| 37 | struct ohci_hcd *ohci; | 33 | struct ohci_hcd *ohci; |
| 38 | struct resource *res; | 34 | struct resource *res; |
| 39 | int irq; | 35 | int irq; |
| 40 | struct usb_hcd_platform_data *pd = pdev->dev.platform_data; | ||
| 41 | 36 | ||
| 42 | pr_debug("initializing PPC-SOC USB Controller\n"); | 37 | pr_debug("initializing PPC-SOC USB Controller\n"); |
| 43 | 38 | ||
| @@ -73,9 +68,6 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, | |||
| 73 | goto err2; | 68 | goto err2; |
| 74 | } | 69 | } |
| 75 | 70 | ||
| 76 | if (pd->start && (retval = pd->start(pdev))) | ||
| 77 | goto err3; | ||
| 78 | |||
| 79 | ohci = hcd_to_ohci(hcd); | 71 | ohci = hcd_to_ohci(hcd); |
| 80 | ohci->flags |= OHCI_BIG_ENDIAN; | 72 | ohci->flags |= OHCI_BIG_ENDIAN; |
| 81 | ohci_hcd_init(ohci); | 73 | ohci_hcd_init(ohci); |
| @@ -85,9 +77,7 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, | |||
| 85 | return retval; | 77 | return retval; |
| 86 | 78 | ||
| 87 | pr_debug("Removing PPC-SOC USB Controller\n"); | 79 | pr_debug("Removing PPC-SOC USB Controller\n"); |
| 88 | if (pd && pd->stop) | 80 | |
| 89 | pd->stop(pdev); | ||
| 90 | err3: | ||
| 91 | iounmap(hcd->regs); | 81 | iounmap(hcd->regs); |
| 92 | err2: | 82 | err2: |
| 93 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 83 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| @@ -105,25 +95,21 @@ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, | |||
| 105 | * @pdev: USB Host Controller being removed | 95 | * @pdev: USB Host Controller being removed |
| 106 | * Context: !in_interrupt() | 96 | * Context: !in_interrupt() |
| 107 | * | 97 | * |
| 108 | * Reverses the effect of usb_hcd_ppc_soc_probe(), first invoking | 98 | * Reverses the effect of usb_hcd_ppc_soc_probe(). |
| 109 | * the HCD's stop() method. It is always called from a thread | 99 | * It is always called from a thread |
| 110 | * context, normally "rmmod", "apmd", or something similar. | 100 | * context, normally "rmmod", "apmd", or something similar. |
| 111 | * | 101 | * |
| 112 | */ | 102 | */ |
| 113 | static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd, | 103 | static void usb_hcd_ppc_soc_remove(struct usb_hcd *hcd, |
| 114 | struct platform_device *pdev) | 104 | struct platform_device *pdev) |
| 115 | { | 105 | { |
| 116 | struct usb_hcd_platform_data *pd = pdev->dev.platform_data; | ||
| 117 | |||
| 118 | usb_remove_hcd(hcd); | 106 | usb_remove_hcd(hcd); |
| 119 | 107 | ||
| 120 | pr_debug("stopping PPC-SOC USB Controller\n"); | 108 | pr_debug("stopping PPC-SOC USB Controller\n"); |
| 121 | if (pd && pd->stop) | ||
| 122 | pd->stop(pdev); | ||
| 123 | 109 | ||
| 124 | iounmap(hcd->regs); | 110 | iounmap(hcd->regs); |
| 125 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); | 111 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
| 126 | usb_hcd_put(hcd); | 112 | usb_put_hcd(hcd); |
| 127 | } | 113 | } |
| 128 | 114 | ||
| 129 | static int __devinit | 115 | static int __devinit |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index e9401662503c..3d9bcf78a9a4 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
| @@ -129,7 +129,7 @@ static void s3c2410_usb_set_power(struct s3c2410_hcd_info *info, | |||
| 129 | 129 | ||
| 130 | if (info->power_control != NULL) { | 130 | if (info->power_control != NULL) { |
| 131 | info->port[port-1].power = to; | 131 | info->port[port-1].power = to; |
| 132 | (info->power_control)(port, to); | 132 | (info->power_control)(port-1, to); |
| 133 | } | 133 | } |
| 134 | } | 134 | } |
| 135 | 135 | ||
| @@ -339,8 +339,8 @@ int usb_hcd_s3c2410_probe (const struct hc_driver *driver, | |||
| 339 | struct usb_hcd *hcd = NULL; | 339 | struct usb_hcd *hcd = NULL; |
| 340 | int retval; | 340 | int retval; |
| 341 | 341 | ||
| 342 | s3c2410_usb_set_power(dev->dev.platform_data, 0, 1); | ||
| 343 | s3c2410_usb_set_power(dev->dev.platform_data, 1, 1); | 342 | s3c2410_usb_set_power(dev->dev.platform_data, 1, 1); |
| 343 | s3c2410_usb_set_power(dev->dev.platform_data, 2, 1); | ||
| 344 | 344 | ||
| 345 | hcd = usb_create_hcd(driver, &dev->dev, "s3c24xx"); | 345 | hcd = usb_create_hcd(driver, &dev->dev, "s3c24xx"); |
| 346 | if (hcd == NULL) | 346 | if (hcd == NULL) |
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index 298e4a25e3d3..482c4be521f5 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
| @@ -230,6 +230,20 @@ config USB_EGALAX | |||
| 230 | To compile this driver as a module, choose M here: the | 230 | To compile this driver as a module, choose M here: the |
| 231 | module will be called touchkitusb. | 231 | module will be called touchkitusb. |
| 232 | 232 | ||
| 233 | config USB_YEALINK | ||
| 234 | tristate "Yealink usb-p1k voip phone" | ||
| 235 | depends on USB && INPUT && EXPERIMENTAL | ||
| 236 | ---help--- | ||
| 237 | Say Y here if you want to enable keyboard and LCD functions of the | ||
| 238 | Yealink usb-p1k usb phones. The audio part is enabled by the generic | ||
| 239 | usb sound driver, so you might want to enable that as well. | ||
| 240 | |||
| 241 | For information about how to use these additional functions, see | ||
| 242 | <file:Documentation/input/yealink.txt>. | ||
| 243 | |||
| 244 | To compile this driver as a module, choose M here: the module will be | ||
| 245 | called yealink. | ||
| 246 | |||
| 233 | config USB_XPAD | 247 | config USB_XPAD |
| 234 | tristate "X-Box gamepad support" | 248 | tristate "X-Box gamepad support" |
| 235 | depends on USB && INPUT | 249 | depends on USB && INPUT |
diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile index f1547be632d4..43b2f999edfe 100644 --- a/drivers/usb/input/Makefile +++ b/drivers/usb/input/Makefile | |||
| @@ -39,4 +39,5 @@ obj-$(CONFIG_USB_EGALAX) += touchkitusb.o | |||
| 39 | obj-$(CONFIG_USB_POWERMATE) += powermate.o | 39 | obj-$(CONFIG_USB_POWERMATE) += powermate.o |
| 40 | obj-$(CONFIG_USB_WACOM) += wacom.o | 40 | obj-$(CONFIG_USB_WACOM) += wacom.o |
| 41 | obj-$(CONFIG_USB_ACECAD) += acecad.o | 41 | obj-$(CONFIG_USB_ACECAD) += acecad.o |
| 42 | obj-$(CONFIG_USB_YEALINK) += yealink.o | ||
| 42 | obj-$(CONFIG_USB_XPAD) += xpad.o | 43 | obj-$(CONFIG_USB_XPAD) += xpad.o |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index b2cb2b35892e..1ab95d24c5e2 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
| @@ -1444,6 +1444,8 @@ void hid_init_reports(struct hid_device *hid) | |||
| 1444 | #define USB_DEVICE_ID_NETWORKANALYSER 0x2020 | 1444 | #define USB_DEVICE_ID_NETWORKANALYSER 0x2020 |
| 1445 | #define USB_DEVICE_ID_POWERCONTROL 0x2030 | 1445 | #define USB_DEVICE_ID_POWERCONTROL 0x2030 |
| 1446 | 1446 | ||
| 1447 | #define USB_VENDOR_ID_APPLE 0x05ac | ||
| 1448 | #define USB_DEVICE_ID_APPLE_BLUETOOTH 0x1000 | ||
| 1447 | 1449 | ||
| 1448 | /* | 1450 | /* |
| 1449 | * Alphabetically sorted blacklist by quirk type. | 1451 | * Alphabetically sorted blacklist by quirk type. |
| @@ -1462,6 +1464,7 @@ static struct hid_blacklist { | |||
| 1462 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, | 1464 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, |
| 1463 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, | 1465 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, |
| 1464 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, | 1466 | { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, |
| 1467 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_BLUETOOTH, HID_QUIRK_IGNORE }, | ||
| 1465 | { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, | 1468 | { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, |
| 1466 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE }, | 1469 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW40, HID_QUIRK_IGNORE }, |
| 1467 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24, HID_QUIRK_IGNORE }, | 1470 | { USB_VENDOR_ID_CODEMERCS, USB_DEVICE_ID_CODEMERCS_IOW24, HID_QUIRK_IGNORE }, |
| @@ -1685,7 +1688,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
| 1685 | usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, 0, | 1688 | usb_fill_int_urb(hid->urbin, dev, pipe, hid->inbuf, 0, |
| 1686 | hid_irq_in, hid, interval); | 1689 | hid_irq_in, hid, interval); |
| 1687 | hid->urbin->transfer_dma = hid->inbuf_dma; | 1690 | hid->urbin->transfer_dma = hid->inbuf_dma; |
| 1688 | hid->urbin->transfer_flags |=(URB_NO_TRANSFER_DMA_MAP | URB_ASYNC_UNLINK); | 1691 | hid->urbin->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
| 1689 | } else { | 1692 | } else { |
| 1690 | if (hid->urbout) | 1693 | if (hid->urbout) |
| 1691 | continue; | 1694 | continue; |
| @@ -1695,7 +1698,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
| 1695 | usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0, | 1698 | usb_fill_int_urb(hid->urbout, dev, pipe, hid->outbuf, 0, |
| 1696 | hid_irq_out, hid, interval); | 1699 | hid_irq_out, hid, interval); |
| 1697 | hid->urbout->transfer_dma = hid->outbuf_dma; | 1700 | hid->urbout->transfer_dma = hid->outbuf_dma; |
| 1698 | hid->urbout->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_ASYNC_UNLINK); | 1701 | hid->urbout->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
| 1699 | } | 1702 | } |
| 1700 | } | 1703 | } |
| 1701 | 1704 | ||
| @@ -1747,7 +1750,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
| 1747 | hid->ctrlbuf, 1, hid_ctrl, hid); | 1750 | hid->ctrlbuf, 1, hid_ctrl, hid); |
| 1748 | hid->urbctrl->setup_dma = hid->cr_dma; | 1751 | hid->urbctrl->setup_dma = hid->cr_dma; |
| 1749 | hid->urbctrl->transfer_dma = hid->ctrlbuf_dma; | 1752 | hid->urbctrl->transfer_dma = hid->ctrlbuf_dma; |
| 1750 | hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP | URB_ASYNC_UNLINK); | 1753 | hid->urbctrl->transfer_flags |= (URB_NO_TRANSFER_DMA_MAP | URB_NO_SETUP_DMA_MAP); |
| 1751 | 1754 | ||
| 1752 | return hid; | 1755 | return hid; |
| 1753 | 1756 | ||
diff --git a/drivers/usb/input/keyspan_remote.c b/drivers/usb/input/keyspan_remote.c index 67dc93685203..99de1b33c07d 100644 --- a/drivers/usb/input/keyspan_remote.c +++ b/drivers/usb/input/keyspan_remote.c | |||
| @@ -431,11 +431,6 @@ static int keyspan_probe(struct usb_interface *interface, const struct usb_devic | |||
| 431 | struct usb_endpoint_descriptor *endpoint; | 431 | struct usb_endpoint_descriptor *endpoint; |
| 432 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); | 432 | struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface)); |
| 433 | 433 | ||
| 434 | /* See if the offered device matches what we can accept */ | ||
| 435 | if ((udev->descriptor.idVendor != USB_KEYSPAN_VENDOR_ID) || | ||
| 436 | (udev->descriptor.idProduct != USB_KEYSPAN_PRODUCT_UIA11) ) | ||
| 437 | return -ENODEV; | ||
| 438 | |||
| 439 | /* allocate memory for our device state and initialize it */ | 434 | /* allocate memory for our device state and initialize it */ |
| 440 | remote = kmalloc(sizeof(*remote), GFP_KERNEL); | 435 | remote = kmalloc(sizeof(*remote), GFP_KERNEL); |
| 441 | if (remote == NULL) { | 436 | if (remote == NULL) { |
diff --git a/drivers/usb/input/map_to_7segment.h b/drivers/usb/input/map_to_7segment.h new file mode 100644 index 000000000000..52ff27f15127 --- /dev/null +++ b/drivers/usb/input/map_to_7segment.h | |||
| @@ -0,0 +1,189 @@ | |||
| 1 | /* | ||
| 2 | * drivers/usb/input/map_to_7segment.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License as | ||
| 8 | * published by the Free Software Foundation; either version 2 of | ||
| 9 | * the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef MAP_TO_7SEGMENT_H | ||
| 22 | #define MAP_TO_7SEGMENT_H | ||
| 23 | |||
| 24 | /* This file provides translation primitives and tables for the conversion | ||
| 25 | * of (ASCII) characters to a 7-segments notation. | ||
| 26 | * | ||
| 27 | * The 7 segment's wikipedia notation below is used as standard. | ||
| 28 | * See: http://en.wikipedia.org/wiki/Seven_segment_display | ||
| 29 | * | ||
| 30 | * Notation: +-a-+ | ||
| 31 | * f b | ||
| 32 | * +-g-+ | ||
| 33 | * e c | ||
| 34 | * +-d-+ | ||
| 35 | * | ||
| 36 | * Usage: | ||
| 37 | * | ||
| 38 | * Register a map variable, and fill it with a character set: | ||
| 39 | * static SEG7_DEFAULT_MAP(map_seg7); | ||
| 40 | * | ||
| 41 | * | ||
| 42 | * Then use for conversion: | ||
| 43 | * seg7 = map_to_seg7(&map_seg7, some_char); | ||
| 44 | * ... | ||
| 45 | * | ||
| 46 | * In device drivers it is recommended, if required, to make the char map | ||
| 47 | * accessible via the sysfs interface using the following scheme: | ||
| 48 | * | ||
| 49 | * static ssize_t show_map(struct device *dev, char *buf) { | ||
| 50 | * memcpy(buf, &map_seg7, sizeof(map_seg7)); | ||
| 51 | * return sizeof(map_seg7); | ||
| 52 | * } | ||
| 53 | * static ssize_t store_map(struct device *dev, const char *buf, size_t cnt) { | ||
| 54 | * if(cnt != sizeof(map_seg7)) | ||
| 55 | * return -EINVAL; | ||
| 56 | * memcpy(&map_seg7, buf, cnt); | ||
| 57 | * return cnt; | ||
| 58 | * } | ||
| 59 | * static DEVICE_ATTR(map_seg7, PERMS_RW, show_map, store_map); | ||
| 60 | * | ||
| 61 | * History: | ||
| 62 | * 2005-05-31 RFC linux-kernel@vger.kernel.org | ||
| 63 | */ | ||
| 64 | #include <linux/errno.h> | ||
| 65 | |||
| 66 | |||
| 67 | #define BIT_SEG7_A 0 | ||
| 68 | #define BIT_SEG7_B 1 | ||
| 69 | #define BIT_SEG7_C 2 | ||
| 70 | #define BIT_SEG7_D 3 | ||
| 71 | #define BIT_SEG7_E 4 | ||
| 72 | #define BIT_SEG7_F 5 | ||
| 73 | #define BIT_SEG7_G 6 | ||
| 74 | #define BIT_SEG7_RESERVED 7 | ||
| 75 | |||
| 76 | struct seg7_conversion_map { | ||
| 77 | unsigned char table[128]; | ||
| 78 | }; | ||
| 79 | |||
| 80 | static inline int map_to_seg7(struct seg7_conversion_map *map, int c) | ||
| 81 | { | ||
| 82 | return c & 0x7f ? map->table[c] : -EINVAL; | ||
| 83 | } | ||
| 84 | |||
| 85 | #define SEG7_CONVERSION_MAP(_name, _map) \ | ||
| 86 | struct seg7_conversion_map _name = { .table = { _map } } | ||
| 87 | |||
| 88 | /* | ||
| 89 | * It is recommended to use a facility that allows user space to redefine | ||
| 90 | * custom character sets for LCD devices. Please use a sysfs interface | ||
| 91 | * as described above. | ||
| 92 | */ | ||
| 93 | #define MAP_TO_SEG7_SYSFS_FILE "map_seg7" | ||
| 94 | |||
| 95 | /******************************************************************************* | ||
| 96 | * ASCII conversion table | ||
| 97 | ******************************************************************************/ | ||
| 98 | |||
| 99 | #define _SEG7(l,a,b,c,d,e,f,g) \ | ||
| 100 | ( a<<BIT_SEG7_A | b<<BIT_SEG7_B | c<<BIT_SEG7_C | d<<BIT_SEG7_D | \ | ||
| 101 | e<<BIT_SEG7_E | f<<BIT_SEG7_F | g<<BIT_SEG7_G ) | ||
| 102 | |||
| 103 | #define _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \ | ||
| 104 | 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, | ||
| 105 | |||
| 106 | #define _MAP_33_47_ASCII_SEG7_SYMBOL \ | ||
| 107 | _SEG7('!',0,0,0,0,1,1,0), _SEG7('"',0,1,0,0,0,1,0), _SEG7('#',0,1,1,0,1,1,0),\ | ||
| 108 | _SEG7('$',1,0,1,1,0,1,1), _SEG7('%',0,0,1,0,0,1,0), _SEG7('&',1,0,1,1,1,1,1),\ | ||
| 109 | _SEG7('\'',0,0,0,0,0,1,0),_SEG7('(',1,0,0,1,1,1,0), _SEG7(')',1,1,1,1,0,0,0),\ | ||
| 110 | _SEG7('*',0,1,1,0,1,1,1), _SEG7('+',0,1,1,0,0,0,1), _SEG7(',',0,0,0,0,1,0,0),\ | ||
| 111 | _SEG7('-',0,0,0,0,0,0,1), _SEG7('.',0,0,0,0,1,0,0), _SEG7('/',0,1,0,0,1,0,1), | ||
| 112 | |||
| 113 | #define _MAP_48_57_ASCII_SEG7_NUMERIC \ | ||
| 114 | _SEG7('0',1,1,1,1,1,1,0), _SEG7('1',0,1,1,0,0,0,0), _SEG7('2',1,1,0,1,1,0,1),\ | ||
| 115 | _SEG7('3',1,1,1,1,0,0,1), _SEG7('4',0,1,1,0,0,1,1), _SEG7('5',1,0,1,1,0,1,1),\ | ||
| 116 | _SEG7('6',1,0,1,1,1,1,1), _SEG7('7',1,1,1,0,0,0,0), _SEG7('8',1,1,1,1,1,1,1),\ | ||
| 117 | _SEG7('9',1,1,1,1,0,1,1), | ||
| 118 | |||
| 119 | #define _MAP_58_64_ASCII_SEG7_SYMBOL \ | ||
| 120 | _SEG7(':',0,0,0,1,0,0,1), _SEG7(';',0,0,0,1,0,0,1), _SEG7('<',1,0,0,0,0,1,1),\ | ||
| 121 | _SEG7('=',0,0,0,1,0,0,1), _SEG7('>',1,1,0,0,0,0,1), _SEG7('?',1,1,1,0,0,1,0),\ | ||
| 122 | _SEG7('@',1,1,0,1,1,1,1), | ||
| 123 | |||
| 124 | #define _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \ | ||
| 125 | _SEG7('A',1,1,1,0,1,1,1), _SEG7('B',1,1,1,1,1,1,1), _SEG7('C',1,0,0,1,1,1,0),\ | ||
| 126 | _SEG7('D',1,1,1,1,1,1,0), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\ | ||
| 127 | _SEG7('G',1,1,1,1,0,1,1), _SEG7('H',0,1,1,0,1,1,1), _SEG7('I',0,1,1,0,0,0,0),\ | ||
| 128 | _SEG7('J',0,1,1,1,0,0,0), _SEG7('K',0,1,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\ | ||
| 129 | _SEG7('M',1,1,1,0,1,1,0), _SEG7('N',1,1,1,0,1,1,0), _SEG7('O',1,1,1,1,1,1,0),\ | ||
| 130 | _SEG7('P',1,1,0,0,1,1,1), _SEG7('Q',1,1,1,1,1,1,0), _SEG7('R',1,1,1,0,1,1,1),\ | ||
| 131 | _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('U',0,1,1,1,1,1,0),\ | ||
| 132 | _SEG7('V',0,1,1,1,1,1,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\ | ||
| 133 | _SEG7('Y',0,1,1,0,0,1,1), _SEG7('Z',1,1,0,1,1,0,1), | ||
| 134 | |||
| 135 | #define _MAP_91_96_ASCII_SEG7_SYMBOL \ | ||
| 136 | _SEG7('[',1,0,0,1,1,1,0), _SEG7('\\',0,0,1,0,0,1,1),_SEG7(']',1,1,1,1,0,0,0),\ | ||
| 137 | _SEG7('^',1,1,0,0,0,1,0), _SEG7('_',0,0,0,1,0,0,0), _SEG7('`',0,1,0,0,0,0,0), | ||
| 138 | |||
| 139 | #define _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \ | ||
| 140 | _SEG7('A',1,1,1,0,1,1,1), _SEG7('b',0,0,1,1,1,1,1), _SEG7('c',0,0,0,1,1,0,1),\ | ||
| 141 | _SEG7('d',0,1,1,1,1,0,1), _SEG7('E',1,0,0,1,1,1,1), _SEG7('F',1,0,0,0,1,1,1),\ | ||
| 142 | _SEG7('G',1,1,1,1,0,1,1), _SEG7('h',0,0,1,0,1,1,1), _SEG7('i',0,0,1,0,0,0,0),\ | ||
| 143 | _SEG7('j',0,0,1,1,0,0,0), _SEG7('k',0,0,1,0,1,1,1), _SEG7('L',0,0,0,1,1,1,0),\ | ||
| 144 | _SEG7('M',1,1,1,0,1,1,0), _SEG7('n',0,0,1,0,1,0,1), _SEG7('o',0,0,1,1,1,0,1),\ | ||
| 145 | _SEG7('P',1,1,0,0,1,1,1), _SEG7('q',1,1,1,0,0,1,1), _SEG7('r',0,0,0,0,1,0,1),\ | ||
| 146 | _SEG7('S',1,0,1,1,0,1,1), _SEG7('T',0,0,0,1,1,1,1), _SEG7('u',0,0,1,1,1,0,0),\ | ||
| 147 | _SEG7('v',0,0,1,1,1,0,0), _SEG7('W',0,1,1,1,1,1,1), _SEG7('X',0,1,1,0,1,1,1),\ | ||
| 148 | _SEG7('y',0,1,1,1,0,1,1), _SEG7('Z',1,1,0,1,1,0,1), | ||
| 149 | |||
| 150 | #define _MAP_123_126_ASCII_SEG7_SYMBOL \ | ||
| 151 | _SEG7('{',1,0,0,1,1,1,0), _SEG7('|',0,0,0,0,1,1,0), _SEG7('}',1,1,1,1,0,0,0),\ | ||
| 152 | _SEG7('~',1,0,0,0,0,0,0), | ||
| 153 | |||
| 154 | /* Maps */ | ||
| 155 | |||
| 156 | /* This set tries to map as close as possible to the visible characteristics | ||
| 157 | * of the ASCII symbol, lowercase and uppercase letters may differ in | ||
| 158 | * presentation on the display. | ||
| 159 | */ | ||
| 160 | #define MAP_ASCII7SEG_ALPHANUM \ | ||
| 161 | _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \ | ||
| 162 | _MAP_33_47_ASCII_SEG7_SYMBOL \ | ||
| 163 | _MAP_48_57_ASCII_SEG7_NUMERIC \ | ||
| 164 | _MAP_58_64_ASCII_SEG7_SYMBOL \ | ||
| 165 | _MAP_65_90_ASCII_SEG7_ALPHA_UPPR \ | ||
| 166 | _MAP_91_96_ASCII_SEG7_SYMBOL \ | ||
| 167 | _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \ | ||
| 168 | _MAP_123_126_ASCII_SEG7_SYMBOL | ||
| 169 | |||
| 170 | /* This set tries to map as close as possible to the symbolic characteristics | ||
| 171 | * of the ASCII character for maximum discrimination. | ||
| 172 | * For now this means all alpha chars are in lower case representations. | ||
| 173 | * (This for example facilitates the use of hex numbers with uppercase input.) | ||
| 174 | */ | ||
| 175 | #define MAP_ASCII7SEG_ALPHANUM_LC \ | ||
| 176 | _MAP_0_32_ASCII_SEG7_NON_PRINTABLE \ | ||
| 177 | _MAP_33_47_ASCII_SEG7_SYMBOL \ | ||
| 178 | _MAP_48_57_ASCII_SEG7_NUMERIC \ | ||
| 179 | _MAP_58_64_ASCII_SEG7_SYMBOL \ | ||
| 180 | _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \ | ||
| 181 | _MAP_91_96_ASCII_SEG7_SYMBOL \ | ||
| 182 | _MAP_97_122_ASCII_SEG7_ALPHA_LOWER \ | ||
| 183 | _MAP_123_126_ASCII_SEG7_SYMBOL | ||
| 184 | |||
| 185 | #define SEG7_DEFAULT_MAP(_name) \ | ||
| 186 | SEG7_CONVERSION_MAP(_name,MAP_ASCII7SEG_ALPHANUM) | ||
| 187 | |||
| 188 | #endif /* MAP_TO_7SEGMENT_H */ | ||
| 189 | |||
diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c new file mode 100644 index 000000000000..58a176ef96a5 --- /dev/null +++ b/drivers/usb/input/yealink.c | |||
| @@ -0,0 +1,1013 @@ | |||
| 1 | /* | ||
| 2 | * drivers/usb/input/yealink.c | ||
| 3 | * | ||
| 4 | * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License as | ||
| 8 | * published by the Free Software Foundation; either version 2 of | ||
| 9 | * the License, or (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | /* | ||
| 21 | * Description: | ||
| 22 | * Driver for the USB-P1K voip usb phone. | ||
| 23 | * This device is produced by Yealink Network Technology Co Ltd | ||
| 24 | * but may be branded under several names: | ||
| 25 | * - Yealink usb-p1k | ||
| 26 | * - Tiptel 115 | ||
| 27 | * - ... | ||
| 28 | * | ||
| 29 | * This driver is based on: | ||
| 30 | * - the usbb2k-api http://savannah.nongnu.org/projects/usbb2k-api/ | ||
| 31 | * - information from http://memeteau.free.fr/usbb2k | ||
| 32 | * - the xpad-driver drivers/usb/input/xpad.c | ||
| 33 | * | ||
| 34 | * Thanks to: | ||
| 35 | * - Olivier Vandorpe, for providing the usbb2k-api. | ||
| 36 | * - Martin Diehl, for spotting my memory allocation bug. | ||
| 37 | * | ||
| 38 | * History: | ||
| 39 | * 20050527 henk First version, functional keyboard. Keyboard events | ||
| 40 | * will pop-up on the ../input/eventX bus. | ||
| 41 | * 20050531 henk Added led, LCD, dialtone and sysfs interface. | ||
| 42 | * 20050610 henk Cleanups, make it ready for public consumption. | ||
| 43 | * 20050630 henk Cleanups, fixes in response to comments. | ||
| 44 | * 20050701 henk sysfs write serialisation, fix potential unload races | ||
| 45 | * 20050801 henk Added ringtone, restructure USB | ||
| 46 | * 20050816 henk Merge 2.6.13-rc6 | ||
| 47 | */ | ||
| 48 | |||
| 49 | #include <linux/config.h> | ||
| 50 | #include <linux/kernel.h> | ||
| 51 | #include <linux/input.h> | ||
| 52 | #include <linux/init.h> | ||
| 53 | #include <linux/slab.h> | ||
| 54 | #include <linux/module.h> | ||
| 55 | #include <linux/rwsem.h> | ||
| 56 | #include <linux/usb.h> | ||
| 57 | |||
| 58 | #include "map_to_7segment.h" | ||
| 59 | #include "yealink.h" | ||
| 60 | |||
| 61 | #define DRIVER_VERSION "yld-20050816" | ||
| 62 | #define DRIVER_AUTHOR "Henk Vergonet" | ||
| 63 | #define DRIVER_DESC "Yealink phone driver" | ||
| 64 | |||
| 65 | #define YEALINK_POLLING_FREQUENCY 10 /* in [Hz] */ | ||
| 66 | |||
| 67 | struct yld_status { | ||
| 68 | u8 lcd[24]; | ||
| 69 | u8 led; | ||
| 70 | u8 dialtone; | ||
| 71 | u8 ringtone; | ||
| 72 | u8 keynum; | ||
| 73 | } __attribute__ ((packed)); | ||
| 74 | |||
| 75 | /* | ||
| 76 | * Register the LCD segment and icon map | ||
| 77 | */ | ||
| 78 | #define _LOC(k,l) { .a = (k), .m = (l) } | ||
| 79 | #define _SEG(t, a, am, b, bm, c, cm, d, dm, e, em, f, fm, g, gm) \ | ||
| 80 | { .type = (t), \ | ||
| 81 | .u = { .s = { _LOC(a, am), _LOC(b, bm), _LOC(c, cm), \ | ||
| 82 | _LOC(d, dm), _LOC(e, em), _LOC(g, gm), \ | ||
| 83 | _LOC(f, fm) } } } | ||
| 84 | #define _PIC(t, h, hm, n) \ | ||
| 85 | { .type = (t), \ | ||
| 86 | .u = { .p = { .name = (n), .a = (h), .m = (hm) } } } | ||
| 87 | |||
| 88 | static const struct lcd_segment_map { | ||
| 89 | char type; | ||
| 90 | union { | ||
| 91 | struct pictogram_map { | ||
| 92 | u8 a,m; | ||
| 93 | char name[10]; | ||
| 94 | } p; | ||
| 95 | struct segment_map { | ||
| 96 | u8 a,m; | ||
| 97 | } s[7]; | ||
| 98 | } u; | ||
| 99 | } lcdMap[] = { | ||
| 100 | #include "yealink.h" | ||
| 101 | }; | ||
| 102 | |||
| 103 | struct yealink_dev { | ||
| 104 | struct input_dev idev; /* input device */ | ||
| 105 | struct usb_device *udev; /* usb device */ | ||
| 106 | |||
| 107 | /* irq input channel */ | ||
| 108 | struct yld_ctl_packet *irq_data; | ||
| 109 | dma_addr_t irq_dma; | ||
| 110 | struct urb *urb_irq; | ||
| 111 | |||
| 112 | /* control output channel */ | ||
| 113 | struct yld_ctl_packet *ctl_data; | ||
| 114 | dma_addr_t ctl_dma; | ||
| 115 | struct usb_ctrlrequest *ctl_req; | ||
| 116 | dma_addr_t ctl_req_dma; | ||
| 117 | struct urb *urb_ctl; | ||
| 118 | |||
| 119 | char phys[64]; /* physical device path */ | ||
| 120 | |||
| 121 | u8 lcdMap[ARRAY_SIZE(lcdMap)]; /* state of LCD, LED ... */ | ||
| 122 | int key_code; /* last reported key */ | ||
| 123 | |||
| 124 | int stat_ix; | ||
| 125 | union { | ||
| 126 | struct yld_status s; | ||
| 127 | u8 b[sizeof(struct yld_status)]; | ||
| 128 | } master, copy; | ||
| 129 | }; | ||
| 130 | |||
| 131 | |||
| 132 | /******************************************************************************* | ||
| 133 | * Yealink lcd interface | ||
| 134 | ******************************************************************************/ | ||
| 135 | |||
| 136 | /* | ||
| 137 | * Register a default 7 segment character set | ||
| 138 | */ | ||
| 139 | static SEG7_DEFAULT_MAP(map_seg7); | ||
| 140 | |||
| 141 | /* Display a char, | ||
| 142 | * char '\9' and '\n' are placeholders and do not overwrite the original text. | ||
| 143 | * A space will always hide an icon. | ||
| 144 | */ | ||
| 145 | static int setChar(struct yealink_dev *yld, int el, int chr) | ||
| 146 | { | ||
| 147 | int i, a, m, val; | ||
| 148 | |||
| 149 | if (el >= ARRAY_SIZE(lcdMap)) | ||
| 150 | return -EINVAL; | ||
| 151 | |||
| 152 | if (chr == '\t' || chr == '\n') | ||
| 153 | return 0; | ||
| 154 | |||
| 155 | yld->lcdMap[el] = chr; | ||
| 156 | |||
| 157 | if (lcdMap[el].type == '.') { | ||
| 158 | a = lcdMap[el].u.p.a; | ||
| 159 | m = lcdMap[el].u.p.m; | ||
| 160 | if (chr != ' ') | ||
| 161 | yld->master.b[a] |= m; | ||
| 162 | else | ||
| 163 | yld->master.b[a] &= ~m; | ||
| 164 | return 0; | ||
| 165 | } | ||
| 166 | |||
| 167 | val = map_to_seg7(&map_seg7, chr); | ||
| 168 | for (i = 0; i < ARRAY_SIZE(lcdMap[0].u.s); i++) { | ||
| 169 | m = lcdMap[el].u.s[i].m; | ||
| 170 | |||
| 171 | if (m == 0) | ||
| 172 | continue; | ||
| 173 | |||
| 174 | a = lcdMap[el].u.s[i].a; | ||
| 175 | if (val & 1) | ||
| 176 | yld->master.b[a] |= m; | ||
| 177 | else | ||
| 178 | yld->master.b[a] &= ~m; | ||
| 179 | val = val >> 1; | ||
| 180 | } | ||
| 181 | return 0; | ||
| 182 | }; | ||
| 183 | |||
| 184 | /******************************************************************************* | ||
| 185 | * Yealink key interface | ||
| 186 | ******************************************************************************/ | ||
| 187 | |||
| 188 | /* Map device buttons to internal key events. | ||
| 189 | * | ||
| 190 | * USB-P1K button layout: | ||
| 191 | * | ||
| 192 | * up | ||
| 193 | * IN OUT | ||
| 194 | * down | ||
| 195 | * | ||
| 196 | * pickup C hangup | ||
| 197 | * 1 2 3 | ||
| 198 | * 4 5 6 | ||
| 199 | * 7 8 9 | ||
| 200 | * * 0 # | ||
| 201 | * | ||
| 202 | * The "up" and "down" keys, are symbolised by arrows on the button. | ||
| 203 | * The "pickup" and "hangup" keys are symbolised by a green and red phone | ||
| 204 | * on the button. | ||
| 205 | */ | ||
| 206 | static int map_p1k_to_key(int scancode) | ||
| 207 | { | ||
| 208 | switch(scancode) { /* phone key: */ | ||
| 209 | case 0x23: return KEY_LEFT; /* IN */ | ||
| 210 | case 0x33: return KEY_UP; /* up */ | ||
| 211 | case 0x04: return KEY_RIGHT; /* OUT */ | ||
| 212 | case 0x24: return KEY_DOWN; /* down */ | ||
| 213 | case 0x03: return KEY_ENTER; /* pickup */ | ||
| 214 | case 0x14: return KEY_BACKSPACE; /* C */ | ||
| 215 | case 0x13: return KEY_ESC; /* hangup */ | ||
| 216 | case 0x00: return KEY_1; /* 1 */ | ||
| 217 | case 0x01: return KEY_2; /* 2 */ | ||
| 218 | case 0x02: return KEY_3; /* 3 */ | ||
| 219 | case 0x10: return KEY_4; /* 4 */ | ||
| 220 | case 0x11: return KEY_5; /* 5 */ | ||
| 221 | case 0x12: return KEY_6; /* 6 */ | ||
| 222 | case 0x20: return KEY_7; /* 7 */ | ||
| 223 | case 0x21: return KEY_8; /* 8 */ | ||
| 224 | case 0x22: return KEY_9; /* 9 */ | ||
| 225 | case 0x30: return KEY_KPASTERISK; /* * */ | ||
| 226 | case 0x31: return KEY_0; /* 0 */ | ||
| 227 | case 0x32: return KEY_LEFTSHIFT | | ||
| 228 | KEY_3 << 8; /* # */ | ||
| 229 | } | ||
| 230 | return -EINVAL; | ||
| 231 | } | ||
| 232 | |||
| 233 | /* Completes a request by converting the data into events for the | ||
| 234 | * input subsystem. | ||
| 235 | * | ||
| 236 | * The key parameter can be cascaded: key2 << 8 | key1 | ||
| 237 | */ | ||
| 238 | static void report_key(struct yealink_dev *yld, int key, struct pt_regs *regs) | ||
| 239 | { | ||
| 240 | struct input_dev *idev = &yld->idev; | ||
| 241 | |||
| 242 | input_regs(idev, regs); | ||
| 243 | if (yld->key_code >= 0) { | ||
| 244 | /* old key up */ | ||
| 245 | input_report_key(idev, yld->key_code & 0xff, 0); | ||
| 246 | if (yld->key_code >> 8) | ||
| 247 | input_report_key(idev, yld->key_code >> 8, 0); | ||
| 248 | } | ||
| 249 | |||
| 250 | yld->key_code = key; | ||
| 251 | if (key >= 0) { | ||
| 252 | /* new valid key */ | ||
| 253 | input_report_key(idev, key & 0xff, 1); | ||
| 254 | if (key >> 8) | ||
| 255 | input_report_key(idev, key >> 8, 1); | ||
| 256 | } | ||
| 257 | input_sync(idev); | ||
| 258 | } | ||
| 259 | |||
| 260 | /******************************************************************************* | ||
| 261 | * Yealink usb communication interface | ||
| 262 | ******************************************************************************/ | ||
| 263 | |||
| 264 | static int yealink_cmd(struct yealink_dev *yld, struct yld_ctl_packet *p) | ||
| 265 | { | ||
| 266 | u8 *buf = (u8 *)p; | ||
| 267 | int i; | ||
| 268 | u8 sum = 0; | ||
| 269 | |||
| 270 | for(i=0; i<USB_PKT_LEN-1; i++) | ||
| 271 | sum -= buf[i]; | ||
| 272 | p->sum = sum; | ||
| 273 | return usb_control_msg(yld->udev, | ||
| 274 | usb_sndctrlpipe(yld->udev, 0), | ||
| 275 | USB_REQ_SET_CONFIGURATION, | ||
| 276 | USB_TYPE_CLASS | USB_RECIP_INTERFACE | USB_DIR_OUT, | ||
| 277 | 0x200, 3, | ||
| 278 | p, sizeof(*p), | ||
| 279 | USB_CTRL_SET_TIMEOUT); | ||
| 280 | } | ||
| 281 | |||
| 282 | static u8 default_ringtone[] = { | ||
| 283 | 0xEF, /* volume [0-255] */ | ||
| 284 | 0xFB, 0x1E, 0x00, 0x0C, /* 1250 [hz], 12/100 [s] */ | ||
| 285 | 0xFC, 0x18, 0x00, 0x0C, /* 1000 [hz], 12/100 [s] */ | ||
| 286 | 0xFB, 0x1E, 0x00, 0x0C, | ||
| 287 | 0xFC, 0x18, 0x00, 0x0C, | ||
| 288 | 0xFB, 0x1E, 0x00, 0x0C, | ||
| 289 | 0xFC, 0x18, 0x00, 0x0C, | ||
| 290 | 0xFB, 0x1E, 0x00, 0x0C, | ||
| 291 | 0xFC, 0x18, 0x00, 0x0C, | ||
| 292 | 0xFF, 0xFF, 0x01, 0x90, /* silent, 400/100 [s] */ | ||
| 293 | 0x00, 0x00 /* end of sequence */ | ||
| 294 | }; | ||
| 295 | |||
| 296 | static int yealink_set_ringtone(struct yealink_dev *yld, u8 *buf, size_t size) | ||
| 297 | { | ||
| 298 | struct yld_ctl_packet *p = yld->ctl_data; | ||
| 299 | int ix, len; | ||
| 300 | |||
| 301 | if (size <= 0) | ||
| 302 | return -EINVAL; | ||
| 303 | |||
| 304 | /* Set the ringtone volume */ | ||
| 305 | memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); | ||
| 306 | yld->ctl_data->cmd = CMD_RING_VOLUME; | ||
| 307 | yld->ctl_data->size = 1; | ||
| 308 | yld->ctl_data->data[0] = buf[0]; | ||
| 309 | yealink_cmd(yld, p); | ||
| 310 | |||
| 311 | buf++; | ||
| 312 | size--; | ||
| 313 | |||
| 314 | p->cmd = CMD_RING_NOTE; | ||
| 315 | ix = 0; | ||
| 316 | while (size != ix) { | ||
| 317 | len = size - ix; | ||
| 318 | if (len > sizeof(p->data)) | ||
| 319 | len = sizeof(p->data); | ||
| 320 | p->size = len; | ||
| 321 | p->offset = cpu_to_be16(ix); | ||
| 322 | memcpy(p->data, &buf[ix], len); | ||
| 323 | yealink_cmd(yld, p); | ||
| 324 | ix += len; | ||
| 325 | } | ||
| 326 | return 0; | ||
| 327 | } | ||
| 328 | |||
| 329 | /* keep stat_master & stat_copy in sync. | ||
| 330 | */ | ||
| 331 | static int yealink_do_idle_tasks(struct yealink_dev *yld) | ||
| 332 | { | ||
| 333 | u8 val; | ||
| 334 | int i, ix, len; | ||
| 335 | |||
| 336 | ix = yld->stat_ix; | ||
| 337 | |||
| 338 | memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); | ||
| 339 | yld->ctl_data->cmd = CMD_KEYPRESS; | ||
| 340 | yld->ctl_data->size = 1; | ||
| 341 | yld->ctl_data->sum = 0xff - CMD_KEYPRESS; | ||
| 342 | |||
| 343 | /* If state update pointer wraps do a KEYPRESS first. */ | ||
| 344 | if (ix >= sizeof(yld->master)) { | ||
| 345 | yld->stat_ix = 0; | ||
| 346 | return 0; | ||
| 347 | } | ||
| 348 | |||
| 349 | /* find update candidates: copy != master */ | ||
| 350 | do { | ||
| 351 | val = yld->master.b[ix]; | ||
| 352 | if (val != yld->copy.b[ix]) | ||
| 353 | goto send_update; | ||
| 354 | } while (++ix < sizeof(yld->master)); | ||
| 355 | |||
| 356 | /* nothing todo, wait a bit and poll for a KEYPRESS */ | ||
| 357 | yld->stat_ix = 0; | ||
| 358 | /* TODO how can we wait abit. ?? | ||
| 359 | * msleep_interruptible(1000 / YEALINK_POLLING_FREQUENCY); | ||
| 360 | */ | ||
| 361 | return 0; | ||
| 362 | |||
| 363 | send_update: | ||
| 364 | |||
| 365 | /* Setup an appropriate update request */ | ||
| 366 | yld->copy.b[ix] = val; | ||
| 367 | yld->ctl_data->data[0] = val; | ||
| 368 | |||
| 369 | switch(ix) { | ||
| 370 | case offsetof(struct yld_status, led): | ||
| 371 | yld->ctl_data->cmd = CMD_LED; | ||
| 372 | yld->ctl_data->sum = -1 - CMD_LED - val; | ||
| 373 | break; | ||
| 374 | case offsetof(struct yld_status, dialtone): | ||
| 375 | yld->ctl_data->cmd = CMD_DIALTONE; | ||
| 376 | yld->ctl_data->sum = -1 - CMD_DIALTONE - val; | ||
| 377 | break; | ||
| 378 | case offsetof(struct yld_status, ringtone): | ||
| 379 | yld->ctl_data->cmd = CMD_RINGTONE; | ||
| 380 | yld->ctl_data->sum = -1 - CMD_RINGTONE - val; | ||
| 381 | break; | ||
| 382 | case offsetof(struct yld_status, keynum): | ||
| 383 | val--; | ||
| 384 | val &= 0x1f; | ||
| 385 | yld->ctl_data->cmd = CMD_SCANCODE; | ||
| 386 | yld->ctl_data->offset = cpu_to_be16(val); | ||
| 387 | yld->ctl_data->data[0] = 0; | ||
| 388 | yld->ctl_data->sum = -1 - CMD_SCANCODE - val; | ||
| 389 | break; | ||
| 390 | default: | ||
| 391 | len = sizeof(yld->master.s.lcd) - ix; | ||
| 392 | if (len > sizeof(yld->ctl_data->data)) | ||
| 393 | len = sizeof(yld->ctl_data->data); | ||
| 394 | |||
| 395 | /* Combine up to <len> consecutive LCD bytes in a singe request | ||
| 396 | */ | ||
| 397 | yld->ctl_data->cmd = CMD_LCD; | ||
| 398 | yld->ctl_data->offset = cpu_to_be16(ix); | ||
| 399 | yld->ctl_data->size = len; | ||
| 400 | yld->ctl_data->sum = -CMD_LCD - ix - val - len; | ||
| 401 | for(i=1; i<len; i++) { | ||
| 402 | ix++; | ||
| 403 | val = yld->master.b[ix]; | ||
| 404 | yld->copy.b[ix] = val; | ||
| 405 | yld->ctl_data->data[i] = val; | ||
| 406 | yld->ctl_data->sum -= val; | ||
| 407 | } | ||
| 408 | } | ||
| 409 | yld->stat_ix = ix + 1; | ||
| 410 | return 1; | ||
| 411 | } | ||
| 412 | |||
| 413 | /* Decide on how to handle responses | ||
| 414 | * | ||
| 415 | * The state transition diagram is somethhing like: | ||
| 416 | * | ||
| 417 | * syncState<--+ | ||
| 418 | * | | | ||
| 419 | * | idle | ||
| 420 | * \|/ | | ||
| 421 | * init --ok--> waitForKey --ok--> getKey | ||
| 422 | * ^ ^ | | ||
| 423 | * | +-------ok-------+ | ||
| 424 | * error,start | ||
| 425 | * | ||
| 426 | */ | ||
| 427 | static void urb_irq_callback(struct urb *urb, struct pt_regs *regs) | ||
| 428 | { | ||
| 429 | struct yealink_dev *yld = urb->context; | ||
| 430 | int ret; | ||
| 431 | |||
| 432 | if (urb->status) | ||
| 433 | err("%s - urb status %d", __FUNCTION__, urb->status); | ||
| 434 | |||
| 435 | switch (yld->irq_data->cmd) { | ||
| 436 | case CMD_KEYPRESS: | ||
| 437 | |||
| 438 | yld->master.s.keynum = yld->irq_data->data[0]; | ||
| 439 | break; | ||
| 440 | |||
| 441 | case CMD_SCANCODE: | ||
| 442 | dbg("get scancode %x", yld->irq_data->data[0]); | ||
| 443 | |||
| 444 | report_key(yld, map_p1k_to_key(yld->irq_data->data[0]), regs); | ||
| 445 | break; | ||
| 446 | |||
| 447 | default: | ||
| 448 | err("unexpected response %x", yld->irq_data->cmd); | ||
| 449 | } | ||
| 450 | |||
| 451 | yealink_do_idle_tasks(yld); | ||
| 452 | |||
| 453 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); | ||
| 454 | if (ret) | ||
| 455 | err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); | ||
| 456 | } | ||
| 457 | |||
| 458 | static void urb_ctl_callback(struct urb *urb, struct pt_regs *regs) | ||
| 459 | { | ||
| 460 | struct yealink_dev *yld = urb->context; | ||
| 461 | int ret; | ||
| 462 | |||
| 463 | if (urb->status) | ||
| 464 | err("%s - urb status %d", __FUNCTION__, urb->status); | ||
| 465 | |||
| 466 | switch (yld->ctl_data->cmd) { | ||
| 467 | case CMD_KEYPRESS: | ||
| 468 | case CMD_SCANCODE: | ||
| 469 | /* ask for a response */ | ||
| 470 | ret = usb_submit_urb(yld->urb_irq, GFP_ATOMIC); | ||
| 471 | break; | ||
| 472 | default: | ||
| 473 | /* send new command */ | ||
| 474 | yealink_do_idle_tasks(yld); | ||
| 475 | ret = usb_submit_urb(yld->urb_ctl, GFP_ATOMIC); | ||
| 476 | } | ||
| 477 | |||
| 478 | if (ret) | ||
| 479 | err("%s - usb_submit_urb failed %d", __FUNCTION__, ret); | ||
| 480 | } | ||
| 481 | |||
| 482 | /******************************************************************************* | ||
| 483 | * input event interface | ||
| 484 | ******************************************************************************/ | ||
| 485 | |||
| 486 | /* TODO should we issue a ringtone on a SND_BELL event? | ||
| 487 | static int input_ev(struct input_dev *dev, unsigned int type, | ||
| 488 | unsigned int code, int value) | ||
| 489 | { | ||
| 490 | |||
| 491 | if (type != EV_SND) | ||
| 492 | return -EINVAL; | ||
| 493 | |||
| 494 | switch (code) { | ||
| 495 | case SND_BELL: | ||
| 496 | case SND_TONE: | ||
| 497 | break; | ||
| 498 | default: | ||
| 499 | return -EINVAL; | ||
| 500 | } | ||
| 501 | |||
| 502 | return 0; | ||
| 503 | } | ||
| 504 | */ | ||
| 505 | |||
| 506 | static int input_open(struct input_dev *dev) | ||
| 507 | { | ||
| 508 | struct yealink_dev *yld = dev->private; | ||
| 509 | int i, ret; | ||
| 510 | |||
| 511 | dbg("%s", __FUNCTION__); | ||
| 512 | |||
| 513 | /* force updates to device */ | ||
| 514 | for (i = 0; i<sizeof(yld->master); i++) | ||
| 515 | yld->copy.b[i] = ~yld->master.b[i]; | ||
| 516 | yld->key_code = -1; /* no keys pressed */ | ||
| 517 | |||
| 518 | yealink_set_ringtone(yld, default_ringtone, sizeof(default_ringtone)); | ||
| 519 | |||
| 520 | /* issue INIT */ | ||
| 521 | memset(yld->ctl_data, 0, sizeof(*(yld->ctl_data))); | ||
| 522 | yld->ctl_data->cmd = CMD_INIT; | ||
| 523 | yld->ctl_data->size = 10; | ||
| 524 | yld->ctl_data->sum = 0x100-CMD_INIT-10; | ||
| 525 | if ((ret = usb_submit_urb(yld->urb_ctl, GFP_KERNEL)) != 0) { | ||
| 526 | dbg("%s - usb_submit_urb failed with result %d", | ||
| 527 | __FUNCTION__, ret); | ||
| 528 | return ret; | ||
| 529 | } | ||
| 530 | return 0; | ||
| 531 | } | ||
| 532 | |||
| 533 | static void input_close(struct input_dev *dev) | ||
| 534 | { | ||
| 535 | struct yealink_dev *yld = dev->private; | ||
| 536 | |||
| 537 | usb_kill_urb(yld->urb_ctl); | ||
| 538 | usb_kill_urb(yld->urb_irq); | ||
| 539 | } | ||
| 540 | |||
| 541 | /******************************************************************************* | ||
| 542 | * sysfs interface | ||
| 543 | ******************************************************************************/ | ||
| 544 | |||
| 545 | static DECLARE_RWSEM(sysfs_rwsema); | ||
| 546 | |||
| 547 | /* Interface to the 7-segments translation table aka. char set. | ||
| 548 | */ | ||
| 549 | static ssize_t show_map(struct device *dev, struct device_attribute *attr, | ||
| 550 | char *buf) | ||
| 551 | { | ||
| 552 | memcpy(buf, &map_seg7, sizeof(map_seg7)); | ||
| 553 | return sizeof(map_seg7); | ||
| 554 | } | ||
| 555 | |||
| 556 | static ssize_t store_map(struct device *dev, struct device_attribute *attr, | ||
| 557 | const char *buf, size_t cnt) | ||
| 558 | { | ||
| 559 | if (cnt != sizeof(map_seg7)) | ||
| 560 | return -EINVAL; | ||
| 561 | memcpy(&map_seg7, buf, sizeof(map_seg7)); | ||
| 562 | return sizeof(map_seg7); | ||
| 563 | } | ||
| 564 | |||
| 565 | /* Interface to the LCD. | ||
| 566 | */ | ||
| 567 | |||
| 568 | /* Reading /sys/../lineX will return the format string with its settings: | ||
| 569 | * | ||
| 570 | * Example: | ||
| 571 | * cat ./line3 | ||
| 572 | * 888888888888 | ||
| 573 | * Linux Rocks! | ||
| 574 | */ | ||
| 575 | static ssize_t show_line(struct device *dev, char *buf, int a, int b) | ||
| 576 | { | ||
| 577 | struct yealink_dev *yld; | ||
| 578 | int i; | ||
| 579 | |||
| 580 | down_read(&sysfs_rwsema); | ||
| 581 | yld = dev_get_drvdata(dev); | ||
| 582 | if (yld == NULL) { | ||
| 583 | up_read(&sysfs_rwsema); | ||
| 584 | return -ENODEV; | ||
| 585 | } | ||
| 586 | |||
| 587 | for (i = a; i < b; i++) | ||
| 588 | *buf++ = lcdMap[i].type; | ||
| 589 | *buf++ = '\n'; | ||
| 590 | for (i = a; i < b; i++) | ||
| 591 | *buf++ = yld->lcdMap[i]; | ||
| 592 | *buf++ = '\n'; | ||
| 593 | *buf = 0; | ||
| 594 | |||
| 595 | up_read(&sysfs_rwsema); | ||
| 596 | return 3 + ((b - a) << 1); | ||
| 597 | } | ||
| 598 | |||
| 599 | static ssize_t show_line1(struct device *dev, struct device_attribute *attr, | ||
| 600 | char *buf) | ||
| 601 | { | ||
| 602 | return show_line(dev, buf, LCD_LINE1_OFFSET, LCD_LINE2_OFFSET); | ||
| 603 | } | ||
| 604 | |||
| 605 | static ssize_t show_line2(struct device *dev, struct device_attribute *attr, | ||
| 606 | char *buf) | ||
| 607 | { | ||
| 608 | return show_line(dev, buf, LCD_LINE2_OFFSET, LCD_LINE3_OFFSET); | ||
| 609 | } | ||
| 610 | |||
| 611 | static ssize_t show_line3(struct device *dev, struct device_attribute *attr, | ||
| 612 | char *buf) | ||
| 613 | { | ||
| 614 | return show_line(dev, buf, LCD_LINE3_OFFSET, LCD_LINE4_OFFSET); | ||
| 615 | } | ||
| 616 | |||
| 617 | /* Writing to /sys/../lineX will set the coresponding LCD line. | ||
| 618 | * - Excess characters are ignored. | ||
| 619 | * - If less characters are written than allowed, the remaining digits are | ||
| 620 | * unchanged. | ||
| 621 | * - The '\n' or '\t' char is a placeholder, it does not overwrite the | ||
| 622 | * original content. | ||
| 623 | */ | ||
| 624 | static ssize_t store_line(struct device *dev, const char *buf, size_t count, | ||
| 625 | int el, size_t len) | ||
| 626 | { | ||
| 627 | struct yealink_dev *yld; | ||
| 628 | int i; | ||
| 629 | |||
| 630 | down_write(&sysfs_rwsema); | ||
| 631 | yld = dev_get_drvdata(dev); | ||
| 632 | if (yld == NULL) { | ||
| 633 | up_write(&sysfs_rwsema); | ||
| 634 | return -ENODEV; | ||
| 635 | } | ||
| 636 | |||
| 637 | if (len > count) | ||
| 638 | len = count; | ||
| 639 | for (i = 0; i < len; i++) | ||
| 640 | setChar(yld, el++, buf[i]); | ||
| 641 | |||
| 642 | up_write(&sysfs_rwsema); | ||
| 643 | return count; | ||
| 644 | } | ||
| 645 | |||
| 646 | static ssize_t store_line1(struct device *dev, struct device_attribute *attr, | ||
| 647 | const char *buf, size_t count) | ||
| 648 | { | ||
| 649 | return store_line(dev, buf, count, LCD_LINE1_OFFSET, LCD_LINE1_SIZE); | ||
| 650 | } | ||
| 651 | |||
| 652 | static ssize_t store_line2(struct device *dev, struct device_attribute *attr, | ||
| 653 | const char *buf, size_t count) | ||
| 654 | { | ||
| 655 | return store_line(dev, buf, count, LCD_LINE2_OFFSET, LCD_LINE2_SIZE); | ||
| 656 | } | ||
| 657 | |||
| 658 | static ssize_t store_line3(struct device *dev, struct device_attribute *attr, | ||
| 659 | const char *buf, size_t count) | ||
| 660 | { | ||
| 661 | return store_line(dev, buf, count, LCD_LINE3_OFFSET, LCD_LINE3_SIZE); | ||
| 662 | } | ||
| 663 | |||
| 664 | /* Interface to visible and audible "icons", these include: | ||
| 665 | * pictures on the LCD, the LED, and the dialtone signal. | ||
| 666 | */ | ||
| 667 | |||
| 668 | /* Get a list of "switchable elements" with their current state. */ | ||
| 669 | static ssize_t get_icons(struct device *dev, struct device_attribute *attr, | ||
| 670 | char *buf) | ||
| 671 | { | ||
| 672 | struct yealink_dev *yld; | ||
| 673 | int i, ret = 1; | ||
| 674 | |||
| 675 | down_read(&sysfs_rwsema); | ||
| 676 | yld = dev_get_drvdata(dev); | ||
| 677 | if (yld == NULL) { | ||
| 678 | up_read(&sysfs_rwsema); | ||
| 679 | return -ENODEV; | ||
| 680 | } | ||
| 681 | |||
| 682 | for (i = 0; i < ARRAY_SIZE(lcdMap); i++) { | ||
| 683 | if (lcdMap[i].type != '.') | ||
| 684 | continue; | ||
| 685 | ret += sprintf(&buf[ret], "%s %s\n", | ||
| 686 | yld->lcdMap[i] == ' ' ? " " : "on", | ||
| 687 | lcdMap[i].u.p.name); | ||
| 688 | } | ||
| 689 | up_read(&sysfs_rwsema); | ||
| 690 | return ret; | ||
| 691 | } | ||
| 692 | |||
| 693 | /* Change the visibility of a particular element. */ | ||
| 694 | static ssize_t set_icon(struct device *dev, const char *buf, size_t count, | ||
| 695 | int chr) | ||
| 696 | { | ||
| 697 | struct yealink_dev *yld; | ||
| 698 | int i; | ||
| 699 | |||
| 700 | down_write(&sysfs_rwsema); | ||
| 701 | yld = dev_get_drvdata(dev); | ||
| 702 | if (yld == NULL) { | ||
| 703 | up_write(&sysfs_rwsema); | ||
| 704 | return -ENODEV; | ||
| 705 | } | ||
| 706 | |||
| 707 | for (i = 0; i < ARRAY_SIZE(lcdMap); i++) { | ||
| 708 | if (lcdMap[i].type != '.') | ||
| 709 | continue; | ||
| 710 | if (strncmp(buf, lcdMap[i].u.p.name, count) == 0) { | ||
| 711 | setChar(yld, i, chr); | ||
| 712 | break; | ||
| 713 | } | ||
| 714 | } | ||
| 715 | |||
| 716 | up_write(&sysfs_rwsema); | ||
| 717 | return count; | ||
| 718 | } | ||
| 719 | |||
| 720 | static ssize_t show_icon(struct device *dev, struct device_attribute *attr, | ||
| 721 | const char *buf, size_t count) | ||
| 722 | { | ||
| 723 | return set_icon(dev, buf, count, buf[0]); | ||
| 724 | } | ||
| 725 | |||
| 726 | static ssize_t hide_icon(struct device *dev, struct device_attribute *attr, | ||
| 727 | const char *buf, size_t count) | ||
| 728 | { | ||
| 729 | return set_icon(dev, buf, count, ' '); | ||
| 730 | } | ||
| 731 | |||
| 732 | /* Upload a ringtone to the device. | ||
| 733 | */ | ||
| 734 | |||
| 735 | /* Stores raw ringtone data in the phone */ | ||
| 736 | static ssize_t store_ringtone(struct device *dev, | ||
| 737 | struct device_attribute *attr, | ||
| 738 | const char *buf, size_t count) | ||
| 739 | { | ||
| 740 | struct yealink_dev *yld; | ||
| 741 | |||
| 742 | down_write(&sysfs_rwsema); | ||
| 743 | yld = dev_get_drvdata(dev); | ||
| 744 | if (yld == NULL) { | ||
| 745 | up_write(&sysfs_rwsema); | ||
| 746 | return -ENODEV; | ||
| 747 | } | ||
| 748 | |||
| 749 | /* TODO locking with async usb control interface??? */ | ||
| 750 | yealink_set_ringtone(yld, (char *)buf, count); | ||
| 751 | up_write(&sysfs_rwsema); | ||
| 752 | return count; | ||
| 753 | } | ||
| 754 | |||
| 755 | #define _M444 S_IRUGO | ||
| 756 | #define _M664 S_IRUGO|S_IWUSR|S_IWGRP | ||
| 757 | #define _M220 S_IWUSR|S_IWGRP | ||
| 758 | |||
| 759 | static DEVICE_ATTR(map_seg7 , _M664, show_map , store_map ); | ||
| 760 | static DEVICE_ATTR(line1 , _M664, show_line1 , store_line1 ); | ||
| 761 | static DEVICE_ATTR(line2 , _M664, show_line2 , store_line2 ); | ||
| 762 | static DEVICE_ATTR(line3 , _M664, show_line3 , store_line3 ); | ||
| 763 | static DEVICE_ATTR(get_icons , _M444, get_icons , NULL ); | ||
| 764 | static DEVICE_ATTR(show_icon , _M220, NULL , show_icon ); | ||
| 765 | static DEVICE_ATTR(hide_icon , _M220, NULL , hide_icon ); | ||
| 766 | static DEVICE_ATTR(ringtone , _M220, NULL , store_ringtone); | ||
| 767 | |||
| 768 | static struct attribute *yld_attributes[] = { | ||
| 769 | &dev_attr_line1.attr, | ||
| 770 | &dev_attr_line2.attr, | ||
| 771 | &dev_attr_line3.attr, | ||
| 772 | &dev_attr_get_icons.attr, | ||
| 773 | &dev_attr_show_icon.attr, | ||
| 774 | &dev_attr_hide_icon.attr, | ||
| 775 | &dev_attr_map_seg7.attr, | ||
| 776 | &dev_attr_ringtone.attr, | ||
| 777 | NULL | ||
| 778 | }; | ||
| 779 | |||
| 780 | static struct attribute_group yld_attr_group = { | ||
| 781 | .attrs = yld_attributes | ||
| 782 | }; | ||
| 783 | |||
| 784 | /******************************************************************************* | ||
| 785 | * Linux interface and usb initialisation | ||
| 786 | ******************************************************************************/ | ||
| 787 | |||
| 788 | static const struct yld_device { | ||
| 789 | u16 idVendor; | ||
| 790 | u16 idProduct; | ||
| 791 | char *name; | ||
| 792 | } yld_device[] = { | ||
| 793 | { 0x6993, 0xb001, "Yealink usb-p1k" }, | ||
| 794 | }; | ||
| 795 | |||
| 796 | static struct usb_device_id usb_table [] = { | ||
| 797 | { USB_INTERFACE_INFO(USB_CLASS_HID, 0, 0) }, | ||
| 798 | { } | ||
| 799 | }; | ||
| 800 | |||
| 801 | static int usb_cleanup(struct yealink_dev *yld, int err) | ||
| 802 | { | ||
| 803 | if (yld == NULL) | ||
| 804 | return err; | ||
| 805 | |||
| 806 | if (yld->urb_irq) { | ||
| 807 | usb_kill_urb(yld->urb_irq); | ||
| 808 | usb_free_urb(yld->urb_irq); | ||
| 809 | } | ||
| 810 | if (yld->urb_ctl) | ||
| 811 | usb_free_urb(yld->urb_ctl); | ||
| 812 | if (yld->idev.dev) | ||
| 813 | input_unregister_device(&yld->idev); | ||
| 814 | if (yld->ctl_req) | ||
| 815 | usb_buffer_free(yld->udev, sizeof(*(yld->ctl_req)), | ||
| 816 | yld->ctl_req, yld->ctl_req_dma); | ||
| 817 | if (yld->ctl_data) | ||
| 818 | usb_buffer_free(yld->udev, USB_PKT_LEN, | ||
| 819 | yld->ctl_data, yld->ctl_dma); | ||
| 820 | if (yld->irq_data) | ||
| 821 | usb_buffer_free(yld->udev, USB_PKT_LEN, | ||
| 822 | yld->irq_data, yld->irq_dma); | ||
| 823 | kfree(yld); | ||
| 824 | return err; | ||
| 825 | } | ||
| 826 | |||
| 827 | static void usb_disconnect(struct usb_interface *intf) | ||
| 828 | { | ||
| 829 | struct yealink_dev *yld; | ||
| 830 | |||
| 831 | down_write(&sysfs_rwsema); | ||
| 832 | yld = usb_get_intfdata(intf); | ||
| 833 | sysfs_remove_group(&intf->dev.kobj, &yld_attr_group); | ||
| 834 | usb_set_intfdata(intf, NULL); | ||
| 835 | up_write(&sysfs_rwsema); | ||
| 836 | |||
| 837 | usb_cleanup(yld, 0); | ||
| 838 | } | ||
| 839 | |||
| 840 | static int usb_match(struct usb_device *udev) | ||
| 841 | { | ||
| 842 | int i; | ||
| 843 | u16 idVendor = le16_to_cpu(udev->descriptor.idVendor); | ||
| 844 | u16 idProduct = le16_to_cpu(udev->descriptor.idProduct); | ||
| 845 | |||
| 846 | for (i = 0; i < ARRAY_SIZE(yld_device); i++) { | ||
| 847 | if ((idVendor == yld_device[i].idVendor) && | ||
| 848 | (idProduct == yld_device[i].idProduct)) | ||
| 849 | return i; | ||
| 850 | } | ||
| 851 | return -ENODEV; | ||
| 852 | } | ||
| 853 | |||
| 854 | static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
| 855 | { | ||
| 856 | struct usb_device *udev = interface_to_usbdev (intf); | ||
| 857 | struct usb_host_interface *interface; | ||
| 858 | struct usb_endpoint_descriptor *endpoint; | ||
| 859 | struct yealink_dev *yld; | ||
| 860 | char path[64]; | ||
| 861 | int ret, pipe, i; | ||
| 862 | |||
| 863 | i = usb_match(udev); | ||
| 864 | if (i < 0) | ||
| 865 | return -ENODEV; | ||
| 866 | |||
| 867 | interface = intf->cur_altsetting; | ||
| 868 | endpoint = &interface->endpoint[0].desc; | ||
| 869 | if (!(endpoint->bEndpointAddress & 0x80)) | ||
| 870 | return -EIO; | ||
| 871 | if ((endpoint->bmAttributes & 3) != 3) | ||
| 872 | return -EIO; | ||
| 873 | |||
| 874 | if ((yld = kmalloc(sizeof(struct yealink_dev), GFP_KERNEL)) == NULL) | ||
| 875 | return -ENOMEM; | ||
| 876 | |||
| 877 | memset(yld, 0, sizeof(*yld)); | ||
| 878 | yld->udev = udev; | ||
| 879 | |||
| 880 | /* allocate usb buffers */ | ||
| 881 | yld->irq_data = usb_buffer_alloc(udev, USB_PKT_LEN, | ||
| 882 | SLAB_ATOMIC, &yld->irq_dma); | ||
| 883 | if (yld->irq_data == NULL) | ||
| 884 | return usb_cleanup(yld, -ENOMEM); | ||
| 885 | |||
| 886 | yld->ctl_data = usb_buffer_alloc(udev, USB_PKT_LEN, | ||
| 887 | SLAB_ATOMIC, &yld->ctl_dma); | ||
| 888 | if (!yld->ctl_data) | ||
| 889 | return usb_cleanup(yld, -ENOMEM); | ||
| 890 | |||
| 891 | yld->ctl_req = usb_buffer_alloc(udev, sizeof(*(yld->ctl_req)), | ||
| 892 | SLAB_ATOMIC, &yld->ctl_req_dma); | ||
| 893 | if (yld->ctl_req == NULL) | ||
| 894 | return usb_cleanup(yld, -ENOMEM); | ||
| 895 | |||
| 896 | /* allocate urb structures */ | ||
| 897 | yld->urb_irq = usb_alloc_urb(0, GFP_KERNEL); | ||
| 898 | if (yld->urb_irq == NULL) | ||
| 899 | return usb_cleanup(yld, -ENOMEM); | ||
| 900 | |||
| 901 | yld->urb_ctl = usb_alloc_urb(0, GFP_KERNEL); | ||
| 902 | if (yld->urb_ctl == NULL) | ||
| 903 | return usb_cleanup(yld, -ENOMEM); | ||
| 904 | |||
| 905 | /* get a handle to the interrupt data pipe */ | ||
| 906 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); | ||
| 907 | ret = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); | ||
| 908 | if (ret != USB_PKT_LEN) | ||
| 909 | err("invalid payload size %d, expected %d", ret, USB_PKT_LEN); | ||
| 910 | |||
| 911 | /* initialise irq urb */ | ||
| 912 | usb_fill_int_urb(yld->urb_irq, udev, pipe, yld->irq_data, | ||
| 913 | USB_PKT_LEN, | ||
| 914 | urb_irq_callback, | ||
| 915 | yld, endpoint->bInterval); | ||
| 916 | yld->urb_irq->transfer_dma = yld->irq_dma; | ||
| 917 | yld->urb_irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
| 918 | yld->urb_irq->dev = udev; | ||
| 919 | |||
| 920 | /* initialise ctl urb */ | ||
| 921 | yld->ctl_req->bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE | | ||
| 922 | USB_DIR_OUT; | ||
| 923 | yld->ctl_req->bRequest = USB_REQ_SET_CONFIGURATION; | ||
| 924 | yld->ctl_req->wValue = cpu_to_le16(0x200); | ||
| 925 | yld->ctl_req->wIndex = cpu_to_le16(interface->desc.bInterfaceNumber); | ||
| 926 | yld->ctl_req->wLength = cpu_to_le16(USB_PKT_LEN); | ||
| 927 | |||
| 928 | usb_fill_control_urb(yld->urb_ctl, udev, usb_sndctrlpipe(udev, 0), | ||
| 929 | (void *)yld->ctl_req, yld->ctl_data, USB_PKT_LEN, | ||
| 930 | urb_ctl_callback, yld); | ||
| 931 | yld->urb_ctl->setup_dma = yld->ctl_req_dma; | ||
| 932 | yld->urb_ctl->transfer_dma = yld->ctl_dma; | ||
| 933 | yld->urb_ctl->transfer_flags |= URB_NO_SETUP_DMA_MAP | | ||
| 934 | URB_NO_TRANSFER_DMA_MAP; | ||
| 935 | yld->urb_ctl->dev = udev; | ||
| 936 | |||
| 937 | /* find out the physical bus location */ | ||
| 938 | if (usb_make_path(udev, path, sizeof(path)) > 0) | ||
| 939 | snprintf(yld->phys, sizeof(yld->phys)-1, "%s/input0", path); | ||
| 940 | |||
| 941 | /* register settings for the input device */ | ||
| 942 | init_input_dev(&yld->idev); | ||
| 943 | yld->idev.private = yld; | ||
| 944 | yld->idev.id.bustype = BUS_USB; | ||
| 945 | yld->idev.id.vendor = le16_to_cpu(udev->descriptor.idVendor); | ||
| 946 | yld->idev.id.product = le16_to_cpu(udev->descriptor.idProduct); | ||
| 947 | yld->idev.id.version = le16_to_cpu(udev->descriptor.bcdDevice); | ||
| 948 | yld->idev.dev = &intf->dev; | ||
| 949 | yld->idev.name = yld_device[i].name; | ||
| 950 | yld->idev.phys = yld->phys; | ||
| 951 | /* yld->idev.event = input_ev; TODO */ | ||
| 952 | yld->idev.open = input_open; | ||
| 953 | yld->idev.close = input_close; | ||
| 954 | |||
| 955 | /* register available key events */ | ||
| 956 | yld->idev.evbit[0] = BIT(EV_KEY); | ||
| 957 | for (i = 0; i < 256; i++) { | ||
| 958 | int k = map_p1k_to_key(i); | ||
| 959 | if (k >= 0) { | ||
| 960 | set_bit(k & 0xff, yld->idev.keybit); | ||
| 961 | if (k >> 8) | ||
| 962 | set_bit(k >> 8, yld->idev.keybit); | ||
| 963 | } | ||
| 964 | } | ||
| 965 | |||
| 966 | printk(KERN_INFO "input: %s on %s\n", yld->idev.name, path); | ||
| 967 | |||
| 968 | input_register_device(&yld->idev); | ||
| 969 | |||
| 970 | usb_set_intfdata(intf, yld); | ||
| 971 | |||
| 972 | /* clear visible elements */ | ||
| 973 | for (i=0; i<ARRAY_SIZE(lcdMap); i++) | ||
| 974 | setChar(yld, i, ' '); | ||
| 975 | |||
| 976 | /* display driver version on LCD line 3 */ | ||
| 977 | store_line3(&intf->dev, NULL, | ||
| 978 | DRIVER_VERSION, sizeof(DRIVER_VERSION)); | ||
| 979 | |||
| 980 | /* Register sysfs hooks (don't care about failure) */ | ||
| 981 | sysfs_create_group(&intf->dev.kobj, &yld_attr_group); | ||
| 982 | return 0; | ||
| 983 | } | ||
| 984 | |||
| 985 | static struct usb_driver yealink_driver = { | ||
| 986 | .owner = THIS_MODULE, | ||
| 987 | .name = "yealink", | ||
| 988 | .probe = usb_probe, | ||
| 989 | .disconnect = usb_disconnect, | ||
| 990 | .id_table = usb_table, | ||
| 991 | }; | ||
| 992 | |||
| 993 | static int __init yealink_dev_init(void) | ||
| 994 | { | ||
| 995 | int ret = usb_register(&yealink_driver); | ||
| 996 | if (ret == 0) | ||
| 997 | info(DRIVER_DESC ":" DRIVER_VERSION); | ||
| 998 | return ret; | ||
| 999 | } | ||
| 1000 | |||
| 1001 | static void __exit yealink_dev_exit(void) | ||
| 1002 | { | ||
| 1003 | usb_deregister(&yealink_driver); | ||
| 1004 | } | ||
| 1005 | |||
| 1006 | module_init(yealink_dev_init); | ||
| 1007 | module_exit(yealink_dev_exit); | ||
| 1008 | |||
| 1009 | MODULE_DEVICE_TABLE (usb, usb_table); | ||
| 1010 | |||
| 1011 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
| 1012 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
| 1013 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/input/yealink.h b/drivers/usb/input/yealink.h new file mode 100644 index 000000000000..48af0be9cbdf --- /dev/null +++ b/drivers/usb/input/yealink.h | |||
| @@ -0,0 +1,220 @@ | |||
| 1 | /* | ||
| 2 | * drivers/usb/input/yealink.h | ||
| 3 | * | ||
| 4 | * Copyright (c) 2005 Henk Vergonet <Henk.Vergonet@gmail.com> | ||
| 5 | * | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License as | ||
| 9 | * published by the Free Software Foundation; either version 2 of | ||
| 10 | * the License, or (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | */ | ||
| 21 | #ifndef INPUT_YEALINK_H | ||
| 22 | #define INPUT_YEALINK_H | ||
| 23 | |||
| 24 | /* Using the control channel on interface 3 various aspects of the phone | ||
| 25 | * can be controlled like LCD, LED, dialtone and the ringtone. | ||
| 26 | */ | ||
| 27 | |||
| 28 | struct yld_ctl_packet { | ||
| 29 | u8 cmd; /* command code, see below */ | ||
| 30 | u8 size; /* 1-11, size of used data bytes. */ | ||
| 31 | u16 offset; /* internal packet offset */ | ||
| 32 | u8 data[11]; | ||
| 33 | s8 sum; /* negative sum of 15 preceding bytes */ | ||
| 34 | } __attribute__ ((packed)); | ||
| 35 | |||
| 36 | #define USB_PKT_LEN sizeof(struct yld_ctl_packet) | ||
| 37 | |||
| 38 | /* The following yld_ctl_packet's are available: */ | ||
| 39 | |||
| 40 | /* Init registers | ||
| 41 | * | ||
| 42 | * cmd 0x8e | ||
| 43 | * size 10 | ||
| 44 | * offset 0 | ||
| 45 | * data 0,0,0,0.... | ||
| 46 | */ | ||
| 47 | #define CMD_INIT 0x8e | ||
| 48 | |||
| 49 | /* Request key scan | ||
| 50 | * | ||
| 51 | * cmd 0x80 | ||
| 52 | * size 1 | ||
| 53 | * offset 0 | ||
| 54 | * data[0] on return returns the key number, if it changes there's a new | ||
| 55 | * key pressed. | ||
| 56 | */ | ||
| 57 | #define CMD_KEYPRESS 0x80 | ||
| 58 | |||
| 59 | /* Request scancode | ||
| 60 | * | ||
| 61 | * cmd 0x81 | ||
| 62 | * size 1 | ||
| 63 | * offset key number [0-1f] | ||
| 64 | * data[0] on return returns the scancode | ||
| 65 | */ | ||
| 66 | #define CMD_SCANCODE 0x81 | ||
| 67 | |||
| 68 | /* Set LCD | ||
| 69 | * | ||
| 70 | * cmd 0x04 | ||
| 71 | * size 1-11 | ||
| 72 | * offset 0-23 | ||
| 73 | * data segment bits | ||
| 74 | */ | ||
| 75 | #define CMD_LCD 0x04 | ||
| 76 | |||
| 77 | /* Set led | ||
| 78 | * | ||
| 79 | * cmd 0x05 | ||
| 80 | * size 1 | ||
| 81 | * offset 0 | ||
| 82 | * data[0] 0 OFF / 1 ON | ||
| 83 | */ | ||
| 84 | #define CMD_LED 0x05 | ||
| 85 | |||
| 86 | /* Set ringtone volume | ||
| 87 | * | ||
| 88 | * cmd 0x11 | ||
| 89 | * size 1 | ||
| 90 | * offset 0 | ||
| 91 | * data[0] 0-0xff volume | ||
| 92 | */ | ||
| 93 | #define CMD_RING_VOLUME 0x11 | ||
| 94 | |||
| 95 | /* Set ringtone notes | ||
| 96 | * | ||
| 97 | * cmd 0x02 | ||
| 98 | * size 1-11 | ||
| 99 | * offset 0-> | ||
| 100 | * data binary representation LE16(-freq), LE16(duration) .... | ||
| 101 | */ | ||
| 102 | #define CMD_RING_NOTE 0x02 | ||
| 103 | |||
| 104 | /* Sound ringtone via the speaker on the back | ||
| 105 | * | ||
| 106 | * cmd 0x03 | ||
| 107 | * size 1 | ||
| 108 | * offset 0 | ||
| 109 | * data[0] 0 OFF / 0x24 ON | ||
| 110 | */ | ||
| 111 | #define CMD_RINGTONE 0x03 | ||
| 112 | |||
| 113 | /* Sound dial tone via the ear speaker | ||
| 114 | * | ||
| 115 | * cmd 0x09 | ||
| 116 | * size 1 | ||
| 117 | * offset 0 | ||
| 118 | * data[0] 0 OFF / 1 ON | ||
| 119 | */ | ||
| 120 | #define CMD_DIALTONE 0x09 | ||
| 121 | |||
| 122 | #endif /* INPUT_YEALINK_H */ | ||
| 123 | |||
| 124 | |||
| 125 | #if defined(_SEG) && defined(_PIC) | ||
| 126 | /* This table maps the LCD segments onto individual bit positions in the | ||
| 127 | * yld_status struct. | ||
| 128 | */ | ||
| 129 | |||
| 130 | /* LCD, each segment must be driven seperately. | ||
| 131 | * | ||
| 132 | * Layout: | ||
| 133 | * | ||
| 134 | * |[] [][] [][] [][] in |[][] | ||
| 135 | * |[] M [][] D [][] : [][] out |[][] | ||
| 136 | * store | ||
| 137 | * | ||
| 138 | * NEW REP SU MO TU WE TH FR SA | ||
| 139 | * | ||
| 140 | * [] [] [] [] [] [] [] [] [] [] [] [] | ||
| 141 | * [] [] [] [] [] [] [] [] [] [] [] [] | ||
| 142 | */ | ||
| 143 | |||
| 144 | /* Line 1 | ||
| 145 | * Format : 18.e8.M8.88...188 | ||
| 146 | * Icon names : M D : IN OUT STORE | ||
| 147 | */ | ||
| 148 | #define LCD_LINE1_OFFSET 0 | ||
| 149 | #define LCD_LINE1_SIZE 17 | ||
| 150 | |||
| 151 | /* Note: first g then f => ! ! */ | ||
| 152 | /* _SEG( type a b c d e g f ) */ | ||
| 153 | _SEG('1', 0,0 , 22,2 , 22,2 , 0,0 , 0,0 , 0,0 , 0,0 ), | ||
| 154 | _SEG('8', 20,1 , 20,2 , 20,4 , 20,8 , 21,4 , 21,2 , 21,1 ), | ||
| 155 | _PIC('.', 22,1 , "M" ), | ||
| 156 | _SEG('e', 18,1 , 18,2 , 18,4 , 18,1 , 19,2 , 18,1 , 19,1 ), | ||
| 157 | _SEG('8', 16,1 , 16,2 , 16,4 , 16,8 , 17,4 , 17,2 , 17,1 ), | ||
| 158 | _PIC('.', 15,8 , "D" ), | ||
| 159 | _SEG('M', 14,1 , 14,2 , 14,4 , 14,1 , 15,4 , 15,2 , 15,1 ), | ||
| 160 | _SEG('8', 12,1 , 12,2 , 12,4 , 12,8 , 13,4 , 13,2 , 13,1 ), | ||
| 161 | _PIC('.', 11,8 , ":" ), | ||
| 162 | _SEG('8', 10,1 , 10,2 , 10,4 , 10,8 , 11,4 , 11,2 , 11,1 ), | ||
| 163 | _SEG('8', 8,1 , 8,2 , 8,4 , 8,8 , 9,4 , 9,2 , 9,1 ), | ||
| 164 | _PIC('.', 7,1 , "IN" ), | ||
| 165 | _PIC('.', 7,2 , "OUT" ), | ||
| 166 | _PIC('.', 7,4 , "STORE" ), | ||
| 167 | _SEG('1', 0,0 , 5,1 , 5,1 , 0,0 , 0,0 , 0,0 , 0,0 ), | ||
| 168 | _SEG('8', 4,1 , 4,2 , 4,4 , 4,8 , 5,8 , 5,4 , 5,2 ), | ||
| 169 | _SEG('8', 2,1 , 2,2 , 2,4 , 2,8 , 3,4 , 3,2 , 3,1 ), | ||
| 170 | |||
| 171 | /* Line 2 | ||
| 172 | * Format : ......... | ||
| 173 | * Pict. name : NEW REP SU MO TU WE TH FR SA | ||
| 174 | */ | ||
| 175 | #define LCD_LINE2_OFFSET LCD_LINE1_OFFSET + LCD_LINE1_SIZE | ||
| 176 | #define LCD_LINE2_SIZE 9 | ||
| 177 | |||
| 178 | _PIC('.', 23,2 , "NEW" ), | ||
| 179 | _PIC('.', 23,4 , "REP" ), | ||
| 180 | _PIC('.', 1,8 , "SU" ), | ||
| 181 | _PIC('.', 1,4 , "MO" ), | ||
| 182 | _PIC('.', 1,2 , "TU" ), | ||
| 183 | _PIC('.', 1,1 , "WE" ), | ||
| 184 | _PIC('.', 0,1 , "TH" ), | ||
| 185 | _PIC('.', 0,2 , "FR" ), | ||
| 186 | _PIC('.', 0,4 , "SA" ), | ||
| 187 | |||
| 188 | /* Line 3 | ||
| 189 | * Format : 888888888888 | ||
| 190 | */ | ||
| 191 | #define LCD_LINE3_OFFSET LCD_LINE2_OFFSET + LCD_LINE2_SIZE | ||
| 192 | #define LCD_LINE3_SIZE 12 | ||
| 193 | |||
| 194 | _SEG('8', 22,16, 22,32, 22,64, 22,128, 23,128, 23,64, 23,32 ), | ||
| 195 | _SEG('8', 20,16, 20,32, 20,64, 20,128, 21,128, 21,64, 21,32 ), | ||
| 196 | _SEG('8', 18,16, 18,32, 18,64, 18,128, 19,128, 19,64, 19,32 ), | ||
| 197 | _SEG('8', 16,16, 16,32, 16,64, 16,128, 17,128, 17,64, 17,32 ), | ||
| 198 | _SEG('8', 14,16, 14,32, 14,64, 14,128, 15,128, 15,64, 15,32 ), | ||
| 199 | _SEG('8', 12,16, 12,32, 12,64, 12,128, 13,128, 13,64, 13,32 ), | ||
| 200 | _SEG('8', 10,16, 10,32, 10,64, 10,128, 11,128, 11,64, 11,32 ), | ||
| 201 | _SEG('8', 8,16, 8,32, 8,64, 8,128, 9,128, 9,64, 9,32 ), | ||
| 202 | _SEG('8', 6,16, 6,32, 6,64, 6,128, 7,128, 7,64, 7,32 ), | ||
| 203 | _SEG('8', 4,16, 4,32, 4,64, 4,128, 5,128, 5,64, 5,32 ), | ||
| 204 | _SEG('8', 2,16, 2,32, 2,64, 2,128, 3,128, 3,64, 3,32 ), | ||
| 205 | _SEG('8', 0,16, 0,32, 0,64, 0,128, 1,128, 1,64, 1,32 ), | ||
| 206 | |||
| 207 | /* Line 4 | ||
| 208 | * | ||
| 209 | * The LED, DIALTONE and RINGTONE are implemented as icons and use the same | ||
| 210 | * sysfs interface. | ||
| 211 | */ | ||
| 212 | #define LCD_LINE4_OFFSET LCD_LINE3_OFFSET + LCD_LINE3_SIZE | ||
| 213 | |||
| 214 | _PIC('.', offsetof(struct yld_status, led) , 0x01, "LED" ), | ||
| 215 | _PIC('.', offsetof(struct yld_status, dialtone) , 0x01, "DIALTONE" ), | ||
| 216 | _PIC('.', offsetof(struct yld_status, ringtone) , 0x24, "RINGTONE" ), | ||
| 217 | |||
| 218 | #undef _SEG | ||
| 219 | #undef _PIC | ||
| 220 | #endif /* _SEG && _PIC */ | ||
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index 6f7994f5a714..ae4681f9f0ea 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
| @@ -426,7 +426,7 @@ static int auerchain_submit_urb (pauerchain_t acp, struct urb * urb) | |||
| 426 | 426 | ||
| 427 | /* cancel an urb which is submitted to the chain | 427 | /* cancel an urb which is submitted to the chain |
| 428 | the result is 0 if the urb is cancelled, or -EINPROGRESS if | 428 | the result is 0 if the urb is cancelled, or -EINPROGRESS if |
| 429 | URB_ASYNC_UNLINK is set and the function is successfully started. | 429 | the function is successfully started. |
| 430 | */ | 430 | */ |
| 431 | static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb) | 431 | static int auerchain_unlink_urb (pauerchain_t acp, struct urb * urb) |
| 432 | { | 432 | { |
| @@ -515,7 +515,6 @@ static void auerchain_unlink_all (pauerchain_t acp) | |||
| 515 | acep = acp->active; | 515 | acep = acp->active; |
| 516 | if (acep) { | 516 | if (acep) { |
| 517 | urbp = acep->urbp; | 517 | urbp = acep->urbp; |
| 518 | urbp->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 519 | dbg ("unlink active urb"); | 518 | dbg ("unlink active urb"); |
| 520 | usb_kill_urb (urbp); | 519 | usb_kill_urb (urbp); |
| 521 | } | 520 | } |
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index ad17892aac9e..7e93ac96490f 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c | |||
| @@ -464,7 +464,7 @@ static ssize_t ld_usb_read(struct file *file, char __user *buffer, size_t count, | |||
| 464 | actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); | 464 | actual_buffer = (size_t*)(dev->ring_buffer + dev->ring_tail*(sizeof(size_t)+dev->interrupt_in_endpoint_size)); |
| 465 | bytes_to_read = min(count, *actual_buffer); | 465 | bytes_to_read = min(count, *actual_buffer); |
| 466 | if (bytes_to_read < *actual_buffer) | 466 | if (bytes_to_read < *actual_buffer) |
| 467 | dev_warn(&dev->intf->dev, "Read buffer overflow, %d bytes dropped\n", | 467 | dev_warn(&dev->intf->dev, "Read buffer overflow, %zd bytes dropped\n", |
| 468 | *actual_buffer-bytes_to_read); | 468 | *actual_buffer-bytes_to_read); |
| 469 | 469 | ||
| 470 | /* copy one interrupt_in_buffer from ring_buffer into userspace */ | 470 | /* copy one interrupt_in_buffer from ring_buffer into userspace */ |
| @@ -528,8 +528,8 @@ static ssize_t ld_usb_write(struct file *file, const char __user *buffer, | |||
| 528 | /* write the data into interrupt_out_buffer from userspace */ | 528 | /* write the data into interrupt_out_buffer from userspace */ |
| 529 | bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); | 529 | bytes_to_write = min(count, write_buffer_size*dev->interrupt_out_endpoint_size); |
| 530 | if (bytes_to_write < count) | 530 | if (bytes_to_write < count) |
| 531 | dev_warn(&dev->intf->dev, "Write buffer overflow, %d bytes dropped\n",count-bytes_to_write); | 531 | dev_warn(&dev->intf->dev, "Write buffer overflow, %zd bytes dropped\n",count-bytes_to_write); |
| 532 | dbg_info(&dev->intf->dev, "%s: count = %d, bytes_to_write = %d\n", __FUNCTION__, count, bytes_to_write); | 532 | dbg_info(&dev->intf->dev, "%s: count = %zd, bytes_to_write = %zd\n", __FUNCTION__, count, bytes_to_write); |
| 533 | 533 | ||
| 534 | if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { | 534 | if (copy_from_user(dev->interrupt_out_buffer, buffer, bytes_to_write)) { |
| 535 | retval = -EFAULT; | 535 | retval = -EFAULT; |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index 2fd12264fd53..d63ce6c030f3 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
| @@ -229,7 +229,7 @@ sisusb_bulkout_msg(struct sisusb_usb_data *sisusb, int index, unsigned int pipe, | |||
| 229 | usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, | 229 | usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, |
| 230 | sisusb_bulk_completeout, &sisusb->urbout_context[index]); | 230 | sisusb_bulk_completeout, &sisusb->urbout_context[index]); |
| 231 | 231 | ||
| 232 | urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); | 232 | urb->transfer_flags |= tflags; |
| 233 | urb->actual_length = 0; | 233 | urb->actual_length = 0; |
| 234 | 234 | ||
| 235 | if ((urb->transfer_dma = transfer_dma)) | 235 | if ((urb->transfer_dma = transfer_dma)) |
| @@ -295,7 +295,7 @@ sisusb_bulkin_msg(struct sisusb_usb_data *sisusb, unsigned int pipe, void *data, | |||
| 295 | usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, | 295 | usb_fill_bulk_urb(urb, sisusb->sisusb_dev, pipe, data, len, |
| 296 | sisusb_bulk_completein, sisusb); | 296 | sisusb_bulk_completein, sisusb); |
| 297 | 297 | ||
| 298 | urb->transfer_flags |= (tflags | URB_ASYNC_UNLINK); | 298 | urb->transfer_flags |= tflags; |
| 299 | urb->actual_length = 0; | 299 | urb->actual_length = 0; |
| 300 | 300 | ||
| 301 | if ((urb->transfer_dma = transfer_dma)) | 301 | if ((urb->transfer_dma = transfer_dma)) |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index fd7fb98e4b20..54799eb0bc60 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
| @@ -986,7 +986,6 @@ test_ctrl_queue (struct usbtest_dev *dev, struct usbtest_param *param) | |||
| 986 | 986 | ||
| 987 | u->context = &context; | 987 | u->context = &context; |
| 988 | u->complete = ctrl_complete; | 988 | u->complete = ctrl_complete; |
| 989 | u->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 990 | } | 989 | } |
| 991 | 990 | ||
| 992 | /* queue the urbs */ | 991 | /* queue the urbs */ |
| @@ -1052,7 +1051,6 @@ static int unlink1 (struct usbtest_dev *dev, int pipe, int size, int async) | |||
| 1052 | urb = simple_alloc_urb (testdev_to_usbdev (dev), pipe, size); | 1051 | urb = simple_alloc_urb (testdev_to_usbdev (dev), pipe, size); |
| 1053 | if (!urb) | 1052 | if (!urb) |
| 1054 | return -ENOMEM; | 1053 | return -ENOMEM; |
| 1055 | urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 1056 | urb->context = &completion; | 1054 | urb->context = &completion; |
| 1057 | urb->complete = unlink1_callback; | 1055 | urb->complete = unlink1_callback; |
| 1058 | 1056 | ||
diff --git a/drivers/usb/mon/Makefile b/drivers/usb/mon/Makefile index b0015b8a1d1f..3cf3ea3a88ed 100644 --- a/drivers/usb/mon/Makefile +++ b/drivers/usb/mon/Makefile | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | # Makefile for USB Core files and filesystem | 2 | # Makefile for USB Core files and filesystem |
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | usbmon-objs := mon_main.o mon_stat.o mon_text.o | 5 | usbmon-objs := mon_main.o mon_stat.o mon_text.o mon_dma.o |
| 6 | 6 | ||
| 7 | # This does not use CONFIG_USB_MON because we want this to use a tristate. | 7 | # This does not use CONFIG_USB_MON because we want this to use a tristate. |
| 8 | obj-$(CONFIG_USB) += usbmon.o | 8 | obj-$(CONFIG_USB) += usbmon.o |
diff --git a/drivers/usb/mon/mon_dma.c b/drivers/usb/mon/mon_dma.c new file mode 100644 index 000000000000..0a1367b760a0 --- /dev/null +++ b/drivers/usb/mon/mon_dma.c | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | /* | ||
| 2 | * The USB Monitor, inspired by Dave Harding's USBMon. | ||
| 3 | * | ||
| 4 | * mon_dma.c: Library which snoops on DMA areas. | ||
| 5 | * | ||
| 6 | * Copyright (C) 2005 Pete Zaitcev (zaitcev@redhat.com) | ||
| 7 | */ | ||
| 8 | #include <linux/kernel.h> | ||
| 9 | #include <linux/list.h> | ||
| 10 | #include <linux/highmem.h> | ||
| 11 | #include <asm/page.h> | ||
| 12 | |||
| 13 | #include <linux/usb.h> /* Only needed for declarations in usb_mon.h */ | ||
| 14 | #include "usb_mon.h" | ||
| 15 | |||
| 16 | #ifdef __i386__ /* CONFIG_ARCH_I386 does not exit */ | ||
| 17 | #define MON_HAS_UNMAP 1 | ||
| 18 | |||
| 19 | #define phys_to_page(phys) pfn_to_page((phys) >> PAGE_SHIFT) | ||
| 20 | |||
| 21 | char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len) | ||
| 22 | { | ||
| 23 | struct page *pg; | ||
| 24 | unsigned long flags; | ||
| 25 | unsigned char *map; | ||
| 26 | unsigned char *ptr; | ||
| 27 | |||
| 28 | /* | ||
| 29 | * On i386, a DMA handle is the "physical" address of a page. | ||
| 30 | * In other words, the bus address is equal to physical address. | ||
| 31 | * There is no IOMMU. | ||
| 32 | */ | ||
| 33 | pg = phys_to_page(dma_addr); | ||
| 34 | |||
| 35 | /* | ||
| 36 | * We are called from hardware IRQs in case of callbacks. | ||
| 37 | * But we can be called from softirq or process context in case | ||
| 38 | * of submissions. In such case, we need to protect KM_IRQ0. | ||
| 39 | */ | ||
| 40 | local_irq_save(flags); | ||
| 41 | map = kmap_atomic(pg, KM_IRQ0); | ||
| 42 | ptr = map + (dma_addr & (PAGE_SIZE-1)); | ||
| 43 | memcpy(dst, ptr, len); | ||
| 44 | kunmap_atomic(map, KM_IRQ0); | ||
| 45 | local_irq_restore(flags); | ||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | #endif /* __i386__ */ | ||
| 49 | |||
| 50 | #ifndef MON_HAS_UNMAP | ||
| 51 | char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len) | ||
| 52 | { | ||
| 53 | return 'D'; | ||
| 54 | } | ||
| 55 | #endif | ||
diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index 26266b30028e..417464dea9f6 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c | |||
| @@ -91,25 +91,11 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, | |||
| 91 | int len, char ev_type) | 91 | int len, char ev_type) |
| 92 | { | 92 | { |
| 93 | int pipe = urb->pipe; | 93 | int pipe = urb->pipe; |
| 94 | unsigned char *data; | ||
| 95 | |||
| 96 | /* | ||
| 97 | * The check to see if it's safe to poke at data has an enormous | ||
| 98 | * number of corner cases, but it seems that the following is | ||
| 99 | * more or less safe. | ||
| 100 | * | ||
| 101 | * We do not even try to look transfer_buffer, because it can | ||
| 102 | * contain non-NULL garbage in case the upper level promised to | ||
| 103 | * set DMA for the HCD. | ||
| 104 | */ | ||
| 105 | if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) | ||
| 106 | return 'D'; | ||
| 107 | 94 | ||
| 108 | if (len <= 0) | 95 | if (len <= 0) |
| 109 | return 'L'; | 96 | return 'L'; |
| 110 | 97 | if (len >= DATA_MAX) | |
| 111 | if ((data = urb->transfer_buffer) == NULL) | 98 | len = DATA_MAX; |
| 112 | return 'Z'; /* '0' would be not as pretty. */ | ||
| 113 | 99 | ||
| 114 | /* | 100 | /* |
| 115 | * Bulk is easy to shortcut reliably. | 101 | * Bulk is easy to shortcut reliably. |
| @@ -126,8 +112,21 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb, | |||
| 126 | } | 112 | } |
| 127 | } | 113 | } |
| 128 | 114 | ||
| 129 | if (len >= DATA_MAX) | 115 | /* |
| 130 | len = DATA_MAX; | 116 | * The check to see if it's safe to poke at data has an enormous |
| 117 | * number of corner cases, but it seems that the following is | ||
| 118 | * more or less safe. | ||
| 119 | * | ||
| 120 | * We do not even try to look transfer_buffer, because it can | ||
| 121 | * contain non-NULL garbage in case the upper level promised to | ||
| 122 | * set DMA for the HCD. | ||
| 123 | */ | ||
| 124 | if (urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) | ||
| 125 | return mon_dmapeek(ep->data, urb->transfer_dma, len); | ||
| 126 | |||
| 127 | if (urb->transfer_buffer == NULL) | ||
| 128 | return 'Z'; /* '0' would be not as pretty. */ | ||
| 129 | |||
| 131 | memcpy(ep->data, urb->transfer_buffer, len); | 130 | memcpy(ep->data, urb->transfer_buffer, len); |
| 132 | return 0; | 131 | return 0; |
| 133 | } | 132 | } |
diff --git a/drivers/usb/mon/usb_mon.h b/drivers/usb/mon/usb_mon.h index 9b06784d2c48..4be0f9346071 100644 --- a/drivers/usb/mon/usb_mon.h +++ b/drivers/usb/mon/usb_mon.h | |||
| @@ -45,6 +45,10 @@ struct mon_reader { | |||
| 45 | void mon_reader_add(struct mon_bus *mbus, struct mon_reader *r); | 45 | void mon_reader_add(struct mon_bus *mbus, struct mon_reader *r); |
| 46 | void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); | 46 | void mon_reader_del(struct mon_bus *mbus, struct mon_reader *r); |
| 47 | 47 | ||
| 48 | /* | ||
| 49 | */ | ||
| 50 | extern char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len); | ||
| 51 | |||
| 48 | extern struct semaphore mon_lock; | 52 | extern struct semaphore mon_lock; |
| 49 | 53 | ||
| 50 | extern struct file_operations mon_fops_text; | 54 | extern struct file_operations mon_fops_text; |
diff --git a/drivers/usb/net/Kconfig b/drivers/usb/net/Kconfig index b104430e2c6a..8c010bb44eb8 100644 --- a/drivers/usb/net/Kconfig +++ b/drivers/usb/net/Kconfig | |||
| @@ -99,7 +99,7 @@ config USB_USBNET | |||
| 99 | with "minidrivers" built around a common network driver core | 99 | with "minidrivers" built around a common network driver core |
| 100 | that supports deep queues for efficient transfers. (This gives | 100 | that supports deep queues for efficient transfers. (This gives |
| 101 | better performance with small packets and at high speeds). | 101 | better performance with small packets and at high speeds). |
| 102 | 102 | ||
| 103 | The USB host runs "usbnet", and the other end of the link might be: | 103 | The USB host runs "usbnet", and the other end of the link might be: |
| 104 | 104 | ||
| 105 | - Another USB host, when using USB "network" or "data transfer" | 105 | - Another USB host, when using USB "network" or "data transfer" |
| @@ -125,38 +125,63 @@ config USB_USBNET | |||
| 125 | To compile this driver as a module, choose M here: the | 125 | To compile this driver as a module, choose M here: the |
| 126 | module will be called usbnet. | 126 | module will be called usbnet. |
| 127 | 127 | ||
| 128 | comment "USB Host-to-Host Cables" | 128 | config USB_NET_AX8817X |
| 129 | depends on USB_USBNET | 129 | tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters" |
| 130 | 130 | depends on USB_USBNET && NET_ETHERNET | |
| 131 | config USB_ALI_M5632 | 131 | select CRC32 |
| 132 | boolean "ALi M5632 based 'USB 2.0 Data Link' cables" | 132 | select MII |
| 133 | depends on USB_USBNET | ||
| 134 | default y | 133 | default y |
| 135 | help | 134 | help |
| 136 | Choose this option if you're using a host-to-host cable | 135 | This option adds support for ASIX AX88xxx based USB 2.0 |
| 137 | based on this design, which supports USB 2.0 high speed. | 136 | 10/100 Ethernet adapters. |
| 138 | 137 | ||
| 139 | config USB_AN2720 | 138 | This driver should work with at least the following devices: |
| 140 | boolean "AnchorChips 2720 based cables (Xircom PGUNET, ...)" | 139 | * Aten UC210T |
| 141 | depends on USB_USBNET | 140 | * ASIX AX88172 |
| 142 | default y | 141 | * Billionton Systems, USB2AR |
| 143 | help | 142 | * Buffalo LUA-U2-KTX |
| 144 | Choose this option if you're using a host-to-host cable | 143 | * Corega FEther USB2-TX |
| 145 | based on this design. Note that AnchorChips is now a | 144 | * D-Link DUB-E100 |
| 146 | Cypress brand. | 145 | * Hawking UF200 |
| 146 | * Linksys USB200M | ||
| 147 | * Netgear FA120 | ||
| 148 | * Sitecom LN-029 | ||
| 149 | * Intellinet USB 2.0 Ethernet | ||
| 150 | * ST Lab USB 2.0 Ethernet | ||
| 151 | * TrendNet TU2-ET100 | ||
| 147 | 152 | ||
| 148 | config USB_BELKIN | 153 | This driver creates an interface named "ethX", where X depends on |
| 149 | boolean "eTEK based host-to-host cables (Advance, Belkin, ...)" | 154 | what other networking devices you have in use. |
| 155 | |||
| 156 | |||
| 157 | config USB_NET_CDCETHER | ||
| 158 | tristate "CDC Ethernet support (smart devices such as cable modems)" | ||
| 150 | depends on USB_USBNET | 159 | depends on USB_USBNET |
| 151 | default y | 160 | default y |
| 152 | help | 161 | help |
| 153 | Choose this option if you're using a host-to-host cable | 162 | This option supports devices conforming to the Communication Device |
| 154 | based on this design: two NetChip 2890 chips and an Atmel | 163 | Class (CDC) Ethernet Control Model, a specification that's easy to |
| 155 | microcontroller, with LEDs that indicate traffic. | 164 | implement in device firmware. The CDC specifications are available |
| 165 | from <http://www.usb.org/>. | ||
| 156 | 166 | ||
| 157 | config USB_GENESYS | 167 | CDC Ethernet is an implementation option for DOCSIS cable modems |
| 158 | boolean "GeneSys GL620USB-A based cables" | 168 | that support USB connectivity, used for non-Microsoft USB hosts. |
| 159 | default y | 169 | The Linux-USB CDC Ethernet Gadget driver is an open implementation. |
| 170 | This driver should work with at least the following devices: | ||
| 171 | |||
| 172 | * Ericsson PipeRider (all variants) | ||
| 173 | * Motorola (DM100 and SB4100) | ||
| 174 | * Broadcom Cable Modem (reference design) | ||
| 175 | * Toshiba PCX1100U | ||
| 176 | * ... | ||
| 177 | |||
| 178 | This driver creates an interface named "ethX", where X depends on | ||
| 179 | what other networking devices you have in use. However, if the | ||
| 180 | IEEE 802 "local assignment" bit is set in the address, a "usbX" | ||
| 181 | name is used instead. | ||
| 182 | |||
| 183 | config USB_NET_GL620A | ||
| 184 | tristate "GeneSys GL620USB-A based cables" | ||
| 160 | depends on USB_USBNET | 185 | depends on USB_USBNET |
| 161 | help | 186 | help |
| 162 | Choose this option if you're using a host-to-host cable, | 187 | Choose this option if you're using a host-to-host cable, |
| @@ -164,38 +189,78 @@ config USB_GENESYS | |||
| 164 | 189 | ||
| 165 | Note that the half-duplex "GL620USB" is not supported. | 190 | Note that the half-duplex "GL620USB" is not supported. |
| 166 | 191 | ||
| 167 | config USB_NET1080 | 192 | config USB_NET_NET1080 |
| 168 | boolean "NetChip 1080 based cables (Laplink, ...)" | 193 | tristate "NetChip 1080 based cables (Laplink, ...)" |
| 169 | default y | 194 | default y |
| 170 | depends on USB_USBNET | 195 | depends on USB_USBNET |
| 171 | help | 196 | help |
| 172 | Choose this option if you're using a host-to-host cable based | 197 | Choose this option if you're using a host-to-host cable based |
| 173 | on this design: one NetChip 1080 chips and supporting logic, | 198 | on this design: one NetChip 1080 chip and supporting logic, |
| 174 | supporting LEDs that indicate traffic | 199 | optionally with LEDs that indicate traffic |
| 175 | 200 | ||
| 176 | config USB_PL2301 | 201 | config USB_NET_PLUSB |
| 177 | boolean "Prolific PL-2301/2302 based cables" | 202 | tristate "Prolific PL-2301/2302 based cables" |
| 178 | default y | 203 | # if the handshake/init/reset problems, from original 'plusb', |
| 179 | # handshake/init/reset problems, from original 'plusb' driver | 204 | # are ever resolved ... then remove "experimental" |
| 180 | depends on USB_USBNET && EXPERIMENTAL | 205 | depends on USB_USBNET && EXPERIMENTAL |
| 181 | help | 206 | help |
| 182 | Choose this option if you're using a host-to-host cable | 207 | Choose this option if you're using a host-to-host cable |
| 183 | with one of these chips. | 208 | with one of these chips. |
| 184 | 209 | ||
| 185 | config USB_KC2190 | 210 | config USB_NET_RNDIS_HOST |
| 186 | boolean "KT Technology KC2190 based cables (InstaNet)" | 211 | tristate "Host for RNDIS devices (EXPERIMENTAL)" |
| 187 | default y | ||
| 188 | depends on USB_USBNET && EXPERIMENTAL | 212 | depends on USB_USBNET && EXPERIMENTAL |
| 213 | select USB_NET_CDCETHER | ||
| 189 | help | 214 | help |
| 190 | Choose this option if you're using a host-to-host cable | 215 | This option enables hosting "Remote NDIS" USB networking links, |
| 191 | with one of these chips. | 216 | as encouraged by Microsoft (instead of CDC Ethernet!) for use in |
| 217 | various devices that may only support this protocol. | ||
| 192 | 218 | ||
| 193 | comment "Intelligent USB Devices/Gadgets" | 219 | Avoid using this protocol unless you have no better options. |
| 220 | The protocol specification is incomplete, and is controlled by | ||
| 221 | (and for) Microsoft; it isn't an "Open" ecosystem or market. | ||
| 222 | |||
| 223 | config USB_NET_CDC_SUBSET | ||
| 224 | tristate "Simple USB Network Links (CDC Ethernet subset)" | ||
| 194 | depends on USB_USBNET | 225 | depends on USB_USBNET |
| 226 | help | ||
| 227 | This driver module supports USB network devices that can work | ||
| 228 | without any device-specific information. Select it if you have | ||
| 229 | one of these drivers. | ||
| 230 | |||
| 231 | Note that while many USB host-to-host cables can work in this mode, | ||
| 232 | that may mean not being able to talk to Win32 systems or more | ||
| 233 | commonly not being able to handle certain events (like replugging | ||
| 234 | the host on the other end) very well. Also, these devices will | ||
| 235 | not generally have permanently assigned Ethernet addresses. | ||
| 236 | |||
| 237 | config USB_ALI_M5632 | ||
| 238 | boolean "ALi M5632 based 'USB 2.0 Data Link' cables" | ||
| 239 | depends on USB_NET_CDC_SUBSET | ||
| 240 | help | ||
| 241 | Choose this option if you're using a host-to-host cable | ||
| 242 | based on this design, which supports USB 2.0 high speed. | ||
| 243 | |||
| 244 | config USB_AN2720 | ||
| 245 | boolean "AnchorChips 2720 based cables (Xircom PGUNET, ...)" | ||
| 246 | depends on USB_NET_CDC_SUBSET | ||
| 247 | help | ||
| 248 | Choose this option if you're using a host-to-host cable | ||
| 249 | based on this design. Note that AnchorChips is now a | ||
| 250 | Cypress brand. | ||
| 251 | |||
| 252 | config USB_BELKIN | ||
| 253 | boolean "eTEK based host-to-host cables (Advance, Belkin, ...)" | ||
| 254 | depends on USB_NET_CDC_SUBSET | ||
| 255 | default y | ||
| 256 | help | ||
| 257 | Choose this option if you're using a host-to-host cable | ||
| 258 | based on this design: two NetChip 2890 chips and an Atmel | ||
| 259 | microcontroller, with LEDs that indicate traffic. | ||
| 195 | 260 | ||
| 196 | config USB_ARMLINUX | 261 | config USB_ARMLINUX |
| 197 | boolean "Embedded ARM Linux links (iPaq, ...)" | 262 | boolean "Embedded ARM Linux links (iPaq, ...)" |
| 198 | depends on USB_USBNET | 263 | depends on USB_NET_CDC_SUBSET |
| 199 | default y | 264 | default y |
| 200 | help | 265 | help |
| 201 | Choose this option to support the "usb-eth" networking driver | 266 | Choose this option to support the "usb-eth" networking driver |
| @@ -212,15 +277,15 @@ config USB_ARMLINUX | |||
| 212 | 277 | ||
| 213 | config USB_EPSON2888 | 278 | config USB_EPSON2888 |
| 214 | boolean "Epson 2888 based firmware (DEVELOPMENT)" | 279 | boolean "Epson 2888 based firmware (DEVELOPMENT)" |
| 215 | depends on USB_USBNET | 280 | depends on USB_NET_CDC_SUBSET |
| 216 | default y | ||
| 217 | help | 281 | help |
| 218 | Choose this option to support the usb networking links used | 282 | Choose this option to support the usb networking links used |
| 219 | by some sample firmware from Epson. | 283 | by some sample firmware from Epson. |
| 220 | 284 | ||
| 221 | config USB_ZAURUS | 285 | config USB_NET_ZAURUS |
| 222 | boolean "Sharp Zaurus (stock ROMs) and compatible" | 286 | tristate "Sharp Zaurus (stock ROMs) and compatible" |
| 223 | depends on USB_USBNET | 287 | depends on USB_USBNET |
| 288 | select USB_NET_CDCETHER | ||
| 224 | select CRC32 | 289 | select CRC32 |
| 225 | default y | 290 | default y |
| 226 | help | 291 | help |
| @@ -235,61 +300,6 @@ config USB_ZAURUS | |||
| 235 | really need this non-conformant variant of CDC Ethernet (or in | 300 | really need this non-conformant variant of CDC Ethernet (or in |
| 236 | some cases CDC MDLM) protocol, not "g_ether". | 301 | some cases CDC MDLM) protocol, not "g_ether". |
| 237 | 302 | ||
| 238 | config USB_CDCETHER | ||
| 239 | boolean "CDC Ethernet support (smart devices such as cable modems)" | ||
| 240 | depends on USB_USBNET | ||
| 241 | default y | ||
| 242 | help | ||
| 243 | This option supports devices conforming to the Communication Device | ||
| 244 | Class (CDC) Ethernet Control Model, a specification that's easy to | ||
| 245 | implement in device firmware. The CDC specifications are available | ||
| 246 | from <http://www.usb.org/>. | ||
| 247 | |||
| 248 | CDC Ethernet is an implementation option for DOCSIS cable modems | ||
| 249 | that support USB connectivity, used for non-Microsoft USB hosts. | ||
| 250 | This driver should work with at least the following devices: | ||
| 251 | |||
| 252 | * Ericsson PipeRider (all variants) | ||
| 253 | * Motorola (DM100 and SB4100) | ||
| 254 | * Broadcom Cable Modem (reference design) | ||
| 255 | * Toshiba PCX1100U | ||
| 256 | * ... | ||
| 257 | |||
| 258 | This driver creates an interface named "ethX", where X depends on | ||
| 259 | what other networking devices you have in use. However, if the | ||
| 260 | IEEE 802 "local assignment" bit is set in the address, a "usbX" | ||
| 261 | name is used instead. | ||
| 262 | |||
| 263 | comment "USB Network Adapters" | ||
| 264 | depends on USB_USBNET | ||
| 265 | |||
| 266 | config USB_AX8817X | ||
| 267 | boolean "ASIX AX88xxx Based USB 2.0 Ethernet Devices" | ||
| 268 | depends on USB_USBNET && NET_ETHERNET | ||
| 269 | select CRC32 | ||
| 270 | select MII | ||
| 271 | default y | ||
| 272 | help | ||
| 273 | This option adds support for ASIX AX88xxx based USB 2.0 | ||
| 274 | 10/100 Ethernet devices. | ||
| 275 | |||
| 276 | This driver should work with at least the following devices: | ||
| 277 | * Aten UC210T | ||
| 278 | * ASIX AX88172 | ||
| 279 | * Billionton Systems, USB2AR | ||
| 280 | * Buffalo LUA-U2-KTX | ||
| 281 | * Corega FEther USB2-TX | ||
| 282 | * D-Link DUB-E100 | ||
| 283 | * Hawking UF200 | ||
| 284 | * Linksys USB200M | ||
| 285 | * Netgear FA120 | ||
| 286 | * Sitecom LN-029 | ||
| 287 | * Intellinet USB 2.0 Ethernet | ||
| 288 | * ST Lab USB 2.0 Ethernet | ||
| 289 | * TrendNet TU2-ET100 | ||
| 290 | |||
| 291 | This driver creates an interface named "ethX", where X depends on | ||
| 292 | what other networking devices you have in use. | ||
| 293 | 303 | ||
| 294 | config USB_ZD1201 | 304 | config USB_ZD1201 |
| 295 | tristate "USB ZD1201 based Wireless device support" | 305 | tristate "USB ZD1201 based Wireless device support" |
diff --git a/drivers/usb/net/Makefile b/drivers/usb/net/Makefile index fe3fd4115e1e..222c0495f791 100644 --- a/drivers/usb/net/Makefile +++ b/drivers/usb/net/Makefile | |||
| @@ -6,5 +6,13 @@ obj-$(CONFIG_USB_CATC) += catc.o | |||
| 6 | obj-$(CONFIG_USB_KAWETH) += kaweth.o | 6 | obj-$(CONFIG_USB_KAWETH) += kaweth.o |
| 7 | obj-$(CONFIG_USB_PEGASUS) += pegasus.o | 7 | obj-$(CONFIG_USB_PEGASUS) += pegasus.o |
| 8 | obj-$(CONFIG_USB_RTL8150) += rtl8150.o | 8 | obj-$(CONFIG_USB_RTL8150) += rtl8150.o |
| 9 | obj-$(CONFIG_USB_NET_AX8817X) += asix.o | ||
| 10 | obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o | ||
| 11 | obj-$(CONFIG_USB_NET_GL620A) += gl620a.o | ||
| 12 | obj-$(CONFIG_USB_NET_NET1080) += net1080.o | ||
| 13 | obj-$(CONFIG_USB_NET_PLUSB) += plusb.o | ||
| 14 | obj-$(CONFIG_USB_NET_RNDIS_HOST) += rndis_host.o | ||
| 15 | obj-$(CONFIG_USB_NET_CDC_SUBSET) += cdc_subset.o | ||
| 16 | obj-$(CONFIG_USB_NET_ZAURUS) += zaurus.o | ||
| 9 | obj-$(CONFIG_USB_USBNET) += usbnet.o | 17 | obj-$(CONFIG_USB_USBNET) += usbnet.o |
| 10 | obj-$(CONFIG_USB_ZD1201) += zd1201.o | 18 | obj-$(CONFIG_USB_ZD1201) += zd1201.o |
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c new file mode 100644 index 000000000000..861f00a43750 --- /dev/null +++ b/drivers/usb/net/asix.c | |||
| @@ -0,0 +1,948 @@ | |||
| 1 | /* | ||
| 2 | * ASIX AX8817X based USB 2.0 Ethernet Devices | ||
| 3 | * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> | ||
| 4 | * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net> | ||
| 5 | * Copyright (c) 2002-2003 TiVo Inc. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | // #define DEBUG // error path messages, extra info | ||
| 23 | // #define VERBOSE // more; success messages | ||
| 24 | |||
| 25 | #include <linux/config.h> | ||
| 26 | #ifdef CONFIG_USB_DEBUG | ||
| 27 | # define DEBUG | ||
| 28 | #endif | ||
| 29 | #include <linux/module.h> | ||
| 30 | #include <linux/kmod.h> | ||
| 31 | #include <linux/sched.h> | ||
| 32 | #include <linux/init.h> | ||
| 33 | #include <linux/netdevice.h> | ||
| 34 | #include <linux/etherdevice.h> | ||
| 35 | #include <linux/ethtool.h> | ||
| 36 | #include <linux/workqueue.h> | ||
| 37 | #include <linux/mii.h> | ||
| 38 | #include <linux/usb.h> | ||
| 39 | #include <linux/crc32.h> | ||
| 40 | |||
| 41 | #include "usbnet.h" | ||
| 42 | |||
| 43 | |||
| 44 | /* ASIX AX8817X based USB 2.0 Ethernet Devices */ | ||
| 45 | |||
| 46 | #define AX_CMD_SET_SW_MII 0x06 | ||
| 47 | #define AX_CMD_READ_MII_REG 0x07 | ||
| 48 | #define AX_CMD_WRITE_MII_REG 0x08 | ||
| 49 | #define AX_CMD_SET_HW_MII 0x0a | ||
| 50 | #define AX_CMD_READ_EEPROM 0x0b | ||
| 51 | #define AX_CMD_WRITE_EEPROM 0x0c | ||
| 52 | #define AX_CMD_WRITE_ENABLE 0x0d | ||
| 53 | #define AX_CMD_WRITE_DISABLE 0x0e | ||
| 54 | #define AX_CMD_WRITE_RX_CTL 0x10 | ||
| 55 | #define AX_CMD_READ_IPG012 0x11 | ||
| 56 | #define AX_CMD_WRITE_IPG0 0x12 | ||
| 57 | #define AX_CMD_WRITE_IPG1 0x13 | ||
| 58 | #define AX_CMD_WRITE_IPG2 0x14 | ||
| 59 | #define AX_CMD_WRITE_MULTI_FILTER 0x16 | ||
| 60 | #define AX_CMD_READ_NODE_ID 0x17 | ||
| 61 | #define AX_CMD_READ_PHY_ID 0x19 | ||
| 62 | #define AX_CMD_READ_MEDIUM_STATUS 0x1a | ||
| 63 | #define AX_CMD_WRITE_MEDIUM_MODE 0x1b | ||
| 64 | #define AX_CMD_READ_MONITOR_MODE 0x1c | ||
| 65 | #define AX_CMD_WRITE_MONITOR_MODE 0x1d | ||
| 66 | #define AX_CMD_WRITE_GPIOS 0x1f | ||
| 67 | #define AX_CMD_SW_RESET 0x20 | ||
| 68 | #define AX_CMD_SW_PHY_STATUS 0x21 | ||
| 69 | #define AX_CMD_SW_PHY_SELECT 0x22 | ||
| 70 | #define AX88772_CMD_READ_NODE_ID 0x13 | ||
| 71 | |||
| 72 | #define AX_MONITOR_MODE 0x01 | ||
| 73 | #define AX_MONITOR_LINK 0x02 | ||
| 74 | #define AX_MONITOR_MAGIC 0x04 | ||
| 75 | #define AX_MONITOR_HSFS 0x10 | ||
| 76 | |||
| 77 | /* AX88172 Medium Status Register values */ | ||
| 78 | #define AX_MEDIUM_FULL_DUPLEX 0x02 | ||
| 79 | #define AX_MEDIUM_TX_ABORT_ALLOW 0x04 | ||
| 80 | #define AX_MEDIUM_FLOW_CONTROL_EN 0x10 | ||
| 81 | |||
| 82 | #define AX_MCAST_FILTER_SIZE 8 | ||
| 83 | #define AX_MAX_MCAST 64 | ||
| 84 | |||
| 85 | #define AX_EEPROM_LEN 0x40 | ||
| 86 | |||
| 87 | #define AX_SWRESET_CLEAR 0x00 | ||
| 88 | #define AX_SWRESET_RR 0x01 | ||
| 89 | #define AX_SWRESET_RT 0x02 | ||
| 90 | #define AX_SWRESET_PRTE 0x04 | ||
| 91 | #define AX_SWRESET_PRL 0x08 | ||
| 92 | #define AX_SWRESET_BZ 0x10 | ||
| 93 | #define AX_SWRESET_IPRL 0x20 | ||
| 94 | #define AX_SWRESET_IPPD 0x40 | ||
| 95 | |||
| 96 | #define AX88772_IPG0_DEFAULT 0x15 | ||
| 97 | #define AX88772_IPG1_DEFAULT 0x0c | ||
| 98 | #define AX88772_IPG2_DEFAULT 0x12 | ||
| 99 | |||
| 100 | #define AX88772_MEDIUM_FULL_DUPLEX 0x0002 | ||
| 101 | #define AX88772_MEDIUM_RESERVED 0x0004 | ||
| 102 | #define AX88772_MEDIUM_RX_FC_ENABLE 0x0010 | ||
| 103 | #define AX88772_MEDIUM_TX_FC_ENABLE 0x0020 | ||
| 104 | #define AX88772_MEDIUM_PAUSE_FORMAT 0x0080 | ||
| 105 | #define AX88772_MEDIUM_RX_ENABLE 0x0100 | ||
| 106 | #define AX88772_MEDIUM_100MB 0x0200 | ||
| 107 | #define AX88772_MEDIUM_DEFAULT \ | ||
| 108 | (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \ | ||
| 109 | AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \ | ||
| 110 | AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE ) | ||
| 111 | |||
| 112 | #define AX_EEPROM_MAGIC 0xdeadbeef | ||
| 113 | |||
| 114 | /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ | ||
| 115 | struct ax8817x_data { | ||
| 116 | u8 multi_filter[AX_MCAST_FILTER_SIZE]; | ||
| 117 | }; | ||
| 118 | |||
| 119 | struct ax88172_int_data { | ||
| 120 | u16 res1; | ||
| 121 | u8 link; | ||
| 122 | u16 res2; | ||
| 123 | u8 status; | ||
| 124 | u16 res3; | ||
| 125 | } __attribute__ ((packed)); | ||
| 126 | |||
| 127 | static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 128 | u16 size, void *data) | ||
| 129 | { | ||
| 130 | return usb_control_msg( | ||
| 131 | dev->udev, | ||
| 132 | usb_rcvctrlpipe(dev->udev, 0), | ||
| 133 | cmd, | ||
| 134 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 135 | value, | ||
| 136 | index, | ||
| 137 | data, | ||
| 138 | size, | ||
| 139 | USB_CTRL_GET_TIMEOUT); | ||
| 140 | } | ||
| 141 | |||
| 142 | static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 143 | u16 size, void *data) | ||
| 144 | { | ||
| 145 | return usb_control_msg( | ||
| 146 | dev->udev, | ||
| 147 | usb_sndctrlpipe(dev->udev, 0), | ||
| 148 | cmd, | ||
| 149 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 150 | value, | ||
| 151 | index, | ||
| 152 | data, | ||
| 153 | size, | ||
| 154 | USB_CTRL_SET_TIMEOUT); | ||
| 155 | } | ||
| 156 | |||
| 157 | static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs) | ||
| 158 | { | ||
| 159 | struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; | ||
| 160 | |||
| 161 | if (urb->status < 0) | ||
| 162 | printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d", | ||
| 163 | urb->status); | ||
| 164 | |||
| 165 | kfree(req); | ||
| 166 | usb_free_urb(urb); | ||
| 167 | } | ||
| 168 | |||
| 169 | static void ax8817x_status(struct usbnet *dev, struct urb *urb) | ||
| 170 | { | ||
| 171 | struct ax88172_int_data *event; | ||
| 172 | int link; | ||
| 173 | |||
| 174 | if (urb->actual_length < 8) | ||
| 175 | return; | ||
| 176 | |||
| 177 | event = urb->transfer_buffer; | ||
| 178 | link = event->link & 0x01; | ||
| 179 | if (netif_carrier_ok(dev->net) != link) { | ||
| 180 | if (link) { | ||
| 181 | netif_carrier_on(dev->net); | ||
| 182 | usbnet_defer_kevent (dev, EVENT_LINK_RESET ); | ||
| 183 | } else | ||
| 184 | netif_carrier_off(dev->net); | ||
| 185 | devdbg(dev, "ax8817x - Link Status is: %d", link); | ||
| 186 | } | ||
| 187 | } | ||
| 188 | |||
| 189 | static void | ||
| 190 | ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 191 | u16 size, void *data) | ||
| 192 | { | ||
| 193 | struct usb_ctrlrequest *req; | ||
| 194 | int status; | ||
| 195 | struct urb *urb; | ||
| 196 | |||
| 197 | if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) { | ||
| 198 | devdbg(dev, "Error allocating URB in write_cmd_async!"); | ||
| 199 | return; | ||
| 200 | } | ||
| 201 | |||
| 202 | if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) { | ||
| 203 | deverr(dev, "Failed to allocate memory for control request"); | ||
| 204 | usb_free_urb(urb); | ||
| 205 | return; | ||
| 206 | } | ||
| 207 | |||
| 208 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | ||
| 209 | req->bRequest = cmd; | ||
| 210 | req->wValue = cpu_to_le16(value); | ||
| 211 | req->wIndex = cpu_to_le16(index); | ||
| 212 | req->wLength = cpu_to_le16(size); | ||
| 213 | |||
| 214 | usb_fill_control_urb(urb, dev->udev, | ||
| 215 | usb_sndctrlpipe(dev->udev, 0), | ||
| 216 | (void *)req, data, size, | ||
| 217 | ax8817x_async_cmd_callback, req); | ||
| 218 | |||
| 219 | if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { | ||
| 220 | deverr(dev, "Error submitting the control message: status=%d", | ||
| 221 | status); | ||
| 222 | kfree(req); | ||
| 223 | usb_free_urb(urb); | ||
| 224 | } | ||
| 225 | } | ||
| 226 | |||
| 227 | static void ax8817x_set_multicast(struct net_device *net) | ||
| 228 | { | ||
| 229 | struct usbnet *dev = netdev_priv(net); | ||
| 230 | struct ax8817x_data *data = (struct ax8817x_data *)&dev->data; | ||
| 231 | u8 rx_ctl = 0x8c; | ||
| 232 | |||
| 233 | if (net->flags & IFF_PROMISC) { | ||
| 234 | rx_ctl |= 0x01; | ||
| 235 | } else if (net->flags & IFF_ALLMULTI | ||
| 236 | || net->mc_count > AX_MAX_MCAST) { | ||
| 237 | rx_ctl |= 0x02; | ||
| 238 | } else if (net->mc_count == 0) { | ||
| 239 | /* just broadcast and directed */ | ||
| 240 | } else { | ||
| 241 | /* We use the 20 byte dev->data | ||
| 242 | * for our 8 byte filter buffer | ||
| 243 | * to avoid allocating memory that | ||
| 244 | * is tricky to free later */ | ||
| 245 | struct dev_mc_list *mc_list = net->mc_list; | ||
| 246 | u32 crc_bits; | ||
| 247 | int i; | ||
| 248 | |||
| 249 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); | ||
| 250 | |||
| 251 | /* Build the multicast hash filter. */ | ||
| 252 | for (i = 0; i < net->mc_count; i++) { | ||
| 253 | crc_bits = | ||
| 254 | ether_crc(ETH_ALEN, | ||
| 255 | mc_list->dmi_addr) >> 26; | ||
| 256 | data->multi_filter[crc_bits >> 3] |= | ||
| 257 | 1 << (crc_bits & 7); | ||
| 258 | mc_list = mc_list->next; | ||
| 259 | } | ||
| 260 | |||
| 261 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, | ||
| 262 | AX_MCAST_FILTER_SIZE, data->multi_filter); | ||
| 263 | |||
| 264 | rx_ctl |= 0x10; | ||
| 265 | } | ||
| 266 | |||
| 267 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); | ||
| 268 | } | ||
| 269 | |||
| 270 | static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc) | ||
| 271 | { | ||
| 272 | struct usbnet *dev = netdev_priv(netdev); | ||
| 273 | u16 res; | ||
| 274 | u8 buf[1]; | ||
| 275 | |||
| 276 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | ||
| 277 | ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, | ||
| 278 | (__u16)loc, 2, (u16 *)&res); | ||
| 279 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | ||
| 280 | |||
| 281 | return res & 0xffff; | ||
| 282 | } | ||
| 283 | |||
| 284 | /* same as above, but converts resulting value to cpu byte order */ | ||
| 285 | static int ax8817x_mdio_read_le(struct net_device *netdev, int phy_id, int loc) | ||
| 286 | { | ||
| 287 | return le16_to_cpu(ax8817x_mdio_read(netdev,phy_id, loc)); | ||
| 288 | } | ||
| 289 | |||
| 290 | static void | ||
| 291 | ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) | ||
| 292 | { | ||
| 293 | struct usbnet *dev = netdev_priv(netdev); | ||
| 294 | u16 res = val; | ||
| 295 | u8 buf[1]; | ||
| 296 | |||
| 297 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | ||
| 298 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, | ||
| 299 | (__u16)loc, 2, (u16 *)&res); | ||
| 300 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | ||
| 301 | } | ||
| 302 | |||
| 303 | /* same as above, but converts new value to le16 byte order before writing */ | ||
| 304 | static void | ||
| 305 | ax8817x_mdio_write_le(struct net_device *netdev, int phy_id, int loc, int val) | ||
| 306 | { | ||
| 307 | ax8817x_mdio_write( netdev, phy_id, loc, cpu_to_le16(val) ); | ||
| 308 | } | ||
| 309 | |||
| 310 | static int ax88172_link_reset(struct usbnet *dev) | ||
| 311 | { | ||
| 312 | u16 lpa; | ||
| 313 | u16 adv; | ||
| 314 | u16 res; | ||
| 315 | u8 mode; | ||
| 316 | |||
| 317 | mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; | ||
| 318 | lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); | ||
| 319 | adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); | ||
| 320 | res = mii_nway_result(lpa|adv); | ||
| 321 | if (res & LPA_DUPLEX) | ||
| 322 | mode |= AX_MEDIUM_FULL_DUPLEX; | ||
| 323 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | ||
| 324 | |||
| 325 | return 0; | ||
| 326 | } | ||
| 327 | |||
| 328 | static void | ||
| 329 | ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
| 330 | { | ||
| 331 | struct usbnet *dev = netdev_priv(net); | ||
| 332 | u8 opt; | ||
| 333 | |||
| 334 | if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { | ||
| 335 | wolinfo->supported = 0; | ||
| 336 | wolinfo->wolopts = 0; | ||
| 337 | return; | ||
| 338 | } | ||
| 339 | wolinfo->supported = WAKE_PHY | WAKE_MAGIC; | ||
| 340 | wolinfo->wolopts = 0; | ||
| 341 | if (opt & AX_MONITOR_MODE) { | ||
| 342 | if (opt & AX_MONITOR_LINK) | ||
| 343 | wolinfo->wolopts |= WAKE_PHY; | ||
| 344 | if (opt & AX_MONITOR_MAGIC) | ||
| 345 | wolinfo->wolopts |= WAKE_MAGIC; | ||
| 346 | } | ||
| 347 | } | ||
| 348 | |||
| 349 | static int | ||
| 350 | ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
| 351 | { | ||
| 352 | struct usbnet *dev = netdev_priv(net); | ||
| 353 | u8 opt = 0; | ||
| 354 | u8 buf[1]; | ||
| 355 | |||
| 356 | if (wolinfo->wolopts & WAKE_PHY) | ||
| 357 | opt |= AX_MONITOR_LINK; | ||
| 358 | if (wolinfo->wolopts & WAKE_MAGIC) | ||
| 359 | opt |= AX_MONITOR_MAGIC; | ||
| 360 | if (opt != 0) | ||
| 361 | opt |= AX_MONITOR_MODE; | ||
| 362 | |||
| 363 | if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, | ||
| 364 | opt, 0, 0, &buf) < 0) | ||
| 365 | return -EINVAL; | ||
| 366 | |||
| 367 | return 0; | ||
| 368 | } | ||
| 369 | |||
| 370 | static int ax8817x_get_eeprom_len(struct net_device *net) | ||
| 371 | { | ||
| 372 | return AX_EEPROM_LEN; | ||
| 373 | } | ||
| 374 | |||
| 375 | static int ax8817x_get_eeprom(struct net_device *net, | ||
| 376 | struct ethtool_eeprom *eeprom, u8 *data) | ||
| 377 | { | ||
| 378 | struct usbnet *dev = netdev_priv(net); | ||
| 379 | u16 *ebuf = (u16 *)data; | ||
| 380 | int i; | ||
| 381 | |||
| 382 | /* Crude hack to ensure that we don't overwrite memory | ||
| 383 | * if an odd length is supplied | ||
| 384 | */ | ||
| 385 | if (eeprom->len % 2) | ||
| 386 | return -EINVAL; | ||
| 387 | |||
| 388 | eeprom->magic = AX_EEPROM_MAGIC; | ||
| 389 | |||
| 390 | /* ax8817x returns 2 bytes from eeprom on read */ | ||
| 391 | for (i=0; i < eeprom->len / 2; i++) { | ||
| 392 | if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM, | ||
| 393 | eeprom->offset + i, 0, 2, &ebuf[i]) < 0) | ||
| 394 | return -EINVAL; | ||
| 395 | } | ||
| 396 | return 0; | ||
| 397 | } | ||
| 398 | |||
| 399 | static void ax8817x_get_drvinfo (struct net_device *net, | ||
| 400 | struct ethtool_drvinfo *info) | ||
| 401 | { | ||
| 402 | /* Inherit standard device info */ | ||
| 403 | usbnet_get_drvinfo(net, info); | ||
| 404 | info->eedump_len = 0x3e; | ||
| 405 | } | ||
| 406 | |||
| 407 | static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd) | ||
| 408 | { | ||
| 409 | struct usbnet *dev = netdev_priv(net); | ||
| 410 | |||
| 411 | return mii_ethtool_gset(&dev->mii,cmd); | ||
| 412 | } | ||
| 413 | |||
| 414 | static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd) | ||
| 415 | { | ||
| 416 | struct usbnet *dev = netdev_priv(net); | ||
| 417 | |||
| 418 | return mii_ethtool_sset(&dev->mii,cmd); | ||
| 419 | } | ||
| 420 | |||
| 421 | /* We need to override some ethtool_ops so we require our | ||
| 422 | own structure so we don't interfere with other usbnet | ||
| 423 | devices that may be connected at the same time. */ | ||
| 424 | static struct ethtool_ops ax8817x_ethtool_ops = { | ||
| 425 | .get_drvinfo = ax8817x_get_drvinfo, | ||
| 426 | .get_link = ethtool_op_get_link, | ||
| 427 | .get_msglevel = usbnet_get_msglevel, | ||
| 428 | .set_msglevel = usbnet_set_msglevel, | ||
| 429 | .get_wol = ax8817x_get_wol, | ||
| 430 | .set_wol = ax8817x_set_wol, | ||
| 431 | .get_eeprom_len = ax8817x_get_eeprom_len, | ||
| 432 | .get_eeprom = ax8817x_get_eeprom, | ||
| 433 | .get_settings = ax8817x_get_settings, | ||
| 434 | .set_settings = ax8817x_set_settings, | ||
| 435 | }; | ||
| 436 | |||
| 437 | static int ax8817x_ioctl (struct net_device *net, struct ifreq *rq, int cmd) | ||
| 438 | { | ||
| 439 | struct usbnet *dev = netdev_priv(net); | ||
| 440 | |||
| 441 | return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); | ||
| 442 | } | ||
| 443 | |||
| 444 | static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 445 | { | ||
| 446 | int ret = 0; | ||
| 447 | void *buf; | ||
| 448 | int i; | ||
| 449 | unsigned long gpio_bits = dev->driver_info->data; | ||
| 450 | |||
| 451 | usbnet_get_endpoints(dev,intf); | ||
| 452 | |||
| 453 | buf = kmalloc(ETH_ALEN, GFP_KERNEL); | ||
| 454 | if(!buf) { | ||
| 455 | ret = -ENOMEM; | ||
| 456 | goto out1; | ||
| 457 | } | ||
| 458 | |||
| 459 | /* Toggle the GPIOs in a manufacturer/model specific way */ | ||
| 460 | for (i = 2; i >= 0; i--) { | ||
| 461 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | ||
| 462 | (gpio_bits >> (i * 8)) & 0xff, 0, 0, | ||
| 463 | buf)) < 0) | ||
| 464 | goto out2; | ||
| 465 | msleep(5); | ||
| 466 | } | ||
| 467 | |||
| 468 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, | ||
| 469 | 0x80, 0, 0, buf)) < 0) { | ||
| 470 | dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret); | ||
| 471 | goto out2; | ||
| 472 | } | ||
| 473 | |||
| 474 | /* Get the MAC address */ | ||
| 475 | memset(buf, 0, ETH_ALEN); | ||
| 476 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, | ||
| 477 | 0, 0, 6, buf)) < 0) { | ||
| 478 | dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); | ||
| 479 | goto out2; | ||
| 480 | } | ||
| 481 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | ||
| 482 | |||
| 483 | /* Get the PHY id */ | ||
| 484 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, | ||
| 485 | 0, 0, 2, buf)) < 0) { | ||
| 486 | dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret); | ||
| 487 | goto out2; | ||
| 488 | } else if (ret < 2) { | ||
| 489 | /* this should always return 2 bytes */ | ||
| 490 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", | ||
| 491 | ret); | ||
| 492 | ret = -EIO; | ||
| 493 | goto out2; | ||
| 494 | } | ||
| 495 | |||
| 496 | /* Initialize MII structure */ | ||
| 497 | dev->mii.dev = dev->net; | ||
| 498 | dev->mii.mdio_read = ax8817x_mdio_read; | ||
| 499 | dev->mii.mdio_write = ax8817x_mdio_write; | ||
| 500 | dev->mii.phy_id_mask = 0x3f; | ||
| 501 | dev->mii.reg_num_mask = 0x1f; | ||
| 502 | dev->mii.phy_id = *((u8 *)buf + 1); | ||
| 503 | dev->net->do_ioctl = ax8817x_ioctl; | ||
| 504 | |||
| 505 | dev->net->set_multicast_list = ax8817x_set_multicast; | ||
| 506 | dev->net->ethtool_ops = &ax8817x_ethtool_ops; | ||
| 507 | |||
| 508 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | ||
| 509 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, | ||
| 510 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); | ||
| 511 | mii_nway_restart(&dev->mii); | ||
| 512 | |||
| 513 | return 0; | ||
| 514 | out2: | ||
| 515 | kfree(buf); | ||
| 516 | out1: | ||
| 517 | return ret; | ||
| 518 | } | ||
| 519 | |||
| 520 | static struct ethtool_ops ax88772_ethtool_ops = { | ||
| 521 | .get_drvinfo = ax8817x_get_drvinfo, | ||
| 522 | .get_link = ethtool_op_get_link, | ||
| 523 | .get_msglevel = usbnet_get_msglevel, | ||
| 524 | .set_msglevel = usbnet_set_msglevel, | ||
| 525 | .get_wol = ax8817x_get_wol, | ||
| 526 | .set_wol = ax8817x_set_wol, | ||
| 527 | .get_eeprom_len = ax8817x_get_eeprom_len, | ||
| 528 | .get_eeprom = ax8817x_get_eeprom, | ||
| 529 | .get_settings = ax8817x_get_settings, | ||
| 530 | .set_settings = ax8817x_set_settings, | ||
| 531 | }; | ||
| 532 | |||
| 533 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 534 | { | ||
| 535 | int ret; | ||
| 536 | void *buf; | ||
| 537 | |||
| 538 | usbnet_get_endpoints(dev,intf); | ||
| 539 | |||
| 540 | buf = kmalloc(6, GFP_KERNEL); | ||
| 541 | if(!buf) { | ||
| 542 | dbg ("Cannot allocate memory for buffer"); | ||
| 543 | ret = -ENOMEM; | ||
| 544 | goto out1; | ||
| 545 | } | ||
| 546 | |||
| 547 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | ||
| 548 | 0x00B0, 0, 0, buf)) < 0) | ||
| 549 | goto out2; | ||
| 550 | |||
| 551 | msleep(5); | ||
| 552 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, | ||
| 553 | 0x0001, 0, 0, buf)) < 0) { | ||
| 554 | dbg("Select PHY #1 failed: %d", ret); | ||
| 555 | goto out2; | ||
| 556 | } | ||
| 557 | |||
| 558 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, | ||
| 559 | 0, 0, buf)) < 0) { | ||
| 560 | dbg("Failed to power down internal PHY: %d", ret); | ||
| 561 | goto out2; | ||
| 562 | } | ||
| 563 | |||
| 564 | msleep(150); | ||
| 565 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, | ||
| 566 | 0, 0, buf)) < 0) { | ||
| 567 | dbg("Failed to perform software reset: %d", ret); | ||
| 568 | goto out2; | ||
| 569 | } | ||
| 570 | |||
| 571 | msleep(150); | ||
| 572 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, | ||
| 573 | AX_SWRESET_IPRL | AX_SWRESET_PRL, | ||
| 574 | 0, 0, buf)) < 0) { | ||
| 575 | dbg("Failed to set Internal/External PHY reset control: %d", | ||
| 576 | ret); | ||
| 577 | goto out2; | ||
| 578 | } | ||
| 579 | |||
| 580 | msleep(150); | ||
| 581 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, | ||
| 582 | 0x0000, 0, 0, buf)) < 0) { | ||
| 583 | dbg("Failed to reset RX_CTL: %d", ret); | ||
| 584 | goto out2; | ||
| 585 | } | ||
| 586 | |||
| 587 | /* Get the MAC address */ | ||
| 588 | memset(buf, 0, ETH_ALEN); | ||
| 589 | if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID, | ||
| 590 | 0, 0, ETH_ALEN, buf)) < 0) { | ||
| 591 | dbg("Failed to read MAC address: %d", ret); | ||
| 592 | goto out2; | ||
| 593 | } | ||
| 594 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | ||
| 595 | |||
| 596 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, | ||
| 597 | 0, 0, 0, buf)) < 0) { | ||
| 598 | dbg("Enabling software MII failed: %d", ret); | ||
| 599 | goto out2; | ||
| 600 | } | ||
| 601 | |||
| 602 | if (((ret = ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, | ||
| 603 | 0x0010, 2, 2, buf)) < 0) | ||
| 604 | || (*((u16 *)buf) != 0x003b)) { | ||
| 605 | dbg("Read PHY register 2 must be 0x3b00: %d", ret); | ||
| 606 | goto out2; | ||
| 607 | } | ||
| 608 | |||
| 609 | /* Initialize MII structure */ | ||
| 610 | dev->mii.dev = dev->net; | ||
| 611 | dev->mii.mdio_read = ax8817x_mdio_read; | ||
| 612 | dev->mii.mdio_write = ax8817x_mdio_write; | ||
| 613 | dev->mii.phy_id_mask = 0xff; | ||
| 614 | dev->mii.reg_num_mask = 0xff; | ||
| 615 | dev->net->do_ioctl = ax8817x_ioctl; | ||
| 616 | |||
| 617 | /* Get the PHY id */ | ||
| 618 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, | ||
| 619 | 0, 0, 2, buf)) < 0) { | ||
| 620 | dbg("Error reading PHY ID: %02x", ret); | ||
| 621 | goto out2; | ||
| 622 | } else if (ret < 2) { | ||
| 623 | /* this should always return 2 bytes */ | ||
| 624 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", | ||
| 625 | ret); | ||
| 626 | ret = -EIO; | ||
| 627 | goto out2; | ||
| 628 | } | ||
| 629 | dev->mii.phy_id = *((u8 *)buf + 1); | ||
| 630 | |||
| 631 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, | ||
| 632 | 0, 0, buf)) < 0) { | ||
| 633 | dbg("Set external PHY reset pin level: %d", ret); | ||
| 634 | goto out2; | ||
| 635 | } | ||
| 636 | msleep(150); | ||
| 637 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_RESET, | ||
| 638 | AX_SWRESET_IPRL | AX_SWRESET_PRL, | ||
| 639 | 0, 0, buf)) < 0) { | ||
| 640 | dbg("Set Internal/External PHY reset control: %d", ret); | ||
| 641 | goto out2; | ||
| 642 | } | ||
| 643 | msleep(150); | ||
| 644 | |||
| 645 | |||
| 646 | dev->net->set_multicast_list = ax8817x_set_multicast; | ||
| 647 | dev->net->ethtool_ops = &ax88772_ethtool_ops; | ||
| 648 | |||
| 649 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | ||
| 650 | ax8817x_mdio_write_le(dev->net, dev->mii.phy_id, MII_ADVERTISE, | ||
| 651 | ADVERTISE_ALL | ADVERTISE_CSMA); | ||
| 652 | mii_nway_restart(&dev->mii); | ||
| 653 | |||
| 654 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, | ||
| 655 | AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { | ||
| 656 | dbg("Write medium mode register: %d", ret); | ||
| 657 | goto out2; | ||
| 658 | } | ||
| 659 | |||
| 660 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, | ||
| 661 | AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT, | ||
| 662 | AX88772_IPG2_DEFAULT, 0, buf)) < 0) { | ||
| 663 | dbg("Write IPG,IPG1,IPG2 failed: %d", ret); | ||
| 664 | goto out2; | ||
| 665 | } | ||
| 666 | if ((ret = | ||
| 667 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) { | ||
| 668 | dbg("Failed to set hardware MII: %02x", ret); | ||
| 669 | goto out2; | ||
| 670 | } | ||
| 671 | |||
| 672 | /* Set RX_CTL to default values with 2k buffer, and enable cactus */ | ||
| 673 | if ((ret = | ||
| 674 | ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0, | ||
| 675 | buf)) < 0) { | ||
| 676 | dbg("Reset RX_CTL failed: %d", ret); | ||
| 677 | goto out2; | ||
| 678 | } | ||
| 679 | |||
| 680 | kfree(buf); | ||
| 681 | |||
| 682 | /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */ | ||
| 683 | if (dev->driver_info->flags & FLAG_FRAMING_AX) { | ||
| 684 | /* hard_mtu is still the default - the device does not support | ||
| 685 | jumbo eth frames */ | ||
| 686 | dev->rx_urb_size = 2048; | ||
| 687 | } | ||
| 688 | |||
| 689 | return 0; | ||
| 690 | |||
| 691 | out2: | ||
| 692 | kfree(buf); | ||
| 693 | out1: | ||
| 694 | return ret; | ||
| 695 | } | ||
| 696 | |||
| 697 | static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
| 698 | { | ||
| 699 | u8 *head; | ||
| 700 | u32 header; | ||
| 701 | char *packet; | ||
| 702 | struct sk_buff *ax_skb; | ||
| 703 | u16 size; | ||
| 704 | |||
| 705 | head = (u8 *) skb->data; | ||
| 706 | memcpy(&header, head, sizeof(header)); | ||
| 707 | le32_to_cpus(&header); | ||
| 708 | packet = head + sizeof(header); | ||
| 709 | |||
| 710 | skb_pull(skb, 4); | ||
| 711 | |||
| 712 | while (skb->len > 0) { | ||
| 713 | if ((short)(header & 0x0000ffff) != | ||
| 714 | ~((short)((header & 0xffff0000) >> 16))) { | ||
| 715 | devdbg(dev,"header length data is error"); | ||
| 716 | } | ||
| 717 | /* get the packet length */ | ||
| 718 | size = (u16) (header & 0x0000ffff); | ||
| 719 | |||
| 720 | if ((skb->len) - ((size + 1) & 0xfffe) == 0) | ||
| 721 | return 2; | ||
| 722 | if (size > ETH_FRAME_LEN) { | ||
| 723 | devdbg(dev,"invalid rx length %d", size); | ||
| 724 | return 0; | ||
| 725 | } | ||
| 726 | ax_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 727 | if (ax_skb) { | ||
| 728 | ax_skb->len = size; | ||
| 729 | ax_skb->data = packet; | ||
| 730 | ax_skb->tail = packet + size; | ||
| 731 | usbnet_skb_return(dev, ax_skb); | ||
| 732 | } else { | ||
| 733 | return 0; | ||
| 734 | } | ||
| 735 | |||
| 736 | skb_pull(skb, (size + 1) & 0xfffe); | ||
| 737 | |||
| 738 | if (skb->len == 0) | ||
| 739 | break; | ||
| 740 | |||
| 741 | head = (u8 *) skb->data; | ||
| 742 | memcpy(&header, head, sizeof(header)); | ||
| 743 | le32_to_cpus(&header); | ||
| 744 | packet = head + sizeof(header); | ||
| 745 | skb_pull(skb, 4); | ||
| 746 | } | ||
| 747 | |||
| 748 | if (skb->len < 0) { | ||
| 749 | devdbg(dev,"invalid rx length %d", skb->len); | ||
| 750 | return 0; | ||
| 751 | } | ||
| 752 | return 1; | ||
| 753 | } | ||
| 754 | |||
| 755 | static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
| 756 | unsigned flags) | ||
| 757 | { | ||
| 758 | int padlen; | ||
| 759 | int headroom = skb_headroom(skb); | ||
| 760 | int tailroom = skb_tailroom(skb); | ||
| 761 | u32 packet_len; | ||
| 762 | u32 padbytes = 0xffff0000; | ||
| 763 | |||
| 764 | padlen = ((skb->len + 4) % 512) ? 0 : 4; | ||
| 765 | |||
| 766 | if ((!skb_cloned(skb)) | ||
| 767 | && ((headroom + tailroom) >= (4 + padlen))) { | ||
| 768 | if ((headroom < 4) || (tailroom < padlen)) { | ||
| 769 | skb->data = memmove(skb->head + 4, skb->data, skb->len); | ||
| 770 | skb->tail = skb->data + skb->len; | ||
| 771 | } | ||
| 772 | } else { | ||
| 773 | struct sk_buff *skb2; | ||
| 774 | skb2 = skb_copy_expand(skb, 4, padlen, flags); | ||
| 775 | dev_kfree_skb_any(skb); | ||
| 776 | skb = skb2; | ||
| 777 | if (!skb) | ||
| 778 | return NULL; | ||
| 779 | } | ||
| 780 | |||
| 781 | skb_push(skb, 4); | ||
| 782 | packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4); | ||
| 783 | memcpy(skb->data, &packet_len, sizeof(packet_len)); | ||
| 784 | |||
| 785 | if ((skb->len % 512) == 0) { | ||
| 786 | memcpy( skb->tail, &padbytes, sizeof(padbytes)); | ||
| 787 | skb_put(skb, sizeof(padbytes)); | ||
| 788 | } | ||
| 789 | return skb; | ||
| 790 | } | ||
| 791 | |||
| 792 | static int ax88772_link_reset(struct usbnet *dev) | ||
| 793 | { | ||
| 794 | u16 lpa; | ||
| 795 | u16 adv; | ||
| 796 | u16 res; | ||
| 797 | u16 mode; | ||
| 798 | |||
| 799 | mode = AX88772_MEDIUM_DEFAULT; | ||
| 800 | lpa = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_LPA); | ||
| 801 | adv = ax8817x_mdio_read_le(dev->net, dev->mii.phy_id, MII_ADVERTISE); | ||
| 802 | res = mii_nway_result(lpa|adv); | ||
| 803 | |||
| 804 | if ((res & LPA_DUPLEX) == 0) | ||
| 805 | mode &= ~AX88772_MEDIUM_FULL_DUPLEX; | ||
| 806 | if ((res & LPA_100) == 0) | ||
| 807 | mode &= ~AX88772_MEDIUM_100MB; | ||
| 808 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | ||
| 809 | |||
| 810 | return 0; | ||
| 811 | } | ||
| 812 | |||
| 813 | static const struct driver_info ax8817x_info = { | ||
| 814 | .description = "ASIX AX8817x USB 2.0 Ethernet", | ||
| 815 | .bind = ax8817x_bind, | ||
| 816 | .status = ax8817x_status, | ||
| 817 | .link_reset = ax88172_link_reset, | ||
| 818 | .reset = ax88172_link_reset, | ||
| 819 | .flags = FLAG_ETHER, | ||
| 820 | .data = 0x00130103, | ||
| 821 | }; | ||
| 822 | |||
| 823 | static const struct driver_info dlink_dub_e100_info = { | ||
| 824 | .description = "DLink DUB-E100 USB Ethernet", | ||
| 825 | .bind = ax8817x_bind, | ||
| 826 | .status = ax8817x_status, | ||
| 827 | .link_reset = ax88172_link_reset, | ||
| 828 | .reset = ax88172_link_reset, | ||
| 829 | .flags = FLAG_ETHER, | ||
| 830 | .data = 0x009f9d9f, | ||
| 831 | }; | ||
| 832 | |||
| 833 | static const struct driver_info netgear_fa120_info = { | ||
| 834 | .description = "Netgear FA-120 USB Ethernet", | ||
| 835 | .bind = ax8817x_bind, | ||
| 836 | .status = ax8817x_status, | ||
| 837 | .link_reset = ax88172_link_reset, | ||
| 838 | .reset = ax88172_link_reset, | ||
| 839 | .flags = FLAG_ETHER, | ||
| 840 | .data = 0x00130103, | ||
| 841 | }; | ||
| 842 | |||
| 843 | static const struct driver_info hawking_uf200_info = { | ||
| 844 | .description = "Hawking UF200 USB Ethernet", | ||
| 845 | .bind = ax8817x_bind, | ||
| 846 | .status = ax8817x_status, | ||
| 847 | .link_reset = ax88172_link_reset, | ||
| 848 | .reset = ax88172_link_reset, | ||
| 849 | .flags = FLAG_ETHER, | ||
| 850 | .data = 0x001f1d1f, | ||
| 851 | }; | ||
| 852 | |||
| 853 | static const struct driver_info ax88772_info = { | ||
| 854 | .description = "ASIX AX88772 USB 2.0 Ethernet", | ||
| 855 | .bind = ax88772_bind, | ||
| 856 | .status = ax8817x_status, | ||
| 857 | .link_reset = ax88772_link_reset, | ||
| 858 | .reset = ax88772_link_reset, | ||
| 859 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, | ||
| 860 | .rx_fixup = ax88772_rx_fixup, | ||
| 861 | .tx_fixup = ax88772_tx_fixup, | ||
| 862 | .data = 0x00130103, | ||
| 863 | }; | ||
| 864 | |||
| 865 | static const struct usb_device_id products [] = { | ||
| 866 | { | ||
| 867 | // Linksys USB200M | ||
| 868 | USB_DEVICE (0x077b, 0x2226), | ||
| 869 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 870 | }, { | ||
| 871 | // Netgear FA120 | ||
| 872 | USB_DEVICE (0x0846, 0x1040), | ||
| 873 | .driver_info = (unsigned long) &netgear_fa120_info, | ||
| 874 | }, { | ||
| 875 | // DLink DUB-E100 | ||
| 876 | USB_DEVICE (0x2001, 0x1a00), | ||
| 877 | .driver_info = (unsigned long) &dlink_dub_e100_info, | ||
| 878 | }, { | ||
| 879 | // Intellinet, ST Lab USB Ethernet | ||
| 880 | USB_DEVICE (0x0b95, 0x1720), | ||
| 881 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 882 | }, { | ||
| 883 | // Hawking UF200, TrendNet TU2-ET100 | ||
| 884 | USB_DEVICE (0x07b8, 0x420a), | ||
| 885 | .driver_info = (unsigned long) &hawking_uf200_info, | ||
| 886 | }, { | ||
| 887 | // Billionton Systems, USB2AR | ||
| 888 | USB_DEVICE (0x08dd, 0x90ff), | ||
| 889 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 890 | }, { | ||
| 891 | // ATEN UC210T | ||
| 892 | USB_DEVICE (0x0557, 0x2009), | ||
| 893 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 894 | }, { | ||
| 895 | // Buffalo LUA-U2-KTX | ||
| 896 | USB_DEVICE (0x0411, 0x003d), | ||
| 897 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 898 | }, { | ||
| 899 | // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter" | ||
| 900 | USB_DEVICE (0x6189, 0x182d), | ||
| 901 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 902 | }, { | ||
| 903 | // corega FEther USB2-TX | ||
| 904 | USB_DEVICE (0x07aa, 0x0017), | ||
| 905 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 906 | }, { | ||
| 907 | // Surecom EP-1427X-2 | ||
| 908 | USB_DEVICE (0x1189, 0x0893), | ||
| 909 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 910 | }, { | ||
| 911 | // goodway corp usb gwusb2e | ||
| 912 | USB_DEVICE (0x1631, 0x6200), | ||
| 913 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 914 | }, { | ||
| 915 | // ASIX AX88772 10/100 | ||
| 916 | USB_DEVICE (0x0b95, 0x7720), | ||
| 917 | .driver_info = (unsigned long) &ax88772_info, | ||
| 918 | }, | ||
| 919 | { }, // END | ||
| 920 | }; | ||
| 921 | MODULE_DEVICE_TABLE(usb, products); | ||
| 922 | |||
| 923 | static struct usb_driver asix_driver = { | ||
| 924 | .owner = THIS_MODULE, | ||
| 925 | .name = "asix", | ||
| 926 | .id_table = products, | ||
| 927 | .probe = usbnet_probe, | ||
| 928 | .suspend = usbnet_suspend, | ||
| 929 | .resume = usbnet_resume, | ||
| 930 | .disconnect = usbnet_disconnect, | ||
| 931 | }; | ||
| 932 | |||
| 933 | static int __init asix_init(void) | ||
| 934 | { | ||
| 935 | return usb_register(&asix_driver); | ||
| 936 | } | ||
| 937 | module_init(asix_init); | ||
| 938 | |||
| 939 | static void __exit asix_exit(void) | ||
| 940 | { | ||
| 941 | usb_deregister(&asix_driver); | ||
| 942 | } | ||
| 943 | module_exit(asix_exit); | ||
| 944 | |||
| 945 | MODULE_AUTHOR("David Hollis"); | ||
| 946 | MODULE_DESCRIPTION("ASIX AX8817X based USB 2.0 Ethernet Devices"); | ||
| 947 | MODULE_LICENSE("GPL"); | ||
| 948 | |||
diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index c8be912f24e1..37ef365a2472 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c | |||
| @@ -383,7 +383,6 @@ static void catc_tx_done(struct urb *urb, struct pt_regs *regs) | |||
| 383 | 383 | ||
| 384 | if (urb->status == -ECONNRESET) { | 384 | if (urb->status == -ECONNRESET) { |
| 385 | dbg("Tx Reset."); | 385 | dbg("Tx Reset."); |
| 386 | urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 387 | urb->status = 0; | 386 | urb->status = 0; |
| 388 | catc->netdev->trans_start = jiffies; | 387 | catc->netdev->trans_start = jiffies; |
| 389 | catc->stats.tx_errors++; | 388 | catc->stats.tx_errors++; |
| @@ -445,7 +444,6 @@ static void catc_tx_timeout(struct net_device *netdev) | |||
| 445 | struct catc *catc = netdev_priv(netdev); | 444 | struct catc *catc = netdev_priv(netdev); |
| 446 | 445 | ||
| 447 | warn("Transmit timed out."); | 446 | warn("Transmit timed out."); |
| 448 | catc->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 449 | usb_unlink_urb(catc->tx_urb); | 447 | usb_unlink_urb(catc->tx_urb); |
| 450 | } | 448 | } |
| 451 | 449 | ||
diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c new file mode 100644 index 000000000000..652b04bbf6af --- /dev/null +++ b/drivers/usb/net/cdc_ether.c | |||
| @@ -0,0 +1,509 @@ | |||
| 1 | /* | ||
| 2 | * CDC Ethernet based networking peripherals | ||
| 3 | * Copyright (C) 2003-2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | // #define DEBUG // error path messages, extra info | ||
| 21 | // #define VERBOSE // more; success messages | ||
| 22 | |||
| 23 | #include <linux/config.h> | ||
| 24 | #ifdef CONFIG_USB_DEBUG | ||
| 25 | # define DEBUG | ||
| 26 | #endif | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/netdevice.h> | ||
| 31 | #include <linux/etherdevice.h> | ||
| 32 | #include <linux/ctype.h> | ||
| 33 | #include <linux/ethtool.h> | ||
| 34 | #include <linux/workqueue.h> | ||
| 35 | #include <linux/mii.h> | ||
| 36 | #include <linux/usb.h> | ||
| 37 | #include <linux/usb_cdc.h> | ||
| 38 | |||
| 39 | #include "usbnet.h" | ||
| 40 | |||
| 41 | |||
| 42 | /* | ||
| 43 | * probes control interface, claims data interface, collects the bulk | ||
| 44 | * endpoints, activates data interface (if needed), maybe sets MTU. | ||
| 45 | * all pure cdc, except for certain firmware workarounds, and knowing | ||
| 46 | * that rndis uses one different rule. | ||
| 47 | */ | ||
| 48 | int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 49 | { | ||
| 50 | u8 *buf = intf->cur_altsetting->extra; | ||
| 51 | int len = intf->cur_altsetting->extralen; | ||
| 52 | struct usb_interface_descriptor *d; | ||
| 53 | struct cdc_state *info = (void *) &dev->data; | ||
| 54 | int status; | ||
| 55 | int rndis; | ||
| 56 | struct usb_driver *driver = driver_of(intf); | ||
| 57 | |||
| 58 | if (sizeof dev->data < sizeof *info) | ||
| 59 | return -EDOM; | ||
| 60 | |||
| 61 | /* expect strict spec conformance for the descriptors, but | ||
| 62 | * cope with firmware which stores them in the wrong place | ||
| 63 | */ | ||
| 64 | if (len == 0 && dev->udev->actconfig->extralen) { | ||
| 65 | /* Motorola SB4100 (and others: Brad Hards says it's | ||
| 66 | * from a Broadcom design) put CDC descriptors here | ||
| 67 | */ | ||
| 68 | buf = dev->udev->actconfig->extra; | ||
| 69 | len = dev->udev->actconfig->extralen; | ||
| 70 | if (len) | ||
| 71 | dev_dbg(&intf->dev, | ||
| 72 | "CDC descriptors on config\n"); | ||
| 73 | } | ||
| 74 | |||
| 75 | /* this assumes that if there's a non-RNDIS vendor variant | ||
| 76 | * of cdc-acm, it'll fail RNDIS requests cleanly. | ||
| 77 | */ | ||
| 78 | rndis = (intf->cur_altsetting->desc.bInterfaceProtocol == 0xff); | ||
| 79 | |||
| 80 | memset(info, 0, sizeof *info); | ||
| 81 | info->control = intf; | ||
| 82 | while (len > 3) { | ||
| 83 | if (buf [1] != USB_DT_CS_INTERFACE) | ||
| 84 | goto next_desc; | ||
| 85 | |||
| 86 | /* use bDescriptorSubType to identify the CDC descriptors. | ||
| 87 | * We expect devices with CDC header and union descriptors. | ||
| 88 | * For CDC Ethernet we need the ethernet descriptor. | ||
| 89 | * For RNDIS, ignore two (pointless) CDC modem descriptors | ||
| 90 | * in favor of a complicated OID-based RPC scheme doing what | ||
| 91 | * CDC Ethernet achieves with a simple descriptor. | ||
| 92 | */ | ||
| 93 | switch (buf [2]) { | ||
| 94 | case USB_CDC_HEADER_TYPE: | ||
| 95 | if (info->header) { | ||
| 96 | dev_dbg(&intf->dev, "extra CDC header\n"); | ||
| 97 | goto bad_desc; | ||
| 98 | } | ||
| 99 | info->header = (void *) buf; | ||
| 100 | if (info->header->bLength != sizeof *info->header) { | ||
| 101 | dev_dbg(&intf->dev, "CDC header len %u\n", | ||
| 102 | info->header->bLength); | ||
| 103 | goto bad_desc; | ||
| 104 | } | ||
| 105 | break; | ||
| 106 | case USB_CDC_UNION_TYPE: | ||
| 107 | if (info->u) { | ||
| 108 | dev_dbg(&intf->dev, "extra CDC union\n"); | ||
| 109 | goto bad_desc; | ||
| 110 | } | ||
| 111 | info->u = (void *) buf; | ||
| 112 | if (info->u->bLength != sizeof *info->u) { | ||
| 113 | dev_dbg(&intf->dev, "CDC union len %u\n", | ||
| 114 | info->u->bLength); | ||
| 115 | goto bad_desc; | ||
| 116 | } | ||
| 117 | |||
| 118 | /* we need a master/control interface (what we're | ||
| 119 | * probed with) and a slave/data interface; union | ||
| 120 | * descriptors sort this all out. | ||
| 121 | */ | ||
| 122 | info->control = usb_ifnum_to_if(dev->udev, | ||
| 123 | info->u->bMasterInterface0); | ||
| 124 | info->data = usb_ifnum_to_if(dev->udev, | ||
| 125 | info->u->bSlaveInterface0); | ||
| 126 | if (!info->control || !info->data) { | ||
| 127 | dev_dbg(&intf->dev, | ||
| 128 | "master #%u/%p slave #%u/%p\n", | ||
| 129 | info->u->bMasterInterface0, | ||
| 130 | info->control, | ||
| 131 | info->u->bSlaveInterface0, | ||
| 132 | info->data); | ||
| 133 | goto bad_desc; | ||
| 134 | } | ||
| 135 | if (info->control != intf) { | ||
| 136 | dev_dbg(&intf->dev, "bogus CDC Union\n"); | ||
| 137 | /* Ambit USB Cable Modem (and maybe others) | ||
| 138 | * interchanges master and slave interface. | ||
| 139 | */ | ||
| 140 | if (info->data == intf) { | ||
| 141 | info->data = info->control; | ||
| 142 | info->control = intf; | ||
| 143 | } else | ||
| 144 | goto bad_desc; | ||
| 145 | } | ||
| 146 | |||
| 147 | /* a data interface altsetting does the real i/o */ | ||
| 148 | d = &info->data->cur_altsetting->desc; | ||
| 149 | if (d->bInterfaceClass != USB_CLASS_CDC_DATA) { | ||
| 150 | dev_dbg(&intf->dev, "slave class %u\n", | ||
| 151 | d->bInterfaceClass); | ||
| 152 | goto bad_desc; | ||
| 153 | } | ||
| 154 | break; | ||
| 155 | case USB_CDC_ETHERNET_TYPE: | ||
| 156 | if (info->ether) { | ||
| 157 | dev_dbg(&intf->dev, "extra CDC ether\n"); | ||
| 158 | goto bad_desc; | ||
| 159 | } | ||
| 160 | info->ether = (void *) buf; | ||
| 161 | if (info->ether->bLength != sizeof *info->ether) { | ||
| 162 | dev_dbg(&intf->dev, "CDC ether len %u\n", | ||
| 163 | info->ether->bLength); | ||
| 164 | goto bad_desc; | ||
| 165 | } | ||
| 166 | dev->hard_mtu = le16_to_cpu( | ||
| 167 | info->ether->wMaxSegmentSize); | ||
| 168 | /* because of Zaurus, we may be ignoring the host | ||
| 169 | * side link address we were given. | ||
| 170 | */ | ||
| 171 | break; | ||
| 172 | } | ||
| 173 | next_desc: | ||
| 174 | len -= buf [0]; /* bLength */ | ||
| 175 | buf += buf [0]; | ||
| 176 | } | ||
| 177 | |||
| 178 | if (!info->header || !info->u || (!rndis && !info->ether)) { | ||
| 179 | dev_dbg(&intf->dev, "missing cdc %s%s%sdescriptor\n", | ||
| 180 | info->header ? "" : "header ", | ||
| 181 | info->u ? "" : "union ", | ||
| 182 | info->ether ? "" : "ether "); | ||
| 183 | goto bad_desc; | ||
| 184 | } | ||
| 185 | |||
| 186 | /* claim data interface and set it up ... with side effects. | ||
| 187 | * network traffic can't flow until an altsetting is enabled. | ||
| 188 | */ | ||
| 189 | status = usb_driver_claim_interface(driver, info->data, dev); | ||
| 190 | if (status < 0) | ||
| 191 | return status; | ||
| 192 | status = usbnet_get_endpoints(dev, info->data); | ||
| 193 | if (status < 0) { | ||
| 194 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 195 | usb_set_intfdata(info->data, NULL); | ||
| 196 | usb_driver_release_interface(driver, info->data); | ||
| 197 | return status; | ||
| 198 | } | ||
| 199 | |||
| 200 | /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */ | ||
| 201 | dev->status = NULL; | ||
| 202 | if (info->control->cur_altsetting->desc.bNumEndpoints == 1) { | ||
| 203 | struct usb_endpoint_descriptor *desc; | ||
| 204 | |||
| 205 | dev->status = &info->control->cur_altsetting->endpoint [0]; | ||
| 206 | desc = &dev->status->desc; | ||
| 207 | if (desc->bmAttributes != USB_ENDPOINT_XFER_INT | ||
| 208 | || !(desc->bEndpointAddress & USB_DIR_IN) | ||
| 209 | || (le16_to_cpu(desc->wMaxPacketSize) | ||
| 210 | < sizeof(struct usb_cdc_notification)) | ||
| 211 | || !desc->bInterval) { | ||
| 212 | dev_dbg(&intf->dev, "bad notification endpoint\n"); | ||
| 213 | dev->status = NULL; | ||
| 214 | } | ||
| 215 | } | ||
| 216 | if (rndis && !dev->status) { | ||
| 217 | dev_dbg(&intf->dev, "missing RNDIS status endpoint\n"); | ||
| 218 | usb_set_intfdata(info->data, NULL); | ||
| 219 | usb_driver_release_interface(driver, info->data); | ||
| 220 | return -ENODEV; | ||
| 221 | } | ||
| 222 | return 0; | ||
| 223 | |||
| 224 | bad_desc: | ||
| 225 | dev_info(&dev->udev->dev, "bad CDC descriptors\n"); | ||
| 226 | return -ENODEV; | ||
| 227 | } | ||
| 228 | EXPORT_SYMBOL_GPL(usbnet_generic_cdc_bind); | ||
| 229 | |||
| 230 | void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf) | ||
| 231 | { | ||
| 232 | struct cdc_state *info = (void *) &dev->data; | ||
| 233 | struct usb_driver *driver = driver_of(intf); | ||
| 234 | |||
| 235 | /* disconnect master --> disconnect slave */ | ||
| 236 | if (intf == info->control && info->data) { | ||
| 237 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 238 | usb_set_intfdata(info->data, NULL); | ||
| 239 | usb_driver_release_interface(driver, info->data); | ||
| 240 | info->data = NULL; | ||
| 241 | } | ||
| 242 | |||
| 243 | /* and vice versa (just in case) */ | ||
| 244 | else if (intf == info->data && info->control) { | ||
| 245 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 246 | usb_set_intfdata(info->control, NULL); | ||
| 247 | usb_driver_release_interface(driver, info->control); | ||
| 248 | info->control = NULL; | ||
| 249 | } | ||
| 250 | } | ||
| 251 | EXPORT_SYMBOL_GPL(usbnet_cdc_unbind); | ||
| 252 | |||
| 253 | |||
| 254 | /*------------------------------------------------------------------------- | ||
| 255 | * | ||
| 256 | * Communications Device Class, Ethernet Control model | ||
| 257 | * | ||
| 258 | * Takes two interfaces. The DATA interface is inactive till an altsetting | ||
| 259 | * is selected. Configuration data includes class descriptors. There's | ||
| 260 | * an optional status endpoint on the control interface. | ||
| 261 | * | ||
| 262 | * This should interop with whatever the 2.4 "CDCEther.c" driver | ||
| 263 | * (by Brad Hards) talked with, with more functionality. | ||
| 264 | * | ||
| 265 | *-------------------------------------------------------------------------*/ | ||
| 266 | |||
| 267 | static void dumpspeed(struct usbnet *dev, __le32 *speeds) | ||
| 268 | { | ||
| 269 | if (netif_msg_timer(dev)) | ||
| 270 | devinfo(dev, "link speeds: %u kbps up, %u kbps down", | ||
| 271 | __le32_to_cpu(speeds[0]) / 1000, | ||
| 272 | __le32_to_cpu(speeds[1]) / 1000); | ||
| 273 | } | ||
| 274 | |||
| 275 | static void cdc_status(struct usbnet *dev, struct urb *urb) | ||
| 276 | { | ||
| 277 | struct usb_cdc_notification *event; | ||
| 278 | |||
| 279 | if (urb->actual_length < sizeof *event) | ||
| 280 | return; | ||
| 281 | |||
| 282 | /* SPEED_CHANGE can get split into two 8-byte packets */ | ||
| 283 | if (test_and_clear_bit(EVENT_STS_SPLIT, &dev->flags)) { | ||
| 284 | dumpspeed(dev, (__le32 *) urb->transfer_buffer); | ||
| 285 | return; | ||
| 286 | } | ||
| 287 | |||
| 288 | event = urb->transfer_buffer; | ||
| 289 | switch (event->bNotificationType) { | ||
| 290 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: | ||
| 291 | if (netif_msg_timer(dev)) | ||
| 292 | devdbg(dev, "CDC: carrier %s", | ||
| 293 | event->wValue ? "on" : "off"); | ||
| 294 | if (event->wValue) | ||
| 295 | netif_carrier_on(dev->net); | ||
| 296 | else | ||
| 297 | netif_carrier_off(dev->net); | ||
| 298 | break; | ||
| 299 | case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */ | ||
| 300 | if (netif_msg_timer(dev)) | ||
| 301 | devdbg(dev, "CDC: speed change (len %d)", | ||
| 302 | urb->actual_length); | ||
| 303 | if (urb->actual_length != (sizeof *event + 8)) | ||
| 304 | set_bit(EVENT_STS_SPLIT, &dev->flags); | ||
| 305 | else | ||
| 306 | dumpspeed(dev, (__le32 *) &event[1]); | ||
| 307 | break; | ||
| 308 | /* USB_CDC_NOTIFY_RESPONSE_AVAILABLE can happen too (e.g. RNDIS), | ||
| 309 | * but there are no standard formats for the response data. | ||
| 310 | */ | ||
| 311 | default: | ||
| 312 | deverr(dev, "CDC: unexpected notification %02x!", | ||
| 313 | event->bNotificationType); | ||
| 314 | break; | ||
| 315 | } | ||
| 316 | } | ||
| 317 | |||
| 318 | static u8 nibble(unsigned char c) | ||
| 319 | { | ||
| 320 | if (likely(isdigit(c))) | ||
| 321 | return c - '0'; | ||
| 322 | c = toupper(c); | ||
| 323 | if (likely(isxdigit(c))) | ||
| 324 | return 10 + c - 'A'; | ||
| 325 | return 0; | ||
| 326 | } | ||
| 327 | |||
| 328 | static inline int | ||
| 329 | get_ethernet_addr(struct usbnet *dev, struct usb_cdc_ether_desc *e) | ||
| 330 | { | ||
| 331 | int tmp, i; | ||
| 332 | unsigned char buf [13]; | ||
| 333 | |||
| 334 | tmp = usb_string(dev->udev, e->iMACAddress, buf, sizeof buf); | ||
| 335 | if (tmp != 12) { | ||
| 336 | dev_dbg(&dev->udev->dev, | ||
| 337 | "bad MAC string %d fetch, %d\n", e->iMACAddress, tmp); | ||
| 338 | if (tmp >= 0) | ||
| 339 | tmp = -EINVAL; | ||
| 340 | return tmp; | ||
| 341 | } | ||
| 342 | for (i = tmp = 0; i < 6; i++, tmp += 2) | ||
| 343 | dev->net->dev_addr [i] = | ||
| 344 | (nibble(buf [tmp]) << 4) + nibble(buf [tmp + 1]); | ||
| 345 | return 0; | ||
| 346 | } | ||
| 347 | |||
| 348 | static int cdc_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 349 | { | ||
| 350 | int status; | ||
| 351 | struct cdc_state *info = (void *) &dev->data; | ||
| 352 | |||
| 353 | status = usbnet_generic_cdc_bind(dev, intf); | ||
| 354 | if (status < 0) | ||
| 355 | return status; | ||
| 356 | |||
| 357 | status = get_ethernet_addr(dev, info->ether); | ||
| 358 | if (status < 0) { | ||
| 359 | usb_set_intfdata(info->data, NULL); | ||
| 360 | usb_driver_release_interface(driver_of(intf), info->data); | ||
| 361 | return status; | ||
| 362 | } | ||
| 363 | |||
| 364 | /* FIXME cdc-ether has some multicast code too, though it complains | ||
| 365 | * in routine cases. info->ether describes the multicast support. | ||
| 366 | * Implement that here, manipulating the cdc filter as needed. | ||
| 367 | */ | ||
| 368 | return 0; | ||
| 369 | } | ||
| 370 | |||
| 371 | static const struct driver_info cdc_info = { | ||
| 372 | .description = "CDC Ethernet Device", | ||
| 373 | .flags = FLAG_ETHER, | ||
| 374 | // .check_connect = cdc_check_connect, | ||
| 375 | .bind = cdc_bind, | ||
| 376 | .unbind = usbnet_cdc_unbind, | ||
| 377 | .status = cdc_status, | ||
| 378 | }; | ||
| 379 | |||
| 380 | /*-------------------------------------------------------------------------*/ | ||
| 381 | |||
| 382 | |||
| 383 | static const struct usb_device_id products [] = { | ||
| 384 | /* | ||
| 385 | * BLACKLIST !! | ||
| 386 | * | ||
| 387 | * First blacklist any products that are egregiously nonconformant | ||
| 388 | * with the CDC Ethernet specs. Minor braindamage we cope with; when | ||
| 389 | * they're not even trying, needing a separate driver is only the first | ||
| 390 | * of the differences to show up. | ||
| 391 | */ | ||
| 392 | |||
| 393 | #define ZAURUS_MASTER_INTERFACE \ | ||
| 394 | .bInterfaceClass = USB_CLASS_COMM, \ | ||
| 395 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ | ||
| 396 | .bInterfaceProtocol = USB_CDC_PROTO_NONE | ||
| 397 | |||
| 398 | /* SA-1100 based Sharp Zaurus ("collie"), or compatible; | ||
| 399 | * wire-incompatible with true CDC Ethernet implementations. | ||
| 400 | * (And, it seems, needlessly so...) | ||
| 401 | */ | ||
| 402 | { | ||
| 403 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 404 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 405 | .idVendor = 0x04DD, | ||
| 406 | .idProduct = 0x8004, | ||
| 407 | ZAURUS_MASTER_INTERFACE, | ||
| 408 | .driver_info = 0, | ||
| 409 | }, | ||
| 410 | |||
| 411 | /* PXA-25x based Sharp Zaurii. Note that it seems some of these | ||
| 412 | * (later models especially) may have shipped only with firmware | ||
| 413 | * advertising false "CDC MDLM" compatibility ... but we're not | ||
| 414 | * clear which models did that, so for now let's assume the worst. | ||
| 415 | */ | ||
| 416 | { | ||
| 417 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 418 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 419 | .idVendor = 0x04DD, | ||
| 420 | .idProduct = 0x8005, /* A-300 */ | ||
| 421 | ZAURUS_MASTER_INTERFACE, | ||
| 422 | .driver_info = 0, | ||
| 423 | }, { | ||
| 424 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 425 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 426 | .idVendor = 0x04DD, | ||
| 427 | .idProduct = 0x8006, /* B-500/SL-5600 */ | ||
| 428 | ZAURUS_MASTER_INTERFACE, | ||
| 429 | .driver_info = 0, | ||
| 430 | }, { | ||
| 431 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 432 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 433 | .idVendor = 0x04DD, | ||
| 434 | .idProduct = 0x8007, /* C-700 */ | ||
| 435 | ZAURUS_MASTER_INTERFACE, | ||
| 436 | .driver_info = 0, | ||
| 437 | }, { | ||
| 438 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 439 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 440 | .idVendor = 0x04DD, | ||
| 441 | .idProduct = 0x9031, /* C-750 C-760 */ | ||
| 442 | ZAURUS_MASTER_INTERFACE, | ||
| 443 | .driver_info = 0, | ||
| 444 | }, { | ||
| 445 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 446 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 447 | .idVendor = 0x04DD, | ||
| 448 | .idProduct = 0x9032, /* SL-6000 */ | ||
| 449 | ZAURUS_MASTER_INTERFACE, | ||
| 450 | .driver_info = 0, | ||
| 451 | }, { | ||
| 452 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 453 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 454 | .idVendor = 0x04DD, | ||
| 455 | /* reported with some C860 units */ | ||
| 456 | .idProduct = 0x9050, /* C-860 */ | ||
| 457 | ZAURUS_MASTER_INTERFACE, | ||
| 458 | .driver_info = 0, | ||
| 459 | }, | ||
| 460 | |||
| 461 | /* | ||
| 462 | * WHITELIST!!! | ||
| 463 | * | ||
| 464 | * CDC Ether uses two interfaces, not necessarily consecutive. | ||
| 465 | * We match the main interface, ignoring the optional device | ||
| 466 | * class so we could handle devices that aren't exclusively | ||
| 467 | * CDC ether. | ||
| 468 | * | ||
| 469 | * NOTE: this match must come AFTER entries blacklisting devices | ||
| 470 | * because of bugs/quirks in a given product (like Zaurus, above). | ||
| 471 | */ | ||
| 472 | { | ||
| 473 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, | ||
| 474 | USB_CDC_PROTO_NONE), | ||
| 475 | .driver_info = (unsigned long) &cdc_info, | ||
| 476 | }, | ||
| 477 | { }, // END | ||
| 478 | }; | ||
| 479 | MODULE_DEVICE_TABLE(usb, products); | ||
| 480 | |||
| 481 | static struct usb_driver cdc_driver = { | ||
| 482 | .owner = THIS_MODULE, | ||
| 483 | .name = "cdc_ether", | ||
| 484 | .id_table = products, | ||
| 485 | .probe = usbnet_probe, | ||
| 486 | .disconnect = usbnet_disconnect, | ||
| 487 | .suspend = usbnet_suspend, | ||
| 488 | .resume = usbnet_resume, | ||
| 489 | }; | ||
| 490 | |||
| 491 | |||
| 492 | static int __init cdc_init(void) | ||
| 493 | { | ||
| 494 | BUG_ON((sizeof(((struct usbnet *)0)->data) | ||
| 495 | < sizeof(struct cdc_state))); | ||
| 496 | |||
| 497 | return usb_register(&cdc_driver); | ||
| 498 | } | ||
| 499 | module_init(cdc_init); | ||
| 500 | |||
| 501 | static void __exit cdc_exit(void) | ||
| 502 | { | ||
| 503 | usb_deregister(&cdc_driver); | ||
| 504 | } | ||
| 505 | module_exit(cdc_exit); | ||
| 506 | |||
| 507 | MODULE_AUTHOR("David Brownell"); | ||
| 508 | MODULE_DESCRIPTION("USB CDC Ethernet devices"); | ||
| 509 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/cdc_subset.c b/drivers/usb/net/cdc_subset.c new file mode 100644 index 000000000000..f1730b685fd2 --- /dev/null +++ b/drivers/usb/net/cdc_subset.c | |||
| @@ -0,0 +1,335 @@ | |||
| 1 | /* | ||
| 2 | * Simple "CDC Subset" USB Networking Links | ||
| 3 | * Copyright (C) 2000-2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/config.h> | ||
| 21 | #ifdef CONFIG_USB_DEBUG | ||
| 22 | # define DEBUG | ||
| 23 | #endif | ||
| 24 | #include <linux/module.h> | ||
| 25 | #include <linux/kmod.h> | ||
| 26 | #include <linux/sched.h> | ||
| 27 | #include <linux/init.h> | ||
| 28 | #include <linux/netdevice.h> | ||
| 29 | #include <linux/etherdevice.h> | ||
| 30 | #include <linux/ethtool.h> | ||
| 31 | #include <linux/workqueue.h> | ||
| 32 | #include <linux/mii.h> | ||
| 33 | #include <linux/usb.h> | ||
| 34 | |||
| 35 | #include "usbnet.h" | ||
| 36 | |||
| 37 | |||
| 38 | /* | ||
| 39 | * This supports simple USB network links that don't require any special | ||
| 40 | * framing or hardware control operations. The protocol used here is a | ||
| 41 | * strict subset of CDC Ethernet, with three basic differences reflecting | ||
| 42 | * the goal that almost any hardware should run it: | ||
| 43 | * | ||
| 44 | * - Minimal runtime control: one interface, no altsettings, and | ||
| 45 | * no vendor or class specific control requests. If a device is | ||
| 46 | * configured, it is allowed to exchange packets with the host. | ||
| 47 | * Fancier models would mean not working on some hardware. | ||
| 48 | * | ||
| 49 | * - Minimal manufacturing control: no IEEE "Organizationally | ||
| 50 | * Unique ID" required, or an EEPROMs to store one. Each host uses | ||
| 51 | * one random "locally assigned" Ethernet address instead, which can | ||
| 52 | * of course be overridden using standard tools like "ifconfig". | ||
| 53 | * (With 2^46 such addresses, same-net collisions are quite rare.) | ||
| 54 | * | ||
| 55 | * - There is no additional framing data for USB. Packets are written | ||
| 56 | * exactly as in CDC Ethernet, starting with an Ethernet header and | ||
| 57 | * terminated by a short packet. However, the host will never send a | ||
| 58 | * zero length packet; some systems can't handle those robustly. | ||
| 59 | * | ||
| 60 | * Anything that can transmit and receive USB bulk packets can implement | ||
| 61 | * this protocol. That includes both smart peripherals and quite a lot | ||
| 62 | * of "host-to-host" USB cables (which embed two devices back-to-back). | ||
| 63 | * | ||
| 64 | * Note that although Linux may use many of those host-to-host links | ||
| 65 | * with this "cdc_subset" framing, that doesn't mean there may not be a | ||
| 66 | * better approach. Handling the "other end unplugs/replugs" scenario | ||
| 67 | * well tends to require chip-specific vendor requests. Also, Windows | ||
| 68 | * peers at the other end of host-to-host cables may expect their own | ||
| 69 | * framing to be used rather than this "cdc_subset" model. | ||
| 70 | */ | ||
| 71 | |||
| 72 | #if defined(CONFIG_USB_EPSON2888) || defined(CONFIG_USB_ARMLINUX) | ||
| 73 | /* PDA style devices are always connected if present */ | ||
| 74 | static int always_connected (struct usbnet *dev) | ||
| 75 | { | ||
| 76 | return 0; | ||
| 77 | } | ||
| 78 | #endif | ||
| 79 | |||
| 80 | #ifdef CONFIG_USB_ALI_M5632 | ||
| 81 | #define HAVE_HARDWARE | ||
| 82 | |||
| 83 | /*------------------------------------------------------------------------- | ||
| 84 | * | ||
| 85 | * ALi M5632 driver ... does high speed | ||
| 86 | * | ||
| 87 | *-------------------------------------------------------------------------*/ | ||
| 88 | |||
| 89 | static const struct driver_info ali_m5632_info = { | ||
| 90 | .description = "ALi M5632", | ||
| 91 | }; | ||
| 92 | |||
| 93 | |||
| 94 | #endif | ||
| 95 | |||
| 96 | |||
| 97 | #ifdef CONFIG_USB_AN2720 | ||
| 98 | #define HAVE_HARDWARE | ||
| 99 | |||
| 100 | /*------------------------------------------------------------------------- | ||
| 101 | * | ||
| 102 | * AnchorChips 2720 driver ... http://www.cypress.com | ||
| 103 | * | ||
| 104 | * This doesn't seem to have a way to detect whether the peer is | ||
| 105 | * connected, or need any reset handshaking. It's got pretty big | ||
| 106 | * internal buffers (handles most of a frame's worth of data). | ||
| 107 | * Chip data sheets don't describe any vendor control messages. | ||
| 108 | * | ||
| 109 | *-------------------------------------------------------------------------*/ | ||
| 110 | |||
| 111 | static const struct driver_info an2720_info = { | ||
| 112 | .description = "AnchorChips/Cypress 2720", | ||
| 113 | // no reset available! | ||
| 114 | // no check_connect available! | ||
| 115 | |||
| 116 | .in = 2, .out = 2, // direction distinguishes these | ||
| 117 | }; | ||
| 118 | |||
| 119 | #endif /* CONFIG_USB_AN2720 */ | ||
| 120 | |||
| 121 | |||
| 122 | #ifdef CONFIG_USB_BELKIN | ||
| 123 | #define HAVE_HARDWARE | ||
| 124 | |||
| 125 | /*------------------------------------------------------------------------- | ||
| 126 | * | ||
| 127 | * Belkin F5U104 ... two NetChip 2280 devices + Atmel AVR microcontroller | ||
| 128 | * | ||
| 129 | * ... also two eTEK designs, including one sold as "Advance USBNET" | ||
| 130 | * | ||
| 131 | *-------------------------------------------------------------------------*/ | ||
| 132 | |||
| 133 | static const struct driver_info belkin_info = { | ||
| 134 | .description = "Belkin, eTEK, or compatible", | ||
| 135 | }; | ||
| 136 | |||
| 137 | #endif /* CONFIG_USB_BELKIN */ | ||
| 138 | |||
| 139 | |||
| 140 | |||
| 141 | #ifdef CONFIG_USB_EPSON2888 | ||
| 142 | #define HAVE_HARDWARE | ||
| 143 | |||
| 144 | /*------------------------------------------------------------------------- | ||
| 145 | * | ||
| 146 | * EPSON USB clients | ||
| 147 | * | ||
| 148 | * This is the same idea as Linux PDAs (below) except the firmware in the | ||
| 149 | * device might not be Tux-powered. Epson provides reference firmware that | ||
| 150 | * implements this interface. Product developers can reuse or modify that | ||
| 151 | * code, such as by using their own product and vendor codes. | ||
| 152 | * | ||
| 153 | * Support was from Juro Bystricky <bystricky.juro@erd.epson.com> | ||
| 154 | * | ||
| 155 | *-------------------------------------------------------------------------*/ | ||
| 156 | |||
| 157 | static const struct driver_info epson2888_info = { | ||
| 158 | .description = "Epson USB Device", | ||
| 159 | .check_connect = always_connected, | ||
| 160 | |||
| 161 | .in = 4, .out = 3, | ||
| 162 | }; | ||
| 163 | |||
| 164 | #endif /* CONFIG_USB_EPSON2888 */ | ||
| 165 | |||
| 166 | |||
| 167 | #ifdef CONFIG_USB_KC2190 | ||
| 168 | #define HAVE_HARDWARE | ||
| 169 | static const struct driver_info kc2190_info = { | ||
| 170 | .description = "KC Technology KC-190", | ||
| 171 | }; | ||
| 172 | #endif /* CONFIG_USB_KC2190 */ | ||
| 173 | |||
| 174 | |||
| 175 | #ifdef CONFIG_USB_ARMLINUX | ||
| 176 | #define HAVE_HARDWARE | ||
| 177 | |||
| 178 | /*------------------------------------------------------------------------- | ||
| 179 | * | ||
| 180 | * Intel's SA-1100 chip integrates basic USB support, and is used | ||
| 181 | * in PDAs like some iPaqs, the Yopy, some Zaurus models, and more. | ||
| 182 | * When they run Linux, arch/arm/mach-sa1100/usb-eth.c may be used to | ||
| 183 | * network using minimal USB framing data. | ||
| 184 | * | ||
| 185 | * This describes the driver currently in standard ARM Linux kernels. | ||
| 186 | * The Zaurus uses a different driver (see later). | ||
| 187 | * | ||
| 188 | * PXA25x and PXA210 use XScale cores (ARM v5TE) with better USB support | ||
| 189 | * and different USB endpoint numbering than the SA1100 devices. The | ||
| 190 | * mach-pxa/usb-eth.c driver re-uses the device ids from mach-sa1100 | ||
| 191 | * so we rely on the endpoint descriptors. | ||
| 192 | * | ||
| 193 | *-------------------------------------------------------------------------*/ | ||
| 194 | |||
| 195 | static const struct driver_info linuxdev_info = { | ||
| 196 | .description = "Linux Device", | ||
| 197 | .check_connect = always_connected, | ||
| 198 | }; | ||
| 199 | |||
| 200 | static const struct driver_info yopy_info = { | ||
| 201 | .description = "Yopy", | ||
| 202 | .check_connect = always_connected, | ||
| 203 | }; | ||
| 204 | |||
| 205 | static const struct driver_info blob_info = { | ||
| 206 | .description = "Boot Loader OBject", | ||
| 207 | .check_connect = always_connected, | ||
| 208 | }; | ||
| 209 | |||
| 210 | #endif /* CONFIG_USB_ARMLINUX */ | ||
| 211 | |||
| 212 | |||
| 213 | /*-------------------------------------------------------------------------*/ | ||
| 214 | |||
| 215 | #ifndef HAVE_HARDWARE | ||
| 216 | #error You need to configure some hardware for this driver | ||
| 217 | #endif | ||
| 218 | |||
| 219 | /* | ||
| 220 | * chip vendor names won't normally be on the cables, and | ||
| 221 | * may not be on the device. | ||
| 222 | */ | ||
| 223 | |||
| 224 | static const struct usb_device_id products [] = { | ||
| 225 | |||
| 226 | #ifdef CONFIG_USB_ALI_M5632 | ||
| 227 | { | ||
| 228 | USB_DEVICE (0x0402, 0x5632), // ALi defaults | ||
| 229 | .driver_info = (unsigned long) &ali_m5632_info, | ||
| 230 | }, | ||
| 231 | #endif | ||
| 232 | |||
| 233 | #ifdef CONFIG_USB_AN2720 | ||
| 234 | { | ||
| 235 | USB_DEVICE (0x0547, 0x2720), // AnchorChips defaults | ||
| 236 | .driver_info = (unsigned long) &an2720_info, | ||
| 237 | }, { | ||
| 238 | USB_DEVICE (0x0547, 0x2727), // Xircom PGUNET | ||
| 239 | .driver_info = (unsigned long) &an2720_info, | ||
| 240 | }, | ||
| 241 | #endif | ||
| 242 | |||
| 243 | #ifdef CONFIG_USB_BELKIN | ||
| 244 | { | ||
| 245 | USB_DEVICE (0x050d, 0x0004), // Belkin | ||
| 246 | .driver_info = (unsigned long) &belkin_info, | ||
| 247 | }, { | ||
| 248 | USB_DEVICE (0x056c, 0x8100), // eTEK | ||
| 249 | .driver_info = (unsigned long) &belkin_info, | ||
| 250 | }, { | ||
| 251 | USB_DEVICE (0x0525, 0x9901), // Advance USBNET (eTEK) | ||
| 252 | .driver_info = (unsigned long) &belkin_info, | ||
| 253 | }, | ||
| 254 | #endif | ||
| 255 | |||
| 256 | #ifdef CONFIG_USB_EPSON2888 | ||
| 257 | { | ||
| 258 | USB_DEVICE (0x0525, 0x2888), // EPSON USB client | ||
| 259 | .driver_info = (unsigned long) &epson2888_info, | ||
| 260 | }, | ||
| 261 | #endif | ||
| 262 | |||
| 263 | #ifdef CONFIG_USB_KC2190 | ||
| 264 | { | ||
| 265 | USB_DEVICE (0x050f, 0x0190), // KC-190 | ||
| 266 | .driver_info = (unsigned long) &kc2190_info, | ||
| 267 | }, | ||
| 268 | #endif | ||
| 269 | |||
| 270 | #ifdef CONFIG_USB_ARMLINUX | ||
| 271 | /* | ||
| 272 | * SA-1100 using standard ARM Linux kernels, or compatible. | ||
| 273 | * Often used when talking to Linux PDAs (iPaq, Yopy, etc). | ||
| 274 | * The sa-1100 "usb-eth" driver handles the basic framing. | ||
| 275 | * | ||
| 276 | * PXA25x or PXA210 ... these use a "usb-eth" driver much like | ||
| 277 | * the sa1100 one, but hardware uses different endpoint numbers. | ||
| 278 | * | ||
| 279 | * Or the Linux "Ethernet" gadget on hardware that can't talk | ||
| 280 | * CDC Ethernet (e.g., no altsettings), in either of two modes: | ||
| 281 | * - acting just like the old "usb-eth" firmware, though | ||
| 282 | * the implementation is different | ||
| 283 | * - supporting RNDIS as the first/default configuration for | ||
| 284 | * MS-Windows interop; Linux needs to use the other config | ||
| 285 | */ | ||
| 286 | { | ||
| 287 | // 1183 = 0x049F, both used as hex values? | ||
| 288 | // Compaq "Itsy" vendor/product id | ||
| 289 | USB_DEVICE (0x049F, 0x505A), // usb-eth, or compatible | ||
| 290 | .driver_info = (unsigned long) &linuxdev_info, | ||
| 291 | }, { | ||
| 292 | USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy" | ||
| 293 | .driver_info = (unsigned long) &yopy_info, | ||
| 294 | }, { | ||
| 295 | USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader | ||
| 296 | .driver_info = (unsigned long) &blob_info, | ||
| 297 | }, { | ||
| 298 | // Linux Ethernet/RNDIS gadget on pxa210/25x/26x, second config | ||
| 299 | // e.g. Gumstix, current OpenZaurus, ... | ||
| 300 | USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203), | ||
| 301 | .driver_info = (unsigned long) &linuxdev_info, | ||
| 302 | }, | ||
| 303 | #endif | ||
| 304 | |||
| 305 | { }, // END | ||
| 306 | }; | ||
| 307 | MODULE_DEVICE_TABLE(usb, products); | ||
| 308 | |||
| 309 | /*-------------------------------------------------------------------------*/ | ||
| 310 | |||
| 311 | static struct usb_driver cdc_subset_driver = { | ||
| 312 | .owner = THIS_MODULE, | ||
| 313 | .name = "cdc_subset", | ||
| 314 | .probe = usbnet_probe, | ||
| 315 | .suspend = usbnet_suspend, | ||
| 316 | .resume = usbnet_resume, | ||
| 317 | .disconnect = usbnet_disconnect, | ||
| 318 | .id_table = products, | ||
| 319 | }; | ||
| 320 | |||
| 321 | static int __init cdc_subset_init(void) | ||
| 322 | { | ||
| 323 | return usb_register(&cdc_subset_driver); | ||
| 324 | } | ||
| 325 | module_init(cdc_subset_init); | ||
| 326 | |||
| 327 | static void __exit cdc_subset_exit(void) | ||
| 328 | { | ||
| 329 | usb_deregister(&cdc_subset_driver); | ||
| 330 | } | ||
| 331 | module_exit(cdc_subset_exit); | ||
| 332 | |||
| 333 | MODULE_AUTHOR("David Brownell"); | ||
| 334 | MODULE_DESCRIPTION("Simple 'CDC Subset' USB networking links"); | ||
| 335 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/gl620a.c b/drivers/usb/net/gl620a.c new file mode 100644 index 000000000000..c8763ae33c73 --- /dev/null +++ b/drivers/usb/net/gl620a.c | |||
| @@ -0,0 +1,407 @@ | |||
| 1 | /* | ||
| 2 | * GeneSys GL620USB-A based links | ||
| 3 | * Copyright (C) 2001 by Jiun-Jie Huang <huangjj@genesyslogic.com.tw> | ||
| 4 | * Copyright (C) 2001 by Stanislav Brabec <utx@penguin.cz> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | // #define DEBUG // error path messages, extra info | ||
| 22 | // #define VERBOSE // more; success messages | ||
| 23 | |||
| 24 | #include <linux/config.h> | ||
| 25 | #ifdef CONFIG_USB_DEBUG | ||
| 26 | # define DEBUG | ||
| 27 | #endif | ||
| 28 | #include <linux/module.h> | ||
| 29 | #include <linux/sched.h> | ||
| 30 | #include <linux/init.h> | ||
| 31 | #include <linux/netdevice.h> | ||
| 32 | #include <linux/etherdevice.h> | ||
| 33 | #include <linux/ethtool.h> | ||
| 34 | #include <linux/workqueue.h> | ||
| 35 | #include <linux/mii.h> | ||
| 36 | #include <linux/usb.h> | ||
| 37 | |||
| 38 | #include "usbnet.h" | ||
| 39 | |||
| 40 | |||
| 41 | /* | ||
| 42 | * GeneSys GL620USB-A (www.genesyslogic.com.tw) | ||
| 43 | * | ||
| 44 | * ... should partially interop with the Win32 driver for this hardware. | ||
| 45 | * The GeneSys docs imply there's some NDIS issue motivating this framing. | ||
| 46 | * | ||
| 47 | * Some info from GeneSys: | ||
| 48 | * - GL620USB-A is full duplex; GL620USB is only half duplex for bulk. | ||
| 49 | * (Some cables, like the BAFO-100c, use the half duplex version.) | ||
| 50 | * - For the full duplex model, the low bit of the version code says | ||
| 51 | * which side is which ("left/right"). | ||
| 52 | * - For the half duplex type, a control/interrupt handshake settles | ||
| 53 | * the transfer direction. (That's disabled here, partially coded.) | ||
| 54 | * A control URB would block until other side writes an interrupt. | ||
| 55 | * | ||
| 56 | * Original code from Jiun-Jie Huang <huangjj@genesyslogic.com.tw> | ||
| 57 | * and merged into "usbnet" by Stanislav Brabec <utx@penguin.cz>. | ||
| 58 | */ | ||
| 59 | |||
| 60 | // control msg write command | ||
| 61 | #define GENELINK_CONNECT_WRITE 0xF0 | ||
| 62 | // interrupt pipe index | ||
| 63 | #define GENELINK_INTERRUPT_PIPE 0x03 | ||
| 64 | // interrupt read buffer size | ||
| 65 | #define INTERRUPT_BUFSIZE 0x08 | ||
| 66 | // interrupt pipe interval value | ||
| 67 | #define GENELINK_INTERRUPT_INTERVAL 0x10 | ||
| 68 | // max transmit packet number per transmit | ||
| 69 | #define GL_MAX_TRANSMIT_PACKETS 32 | ||
| 70 | // max packet length | ||
| 71 | #define GL_MAX_PACKET_LEN 1514 | ||
| 72 | // max receive buffer size | ||
| 73 | #define GL_RCV_BUF_SIZE \ | ||
| 74 | (((GL_MAX_PACKET_LEN + 4) * GL_MAX_TRANSMIT_PACKETS) + 4) | ||
| 75 | |||
| 76 | struct gl_packet { | ||
| 77 | u32 packet_length; | ||
| 78 | char packet_data [1]; | ||
| 79 | }; | ||
| 80 | |||
| 81 | struct gl_header { | ||
| 82 | u32 packet_count; | ||
| 83 | struct gl_packet packets; | ||
| 84 | }; | ||
| 85 | |||
| 86 | #ifdef GENELINK_ACK | ||
| 87 | |||
| 88 | // FIXME: this code is incomplete, not debugged; it doesn't | ||
| 89 | // handle interrupts correctly; it should use the generic | ||
| 90 | // status IRQ code (which didn't exist back in 2001). | ||
| 91 | |||
| 92 | struct gl_priv { | ||
| 93 | struct urb *irq_urb; | ||
| 94 | char irq_buf [INTERRUPT_BUFSIZE]; | ||
| 95 | }; | ||
| 96 | |||
| 97 | static inline int gl_control_write(struct usbnet *dev, u8 request, u16 value) | ||
| 98 | { | ||
| 99 | int retval; | ||
| 100 | |||
| 101 | retval = usb_control_msg(dev->udev, | ||
| 102 | usb_sndctrlpipe(dev->udev, 0), | ||
| 103 | request, | ||
| 104 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 105 | value, | ||
| 106 | 0, // index | ||
| 107 | 0, // data buffer | ||
| 108 | 0, // size | ||
| 109 | USB_CTRL_SET_TIMEOUT); | ||
| 110 | return retval; | ||
| 111 | } | ||
| 112 | |||
| 113 | static void gl_interrupt_complete(struct urb *urb, struct pt_regs *regs) | ||
| 114 | { | ||
| 115 | int status = urb->status; | ||
| 116 | |||
| 117 | switch (status) { | ||
| 118 | case 0: | ||
| 119 | /* success */ | ||
| 120 | break; | ||
| 121 | case -ECONNRESET: | ||
| 122 | case -ENOENT: | ||
| 123 | case -ESHUTDOWN: | ||
| 124 | /* this urb is terminated, clean up */ | ||
| 125 | dbg("%s - urb shutting down with status: %d", | ||
| 126 | __FUNCTION__, status); | ||
| 127 | return; | ||
| 128 | default: | ||
| 129 | dbg("%s - nonzero urb status received: %d", | ||
| 130 | __FUNCTION__, urb->status); | ||
| 131 | } | ||
| 132 | |||
| 133 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 134 | if (status) | ||
| 135 | err("%s - usb_submit_urb failed with result %d", | ||
| 136 | __FUNCTION__, status); | ||
| 137 | } | ||
| 138 | |||
| 139 | static int gl_interrupt_read(struct usbnet *dev) | ||
| 140 | { | ||
| 141 | struct gl_priv *priv = dev->priv_data; | ||
| 142 | int retval; | ||
| 143 | |||
| 144 | // issue usb interrupt read | ||
| 145 | if (priv && priv->irq_urb) { | ||
| 146 | // submit urb | ||
| 147 | if ((retval = usb_submit_urb(priv->irq_urb, GFP_KERNEL)) != 0) | ||
| 148 | dbg("gl_interrupt_read: submit fail - %X...", retval); | ||
| 149 | else | ||
| 150 | dbg("gl_interrupt_read: submit success..."); | ||
| 151 | } | ||
| 152 | |||
| 153 | return 0; | ||
| 154 | } | ||
| 155 | |||
| 156 | // check whether another side is connected | ||
| 157 | static int genelink_check_connect(struct usbnet *dev) | ||
| 158 | { | ||
| 159 | int retval; | ||
| 160 | |||
| 161 | dbg("genelink_check_connect..."); | ||
| 162 | |||
| 163 | // detect whether another side is connected | ||
| 164 | if ((retval = gl_control_write(dev, GENELINK_CONNECT_WRITE, 0)) != 0) { | ||
| 165 | dbg("%s: genelink_check_connect write fail - %X", | ||
| 166 | dev->net->name, retval); | ||
| 167 | return retval; | ||
| 168 | } | ||
| 169 | |||
| 170 | // usb interrupt read to ack another side | ||
| 171 | if ((retval = gl_interrupt_read(dev)) != 0) { | ||
| 172 | dbg("%s: genelink_check_connect read fail - %X", | ||
| 173 | dev->net->name, retval); | ||
| 174 | return retval; | ||
| 175 | } | ||
| 176 | |||
| 177 | dbg("%s: genelink_check_connect read success", dev->net->name); | ||
| 178 | return 0; | ||
| 179 | } | ||
| 180 | |||
| 181 | // allocate and initialize the private data for genelink | ||
| 182 | static int genelink_init(struct usbnet *dev) | ||
| 183 | { | ||
| 184 | struct gl_priv *priv; | ||
| 185 | |||
| 186 | // allocate the private data structure | ||
| 187 | if ((priv = kmalloc(sizeof *priv, GFP_KERNEL)) == 0) { | ||
| 188 | dbg("%s: cannot allocate private data per device", | ||
| 189 | dev->net->name); | ||
| 190 | return -ENOMEM; | ||
| 191 | } | ||
| 192 | |||
| 193 | // allocate irq urb | ||
| 194 | if ((priv->irq_urb = usb_alloc_urb(0, GFP_KERNEL)) == 0) { | ||
| 195 | dbg("%s: cannot allocate private irq urb per device", | ||
| 196 | dev->net->name); | ||
| 197 | kfree(priv); | ||
| 198 | return -ENOMEM; | ||
| 199 | } | ||
| 200 | |||
| 201 | // fill irq urb | ||
| 202 | usb_fill_int_urb(priv->irq_urb, dev->udev, | ||
| 203 | usb_rcvintpipe(dev->udev, GENELINK_INTERRUPT_PIPE), | ||
| 204 | priv->irq_buf, INTERRUPT_BUFSIZE, | ||
| 205 | gl_interrupt_complete, 0, | ||
| 206 | GENELINK_INTERRUPT_INTERVAL); | ||
| 207 | |||
| 208 | // set private data pointer | ||
| 209 | dev->priv_data = priv; | ||
| 210 | |||
| 211 | return 0; | ||
| 212 | } | ||
| 213 | |||
| 214 | // release the private data | ||
| 215 | static int genelink_free(struct usbnet *dev) | ||
| 216 | { | ||
| 217 | struct gl_priv *priv = dev->priv_data; | ||
| 218 | |||
| 219 | if (!priv) | ||
| 220 | return 0; | ||
| 221 | |||
| 222 | // FIXME: can't cancel here; it's synchronous, and | ||
| 223 | // should have happened earlier in any case (interrupt | ||
| 224 | // handling needs to be generic) | ||
| 225 | |||
| 226 | // cancel irq urb first | ||
| 227 | usb_kill_urb(priv->irq_urb); | ||
| 228 | |||
| 229 | // free irq urb | ||
| 230 | usb_free_urb(priv->irq_urb); | ||
| 231 | |||
| 232 | // free the private data structure | ||
| 233 | kfree(priv); | ||
| 234 | |||
| 235 | return 0; | ||
| 236 | } | ||
| 237 | |||
| 238 | #endif | ||
| 239 | |||
| 240 | static int genelink_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
| 241 | { | ||
| 242 | struct gl_header *header; | ||
| 243 | struct gl_packet *packet; | ||
| 244 | struct sk_buff *gl_skb; | ||
| 245 | u32 size; | ||
| 246 | |||
| 247 | header = (struct gl_header *) skb->data; | ||
| 248 | |||
| 249 | // get the packet count of the received skb | ||
| 250 | le32_to_cpus(&header->packet_count); | ||
| 251 | if ((header->packet_count > GL_MAX_TRANSMIT_PACKETS) | ||
| 252 | || (header->packet_count < 0)) { | ||
| 253 | dbg("genelink: invalid received packet count %d", | ||
| 254 | header->packet_count); | ||
| 255 | return 0; | ||
| 256 | } | ||
| 257 | |||
| 258 | // set the current packet pointer to the first packet | ||
| 259 | packet = &header->packets; | ||
| 260 | |||
| 261 | // decrement the length for the packet count size 4 bytes | ||
| 262 | skb_pull(skb, 4); | ||
| 263 | |||
| 264 | while (header->packet_count > 1) { | ||
| 265 | // get the packet length | ||
| 266 | size = le32_to_cpu(packet->packet_length); | ||
| 267 | |||
| 268 | // this may be a broken packet | ||
| 269 | if (size > GL_MAX_PACKET_LEN) { | ||
| 270 | dbg("genelink: invalid rx length %d", size); | ||
| 271 | return 0; | ||
| 272 | } | ||
| 273 | |||
| 274 | // allocate the skb for the individual packet | ||
| 275 | gl_skb = alloc_skb(size, GFP_ATOMIC); | ||
| 276 | if (gl_skb) { | ||
| 277 | |||
| 278 | // copy the packet data to the new skb | ||
| 279 | memcpy(skb_put(gl_skb, size), | ||
| 280 | packet->packet_data, size); | ||
| 281 | usbnet_skb_return(dev, gl_skb); | ||
| 282 | } | ||
| 283 | |||
| 284 | // advance to the next packet | ||
| 285 | packet = (struct gl_packet *) | ||
| 286 | &packet->packet_data [size]; | ||
| 287 | header->packet_count--; | ||
| 288 | |||
| 289 | // shift the data pointer to the next gl_packet | ||
| 290 | skb_pull(skb, size + 4); | ||
| 291 | } | ||
| 292 | |||
| 293 | // skip the packet length field 4 bytes | ||
| 294 | skb_pull(skb, 4); | ||
| 295 | |||
| 296 | if (skb->len > GL_MAX_PACKET_LEN) { | ||
| 297 | dbg("genelink: invalid rx length %d", skb->len); | ||
| 298 | return 0; | ||
| 299 | } | ||
| 300 | return 1; | ||
| 301 | } | ||
| 302 | |||
| 303 | static struct sk_buff * | ||
| 304 | genelink_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags) | ||
| 305 | { | ||
| 306 | int padlen; | ||
| 307 | int length = skb->len; | ||
| 308 | int headroom = skb_headroom(skb); | ||
| 309 | int tailroom = skb_tailroom(skb); | ||
| 310 | u32 *packet_count; | ||
| 311 | u32 *packet_len; | ||
| 312 | |||
| 313 | // FIXME: magic numbers, bleech | ||
| 314 | padlen = ((skb->len + (4 + 4*1)) % 64) ? 0 : 1; | ||
| 315 | |||
| 316 | if ((!skb_cloned(skb)) | ||
| 317 | && ((headroom + tailroom) >= (padlen + (4 + 4*1)))) { | ||
| 318 | if ((headroom < (4 + 4*1)) || (tailroom < padlen)) { | ||
| 319 | skb->data = memmove(skb->head + (4 + 4*1), | ||
| 320 | skb->data, skb->len); | ||
| 321 | skb->tail = skb->data + skb->len; | ||
| 322 | } | ||
| 323 | } else { | ||
| 324 | struct sk_buff *skb2; | ||
| 325 | skb2 = skb_copy_expand(skb, (4 + 4*1) , padlen, flags); | ||
| 326 | dev_kfree_skb_any(skb); | ||
| 327 | skb = skb2; | ||
| 328 | if (!skb) | ||
| 329 | return NULL; | ||
| 330 | } | ||
| 331 | |||
| 332 | // attach the packet count to the header | ||
| 333 | packet_count = (u32 *) skb_push(skb, (4 + 4*1)); | ||
| 334 | packet_len = packet_count + 1; | ||
| 335 | |||
| 336 | *packet_count = cpu_to_le32(1); | ||
| 337 | *packet_len = cpu_to_le32(length); | ||
| 338 | |||
| 339 | // add padding byte | ||
| 340 | if ((skb->len % dev->maxpacket) == 0) | ||
| 341 | skb_put(skb, 1); | ||
| 342 | |||
| 343 | return skb; | ||
| 344 | } | ||
| 345 | |||
| 346 | static int genelink_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 347 | { | ||
| 348 | dev->hard_mtu = GL_RCV_BUF_SIZE; | ||
| 349 | dev->net->hard_header_len += 4; | ||
| 350 | dev->in = usb_rcvbulkpipe(dev->udev, dev->driver_info->in); | ||
| 351 | dev->out = usb_sndbulkpipe(dev->udev, dev->driver_info->out); | ||
| 352 | return 0; | ||
| 353 | } | ||
| 354 | |||
| 355 | static const struct driver_info genelink_info = { | ||
| 356 | .description = "Genesys GeneLink", | ||
| 357 | .flags = FLAG_FRAMING_GL | FLAG_NO_SETINT, | ||
| 358 | .bind = genelink_bind, | ||
| 359 | .rx_fixup = genelink_rx_fixup, | ||
| 360 | .tx_fixup = genelink_tx_fixup, | ||
| 361 | |||
| 362 | .in = 1, .out = 2, | ||
| 363 | |||
| 364 | #ifdef GENELINK_ACK | ||
| 365 | .check_connect =genelink_check_connect, | ||
| 366 | #endif | ||
| 367 | }; | ||
| 368 | |||
| 369 | static const struct usb_device_id products [] = { | ||
| 370 | |||
| 371 | { | ||
| 372 | USB_DEVICE(0x05e3, 0x0502), // GL620USB-A | ||
| 373 | .driver_info = (unsigned long) &genelink_info, | ||
| 374 | }, | ||
| 375 | /* NOT: USB_DEVICE(0x05e3, 0x0501), // GL620USB | ||
| 376 | * that's half duplex, not currently supported | ||
| 377 | */ | ||
| 378 | { }, // END | ||
| 379 | }; | ||
| 380 | MODULE_DEVICE_TABLE(usb, products); | ||
| 381 | |||
| 382 | static struct usb_driver gl620a_driver = { | ||
| 383 | .owner = THIS_MODULE, | ||
| 384 | .name = "gl620a", | ||
| 385 | .id_table = products, | ||
| 386 | .probe = usbnet_probe, | ||
| 387 | .disconnect = usbnet_disconnect, | ||
| 388 | .suspend = usbnet_suspend, | ||
| 389 | .resume = usbnet_resume, | ||
| 390 | }; | ||
| 391 | |||
| 392 | static int __init usbnet_init(void) | ||
| 393 | { | ||
| 394 | return usb_register(&gl620a_driver); | ||
| 395 | } | ||
| 396 | module_init(usbnet_init); | ||
| 397 | |||
| 398 | static void __exit usbnet_exit(void) | ||
| 399 | { | ||
| 400 | usb_deregister(&gl620a_driver); | ||
| 401 | } | ||
| 402 | module_exit(usbnet_exit); | ||
| 403 | |||
| 404 | MODULE_AUTHOR("Jiun-Jie Huang"); | ||
| 405 | MODULE_DESCRIPTION("GL620-USB-A Host-to-Host Link cables"); | ||
| 406 | MODULE_LICENSE("GPL"); | ||
| 407 | |||
diff --git a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c index 7ffa99b9760f..e04b0ce3611a 100644 --- a/drivers/usb/net/kaweth.c +++ b/drivers/usb/net/kaweth.c | |||
| @@ -787,7 +787,6 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net) | |||
| 787 | kaweth_usb_transmit_complete, | 787 | kaweth_usb_transmit_complete, |
| 788 | kaweth); | 788 | kaweth); |
| 789 | kaweth->end = 0; | 789 | kaweth->end = 0; |
| 790 | kaweth->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 791 | 790 | ||
| 792 | if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC))) | 791 | if((res = usb_submit_urb(kaweth->tx_urb, GFP_ATOMIC))) |
| 793 | { | 792 | { |
diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c new file mode 100644 index 000000000000..a4309c4a491b --- /dev/null +++ b/drivers/usb/net/net1080.c | |||
| @@ -0,0 +1,622 @@ | |||
| 1 | /* | ||
| 2 | * Net1080 based USB host-to-host cables | ||
| 3 | * Copyright (C) 2000-2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | // #define DEBUG // error path messages, extra info | ||
| 21 | // #define VERBOSE // more; success messages | ||
| 22 | |||
| 23 | #include <linux/config.h> | ||
| 24 | #ifdef CONFIG_USB_DEBUG | ||
| 25 | # define DEBUG | ||
| 26 | #endif | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/netdevice.h> | ||
| 31 | #include <linux/etherdevice.h> | ||
| 32 | #include <linux/ethtool.h> | ||
| 33 | #include <linux/workqueue.h> | ||
| 34 | #include <linux/mii.h> | ||
| 35 | #include <linux/usb.h> | ||
| 36 | |||
| 37 | #include <asm/unaligned.h> | ||
| 38 | |||
| 39 | #include "usbnet.h" | ||
| 40 | |||
| 41 | |||
| 42 | /* | ||
| 43 | * Netchip 1080 driver ... http://www.netchip.com | ||
| 44 | * (Sept 2004: End-of-life announcement has been sent.) | ||
| 45 | * Used in (some) LapLink cables | ||
| 46 | */ | ||
| 47 | |||
| 48 | #define frame_errors data[1] | ||
| 49 | |||
| 50 | /* | ||
| 51 | * NetChip framing of ethernet packets, supporting additional error | ||
| 52 | * checks for links that may drop bulk packets from inside messages. | ||
| 53 | * Odd USB length == always short read for last usb packet. | ||
| 54 | * - nc_header | ||
| 55 | * - Ethernet header (14 bytes) | ||
| 56 | * - payload | ||
| 57 | * - (optional padding byte, if needed so length becomes odd) | ||
| 58 | * - nc_trailer | ||
| 59 | * | ||
| 60 | * This framing is to be avoided for non-NetChip devices. | ||
| 61 | */ | ||
| 62 | |||
| 63 | struct nc_header { // packed: | ||
| 64 | __le16 hdr_len; // sizeof nc_header (LE, all) | ||
| 65 | __le16 packet_len; // payload size (including ethhdr) | ||
| 66 | __le16 packet_id; // detects dropped packets | ||
| 67 | #define MIN_HEADER 6 | ||
| 68 | |||
| 69 | // all else is optional, and must start with: | ||
| 70 | // __le16 vendorId; // from usb-if | ||
| 71 | // __le16 productId; | ||
| 72 | } __attribute__((__packed__)); | ||
| 73 | |||
| 74 | #define PAD_BYTE ((unsigned char)0xAC) | ||
| 75 | |||
| 76 | struct nc_trailer { | ||
| 77 | __le16 packet_id; | ||
| 78 | } __attribute__((__packed__)); | ||
| 79 | |||
| 80 | // packets may use FLAG_FRAMING_NC and optional pad | ||
| 81 | #define FRAMED_SIZE(mtu) (sizeof (struct nc_header) \ | ||
| 82 | + sizeof (struct ethhdr) \ | ||
| 83 | + (mtu) \ | ||
| 84 | + 1 \ | ||
| 85 | + sizeof (struct nc_trailer)) | ||
| 86 | |||
| 87 | #define MIN_FRAMED FRAMED_SIZE(0) | ||
| 88 | |||
| 89 | /* packets _could_ be up to 64KB... */ | ||
| 90 | #define NC_MAX_PACKET 32767 | ||
| 91 | |||
| 92 | |||
| 93 | /* | ||
| 94 | * Zero means no timeout; else, how long a 64 byte bulk packet may be queued | ||
| 95 | * before the hardware drops it. If that's done, the driver will need to | ||
| 96 | * frame network packets to guard against the dropped USB packets. The win32 | ||
| 97 | * driver sets this for both sides of the link. | ||
| 98 | */ | ||
| 99 | #define NC_READ_TTL_MS ((u8)255) // ms | ||
| 100 | |||
| 101 | /* | ||
| 102 | * We ignore most registers and EEPROM contents. | ||
| 103 | */ | ||
| 104 | #define REG_USBCTL ((u8)0x04) | ||
| 105 | #define REG_TTL ((u8)0x10) | ||
| 106 | #define REG_STATUS ((u8)0x11) | ||
| 107 | |||
| 108 | /* | ||
| 109 | * Vendor specific requests to read/write data | ||
| 110 | */ | ||
| 111 | #define REQUEST_REGISTER ((u8)0x10) | ||
| 112 | #define REQUEST_EEPROM ((u8)0x11) | ||
| 113 | |||
| 114 | static int | ||
| 115 | nc_vendor_read(struct usbnet *dev, u8 req, u8 regnum, u16 *retval_ptr) | ||
| 116 | { | ||
| 117 | int status = usb_control_msg(dev->udev, | ||
| 118 | usb_rcvctrlpipe(dev->udev, 0), | ||
| 119 | req, | ||
| 120 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 121 | 0, regnum, | ||
| 122 | retval_ptr, sizeof *retval_ptr, | ||
| 123 | USB_CTRL_GET_TIMEOUT); | ||
| 124 | if (status > 0) | ||
| 125 | status = 0; | ||
| 126 | if (!status) | ||
| 127 | le16_to_cpus(retval_ptr); | ||
| 128 | return status; | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline int | ||
| 132 | nc_register_read(struct usbnet *dev, u8 regnum, u16 *retval_ptr) | ||
| 133 | { | ||
| 134 | return nc_vendor_read(dev, REQUEST_REGISTER, regnum, retval_ptr); | ||
| 135 | } | ||
| 136 | |||
| 137 | // no retval ... can become async, usable in_interrupt() | ||
| 138 | static void | ||
| 139 | nc_vendor_write(struct usbnet *dev, u8 req, u8 regnum, u16 value) | ||
| 140 | { | ||
| 141 | usb_control_msg(dev->udev, | ||
| 142 | usb_sndctrlpipe(dev->udev, 0), | ||
| 143 | req, | ||
| 144 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 145 | value, regnum, | ||
| 146 | NULL, 0, // data is in setup packet | ||
| 147 | USB_CTRL_SET_TIMEOUT); | ||
| 148 | } | ||
| 149 | |||
| 150 | static inline void | ||
| 151 | nc_register_write(struct usbnet *dev, u8 regnum, u16 value) | ||
| 152 | { | ||
| 153 | nc_vendor_write(dev, REQUEST_REGISTER, regnum, value); | ||
| 154 | } | ||
| 155 | |||
| 156 | |||
| 157 | #if 0 | ||
| 158 | static void nc_dump_registers(struct usbnet *dev) | ||
| 159 | { | ||
| 160 | u8 reg; | ||
| 161 | u16 *vp = kmalloc(sizeof (u16)); | ||
| 162 | |||
| 163 | if (!vp) { | ||
| 164 | dbg("no memory?"); | ||
| 165 | return; | ||
| 166 | } | ||
| 167 | |||
| 168 | dbg("%s registers:", dev->net->name); | ||
| 169 | for (reg = 0; reg < 0x20; reg++) { | ||
| 170 | int retval; | ||
| 171 | |||
| 172 | // reading some registers is trouble | ||
| 173 | if (reg >= 0x08 && reg <= 0xf) | ||
| 174 | continue; | ||
| 175 | if (reg >= 0x12 && reg <= 0x1e) | ||
| 176 | continue; | ||
| 177 | |||
| 178 | retval = nc_register_read(dev, reg, vp); | ||
| 179 | if (retval < 0) | ||
| 180 | dbg("%s reg [0x%x] ==> error %d", | ||
| 181 | dev->net->name, reg, retval); | ||
| 182 | else | ||
| 183 | dbg("%s reg [0x%x] = 0x%x", | ||
| 184 | dev->net->name, reg, *vp); | ||
| 185 | } | ||
| 186 | kfree(vp); | ||
| 187 | } | ||
| 188 | #endif | ||
| 189 | |||
| 190 | |||
| 191 | /*-------------------------------------------------------------------------*/ | ||
| 192 | |||
| 193 | /* | ||
| 194 | * Control register | ||
| 195 | */ | ||
| 196 | |||
| 197 | #define USBCTL_WRITABLE_MASK 0x1f0f | ||
| 198 | // bits 15-13 reserved, r/o | ||
| 199 | #define USBCTL_ENABLE_LANG (1 << 12) | ||
| 200 | #define USBCTL_ENABLE_MFGR (1 << 11) | ||
| 201 | #define USBCTL_ENABLE_PROD (1 << 10) | ||
| 202 | #define USBCTL_ENABLE_SERIAL (1 << 9) | ||
| 203 | #define USBCTL_ENABLE_DEFAULTS (1 << 8) | ||
| 204 | // bits 7-4 reserved, r/o | ||
| 205 | #define USBCTL_FLUSH_OTHER (1 << 3) | ||
| 206 | #define USBCTL_FLUSH_THIS (1 << 2) | ||
| 207 | #define USBCTL_DISCONN_OTHER (1 << 1) | ||
| 208 | #define USBCTL_DISCONN_THIS (1 << 0) | ||
| 209 | |||
| 210 | static inline void nc_dump_usbctl(struct usbnet *dev, u16 usbctl) | ||
| 211 | { | ||
| 212 | if (!netif_msg_link(dev)) | ||
| 213 | return; | ||
| 214 | devdbg(dev, "net1080 %s-%s usbctl 0x%x:%s%s%s%s%s;" | ||
| 215 | " this%s%s;" | ||
| 216 | " other%s%s; r/o 0x%x", | ||
| 217 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 218 | usbctl, | ||
| 219 | (usbctl & USBCTL_ENABLE_LANG) ? " lang" : "", | ||
| 220 | (usbctl & USBCTL_ENABLE_MFGR) ? " mfgr" : "", | ||
| 221 | (usbctl & USBCTL_ENABLE_PROD) ? " prod" : "", | ||
| 222 | (usbctl & USBCTL_ENABLE_SERIAL) ? " serial" : "", | ||
| 223 | (usbctl & USBCTL_ENABLE_DEFAULTS) ? " defaults" : "", | ||
| 224 | |||
| 225 | (usbctl & USBCTL_FLUSH_OTHER) ? " FLUSH" : "", | ||
| 226 | (usbctl & USBCTL_DISCONN_OTHER) ? " DIS" : "", | ||
| 227 | (usbctl & USBCTL_FLUSH_THIS) ? " FLUSH" : "", | ||
| 228 | (usbctl & USBCTL_DISCONN_THIS) ? " DIS" : "", | ||
| 229 | usbctl & ~USBCTL_WRITABLE_MASK | ||
| 230 | ); | ||
| 231 | } | ||
| 232 | |||
| 233 | /*-------------------------------------------------------------------------*/ | ||
| 234 | |||
| 235 | /* | ||
| 236 | * Status register | ||
| 237 | */ | ||
| 238 | |||
| 239 | #define STATUS_PORT_A (1 << 15) | ||
| 240 | |||
| 241 | #define STATUS_CONN_OTHER (1 << 14) | ||
| 242 | #define STATUS_SUSPEND_OTHER (1 << 13) | ||
| 243 | #define STATUS_MAILBOX_OTHER (1 << 12) | ||
| 244 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03) | ||
| 245 | |||
| 246 | #define STATUS_CONN_THIS (1 << 6) | ||
| 247 | #define STATUS_SUSPEND_THIS (1 << 5) | ||
| 248 | #define STATUS_MAILBOX_THIS (1 << 4) | ||
| 249 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03) | ||
| 250 | |||
| 251 | #define STATUS_UNSPEC_MASK 0x0c8c | ||
| 252 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) | ||
| 253 | |||
| 254 | |||
| 255 | static inline void nc_dump_status(struct usbnet *dev, u16 status) | ||
| 256 | { | ||
| 257 | if (!netif_msg_link(dev)) | ||
| 258 | return; | ||
| 259 | devdbg(dev, "net1080 %s-%s status 0x%x:" | ||
| 260 | " this (%c) PKT=%d%s%s%s;" | ||
| 261 | " other PKT=%d%s%s%s; unspec 0x%x", | ||
| 262 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 263 | status, | ||
| 264 | |||
| 265 | // XXX the packet counts don't seem right | ||
| 266 | // (1 at reset, not 0); maybe UNSPEC too | ||
| 267 | |||
| 268 | (status & STATUS_PORT_A) ? 'A' : 'B', | ||
| 269 | STATUS_PACKETS_THIS(status), | ||
| 270 | (status & STATUS_CONN_THIS) ? " CON" : "", | ||
| 271 | (status & STATUS_SUSPEND_THIS) ? " SUS" : "", | ||
| 272 | (status & STATUS_MAILBOX_THIS) ? " MBOX" : "", | ||
| 273 | |||
| 274 | STATUS_PACKETS_OTHER(status), | ||
| 275 | (status & STATUS_CONN_OTHER) ? " CON" : "", | ||
| 276 | (status & STATUS_SUSPEND_OTHER) ? " SUS" : "", | ||
| 277 | (status & STATUS_MAILBOX_OTHER) ? " MBOX" : "", | ||
| 278 | |||
| 279 | status & STATUS_UNSPEC_MASK | ||
| 280 | ); | ||
| 281 | } | ||
| 282 | |||
| 283 | /*-------------------------------------------------------------------------*/ | ||
| 284 | |||
| 285 | /* | ||
| 286 | * TTL register | ||
| 287 | */ | ||
| 288 | |||
| 289 | #define TTL_THIS(ttl) (0x00ff & ttl) | ||
| 290 | #define TTL_OTHER(ttl) (0x00ff & (ttl >> 8)) | ||
| 291 | #define MK_TTL(this,other) ((u16)(((other)<<8)|(0x00ff&(this)))) | ||
| 292 | |||
| 293 | static inline void nc_dump_ttl(struct usbnet *dev, u16 ttl) | ||
| 294 | { | ||
| 295 | if (netif_msg_link(dev)) | ||
| 296 | devdbg(dev, "net1080 %s-%s ttl 0x%x this = %d, other = %d", | ||
| 297 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 298 | ttl, TTL_THIS(ttl), TTL_OTHER(ttl)); | ||
| 299 | } | ||
| 300 | |||
| 301 | /*-------------------------------------------------------------------------*/ | ||
| 302 | |||
| 303 | static int net1080_reset(struct usbnet *dev) | ||
| 304 | { | ||
| 305 | u16 usbctl, status, ttl; | ||
| 306 | u16 *vp = kmalloc(sizeof (u16), GFP_KERNEL); | ||
| 307 | int retval; | ||
| 308 | |||
| 309 | if (!vp) | ||
| 310 | return -ENOMEM; | ||
| 311 | |||
| 312 | // nc_dump_registers(dev); | ||
| 313 | |||
| 314 | if ((retval = nc_register_read(dev, REG_STATUS, vp)) < 0) { | ||
| 315 | dbg("can't read %s-%s status: %d", | ||
| 316 | dev->udev->bus->bus_name, dev->udev->devpath, retval); | ||
| 317 | goto done; | ||
| 318 | } | ||
| 319 | status = *vp; | ||
| 320 | nc_dump_status(dev, status); | ||
| 321 | |||
| 322 | if ((retval = nc_register_read(dev, REG_USBCTL, vp)) < 0) { | ||
| 323 | dbg("can't read USBCTL, %d", retval); | ||
| 324 | goto done; | ||
| 325 | } | ||
| 326 | usbctl = *vp; | ||
| 327 | nc_dump_usbctl(dev, usbctl); | ||
| 328 | |||
| 329 | nc_register_write(dev, REG_USBCTL, | ||
| 330 | USBCTL_FLUSH_THIS | USBCTL_FLUSH_OTHER); | ||
| 331 | |||
| 332 | if ((retval = nc_register_read(dev, REG_TTL, vp)) < 0) { | ||
| 333 | dbg("can't read TTL, %d", retval); | ||
| 334 | goto done; | ||
| 335 | } | ||
| 336 | ttl = *vp; | ||
| 337 | // nc_dump_ttl(dev, ttl); | ||
| 338 | |||
| 339 | nc_register_write(dev, REG_TTL, | ||
| 340 | MK_TTL(NC_READ_TTL_MS, TTL_OTHER(ttl)) ); | ||
| 341 | dbg("%s: assigned TTL, %d ms", dev->net->name, NC_READ_TTL_MS); | ||
| 342 | |||
| 343 | if (netif_msg_link(dev)) | ||
| 344 | devinfo(dev, "port %c, peer %sconnected", | ||
| 345 | (status & STATUS_PORT_A) ? 'A' : 'B', | ||
| 346 | (status & STATUS_CONN_OTHER) ? "" : "dis" | ||
| 347 | ); | ||
| 348 | retval = 0; | ||
| 349 | |||
| 350 | done: | ||
| 351 | kfree(vp); | ||
| 352 | return retval; | ||
| 353 | } | ||
| 354 | |||
| 355 | static int net1080_check_connect(struct usbnet *dev) | ||
| 356 | { | ||
| 357 | int retval; | ||
| 358 | u16 status; | ||
| 359 | u16 *vp = kmalloc(sizeof (u16), GFP_KERNEL); | ||
| 360 | |||
| 361 | if (!vp) | ||
| 362 | return -ENOMEM; | ||
| 363 | retval = nc_register_read(dev, REG_STATUS, vp); | ||
| 364 | status = *vp; | ||
| 365 | kfree(vp); | ||
| 366 | if (retval != 0) { | ||
| 367 | dbg("%s net1080_check_conn read - %d", dev->net->name, retval); | ||
| 368 | return retval; | ||
| 369 | } | ||
| 370 | if ((status & STATUS_CONN_OTHER) != STATUS_CONN_OTHER) | ||
| 371 | return -ENOLINK; | ||
| 372 | return 0; | ||
| 373 | } | ||
| 374 | |||
| 375 | static void nc_flush_complete(struct urb *urb, struct pt_regs *regs) | ||
| 376 | { | ||
| 377 | kfree(urb->context); | ||
| 378 | usb_free_urb(urb); | ||
| 379 | } | ||
| 380 | |||
| 381 | static void nc_ensure_sync(struct usbnet *dev) | ||
| 382 | { | ||
| 383 | dev->frame_errors++; | ||
| 384 | if (dev->frame_errors > 5) { | ||
| 385 | struct urb *urb; | ||
| 386 | struct usb_ctrlrequest *req; | ||
| 387 | int status; | ||
| 388 | |||
| 389 | /* Send a flush */ | ||
| 390 | urb = usb_alloc_urb(0, SLAB_ATOMIC); | ||
| 391 | if (!urb) | ||
| 392 | return; | ||
| 393 | |||
| 394 | req = kmalloc(sizeof *req, GFP_ATOMIC); | ||
| 395 | if (!req) { | ||
| 396 | usb_free_urb(urb); | ||
| 397 | return; | ||
| 398 | } | ||
| 399 | |||
| 400 | req->bRequestType = USB_DIR_OUT | ||
| 401 | | USB_TYPE_VENDOR | ||
| 402 | | USB_RECIP_DEVICE; | ||
| 403 | req->bRequest = REQUEST_REGISTER; | ||
| 404 | req->wValue = cpu_to_le16(USBCTL_FLUSH_THIS | ||
| 405 | | USBCTL_FLUSH_OTHER); | ||
| 406 | req->wIndex = cpu_to_le16(REG_USBCTL); | ||
| 407 | req->wLength = cpu_to_le16(0); | ||
| 408 | |||
| 409 | /* queue an async control request, we don't need | ||
| 410 | * to do anything when it finishes except clean up. | ||
| 411 | */ | ||
| 412 | usb_fill_control_urb(urb, dev->udev, | ||
| 413 | usb_sndctrlpipe(dev->udev, 0), | ||
| 414 | (unsigned char *) req, | ||
| 415 | NULL, 0, | ||
| 416 | nc_flush_complete, req); | ||
| 417 | status = usb_submit_urb(urb, GFP_ATOMIC); | ||
| 418 | if (status) { | ||
| 419 | kfree(req); | ||
| 420 | usb_free_urb(urb); | ||
| 421 | return; | ||
| 422 | } | ||
| 423 | |||
| 424 | if (netif_msg_rx_err(dev)) | ||
| 425 | devdbg(dev, "flush net1080; too many framing errors"); | ||
| 426 | dev->frame_errors = 0; | ||
| 427 | } | ||
| 428 | } | ||
| 429 | |||
| 430 | static int net1080_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
| 431 | { | ||
| 432 | struct nc_header *header; | ||
| 433 | struct nc_trailer *trailer; | ||
| 434 | u16 hdr_len, packet_len; | ||
| 435 | |||
| 436 | if (!(skb->len & 0x01)) { | ||
| 437 | #ifdef DEBUG | ||
| 438 | struct net_device *net = dev->net; | ||
| 439 | dbg("rx framesize %d range %d..%d mtu %d", skb->len, | ||
| 440 | net->hard_header_len, dev->hard_mtu, net->mtu); | ||
| 441 | #endif | ||
| 442 | dev->stats.rx_frame_errors++; | ||
| 443 | nc_ensure_sync(dev); | ||
| 444 | return 0; | ||
| 445 | } | ||
| 446 | |||
| 447 | header = (struct nc_header *) skb->data; | ||
| 448 | hdr_len = le16_to_cpup(&header->hdr_len); | ||
| 449 | packet_len = le16_to_cpup(&header->packet_len); | ||
| 450 | if (FRAMED_SIZE(packet_len) > NC_MAX_PACKET) { | ||
| 451 | dev->stats.rx_frame_errors++; | ||
| 452 | dbg("packet too big, %d", packet_len); | ||
| 453 | nc_ensure_sync(dev); | ||
| 454 | return 0; | ||
| 455 | } else if (hdr_len < MIN_HEADER) { | ||
| 456 | dev->stats.rx_frame_errors++; | ||
| 457 | dbg("header too short, %d", hdr_len); | ||
| 458 | nc_ensure_sync(dev); | ||
| 459 | return 0; | ||
| 460 | } else if (hdr_len > MIN_HEADER) { | ||
| 461 | // out of band data for us? | ||
| 462 | dbg("header OOB, %d bytes", hdr_len - MIN_HEADER); | ||
| 463 | nc_ensure_sync(dev); | ||
| 464 | // switch (vendor/product ids) { ... } | ||
| 465 | } | ||
| 466 | skb_pull(skb, hdr_len); | ||
| 467 | |||
| 468 | trailer = (struct nc_trailer *) | ||
| 469 | (skb->data + skb->len - sizeof *trailer); | ||
| 470 | skb_trim(skb, skb->len - sizeof *trailer); | ||
| 471 | |||
| 472 | if ((packet_len & 0x01) == 0) { | ||
| 473 | if (skb->data [packet_len] != PAD_BYTE) { | ||
| 474 | dev->stats.rx_frame_errors++; | ||
| 475 | dbg("bad pad"); | ||
| 476 | return 0; | ||
| 477 | } | ||
| 478 | skb_trim(skb, skb->len - 1); | ||
| 479 | } | ||
| 480 | if (skb->len != packet_len) { | ||
| 481 | dev->stats.rx_frame_errors++; | ||
| 482 | dbg("bad packet len %d (expected %d)", | ||
| 483 | skb->len, packet_len); | ||
| 484 | nc_ensure_sync(dev); | ||
| 485 | return 0; | ||
| 486 | } | ||
| 487 | if (header->packet_id != get_unaligned(&trailer->packet_id)) { | ||
| 488 | dev->stats.rx_fifo_errors++; | ||
| 489 | dbg("(2+ dropped) rx packet_id mismatch 0x%x 0x%x", | ||
| 490 | le16_to_cpu(header->packet_id), | ||
| 491 | le16_to_cpu(trailer->packet_id)); | ||
| 492 | return 0; | ||
| 493 | } | ||
| 494 | #if 0 | ||
| 495 | devdbg(dev, "frame <rx h %d p %d id %d", header->hdr_len, | ||
| 496 | header->packet_len, header->packet_id); | ||
| 497 | #endif | ||
| 498 | dev->frame_errors = 0; | ||
| 499 | return 1; | ||
| 500 | } | ||
| 501 | |||
| 502 | static struct sk_buff * | ||
| 503 | net1080_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags) | ||
| 504 | { | ||
| 505 | int padlen; | ||
| 506 | struct sk_buff *skb2; | ||
| 507 | struct nc_header *header = NULL; | ||
| 508 | struct nc_trailer *trailer = NULL; | ||
| 509 | int len = skb->len; | ||
| 510 | |||
| 511 | padlen = ((len + sizeof (struct nc_header) | ||
| 512 | + sizeof (struct nc_trailer)) & 0x01) ? 0 : 1; | ||
| 513 | if (!skb_cloned(skb)) { | ||
| 514 | int headroom = skb_headroom(skb); | ||
| 515 | int tailroom = skb_tailroom(skb); | ||
| 516 | |||
| 517 | if ((padlen + sizeof (struct nc_trailer)) <= tailroom | ||
| 518 | && sizeof (struct nc_header) <= headroom) | ||
| 519 | /* There's enough head and tail room */ | ||
| 520 | goto encapsulate; | ||
| 521 | |||
| 522 | if ((sizeof (struct nc_header) + padlen | ||
| 523 | + sizeof (struct nc_trailer)) < | ||
| 524 | (headroom + tailroom)) { | ||
| 525 | /* There's enough total room, so just readjust */ | ||
| 526 | skb->data = memmove(skb->head | ||
| 527 | + sizeof (struct nc_header), | ||
| 528 | skb->data, skb->len); | ||
| 529 | skb->tail = skb->data + len; | ||
| 530 | goto encapsulate; | ||
| 531 | } | ||
| 532 | } | ||
| 533 | |||
| 534 | /* Create a new skb to use with the correct size */ | ||
| 535 | skb2 = skb_copy_expand(skb, | ||
| 536 | sizeof (struct nc_header), | ||
| 537 | sizeof (struct nc_trailer) + padlen, | ||
| 538 | flags); | ||
| 539 | dev_kfree_skb_any(skb); | ||
| 540 | if (!skb2) | ||
| 541 | return skb2; | ||
| 542 | skb = skb2; | ||
| 543 | |||
| 544 | encapsulate: | ||
| 545 | /* header first */ | ||
| 546 | header = (struct nc_header *) skb_push(skb, sizeof *header); | ||
| 547 | header->hdr_len = cpu_to_le16(sizeof (*header)); | ||
| 548 | header->packet_len = cpu_to_le16(len); | ||
| 549 | header->packet_id = cpu_to_le16((u16)dev->xid++); | ||
| 550 | |||
| 551 | /* maybe pad; then trailer */ | ||
| 552 | if (!((skb->len + sizeof *trailer) & 0x01)) | ||
| 553 | *skb_put(skb, 1) = PAD_BYTE; | ||
| 554 | trailer = (struct nc_trailer *) skb_put(skb, sizeof *trailer); | ||
| 555 | put_unaligned(header->packet_id, &trailer->packet_id); | ||
| 556 | #if 0 | ||
| 557 | devdbg(dev, "frame >tx h %d p %d id %d", | ||
| 558 | header->hdr_len, header->packet_len, | ||
| 559 | header->packet_id); | ||
| 560 | #endif | ||
| 561 | return skb; | ||
| 562 | } | ||
| 563 | |||
| 564 | static int net1080_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 565 | { | ||
| 566 | unsigned extra = sizeof (struct nc_header) | ||
| 567 | + 1 | ||
| 568 | + sizeof (struct nc_trailer); | ||
| 569 | |||
| 570 | dev->net->hard_header_len += extra; | ||
| 571 | dev->rx_urb_size = dev->net->hard_header_len + dev->net->mtu; | ||
| 572 | dev->hard_mtu = NC_MAX_PACKET; | ||
| 573 | return usbnet_get_endpoints (dev, intf); | ||
| 574 | } | ||
| 575 | |||
| 576 | static const struct driver_info net1080_info = { | ||
| 577 | .description = "NetChip TurboCONNECT", | ||
| 578 | .flags = FLAG_FRAMING_NC, | ||
| 579 | .bind = net1080_bind, | ||
| 580 | .reset = net1080_reset, | ||
| 581 | .check_connect = net1080_check_connect, | ||
| 582 | .rx_fixup = net1080_rx_fixup, | ||
| 583 | .tx_fixup = net1080_tx_fixup, | ||
| 584 | }; | ||
| 585 | |||
| 586 | static const struct usb_device_id products [] = { | ||
| 587 | { | ||
| 588 | USB_DEVICE(0x0525, 0x1080), // NetChip ref design | ||
| 589 | .driver_info = (unsigned long) &net1080_info, | ||
| 590 | }, { | ||
| 591 | USB_DEVICE(0x06D0, 0x0622), // Laplink Gold | ||
| 592 | .driver_info = (unsigned long) &net1080_info, | ||
| 593 | }, | ||
| 594 | { }, // END | ||
| 595 | }; | ||
| 596 | MODULE_DEVICE_TABLE(usb, products); | ||
| 597 | |||
| 598 | static struct usb_driver net1080_driver = { | ||
| 599 | .owner = THIS_MODULE, | ||
| 600 | .name = "net1080", | ||
| 601 | .id_table = products, | ||
| 602 | .probe = usbnet_probe, | ||
| 603 | .disconnect = usbnet_disconnect, | ||
| 604 | .suspend = usbnet_suspend, | ||
| 605 | .resume = usbnet_resume, | ||
| 606 | }; | ||
| 607 | |||
| 608 | static int __init net1080_init(void) | ||
| 609 | { | ||
| 610 | return usb_register(&net1080_driver); | ||
| 611 | } | ||
| 612 | module_init(net1080_init); | ||
| 613 | |||
| 614 | static void __exit net1080_exit(void) | ||
| 615 | { | ||
| 616 | usb_deregister(&net1080_driver); | ||
| 617 | } | ||
| 618 | module_exit(net1080_exit); | ||
| 619 | |||
| 620 | MODULE_AUTHOR("David Brownell"); | ||
| 621 | MODULE_DESCRIPTION("NetChip 1080 based USB Host-to-Host Links"); | ||
| 622 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index fcd6d3ccef44..7484d34780fc 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
| @@ -825,7 +825,6 @@ static void pegasus_tx_timeout(struct net_device *net) | |||
| 825 | pegasus_t *pegasus = netdev_priv(net); | 825 | pegasus_t *pegasus = netdev_priv(net); |
| 826 | if (netif_msg_timer(pegasus)) | 826 | if (netif_msg_timer(pegasus)) |
| 827 | printk(KERN_WARNING "%s: tx timeout\n", net->name); | 827 | printk(KERN_WARNING "%s: tx timeout\n", net->name); |
| 828 | pegasus->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 829 | usb_unlink_urb(pegasus->tx_urb); | 828 | usb_unlink_urb(pegasus->tx_urb); |
| 830 | pegasus->stats.tx_errors++; | 829 | pegasus->stats.tx_errors++; |
| 831 | } | 830 | } |
diff --git a/drivers/usb/net/plusb.c b/drivers/usb/net/plusb.c new file mode 100644 index 000000000000..74c2b3581c76 --- /dev/null +++ b/drivers/usb/net/plusb.c | |||
| @@ -0,0 +1,156 @@ | |||
| 1 | /* | ||
| 2 | * PL-2301/2302 USB host-to-host link cables | ||
| 3 | * Copyright (C) 2000-2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | // #define DEBUG // error path messages, extra info | ||
| 21 | // #define VERBOSE // more; success messages | ||
| 22 | |||
| 23 | #include <linux/config.h> | ||
| 24 | #ifdef CONFIG_USB_DEBUG | ||
| 25 | # define DEBUG | ||
| 26 | #endif | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/netdevice.h> | ||
| 31 | #include <linux/etherdevice.h> | ||
| 32 | #include <linux/ethtool.h> | ||
| 33 | #include <linux/workqueue.h> | ||
| 34 | #include <linux/mii.h> | ||
| 35 | #include <linux/usb.h> | ||
| 36 | |||
| 37 | #include "usbnet.h" | ||
| 38 | |||
| 39 | |||
| 40 | /* | ||
| 41 | * Prolific PL-2301/PL-2302 driver ... http://www.prolifictech.com | ||
| 42 | * | ||
| 43 | * The protocol and handshaking used here should be bug-compatible | ||
| 44 | * with the Linux 2.2 "plusb" driver, by Deti Fliegl. | ||
| 45 | * | ||
| 46 | * HEADS UP: this handshaking isn't all that robust. This driver | ||
| 47 | * gets confused easily if you unplug one end of the cable then | ||
| 48 | * try to connect it again; you'll need to restart both ends. The | ||
| 49 | * "naplink" software (used by some PlayStation/2 deveopers) does | ||
| 50 | * the handshaking much better! Also, sometimes this hardware | ||
| 51 | * seems to get wedged under load. Prolific docs are weak, and | ||
| 52 | * don't identify differences between PL2301 and PL2302, much less | ||
| 53 | * anything to explain the different PL2302 versions observed. | ||
| 54 | */ | ||
| 55 | |||
| 56 | /* | ||
| 57 | * Bits 0-4 can be used for software handshaking; they're set from | ||
| 58 | * one end, cleared from the other, "read" with the interrupt byte. | ||
| 59 | */ | ||
| 60 | #define PL_S_EN (1<<7) /* (feature only) suspend enable */ | ||
| 61 | /* reserved bit -- rx ready (6) ? */ | ||
| 62 | #define PL_TX_READY (1<<5) /* (interrupt only) transmit ready */ | ||
| 63 | #define PL_RESET_OUT (1<<4) /* reset output pipe */ | ||
| 64 | #define PL_RESET_IN (1<<3) /* reset input pipe */ | ||
| 65 | #define PL_TX_C (1<<2) /* transmission complete */ | ||
| 66 | #define PL_TX_REQ (1<<1) /* transmission received */ | ||
| 67 | #define PL_PEER_E (1<<0) /* peer exists */ | ||
| 68 | |||
| 69 | static inline int | ||
| 70 | pl_vendor_req(struct usbnet *dev, u8 req, u8 val, u8 index) | ||
| 71 | { | ||
| 72 | return usb_control_msg(dev->udev, | ||
| 73 | usb_rcvctrlpipe(dev->udev, 0), | ||
| 74 | req, | ||
| 75 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 76 | val, index, | ||
| 77 | NULL, 0, | ||
| 78 | USB_CTRL_GET_TIMEOUT); | ||
| 79 | } | ||
| 80 | |||
| 81 | static inline int | ||
| 82 | pl_clear_QuickLink_features(struct usbnet *dev, int val) | ||
| 83 | { | ||
| 84 | return pl_vendor_req(dev, 1, (u8) val, 0); | ||
| 85 | } | ||
| 86 | |||
| 87 | static inline int | ||
| 88 | pl_set_QuickLink_features(struct usbnet *dev, int val) | ||
| 89 | { | ||
| 90 | return pl_vendor_req(dev, 3, (u8) val, 0); | ||
| 91 | } | ||
| 92 | |||
| 93 | static int pl_reset(struct usbnet *dev) | ||
| 94 | { | ||
| 95 | /* some units seem to need this reset, others reject it utterly. | ||
| 96 | * FIXME be more like "naplink" or windows drivers. | ||
| 97 | */ | ||
| 98 | (void) pl_set_QuickLink_features(dev, | ||
| 99 | PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E); | ||
| 100 | return 0; | ||
| 101 | } | ||
| 102 | |||
| 103 | static const struct driver_info prolific_info = { | ||
| 104 | .description = "Prolific PL-2301/PL-2302", | ||
| 105 | .flags = FLAG_NO_SETINT, | ||
| 106 | /* some PL-2302 versions seem to fail usb_set_interface() */ | ||
| 107 | .reset = pl_reset, | ||
| 108 | }; | ||
| 109 | |||
| 110 | |||
| 111 | /*-------------------------------------------------------------------------*/ | ||
| 112 | |||
| 113 | /* | ||
| 114 | * Proilific's name won't normally be on the cables, and | ||
| 115 | * may not be on the device. | ||
| 116 | */ | ||
| 117 | |||
| 118 | static const struct usb_device_id products [] = { | ||
| 119 | |||
| 120 | { | ||
| 121 | USB_DEVICE(0x067b, 0x0000), // PL-2301 | ||
| 122 | .driver_info = (unsigned long) &prolific_info, | ||
| 123 | }, { | ||
| 124 | USB_DEVICE(0x067b, 0x0001), // PL-2302 | ||
| 125 | .driver_info = (unsigned long) &prolific_info, | ||
| 126 | }, | ||
| 127 | |||
| 128 | { }, // END | ||
| 129 | }; | ||
| 130 | MODULE_DEVICE_TABLE(usb, products); | ||
| 131 | |||
| 132 | static struct usb_driver plusb_driver = { | ||
| 133 | .owner = THIS_MODULE, | ||
| 134 | .name = "plusb", | ||
| 135 | .id_table = products, | ||
| 136 | .probe = usbnet_probe, | ||
| 137 | .disconnect = usbnet_disconnect, | ||
| 138 | .suspend = usbnet_suspend, | ||
| 139 | .resume = usbnet_resume, | ||
| 140 | }; | ||
| 141 | |||
| 142 | static int __init plusb_init(void) | ||
| 143 | { | ||
| 144 | return usb_register(&plusb_driver); | ||
| 145 | } | ||
| 146 | module_init(plusb_init); | ||
| 147 | |||
| 148 | static void __exit plusb_exit(void) | ||
| 149 | { | ||
| 150 | usb_deregister(&plusb_driver); | ||
| 151 | } | ||
| 152 | module_exit(plusb_exit); | ||
| 153 | |||
| 154 | MODULE_AUTHOR("David Brownell"); | ||
| 155 | MODULE_DESCRIPTION("Prolific PL-2301/2302 USB Host to Host Link Driver"); | ||
| 156 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/rndis_host.c b/drivers/usb/net/rndis_host.c new file mode 100644 index 000000000000..2ed2e5fb7778 --- /dev/null +++ b/drivers/usb/net/rndis_host.c | |||
| @@ -0,0 +1,615 @@ | |||
| 1 | /* | ||
| 2 | * Host Side support for RNDIS Networking Links | ||
| 3 | * Copyright (C) 2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | // #define DEBUG // error path messages, extra info | ||
| 21 | // #define VERBOSE // more; success messages | ||
| 22 | |||
| 23 | #include <linux/config.h> | ||
| 24 | #ifdef CONFIG_USB_DEBUG | ||
| 25 | # define DEBUG | ||
| 26 | #endif | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/netdevice.h> | ||
| 31 | #include <linux/etherdevice.h> | ||
| 32 | #include <linux/ethtool.h> | ||
| 33 | #include <linux/workqueue.h> | ||
| 34 | #include <linux/mii.h> | ||
| 35 | #include <linux/usb.h> | ||
| 36 | #include <linux/usb_cdc.h> | ||
| 37 | |||
| 38 | #include "usbnet.h" | ||
| 39 | |||
| 40 | |||
| 41 | /* | ||
| 42 | * RNDIS is NDIS remoted over USB. It's a MSFT variant of CDC ACM ... of | ||
| 43 | * course ACM was intended for modems, not Ethernet links! USB's standard | ||
| 44 | * for Ethernet links is "CDC Ethernet", which is significantly simpler. | ||
| 45 | */ | ||
| 46 | |||
| 47 | /* | ||
| 48 | * CONTROL uses CDC "encapsulated commands" with funky notifications. | ||
| 49 | * - control-out: SEND_ENCAPSULATED | ||
| 50 | * - interrupt-in: RESPONSE_AVAILABLE | ||
| 51 | * - control-in: GET_ENCAPSULATED | ||
| 52 | * | ||
| 53 | * We'll try to ignore the RESPONSE_AVAILABLE notifications. | ||
| 54 | */ | ||
| 55 | struct rndis_msg_hdr { | ||
| 56 | __le32 msg_type; /* RNDIS_MSG_* */ | ||
| 57 | __le32 msg_len; | ||
| 58 | // followed by data that varies between messages | ||
| 59 | __le32 request_id; | ||
| 60 | __le32 status; | ||
| 61 | // ... and more | ||
| 62 | } __attribute__ ((packed)); | ||
| 63 | |||
| 64 | /* RNDIS defines this (absurdly huge) control timeout */ | ||
| 65 | #define RNDIS_CONTROL_TIMEOUT_MS (10 * 1000) | ||
| 66 | |||
| 67 | |||
| 68 | #define ccpu2 __constant_cpu_to_le32 | ||
| 69 | |||
| 70 | #define RNDIS_MSG_COMPLETION ccpu2(0x80000000) | ||
| 71 | |||
| 72 | /* codes for "msg_type" field of rndis messages; | ||
| 73 | * only the data channel uses packet messages (maybe batched); | ||
| 74 | * everything else goes on the control channel. | ||
| 75 | */ | ||
| 76 | #define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */ | ||
| 77 | #define RNDIS_MSG_INIT ccpu2(0x00000002) | ||
| 78 | #define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) | ||
| 79 | #define RNDIS_MSG_HALT ccpu2(0x00000003) | ||
| 80 | #define RNDIS_MSG_QUERY ccpu2(0x00000004) | ||
| 81 | #define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) | ||
| 82 | #define RNDIS_MSG_SET ccpu2(0x00000005) | ||
| 83 | #define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) | ||
| 84 | #define RNDIS_MSG_RESET ccpu2(0x00000006) | ||
| 85 | #define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) | ||
| 86 | #define RNDIS_MSG_INDICATE ccpu2(0x00000007) | ||
| 87 | #define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008) | ||
| 88 | #define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) | ||
| 89 | |||
| 90 | /* codes for "status" field of completion messages */ | ||
| 91 | #define RNDIS_STATUS_SUCCESS ccpu2(0x00000000) | ||
| 92 | #define RNDIS_STATUS_FAILURE ccpu2(0xc0000001) | ||
| 93 | #define RNDIS_STATUS_INVALID_DATA ccpu2(0xc0010015) | ||
| 94 | #define RNDIS_STATUS_NOT_SUPPORTED ccpu2(0xc00000bb) | ||
| 95 | #define RNDIS_STATUS_MEDIA_CONNECT ccpu2(0x4001000b) | ||
| 96 | #define RNDIS_STATUS_MEDIA_DISCONNECT ccpu2(0x4001000c) | ||
| 97 | |||
| 98 | |||
| 99 | struct rndis_data_hdr { | ||
| 100 | __le32 msg_type; /* RNDIS_MSG_PACKET */ | ||
| 101 | __le32 msg_len; // rndis_data_hdr + data_len + pad | ||
| 102 | __le32 data_offset; // 36 -- right after header | ||
| 103 | __le32 data_len; // ... real packet size | ||
| 104 | |||
| 105 | __le32 oob_data_offset; // zero | ||
| 106 | __le32 oob_data_len; // zero | ||
| 107 | __le32 num_oob; // zero | ||
| 108 | __le32 packet_data_offset; // zero | ||
| 109 | |||
| 110 | __le32 packet_data_len; // zero | ||
| 111 | __le32 vc_handle; // zero | ||
| 112 | __le32 reserved; // zero | ||
| 113 | } __attribute__ ((packed)); | ||
| 114 | |||
| 115 | struct rndis_init { /* OUT */ | ||
| 116 | // header and: | ||
| 117 | __le32 msg_type; /* RNDIS_MSG_INIT */ | ||
| 118 | __le32 msg_len; // 24 | ||
| 119 | __le32 request_id; | ||
| 120 | __le32 major_version; // of rndis (1.0) | ||
| 121 | __le32 minor_version; | ||
| 122 | __le32 max_transfer_size; | ||
| 123 | } __attribute__ ((packed)); | ||
| 124 | |||
| 125 | struct rndis_init_c { /* IN */ | ||
| 126 | // header and: | ||
| 127 | __le32 msg_type; /* RNDIS_MSG_INIT_C */ | ||
| 128 | __le32 msg_len; | ||
| 129 | __le32 request_id; | ||
| 130 | __le32 status; | ||
| 131 | __le32 major_version; // of rndis (1.0) | ||
| 132 | __le32 minor_version; | ||
| 133 | __le32 device_flags; | ||
| 134 | __le32 medium; // zero == 802.3 | ||
| 135 | __le32 max_packets_per_message; | ||
| 136 | __le32 max_transfer_size; | ||
| 137 | __le32 packet_alignment; // max 7; (1<<n) bytes | ||
| 138 | __le32 af_list_offset; // zero | ||
| 139 | __le32 af_list_size; // zero | ||
| 140 | } __attribute__ ((packed)); | ||
| 141 | |||
| 142 | struct rndis_halt { /* OUT (no reply) */ | ||
| 143 | // header and: | ||
| 144 | __le32 msg_type; /* RNDIS_MSG_HALT */ | ||
| 145 | __le32 msg_len; | ||
| 146 | __le32 request_id; | ||
| 147 | } __attribute__ ((packed)); | ||
| 148 | |||
| 149 | struct rndis_query { /* OUT */ | ||
| 150 | // header and: | ||
| 151 | __le32 msg_type; /* RNDIS_MSG_QUERY */ | ||
| 152 | __le32 msg_len; | ||
| 153 | __le32 request_id; | ||
| 154 | __le32 oid; | ||
| 155 | __le32 len; | ||
| 156 | __le32 offset; | ||
| 157 | /*?*/ __le32 handle; // zero | ||
| 158 | } __attribute__ ((packed)); | ||
| 159 | |||
| 160 | struct rndis_query_c { /* IN */ | ||
| 161 | // header and: | ||
| 162 | __le32 msg_type; /* RNDIS_MSG_QUERY_C */ | ||
| 163 | __le32 msg_len; | ||
| 164 | __le32 request_id; | ||
| 165 | __le32 status; | ||
| 166 | __le32 len; | ||
| 167 | __le32 offset; | ||
| 168 | } __attribute__ ((packed)); | ||
| 169 | |||
| 170 | struct rndis_set { /* OUT */ | ||
| 171 | // header and: | ||
| 172 | __le32 msg_type; /* RNDIS_MSG_SET */ | ||
| 173 | __le32 msg_len; | ||
| 174 | __le32 request_id; | ||
| 175 | __le32 oid; | ||
| 176 | __le32 len; | ||
| 177 | __le32 offset; | ||
| 178 | /*?*/ __le32 handle; // zero | ||
| 179 | } __attribute__ ((packed)); | ||
| 180 | |||
| 181 | struct rndis_set_c { /* IN */ | ||
| 182 | // header and: | ||
| 183 | __le32 msg_type; /* RNDIS_MSG_SET_C */ | ||
| 184 | __le32 msg_len; | ||
| 185 | __le32 request_id; | ||
| 186 | __le32 status; | ||
| 187 | } __attribute__ ((packed)); | ||
| 188 | |||
| 189 | struct rndis_reset { /* IN */ | ||
| 190 | // header and: | ||
| 191 | __le32 msg_type; /* RNDIS_MSG_RESET */ | ||
| 192 | __le32 msg_len; | ||
| 193 | __le32 reserved; | ||
| 194 | } __attribute__ ((packed)); | ||
| 195 | |||
| 196 | struct rndis_reset_c { /* OUT */ | ||
| 197 | // header and: | ||
| 198 | __le32 msg_type; /* RNDIS_MSG_RESET_C */ | ||
| 199 | __le32 msg_len; | ||
| 200 | __le32 status; | ||
| 201 | __le32 addressing_lost; | ||
| 202 | } __attribute__ ((packed)); | ||
| 203 | |||
| 204 | struct rndis_indicate { /* IN (unrequested) */ | ||
| 205 | // header and: | ||
| 206 | __le32 msg_type; /* RNDIS_MSG_INDICATE */ | ||
| 207 | __le32 msg_len; | ||
| 208 | __le32 status; | ||
| 209 | __le32 length; | ||
| 210 | __le32 offset; | ||
| 211 | /**/ __le32 diag_status; | ||
| 212 | __le32 error_offset; | ||
| 213 | /**/ __le32 message; | ||
| 214 | } __attribute__ ((packed)); | ||
| 215 | |||
| 216 | struct rndis_keepalive { /* OUT (optionally IN) */ | ||
| 217 | // header and: | ||
| 218 | __le32 msg_type; /* RNDIS_MSG_KEEPALIVE */ | ||
| 219 | __le32 msg_len; | ||
| 220 | __le32 request_id; | ||
| 221 | } __attribute__ ((packed)); | ||
| 222 | |||
| 223 | struct rndis_keepalive_c { /* IN (optionally OUT) */ | ||
| 224 | // header and: | ||
| 225 | __le32 msg_type; /* RNDIS_MSG_KEEPALIVE_C */ | ||
| 226 | __le32 msg_len; | ||
| 227 | __le32 request_id; | ||
| 228 | __le32 status; | ||
| 229 | } __attribute__ ((packed)); | ||
| 230 | |||
| 231 | /* NOTE: about 30 OIDs are "mandatory" for peripherals to support ... and | ||
| 232 | * there are gobs more that may optionally be supported. We'll avoid as much | ||
| 233 | * of that mess as possible. | ||
| 234 | */ | ||
| 235 | #define OID_802_3_PERMANENT_ADDRESS ccpu2(0x01010101) | ||
| 236 | #define OID_GEN_CURRENT_PACKET_FILTER ccpu2(0x0001010e) | ||
| 237 | |||
| 238 | /* | ||
| 239 | * RNDIS notifications from device: command completion; "reverse" | ||
| 240 | * keepalives; etc | ||
| 241 | */ | ||
| 242 | static void rndis_status(struct usbnet *dev, struct urb *urb) | ||
| 243 | { | ||
| 244 | devdbg(dev, "rndis status urb, len %d stat %d", | ||
| 245 | urb->actual_length, urb->status); | ||
| 246 | // FIXME for keepalives, respond immediately (asynchronously) | ||
| 247 | // if not an RNDIS status, do like cdc_status(dev,urb) does | ||
| 248 | } | ||
| 249 | |||
| 250 | /* | ||
| 251 | * RPC done RNDIS-style. Caller guarantees: | ||
| 252 | * - message is properly byteswapped | ||
| 253 | * - there's no other request pending | ||
| 254 | * - buf can hold up to 1KB response (required by RNDIS spec) | ||
| 255 | * On return, the first few entries are already byteswapped. | ||
| 256 | * | ||
| 257 | * Call context is likely probe(), before interface name is known, | ||
| 258 | * which is why we won't try to use it in the diagnostics. | ||
| 259 | */ | ||
| 260 | static int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf) | ||
| 261 | { | ||
| 262 | struct cdc_state *info = (void *) &dev->data; | ||
| 263 | int retval; | ||
| 264 | unsigned count; | ||
| 265 | __le32 rsp; | ||
| 266 | u32 xid = 0, msg_len, request_id; | ||
| 267 | |||
| 268 | /* REVISIT when this gets called from contexts other than probe() or | ||
| 269 | * disconnect(): either serialize, or dispatch responses on xid | ||
| 270 | */ | ||
| 271 | |||
| 272 | /* Issue the request; don't bother byteswapping our xid */ | ||
| 273 | if (likely(buf->msg_type != RNDIS_MSG_HALT | ||
| 274 | && buf->msg_type != RNDIS_MSG_RESET)) { | ||
| 275 | xid = dev->xid++; | ||
| 276 | if (!xid) | ||
| 277 | xid = dev->xid++; | ||
| 278 | buf->request_id = (__force __le32) xid; | ||
| 279 | } | ||
| 280 | retval = usb_control_msg(dev->udev, | ||
| 281 | usb_sndctrlpipe(dev->udev, 0), | ||
| 282 | USB_CDC_SEND_ENCAPSULATED_COMMAND, | ||
| 283 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 284 | 0, info->u->bMasterInterface0, | ||
| 285 | buf, le32_to_cpu(buf->msg_len), | ||
| 286 | RNDIS_CONTROL_TIMEOUT_MS); | ||
| 287 | if (unlikely(retval < 0 || xid == 0)) | ||
| 288 | return retval; | ||
| 289 | |||
| 290 | // FIXME Seems like some devices discard responses when | ||
| 291 | // we time out and cancel our "get response" requests... | ||
| 292 | // so, this is fragile. Probably need to poll for status. | ||
| 293 | |||
| 294 | /* ignore status endpoint, just poll the control channel; | ||
| 295 | * the request probably completed immediately | ||
| 296 | */ | ||
| 297 | rsp = buf->msg_type | RNDIS_MSG_COMPLETION; | ||
| 298 | for (count = 0; count < 10; count++) { | ||
| 299 | memset(buf, 0, 1024); | ||
| 300 | retval = usb_control_msg(dev->udev, | ||
| 301 | usb_rcvctrlpipe(dev->udev, 0), | ||
| 302 | USB_CDC_GET_ENCAPSULATED_RESPONSE, | ||
| 303 | USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 304 | 0, info->u->bMasterInterface0, | ||
| 305 | buf, 1024, | ||
| 306 | RNDIS_CONTROL_TIMEOUT_MS); | ||
| 307 | if (likely(retval >= 8)) { | ||
| 308 | msg_len = le32_to_cpu(buf->msg_len); | ||
| 309 | request_id = (__force u32) buf->request_id; | ||
| 310 | if (likely(buf->msg_type == rsp)) { | ||
| 311 | if (likely(request_id == xid)) { | ||
| 312 | if (unlikely(rsp == RNDIS_MSG_RESET_C)) | ||
| 313 | return 0; | ||
| 314 | if (likely(RNDIS_STATUS_SUCCESS | ||
| 315 | == buf->status)) | ||
| 316 | return 0; | ||
| 317 | dev_dbg(&info->control->dev, | ||
| 318 | "rndis reply status %08x\n", | ||
| 319 | le32_to_cpu(buf->status)); | ||
| 320 | return -EL3RST; | ||
| 321 | } | ||
| 322 | dev_dbg(&info->control->dev, | ||
| 323 | "rndis reply id %d expected %d\n", | ||
| 324 | request_id, xid); | ||
| 325 | /* then likely retry */ | ||
| 326 | } else switch (buf->msg_type) { | ||
| 327 | case RNDIS_MSG_INDICATE: { /* fault */ | ||
| 328 | // struct rndis_indicate *msg = (void *)buf; | ||
| 329 | dev_info(&info->control->dev, | ||
| 330 | "rndis fault indication\n"); | ||
| 331 | } | ||
| 332 | break; | ||
| 333 | case RNDIS_MSG_KEEPALIVE: { /* ping */ | ||
| 334 | struct rndis_keepalive_c *msg = (void *)buf; | ||
| 335 | |||
| 336 | msg->msg_type = RNDIS_MSG_KEEPALIVE_C; | ||
| 337 | msg->msg_len = ccpu2(sizeof *msg); | ||
| 338 | msg->status = RNDIS_STATUS_SUCCESS; | ||
| 339 | retval = usb_control_msg(dev->udev, | ||
| 340 | usb_sndctrlpipe(dev->udev, 0), | ||
| 341 | USB_CDC_SEND_ENCAPSULATED_COMMAND, | ||
| 342 | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 343 | 0, info->u->bMasterInterface0, | ||
| 344 | msg, sizeof *msg, | ||
| 345 | RNDIS_CONTROL_TIMEOUT_MS); | ||
| 346 | if (unlikely(retval < 0)) | ||
| 347 | dev_dbg(&info->control->dev, | ||
| 348 | "rndis keepalive err %d\n", | ||
| 349 | retval); | ||
| 350 | } | ||
| 351 | break; | ||
| 352 | default: | ||
| 353 | dev_dbg(&info->control->dev, | ||
| 354 | "unexpected rndis msg %08x len %d\n", | ||
| 355 | le32_to_cpu(buf->msg_type), msg_len); | ||
| 356 | } | ||
| 357 | } else { | ||
| 358 | /* device probably issued a protocol stall; ignore */ | ||
| 359 | dev_dbg(&info->control->dev, | ||
| 360 | "rndis response error, code %d\n", retval); | ||
| 361 | } | ||
| 362 | msleep(2); | ||
| 363 | } | ||
| 364 | dev_dbg(&info->control->dev, "rndis response timeout\n"); | ||
| 365 | return -ETIMEDOUT; | ||
| 366 | } | ||
| 367 | |||
| 368 | static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 369 | { | ||
| 370 | int retval; | ||
| 371 | struct net_device *net = dev->net; | ||
| 372 | union { | ||
| 373 | void *buf; | ||
| 374 | struct rndis_msg_hdr *header; | ||
| 375 | struct rndis_init *init; | ||
| 376 | struct rndis_init_c *init_c; | ||
| 377 | struct rndis_query *get; | ||
| 378 | struct rndis_query_c *get_c; | ||
| 379 | struct rndis_set *set; | ||
| 380 | struct rndis_set_c *set_c; | ||
| 381 | } u; | ||
| 382 | u32 tmp; | ||
| 383 | |||
| 384 | /* we can't rely on i/o from stack working, or stack allocation */ | ||
| 385 | u.buf = kmalloc(1024, GFP_KERNEL); | ||
| 386 | if (!u.buf) | ||
| 387 | return -ENOMEM; | ||
| 388 | retval = usbnet_generic_cdc_bind(dev, intf); | ||
| 389 | if (retval < 0) | ||
| 390 | goto done; | ||
| 391 | |||
| 392 | net->hard_header_len += sizeof (struct rndis_data_hdr); | ||
| 393 | |||
| 394 | /* initialize; max transfer is 16KB at full speed */ | ||
| 395 | u.init->msg_type = RNDIS_MSG_INIT; | ||
| 396 | u.init->msg_len = ccpu2(sizeof *u.init); | ||
| 397 | u.init->major_version = ccpu2(1); | ||
| 398 | u.init->minor_version = ccpu2(0); | ||
| 399 | u.init->max_transfer_size = ccpu2(net->mtu + net->hard_header_len); | ||
| 400 | |||
| 401 | retval = rndis_command(dev, u.header); | ||
| 402 | if (unlikely(retval < 0)) { | ||
| 403 | /* it might not even be an RNDIS device!! */ | ||
| 404 | dev_err(&intf->dev, "RNDIS init failed, %d\n", retval); | ||
| 405 | fail: | ||
| 406 | usb_driver_release_interface(driver_of(intf), | ||
| 407 | ((struct cdc_state *)&(dev->data))->data); | ||
| 408 | goto done; | ||
| 409 | } | ||
| 410 | dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size); | ||
| 411 | /* REVISIT: peripheral "alignment" request is ignored ... */ | ||
| 412 | dev_dbg(&intf->dev, "hard mtu %u, align %d\n", dev->hard_mtu, | ||
| 413 | 1 << le32_to_cpu(u.init_c->packet_alignment)); | ||
| 414 | |||
| 415 | /* get designated host ethernet address */ | ||
| 416 | memset(u.get, 0, sizeof *u.get); | ||
| 417 | u.get->msg_type = RNDIS_MSG_QUERY; | ||
| 418 | u.get->msg_len = ccpu2(sizeof *u.get); | ||
| 419 | u.get->oid = OID_802_3_PERMANENT_ADDRESS; | ||
| 420 | |||
| 421 | retval = rndis_command(dev, u.header); | ||
| 422 | if (unlikely(retval < 0)) { | ||
| 423 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); | ||
| 424 | goto fail; | ||
| 425 | } | ||
| 426 | tmp = le32_to_cpu(u.get_c->offset); | ||
| 427 | if (unlikely((tmp + 8) > (1024 - ETH_ALEN) | ||
| 428 | || u.get_c->len != ccpu2(ETH_ALEN))) { | ||
| 429 | dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n", | ||
| 430 | tmp, le32_to_cpu(u.get_c->len)); | ||
| 431 | retval = -EDOM; | ||
| 432 | goto fail; | ||
| 433 | } | ||
| 434 | memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN); | ||
| 435 | |||
| 436 | /* set a nonzero filter to enable data transfers */ | ||
| 437 | memset(u.set, 0, sizeof *u.set); | ||
| 438 | u.set->msg_type = RNDIS_MSG_SET; | ||
| 439 | u.set->msg_len = ccpu2(4 + sizeof *u.set); | ||
| 440 | u.set->oid = OID_GEN_CURRENT_PACKET_FILTER; | ||
| 441 | u.set->len = ccpu2(4); | ||
| 442 | u.set->offset = ccpu2((sizeof *u.set) - 8); | ||
| 443 | *(__le32 *)(u.buf + sizeof *u.set) = ccpu2(DEFAULT_FILTER); | ||
| 444 | |||
| 445 | retval = rndis_command(dev, u.header); | ||
| 446 | if (unlikely(retval < 0)) { | ||
| 447 | dev_err(&intf->dev, "rndis set packet filter, %d\n", retval); | ||
| 448 | goto fail; | ||
| 449 | } | ||
| 450 | |||
| 451 | retval = 0; | ||
| 452 | done: | ||
| 453 | kfree(u.buf); | ||
| 454 | return retval; | ||
| 455 | } | ||
| 456 | |||
| 457 | static void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) | ||
| 458 | { | ||
| 459 | struct rndis_halt *halt; | ||
| 460 | |||
| 461 | /* try to clear any rndis state/activity (no i/o from stack!) */ | ||
| 462 | halt = kcalloc(1, sizeof *halt, SLAB_KERNEL); | ||
| 463 | if (halt) { | ||
| 464 | halt->msg_type = RNDIS_MSG_HALT; | ||
| 465 | halt->msg_len = ccpu2(sizeof *halt); | ||
| 466 | (void) rndis_command(dev, (void *)halt); | ||
| 467 | kfree(halt); | ||
| 468 | } | ||
| 469 | |||
| 470 | return usbnet_cdc_unbind(dev, intf); | ||
| 471 | } | ||
| 472 | |||
| 473 | /* | ||
| 474 | * DATA -- host must not write zlps | ||
| 475 | */ | ||
| 476 | static int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
| 477 | { | ||
| 478 | /* peripheral may have batched packets to us... */ | ||
| 479 | while (likely(skb->len)) { | ||
| 480 | struct rndis_data_hdr *hdr = (void *)skb->data; | ||
| 481 | struct sk_buff *skb2; | ||
| 482 | u32 msg_len, data_offset, data_len; | ||
| 483 | |||
| 484 | msg_len = le32_to_cpu(hdr->msg_len); | ||
| 485 | data_offset = le32_to_cpu(hdr->data_offset); | ||
| 486 | data_len = le32_to_cpu(hdr->data_len); | ||
| 487 | |||
| 488 | /* don't choke if we see oob, per-packet data, etc */ | ||
| 489 | if (unlikely(hdr->msg_type != RNDIS_MSG_PACKET | ||
| 490 | || skb->len < msg_len | ||
| 491 | || (data_offset + data_len + 8) > msg_len)) { | ||
| 492 | dev->stats.rx_frame_errors++; | ||
| 493 | devdbg(dev, "bad rndis message %d/%d/%d/%d, len %d", | ||
| 494 | le32_to_cpu(hdr->msg_type), | ||
| 495 | msg_len, data_offset, data_len, skb->len); | ||
| 496 | return 0; | ||
| 497 | } | ||
| 498 | skb_pull(skb, 8 + data_offset); | ||
| 499 | |||
| 500 | /* at most one packet left? */ | ||
| 501 | if (likely((data_len - skb->len) <= sizeof *hdr)) { | ||
| 502 | skb_trim(skb, data_len); | ||
| 503 | break; | ||
| 504 | } | ||
| 505 | |||
| 506 | /* try to return all the packets in the batch */ | ||
| 507 | skb2 = skb_clone(skb, GFP_ATOMIC); | ||
| 508 | if (unlikely(!skb2)) | ||
| 509 | break; | ||
| 510 | skb_pull(skb, msg_len - sizeof *hdr); | ||
| 511 | skb_trim(skb2, data_len); | ||
| 512 | usbnet_skb_return(dev, skb2); | ||
| 513 | } | ||
| 514 | |||
| 515 | /* caller will usbnet_skb_return the remaining packet */ | ||
| 516 | return 1; | ||
| 517 | } | ||
| 518 | |||
| 519 | static struct sk_buff * | ||
| 520 | rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags) | ||
| 521 | { | ||
| 522 | struct rndis_data_hdr *hdr; | ||
| 523 | struct sk_buff *skb2; | ||
| 524 | unsigned len = skb->len; | ||
| 525 | |||
| 526 | if (likely(!skb_cloned(skb))) { | ||
| 527 | int room = skb_headroom(skb); | ||
| 528 | |||
| 529 | /* enough head room as-is? */ | ||
| 530 | if (unlikely((sizeof *hdr) <= room)) | ||
| 531 | goto fill; | ||
| 532 | |||
| 533 | /* enough room, but needs to be readjusted? */ | ||
| 534 | room += skb_tailroom(skb); | ||
| 535 | if (likely((sizeof *hdr) <= room)) { | ||
| 536 | skb->data = memmove(skb->head + sizeof *hdr, | ||
| 537 | skb->data, len); | ||
| 538 | skb->tail = skb->data + len; | ||
| 539 | goto fill; | ||
| 540 | } | ||
| 541 | } | ||
| 542 | |||
| 543 | /* create a new skb, with the correct size (and tailpad) */ | ||
| 544 | skb2 = skb_copy_expand(skb, sizeof *hdr, 1, flags); | ||
| 545 | dev_kfree_skb_any(skb); | ||
| 546 | if (unlikely(!skb2)) | ||
| 547 | return skb2; | ||
| 548 | skb = skb2; | ||
| 549 | |||
| 550 | /* fill out the RNDIS header. we won't bother trying to batch | ||
| 551 | * packets; Linux minimizes wasted bandwidth through tx queues. | ||
| 552 | */ | ||
| 553 | fill: | ||
| 554 | hdr = (void *) __skb_push(skb, sizeof *hdr); | ||
| 555 | memset(hdr, 0, sizeof *hdr); | ||
| 556 | hdr->msg_type = RNDIS_MSG_PACKET; | ||
| 557 | hdr->msg_len = cpu_to_le32(skb->len); | ||
| 558 | hdr->data_offset = ccpu2(sizeof(*hdr) - 8); | ||
| 559 | hdr->data_len = cpu_to_le32(len); | ||
| 560 | |||
| 561 | /* FIXME make the last packet always be short ... */ | ||
| 562 | return skb; | ||
| 563 | } | ||
| 564 | |||
| 565 | |||
| 566 | static const struct driver_info rndis_info = { | ||
| 567 | .description = "RNDIS device", | ||
| 568 | .flags = FLAG_ETHER | FLAG_FRAMING_RN, | ||
| 569 | .bind = rndis_bind, | ||
| 570 | .unbind = rndis_unbind, | ||
| 571 | .status = rndis_status, | ||
| 572 | .rx_fixup = rndis_rx_fixup, | ||
| 573 | .tx_fixup = rndis_tx_fixup, | ||
| 574 | }; | ||
| 575 | |||
| 576 | #undef ccpu2 | ||
| 577 | |||
| 578 | |||
| 579 | /*-------------------------------------------------------------------------*/ | ||
| 580 | |||
| 581 | static const struct usb_device_id products [] = { | ||
| 582 | { | ||
| 583 | /* RNDIS is MSFT's un-official variant of CDC ACM */ | ||
| 584 | USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff), | ||
| 585 | .driver_info = (unsigned long) &rndis_info, | ||
| 586 | }, | ||
| 587 | { }, // END | ||
| 588 | }; | ||
| 589 | MODULE_DEVICE_TABLE(usb, products); | ||
| 590 | |||
| 591 | static struct usb_driver rndis_driver = { | ||
| 592 | .owner = THIS_MODULE, | ||
| 593 | .name = "rndis_host", | ||
| 594 | .id_table = products, | ||
| 595 | .probe = usbnet_probe, | ||
| 596 | .disconnect = usbnet_disconnect, | ||
| 597 | .suspend = usbnet_suspend, | ||
| 598 | .resume = usbnet_resume, | ||
| 599 | }; | ||
| 600 | |||
| 601 | static int __init rndis_init(void) | ||
| 602 | { | ||
| 603 | return usb_register(&rndis_driver); | ||
| 604 | } | ||
| 605 | module_init(rndis_init); | ||
| 606 | |||
| 607 | static void __exit rndis_exit(void) | ||
| 608 | { | ||
| 609 | usb_deregister(&rndis_driver); | ||
| 610 | } | ||
| 611 | module_exit(rndis_exit); | ||
| 612 | |||
| 613 | MODULE_AUTHOR("David Brownell"); | ||
| 614 | MODULE_DESCRIPTION("USB Host side RNDIS driver"); | ||
| 615 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c index 59ab40ebb394..c3d4e3589e30 100644 --- a/drivers/usb/net/rtl8150.c +++ b/drivers/usb/net/rtl8150.c | |||
| @@ -653,7 +653,6 @@ static void rtl8150_tx_timeout(struct net_device *netdev) | |||
| 653 | { | 653 | { |
| 654 | rtl8150_t *dev = netdev_priv(netdev); | 654 | rtl8150_t *dev = netdev_priv(netdev); |
| 655 | warn("%s: Tx timeout.", netdev->name); | 655 | warn("%s: Tx timeout.", netdev->name); |
| 656 | dev->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 657 | usb_unlink_urb(dev->tx_urb); | 656 | usb_unlink_urb(dev->tx_urb); |
| 658 | dev->stats.tx_errors++; | 657 | dev->stats.tx_errors++; |
| 659 | } | 658 | } |
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index a2f67245f6da..6c460918d54f 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * USB Networking Links | 2 | * USB Network driver infrastructure |
| 3 | * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net> | 3 | * Copyright (C) 2000-2005 by David Brownell |
| 4 | * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz> | ||
| 5 | * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> | 4 | * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> |
| 6 | * Copyright (C) 2005 Phil Chang <pchang23@sbcglobal.net> | ||
| 7 | * Copyright (c) 2002-2003 TiVo Inc. | ||
| 8 | * | 5 | * |
| 9 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
| 10 | * it under the terms of the GNU General Public License as published by | 7 | * it under the terms of the GNU General Public License as published by |
| @@ -23,95 +20,15 @@ | |||
| 23 | 20 | ||
| 24 | /* | 21 | /* |
| 25 | * This is a generic "USB networking" framework that works with several | 22 | * This is a generic "USB networking" framework that works with several |
| 26 | * kinds of full and high speed networking devices: | 23 | * kinds of full and high speed networking devices: host-to-host cables, |
| 27 | * | 24 | * smart usb peripherals, and actual Ethernet adapters. |
| 28 | * + USB host-to-host "network cables", used for IP-over-USB links. | 25 | * |
| 29 | * These are often used for Laplink style connectivity products. | 26 | * These devices usually differ in terms of control protocols (if they |
| 30 | * - AnchorChip 2720 | 27 | * even have one!) and sometimes they define new framing to wrap or batch |
| 31 | * - Belkin, eTEK (interops with Win32 drivers) | 28 | * Ethernet packets. Otherwise, they talk to USB pretty much the same, |
| 32 | * - GeneSys GL620USB-A | 29 | * so interface (un)binding, endpoint I/O queues, fault handling, and other |
| 33 | * - NetChip 1080 (interoperates with NetChip Win32 drivers) | 30 | * issues can usefully be addressed by this framework. |
| 34 | * - Prolific PL-2301/2302 (replaces "plusb" driver) | 31 | */ |
| 35 | * - KC Technology KC2190 | ||
| 36 | * | ||
| 37 | * + Smart USB devices can support such links directly, using Internet | ||
| 38 | * standard protocols instead of proprietary host-to-device links. | ||
| 39 | * - Linux PDAs like iPaq, Yopy, and Zaurus | ||
| 40 | * - The BLOB boot loader (for diskless booting) | ||
| 41 | * - Linux "gadgets", perhaps using PXA-2xx or Net2280 controllers | ||
| 42 | * - Devices using EPSON's sample USB firmware | ||
| 43 | * - CDC-Ethernet class devices, such as many cable modems | ||
| 44 | * | ||
| 45 | * + Adapters to networks such as Ethernet. | ||
| 46 | * - AX8817X based USB 2.0 products | ||
| 47 | * | ||
| 48 | * Links to these devices can be bridged using Linux Ethernet bridging. | ||
| 49 | * With minor exceptions, these all use similar USB framing for network | ||
| 50 | * traffic, but need different protocols for control traffic. | ||
| 51 | * | ||
| 52 | * USB devices can implement their side of this protocol at the cost | ||
| 53 | * of two bulk endpoints; it's not restricted to "cable" applications. | ||
| 54 | * See the SA1110, Zaurus, or EPSON device/client support in this driver; | ||
| 55 | * slave/target drivers such as "usb-eth" (on most SA-1100 PDAs) or | ||
| 56 | * "g_ether" (in the Linux "gadget" framework) implement that behavior | ||
| 57 | * within devices. | ||
| 58 | * | ||
| 59 | * | ||
| 60 | * CHANGELOG: | ||
| 61 | * | ||
| 62 | * 13-sep-2000 experimental, new | ||
| 63 | * 10-oct-2000 usb_device_id table created. | ||
| 64 | * 28-oct-2000 misc fixes; mostly, discard more TTL-mangled rx packets. | ||
| 65 | * 01-nov-2000 usb_device_id table and probing api update by | ||
| 66 | * Adam J. Richter <adam@yggdrasil.com>. | ||
| 67 | * 18-dec-2000 (db) tx watchdog, "net1080" renaming to "usbnet", device_info | ||
| 68 | * and prolific support, isolate net1080-specific bits, cleanup. | ||
| 69 | * fix unlink_urbs oops in D3 PM resume code path. | ||
| 70 | * | ||
| 71 | * 02-feb-2001 (db) fix tx skb sharing, packet length, match_flags, ... | ||
| 72 | * 08-feb-2001 stubbed in "linuxdev", maybe the SA-1100 folk can use it; | ||
| 73 | * AnchorChips 2720 support (from spec) for testing; | ||
| 74 | * fix bit-ordering problem with ethernet multicast addr | ||
| 75 | * 19-feb-2001 Support for clearing halt conditions. SA1100 UDC support | ||
| 76 | * updates. Oleg Drokin (green@iXcelerator.com) | ||
| 77 | * 25-mar-2001 More SA-1100 updates, including workaround for ip problem | ||
| 78 | * expecting cleared skb->cb and framing change to match latest | ||
| 79 | * handhelds.org version (Oleg). Enable device IDs from the | ||
| 80 | * Win32 Belkin driver; other cleanups (db). | ||
| 81 | * 16-jul-2001 Bugfixes for uhci oops-on-unplug, Belkin support, various | ||
| 82 | * cleanups for problems not yet seen in the field. (db) | ||
| 83 | * 17-oct-2001 Handle "Advance USBNET" product, like Belkin/eTEK devices, | ||
| 84 | * from Ioannis Mavroukakis <i.mavroukakis@btinternet.com>; | ||
| 85 | * rx unlinks somehow weren't async; minor cleanup. | ||
| 86 | * 03-nov-2001 Merged GeneSys driver; original code from Jiun-Jie Huang | ||
| 87 | * <huangjj@genesyslogic.com.tw>, updated by Stanislav Brabec | ||
| 88 | * <utx@penguin.cz>. Made framing options (NetChip/GeneSys) | ||
| 89 | * tie mostly to (sub)driver info. Workaround some PL-2302 | ||
| 90 | * chips that seem to reject SET_INTERFACE requests. | ||
| 91 | * | ||
| 92 | * 06-apr-2002 Added ethtool support, based on a patch from Brad Hards. | ||
| 93 | * Level of diagnostics is more configurable; they use device | ||
| 94 | * location (usb_device->devpath) instead of address (2.5). | ||
| 95 | * For tx_fixup, memflags can't be NOIO. | ||
| 96 | * 07-may-2002 Generalize/cleanup keventd support, handling rx stalls (mostly | ||
| 97 | * for USB 2.0 TTs) and memory shortages (potential) too. (db) | ||
| 98 | * Use "locally assigned" IEEE802 address space. (Brad Hards) | ||
| 99 | * 18-oct-2002 Support for Zaurus (Pavel Machek), related cleanup (db). | ||
| 100 | * 14-dec-2002 Remove Zaurus-private crc32 code (Pavel); 2.5 oops fix, | ||
| 101 | * cleanups and stubbed PXA-250 support (db), fix for framing | ||
| 102 | * issues on Z, net1080, and gl620a (Toby Milne) | ||
| 103 | * | ||
| 104 | * 31-mar-2003 Use endpoint descriptors: high speed support, simpler sa1100 | ||
| 105 | * vs pxa25x, and CDC Ethernet. Throttle down log floods on | ||
| 106 | * disconnect; other cleanups. (db) Flush net1080 fifos | ||
| 107 | * after several sequential framing errors. (Johannes Erdfelt) | ||
| 108 | * 22-aug-2003 AX8817X support (Dave Hollis). | ||
| 109 | * 14-jun-2004 Trivial patch for AX8817X based Buffalo LUA-U2-KTX in Japan | ||
| 110 | * (Neil Bortnak) | ||
| 111 | * 03-nov-2004 Trivial patch for KC2190 (KC-190) chip. (Jonathan McDowell) | ||
| 112 | * | ||
| 113 | * 01-feb-2005 AX88772 support (Phil Chang & Dave Hollis) | ||
| 114 | *-------------------------------------------------------------------------*/ | ||
| 115 | 32 | ||
| 116 | // #define DEBUG // error path messages, extra info | 33 | // #define DEBUG // error path messages, extra info |
| 117 | // #define VERBOSE // more; success messages | 34 | // #define VERBOSE // more; success messages |
| @@ -121,24 +38,18 @@ | |||
| 121 | # define DEBUG | 38 | # define DEBUG |
| 122 | #endif | 39 | #endif |
| 123 | #include <linux/module.h> | 40 | #include <linux/module.h> |
| 124 | #include <linux/kmod.h> | ||
| 125 | #include <linux/sched.h> | 41 | #include <linux/sched.h> |
| 126 | #include <linux/init.h> | 42 | #include <linux/init.h> |
| 127 | #include <linux/netdevice.h> | 43 | #include <linux/netdevice.h> |
| 128 | #include <linux/etherdevice.h> | 44 | #include <linux/etherdevice.h> |
| 129 | #include <linux/random.h> | ||
| 130 | #include <linux/ethtool.h> | 45 | #include <linux/ethtool.h> |
| 131 | #include <linux/workqueue.h> | 46 | #include <linux/workqueue.h> |
| 132 | #include <linux/mii.h> | 47 | #include <linux/mii.h> |
| 133 | #include <asm/uaccess.h> | ||
| 134 | #include <asm/unaligned.h> | ||
| 135 | #include <linux/usb.h> | 48 | #include <linux/usb.h> |
| 136 | #include <asm/io.h> | ||
| 137 | #include <asm/scatterlist.h> | ||
| 138 | #include <linux/mm.h> | ||
| 139 | #include <linux/dma-mapping.h> | ||
| 140 | 49 | ||
| 141 | #define DRIVER_VERSION "03-Nov-2004" | 50 | #include "usbnet.h" |
| 51 | |||
| 52 | #define DRIVER_VERSION "22-Aug-2005" | ||
| 142 | 53 | ||
| 143 | 54 | ||
| 144 | /*-------------------------------------------------------------------------*/ | 55 | /*-------------------------------------------------------------------------*/ |
| @@ -149,15 +60,14 @@ | |||
| 149 | * One maximum size Ethernet packet takes twenty four of them. | 60 | * One maximum size Ethernet packet takes twenty four of them. |
| 150 | * For high speed, each frame comfortably fits almost 36 max size | 61 | * For high speed, each frame comfortably fits almost 36 max size |
| 151 | * Ethernet packets (so queues should be bigger). | 62 | * Ethernet packets (so queues should be bigger). |
| 63 | * | ||
| 64 | * REVISIT qlens should be members of 'struct usbnet'; the goal is to | ||
| 65 | * let the USB host controller be busy for 5msec or more before an irq | ||
| 66 | * is required, under load. Jumbograms change the equation. | ||
| 152 | */ | 67 | */ |
| 153 | #define RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) | 68 | #define RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) |
| 154 | #define TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) | 69 | #define TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? 60 : 4) |
| 155 | 70 | ||
| 156 | // packets are always ethernet inside | ||
| 157 | // ... except they can be bigger (limit of 64K with NetChip framing) | ||
| 158 | #define MIN_PACKET sizeof(struct ethhdr) | ||
| 159 | #define MAX_PACKET 32768 | ||
| 160 | |||
| 161 | // reawaken network queue this soon after stopping; else watchdog barks | 71 | // reawaken network queue this soon after stopping; else watchdog barks |
| 162 | #define TX_TIMEOUT_JIFFIES (5*HZ) | 72 | #define TX_TIMEOUT_JIFFIES (5*HZ) |
| 163 | 73 | ||
| @@ -165,9 +75,6 @@ | |||
| 165 | // us (it polls at HZ/4 usually) before we report too many false errors. | 75 | // us (it polls at HZ/4 usually) before we report too many false errors. |
| 166 | #define THROTTLE_JIFFIES (HZ/8) | 76 | #define THROTTLE_JIFFIES (HZ/8) |
| 167 | 77 | ||
| 168 | // for vendor-specific control operations | ||
| 169 | #define CONTROL_TIMEOUT_MS 500 | ||
| 170 | |||
| 171 | // between wakeups | 78 | // between wakeups |
| 172 | #define UNLINK_TIMEOUT_MS 3 | 79 | #define UNLINK_TIMEOUT_MS 3 |
| 173 | 80 | ||
| @@ -176,109 +83,6 @@ | |||
| 176 | // randomly generated ethernet address | 83 | // randomly generated ethernet address |
| 177 | static u8 node_id [ETH_ALEN]; | 84 | static u8 node_id [ETH_ALEN]; |
| 178 | 85 | ||
| 179 | // state we keep for each device we handle | ||
| 180 | struct usbnet { | ||
| 181 | // housekeeping | ||
| 182 | struct usb_device *udev; | ||
| 183 | struct driver_info *driver_info; | ||
| 184 | wait_queue_head_t *wait; | ||
| 185 | |||
| 186 | // i/o info: pipes etc | ||
| 187 | unsigned in, out; | ||
| 188 | struct usb_host_endpoint *status; | ||
| 189 | unsigned maxpacket; | ||
| 190 | struct timer_list delay; | ||
| 191 | |||
| 192 | // protocol/interface state | ||
| 193 | struct net_device *net; | ||
| 194 | struct net_device_stats stats; | ||
| 195 | int msg_enable; | ||
| 196 | unsigned long data [5]; | ||
| 197 | |||
| 198 | struct mii_if_info mii; | ||
| 199 | |||
| 200 | // various kinds of pending driver work | ||
| 201 | struct sk_buff_head rxq; | ||
| 202 | struct sk_buff_head txq; | ||
| 203 | struct sk_buff_head done; | ||
| 204 | struct urb *interrupt; | ||
| 205 | struct tasklet_struct bh; | ||
| 206 | |||
| 207 | struct work_struct kevent; | ||
| 208 | unsigned long flags; | ||
| 209 | # define EVENT_TX_HALT 0 | ||
| 210 | # define EVENT_RX_HALT 1 | ||
| 211 | # define EVENT_RX_MEMORY 2 | ||
| 212 | # define EVENT_STS_SPLIT 3 | ||
| 213 | # define EVENT_LINK_RESET 4 | ||
| 214 | }; | ||
| 215 | |||
| 216 | // device-specific info used by the driver | ||
| 217 | struct driver_info { | ||
| 218 | char *description; | ||
| 219 | |||
| 220 | int flags; | ||
| 221 | /* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */ | ||
| 222 | #define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */ | ||
| 223 | #define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ | ||
| 224 | #define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ | ||
| 225 | #define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */ | ||
| 226 | |||
| 227 | #define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ | ||
| 228 | #define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ | ||
| 229 | |||
| 230 | #define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */ | ||
| 231 | |||
| 232 | /* init device ... can sleep, or cause probe() failure */ | ||
| 233 | int (*bind)(struct usbnet *, struct usb_interface *); | ||
| 234 | |||
| 235 | /* cleanup device ... can sleep, but can't fail */ | ||
| 236 | void (*unbind)(struct usbnet *, struct usb_interface *); | ||
| 237 | |||
| 238 | /* reset device ... can sleep */ | ||
| 239 | int (*reset)(struct usbnet *); | ||
| 240 | |||
| 241 | /* see if peer is connected ... can sleep */ | ||
| 242 | int (*check_connect)(struct usbnet *); | ||
| 243 | |||
| 244 | /* for status polling */ | ||
| 245 | void (*status)(struct usbnet *, struct urb *); | ||
| 246 | |||
| 247 | /* link reset handling, called from defer_kevent */ | ||
| 248 | int (*link_reset)(struct usbnet *); | ||
| 249 | |||
| 250 | /* fixup rx packet (strip framing) */ | ||
| 251 | int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb); | ||
| 252 | |||
| 253 | /* fixup tx packet (add framing) */ | ||
| 254 | struct sk_buff *(*tx_fixup)(struct usbnet *dev, | ||
| 255 | struct sk_buff *skb, int flags); | ||
| 256 | |||
| 257 | // FIXME -- also an interrupt mechanism | ||
| 258 | // useful for at least PL2301/2302 and GL620USB-A | ||
| 259 | // and CDC use them to report 'is it connected' changes | ||
| 260 | |||
| 261 | /* for new devices, use the descriptor-reading code instead */ | ||
| 262 | int in; /* rx endpoint */ | ||
| 263 | int out; /* tx endpoint */ | ||
| 264 | |||
| 265 | unsigned long data; /* Misc driver specific data */ | ||
| 266 | }; | ||
| 267 | |||
| 268 | // we record the state for each of our queued skbs | ||
| 269 | enum skb_state { | ||
| 270 | illegal = 0, | ||
| 271 | tx_start, tx_done, | ||
| 272 | rx_start, rx_done, rx_cleanup | ||
| 273 | }; | ||
| 274 | |||
| 275 | struct skb_data { // skb->cb is one of these | ||
| 276 | struct urb *urb; | ||
| 277 | struct usbnet *dev; | ||
| 278 | enum skb_state state; | ||
| 279 | size_t length; | ||
| 280 | }; | ||
| 281 | |||
| 282 | static const char driver_name [] = "usbnet"; | 86 | static const char driver_name [] = "usbnet"; |
| 283 | 87 | ||
| 284 | /* use ethtool to change the level for any given device */ | 88 | /* use ethtool to change the level for any given device */ |
| @@ -286,39 +90,10 @@ static int msg_level = -1; | |||
| 286 | module_param (msg_level, int, 0); | 90 | module_param (msg_level, int, 0); |
| 287 | MODULE_PARM_DESC (msg_level, "Override default message level"); | 91 | MODULE_PARM_DESC (msg_level, "Override default message level"); |
| 288 | 92 | ||
| 289 | |||
| 290 | #ifdef DEBUG | ||
| 291 | #define devdbg(usbnet, fmt, arg...) \ | ||
| 292 | printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 293 | #else | ||
| 294 | #define devdbg(usbnet, fmt, arg...) do {} while(0) | ||
| 295 | #endif | ||
| 296 | |||
| 297 | #define deverr(usbnet, fmt, arg...) \ | ||
| 298 | printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 299 | #define devwarn(usbnet, fmt, arg...) \ | ||
| 300 | printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 301 | |||
| 302 | #define devinfo(usbnet, fmt, arg...) \ | ||
| 303 | printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \ | ||
| 304 | |||
| 305 | /*-------------------------------------------------------------------------*/ | 93 | /*-------------------------------------------------------------------------*/ |
| 306 | 94 | ||
| 307 | static void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *); | ||
| 308 | static u32 usbnet_get_link (struct net_device *); | ||
| 309 | static u32 usbnet_get_msglevel (struct net_device *); | ||
| 310 | static void usbnet_set_msglevel (struct net_device *, u32); | ||
| 311 | static void defer_kevent (struct usbnet *, int); | ||
| 312 | |||
| 313 | /* mostly for PDA style devices, which are always connected if present */ | ||
| 314 | static int always_connected (struct usbnet *dev) | ||
| 315 | { | ||
| 316 | return 0; | ||
| 317 | } | ||
| 318 | |||
| 319 | /* handles CDC Ethernet and many other network "bulk data" interfaces */ | 95 | /* handles CDC Ethernet and many other network "bulk data" interfaces */ |
| 320 | static int | 96 | int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) |
| 321 | get_endpoints (struct usbnet *dev, struct usb_interface *intf) | ||
| 322 | { | 97 | { |
| 323 | int tmp; | 98 | int tmp; |
| 324 | struct usb_host_interface *alt = NULL; | 99 | struct usb_host_interface *alt = NULL; |
| @@ -382,6 +157,7 @@ get_endpoints (struct usbnet *dev, struct usb_interface *intf) | |||
| 382 | dev->status = status; | 157 | dev->status = status; |
| 383 | return 0; | 158 | return 0; |
| 384 | } | 159 | } |
| 160 | EXPORT_SYMBOL_GPL(usbnet_get_endpoints); | ||
| 385 | 161 | ||
| 386 | static void intr_complete (struct urb *urb, struct pt_regs *regs); | 162 | static void intr_complete (struct urb *urb, struct pt_regs *regs); |
| 387 | 163 | ||
| @@ -421,7 +197,11 @@ static int init_status (struct usbnet *dev, struct usb_interface *intf) | |||
| 421 | return 0; | 197 | return 0; |
| 422 | } | 198 | } |
| 423 | 199 | ||
| 424 | static void skb_return (struct usbnet *dev, struct sk_buff *skb) | 200 | /* Passes this packet up the stack, updating its accounting. |
| 201 | * Some link protocols batch packets, so their rx_fixup paths | ||
| 202 | * can return clones as well as just modify the original skb. | ||
| 203 | */ | ||
| 204 | void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb) | ||
| 425 | { | 205 | { |
| 426 | int status; | 206 | int status; |
| 427 | 207 | ||
| @@ -438,2425 +218,7 @@ static void skb_return (struct usbnet *dev, struct sk_buff *skb) | |||
| 438 | if (status != NET_RX_SUCCESS && netif_msg_rx_err (dev)) | 218 | if (status != NET_RX_SUCCESS && netif_msg_rx_err (dev)) |
| 439 | devdbg (dev, "netif_rx status %d", status); | 219 | devdbg (dev, "netif_rx status %d", status); |
| 440 | } | 220 | } |
| 441 | 221 | EXPORT_SYMBOL_GPL(usbnet_skb_return); | |
| 442 | |||
| 443 | #ifdef CONFIG_USB_ALI_M5632 | ||
| 444 | #define HAVE_HARDWARE | ||
| 445 | |||
| 446 | /*------------------------------------------------------------------------- | ||
| 447 | * | ||
| 448 | * ALi M5632 driver ... does high speed | ||
| 449 | * | ||
| 450 | *-------------------------------------------------------------------------*/ | ||
| 451 | |||
| 452 | static const struct driver_info ali_m5632_info = { | ||
| 453 | .description = "ALi M5632", | ||
| 454 | }; | ||
| 455 | |||
| 456 | |||
| 457 | #endif | ||
| 458 | |||
| 459 | |||
| 460 | #ifdef CONFIG_USB_AN2720 | ||
| 461 | #define HAVE_HARDWARE | ||
| 462 | |||
| 463 | /*------------------------------------------------------------------------- | ||
| 464 | * | ||
| 465 | * AnchorChips 2720 driver ... http://www.cypress.com | ||
| 466 | * | ||
| 467 | * This doesn't seem to have a way to detect whether the peer is | ||
| 468 | * connected, or need any reset handshaking. It's got pretty big | ||
| 469 | * internal buffers (handles most of a frame's worth of data). | ||
| 470 | * Chip data sheets don't describe any vendor control messages. | ||
| 471 | * | ||
| 472 | *-------------------------------------------------------------------------*/ | ||
| 473 | |||
| 474 | static const struct driver_info an2720_info = { | ||
| 475 | .description = "AnchorChips/Cypress 2720", | ||
| 476 | // no reset available! | ||
| 477 | // no check_connect available! | ||
| 478 | |||
| 479 | .in = 2, .out = 2, // direction distinguishes these | ||
| 480 | }; | ||
| 481 | |||
| 482 | #endif /* CONFIG_USB_AN2720 */ | ||
| 483 | |||
| 484 | |||
| 485 | #ifdef CONFIG_USB_AX8817X | ||
| 486 | /* ASIX AX8817X based USB 2.0 Ethernet Devices */ | ||
| 487 | |||
| 488 | #define HAVE_HARDWARE | ||
| 489 | #define NEED_MII | ||
| 490 | |||
| 491 | #include <linux/crc32.h> | ||
| 492 | |||
| 493 | #define AX_CMD_SET_SW_MII 0x06 | ||
| 494 | #define AX_CMD_READ_MII_REG 0x07 | ||
| 495 | #define AX_CMD_WRITE_MII_REG 0x08 | ||
| 496 | #define AX_CMD_SET_HW_MII 0x0a | ||
| 497 | #define AX_CMD_READ_EEPROM 0x0b | ||
| 498 | #define AX_CMD_WRITE_EEPROM 0x0c | ||
| 499 | #define AX_CMD_WRITE_ENABLE 0x0d | ||
| 500 | #define AX_CMD_WRITE_DISABLE 0x0e | ||
| 501 | #define AX_CMD_WRITE_RX_CTL 0x10 | ||
| 502 | #define AX_CMD_READ_IPG012 0x11 | ||
| 503 | #define AX_CMD_WRITE_IPG0 0x12 | ||
| 504 | #define AX_CMD_WRITE_IPG1 0x13 | ||
| 505 | #define AX_CMD_WRITE_IPG2 0x14 | ||
| 506 | #define AX_CMD_WRITE_MULTI_FILTER 0x16 | ||
| 507 | #define AX_CMD_READ_NODE_ID 0x17 | ||
| 508 | #define AX_CMD_READ_PHY_ID 0x19 | ||
| 509 | #define AX_CMD_READ_MEDIUM_STATUS 0x1a | ||
| 510 | #define AX_CMD_WRITE_MEDIUM_MODE 0x1b | ||
| 511 | #define AX_CMD_READ_MONITOR_MODE 0x1c | ||
| 512 | #define AX_CMD_WRITE_MONITOR_MODE 0x1d | ||
| 513 | #define AX_CMD_WRITE_GPIOS 0x1f | ||
| 514 | #define AX_CMD_SW_RESET 0x20 | ||
| 515 | #define AX_CMD_SW_PHY_STATUS 0x21 | ||
| 516 | #define AX_CMD_SW_PHY_SELECT 0x22 | ||
| 517 | #define AX88772_CMD_READ_NODE_ID 0x13 | ||
| 518 | |||
| 519 | #define AX_MONITOR_MODE 0x01 | ||
| 520 | #define AX_MONITOR_LINK 0x02 | ||
| 521 | #define AX_MONITOR_MAGIC 0x04 | ||
| 522 | #define AX_MONITOR_HSFS 0x10 | ||
| 523 | |||
| 524 | /* AX88172 Medium Status Register values */ | ||
| 525 | #define AX_MEDIUM_FULL_DUPLEX 0x02 | ||
| 526 | #define AX_MEDIUM_TX_ABORT_ALLOW 0x04 | ||
| 527 | #define AX_MEDIUM_FLOW_CONTROL_EN 0x10 | ||
| 528 | |||
| 529 | #define AX_MCAST_FILTER_SIZE 8 | ||
| 530 | #define AX_MAX_MCAST 64 | ||
| 531 | |||
| 532 | #define AX_EEPROM_LEN 0x40 | ||
| 533 | |||
| 534 | #define AX_SWRESET_CLEAR 0x00 | ||
| 535 | #define AX_SWRESET_RR 0x01 | ||
| 536 | #define AX_SWRESET_RT 0x02 | ||
| 537 | #define AX_SWRESET_PRTE 0x04 | ||
| 538 | #define AX_SWRESET_PRL 0x08 | ||
| 539 | #define AX_SWRESET_BZ 0x10 | ||
| 540 | #define AX_SWRESET_IPRL 0x20 | ||
| 541 | #define AX_SWRESET_IPPD 0x40 | ||
| 542 | |||
| 543 | #define AX88772_IPG0_DEFAULT 0x15 | ||
| 544 | #define AX88772_IPG1_DEFAULT 0x0c | ||
| 545 | #define AX88772_IPG2_DEFAULT 0x12 | ||
| 546 | |||
| 547 | #define AX88772_MEDIUM_FULL_DUPLEX 0x0002 | ||
| 548 | #define AX88772_MEDIUM_RESERVED 0x0004 | ||
| 549 | #define AX88772_MEDIUM_RX_FC_ENABLE 0x0010 | ||
| 550 | #define AX88772_MEDIUM_TX_FC_ENABLE 0x0020 | ||
| 551 | #define AX88772_MEDIUM_PAUSE_FORMAT 0x0080 | ||
| 552 | #define AX88772_MEDIUM_RX_ENABLE 0x0100 | ||
| 553 | #define AX88772_MEDIUM_100MB 0x0200 | ||
| 554 | #define AX88772_MEDIUM_DEFAULT \ | ||
| 555 | (AX88772_MEDIUM_FULL_DUPLEX | AX88772_MEDIUM_RX_FC_ENABLE | \ | ||
| 556 | AX88772_MEDIUM_TX_FC_ENABLE | AX88772_MEDIUM_100MB | \ | ||
| 557 | AX88772_MEDIUM_RESERVED | AX88772_MEDIUM_RX_ENABLE ) | ||
| 558 | |||
| 559 | #define AX_EEPROM_MAGIC 0xdeadbeef | ||
| 560 | |||
| 561 | /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ | ||
| 562 | struct ax8817x_data { | ||
| 563 | u8 multi_filter[AX_MCAST_FILTER_SIZE]; | ||
| 564 | }; | ||
| 565 | |||
| 566 | struct ax88172_int_data { | ||
| 567 | u16 res1; | ||
| 568 | u8 link; | ||
| 569 | u16 res2; | ||
| 570 | u8 status; | ||
| 571 | u16 res3; | ||
| 572 | } __attribute__ ((packed)); | ||
| 573 | |||
| 574 | static int ax8817x_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 575 | u16 size, void *data) | ||
| 576 | { | ||
| 577 | return usb_control_msg( | ||
| 578 | dev->udev, | ||
| 579 | usb_rcvctrlpipe(dev->udev, 0), | ||
| 580 | cmd, | ||
| 581 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 582 | value, | ||
| 583 | index, | ||
| 584 | data, | ||
| 585 | size, | ||
| 586 | CONTROL_TIMEOUT_MS); | ||
| 587 | } | ||
| 588 | |||
| 589 | static int ax8817x_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 590 | u16 size, void *data) | ||
| 591 | { | ||
| 592 | return usb_control_msg( | ||
| 593 | dev->udev, | ||
| 594 | usb_sndctrlpipe(dev->udev, 0), | ||
| 595 | cmd, | ||
| 596 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 597 | value, | ||
| 598 | index, | ||
| 599 | data, | ||
| 600 | size, | ||
| 601 | CONTROL_TIMEOUT_MS); | ||
| 602 | } | ||
| 603 | |||
| 604 | static void ax8817x_async_cmd_callback(struct urb *urb, struct pt_regs *regs) | ||
| 605 | { | ||
| 606 | struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; | ||
| 607 | |||
| 608 | if (urb->status < 0) | ||
| 609 | printk(KERN_DEBUG "ax8817x_async_cmd_callback() failed with %d", | ||
| 610 | urb->status); | ||
| 611 | |||
| 612 | kfree(req); | ||
| 613 | usb_free_urb(urb); | ||
| 614 | } | ||
| 615 | |||
| 616 | static void ax8817x_status(struct usbnet *dev, struct urb *urb) | ||
| 617 | { | ||
| 618 | struct ax88172_int_data *event; | ||
| 619 | int link; | ||
| 620 | |||
| 621 | if (urb->actual_length < 8) | ||
| 622 | return; | ||
| 623 | |||
| 624 | event = urb->transfer_buffer; | ||
| 625 | link = event->link & 0x01; | ||
| 626 | if (netif_carrier_ok(dev->net) != link) { | ||
| 627 | if (link) { | ||
| 628 | netif_carrier_on(dev->net); | ||
| 629 | defer_kevent (dev, EVENT_LINK_RESET ); | ||
| 630 | } else | ||
| 631 | netif_carrier_off(dev->net); | ||
| 632 | devdbg(dev, "ax8817x - Link Status is: %d", link); | ||
| 633 | } | ||
| 634 | } | ||
| 635 | |||
| 636 | static void ax8817x_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | ||
| 637 | u16 size, void *data) | ||
| 638 | { | ||
| 639 | struct usb_ctrlrequest *req; | ||
| 640 | int status; | ||
| 641 | struct urb *urb; | ||
| 642 | |||
| 643 | if ((urb = usb_alloc_urb(0, GFP_ATOMIC)) == NULL) { | ||
| 644 | devdbg(dev, "Error allocating URB in write_cmd_async!"); | ||
| 645 | return; | ||
| 646 | } | ||
| 647 | |||
| 648 | if ((req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC)) == NULL) { | ||
| 649 | deverr(dev, "Failed to allocate memory for control request"); | ||
| 650 | usb_free_urb(urb); | ||
| 651 | return; | ||
| 652 | } | ||
| 653 | |||
| 654 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | ||
| 655 | req->bRequest = cmd; | ||
| 656 | req->wValue = cpu_to_le16(value); | ||
| 657 | req->wIndex = cpu_to_le16(index); | ||
| 658 | req->wLength = cpu_to_le16(size); | ||
| 659 | |||
| 660 | usb_fill_control_urb(urb, dev->udev, | ||
| 661 | usb_sndctrlpipe(dev->udev, 0), | ||
| 662 | (void *)req, data, size, | ||
| 663 | ax8817x_async_cmd_callback, req); | ||
| 664 | |||
| 665 | if((status = usb_submit_urb(urb, GFP_ATOMIC)) < 0) { | ||
| 666 | deverr(dev, "Error submitting the control message: status=%d", status); | ||
| 667 | kfree(req); | ||
| 668 | usb_free_urb(urb); | ||
| 669 | } | ||
| 670 | } | ||
| 671 | |||
| 672 | static void ax8817x_set_multicast(struct net_device *net) | ||
| 673 | { | ||
| 674 | struct usbnet *dev = netdev_priv(net); | ||
| 675 | struct ax8817x_data *data = (struct ax8817x_data *)&dev->data; | ||
| 676 | u8 rx_ctl = 0x8c; | ||
| 677 | |||
| 678 | if (net->flags & IFF_PROMISC) { | ||
| 679 | rx_ctl |= 0x01; | ||
| 680 | } else if (net->flags & IFF_ALLMULTI | ||
| 681 | || net->mc_count > AX_MAX_MCAST) { | ||
| 682 | rx_ctl |= 0x02; | ||
| 683 | } else if (net->mc_count == 0) { | ||
| 684 | /* just broadcast and directed */ | ||
| 685 | } else { | ||
| 686 | /* We use the 20 byte dev->data | ||
| 687 | * for our 8 byte filter buffer | ||
| 688 | * to avoid allocating memory that | ||
| 689 | * is tricky to free later */ | ||
| 690 | struct dev_mc_list *mc_list = net->mc_list; | ||
| 691 | u32 crc_bits; | ||
| 692 | int i; | ||
| 693 | |||
| 694 | memset(data->multi_filter, 0, AX_MCAST_FILTER_SIZE); | ||
| 695 | |||
| 696 | /* Build the multicast hash filter. */ | ||
| 697 | for (i = 0; i < net->mc_count; i++) { | ||
| 698 | crc_bits = | ||
| 699 | ether_crc(ETH_ALEN, | ||
| 700 | mc_list->dmi_addr) >> 26; | ||
| 701 | data->multi_filter[crc_bits >> 3] |= | ||
| 702 | 1 << (crc_bits & 7); | ||
| 703 | mc_list = mc_list->next; | ||
| 704 | } | ||
| 705 | |||
| 706 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_MULTI_FILTER, 0, 0, | ||
| 707 | AX_MCAST_FILTER_SIZE, data->multi_filter); | ||
| 708 | |||
| 709 | rx_ctl |= 0x10; | ||
| 710 | } | ||
| 711 | |||
| 712 | ax8817x_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL); | ||
| 713 | } | ||
| 714 | |||
| 715 | static int ax8817x_mdio_read(struct net_device *netdev, int phy_id, int loc) | ||
| 716 | { | ||
| 717 | struct usbnet *dev = netdev_priv(netdev); | ||
| 718 | u16 res; | ||
| 719 | u8 buf[1]; | ||
| 720 | |||
| 721 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | ||
| 722 | ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); | ||
| 723 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | ||
| 724 | |||
| 725 | return res & 0xffff; | ||
| 726 | } | ||
| 727 | |||
| 728 | static void ax8817x_mdio_write(struct net_device *netdev, int phy_id, int loc, int val) | ||
| 729 | { | ||
| 730 | struct usbnet *dev = netdev_priv(netdev); | ||
| 731 | u16 res = val; | ||
| 732 | u8 buf[1]; | ||
| 733 | |||
| 734 | ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, &buf); | ||
| 735 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2, (u16 *)&res); | ||
| 736 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf); | ||
| 737 | } | ||
| 738 | |||
| 739 | static int ax88172_link_reset(struct usbnet *dev) | ||
| 740 | { | ||
| 741 | u16 lpa; | ||
| 742 | u8 mode; | ||
| 743 | |||
| 744 | mode = AX_MEDIUM_TX_ABORT_ALLOW | AX_MEDIUM_FLOW_CONTROL_EN; | ||
| 745 | lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA); | ||
| 746 | if (lpa & LPA_DUPLEX) | ||
| 747 | mode |= AX_MEDIUM_FULL_DUPLEX; | ||
| 748 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | ||
| 749 | |||
| 750 | return 0; | ||
| 751 | } | ||
| 752 | |||
| 753 | static void ax8817x_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
| 754 | { | ||
| 755 | struct usbnet *dev = netdev_priv(net); | ||
| 756 | u8 opt; | ||
| 757 | |||
| 758 | if (ax8817x_read_cmd(dev, AX_CMD_READ_MONITOR_MODE, 0, 0, 1, &opt) < 0) { | ||
| 759 | wolinfo->supported = 0; | ||
| 760 | wolinfo->wolopts = 0; | ||
| 761 | return; | ||
| 762 | } | ||
| 763 | wolinfo->supported = WAKE_PHY | WAKE_MAGIC; | ||
| 764 | wolinfo->wolopts = 0; | ||
| 765 | if (opt & AX_MONITOR_MODE) { | ||
| 766 | if (opt & AX_MONITOR_LINK) | ||
| 767 | wolinfo->wolopts |= WAKE_PHY; | ||
| 768 | if (opt & AX_MONITOR_MAGIC) | ||
| 769 | wolinfo->wolopts |= WAKE_MAGIC; | ||
| 770 | } | ||
| 771 | } | ||
| 772 | |||
| 773 | static int ax8817x_set_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | ||
| 774 | { | ||
| 775 | struct usbnet *dev = netdev_priv(net); | ||
| 776 | u8 opt = 0; | ||
| 777 | u8 buf[1]; | ||
| 778 | |||
| 779 | if (wolinfo->wolopts & WAKE_PHY) | ||
| 780 | opt |= AX_MONITOR_LINK; | ||
| 781 | if (wolinfo->wolopts & WAKE_MAGIC) | ||
| 782 | opt |= AX_MONITOR_MAGIC; | ||
| 783 | if (opt != 0) | ||
| 784 | opt |= AX_MONITOR_MODE; | ||
| 785 | |||
| 786 | if (ax8817x_write_cmd(dev, AX_CMD_WRITE_MONITOR_MODE, | ||
| 787 | opt, 0, 0, &buf) < 0) | ||
| 788 | return -EINVAL; | ||
| 789 | |||
| 790 | return 0; | ||
| 791 | } | ||
| 792 | |||
| 793 | static int ax8817x_get_eeprom_len(struct net_device *net) | ||
| 794 | { | ||
| 795 | return AX_EEPROM_LEN; | ||
| 796 | } | ||
| 797 | |||
| 798 | static int ax8817x_get_eeprom(struct net_device *net, | ||
| 799 | struct ethtool_eeprom *eeprom, u8 *data) | ||
| 800 | { | ||
| 801 | struct usbnet *dev = netdev_priv(net); | ||
| 802 | u16 *ebuf = (u16 *)data; | ||
| 803 | int i; | ||
| 804 | |||
| 805 | /* Crude hack to ensure that we don't overwrite memory | ||
| 806 | * if an odd length is supplied | ||
| 807 | */ | ||
| 808 | if (eeprom->len % 2) | ||
| 809 | return -EINVAL; | ||
| 810 | |||
| 811 | eeprom->magic = AX_EEPROM_MAGIC; | ||
| 812 | |||
| 813 | /* ax8817x returns 2 bytes from eeprom on read */ | ||
| 814 | for (i=0; i < eeprom->len / 2; i++) { | ||
| 815 | if (ax8817x_read_cmd(dev, AX_CMD_READ_EEPROM, | ||
| 816 | eeprom->offset + i, 0, 2, &ebuf[i]) < 0) | ||
| 817 | return -EINVAL; | ||
| 818 | } | ||
| 819 | return 0; | ||
| 820 | } | ||
| 821 | |||
| 822 | static void ax8817x_get_drvinfo (struct net_device *net, | ||
| 823 | struct ethtool_drvinfo *info) | ||
| 824 | { | ||
| 825 | /* Inherit standard device info */ | ||
| 826 | usbnet_get_drvinfo(net, info); | ||
| 827 | info->eedump_len = 0x3e; | ||
| 828 | } | ||
| 829 | |||
| 830 | static int ax8817x_get_settings(struct net_device *net, struct ethtool_cmd *cmd) | ||
| 831 | { | ||
| 832 | struct usbnet *dev = netdev_priv(net); | ||
| 833 | |||
| 834 | return mii_ethtool_gset(&dev->mii,cmd); | ||
| 835 | } | ||
| 836 | |||
| 837 | static int ax8817x_set_settings(struct net_device *net, struct ethtool_cmd *cmd) | ||
| 838 | { | ||
| 839 | struct usbnet *dev = netdev_priv(net); | ||
| 840 | |||
| 841 | return mii_ethtool_sset(&dev->mii,cmd); | ||
| 842 | } | ||
| 843 | |||
| 844 | /* We need to override some ethtool_ops so we require our | ||
| 845 | own structure so we don't interfere with other usbnet | ||
| 846 | devices that may be connected at the same time. */ | ||
| 847 | static struct ethtool_ops ax8817x_ethtool_ops = { | ||
| 848 | .get_drvinfo = ax8817x_get_drvinfo, | ||
| 849 | .get_link = ethtool_op_get_link, | ||
| 850 | .get_msglevel = usbnet_get_msglevel, | ||
| 851 | .set_msglevel = usbnet_set_msglevel, | ||
| 852 | .get_wol = ax8817x_get_wol, | ||
| 853 | .set_wol = ax8817x_set_wol, | ||
| 854 | .get_eeprom_len = ax8817x_get_eeprom_len, | ||
| 855 | .get_eeprom = ax8817x_get_eeprom, | ||
| 856 | .get_settings = ax8817x_get_settings, | ||
| 857 | .set_settings = ax8817x_set_settings, | ||
| 858 | }; | ||
| 859 | |||
| 860 | static int ax8817x_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 861 | { | ||
| 862 | int ret = 0; | ||
| 863 | void *buf; | ||
| 864 | int i; | ||
| 865 | unsigned long gpio_bits = dev->driver_info->data; | ||
| 866 | |||
| 867 | get_endpoints(dev,intf); | ||
| 868 | |||
| 869 | buf = kmalloc(ETH_ALEN, GFP_KERNEL); | ||
| 870 | if(!buf) { | ||
| 871 | ret = -ENOMEM; | ||
| 872 | goto out1; | ||
| 873 | } | ||
| 874 | |||
| 875 | /* Toggle the GPIOs in a manufacturer/model specific way */ | ||
| 876 | for (i = 2; i >= 0; i--) { | ||
| 877 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | ||
| 878 | (gpio_bits >> (i * 8)) & 0xff, 0, 0, | ||
| 879 | buf)) < 0) | ||
| 880 | goto out2; | ||
| 881 | msleep(5); | ||
| 882 | } | ||
| 883 | |||
| 884 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x80, 0, 0, buf)) < 0) { | ||
| 885 | dbg("send AX_CMD_WRITE_RX_CTL failed: %d", ret); | ||
| 886 | goto out2; | ||
| 887 | } | ||
| 888 | |||
| 889 | /* Get the MAC address */ | ||
| 890 | memset(buf, 0, ETH_ALEN); | ||
| 891 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, 6, buf)) < 0) { | ||
| 892 | dbg("read AX_CMD_READ_NODE_ID failed: %d", ret); | ||
| 893 | goto out2; | ||
| 894 | } | ||
| 895 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | ||
| 896 | |||
| 897 | /* Get the PHY id */ | ||
| 898 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) { | ||
| 899 | dbg("error on read AX_CMD_READ_PHY_ID: %02x", ret); | ||
| 900 | goto out2; | ||
| 901 | } else if (ret < 2) { | ||
| 902 | /* this should always return 2 bytes */ | ||
| 903 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", ret); | ||
| 904 | ret = -EIO; | ||
| 905 | goto out2; | ||
| 906 | } | ||
| 907 | |||
| 908 | /* Initialize MII structure */ | ||
| 909 | dev->mii.dev = dev->net; | ||
| 910 | dev->mii.mdio_read = ax8817x_mdio_read; | ||
| 911 | dev->mii.mdio_write = ax8817x_mdio_write; | ||
| 912 | dev->mii.phy_id_mask = 0x3f; | ||
| 913 | dev->mii.reg_num_mask = 0x1f; | ||
| 914 | dev->mii.phy_id = *((u8 *)buf + 1); | ||
| 915 | |||
| 916 | dev->net->set_multicast_list = ax8817x_set_multicast; | ||
| 917 | dev->net->ethtool_ops = &ax8817x_ethtool_ops; | ||
| 918 | |||
| 919 | ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | ||
| 920 | ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, | ||
| 921 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP); | ||
| 922 | mii_nway_restart(&dev->mii); | ||
| 923 | |||
| 924 | return 0; | ||
| 925 | out2: | ||
| 926 | kfree(buf); | ||
| 927 | out1: | ||
| 928 | return ret; | ||
| 929 | } | ||
| 930 | |||
| 931 | static struct ethtool_ops ax88772_ethtool_ops = { | ||
| 932 | .get_drvinfo = ax8817x_get_drvinfo, | ||
| 933 | .get_link = ethtool_op_get_link, | ||
| 934 | .get_msglevel = usbnet_get_msglevel, | ||
| 935 | .set_msglevel = usbnet_set_msglevel, | ||
| 936 | .get_wol = ax8817x_get_wol, | ||
| 937 | .set_wol = ax8817x_set_wol, | ||
| 938 | .get_eeprom_len = ax8817x_get_eeprom_len, | ||
| 939 | .get_eeprom = ax8817x_get_eeprom, | ||
| 940 | .get_settings = ax8817x_get_settings, | ||
| 941 | .set_settings = ax8817x_set_settings, | ||
| 942 | }; | ||
| 943 | |||
| 944 | static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 945 | { | ||
| 946 | int ret; | ||
| 947 | void *buf; | ||
| 948 | |||
| 949 | get_endpoints(dev,intf); | ||
| 950 | |||
| 951 | buf = kmalloc(6, GFP_KERNEL); | ||
| 952 | if(!buf) { | ||
| 953 | dbg ("Cannot allocate memory for buffer"); | ||
| 954 | ret = -ENOMEM; | ||
| 955 | goto out1; | ||
| 956 | } | ||
| 957 | |||
| 958 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_GPIOS, | ||
| 959 | 0x00B0, 0, 0, buf)) < 0) | ||
| 960 | goto out2; | ||
| 961 | |||
| 962 | msleep(5); | ||
| 963 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SW_PHY_SELECT, 0x0001, 0, 0, buf)) < 0) { | ||
| 964 | dbg("Select PHY #1 failed: %d", ret); | ||
| 965 | goto out2; | ||
| 966 | } | ||
| 967 | |||
| 968 | if ((ret = | ||
| 969 | ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPPD, 0, 0, buf)) < 0) { | ||
| 970 | dbg("Failed to power down internal PHY: %d", ret); | ||
| 971 | goto out2; | ||
| 972 | } | ||
| 973 | |||
| 974 | msleep(150); | ||
| 975 | if ((ret = | ||
| 976 | ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_CLEAR, 0, 0, buf)) < 0) { | ||
| 977 | dbg("Failed to perform software reset: %d", ret); | ||
| 978 | goto out2; | ||
| 979 | } | ||
| 980 | |||
| 981 | msleep(150); | ||
| 982 | if ((ret = | ||
| 983 | ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) { | ||
| 984 | dbg("Failed to set Internal/External PHY reset control: %d", ret); | ||
| 985 | goto out2; | ||
| 986 | } | ||
| 987 | |||
| 988 | msleep(150); | ||
| 989 | if ((ret = | ||
| 990 | ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0000, 0, 0, | ||
| 991 | buf)) < 0) { | ||
| 992 | dbg("Failed to reset RX_CTL: %d", ret); | ||
| 993 | goto out2; | ||
| 994 | } | ||
| 995 | |||
| 996 | /* Get the MAC address */ | ||
| 997 | memset(buf, 0, ETH_ALEN); | ||
| 998 | if ((ret = ax8817x_read_cmd(dev, AX88772_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf)) < 0) { | ||
| 999 | dbg("Failed to read MAC address: %d", ret); | ||
| 1000 | goto out2; | ||
| 1001 | } | ||
| 1002 | memcpy(dev->net->dev_addr, buf, ETH_ALEN); | ||
| 1003 | |||
| 1004 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_SET_SW_MII, 0, 0, 0, buf)) < 0) { | ||
| 1005 | dbg("Enabling software MII failed: %d", ret); | ||
| 1006 | goto out2; | ||
| 1007 | } | ||
| 1008 | |||
| 1009 | if (((ret = | ||
| 1010 | ax8817x_read_cmd(dev, AX_CMD_READ_MII_REG, 0x0010, 2, 2, buf)) < 0) | ||
| 1011 | || (*((u16 *)buf) != 0x003b)) { | ||
| 1012 | dbg("Read PHY register 2 must be 0x3b00: %d", ret); | ||
| 1013 | goto out2; | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | /* Initialize MII structure */ | ||
| 1017 | dev->mii.dev = dev->net; | ||
| 1018 | dev->mii.mdio_read = ax8817x_mdio_read; | ||
| 1019 | dev->mii.mdio_write = ax8817x_mdio_write; | ||
| 1020 | dev->mii.phy_id_mask = 0xff; | ||
| 1021 | dev->mii.reg_num_mask = 0xff; | ||
| 1022 | |||
| 1023 | /* Get the PHY id */ | ||
| 1024 | if ((ret = ax8817x_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf)) < 0) { | ||
| 1025 | dbg("Error reading PHY ID: %02x", ret); | ||
| 1026 | goto out2; | ||
| 1027 | } else if (ret < 2) { | ||
| 1028 | /* this should always return 2 bytes */ | ||
| 1029 | dbg("AX_CMD_READ_PHY_ID returned less than 2 bytes: ret=%02x", | ||
| 1030 | ret); | ||
| 1031 | ret = -EIO; | ||
| 1032 | goto out2; | ||
| 1033 | } | ||
| 1034 | dev->mii.phy_id = *((u8 *)buf + 1); | ||
| 1035 | |||
| 1036 | if ((ret = | ||
| 1037 | ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_PRL, 0, 0, buf)) < 0) { | ||
| 1038 | dbg("Set external PHY reset pin level: %d", ret); | ||
| 1039 | goto out2; | ||
| 1040 | } | ||
| 1041 | msleep(150); | ||
| 1042 | if ((ret = | ||
| 1043 | ax8817x_write_cmd(dev, AX_CMD_SW_RESET, AX_SWRESET_IPRL | AX_SWRESET_PRL, 0, 0, buf)) < 0) { | ||
| 1044 | dbg("Set Internal/External PHY reset control: %d", ret); | ||
| 1045 | goto out2; | ||
| 1046 | } | ||
| 1047 | msleep(150); | ||
| 1048 | |||
| 1049 | |||
| 1050 | dev->net->set_multicast_list = ax8817x_set_multicast; | ||
| 1051 | dev->net->ethtool_ops = &ax88772_ethtool_ops; | ||
| 1052 | |||
| 1053 | ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | ||
| 1054 | ax8817x_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, | ||
| 1055 | ADVERTISE_ALL | ADVERTISE_CSMA); | ||
| 1056 | mii_nway_restart(&dev->mii); | ||
| 1057 | |||
| 1058 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, AX88772_MEDIUM_DEFAULT, 0, 0, buf)) < 0) { | ||
| 1059 | dbg("Write medium mode register: %d", ret); | ||
| 1060 | goto out2; | ||
| 1061 | } | ||
| 1062 | |||
| 1063 | if ((ret = ax8817x_write_cmd(dev, AX_CMD_WRITE_IPG0, AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,AX88772_IPG2_DEFAULT, 0, buf)) < 0) { | ||
| 1064 | dbg("Write IPG,IPG1,IPG2 failed: %d", ret); | ||
| 1065 | goto out2; | ||
| 1066 | } | ||
| 1067 | if ((ret = | ||
| 1068 | ax8817x_write_cmd(dev, AX_CMD_SET_HW_MII, 0, 0, 0, &buf)) < 0) { | ||
| 1069 | dbg("Failed to set hardware MII: %02x", ret); | ||
| 1070 | goto out2; | ||
| 1071 | } | ||
| 1072 | |||
| 1073 | /* Set RX_CTL to default values with 2k buffer, and enable cactus */ | ||
| 1074 | if ((ret = | ||
| 1075 | ax8817x_write_cmd(dev, AX_CMD_WRITE_RX_CTL, 0x0088, 0, 0, | ||
| 1076 | buf)) < 0) { | ||
| 1077 | dbg("Reset RX_CTL failed: %d", ret); | ||
| 1078 | goto out2; | ||
| 1079 | } | ||
| 1080 | |||
| 1081 | kfree(buf); | ||
| 1082 | |||
| 1083 | return 0; | ||
| 1084 | |||
| 1085 | out2: | ||
| 1086 | kfree(buf); | ||
| 1087 | out1: | ||
| 1088 | return ret; | ||
| 1089 | } | ||
| 1090 | |||
| 1091 | static int ax88772_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | ||
| 1092 | { | ||
| 1093 | u32 *header; | ||
| 1094 | char *packet; | ||
| 1095 | struct sk_buff *ax_skb; | ||
| 1096 | u16 size; | ||
| 1097 | |||
| 1098 | header = (u32 *) skb->data; | ||
| 1099 | le32_to_cpus(header); | ||
| 1100 | packet = (char *)(header + 1); | ||
| 1101 | |||
| 1102 | skb_pull(skb, 4); | ||
| 1103 | |||
| 1104 | while (skb->len > 0) { | ||
| 1105 | if ((short)(*header & 0x0000ffff) != | ||
| 1106 | ~((short)((*header & 0xffff0000) >> 16))) { | ||
| 1107 | devdbg(dev,"header length data is error"); | ||
| 1108 | } | ||
| 1109 | /* get the packet length */ | ||
| 1110 | size = (u16) (*header & 0x0000ffff); | ||
| 1111 | |||
| 1112 | if ((skb->len) - ((size + 1) & 0xfffe) == 0) | ||
| 1113 | return 2; | ||
| 1114 | if (size > ETH_FRAME_LEN) { | ||
| 1115 | devdbg(dev,"invalid rx length %d", size); | ||
| 1116 | return 0; | ||
| 1117 | } | ||
| 1118 | ax_skb = skb_clone(skb, GFP_ATOMIC); | ||
| 1119 | if (ax_skb) { | ||
| 1120 | ax_skb->len = size; | ||
| 1121 | ax_skb->data = packet; | ||
| 1122 | ax_skb->tail = packet + size; | ||
| 1123 | skb_return(dev, ax_skb); | ||
| 1124 | } else { | ||
| 1125 | return 0; | ||
| 1126 | } | ||
| 1127 | |||
| 1128 | skb_pull(skb, (size + 1) & 0xfffe); | ||
| 1129 | |||
| 1130 | if (skb->len == 0) | ||
| 1131 | break; | ||
| 1132 | |||
| 1133 | header = (u32 *) skb->data; | ||
| 1134 | le32_to_cpus(header); | ||
| 1135 | packet = (char *)(header + 1); | ||
| 1136 | skb_pull(skb, 4); | ||
| 1137 | } | ||
| 1138 | |||
| 1139 | if (skb->len < 0) { | ||
| 1140 | devdbg(dev,"invalid rx length %d", skb->len); | ||
| 1141 | return 0; | ||
| 1142 | } | ||
| 1143 | return 1; | ||
| 1144 | } | ||
| 1145 | |||
| 1146 | static struct sk_buff *ax88772_tx_fixup(struct usbnet *dev, struct sk_buff *skb, | ||
| 1147 | int flags) | ||
| 1148 | { | ||
| 1149 | int padlen; | ||
| 1150 | int headroom = skb_headroom(skb); | ||
| 1151 | int tailroom = skb_tailroom(skb); | ||
| 1152 | u32 *packet_len; | ||
| 1153 | u32 *padbytes_ptr; | ||
| 1154 | |||
| 1155 | padlen = ((skb->len + 4) % 512) ? 0 : 4; | ||
| 1156 | |||
| 1157 | if ((!skb_cloned(skb)) | ||
| 1158 | && ((headroom + tailroom) >= (4 + padlen))) { | ||
| 1159 | if ((headroom < 4) || (tailroom < padlen)) { | ||
| 1160 | skb->data = memmove(skb->head + 4, skb->data, skb->len); | ||
| 1161 | skb->tail = skb->data + skb->len; | ||
| 1162 | } | ||
| 1163 | } else { | ||
| 1164 | struct sk_buff *skb2; | ||
| 1165 | skb2 = skb_copy_expand(skb, 4, padlen, flags); | ||
| 1166 | dev_kfree_skb_any(skb); | ||
| 1167 | skb = skb2; | ||
| 1168 | if (!skb) | ||
| 1169 | return NULL; | ||
| 1170 | } | ||
| 1171 | |||
| 1172 | packet_len = (u32 *) skb_push(skb, 4); | ||
| 1173 | |||
| 1174 | packet_len = (u32 *) skb->data; | ||
| 1175 | *packet_len = (((skb->len - 4) ^ 0x0000ffff) << 16) + (skb->len - 4); | ||
| 1176 | |||
| 1177 | if ((skb->len % 512) == 0) { | ||
| 1178 | padbytes_ptr = (u32 *) skb->tail; | ||
| 1179 | *padbytes_ptr = 0xffff0000; | ||
| 1180 | skb_put(skb, padlen); | ||
| 1181 | } | ||
| 1182 | return skb; | ||
| 1183 | } | ||
| 1184 | |||
| 1185 | static int ax88772_link_reset(struct usbnet *dev) | ||
| 1186 | { | ||
| 1187 | u16 lpa; | ||
| 1188 | u16 mode; | ||
| 1189 | |||
| 1190 | mode = AX88772_MEDIUM_DEFAULT; | ||
| 1191 | lpa = ax8817x_mdio_read(dev->net, dev->mii.phy_id, MII_LPA); | ||
| 1192 | |||
| 1193 | if ((lpa & LPA_DUPLEX) == 0) | ||
| 1194 | mode &= ~AX88772_MEDIUM_FULL_DUPLEX; | ||
| 1195 | if ((lpa & LPA_100) == 0) | ||
| 1196 | mode &= ~AX88772_MEDIUM_100MB; | ||
| 1197 | ax8817x_write_cmd(dev, AX_CMD_WRITE_MEDIUM_MODE, mode, 0, 0, NULL); | ||
| 1198 | |||
| 1199 | return 0; | ||
| 1200 | } | ||
| 1201 | |||
| 1202 | static const struct driver_info ax8817x_info = { | ||
| 1203 | .description = "ASIX AX8817x USB 2.0 Ethernet", | ||
| 1204 | .bind = ax8817x_bind, | ||
| 1205 | .status = ax8817x_status, | ||
| 1206 | .link_reset = ax88172_link_reset, | ||
| 1207 | .reset = ax88172_link_reset, | ||
| 1208 | .flags = FLAG_ETHER, | ||
| 1209 | .data = 0x00130103, | ||
| 1210 | }; | ||
| 1211 | |||
| 1212 | static const struct driver_info dlink_dub_e100_info = { | ||
| 1213 | .description = "DLink DUB-E100 USB Ethernet", | ||
| 1214 | .bind = ax8817x_bind, | ||
| 1215 | .status = ax8817x_status, | ||
| 1216 | .link_reset = ax88172_link_reset, | ||
| 1217 | .reset = ax88172_link_reset, | ||
| 1218 | .flags = FLAG_ETHER, | ||
| 1219 | .data = 0x009f9d9f, | ||
| 1220 | }; | ||
| 1221 | |||
| 1222 | static const struct driver_info netgear_fa120_info = { | ||
| 1223 | .description = "Netgear FA-120 USB Ethernet", | ||
| 1224 | .bind = ax8817x_bind, | ||
| 1225 | .status = ax8817x_status, | ||
| 1226 | .link_reset = ax88172_link_reset, | ||
| 1227 | .reset = ax88172_link_reset, | ||
| 1228 | .flags = FLAG_ETHER, | ||
| 1229 | .data = 0x00130103, | ||
| 1230 | }; | ||
| 1231 | |||
| 1232 | static const struct driver_info hawking_uf200_info = { | ||
| 1233 | .description = "Hawking UF200 USB Ethernet", | ||
| 1234 | .bind = ax8817x_bind, | ||
| 1235 | .status = ax8817x_status, | ||
| 1236 | .link_reset = ax88172_link_reset, | ||
| 1237 | .reset = ax88172_link_reset, | ||
| 1238 | .flags = FLAG_ETHER, | ||
| 1239 | .data = 0x001f1d1f, | ||
| 1240 | }; | ||
| 1241 | |||
| 1242 | static const struct driver_info ax88772_info = { | ||
| 1243 | .description = "ASIX AX88772 USB 2.0 Ethernet", | ||
| 1244 | .bind = ax88772_bind, | ||
| 1245 | .status = ax8817x_status, | ||
| 1246 | .link_reset = ax88772_link_reset, | ||
| 1247 | .reset = ax88772_link_reset, | ||
| 1248 | .flags = FLAG_ETHER | FLAG_FRAMING_AX, | ||
| 1249 | .rx_fixup = ax88772_rx_fixup, | ||
| 1250 | .tx_fixup = ax88772_tx_fixup, | ||
| 1251 | .data = 0x00130103, | ||
| 1252 | }; | ||
| 1253 | |||
| 1254 | #endif /* CONFIG_USB_AX8817X */ | ||
| 1255 | |||
| 1256 | |||
| 1257 | |||
| 1258 | #ifdef CONFIG_USB_BELKIN | ||
| 1259 | #define HAVE_HARDWARE | ||
| 1260 | |||
| 1261 | /*------------------------------------------------------------------------- | ||
| 1262 | * | ||
| 1263 | * Belkin F5U104 ... two NetChip 2280 devices + Atmel microcontroller | ||
| 1264 | * | ||
| 1265 | * ... also two eTEK designs, including one sold as "Advance USBNET" | ||
| 1266 | * | ||
| 1267 | *-------------------------------------------------------------------------*/ | ||
| 1268 | |||
| 1269 | static const struct driver_info belkin_info = { | ||
| 1270 | .description = "Belkin, eTEK, or compatible", | ||
| 1271 | }; | ||
| 1272 | |||
| 1273 | #endif /* CONFIG_USB_BELKIN */ | ||
| 1274 | |||
| 1275 | |||
| 1276 | |||
| 1277 | /*------------------------------------------------------------------------- | ||
| 1278 | * | ||
| 1279 | * Communications Device Class declarations. | ||
| 1280 | * Used by CDC Ethernet, and some CDC variants | ||
| 1281 | * | ||
| 1282 | *-------------------------------------------------------------------------*/ | ||
| 1283 | |||
| 1284 | #ifdef CONFIG_USB_CDCETHER | ||
| 1285 | #define NEED_GENERIC_CDC | ||
| 1286 | #endif | ||
| 1287 | |||
| 1288 | #ifdef CONFIG_USB_ZAURUS | ||
| 1289 | /* Ethernet variant uses funky framing, broken ethernet addressing */ | ||
| 1290 | #define NEED_GENERIC_CDC | ||
| 1291 | #endif | ||
| 1292 | |||
| 1293 | #ifdef CONFIG_USB_RNDIS | ||
| 1294 | /* ACM variant uses even funkier framing, complex control RPC scheme */ | ||
| 1295 | #define NEED_GENERIC_CDC | ||
| 1296 | #endif | ||
| 1297 | |||
| 1298 | |||
| 1299 | #ifdef NEED_GENERIC_CDC | ||
| 1300 | |||
| 1301 | #include <linux/usb_cdc.h> | ||
| 1302 | |||
| 1303 | struct cdc_state { | ||
| 1304 | struct usb_cdc_header_desc *header; | ||
| 1305 | struct usb_cdc_union_desc *u; | ||
| 1306 | struct usb_cdc_ether_desc *ether; | ||
| 1307 | struct usb_interface *control; | ||
| 1308 | struct usb_interface *data; | ||
| 1309 | }; | ||
| 1310 | |||
| 1311 | static struct usb_driver usbnet_driver; | ||
| 1312 | |||
| 1313 | /* | ||
| 1314 | * probes control interface, claims data interface, collects the bulk | ||
| 1315 | * endpoints, activates data interface (if needed), maybe sets MTU. | ||
| 1316 | * all pure cdc, except for certain firmware workarounds. | ||
| 1317 | */ | ||
| 1318 | static int generic_cdc_bind (struct usbnet *dev, struct usb_interface *intf) | ||
| 1319 | { | ||
| 1320 | u8 *buf = intf->cur_altsetting->extra; | ||
| 1321 | int len = intf->cur_altsetting->extralen; | ||
| 1322 | struct usb_interface_descriptor *d; | ||
| 1323 | struct cdc_state *info = (void *) &dev->data; | ||
| 1324 | int status; | ||
| 1325 | int rndis; | ||
| 1326 | |||
| 1327 | if (sizeof dev->data < sizeof *info) | ||
| 1328 | return -EDOM; | ||
| 1329 | |||
| 1330 | /* expect strict spec conformance for the descriptors, but | ||
| 1331 | * cope with firmware which stores them in the wrong place | ||
| 1332 | */ | ||
| 1333 | if (len == 0 && dev->udev->actconfig->extralen) { | ||
| 1334 | /* Motorola SB4100 (and others: Brad Hards says it's | ||
| 1335 | * from a Broadcom design) put CDC descriptors here | ||
| 1336 | */ | ||
| 1337 | buf = dev->udev->actconfig->extra; | ||
| 1338 | len = dev->udev->actconfig->extralen; | ||
| 1339 | if (len) | ||
| 1340 | dev_dbg (&intf->dev, | ||
| 1341 | "CDC descriptors on config\n"); | ||
| 1342 | } | ||
| 1343 | |||
| 1344 | /* this assumes that if there's a non-RNDIS vendor variant | ||
| 1345 | * of cdc-acm, it'll fail RNDIS requests cleanly. | ||
| 1346 | */ | ||
| 1347 | rndis = (intf->cur_altsetting->desc.bInterfaceProtocol == 0xff); | ||
| 1348 | |||
| 1349 | memset (info, 0, sizeof *info); | ||
| 1350 | info->control = intf; | ||
| 1351 | while (len > 3) { | ||
| 1352 | if (buf [1] != USB_DT_CS_INTERFACE) | ||
| 1353 | goto next_desc; | ||
| 1354 | |||
| 1355 | /* use bDescriptorSubType to identify the CDC descriptors. | ||
| 1356 | * We expect devices with CDC header and union descriptors. | ||
| 1357 | * For CDC Ethernet we need the ethernet descriptor. | ||
| 1358 | * For RNDIS, ignore two (pointless) CDC modem descriptors | ||
| 1359 | * in favor of a complicated OID-based RPC scheme doing what | ||
| 1360 | * CDC Ethernet achieves with a simple descriptor. | ||
| 1361 | */ | ||
| 1362 | switch (buf [2]) { | ||
| 1363 | case USB_CDC_HEADER_TYPE: | ||
| 1364 | if (info->header) { | ||
| 1365 | dev_dbg (&intf->dev, "extra CDC header\n"); | ||
| 1366 | goto bad_desc; | ||
| 1367 | } | ||
| 1368 | info->header = (void *) buf; | ||
| 1369 | if (info->header->bLength != sizeof *info->header) { | ||
| 1370 | dev_dbg (&intf->dev, "CDC header len %u\n", | ||
| 1371 | info->header->bLength); | ||
| 1372 | goto bad_desc; | ||
| 1373 | } | ||
| 1374 | break; | ||
| 1375 | case USB_CDC_UNION_TYPE: | ||
| 1376 | if (info->u) { | ||
| 1377 | dev_dbg (&intf->dev, "extra CDC union\n"); | ||
| 1378 | goto bad_desc; | ||
| 1379 | } | ||
| 1380 | info->u = (void *) buf; | ||
| 1381 | if (info->u->bLength != sizeof *info->u) { | ||
| 1382 | dev_dbg (&intf->dev, "CDC union len %u\n", | ||
| 1383 | info->u->bLength); | ||
| 1384 | goto bad_desc; | ||
| 1385 | } | ||
| 1386 | |||
| 1387 | /* we need a master/control interface (what we're | ||
| 1388 | * probed with) and a slave/data interface; union | ||
| 1389 | * descriptors sort this all out. | ||
| 1390 | */ | ||
| 1391 | info->control = usb_ifnum_to_if(dev->udev, | ||
| 1392 | info->u->bMasterInterface0); | ||
| 1393 | info->data = usb_ifnum_to_if(dev->udev, | ||
| 1394 | info->u->bSlaveInterface0); | ||
| 1395 | if (!info->control || !info->data) { | ||
| 1396 | dev_dbg (&intf->dev, | ||
| 1397 | "master #%u/%p slave #%u/%p\n", | ||
| 1398 | info->u->bMasterInterface0, | ||
| 1399 | info->control, | ||
| 1400 | info->u->bSlaveInterface0, | ||
| 1401 | info->data); | ||
| 1402 | goto bad_desc; | ||
| 1403 | } | ||
| 1404 | if (info->control != intf) { | ||
| 1405 | dev_dbg (&intf->dev, "bogus CDC Union\n"); | ||
| 1406 | /* Ambit USB Cable Modem (and maybe others) | ||
| 1407 | * interchanges master and slave interface. | ||
| 1408 | */ | ||
| 1409 | if (info->data == intf) { | ||
| 1410 | info->data = info->control; | ||
| 1411 | info->control = intf; | ||
| 1412 | } else | ||
| 1413 | goto bad_desc; | ||
| 1414 | } | ||
| 1415 | |||
| 1416 | /* a data interface altsetting does the real i/o */ | ||
| 1417 | d = &info->data->cur_altsetting->desc; | ||
| 1418 | if (d->bInterfaceClass != USB_CLASS_CDC_DATA) { | ||
| 1419 | dev_dbg (&intf->dev, "slave class %u\n", | ||
| 1420 | d->bInterfaceClass); | ||
| 1421 | goto bad_desc; | ||
| 1422 | } | ||
| 1423 | break; | ||
| 1424 | case USB_CDC_ETHERNET_TYPE: | ||
| 1425 | if (info->ether) { | ||
| 1426 | dev_dbg (&intf->dev, "extra CDC ether\n"); | ||
| 1427 | goto bad_desc; | ||
| 1428 | } | ||
| 1429 | info->ether = (void *) buf; | ||
| 1430 | if (info->ether->bLength != sizeof *info->ether) { | ||
| 1431 | dev_dbg (&intf->dev, "CDC ether len %u\n", | ||
| 1432 | info->ether->bLength); | ||
| 1433 | goto bad_desc; | ||
| 1434 | } | ||
| 1435 | dev->net->mtu = le16_to_cpup ( | ||
| 1436 | &info->ether->wMaxSegmentSize) | ||
| 1437 | - ETH_HLEN; | ||
| 1438 | /* because of Zaurus, we may be ignoring the host | ||
| 1439 | * side link address we were given. | ||
| 1440 | */ | ||
| 1441 | break; | ||
| 1442 | } | ||
| 1443 | next_desc: | ||
| 1444 | len -= buf [0]; /* bLength */ | ||
| 1445 | buf += buf [0]; | ||
| 1446 | } | ||
| 1447 | |||
| 1448 | if (!info->header || !info->u || (!rndis && !info->ether)) { | ||
| 1449 | dev_dbg (&intf->dev, "missing cdc %s%s%sdescriptor\n", | ||
| 1450 | info->header ? "" : "header ", | ||
| 1451 | info->u ? "" : "union ", | ||
| 1452 | info->ether ? "" : "ether "); | ||
| 1453 | goto bad_desc; | ||
| 1454 | } | ||
| 1455 | |||
| 1456 | /* claim data interface and set it up ... with side effects. | ||
| 1457 | * network traffic can't flow until an altsetting is enabled. | ||
| 1458 | */ | ||
| 1459 | status = usb_driver_claim_interface (&usbnet_driver, info->data, dev); | ||
| 1460 | if (status < 0) | ||
| 1461 | return status; | ||
| 1462 | status = get_endpoints (dev, info->data); | ||
| 1463 | if (status < 0) { | ||
| 1464 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 1465 | usb_set_intfdata(info->data, NULL); | ||
| 1466 | usb_driver_release_interface (&usbnet_driver, info->data); | ||
| 1467 | return status; | ||
| 1468 | } | ||
| 1469 | |||
| 1470 | /* status endpoint: optional for CDC Ethernet, not RNDIS (or ACM) */ | ||
| 1471 | dev->status = NULL; | ||
| 1472 | if (info->control->cur_altsetting->desc.bNumEndpoints == 1) { | ||
| 1473 | struct usb_endpoint_descriptor *desc; | ||
| 1474 | |||
| 1475 | dev->status = &info->control->cur_altsetting->endpoint [0]; | ||
| 1476 | desc = &dev->status->desc; | ||
| 1477 | if (desc->bmAttributes != USB_ENDPOINT_XFER_INT | ||
| 1478 | || !(desc->bEndpointAddress & USB_DIR_IN) | ||
| 1479 | || (le16_to_cpu(desc->wMaxPacketSize) | ||
| 1480 | < sizeof (struct usb_cdc_notification)) | ||
| 1481 | || !desc->bInterval) { | ||
| 1482 | dev_dbg (&intf->dev, "bad notification endpoint\n"); | ||
| 1483 | dev->status = NULL; | ||
| 1484 | } | ||
| 1485 | } | ||
| 1486 | if (rndis && !dev->status) { | ||
| 1487 | dev_dbg (&intf->dev, "missing RNDIS status endpoint\n"); | ||
| 1488 | usb_set_intfdata(info->data, NULL); | ||
| 1489 | usb_driver_release_interface (&usbnet_driver, info->data); | ||
| 1490 | return -ENODEV; | ||
| 1491 | } | ||
| 1492 | return 0; | ||
| 1493 | |||
| 1494 | bad_desc: | ||
| 1495 | dev_info (&dev->udev->dev, "bad CDC descriptors\n"); | ||
| 1496 | return -ENODEV; | ||
| 1497 | } | ||
| 1498 | |||
| 1499 | static void cdc_unbind (struct usbnet *dev, struct usb_interface *intf) | ||
| 1500 | { | ||
| 1501 | struct cdc_state *info = (void *) &dev->data; | ||
| 1502 | |||
| 1503 | /* disconnect master --> disconnect slave */ | ||
| 1504 | if (intf == info->control && info->data) { | ||
| 1505 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 1506 | usb_set_intfdata(info->data, NULL); | ||
| 1507 | usb_driver_release_interface (&usbnet_driver, info->data); | ||
| 1508 | info->data = NULL; | ||
| 1509 | } | ||
| 1510 | |||
| 1511 | /* and vice versa (just in case) */ | ||
| 1512 | else if (intf == info->data && info->control) { | ||
| 1513 | /* ensure immediate exit from usbnet_disconnect */ | ||
| 1514 | usb_set_intfdata(info->control, NULL); | ||
| 1515 | usb_driver_release_interface (&usbnet_driver, info->control); | ||
| 1516 | info->control = NULL; | ||
| 1517 | } | ||
| 1518 | } | ||
| 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 | |||
| 1540 | |||
| 1541 | static void dumpspeed (struct usbnet *dev, __le32 *speeds) | ||
| 1542 | { | ||
| 1543 | if (netif_msg_timer (dev)) | ||
| 1544 | devinfo (dev, "link speeds: %u kbps up, %u kbps down", | ||
| 1545 | __le32_to_cpu(speeds[0]) / 1000, | ||
| 1546 | __le32_to_cpu(speeds[1]) / 1000); | ||
| 1547 | } | ||
| 1548 | |||
| 1549 | static void cdc_status (struct usbnet *dev, struct urb *urb) | ||
| 1550 | { | ||
| 1551 | struct usb_cdc_notification *event; | ||
| 1552 | |||
| 1553 | if (urb->actual_length < sizeof *event) | ||
| 1554 | return; | ||
| 1555 | |||
| 1556 | /* SPEED_CHANGE can get split into two 8-byte packets */ | ||
| 1557 | if (test_and_clear_bit (EVENT_STS_SPLIT, &dev->flags)) { | ||
| 1558 | dumpspeed (dev, (__le32 *) urb->transfer_buffer); | ||
| 1559 | return; | ||
| 1560 | } | ||
| 1561 | |||
| 1562 | event = urb->transfer_buffer; | ||
| 1563 | switch (event->bNotificationType) { | ||
| 1564 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: | ||
| 1565 | if (netif_msg_timer (dev)) | ||
| 1566 | devdbg (dev, "CDC: carrier %s", | ||
| 1567 | event->wValue ? "on" : "off"); | ||
| 1568 | if (event->wValue) | ||
| 1569 | netif_carrier_on(dev->net); | ||
| 1570 | else | ||
| 1571 | netif_carrier_off(dev->net); | ||
| 1572 | break; | ||
| 1573 | case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */ | ||
| 1574 | if (netif_msg_timer (dev)) | ||
| 1575 | devdbg (dev, "CDC: speed change (len %d)", | ||
| 1576 | urb->actual_length); | ||
| 1577 | if (urb->actual_length != (sizeof *event + 8)) | ||
| 1578 | set_bit (EVENT_STS_SPLIT, &dev->flags); | ||
| 1579 | else | ||
| 1580 | dumpspeed (dev, (__le32 *) &event[1]); | ||
| 1581 | break; | ||
| 1582 | // case USB_CDC_NOTIFY_RESPONSE_AVAILABLE: /* RNDIS; or unsolicited */ | ||
| 1583 | default: | ||
| 1584 | deverr (dev, "CDC: unexpected notification %02x!", | ||
| 1585 | event->bNotificationType); | ||
| 1586 | break; | ||
| 1587 | } | ||
| 1588 | } | ||
| 1589 | |||
| 1590 | static u8 nibble (unsigned char c) | ||
| 1591 | { | ||
| 1592 | if (likely (isdigit (c))) | ||
| 1593 | return c - '0'; | ||
| 1594 | c = toupper (c); | ||
| 1595 | if (likely (isxdigit (c))) | ||
| 1596 | return 10 + c - 'A'; | ||
| 1597 | return 0; | ||
| 1598 | } | ||
| 1599 | |||
| 1600 | static inline int | ||
| 1601 | get_ethernet_addr (struct usbnet *dev, struct usb_cdc_ether_desc *e) | ||
| 1602 | { | ||
| 1603 | int tmp, i; | ||
| 1604 | unsigned char buf [13]; | ||
| 1605 | |||
| 1606 | tmp = usb_string (dev->udev, e->iMACAddress, buf, sizeof buf); | ||
| 1607 | if (tmp != 12) { | ||
| 1608 | dev_dbg (&dev->udev->dev, | ||
| 1609 | "bad MAC string %d fetch, %d\n", e->iMACAddress, tmp); | ||
| 1610 | if (tmp >= 0) | ||
| 1611 | tmp = -EINVAL; | ||
| 1612 | return tmp; | ||
| 1613 | } | ||
| 1614 | for (i = tmp = 0; i < 6; i++, tmp += 2) | ||
| 1615 | dev->net->dev_addr [i] = | ||
| 1616 | (nibble (buf [tmp]) << 4) + nibble (buf [tmp + 1]); | ||
| 1617 | return 0; | ||
| 1618 | } | ||
| 1619 | |||
| 1620 | static int cdc_bind (struct usbnet *dev, struct usb_interface *intf) | ||
| 1621 | { | ||
| 1622 | int status; | ||
| 1623 | struct cdc_state *info = (void *) &dev->data; | ||
| 1624 | |||
| 1625 | status = generic_cdc_bind (dev, intf); | ||
| 1626 | if (status < 0) | ||
| 1627 | return status; | ||
| 1628 | |||
| 1629 | status = get_ethernet_addr (dev, info->ether); | ||
| 1630 | if (status < 0) { | ||
| 1631 | usb_set_intfdata(info->data, NULL); | ||
| 1632 | usb_driver_release_interface (&usbnet_driver, info->data); | ||
| 1633 | return status; | ||
| 1634 | } | ||
| 1635 | |||
| 1636 | /* FIXME cdc-ether has some multicast code too, though it complains | ||
| 1637 | * in routine cases. info->ether describes the multicast support. | ||
| 1638 | */ | ||
| 1639 | return 0; | ||
| 1640 | } | ||
| 1641 | |||
| 1642 | static const struct driver_info cdc_info = { | ||
| 1643 | .description = "CDC Ethernet Device", | ||
| 1644 | .flags = FLAG_ETHER, | ||
| 1645 | // .check_connect = cdc_check_connect, | ||
| 1646 | .bind = cdc_bind, | ||
| 1647 | .unbind = cdc_unbind, | ||
| 1648 | .status = cdc_status, | ||
| 1649 | }; | ||
| 1650 | |||
| 1651 | #endif /* CONFIG_USB_CDCETHER */ | ||
| 1652 | |||
| 1653 | |||
| 1654 | |||
| 1655 | #ifdef CONFIG_USB_EPSON2888 | ||
| 1656 | #define HAVE_HARDWARE | ||
| 1657 | |||
| 1658 | /*------------------------------------------------------------------------- | ||
| 1659 | * | ||
| 1660 | * EPSON USB clients | ||
| 1661 | * | ||
| 1662 | * This is the same idea as Linux PDAs (below) except the firmware in the | ||
| 1663 | * device might not be Tux-powered. Epson provides reference firmware that | ||
| 1664 | * implements this interface. Product developers can reuse or modify that | ||
| 1665 | * code, such as by using their own product and vendor codes. | ||
| 1666 | * | ||
| 1667 | * Support was from Juro Bystricky <bystricky.juro@erd.epson.com> | ||
| 1668 | * | ||
| 1669 | *-------------------------------------------------------------------------*/ | ||
| 1670 | |||
| 1671 | static const struct driver_info epson2888_info = { | ||
| 1672 | .description = "Epson USB Device", | ||
| 1673 | .check_connect = always_connected, | ||
| 1674 | |||
| 1675 | .in = 4, .out = 3, | ||
| 1676 | }; | ||
| 1677 | |||
| 1678 | #endif /* CONFIG_USB_EPSON2888 */ | ||
| 1679 | |||
| 1680 | |||
| 1681 | #ifdef CONFIG_USB_GENESYS | ||
| 1682 | #define HAVE_HARDWARE | ||
| 1683 | |||
| 1684 | /*------------------------------------------------------------------------- | ||
| 1685 | * | ||
| 1686 | * GeneSys GL620USB-A (www.genesyslogic.com.tw) | ||
| 1687 | * | ||
| 1688 | * ... should partially interop with the Win32 driver for this hardware | ||
| 1689 | * The GeneSys docs imply there's some NDIS issue motivating this framing. | ||
| 1690 | * | ||
| 1691 | * Some info from GeneSys: | ||
| 1692 | * - GL620USB-A is full duplex; GL620USB is only half duplex for bulk. | ||
| 1693 | * (Some cables, like the BAFO-100c, use the half duplex version.) | ||
| 1694 | * - For the full duplex model, the low bit of the version code says | ||
| 1695 | * which side is which ("left/right"). | ||
| 1696 | * - For the half duplex type, a control/interrupt handshake settles | ||
| 1697 | * the transfer direction. (That's disabled here, partially coded.) | ||
| 1698 | * A control URB would block until other side writes an interrupt. | ||
| 1699 | * | ||
| 1700 | * Original code from Jiun-Jie Huang <huangjj@genesyslogic.com.tw> | ||
| 1701 | * and merged into "usbnet" by Stanislav Brabec <utx@penguin.cz>. | ||
| 1702 | * | ||
| 1703 | *-------------------------------------------------------------------------*/ | ||
| 1704 | |||
| 1705 | // control msg write command | ||
| 1706 | #define GENELINK_CONNECT_WRITE 0xF0 | ||
| 1707 | // interrupt pipe index | ||
| 1708 | #define GENELINK_INTERRUPT_PIPE 0x03 | ||
| 1709 | // interrupt read buffer size | ||
| 1710 | #define INTERRUPT_BUFSIZE 0x08 | ||
| 1711 | // interrupt pipe interval value | ||
| 1712 | #define GENELINK_INTERRUPT_INTERVAL 0x10 | ||
| 1713 | // max transmit packet number per transmit | ||
| 1714 | #define GL_MAX_TRANSMIT_PACKETS 32 | ||
| 1715 | // max packet length | ||
| 1716 | #define GL_MAX_PACKET_LEN 1514 | ||
| 1717 | // max receive buffer size | ||
| 1718 | #define GL_RCV_BUF_SIZE \ | ||
| 1719 | (((GL_MAX_PACKET_LEN + 4) * GL_MAX_TRANSMIT_PACKETS) + 4) | ||
| 1720 | |||
| 1721 | struct gl_packet { | ||
| 1722 | u32 packet_length; | ||
| 1723 | char packet_data [1]; | ||
| 1724 | }; | ||
| 1725 | |||
| 1726 | struct gl_header { | ||
| 1727 | u32 packet_count; | ||
| 1728 | struct gl_packet packets; | ||
| 1729 | }; | ||
| 1730 | |||
| 1731 | #ifdef GENELINK_ACK | ||
| 1732 | |||
| 1733 | // FIXME: this code is incomplete, not debugged; it doesn't | ||
| 1734 | // handle interrupts correctly. interrupts should be generic | ||
| 1735 | // code like all other device I/O, anyway. | ||
| 1736 | |||
| 1737 | struct gl_priv { | ||
| 1738 | struct urb *irq_urb; | ||
| 1739 | char irq_buf [INTERRUPT_BUFSIZE]; | ||
| 1740 | }; | ||
| 1741 | |||
| 1742 | static inline int gl_control_write (struct usbnet *dev, u8 request, u16 value) | ||
| 1743 | { | ||
| 1744 | int retval; | ||
| 1745 | |||
| 1746 | retval = usb_control_msg (dev->udev, | ||
| 1747 | usb_sndctrlpipe (dev->udev, 0), | ||
| 1748 | request, | ||
| 1749 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
| 1750 | value, | ||
| 1751 | 0, // index | ||
| 1752 | 0, // data buffer | ||
| 1753 | 0, // size | ||
| 1754 | CONTROL_TIMEOUT_MS); | ||
| 1755 | return retval; | ||
| 1756 | } | ||
| 1757 | |||
| 1758 | static void gl_interrupt_complete (struct urb *urb, struct pt_regs *regs) | ||
| 1759 | { | ||
| 1760 | int status = urb->status; | ||
| 1761 | |||
| 1762 | switch (status) { | ||
| 1763 | case 0: | ||
| 1764 | /* success */ | ||
| 1765 | break; | ||
| 1766 | case -ECONNRESET: | ||
| 1767 | case -ENOENT: | ||
| 1768 | case -ESHUTDOWN: | ||
| 1769 | /* this urb is terminated, clean up */ | ||
| 1770 | dbg("%s - urb shutting down with status: %d", | ||
| 1771 | __FUNCTION__, status); | ||
| 1772 | return; | ||
| 1773 | default: | ||
| 1774 | dbg("%s - nonzero urb status received: %d", | ||
| 1775 | __FUNCTION__, urb->status); | ||
| 1776 | } | ||
| 1777 | |||
| 1778 | status = usb_submit_urb (urb, GFP_ATOMIC); | ||
| 1779 | if (status) | ||
| 1780 | err ("%s - usb_submit_urb failed with result %d", | ||
| 1781 | __FUNCTION__, status); | ||
| 1782 | } | ||
| 1783 | |||
| 1784 | static int gl_interrupt_read (struct usbnet *dev) | ||
| 1785 | { | ||
| 1786 | struct gl_priv *priv = dev->priv_data; | ||
| 1787 | int retval; | ||
| 1788 | |||
| 1789 | // issue usb interrupt read | ||
| 1790 | if (priv && priv->irq_urb) { | ||
| 1791 | // submit urb | ||
| 1792 | if ((retval = usb_submit_urb (priv->irq_urb, GFP_KERNEL)) != 0) | ||
| 1793 | dbg ("gl_interrupt_read: submit fail - %X...", retval); | ||
| 1794 | else | ||
| 1795 | dbg ("gl_interrupt_read: submit success..."); | ||
| 1796 | } | ||
| 1797 | |||
| 1798 | return 0; | ||
| 1799 | } | ||
| 1800 | |||
| 1801 | // check whether another side is connected | ||
| 1802 | static int genelink_check_connect (struct usbnet *dev) | ||
| 1803 | { | ||
| 1804 | int retval; | ||
| 1805 | |||
| 1806 | dbg ("genelink_check_connect..."); | ||
| 1807 | |||
| 1808 | // detect whether another side is connected | ||
| 1809 | if ((retval = gl_control_write (dev, GENELINK_CONNECT_WRITE, 0)) != 0) { | ||
| 1810 | dbg ("%s: genelink_check_connect write fail - %X", | ||
| 1811 | dev->net->name, retval); | ||
| 1812 | return retval; | ||
| 1813 | } | ||
| 1814 | |||
| 1815 | // usb interrupt read to ack another side | ||
| 1816 | if ((retval = gl_interrupt_read (dev)) != 0) { | ||
| 1817 | dbg ("%s: genelink_check_connect read fail - %X", | ||
| 1818 | dev->net->name, retval); | ||
| 1819 | return retval; | ||
| 1820 | } | ||
| 1821 | |||
| 1822 | dbg ("%s: genelink_check_connect read success", dev->net->name); | ||
| 1823 | return 0; | ||
| 1824 | } | ||
| 1825 | |||
| 1826 | // allocate and initialize the private data for genelink | ||
| 1827 | static int genelink_init (struct usbnet *dev) | ||
| 1828 | { | ||
| 1829 | struct gl_priv *priv; | ||
| 1830 | |||
| 1831 | // allocate the private data structure | ||
| 1832 | if ((priv = kmalloc (sizeof *priv, GFP_KERNEL)) == 0) { | ||
| 1833 | dbg ("%s: cannot allocate private data per device", | ||
| 1834 | dev->net->name); | ||
| 1835 | return -ENOMEM; | ||
| 1836 | } | ||
| 1837 | |||
| 1838 | // allocate irq urb | ||
| 1839 | if ((priv->irq_urb = usb_alloc_urb (0, GFP_KERNEL)) == 0) { | ||
| 1840 | dbg ("%s: cannot allocate private irq urb per device", | ||
| 1841 | dev->net->name); | ||
| 1842 | kfree (priv); | ||
| 1843 | return -ENOMEM; | ||
| 1844 | } | ||
| 1845 | |||
| 1846 | // fill irq urb | ||
| 1847 | usb_fill_int_urb (priv->irq_urb, dev->udev, | ||
| 1848 | usb_rcvintpipe (dev->udev, GENELINK_INTERRUPT_PIPE), | ||
| 1849 | priv->irq_buf, INTERRUPT_BUFSIZE, | ||
| 1850 | gl_interrupt_complete, 0, | ||
| 1851 | GENELINK_INTERRUPT_INTERVAL); | ||
| 1852 | |||
| 1853 | // set private data pointer | ||
| 1854 | dev->priv_data = priv; | ||
| 1855 | |||
| 1856 | return 0; | ||
| 1857 | } | ||
| 1858 | |||
| 1859 | // release the private data | ||
| 1860 | static int genelink_free (struct usbnet *dev) | ||
| 1861 | { | ||
| 1862 | struct gl_priv *priv = dev->priv_data; | ||
| 1863 | |||
| 1864 | if (!priv) | ||
| 1865 | return 0; | ||
| 1866 | |||
| 1867 | // FIXME: can't cancel here; it's synchronous, and | ||
| 1868 | // should have happened earlier in any case (interrupt | ||
| 1869 | // handling needs to be generic) | ||
| 1870 | |||
| 1871 | // cancel irq urb first | ||
| 1872 | usb_kill_urb (priv->irq_urb); | ||
| 1873 | |||
| 1874 | // free irq urb | ||
| 1875 | usb_free_urb (priv->irq_urb); | ||
| 1876 | |||
| 1877 | // free the private data structure | ||
| 1878 | kfree (priv); | ||
| 1879 | |||
| 1880 | return 0; | ||
| 1881 | } | ||
| 1882 | |||
| 1883 | #endif | ||
| 1884 | |||
| 1885 | static int genelink_rx_fixup (struct usbnet *dev, struct sk_buff *skb) | ||
| 1886 | { | ||
| 1887 | struct gl_header *header; | ||
| 1888 | struct gl_packet *packet; | ||
| 1889 | struct sk_buff *gl_skb; | ||
| 1890 | u32 size; | ||
| 1891 | |||
| 1892 | header = (struct gl_header *) skb->data; | ||
| 1893 | |||
| 1894 | // get the packet count of the received skb | ||
| 1895 | le32_to_cpus (&header->packet_count); | ||
| 1896 | if ((header->packet_count > GL_MAX_TRANSMIT_PACKETS) | ||
| 1897 | || (header->packet_count < 0)) { | ||
| 1898 | dbg ("genelink: invalid received packet count %d", | ||
| 1899 | header->packet_count); | ||
| 1900 | return 0; | ||
| 1901 | } | ||
| 1902 | |||
| 1903 | // set the current packet pointer to the first packet | ||
| 1904 | packet = &header->packets; | ||
| 1905 | |||
| 1906 | // decrement the length for the packet count size 4 bytes | ||
| 1907 | skb_pull (skb, 4); | ||
| 1908 | |||
| 1909 | while (header->packet_count > 1) { | ||
| 1910 | // get the packet length | ||
| 1911 | size = packet->packet_length; | ||
| 1912 | |||
| 1913 | // this may be a broken packet | ||
| 1914 | if (size > GL_MAX_PACKET_LEN) { | ||
| 1915 | dbg ("genelink: invalid rx length %d", size); | ||
| 1916 | return 0; | ||
| 1917 | } | ||
| 1918 | |||
| 1919 | // allocate the skb for the individual packet | ||
| 1920 | gl_skb = alloc_skb (size, GFP_ATOMIC); | ||
| 1921 | if (gl_skb) { | ||
| 1922 | |||
| 1923 | // copy the packet data to the new skb | ||
| 1924 | memcpy(skb_put(gl_skb, size), packet->packet_data, size); | ||
| 1925 | skb_return (dev, gl_skb); | ||
| 1926 | } | ||
| 1927 | |||
| 1928 | // advance to the next packet | ||
| 1929 | packet = (struct gl_packet *) | ||
| 1930 | &packet->packet_data [size]; | ||
| 1931 | header->packet_count--; | ||
| 1932 | |||
| 1933 | // shift the data pointer to the next gl_packet | ||
| 1934 | skb_pull (skb, size + 4); | ||
| 1935 | } | ||
| 1936 | |||
| 1937 | // skip the packet length field 4 bytes | ||
| 1938 | skb_pull (skb, 4); | ||
| 1939 | |||
| 1940 | if (skb->len > GL_MAX_PACKET_LEN) { | ||
| 1941 | dbg ("genelink: invalid rx length %d", skb->len); | ||
| 1942 | return 0; | ||
| 1943 | } | ||
| 1944 | return 1; | ||
| 1945 | } | ||
| 1946 | |||
| 1947 | static struct sk_buff * | ||
| 1948 | genelink_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags) | ||
| 1949 | { | ||
| 1950 | int padlen; | ||
| 1951 | int length = skb->len; | ||
| 1952 | int headroom = skb_headroom (skb); | ||
| 1953 | int tailroom = skb_tailroom (skb); | ||
| 1954 | u32 *packet_count; | ||
| 1955 | u32 *packet_len; | ||
| 1956 | |||
| 1957 | // FIXME: magic numbers, bleech | ||
| 1958 | padlen = ((skb->len + (4 + 4*1)) % 64) ? 0 : 1; | ||
| 1959 | |||
| 1960 | if ((!skb_cloned (skb)) | ||
| 1961 | && ((headroom + tailroom) >= (padlen + (4 + 4*1)))) { | ||
| 1962 | if ((headroom < (4 + 4*1)) || (tailroom < padlen)) { | ||
| 1963 | skb->data = memmove (skb->head + (4 + 4*1), | ||
| 1964 | skb->data, skb->len); | ||
| 1965 | skb->tail = skb->data + skb->len; | ||
| 1966 | } | ||
| 1967 | } else { | ||
| 1968 | struct sk_buff *skb2; | ||
| 1969 | skb2 = skb_copy_expand (skb, (4 + 4*1) , padlen, flags); | ||
| 1970 | dev_kfree_skb_any (skb); | ||
| 1971 | skb = skb2; | ||
| 1972 | if (!skb) | ||
| 1973 | return NULL; | ||
| 1974 | } | ||
| 1975 | |||
| 1976 | // attach the packet count to the header | ||
| 1977 | packet_count = (u32 *) skb_push (skb, (4 + 4*1)); | ||
| 1978 | packet_len = packet_count + 1; | ||
| 1979 | |||
| 1980 | // FIXME little endian? | ||
| 1981 | *packet_count = 1; | ||
| 1982 | *packet_len = length; | ||
| 1983 | |||
| 1984 | // add padding byte | ||
| 1985 | if ((skb->len % dev->maxpacket) == 0) | ||
| 1986 | skb_put (skb, 1); | ||
| 1987 | |||
| 1988 | return skb; | ||
| 1989 | } | ||
| 1990 | |||
| 1991 | static const struct driver_info genelink_info = { | ||
| 1992 | .description = "Genesys GeneLink", | ||
| 1993 | .flags = FLAG_FRAMING_GL | FLAG_NO_SETINT, | ||
| 1994 | .rx_fixup = genelink_rx_fixup, | ||
| 1995 | .tx_fixup = genelink_tx_fixup, | ||
| 1996 | |||
| 1997 | .in = 1, .out = 2, | ||
| 1998 | |||
| 1999 | #ifdef GENELINK_ACK | ||
| 2000 | .check_connect =genelink_check_connect, | ||
| 2001 | #endif | ||
| 2002 | }; | ||
| 2003 | |||
| 2004 | #endif /* CONFIG_USB_GENESYS */ | ||
| 2005 | |||
| 2006 | |||
| 2007 | |||
| 2008 | #ifdef CONFIG_USB_NET1080 | ||
| 2009 | #define HAVE_HARDWARE | ||
| 2010 | |||
| 2011 | /*------------------------------------------------------------------------- | ||
| 2012 | * | ||
| 2013 | * Netchip 1080 driver ... http://www.netchip.com | ||
| 2014 | * Used in LapLink cables | ||
| 2015 | * | ||
| 2016 | *-------------------------------------------------------------------------*/ | ||
| 2017 | |||
| 2018 | #define dev_packet_id data[0] | ||
| 2019 | #define frame_errors data[1] | ||
| 2020 | |||
| 2021 | /* | ||
| 2022 | * NetChip framing of ethernet packets, supporting additional error | ||
| 2023 | * checks for links that may drop bulk packets from inside messages. | ||
| 2024 | * Odd USB length == always short read for last usb packet. | ||
| 2025 | * - nc_header | ||
| 2026 | * - Ethernet header (14 bytes) | ||
| 2027 | * - payload | ||
| 2028 | * - (optional padding byte, if needed so length becomes odd) | ||
| 2029 | * - nc_trailer | ||
| 2030 | * | ||
| 2031 | * This framing is to be avoided for non-NetChip devices. | ||
| 2032 | */ | ||
| 2033 | |||
| 2034 | struct nc_header { // packed: | ||
| 2035 | __le16 hdr_len; // sizeof nc_header (LE, all) | ||
| 2036 | __le16 packet_len; // payload size (including ethhdr) | ||
| 2037 | __le16 packet_id; // detects dropped packets | ||
| 2038 | #define MIN_HEADER 6 | ||
| 2039 | |||
| 2040 | // all else is optional, and must start with: | ||
| 2041 | // u16 vendorId; // from usb-if | ||
| 2042 | // u16 productId; | ||
| 2043 | } __attribute__((__packed__)); | ||
| 2044 | |||
| 2045 | #define PAD_BYTE ((unsigned char)0xAC) | ||
| 2046 | |||
| 2047 | struct nc_trailer { | ||
| 2048 | __le16 packet_id; | ||
| 2049 | } __attribute__((__packed__)); | ||
| 2050 | |||
| 2051 | // packets may use FLAG_FRAMING_NC and optional pad | ||
| 2052 | #define FRAMED_SIZE(mtu) (sizeof (struct nc_header) \ | ||
| 2053 | + sizeof (struct ethhdr) \ | ||
| 2054 | + (mtu) \ | ||
| 2055 | + 1 \ | ||
| 2056 | + sizeof (struct nc_trailer)) | ||
| 2057 | |||
| 2058 | #define MIN_FRAMED FRAMED_SIZE(0) | ||
| 2059 | |||
| 2060 | |||
| 2061 | /* | ||
| 2062 | * Zero means no timeout; else, how long a 64 byte bulk packet may be queued | ||
| 2063 | * before the hardware drops it. If that's done, the driver will need to | ||
| 2064 | * frame network packets to guard against the dropped USB packets. The win32 | ||
| 2065 | * driver sets this for both sides of the link. | ||
| 2066 | */ | ||
| 2067 | #define NC_READ_TTL_MS ((u8)255) // ms | ||
| 2068 | |||
| 2069 | /* | ||
| 2070 | * We ignore most registers and EEPROM contents. | ||
| 2071 | */ | ||
| 2072 | #define REG_USBCTL ((u8)0x04) | ||
| 2073 | #define REG_TTL ((u8)0x10) | ||
| 2074 | #define REG_STATUS ((u8)0x11) | ||
| 2075 | |||
| 2076 | /* | ||
| 2077 | * Vendor specific requests to read/write data | ||
| 2078 | */ | ||
| 2079 | #define REQUEST_REGISTER ((u8)0x10) | ||
| 2080 | #define REQUEST_EEPROM ((u8)0x11) | ||
| 2081 | |||
| 2082 | static int | ||
| 2083 | nc_vendor_read (struct usbnet *dev, u8 req, u8 regnum, u16 *retval_ptr) | ||
| 2084 | { | ||
| 2085 | int status = usb_control_msg (dev->udev, | ||
| 2086 | usb_rcvctrlpipe (dev->udev, 0), | ||
| 2087 | req, | ||
| 2088 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 2089 | 0, regnum, | ||
| 2090 | retval_ptr, sizeof *retval_ptr, | ||
| 2091 | CONTROL_TIMEOUT_MS); | ||
| 2092 | if (status > 0) | ||
| 2093 | status = 0; | ||
| 2094 | if (!status) | ||
| 2095 | le16_to_cpus (retval_ptr); | ||
| 2096 | return status; | ||
| 2097 | } | ||
| 2098 | |||
| 2099 | static inline int | ||
| 2100 | nc_register_read (struct usbnet *dev, u8 regnum, u16 *retval_ptr) | ||
| 2101 | { | ||
| 2102 | return nc_vendor_read (dev, REQUEST_REGISTER, regnum, retval_ptr); | ||
| 2103 | } | ||
| 2104 | |||
| 2105 | // no retval ... can become async, usable in_interrupt() | ||
| 2106 | static void | ||
| 2107 | nc_vendor_write (struct usbnet *dev, u8 req, u8 regnum, u16 value) | ||
| 2108 | { | ||
| 2109 | usb_control_msg (dev->udev, | ||
| 2110 | usb_sndctrlpipe (dev->udev, 0), | ||
| 2111 | req, | ||
| 2112 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 2113 | value, regnum, | ||
| 2114 | NULL, 0, // data is in setup packet | ||
| 2115 | CONTROL_TIMEOUT_MS); | ||
| 2116 | } | ||
| 2117 | |||
| 2118 | static inline void | ||
| 2119 | nc_register_write (struct usbnet *dev, u8 regnum, u16 value) | ||
| 2120 | { | ||
| 2121 | nc_vendor_write (dev, REQUEST_REGISTER, regnum, value); | ||
| 2122 | } | ||
| 2123 | |||
| 2124 | |||
| 2125 | #if 0 | ||
| 2126 | static void nc_dump_registers (struct usbnet *dev) | ||
| 2127 | { | ||
| 2128 | u8 reg; | ||
| 2129 | u16 *vp = kmalloc (sizeof (u16)); | ||
| 2130 | |||
| 2131 | if (!vp) { | ||
| 2132 | dbg ("no memory?"); | ||
| 2133 | return; | ||
| 2134 | } | ||
| 2135 | |||
| 2136 | dbg ("%s registers:", dev->net->name); | ||
| 2137 | for (reg = 0; reg < 0x20; reg++) { | ||
| 2138 | int retval; | ||
| 2139 | |||
| 2140 | // reading some registers is trouble | ||
| 2141 | if (reg >= 0x08 && reg <= 0xf) | ||
| 2142 | continue; | ||
| 2143 | if (reg >= 0x12 && reg <= 0x1e) | ||
| 2144 | continue; | ||
| 2145 | |||
| 2146 | retval = nc_register_read (dev, reg, vp); | ||
| 2147 | if (retval < 0) | ||
| 2148 | dbg ("%s reg [0x%x] ==> error %d", | ||
| 2149 | dev->net->name, reg, retval); | ||
| 2150 | else | ||
| 2151 | dbg ("%s reg [0x%x] = 0x%x", | ||
| 2152 | dev->net->name, reg, *vp); | ||
| 2153 | } | ||
| 2154 | kfree (vp); | ||
| 2155 | } | ||
| 2156 | #endif | ||
| 2157 | |||
| 2158 | |||
| 2159 | /*-------------------------------------------------------------------------*/ | ||
| 2160 | |||
| 2161 | /* | ||
| 2162 | * Control register | ||
| 2163 | */ | ||
| 2164 | |||
| 2165 | #define USBCTL_WRITABLE_MASK 0x1f0f | ||
| 2166 | // bits 15-13 reserved, r/o | ||
| 2167 | #define USBCTL_ENABLE_LANG (1 << 12) | ||
| 2168 | #define USBCTL_ENABLE_MFGR (1 << 11) | ||
| 2169 | #define USBCTL_ENABLE_PROD (1 << 10) | ||
| 2170 | #define USBCTL_ENABLE_SERIAL (1 << 9) | ||
| 2171 | #define USBCTL_ENABLE_DEFAULTS (1 << 8) | ||
| 2172 | // bits 7-4 reserved, r/o | ||
| 2173 | #define USBCTL_FLUSH_OTHER (1 << 3) | ||
| 2174 | #define USBCTL_FLUSH_THIS (1 << 2) | ||
| 2175 | #define USBCTL_DISCONN_OTHER (1 << 1) | ||
| 2176 | #define USBCTL_DISCONN_THIS (1 << 0) | ||
| 2177 | |||
| 2178 | static inline void nc_dump_usbctl (struct usbnet *dev, u16 usbctl) | ||
| 2179 | { | ||
| 2180 | if (!netif_msg_link (dev)) | ||
| 2181 | return; | ||
| 2182 | devdbg (dev, "net1080 %s-%s usbctl 0x%x:%s%s%s%s%s;" | ||
| 2183 | " this%s%s;" | ||
| 2184 | " other%s%s; r/o 0x%x", | ||
| 2185 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 2186 | usbctl, | ||
| 2187 | (usbctl & USBCTL_ENABLE_LANG) ? " lang" : "", | ||
| 2188 | (usbctl & USBCTL_ENABLE_MFGR) ? " mfgr" : "", | ||
| 2189 | (usbctl & USBCTL_ENABLE_PROD) ? " prod" : "", | ||
| 2190 | (usbctl & USBCTL_ENABLE_SERIAL) ? " serial" : "", | ||
| 2191 | (usbctl & USBCTL_ENABLE_DEFAULTS) ? " defaults" : "", | ||
| 2192 | |||
| 2193 | (usbctl & USBCTL_FLUSH_OTHER) ? " FLUSH" : "", | ||
| 2194 | (usbctl & USBCTL_DISCONN_OTHER) ? " DIS" : "", | ||
| 2195 | (usbctl & USBCTL_FLUSH_THIS) ? " FLUSH" : "", | ||
| 2196 | (usbctl & USBCTL_DISCONN_THIS) ? " DIS" : "", | ||
| 2197 | usbctl & ~USBCTL_WRITABLE_MASK | ||
| 2198 | ); | ||
| 2199 | } | ||
| 2200 | |||
| 2201 | /*-------------------------------------------------------------------------*/ | ||
| 2202 | |||
| 2203 | /* | ||
| 2204 | * Status register | ||
| 2205 | */ | ||
| 2206 | |||
| 2207 | #define STATUS_PORT_A (1 << 15) | ||
| 2208 | |||
| 2209 | #define STATUS_CONN_OTHER (1 << 14) | ||
| 2210 | #define STATUS_SUSPEND_OTHER (1 << 13) | ||
| 2211 | #define STATUS_MAILBOX_OTHER (1 << 12) | ||
| 2212 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03) | ||
| 2213 | |||
| 2214 | #define STATUS_CONN_THIS (1 << 6) | ||
| 2215 | #define STATUS_SUSPEND_THIS (1 << 5) | ||
| 2216 | #define STATUS_MAILBOX_THIS (1 << 4) | ||
| 2217 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03) | ||
| 2218 | |||
| 2219 | #define STATUS_UNSPEC_MASK 0x0c8c | ||
| 2220 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) | ||
| 2221 | |||
| 2222 | |||
| 2223 | static inline void nc_dump_status (struct usbnet *dev, u16 status) | ||
| 2224 | { | ||
| 2225 | if (!netif_msg_link (dev)) | ||
| 2226 | return; | ||
| 2227 | devdbg (dev, "net1080 %s-%s status 0x%x:" | ||
| 2228 | " this (%c) PKT=%d%s%s%s;" | ||
| 2229 | " other PKT=%d%s%s%s; unspec 0x%x", | ||
| 2230 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 2231 | status, | ||
| 2232 | |||
| 2233 | // XXX the packet counts don't seem right | ||
| 2234 | // (1 at reset, not 0); maybe UNSPEC too | ||
| 2235 | |||
| 2236 | (status & STATUS_PORT_A) ? 'A' : 'B', | ||
| 2237 | STATUS_PACKETS_THIS (status), | ||
| 2238 | (status & STATUS_CONN_THIS) ? " CON" : "", | ||
| 2239 | (status & STATUS_SUSPEND_THIS) ? " SUS" : "", | ||
| 2240 | (status & STATUS_MAILBOX_THIS) ? " MBOX" : "", | ||
| 2241 | |||
| 2242 | STATUS_PACKETS_OTHER (status), | ||
| 2243 | (status & STATUS_CONN_OTHER) ? " CON" : "", | ||
| 2244 | (status & STATUS_SUSPEND_OTHER) ? " SUS" : "", | ||
| 2245 | (status & STATUS_MAILBOX_OTHER) ? " MBOX" : "", | ||
| 2246 | |||
| 2247 | status & STATUS_UNSPEC_MASK | ||
| 2248 | ); | ||
| 2249 | } | ||
| 2250 | |||
| 2251 | /*-------------------------------------------------------------------------*/ | ||
| 2252 | |||
| 2253 | /* | ||
| 2254 | * TTL register | ||
| 2255 | */ | ||
| 2256 | |||
| 2257 | #define TTL_THIS(ttl) (0x00ff & ttl) | ||
| 2258 | #define TTL_OTHER(ttl) (0x00ff & (ttl >> 8)) | ||
| 2259 | #define MK_TTL(this,other) ((u16)(((other)<<8)|(0x00ff&(this)))) | ||
| 2260 | |||
| 2261 | static inline void nc_dump_ttl (struct usbnet *dev, u16 ttl) | ||
| 2262 | { | ||
| 2263 | if (netif_msg_link (dev)) | ||
| 2264 | devdbg (dev, "net1080 %s-%s ttl 0x%x this = %d, other = %d", | ||
| 2265 | dev->udev->bus->bus_name, dev->udev->devpath, | ||
| 2266 | ttl, TTL_THIS (ttl), TTL_OTHER (ttl)); | ||
| 2267 | } | ||
| 2268 | |||
| 2269 | /*-------------------------------------------------------------------------*/ | ||
| 2270 | |||
| 2271 | static int net1080_reset (struct usbnet *dev) | ||
| 2272 | { | ||
| 2273 | u16 usbctl, status, ttl; | ||
| 2274 | u16 *vp = kmalloc (sizeof (u16), GFP_KERNEL); | ||
| 2275 | int retval; | ||
| 2276 | |||
| 2277 | if (!vp) | ||
| 2278 | return -ENOMEM; | ||
| 2279 | |||
| 2280 | // nc_dump_registers (dev); | ||
| 2281 | |||
| 2282 | if ((retval = nc_register_read (dev, REG_STATUS, vp)) < 0) { | ||
| 2283 | dbg ("can't read %s-%s status: %d", | ||
| 2284 | dev->udev->bus->bus_name, dev->udev->devpath, retval); | ||
| 2285 | goto done; | ||
| 2286 | } | ||
| 2287 | status = *vp; | ||
| 2288 | nc_dump_status (dev, status); | ||
| 2289 | |||
| 2290 | if ((retval = nc_register_read (dev, REG_USBCTL, vp)) < 0) { | ||
| 2291 | dbg ("can't read USBCTL, %d", retval); | ||
| 2292 | goto done; | ||
| 2293 | } | ||
| 2294 | usbctl = *vp; | ||
| 2295 | nc_dump_usbctl (dev, usbctl); | ||
| 2296 | |||
| 2297 | nc_register_write (dev, REG_USBCTL, | ||
| 2298 | USBCTL_FLUSH_THIS | USBCTL_FLUSH_OTHER); | ||
| 2299 | |||
| 2300 | if ((retval = nc_register_read (dev, REG_TTL, vp)) < 0) { | ||
| 2301 | dbg ("can't read TTL, %d", retval); | ||
| 2302 | goto done; | ||
| 2303 | } | ||
| 2304 | ttl = *vp; | ||
| 2305 | // nc_dump_ttl (dev, ttl); | ||
| 2306 | |||
| 2307 | nc_register_write (dev, REG_TTL, | ||
| 2308 | MK_TTL (NC_READ_TTL_MS, TTL_OTHER (ttl)) ); | ||
| 2309 | dbg ("%s: assigned TTL, %d ms", dev->net->name, NC_READ_TTL_MS); | ||
| 2310 | |||
| 2311 | if (netif_msg_link (dev)) | ||
| 2312 | devinfo (dev, "port %c, peer %sconnected", | ||
| 2313 | (status & STATUS_PORT_A) ? 'A' : 'B', | ||
| 2314 | (status & STATUS_CONN_OTHER) ? "" : "dis" | ||
| 2315 | ); | ||
| 2316 | retval = 0; | ||
| 2317 | |||
| 2318 | done: | ||
| 2319 | kfree (vp); | ||
| 2320 | return retval; | ||
| 2321 | } | ||
| 2322 | |||
| 2323 | static int net1080_check_connect (struct usbnet *dev) | ||
| 2324 | { | ||
| 2325 | int retval; | ||
| 2326 | u16 status; | ||
| 2327 | u16 *vp = kmalloc (sizeof (u16), GFP_KERNEL); | ||
| 2328 | |||
| 2329 | if (!vp) | ||
| 2330 | return -ENOMEM; | ||
| 2331 | retval = nc_register_read (dev, REG_STATUS, vp); | ||
| 2332 | status = *vp; | ||
| 2333 | kfree (vp); | ||
| 2334 | if (retval != 0) { | ||
| 2335 | dbg ("%s net1080_check_conn read - %d", dev->net->name, retval); | ||
| 2336 | return retval; | ||
| 2337 | } | ||
| 2338 | if ((status & STATUS_CONN_OTHER) != STATUS_CONN_OTHER) | ||
| 2339 | return -ENOLINK; | ||
| 2340 | return 0; | ||
| 2341 | } | ||
| 2342 | |||
| 2343 | static void nc_flush_complete (struct urb *urb, struct pt_regs *regs) | ||
| 2344 | { | ||
| 2345 | kfree (urb->context); | ||
| 2346 | usb_free_urb(urb); | ||
| 2347 | } | ||
| 2348 | |||
| 2349 | static void nc_ensure_sync (struct usbnet *dev) | ||
| 2350 | { | ||
| 2351 | dev->frame_errors++; | ||
| 2352 | if (dev->frame_errors > 5) { | ||
| 2353 | struct urb *urb; | ||
| 2354 | struct usb_ctrlrequest *req; | ||
| 2355 | int status; | ||
| 2356 | |||
| 2357 | /* Send a flush */ | ||
| 2358 | urb = usb_alloc_urb (0, SLAB_ATOMIC); | ||
| 2359 | if (!urb) | ||
| 2360 | return; | ||
| 2361 | |||
| 2362 | req = kmalloc (sizeof *req, GFP_ATOMIC); | ||
| 2363 | if (!req) { | ||
| 2364 | usb_free_urb (urb); | ||
| 2365 | return; | ||
| 2366 | } | ||
| 2367 | |||
| 2368 | req->bRequestType = USB_DIR_OUT | ||
| 2369 | | USB_TYPE_VENDOR | ||
| 2370 | | USB_RECIP_DEVICE; | ||
| 2371 | req->bRequest = REQUEST_REGISTER; | ||
| 2372 | req->wValue = cpu_to_le16 (USBCTL_FLUSH_THIS | ||
| 2373 | | USBCTL_FLUSH_OTHER); | ||
| 2374 | req->wIndex = cpu_to_le16 (REG_USBCTL); | ||
| 2375 | req->wLength = cpu_to_le16 (0); | ||
| 2376 | |||
| 2377 | /* queue an async control request, we don't need | ||
| 2378 | * to do anything when it finishes except clean up. | ||
| 2379 | */ | ||
| 2380 | usb_fill_control_urb (urb, dev->udev, | ||
| 2381 | usb_sndctrlpipe (dev->udev, 0), | ||
| 2382 | (unsigned char *) req, | ||
| 2383 | NULL, 0, | ||
| 2384 | nc_flush_complete, req); | ||
| 2385 | status = usb_submit_urb (urb, GFP_ATOMIC); | ||
| 2386 | if (status) { | ||
| 2387 | kfree (req); | ||
| 2388 | usb_free_urb (urb); | ||
| 2389 | return; | ||
| 2390 | } | ||
| 2391 | |||
| 2392 | if (netif_msg_rx_err (dev)) | ||
| 2393 | devdbg (dev, "flush net1080; too many framing errors"); | ||
| 2394 | dev->frame_errors = 0; | ||
| 2395 | } | ||
| 2396 | } | ||
| 2397 | |||
| 2398 | static int net1080_rx_fixup (struct usbnet *dev, struct sk_buff *skb) | ||
| 2399 | { | ||
| 2400 | struct nc_header *header; | ||
| 2401 | struct nc_trailer *trailer; | ||
| 2402 | u16 hdr_len, packet_len; | ||
| 2403 | |||
| 2404 | if (!(skb->len & 0x01) | ||
| 2405 | || MIN_FRAMED > skb->len | ||
| 2406 | || skb->len > FRAMED_SIZE (dev->net->mtu)) { | ||
| 2407 | dev->stats.rx_frame_errors++; | ||
| 2408 | dbg ("rx framesize %d range %d..%d mtu %d", skb->len, | ||
| 2409 | (int)MIN_FRAMED, (int)FRAMED_SIZE (dev->net->mtu), | ||
| 2410 | dev->net->mtu); | ||
| 2411 | nc_ensure_sync (dev); | ||
| 2412 | return 0; | ||
| 2413 | } | ||
| 2414 | |||
| 2415 | header = (struct nc_header *) skb->data; | ||
| 2416 | hdr_len = le16_to_cpup (&header->hdr_len); | ||
| 2417 | packet_len = le16_to_cpup (&header->packet_len); | ||
| 2418 | if (FRAMED_SIZE (packet_len) > MAX_PACKET) { | ||
| 2419 | dev->stats.rx_frame_errors++; | ||
| 2420 | dbg ("packet too big, %d", packet_len); | ||
| 2421 | nc_ensure_sync (dev); | ||
| 2422 | return 0; | ||
| 2423 | } else if (hdr_len < MIN_HEADER) { | ||
| 2424 | dev->stats.rx_frame_errors++; | ||
| 2425 | dbg ("header too short, %d", hdr_len); | ||
| 2426 | nc_ensure_sync (dev); | ||
| 2427 | return 0; | ||
| 2428 | } else if (hdr_len > MIN_HEADER) { | ||
| 2429 | // out of band data for us? | ||
| 2430 | dbg ("header OOB, %d bytes", hdr_len - MIN_HEADER); | ||
| 2431 | nc_ensure_sync (dev); | ||
| 2432 | // switch (vendor/product ids) { ... } | ||
| 2433 | } | ||
| 2434 | skb_pull (skb, hdr_len); | ||
| 2435 | |||
| 2436 | trailer = (struct nc_trailer *) | ||
| 2437 | (skb->data + skb->len - sizeof *trailer); | ||
| 2438 | skb_trim (skb, skb->len - sizeof *trailer); | ||
| 2439 | |||
| 2440 | if ((packet_len & 0x01) == 0) { | ||
| 2441 | if (skb->data [packet_len] != PAD_BYTE) { | ||
| 2442 | dev->stats.rx_frame_errors++; | ||
| 2443 | dbg ("bad pad"); | ||
| 2444 | return 0; | ||
| 2445 | } | ||
| 2446 | skb_trim (skb, skb->len - 1); | ||
| 2447 | } | ||
| 2448 | if (skb->len != packet_len) { | ||
| 2449 | dev->stats.rx_frame_errors++; | ||
| 2450 | dbg ("bad packet len %d (expected %d)", | ||
| 2451 | skb->len, packet_len); | ||
| 2452 | nc_ensure_sync (dev); | ||
| 2453 | return 0; | ||
| 2454 | } | ||
| 2455 | if (header->packet_id != get_unaligned (&trailer->packet_id)) { | ||
| 2456 | dev->stats.rx_fifo_errors++; | ||
| 2457 | dbg ("(2+ dropped) rx packet_id mismatch 0x%x 0x%x", | ||
| 2458 | le16_to_cpu (header->packet_id), | ||
| 2459 | le16_to_cpu (trailer->packet_id)); | ||
| 2460 | return 0; | ||
| 2461 | } | ||
| 2462 | #if 0 | ||
| 2463 | devdbg (dev, "frame <rx h %d p %d id %d", header->hdr_len, | ||
| 2464 | header->packet_len, header->packet_id); | ||
| 2465 | #endif | ||
| 2466 | dev->frame_errors = 0; | ||
| 2467 | return 1; | ||
| 2468 | } | ||
| 2469 | |||
| 2470 | static struct sk_buff * | ||
| 2471 | net1080_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags) | ||
| 2472 | { | ||
| 2473 | int padlen; | ||
| 2474 | struct sk_buff *skb2; | ||
| 2475 | |||
| 2476 | padlen = ((skb->len + sizeof (struct nc_header) | ||
| 2477 | + sizeof (struct nc_trailer)) & 0x01) ? 0 : 1; | ||
| 2478 | if (!skb_cloned (skb)) { | ||
| 2479 | int headroom = skb_headroom (skb); | ||
| 2480 | int tailroom = skb_tailroom (skb); | ||
| 2481 | |||
| 2482 | if ((padlen + sizeof (struct nc_trailer)) <= tailroom | ||
| 2483 | && sizeof (struct nc_header) <= headroom) | ||
| 2484 | /* There's enough head and tail room */ | ||
| 2485 | return skb; | ||
| 2486 | |||
| 2487 | if ((sizeof (struct nc_header) + padlen | ||
| 2488 | + sizeof (struct nc_trailer)) < | ||
| 2489 | (headroom + tailroom)) { | ||
| 2490 | /* There's enough total room, so just readjust */ | ||
| 2491 | skb->data = memmove (skb->head | ||
| 2492 | + sizeof (struct nc_header), | ||
| 2493 | skb->data, skb->len); | ||
| 2494 | skb->tail = skb->data + skb->len; | ||
| 2495 | return skb; | ||
| 2496 | } | ||
| 2497 | } | ||
| 2498 | |||
| 2499 | /* Create a new skb to use with the correct size */ | ||
| 2500 | skb2 = skb_copy_expand (skb, | ||
| 2501 | sizeof (struct nc_header), | ||
| 2502 | sizeof (struct nc_trailer) + padlen, | ||
| 2503 | flags); | ||
| 2504 | dev_kfree_skb_any (skb); | ||
| 2505 | return skb2; | ||
| 2506 | } | ||
| 2507 | |||
| 2508 | static const struct driver_info net1080_info = { | ||
| 2509 | .description = "NetChip TurboCONNECT", | ||
| 2510 | .flags = FLAG_FRAMING_NC, | ||
| 2511 | .reset = net1080_reset, | ||
| 2512 | .check_connect =net1080_check_connect, | ||
| 2513 | .rx_fixup = net1080_rx_fixup, | ||
| 2514 | .tx_fixup = net1080_tx_fixup, | ||
| 2515 | }; | ||
| 2516 | |||
| 2517 | #endif /* CONFIG_USB_NET1080 */ | ||
| 2518 | |||
| 2519 | |||
| 2520 | |||
| 2521 | #ifdef CONFIG_USB_PL2301 | ||
| 2522 | #define HAVE_HARDWARE | ||
| 2523 | |||
| 2524 | /*------------------------------------------------------------------------- | ||
| 2525 | * | ||
| 2526 | * Prolific PL-2301/PL-2302 driver ... http://www.prolifictech.com | ||
| 2527 | * | ||
| 2528 | * The protocol and handshaking used here should be bug-compatible | ||
| 2529 | * with the Linux 2.2 "plusb" driver, by Deti Fliegl. | ||
| 2530 | * | ||
| 2531 | *-------------------------------------------------------------------------*/ | ||
| 2532 | |||
| 2533 | /* | ||
| 2534 | * Bits 0-4 can be used for software handshaking; they're set from | ||
| 2535 | * one end, cleared from the other, "read" with the interrupt byte. | ||
| 2536 | */ | ||
| 2537 | #define PL_S_EN (1<<7) /* (feature only) suspend enable */ | ||
| 2538 | /* reserved bit -- rx ready (6) ? */ | ||
| 2539 | #define PL_TX_READY (1<<5) /* (interrupt only) transmit ready */ | ||
| 2540 | #define PL_RESET_OUT (1<<4) /* reset output pipe */ | ||
| 2541 | #define PL_RESET_IN (1<<3) /* reset input pipe */ | ||
| 2542 | #define PL_TX_C (1<<2) /* transmission complete */ | ||
| 2543 | #define PL_TX_REQ (1<<1) /* transmission received */ | ||
| 2544 | #define PL_PEER_E (1<<0) /* peer exists */ | ||
| 2545 | |||
| 2546 | static inline int | ||
| 2547 | pl_vendor_req (struct usbnet *dev, u8 req, u8 val, u8 index) | ||
| 2548 | { | ||
| 2549 | return usb_control_msg (dev->udev, | ||
| 2550 | usb_rcvctrlpipe (dev->udev, 0), | ||
| 2551 | req, | ||
| 2552 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 2553 | val, index, | ||
| 2554 | NULL, 0, | ||
| 2555 | CONTROL_TIMEOUT_MS); | ||
| 2556 | } | ||
| 2557 | |||
| 2558 | static inline int | ||
| 2559 | pl_clear_QuickLink_features (struct usbnet *dev, int val) | ||
| 2560 | { | ||
| 2561 | return pl_vendor_req (dev, 1, (u8) val, 0); | ||
| 2562 | } | ||
| 2563 | |||
| 2564 | static inline int | ||
| 2565 | pl_set_QuickLink_features (struct usbnet *dev, int val) | ||
| 2566 | { | ||
| 2567 | return pl_vendor_req (dev, 3, (u8) val, 0); | ||
| 2568 | } | ||
| 2569 | |||
| 2570 | /*-------------------------------------------------------------------------*/ | ||
| 2571 | |||
| 2572 | static int pl_reset (struct usbnet *dev) | ||
| 2573 | { | ||
| 2574 | /* some units seem to need this reset, others reject it utterly. | ||
| 2575 | * FIXME be more like "naplink" or windows drivers. | ||
| 2576 | */ | ||
| 2577 | (void) pl_set_QuickLink_features (dev, | ||
| 2578 | PL_S_EN|PL_RESET_OUT|PL_RESET_IN|PL_PEER_E); | ||
| 2579 | return 0; | ||
| 2580 | } | ||
| 2581 | |||
| 2582 | static const struct driver_info prolific_info = { | ||
| 2583 | .description = "Prolific PL-2301/PL-2302", | ||
| 2584 | .flags = FLAG_NO_SETINT, | ||
| 2585 | /* some PL-2302 versions seem to fail usb_set_interface() */ | ||
| 2586 | .reset = pl_reset, | ||
| 2587 | }; | ||
| 2588 | |||
| 2589 | #endif /* CONFIG_USB_PL2301 */ | ||
| 2590 | |||
| 2591 | |||
| 2592 | #ifdef CONFIG_USB_KC2190 | ||
| 2593 | #define HAVE_HARDWARE | ||
| 2594 | static const struct driver_info kc2190_info = { | ||
| 2595 | .description = "KC Technology KC-190", | ||
| 2596 | }; | ||
| 2597 | #endif /* CONFIG_USB_KC2190 */ | ||
| 2598 | |||
| 2599 | |||
| 2600 | #ifdef CONFIG_USB_ARMLINUX | ||
| 2601 | #define HAVE_HARDWARE | ||
| 2602 | |||
| 2603 | /*------------------------------------------------------------------------- | ||
| 2604 | * | ||
| 2605 | * Intel's SA-1100 chip integrates basic USB support, and is used | ||
| 2606 | * in PDAs like some iPaqs, the Yopy, some Zaurus models, and more. | ||
| 2607 | * When they run Linux, arch/arm/mach-sa1100/usb-eth.c may be used to | ||
| 2608 | * network using minimal USB framing data. | ||
| 2609 | * | ||
| 2610 | * This describes the driver currently in standard ARM Linux kernels. | ||
| 2611 | * The Zaurus uses a different driver (see later). | ||
| 2612 | * | ||
| 2613 | * PXA25x and PXA210 use XScale cores (ARM v5TE) with better USB support | ||
| 2614 | * and different USB endpoint numbering than the SA1100 devices. The | ||
| 2615 | * mach-pxa/usb-eth.c driver re-uses the device ids from mach-sa1100 | ||
| 2616 | * so we rely on the endpoint descriptors. | ||
| 2617 | * | ||
| 2618 | *-------------------------------------------------------------------------*/ | ||
| 2619 | |||
| 2620 | static const struct driver_info linuxdev_info = { | ||
| 2621 | .description = "Linux Device", | ||
| 2622 | .check_connect = always_connected, | ||
| 2623 | }; | ||
| 2624 | |||
| 2625 | static const struct driver_info yopy_info = { | ||
| 2626 | .description = "Yopy", | ||
| 2627 | .check_connect = always_connected, | ||
| 2628 | }; | ||
| 2629 | |||
| 2630 | static const struct driver_info blob_info = { | ||
| 2631 | .description = "Boot Loader OBject", | ||
| 2632 | .check_connect = always_connected, | ||
| 2633 | }; | ||
| 2634 | |||
| 2635 | #endif /* CONFIG_USB_ARMLINUX */ | ||
| 2636 | |||
| 2637 | |||
| 2638 | #ifdef CONFIG_USB_ZAURUS | ||
| 2639 | #define HAVE_HARDWARE | ||
| 2640 | |||
| 2641 | #include <linux/crc32.h> | ||
| 2642 | |||
| 2643 | /*------------------------------------------------------------------------- | ||
| 2644 | * | ||
| 2645 | * Zaurus is also a SA-1110 based PDA, but one using a different driver | ||
| 2646 | * (and framing) for its USB slave/gadget controller than the case above. | ||
| 2647 | * | ||
| 2648 | * For the current version of that driver, the main way that framing is | ||
| 2649 | * nonstandard (also from perspective of the CDC ethernet model!) is a | ||
| 2650 | * crc32, added to help detect when some sa1100 usb-to-memory DMA errata | ||
| 2651 | * haven't been fully worked around. Also, all Zaurii use the same | ||
| 2652 | * default Ethernet address. | ||
| 2653 | * | ||
| 2654 | * PXA based models use the same framing, and also can't implement | ||
| 2655 | * set_interface properly. | ||
| 2656 | * | ||
| 2657 | * All known Zaurii lie about their standards conformance. Most lie by | ||
| 2658 | * saying they support CDC Ethernet. Some lie and say they support CDC | ||
| 2659 | * MDLM (as if for access to cell phone modems). Someone, please beat | ||
| 2660 | * on Sharp (and other such vendors) for a while with a cluestick. | ||
| 2661 | * | ||
| 2662 | *-------------------------------------------------------------------------*/ | ||
| 2663 | |||
| 2664 | static struct sk_buff * | ||
| 2665 | zaurus_tx_fixup (struct usbnet *dev, struct sk_buff *skb, int flags) | ||
| 2666 | { | ||
| 2667 | int padlen; | ||
| 2668 | struct sk_buff *skb2; | ||
| 2669 | |||
| 2670 | padlen = 2; | ||
| 2671 | if (!skb_cloned (skb)) { | ||
| 2672 | int tailroom = skb_tailroom (skb); | ||
| 2673 | if ((padlen + 4) <= tailroom) | ||
| 2674 | goto done; | ||
| 2675 | } | ||
| 2676 | skb2 = skb_copy_expand (skb, 0, 4 + padlen, flags); | ||
| 2677 | dev_kfree_skb_any (skb); | ||
| 2678 | skb = skb2; | ||
| 2679 | if (skb) { | ||
| 2680 | u32 fcs; | ||
| 2681 | done: | ||
| 2682 | fcs = crc32_le (~0, skb->data, skb->len); | ||
| 2683 | fcs = ~fcs; | ||
| 2684 | |||
| 2685 | *skb_put (skb, 1) = fcs & 0xff; | ||
| 2686 | *skb_put (skb, 1) = (fcs>> 8) & 0xff; | ||
| 2687 | *skb_put (skb, 1) = (fcs>>16) & 0xff; | ||
| 2688 | *skb_put (skb, 1) = (fcs>>24) & 0xff; | ||
| 2689 | } | ||
| 2690 | return skb; | ||
| 2691 | } | ||
| 2692 | |||
| 2693 | static const struct driver_info zaurus_sl5x00_info = { | ||
| 2694 | .description = "Sharp Zaurus SL-5x00", | ||
| 2695 | .flags = FLAG_FRAMING_Z, | ||
| 2696 | .check_connect = always_connected, | ||
| 2697 | .bind = generic_cdc_bind, | ||
| 2698 | .unbind = cdc_unbind, | ||
| 2699 | .tx_fixup = zaurus_tx_fixup, | ||
| 2700 | }; | ||
| 2701 | #define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info) | ||
| 2702 | |||
| 2703 | static const struct driver_info zaurus_pxa_info = { | ||
| 2704 | .description = "Sharp Zaurus, PXA-2xx based", | ||
| 2705 | .flags = FLAG_FRAMING_Z, | ||
| 2706 | .check_connect = always_connected, | ||
| 2707 | .bind = generic_cdc_bind, | ||
| 2708 | .unbind = cdc_unbind, | ||
| 2709 | .tx_fixup = zaurus_tx_fixup, | ||
| 2710 | }; | ||
| 2711 | #define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info) | ||
| 2712 | |||
| 2713 | static const struct driver_info olympus_mxl_info = { | ||
| 2714 | .description = "Olympus R1000", | ||
| 2715 | .flags = FLAG_FRAMING_Z, | ||
| 2716 | .check_connect = always_connected, | ||
| 2717 | .bind = generic_cdc_bind, | ||
| 2718 | .unbind = cdc_unbind, | ||
| 2719 | .tx_fixup = zaurus_tx_fixup, | ||
| 2720 | }; | ||
| 2721 | #define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info) | ||
| 2722 | |||
| 2723 | |||
| 2724 | /* Some more recent products using Lineo/Belcarra code will wrongly claim | ||
| 2725 | * CDC MDLM conformance. They aren't conformant: data endpoints live | ||
| 2726 | * in the control interface, there's no data interface, and it's not used | ||
| 2727 | * to talk to a cell phone radio. But at least we can detect these two | ||
| 2728 | * pseudo-classes, rather than growing this product list with entries for | ||
| 2729 | * each new nonconformant product (sigh). | ||
| 2730 | */ | ||
| 2731 | static const u8 safe_guid[16] = { | ||
| 2732 | 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6, | ||
| 2733 | 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f, | ||
| 2734 | }; | ||
| 2735 | static const u8 blan_guid[16] = { | ||
| 2736 | 0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70, | ||
| 2737 | 0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37, | ||
| 2738 | }; | ||
| 2739 | |||
| 2740 | static int blan_mdlm_bind (struct usbnet *dev, struct usb_interface *intf) | ||
| 2741 | { | ||
| 2742 | u8 *buf = intf->cur_altsetting->extra; | ||
| 2743 | int len = intf->cur_altsetting->extralen; | ||
| 2744 | struct usb_cdc_mdlm_desc *desc = NULL; | ||
| 2745 | struct usb_cdc_mdlm_detail_desc *detail = NULL; | ||
| 2746 | |||
| 2747 | while (len > 3) { | ||
| 2748 | if (buf [1] != USB_DT_CS_INTERFACE) | ||
| 2749 | goto next_desc; | ||
| 2750 | |||
| 2751 | /* use bDescriptorSubType, and just verify that we get a | ||
| 2752 | * "BLAN" (or "SAFE") descriptor. | ||
| 2753 | */ | ||
| 2754 | switch (buf [2]) { | ||
| 2755 | case USB_CDC_MDLM_TYPE: | ||
| 2756 | if (desc) { | ||
| 2757 | dev_dbg (&intf->dev, "extra MDLM\n"); | ||
| 2758 | goto bad_desc; | ||
| 2759 | } | ||
| 2760 | desc = (void *) buf; | ||
| 2761 | if (desc->bLength != sizeof *desc) { | ||
| 2762 | dev_dbg (&intf->dev, "MDLM len %u\n", | ||
| 2763 | desc->bLength); | ||
| 2764 | goto bad_desc; | ||
| 2765 | } | ||
| 2766 | /* expect bcdVersion 1.0, ignore */ | ||
| 2767 | if (memcmp(&desc->bGUID, blan_guid, 16) | ||
| 2768 | && memcmp(&desc->bGUID, safe_guid, 16) ) { | ||
| 2769 | /* hey, this one might _really_ be MDLM! */ | ||
| 2770 | dev_dbg (&intf->dev, "MDLM guid\n"); | ||
| 2771 | goto bad_desc; | ||
| 2772 | } | ||
| 2773 | break; | ||
| 2774 | case USB_CDC_MDLM_DETAIL_TYPE: | ||
| 2775 | if (detail) { | ||
| 2776 | dev_dbg (&intf->dev, "extra MDLM detail\n"); | ||
| 2777 | goto bad_desc; | ||
| 2778 | } | ||
| 2779 | detail = (void *) buf; | ||
| 2780 | switch (detail->bGuidDescriptorType) { | ||
| 2781 | case 0: /* "SAFE" */ | ||
| 2782 | if (detail->bLength != (sizeof *detail + 2)) | ||
| 2783 | goto bad_detail; | ||
| 2784 | break; | ||
| 2785 | case 1: /* "BLAN" */ | ||
| 2786 | if (detail->bLength != (sizeof *detail + 3)) | ||
| 2787 | goto bad_detail; | ||
| 2788 | break; | ||
| 2789 | default: | ||
| 2790 | goto bad_detail; | ||
| 2791 | } | ||
| 2792 | |||
| 2793 | /* assuming we either noticed BLAN already, or will | ||
| 2794 | * find it soon, there are some data bytes here: | ||
| 2795 | * - bmNetworkCapabilities (unused) | ||
| 2796 | * - bmDataCapabilities (bits, see below) | ||
| 2797 | * - bPad (ignored, for PADAFTER -- BLAN-only) | ||
| 2798 | * bits are: | ||
| 2799 | * - 0x01 -- Zaurus framing (add CRC) | ||
| 2800 | * - 0x02 -- PADBEFORE (CRC includes some padding) | ||
| 2801 | * - 0x04 -- PADAFTER (some padding after CRC) | ||
| 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. | ||
| 2805 | */ | ||
| 2806 | if ((detail->bDetailData[1] & ~02) != 0x01) { | ||
| 2807 | /* bmDataCapabilites == 0 would be fine too, | ||
| 2808 | * but framing is minidriver-coupled for now. | ||
| 2809 | */ | ||
| 2810 | bad_detail: | ||
| 2811 | dev_dbg (&intf->dev, | ||
| 2812 | "bad MDLM detail, %d %d %d\n", | ||
| 2813 | detail->bLength, | ||
| 2814 | detail->bDetailData[0], | ||
| 2815 | detail->bDetailData[2]); | ||
| 2816 | goto bad_desc; | ||
| 2817 | } | ||
| 2818 | break; | ||
| 2819 | } | ||
| 2820 | next_desc: | ||
| 2821 | len -= buf [0]; /* bLength */ | ||
| 2822 | buf += buf [0]; | ||
| 2823 | } | ||
| 2824 | |||
| 2825 | if (!desc || !detail) { | ||
| 2826 | dev_dbg (&intf->dev, "missing cdc mdlm %s%sdescriptor\n", | ||
| 2827 | desc ? "" : "func ", | ||
| 2828 | detail ? "" : "detail "); | ||
| 2829 | goto bad_desc; | ||
| 2830 | } | ||
| 2831 | |||
| 2832 | /* There's probably a CDC Ethernet descriptor there, but we can't | ||
| 2833 | * rely on the Ethernet address it provides since not all vendors | ||
| 2834 | * bother to make it unique. Likewise there's no point in tracking | ||
| 2835 | * of the CDC event notifications. | ||
| 2836 | */ | ||
| 2837 | return get_endpoints (dev, intf); | ||
| 2838 | |||
| 2839 | bad_desc: | ||
| 2840 | dev_info (&dev->udev->dev, "unsupported MDLM descriptors\n"); | ||
| 2841 | return -ENODEV; | ||
| 2842 | } | ||
| 2843 | |||
| 2844 | static const struct driver_info bogus_mdlm_info = { | ||
| 2845 | .description = "pseudo-MDLM (BLAN) device", | ||
| 2846 | .flags = FLAG_FRAMING_Z, | ||
| 2847 | .check_connect = always_connected, | ||
| 2848 | .tx_fixup = zaurus_tx_fixup, | ||
| 2849 | .bind = blan_mdlm_bind, | ||
| 2850 | }; | ||
| 2851 | |||
| 2852 | #else | ||
| 2853 | |||
| 2854 | /* blacklist all those devices */ | ||
| 2855 | #define ZAURUS_STRONGARM_INFO 0 | ||
| 2856 | #define ZAURUS_PXA_INFO 0 | ||
| 2857 | #define OLYMPUS_MXL_INFO 0 | ||
| 2858 | |||
| 2859 | #endif | ||
| 2860 | 222 | ||
| 2861 | 223 | ||
| 2862 | /*------------------------------------------------------------------------- | 224 | /*------------------------------------------------------------------------- |
| @@ -2868,22 +230,12 @@ static const struct driver_info bogus_mdlm_info = { | |||
| 2868 | static int usbnet_change_mtu (struct net_device *net, int new_mtu) | 230 | static int usbnet_change_mtu (struct net_device *net, int new_mtu) |
| 2869 | { | 231 | { |
| 2870 | struct usbnet *dev = netdev_priv(net); | 232 | struct usbnet *dev = netdev_priv(net); |
| 233 | int ll_mtu = new_mtu + net->hard_header_len; | ||
| 2871 | 234 | ||
| 2872 | if (new_mtu <= MIN_PACKET || new_mtu > MAX_PACKET) | 235 | if (new_mtu <= 0 || ll_mtu > dev->hard_mtu) |
| 2873 | return -EINVAL; | 236 | return -EINVAL; |
| 2874 | #ifdef CONFIG_USB_NET1080 | ||
| 2875 | if (((dev->driver_info->flags) & FLAG_FRAMING_NC)) { | ||
| 2876 | if (FRAMED_SIZE (new_mtu) > MAX_PACKET) | ||
| 2877 | return -EINVAL; | ||
| 2878 | } | ||
| 2879 | #endif | ||
| 2880 | #ifdef CONFIG_USB_GENESYS | ||
| 2881 | if (((dev->driver_info->flags) & FLAG_FRAMING_GL) | ||
| 2882 | && new_mtu > GL_MAX_PACKET_LEN) | ||
| 2883 | return -EINVAL; | ||
| 2884 | #endif | ||
| 2885 | // no second zero-length packet read wanted after mtu-sized packets | 237 | // no second zero-length packet read wanted after mtu-sized packets |
| 2886 | if (((new_mtu + sizeof (struct ethhdr)) % dev->maxpacket) == 0) | 238 | if ((ll_mtu % dev->maxpacket) == 0) |
| 2887 | return -EDOM; | 239 | return -EDOM; |
| 2888 | net->mtu = new_mtu; | 240 | net->mtu = new_mtu; |
| 2889 | return 0; | 241 | return 0; |
| @@ -2922,7 +274,7 @@ static void defer_bh(struct usbnet *dev, struct sk_buff *skb, struct sk_buff_hea | |||
| 2922 | * NOTE: annoying asymmetry: if it's active, schedule_work() fails, | 274 | * NOTE: annoying asymmetry: if it's active, schedule_work() fails, |
| 2923 | * but tasklet_schedule() doesn't. hope the failure is rare. | 275 | * but tasklet_schedule() doesn't. hope the failure is rare. |
| 2924 | */ | 276 | */ |
| 2925 | static void defer_kevent (struct usbnet *dev, int work) | 277 | void usbnet_defer_kevent (struct usbnet *dev, int work) |
| 2926 | { | 278 | { |
| 2927 | set_bit (work, &dev->flags); | 279 | set_bit (work, &dev->flags); |
| 2928 | if (!schedule_work (&dev->kevent)) | 280 | if (!schedule_work (&dev->kevent)) |
| @@ -2930,50 +282,24 @@ static void defer_kevent (struct usbnet *dev, int work) | |||
| 2930 | else | 282 | else |
| 2931 | devdbg (dev, "kevent %d scheduled", work); | 283 | devdbg (dev, "kevent %d scheduled", work); |
| 2932 | } | 284 | } |
| 285 | EXPORT_SYMBOL_GPL(usbnet_defer_kevent); | ||
| 2933 | 286 | ||
| 2934 | /*-------------------------------------------------------------------------*/ | 287 | /*-------------------------------------------------------------------------*/ |
| 2935 | 288 | ||
| 2936 | static void rx_complete (struct urb *urb, struct pt_regs *regs); | 289 | static void rx_complete (struct urb *urb, struct pt_regs *regs); |
| 2937 | 290 | ||
| 2938 | static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) | 291 | static void rx_submit (struct usbnet *dev, struct urb *urb, unsigned flags) |
| 2939 | { | 292 | { |
| 2940 | struct sk_buff *skb; | 293 | struct sk_buff *skb; |
| 2941 | struct skb_data *entry; | 294 | struct skb_data *entry; |
| 2942 | int retval = 0; | 295 | int retval = 0; |
| 2943 | unsigned long lockflags; | 296 | unsigned long lockflags; |
| 2944 | size_t size; | 297 | size_t size = dev->rx_urb_size; |
| 2945 | |||
| 2946 | #ifdef CONFIG_USB_NET1080 | ||
| 2947 | if (dev->driver_info->flags & FLAG_FRAMING_NC) | ||
| 2948 | size = FRAMED_SIZE (dev->net->mtu); | ||
| 2949 | else | ||
| 2950 | #endif | ||
| 2951 | #ifdef CONFIG_USB_GENESYS | ||
| 2952 | if (dev->driver_info->flags & FLAG_FRAMING_GL) | ||
| 2953 | size = GL_RCV_BUF_SIZE; | ||
| 2954 | else | ||
| 2955 | #endif | ||
| 2956 | #ifdef CONFIG_USB_ZAURUS | ||
| 2957 | if (dev->driver_info->flags & FLAG_FRAMING_Z) | ||
| 2958 | size = 6 + (sizeof (struct ethhdr) + dev->net->mtu); | ||
| 2959 | else | ||
| 2960 | #endif | ||
| 2961 | #ifdef CONFIG_USB_RNDIS | ||
| 2962 | if (dev->driver_info->flags & FLAG_FRAMING_RN) | ||
| 2963 | size = RNDIS_MAX_TRANSFER; | ||
| 2964 | else | ||
| 2965 | #endif | ||
| 2966 | #ifdef CONFIG_USB_AX8817X | ||
| 2967 | if (dev->driver_info->flags & FLAG_FRAMING_AX) | ||
| 2968 | size = 2048; | ||
| 2969 | else | ||
| 2970 | #endif | ||
| 2971 | size = (sizeof (struct ethhdr) + dev->net->mtu); | ||
| 2972 | 298 | ||
| 2973 | if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { | 299 | if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { |
| 2974 | if (netif_msg_rx_err (dev)) | 300 | if (netif_msg_rx_err (dev)) |
| 2975 | devdbg (dev, "no rx skb"); | 301 | devdbg (dev, "no rx skb"); |
| 2976 | defer_kevent (dev, EVENT_RX_MEMORY); | 302 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); |
| 2977 | usb_free_urb (urb); | 303 | usb_free_urb (urb); |
| 2978 | return; | 304 | return; |
| 2979 | } | 305 | } |
| @@ -2987,7 +313,6 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) | |||
| 2987 | 313 | ||
| 2988 | usb_fill_bulk_urb (urb, dev->udev, dev->in, | 314 | usb_fill_bulk_urb (urb, dev->udev, dev->in, |
| 2989 | skb->data, size, rx_complete, skb); | 315 | skb->data, size, rx_complete, skb); |
| 2990 | urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 2991 | 316 | ||
| 2992 | spin_lock_irqsave (&dev->rxq.lock, lockflags); | 317 | spin_lock_irqsave (&dev->rxq.lock, lockflags); |
| 2993 | 318 | ||
| @@ -2996,10 +321,10 @@ static void rx_submit (struct usbnet *dev, struct urb *urb, int flags) | |||
| 2996 | && !test_bit (EVENT_RX_HALT, &dev->flags)) { | 321 | && !test_bit (EVENT_RX_HALT, &dev->flags)) { |
| 2997 | switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){ | 322 | switch (retval = usb_submit_urb (urb, GFP_ATOMIC)){ |
| 2998 | case -EPIPE: | 323 | case -EPIPE: |
| 2999 | defer_kevent (dev, EVENT_RX_HALT); | 324 | usbnet_defer_kevent (dev, EVENT_RX_HALT); |
| 3000 | break; | 325 | break; |
| 3001 | case -ENOMEM: | 326 | case -ENOMEM: |
| 3002 | defer_kevent (dev, EVENT_RX_MEMORY); | 327 | usbnet_defer_kevent (dev, EVENT_RX_MEMORY); |
| 3003 | break; | 328 | break; |
| 3004 | case -ENODEV: | 329 | case -ENODEV: |
| 3005 | if (netif_msg_ifdown (dev)) | 330 | if (netif_msg_ifdown (dev)) |
| @@ -3037,7 +362,7 @@ static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) | |||
| 3037 | // else network stack removes extra byte if we forced a short packet | 362 | // else network stack removes extra byte if we forced a short packet |
| 3038 | 363 | ||
| 3039 | if (skb->len) | 364 | if (skb->len) |
| 3040 | skb_return (dev, skb); | 365 | usbnet_skb_return (dev, skb); |
| 3041 | else { | 366 | else { |
| 3042 | if (netif_msg_rx_err (dev)) | 367 | if (netif_msg_rx_err (dev)) |
| 3043 | devdbg (dev, "drop"); | 368 | devdbg (dev, "drop"); |
| @@ -3063,7 +388,7 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs) | |||
| 3063 | switch (urb_status) { | 388 | switch (urb_status) { |
| 3064 | // success | 389 | // success |
| 3065 | case 0: | 390 | case 0: |
| 3066 | if (MIN_PACKET > skb->len || skb->len > MAX_PACKET) { | 391 | if (skb->len < dev->net->hard_header_len) { |
| 3067 | entry->state = rx_cleanup; | 392 | entry->state = rx_cleanup; |
| 3068 | dev->stats.rx_errors++; | 393 | dev->stats.rx_errors++; |
| 3069 | dev->stats.rx_length_errors++; | 394 | dev->stats.rx_length_errors++; |
| @@ -3078,7 +403,7 @@ static void rx_complete (struct urb *urb, struct pt_regs *regs) | |||
| 3078 | // storm, recovering as needed. | 403 | // storm, recovering as needed. |
| 3079 | case -EPIPE: | 404 | case -EPIPE: |
| 3080 | dev->stats.rx_errors++; | 405 | dev->stats.rx_errors++; |
| 3081 | defer_kevent (dev, EVENT_RX_HALT); | 406 | usbnet_defer_kevent (dev, EVENT_RX_HALT); |
| 3082 | // FALLTHROUGH | 407 | // FALLTHROUGH |
| 3083 | 408 | ||
| 3084 | // software-driven interface shutdown | 409 | // software-driven interface shutdown |
| @@ -3320,55 +645,58 @@ done: | |||
| 3320 | 645 | ||
| 3321 | /*-------------------------------------------------------------------------*/ | 646 | /*-------------------------------------------------------------------------*/ |
| 3322 | 647 | ||
| 3323 | static void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) | 648 | /* ethtool methods; minidrivers may need to add some more, but |
| 649 | * they'll probably want to use this base set. | ||
| 650 | */ | ||
| 651 | |||
| 652 | void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) | ||
| 3324 | { | 653 | { |
| 3325 | struct usbnet *dev = netdev_priv(net); | 654 | struct usbnet *dev = netdev_priv(net); |
| 3326 | 655 | ||
| 656 | /* REVISIT don't always return "usbnet" */ | ||
| 3327 | strncpy (info->driver, driver_name, sizeof info->driver); | 657 | strncpy (info->driver, driver_name, sizeof info->driver); |
| 3328 | strncpy (info->version, DRIVER_VERSION, sizeof info->version); | 658 | strncpy (info->version, DRIVER_VERSION, sizeof info->version); |
| 3329 | strncpy (info->fw_version, dev->driver_info->description, | 659 | strncpy (info->fw_version, dev->driver_info->description, |
| 3330 | sizeof info->fw_version); | 660 | sizeof info->fw_version); |
| 3331 | usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); | 661 | usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); |
| 3332 | } | 662 | } |
| 663 | EXPORT_SYMBOL_GPL(usbnet_get_drvinfo); | ||
| 3333 | 664 | ||
| 3334 | static u32 usbnet_get_link (struct net_device *net) | 665 | static u32 usbnet_get_link (struct net_device *net) |
| 3335 | { | 666 | { |
| 3336 | struct usbnet *dev = netdev_priv(net); | 667 | struct usbnet *dev = netdev_priv(net); |
| 3337 | 668 | ||
| 3338 | /* If a check_connect is defined, return it's results */ | 669 | /* If a check_connect is defined, return its result */ |
| 3339 | if (dev->driver_info->check_connect) | 670 | if (dev->driver_info->check_connect) |
| 3340 | return dev->driver_info->check_connect (dev) == 0; | 671 | return dev->driver_info->check_connect (dev) == 0; |
| 3341 | 672 | ||
| 3342 | /* Otherwise, we're up to avoid breaking scripts */ | 673 | /* Otherwise, say we're up (to avoid breaking scripts) */ |
| 3343 | return 1; | 674 | return 1; |
| 3344 | } | 675 | } |
| 3345 | 676 | ||
| 3346 | static u32 usbnet_get_msglevel (struct net_device *net) | 677 | u32 usbnet_get_msglevel (struct net_device *net) |
| 3347 | { | 678 | { |
| 3348 | struct usbnet *dev = netdev_priv(net); | 679 | struct usbnet *dev = netdev_priv(net); |
| 3349 | 680 | ||
| 3350 | return dev->msg_enable; | 681 | return dev->msg_enable; |
| 3351 | } | 682 | } |
| 683 | EXPORT_SYMBOL_GPL(usbnet_get_msglevel); | ||
| 3352 | 684 | ||
| 3353 | static void usbnet_set_msglevel (struct net_device *net, u32 level) | 685 | void usbnet_set_msglevel (struct net_device *net, u32 level) |
| 3354 | { | 686 | { |
| 3355 | struct usbnet *dev = netdev_priv(net); | 687 | struct usbnet *dev = netdev_priv(net); |
| 3356 | 688 | ||
| 3357 | dev->msg_enable = level; | 689 | dev->msg_enable = level; |
| 3358 | } | 690 | } |
| 691 | EXPORT_SYMBOL_GPL(usbnet_set_msglevel); | ||
| 3359 | 692 | ||
| 3360 | static int usbnet_ioctl (struct net_device *net, struct ifreq *rq, int cmd) | 693 | /* drivers may override default ethtool_ops in their bind() routine */ |
| 3361 | { | 694 | static struct ethtool_ops usbnet_ethtool_ops = { |
| 3362 | #ifdef NEED_MII | 695 | .get_drvinfo = usbnet_get_drvinfo, |
| 3363 | { | 696 | .get_link = usbnet_get_link, |
| 3364 | struct usbnet *dev = netdev_priv(net); | 697 | .get_msglevel = usbnet_get_msglevel, |
| 3365 | 698 | .set_msglevel = usbnet_set_msglevel, | |
| 3366 | if (dev->mii.mdio_read != NULL && dev->mii.mdio_write != NULL) | 699 | }; |
| 3367 | return generic_mii_ioctl(&dev->mii, if_mii(rq), cmd, NULL); | ||
| 3368 | } | ||
| 3369 | #endif | ||
| 3370 | return -EOPNOTSUPP; | ||
| 3371 | } | ||
| 3372 | 700 | ||
| 3373 | /*-------------------------------------------------------------------------*/ | 701 | /*-------------------------------------------------------------------------*/ |
| 3374 | 702 | ||
| @@ -3387,19 +715,24 @@ kevent (void *data) | |||
| 3387 | if (test_bit (EVENT_TX_HALT, &dev->flags)) { | 715 | if (test_bit (EVENT_TX_HALT, &dev->flags)) { |
| 3388 | unlink_urbs (dev, &dev->txq); | 716 | unlink_urbs (dev, &dev->txq); |
| 3389 | status = usb_clear_halt (dev->udev, dev->out); | 717 | status = usb_clear_halt (dev->udev, dev->out); |
| 3390 | if (status < 0 && status != -EPIPE) { | 718 | if (status < 0 |
| 719 | && status != -EPIPE | ||
| 720 | && status != -ESHUTDOWN) { | ||
| 3391 | if (netif_msg_tx_err (dev)) | 721 | if (netif_msg_tx_err (dev)) |
| 3392 | deverr (dev, "can't clear tx halt, status %d", | 722 | deverr (dev, "can't clear tx halt, status %d", |
| 3393 | status); | 723 | status); |
| 3394 | } else { | 724 | } else { |
| 3395 | clear_bit (EVENT_TX_HALT, &dev->flags); | 725 | clear_bit (EVENT_TX_HALT, &dev->flags); |
| 3396 | netif_wake_queue (dev->net); | 726 | if (status != -ESHUTDOWN) |
| 727 | netif_wake_queue (dev->net); | ||
| 3397 | } | 728 | } |
| 3398 | } | 729 | } |
| 3399 | if (test_bit (EVENT_RX_HALT, &dev->flags)) { | 730 | if (test_bit (EVENT_RX_HALT, &dev->flags)) { |
| 3400 | unlink_urbs (dev, &dev->rxq); | 731 | unlink_urbs (dev, &dev->rxq); |
| 3401 | status = usb_clear_halt (dev->udev, dev->in); | 732 | status = usb_clear_halt (dev->udev, dev->in); |
| 3402 | if (status < 0 && status != -EPIPE) { | 733 | if (status < 0 |
| 734 | && status != -EPIPE | ||
| 735 | && status != -ESHUTDOWN) { | ||
| 3403 | if (netif_msg_rx_err (dev)) | 736 | if (netif_msg_rx_err (dev)) |
| 3404 | deverr (dev, "can't clear rx halt, status %d", | 737 | deverr (dev, "can't clear rx halt, status %d", |
| 3405 | status); | 738 | status); |
| @@ -3458,7 +791,7 @@ static void tx_complete (struct urb *urb, struct pt_regs *regs) | |||
| 3458 | 791 | ||
| 3459 | switch (urb->status) { | 792 | switch (urb->status) { |
| 3460 | case -EPIPE: | 793 | case -EPIPE: |
| 3461 | defer_kevent (dev, EVENT_TX_HALT); | 794 | usbnet_defer_kevent (dev, EVENT_TX_HALT); |
| 3462 | break; | 795 | break; |
| 3463 | 796 | ||
| 3464 | /* software-driven interface shutdown */ | 797 | /* software-driven interface shutdown */ |
| @@ -3515,10 +848,6 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) | |||
| 3515 | struct skb_data *entry; | 848 | struct skb_data *entry; |
| 3516 | struct driver_info *info = dev->driver_info; | 849 | struct driver_info *info = dev->driver_info; |
| 3517 | unsigned long flags; | 850 | unsigned long flags; |
| 3518 | #ifdef CONFIG_USB_NET1080 | ||
| 3519 | struct nc_header *header = NULL; | ||
| 3520 | struct nc_trailer *trailer = NULL; | ||
| 3521 | #endif /* CONFIG_USB_NET1080 */ | ||
| 3522 | 851 | ||
| 3523 | // some devices want funky USB-level framing, for | 852 | // some devices want funky USB-level framing, for |
| 3524 | // win32 driver (usually) and/or hardware quirks | 853 | // win32 driver (usually) and/or hardware quirks |
| @@ -3544,24 +873,8 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) | |||
| 3544 | entry->state = tx_start; | 873 | entry->state = tx_start; |
| 3545 | entry->length = length; | 874 | entry->length = length; |
| 3546 | 875 | ||
| 3547 | // FIXME: reorganize a bit, so that fixup() fills out NetChip | ||
| 3548 | // framing too. (Packet ID update needs the spinlock...) | ||
| 3549 | // [ BETTER: we already own net->xmit_lock, that's enough ] | ||
| 3550 | |||
| 3551 | #ifdef CONFIG_USB_NET1080 | ||
| 3552 | if (info->flags & FLAG_FRAMING_NC) { | ||
| 3553 | header = (struct nc_header *) skb_push (skb, sizeof *header); | ||
| 3554 | header->hdr_len = cpu_to_le16 (sizeof (*header)); | ||
| 3555 | header->packet_len = cpu_to_le16 (length); | ||
| 3556 | if (!((skb->len + sizeof *trailer) & 0x01)) | ||
| 3557 | *skb_put (skb, 1) = PAD_BYTE; | ||
| 3558 | trailer = (struct nc_trailer *) skb_put (skb, sizeof *trailer); | ||
| 3559 | } | ||
| 3560 | #endif /* CONFIG_USB_NET1080 */ | ||
| 3561 | |||
| 3562 | usb_fill_bulk_urb (urb, dev->udev, dev->out, | 876 | usb_fill_bulk_urb (urb, dev->udev, dev->out, |
| 3563 | skb->data, skb->len, tx_complete, skb); | 877 | skb->data, skb->len, tx_complete, skb); |
| 3564 | urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 3565 | 878 | ||
| 3566 | /* don't assume the hardware handles USB_ZERO_PACKET | 879 | /* don't assume the hardware handles USB_ZERO_PACKET |
| 3567 | * NOTE: strictly conforming cdc-ether devices should expect | 880 | * NOTE: strictly conforming cdc-ether devices should expect |
| @@ -3574,22 +887,10 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) | |||
| 3574 | 887 | ||
| 3575 | spin_lock_irqsave (&dev->txq.lock, flags); | 888 | spin_lock_irqsave (&dev->txq.lock, flags); |
| 3576 | 889 | ||
| 3577 | #ifdef CONFIG_USB_NET1080 | ||
| 3578 | if (info->flags & FLAG_FRAMING_NC) { | ||
| 3579 | header->packet_id = cpu_to_le16 ((u16)dev->dev_packet_id++); | ||
| 3580 | put_unaligned (header->packet_id, &trailer->packet_id); | ||
| 3581 | #if 0 | ||
| 3582 | devdbg (dev, "frame >tx h %d p %d id %d", | ||
| 3583 | header->hdr_len, header->packet_len, | ||
| 3584 | header->packet_id); | ||
| 3585 | #endif | ||
| 3586 | } | ||
| 3587 | #endif /* CONFIG_USB_NET1080 */ | ||
| 3588 | |||
| 3589 | switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) { | 890 | switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) { |
| 3590 | case -EPIPE: | 891 | case -EPIPE: |
| 3591 | netif_stop_queue (net); | 892 | netif_stop_queue (net); |
| 3592 | defer_kevent (dev, EVENT_TX_HALT); | 893 | usbnet_defer_kevent (dev, EVENT_TX_HALT); |
| 3593 | break; | 894 | break; |
| 3594 | default: | 895 | default: |
| 3595 | if (netif_msg_tx_err (dev)) | 896 | if (netif_msg_tx_err (dev)) |
| @@ -3692,7 +993,7 @@ static void usbnet_bh (unsigned long param) | |||
| 3692 | 993 | ||
| 3693 | // precondition: never called in_interrupt | 994 | // precondition: never called in_interrupt |
| 3694 | 995 | ||
| 3695 | static void usbnet_disconnect (struct usb_interface *intf) | 996 | void usbnet_disconnect (struct usb_interface *intf) |
| 3696 | { | 997 | { |
| 3697 | struct usbnet *dev; | 998 | struct usbnet *dev; |
| 3698 | struct usb_device *xdev; | 999 | struct usb_device *xdev; |
| @@ -3706,7 +1007,8 @@ static void usbnet_disconnect (struct usb_interface *intf) | |||
| 3706 | xdev = interface_to_usbdev (intf); | 1007 | xdev = interface_to_usbdev (intf); |
| 3707 | 1008 | ||
| 3708 | if (netif_msg_probe (dev)) | 1009 | if (netif_msg_probe (dev)) |
| 3709 | devinfo (dev, "unregister usbnet usb-%s-%s, %s", | 1010 | devinfo (dev, "unregister '%s' usb-%s-%s, %s", |
| 1011 | intf->dev.driver->name, | ||
| 3710 | xdev->bus->bus_name, xdev->devpath, | 1012 | xdev->bus->bus_name, xdev->devpath, |
| 3711 | dev->driver_info->description); | 1013 | dev->driver_info->description); |
| 3712 | 1014 | ||
| @@ -3722,15 +1024,14 @@ static void usbnet_disconnect (struct usb_interface *intf) | |||
| 3722 | free_netdev(net); | 1024 | free_netdev(net); |
| 3723 | usb_put_dev (xdev); | 1025 | usb_put_dev (xdev); |
| 3724 | } | 1026 | } |
| 1027 | EXPORT_SYMBOL_GPL(usbnet_disconnect); | ||
| 3725 | 1028 | ||
| 3726 | 1029 | ||
| 3727 | /*-------------------------------------------------------------------------*/ | 1030 | /*-------------------------------------------------------------------------*/ |
| 3728 | 1031 | ||
| 3729 | static struct ethtool_ops usbnet_ethtool_ops; | ||
| 3730 | |||
| 3731 | // precondition: never called in_interrupt | 1032 | // precondition: never called in_interrupt |
| 3732 | 1033 | ||
| 3733 | static int | 1034 | int |
| 3734 | usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | 1035 | usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) |
| 3735 | { | 1036 | { |
| 3736 | struct usbnet *dev; | 1037 | struct usbnet *dev; |
| @@ -3779,6 +1080,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
| 3779 | strcpy (net->name, "usb%d"); | 1080 | strcpy (net->name, "usb%d"); |
| 3780 | memcpy (net->dev_addr, node_id, sizeof node_id); | 1081 | memcpy (net->dev_addr, node_id, sizeof node_id); |
| 3781 | 1082 | ||
| 1083 | /* rx and tx sides can use different message sizes; | ||
| 1084 | * bind() should set rx_urb_size in that case. | ||
| 1085 | */ | ||
| 1086 | dev->hard_mtu = net->mtu + net->hard_header_len; | ||
| 3782 | #if 0 | 1087 | #if 0 |
| 3783 | // dma_supported() is deeply broken on almost all architectures | 1088 | // dma_supported() is deeply broken on almost all architectures |
| 3784 | // possible with some EHCI controllers | 1089 | // possible with some EHCI controllers |
| @@ -3793,7 +1098,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
| 3793 | net->stop = usbnet_stop; | 1098 | net->stop = usbnet_stop; |
| 3794 | net->watchdog_timeo = TX_TIMEOUT_JIFFIES; | 1099 | net->watchdog_timeo = TX_TIMEOUT_JIFFIES; |
| 3795 | net->tx_timeout = usbnet_tx_timeout; | 1100 | net->tx_timeout = usbnet_tx_timeout; |
| 3796 | net->do_ioctl = usbnet_ioctl; | ||
| 3797 | net->ethtool_ops = &usbnet_ethtool_ops; | 1101 | net->ethtool_ops = &usbnet_ethtool_ops; |
| 3798 | 1102 | ||
| 3799 | // allow device-specific bind/init procedures | 1103 | // allow device-specific bind/init procedures |
| @@ -3806,8 +1110,12 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
| 3806 | if ((dev->driver_info->flags & FLAG_ETHER) != 0 | 1110 | if ((dev->driver_info->flags & FLAG_ETHER) != 0 |
| 3807 | && (net->dev_addr [0] & 0x02) == 0) | 1111 | && (net->dev_addr [0] & 0x02) == 0) |
| 3808 | strcpy (net->name, "eth%d"); | 1112 | strcpy (net->name, "eth%d"); |
| 3809 | } else if (!info->in || info->out) | 1113 | |
| 3810 | status = get_endpoints (dev, udev); | 1114 | /* maybe the remote can't receive an Ethernet MTU */ |
| 1115 | if (net->mtu > (dev->hard_mtu - net->hard_header_len)) | ||
| 1116 | net->mtu = dev->hard_mtu - net->hard_header_len; | ||
| 1117 | } else if (!info->in || !info->out) | ||
| 1118 | status = usbnet_get_endpoints (dev, udev); | ||
| 3811 | else { | 1119 | else { |
| 3812 | dev->in = usb_rcvbulkpipe (xdev, info->in); | 1120 | dev->in = usb_rcvbulkpipe (xdev, info->in); |
| 3813 | dev->out = usb_sndbulkpipe (xdev, info->out); | 1121 | dev->out = usb_sndbulkpipe (xdev, info->out); |
| @@ -3819,12 +1127,13 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
| 3819 | status = 0; | 1127 | status = 0; |
| 3820 | 1128 | ||
| 3821 | } | 1129 | } |
| 3822 | |||
| 3823 | if (status == 0 && dev->status) | 1130 | if (status == 0 && dev->status) |
| 3824 | status = init_status (dev, udev); | 1131 | status = init_status (dev, udev); |
| 3825 | if (status < 0) | 1132 | if (status < 0) |
| 3826 | goto out1; | 1133 | goto out1; |
| 3827 | 1134 | ||
| 1135 | if (!dev->rx_urb_size) | ||
| 1136 | dev->rx_urb_size = dev->hard_mtu; | ||
| 3828 | dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); | 1137 | dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); |
| 3829 | 1138 | ||
| 3830 | SET_NETDEV_DEV(net, &udev->dev); | 1139 | SET_NETDEV_DEV(net, &udev->dev); |
| @@ -3832,8 +1141,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
| 3832 | if (status) | 1141 | if (status) |
| 3833 | goto out3; | 1142 | goto out3; |
| 3834 | if (netif_msg_probe (dev)) | 1143 | if (netif_msg_probe (dev)) |
| 3835 | devinfo (dev, "register usbnet at usb-%s-%s, %s, " | 1144 | devinfo (dev, "register '%s' at usb-%s-%s, %s, " |
| 3836 | "%02x:%02x:%02x:%02x:%02x:%02x", | 1145 | "%02x:%02x:%02x:%02x:%02x:%02x", |
| 1146 | udev->dev.driver->name, | ||
| 3837 | xdev->bus->bus_name, xdev->devpath, | 1147 | xdev->bus->bus_name, xdev->devpath, |
| 3838 | dev->driver_info->description, | 1148 | dev->driver_info->description, |
| 3839 | net->dev_addr [0], net->dev_addr [1], | 1149 | net->dev_addr [0], net->dev_addr [1], |
| @@ -3857,12 +1167,15 @@ out: | |||
| 3857 | usb_put_dev(xdev); | 1167 | usb_put_dev(xdev); |
| 3858 | return status; | 1168 | return status; |
| 3859 | } | 1169 | } |
| 1170 | EXPORT_SYMBOL_GPL(usbnet_probe); | ||
| 3860 | 1171 | ||
| 3861 | /*-------------------------------------------------------------------------*/ | 1172 | /*-------------------------------------------------------------------------*/ |
| 3862 | 1173 | ||
| 3863 | #ifdef CONFIG_PM | 1174 | /* FIXME these suspend/resume methods assume non-CDC style |
| 1175 | * devices, with only one interface. | ||
| 1176 | */ | ||
| 3864 | 1177 | ||
| 3865 | static int usbnet_suspend (struct usb_interface *intf, pm_message_t message) | 1178 | int usbnet_suspend (struct usb_interface *intf, pm_message_t message) |
| 3866 | { | 1179 | { |
| 3867 | struct usbnet *dev = usb_get_intfdata(intf); | 1180 | struct usbnet *dev = usb_get_intfdata(intf); |
| 3868 | 1181 | ||
| @@ -3875,8 +1188,9 @@ static int usbnet_suspend (struct usb_interface *intf, pm_message_t message) | |||
| 3875 | intf->dev.power.power_state = PMSG_SUSPEND; | 1188 | intf->dev.power.power_state = PMSG_SUSPEND; |
| 3876 | return 0; | 1189 | return 0; |
| 3877 | } | 1190 | } |
| 1191 | EXPORT_SYMBOL_GPL(usbnet_suspend); | ||
| 3878 | 1192 | ||
| 3879 | static int usbnet_resume (struct usb_interface *intf) | 1193 | int usbnet_resume (struct usb_interface *intf) |
| 3880 | { | 1194 | { |
| 3881 | struct usbnet *dev = usb_get_intfdata(intf); | 1195 | struct usbnet *dev = usb_get_intfdata(intf); |
| 3882 | 1196 | ||
| @@ -3885,357 +1199,27 @@ static int usbnet_resume (struct usb_interface *intf) | |||
| 3885 | tasklet_schedule (&dev->bh); | 1199 | tasklet_schedule (&dev->bh); |
| 3886 | return 0; | 1200 | return 0; |
| 3887 | } | 1201 | } |
| 1202 | EXPORT_SYMBOL_GPL(usbnet_resume); | ||
| 3888 | 1203 | ||
| 3889 | #else /* !CONFIG_PM */ | ||
| 3890 | |||
| 3891 | #define usbnet_suspend NULL | ||
| 3892 | #define usbnet_resume NULL | ||
| 3893 | |||
| 3894 | #endif /* CONFIG_PM */ | ||
| 3895 | |||
| 3896 | /*-------------------------------------------------------------------------*/ | ||
| 3897 | |||
| 3898 | #ifndef HAVE_HARDWARE | ||
| 3899 | #error You need to configure some hardware for this driver | ||
| 3900 | #endif | ||
| 3901 | |||
| 3902 | /* | ||
| 3903 | * chip vendor names won't normally be on the cables, and | ||
| 3904 | * may not be on the device. | ||
| 3905 | */ | ||
| 3906 | |||
| 3907 | static const struct usb_device_id products [] = { | ||
| 3908 | |||
| 3909 | #ifdef CONFIG_USB_ALI_M5632 | ||
| 3910 | { | ||
| 3911 | USB_DEVICE (0x0402, 0x5632), // ALi defaults | ||
| 3912 | .driver_info = (unsigned long) &ali_m5632_info, | ||
| 3913 | }, | ||
| 3914 | #endif | ||
| 3915 | |||
| 3916 | #ifdef CONFIG_USB_AN2720 | ||
| 3917 | { | ||
| 3918 | USB_DEVICE (0x0547, 0x2720), // AnchorChips defaults | ||
| 3919 | .driver_info = (unsigned long) &an2720_info, | ||
| 3920 | }, { | ||
| 3921 | USB_DEVICE (0x0547, 0x2727), // Xircom PGUNET | ||
| 3922 | .driver_info = (unsigned long) &an2720_info, | ||
| 3923 | }, | ||
| 3924 | #endif | ||
| 3925 | |||
| 3926 | #ifdef CONFIG_USB_BELKIN | ||
| 3927 | { | ||
| 3928 | USB_DEVICE (0x050d, 0x0004), // Belkin | ||
| 3929 | .driver_info = (unsigned long) &belkin_info, | ||
| 3930 | }, { | ||
| 3931 | USB_DEVICE (0x056c, 0x8100), // eTEK | ||
| 3932 | .driver_info = (unsigned long) &belkin_info, | ||
| 3933 | }, { | ||
| 3934 | USB_DEVICE (0x0525, 0x9901), // Advance USBNET (eTEK) | ||
| 3935 | .driver_info = (unsigned long) &belkin_info, | ||
| 3936 | }, | ||
| 3937 | #endif | ||
| 3938 | |||
| 3939 | #ifdef CONFIG_USB_AX8817X | ||
| 3940 | { | ||
| 3941 | // Linksys USB200M | ||
| 3942 | USB_DEVICE (0x077b, 0x2226), | ||
| 3943 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3944 | }, { | ||
| 3945 | // Netgear FA120 | ||
| 3946 | USB_DEVICE (0x0846, 0x1040), | ||
| 3947 | .driver_info = (unsigned long) &netgear_fa120_info, | ||
| 3948 | }, { | ||
| 3949 | // DLink DUB-E100 | ||
| 3950 | USB_DEVICE (0x2001, 0x1a00), | ||
| 3951 | .driver_info = (unsigned long) &dlink_dub_e100_info, | ||
| 3952 | }, { | ||
| 3953 | // Intellinet, ST Lab USB Ethernet | ||
| 3954 | USB_DEVICE (0x0b95, 0x1720), | ||
| 3955 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3956 | }, { | ||
| 3957 | // Hawking UF200, TrendNet TU2-ET100 | ||
| 3958 | USB_DEVICE (0x07b8, 0x420a), | ||
| 3959 | .driver_info = (unsigned long) &hawking_uf200_info, | ||
| 3960 | }, { | ||
| 3961 | // Billionton Systems, USB2AR | ||
| 3962 | USB_DEVICE (0x08dd, 0x90ff), | ||
| 3963 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3964 | }, { | ||
| 3965 | // ATEN UC210T | ||
| 3966 | USB_DEVICE (0x0557, 0x2009), | ||
| 3967 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3968 | }, { | ||
| 3969 | // Buffalo LUA-U2-KTX | ||
| 3970 | USB_DEVICE (0x0411, 0x003d), | ||
| 3971 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3972 | }, { | ||
| 3973 | // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter" | ||
| 3974 | USB_DEVICE (0x6189, 0x182d), | ||
| 3975 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3976 | }, { | ||
| 3977 | // corega FEther USB2-TX | ||
| 3978 | USB_DEVICE (0x07aa, 0x0017), | ||
| 3979 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3980 | }, { | ||
| 3981 | // Surecom EP-1427X-2 | ||
| 3982 | USB_DEVICE (0x1189, 0x0893), | ||
| 3983 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3984 | }, { | ||
| 3985 | // goodway corp usb gwusb2e | ||
| 3986 | USB_DEVICE (0x1631, 0x6200), | ||
| 3987 | .driver_info = (unsigned long) &ax8817x_info, | ||
| 3988 | }, { | ||
| 3989 | // ASIX AX88772 10/100 | ||
| 3990 | USB_DEVICE (0x0b95, 0x7720), | ||
| 3991 | .driver_info = (unsigned long) &ax88772_info, | ||
| 3992 | }, | ||
| 3993 | #endif | ||
| 3994 | |||
| 3995 | #ifdef CONFIG_USB_EPSON2888 | ||
| 3996 | { | ||
| 3997 | USB_DEVICE (0x0525, 0x2888), // EPSON USB client | ||
| 3998 | .driver_info = (unsigned long) &epson2888_info, | ||
| 3999 | }, | ||
| 4000 | #endif | ||
| 4001 | |||
| 4002 | #ifdef CONFIG_USB_GENESYS | ||
| 4003 | { | ||
| 4004 | USB_DEVICE (0x05e3, 0x0502), // GL620USB-A | ||
| 4005 | .driver_info = (unsigned long) &genelink_info, | ||
| 4006 | }, | ||
| 4007 | /* NOT: USB_DEVICE (0x05e3, 0x0501), // GL620USB | ||
| 4008 | * that's half duplex, not currently supported | ||
| 4009 | */ | ||
| 4010 | #endif | ||
| 4011 | |||
| 4012 | #ifdef CONFIG_USB_NET1080 | ||
| 4013 | { | ||
| 4014 | USB_DEVICE (0x0525, 0x1080), // NetChip ref design | ||
| 4015 | .driver_info = (unsigned long) &net1080_info, | ||
| 4016 | }, { | ||
| 4017 | USB_DEVICE (0x06D0, 0x0622), // Laplink Gold | ||
| 4018 | .driver_info = (unsigned long) &net1080_info, | ||
| 4019 | }, | ||
| 4020 | #endif | ||
| 4021 | |||
| 4022 | #ifdef CONFIG_USB_PL2301 | ||
| 4023 | { | ||
| 4024 | USB_DEVICE (0x067b, 0x0000), // PL-2301 | ||
| 4025 | .driver_info = (unsigned long) &prolific_info, | ||
| 4026 | }, { | ||
| 4027 | USB_DEVICE (0x067b, 0x0001), // PL-2302 | ||
| 4028 | .driver_info = (unsigned long) &prolific_info, | ||
| 4029 | }, | ||
| 4030 | #endif | ||
| 4031 | |||
| 4032 | #ifdef CONFIG_USB_KC2190 | ||
| 4033 | { | ||
| 4034 | USB_DEVICE (0x050f, 0x0190), // KC-190 | ||
| 4035 | .driver_info = (unsigned long) &kc2190_info, | ||
| 4036 | }, | ||
| 4037 | #endif | ||
| 4038 | |||
| 4039 | #ifdef CONFIG_USB_RNDIS | ||
| 4040 | { | ||
| 4041 | /* RNDIS is MSFT's un-official variant of CDC ACM */ | ||
| 4042 | USB_INTERFACE_INFO (USB_CLASS_COMM, 2 /* ACM */, 0x0ff), | ||
| 4043 | .driver_info = (unsigned long) &rndis_info, | ||
| 4044 | }, | ||
| 4045 | #endif | ||
| 4046 | |||
| 4047 | #ifdef CONFIG_USB_ARMLINUX | ||
| 4048 | /* | ||
| 4049 | * SA-1100 using standard ARM Linux kernels, or compatible. | ||
| 4050 | * Often used when talking to Linux PDAs (iPaq, Yopy, etc). | ||
| 4051 | * The sa-1100 "usb-eth" driver handles the basic framing. | ||
| 4052 | * | ||
| 4053 | * PXA25x or PXA210 ... these use a "usb-eth" driver much like | ||
| 4054 | * the sa1100 one, but hardware uses different endpoint numbers. | ||
| 4055 | * | ||
| 4056 | * Or the Linux "Ethernet" gadget on hardware that can't talk | ||
| 4057 | * CDC Ethernet (e.g., no altsettings), in either of two modes: | ||
| 4058 | * - acting just like the old "usb-eth" firmware, though | ||
| 4059 | * the implementation is different | ||
| 4060 | * - supporting RNDIS as the first/default configuration for | ||
| 4061 | * MS-Windows interop; Linux needs to use the other config | ||
| 4062 | */ | ||
| 4063 | { | ||
| 4064 | // 1183 = 0x049F, both used as hex values? | ||
| 4065 | // Compaq "Itsy" vendor/product id | ||
| 4066 | USB_DEVICE (0x049F, 0x505A), // usb-eth, or compatible | ||
| 4067 | .driver_info = (unsigned long) &linuxdev_info, | ||
| 4068 | }, { | ||
| 4069 | USB_DEVICE (0x0E7E, 0x1001), // G.Mate "Yopy" | ||
| 4070 | .driver_info = (unsigned long) &yopy_info, | ||
| 4071 | }, { | ||
| 4072 | USB_DEVICE (0x8086, 0x07d3), // "blob" bootloader | ||
| 4073 | .driver_info = (unsigned long) &blob_info, | ||
| 4074 | }, { | ||
| 4075 | // Linux Ethernet/RNDIS gadget on pxa210/25x/26x | ||
| 4076 | // e.g. Gumstix, current OpenZaurus, ... | ||
| 4077 | USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203), | ||
| 4078 | .driver_info = (unsigned long) &linuxdev_info, | ||
| 4079 | }, | ||
| 4080 | #endif | ||
| 4081 | |||
| 4082 | #if defined(CONFIG_USB_ZAURUS) || defined(CONFIG_USB_CDCETHER) | ||
| 4083 | /* | ||
| 4084 | * SA-1100 based Sharp Zaurus ("collie"), or compatible. | ||
| 4085 | * Same idea as above, but different framing. | ||
| 4086 | * | ||
| 4087 | * PXA-2xx based models are also lying-about-cdc. | ||
| 4088 | * Some models don't even tell the same lies ... | ||
| 4089 | * | ||
| 4090 | * NOTE: OpenZaurus versions with 2.6 kernels won't use these entries, | ||
| 4091 | * unlike the older ones with 2.4 "embedix" kernels. | ||
| 4092 | * | ||
| 4093 | * NOTE: These entries do double-duty, serving as blacklist entries | ||
| 4094 | * whenever Zaurus support isn't enabled, but CDC Ethernet is. | ||
| 4095 | */ | ||
| 4096 | #define ZAURUS_MASTER_INTERFACE \ | ||
| 4097 | .bInterfaceClass = USB_CLASS_COMM, \ | ||
| 4098 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ | ||
| 4099 | .bInterfaceProtocol = USB_CDC_PROTO_NONE | ||
| 4100 | { | ||
| 4101 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4102 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4103 | .idVendor = 0x04DD, | ||
| 4104 | .idProduct = 0x8004, | ||
| 4105 | ZAURUS_MASTER_INTERFACE, | ||
| 4106 | .driver_info = ZAURUS_STRONGARM_INFO, | ||
| 4107 | }, { | ||
| 4108 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4109 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4110 | .idVendor = 0x04DD, | ||
| 4111 | .idProduct = 0x8005, /* A-300 */ | ||
| 4112 | ZAURUS_MASTER_INTERFACE, | ||
| 4113 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4114 | }, { | ||
| 4115 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4116 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4117 | .idVendor = 0x04DD, | ||
| 4118 | .idProduct = 0x8006, /* B-500/SL-5600 */ | ||
| 4119 | ZAURUS_MASTER_INTERFACE, | ||
| 4120 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4121 | }, { | ||
| 4122 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4123 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4124 | .idVendor = 0x04DD, | ||
| 4125 | .idProduct = 0x8007, /* C-700 */ | ||
| 4126 | ZAURUS_MASTER_INTERFACE, | ||
| 4127 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4128 | }, { | ||
| 4129 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4130 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4131 | .idVendor = 0x04DD, | ||
| 4132 | .idProduct = 0x9031, /* C-750 C-760 */ | ||
| 4133 | ZAURUS_MASTER_INTERFACE, | ||
| 4134 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4135 | }, { | ||
| 4136 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4137 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4138 | .idVendor = 0x04DD, | ||
| 4139 | .idProduct = 0x9032, /* SL-6000 */ | ||
| 4140 | ZAURUS_MASTER_INTERFACE, | ||
| 4141 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4142 | }, { | ||
| 4143 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4144 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4145 | .idVendor = 0x04DD, | ||
| 4146 | /* reported with some C860 units */ | ||
| 4147 | .idProduct = 0x9050, /* C-860 */ | ||
| 4148 | ZAURUS_MASTER_INTERFACE, | ||
| 4149 | .driver_info = ZAURUS_PXA_INFO, | ||
| 4150 | }, | ||
| 4151 | |||
| 4152 | #ifdef CONFIG_USB_ZAURUS | ||
| 4153 | /* At least some (reports vary) PXA units have very different lies | ||
| 4154 | * about their standards support: they claim to be cell phones with | ||
| 4155 | * direct access to their radios. (They don't conform to CDC MDLM.) | ||
| 4156 | */ | ||
| 4157 | { | ||
| 4158 | USB_INTERFACE_INFO (USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, | ||
| 4159 | USB_CDC_PROTO_NONE), | ||
| 4160 | .driver_info = (unsigned long) &bogus_mdlm_info, | ||
| 4161 | }, | ||
| 4162 | #endif | ||
| 4163 | |||
| 4164 | /* Olympus has some models with a Zaurus-compatible option. | ||
| 4165 | * R-1000 uses a FreeScale i.MXL cpu (ARMv4T) | ||
| 4166 | */ | ||
| 4167 | { | ||
| 4168 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 4169 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 4170 | .idVendor = 0x07B4, | ||
| 4171 | .idProduct = 0x0F02, /* R-1000 */ | ||
| 4172 | ZAURUS_MASTER_INTERFACE, | ||
| 4173 | .driver_info = OLYMPUS_MXL_INFO, | ||
| 4174 | }, | ||
| 4175 | #endif | ||
| 4176 | |||
| 4177 | #ifdef CONFIG_USB_CDCETHER | ||
| 4178 | { | ||
| 4179 | /* CDC Ether uses two interfaces, not necessarily consecutive. | ||
| 4180 | * We match the main interface, ignoring the optional device | ||
| 4181 | * class so we could handle devices that aren't exclusively | ||
| 4182 | * CDC ether. | ||
| 4183 | * | ||
| 4184 | * NOTE: this match must come AFTER entries working around | ||
| 4185 | * bugs/quirks in a given product (like Zaurus, above). | ||
| 4186 | */ | ||
| 4187 | USB_INTERFACE_INFO (USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET, | ||
| 4188 | USB_CDC_PROTO_NONE), | ||
| 4189 | .driver_info = (unsigned long) &cdc_info, | ||
| 4190 | }, | ||
| 4191 | #endif | ||
| 4192 | |||
| 4193 | { }, // END | ||
| 4194 | }; | ||
| 4195 | MODULE_DEVICE_TABLE (usb, products); | ||
| 4196 | |||
| 4197 | static struct usb_driver usbnet_driver = { | ||
| 4198 | .owner = THIS_MODULE, | ||
| 4199 | .name = driver_name, | ||
| 4200 | .id_table = products, | ||
| 4201 | .probe = usbnet_probe, | ||
| 4202 | .disconnect = usbnet_disconnect, | ||
| 4203 | .suspend = usbnet_suspend, | ||
| 4204 | .resume = usbnet_resume, | ||
| 4205 | }; | ||
| 4206 | |||
| 4207 | /* Default ethtool_ops assigned. Devices can override in their bind() routine */ | ||
| 4208 | static struct ethtool_ops usbnet_ethtool_ops = { | ||
| 4209 | .get_drvinfo = usbnet_get_drvinfo, | ||
| 4210 | .get_link = usbnet_get_link, | ||
| 4211 | .get_msglevel = usbnet_get_msglevel, | ||
| 4212 | .set_msglevel = usbnet_set_msglevel, | ||
| 4213 | }; | ||
| 4214 | 1204 | ||
| 4215 | /*-------------------------------------------------------------------------*/ | 1205 | /*-------------------------------------------------------------------------*/ |
| 4216 | 1206 | ||
| 4217 | static int __init usbnet_init (void) | 1207 | static int __init usbnet_init(void) |
| 4218 | { | 1208 | { |
| 4219 | // compiler should optimize these out | 1209 | /* compiler should optimize this out */ |
| 4220 | BUG_ON (sizeof (((struct sk_buff *)0)->cb) | 1210 | BUG_ON (sizeof (((struct sk_buff *)0)->cb) |
| 4221 | < sizeof (struct skb_data)); | 1211 | < sizeof (struct skb_data)); |
| 4222 | #ifdef CONFIG_USB_CDCETHER | ||
| 4223 | BUG_ON ((sizeof (((struct usbnet *)0)->data) | ||
| 4224 | < sizeof (struct cdc_state))); | ||
| 4225 | #endif | ||
| 4226 | 1212 | ||
| 4227 | random_ether_addr(node_id); | 1213 | random_ether_addr(node_id); |
| 4228 | 1214 | return 0; | |
| 4229 | return usb_register(&usbnet_driver); | ||
| 4230 | } | 1215 | } |
| 4231 | module_init (usbnet_init); | 1216 | module_init(usbnet_init); |
| 4232 | 1217 | ||
| 4233 | static void __exit usbnet_exit (void) | 1218 | static void __exit usbnet_exit(void) |
| 4234 | { | 1219 | { |
| 4235 | usb_deregister (&usbnet_driver); | ||
| 4236 | } | 1220 | } |
| 4237 | module_exit (usbnet_exit); | 1221 | module_exit(usbnet_exit); |
| 4238 | 1222 | ||
| 4239 | MODULE_AUTHOR ("David Brownell <dbrownell@users.sourceforge.net>"); | 1223 | MODULE_AUTHOR("David Brownell"); |
| 4240 | MODULE_DESCRIPTION ("USB Host-to-Host Link Drivers (numerous vendors)"); | 1224 | MODULE_DESCRIPTION("USB network driver framework"); |
| 4241 | MODULE_LICENSE ("GPL"); | 1225 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/usb/net/usbnet.h b/drivers/usb/net/usbnet.h new file mode 100644 index 000000000000..7aa0abd1a9bd --- /dev/null +++ b/drivers/usb/net/usbnet.h | |||
| @@ -0,0 +1,193 @@ | |||
| 1 | /* | ||
| 2 | * USB Networking Link Interface | ||
| 3 | * | ||
| 4 | * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net> | ||
| 5 | * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License as published by | ||
| 9 | * the Free Software Foundation; either version 2 of the License, or | ||
| 10 | * (at your option) any later version. | ||
| 11 | * | ||
| 12 | * This program is distributed in the hope that it will be useful, | ||
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 15 | * GNU General Public License for more details. | ||
| 16 | * | ||
| 17 | * You should have received a copy of the GNU General Public License | ||
| 18 | * along with this program; if not, write to the Free Software | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 20 | */ | ||
| 21 | |||
| 22 | |||
| 23 | #ifndef __USBNET_H | ||
| 24 | #define __USBNET_H | ||
| 25 | |||
| 26 | |||
| 27 | /* interface from usbnet core to each USB networking link we handle */ | ||
| 28 | struct usbnet { | ||
| 29 | /* housekeeping */ | ||
| 30 | struct usb_device *udev; | ||
| 31 | struct driver_info *driver_info; | ||
| 32 | wait_queue_head_t *wait; | ||
| 33 | |||
| 34 | /* i/o info: pipes etc */ | ||
| 35 | unsigned in, out; | ||
| 36 | struct usb_host_endpoint *status; | ||
| 37 | unsigned maxpacket; | ||
| 38 | struct timer_list delay; | ||
| 39 | |||
| 40 | /* protocol/interface state */ | ||
| 41 | struct net_device *net; | ||
| 42 | struct net_device_stats stats; | ||
| 43 | int msg_enable; | ||
| 44 | unsigned long data [5]; | ||
| 45 | u32 xid; | ||
| 46 | u32 hard_mtu; /* count any extra framing */ | ||
| 47 | size_t rx_urb_size; /* size for rx urbs */ | ||
| 48 | struct mii_if_info mii; | ||
| 49 | |||
| 50 | /* various kinds of pending driver work */ | ||
| 51 | struct sk_buff_head rxq; | ||
| 52 | struct sk_buff_head txq; | ||
| 53 | struct sk_buff_head done; | ||
| 54 | struct urb *interrupt; | ||
| 55 | struct tasklet_struct bh; | ||
| 56 | |||
| 57 | struct work_struct kevent; | ||
| 58 | unsigned long flags; | ||
| 59 | # define EVENT_TX_HALT 0 | ||
| 60 | # define EVENT_RX_HALT 1 | ||
| 61 | # define EVENT_RX_MEMORY 2 | ||
| 62 | # define EVENT_STS_SPLIT 3 | ||
| 63 | # define EVENT_LINK_RESET 4 | ||
| 64 | }; | ||
| 65 | |||
| 66 | static inline struct usb_driver *driver_of(struct usb_interface *intf) | ||
| 67 | { | ||
| 68 | return to_usb_driver(intf->dev.driver); | ||
| 69 | } | ||
| 70 | |||
| 71 | /* interface from the device/framing level "minidriver" to core */ | ||
| 72 | struct driver_info { | ||
| 73 | char *description; | ||
| 74 | |||
| 75 | int flags; | ||
| 76 | /* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */ | ||
| 77 | #define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */ | ||
| 78 | #define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ | ||
| 79 | #define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ | ||
| 80 | #define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */ | ||
| 81 | |||
| 82 | #define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ | ||
| 83 | #define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ | ||
| 84 | |||
| 85 | #define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */ | ||
| 86 | |||
| 87 | /* init device ... can sleep, or cause probe() failure */ | ||
| 88 | int (*bind)(struct usbnet *, struct usb_interface *); | ||
| 89 | |||
| 90 | /* cleanup device ... can sleep, but can't fail */ | ||
| 91 | void (*unbind)(struct usbnet *, struct usb_interface *); | ||
| 92 | |||
| 93 | /* reset device ... can sleep */ | ||
| 94 | int (*reset)(struct usbnet *); | ||
| 95 | |||
| 96 | /* see if peer is connected ... can sleep */ | ||
| 97 | int (*check_connect)(struct usbnet *); | ||
| 98 | |||
| 99 | /* for status polling */ | ||
| 100 | void (*status)(struct usbnet *, struct urb *); | ||
| 101 | |||
| 102 | /* link reset handling, called from defer_kevent */ | ||
| 103 | int (*link_reset)(struct usbnet *); | ||
| 104 | |||
| 105 | /* fixup rx packet (strip framing) */ | ||
| 106 | int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb); | ||
| 107 | |||
| 108 | /* fixup tx packet (add framing) */ | ||
| 109 | struct sk_buff *(*tx_fixup)(struct usbnet *dev, | ||
| 110 | struct sk_buff *skb, unsigned flags); | ||
| 111 | |||
| 112 | /* for new devices, use the descriptor-reading code instead */ | ||
| 113 | int in; /* rx endpoint */ | ||
| 114 | int out; /* tx endpoint */ | ||
| 115 | |||
| 116 | unsigned long data; /* Misc driver specific data */ | ||
| 117 | }; | ||
| 118 | |||
| 119 | /* Minidrivers are just drivers using the "usbnet" core as a powerful | ||
| 120 | * network-specific subroutine library ... that happens to do pretty | ||
| 121 | * much everything except custom framing and chip-specific stuff. | ||
| 122 | */ | ||
| 123 | extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *); | ||
| 124 | extern int usbnet_suspend (struct usb_interface *, pm_message_t ); | ||
| 125 | extern int usbnet_resume (struct usb_interface *); | ||
| 126 | extern void usbnet_disconnect(struct usb_interface *); | ||
| 127 | |||
| 128 | |||
| 129 | /* Drivers that reuse some of the standard USB CDC infrastructure | ||
| 130 | * (notably, using multiple interfaces according to the the CDC | ||
| 131 | * union descriptor) get some helper code. | ||
| 132 | */ | ||
| 133 | struct cdc_state { | ||
| 134 | struct usb_cdc_header_desc *header; | ||
| 135 | struct usb_cdc_union_desc *u; | ||
| 136 | struct usb_cdc_ether_desc *ether; | ||
| 137 | struct usb_interface *control; | ||
| 138 | struct usb_interface *data; | ||
| 139 | }; | ||
| 140 | |||
| 141 | extern int usbnet_generic_cdc_bind (struct usbnet *, struct usb_interface *); | ||
| 142 | extern void usbnet_cdc_unbind (struct usbnet *, struct usb_interface *); | ||
| 143 | |||
| 144 | /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ | ||
| 145 | #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ | ||
| 146 | |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ | ||
| 147 | |USB_CDC_PACKET_TYPE_PROMISCUOUS \ | ||
| 148 | |USB_CDC_PACKET_TYPE_DIRECTED) | ||
| 149 | |||
| 150 | |||
| 151 | /* we record the state for each of our queued skbs */ | ||
| 152 | enum skb_state { | ||
| 153 | illegal = 0, | ||
| 154 | tx_start, tx_done, | ||
| 155 | rx_start, rx_done, rx_cleanup | ||
| 156 | }; | ||
| 157 | |||
| 158 | struct skb_data { /* skb->cb is one of these */ | ||
| 159 | struct urb *urb; | ||
| 160 | struct usbnet *dev; | ||
| 161 | enum skb_state state; | ||
| 162 | size_t length; | ||
| 163 | }; | ||
| 164 | |||
| 165 | |||
| 166 | extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *); | ||
| 167 | extern void usbnet_defer_kevent (struct usbnet *, int); | ||
| 168 | extern void usbnet_skb_return (struct usbnet *, struct sk_buff *); | ||
| 169 | |||
| 170 | extern u32 usbnet_get_msglevel (struct net_device *); | ||
| 171 | extern void usbnet_set_msglevel (struct net_device *, u32); | ||
| 172 | extern void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *); | ||
| 173 | |||
| 174 | /* messaging support includes the interface name, so it must not be | ||
| 175 | * used before it has one ... notably, in minidriver bind() calls. | ||
| 176 | */ | ||
| 177 | #ifdef DEBUG | ||
| 178 | #define devdbg(usbnet, fmt, arg...) \ | ||
| 179 | printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 180 | #else | ||
| 181 | #define devdbg(usbnet, fmt, arg...) do {} while(0) | ||
| 182 | #endif | ||
| 183 | |||
| 184 | #define deverr(usbnet, fmt, arg...) \ | ||
| 185 | printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 186 | #define devwarn(usbnet, fmt, arg...) \ | ||
| 187 | printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
| 188 | |||
| 189 | #define devinfo(usbnet, fmt, arg...) \ | ||
| 190 | printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \ | ||
| 191 | |||
| 192 | |||
| 193 | #endif /* __USBNET_H */ | ||
diff --git a/drivers/usb/net/zaurus.c b/drivers/usb/net/zaurus.c new file mode 100644 index 000000000000..ee3b892aeabc --- /dev/null +++ b/drivers/usb/net/zaurus.c | |||
| @@ -0,0 +1,386 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2002 Pavel Machek <pavel@ucw.cz> | ||
| 3 | * Copyright (C) 2002-2005 by David Brownell | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or modify | ||
| 6 | * it under the terms of the GNU General Public License as published by | ||
| 7 | * the Free Software Foundation; either version 2 of the License, or | ||
| 8 | * (at your option) any later version. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | // #define DEBUG // error path messages, extra info | ||
| 21 | // #define VERBOSE // more; success messages | ||
| 22 | |||
| 23 | #include <linux/config.h> | ||
| 24 | #ifdef CONFIG_USB_DEBUG | ||
| 25 | # define DEBUG | ||
| 26 | #endif | ||
| 27 | #include <linux/module.h> | ||
| 28 | #include <linux/sched.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/netdevice.h> | ||
| 31 | #include <linux/ethtool.h> | ||
| 32 | #include <linux/workqueue.h> | ||
| 33 | #include <linux/mii.h> | ||
| 34 | #include <linux/crc32.h> | ||
| 35 | #include <linux/usb.h> | ||
| 36 | #include <linux/usb_cdc.h> | ||
| 37 | |||
| 38 | #include "usbnet.h" | ||
| 39 | |||
| 40 | |||
| 41 | /* | ||
| 42 | * All known Zaurii lie about their standards conformance. At least | ||
| 43 | * the earliest SA-1100 models lie by saying they support CDC Ethernet. | ||
| 44 | * Some later models (especially PXA-25x and PXA-27x based ones) lie | ||
| 45 | * and say they support CDC MDLM (for access to cell phone modems). | ||
| 46 | * | ||
| 47 | * There are non-Zaurus products that use these same protocols too. | ||
| 48 | * | ||
| 49 | * The annoying thing is that at the same time Sharp was developing | ||
| 50 | * that annoying standards-breaking software, the Linux community had | ||
| 51 | * a simple "CDC Subset" working reliably on the same SA-1100 hardware. | ||
| 52 | * That is, the same functionality but not violating standards. | ||
| 53 | * | ||
| 54 | * The CDC Ethernet nonconformance points are troublesome to hosts | ||
| 55 | * with a true CDC Ethernet implementation: | ||
| 56 | * - Framing appends a CRC, which the spec says drivers "must not" do; | ||
| 57 | * - Transfers data in altsetting zero, instead of altsetting 1; | ||
| 58 | * - All these peripherals use the same ethernet address. | ||
| 59 | * | ||
| 60 | * The CDC MDLM nonconformance is less immediately troublesome, since all | ||
| 61 | * MDLM implementations are quasi-proprietary anyway. | ||
| 62 | */ | ||
| 63 | |||
| 64 | static struct sk_buff * | ||
| 65 | zaurus_tx_fixup(struct usbnet *dev, struct sk_buff *skb, unsigned flags) | ||
| 66 | { | ||
| 67 | int padlen; | ||
| 68 | struct sk_buff *skb2; | ||
| 69 | |||
| 70 | padlen = 2; | ||
| 71 | if (!skb_cloned(skb)) { | ||
| 72 | int tailroom = skb_tailroom(skb); | ||
| 73 | if ((padlen + 4) <= tailroom) | ||
| 74 | goto done; | ||
| 75 | } | ||
| 76 | skb2 = skb_copy_expand(skb, 0, 4 + padlen, flags); | ||
| 77 | dev_kfree_skb_any(skb); | ||
| 78 | skb = skb2; | ||
| 79 | if (skb) { | ||
| 80 | u32 fcs; | ||
| 81 | done: | ||
| 82 | fcs = crc32_le(~0, skb->data, skb->len); | ||
| 83 | fcs = ~fcs; | ||
| 84 | |||
| 85 | *skb_put (skb, 1) = fcs & 0xff; | ||
| 86 | *skb_put (skb, 1) = (fcs>> 8) & 0xff; | ||
| 87 | *skb_put (skb, 1) = (fcs>>16) & 0xff; | ||
| 88 | *skb_put (skb, 1) = (fcs>>24) & 0xff; | ||
| 89 | } | ||
| 90 | return skb; | ||
| 91 | } | ||
| 92 | |||
| 93 | static int zaurus_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 94 | { | ||
| 95 | /* Belcarra's funky framing has other options; mostly | ||
| 96 | * TRAILERS (!) with 4 bytes CRC, and maybe 2 pad bytes. | ||
| 97 | */ | ||
| 98 | dev->net->hard_header_len += 6; | ||
| 99 | dev->rx_urb_size = dev->net->hard_header_len + dev->net->mtu; | ||
| 100 | return usbnet_generic_cdc_bind(dev, intf); | ||
| 101 | } | ||
| 102 | |||
| 103 | /* PDA style devices are always connected if present */ | ||
| 104 | static int always_connected (struct usbnet *dev) | ||
| 105 | { | ||
| 106 | return 0; | ||
| 107 | } | ||
| 108 | |||
| 109 | static const struct driver_info zaurus_sl5x00_info = { | ||
| 110 | .description = "Sharp Zaurus SL-5x00", | ||
| 111 | .flags = FLAG_FRAMING_Z, | ||
| 112 | .check_connect = always_connected, | ||
| 113 | .bind = zaurus_bind, | ||
| 114 | .unbind = usbnet_cdc_unbind, | ||
| 115 | .tx_fixup = zaurus_tx_fixup, | ||
| 116 | }; | ||
| 117 | #define ZAURUS_STRONGARM_INFO ((unsigned long)&zaurus_sl5x00_info) | ||
| 118 | |||
| 119 | static const struct driver_info zaurus_pxa_info = { | ||
| 120 | .description = "Sharp Zaurus, PXA-2xx based", | ||
| 121 | .flags = FLAG_FRAMING_Z, | ||
| 122 | .check_connect = always_connected, | ||
| 123 | .bind = zaurus_bind, | ||
| 124 | .unbind = usbnet_cdc_unbind, | ||
| 125 | .tx_fixup = zaurus_tx_fixup, | ||
| 126 | }; | ||
| 127 | #define ZAURUS_PXA_INFO ((unsigned long)&zaurus_pxa_info) | ||
| 128 | |||
| 129 | static const struct driver_info olympus_mxl_info = { | ||
| 130 | .description = "Olympus R1000", | ||
| 131 | .flags = FLAG_FRAMING_Z, | ||
| 132 | .check_connect = always_connected, | ||
| 133 | .bind = zaurus_bind, | ||
| 134 | .unbind = usbnet_cdc_unbind, | ||
| 135 | .tx_fixup = zaurus_tx_fixup, | ||
| 136 | }; | ||
| 137 | #define OLYMPUS_MXL_INFO ((unsigned long)&olympus_mxl_info) | ||
| 138 | |||
| 139 | |||
| 140 | /* Some more recent products using Lineo/Belcarra code will wrongly claim | ||
| 141 | * CDC MDLM conformance. They aren't conformant: data endpoints live | ||
| 142 | * in the control interface, there's no data interface, and it's not used | ||
| 143 | * to talk to a cell phone radio. But at least we can detect these two | ||
| 144 | * pseudo-classes, rather than growing this product list with entries for | ||
| 145 | * each new nonconformant product (sigh). | ||
| 146 | */ | ||
| 147 | static const u8 safe_guid[16] = { | ||
| 148 | 0x5d, 0x34, 0xcf, 0x66, 0x11, 0x18, 0x11, 0xd6, | ||
| 149 | 0xa2, 0x1a, 0x00, 0x01, 0x02, 0xca, 0x9a, 0x7f, | ||
| 150 | }; | ||
| 151 | static const u8 blan_guid[16] = { | ||
| 152 | 0x74, 0xf0, 0x3d, 0xbd, 0x1e, 0xc1, 0x44, 0x70, | ||
| 153 | 0xa3, 0x67, 0x71, 0x34, 0xc9, 0xf5, 0x54, 0x37, | ||
| 154 | }; | ||
| 155 | |||
| 156 | static int blan_mdlm_bind(struct usbnet *dev, struct usb_interface *intf) | ||
| 157 | { | ||
| 158 | u8 *buf = intf->cur_altsetting->extra; | ||
| 159 | int len = intf->cur_altsetting->extralen; | ||
| 160 | struct usb_cdc_mdlm_desc *desc = NULL; | ||
| 161 | struct usb_cdc_mdlm_detail_desc *detail = NULL; | ||
| 162 | |||
| 163 | while (len > 3) { | ||
| 164 | if (buf [1] != USB_DT_CS_INTERFACE) | ||
| 165 | goto next_desc; | ||
| 166 | |||
| 167 | /* use bDescriptorSubType, and just verify that we get a | ||
| 168 | * "BLAN" (or "SAFE") descriptor. | ||
| 169 | */ | ||
| 170 | switch (buf [2]) { | ||
| 171 | case USB_CDC_MDLM_TYPE: | ||
| 172 | if (desc) { | ||
| 173 | dev_dbg(&intf->dev, "extra MDLM\n"); | ||
| 174 | goto bad_desc; | ||
| 175 | } | ||
| 176 | desc = (void *) buf; | ||
| 177 | if (desc->bLength != sizeof *desc) { | ||
| 178 | dev_dbg(&intf->dev, "MDLM len %u\n", | ||
| 179 | desc->bLength); | ||
| 180 | goto bad_desc; | ||
| 181 | } | ||
| 182 | /* expect bcdVersion 1.0, ignore */ | ||
| 183 | if (memcmp(&desc->bGUID, blan_guid, 16) | ||
| 184 | && memcmp(&desc->bGUID, safe_guid, 16) ) { | ||
| 185 | /* hey, this one might _really_ be MDLM! */ | ||
| 186 | dev_dbg(&intf->dev, "MDLM guid\n"); | ||
| 187 | goto bad_desc; | ||
| 188 | } | ||
| 189 | break; | ||
| 190 | case USB_CDC_MDLM_DETAIL_TYPE: | ||
| 191 | if (detail) { | ||
| 192 | dev_dbg(&intf->dev, "extra MDLM detail\n"); | ||
| 193 | goto bad_desc; | ||
| 194 | } | ||
| 195 | detail = (void *) buf; | ||
| 196 | switch (detail->bGuidDescriptorType) { | ||
| 197 | case 0: /* "SAFE" */ | ||
| 198 | if (detail->bLength != (sizeof *detail + 2)) | ||
| 199 | goto bad_detail; | ||
| 200 | break; | ||
| 201 | case 1: /* "BLAN" */ | ||
| 202 | if (detail->bLength != (sizeof *detail + 3)) | ||
| 203 | goto bad_detail; | ||
| 204 | break; | ||
| 205 | default: | ||
| 206 | goto bad_detail; | ||
| 207 | } | ||
| 208 | |||
| 209 | /* assuming we either noticed BLAN already, or will | ||
| 210 | * find it soon, there are some data bytes here: | ||
| 211 | * - bmNetworkCapabilities (unused) | ||
| 212 | * - bmDataCapabilities (bits, see below) | ||
| 213 | * - bPad (ignored, for PADAFTER -- BLAN-only) | ||
| 214 | * bits are: | ||
| 215 | * - 0x01 -- Zaurus framing (add CRC) | ||
| 216 | * - 0x02 -- PADBEFORE (CRC includes some padding) | ||
| 217 | * - 0x04 -- PADAFTER (some padding after CRC) | ||
| 218 | * - 0x08 -- "fermat" packet mangling (for hw bugs) | ||
| 219 | * the PADBEFORE appears not to matter; we interop | ||
| 220 | * with devices that use it and those that don't. | ||
| 221 | */ | ||
| 222 | if ((detail->bDetailData[1] & ~0x02) != 0x01) { | ||
| 223 | /* bmDataCapabilites == 0 would be fine too, | ||
| 224 | * but framing is minidriver-coupled for now. | ||
| 225 | */ | ||
| 226 | bad_detail: | ||
| 227 | dev_dbg(&intf->dev, | ||
| 228 | "bad MDLM detail, %d %d %d\n", | ||
| 229 | detail->bLength, | ||
| 230 | detail->bDetailData[0], | ||
| 231 | detail->bDetailData[2]); | ||
| 232 | goto bad_desc; | ||
| 233 | } | ||
| 234 | break; | ||
| 235 | } | ||
| 236 | next_desc: | ||
| 237 | len -= buf [0]; /* bLength */ | ||
| 238 | buf += buf [0]; | ||
| 239 | } | ||
| 240 | |||
| 241 | if (!desc || !detail) { | ||
| 242 | dev_dbg(&intf->dev, "missing cdc mdlm %s%sdescriptor\n", | ||
| 243 | desc ? "" : "func ", | ||
| 244 | detail ? "" : "detail "); | ||
| 245 | goto bad_desc; | ||
| 246 | } | ||
| 247 | |||
| 248 | /* There's probably a CDC Ethernet descriptor there, but we can't | ||
| 249 | * rely on the Ethernet address it provides since not all vendors | ||
| 250 | * bother to make it unique. Likewise there's no point in tracking | ||
| 251 | * of the CDC event notifications. | ||
| 252 | */ | ||
| 253 | return usbnet_get_endpoints(dev, intf); | ||
| 254 | |||
| 255 | bad_desc: | ||
| 256 | dev_info(&dev->udev->dev, "unsupported MDLM descriptors\n"); | ||
| 257 | return -ENODEV; | ||
| 258 | } | ||
| 259 | |||
| 260 | static const struct driver_info bogus_mdlm_info = { | ||
| 261 | .description = "pseudo-MDLM (BLAN) device", | ||
| 262 | .flags = FLAG_FRAMING_Z, | ||
| 263 | .check_connect = always_connected, | ||
| 264 | .tx_fixup = zaurus_tx_fixup, | ||
| 265 | .bind = blan_mdlm_bind, | ||
| 266 | }; | ||
| 267 | |||
| 268 | static const struct usb_device_id products [] = { | ||
| 269 | #define ZAURUS_MASTER_INTERFACE \ | ||
| 270 | .bInterfaceClass = USB_CLASS_COMM, \ | ||
| 271 | .bInterfaceSubClass = USB_CDC_SUBCLASS_ETHERNET, \ | ||
| 272 | .bInterfaceProtocol = USB_CDC_PROTO_NONE | ||
| 273 | |||
| 274 | /* SA-1100 based Sharp Zaurus ("collie"), or compatible. */ | ||
| 275 | { | ||
| 276 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 277 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 278 | .idVendor = 0x04DD, | ||
| 279 | .idProduct = 0x8004, | ||
| 280 | ZAURUS_MASTER_INTERFACE, | ||
| 281 | .driver_info = ZAURUS_STRONGARM_INFO, | ||
| 282 | }, | ||
| 283 | |||
| 284 | /* PXA-2xx based models are also lying-about-cdc. If you add any | ||
| 285 | * more devices that claim to be CDC Ethernet, make sure they get | ||
| 286 | * added to the blacklist in cdc_ether too. | ||
| 287 | * | ||
| 288 | * NOTE: OpenZaurus versions with 2.6 kernels won't use these entries, | ||
| 289 | * unlike the older ones with 2.4 "embedix" kernels. | ||
| 290 | */ | ||
| 291 | { | ||
| 292 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 293 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 294 | .idVendor = 0x04DD, | ||
| 295 | .idProduct = 0x8005, /* A-300 */ | ||
| 296 | ZAURUS_MASTER_INTERFACE, | ||
| 297 | .driver_info = ZAURUS_PXA_INFO, | ||
| 298 | }, { | ||
| 299 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 300 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 301 | .idVendor = 0x04DD, | ||
| 302 | .idProduct = 0x8006, /* B-500/SL-5600 */ | ||
| 303 | ZAURUS_MASTER_INTERFACE, | ||
| 304 | .driver_info = ZAURUS_PXA_INFO, | ||
| 305 | }, { | ||
| 306 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 307 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 308 | .idVendor = 0x04DD, | ||
| 309 | .idProduct = 0x8007, /* C-700 */ | ||
| 310 | ZAURUS_MASTER_INTERFACE, | ||
| 311 | .driver_info = ZAURUS_PXA_INFO, | ||
| 312 | }, { | ||
| 313 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 314 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 315 | .idVendor = 0x04DD, | ||
| 316 | .idProduct = 0x9031, /* C-750 C-760 */ | ||
| 317 | ZAURUS_MASTER_INTERFACE, | ||
| 318 | .driver_info = ZAURUS_PXA_INFO, | ||
| 319 | }, { | ||
| 320 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 321 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 322 | .idVendor = 0x04DD, | ||
| 323 | .idProduct = 0x9032, /* SL-6000 */ | ||
| 324 | ZAURUS_MASTER_INTERFACE, | ||
| 325 | .driver_info = ZAURUS_PXA_INFO, | ||
| 326 | }, { | ||
| 327 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 328 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 329 | .idVendor = 0x04DD, | ||
| 330 | /* reported with some C860 units */ | ||
| 331 | .idProduct = 0x9050, /* C-860 */ | ||
| 332 | ZAURUS_MASTER_INTERFACE, | ||
| 333 | .driver_info = ZAURUS_PXA_INFO, | ||
| 334 | }, | ||
| 335 | |||
| 336 | |||
| 337 | /* At least some of the newest PXA units have very different lies about | ||
| 338 | * their standards support: they claim to be cell phones offering | ||
| 339 | * direct access to their radios! (No, they don't conform to CDC MDLM.) | ||
| 340 | */ | ||
| 341 | { | ||
| 342 | USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM, | ||
| 343 | USB_CDC_PROTO_NONE), | ||
| 344 | .driver_info = (unsigned long) &bogus_mdlm_info, | ||
| 345 | }, | ||
| 346 | |||
| 347 | /* Olympus has some models with a Zaurus-compatible option. | ||
| 348 | * R-1000 uses a FreeScale i.MXL cpu (ARMv4T) | ||
| 349 | */ | ||
| 350 | { | ||
| 351 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
| 352 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
| 353 | .idVendor = 0x07B4, | ||
| 354 | .idProduct = 0x0F02, /* R-1000 */ | ||
| 355 | ZAURUS_MASTER_INTERFACE, | ||
| 356 | .driver_info = OLYMPUS_MXL_INFO, | ||
| 357 | }, | ||
| 358 | { }, // END | ||
| 359 | }; | ||
| 360 | MODULE_DEVICE_TABLE(usb, products); | ||
| 361 | |||
| 362 | static struct usb_driver zaurus_driver = { | ||
| 363 | .owner = THIS_MODULE, | ||
| 364 | .name = "zaurus", | ||
| 365 | .id_table = products, | ||
| 366 | .probe = usbnet_probe, | ||
| 367 | .disconnect = usbnet_disconnect, | ||
| 368 | .suspend = usbnet_suspend, | ||
| 369 | .resume = usbnet_resume, | ||
| 370 | }; | ||
| 371 | |||
| 372 | static int __init zaurus_init(void) | ||
| 373 | { | ||
| 374 | return usb_register(&zaurus_driver); | ||
| 375 | } | ||
| 376 | module_init(zaurus_init); | ||
| 377 | |||
| 378 | static void __exit zaurus_exit(void) | ||
| 379 | { | ||
| 380 | usb_deregister(&zaurus_driver); | ||
| 381 | } | ||
| 382 | module_exit(zaurus_exit); | ||
| 383 | |||
| 384 | MODULE_AUTHOR("Pavel Machek, David Brownell"); | ||
| 385 | MODULE_DESCRIPTION("Sharp Zaurus PDA, and compatible products"); | ||
| 386 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/net/zd1201.c b/drivers/usb/net/zd1201.c index fc013978837e..c4e479ee926a 100644 --- a/drivers/usb/net/zd1201.c +++ b/drivers/usb/net/zd1201.c | |||
| @@ -847,7 +847,6 @@ static void zd1201_tx_timeout(struct net_device *dev) | |||
| 847 | return; | 847 | return; |
| 848 | dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n", | 848 | dev_warn(&zd->usb->dev, "%s: TX timeout, shooting down urb\n", |
| 849 | dev->name); | 849 | dev->name); |
| 850 | zd->tx_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 851 | usb_unlink_urb(zd->tx_urb); | 850 | usb_unlink_urb(zd->tx_urb); |
| 852 | zd->stats.tx_errors++; | 851 | zd->stats.tx_errors++; |
| 853 | /* Restart the timeout to quiet the watchdog: */ | 852 | /* Restart the timeout to quiet the watchdog: */ |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index 012e63e05806..05c44ae3ed32 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
| @@ -453,8 +453,8 @@ static int generic_startup (struct usb_serial *serial) | |||
| 453 | priv->cbr_mask = B300; | 453 | priv->cbr_mask = B300; |
| 454 | usb_set_serial_port_data(serial->port[0], priv); | 454 | usb_set_serial_port_data(serial->port[0], priv); |
| 455 | 455 | ||
| 456 | return (0); | 456 | return 0; |
| 457 | } | 457 | } |
| 458 | 458 | ||
| 459 | 459 | ||
| 460 | static int cypress_earthmate_startup (struct usb_serial *serial) | 460 | static int cypress_earthmate_startup (struct usb_serial *serial) |
| @@ -464,14 +464,15 @@ static int cypress_earthmate_startup (struct usb_serial *serial) | |||
| 464 | dbg("%s", __FUNCTION__); | 464 | dbg("%s", __FUNCTION__); |
| 465 | 465 | ||
| 466 | if (generic_startup(serial)) { | 466 | if (generic_startup(serial)) { |
| 467 | dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number); | 467 | dbg("%s - Failed setting up port %d", __FUNCTION__, |
| 468 | serial->port[0]->number); | ||
| 468 | return 1; | 469 | return 1; |
| 469 | } | 470 | } |
| 470 | 471 | ||
| 471 | priv = usb_get_serial_port_data(serial->port[0]); | 472 | priv = usb_get_serial_port_data(serial->port[0]); |
| 472 | priv->chiptype = CT_EARTHMATE; | 473 | priv->chiptype = CT_EARTHMATE; |
| 473 | 474 | ||
| 474 | return (0); | 475 | return 0; |
| 475 | } /* cypress_earthmate_startup */ | 476 | } /* cypress_earthmate_startup */ |
| 476 | 477 | ||
| 477 | 478 | ||
| @@ -482,14 +483,15 @@ static int cypress_hidcom_startup (struct usb_serial *serial) | |||
| 482 | dbg("%s", __FUNCTION__); | 483 | dbg("%s", __FUNCTION__); |
| 483 | 484 | ||
| 484 | if (generic_startup(serial)) { | 485 | if (generic_startup(serial)) { |
| 485 | dbg("%s - Failed setting up port %d", __FUNCTION__, serial->port[0]->number); | 486 | dbg("%s - Failed setting up port %d", __FUNCTION__, |
| 487 | serial->port[0]->number); | ||
| 486 | return 1; | 488 | return 1; |
| 487 | } | 489 | } |
| 488 | 490 | ||
| 489 | priv = usb_get_serial_port_data(serial->port[0]); | 491 | priv = usb_get_serial_port_data(serial->port[0]); |
| 490 | priv->chiptype = CT_CYPHIDCOM; | 492 | priv->chiptype = CT_CYPHIDCOM; |
| 491 | 493 | ||
| 492 | return (0); | 494 | return 0; |
| 493 | } /* cypress_hidcom_startup */ | 495 | } /* cypress_hidcom_startup */ |
| 494 | 496 | ||
| 495 | 497 | ||
| @@ -909,7 +911,8 @@ static int cypress_ioctl (struct usb_serial_port *port, struct file * file, unsi | |||
| 909 | } /* cypress_ioctl */ | 911 | } /* cypress_ioctl */ |
| 910 | 912 | ||
| 911 | 913 | ||
| 912 | static void cypress_set_termios (struct usb_serial_port *port, struct termios *old_termios) | 914 | static void cypress_set_termios (struct usb_serial_port *port, |
| 915 | struct termios *old_termios) | ||
| 913 | { | 916 | { |
| 914 | struct cypress_private *priv = usb_get_serial_port_data(port); | 917 | struct cypress_private *priv = usb_get_serial_port_data(port); |
| 915 | struct tty_struct *tty; | 918 | struct tty_struct *tty; |
| @@ -918,7 +921,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 918 | unsigned long flags; | 921 | unsigned long flags; |
| 919 | __u8 oldlines; | 922 | __u8 oldlines; |
| 920 | int linechange = 0; | 923 | int linechange = 0; |
| 921 | 924 | ||
| 922 | dbg("%s - port %d", __FUNCTION__, port->number); | 925 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 923 | 926 | ||
| 924 | tty = port->tty; | 927 | tty = port->tty; |
| @@ -931,10 +934,12 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 931 | if (!priv->termios_initialized) { | 934 | if (!priv->termios_initialized) { |
| 932 | if (priv->chiptype == CT_EARTHMATE) { | 935 | if (priv->chiptype == CT_EARTHMATE) { |
| 933 | *(tty->termios) = tty_std_termios; | 936 | *(tty->termios) = tty_std_termios; |
| 934 | tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | CLOCAL; | 937 | tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL | |
| 938 | CLOCAL; | ||
| 935 | } else if (priv->chiptype == CT_CYPHIDCOM) { | 939 | } else if (priv->chiptype == CT_CYPHIDCOM) { |
| 936 | *(tty->termios) = tty_std_termios; | 940 | *(tty->termios) = tty_std_termios; |
| 937 | tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; | 941 | tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL | |
| 942 | CLOCAL; | ||
| 938 | } | 943 | } |
| 939 | priv->termios_initialized = 1; | 944 | priv->termios_initialized = 1; |
| 940 | } | 945 | } |
| @@ -946,12 +951,15 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 946 | /* check if there are new settings */ | 951 | /* check if there are new settings */ |
| 947 | if (old_termios) { | 952 | if (old_termios) { |
| 948 | if ((cflag != old_termios->c_cflag) || | 953 | if ((cflag != old_termios->c_cflag) || |
| 949 | (RELEVANT_IFLAG(iflag) != RELEVANT_IFLAG(old_termios->c_iflag))) { | 954 | (RELEVANT_IFLAG(iflag) != |
| 950 | dbg("%s - attempting to set new termios settings", __FUNCTION__); | 955 | RELEVANT_IFLAG(old_termios->c_iflag))) { |
| 951 | /* should make a copy of this in case something goes wrong in the function, we can restore it */ | 956 | dbg("%s - attempting to set new termios settings", |
| 957 | __FUNCTION__); | ||
| 958 | /* should make a copy of this in case something goes | ||
| 959 | * wrong in the function, we can restore it */ | ||
| 952 | spin_lock_irqsave(&priv->lock, flags); | 960 | spin_lock_irqsave(&priv->lock, flags); |
| 953 | priv->tmp_termios = *(tty->termios); | 961 | priv->tmp_termios = *(tty->termios); |
| 954 | spin_unlock_irqrestore(&priv->lock, flags); | 962 | spin_unlock_irqrestore(&priv->lock, flags); |
| 955 | } else { | 963 | } else { |
| 956 | dbg("%s - nothing to do, exiting", __FUNCTION__); | 964 | dbg("%s - nothing to do, exiting", __FUNCTION__); |
| 957 | return; | 965 | return; |
| @@ -962,21 +970,34 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 962 | /* set number of data bits, parity, stop bits */ | 970 | /* set number of data bits, parity, stop bits */ |
| 963 | /* when parity is disabled the parity type bit is ignored */ | 971 | /* when parity is disabled the parity type bit is ignored */ |
| 964 | 972 | ||
| 965 | stop_bits = cflag & CSTOPB ? 1 : 0; /* 1 means 2 stop bits, 0 means 1 stop bit */ | 973 | /* 1 means 2 stop bits, 0 means 1 stop bit */ |
| 966 | 974 | stop_bits = cflag & CSTOPB ? 1 : 0; | |
| 975 | |||
| 967 | if (cflag & PARENB) { | 976 | if (cflag & PARENB) { |
| 968 | parity_enable = 1; | 977 | parity_enable = 1; |
| 969 | parity_type = cflag & PARODD ? 1 : 0; /* 1 means odd parity, 0 means even parity */ | 978 | /* 1 means odd parity, 0 means even parity */ |
| 979 | parity_type = cflag & PARODD ? 1 : 0; | ||
| 970 | } else | 980 | } else |
| 971 | parity_enable = parity_type = 0; | 981 | parity_enable = parity_type = 0; |
| 972 | 982 | ||
| 973 | if (cflag & CSIZE) { | 983 | if (cflag & CSIZE) { |
| 974 | switch (cflag & CSIZE) { | 984 | switch (cflag & CSIZE) { |
| 975 | case CS5: data_bits = 0; break; | 985 | case CS5: |
| 976 | case CS6: data_bits = 1; break; | 986 | data_bits = 0; |
| 977 | case CS7: data_bits = 2; break; | 987 | break; |
| 978 | case CS8: data_bits = 3; break; | 988 | case CS6: |
| 979 | default: err("%s - CSIZE was set, but not CS5-CS8", __FUNCTION__); data_bits = 3; | 989 | data_bits = 1; |
| 990 | break; | ||
| 991 | case CS7: | ||
| 992 | data_bits = 2; | ||
| 993 | break; | ||
| 994 | case CS8: | ||
| 995 | data_bits = 3; | ||
| 996 | break; | ||
| 997 | default: | ||
| 998 | err("%s - CSIZE was set, but not CS5-CS8", | ||
| 999 | __FUNCTION__); | ||
| 1000 | data_bits = 3; | ||
| 980 | } | 1001 | } |
| 981 | } else | 1002 | } else |
| 982 | data_bits = 3; | 1003 | data_bits = 3; |
| @@ -991,63 +1012,85 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 991 | } else { | 1012 | } else { |
| 992 | baud_mask = (cflag & CBAUD); | 1013 | baud_mask = (cflag & CBAUD); |
| 993 | switch(baud_mask) { | 1014 | switch(baud_mask) { |
| 994 | case B300: dbg("%s - setting baud 300bps", __FUNCTION__); break; | 1015 | case B300: |
| 995 | case B600: dbg("%s - setting baud 600bps", __FUNCTION__); break; | 1016 | dbg("%s - setting baud 300bps", __FUNCTION__); |
| 996 | case B1200: dbg("%s - setting baud 1200bps", __FUNCTION__); break; | 1017 | break; |
| 997 | case B2400: dbg("%s - setting baud 2400bps", __FUNCTION__); break; | 1018 | case B600: |
| 998 | case B4800: dbg("%s - setting baud 4800bps", __FUNCTION__); break; | 1019 | dbg("%s - setting baud 600bps", __FUNCTION__); |
| 999 | case B9600: dbg("%s - setting baud 9600bps", __FUNCTION__); break; | 1020 | break; |
| 1000 | case B19200: dbg("%s - setting baud 19200bps", __FUNCTION__); break; | 1021 | case B1200: |
| 1001 | case B38400: dbg("%s - setting baud 38400bps", __FUNCTION__); break; | 1022 | dbg("%s - setting baud 1200bps", __FUNCTION__); |
| 1002 | case B57600: dbg("%s - setting baud 57600bps", __FUNCTION__); break; | 1023 | break; |
| 1003 | case B115200: dbg("%s - setting baud 115200bps", __FUNCTION__); break; | 1024 | case B2400: |
| 1004 | default: dbg("%s - unknown masked baud rate", __FUNCTION__); | 1025 | dbg("%s - setting baud 2400bps", __FUNCTION__); |
| 1026 | break; | ||
| 1027 | case B4800: | ||
| 1028 | dbg("%s - setting baud 4800bps", __FUNCTION__); | ||
| 1029 | break; | ||
| 1030 | case B9600: | ||
| 1031 | dbg("%s - setting baud 9600bps", __FUNCTION__); | ||
| 1032 | break; | ||
| 1033 | case B19200: | ||
| 1034 | dbg("%s - setting baud 19200bps", __FUNCTION__); | ||
| 1035 | break; | ||
| 1036 | case B38400: | ||
| 1037 | dbg("%s - setting baud 38400bps", __FUNCTION__); | ||
| 1038 | break; | ||
| 1039 | case B57600: | ||
| 1040 | dbg("%s - setting baud 57600bps", __FUNCTION__); | ||
| 1041 | break; | ||
| 1042 | case B115200: | ||
| 1043 | dbg("%s - setting baud 115200bps", __FUNCTION__); | ||
| 1044 | break; | ||
| 1045 | default: | ||
| 1046 | dbg("%s - unknown masked baud rate", __FUNCTION__); | ||
| 1005 | } | 1047 | } |
| 1006 | priv->line_control = (CONTROL_DTR | CONTROL_RTS); | 1048 | priv->line_control = (CONTROL_DTR | CONTROL_RTS); |
| 1007 | } | 1049 | } |
| 1008 | spin_unlock_irqrestore(&priv->lock, flags); | 1050 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1009 | |||
| 1010 | dbg("%s - sending %d stop_bits, %d parity_enable, %d parity_type, %d data_bits (+5)", __FUNCTION__, | ||
| 1011 | stop_bits, parity_enable, parity_type, data_bits); | ||
| 1012 | 1051 | ||
| 1013 | cypress_serial_control(port, baud_mask, data_bits, stop_bits, parity_enable, | 1052 | dbg("%s - sending %d stop_bits, %d parity_enable, %d parity_type, " |
| 1014 | parity_type, 0, CYPRESS_SET_CONFIG); | 1053 | "%d data_bits (+5)", __FUNCTION__, stop_bits, |
| 1054 | parity_enable, parity_type, data_bits); | ||
| 1055 | |||
| 1056 | cypress_serial_control(port, baud_mask, data_bits, stop_bits, | ||
| 1057 | parity_enable, parity_type, 0, CYPRESS_SET_CONFIG); | ||
| 1015 | 1058 | ||
| 1016 | /* we perform a CYPRESS_GET_CONFIG so that the current settings are filled into the private structure | 1059 | /* we perform a CYPRESS_GET_CONFIG so that the current settings are |
| 1017 | * this should confirm that all is working if it returns what we just set */ | 1060 | * filled into the private structure this should confirm that all is |
| 1061 | * working if it returns what we just set */ | ||
| 1018 | cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG); | 1062 | cypress_serial_control(port, 0, 0, 0, 0, 0, 0, CYPRESS_GET_CONFIG); |
| 1019 | 1063 | ||
| 1020 | /* Here we can define custom tty settings for devices | 1064 | /* Here we can define custom tty settings for devices; the main tty |
| 1021 | * | 1065 | * termios flag base comes from empeg.c */ |
| 1022 | * the main tty termios flag base comes from empeg.c | ||
| 1023 | */ | ||
| 1024 | 1066 | ||
| 1025 | spin_lock_irqsave(&priv->lock, flags); | 1067 | spin_lock_irqsave(&priv->lock, flags); |
| 1026 | if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) { | 1068 | if ( (priv->chiptype == CT_EARTHMATE) && (priv->baud_rate == 4800) ) { |
| 1027 | 1069 | dbg("Using custom termios settings for a baud rate of " | |
| 1028 | dbg("Using custom termios settings for a baud rate of 4800bps."); | 1070 | "4800bps."); |
| 1029 | /* define custom termios settings for NMEA protocol */ | 1071 | /* define custom termios settings for NMEA protocol */ |
| 1030 | 1072 | ||
| 1031 | tty->termios->c_iflag /* input modes - */ | 1073 | tty->termios->c_iflag /* input modes - */ |
| 1032 | &= ~(IGNBRK /* disable ignore break */ | 1074 | &= ~(IGNBRK /* disable ignore break */ |
| 1033 | | BRKINT /* disable break causes interrupt */ | 1075 | | BRKINT /* disable break causes interrupt */ |
| 1034 | | PARMRK /* disable mark parity errors */ | 1076 | | PARMRK /* disable mark parity errors */ |
| 1035 | | ISTRIP /* disable clear high bit of input characters */ | 1077 | | ISTRIP /* disable clear high bit of input char */ |
| 1036 | | INLCR /* disable translate NL to CR */ | 1078 | | INLCR /* disable translate NL to CR */ |
| 1037 | | IGNCR /* disable ignore CR */ | 1079 | | IGNCR /* disable ignore CR */ |
| 1038 | | ICRNL /* disable translate CR to NL */ | 1080 | | ICRNL /* disable translate CR to NL */ |
| 1039 | | IXON); /* disable enable XON/XOFF flow control */ | 1081 | | IXON); /* disable enable XON/XOFF flow control */ |
| 1040 | 1082 | ||
| 1041 | tty->termios->c_oflag /* output modes */ | 1083 | tty->termios->c_oflag /* output modes */ |
| 1042 | &= ~OPOST; /* disable postprocess output characters */ | 1084 | &= ~OPOST; /* disable postprocess output char */ |
| 1043 | |||
| 1044 | tty->termios->c_lflag /* line discipline modes */ | ||
| 1045 | &= ~(ECHO /* disable echo input characters */ | ||
| 1046 | | ECHONL /* disable echo new line */ | ||
| 1047 | | ICANON /* disable erase, kill, werase, and rprnt special characters */ | ||
| 1048 | | ISIG /* disable interrupt, quit, and suspend special characters */ | ||
| 1049 | | IEXTEN); /* disable non-POSIX special characters */ | ||
| 1050 | 1085 | ||
| 1086 | tty->termios->c_lflag /* line discipline modes */ | ||
| 1087 | &= ~(ECHO /* disable echo input characters */ | ||
| 1088 | | ECHONL /* disable echo new line */ | ||
| 1089 | | ICANON /* disable erase, kill, werase, and rprnt | ||
| 1090 | special characters */ | ||
| 1091 | | ISIG /* disable interrupt, quit, and suspend | ||
| 1092 | special characters */ | ||
| 1093 | | IEXTEN); /* disable non-POSIX special characters */ | ||
| 1051 | } /* CT_CYPHIDCOM: Application should handle this for device */ | 1094 | } /* CT_CYPHIDCOM: Application should handle this for device */ |
| 1052 | 1095 | ||
| 1053 | linechange = (priv->line_control != oldlines); | 1096 | linechange = (priv->line_control != oldlines); |
| @@ -1060,7 +1103,7 @@ static void cypress_set_termios (struct usb_serial_port *port, struct termios *o | |||
| 1060 | } | 1103 | } |
| 1061 | } /* cypress_set_termios */ | 1104 | } /* cypress_set_termios */ |
| 1062 | 1105 | ||
| 1063 | 1106 | ||
| 1064 | /* returns amount of data still left in soft buffer */ | 1107 | /* returns amount of data still left in soft buffer */ |
| 1065 | static int cypress_chars_in_buffer(struct usb_serial_port *port) | 1108 | static int cypress_chars_in_buffer(struct usb_serial_port *port) |
| 1066 | { | 1109 | { |
| @@ -1088,7 +1131,7 @@ static void cypress_throttle (struct usb_serial_port *port) | |||
| 1088 | 1131 | ||
| 1089 | spin_lock_irqsave(&priv->lock, flags); | 1132 | spin_lock_irqsave(&priv->lock, flags); |
| 1090 | priv->rx_flags = THROTTLED; | 1133 | priv->rx_flags = THROTTLED; |
| 1091 | spin_unlock_irqrestore(&priv->lock, flags); | 1134 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1092 | } | 1135 | } |
| 1093 | 1136 | ||
| 1094 | 1137 | ||
| @@ -1110,7 +1153,8 @@ static void cypress_unthrottle (struct usb_serial_port *port) | |||
| 1110 | 1153 | ||
| 1111 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | 1154 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); |
| 1112 | if (result) | 1155 | if (result) |
| 1113 | dev_err(&port->dev, "%s - failed submitting read urb, error %d\n", __FUNCTION__, result); | 1156 | dev_err(&port->dev, "%s - failed submitting read urb, " |
| 1157 | "error %d\n", __FUNCTION__, result); | ||
| 1114 | } | 1158 | } |
| 1115 | } | 1159 | } |
| 1116 | 1160 | ||
| @@ -1122,7 +1166,7 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
| 1122 | struct tty_struct *tty; | 1166 | struct tty_struct *tty; |
| 1123 | unsigned char *data = urb->transfer_buffer; | 1167 | unsigned char *data = urb->transfer_buffer; |
| 1124 | unsigned long flags; | 1168 | unsigned long flags; |
| 1125 | char tty_flag = TTY_NORMAL; | 1169 | char tty_flag = TTY_NORMAL; |
| 1126 | int havedata = 0; | 1170 | int havedata = 0; |
| 1127 | int bytes = 0; | 1171 | int bytes = 0; |
| 1128 | int result; | 1172 | int result; |
| @@ -1131,7 +1175,8 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
| 1131 | dbg("%s - port %d", __FUNCTION__, port->number); | 1175 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 1132 | 1176 | ||
| 1133 | if (urb->status) { | 1177 | if (urb->status) { |
| 1134 | dbg("%s - nonzero read status received: %d", __FUNCTION__, urb->status); | 1178 | dbg("%s - nonzero read status received: %d", __FUNCTION__, |
| 1179 | urb->status); | ||
| 1135 | return; | 1180 | return; |
| 1136 | } | 1181 | } |
| 1137 | 1182 | ||
| @@ -1155,51 +1200,55 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
| 1155 | case 32: | 1200 | case 32: |
| 1156 | /* This is for the CY7C64013... */ | 1201 | /* This is for the CY7C64013... */ |
| 1157 | priv->current_status = data[0] & 0xF8; | 1202 | priv->current_status = data[0] & 0xF8; |
| 1158 | bytes = data[1]+2; | 1203 | bytes = data[1] + 2; |
| 1159 | i=2; | 1204 | i = 2; |
| 1160 | if (bytes > 2) | 1205 | if (bytes > 2) |
| 1161 | havedata = 1; | 1206 | havedata = 1; |
| 1162 | break; | 1207 | break; |
| 1163 | case 8: | 1208 | case 8: |
| 1164 | /* This is for the CY7C63743... */ | 1209 | /* This is for the CY7C63743... */ |
| 1165 | priv->current_status = data[0] & 0xF8; | 1210 | priv->current_status = data[0] & 0xF8; |
| 1166 | bytes = (data[0] & 0x07)+1; | 1211 | bytes = (data[0] & 0x07) + 1; |
| 1167 | i=1; | 1212 | i = 1; |
| 1168 | if (bytes > 1) | 1213 | if (bytes > 1) |
| 1169 | havedata = 1; | 1214 | havedata = 1; |
| 1170 | break; | 1215 | break; |
| 1171 | default: | 1216 | default: |
| 1172 | dbg("%s - wrong packet size - received %d bytes", __FUNCTION__, urb->actual_length); | 1217 | dbg("%s - wrong packet size - received %d bytes", |
| 1218 | __FUNCTION__, urb->actual_length); | ||
| 1173 | spin_unlock_irqrestore(&priv->lock, flags); | 1219 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1174 | goto continue_read; | 1220 | goto continue_read; |
| 1175 | } | 1221 | } |
| 1176 | spin_unlock_irqrestore(&priv->lock, flags); | 1222 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1177 | 1223 | ||
| 1178 | usb_serial_debug_data (debug, &port->dev, __FUNCTION__, urb->actual_length, data); | 1224 | usb_serial_debug_data (debug, &port->dev, __FUNCTION__, |
| 1225 | urb->actual_length, data); | ||
| 1179 | 1226 | ||
| 1180 | spin_lock_irqsave(&priv->lock, flags); | 1227 | spin_lock_irqsave(&priv->lock, flags); |
| 1181 | /* check to see if status has changed */ | 1228 | /* check to see if status has changed */ |
| 1182 | if (priv != NULL) { | 1229 | if (priv != NULL) { |
| 1183 | if (priv->current_status != priv->prev_status) { | 1230 | if (priv->current_status != priv->prev_status) { |
| 1184 | priv->diff_status |= priv->current_status ^ priv->prev_status; | 1231 | priv->diff_status |= priv->current_status ^ |
| 1232 | priv->prev_status; | ||
| 1185 | wake_up_interruptible(&priv->delta_msr_wait); | 1233 | wake_up_interruptible(&priv->delta_msr_wait); |
| 1186 | priv->prev_status = priv->current_status; | 1234 | priv->prev_status = priv->current_status; |
| 1187 | } | 1235 | } |
| 1188 | } | 1236 | } |
| 1189 | spin_unlock_irqrestore(&priv->lock, flags); | 1237 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1190 | 1238 | ||
| 1191 | /* hangup, as defined in acm.c... this might be a bad place for it though */ | 1239 | /* hangup, as defined in acm.c... this might be a bad place for it |
| 1192 | if (tty && !(tty->termios->c_cflag & CLOCAL) && !(priv->current_status & UART_CD)) { | 1240 | * though */ |
| 1241 | if (tty && !(tty->termios->c_cflag & CLOCAL) && | ||
| 1242 | !(priv->current_status & UART_CD)) { | ||
| 1193 | dbg("%s - calling hangup", __FUNCTION__); | 1243 | dbg("%s - calling hangup", __FUNCTION__); |
| 1194 | tty_hangup(tty); | 1244 | tty_hangup(tty); |
| 1195 | goto continue_read; | 1245 | goto continue_read; |
| 1196 | } | 1246 | } |
| 1197 | 1247 | ||
| 1198 | /* There is one error bit... I'm assuming it is a parity error indicator | 1248 | /* There is one error bit... I'm assuming it is a parity error |
| 1199 | * as the generic firmware will set this bit to 1 if a parity error occurs. | 1249 | * indicator as the generic firmware will set this bit to 1 if a |
| 1200 | * I can not find reference to any other error events. | 1250 | * parity error occurs. |
| 1201 | * | 1251 | * I can not find reference to any other error events. */ |
| 1202 | */ | ||
| 1203 | spin_lock_irqsave(&priv->lock, flags); | 1252 | spin_lock_irqsave(&priv->lock, flags); |
| 1204 | if (priv->current_status & CYP_ERROR) { | 1253 | if (priv->current_status & CYP_ERROR) { |
| 1205 | spin_unlock_irqrestore(&priv->lock, flags); | 1254 | spin_unlock_irqrestore(&priv->lock, flags); |
| @@ -1211,7 +1260,8 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
| 1211 | /* process read if there is data other than line status */ | 1260 | /* process read if there is data other than line status */ |
| 1212 | if (tty && (bytes > i)) { | 1261 | if (tty && (bytes > i)) { |
| 1213 | for (; i < bytes ; ++i) { | 1262 | for (; i < bytes ; ++i) { |
| 1214 | dbg("pushing byte number %d - %d - %c",i,data[i],data[i]); | 1263 | dbg("pushing byte number %d - %d - %c", i, data[i], |
| 1264 | data[i]); | ||
| 1215 | if(tty->flip.count >= TTY_FLIPBUF_SIZE) { | 1265 | if(tty->flip.count >= TTY_FLIPBUF_SIZE) { |
| 1216 | tty_flip_buffer_push(tty); | 1266 | tty_flip_buffer_push(tty); |
| 1217 | } | 1267 | } |
| @@ -1221,25 +1271,28 @@ static void cypress_read_int_callback(struct urb *urb, struct pt_regs *regs) | |||
| 1221 | } | 1271 | } |
| 1222 | 1272 | ||
| 1223 | spin_lock_irqsave(&priv->lock, flags); | 1273 | spin_lock_irqsave(&priv->lock, flags); |
| 1224 | priv->bytes_in += bytes; /* control and status byte(s) are also counted */ | 1274 | /* control and status byte(s) are also counted */ |
| 1275 | priv->bytes_in += bytes; | ||
| 1225 | spin_unlock_irqrestore(&priv->lock, flags); | 1276 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1226 | 1277 | ||
| 1227 | continue_read: | 1278 | continue_read: |
| 1228 | 1279 | ||
| 1229 | /* Continue trying to always read... unless the port has closed. */ | 1280 | /* Continue trying to always read... unless the port has closed. */ |
| 1230 | 1281 | ||
| 1231 | if (port->open_count > 0) { | 1282 | if (port->open_count > 0) { |
| 1232 | usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, | 1283 | usb_fill_int_urb(port->interrupt_in_urb, port->serial->dev, |
| 1233 | usb_rcvintpipe(port->serial->dev, port->interrupt_in_endpointAddress), | 1284 | usb_rcvintpipe(port->serial->dev, |
| 1234 | port->interrupt_in_urb->transfer_buffer, | 1285 | port->interrupt_in_endpointAddress), |
| 1235 | port->interrupt_in_urb->transfer_buffer_length, | 1286 | port->interrupt_in_urb->transfer_buffer, |
| 1236 | cypress_read_int_callback, port, | 1287 | port->interrupt_in_urb->transfer_buffer_length, |
| 1237 | interval); | 1288 | cypress_read_int_callback, port, interval); |
| 1238 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); | 1289 | result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC); |
| 1239 | if (result) | 1290 | if (result) |
| 1240 | dev_err(&urb->dev->dev, "%s - failed resubmitting read urb, error %d\n", __FUNCTION__, result); | 1291 | dev_err(&urb->dev->dev, "%s - failed resubmitting " |
| 1292 | "read urb, error %d\n", __FUNCTION__, | ||
| 1293 | result); | ||
| 1241 | } | 1294 | } |
| 1242 | 1295 | ||
| 1243 | return; | 1296 | return; |
| 1244 | } /* cypress_read_int_callback */ | 1297 | } /* cypress_read_int_callback */ |
| 1245 | 1298 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index d1964a0c4168..0a6e8b474b1f 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -269,6 +269,8 @@ | |||
| 269 | #define DRIVER_DESC "USB FTDI Serial Converters Driver" | 269 | #define DRIVER_DESC "USB FTDI Serial Converters Driver" |
| 270 | 270 | ||
| 271 | static int debug; | 271 | static int debug; |
| 272 | static __u16 vendor = FTDI_VID; | ||
| 273 | static __u16 product; | ||
| 272 | 274 | ||
| 273 | /* struct ftdi_sio_quirk is used by devices requiring special attention. */ | 275 | /* struct ftdi_sio_quirk is used by devices requiring special attention. */ |
| 274 | struct ftdi_sio_quirk { | 276 | struct ftdi_sio_quirk { |
| @@ -407,6 +409,34 @@ static struct usb_device_id id_table_combined [] = { | |||
| 407 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) }, | 409 | { USB_DEVICE(FTDI_VID, FTDI_GUDEADS_E88F_PID) }, |
| 408 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, | 410 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UO100_PID) }, |
| 409 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, | 411 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UM100_PID) }, |
| 412 | { USB_DEVICE(FTDI_VID, FTDI_ELV_UR100_PID) }, | ||
| 413 | { USB_DEVICE(FTDI_VID, FTDI_ELV_ALC8500_PID) }, | ||
| 414 | /* | ||
| 415 | * These will probably use user-space drivers. Uncomment them if | ||
| 416 | * you need them or use the user-specified vendor/product module | ||
| 417 | * parameters (see ftdi_sio.h for the numbers). Make a fuss if | ||
| 418 | * you think the driver should recognize any of them by default. | ||
| 419 | */ | ||
| 420 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_CLI7000_PID) }, */ | ||
| 421 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PPS7330_PID) }, */ | ||
| 422 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_TFM100_PID) }, */ | ||
| 423 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDF77_PID) }, */ | ||
| 424 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UIO88_PID) }, */ | ||
| 425 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UAD8_PID) }, */ | ||
| 426 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_UDA7_PID) }, */ | ||
| 427 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_USI2_PID) }, */ | ||
| 428 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_T1100_PID) }, */ | ||
| 429 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCD200_PID) }, */ | ||
| 430 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_ULA200_PID) }, */ | ||
| 431 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1000PC_PID) }, */ | ||
| 432 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_CSI8_PID) }, */ | ||
| 433 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_EM1000DL_PID) }, */ | ||
| 434 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_PCK100_PID) }, */ | ||
| 435 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_RFP500_PID) }, */ | ||
| 436 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FS20SIG_PID) }, */ | ||
| 437 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS300PC_PID) }, */ | ||
| 438 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_FHZ1300PC_PID) }, */ | ||
| 439 | /* { USB_DEVICE(FTDI_VID, FTDI_ELV_WS500_PID) }, */ | ||
| 410 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, | 440 | { USB_DEVICE(FTDI_VID, LINX_SDMUSBQSS_PID) }, |
| 411 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, | 441 | { USB_DEVICE(FTDI_VID, LINX_MASTERDEVEL2_PID) }, |
| 412 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, | 442 | { USB_DEVICE(FTDI_VID, LINX_FUTURE_0_PID) }, |
| @@ -418,6 +448,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 418 | { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) }, | 448 | { USB_DEVICE(INTREPID_VID, INTREPID_VALUECAN_PID) }, |
| 419 | { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) }, | 449 | { USB_DEVICE(INTREPID_VID, INTREPID_NEOVI_PID) }, |
| 420 | { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) }, | 450 | { USB_DEVICE(FALCOM_VID, FALCOM_TWIST_PID) }, |
| 451 | { USB_DEVICE(FALCOM_VID, FALCOM_SAMBA_PID) }, | ||
| 421 | { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) }, | 452 | { USB_DEVICE(FTDI_VID, FTDI_SUUNTO_SPORTS_PID) }, |
| 422 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, | 453 | { USB_DEVICE(FTDI_VID, FTDI_RM_CANVIEW_PID) }, |
| 423 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, | 454 | { USB_DEVICE(BANDB_VID, BANDB_USOTL4_PID) }, |
| @@ -427,12 +458,21 @@ static struct usb_device_id id_table_combined [] = { | |||
| 427 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID) }, | 458 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_0_PID) }, |
| 428 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, | 459 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_1_PID) }, |
| 429 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, | 460 | { USB_DEVICE(FTDI_VID, FTDI_4N_GALAXY_DE_2_PID) }, |
| 461 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_0_PID) }, | ||
| 462 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_1_PID) }, | ||
| 463 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_2_PID) }, | ||
| 464 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_3_PID) }, | ||
| 465 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_4_PID) }, | ||
| 466 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_5_PID) }, | ||
| 467 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_6_PID) }, | ||
| 468 | { USB_DEVICE(FTDI_VID, XSENS_CONVERTER_7_PID) }, | ||
| 430 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, | 469 | { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) }, |
| 431 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, | 470 | { USB_DEVICE(FTDI_VID, FTDI_ACTIVE_ROBOTS_PID) }, |
| 432 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) }, | 471 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y6_PID) }, |
| 433 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) }, | 472 | { USB_DEVICE(FTDI_VID, FTDI_MHAM_Y8_PID) }, |
| 434 | { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, | 473 | { USB_DEVICE(EVOLUTION_VID, EVOLUTION_ER1_PID) }, |
| 435 | { } /* Terminating entry */ | 474 | { }, /* Optional parameter entry */ |
| 475 | { } /* Terminating entry */ | ||
| 436 | }; | 476 | }; |
| 437 | 477 | ||
| 438 | MODULE_DEVICE_TABLE (usb, id_table_combined); | 478 | MODULE_DEVICE_TABLE (usb, id_table_combined); |
| @@ -2030,6 +2070,15 @@ static int __init ftdi_init (void) | |||
| 2030 | int retval; | 2070 | int retval; |
| 2031 | 2071 | ||
| 2032 | dbg("%s", __FUNCTION__); | 2072 | dbg("%s", __FUNCTION__); |
| 2073 | if (vendor > 0 && product > 0) { | ||
| 2074 | /* Add user specified VID/PID to reserved element of table. */ | ||
| 2075 | int i; | ||
| 2076 | for (i = 0; id_table_combined[i].idVendor; i++) | ||
| 2077 | ; | ||
| 2078 | id_table_combined[i].match_flags = USB_DEVICE_ID_MATCH_DEVICE; | ||
| 2079 | id_table_combined[i].idVendor = vendor; | ||
| 2080 | id_table_combined[i].idProduct = product; | ||
| 2081 | } | ||
| 2033 | retval = usb_serial_register(&ftdi_sio_device); | 2082 | retval = usb_serial_register(&ftdi_sio_device); |
| 2034 | if (retval) | 2083 | if (retval) |
| 2035 | goto failed_sio_register; | 2084 | goto failed_sio_register; |
| @@ -2066,4 +2115,9 @@ MODULE_LICENSE("GPL"); | |||
| 2066 | 2115 | ||
| 2067 | module_param(debug, bool, S_IRUGO | S_IWUSR); | 2116 | module_param(debug, bool, S_IRUGO | S_IWUSR); |
| 2068 | MODULE_PARM_DESC(debug, "Debug enabled or not"); | 2117 | MODULE_PARM_DESC(debug, "Debug enabled or not"); |
| 2118 | module_param(vendor, ushort, 0); | ||
| 2119 | MODULE_PARM_DESC(vendor, "User specified vendor ID (default=" | ||
| 2120 | __MODULE_STRING(FTDI_VID)")"); | ||
| 2121 | module_param(product, ushort, 0); | ||
| 2122 | MODULE_PARM_DESC(vendor, "User specified product ID"); | ||
| 2069 | 2123 | ||
diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h index 9f4342093e8b..2c35d74cc6d6 100644 --- a/drivers/usb/serial/ftdi_sio.h +++ b/drivers/usb/serial/ftdi_sio.h | |||
| @@ -142,10 +142,43 @@ | |||
| 142 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ | 142 | /* http://home.earthlink.net/~jrhees/USBUIRT/index.htm */ |
| 143 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ | 143 | #define FTDI_USB_UIRT_PID 0xF850 /* Product Id */ |
| 144 | 144 | ||
| 145 | /* ELV USB Module UO100 (PID sent by Stefan Frings) */ | 145 | /* |
| 146 | #define FTDI_ELV_UO100_PID 0xFB58 /* Product Id */ | 146 | * ELV USB devices submitted by Christian Abt of ELV (www.elv.de). |
| 147 | /* ELV USB Module UM100 (PID sent by Arnim Laeuger) */ | 147 | * All of these devices use FTDI's vendor ID (0x0403). |
| 148 | #define FTDI_ELV_UM100_PID 0xFB5A /* Product Id */ | 148 | * |
| 149 | * The previously included PID for the UO 100 module was incorrect. | ||
| 150 | * In fact, that PID was for ELV's UR 100 USB-RS232 converter (0xFB58). | ||
| 151 | * | ||
| 152 | * Armin Laeuger originally sent the PID for the UM 100 module. | ||
| 153 | */ | ||
| 154 | #define FTDI_ELV_UR100_PID 0xFB58 /* USB-RS232-Umsetzer (UR 100) */ | ||
| 155 | #define FTDI_ELV_UM100_PID 0xFB5A /* USB-Modul UM 100 */ | ||
| 156 | #define FTDI_ELV_UO100_PID 0xFB5B /* USB-Modul UO 100 */ | ||
| 157 | #define FTDI_ELV_ALC8500_PID 0xF06E /* ALC 8500 Expert */ | ||
| 158 | /* Additional ELV PIDs that default to using the FTDI D2XX drivers on | ||
| 159 | * MS Windows, rather than the FTDI Virtual Com Port drivers. | ||
| 160 | * Maybe these will be easier to use with the libftdi/libusb user-space | ||
| 161 | * drivers, or possibly the Comedi drivers in some cases. */ | ||
| 162 | #define FTDI_ELV_CLI7000_PID 0xFB59 /* Computer-Light-Interface (CLI 7000) */ | ||
| 163 | #define FTDI_ELV_PPS7330_PID 0xFB5C /* Processor-Power-Supply (PPS 7330) */ | ||
| 164 | #define FTDI_ELV_TFM100_PID 0xFB5D /* Temperartur-Feuchte Messgeraet (TFM 100) */ | ||
| 165 | #define FTDI_ELV_UDF77_PID 0xFB5E /* USB DCF Funkurh (UDF 77) */ | ||
| 166 | #define FTDI_ELV_UIO88_PID 0xFB5F /* USB-I/O Interface (UIO 88) */ | ||
| 167 | #define FTDI_ELV_UAD8_PID 0xF068 /* USB-AD-Wandler (UAD 8) */ | ||
| 168 | #define FTDI_ELV_UDA7_PID 0xF069 /* USB-DA-Wandler (UDA 7) */ | ||
| 169 | #define FTDI_ELV_USI2_PID 0xF06A /* USB-Schrittmotoren-Interface (USI 2) */ | ||
| 170 | #define FTDI_ELV_T1100_PID 0xF06B /* Thermometer (T 1100) */ | ||
| 171 | #define FTDI_ELV_PCD200_PID 0xF06C /* PC-Datenlogger (PCD 200) */ | ||
| 172 | #define FTDI_ELV_ULA200_PID 0xF06D /* USB-LCD-Ansteuerung (ULA 200) */ | ||
| 173 | #define FTDI_ELV_FHZ1000PC_PID 0xF06F /* FHZ 1000 PC */ | ||
| 174 | #define FTDI_ELV_CSI8_PID 0xE0F0 /* Computer-Schalt-Interface (CSI 8) */ | ||
| 175 | #define FTDI_ELV_EM1000DL_PID 0xE0F1 /* PC-Datenlogger fuer Energiemonitor (EM 1000 DL) */ | ||
| 176 | #define FTDI_ELV_PCK100_PID 0xE0F2 /* PC-Kabeltester (PCK 100) */ | ||
| 177 | #define FTDI_ELV_RFP500_PID 0xE0F3 /* HF-Leistungsmesser (RFP 500) */ | ||
| 178 | #define FTDI_ELV_FS20SIG_PID 0xE0F4 /* Signalgeber (FS 20 SIG) */ | ||
| 179 | #define FTDI_ELV_WS300PC_PID 0xE0F6 /* PC-Wetterstation (WS 300 PC) */ | ||
| 180 | #define FTDI_ELV_FHZ1300PC_PID 0xE0E8 /* FHZ 1300 PC */ | ||
| 181 | #define FTDI_ELV_WS500_PID 0xE0E9 /* PC-Wetterstation (WS 500) */ | ||
| 149 | 182 | ||
| 150 | /* | 183 | /* |
| 151 | * Definitions for ID TECH (www.idt-net.com) devices | 184 | * Definitions for ID TECH (www.idt-net.com) devices |
| @@ -222,6 +255,7 @@ | |||
| 222 | */ | 255 | */ |
| 223 | #define FALCOM_VID 0x0F94 /* Vendor Id */ | 256 | #define FALCOM_VID 0x0F94 /* Vendor Id */ |
| 224 | #define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */ | 257 | #define FALCOM_TWIST_PID 0x0001 /* Falcom Twist USB GPRS modem */ |
| 258 | #define FALCOM_SAMBA_PID 0x0005 /* Falcom Samba USB GPRS modem */ | ||
| 225 | 259 | ||
| 226 | /* | 260 | /* |
| 227 | * SUUNTO product ids | 261 | * SUUNTO product ids |
| @@ -277,6 +311,18 @@ | |||
| 277 | #define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */ | 311 | #define FTDI_ACTIVE_ROBOTS_PID 0xE548 /* USB comms board */ |
| 278 | 312 | ||
| 279 | /* | 313 | /* |
| 314 | * Xsens Technologies BV products (http://www.xsens.com). | ||
| 315 | */ | ||
| 316 | #define XSENS_CONVERTER_0_PID 0xD388 | ||
| 317 | #define XSENS_CONVERTER_1_PID 0xD389 | ||
| 318 | #define XSENS_CONVERTER_2_PID 0xD38A | ||
| 319 | #define XSENS_CONVERTER_3_PID 0xD38B | ||
| 320 | #define XSENS_CONVERTER_4_PID 0xD38C | ||
| 321 | #define XSENS_CONVERTER_5_PID 0xD38D | ||
| 322 | #define XSENS_CONVERTER_6_PID 0xD38E | ||
| 323 | #define XSENS_CONVERTER_7_PID 0xD38F | ||
| 324 | |||
| 325 | /* | ||
| 280 | * Evolution Robotics products (http://www.evolution.com/). | 326 | * Evolution Robotics products (http://www.evolution.com/). |
| 281 | * Submitted by Shawn M. Lavelle. | 327 | * Submitted by Shawn M. Lavelle. |
| 282 | */ | 328 | */ |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index fb0926292228..3b958e60f5e8 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
| @@ -383,11 +383,8 @@ static int keyspan_write(struct usb_serial_port *port, | |||
| 383 | dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip); | 383 | dbg("%s - endpoint %d flip %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), flip); |
| 384 | 384 | ||
| 385 | if (this_urb->status == -EINPROGRESS) { | 385 | if (this_urb->status == -EINPROGRESS) { |
| 386 | if (this_urb->transfer_flags & URB_ASYNC_UNLINK) | ||
| 387 | break; | ||
| 388 | if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ)) | 386 | if (time_before(jiffies, p_priv->tx_start_time[flip] + 10 * HZ)) |
| 389 | break; | 387 | break; |
| 390 | this_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 391 | usb_unlink_urb(this_urb); | 388 | usb_unlink_urb(this_urb); |
| 392 | break; | 389 | break; |
| 393 | } | 390 | } |
| @@ -402,7 +399,6 @@ static int keyspan_write(struct usb_serial_port *port, | |||
| 402 | /* send the data out the bulk port */ | 399 | /* send the data out the bulk port */ |
| 403 | this_urb->transfer_buffer_length = todo + dataOffset; | 400 | this_urb->transfer_buffer_length = todo + dataOffset; |
| 404 | 401 | ||
| 405 | this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 406 | this_urb->dev = port->serial->dev; | 402 | this_urb->dev = port->serial->dev; |
| 407 | if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { | 403 | if ((err = usb_submit_urb(this_urb, GFP_ATOMIC)) != 0) { |
| 408 | dbg("usb_submit_urb(write bulk) failed (%d)", err); | 404 | dbg("usb_submit_urb(write bulk) failed (%d)", err); |
| @@ -1119,10 +1115,8 @@ static int keyspan_open (struct usb_serial_port *port, struct file *filp) | |||
| 1119 | 1115 | ||
| 1120 | static inline void stop_urb(struct urb *urb) | 1116 | static inline void stop_urb(struct urb *urb) |
| 1121 | { | 1117 | { |
| 1122 | if (urb && urb->status == -EINPROGRESS) { | 1118 | if (urb && urb->status == -EINPROGRESS) |
| 1123 | urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 1124 | usb_kill_urb(urb); | 1119 | usb_kill_urb(urb); |
| 1125 | } | ||
| 1126 | } | 1120 | } |
| 1127 | 1121 | ||
| 1128 | static void keyspan_close(struct usb_serial_port *port, struct file *filp) | 1122 | static void keyspan_close(struct usb_serial_port *port, struct file *filp) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index e9256408757f..92d0f925d053 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -45,29 +45,29 @@ | |||
| 45 | #include "usb-serial.h" | 45 | #include "usb-serial.h" |
| 46 | 46 | ||
| 47 | /* Function prototypes */ | 47 | /* Function prototypes */ |
| 48 | static int option_open (struct usb_serial_port *port, struct file *filp); | 48 | static int option_open(struct usb_serial_port *port, struct file *filp); |
| 49 | static void option_close (struct usb_serial_port *port, struct file *filp); | 49 | static void option_close(struct usb_serial_port *port, struct file *filp); |
| 50 | static int option_startup (struct usb_serial *serial); | 50 | static int option_startup(struct usb_serial *serial); |
| 51 | static void option_shutdown (struct usb_serial *serial); | 51 | static void option_shutdown(struct usb_serial *serial); |
| 52 | static void option_rx_throttle (struct usb_serial_port *port); | 52 | static void option_rx_throttle(struct usb_serial_port *port); |
| 53 | static void option_rx_unthrottle (struct usb_serial_port *port); | 53 | static void option_rx_unthrottle(struct usb_serial_port *port); |
| 54 | static int option_write_room (struct usb_serial_port *port); | 54 | static int option_write_room(struct usb_serial_port *port); |
| 55 | 55 | ||
| 56 | static void option_instat_callback(struct urb *urb, struct pt_regs *regs); | 56 | static void option_instat_callback(struct urb *urb, struct pt_regs *regs); |
| 57 | 57 | ||
| 58 | static int option_write (struct usb_serial_port *port, | 58 | static int option_write(struct usb_serial_port *port, |
| 59 | const unsigned char *buf, int count); | 59 | const unsigned char *buf, int count); |
| 60 | 60 | ||
| 61 | static int option_chars_in_buffer (struct usb_serial_port *port); | 61 | static int option_chars_in_buffer(struct usb_serial_port *port); |
| 62 | static int option_ioctl (struct usb_serial_port *port, struct file *file, | 62 | static int option_ioctl(struct usb_serial_port *port, struct file *file, |
| 63 | unsigned int cmd, unsigned long arg); | 63 | unsigned int cmd, unsigned long arg); |
| 64 | static void option_set_termios (struct usb_serial_port *port, | 64 | static void option_set_termios(struct usb_serial_port *port, |
| 65 | struct termios *old); | 65 | struct termios *old); |
| 66 | static void option_break_ctl (struct usb_serial_port *port, int break_state); | 66 | static void option_break_ctl(struct usb_serial_port *port, int break_state); |
| 67 | static int option_tiocmget (struct usb_serial_port *port, struct file *file); | 67 | static int option_tiocmget(struct usb_serial_port *port, struct file *file); |
| 68 | static int option_tiocmset (struct usb_serial_port *port, struct file *file, | 68 | static int option_tiocmset(struct usb_serial_port *port, struct file *file, |
| 69 | unsigned int set, unsigned int clear); | 69 | unsigned int set, unsigned int clear); |
| 70 | static int option_send_setup (struct usb_serial_port *port); | 70 | static int option_send_setup(struct usb_serial_port *port); |
| 71 | 71 | ||
| 72 | /* Vendor and product IDs */ | 72 | /* Vendor and product IDs */ |
| 73 | #define OPTION_VENDOR_ID 0x0AF0 | 73 | #define OPTION_VENDOR_ID 0x0AF0 |
| @@ -76,7 +76,6 @@ static int option_send_setup (struct usb_serial_port *port); | |||
| 76 | #define OPTION_PRODUCT_FUSION 0x6000 | 76 | #define OPTION_PRODUCT_FUSION 0x6000 |
| 77 | #define OPTION_PRODUCT_FUSION2 0x6300 | 77 | #define OPTION_PRODUCT_FUSION2 0x6300 |
| 78 | 78 | ||
| 79 | |||
| 80 | static struct usb_device_id option_ids[] = { | 79 | static struct usb_device_id option_ids[] = { |
| 81 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, | 80 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) }, |
| 82 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, | 81 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) }, |
| @@ -129,7 +128,6 @@ static int debug; | |||
| 129 | #define debug 0 | 128 | #define debug 0 |
| 130 | #endif | 129 | #endif |
| 131 | 130 | ||
| 132 | |||
| 133 | /* per port private data */ | 131 | /* per port private data */ |
| 134 | 132 | ||
| 135 | #define N_IN_URB 4 | 133 | #define N_IN_URB 4 |
| @@ -156,10 +154,8 @@ struct option_port_private { | |||
| 156 | unsigned long tx_start_time[N_OUT_URB]; | 154 | unsigned long tx_start_time[N_OUT_URB]; |
| 157 | }; | 155 | }; |
| 158 | 156 | ||
| 159 | |||
| 160 | /* Functions used by new usb-serial code. */ | 157 | /* Functions used by new usb-serial code. */ |
| 161 | static int __init | 158 | static int __init option_init(void) |
| 162 | option_init (void) | ||
| 163 | { | 159 | { |
| 164 | int retval; | 160 | int retval; |
| 165 | retval = usb_serial_register(&option_3port_device); | 161 | retval = usb_serial_register(&option_3port_device); |
| @@ -179,8 +175,7 @@ failed_3port_device_register: | |||
| 179 | return retval; | 175 | return retval; |
| 180 | } | 176 | } |
| 181 | 177 | ||
| 182 | static void __exit | 178 | static void __exit option_exit(void) |
| 183 | option_exit (void) | ||
| 184 | { | 179 | { |
| 185 | usb_deregister (&option_driver); | 180 | usb_deregister (&option_driver); |
| 186 | usb_serial_deregister (&option_3port_device); | 181 | usb_serial_deregister (&option_3port_device); |
| @@ -189,39 +184,31 @@ option_exit (void) | |||
| 189 | module_init(option_init); | 184 | module_init(option_init); |
| 190 | module_exit(option_exit); | 185 | module_exit(option_exit); |
| 191 | 186 | ||
| 192 | static void | 187 | static void option_rx_throttle(struct usb_serial_port *port) |
| 193 | option_rx_throttle (struct usb_serial_port *port) | ||
| 194 | { | 188 | { |
| 195 | dbg("%s", __FUNCTION__); | 189 | dbg("%s", __FUNCTION__); |
| 196 | } | 190 | } |
| 197 | 191 | ||
| 198 | 192 | static void option_rx_unthrottle(struct usb_serial_port *port) | |
| 199 | static void | ||
| 200 | option_rx_unthrottle (struct usb_serial_port *port) | ||
| 201 | { | 193 | { |
| 202 | dbg("%s", __FUNCTION__); | 194 | dbg("%s", __FUNCTION__); |
| 203 | } | 195 | } |
| 204 | 196 | ||
| 205 | 197 | static void option_break_ctl(struct usb_serial_port *port, int break_state) | |
| 206 | static void | ||
| 207 | option_break_ctl (struct usb_serial_port *port, int break_state) | ||
| 208 | { | 198 | { |
| 209 | /* Unfortunately, I don't know how to send a break */ | 199 | /* Unfortunately, I don't know how to send a break */ |
| 210 | dbg("%s", __FUNCTION__); | 200 | dbg("%s", __FUNCTION__); |
| 211 | } | 201 | } |
| 212 | 202 | ||
| 213 | 203 | static void option_set_termios(struct usb_serial_port *port, | |
| 214 | static void | 204 | struct termios *old_termios) |
| 215 | option_set_termios (struct usb_serial_port *port, | ||
| 216 | struct termios *old_termios) | ||
| 217 | { | 205 | { |
| 218 | dbg("%s", __FUNCTION__); | 206 | dbg("%s", __FUNCTION__); |
| 219 | 207 | ||
| 220 | option_send_setup(port); | 208 | option_send_setup(port); |
| 221 | } | 209 | } |
| 222 | 210 | ||
| 223 | static int | 211 | static int option_tiocmget(struct usb_serial_port *port, struct file *file) |
| 224 | option_tiocmget (struct usb_serial_port *port, struct file *file) | ||
| 225 | { | 212 | { |
| 226 | unsigned int value; | 213 | unsigned int value; |
| 227 | struct option_port_private *portdata; | 214 | struct option_port_private *portdata; |
| @@ -238,9 +225,8 @@ option_tiocmget (struct usb_serial_port *port, struct file *file) | |||
| 238 | return value; | 225 | return value; |
| 239 | } | 226 | } |
| 240 | 227 | ||
| 241 | static int | 228 | static int option_tiocmset(struct usb_serial_port *port, struct file *file, |
| 242 | option_tiocmset (struct usb_serial_port *port, struct file *file, | 229 | unsigned int set, unsigned int clear) |
| 243 | unsigned int set, unsigned int clear) | ||
| 244 | { | 230 | { |
| 245 | struct option_port_private *portdata; | 231 | struct option_port_private *portdata; |
| 246 | 232 | ||
| @@ -258,17 +244,15 @@ option_tiocmset (struct usb_serial_port *port, struct file *file, | |||
| 258 | return option_send_setup(port); | 244 | return option_send_setup(port); |
| 259 | } | 245 | } |
| 260 | 246 | ||
| 261 | static int | 247 | static int option_ioctl(struct usb_serial_port *port, struct file *file, |
| 262 | option_ioctl (struct usb_serial_port *port, struct file *file, | 248 | unsigned int cmd, unsigned long arg) |
| 263 | unsigned int cmd, unsigned long arg) | ||
| 264 | { | 249 | { |
| 265 | return -ENOIOCTLCMD; | 250 | return -ENOIOCTLCMD; |
| 266 | } | 251 | } |
| 267 | 252 | ||
| 268 | /* Write */ | 253 | /* Write */ |
| 269 | static int | 254 | static int option_write(struct usb_serial_port *port, |
| 270 | option_write (struct usb_serial_port *port, | 255 | const unsigned char *buf, int count) |
| 271 | const unsigned char *buf, int count) | ||
| 272 | { | 256 | { |
| 273 | struct option_port_private *portdata; | 257 | struct option_port_private *portdata; |
| 274 | int i; | 258 | int i; |
| @@ -289,28 +273,29 @@ option_write (struct usb_serial_port *port, | |||
| 289 | 273 | ||
| 290 | this_urb = portdata->out_urbs[i]; | 274 | this_urb = portdata->out_urbs[i]; |
| 291 | if (this_urb->status == -EINPROGRESS) { | 275 | if (this_urb->status == -EINPROGRESS) { |
| 292 | if (this_urb->transfer_flags & URB_ASYNC_UNLINK) | 276 | if (time_before(jiffies, |
| 293 | continue; | 277 | portdata->tx_start_time[i] + 10 * HZ)) |
| 294 | if (time_before(jiffies, portdata->tx_start_time[i] + 10 * HZ)) | ||
| 295 | continue; | 278 | continue; |
| 296 | this_urb->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 297 | usb_unlink_urb(this_urb); | 279 | usb_unlink_urb(this_urb); |
| 298 | continue; | 280 | continue; |
| 299 | } | 281 | } |
| 300 | if (this_urb->status != 0) | 282 | if (this_urb->status != 0) |
| 301 | dbg("usb_write %p failed (err=%d)", this_urb, this_urb->status); | 283 | dbg("usb_write %p failed (err=%d)", |
| 284 | this_urb, this_urb->status); | ||
| 302 | 285 | ||
| 303 | dbg("%s: endpoint %d buf %d", __FUNCTION__, usb_pipeendpoint(this_urb->pipe), i); | 286 | dbg("%s: endpoint %d buf %d", __FUNCTION__, |
| 287 | usb_pipeendpoint(this_urb->pipe), i); | ||
| 304 | 288 | ||
| 305 | /* send the data */ | 289 | /* send the data */ |
| 306 | memcpy (this_urb->transfer_buffer, buf, todo); | 290 | memcpy (this_urb->transfer_buffer, buf, todo); |
| 307 | this_urb->transfer_buffer_length = todo; | 291 | this_urb->transfer_buffer_length = todo; |
| 308 | 292 | ||
| 309 | this_urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 310 | this_urb->dev = port->serial->dev; | 293 | this_urb->dev = port->serial->dev; |
| 311 | err = usb_submit_urb(this_urb, GFP_ATOMIC); | 294 | err = usb_submit_urb(this_urb, GFP_ATOMIC); |
| 312 | if (err) { | 295 | if (err) { |
| 313 | dbg("usb_submit_urb %p (write bulk) failed (%d, has %d)", this_urb, err, this_urb->status); | 296 | dbg("usb_submit_urb %p (write bulk) failed " |
| 297 | "(%d, has %d)", this_urb, | ||
| 298 | err, this_urb->status); | ||
| 314 | continue; | 299 | continue; |
| 315 | } | 300 | } |
| 316 | portdata->tx_start_time[i] = jiffies; | 301 | portdata->tx_start_time[i] = jiffies; |
| @@ -323,8 +308,7 @@ option_write (struct usb_serial_port *port, | |||
| 323 | return count; | 308 | return count; |
| 324 | } | 309 | } |
| 325 | 310 | ||
| 326 | static void | 311 | static void option_indat_callback(struct urb *urb, struct pt_regs *regs) |
| 327 | option_indat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 328 | { | 312 | { |
| 329 | int i, err; | 313 | int i, err; |
| 330 | int endpoint; | 314 | int endpoint; |
| @@ -357,14 +341,14 @@ option_indat_callback (struct urb *urb, struct pt_regs *regs) | |||
| 357 | if (port->open_count && urb->status != -ESHUTDOWN) { | 341 | if (port->open_count && urb->status != -ESHUTDOWN) { |
| 358 | err = usb_submit_urb(urb, GFP_ATOMIC); | 342 | err = usb_submit_urb(urb, GFP_ATOMIC); |
| 359 | if (err) | 343 | if (err) |
| 360 | printk(KERN_ERR "%s: resubmit read urb failed. (%d)", __FUNCTION__, err); | 344 | printk(KERN_ERR "%s: resubmit read urb failed. " |
| 345 | "(%d)", __FUNCTION__, err); | ||
| 361 | } | 346 | } |
| 362 | } | 347 | } |
| 363 | return; | 348 | return; |
| 364 | } | 349 | } |
| 365 | 350 | ||
| 366 | static void | 351 | static void option_outdat_callback(struct urb *urb, struct pt_regs *regs) |
| 367 | option_outdat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 368 | { | 352 | { |
| 369 | struct usb_serial_port *port; | 353 | struct usb_serial_port *port; |
| 370 | 354 | ||
| @@ -376,8 +360,7 @@ option_outdat_callback (struct urb *urb, struct pt_regs *regs) | |||
| 376 | schedule_work(&port->work); | 360 | schedule_work(&port->work); |
| 377 | } | 361 | } |
| 378 | 362 | ||
| 379 | static void | 363 | static void option_instat_callback(struct urb *urb, struct pt_regs *regs) |
| 380 | option_instat_callback (struct urb *urb, struct pt_regs *regs) | ||
| 381 | { | 364 | { |
| 382 | int err; | 365 | int err; |
| 383 | struct usb_serial_port *port = (struct usb_serial_port *) urb->context; | 366 | struct usb_serial_port *port = (struct usb_serial_port *) urb->context; |
| @@ -395,10 +378,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) | |||
| 395 | dbg("%s: NULL req_pkt\n", __FUNCTION__); | 378 | dbg("%s: NULL req_pkt\n", __FUNCTION__); |
| 396 | return; | 379 | return; |
| 397 | } | 380 | } |
| 398 | if ((req_pkt->bRequestType == 0xA1) && (req_pkt->bRequest == 0x20)) { | 381 | if ((req_pkt->bRequestType == 0xA1) && |
| 382 | (req_pkt->bRequest == 0x20)) { | ||
| 399 | int old_dcd_state; | 383 | int old_dcd_state; |
| 400 | unsigned char signals = *((unsigned char *) | 384 | unsigned char signals = *((unsigned char *) |
| 401 | urb->transfer_buffer + sizeof(struct usb_ctrlrequest)); | 385 | urb->transfer_buffer + |
| 386 | sizeof(struct usb_ctrlrequest)); | ||
| 402 | 387 | ||
| 403 | dbg("%s: signal x%x", __FUNCTION__, signals); | 388 | dbg("%s: signal x%x", __FUNCTION__, signals); |
| 404 | 389 | ||
| @@ -408,12 +393,13 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) | |||
| 408 | portdata->dsr_state = ((signals & 0x02) ? 1 : 0); | 393 | portdata->dsr_state = ((signals & 0x02) ? 1 : 0); |
| 409 | portdata->ri_state = ((signals & 0x08) ? 1 : 0); | 394 | portdata->ri_state = ((signals & 0x08) ? 1 : 0); |
| 410 | 395 | ||
| 411 | if (port->tty && !C_CLOCAL(port->tty) | 396 | if (port->tty && !C_CLOCAL(port->tty) && |
| 412 | && old_dcd_state && !portdata->dcd_state) { | 397 | old_dcd_state && !portdata->dcd_state) |
| 413 | tty_hangup(port->tty); | 398 | tty_hangup(port->tty); |
| 414 | } | 399 | } else { |
| 415 | } else | 400 | dbg("%s: type %x req %x", __FUNCTION__, |
| 416 | dbg("%s: type %x req %x", __FUNCTION__, req_pkt->bRequestType,req_pkt->bRequest); | 401 | req_pkt->bRequestType,req_pkt->bRequest); |
| 402 | } | ||
| 417 | } else | 403 | } else |
| 418 | dbg("%s: error %d", __FUNCTION__, urb->status); | 404 | dbg("%s: error %d", __FUNCTION__, urb->status); |
| 419 | 405 | ||
| @@ -422,13 +408,12 @@ option_instat_callback (struct urb *urb, struct pt_regs *regs) | |||
| 422 | urb->dev = serial->dev; | 408 | urb->dev = serial->dev; |
| 423 | err = usb_submit_urb(urb, GFP_ATOMIC); | 409 | err = usb_submit_urb(urb, GFP_ATOMIC); |
| 424 | if (err) | 410 | if (err) |
| 425 | dbg("%s: resubmit intr urb failed. (%d)", __FUNCTION__, err); | 411 | dbg("%s: resubmit intr urb failed. (%d)", |
| 412 | __FUNCTION__, err); | ||
| 426 | } | 413 | } |
| 427 | } | 414 | } |
| 428 | 415 | ||
| 429 | 416 | static int option_write_room(struct usb_serial_port *port) | |
| 430 | static int | ||
| 431 | option_write_room (struct usb_serial_port *port) | ||
| 432 | { | 417 | { |
| 433 | struct option_port_private *portdata; | 418 | struct option_port_private *portdata; |
| 434 | int i; | 419 | int i; |
| @@ -447,9 +432,7 @@ option_write_room (struct usb_serial_port *port) | |||
| 447 | return data_len; | 432 | return data_len; |
| 448 | } | 433 | } |
| 449 | 434 | ||
| 450 | 435 | static int option_chars_in_buffer(struct usb_serial_port *port) | |
| 451 | static int | ||
| 452 | option_chars_in_buffer (struct usb_serial_port *port) | ||
| 453 | { | 436 | { |
| 454 | struct option_port_private *portdata; | 437 | struct option_port_private *portdata; |
| 455 | int i; | 438 | int i; |
| @@ -467,9 +450,7 @@ option_chars_in_buffer (struct usb_serial_port *port) | |||
| 467 | return data_len; | 450 | return data_len; |
| 468 | } | 451 | } |
| 469 | 452 | ||
| 470 | 453 | static int option_open(struct usb_serial_port *port, struct file *filp) | |
| 471 | static int | ||
| 472 | option_open (struct usb_serial_port *port, struct file *filp) | ||
| 473 | { | 454 | { |
| 474 | struct option_port_private *portdata; | 455 | struct option_port_private *portdata; |
| 475 | struct usb_serial *serial = port->serial; | 456 | struct usb_serial *serial = port->serial; |
| @@ -490,17 +471,21 @@ option_open (struct usb_serial_port *port, struct file *filp) | |||
| 490 | if (! urb) | 471 | if (! urb) |
| 491 | continue; | 472 | continue; |
| 492 | if (urb->dev != serial->dev) { | 473 | if (urb->dev != serial->dev) { |
| 493 | dbg("%s: dev %p != %p", __FUNCTION__, urb->dev, serial->dev); | 474 | dbg("%s: dev %p != %p", __FUNCTION__, |
| 475 | urb->dev, serial->dev); | ||
| 494 | continue; | 476 | continue; |
| 495 | } | 477 | } |
| 496 | 478 | ||
| 497 | /* make sure endpoint data toggle is synchronized with the device */ | 479 | /* |
| 498 | 480 | * make sure endpoint data toggle is synchronized with the | |
| 481 | * device | ||
| 482 | */ | ||
| 499 | usb_clear_halt(urb->dev, urb->pipe); | 483 | usb_clear_halt(urb->dev, urb->pipe); |
| 500 | 484 | ||
| 501 | err = usb_submit_urb(urb, GFP_KERNEL); | 485 | err = usb_submit_urb(urb, GFP_KERNEL); |
| 502 | if (err) { | 486 | if (err) { |
| 503 | dbg("%s: submit urb %d failed (%d) %d", __FUNCTION__, i, err, | 487 | dbg("%s: submit urb %d failed (%d) %d", |
| 488 | __FUNCTION__, i, err, | ||
| 504 | urb->transfer_buffer_length); | 489 | urb->transfer_buffer_length); |
| 505 | } | 490 | } |
| 506 | } | 491 | } |
| @@ -511,7 +496,8 @@ option_open (struct usb_serial_port *port, struct file *filp) | |||
| 511 | if (! urb) | 496 | if (! urb) |
| 512 | continue; | 497 | continue; |
| 513 | urb->dev = serial->dev; | 498 | urb->dev = serial->dev; |
| 514 | /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), usb_pipeout(urb->pipe), 0); */ | 499 | /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe), |
| 500 | usb_pipeout(urb->pipe), 0); */ | ||
| 515 | } | 501 | } |
| 516 | 502 | ||
| 517 | port->tty->low_latency = 1; | 503 | port->tty->low_latency = 1; |
| @@ -521,17 +507,13 @@ option_open (struct usb_serial_port *port, struct file *filp) | |||
| 521 | return (0); | 507 | return (0); |
| 522 | } | 508 | } |
| 523 | 509 | ||
| 524 | static inline void | 510 | static inline void stop_urb(struct urb *urb) |
| 525 | stop_urb (struct urb *urb) | ||
| 526 | { | 511 | { |
| 527 | if (urb && urb->status == -EINPROGRESS) { | 512 | if (urb && urb->status == -EINPROGRESS) |
| 528 | urb->transfer_flags &= ~URB_ASYNC_UNLINK; | ||
| 529 | usb_kill_urb(urb); | 513 | usb_kill_urb(urb); |
| 530 | } | ||
| 531 | } | 514 | } |
| 532 | 515 | ||
| 533 | static void | 516 | static void option_close(struct usb_serial_port *port, struct file *filp) |
| 534 | option_close (struct usb_serial_port *port, struct file *filp) | ||
| 535 | { | 517 | { |
| 536 | int i; | 518 | int i; |
| 537 | struct usb_serial *serial = port->serial; | 519 | struct usb_serial *serial = port->serial; |
| @@ -555,12 +537,10 @@ option_close (struct usb_serial_port *port, struct file *filp) | |||
| 555 | port->tty = NULL; | 537 | port->tty = NULL; |
| 556 | } | 538 | } |
| 557 | 539 | ||
| 558 | |||
| 559 | /* Helper functions used by option_setup_urbs */ | 540 | /* Helper functions used by option_setup_urbs */ |
| 560 | static struct urb * | 541 | static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint, |
| 561 | option_setup_urb (struct usb_serial *serial, int endpoint, | 542 | int dir, void *ctx, char *buf, int len, |
| 562 | int dir, void *ctx, char *buf, int len, | 543 | void (*callback)(struct urb *, struct pt_regs *regs)) |
| 563 | void (*callback)(struct urb *, struct pt_regs *regs)) | ||
| 564 | { | 544 | { |
| 565 | struct urb *urb; | 545 | struct urb *urb; |
| 566 | 546 | ||
| @@ -582,8 +562,7 @@ option_setup_urb (struct usb_serial *serial, int endpoint, | |||
| 582 | } | 562 | } |
| 583 | 563 | ||
| 584 | /* Setup urbs */ | 564 | /* Setup urbs */ |
| 585 | static void | 565 | static void option_setup_urbs(struct usb_serial *serial) |
| 586 | option_setup_urbs (struct usb_serial *serial) | ||
| 587 | { | 566 | { |
| 588 | int j; | 567 | int j; |
| 589 | struct usb_serial_port *port; | 568 | struct usb_serial_port *port; |
| @@ -609,9 +588,7 @@ option_setup_urbs (struct usb_serial *serial) | |||
| 609 | } | 588 | } |
| 610 | } | 589 | } |
| 611 | 590 | ||
| 612 | 591 | static int option_send_setup(struct usb_serial_port *port) | |
| 613 | static int | ||
| 614 | option_send_setup (struct usb_serial_port *port) | ||
| 615 | { | 592 | { |
| 616 | struct usb_serial *serial = port->serial; | 593 | struct usb_serial *serial = port->serial; |
| 617 | struct option_port_private *portdata; | 594 | struct option_port_private *portdata; |
| @@ -627,16 +604,15 @@ option_send_setup (struct usb_serial_port *port) | |||
| 627 | if (portdata->rts_state) | 604 | if (portdata->rts_state) |
| 628 | val |= 0x02; | 605 | val |= 0x02; |
| 629 | 606 | ||
| 630 | return usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | 607 | return usb_control_msg(serial->dev, |
| 631 | 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); | 608 | usb_rcvctrlpipe(serial->dev, 0), |
| 609 | 0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT); | ||
| 632 | } | 610 | } |
| 633 | 611 | ||
| 634 | return 0; | 612 | return 0; |
| 635 | } | 613 | } |
| 636 | 614 | ||
| 637 | 615 | static int option_startup(struct usb_serial *serial) | |
| 638 | static int | ||
| 639 | option_startup (struct usb_serial *serial) | ||
| 640 | { | 616 | { |
| 641 | int i, err; | 617 | int i, err; |
| 642 | struct usb_serial_port *port; | 618 | struct usb_serial_port *port; |
| @@ -647,9 +623,10 @@ option_startup (struct usb_serial *serial) | |||
| 647 | /* Now setup per port private data */ | 623 | /* Now setup per port private data */ |
| 648 | for (i = 0; i < serial->num_ports; i++) { | 624 | for (i = 0; i < serial->num_ports; i++) { |
| 649 | port = serial->port[i]; | 625 | port = serial->port[i]; |
| 650 | portdata = kmalloc(sizeof(struct option_port_private), GFP_KERNEL); | 626 | portdata = kmalloc(sizeof(*portdata), GFP_KERNEL); |
| 651 | if (!portdata) { | 627 | if (!portdata) { |
| 652 | dbg("%s: kmalloc for option_port_private (%d) failed!.", __FUNCTION__, i); | 628 | dbg("%s: kmalloc for option_port_private (%d) failed!.", |
| 629 | __FUNCTION__, i); | ||
| 653 | return (1); | 630 | return (1); |
| 654 | } | 631 | } |
| 655 | memset(portdata, 0, sizeof(struct option_port_private)); | 632 | memset(portdata, 0, sizeof(struct option_port_private)); |
| @@ -660,7 +637,8 @@ option_startup (struct usb_serial *serial) | |||
| 660 | continue; | 637 | continue; |
| 661 | err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); | 638 | err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); |
| 662 | if (err) | 639 | if (err) |
| 663 | dbg("%s: submit irq_in urb failed %d", __FUNCTION__, err); | 640 | dbg("%s: submit irq_in urb failed %d", |
| 641 | __FUNCTION__, err); | ||
| 664 | } | 642 | } |
| 665 | 643 | ||
| 666 | option_setup_urbs(serial); | 644 | option_setup_urbs(serial); |
| @@ -668,8 +646,7 @@ option_startup (struct usb_serial *serial) | |||
| 668 | return (0); | 646 | return (0); |
| 669 | } | 647 | } |
| 670 | 648 | ||
| 671 | static void | 649 | static void option_shutdown(struct usb_serial *serial) |
| 672 | option_shutdown (struct usb_serial *serial) | ||
| 673 | { | 650 | { |
| 674 | int i, j; | 651 | int i, j; |
| 675 | struct usb_serial_port *port; | 652 | struct usb_serial_port *port; |
diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c index 7eab5d4cf3a8..461474176cfb 100644 --- a/drivers/usb/serial/pl2303.c +++ b/drivers/usb/serial/pl2303.c | |||
| @@ -538,8 +538,10 @@ static int pl2303_open (struct usb_serial_port *port, struct file *filp) | |||
| 538 | 538 | ||
| 539 | dbg("%s - port %d", __FUNCTION__, port->number); | 539 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 540 | 540 | ||
| 541 | usb_clear_halt(serial->dev, port->write_urb->pipe); | 541 | if (priv->type != HX) { |
| 542 | usb_clear_halt(serial->dev, port->read_urb->pipe); | 542 | usb_clear_halt(serial->dev, port->write_urb->pipe); |
| 543 | usb_clear_halt(serial->dev, port->read_urb->pipe); | ||
| 544 | } | ||
| 543 | 545 | ||
| 544 | buf = kmalloc(10, GFP_KERNEL); | 546 | buf = kmalloc(10, GFP_KERNEL); |
| 545 | if (buf==NULL) | 547 | if (buf==NULL) |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 0267b26dde18..e77fbdfc782d 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
| @@ -531,7 +531,7 @@ bailout_kref_put: | |||
| 531 | 531 | ||
| 532 | static void serial_close(struct tty_struct *tty, struct file * filp) | 532 | static void serial_close(struct tty_struct *tty, struct file * filp) |
| 533 | { | 533 | { |
| 534 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 534 | struct usb_serial_port *port = tty->driver_data; |
| 535 | 535 | ||
| 536 | if (!port) | 536 | if (!port) |
| 537 | return; | 537 | return; |
| @@ -561,7 +561,7 @@ static void serial_close(struct tty_struct *tty, struct file * filp) | |||
| 561 | 561 | ||
| 562 | static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) | 562 | static int serial_write (struct tty_struct * tty, const unsigned char *buf, int count) |
| 563 | { | 563 | { |
| 564 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 564 | struct usb_serial_port *port = tty->driver_data; |
| 565 | int retval = -EINVAL; | 565 | int retval = -EINVAL; |
| 566 | 566 | ||
| 567 | dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); | 567 | dbg("%s - port %d, %d byte(s)", __FUNCTION__, port->number, count); |
| @@ -580,7 +580,7 @@ exit: | |||
| 580 | 580 | ||
| 581 | static int serial_write_room (struct tty_struct *tty) | 581 | static int serial_write_room (struct tty_struct *tty) |
| 582 | { | 582 | { |
| 583 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 583 | struct usb_serial_port *port = tty->driver_data; |
| 584 | int retval = -EINVAL; | 584 | int retval = -EINVAL; |
| 585 | 585 | ||
| 586 | dbg("%s - port %d", __FUNCTION__, port->number); | 586 | dbg("%s - port %d", __FUNCTION__, port->number); |
| @@ -599,7 +599,7 @@ exit: | |||
| 599 | 599 | ||
| 600 | static int serial_chars_in_buffer (struct tty_struct *tty) | 600 | static int serial_chars_in_buffer (struct tty_struct *tty) |
| 601 | { | 601 | { |
| 602 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 602 | struct usb_serial_port *port = tty->driver_data; |
| 603 | int retval = -EINVAL; | 603 | int retval = -EINVAL; |
| 604 | 604 | ||
| 605 | dbg("%s = port %d", __FUNCTION__, port->number); | 605 | dbg("%s = port %d", __FUNCTION__, port->number); |
| @@ -618,7 +618,7 @@ exit: | |||
| 618 | 618 | ||
| 619 | static void serial_throttle (struct tty_struct * tty) | 619 | static void serial_throttle (struct tty_struct * tty) |
| 620 | { | 620 | { |
| 621 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 621 | struct usb_serial_port *port = tty->driver_data; |
| 622 | 622 | ||
| 623 | dbg("%s - port %d", __FUNCTION__, port->number); | 623 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 624 | 624 | ||
| @@ -634,7 +634,7 @@ static void serial_throttle (struct tty_struct * tty) | |||
| 634 | 634 | ||
| 635 | static void serial_unthrottle (struct tty_struct * tty) | 635 | static void serial_unthrottle (struct tty_struct * tty) |
| 636 | { | 636 | { |
| 637 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 637 | struct usb_serial_port *port = tty->driver_data; |
| 638 | 638 | ||
| 639 | dbg("%s - port %d", __FUNCTION__, port->number); | 639 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 640 | 640 | ||
| @@ -650,7 +650,7 @@ static void serial_unthrottle (struct tty_struct * tty) | |||
| 650 | 650 | ||
| 651 | static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) | 651 | static int serial_ioctl (struct tty_struct *tty, struct file * file, unsigned int cmd, unsigned long arg) |
| 652 | { | 652 | { |
| 653 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 653 | struct usb_serial_port *port = tty->driver_data; |
| 654 | int retval = -ENODEV; | 654 | int retval = -ENODEV; |
| 655 | 655 | ||
| 656 | dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd); | 656 | dbg("%s - port %d, cmd 0x%.4x", __FUNCTION__, port->number, cmd); |
| @@ -672,7 +672,7 @@ exit: | |||
| 672 | 672 | ||
| 673 | static void serial_set_termios (struct tty_struct *tty, struct termios * old) | 673 | static void serial_set_termios (struct tty_struct *tty, struct termios * old) |
| 674 | { | 674 | { |
| 675 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 675 | struct usb_serial_port *port = tty->driver_data; |
| 676 | 676 | ||
| 677 | dbg("%s - port %d", __FUNCTION__, port->number); | 677 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 678 | 678 | ||
| @@ -688,7 +688,7 @@ static void serial_set_termios (struct tty_struct *tty, struct termios * old) | |||
| 688 | 688 | ||
| 689 | static void serial_break (struct tty_struct *tty, int break_state) | 689 | static void serial_break (struct tty_struct *tty, int break_state) |
| 690 | { | 690 | { |
| 691 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 691 | struct usb_serial_port *port = tty->driver_data; |
| 692 | 692 | ||
| 693 | dbg("%s - port %d", __FUNCTION__, port->number); | 693 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 694 | 694 | ||
| @@ -749,7 +749,7 @@ done: | |||
| 749 | 749 | ||
| 750 | static int serial_tiocmget (struct tty_struct *tty, struct file *file) | 750 | static int serial_tiocmget (struct tty_struct *tty, struct file *file) |
| 751 | { | 751 | { |
| 752 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 752 | struct usb_serial_port *port = tty->driver_data; |
| 753 | 753 | ||
| 754 | dbg("%s - port %d", __FUNCTION__, port->number); | 754 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 755 | 755 | ||
| @@ -768,7 +768,7 @@ exit: | |||
| 768 | static int serial_tiocmset (struct tty_struct *tty, struct file *file, | 768 | static int serial_tiocmset (struct tty_struct *tty, struct file *file, |
| 769 | unsigned int set, unsigned int clear) | 769 | unsigned int set, unsigned int clear) |
| 770 | { | 770 | { |
| 771 | struct usb_serial_port *port = (struct usb_serial_port *) tty->driver_data; | 771 | struct usb_serial_port *port = tty->driver_data; |
| 772 | 772 | ||
| 773 | dbg("%s - port %d", __FUNCTION__, port->number); | 773 | dbg("%s - port %d", __FUNCTION__, port->number); |
| 774 | 774 | ||
| @@ -786,7 +786,7 @@ exit: | |||
| 786 | 786 | ||
| 787 | void usb_serial_port_softint(void *private) | 787 | void usb_serial_port_softint(void *private) |
| 788 | { | 788 | { |
| 789 | struct usb_serial_port *port = (struct usb_serial_port *)private; | 789 | struct usb_serial_port *port = private; |
| 790 | struct tty_struct *tty; | 790 | struct tty_struct *tty; |
| 791 | 791 | ||
| 792 | dbg("%s - port %d", __FUNCTION__, port->number); | 792 | dbg("%s - port %d", __FUNCTION__, port->number); |
diff --git a/drivers/usb/storage/Kconfig b/drivers/usb/storage/Kconfig index f1f1c0608c22..bb9819cc8826 100644 --- a/drivers/usb/storage/Kconfig +++ b/drivers/usb/storage/Kconfig | |||
| @@ -111,3 +111,15 @@ config USB_STORAGE_JUMPSHOT | |||
| 111 | Say Y here to include additional code to support the Lexar Jumpshot | 111 | Say Y here to include additional code to support the Lexar Jumpshot |
| 112 | USB CompactFlash reader. | 112 | USB CompactFlash reader. |
| 113 | 113 | ||
| 114 | |||
| 115 | config USB_STORAGE_ONETOUCH | ||
| 116 | bool "Support OneTouch Button on Maxtor Hard Drives (EXPERIMENTAL)" | ||
| 117 | depends on USB_STORAGE && INPUT_EVDEV && EXPERIMENTAL | ||
| 118 | help | ||
| 119 | Say Y here to include additional code to support the Maxtor OneTouch | ||
| 120 | USB hard drive's onetouch button. | ||
| 121 | |||
| 122 | This code registers the button on the front of Maxtor OneTouch USB | ||
| 123 | hard drive's as an input device. An action can be associated with | ||
| 124 | this input in any keybinding software. (e.g. gnome's keyboard short- | ||
| 125 | cuts) | ||
diff --git a/drivers/usb/storage/Makefile b/drivers/usb/storage/Makefile index 56652ccc2881..44ab8f9978fe 100644 --- a/drivers/usb/storage/Makefile +++ b/drivers/usb/storage/Makefile | |||
| @@ -18,6 +18,7 @@ usb-storage-obj-$(CONFIG_USB_STORAGE_DPCM) += dpcm.o | |||
| 18 | usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200) += isd200.o | 18 | usb-storage-obj-$(CONFIG_USB_STORAGE_ISD200) += isd200.o |
| 19 | usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB) += datafab.o | 19 | usb-storage-obj-$(CONFIG_USB_STORAGE_DATAFAB) += datafab.o |
| 20 | usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o | 20 | usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o |
| 21 | usb-storage-obj-$(CONFIG_USB_STORAGE_ONETOUCH) += onetouch.o | ||
| 21 | 22 | ||
| 22 | usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ | 23 | usb-storage-objs := scsiglue.o protocol.o transport.o usb.o \ |
| 23 | initializers.o $(usb-storage-obj-y) | 24 | initializers.o $(usb-storage-obj-y) |
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c new file mode 100644 index 000000000000..2c9402dc702b --- /dev/null +++ b/drivers/usb/storage/onetouch.c | |||
| @@ -0,0 +1,210 @@ | |||
| 1 | /* | ||
| 2 | * Support for the Maxtor OneTouch USB hard drive's button | ||
| 3 | * | ||
| 4 | * Current development and maintenance by: | ||
| 5 | * Copyright (c) 2005 Nick Sillik <n.sillik@temple.edu> | ||
| 6 | * | ||
| 7 | * Initial work by: | ||
| 8 | * Copyright (c) 2003 Erik Thyren <erth7411@student.uu.se> | ||
| 9 | * | ||
| 10 | * Based on usbmouse.c (Vojtech Pavlik) and xpad.c (Marko Friedemann) | ||
| 11 | * | ||
| 12 | */ | ||
| 13 | |||
| 14 | /* | ||
| 15 | * This program is free software; you can redistribute it and/or modify | ||
| 16 | * it under the terms of the GNU General Public License as published by | ||
| 17 | * the Free Software Foundation; either version 2 of the License, or | ||
| 18 | * (at your option) any later version. | ||
| 19 | * | ||
| 20 | * This program is distributed in the hope that it will be useful, | ||
| 21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 23 | * GNU General Public License for more details. | ||
| 24 | * | ||
| 25 | * You should have received a copy of the GNU General Public License | ||
| 26 | * along with this program; if not, write to the Free Software | ||
| 27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 28 | * | ||
| 29 | */ | ||
| 30 | |||
| 31 | #include <linux/config.h> | ||
| 32 | #include <linux/kernel.h> | ||
| 33 | #include <linux/input.h> | ||
| 34 | #include <linux/init.h> | ||
| 35 | #include <linux/slab.h> | ||
| 36 | #include <linux/module.h> | ||
| 37 | #include <linux/usb.h> | ||
| 38 | #include <linux/usb_ch9.h> | ||
| 39 | #include <linux/usb_input.h> | ||
| 40 | #include "usb.h" | ||
| 41 | #include "onetouch.h" | ||
| 42 | #include "debug.h" | ||
| 43 | |||
| 44 | void onetouch_release_input(void *onetouch_); | ||
| 45 | |||
| 46 | struct usb_onetouch { | ||
| 47 | char name[128]; | ||
| 48 | char phys[64]; | ||
| 49 | struct input_dev dev; /* input device interface */ | ||
| 50 | struct usb_device *udev; /* usb device */ | ||
| 51 | |||
| 52 | struct urb *irq; /* urb for interrupt in report */ | ||
| 53 | unsigned char *data; /* input data */ | ||
| 54 | dma_addr_t data_dma; | ||
| 55 | }; | ||
| 56 | |||
| 57 | static void usb_onetouch_irq(struct urb *urb, struct pt_regs *regs) | ||
| 58 | { | ||
| 59 | struct usb_onetouch *onetouch = urb->context; | ||
| 60 | signed char *data = onetouch->data; | ||
| 61 | struct input_dev *dev = &onetouch->dev; | ||
| 62 | int status; | ||
| 63 | |||
| 64 | switch (urb->status) { | ||
| 65 | case 0: /* success */ | ||
| 66 | break; | ||
| 67 | case -ECONNRESET: /* unlink */ | ||
| 68 | case -ENOENT: | ||
| 69 | case -ESHUTDOWN: | ||
| 70 | return; | ||
| 71 | /* -EPIPE: should clear the halt */ | ||
| 72 | default: /* error */ | ||
| 73 | goto resubmit; | ||
| 74 | } | ||
| 75 | |||
| 76 | input_regs(dev, regs); | ||
| 77 | |||
| 78 | input_report_key(&onetouch->dev, ONETOUCH_BUTTON, | ||
| 79 | data[0] & 0x02); | ||
| 80 | |||
| 81 | input_sync(dev); | ||
| 82 | resubmit: | ||
| 83 | status = usb_submit_urb (urb, SLAB_ATOMIC); | ||
| 84 | if (status) | ||
| 85 | err ("can't resubmit intr, %s-%s/input0, status %d", | ||
| 86 | onetouch->udev->bus->bus_name, | ||
| 87 | onetouch->udev->devpath, status); | ||
| 88 | } | ||
| 89 | |||
| 90 | static int usb_onetouch_open(struct input_dev *dev) | ||
| 91 | { | ||
| 92 | struct usb_onetouch *onetouch = dev->private; | ||
| 93 | |||
| 94 | onetouch->irq->dev = onetouch->udev; | ||
| 95 | if (usb_submit_urb(onetouch->irq, GFP_KERNEL)) { | ||
| 96 | err("usb_submit_urb failed"); | ||
| 97 | return -EIO; | ||
| 98 | } | ||
| 99 | |||
| 100 | return 0; | ||
| 101 | } | ||
| 102 | |||
| 103 | static void usb_onetouch_close(struct input_dev *dev) | ||
| 104 | { | ||
| 105 | struct usb_onetouch *onetouch = dev->private; | ||
| 106 | |||
| 107 | usb_kill_urb(onetouch->irq); | ||
| 108 | } | ||
| 109 | |||
| 110 | int onetouch_connect_input(struct us_data *ss) | ||
| 111 | { | ||
| 112 | struct usb_device *udev = ss->pusb_dev; | ||
| 113 | struct usb_host_interface *interface; | ||
| 114 | struct usb_endpoint_descriptor *endpoint; | ||
| 115 | struct usb_onetouch *onetouch; | ||
| 116 | int pipe, maxp; | ||
| 117 | char path[64]; | ||
| 118 | |||
| 119 | interface = ss->pusb_intf->cur_altsetting; | ||
| 120 | |||
| 121 | if (interface->desc.bNumEndpoints != 3) | ||
| 122 | return -ENODEV; | ||
| 123 | |||
| 124 | endpoint = &interface->endpoint[2].desc; | ||
| 125 | if(!(endpoint->bEndpointAddress & USB_DIR_IN)) | ||
| 126 | return -ENODEV; | ||
| 127 | if((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
| 128 | != USB_ENDPOINT_XFER_INT) | ||
| 129 | return -ENODEV; | ||
| 130 | |||
| 131 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); | ||
| 132 | maxp = usb_maxpacket(udev, pipe, usb_pipeout(pipe)); | ||
| 133 | |||
| 134 | if (!(onetouch = kcalloc(1, sizeof(struct usb_onetouch), GFP_KERNEL))) | ||
| 135 | return -ENOMEM; | ||
| 136 | |||
| 137 | onetouch->data = usb_buffer_alloc(udev, ONETOUCH_PKT_LEN, | ||
| 138 | SLAB_ATOMIC, &onetouch->data_dma); | ||
| 139 | if (!onetouch->data){ | ||
| 140 | kfree(onetouch); | ||
| 141 | return -ENOMEM; | ||
| 142 | } | ||
| 143 | |||
| 144 | onetouch->irq = usb_alloc_urb(0, GFP_KERNEL); | ||
| 145 | if (!onetouch->irq){ | ||
| 146 | kfree(onetouch); | ||
| 147 | usb_buffer_free(udev, ONETOUCH_PKT_LEN, | ||
| 148 | onetouch->data, onetouch->data_dma); | ||
| 149 | return -ENODEV; | ||
| 150 | } | ||
| 151 | |||
| 152 | |||
| 153 | onetouch->udev = udev; | ||
| 154 | |||
| 155 | set_bit(EV_KEY, onetouch->dev.evbit); | ||
| 156 | set_bit(ONETOUCH_BUTTON, onetouch->dev.keybit); | ||
| 157 | clear_bit(0, onetouch->dev.keybit); | ||
| 158 | |||
| 159 | onetouch->dev.private = onetouch; | ||
| 160 | onetouch->dev.open = usb_onetouch_open; | ||
| 161 | onetouch->dev.close = usb_onetouch_close; | ||
| 162 | |||
| 163 | usb_make_path(udev, path, sizeof(path)); | ||
| 164 | sprintf(onetouch->phys, "%s/input0", path); | ||
| 165 | |||
| 166 | onetouch->dev.name = onetouch->name; | ||
| 167 | onetouch->dev.phys = onetouch->phys; | ||
| 168 | |||
| 169 | usb_to_input_id(udev, &onetouch->dev.id); | ||
| 170 | |||
| 171 | onetouch->dev.dev = &udev->dev; | ||
| 172 | |||
| 173 | if (udev->manufacturer) | ||
| 174 | strcat(onetouch->name, udev->manufacturer); | ||
| 175 | if (udev->product) | ||
| 176 | sprintf(onetouch->name, "%s %s", onetouch->name, | ||
| 177 | udev->product); | ||
| 178 | if (!strlen(onetouch->name)) | ||
| 179 | sprintf(onetouch->name, "Maxtor Onetouch %04x:%04x", | ||
| 180 | onetouch->dev.id.vendor, onetouch->dev.id.product); | ||
| 181 | |||
| 182 | usb_fill_int_urb(onetouch->irq, udev, pipe, onetouch->data, | ||
| 183 | (maxp > 8 ? 8 : maxp), | ||
| 184 | usb_onetouch_irq, onetouch, endpoint->bInterval); | ||
| 185 | onetouch->irq->transfer_dma = onetouch->data_dma; | ||
| 186 | onetouch->irq->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
| 187 | |||
| 188 | ss->extra_destructor = onetouch_release_input; | ||
| 189 | ss->extra = onetouch; | ||
| 190 | |||
| 191 | input_register_device(&onetouch->dev); | ||
| 192 | printk(KERN_INFO "usb-input: %s on %s\n", onetouch->dev.name, path); | ||
| 193 | |||
| 194 | return 0; | ||
| 195 | } | ||
| 196 | |||
| 197 | void onetouch_release_input(void *onetouch_) | ||
| 198 | { | ||
| 199 | struct usb_onetouch *onetouch = (struct usb_onetouch *) onetouch_; | ||
| 200 | |||
| 201 | if (onetouch) { | ||
| 202 | usb_kill_urb(onetouch->irq); | ||
| 203 | input_unregister_device(&onetouch->dev); | ||
| 204 | usb_free_urb(onetouch->irq); | ||
| 205 | usb_buffer_free(onetouch->udev, ONETOUCH_PKT_LEN, | ||
| 206 | onetouch->data, onetouch->data_dma); | ||
| 207 | printk(KERN_INFO "usb-input: deregistering %s\n", | ||
| 208 | onetouch->dev.name); | ||
| 209 | } | ||
| 210 | } | ||
diff --git a/drivers/usb/storage/onetouch.h b/drivers/usb/storage/onetouch.h new file mode 100644 index 000000000000..41c7aa8f0446 --- /dev/null +++ b/drivers/usb/storage/onetouch.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #ifndef _ONETOUCH_H_ | ||
| 2 | #define _ONETOUCH_H_ | ||
| 3 | |||
| 4 | #define ONETOUCH_PKT_LEN 0x02 | ||
| 5 | #define ONETOUCH_BUTTON KEY_PROG1 | ||
| 6 | |||
| 7 | int onetouch_connect_input(struct us_data *ss); | ||
| 8 | |||
| 9 | #endif | ||
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index af294bb68c35..d34dc9f417f0 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c | |||
| @@ -156,6 +156,14 @@ static int slave_configure(struct scsi_device *sdev) | |||
| 156 | if (us->flags & US_FL_FIX_CAPACITY) | 156 | if (us->flags & US_FL_FIX_CAPACITY) |
| 157 | sdev->fix_capacity = 1; | 157 | sdev->fix_capacity = 1; |
| 158 | 158 | ||
| 159 | /* Some devices report a SCSI revision level above 2 but are | ||
| 160 | * unable to handle the REPORT LUNS command (for which | ||
| 161 | * support is mandatory at level 3). Since we already have | ||
| 162 | * a Get-Max-LUN request, we won't lose much by setting the | ||
| 163 | * revision level down to 2. The only devices that would be | ||
| 164 | * affected are those with sparse LUNs. */ | ||
| 165 | sdev->scsi_level = SCSI_2; | ||
| 166 | |||
| 159 | /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable | 167 | /* USB-IDE bridges tend to report SK = 0x04 (Non-recoverable |
| 160 | * Hardware Error) when any low-level error occurs, | 168 | * Hardware Error) when any low-level error occurs, |
| 161 | * recoverable or not. Setting this flag tells the SCSI | 169 | * recoverable or not. Setting this flag tells the SCSI |
diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c index f3b60288696c..356342c6e7a2 100644 --- a/drivers/usb/storage/shuttle_usbat.c +++ b/drivers/usb/storage/shuttle_usbat.c | |||
| @@ -839,34 +839,31 @@ static int usbat_identify_device(struct us_data *us, | |||
| 839 | rc = usbat_device_reset(us); | 839 | rc = usbat_device_reset(us); |
| 840 | if (rc != USB_STOR_TRANSPORT_GOOD) | 840 | if (rc != USB_STOR_TRANSPORT_GOOD) |
| 841 | return rc; | 841 | return rc; |
| 842 | msleep(25); | ||
| 842 | 843 | ||
| 843 | /* | 844 | /* |
| 844 | * By examining the device signature after a reset, we can identify | 845 | * In attempt to distinguish between HP CDRW's and Flash readers, we now |
| 845 | * whether the device supports the ATAPI packet interface. | 846 | * execute the IDENTIFY PACKET DEVICE command. On ATA devices (i.e. flash |
| 846 | * The flash-devices do not support this, whereas the HP CDRW's obviously | 847 | * readers), this command should fail with error. On ATAPI devices (i.e. |
| 847 | * do. | 848 | * CDROM drives), it should succeed. |
| 848 | * | ||
| 849 | * This method is not ideal, but works because no other devices have been | ||
| 850 | * produced based on the USBAT/USBAT02. | ||
| 851 | * | ||
| 852 | * Section 9.1 of the ATAPI-4 spec states (amongst other things) that | ||
| 853 | * after a device reset, a Cylinder low of 0x14 indicates that the device | ||
| 854 | * does support packet commands. | ||
| 855 | */ | 849 | */ |
| 856 | rc = usbat_read(us, USBAT_ATA, USBAT_ATA_LBA_ME, &status); | 850 | rc = usbat_write(us, USBAT_ATA, USBAT_ATA_CMD, 0xA1); |
| 857 | if (rc != USB_STOR_XFER_GOOD) | 851 | if (rc != USB_STOR_XFER_GOOD) |
| 858 | return USB_STOR_TRANSPORT_ERROR; | 852 | return USB_STOR_TRANSPORT_ERROR; |
| 859 | 853 | ||
| 860 | US_DEBUGP("usbat_identify_device: Cylinder low is %02X\n", status); | 854 | rc = usbat_get_status(us, &status); |
| 855 | if (rc != USB_STOR_XFER_GOOD) | ||
| 856 | return USB_STOR_TRANSPORT_ERROR; | ||
| 861 | 857 | ||
| 862 | if (status == 0x14) { | 858 | // Check for error bit |
| 859 | if (status & 0x01) { | ||
| 860 | // Device is a CompactFlash reader/writer | ||
| 861 | US_DEBUGP("usbat_identify_device: Detected Flash reader/writer\n"); | ||
| 862 | info->devicetype = USBAT_DEV_FLASH; | ||
| 863 | } else { | ||
| 863 | // Device is HP 8200 | 864 | // Device is HP 8200 |
| 864 | US_DEBUGP("usbat_identify_device: Detected HP8200 CDRW\n"); | 865 | US_DEBUGP("usbat_identify_device: Detected HP8200 CDRW\n"); |
| 865 | info->devicetype = USBAT_DEV_HP8200; | 866 | info->devicetype = USBAT_DEV_HP8200; |
| 866 | } else { | ||
| 867 | // Device is a CompactFlash reader/writer | ||
| 868 | US_DEBUGP("usbat_identify_device: Detected Flash reader/writer\n"); | ||
| 869 | info->devicetype = USBAT_DEV_FLASH; | ||
| 870 | } | 867 | } |
| 871 | 868 | ||
| 872 | return USB_STOR_TRANSPORT_GOOD; | 869 | return USB_STOR_TRANSPORT_GOOD; |
| @@ -1239,16 +1236,10 @@ static int usbat_select_and_test_registers(struct us_data *us) | |||
| 1239 | { | 1236 | { |
| 1240 | int selector; | 1237 | int selector; |
| 1241 | unsigned char *status = us->iobuf; | 1238 | unsigned char *status = us->iobuf; |
| 1242 | unsigned char max_selector = 0xB0; | ||
| 1243 | if (usbat_get_device_type(us) == USBAT_DEV_FLASH) | ||
| 1244 | max_selector = 0xA0; | ||
| 1245 | 1239 | ||
| 1246 | // try device = master, then device = slave. | 1240 | // try device = master, then device = slave. |
| 1247 | 1241 | for (selector = 0xA0; selector <= 0xB0; selector += 0x10) { | |
| 1248 | for (selector = 0xA0; selector <= max_selector; selector += 0x10) { | 1242 | if (usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) != |
| 1249 | |||
| 1250 | if (usbat_get_device_type(us) == USBAT_DEV_HP8200 && | ||
| 1251 | usbat_write(us, USBAT_ATA, USBAT_ATA_DEVICE, selector) != | ||
| 1252 | USB_STOR_XFER_GOOD) | 1243 | USB_STOR_XFER_GOOD) |
| 1253 | return USB_STOR_TRANSPORT_ERROR; | 1244 | return USB_STOR_TRANSPORT_ERROR; |
| 1254 | 1245 | ||
| @@ -1334,60 +1325,30 @@ int init_usbat(struct us_data *us) | |||
| 1334 | 1325 | ||
| 1335 | US_DEBUGP("INIT 3\n"); | 1326 | US_DEBUGP("INIT 3\n"); |
| 1336 | 1327 | ||
| 1337 | // At this point, we need to detect which device we are using | ||
| 1338 | if (usbat_set_transport(us, info)) | ||
| 1339 | return USB_STOR_TRANSPORT_ERROR; | ||
| 1340 | |||
| 1341 | US_DEBUGP("INIT 4\n"); | ||
| 1342 | |||
| 1343 | if (usbat_get_device_type(us) == USBAT_DEV_HP8200) { | ||
| 1344 | msleep(250); | ||
| 1345 | |||
| 1346 | // Write 0x80 to ISA port 0x3F | ||
| 1347 | rc = usbat_write(us, USBAT_ISA, 0x3F, 0x80); | ||
| 1348 | if (rc != USB_STOR_XFER_GOOD) | ||
| 1349 | return USB_STOR_TRANSPORT_ERROR; | ||
| 1350 | |||
| 1351 | US_DEBUGP("INIT 5\n"); | ||
| 1352 | |||
| 1353 | // Read ISA port 0x27 | ||
| 1354 | rc = usbat_read(us, USBAT_ISA, 0x27, status); | ||
| 1355 | if (rc != USB_STOR_XFER_GOOD) | ||
| 1356 | return USB_STOR_TRANSPORT_ERROR; | ||
| 1357 | |||
| 1358 | US_DEBUGP("INIT 6\n"); | ||
| 1359 | |||
| 1360 | rc = usbat_read_user_io(us, status); | ||
| 1361 | if (rc != USB_STOR_XFER_GOOD) | ||
| 1362 | return USB_STOR_TRANSPORT_ERROR; | ||
| 1363 | |||
| 1364 | US_DEBUGP("INIT 7\n"); | ||
| 1365 | } | ||
| 1366 | |||
| 1367 | rc = usbat_select_and_test_registers(us); | 1328 | rc = usbat_select_and_test_registers(us); |
| 1368 | if (rc != USB_STOR_TRANSPORT_GOOD) | 1329 | if (rc != USB_STOR_TRANSPORT_GOOD) |
| 1369 | return rc; | 1330 | return rc; |
| 1370 | 1331 | ||
| 1371 | US_DEBUGP("INIT 8\n"); | 1332 | US_DEBUGP("INIT 4\n"); |
| 1372 | 1333 | ||
| 1373 | rc = usbat_read_user_io(us, status); | 1334 | rc = usbat_read_user_io(us, status); |
| 1374 | if (rc != USB_STOR_XFER_GOOD) | 1335 | if (rc != USB_STOR_XFER_GOOD) |
| 1375 | return USB_STOR_TRANSPORT_ERROR; | 1336 | return USB_STOR_TRANSPORT_ERROR; |
| 1376 | 1337 | ||
| 1377 | US_DEBUGP("INIT 9\n"); | 1338 | US_DEBUGP("INIT 5\n"); |
| 1378 | 1339 | ||
| 1379 | // Enable peripheral control signals and card detect | 1340 | // Enable peripheral control signals and card detect |
| 1380 | rc = usbat_device_enable_cdt(us); | 1341 | rc = usbat_device_enable_cdt(us); |
| 1381 | if (rc != USB_STOR_TRANSPORT_GOOD) | 1342 | if (rc != USB_STOR_TRANSPORT_GOOD) |
| 1382 | return rc; | 1343 | return rc; |
| 1383 | 1344 | ||
| 1384 | US_DEBUGP("INIT 10\n"); | 1345 | US_DEBUGP("INIT 6\n"); |
| 1385 | 1346 | ||
| 1386 | rc = usbat_read_user_io(us, status); | 1347 | rc = usbat_read_user_io(us, status); |
| 1387 | if (rc != USB_STOR_XFER_GOOD) | 1348 | if (rc != USB_STOR_XFER_GOOD) |
| 1388 | return USB_STOR_TRANSPORT_ERROR; | 1349 | return USB_STOR_TRANSPORT_ERROR; |
| 1389 | 1350 | ||
| 1390 | US_DEBUGP("INIT 11\n"); | 1351 | US_DEBUGP("INIT 7\n"); |
| 1391 | 1352 | ||
| 1392 | msleep(1400); | 1353 | msleep(1400); |
| 1393 | 1354 | ||
| @@ -1395,13 +1356,19 @@ int init_usbat(struct us_data *us) | |||
| 1395 | if (rc != USB_STOR_XFER_GOOD) | 1356 | if (rc != USB_STOR_XFER_GOOD) |
| 1396 | return USB_STOR_TRANSPORT_ERROR; | 1357 | return USB_STOR_TRANSPORT_ERROR; |
| 1397 | 1358 | ||
| 1398 | US_DEBUGP("INIT 12\n"); | 1359 | US_DEBUGP("INIT 8\n"); |
| 1399 | 1360 | ||
| 1400 | rc = usbat_select_and_test_registers(us); | 1361 | rc = usbat_select_and_test_registers(us); |
| 1401 | if (rc != USB_STOR_TRANSPORT_GOOD) | 1362 | if (rc != USB_STOR_TRANSPORT_GOOD) |
| 1402 | return rc; | 1363 | return rc; |
| 1403 | 1364 | ||
| 1404 | US_DEBUGP("INIT 13\n"); | 1365 | US_DEBUGP("INIT 9\n"); |
| 1366 | |||
| 1367 | // At this point, we need to detect which device we are using | ||
| 1368 | if (usbat_set_transport(us, info)) | ||
| 1369 | return USB_STOR_TRANSPORT_ERROR; | ||
| 1370 | |||
| 1371 | US_DEBUGP("INIT 10\n"); | ||
| 1405 | 1372 | ||
| 1406 | if (usbat_get_device_type(us) == USBAT_DEV_FLASH) { | 1373 | if (usbat_get_device_type(us) == USBAT_DEV_FLASH) { |
| 1407 | subcountH = 0x02; | 1374 | subcountH = 0x02; |
| @@ -1412,7 +1379,7 @@ int init_usbat(struct us_data *us) | |||
| 1412 | if (rc != USB_STOR_XFER_GOOD) | 1379 | if (rc != USB_STOR_XFER_GOOD) |
| 1413 | return USB_STOR_TRANSPORT_ERROR; | 1380 | return USB_STOR_TRANSPORT_ERROR; |
| 1414 | 1381 | ||
| 1415 | US_DEBUGP("INIT 14\n"); | 1382 | US_DEBUGP("INIT 11\n"); |
| 1416 | 1383 | ||
| 1417 | return USB_STOR_TRANSPORT_GOOD; | 1384 | return USB_STOR_TRANSPORT_GOOD; |
| 1418 | } | 1385 | } |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index e6b1c6cf07f2..c1ba5301ebfc 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
| @@ -96,8 +96,8 @@ | |||
| 96 | * or before the URB_ACTIVE bit was set. If so, it's essential to cancel | 96 | * or before the URB_ACTIVE bit was set. If so, it's essential to cancel |
| 97 | * the URB if it hasn't been cancelled already (i.e., if the URB_ACTIVE bit | 97 | * the URB if it hasn't been cancelled already (i.e., if the URB_ACTIVE bit |
| 98 | * is still set). Either way, the function must then wait for the URB to | 98 | * is still set). Either way, the function must then wait for the URB to |
| 99 | * finish. Note that because the URB_ASYNC_UNLINK flag is set, the URB can | 99 | * finish. Note that the URB can still be in progress even after a call to |
| 100 | * still be in progress even after a call to usb_unlink_urb() returns. | 100 | * usb_unlink_urb() returns. |
| 101 | * | 101 | * |
| 102 | * The idea is that (1) once the ABORTING or DISCONNECTING bit is set, | 102 | * The idea is that (1) once the ABORTING or DISCONNECTING bit is set, |
| 103 | * either the stop_transport() function or the submitting function | 103 | * either the stop_transport() function or the submitting function |
| @@ -158,8 +158,7 @@ static int usb_stor_msg_common(struct us_data *us, int timeout) | |||
| 158 | * hasn't been mapped for DMA. Yes, this is clunky, but it's | 158 | * hasn't been mapped for DMA. Yes, this is clunky, but it's |
| 159 | * easier than always having the caller tell us whether the | 159 | * easier than always having the caller tell us whether the |
| 160 | * transfer buffer has already been mapped. */ | 160 | * transfer buffer has already been mapped. */ |
| 161 | us->current_urb->transfer_flags = | 161 | us->current_urb->transfer_flags = URB_NO_SETUP_DMA_MAP; |
| 162 | URB_ASYNC_UNLINK | URB_NO_SETUP_DMA_MAP; | ||
| 163 | if (us->current_urb->transfer_buffer == us->iobuf) | 162 | if (us->current_urb->transfer_buffer == us->iobuf) |
| 164 | us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 163 | us->current_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
| 165 | us->current_urb->transfer_dma = us->iobuf_dma; | 164 | us->current_urb->transfer_dma = us->iobuf_dma; |
| @@ -611,7 +610,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 611 | unsigned char old_sc_data_direction; | 610 | unsigned char old_sc_data_direction; |
| 612 | unsigned char old_cmd_len; | 611 | unsigned char old_cmd_len; |
| 613 | unsigned char old_cmnd[MAX_COMMAND_SIZE]; | 612 | unsigned char old_cmnd[MAX_COMMAND_SIZE]; |
| 614 | unsigned long old_serial_number; | ||
| 615 | int old_resid; | 613 | int old_resid; |
| 616 | 614 | ||
| 617 | US_DEBUGP("Issuing auto-REQUEST_SENSE\n"); | 615 | US_DEBUGP("Issuing auto-REQUEST_SENSE\n"); |
| @@ -648,10 +646,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 648 | old_sg = srb->use_sg; | 646 | old_sg = srb->use_sg; |
| 649 | srb->use_sg = 0; | 647 | srb->use_sg = 0; |
| 650 | 648 | ||
| 651 | /* change the serial number -- toggle the high bit*/ | ||
| 652 | old_serial_number = srb->serial_number; | ||
| 653 | srb->serial_number ^= 0x80000000; | ||
| 654 | |||
| 655 | /* issue the auto-sense command */ | 649 | /* issue the auto-sense command */ |
| 656 | old_resid = srb->resid; | 650 | old_resid = srb->resid; |
| 657 | srb->resid = 0; | 651 | srb->resid = 0; |
| @@ -662,7 +656,6 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 662 | srb->request_buffer = old_request_buffer; | 656 | srb->request_buffer = old_request_buffer; |
| 663 | srb->request_bufflen = old_request_bufflen; | 657 | srb->request_bufflen = old_request_bufflen; |
| 664 | srb->use_sg = old_sg; | 658 | srb->use_sg = old_sg; |
| 665 | srb->serial_number = old_serial_number; | ||
| 666 | srb->sc_data_direction = old_sc_data_direction; | 659 | srb->sc_data_direction = old_sc_data_direction; |
| 667 | srb->cmd_len = old_cmd_len; | 660 | srb->cmd_len = old_cmd_len; |
| 668 | memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE); | 661 | memcpy(srb->cmnd, old_cmnd, MAX_COMMAND_SIZE); |
| @@ -985,7 +978,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 985 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); | 978 | bcb->Signature = cpu_to_le32(US_BULK_CB_SIGN); |
| 986 | bcb->DataTransferLength = cpu_to_le32(transfer_length); | 979 | bcb->DataTransferLength = cpu_to_le32(transfer_length); |
| 987 | bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; | 980 | bcb->Flags = srb->sc_data_direction == DMA_FROM_DEVICE ? 1 << 7 : 0; |
| 988 | bcb->Tag = srb->serial_number; | 981 | bcb->Tag = ++us->tag; |
| 989 | bcb->Lun = srb->device->lun; | 982 | bcb->Lun = srb->device->lun; |
| 990 | if (us->flags & US_FL_SCM_MULT_TARG) | 983 | if (us->flags & US_FL_SCM_MULT_TARG) |
| 991 | bcb->Lun |= srb->device->id << 4; | 984 | bcb->Lun |= srb->device->id << 4; |
| @@ -1074,7 +1067,7 @@ int usb_stor_Bulk_transport(struct scsi_cmnd *srb, struct us_data *us) | |||
| 1074 | US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", | 1067 | US_DEBUGP("Bulk Status S 0x%x T 0x%x R %u Stat 0x%x\n", |
| 1075 | le32_to_cpu(bcs->Signature), bcs->Tag, | 1068 | le32_to_cpu(bcs->Signature), bcs->Tag, |
| 1076 | residue, bcs->Status); | 1069 | residue, bcs->Status); |
| 1077 | if (bcs->Tag != srb->serial_number || bcs->Status > US_BULK_STAT_PHASE) { | 1070 | if (bcs->Tag != us->tag || bcs->Status > US_BULK_STAT_PHASE) { |
| 1078 | US_DEBUGP("Bulk logical error\n"); | 1071 | US_DEBUGP("Bulk logical error\n"); |
| 1079 | return USB_STOR_TRANSPORT_ERROR; | 1072 | return USB_STOR_TRANSPORT_ERROR; |
| 1080 | } | 1073 | } |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index bd0ab3039bdd..ad0cfd7a782f 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -79,6 +79,13 @@ UNUSUAL_DEV( 0x03f0, 0x0307, 0x0001, 0x0001, | |||
| 79 | US_SC_8070, US_PR_SCM_ATAPI, init_usbat, 0), | 79 | US_SC_8070, US_PR_SCM_ATAPI, init_usbat, 0), |
| 80 | #endif | 80 | #endif |
| 81 | 81 | ||
| 82 | /* Patch submitted by Mihnea-Costin Grigore <mihnea@zulu.ro> */ | ||
| 83 | UNUSUAL_DEV( 0x040d, 0x6205, 0x0003, 0x0003, | ||
| 84 | "VIA Technologies Inc.", | ||
| 85 | "USB 2.0 Card Reader", | ||
| 86 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
| 87 | US_FL_IGNORE_RESIDUE ), | ||
| 88 | |||
| 82 | /* Deduced by Jonathan Woithe <jwoithe@physics.adelaide.edu.au> | 89 | /* Deduced by Jonathan Woithe <jwoithe@physics.adelaide.edu.au> |
| 83 | * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message | 90 | * Entry needed for flags: US_FL_FIX_INQUIRY because initial inquiry message |
| 84 | * always fails and confuses drive. | 91 | * always fails and confuses drive. |
| @@ -929,6 +936,18 @@ UNUSUAL_DEV( 0x0c0b, 0xa109, 0x0000, 0xffff, | |||
| 929 | US_FL_SINGLE_LUN ), | 936 | US_FL_SINGLE_LUN ), |
| 930 | #endif | 937 | #endif |
| 931 | 938 | ||
| 939 | /* Submitted by: Nick Sillik <n.sillik@temple.edu> | ||
| 940 | * Needed for OneTouch extension to usb-storage | ||
| 941 | * | ||
| 942 | */ | ||
| 943 | #ifdef CONFIG_USB_STORAGE_ONETOUCH | ||
| 944 | UNUSUAL_DEV( 0x0d49, 0x7010, 0x0000, 0x9999, | ||
| 945 | "Maxtor", | ||
| 946 | "OneTouch External Harddrive", | ||
| 947 | US_SC_DEVICE, US_PR_DEVICE, onetouch_connect_input, | ||
| 948 | 0), | ||
| 949 | #endif | ||
| 950 | |||
| 932 | /* Submitted by Joris Struyve <joris@struyve.be> */ | 951 | /* Submitted by Joris Struyve <joris@struyve.be> */ |
| 933 | UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, | 952 | UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, |
| 934 | "Medion", | 953 | "Medion", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index 77e7fc258aa2..cb4c770baf32 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
| @@ -90,7 +90,9 @@ | |||
| 90 | #ifdef CONFIG_USB_STORAGE_JUMPSHOT | 90 | #ifdef CONFIG_USB_STORAGE_JUMPSHOT |
| 91 | #include "jumpshot.h" | 91 | #include "jumpshot.h" |
| 92 | #endif | 92 | #endif |
| 93 | 93 | #ifdef CONFIG_USB_STORAGE_ONETOUCH | |
| 94 | #include "onetouch.h" | ||
| 95 | #endif | ||
| 94 | 96 | ||
| 95 | /* Some informational data */ | 97 | /* Some informational data */ |
| 96 | MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>"); | 98 | MODULE_AUTHOR("Matthew Dharm <mdharm-usb@one-eyed-alien.net>"); |
| @@ -786,6 +788,7 @@ static void usb_stor_release_resources(struct us_data *us) | |||
| 786 | * any more commands. | 788 | * any more commands. |
| 787 | */ | 789 | */ |
| 788 | US_DEBUGP("-- sending exit command to thread\n"); | 790 | US_DEBUGP("-- sending exit command to thread\n"); |
| 791 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | ||
| 789 | up(&us->sema); | 792 | up(&us->sema); |
| 790 | 793 | ||
| 791 | /* Call the destructor routine, if it exists */ | 794 | /* Call the destructor routine, if it exists */ |
| @@ -816,6 +819,49 @@ static void dissociate_dev(struct us_data *us) | |||
| 816 | usb_set_intfdata(us->pusb_intf, NULL); | 819 | usb_set_intfdata(us->pusb_intf, NULL); |
| 817 | } | 820 | } |
| 818 | 821 | ||
| 822 | /* First stage of disconnect processing: stop all commands and remove | ||
| 823 | * the host */ | ||
| 824 | static void quiesce_and_remove_host(struct us_data *us) | ||
| 825 | { | ||
| 826 | /* Prevent new USB transfers, stop the current command, and | ||
| 827 | * interrupt a SCSI-scan or device-reset delay */ | ||
| 828 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | ||
| 829 | usb_stor_stop_transport(us); | ||
| 830 | wake_up(&us->delay_wait); | ||
| 831 | |||
| 832 | /* It doesn't matter if the SCSI-scanning thread is still running. | ||
| 833 | * The thread will exit when it sees the DISCONNECTING flag. */ | ||
| 834 | |||
| 835 | /* Wait for the current command to finish, then remove the host */ | ||
| 836 | down(&us->dev_semaphore); | ||
| 837 | up(&us->dev_semaphore); | ||
| 838 | |||
| 839 | /* queuecommand won't accept any new commands and the control | ||
| 840 | * thread won't execute a previously-queued command. If there | ||
| 841 | * is such a command pending, complete it with an error. */ | ||
| 842 | if (us->srb) { | ||
| 843 | us->srb->result = DID_NO_CONNECT << 16; | ||
| 844 | scsi_lock(us_to_host(us)); | ||
| 845 | us->srb->scsi_done(us->srb); | ||
| 846 | us->srb = NULL; | ||
| 847 | scsi_unlock(us_to_host(us)); | ||
| 848 | } | ||
| 849 | |||
| 850 | /* Now we own no commands so it's safe to remove the SCSI host */ | ||
| 851 | scsi_remove_host(us_to_host(us)); | ||
| 852 | } | ||
| 853 | |||
| 854 | /* Second stage of disconnect processing: deallocate all resources */ | ||
| 855 | static void release_everything(struct us_data *us) | ||
| 856 | { | ||
| 857 | usb_stor_release_resources(us); | ||
| 858 | dissociate_dev(us); | ||
| 859 | |||
| 860 | /* Drop our reference to the host; the SCSI core will free it | ||
| 861 | * (and "us" along with it) when the refcount becomes 0. */ | ||
| 862 | scsi_host_put(us_to_host(us)); | ||
| 863 | } | ||
| 864 | |||
| 819 | /* Thread to carry out delayed SCSI-device scanning */ | 865 | /* Thread to carry out delayed SCSI-device scanning */ |
| 820 | static int usb_stor_scan_thread(void * __us) | 866 | static int usb_stor_scan_thread(void * __us) |
| 821 | { | 867 | { |
| @@ -956,7 +1002,7 @@ static int storage_probe(struct usb_interface *intf, | |||
| 956 | if (result < 0) { | 1002 | if (result < 0) { |
| 957 | printk(KERN_WARNING USB_STORAGE | 1003 | printk(KERN_WARNING USB_STORAGE |
| 958 | "Unable to start the device-scanning thread\n"); | 1004 | "Unable to start the device-scanning thread\n"); |
| 959 | scsi_remove_host(host); | 1005 | quiesce_and_remove_host(us); |
| 960 | goto BadDevice; | 1006 | goto BadDevice; |
| 961 | } | 1007 | } |
| 962 | atomic_inc(&total_threads); | 1008 | atomic_inc(&total_threads); |
| @@ -969,10 +1015,7 @@ static int storage_probe(struct usb_interface *intf, | |||
| 969 | /* We come here if there are any problems */ | 1015 | /* We come here if there are any problems */ |
| 970 | BadDevice: | 1016 | BadDevice: |
| 971 | US_DEBUGP("storage_probe() failed\n"); | 1017 | US_DEBUGP("storage_probe() failed\n"); |
| 972 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | 1018 | release_everything(us); |
| 973 | usb_stor_release_resources(us); | ||
| 974 | dissociate_dev(us); | ||
| 975 | scsi_host_put(host); | ||
| 976 | return result; | 1019 | return result; |
| 977 | } | 1020 | } |
| 978 | 1021 | ||
| @@ -982,28 +1025,8 @@ static void storage_disconnect(struct usb_interface *intf) | |||
| 982 | struct us_data *us = usb_get_intfdata(intf); | 1025 | struct us_data *us = usb_get_intfdata(intf); |
| 983 | 1026 | ||
| 984 | US_DEBUGP("storage_disconnect() called\n"); | 1027 | US_DEBUGP("storage_disconnect() called\n"); |
| 985 | 1028 | quiesce_and_remove_host(us); | |
| 986 | /* Prevent new USB transfers, stop the current command, and | 1029 | release_everything(us); |
| 987 | * interrupt a SCSI-scan or device-reset delay */ | ||
| 988 | set_bit(US_FLIDX_DISCONNECTING, &us->flags); | ||
| 989 | usb_stor_stop_transport(us); | ||
| 990 | wake_up(&us->delay_wait); | ||
| 991 | |||
| 992 | /* It doesn't matter if the SCSI-scanning thread is still running. | ||
| 993 | * The thread will exit when it sees the DISCONNECTING flag. */ | ||
| 994 | |||
| 995 | /* Wait for the current command to finish, then remove the host */ | ||
| 996 | down(&us->dev_semaphore); | ||
| 997 | up(&us->dev_semaphore); | ||
| 998 | scsi_remove_host(us_to_host(us)); | ||
| 999 | |||
| 1000 | /* Wait for everything to become idle and release all our resources */ | ||
| 1001 | usb_stor_release_resources(us); | ||
| 1002 | dissociate_dev(us); | ||
| 1003 | |||
| 1004 | /* Drop our reference to the host; the SCSI core will free it | ||
| 1005 | * (and "us" along with it) when the refcount becomes 0. */ | ||
| 1006 | scsi_host_put(us_to_host(us)); | ||
| 1007 | } | 1030 | } |
| 1008 | 1031 | ||
| 1009 | /*********************************************************************** | 1032 | /*********************************************************************** |
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h index 625b7aa98074..a195adae57b6 100644 --- a/drivers/usb/storage/usb.h +++ b/drivers/usb/storage/usb.h | |||
| @@ -158,6 +158,7 @@ struct us_data { | |||
| 158 | 158 | ||
| 159 | /* SCSI interfaces */ | 159 | /* SCSI interfaces */ |
| 160 | struct scsi_cmnd *srb; /* current srb */ | 160 | struct scsi_cmnd *srb; /* current srb */ |
| 161 | unsigned int tag; /* current dCBWTag */ | ||
| 161 | 162 | ||
| 162 | /* thread information */ | 163 | /* thread information */ |
| 163 | int pid; /* control thread */ | 164 | int pid; /* control thread */ |
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c index 52b16850a54e..30f80c23f934 100644 --- a/drivers/video/nvidia/nvidia.c +++ b/drivers/video/nvidia/nvidia.c | |||
| @@ -1473,10 +1473,6 @@ static int __devinit nvidiafb_probe(struct pci_dev *pd, | |||
| 1473 | par->Chipset = (pd->vendor << 16) | pd->device; | 1473 | par->Chipset = (pd->vendor << 16) | pd->device; |
| 1474 | printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset); | 1474 | printk(KERN_INFO PFX "nVidia device/chipset %X\n", par->Chipset); |
| 1475 | 1475 | ||
| 1476 | #ifdef CONFIG_PCI_NAMES | ||
| 1477 | printk(KERN_INFO PFX "%s\n", pd->pretty_name); | ||
| 1478 | #endif | ||
| 1479 | |||
| 1480 | if (par->Architecture == 0) { | 1476 | if (par->Architecture == 0) { |
| 1481 | printk(KERN_ERR PFX "unknown NV_ARCH\n"); | 1477 | printk(KERN_ERR PFX "unknown NV_ARCH\n"); |
| 1482 | goto err_out_free_base0; | 1478 | goto err_out_free_base0; |
diff --git a/drivers/video/offb.c b/drivers/video/offb.c index 42a6591e863f..611922c0b22f 100644 --- a/drivers/video/offb.c +++ b/drivers/video/offb.c | |||
| @@ -363,7 +363,7 @@ static void __init offb_init_nodriver(struct device_node *dp) | |||
| 363 | address = (u_long) dp->addrs[i].address; | 363 | address = (u_long) dp->addrs[i].address; |
| 364 | 364 | ||
| 365 | #ifdef CONFIG_PPC64 | 365 | #ifdef CONFIG_PPC64 |
| 366 | address += dp->phb->pci_mem_offset; | 366 | address += ((struct pci_dn *)dp->data)->phb->pci_mem_offset; |
| 367 | #endif | 367 | #endif |
| 368 | 368 | ||
| 369 | /* kludge for valkyrie */ | 369 | /* kludge for valkyrie */ |
diff --git a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c index ae297e222681..3e9f96e9237d 100644 --- a/drivers/video/riva/fbdev.c +++ b/drivers/video/riva/fbdev.c | |||
| @@ -1936,10 +1936,6 @@ static int __devinit rivafb_probe(struct pci_dev *pd, | |||
| 1936 | default_par->Chipset = (pd->vendor << 16) | pd->device; | 1936 | default_par->Chipset = (pd->vendor << 16) | pd->device; |
| 1937 | printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset); | 1937 | printk(KERN_INFO PFX "nVidia device/chipset %X\n",default_par->Chipset); |
| 1938 | 1938 | ||
| 1939 | #ifdef CONFIG_PCI_NAMES | ||
| 1940 | printk(KERN_INFO PFX "%s\n", pd->pretty_name); | ||
| 1941 | #endif | ||
| 1942 | |||
| 1943 | if(default_par->riva.Architecture == 0) { | 1939 | if(default_par->riva.Architecture == 0) { |
| 1944 | printk(KERN_ERR PFX "unknown NV_ARCH\n"); | 1940 | printk(KERN_ERR PFX "unknown NV_ARCH\n"); |
| 1945 | ret=-ENODEV; | 1941 | ret=-ENODEV; |
| @@ -683,7 +683,7 @@ struct bio *bio_map_user(request_queue_t *q, struct block_device *bdev, | |||
| 683 | { | 683 | { |
| 684 | struct sg_iovec iov; | 684 | struct sg_iovec iov; |
| 685 | 685 | ||
| 686 | iov.iov_base = (__user void *)uaddr; | 686 | iov.iov_base = (void __user *)uaddr; |
| 687 | iov.iov_len = len; | 687 | iov.iov_len = len; |
| 688 | 688 | ||
| 689 | return bio_map_user_iov(q, bdev, &iov, 1, write_to_vm); | 689 | return bio_map_user_iov(q, bdev, &iov, 1, write_to_vm); |
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog index 9eecc9939dfe..e4fd6134244d 100644 --- a/fs/ntfs/ChangeLog +++ b/fs/ntfs/ChangeLog | |||
| @@ -22,6 +22,76 @@ ToDo/Notes: | |||
| 22 | - Enable the code for setting the NT4 compatibility flag when we start | 22 | - Enable the code for setting the NT4 compatibility flag when we start |
| 23 | making NTFS 1.2 specific modifications. | 23 | making NTFS 1.2 specific modifications. |
| 24 | 24 | ||
| 25 | 2.1.24 - Lots of bug fixes and support more clean journal states. | ||
| 26 | |||
| 27 | - Support journals ($LogFile) which have been modified by chkdsk. This | ||
| 28 | means users can boot into Windows after we marked the volume dirty. | ||
| 29 | The Windows boot will run chkdsk and then reboot. The user can then | ||
| 30 | immediately boot into Linux rather than having to do a full Windows | ||
| 31 | boot first before rebooting into Linux and we will recognize such a | ||
| 32 | journal and empty it as it is clean by definition. | ||
| 33 | - Support journals ($LogFile) with only one restart page as well as | ||
| 34 | journals with two different restart pages. We sanity check both and | ||
| 35 | either use the only sane one or the more recent one of the two in the | ||
| 36 | case that both are valid. | ||
| 37 | - Modify fs/ntfs/malloc.h::ntfs_malloc_nofs() to do the kmalloc() based | ||
| 38 | allocations with __GFP_HIGHMEM, analogous to how the vmalloc() based | ||
| 39 | allocations are done. | ||
| 40 | - Add fs/ntfs/malloc.h::ntfs_malloc_nofs_nofail() which is analogous to | ||
| 41 | ntfs_malloc_nofs() but it performs allocations with __GFP_NOFAIL and | ||
| 42 | hence cannot fail. | ||
| 43 | - Use ntfs_malloc_nofs_nofail() in the two critical regions in | ||
| 44 | fs/ntfs/runlist.c::ntfs_runlists_merge(). This means we no longer | ||
| 45 | need to panic() if the allocation fails as it now cannot fail. | ||
| 46 | - Fix two nasty runlist merging bugs that had gone unnoticed so far. | ||
| 47 | Thanks to Stefano Picerno for the bug report. | ||
| 48 | - Remove two bogus BUG_ON()s from fs/ntfs/mft.c. | ||
| 49 | - Fix handling of valid but empty mapping pairs array in | ||
| 50 | fs/ntfs/runlist.c::ntfs_mapping_pairs_decompress(). | ||
| 51 | - Report unrepresentable inodes during ntfs_readdir() as KERN_WARNING | ||
| 52 | messages and include the inode number. Thanks to Yura Pakhuchiy for | ||
| 53 | pointing this out. | ||
| 54 | - Change ntfs_rl_truncate_nolock() to throw away the runlist if the new | ||
| 55 | length is zero. | ||
| 56 | - Add runlist.[hc]::ntfs_rl_punch_nolock() which punches a caller | ||
| 57 | specified hole into a runlist. | ||
| 58 | - Fix a bug in fs/ntfs/index.c::ntfs_index_lookup(). When the returned | ||
| 59 | index entry is in the index root, we forgot to set the @ir pointer in | ||
| 60 | the index context. Thanks to Yura Pakhuchiy for finding this bug. | ||
| 61 | - Remove bogus setting of PageError in ntfs_read_compressed_block(). | ||
| 62 | - Add fs/ntfs/attrib.[hc]::ntfs_resident_attr_value_resize(). | ||
| 63 | - Fix a bug in ntfs_map_runlist_nolock() where we forgot to protect | ||
| 64 | access to the allocated size in the ntfs inode with the size lock. | ||
| 65 | - Fix ntfs_attr_vcn_to_lcn_nolock() and ntfs_attr_find_vcn_nolock() to | ||
| 66 | return LCN_ENOENT when there is no runlist and the allocated size is | ||
| 67 | zero. | ||
| 68 | - Fix load_attribute_list() to handle the case of a NULL runlist. | ||
| 69 | - Fix handling of sparse attributes in ntfs_attr_make_non_resident(). | ||
| 70 | - Add BUG() checks to ntfs_attr_make_non_resident() and ntfs_attr_set() | ||
| 71 | to ensure that these functions are never called for compressed or | ||
| 72 | encrypted attributes. | ||
| 73 | - Fix cluster (de)allocators to work when the runlist is NULL and more | ||
| 74 | importantly to take a locked runlist rather than them locking it | ||
| 75 | which leads to lock reversal. | ||
| 76 | - Truncate {a,c,m}time to the ntfs supported time granularity when | ||
| 77 | updating the times in the inode in ntfs_setattr(). | ||
| 78 | - Fixup handling of sparse, compressed, and encrypted attributes in | ||
| 79 | fs/ntfs/inode.c::ntfs_read_locked_{,attr_,index_}inode(), | ||
| 80 | fs/ntfs/aops.c::ntfs_{read,write}page(). | ||
| 81 | - Make ntfs_write_block() not instantiate sparse blocks if they contain | ||
| 82 | only zeroes. | ||
| 83 | - Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page | ||
| 84 | lock protection over the buffer submission for i/o which allows the | ||
| 85 | removal of the get_bh()/put_bh() pairs for each buffer. | ||
| 86 | - Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case | ||
| 87 | where a concurrent truncate has truncated the runlist under our feet. | ||
| 88 | - Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c. | ||
| 89 | - In fs/ntfs/aops.c::ntfs_end_buffer_async_read(), use a bit spin lock | ||
| 90 | in the first buffer head instead of a driver global spin lock to | ||
| 91 | improve scalability. | ||
| 92 | - Minor fix to error handling and error message display in | ||
| 93 | fs/ntfs/aops.c::ntfs_prepare_nonresident_write(). | ||
| 94 | |||
| 25 | 2.1.23 - Implement extension of resident files and make writing safe as well as | 95 | 2.1.23 - Implement extension of resident files and make writing safe as well as |
| 26 | many bug fixes, cleanups, and enhancements... | 96 | many bug fixes, cleanups, and enhancements... |
| 27 | 97 | ||
diff --git a/fs/ntfs/Makefile b/fs/ntfs/Makefile index f083f27d8b69..894b2b876d35 100644 --- a/fs/ntfs/Makefile +++ b/fs/ntfs/Makefile | |||
| @@ -6,7 +6,7 @@ ntfs-objs := aops.o attrib.o collate.o compress.o debug.o dir.o file.o \ | |||
| 6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ | 6 | index.o inode.o mft.o mst.o namei.o runlist.o super.o sysctl.o \ |
| 7 | unistr.o upcase.o | 7 | unistr.o upcase.o |
| 8 | 8 | ||
| 9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.23\" | 9 | EXTRA_CFLAGS = -DNTFS_VERSION=\"2.1.24\" |
| 10 | 10 | ||
| 11 | ifeq ($(CONFIG_NTFS_DEBUG),y) | 11 | ifeq ($(CONFIG_NTFS_DEBUG),y) |
| 12 | EXTRA_CFLAGS += -DDEBUG | 12 | EXTRA_CFLAGS += -DDEBUG |
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c index 78adad7a988d..545236414d59 100644 --- a/fs/ntfs/aops.c +++ b/fs/ntfs/aops.c | |||
| @@ -55,9 +55,8 @@ | |||
| 55 | */ | 55 | */ |
| 56 | static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) | 56 | static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| 57 | { | 57 | { |
| 58 | static DEFINE_SPINLOCK(page_uptodate_lock); | ||
| 59 | unsigned long flags; | 58 | unsigned long flags; |
| 60 | struct buffer_head *tmp; | 59 | struct buffer_head *first, *tmp; |
| 61 | struct page *page; | 60 | struct page *page; |
| 62 | ntfs_inode *ni; | 61 | ntfs_inode *ni; |
| 63 | int page_uptodate = 1; | 62 | int page_uptodate = 1; |
| @@ -89,11 +88,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) | |||
| 89 | } | 88 | } |
| 90 | } else { | 89 | } else { |
| 91 | clear_buffer_uptodate(bh); | 90 | clear_buffer_uptodate(bh); |
| 91 | SetPageError(page); | ||
| 92 | ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.", | 92 | ntfs_error(ni->vol->sb, "Buffer I/O error, logical block %llu.", |
| 93 | (unsigned long long)bh->b_blocknr); | 93 | (unsigned long long)bh->b_blocknr); |
| 94 | SetPageError(page); | ||
| 95 | } | 94 | } |
| 96 | spin_lock_irqsave(&page_uptodate_lock, flags); | 95 | first = page_buffers(page); |
| 96 | local_irq_save(flags); | ||
| 97 | bit_spin_lock(BH_Uptodate_Lock, &first->b_state); | ||
| 97 | clear_buffer_async_read(bh); | 98 | clear_buffer_async_read(bh); |
| 98 | unlock_buffer(bh); | 99 | unlock_buffer(bh); |
| 99 | tmp = bh; | 100 | tmp = bh; |
| @@ -108,7 +109,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) | |||
| 108 | } | 109 | } |
| 109 | tmp = tmp->b_this_page; | 110 | tmp = tmp->b_this_page; |
| 110 | } while (tmp != bh); | 111 | } while (tmp != bh); |
| 111 | spin_unlock_irqrestore(&page_uptodate_lock, flags); | 112 | bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| 113 | local_irq_restore(flags); | ||
| 112 | /* | 114 | /* |
| 113 | * If none of the buffers had errors then we can set the page uptodate, | 115 | * If none of the buffers had errors then we can set the page uptodate, |
| 114 | * but we first have to perform the post read mst fixups, if the | 116 | * but we first have to perform the post read mst fixups, if the |
| @@ -141,7 +143,8 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) | |||
| 141 | unlock_page(page); | 143 | unlock_page(page); |
| 142 | return; | 144 | return; |
| 143 | still_busy: | 145 | still_busy: |
| 144 | spin_unlock_irqrestore(&page_uptodate_lock, flags); | 146 | bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| 147 | local_irq_restore(flags); | ||
| 145 | return; | 148 | return; |
| 146 | } | 149 | } |
| 147 | 150 | ||
| @@ -185,13 +188,15 @@ static int ntfs_read_block(struct page *page) | |||
| 185 | blocksize_bits = VFS_I(ni)->i_blkbits; | 188 | blocksize_bits = VFS_I(ni)->i_blkbits; |
| 186 | blocksize = 1 << blocksize_bits; | 189 | blocksize = 1 << blocksize_bits; |
| 187 | 190 | ||
| 188 | if (!page_has_buffers(page)) | 191 | if (!page_has_buffers(page)) { |
| 189 | create_empty_buffers(page, blocksize, 0); | 192 | create_empty_buffers(page, blocksize, 0); |
| 190 | bh = head = page_buffers(page); | 193 | if (unlikely(!page_has_buffers(page))) { |
| 191 | if (unlikely(!bh)) { | 194 | unlock_page(page); |
| 192 | unlock_page(page); | 195 | return -ENOMEM; |
| 193 | return -ENOMEM; | 196 | } |
| 194 | } | 197 | } |
| 198 | bh = head = page_buffers(page); | ||
| 199 | BUG_ON(!bh); | ||
| 195 | 200 | ||
| 196 | iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits); | 201 | iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits); |
| 197 | read_lock_irqsave(&ni->size_lock, flags); | 202 | read_lock_irqsave(&ni->size_lock, flags); |
| @@ -204,6 +209,7 @@ static int ntfs_read_block(struct page *page) | |||
| 204 | nr = i = 0; | 209 | nr = i = 0; |
| 205 | do { | 210 | do { |
| 206 | u8 *kaddr; | 211 | u8 *kaddr; |
| 212 | int err; | ||
| 207 | 213 | ||
| 208 | if (unlikely(buffer_uptodate(bh))) | 214 | if (unlikely(buffer_uptodate(bh))) |
| 209 | continue; | 215 | continue; |
| @@ -211,6 +217,7 @@ static int ntfs_read_block(struct page *page) | |||
| 211 | arr[nr++] = bh; | 217 | arr[nr++] = bh; |
| 212 | continue; | 218 | continue; |
| 213 | } | 219 | } |
| 220 | err = 0; | ||
| 214 | bh->b_bdev = vol->sb->s_bdev; | 221 | bh->b_bdev = vol->sb->s_bdev; |
| 215 | /* Is the block within the allowed limits? */ | 222 | /* Is the block within the allowed limits? */ |
| 216 | if (iblock < lblock) { | 223 | if (iblock < lblock) { |
| @@ -252,7 +259,6 @@ lock_retry_remap: | |||
| 252 | goto handle_hole; | 259 | goto handle_hole; |
| 253 | /* If first try and runlist unmapped, map and retry. */ | 260 | /* If first try and runlist unmapped, map and retry. */ |
| 254 | if (!is_retry && lcn == LCN_RL_NOT_MAPPED) { | 261 | if (!is_retry && lcn == LCN_RL_NOT_MAPPED) { |
| 255 | int err; | ||
| 256 | is_retry = TRUE; | 262 | is_retry = TRUE; |
| 257 | /* | 263 | /* |
| 258 | * Attempt to map runlist, dropping lock for | 264 | * Attempt to map runlist, dropping lock for |
| @@ -263,20 +269,30 @@ lock_retry_remap: | |||
| 263 | if (likely(!err)) | 269 | if (likely(!err)) |
| 264 | goto lock_retry_remap; | 270 | goto lock_retry_remap; |
| 265 | rl = NULL; | 271 | rl = NULL; |
| 266 | lcn = err; | ||
| 267 | } else if (!rl) | 272 | } else if (!rl) |
| 268 | up_read(&ni->runlist.lock); | 273 | up_read(&ni->runlist.lock); |
| 274 | /* | ||
| 275 | * If buffer is outside the runlist, treat it as a | ||
| 276 | * hole. This can happen due to concurrent truncate | ||
| 277 | * for example. | ||
| 278 | */ | ||
| 279 | if (err == -ENOENT || lcn == LCN_ENOENT) { | ||
| 280 | err = 0; | ||
| 281 | goto handle_hole; | ||
| 282 | } | ||
| 269 | /* Hard error, zero out region. */ | 283 | /* Hard error, zero out region. */ |
| 284 | if (!err) | ||
| 285 | err = -EIO; | ||
| 270 | bh->b_blocknr = -1; | 286 | bh->b_blocknr = -1; |
| 271 | SetPageError(page); | 287 | SetPageError(page); |
| 272 | ntfs_error(vol->sb, "Failed to read from inode 0x%lx, " | 288 | ntfs_error(vol->sb, "Failed to read from inode 0x%lx, " |
| 273 | "attribute type 0x%x, vcn 0x%llx, " | 289 | "attribute type 0x%x, vcn 0x%llx, " |
| 274 | "offset 0x%x because its location on " | 290 | "offset 0x%x because its location on " |
| 275 | "disk could not be determined%s " | 291 | "disk could not be determined%s " |
| 276 | "(error code %lli).", ni->mft_no, | 292 | "(error code %i).", ni->mft_no, |
| 277 | ni->type, (unsigned long long)vcn, | 293 | ni->type, (unsigned long long)vcn, |
| 278 | vcn_ofs, is_retry ? " even after " | 294 | vcn_ofs, is_retry ? " even after " |
| 279 | "retrying" : "", (long long)lcn); | 295 | "retrying" : "", err); |
| 280 | } | 296 | } |
| 281 | /* | 297 | /* |
| 282 | * Either iblock was outside lblock limits or | 298 | * Either iblock was outside lblock limits or |
| @@ -289,9 +305,10 @@ handle_hole: | |||
| 289 | handle_zblock: | 305 | handle_zblock: |
| 290 | kaddr = kmap_atomic(page, KM_USER0); | 306 | kaddr = kmap_atomic(page, KM_USER0); |
| 291 | memset(kaddr + i * blocksize, 0, blocksize); | 307 | memset(kaddr + i * blocksize, 0, blocksize); |
| 292 | flush_dcache_page(page); | ||
| 293 | kunmap_atomic(kaddr, KM_USER0); | 308 | kunmap_atomic(kaddr, KM_USER0); |
| 294 | set_buffer_uptodate(bh); | 309 | flush_dcache_page(page); |
| 310 | if (likely(!err)) | ||
| 311 | set_buffer_uptodate(bh); | ||
| 295 | } while (i++, iblock++, (bh = bh->b_this_page) != head); | 312 | } while (i++, iblock++, (bh = bh->b_this_page) != head); |
| 296 | 313 | ||
| 297 | /* Release the lock if we took it. */ | 314 | /* Release the lock if we took it. */ |
| @@ -367,31 +384,38 @@ retry_readpage: | |||
| 367 | return 0; | 384 | return 0; |
| 368 | } | 385 | } |
| 369 | ni = NTFS_I(page->mapping->host); | 386 | ni = NTFS_I(page->mapping->host); |
| 370 | 387 | /* | |
| 388 | * Only $DATA attributes can be encrypted and only unnamed $DATA | ||
| 389 | * attributes can be compressed. Index root can have the flags set but | ||
| 390 | * this means to create compressed/encrypted files, not that the | ||
| 391 | * attribute is compressed/encrypted. | ||
| 392 | */ | ||
| 393 | if (ni->type != AT_INDEX_ROOT) { | ||
| 394 | /* If attribute is encrypted, deny access, just like NT4. */ | ||
| 395 | if (NInoEncrypted(ni)) { | ||
| 396 | BUG_ON(ni->type != AT_DATA); | ||
| 397 | err = -EACCES; | ||
| 398 | goto err_out; | ||
| 399 | } | ||
| 400 | /* Compressed data streams are handled in compress.c. */ | ||
| 401 | if (NInoNonResident(ni) && NInoCompressed(ni)) { | ||
| 402 | BUG_ON(ni->type != AT_DATA); | ||
| 403 | BUG_ON(ni->name_len); | ||
| 404 | return ntfs_read_compressed_block(page); | ||
| 405 | } | ||
| 406 | } | ||
| 371 | /* NInoNonResident() == NInoIndexAllocPresent() */ | 407 | /* NInoNonResident() == NInoIndexAllocPresent() */ |
| 372 | if (NInoNonResident(ni)) { | 408 | if (NInoNonResident(ni)) { |
| 373 | /* | 409 | /* Normal, non-resident data stream. */ |
| 374 | * Only unnamed $DATA attributes can be compressed or | ||
| 375 | * encrypted. | ||
| 376 | */ | ||
| 377 | if (ni->type == AT_DATA && !ni->name_len) { | ||
| 378 | /* If file is encrypted, deny access, just like NT4. */ | ||
| 379 | if (NInoEncrypted(ni)) { | ||
| 380 | err = -EACCES; | ||
| 381 | goto err_out; | ||
| 382 | } | ||
| 383 | /* Compressed data streams are handled in compress.c. */ | ||
| 384 | if (NInoCompressed(ni)) | ||
| 385 | return ntfs_read_compressed_block(page); | ||
| 386 | } | ||
| 387 | /* Normal data stream. */ | ||
| 388 | return ntfs_read_block(page); | 410 | return ntfs_read_block(page); |
| 389 | } | 411 | } |
| 390 | /* | 412 | /* |
| 391 | * Attribute is resident, implying it is not compressed or encrypted. | 413 | * Attribute is resident, implying it is not compressed or encrypted. |
| 392 | * This also means the attribute is smaller than an mft record and | 414 | * This also means the attribute is smaller than an mft record and |
| 393 | * hence smaller than a page, so can simply zero out any pages with | 415 | * hence smaller than a page, so can simply zero out any pages with |
| 394 | * index above 0. | 416 | * index above 0. Note the attribute can actually be marked compressed |
| 417 | * but if it is resident the actual data is not compressed so we are | ||
| 418 | * ok to ignore the compressed flag here. | ||
| 395 | */ | 419 | */ |
| 396 | if (unlikely(page->index > 0)) { | 420 | if (unlikely(page->index > 0)) { |
| 397 | kaddr = kmap_atomic(page, KM_USER0); | 421 | kaddr = kmap_atomic(page, KM_USER0); |
| @@ -511,19 +535,21 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc) | |||
| 511 | BUG_ON(!PageUptodate(page)); | 535 | BUG_ON(!PageUptodate(page)); |
| 512 | create_empty_buffers(page, blocksize, | 536 | create_empty_buffers(page, blocksize, |
| 513 | (1 << BH_Uptodate) | (1 << BH_Dirty)); | 537 | (1 << BH_Uptodate) | (1 << BH_Dirty)); |
| 538 | if (unlikely(!page_has_buffers(page))) { | ||
| 539 | ntfs_warning(vol->sb, "Error allocating page " | ||
| 540 | "buffers. Redirtying page so we try " | ||
| 541 | "again later."); | ||
| 542 | /* | ||
| 543 | * Put the page back on mapping->dirty_pages, but leave | ||
| 544 | * its buffers' dirty state as-is. | ||
| 545 | */ | ||
| 546 | redirty_page_for_writepage(wbc, page); | ||
| 547 | unlock_page(page); | ||
| 548 | return 0; | ||
| 549 | } | ||
| 514 | } | 550 | } |
| 515 | bh = head = page_buffers(page); | 551 | bh = head = page_buffers(page); |
| 516 | if (unlikely(!bh)) { | 552 | BUG_ON(!bh); |
| 517 | ntfs_warning(vol->sb, "Error allocating page buffers. " | ||
| 518 | "Redirtying page so we try again later."); | ||
| 519 | /* | ||
| 520 | * Put the page back on mapping->dirty_pages, but leave its | ||
| 521 | * buffer's dirty state as-is. | ||
| 522 | */ | ||
| 523 | redirty_page_for_writepage(wbc, page); | ||
| 524 | unlock_page(page); | ||
| 525 | return 0; | ||
| 526 | } | ||
| 527 | 553 | ||
| 528 | /* NOTE: Different naming scheme to ntfs_read_block()! */ | 554 | /* NOTE: Different naming scheme to ntfs_read_block()! */ |
| 529 | 555 | ||
| @@ -670,6 +696,27 @@ lock_retry_remap: | |||
| 670 | } | 696 | } |
| 671 | /* It is a hole, need to instantiate it. */ | 697 | /* It is a hole, need to instantiate it. */ |
| 672 | if (lcn == LCN_HOLE) { | 698 | if (lcn == LCN_HOLE) { |
| 699 | u8 *kaddr; | ||
| 700 | unsigned long *bpos, *bend; | ||
| 701 | |||
| 702 | /* Check if the buffer is zero. */ | ||
| 703 | kaddr = kmap_atomic(page, KM_USER0); | ||
| 704 | bpos = (unsigned long *)(kaddr + bh_offset(bh)); | ||
| 705 | bend = (unsigned long *)((u8*)bpos + blocksize); | ||
| 706 | do { | ||
| 707 | if (unlikely(*bpos)) | ||
| 708 | break; | ||
| 709 | } while (likely(++bpos < bend)); | ||
| 710 | kunmap_atomic(kaddr, KM_USER0); | ||
| 711 | if (bpos == bend) { | ||
| 712 | /* | ||
| 713 | * Buffer is zero and sparse, no need to write | ||
| 714 | * it. | ||
| 715 | */ | ||
| 716 | bh->b_blocknr = -1; | ||
| 717 | clear_buffer_dirty(bh); | ||
| 718 | continue; | ||
| 719 | } | ||
| 673 | // TODO: Instantiate the hole. | 720 | // TODO: Instantiate the hole. |
| 674 | // clear_buffer_new(bh); | 721 | // clear_buffer_new(bh); |
| 675 | // unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); | 722 | // unmap_underlying_metadata(bh->b_bdev, bh->b_blocknr); |
| @@ -690,20 +737,37 @@ lock_retry_remap: | |||
| 690 | if (likely(!err)) | 737 | if (likely(!err)) |
| 691 | goto lock_retry_remap; | 738 | goto lock_retry_remap; |
| 692 | rl = NULL; | 739 | rl = NULL; |
| 693 | lcn = err; | ||
| 694 | } else if (!rl) | 740 | } else if (!rl) |
| 695 | up_read(&ni->runlist.lock); | 741 | up_read(&ni->runlist.lock); |
| 742 | /* | ||
| 743 | * If buffer is outside the runlist, truncate has cut it out | ||
| 744 | * of the runlist. Just clean and clear the buffer and set it | ||
| 745 | * uptodate so it can get discarded by the VM. | ||
| 746 | */ | ||
| 747 | if (err == -ENOENT || lcn == LCN_ENOENT) { | ||
| 748 | u8 *kaddr; | ||
| 749 | |||
| 750 | bh->b_blocknr = -1; | ||
| 751 | clear_buffer_dirty(bh); | ||
| 752 | kaddr = kmap_atomic(page, KM_USER0); | ||
| 753 | memset(kaddr + bh_offset(bh), 0, blocksize); | ||
| 754 | kunmap_atomic(kaddr, KM_USER0); | ||
| 755 | flush_dcache_page(page); | ||
| 756 | set_buffer_uptodate(bh); | ||
| 757 | err = 0; | ||
| 758 | continue; | ||
| 759 | } | ||
| 696 | /* Failed to map the buffer, even after retrying. */ | 760 | /* Failed to map the buffer, even after retrying. */ |
| 761 | if (!err) | ||
| 762 | err = -EIO; | ||
| 697 | bh->b_blocknr = -1; | 763 | bh->b_blocknr = -1; |
| 698 | ntfs_error(vol->sb, "Failed to write to inode 0x%lx, " | 764 | ntfs_error(vol->sb, "Failed to write to inode 0x%lx, " |
| 699 | "attribute type 0x%x, vcn 0x%llx, offset 0x%x " | 765 | "attribute type 0x%x, vcn 0x%llx, offset 0x%x " |
| 700 | "because its location on disk could not be " | 766 | "because its location on disk could not be " |
| 701 | "determined%s (error code %lli).", ni->mft_no, | 767 | "determined%s (error code %i).", ni->mft_no, |
| 702 | ni->type, (unsigned long long)vcn, | 768 | ni->type, (unsigned long long)vcn, |
| 703 | vcn_ofs, is_retry ? " even after " | 769 | vcn_ofs, is_retry ? " even after " |
| 704 | "retrying" : "", (long long)lcn); | 770 | "retrying" : "", err); |
| 705 | if (!err) | ||
| 706 | err = -EIO; | ||
| 707 | break; | 771 | break; |
| 708 | } while (block++, (bh = bh->b_this_page) != head); | 772 | } while (block++, (bh = bh->b_this_page) != head); |
| 709 | 773 | ||
| @@ -714,7 +778,7 @@ lock_retry_remap: | |||
| 714 | /* For the error case, need to reset bh to the beginning. */ | 778 | /* For the error case, need to reset bh to the beginning. */ |
| 715 | bh = head; | 779 | bh = head; |
| 716 | 780 | ||
| 717 | /* Just an optimization, so ->readpage() isn't called later. */ | 781 | /* Just an optimization, so ->readpage() is not called later. */ |
| 718 | if (unlikely(!PageUptodate(page))) { | 782 | if (unlikely(!PageUptodate(page))) { |
| 719 | int uptodate = 1; | 783 | int uptodate = 1; |
| 720 | do { | 784 | do { |
| @@ -730,7 +794,6 @@ lock_retry_remap: | |||
| 730 | 794 | ||
| 731 | /* Setup all mapped, dirty buffers for async write i/o. */ | 795 | /* Setup all mapped, dirty buffers for async write i/o. */ |
| 732 | do { | 796 | do { |
| 733 | get_bh(bh); | ||
| 734 | if (buffer_mapped(bh) && buffer_dirty(bh)) { | 797 | if (buffer_mapped(bh) && buffer_dirty(bh)) { |
| 735 | lock_buffer(bh); | 798 | lock_buffer(bh); |
| 736 | if (test_clear_buffer_dirty(bh)) { | 799 | if (test_clear_buffer_dirty(bh)) { |
| @@ -768,14 +831,8 @@ lock_retry_remap: | |||
| 768 | 831 | ||
| 769 | BUG_ON(PageWriteback(page)); | 832 | BUG_ON(PageWriteback(page)); |
| 770 | set_page_writeback(page); /* Keeps try_to_free_buffers() away. */ | 833 | set_page_writeback(page); /* Keeps try_to_free_buffers() away. */ |
| 771 | unlock_page(page); | ||
| 772 | 834 | ||
| 773 | /* | 835 | /* Submit the prepared buffers for i/o. */ |
| 774 | * Submit the prepared buffers for i/o. Note the page is unlocked, | ||
| 775 | * and the async write i/o completion handler can end_page_writeback() | ||
| 776 | * at any time after the *first* submit_bh(). So the buffers can then | ||
| 777 | * disappear... | ||
| 778 | */ | ||
| 779 | need_end_writeback = TRUE; | 836 | need_end_writeback = TRUE; |
| 780 | do { | 837 | do { |
| 781 | struct buffer_head *next = bh->b_this_page; | 838 | struct buffer_head *next = bh->b_this_page; |
| @@ -783,9 +840,9 @@ lock_retry_remap: | |||
| 783 | submit_bh(WRITE, bh); | 840 | submit_bh(WRITE, bh); |
| 784 | need_end_writeback = FALSE; | 841 | need_end_writeback = FALSE; |
| 785 | } | 842 | } |
| 786 | put_bh(bh); | ||
| 787 | bh = next; | 843 | bh = next; |
| 788 | } while (bh != head); | 844 | } while (bh != head); |
| 845 | unlock_page(page); | ||
| 789 | 846 | ||
| 790 | /* If no i/o was started, need to end_page_writeback(). */ | 847 | /* If no i/o was started, need to end_page_writeback(). */ |
| 791 | if (unlikely(need_end_writeback)) | 848 | if (unlikely(need_end_writeback)) |
| @@ -860,7 +917,6 @@ static int ntfs_write_mst_block(struct page *page, | |||
| 860 | sync = (wbc->sync_mode == WB_SYNC_ALL); | 917 | sync = (wbc->sync_mode == WB_SYNC_ALL); |
| 861 | 918 | ||
| 862 | /* Make sure we have mapped buffers. */ | 919 | /* Make sure we have mapped buffers. */ |
| 863 | BUG_ON(!page_has_buffers(page)); | ||
| 864 | bh = head = page_buffers(page); | 920 | bh = head = page_buffers(page); |
| 865 | BUG_ON(!bh); | 921 | BUG_ON(!bh); |
| 866 | 922 | ||
| @@ -1280,38 +1336,42 @@ retry_writepage: | |||
| 1280 | ntfs_debug("Write outside i_size - truncated?"); | 1336 | ntfs_debug("Write outside i_size - truncated?"); |
| 1281 | return 0; | 1337 | return 0; |
| 1282 | } | 1338 | } |
| 1339 | /* | ||
| 1340 | * Only $DATA attributes can be encrypted and only unnamed $DATA | ||
| 1341 | * attributes can be compressed. Index root can have the flags set but | ||
| 1342 | * this means to create compressed/encrypted files, not that the | ||
| 1343 | * attribute is compressed/encrypted. | ||
| 1344 | */ | ||
| 1345 | if (ni->type != AT_INDEX_ROOT) { | ||
| 1346 | /* If file is encrypted, deny access, just like NT4. */ | ||
| 1347 | if (NInoEncrypted(ni)) { | ||
| 1348 | unlock_page(page); | ||
| 1349 | BUG_ON(ni->type != AT_DATA); | ||
| 1350 | ntfs_debug("Denying write access to encrypted " | ||
| 1351 | "file."); | ||
| 1352 | return -EACCES; | ||
| 1353 | } | ||
| 1354 | /* Compressed data streams are handled in compress.c. */ | ||
| 1355 | if (NInoNonResident(ni) && NInoCompressed(ni)) { | ||
| 1356 | BUG_ON(ni->type != AT_DATA); | ||
| 1357 | BUG_ON(ni->name_len); | ||
| 1358 | // TODO: Implement and replace this with | ||
| 1359 | // return ntfs_write_compressed_block(page); | ||
| 1360 | unlock_page(page); | ||
| 1361 | ntfs_error(vi->i_sb, "Writing to compressed files is " | ||
| 1362 | "not supported yet. Sorry."); | ||
| 1363 | return -EOPNOTSUPP; | ||
| 1364 | } | ||
| 1365 | // TODO: Implement and remove this check. | ||
| 1366 | if (NInoNonResident(ni) && NInoSparse(ni)) { | ||
| 1367 | unlock_page(page); | ||
| 1368 | ntfs_error(vi->i_sb, "Writing to sparse files is not " | ||
| 1369 | "supported yet. Sorry."); | ||
| 1370 | return -EOPNOTSUPP; | ||
| 1371 | } | ||
| 1372 | } | ||
| 1283 | /* NInoNonResident() == NInoIndexAllocPresent() */ | 1373 | /* NInoNonResident() == NInoIndexAllocPresent() */ |
| 1284 | if (NInoNonResident(ni)) { | 1374 | if (NInoNonResident(ni)) { |
| 1285 | /* | ||
| 1286 | * Only unnamed $DATA attributes can be compressed, encrypted, | ||
| 1287 | * and/or sparse. | ||
| 1288 | */ | ||
| 1289 | if (ni->type == AT_DATA && !ni->name_len) { | ||
| 1290 | /* If file is encrypted, deny access, just like NT4. */ | ||
| 1291 | if (NInoEncrypted(ni)) { | ||
| 1292 | unlock_page(page); | ||
| 1293 | ntfs_debug("Denying write access to encrypted " | ||
| 1294 | "file."); | ||
| 1295 | return -EACCES; | ||
| 1296 | } | ||
| 1297 | /* Compressed data streams are handled in compress.c. */ | ||
| 1298 | if (NInoCompressed(ni)) { | ||
| 1299 | // TODO: Implement and replace this check with | ||
| 1300 | // return ntfs_write_compressed_block(page); | ||
| 1301 | unlock_page(page); | ||
| 1302 | ntfs_error(vi->i_sb, "Writing to compressed " | ||
| 1303 | "files is not supported yet. " | ||
| 1304 | "Sorry."); | ||
| 1305 | return -EOPNOTSUPP; | ||
| 1306 | } | ||
| 1307 | // TODO: Implement and remove this check. | ||
| 1308 | if (NInoSparse(ni)) { | ||
| 1309 | unlock_page(page); | ||
| 1310 | ntfs_error(vi->i_sb, "Writing to sparse files " | ||
| 1311 | "is not supported yet. Sorry."); | ||
| 1312 | return -EOPNOTSUPP; | ||
| 1313 | } | ||
| 1314 | } | ||
| 1315 | /* We have to zero every time due to mmap-at-end-of-file. */ | 1375 | /* We have to zero every time due to mmap-at-end-of-file. */ |
| 1316 | if (page->index >= (i_size >> PAGE_CACHE_SHIFT)) { | 1376 | if (page->index >= (i_size >> PAGE_CACHE_SHIFT)) { |
| 1317 | /* The page straddles i_size. */ | 1377 | /* The page straddles i_size. */ |
| @@ -1324,14 +1384,16 @@ retry_writepage: | |||
| 1324 | /* Handle mst protected attributes. */ | 1384 | /* Handle mst protected attributes. */ |
| 1325 | if (NInoMstProtected(ni)) | 1385 | if (NInoMstProtected(ni)) |
| 1326 | return ntfs_write_mst_block(page, wbc); | 1386 | return ntfs_write_mst_block(page, wbc); |
| 1327 | /* Normal data stream. */ | 1387 | /* Normal, non-resident data stream. */ |
| 1328 | return ntfs_write_block(page, wbc); | 1388 | return ntfs_write_block(page, wbc); |
| 1329 | } | 1389 | } |
| 1330 | /* | 1390 | /* |
| 1331 | * Attribute is resident, implying it is not compressed, encrypted, | 1391 | * Attribute is resident, implying it is not compressed, encrypted, or |
| 1332 | * sparse, or mst protected. This also means the attribute is smaller | 1392 | * mst protected. This also means the attribute is smaller than an mft |
| 1333 | * than an mft record and hence smaller than a page, so can simply | 1393 | * record and hence smaller than a page, so can simply return error on |
| 1334 | * return error on any pages with index above 0. | 1394 | * any pages with index above 0. Note the attribute can actually be |
| 1395 | * marked compressed but if it is resident the actual data is not | ||
| 1396 | * compressed so we are ok to ignore the compressed flag here. | ||
| 1335 | */ | 1397 | */ |
| 1336 | BUG_ON(page_has_buffers(page)); | 1398 | BUG_ON(page_has_buffers(page)); |
| 1337 | BUG_ON(!PageUptodate(page)); | 1399 | BUG_ON(!PageUptodate(page)); |
| @@ -1380,30 +1442,14 @@ retry_writepage: | |||
| 1380 | BUG_ON(PageWriteback(page)); | 1442 | BUG_ON(PageWriteback(page)); |
| 1381 | set_page_writeback(page); | 1443 | set_page_writeback(page); |
| 1382 | unlock_page(page); | 1444 | unlock_page(page); |
| 1383 | |||
| 1384 | /* | 1445 | /* |
| 1385 | * Here, we don't need to zero the out of bounds area everytime because | 1446 | * Here, we do not need to zero the out of bounds area everytime |
| 1386 | * the below memcpy() already takes care of the mmap-at-end-of-file | 1447 | * because the below memcpy() already takes care of the |
| 1387 | * requirements. If the file is converted to a non-resident one, then | 1448 | * mmap-at-end-of-file requirements. If the file is converted to a |
| 1388 | * the code path use is switched to the non-resident one where the | 1449 | * non-resident one, then the code path use is switched to the |
| 1389 | * zeroing happens on each ntfs_writepage() invocation. | 1450 | * non-resident one where the zeroing happens on each ntfs_writepage() |
| 1390 | * | 1451 | * invocation. |
| 1391 | * The above also applies nicely when i_size is decreased. | ||
| 1392 | * | ||
| 1393 | * When i_size is increased, the memory between the old and new i_size | ||
| 1394 | * _must_ be zeroed (or overwritten with new data). Otherwise we will | ||
| 1395 | * expose data to userspace/disk which should never have been exposed. | ||
| 1396 | * | ||
| 1397 | * FIXME: Ensure that i_size increases do the zeroing/overwriting and | ||
| 1398 | * if we cannot guarantee that, then enable the zeroing below. If the | ||
| 1399 | * zeroing below is enabled, we MUST move the unlock_page() from above | ||
| 1400 | * to after the kunmap_atomic(), i.e. just before the | ||
| 1401 | * end_page_writeback(). | ||
| 1402 | * UPDATE: ntfs_prepare/commit_write() do the zeroing on i_size | ||
| 1403 | * increases for resident attributes so those are ok. | ||
| 1404 | * TODO: ntfs_truncate(), others? | ||
| 1405 | */ | 1452 | */ |
| 1406 | |||
| 1407 | attr_len = le32_to_cpu(ctx->attr->data.resident.value_length); | 1453 | attr_len = le32_to_cpu(ctx->attr->data.resident.value_length); |
| 1408 | i_size = i_size_read(vi); | 1454 | i_size = i_size_read(vi); |
| 1409 | if (unlikely(attr_len > i_size)) { | 1455 | if (unlikely(attr_len > i_size)) { |
| @@ -1681,27 +1727,25 @@ lock_retry_remap: | |||
| 1681 | if (likely(!err)) | 1727 | if (likely(!err)) |
| 1682 | goto lock_retry_remap; | 1728 | goto lock_retry_remap; |
| 1683 | rl = NULL; | 1729 | rl = NULL; |
| 1684 | lcn = err; | ||
| 1685 | } else if (!rl) | 1730 | } else if (!rl) |
| 1686 | up_read(&ni->runlist.lock); | 1731 | up_read(&ni->runlist.lock); |
| 1687 | /* | 1732 | /* |
| 1688 | * Failed to map the buffer, even after | 1733 | * Failed to map the buffer, even after |
| 1689 | * retrying. | 1734 | * retrying. |
| 1690 | */ | 1735 | */ |
| 1736 | if (!err) | ||
| 1737 | err = -EIO; | ||
| 1691 | bh->b_blocknr = -1; | 1738 | bh->b_blocknr = -1; |
| 1692 | ntfs_error(vol->sb, "Failed to write to inode " | 1739 | ntfs_error(vol->sb, "Failed to write to inode " |
| 1693 | "0x%lx, attribute type 0x%x, " | 1740 | "0x%lx, attribute type 0x%x, " |
| 1694 | "vcn 0x%llx, offset 0x%x " | 1741 | "vcn 0x%llx, offset 0x%x " |
| 1695 | "because its location on disk " | 1742 | "because its location on disk " |
| 1696 | "could not be determined%s " | 1743 | "could not be determined%s " |
| 1697 | "(error code %lli).", | 1744 | "(error code %i).", |
| 1698 | ni->mft_no, ni->type, | 1745 | ni->mft_no, ni->type, |
| 1699 | (unsigned long long)vcn, | 1746 | (unsigned long long)vcn, |
| 1700 | vcn_ofs, is_retry ? " even " | 1747 | vcn_ofs, is_retry ? " even " |
| 1701 | "after retrying" : "", | 1748 | "after retrying" : "", err); |
| 1702 | (long long)lcn); | ||
| 1703 | if (!err) | ||
| 1704 | err = -EIO; | ||
| 1705 | goto err_out; | 1749 | goto err_out; |
| 1706 | } | 1750 | } |
| 1707 | /* We now have a successful remap, i.e. lcn >= 0. */ | 1751 | /* We now have a successful remap, i.e. lcn >= 0. */ |
| @@ -2357,6 +2401,7 @@ void mark_ntfs_record_dirty(struct page *page, const unsigned int ofs) { | |||
| 2357 | buffers_to_free = bh; | 2401 | buffers_to_free = bh; |
| 2358 | } | 2402 | } |
| 2359 | bh = head = page_buffers(page); | 2403 | bh = head = page_buffers(page); |
| 2404 | BUG_ON(!bh); | ||
| 2360 | do { | 2405 | do { |
| 2361 | bh_ofs = bh_offset(bh); | 2406 | bh_ofs = bh_offset(bh); |
| 2362 | if (bh_ofs + bh_size <= ofs) | 2407 | if (bh_ofs + bh_size <= ofs) |
diff --git a/fs/ntfs/attrib.c b/fs/ntfs/attrib.c index cd0f9e740b14..3f9a4ff42ee5 100644 --- a/fs/ntfs/attrib.c +++ b/fs/ntfs/attrib.c | |||
| @@ -43,6 +43,9 @@ | |||
| 43 | * which is not an error as such. This is -ENOENT. It means that @vcn is out | 43 | * which is not an error as such. This is -ENOENT. It means that @vcn is out |
| 44 | * of bounds of the runlist. | 44 | * of bounds of the runlist. |
| 45 | * | 45 | * |
| 46 | * Note the runlist can be NULL after this function returns if @vcn is zero and | ||
| 47 | * the attribute has zero allocated size, i.e. there simply is no runlist. | ||
| 48 | * | ||
| 46 | * Locking: - The runlist must be locked for writing. | 49 | * Locking: - The runlist must be locked for writing. |
| 47 | * - This function modifies the runlist. | 50 | * - This function modifies the runlist. |
| 48 | */ | 51 | */ |
| @@ -54,6 +57,7 @@ int ntfs_map_runlist_nolock(ntfs_inode *ni, VCN vcn) | |||
| 54 | ATTR_RECORD *a; | 57 | ATTR_RECORD *a; |
| 55 | ntfs_attr_search_ctx *ctx; | 58 | ntfs_attr_search_ctx *ctx; |
| 56 | runlist_element *rl; | 59 | runlist_element *rl; |
| 60 | unsigned long flags; | ||
| 57 | int err = 0; | 61 | int err = 0; |
| 58 | 62 | ||
| 59 | ntfs_debug("Mapping runlist part containing vcn 0x%llx.", | 63 | ntfs_debug("Mapping runlist part containing vcn 0x%llx.", |
| @@ -85,8 +89,11 @@ int ntfs_map_runlist_nolock(ntfs_inode *ni, VCN vcn) | |||
| 85 | * ntfs_mapping_pairs_decompress() fails. | 89 | * ntfs_mapping_pairs_decompress() fails. |
| 86 | */ | 90 | */ |
| 87 | end_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn) + 1; | 91 | end_vcn = sle64_to_cpu(a->data.non_resident.highest_vcn) + 1; |
| 88 | if (unlikely(!a->data.non_resident.lowest_vcn && end_vcn <= 1)) | 92 | if (unlikely(!a->data.non_resident.lowest_vcn && end_vcn <= 1)) { |
| 93 | read_lock_irqsave(&ni->size_lock, flags); | ||
| 89 | end_vcn = ni->allocated_size >> ni->vol->cluster_size_bits; | 94 | end_vcn = ni->allocated_size >> ni->vol->cluster_size_bits; |
| 95 | read_unlock_irqrestore(&ni->size_lock, flags); | ||
| 96 | } | ||
| 90 | if (unlikely(vcn >= end_vcn)) { | 97 | if (unlikely(vcn >= end_vcn)) { |
| 91 | err = -ENOENT; | 98 | err = -ENOENT; |
| 92 | goto err_out; | 99 | goto err_out; |
| @@ -165,6 +172,7 @@ LCN ntfs_attr_vcn_to_lcn_nolock(ntfs_inode *ni, const VCN vcn, | |||
| 165 | const BOOL write_locked) | 172 | const BOOL write_locked) |
| 166 | { | 173 | { |
| 167 | LCN lcn; | 174 | LCN lcn; |
| 175 | unsigned long flags; | ||
| 168 | BOOL is_retry = FALSE; | 176 | BOOL is_retry = FALSE; |
| 169 | 177 | ||
| 170 | ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, %s_locked.", | 178 | ntfs_debug("Entering for i_ino 0x%lx, vcn 0x%llx, %s_locked.", |
| @@ -173,6 +181,14 @@ LCN ntfs_attr_vcn_to_lcn_nolock(ntfs_inode *ni, const VCN vcn, | |||
| 173 | BUG_ON(!ni); | 181 | BUG_ON(!ni); |
| 174 | BUG_ON(!NInoNonResident(ni)); | 182 | BUG_ON(!NInoNonResident(ni)); |
| 175 | BUG_ON(vcn < 0); | 183 | BUG_ON(vcn < 0); |
| 184 | if (!ni->runlist.rl) { | ||
| 185 | read_lock_irqsave(&ni->size_lock, flags); | ||
| 186 | if (!ni->allocated_size) { | ||
| 187 | read_unlock_irqrestore(&ni->size_lock, flags); | ||
| 188 | return LCN_ENOENT; | ||
| 189 | } | ||
| 190 | read_unlock_irqrestore(&ni->size_lock, flags); | ||
| 191 | } | ||
| 176 | retry_remap: | 192 | retry_remap: |
| 177 | /* Convert vcn to lcn. If that fails map the runlist and retry once. */ | 193 | /* Convert vcn to lcn. If that fails map the runlist and retry once. */ |
| 178 | lcn = ntfs_rl_vcn_to_lcn(ni->runlist.rl, vcn); | 194 | lcn = ntfs_rl_vcn_to_lcn(ni->runlist.rl, vcn); |
| @@ -255,6 +271,7 @@ retry_remap: | |||
| 255 | runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, | 271 | runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, |
| 256 | const BOOL write_locked) | 272 | const BOOL write_locked) |
| 257 | { | 273 | { |
| 274 | unsigned long flags; | ||
| 258 | runlist_element *rl; | 275 | runlist_element *rl; |
| 259 | int err = 0; | 276 | int err = 0; |
| 260 | BOOL is_retry = FALSE; | 277 | BOOL is_retry = FALSE; |
| @@ -265,6 +282,14 @@ runlist_element *ntfs_attr_find_vcn_nolock(ntfs_inode *ni, const VCN vcn, | |||
| 265 | BUG_ON(!ni); | 282 | BUG_ON(!ni); |
| 266 | BUG_ON(!NInoNonResident(ni)); | 283 | BUG_ON(!NInoNonResident(ni)); |
| 267 | BUG_ON(vcn < 0); | 284 | BUG_ON(vcn < 0); |
| 285 | if (!ni->runlist.rl) { | ||
| 286 | read_lock_irqsave(&ni->size_lock, flags); | ||
| 287 | if (!ni->allocated_size) { | ||
| 288 | read_unlock_irqrestore(&ni->size_lock, flags); | ||
| 289 | return ERR_PTR(-ENOENT); | ||
| 290 | } | ||
| 291 | read_unlock_irqrestore(&ni->size_lock, flags); | ||
| 292 | } | ||
| 268 | retry_remap: | 293 | retry_remap: |
| 269 | rl = ni->runlist.rl; | 294 | rl = ni->runlist.rl; |
| 270 | if (likely(rl && vcn >= rl[0].vcn)) { | 295 | if (likely(rl && vcn >= rl[0].vcn)) { |
| @@ -528,6 +553,11 @@ int load_attribute_list(ntfs_volume *vol, runlist *runlist, u8 *al_start, | |||
| 528 | block_size_bits = sb->s_blocksize_bits; | 553 | block_size_bits = sb->s_blocksize_bits; |
| 529 | down_read(&runlist->lock); | 554 | down_read(&runlist->lock); |
| 530 | rl = runlist->rl; | 555 | rl = runlist->rl; |
| 556 | if (!rl) { | ||
| 557 | ntfs_error(sb, "Cannot read attribute list since runlist is " | ||
| 558 | "missing."); | ||
| 559 | goto err_out; | ||
| 560 | } | ||
| 531 | /* Read all clusters specified by the runlist one run at a time. */ | 561 | /* Read all clusters specified by the runlist one run at a time. */ |
| 532 | while (rl->length) { | 562 | while (rl->length) { |
| 533 | lcn = ntfs_rl_vcn_to_lcn(rl, rl->vcn); | 563 | lcn = ntfs_rl_vcn_to_lcn(rl, rl->vcn); |
| @@ -1247,6 +1277,46 @@ int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size) | |||
| 1247 | } | 1277 | } |
| 1248 | 1278 | ||
| 1249 | /** | 1279 | /** |
| 1280 | * ntfs_resident_attr_value_resize - resize the value of a resident attribute | ||
| 1281 | * @m: mft record containing attribute record | ||
| 1282 | * @a: attribute record whose value to resize | ||
| 1283 | * @new_size: new size in bytes to which to resize the attribute value of @a | ||
| 1284 | * | ||
| 1285 | * Resize the value of the attribute @a in the mft record @m to @new_size bytes. | ||
| 1286 | * If the value is made bigger, the newly allocated space is cleared. | ||
| 1287 | * | ||
| 1288 | * Return 0 on success and -errno on error. The following error codes are | ||
| 1289 | * defined: | ||
| 1290 | * -ENOSPC - Not enough space in the mft record @m to perform the resize. | ||
| 1291 | * | ||
| 1292 | * Note: On error, no modifications have been performed whatsoever. | ||
| 1293 | * | ||
| 1294 | * Warning: If you make a record smaller without having copied all the data you | ||
| 1295 | * are interested in the data may be overwritten. | ||
| 1296 | */ | ||
| 1297 | int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, | ||
| 1298 | const u32 new_size) | ||
| 1299 | { | ||
| 1300 | u32 old_size; | ||
| 1301 | |||
| 1302 | /* Resize the resident part of the attribute record. */ | ||
| 1303 | if (ntfs_attr_record_resize(m, a, | ||
| 1304 | le16_to_cpu(a->data.resident.value_offset) + new_size)) | ||
| 1305 | return -ENOSPC; | ||
| 1306 | /* | ||
| 1307 | * The resize succeeded! If we made the attribute value bigger, clear | ||
| 1308 | * the area between the old size and @new_size. | ||
| 1309 | */ | ||
| 1310 | old_size = le32_to_cpu(a->data.resident.value_length); | ||
| 1311 | if (new_size > old_size) | ||
| 1312 | memset((u8*)a + le16_to_cpu(a->data.resident.value_offset) + | ||
| 1313 | old_size, 0, new_size - old_size); | ||
| 1314 | /* Finally update the length of the attribute value. */ | ||
| 1315 | a->data.resident.value_length = cpu_to_le32(new_size); | ||
| 1316 | return 0; | ||
| 1317 | } | ||
| 1318 | |||
| 1319 | /** | ||
| 1250 | * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute | 1320 | * ntfs_attr_make_non_resident - convert a resident to a non-resident attribute |
| 1251 | * @ni: ntfs inode describing the attribute to convert | 1321 | * @ni: ntfs inode describing the attribute to convert |
| 1252 | * | 1322 | * |
| @@ -1302,6 +1372,12 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) | |||
| 1302 | return err; | 1372 | return err; |
| 1303 | } | 1373 | } |
| 1304 | /* | 1374 | /* |
| 1375 | * FIXME: Compressed and encrypted attributes are not supported when | ||
| 1376 | * writing and we should never have gotten here for them. | ||
| 1377 | */ | ||
| 1378 | BUG_ON(NInoCompressed(ni)); | ||
| 1379 | BUG_ON(NInoEncrypted(ni)); | ||
| 1380 | /* | ||
| 1305 | * The size needs to be aligned to a cluster boundary for allocation | 1381 | * The size needs to be aligned to a cluster boundary for allocation |
| 1306 | * purposes. | 1382 | * purposes. |
| 1307 | */ | 1383 | */ |
| @@ -1377,10 +1453,15 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) | |||
| 1377 | BUG_ON(a->non_resident); | 1453 | BUG_ON(a->non_resident); |
| 1378 | /* | 1454 | /* |
| 1379 | * Calculate new offsets for the name and the mapping pairs array. | 1455 | * Calculate new offsets for the name and the mapping pairs array. |
| 1380 | * We assume the attribute is not compressed or sparse. | ||
| 1381 | */ | 1456 | */ |
| 1382 | name_ofs = (offsetof(ATTR_REC, | 1457 | if (NInoSparse(ni) || NInoCompressed(ni)) |
| 1383 | data.non_resident.compressed_size) + 7) & ~7; | 1458 | name_ofs = (offsetof(ATTR_REC, |
| 1459 | data.non_resident.compressed_size) + | ||
| 1460 | sizeof(a->data.non_resident.compressed_size) + | ||
| 1461 | 7) & ~7; | ||
| 1462 | else | ||
| 1463 | name_ofs = (offsetof(ATTR_REC, | ||
| 1464 | data.non_resident.compressed_size) + 7) & ~7; | ||
| 1384 | mp_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7; | 1465 | mp_ofs = (name_ofs + a->name_length * sizeof(ntfschar) + 7) & ~7; |
| 1385 | /* | 1466 | /* |
| 1386 | * Determine the size of the resident part of the now non-resident | 1467 | * Determine the size of the resident part of the now non-resident |
| @@ -1419,24 +1500,23 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) | |||
| 1419 | memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset), | 1500 | memmove((u8*)a + name_ofs, (u8*)a + le16_to_cpu(a->name_offset), |
| 1420 | a->name_length * sizeof(ntfschar)); | 1501 | a->name_length * sizeof(ntfschar)); |
| 1421 | a->name_offset = cpu_to_le16(name_ofs); | 1502 | a->name_offset = cpu_to_le16(name_ofs); |
| 1422 | /* | ||
| 1423 | * FIXME: For now just clear all of these as we do not support them | ||
| 1424 | * when writing. | ||
| 1425 | */ | ||
| 1426 | a->flags &= cpu_to_le16(0xffff & ~le16_to_cpu(ATTR_IS_SPARSE | | ||
| 1427 | ATTR_IS_ENCRYPTED | ATTR_COMPRESSION_MASK)); | ||
| 1428 | /* Setup the fields specific to non-resident attributes. */ | 1503 | /* Setup the fields specific to non-resident attributes. */ |
| 1429 | a->data.non_resident.lowest_vcn = 0; | 1504 | a->data.non_resident.lowest_vcn = 0; |
| 1430 | a->data.non_resident.highest_vcn = cpu_to_sle64((new_size - 1) >> | 1505 | a->data.non_resident.highest_vcn = cpu_to_sle64((new_size - 1) >> |
| 1431 | vol->cluster_size_bits); | 1506 | vol->cluster_size_bits); |
| 1432 | a->data.non_resident.mapping_pairs_offset = cpu_to_le16(mp_ofs); | 1507 | a->data.non_resident.mapping_pairs_offset = cpu_to_le16(mp_ofs); |
| 1433 | a->data.non_resident.compression_unit = 0; | ||
| 1434 | memset(&a->data.non_resident.reserved, 0, | 1508 | memset(&a->data.non_resident.reserved, 0, |
| 1435 | sizeof(a->data.non_resident.reserved)); | 1509 | sizeof(a->data.non_resident.reserved)); |
| 1436 | a->data.non_resident.allocated_size = cpu_to_sle64(new_size); | 1510 | a->data.non_resident.allocated_size = cpu_to_sle64(new_size); |
| 1437 | a->data.non_resident.data_size = | 1511 | a->data.non_resident.data_size = |
| 1438 | a->data.non_resident.initialized_size = | 1512 | a->data.non_resident.initialized_size = |
| 1439 | cpu_to_sle64(attr_size); | 1513 | cpu_to_sle64(attr_size); |
| 1514 | if (NInoSparse(ni) || NInoCompressed(ni)) { | ||
| 1515 | a->data.non_resident.compression_unit = 4; | ||
| 1516 | a->data.non_resident.compressed_size = | ||
| 1517 | a->data.non_resident.allocated_size; | ||
| 1518 | } else | ||
| 1519 | a->data.non_resident.compression_unit = 0; | ||
| 1440 | /* Generate the mapping pairs array into the attribute record. */ | 1520 | /* Generate the mapping pairs array into the attribute record. */ |
| 1441 | err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs, | 1521 | err = ntfs_mapping_pairs_build(vol, (u8*)a + mp_ofs, |
| 1442 | arec_size - mp_ofs, rl, 0, -1, NULL); | 1522 | arec_size - mp_ofs, rl, 0, -1, NULL); |
| @@ -1446,16 +1526,19 @@ int ntfs_attr_make_non_resident(ntfs_inode *ni) | |||
| 1446 | goto undo_err_out; | 1526 | goto undo_err_out; |
| 1447 | } | 1527 | } |
| 1448 | /* Setup the in-memory attribute structure to be non-resident. */ | 1528 | /* Setup the in-memory attribute structure to be non-resident. */ |
| 1449 | /* | ||
| 1450 | * FIXME: For now just clear all of these as we do not support them | ||
| 1451 | * when writing. | ||
| 1452 | */ | ||
| 1453 | NInoClearSparse(ni); | ||
| 1454 | NInoClearEncrypted(ni); | ||
| 1455 | NInoClearCompressed(ni); | ||
| 1456 | ni->runlist.rl = rl; | 1529 | ni->runlist.rl = rl; |
| 1457 | write_lock_irqsave(&ni->size_lock, flags); | 1530 | write_lock_irqsave(&ni->size_lock, flags); |
| 1458 | ni->allocated_size = new_size; | 1531 | ni->allocated_size = new_size; |
| 1532 | if (NInoSparse(ni) || NInoCompressed(ni)) { | ||
| 1533 | ni->itype.compressed.size = ni->allocated_size; | ||
| 1534 | ni->itype.compressed.block_size = 1U << | ||
| 1535 | (a->data.non_resident.compression_unit + | ||
| 1536 | vol->cluster_size_bits); | ||
| 1537 | ni->itype.compressed.block_size_bits = | ||
| 1538 | ffs(ni->itype.compressed.block_size) - 1; | ||
| 1539 | ni->itype.compressed.block_clusters = 1U << | ||
| 1540 | a->data.non_resident.compression_unit; | ||
| 1541 | } | ||
| 1459 | write_unlock_irqrestore(&ni->size_lock, flags); | 1542 | write_unlock_irqrestore(&ni->size_lock, flags); |
| 1460 | /* | 1543 | /* |
| 1461 | * This needs to be last since the address space operations ->readpage | 1544 | * This needs to be last since the address space operations ->readpage |
| @@ -1603,6 +1686,12 @@ int ntfs_attr_set(ntfs_inode *ni, const s64 ofs, const s64 cnt, const u8 val) | |||
| 1603 | BUG_ON(cnt < 0); | 1686 | BUG_ON(cnt < 0); |
| 1604 | if (!cnt) | 1687 | if (!cnt) |
| 1605 | goto done; | 1688 | goto done; |
| 1689 | /* | ||
| 1690 | * FIXME: Compressed and encrypted attributes are not supported when | ||
| 1691 | * writing and we should never have gotten here for them. | ||
| 1692 | */ | ||
| 1693 | BUG_ON(NInoCompressed(ni)); | ||
| 1694 | BUG_ON(NInoEncrypted(ni)); | ||
| 1606 | mapping = VFS_I(ni)->i_mapping; | 1695 | mapping = VFS_I(ni)->i_mapping; |
| 1607 | /* Work out the starting index and page offset. */ | 1696 | /* Work out the starting index and page offset. */ |
| 1608 | idx = ofs >> PAGE_CACHE_SHIFT; | 1697 | idx = ofs >> PAGE_CACHE_SHIFT; |
diff --git a/fs/ntfs/attrib.h b/fs/ntfs/attrib.h index 0e4ac6d3c0e7..0618ed6fd7b3 100644 --- a/fs/ntfs/attrib.h +++ b/fs/ntfs/attrib.h | |||
| @@ -99,6 +99,8 @@ extern int ntfs_attr_can_be_resident(const ntfs_volume *vol, | |||
| 99 | const ATTR_TYPE type); | 99 | const ATTR_TYPE type); |
| 100 | 100 | ||
| 101 | extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size); | 101 | extern int ntfs_attr_record_resize(MFT_RECORD *m, ATTR_RECORD *a, u32 new_size); |
| 102 | extern int ntfs_resident_attr_value_resize(MFT_RECORD *m, ATTR_RECORD *a, | ||
| 103 | const u32 new_size); | ||
| 102 | 104 | ||
| 103 | extern int ntfs_attr_make_non_resident(ntfs_inode *ni); | 105 | extern int ntfs_attr_make_non_resident(ntfs_inode *ni); |
| 104 | 106 | ||
diff --git a/fs/ntfs/compress.c b/fs/ntfs/compress.c index 6d265cfd49aa..25d24106f893 100644 --- a/fs/ntfs/compress.c +++ b/fs/ntfs/compress.c | |||
| @@ -539,7 +539,6 @@ int ntfs_read_compressed_block(struct page *page) | |||
| 539 | if (unlikely(!pages || !bhs)) { | 539 | if (unlikely(!pages || !bhs)) { |
| 540 | kfree(bhs); | 540 | kfree(bhs); |
| 541 | kfree(pages); | 541 | kfree(pages); |
| 542 | SetPageError(page); | ||
| 543 | unlock_page(page); | 542 | unlock_page(page); |
| 544 | ntfs_error(vol->sb, "Failed to allocate internal buffers."); | 543 | ntfs_error(vol->sb, "Failed to allocate internal buffers."); |
| 545 | return -ENOMEM; | 544 | return -ENOMEM; |
| @@ -871,9 +870,6 @@ lock_retry_remap: | |||
| 871 | for (; prev_cur_page < cur_page; prev_cur_page++) { | 870 | for (; prev_cur_page < cur_page; prev_cur_page++) { |
| 872 | page = pages[prev_cur_page]; | 871 | page = pages[prev_cur_page]; |
| 873 | if (page) { | 872 | if (page) { |
| 874 | if (prev_cur_page == xpage && | ||
| 875 | !xpage_done) | ||
| 876 | SetPageError(page); | ||
| 877 | flush_dcache_page(page); | 873 | flush_dcache_page(page); |
| 878 | kunmap(page); | 874 | kunmap(page); |
| 879 | unlock_page(page); | 875 | unlock_page(page); |
| @@ -904,8 +900,6 @@ lock_retry_remap: | |||
| 904 | "Terminating them with extreme " | 900 | "Terminating them with extreme " |
| 905 | "prejudice. Inode 0x%lx, page index " | 901 | "prejudice. Inode 0x%lx, page index " |
| 906 | "0x%lx.", ni->mft_no, page->index); | 902 | "0x%lx.", ni->mft_no, page->index); |
| 907 | if (cur_page == xpage && !xpage_done) | ||
| 908 | SetPageError(page); | ||
| 909 | flush_dcache_page(page); | 903 | flush_dcache_page(page); |
| 910 | kunmap(page); | 904 | kunmap(page); |
| 911 | unlock_page(page); | 905 | unlock_page(page); |
| @@ -953,8 +947,6 @@ err_out: | |||
| 953 | for (i = cur_page; i < max_page; i++) { | 947 | for (i = cur_page; i < max_page; i++) { |
| 954 | page = pages[i]; | 948 | page = pages[i]; |
| 955 | if (page) { | 949 | if (page) { |
| 956 | if (i == xpage && !xpage_done) | ||
| 957 | SetPageError(page); | ||
| 958 | flush_dcache_page(page); | 950 | flush_dcache_page(page); |
| 959 | kunmap(page); | 951 | kunmap(page); |
| 960 | unlock_page(page); | 952 | unlock_page(page); |
diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c index 46779471c542..795c3d1930f5 100644 --- a/fs/ntfs/dir.c +++ b/fs/ntfs/dir.c | |||
| @@ -1051,7 +1051,8 @@ static inline int ntfs_filldir(ntfs_volume *vol, loff_t fpos, | |||
| 1051 | ie->key.file_name.file_name_length, &name, | 1051 | ie->key.file_name.file_name_length, &name, |
| 1052 | NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1); | 1052 | NTFS_MAX_NAME_LEN * NLS_MAX_CHARSET_SIZE + 1); |
| 1053 | if (name_len <= 0) { | 1053 | if (name_len <= 0) { |
| 1054 | ntfs_debug("Skipping unrepresentable file."); | 1054 | ntfs_warning(vol->sb, "Skipping unrepresentable inode 0x%llx.", |
| 1055 | (long long)MREF_LE(ie->data.dir.indexed_file)); | ||
| 1055 | return 0; | 1056 | return 0; |
| 1056 | } | 1057 | } |
| 1057 | if (ie->key.file_name.file_attributes & | 1058 | if (ie->key.file_name.file_attributes & |
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index e0f530ce6b99..be9fd1dd423d 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. | 2 | * file.c - NTFS kernel file operations. Part of the Linux-NTFS project. |
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2001-2004 Anton Altaparmakov | 4 | * Copyright (c) 2001-2005 Anton Altaparmakov |
| 5 | * | 5 | * |
| 6 | * This program/include file is free software; you can redistribute it and/or | 6 | * This program/include file is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License as published | 7 | * modify it under the terms of the GNU General Public License as published |
| @@ -94,6 +94,11 @@ static int ntfs_file_fsync(struct file *filp, struct dentry *dentry, | |||
| 94 | if (!datasync || !NInoNonResident(NTFS_I(vi))) | 94 | if (!datasync || !NInoNonResident(NTFS_I(vi))) |
| 95 | ret = ntfs_write_inode(vi, 1); | 95 | ret = ntfs_write_inode(vi, 1); |
| 96 | write_inode_now(vi, !datasync); | 96 | write_inode_now(vi, !datasync); |
| 97 | /* | ||
| 98 | * NOTE: If we were to use mapping->private_list (see ext2 and | ||
| 99 | * fs/buffer.c) for dirty blocks then we could optimize the below to be | ||
| 100 | * sync_mapping_buffers(vi->i_mapping). | ||
| 101 | */ | ||
| 97 | err = sync_blockdev(vi->i_sb->s_bdev); | 102 | err = sync_blockdev(vi->i_sb->s_bdev); |
| 98 | if (unlikely(err && !ret)) | 103 | if (unlikely(err && !ret)) |
| 99 | ret = err; | 104 | ret = err; |
diff --git a/fs/ntfs/index.c b/fs/ntfs/index.c index 11fd5307d780..8f2d5727546f 100644 --- a/fs/ntfs/index.c +++ b/fs/ntfs/index.c | |||
| @@ -205,6 +205,7 @@ int ntfs_index_lookup(const void *key, const int key_len, | |||
| 205 | &ie->key, key_len)) { | 205 | &ie->key, key_len)) { |
| 206 | ir_done: | 206 | ir_done: |
| 207 | ictx->is_in_root = TRUE; | 207 | ictx->is_in_root = TRUE; |
| 208 | ictx->ir = ir; | ||
| 208 | ictx->actx = actx; | 209 | ictx->actx = actx; |
| 209 | ictx->base_ni = base_ni; | 210 | ictx->base_ni = base_ni; |
| 210 | ictx->ia = NULL; | 211 | ictx->ia = NULL; |
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c index 886214a77f90..dc4bbe3acf5c 100644 --- a/fs/ntfs/inode.c +++ b/fs/ntfs/inode.c | |||
| @@ -1013,41 +1013,50 @@ skip_large_dir_stuff: | |||
| 1013 | } | 1013 | } |
| 1014 | a = ctx->attr; | 1014 | a = ctx->attr; |
| 1015 | /* Setup the state. */ | 1015 | /* Setup the state. */ |
| 1016 | if (a->non_resident) { | 1016 | if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) { |
| 1017 | NInoSetNonResident(ni); | 1017 | if (a->flags & ATTR_COMPRESSION_MASK) { |
| 1018 | if (a->flags & (ATTR_COMPRESSION_MASK | | 1018 | NInoSetCompressed(ni); |
| 1019 | ATTR_IS_SPARSE)) { | 1019 | if (vol->cluster_size > 4096) { |
| 1020 | if (a->flags & ATTR_COMPRESSION_MASK) { | 1020 | ntfs_error(vi->i_sb, "Found " |
| 1021 | NInoSetCompressed(ni); | ||
| 1022 | if (vol->cluster_size > 4096) { | ||
| 1023 | ntfs_error(vi->i_sb, "Found " | ||
| 1024 | "compressed data but " | 1021 | "compressed data but " |
| 1025 | "compression is " | 1022 | "compression is " |
| 1026 | "disabled due to " | 1023 | "disabled due to " |
| 1027 | "cluster size (%i) > " | 1024 | "cluster size (%i) > " |
| 1028 | "4kiB.", | 1025 | "4kiB.", |
| 1029 | vol->cluster_size); | 1026 | vol->cluster_size); |
| 1030 | goto unm_err_out; | 1027 | goto unm_err_out; |
| 1031 | } | 1028 | } |
| 1032 | if ((a->flags & ATTR_COMPRESSION_MASK) | 1029 | if ((a->flags & ATTR_COMPRESSION_MASK) |
| 1033 | != ATTR_IS_COMPRESSED) { | 1030 | != ATTR_IS_COMPRESSED) { |
| 1034 | ntfs_error(vi->i_sb, "Found " | 1031 | ntfs_error(vi->i_sb, "Found unknown " |
| 1035 | "unknown compression " | 1032 | "compression method " |
| 1036 | "method or corrupt " | 1033 | "or corrupt file."); |
| 1037 | "file."); | 1034 | goto unm_err_out; |
| 1038 | goto unm_err_out; | ||
| 1039 | } | ||
| 1040 | } | 1035 | } |
| 1041 | if (a->flags & ATTR_IS_SPARSE) | 1036 | } |
| 1042 | NInoSetSparse(ni); | 1037 | if (a->flags & ATTR_IS_SPARSE) |
| 1038 | NInoSetSparse(ni); | ||
| 1039 | } | ||
| 1040 | if (a->flags & ATTR_IS_ENCRYPTED) { | ||
| 1041 | if (NInoCompressed(ni)) { | ||
| 1042 | ntfs_error(vi->i_sb, "Found encrypted and " | ||
| 1043 | "compressed data."); | ||
| 1044 | goto unm_err_out; | ||
| 1045 | } | ||
| 1046 | NInoSetEncrypted(ni); | ||
| 1047 | } | ||
| 1048 | if (a->non_resident) { | ||
| 1049 | NInoSetNonResident(ni); | ||
| 1050 | if (NInoCompressed(ni) || NInoSparse(ni)) { | ||
| 1043 | if (a->data.non_resident.compression_unit != | 1051 | if (a->data.non_resident.compression_unit != |
| 1044 | 4) { | 1052 | 4) { |
| 1045 | ntfs_error(vi->i_sb, "Found " | 1053 | ntfs_error(vi->i_sb, "Found " |
| 1046 | "nonstandard compression unit " | 1054 | "nonstandard " |
| 1047 | "(%u instead of 4). Cannot " | 1055 | "compression unit (%u " |
| 1048 | "handle this.", | 1056 | "instead of 4). " |
| 1049 | a->data.non_resident. | 1057 | "Cannot handle this.", |
| 1050 | compression_unit); | 1058 | a->data.non_resident. |
| 1059 | compression_unit); | ||
| 1051 | err = -EOPNOTSUPP; | 1060 | err = -EOPNOTSUPP; |
| 1052 | goto unm_err_out; | 1061 | goto unm_err_out; |
| 1053 | } | 1062 | } |
| @@ -1065,14 +1074,6 @@ skip_large_dir_stuff: | |||
| 1065 | a->data.non_resident. | 1074 | a->data.non_resident. |
| 1066 | compressed_size); | 1075 | compressed_size); |
| 1067 | } | 1076 | } |
| 1068 | if (a->flags & ATTR_IS_ENCRYPTED) { | ||
| 1069 | if (a->flags & ATTR_COMPRESSION_MASK) { | ||
| 1070 | ntfs_error(vi->i_sb, "Found encrypted " | ||
| 1071 | "and compressed data."); | ||
| 1072 | goto unm_err_out; | ||
| 1073 | } | ||
| 1074 | NInoSetEncrypted(ni); | ||
| 1075 | } | ||
| 1076 | if (a->data.non_resident.lowest_vcn) { | 1077 | if (a->data.non_resident.lowest_vcn) { |
| 1077 | ntfs_error(vi->i_sb, "First extent of $DATA " | 1078 | ntfs_error(vi->i_sb, "First extent of $DATA " |
| 1078 | "attribute has non zero " | 1079 | "attribute has non zero " |
| @@ -1212,6 +1213,75 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
| 1212 | if (unlikely(err)) | 1213 | if (unlikely(err)) |
| 1213 | goto unm_err_out; | 1214 | goto unm_err_out; |
| 1214 | a = ctx->attr; | 1215 | a = ctx->attr; |
| 1216 | if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) { | ||
| 1217 | if (a->flags & ATTR_COMPRESSION_MASK) { | ||
| 1218 | NInoSetCompressed(ni); | ||
| 1219 | if ((ni->type != AT_DATA) || (ni->type == AT_DATA && | ||
| 1220 | ni->name_len)) { | ||
| 1221 | ntfs_error(vi->i_sb, "Found compressed " | ||
| 1222 | "non-data or named data " | ||
| 1223 | "attribute. Please report " | ||
| 1224 | "you saw this message to " | ||
| 1225 | "linux-ntfs-dev@lists." | ||
| 1226 | "sourceforge.net"); | ||
| 1227 | goto unm_err_out; | ||
| 1228 | } | ||
| 1229 | if (vol->cluster_size > 4096) { | ||
| 1230 | ntfs_error(vi->i_sb, "Found compressed " | ||
| 1231 | "attribute but compression is " | ||
| 1232 | "disabled due to cluster size " | ||
| 1233 | "(%i) > 4kiB.", | ||
| 1234 | vol->cluster_size); | ||
| 1235 | goto unm_err_out; | ||
| 1236 | } | ||
| 1237 | if ((a->flags & ATTR_COMPRESSION_MASK) != | ||
| 1238 | ATTR_IS_COMPRESSED) { | ||
| 1239 | ntfs_error(vi->i_sb, "Found unknown " | ||
| 1240 | "compression method."); | ||
| 1241 | goto unm_err_out; | ||
| 1242 | } | ||
| 1243 | } | ||
| 1244 | /* | ||
| 1245 | * The encryption flag set in an index root just means to | ||
| 1246 | * compress all files. | ||
| 1247 | */ | ||
| 1248 | if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) { | ||
| 1249 | ntfs_error(vi->i_sb, "Found mst protected attribute " | ||
| 1250 | "but the attribute is %s. Please " | ||
| 1251 | "report you saw this message to " | ||
| 1252 | "linux-ntfs-dev@lists.sourceforge.net", | ||
| 1253 | NInoCompressed(ni) ? "compressed" : | ||
| 1254 | "sparse"); | ||
| 1255 | goto unm_err_out; | ||
| 1256 | } | ||
| 1257 | if (a->flags & ATTR_IS_SPARSE) | ||
| 1258 | NInoSetSparse(ni); | ||
| 1259 | } | ||
| 1260 | if (a->flags & ATTR_IS_ENCRYPTED) { | ||
| 1261 | if (NInoCompressed(ni)) { | ||
| 1262 | ntfs_error(vi->i_sb, "Found encrypted and compressed " | ||
| 1263 | "data."); | ||
| 1264 | goto unm_err_out; | ||
| 1265 | } | ||
| 1266 | /* | ||
| 1267 | * The encryption flag set in an index root just means to | ||
| 1268 | * encrypt all files. | ||
| 1269 | */ | ||
| 1270 | if (NInoMstProtected(ni) && ni->type != AT_INDEX_ROOT) { | ||
| 1271 | ntfs_error(vi->i_sb, "Found mst protected attribute " | ||
| 1272 | "but the attribute is encrypted. " | ||
| 1273 | "Please report you saw this message " | ||
| 1274 | "to linux-ntfs-dev@lists.sourceforge." | ||
| 1275 | "net"); | ||
| 1276 | goto unm_err_out; | ||
| 1277 | } | ||
| 1278 | if (ni->type != AT_DATA) { | ||
| 1279 | ntfs_error(vi->i_sb, "Found encrypted non-data " | ||
| 1280 | "attribute."); | ||
| 1281 | goto unm_err_out; | ||
| 1282 | } | ||
| 1283 | NInoSetEncrypted(ni); | ||
| 1284 | } | ||
| 1215 | if (!a->non_resident) { | 1285 | if (!a->non_resident) { |
| 1216 | /* Ensure the attribute name is placed before the value. */ | 1286 | /* Ensure the attribute name is placed before the value. */ |
| 1217 | if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >= | 1287 | if (unlikely(a->name_length && (le16_to_cpu(a->name_offset) >= |
| @@ -1220,11 +1290,10 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
| 1220 | "the attribute value."); | 1290 | "the attribute value."); |
| 1221 | goto unm_err_out; | 1291 | goto unm_err_out; |
| 1222 | } | 1292 | } |
| 1223 | if (NInoMstProtected(ni) || a->flags) { | 1293 | if (NInoMstProtected(ni)) { |
| 1224 | ntfs_error(vi->i_sb, "Found mst protected attribute " | 1294 | ntfs_error(vi->i_sb, "Found mst protected attribute " |
| 1225 | "or attribute with non-zero flags but " | 1295 | "but the attribute is resident. " |
| 1226 | "the attribute is resident. Please " | 1296 | "Please report you saw this message to " |
| 1227 | "report you saw this message to " | ||
| 1228 | "linux-ntfs-dev@lists.sourceforge.net"); | 1297 | "linux-ntfs-dev@lists.sourceforge.net"); |
| 1229 | goto unm_err_out; | 1298 | goto unm_err_out; |
| 1230 | } | 1299 | } |
| @@ -1250,50 +1319,8 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
| 1250 | "the mapping pairs array."); | 1319 | "the mapping pairs array."); |
| 1251 | goto unm_err_out; | 1320 | goto unm_err_out; |
| 1252 | } | 1321 | } |
| 1253 | if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_SPARSE)) { | 1322 | if ((NInoCompressed(ni) || NInoSparse(ni)) && |
| 1254 | if (a->flags & ATTR_COMPRESSION_MASK) { | 1323 | ni->type != AT_INDEX_ROOT) { |
| 1255 | NInoSetCompressed(ni); | ||
| 1256 | if ((ni->type != AT_DATA) || (ni->type == | ||
| 1257 | AT_DATA && ni->name_len)) { | ||
| 1258 | ntfs_error(vi->i_sb, "Found compressed " | ||
| 1259 | "non-data or named " | ||
| 1260 | "data attribute. " | ||
| 1261 | "Please report you " | ||
| 1262 | "saw this message to " | ||
| 1263 | "linux-ntfs-dev@lists." | ||
| 1264 | "sourceforge.net"); | ||
| 1265 | goto unm_err_out; | ||
| 1266 | } | ||
| 1267 | if (vol->cluster_size > 4096) { | ||
| 1268 | ntfs_error(vi->i_sb, "Found compressed " | ||
| 1269 | "attribute but " | ||
| 1270 | "compression is " | ||
| 1271 | "disabled due to " | ||
| 1272 | "cluster size (%i) > " | ||
| 1273 | "4kiB.", | ||
| 1274 | vol->cluster_size); | ||
| 1275 | goto unm_err_out; | ||
| 1276 | } | ||
| 1277 | if ((a->flags & ATTR_COMPRESSION_MASK) != | ||
| 1278 | ATTR_IS_COMPRESSED) { | ||
| 1279 | ntfs_error(vi->i_sb, "Found unknown " | ||
| 1280 | "compression method."); | ||
| 1281 | goto unm_err_out; | ||
| 1282 | } | ||
| 1283 | } | ||
| 1284 | if (NInoMstProtected(ni)) { | ||
| 1285 | ntfs_error(vi->i_sb, "Found mst protected " | ||
| 1286 | "attribute but the attribute " | ||
| 1287 | "is %s. Please report you " | ||
| 1288 | "saw this message to " | ||
| 1289 | "linux-ntfs-dev@lists." | ||
| 1290 | "sourceforge.net", | ||
| 1291 | NInoCompressed(ni) ? | ||
| 1292 | "compressed" : "sparse"); | ||
| 1293 | goto unm_err_out; | ||
| 1294 | } | ||
| 1295 | if (a->flags & ATTR_IS_SPARSE) | ||
| 1296 | NInoSetSparse(ni); | ||
| 1297 | if (a->data.non_resident.compression_unit != 4) { | 1324 | if (a->data.non_resident.compression_unit != 4) { |
| 1298 | ntfs_error(vi->i_sb, "Found nonstandard " | 1325 | ntfs_error(vi->i_sb, "Found nonstandard " |
| 1299 | "compression unit (%u instead " | 1326 | "compression unit (%u instead " |
| @@ -1313,23 +1340,6 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
| 1313 | ni->itype.compressed.size = sle64_to_cpu( | 1340 | ni->itype.compressed.size = sle64_to_cpu( |
| 1314 | a->data.non_resident.compressed_size); | 1341 | a->data.non_resident.compressed_size); |
| 1315 | } | 1342 | } |
| 1316 | if (a->flags & ATTR_IS_ENCRYPTED) { | ||
| 1317 | if (a->flags & ATTR_COMPRESSION_MASK) { | ||
| 1318 | ntfs_error(vi->i_sb, "Found encrypted and " | ||
| 1319 | "compressed data."); | ||
| 1320 | goto unm_err_out; | ||
| 1321 | } | ||
| 1322 | if (NInoMstProtected(ni)) { | ||
| 1323 | ntfs_error(vi->i_sb, "Found mst protected " | ||
| 1324 | "attribute but the attribute " | ||
| 1325 | "is encrypted. Please report " | ||
| 1326 | "you saw this message to " | ||
| 1327 | "linux-ntfs-dev@lists." | ||
| 1328 | "sourceforge.net"); | ||
| 1329 | goto unm_err_out; | ||
| 1330 | } | ||
| 1331 | NInoSetEncrypted(ni); | ||
| 1332 | } | ||
| 1333 | if (a->data.non_resident.lowest_vcn) { | 1343 | if (a->data.non_resident.lowest_vcn) { |
| 1334 | ntfs_error(vi->i_sb, "First extent of attribute has " | 1344 | ntfs_error(vi->i_sb, "First extent of attribute has " |
| 1335 | "non-zero lowest_vcn."); | 1345 | "non-zero lowest_vcn."); |
| @@ -1348,12 +1358,12 @@ static int ntfs_read_locked_attr_inode(struct inode *base_vi, struct inode *vi) | |||
| 1348 | vi->i_mapping->a_ops = &ntfs_mst_aops; | 1358 | vi->i_mapping->a_ops = &ntfs_mst_aops; |
| 1349 | else | 1359 | else |
| 1350 | vi->i_mapping->a_ops = &ntfs_aops; | 1360 | vi->i_mapping->a_ops = &ntfs_aops; |
| 1351 | if (NInoCompressed(ni) || NInoSparse(ni)) | 1361 | if ((NInoCompressed(ni) || NInoSparse(ni)) && ni->type != AT_INDEX_ROOT) |
| 1352 | vi->i_blocks = ni->itype.compressed.size >> 9; | 1362 | vi->i_blocks = ni->itype.compressed.size >> 9; |
| 1353 | else | 1363 | else |
| 1354 | vi->i_blocks = ni->allocated_size >> 9; | 1364 | vi->i_blocks = ni->allocated_size >> 9; |
| 1355 | /* | 1365 | /* |
| 1356 | * Make sure the base inode doesn't go away and attach it to the | 1366 | * Make sure the base inode does not go away and attach it to the |
| 1357 | * attribute inode. | 1367 | * attribute inode. |
| 1358 | */ | 1368 | */ |
| 1359 | igrab(base_vi); | 1369 | igrab(base_vi); |
| @@ -1480,7 +1490,10 @@ static int ntfs_read_locked_index_inode(struct inode *base_vi, struct inode *vi) | |||
| 1480 | "after the attribute value."); | 1490 | "after the attribute value."); |
| 1481 | goto unm_err_out; | 1491 | goto unm_err_out; |
| 1482 | } | 1492 | } |
| 1483 | /* Compressed/encrypted/sparse index root is not allowed. */ | 1493 | /* |
| 1494 | * Compressed/encrypted/sparse index root is not allowed, except for | ||
| 1495 | * directories of course but those are not dealt with here. | ||
| 1496 | */ | ||
| 1484 | if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED | | 1497 | if (a->flags & (ATTR_COMPRESSION_MASK | ATTR_IS_ENCRYPTED | |
| 1485 | ATTR_IS_SPARSE)) { | 1498 | ATTR_IS_SPARSE)) { |
| 1486 | ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index " | 1499 | ntfs_error(vi->i_sb, "Found compressed/encrypted/sparse index " |
| @@ -2430,16 +2443,18 @@ int ntfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 2430 | * We skipped the truncate but must still update | 2443 | * We skipped the truncate but must still update |
| 2431 | * timestamps. | 2444 | * timestamps. |
| 2432 | */ | 2445 | */ |
| 2433 | ia_valid |= ATTR_MTIME|ATTR_CTIME; | 2446 | ia_valid |= ATTR_MTIME | ATTR_CTIME; |
| 2434 | } | 2447 | } |
| 2435 | } | 2448 | } |
| 2436 | |||
| 2437 | if (ia_valid & ATTR_ATIME) | 2449 | if (ia_valid & ATTR_ATIME) |
| 2438 | vi->i_atime = attr->ia_atime; | 2450 | vi->i_atime = timespec_trunc(attr->ia_atime, |
| 2451 | vi->i_sb->s_time_gran); | ||
| 2439 | if (ia_valid & ATTR_MTIME) | 2452 | if (ia_valid & ATTR_MTIME) |
| 2440 | vi->i_mtime = attr->ia_mtime; | 2453 | vi->i_mtime = timespec_trunc(attr->ia_mtime, |
| 2454 | vi->i_sb->s_time_gran); | ||
| 2441 | if (ia_valid & ATTR_CTIME) | 2455 | if (ia_valid & ATTR_CTIME) |
| 2442 | vi->i_ctime = attr->ia_ctime; | 2456 | vi->i_ctime = timespec_trunc(attr->ia_ctime, |
| 2457 | vi->i_sb->s_time_gran); | ||
| 2443 | mark_inode_dirty(vi); | 2458 | mark_inode_dirty(vi); |
| 2444 | out: | 2459 | out: |
| 2445 | return err; | 2460 | return err; |
diff --git a/fs/ntfs/lcnalloc.c b/fs/ntfs/lcnalloc.c index a4bc07616e5d..7b5934290685 100644 --- a/fs/ntfs/lcnalloc.c +++ b/fs/ntfs/lcnalloc.c | |||
| @@ -54,6 +54,8 @@ int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | |||
| 54 | int ret = 0; | 54 | int ret = 0; |
| 55 | 55 | ||
| 56 | ntfs_debug("Entering."); | 56 | ntfs_debug("Entering."); |
| 57 | if (!rl) | ||
| 58 | return 0; | ||
| 57 | for (; rl->length; rl++) { | 59 | for (; rl->length; rl++) { |
| 58 | int err; | 60 | int err; |
| 59 | 61 | ||
| @@ -163,17 +165,9 @@ runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, const VCN start_vcn, | |||
| 163 | BUG_ON(zone < FIRST_ZONE); | 165 | BUG_ON(zone < FIRST_ZONE); |
| 164 | BUG_ON(zone > LAST_ZONE); | 166 | BUG_ON(zone > LAST_ZONE); |
| 165 | 167 | ||
| 166 | /* Return empty runlist if @count == 0 */ | 168 | /* Return NULL if @count is zero. */ |
| 167 | // FIXME: Do we want to just return NULL instead? (AIA) | 169 | if (!count) |
| 168 | if (!count) { | 170 | return NULL; |
| 169 | rl = ntfs_malloc_nofs(PAGE_SIZE); | ||
| 170 | if (!rl) | ||
| 171 | return ERR_PTR(-ENOMEM); | ||
| 172 | rl[0].vcn = start_vcn; | ||
| 173 | rl[0].lcn = LCN_RL_NOT_MAPPED; | ||
| 174 | rl[0].length = 0; | ||
| 175 | return rl; | ||
| 176 | } | ||
| 177 | /* Take the lcnbmp lock for writing. */ | 171 | /* Take the lcnbmp lock for writing. */ |
| 178 | down_write(&vol->lcnbmp_lock); | 172 | down_write(&vol->lcnbmp_lock); |
| 179 | /* | 173 | /* |
| @@ -788,7 +782,8 @@ out: | |||
| 788 | * @vi: vfs inode whose runlist describes the clusters to free | 782 | * @vi: vfs inode whose runlist describes the clusters to free |
| 789 | * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters | 783 | * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters |
| 790 | * @count: number of clusters to free or -1 for all clusters | 784 | * @count: number of clusters to free or -1 for all clusters |
| 791 | * @is_rollback: if TRUE this is a rollback operation | 785 | * @write_locked: true if the runlist is locked for writing |
| 786 | * @is_rollback: true if this is a rollback operation | ||
| 792 | * | 787 | * |
| 793 | * Free @count clusters starting at the cluster @start_vcn in the runlist | 788 | * Free @count clusters starting at the cluster @start_vcn in the runlist |
| 794 | * described by the vfs inode @vi. | 789 | * described by the vfs inode @vi. |
| @@ -806,17 +801,17 @@ out: | |||
| 806 | * Return the number of deallocated clusters (not counting sparse ones) on | 801 | * Return the number of deallocated clusters (not counting sparse ones) on |
| 807 | * success and -errno on error. | 802 | * success and -errno on error. |
| 808 | * | 803 | * |
| 809 | * Locking: - The runlist described by @vi must be unlocked on entry and is | 804 | * Locking: - The runlist described by @vi must be locked on entry and is |
| 810 | * unlocked on return. | 805 | * locked on return. Note if the runlist is locked for reading the |
| 811 | * - This function takes the runlist lock of @vi for reading and | 806 | * lock may be dropped and reacquired. Note the runlist may be |
| 812 | * sometimes for writing and sometimes modifies the runlist. | 807 | * modified when needed runlist fragments need to be mapped. |
| 813 | * - The volume lcn bitmap must be unlocked on entry and is unlocked | 808 | * - The volume lcn bitmap must be unlocked on entry and is unlocked |
| 814 | * on return. | 809 | * on return. |
| 815 | * - This function takes the volume lcn bitmap lock for writing and | 810 | * - This function takes the volume lcn bitmap lock for writing and |
| 816 | * modifies the bitmap contents. | 811 | * modifies the bitmap contents. |
| 817 | */ | 812 | */ |
| 818 | s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, | 813 | s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, |
| 819 | const BOOL is_rollback) | 814 | const BOOL write_locked, const BOOL is_rollback) |
| 820 | { | 815 | { |
| 821 | s64 delta, to_free, total_freed, real_freed; | 816 | s64 delta, to_free, total_freed, real_freed; |
| 822 | ntfs_inode *ni; | 817 | ntfs_inode *ni; |
| @@ -848,8 +843,7 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, | |||
| 848 | 843 | ||
| 849 | total_freed = real_freed = 0; | 844 | total_freed = real_freed = 0; |
| 850 | 845 | ||
| 851 | down_read(&ni->runlist.lock); | 846 | rl = ntfs_attr_find_vcn_nolock(ni, start_vcn, write_locked); |
| 852 | rl = ntfs_attr_find_vcn_nolock(ni, start_vcn, FALSE); | ||
| 853 | if (IS_ERR(rl)) { | 847 | if (IS_ERR(rl)) { |
| 854 | if (!is_rollback) | 848 | if (!is_rollback) |
| 855 | ntfs_error(vol->sb, "Failed to find first runlist " | 849 | ntfs_error(vol->sb, "Failed to find first runlist " |
| @@ -903,7 +897,7 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, | |||
| 903 | 897 | ||
| 904 | /* Attempt to map runlist. */ | 898 | /* Attempt to map runlist. */ |
| 905 | vcn = rl->vcn; | 899 | vcn = rl->vcn; |
| 906 | rl = ntfs_attr_find_vcn_nolock(ni, vcn, FALSE); | 900 | rl = ntfs_attr_find_vcn_nolock(ni, vcn, write_locked); |
| 907 | if (IS_ERR(rl)) { | 901 | if (IS_ERR(rl)) { |
| 908 | err = PTR_ERR(rl); | 902 | err = PTR_ERR(rl); |
| 909 | if (!is_rollback) | 903 | if (!is_rollback) |
| @@ -950,7 +944,6 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, | |||
| 950 | /* Update the total done clusters. */ | 944 | /* Update the total done clusters. */ |
| 951 | total_freed += to_free; | 945 | total_freed += to_free; |
| 952 | } | 946 | } |
| 953 | up_read(&ni->runlist.lock); | ||
| 954 | if (likely(!is_rollback)) | 947 | if (likely(!is_rollback)) |
| 955 | up_write(&vol->lcnbmp_lock); | 948 | up_write(&vol->lcnbmp_lock); |
| 956 | 949 | ||
| @@ -960,7 +953,6 @@ s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, s64 count, | |||
| 960 | ntfs_debug("Done."); | 953 | ntfs_debug("Done."); |
| 961 | return real_freed; | 954 | return real_freed; |
| 962 | err_out: | 955 | err_out: |
| 963 | up_read(&ni->runlist.lock); | ||
| 964 | if (is_rollback) | 956 | if (is_rollback) |
| 965 | return err; | 957 | return err; |
| 966 | /* If no real clusters were freed, no need to rollback. */ | 958 | /* If no real clusters were freed, no need to rollback. */ |
| @@ -973,7 +965,8 @@ err_out: | |||
| 973 | * If rollback fails, set the volume errors flag, emit an error | 965 | * If rollback fails, set the volume errors flag, emit an error |
| 974 | * message, and return the error code. | 966 | * message, and return the error code. |
| 975 | */ | 967 | */ |
| 976 | delta = __ntfs_cluster_free(vi, start_vcn, total_freed, TRUE); | 968 | delta = __ntfs_cluster_free(vi, start_vcn, total_freed, write_locked, |
| 969 | TRUE); | ||
| 977 | if (delta < 0) { | 970 | if (delta < 0) { |
| 978 | ntfs_error(vol->sb, "Failed to rollback (error %i). Leaving " | 971 | ntfs_error(vol->sb, "Failed to rollback (error %i). Leaving " |
| 979 | "inconsistent metadata! Unmount and run " | 972 | "inconsistent metadata! Unmount and run " |
diff --git a/fs/ntfs/lcnalloc.h b/fs/ntfs/lcnalloc.h index 4cac1c024af6..e4d7fb98d685 100644 --- a/fs/ntfs/lcnalloc.h +++ b/fs/ntfs/lcnalloc.h | |||
| @@ -43,13 +43,14 @@ extern runlist_element *ntfs_cluster_alloc(ntfs_volume *vol, | |||
| 43 | const NTFS_CLUSTER_ALLOCATION_ZONES zone); | 43 | const NTFS_CLUSTER_ALLOCATION_ZONES zone); |
| 44 | 44 | ||
| 45 | extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, | 45 | extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, |
| 46 | s64 count, const BOOL is_rollback); | 46 | s64 count, const BOOL write_locked, const BOOL is_rollback); |
| 47 | 47 | ||
| 48 | /** | 48 | /** |
| 49 | * ntfs_cluster_free - free clusters on an ntfs volume | 49 | * ntfs_cluster_free - free clusters on an ntfs volume |
| 50 | * @vi: vfs inode whose runlist describes the clusters to free | 50 | * @vi: vfs inode whose runlist describes the clusters to free |
| 51 | * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters | 51 | * @start_vcn: vcn in the runlist of @vi at which to start freeing clusters |
| 52 | * @count: number of clusters to free or -1 for all clusters | 52 | * @count: number of clusters to free or -1 for all clusters |
| 53 | * @write_locked: true if the runlist is locked for writing | ||
| 53 | * | 54 | * |
| 54 | * Free @count clusters starting at the cluster @start_vcn in the runlist | 55 | * Free @count clusters starting at the cluster @start_vcn in the runlist |
| 55 | * described by the vfs inode @vi. | 56 | * described by the vfs inode @vi. |
| @@ -64,19 +65,19 @@ extern s64 __ntfs_cluster_free(struct inode *vi, const VCN start_vcn, | |||
| 64 | * Return the number of deallocated clusters (not counting sparse ones) on | 65 | * Return the number of deallocated clusters (not counting sparse ones) on |
| 65 | * success and -errno on error. | 66 | * success and -errno on error. |
| 66 | * | 67 | * |
| 67 | * Locking: - The runlist described by @vi must be unlocked on entry and is | 68 | * Locking: - The runlist described by @vi must be locked on entry and is |
| 68 | * unlocked on return. | 69 | * locked on return. Note if the runlist is locked for reading the |
| 69 | * - This function takes the runlist lock of @vi for reading and | 70 | * lock may be dropped and reacquired. Note the runlist may be |
| 70 | * sometimes for writing and sometimes modifies the runlist. | 71 | * modified when needed runlist fragments need to be mapped. |
| 71 | * - The volume lcn bitmap must be unlocked on entry and is unlocked | 72 | * - The volume lcn bitmap must be unlocked on entry and is unlocked |
| 72 | * on return. | 73 | * on return. |
| 73 | * - This function takes the volume lcn bitmap lock for writing and | 74 | * - This function takes the volume lcn bitmap lock for writing and |
| 74 | * modifies the bitmap contents. | 75 | * modifies the bitmap contents. |
| 75 | */ | 76 | */ |
| 76 | static inline s64 ntfs_cluster_free(struct inode *vi, const VCN start_vcn, | 77 | static inline s64 ntfs_cluster_free(struct inode *vi, const VCN start_vcn, |
| 77 | s64 count) | 78 | s64 count, const BOOL write_locked) |
| 78 | { | 79 | { |
| 79 | return __ntfs_cluster_free(vi, start_vcn, count, FALSE); | 80 | return __ntfs_cluster_free(vi, start_vcn, count, write_locked, FALSE); |
| 80 | } | 81 | } |
| 81 | 82 | ||
| 82 | extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | 83 | extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, |
| @@ -93,8 +94,10 @@ extern int ntfs_cluster_free_from_rl_nolock(ntfs_volume *vol, | |||
| 93 | * | 94 | * |
| 94 | * Return 0 on success and -errno on error. | 95 | * Return 0 on success and -errno on error. |
| 95 | * | 96 | * |
| 96 | * Locking: This function takes the volume lcn bitmap lock for writing and | 97 | * Locking: - This function takes the volume lcn bitmap lock for writing and |
| 97 | * modifies the bitmap contents. | 98 | * modifies the bitmap contents. |
| 99 | * - The caller must have locked the runlist @rl for reading or | ||
| 100 | * writing. | ||
| 98 | */ | 101 | */ |
| 99 | static inline int ntfs_cluster_free_from_rl(ntfs_volume *vol, | 102 | static inline int ntfs_cluster_free_from_rl(ntfs_volume *vol, |
| 100 | const runlist_element *rl) | 103 | const runlist_element *rl) |
diff --git a/fs/ntfs/logfile.c b/fs/ntfs/logfile.c index 8edb8e20fb08..0173e95500d9 100644 --- a/fs/ntfs/logfile.c +++ b/fs/ntfs/logfile.c | |||
| @@ -121,7 +121,7 @@ static BOOL ntfs_check_restart_page_header(struct inode *vi, | |||
| 121 | */ | 121 | */ |
| 122 | if (!ntfs_is_chkd_record(rp->magic) && sle64_to_cpu(rp->chkdsk_lsn)) { | 122 | if (!ntfs_is_chkd_record(rp->magic) && sle64_to_cpu(rp->chkdsk_lsn)) { |
| 123 | ntfs_error(vi->i_sb, "$LogFile restart page is not modified " | 123 | ntfs_error(vi->i_sb, "$LogFile restart page is not modified " |
| 124 | "chkdsk but a chkdsk LSN is specified."); | 124 | "by chkdsk but a chkdsk LSN is specified."); |
| 125 | return FALSE; | 125 | return FALSE; |
| 126 | } | 126 | } |
| 127 | ntfs_debug("Done."); | 127 | ntfs_debug("Done."); |
| @@ -312,10 +312,12 @@ err_out: | |||
| 312 | * @vi: $LogFile inode to which the restart page belongs | 312 | * @vi: $LogFile inode to which the restart page belongs |
| 313 | * @rp: restart page to check | 313 | * @rp: restart page to check |
| 314 | * @pos: position in @vi at which the restart page resides | 314 | * @pos: position in @vi at which the restart page resides |
| 315 | * @wrp: copy of the multi sector transfer deprotected restart page | 315 | * @wrp: [OUT] copy of the multi sector transfer deprotected restart page |
| 316 | * @lsn: [OUT] set to the current logfile lsn on success | ||
| 316 | * | 317 | * |
| 317 | * Check the restart page @rp for consistency and return TRUE if it is | 318 | * Check the restart page @rp for consistency and return 0 if it is consistent |
| 318 | * consistent and FALSE otherwise. | 319 | * and -errno otherwise. The restart page may have been modified by chkdsk in |
| 320 | * which case its magic is CHKD instead of RSTR. | ||
| 319 | * | 321 | * |
| 320 | * This function only needs NTFS_BLOCK_SIZE bytes in @rp, i.e. it does not | 322 | * This function only needs NTFS_BLOCK_SIZE bytes in @rp, i.e. it does not |
| 321 | * require the full restart page. | 323 | * require the full restart page. |
| @@ -323,25 +325,33 @@ err_out: | |||
| 323 | * If @wrp is not NULL, on success, *@wrp will point to a buffer containing a | 325 | * If @wrp is not NULL, on success, *@wrp will point to a buffer containing a |
| 324 | * copy of the complete multi sector transfer deprotected page. On failure, | 326 | * copy of the complete multi sector transfer deprotected page. On failure, |
| 325 | * *@wrp is undefined. | 327 | * *@wrp is undefined. |
| 328 | * | ||
| 329 | * Simillarly, if @lsn is not NULL, on succes *@lsn will be set to the current | ||
| 330 | * logfile lsn according to this restart page. On failure, *@lsn is undefined. | ||
| 331 | * | ||
| 332 | * The following error codes are defined: | ||
| 333 | * -EINVAL - The restart page is inconsistent. | ||
| 334 | * -ENOMEM - Not enough memory to load the restart page. | ||
| 335 | * -EIO - Failed to reading from $LogFile. | ||
| 326 | */ | 336 | */ |
| 327 | static BOOL ntfs_check_and_load_restart_page(struct inode *vi, | 337 | static int ntfs_check_and_load_restart_page(struct inode *vi, |
| 328 | RESTART_PAGE_HEADER *rp, s64 pos, RESTART_PAGE_HEADER **wrp) | 338 | RESTART_PAGE_HEADER *rp, s64 pos, RESTART_PAGE_HEADER **wrp, |
| 339 | LSN *lsn) | ||
| 329 | { | 340 | { |
| 330 | RESTART_AREA *ra; | 341 | RESTART_AREA *ra; |
| 331 | RESTART_PAGE_HEADER *trp; | 342 | RESTART_PAGE_HEADER *trp; |
| 332 | int size; | 343 | int size, err; |
| 333 | BOOL ret; | ||
| 334 | 344 | ||
| 335 | ntfs_debug("Entering."); | 345 | ntfs_debug("Entering."); |
| 336 | /* Check the restart page header for consistency. */ | 346 | /* Check the restart page header for consistency. */ |
| 337 | if (!ntfs_check_restart_page_header(vi, rp, pos)) { | 347 | if (!ntfs_check_restart_page_header(vi, rp, pos)) { |
| 338 | /* Error output already done inside the function. */ | 348 | /* Error output already done inside the function. */ |
| 339 | return FALSE; | 349 | return -EINVAL; |
| 340 | } | 350 | } |
| 341 | /* Check the restart area for consistency. */ | 351 | /* Check the restart area for consistency. */ |
| 342 | if (!ntfs_check_restart_area(vi, rp)) { | 352 | if (!ntfs_check_restart_area(vi, rp)) { |
| 343 | /* Error output already done inside the function. */ | 353 | /* Error output already done inside the function. */ |
| 344 | return FALSE; | 354 | return -EINVAL; |
| 345 | } | 355 | } |
| 346 | ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); | 356 | ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); |
| 347 | /* | 357 | /* |
| @@ -352,7 +362,7 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi, | |||
| 352 | if (!trp) { | 362 | if (!trp) { |
| 353 | ntfs_error(vi->i_sb, "Failed to allocate memory for $LogFile " | 363 | ntfs_error(vi->i_sb, "Failed to allocate memory for $LogFile " |
| 354 | "restart page buffer."); | 364 | "restart page buffer."); |
| 355 | return FALSE; | 365 | return -ENOMEM; |
| 356 | } | 366 | } |
| 357 | /* | 367 | /* |
| 358 | * Read the whole of the restart page into the buffer. If it fits | 368 | * Read the whole of the restart page into the buffer. If it fits |
| @@ -379,6 +389,9 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi, | |||
| 379 | if (IS_ERR(page)) { | 389 | if (IS_ERR(page)) { |
| 380 | ntfs_error(vi->i_sb, "Error mapping $LogFile " | 390 | ntfs_error(vi->i_sb, "Error mapping $LogFile " |
| 381 | "page (index %lu).", idx); | 391 | "page (index %lu).", idx); |
| 392 | err = PTR_ERR(page); | ||
| 393 | if (err != -EIO && err != -ENOMEM) | ||
| 394 | err = -EIO; | ||
| 382 | goto err_out; | 395 | goto err_out; |
| 383 | } | 396 | } |
| 384 | size = min_t(int, to_read, PAGE_CACHE_SIZE); | 397 | size = min_t(int, to_read, PAGE_CACHE_SIZE); |
| @@ -392,29 +405,57 @@ static BOOL ntfs_check_and_load_restart_page(struct inode *vi, | |||
| 392 | /* Perform the multi sector transfer deprotection on the buffer. */ | 405 | /* Perform the multi sector transfer deprotection on the buffer. */ |
| 393 | if (post_read_mst_fixup((NTFS_RECORD*)trp, | 406 | if (post_read_mst_fixup((NTFS_RECORD*)trp, |
| 394 | le32_to_cpu(rp->system_page_size))) { | 407 | le32_to_cpu(rp->system_page_size))) { |
| 395 | ntfs_error(vi->i_sb, "Multi sector transfer error detected in " | 408 | /* |
| 396 | "$LogFile restart page."); | 409 | * A multi sector tranfer error was detected. We only need to |
| 397 | goto err_out; | 410 | * abort if the restart page contents exceed the multi sector |
| 411 | * transfer fixup of the first sector. | ||
| 412 | */ | ||
| 413 | if (le16_to_cpu(rp->restart_area_offset) + | ||
| 414 | le16_to_cpu(ra->restart_area_length) > | ||
| 415 | NTFS_BLOCK_SIZE - sizeof(u16)) { | ||
| 416 | ntfs_error(vi->i_sb, "Multi sector transfer error " | ||
| 417 | "detected in $LogFile restart page."); | ||
| 418 | err = -EINVAL; | ||
| 419 | goto err_out; | ||
| 420 | } | ||
| 421 | } | ||
| 422 | /* | ||
| 423 | * If the restart page is modified by chkdsk or there are no active | ||
| 424 | * logfile clients, the logfile is consistent. Otherwise, need to | ||
| 425 | * check the log client records for consistency, too. | ||
| 426 | */ | ||
| 427 | err = 0; | ||
| 428 | if (ntfs_is_rstr_record(rp->magic) && | ||
| 429 | ra->client_in_use_list != LOGFILE_NO_CLIENT) { | ||
| 430 | if (!ntfs_check_log_client_array(vi, trp)) { | ||
| 431 | err = -EINVAL; | ||
| 432 | goto err_out; | ||
| 433 | } | ||
| 434 | } | ||
| 435 | if (lsn) { | ||
| 436 | if (ntfs_is_rstr_record(rp->magic)) | ||
| 437 | *lsn = sle64_to_cpu(ra->current_lsn); | ||
| 438 | else /* if (ntfs_is_chkd_record(rp->magic)) */ | ||
| 439 | *lsn = sle64_to_cpu(rp->chkdsk_lsn); | ||
| 398 | } | 440 | } |
| 399 | /* Check the log client records for consistency. */ | ||
| 400 | ret = ntfs_check_log_client_array(vi, trp); | ||
| 401 | if (ret && wrp) | ||
| 402 | *wrp = trp; | ||
| 403 | else | ||
| 404 | ntfs_free(trp); | ||
| 405 | ntfs_debug("Done."); | 441 | ntfs_debug("Done."); |
| 406 | return ret; | 442 | if (wrp) |
| 443 | *wrp = trp; | ||
| 444 | else { | ||
| 407 | err_out: | 445 | err_out: |
| 408 | ntfs_free(trp); | 446 | ntfs_free(trp); |
| 409 | return FALSE; | 447 | } |
| 448 | return err; | ||
| 410 | } | 449 | } |
| 411 | 450 | ||
| 412 | /** | 451 | /** |
| 413 | * ntfs_check_logfile - check the journal for consistency | 452 | * ntfs_check_logfile - check the journal for consistency |
| 414 | * @log_vi: struct inode of loaded journal $LogFile to check | 453 | * @log_vi: struct inode of loaded journal $LogFile to check |
| 454 | * @rp: [OUT] on success this is a copy of the current restart page | ||
| 415 | * | 455 | * |
| 416 | * Check the $LogFile journal for consistency and return TRUE if it is | 456 | * Check the $LogFile journal for consistency and return TRUE if it is |
| 417 | * consistent and FALSE if not. | 457 | * consistent and FALSE if not. On success, the current restart page is |
| 458 | * returned in *@rp. Caller must call ntfs_free(*@rp) when finished with it. | ||
| 418 | * | 459 | * |
| 419 | * At present we only check the two restart pages and ignore the log record | 460 | * At present we only check the two restart pages and ignore the log record |
| 420 | * pages. | 461 | * pages. |
| @@ -424,19 +465,18 @@ err_out: | |||
| 424 | * if the $LogFile was created on a system with a different page size to ours | 465 | * if the $LogFile was created on a system with a different page size to ours |
| 425 | * yet and mst deprotection would fail if our page size is smaller. | 466 | * yet and mst deprotection would fail if our page size is smaller. |
| 426 | */ | 467 | */ |
| 427 | BOOL ntfs_check_logfile(struct inode *log_vi) | 468 | BOOL ntfs_check_logfile(struct inode *log_vi, RESTART_PAGE_HEADER **rp) |
| 428 | { | 469 | { |
| 429 | s64 size, pos, rstr1_pos, rstr2_pos; | 470 | s64 size, pos; |
| 471 | LSN rstr1_lsn, rstr2_lsn; | ||
| 430 | ntfs_volume *vol = NTFS_SB(log_vi->i_sb); | 472 | ntfs_volume *vol = NTFS_SB(log_vi->i_sb); |
| 431 | struct address_space *mapping = log_vi->i_mapping; | 473 | struct address_space *mapping = log_vi->i_mapping; |
| 432 | struct page *page = NULL; | 474 | struct page *page = NULL; |
| 433 | u8 *kaddr = NULL; | 475 | u8 *kaddr = NULL; |
| 434 | RESTART_PAGE_HEADER *rstr1_ph = NULL; | 476 | RESTART_PAGE_HEADER *rstr1_ph = NULL; |
| 435 | RESTART_PAGE_HEADER *rstr2_ph = NULL; | 477 | RESTART_PAGE_HEADER *rstr2_ph = NULL; |
| 436 | int log_page_size, log_page_mask, ofs; | 478 | int log_page_size, log_page_mask, err; |
| 437 | BOOL logfile_is_empty = TRUE; | 479 | BOOL logfile_is_empty = TRUE; |
| 438 | BOOL rstr1_found = FALSE; | ||
| 439 | BOOL rstr2_found = FALSE; | ||
| 440 | u8 log_page_bits; | 480 | u8 log_page_bits; |
| 441 | 481 | ||
| 442 | ntfs_debug("Entering."); | 482 | ntfs_debug("Entering."); |
| @@ -491,7 +531,7 @@ BOOL ntfs_check_logfile(struct inode *log_vi) | |||
| 491 | if (IS_ERR(page)) { | 531 | if (IS_ERR(page)) { |
| 492 | ntfs_error(vol->sb, "Error mapping $LogFile " | 532 | ntfs_error(vol->sb, "Error mapping $LogFile " |
| 493 | "page (index %lu).", idx); | 533 | "page (index %lu).", idx); |
| 494 | return FALSE; | 534 | goto err_out; |
| 495 | } | 535 | } |
| 496 | } | 536 | } |
| 497 | kaddr = (u8*)page_address(page) + (pos & ~PAGE_CACHE_MASK); | 537 | kaddr = (u8*)page_address(page) + (pos & ~PAGE_CACHE_MASK); |
| @@ -510,99 +550,95 @@ BOOL ntfs_check_logfile(struct inode *log_vi) | |||
| 510 | */ | 550 | */ |
| 511 | if (ntfs_is_rcrd_recordp((le32*)kaddr)) | 551 | if (ntfs_is_rcrd_recordp((le32*)kaddr)) |
| 512 | break; | 552 | break; |
| 513 | /* | 553 | /* If not a (modified by chkdsk) restart page, continue. */ |
| 514 | * A modified by chkdsk restart page means we cannot handle | 554 | if (!ntfs_is_rstr_recordp((le32*)kaddr) && |
| 515 | * this log file. | 555 | !ntfs_is_chkd_recordp((le32*)kaddr)) { |
| 516 | */ | ||
| 517 | if (ntfs_is_chkd_recordp((le32*)kaddr)) { | ||
| 518 | ntfs_error(vol->sb, "$LogFile has been modified by " | ||
| 519 | "chkdsk. Mount this volume in " | ||
| 520 | "Windows."); | ||
| 521 | goto err_out; | ||
| 522 | } | ||
| 523 | /* If not a restart page, continue. */ | ||
| 524 | if (!ntfs_is_rstr_recordp((le32*)kaddr)) { | ||
| 525 | /* Skip to the minimum page size for the next one. */ | ||
| 526 | if (!pos) | 556 | if (!pos) |
| 527 | pos = NTFS_BLOCK_SIZE >> 1; | 557 | pos = NTFS_BLOCK_SIZE >> 1; |
| 528 | continue; | 558 | continue; |
| 529 | } | 559 | } |
| 530 | /* We now know we have a restart page. */ | ||
| 531 | if (!pos) { | ||
| 532 | rstr1_found = TRUE; | ||
| 533 | rstr1_pos = pos; | ||
| 534 | } else { | ||
| 535 | if (rstr2_found) { | ||
| 536 | ntfs_error(vol->sb, "Found more than two " | ||
| 537 | "restart pages in $LogFile."); | ||
| 538 | goto err_out; | ||
| 539 | } | ||
| 540 | rstr2_found = TRUE; | ||
| 541 | rstr2_pos = pos; | ||
| 542 | } | ||
| 543 | /* | 560 | /* |
| 544 | * Check the restart page for consistency and get a copy of the | 561 | * Check the (modified by chkdsk) restart page for consistency |
| 545 | * complete multi sector transfer deprotected restart page. | 562 | * and get a copy of the complete multi sector transfer |
| 563 | * deprotected restart page. | ||
| 546 | */ | 564 | */ |
| 547 | if (!ntfs_check_and_load_restart_page(log_vi, | 565 | err = ntfs_check_and_load_restart_page(log_vi, |
| 548 | (RESTART_PAGE_HEADER*)kaddr, pos, | 566 | (RESTART_PAGE_HEADER*)kaddr, pos, |
| 549 | !pos ? &rstr1_ph : &rstr2_ph)) { | 567 | !rstr1_ph ? &rstr1_ph : &rstr2_ph, |
| 550 | /* Error output already done inside the function. */ | 568 | !rstr1_ph ? &rstr1_lsn : &rstr2_lsn); |
| 551 | goto err_out; | 569 | if (!err) { |
| 570 | /* | ||
| 571 | * If we have now found the first (modified by chkdsk) | ||
| 572 | * restart page, continue looking for the second one. | ||
| 573 | */ | ||
| 574 | if (!pos) { | ||
| 575 | pos = NTFS_BLOCK_SIZE >> 1; | ||
| 576 | continue; | ||
| 577 | } | ||
| 578 | /* | ||
| 579 | * We have now found the second (modified by chkdsk) | ||
| 580 | * restart page, so we can stop looking. | ||
| 581 | */ | ||
| 582 | break; | ||
| 552 | } | 583 | } |
| 553 | /* | 584 | /* |
| 554 | * We have a valid restart page. The next one must be after | 585 | * Error output already done inside the function. Note, we do |
| 555 | * a whole system page size as specified by the valid restart | 586 | * not abort if the restart page was invalid as we might still |
| 556 | * page. | 587 | * find a valid one further in the file. |
| 557 | */ | 588 | */ |
| 589 | if (err != -EINVAL) { | ||
| 590 | ntfs_unmap_page(page); | ||
| 591 | goto err_out; | ||
| 592 | } | ||
| 593 | /* Continue looking. */ | ||
| 558 | if (!pos) | 594 | if (!pos) |
| 559 | pos = le32_to_cpu(rstr1_ph->system_page_size) >> 1; | 595 | pos = NTFS_BLOCK_SIZE >> 1; |
| 560 | } | 596 | } |
| 561 | if (page) { | 597 | if (page) |
| 562 | ntfs_unmap_page(page); | 598 | ntfs_unmap_page(page); |
| 563 | page = NULL; | ||
| 564 | } | ||
| 565 | if (logfile_is_empty) { | 599 | if (logfile_is_empty) { |
| 566 | NVolSetLogFileEmpty(vol); | 600 | NVolSetLogFileEmpty(vol); |
| 567 | is_empty: | 601 | is_empty: |
| 568 | ntfs_debug("Done. ($LogFile is empty.)"); | 602 | ntfs_debug("Done. ($LogFile is empty.)"); |
| 569 | return TRUE; | 603 | return TRUE; |
| 570 | } | 604 | } |
| 571 | if (!rstr1_found || !rstr2_found) { | 605 | if (!rstr1_ph) { |
| 572 | ntfs_error(vol->sb, "Did not find two restart pages in " | 606 | BUG_ON(rstr2_ph); |
| 573 | "$LogFile."); | 607 | ntfs_error(vol->sb, "Did not find any restart pages in " |
| 574 | goto err_out; | 608 | "$LogFile and it was not empty."); |
| 609 | return FALSE; | ||
| 610 | } | ||
| 611 | /* If both restart pages were found, use the more recent one. */ | ||
| 612 | if (rstr2_ph) { | ||
| 613 | /* | ||
| 614 | * If the second restart area is more recent, switch to it. | ||
| 615 | * Otherwise just throw it away. | ||
| 616 | */ | ||
| 617 | if (rstr2_lsn > rstr1_lsn) { | ||
| 618 | ntfs_free(rstr1_ph); | ||
| 619 | rstr1_ph = rstr2_ph; | ||
| 620 | /* rstr1_lsn = rstr2_lsn; */ | ||
| 621 | } else | ||
| 622 | ntfs_free(rstr2_ph); | ||
| 623 | rstr2_ph = NULL; | ||
| 575 | } | 624 | } |
| 576 | /* | ||
| 577 | * The two restart areas must be identical except for the update | ||
| 578 | * sequence number. | ||
| 579 | */ | ||
| 580 | ofs = le16_to_cpu(rstr1_ph->usa_ofs); | ||
| 581 | if (memcmp(rstr1_ph, rstr2_ph, ofs) || (ofs += sizeof(u16), | ||
| 582 | memcmp((u8*)rstr1_ph + ofs, (u8*)rstr2_ph + ofs, | ||
| 583 | le32_to_cpu(rstr1_ph->system_page_size) - ofs))) { | ||
| 584 | ntfs_error(vol->sb, "The two restart pages in $LogFile do not " | ||
| 585 | "match."); | ||
| 586 | goto err_out; | ||
| 587 | } | ||
| 588 | ntfs_free(rstr1_ph); | ||
| 589 | ntfs_free(rstr2_ph); | ||
| 590 | /* All consistency checks passed. */ | 625 | /* All consistency checks passed. */ |
| 626 | if (rp) | ||
| 627 | *rp = rstr1_ph; | ||
| 628 | else | ||
| 629 | ntfs_free(rstr1_ph); | ||
| 591 | ntfs_debug("Done."); | 630 | ntfs_debug("Done."); |
| 592 | return TRUE; | 631 | return TRUE; |
| 593 | err_out: | 632 | err_out: |
| 594 | if (page) | ||
| 595 | ntfs_unmap_page(page); | ||
| 596 | if (rstr1_ph) | 633 | if (rstr1_ph) |
| 597 | ntfs_free(rstr1_ph); | 634 | ntfs_free(rstr1_ph); |
| 598 | if (rstr2_ph) | ||
| 599 | ntfs_free(rstr2_ph); | ||
| 600 | return FALSE; | 635 | return FALSE; |
| 601 | } | 636 | } |
| 602 | 637 | ||
| 603 | /** | 638 | /** |
| 604 | * ntfs_is_logfile_clean - check in the journal if the volume is clean | 639 | * ntfs_is_logfile_clean - check in the journal if the volume is clean |
| 605 | * @log_vi: struct inode of loaded journal $LogFile to check | 640 | * @log_vi: struct inode of loaded journal $LogFile to check |
| 641 | * @rp: copy of the current restart page | ||
| 606 | * | 642 | * |
| 607 | * Analyze the $LogFile journal and return TRUE if it indicates the volume was | 643 | * Analyze the $LogFile journal and return TRUE if it indicates the volume was |
| 608 | * shutdown cleanly and FALSE if not. | 644 | * shutdown cleanly and FALSE if not. |
| @@ -619,11 +655,9 @@ err_out: | |||
| 619 | * is empty this function requires that NVolLogFileEmpty() is true otherwise an | 655 | * is empty this function requires that NVolLogFileEmpty() is true otherwise an |
| 620 | * empty volume will be reported as dirty. | 656 | * empty volume will be reported as dirty. |
| 621 | */ | 657 | */ |
| 622 | BOOL ntfs_is_logfile_clean(struct inode *log_vi) | 658 | BOOL ntfs_is_logfile_clean(struct inode *log_vi, const RESTART_PAGE_HEADER *rp) |
| 623 | { | 659 | { |
| 624 | ntfs_volume *vol = NTFS_SB(log_vi->i_sb); | 660 | ntfs_volume *vol = NTFS_SB(log_vi->i_sb); |
| 625 | struct page *page; | ||
| 626 | RESTART_PAGE_HEADER *rp; | ||
| 627 | RESTART_AREA *ra; | 661 | RESTART_AREA *ra; |
| 628 | 662 | ||
| 629 | ntfs_debug("Entering."); | 663 | ntfs_debug("Entering."); |
| @@ -632,24 +666,15 @@ BOOL ntfs_is_logfile_clean(struct inode *log_vi) | |||
| 632 | ntfs_debug("Done. ($LogFile is empty.)"); | 666 | ntfs_debug("Done. ($LogFile is empty.)"); |
| 633 | return TRUE; | 667 | return TRUE; |
| 634 | } | 668 | } |
| 635 | /* | 669 | BUG_ON(!rp); |
| 636 | * Read the first restart page. It will be possibly incomplete and | 670 | if (!ntfs_is_rstr_record(rp->magic) && |
| 637 | * will not be multi sector transfer deprotected but we only need the | 671 | !ntfs_is_chkd_record(rp->magic)) { |
| 638 | * first NTFS_BLOCK_SIZE bytes so it does not matter. | 672 | ntfs_error(vol->sb, "Restart page buffer is invalid. This is " |
| 639 | */ | 673 | "probably a bug in that the $LogFile should " |
| 640 | page = ntfs_map_page(log_vi->i_mapping, 0); | 674 | "have been consistency checked before calling " |
| 641 | if (IS_ERR(page)) { | 675 | "this function."); |
| 642 | ntfs_error(vol->sb, "Error mapping $LogFile page (index 0)."); | ||
| 643 | return FALSE; | 676 | return FALSE; |
| 644 | } | 677 | } |
| 645 | rp = (RESTART_PAGE_HEADER*)page_address(page); | ||
| 646 | if (!ntfs_is_rstr_record(rp->magic)) { | ||
| 647 | ntfs_error(vol->sb, "No restart page found at offset zero in " | ||
| 648 | "$LogFile. This is probably a bug in that " | ||
| 649 | "the $LogFile should have been consistency " | ||
| 650 | "checked before calling this function."); | ||
| 651 | goto err_out; | ||
| 652 | } | ||
| 653 | ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); | 678 | ra = (RESTART_AREA*)((u8*)rp + le16_to_cpu(rp->restart_area_offset)); |
| 654 | /* | 679 | /* |
| 655 | * If the $LogFile has active clients, i.e. it is open, and we do not | 680 | * If the $LogFile has active clients, i.e. it is open, and we do not |
| @@ -659,15 +684,11 @@ BOOL ntfs_is_logfile_clean(struct inode *log_vi) | |||
| 659 | if (ra->client_in_use_list != LOGFILE_NO_CLIENT && | 684 | if (ra->client_in_use_list != LOGFILE_NO_CLIENT && |
| 660 | !(ra->flags & RESTART_VOLUME_IS_CLEAN)) { | 685 | !(ra->flags & RESTART_VOLUME_IS_CLEAN)) { |
| 661 | ntfs_debug("Done. $LogFile indicates a dirty shutdown."); | 686 | ntfs_debug("Done. $LogFile indicates a dirty shutdown."); |
| 662 | goto err_out; | 687 | return FALSE; |
| 663 | } | 688 | } |
| 664 | ntfs_unmap_page(page); | ||
| 665 | /* $LogFile indicates a clean shutdown. */ | 689 | /* $LogFile indicates a clean shutdown. */ |
| 666 | ntfs_debug("Done. $LogFile indicates a clean shutdown."); | 690 | ntfs_debug("Done. $LogFile indicates a clean shutdown."); |
| 667 | return TRUE; | 691 | return TRUE; |
| 668 | err_out: | ||
| 669 | ntfs_unmap_page(page); | ||
| 670 | return FALSE; | ||
| 671 | } | 692 | } |
| 672 | 693 | ||
| 673 | /** | 694 | /** |
diff --git a/fs/ntfs/logfile.h b/fs/ntfs/logfile.h index 4ee4378de061..42388f95ea6d 100644 --- a/fs/ntfs/logfile.h +++ b/fs/ntfs/logfile.h | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | * logfile.h - Defines for NTFS kernel journal ($LogFile) handling. Part of | 2 | * logfile.h - Defines for NTFS kernel journal ($LogFile) handling. Part of |
| 3 | * the Linux-NTFS project. | 3 | * the Linux-NTFS project. |
| 4 | * | 4 | * |
| 5 | * Copyright (c) 2000-2004 Anton Altaparmakov | 5 | * Copyright (c) 2000-2005 Anton Altaparmakov |
| 6 | * | 6 | * |
| 7 | * This program/include file is free software; you can redistribute it and/or | 7 | * This program/include file is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU General Public License as published | 8 | * modify it under the terms of the GNU General Public License as published |
| @@ -296,9 +296,11 @@ typedef struct { | |||
| 296 | /* sizeof() = 160 (0xa0) bytes */ | 296 | /* sizeof() = 160 (0xa0) bytes */ |
| 297 | } __attribute__ ((__packed__)) LOG_CLIENT_RECORD; | 297 | } __attribute__ ((__packed__)) LOG_CLIENT_RECORD; |
| 298 | 298 | ||
| 299 | extern BOOL ntfs_check_logfile(struct inode *log_vi); | 299 | extern BOOL ntfs_check_logfile(struct inode *log_vi, |
| 300 | RESTART_PAGE_HEADER **rp); | ||
| 300 | 301 | ||
| 301 | extern BOOL ntfs_is_logfile_clean(struct inode *log_vi); | 302 | extern BOOL ntfs_is_logfile_clean(struct inode *log_vi, |
| 303 | const RESTART_PAGE_HEADER *rp); | ||
| 302 | 304 | ||
| 303 | extern BOOL ntfs_empty_logfile(struct inode *log_vi); | 305 | extern BOOL ntfs_empty_logfile(struct inode *log_vi); |
| 304 | 306 | ||
diff --git a/fs/ntfs/malloc.h b/fs/ntfs/malloc.h index fac5944df6d8..9994e019a3cf 100644 --- a/fs/ntfs/malloc.h +++ b/fs/ntfs/malloc.h | |||
| @@ -27,27 +27,63 @@ | |||
| 27 | #include <linux/highmem.h> | 27 | #include <linux/highmem.h> |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * ntfs_malloc_nofs - allocate memory in multiples of pages | 30 | * __ntfs_malloc - allocate memory in multiples of pages |
| 31 | * @size number of bytes to allocate | 31 | * @size: number of bytes to allocate |
| 32 | * @gfp_mask: extra flags for the allocator | ||
| 33 | * | ||
| 34 | * Internal function. You probably want ntfs_malloc_nofs()... | ||
| 32 | * | 35 | * |
| 33 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | 36 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and |
| 34 | * returns a pointer to the allocated memory. | 37 | * returns a pointer to the allocated memory. |
| 35 | * | 38 | * |
| 36 | * If there was insufficient memory to complete the request, return NULL. | 39 | * If there was insufficient memory to complete the request, return NULL. |
| 40 | * Depending on @gfp_mask the allocation may be guaranteed to succeed. | ||
| 37 | */ | 41 | */ |
| 38 | static inline void *ntfs_malloc_nofs(unsigned long size) | 42 | static inline void *__ntfs_malloc(unsigned long size, |
| 43 | unsigned int __nocast gfp_mask) | ||
| 39 | { | 44 | { |
| 40 | if (likely(size <= PAGE_SIZE)) { | 45 | if (likely(size <= PAGE_SIZE)) { |
| 41 | BUG_ON(!size); | 46 | BUG_ON(!size); |
| 42 | /* kmalloc() has per-CPU caches so is faster for now. */ | 47 | /* kmalloc() has per-CPU caches so is faster for now. */ |
| 43 | return kmalloc(PAGE_SIZE, GFP_NOFS); | 48 | return kmalloc(PAGE_SIZE, gfp_mask); |
| 44 | /* return (void *)__get_free_page(GFP_NOFS | __GFP_HIGHMEM); */ | 49 | /* return (void *)__get_free_page(gfp_mask); */ |
| 45 | } | 50 | } |
| 46 | if (likely(size >> PAGE_SHIFT < num_physpages)) | 51 | if (likely(size >> PAGE_SHIFT < num_physpages)) |
| 47 | return __vmalloc(size, GFP_NOFS | __GFP_HIGHMEM, PAGE_KERNEL); | 52 | return __vmalloc(size, gfp_mask, PAGE_KERNEL); |
| 48 | return NULL; | 53 | return NULL; |
| 49 | } | 54 | } |
| 50 | 55 | ||
| 56 | /** | ||
| 57 | * ntfs_malloc_nofs - allocate memory in multiples of pages | ||
| 58 | * @size: number of bytes to allocate | ||
| 59 | * | ||
| 60 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | ||
| 61 | * returns a pointer to the allocated memory. | ||
| 62 | * | ||
| 63 | * If there was insufficient memory to complete the request, return NULL. | ||
| 64 | */ | ||
| 65 | static inline void *ntfs_malloc_nofs(unsigned long size) | ||
| 66 | { | ||
| 67 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM); | ||
| 68 | } | ||
| 69 | |||
| 70 | /** | ||
| 71 | * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages | ||
| 72 | * @size: number of bytes to allocate | ||
| 73 | * | ||
| 74 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | ||
| 75 | * returns a pointer to the allocated memory. | ||
| 76 | * | ||
| 77 | * This function guarantees that the allocation will succeed. It will sleep | ||
| 78 | * for as long as it takes to complete the allocation. | ||
| 79 | * | ||
| 80 | * If there was insufficient memory to complete the request, return NULL. | ||
| 81 | */ | ||
| 82 | static inline void *ntfs_malloc_nofs_nofail(unsigned long size) | ||
| 83 | { | ||
| 84 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL); | ||
| 85 | } | ||
| 86 | |||
| 51 | static inline void ntfs_free(void *addr) | 87 | static inline void ntfs_free(void *addr) |
| 52 | { | 88 | { |
| 53 | if (likely(((unsigned long)addr < VMALLOC_START) || | 89 | if (likely(((unsigned long)addr < VMALLOC_START) || |
diff --git a/fs/ntfs/mft.c b/fs/ntfs/mft.c index 317f7c679fd3..2c32b84385a8 100644 --- a/fs/ntfs/mft.c +++ b/fs/ntfs/mft.c | |||
| @@ -511,7 +511,6 @@ int ntfs_sync_mft_mirror(ntfs_volume *vol, const unsigned long mft_no, | |||
| 511 | } while (bh); | 511 | } while (bh); |
| 512 | tail->b_this_page = head; | 512 | tail->b_this_page = head; |
| 513 | attach_page_buffers(page, head); | 513 | attach_page_buffers(page, head); |
| 514 | BUG_ON(!page_has_buffers(page)); | ||
| 515 | } | 514 | } |
| 516 | bh = head = page_buffers(page); | 515 | bh = head = page_buffers(page); |
| 517 | BUG_ON(!bh); | 516 | BUG_ON(!bh); |
| @@ -692,7 +691,6 @@ int write_mft_record_nolock(ntfs_inode *ni, MFT_RECORD *m, int sync) | |||
| 692 | */ | 691 | */ |
| 693 | if (!NInoTestClearDirty(ni)) | 692 | if (!NInoTestClearDirty(ni)) |
| 694 | goto done; | 693 | goto done; |
| 695 | BUG_ON(!page_has_buffers(page)); | ||
| 696 | bh = head = page_buffers(page); | 694 | bh = head = page_buffers(page); |
| 697 | BUG_ON(!bh); | 695 | BUG_ON(!bh); |
| 698 | rl = NULL; | 696 | rl = NULL; |
| @@ -1955,7 +1953,7 @@ restore_undo_alloc: | |||
| 1955 | a = ctx->attr; | 1953 | a = ctx->attr; |
| 1956 | a->data.non_resident.highest_vcn = cpu_to_sle64(old_last_vcn - 1); | 1954 | a->data.non_resident.highest_vcn = cpu_to_sle64(old_last_vcn - 1); |
| 1957 | undo_alloc: | 1955 | undo_alloc: |
| 1958 | if (ntfs_cluster_free(vol->mft_ino, old_last_vcn, -1) < 0) { | 1956 | if (ntfs_cluster_free(vol->mft_ino, old_last_vcn, -1, TRUE) < 0) { |
| 1959 | ntfs_error(vol->sb, "Failed to free clusters from mft data " | 1957 | ntfs_error(vol->sb, "Failed to free clusters from mft data " |
| 1960 | "attribute.%s", es); | 1958 | "attribute.%s", es); |
| 1961 | NVolSetErrors(vol); | 1959 | NVolSetErrors(vol); |
diff --git a/fs/ntfs/runlist.c b/fs/ntfs/runlist.c index 758855b0414e..f5b2ac929081 100644 --- a/fs/ntfs/runlist.c +++ b/fs/ntfs/runlist.c | |||
| @@ -35,7 +35,7 @@ static inline void ntfs_rl_mm(runlist_element *base, int dst, int src, | |||
| 35 | int size) | 35 | int size) |
| 36 | { | 36 | { |
| 37 | if (likely((dst != src) && (size > 0))) | 37 | if (likely((dst != src) && (size > 0))) |
| 38 | memmove(base + dst, base + src, size * sizeof (*base)); | 38 | memmove(base + dst, base + src, size * sizeof(*base)); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | /** | 41 | /** |
| @@ -95,6 +95,51 @@ static inline runlist_element *ntfs_rl_realloc(runlist_element *rl, | |||
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | /** | 97 | /** |
| 98 | * ntfs_rl_realloc_nofail - Reallocate memory for runlists | ||
| 99 | * @rl: original runlist | ||
| 100 | * @old_size: number of runlist elements in the original runlist @rl | ||
| 101 | * @new_size: number of runlist elements we need space for | ||
| 102 | * | ||
| 103 | * As the runlists grow, more memory will be required. To prevent the | ||
| 104 | * kernel having to allocate and reallocate large numbers of small bits of | ||
| 105 | * memory, this function returns an entire page of memory. | ||
| 106 | * | ||
| 107 | * This function guarantees that the allocation will succeed. It will sleep | ||
| 108 | * for as long as it takes to complete the allocation. | ||
| 109 | * | ||
| 110 | * It is up to the caller to serialize access to the runlist @rl. | ||
| 111 | * | ||
| 112 | * N.B. If the new allocation doesn't require a different number of pages in | ||
| 113 | * memory, the function will return the original pointer. | ||
| 114 | * | ||
| 115 | * On success, return a pointer to the newly allocated, or recycled, memory. | ||
| 116 | * On error, return -errno. The following error codes are defined: | ||
| 117 | * -ENOMEM - Not enough memory to allocate runlist array. | ||
| 118 | * -EINVAL - Invalid parameters were passed in. | ||
| 119 | */ | ||
| 120 | static inline runlist_element *ntfs_rl_realloc_nofail(runlist_element *rl, | ||
| 121 | int old_size, int new_size) | ||
| 122 | { | ||
| 123 | runlist_element *new_rl; | ||
| 124 | |||
| 125 | old_size = PAGE_ALIGN(old_size * sizeof(*rl)); | ||
| 126 | new_size = PAGE_ALIGN(new_size * sizeof(*rl)); | ||
| 127 | if (old_size == new_size) | ||
| 128 | return rl; | ||
| 129 | |||
| 130 | new_rl = ntfs_malloc_nofs_nofail(new_size); | ||
| 131 | BUG_ON(!new_rl); | ||
| 132 | |||
| 133 | if (likely(rl != NULL)) { | ||
| 134 | if (unlikely(old_size > new_size)) | ||
| 135 | old_size = new_size; | ||
| 136 | memcpy(new_rl, rl, old_size); | ||
| 137 | ntfs_free(rl); | ||
| 138 | } | ||
| 139 | return new_rl; | ||
| 140 | } | ||
| 141 | |||
| 142 | /** | ||
| 98 | * ntfs_are_rl_mergeable - test if two runlists can be joined together | 143 | * ntfs_are_rl_mergeable - test if two runlists can be joined together |
| 99 | * @dst: original runlist | 144 | * @dst: original runlist |
| 100 | * @src: new runlist to test for mergeability with @dst | 145 | * @src: new runlist to test for mergeability with @dst |
| @@ -497,6 +542,7 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl, | |||
| 497 | /* Scan to the end of the source runlist. */ | 542 | /* Scan to the end of the source runlist. */ |
| 498 | for (dend = 0; likely(drl[dend].length); dend++) | 543 | for (dend = 0; likely(drl[dend].length); dend++) |
| 499 | ; | 544 | ; |
| 545 | dend++; | ||
| 500 | drl = ntfs_rl_realloc(drl, dend, dend + 1); | 546 | drl = ntfs_rl_realloc(drl, dend, dend + 1); |
| 501 | if (IS_ERR(drl)) | 547 | if (IS_ERR(drl)) |
| 502 | return drl; | 548 | return drl; |
| @@ -566,8 +612,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl, | |||
| 566 | ((drl[dins].vcn + drl[dins].length) <= /* End of hole */ | 612 | ((drl[dins].vcn + drl[dins].length) <= /* End of hole */ |
| 567 | (srl[send - 1].vcn + srl[send - 1].length))); | 613 | (srl[send - 1].vcn + srl[send - 1].length))); |
| 568 | 614 | ||
| 569 | /* Or we'll lose an end marker */ | 615 | /* Or we will lose an end marker. */ |
| 570 | if (start && finish && (drl[dins].length == 0)) | 616 | if (finish && !drl[dins].length) |
| 571 | ss++; | 617 | ss++; |
| 572 | if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn)) | 618 | if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn)) |
| 573 | finish = FALSE; | 619 | finish = FALSE; |
| @@ -621,11 +667,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl, | |||
| 621 | if (drl[ds].lcn != LCN_RL_NOT_MAPPED) { | 667 | if (drl[ds].lcn != LCN_RL_NOT_MAPPED) { |
| 622 | /* Add an unmapped runlist element. */ | 668 | /* Add an unmapped runlist element. */ |
| 623 | if (!slots) { | 669 | if (!slots) { |
| 624 | /* FIXME/TODO: We need to have the | 670 | drl = ntfs_rl_realloc_nofail(drl, ds, |
| 625 | * extra memory already! (AIA) */ | 671 | ds + 2); |
| 626 | drl = ntfs_rl_realloc(drl, ds, ds + 2); | ||
| 627 | if (!drl) | ||
| 628 | goto critical_error; | ||
| 629 | slots = 2; | 672 | slots = 2; |
| 630 | } | 673 | } |
| 631 | ds++; | 674 | ds++; |
| @@ -640,13 +683,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl, | |||
| 640 | drl[ds].length = marker_vcn - drl[ds].vcn; | 683 | drl[ds].length = marker_vcn - drl[ds].vcn; |
| 641 | /* Finally add the ENOENT terminator. */ | 684 | /* Finally add the ENOENT terminator. */ |
| 642 | ds++; | 685 | ds++; |
| 643 | if (!slots) { | 686 | if (!slots) |
| 644 | /* FIXME/TODO: We need to have the extra | 687 | drl = ntfs_rl_realloc_nofail(drl, ds, ds + 1); |
| 645 | * memory already! (AIA) */ | ||
| 646 | drl = ntfs_rl_realloc(drl, ds, ds + 1); | ||
| 647 | if (!drl) | ||
| 648 | goto critical_error; | ||
| 649 | } | ||
| 650 | drl[ds].vcn = marker_vcn; | 688 | drl[ds].vcn = marker_vcn; |
| 651 | drl[ds].lcn = LCN_ENOENT; | 689 | drl[ds].lcn = LCN_ENOENT; |
| 652 | drl[ds].length = (s64)0; | 690 | drl[ds].length = (s64)0; |
| @@ -659,11 +697,6 @@ finished: | |||
| 659 | ntfs_debug("Merged runlist:"); | 697 | ntfs_debug("Merged runlist:"); |
| 660 | ntfs_debug_dump_runlist(drl); | 698 | ntfs_debug_dump_runlist(drl); |
| 661 | return drl; | 699 | return drl; |
| 662 | |||
| 663 | critical_error: | ||
| 664 | /* Critical error! We cannot afford to fail here. */ | ||
| 665 | ntfs_error(NULL, "Critical error! Not enough memory."); | ||
| 666 | panic("NTFS: Cannot continue."); | ||
| 667 | } | 700 | } |
| 668 | 701 | ||
| 669 | /** | 702 | /** |
| @@ -727,6 +760,9 @@ runlist_element *ntfs_mapping_pairs_decompress(const ntfs_volume *vol, | |||
| 727 | ntfs_error(vol->sb, "Corrupt attribute."); | 760 | ntfs_error(vol->sb, "Corrupt attribute."); |
| 728 | return ERR_PTR(-EIO); | 761 | return ERR_PTR(-EIO); |
| 729 | } | 762 | } |
| 763 | /* If the mapping pairs array is valid but empty, nothing to do. */ | ||
| 764 | if (!vcn && !*buf) | ||
| 765 | return old_rl; | ||
| 730 | /* Current position in runlist array. */ | 766 | /* Current position in runlist array. */ |
| 731 | rlpos = 0; | 767 | rlpos = 0; |
| 732 | /* Allocate first page and set current runlist size to one page. */ | 768 | /* Allocate first page and set current runlist size to one page. */ |
| @@ -1419,6 +1455,7 @@ err_out: | |||
| 1419 | 1455 | ||
| 1420 | /** | 1456 | /** |
| 1421 | * ntfs_rl_truncate_nolock - truncate a runlist starting at a specified vcn | 1457 | * ntfs_rl_truncate_nolock - truncate a runlist starting at a specified vcn |
| 1458 | * @vol: ntfs volume (needed for error output) | ||
| 1422 | * @runlist: runlist to truncate | 1459 | * @runlist: runlist to truncate |
| 1423 | * @new_length: the new length of the runlist in VCNs | 1460 | * @new_length: the new length of the runlist in VCNs |
| 1424 | * | 1461 | * |
| @@ -1426,12 +1463,16 @@ err_out: | |||
| 1426 | * holding the runlist elements to a length of @new_length VCNs. | 1463 | * holding the runlist elements to a length of @new_length VCNs. |
| 1427 | * | 1464 | * |
| 1428 | * If @new_length lies within the runlist, the runlist elements with VCNs of | 1465 | * If @new_length lies within the runlist, the runlist elements with VCNs of |
| 1429 | * @new_length and above are discarded. | 1466 | * @new_length and above are discarded. As a special case if @new_length is |
| 1467 | * zero, the runlist is discarded and set to NULL. | ||
| 1430 | * | 1468 | * |
| 1431 | * If @new_length lies beyond the runlist, a sparse runlist element is added to | 1469 | * If @new_length lies beyond the runlist, a sparse runlist element is added to |
| 1432 | * the end of the runlist @runlist or if the last runlist element is a sparse | 1470 | * the end of the runlist @runlist or if the last runlist element is a sparse |
| 1433 | * one already, this is extended. | 1471 | * one already, this is extended. |
| 1434 | * | 1472 | * |
| 1473 | * Note, no checking is done for unmapped runlist elements. It is assumed that | ||
| 1474 | * the caller has mapped any elements that need to be mapped already. | ||
| 1475 | * | ||
| 1435 | * Return 0 on success and -errno on error. | 1476 | * Return 0 on success and -errno on error. |
| 1436 | * | 1477 | * |
| 1437 | * Locking: The caller must hold @runlist->lock for writing. | 1478 | * Locking: The caller must hold @runlist->lock for writing. |
| @@ -1446,6 +1487,13 @@ int ntfs_rl_truncate_nolock(const ntfs_volume *vol, runlist *const runlist, | |||
| 1446 | BUG_ON(!runlist); | 1487 | BUG_ON(!runlist); |
| 1447 | BUG_ON(new_length < 0); | 1488 | BUG_ON(new_length < 0); |
| 1448 | rl = runlist->rl; | 1489 | rl = runlist->rl; |
| 1490 | if (!new_length) { | ||
| 1491 | ntfs_debug("Freeing runlist."); | ||
| 1492 | runlist->rl = NULL; | ||
| 1493 | if (rl) | ||
| 1494 | ntfs_free(rl); | ||
| 1495 | return 0; | ||
| 1496 | } | ||
| 1449 | if (unlikely(!rl)) { | 1497 | if (unlikely(!rl)) { |
| 1450 | /* | 1498 | /* |
| 1451 | * Create a runlist consisting of a sparse runlist element of | 1499 | * Create a runlist consisting of a sparse runlist element of |
| @@ -1553,4 +1601,288 @@ int ntfs_rl_truncate_nolock(const ntfs_volume *vol, runlist *const runlist, | |||
| 1553 | return 0; | 1601 | return 0; |
| 1554 | } | 1602 | } |
| 1555 | 1603 | ||
| 1604 | /** | ||
| 1605 | * ntfs_rl_punch_nolock - punch a hole into a runlist | ||
| 1606 | * @vol: ntfs volume (needed for error output) | ||
| 1607 | * @runlist: runlist to punch a hole into | ||
| 1608 | * @start: starting VCN of the hole to be created | ||
| 1609 | * @length: size of the hole to be created in units of clusters | ||
| 1610 | * | ||
| 1611 | * Punch a hole into the runlist @runlist starting at VCN @start and of size | ||
| 1612 | * @length clusters. | ||
| 1613 | * | ||
| 1614 | * Return 0 on success and -errno on error, in which case @runlist has not been | ||
| 1615 | * modified. | ||
| 1616 | * | ||
| 1617 | * If @start and/or @start + @length are outside the runlist return error code | ||
| 1618 | * -ENOENT. | ||
| 1619 | * | ||
| 1620 | * If the runlist contains unmapped or error elements between @start and @start | ||
| 1621 | * + @length return error code -EINVAL. | ||
| 1622 | * | ||
| 1623 | * Locking: The caller must hold @runlist->lock for writing. | ||
| 1624 | */ | ||
| 1625 | int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist, | ||
| 1626 | const VCN start, const s64 length) | ||
| 1627 | { | ||
| 1628 | const VCN end = start + length; | ||
| 1629 | s64 delta; | ||
| 1630 | runlist_element *rl, *rl_end, *rl_real_end, *trl; | ||
| 1631 | int old_size; | ||
| 1632 | BOOL lcn_fixup = FALSE; | ||
| 1633 | |||
| 1634 | ntfs_debug("Entering for start 0x%llx, length 0x%llx.", | ||
| 1635 | (long long)start, (long long)length); | ||
| 1636 | BUG_ON(!runlist); | ||
| 1637 | BUG_ON(start < 0); | ||
| 1638 | BUG_ON(length < 0); | ||
| 1639 | BUG_ON(end < 0); | ||
| 1640 | rl = runlist->rl; | ||
| 1641 | if (unlikely(!rl)) { | ||
| 1642 | if (likely(!start && !length)) | ||
| 1643 | return 0; | ||
| 1644 | return -ENOENT; | ||
| 1645 | } | ||
| 1646 | /* Find @start in the runlist. */ | ||
| 1647 | while (likely(rl->length && start >= rl[1].vcn)) | ||
| 1648 | rl++; | ||
| 1649 | rl_end = rl; | ||
| 1650 | /* Find @end in the runlist. */ | ||
| 1651 | while (likely(rl_end->length && end >= rl_end[1].vcn)) { | ||
| 1652 | /* Verify there are no unmapped or error elements. */ | ||
| 1653 | if (unlikely(rl_end->lcn < LCN_HOLE)) | ||
| 1654 | return -EINVAL; | ||
| 1655 | rl_end++; | ||
| 1656 | } | ||
| 1657 | /* Check the last element. */ | ||
| 1658 | if (unlikely(rl_end->length && rl_end->lcn < LCN_HOLE)) | ||
| 1659 | return -EINVAL; | ||
| 1660 | /* This covers @start being out of bounds, too. */ | ||
| 1661 | if (!rl_end->length && end > rl_end->vcn) | ||
| 1662 | return -ENOENT; | ||
| 1663 | if (!length) | ||
| 1664 | return 0; | ||
| 1665 | if (!rl->length) | ||
| 1666 | return -ENOENT; | ||
| 1667 | rl_real_end = rl_end; | ||
| 1668 | /* Determine the runlist size. */ | ||
| 1669 | while (likely(rl_real_end->length)) | ||
| 1670 | rl_real_end++; | ||
| 1671 | old_size = rl_real_end - runlist->rl + 1; | ||
| 1672 | /* If @start is in a hole simply extend the hole. */ | ||
| 1673 | if (rl->lcn == LCN_HOLE) { | ||
| 1674 | /* | ||
| 1675 | * If both @start and @end are in the same sparse run, we are | ||
| 1676 | * done. | ||
| 1677 | */ | ||
| 1678 | if (end <= rl[1].vcn) { | ||
| 1679 | ntfs_debug("Done (requested hole is already sparse)."); | ||
| 1680 | return 0; | ||
| 1681 | } | ||
| 1682 | extend_hole: | ||
| 1683 | /* Extend the hole. */ | ||
| 1684 | rl->length = end - rl->vcn; | ||
| 1685 | /* If @end is in a hole, merge it with the current one. */ | ||
| 1686 | if (rl_end->lcn == LCN_HOLE) { | ||
| 1687 | rl_end++; | ||
| 1688 | rl->length = rl_end->vcn - rl->vcn; | ||
| 1689 | } | ||
| 1690 | /* We have done the hole. Now deal with the remaining tail. */ | ||
| 1691 | rl++; | ||
| 1692 | /* Cut out all runlist elements up to @end. */ | ||
| 1693 | if (rl < rl_end) | ||
| 1694 | memmove(rl, rl_end, (rl_real_end - rl_end + 1) * | ||
| 1695 | sizeof(*rl)); | ||
| 1696 | /* Adjust the beginning of the tail if necessary. */ | ||
| 1697 | if (end > rl->vcn) { | ||
| 1698 | s64 delta = end - rl->vcn; | ||
| 1699 | rl->vcn = end; | ||
| 1700 | rl->length -= delta; | ||
| 1701 | /* Only adjust the lcn if it is real. */ | ||
| 1702 | if (rl->lcn >= 0) | ||
| 1703 | rl->lcn += delta; | ||
| 1704 | } | ||
| 1705 | shrink_allocation: | ||
| 1706 | /* Reallocate memory if the allocation changed. */ | ||
| 1707 | if (rl < rl_end) { | ||
| 1708 | rl = ntfs_rl_realloc(runlist->rl, old_size, | ||
| 1709 | old_size - (rl_end - rl)); | ||
| 1710 | if (IS_ERR(rl)) | ||
| 1711 | ntfs_warning(vol->sb, "Failed to shrink " | ||
| 1712 | "runlist buffer. This just " | ||
| 1713 | "wastes a bit of memory " | ||
| 1714 | "temporarily so we ignore it " | ||
| 1715 | "and return success."); | ||
| 1716 | else | ||
| 1717 | runlist->rl = rl; | ||
| 1718 | } | ||
| 1719 | ntfs_debug("Done (extend hole)."); | ||
| 1720 | return 0; | ||
| 1721 | } | ||
| 1722 | /* | ||
| 1723 | * If @start is at the beginning of a run things are easier as there is | ||
| 1724 | * no need to split the first run. | ||
| 1725 | */ | ||
| 1726 | if (start == rl->vcn) { | ||
| 1727 | /* | ||
| 1728 | * @start is at the beginning of a run. | ||
| 1729 | * | ||
| 1730 | * If the previous run is sparse, extend its hole. | ||
| 1731 | * | ||
| 1732 | * If @end is not in the same run, switch the run to be sparse | ||
| 1733 | * and extend the newly created hole. | ||
| 1734 | * | ||
| 1735 | * Thus both of these cases reduce the problem to the above | ||
| 1736 | * case of "@start is in a hole". | ||
| 1737 | */ | ||
| 1738 | if (rl > runlist->rl && (rl - 1)->lcn == LCN_HOLE) { | ||
| 1739 | rl--; | ||
| 1740 | goto extend_hole; | ||
| 1741 | } | ||
| 1742 | if (end >= rl[1].vcn) { | ||
| 1743 | rl->lcn = LCN_HOLE; | ||
| 1744 | goto extend_hole; | ||
| 1745 | } | ||
| 1746 | /* | ||
| 1747 | * The final case is when @end is in the same run as @start. | ||
| 1748 | * For this need to split the run into two. One run for the | ||
| 1749 | * sparse region between the beginning of the old run, i.e. | ||
| 1750 | * @start, and @end and one for the remaining non-sparse | ||
| 1751 | * region, i.e. between @end and the end of the old run. | ||
| 1752 | */ | ||
| 1753 | trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1); | ||
| 1754 | if (IS_ERR(trl)) | ||
| 1755 | goto enomem_out; | ||
| 1756 | old_size++; | ||
| 1757 | if (runlist->rl != trl) { | ||
| 1758 | rl = trl + (rl - runlist->rl); | ||
| 1759 | rl_end = trl + (rl_end - runlist->rl); | ||
| 1760 | rl_real_end = trl + (rl_real_end - runlist->rl); | ||
| 1761 | runlist->rl = trl; | ||
| 1762 | } | ||
| 1763 | split_end: | ||
| 1764 | /* Shift all the runs up by one. */ | ||
| 1765 | memmove(rl + 1, rl, (rl_real_end - rl + 1) * sizeof(*rl)); | ||
| 1766 | /* Finally, setup the two split runs. */ | ||
| 1767 | rl->lcn = LCN_HOLE; | ||
| 1768 | rl->length = length; | ||
| 1769 | rl++; | ||
| 1770 | rl->vcn += length; | ||
| 1771 | /* Only adjust the lcn if it is real. */ | ||
| 1772 | if (rl->lcn >= 0 || lcn_fixup) | ||
| 1773 | rl->lcn += length; | ||
| 1774 | rl->length -= length; | ||
| 1775 | ntfs_debug("Done (split one)."); | ||
| 1776 | return 0; | ||
| 1777 | } | ||
| 1778 | /* | ||
| 1779 | * @start is neither in a hole nor at the beginning of a run. | ||
| 1780 | * | ||
| 1781 | * If @end is in a hole, things are easier as simply truncating the run | ||
| 1782 | * @start is in to end at @start - 1, deleting all runs after that up | ||
| 1783 | * to @end, and finally extending the beginning of the run @end is in | ||
| 1784 | * to be @start is all that is needed. | ||
| 1785 | */ | ||
| 1786 | if (rl_end->lcn == LCN_HOLE) { | ||
| 1787 | /* Truncate the run containing @start. */ | ||
| 1788 | rl->length = start - rl->vcn; | ||
| 1789 | rl++; | ||
| 1790 | /* Cut out all runlist elements up to @end. */ | ||
| 1791 | if (rl < rl_end) | ||
| 1792 | memmove(rl, rl_end, (rl_real_end - rl_end + 1) * | ||
| 1793 | sizeof(*rl)); | ||
| 1794 | /* Extend the beginning of the run @end is in to be @start. */ | ||
| 1795 | rl->vcn = start; | ||
| 1796 | rl->length = rl[1].vcn - start; | ||
| 1797 | goto shrink_allocation; | ||
| 1798 | } | ||
| 1799 | /* | ||
| 1800 | * If @end is not in a hole there are still two cases to distinguish. | ||
| 1801 | * Either @end is or is not in the same run as @start. | ||
| 1802 | * | ||
| 1803 | * The second case is easier as it can be reduced to an already solved | ||
| 1804 | * problem by truncating the run @start is in to end at @start - 1. | ||
| 1805 | * Then, if @end is in the next run need to split the run into a sparse | ||
| 1806 | * run followed by a non-sparse run (already covered above) and if @end | ||
| 1807 | * is not in the next run switching it to be sparse, again reduces the | ||
| 1808 | * problem to the already covered case of "@start is in a hole". | ||
| 1809 | */ | ||
| 1810 | if (end >= rl[1].vcn) { | ||
| 1811 | /* | ||
| 1812 | * If @end is not in the next run, reduce the problem to the | ||
| 1813 | * case of "@start is in a hole". | ||
| 1814 | */ | ||
| 1815 | if (rl[1].length && end >= rl[2].vcn) { | ||
| 1816 | /* Truncate the run containing @start. */ | ||
| 1817 | rl->length = start - rl->vcn; | ||
| 1818 | rl++; | ||
| 1819 | rl->vcn = start; | ||
| 1820 | rl->lcn = LCN_HOLE; | ||
| 1821 | goto extend_hole; | ||
| 1822 | } | ||
| 1823 | trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 1); | ||
| 1824 | if (IS_ERR(trl)) | ||
| 1825 | goto enomem_out; | ||
| 1826 | old_size++; | ||
| 1827 | if (runlist->rl != trl) { | ||
| 1828 | rl = trl + (rl - runlist->rl); | ||
| 1829 | rl_end = trl + (rl_end - runlist->rl); | ||
| 1830 | rl_real_end = trl + (rl_real_end - runlist->rl); | ||
| 1831 | runlist->rl = trl; | ||
| 1832 | } | ||
| 1833 | /* Truncate the run containing @start. */ | ||
| 1834 | rl->length = start - rl->vcn; | ||
| 1835 | rl++; | ||
| 1836 | /* | ||
| 1837 | * @end is in the next run, reduce the problem to the case | ||
| 1838 | * where "@start is at the beginning of a run and @end is in | ||
| 1839 | * the same run as @start". | ||
| 1840 | */ | ||
| 1841 | delta = rl->vcn - start; | ||
| 1842 | rl->vcn = start; | ||
| 1843 | if (rl->lcn >= 0) { | ||
| 1844 | rl->lcn -= delta; | ||
| 1845 | /* Need this in case the lcn just became negative. */ | ||
| 1846 | lcn_fixup = TRUE; | ||
| 1847 | } | ||
| 1848 | rl->length += delta; | ||
| 1849 | goto split_end; | ||
| 1850 | } | ||
| 1851 | /* | ||
| 1852 | * The first case from above, i.e. @end is in the same run as @start. | ||
| 1853 | * We need to split the run into three. One run for the non-sparse | ||
| 1854 | * region between the beginning of the old run and @start, one for the | ||
| 1855 | * sparse region between @start and @end, and one for the remaining | ||
| 1856 | * non-sparse region, i.e. between @end and the end of the old run. | ||
| 1857 | */ | ||
| 1858 | trl = ntfs_rl_realloc(runlist->rl, old_size, old_size + 2); | ||
| 1859 | if (IS_ERR(trl)) | ||
| 1860 | goto enomem_out; | ||
| 1861 | old_size += 2; | ||
| 1862 | if (runlist->rl != trl) { | ||
| 1863 | rl = trl + (rl - runlist->rl); | ||
| 1864 | rl_end = trl + (rl_end - runlist->rl); | ||
| 1865 | rl_real_end = trl + (rl_real_end - runlist->rl); | ||
| 1866 | runlist->rl = trl; | ||
| 1867 | } | ||
| 1868 | /* Shift all the runs up by two. */ | ||
| 1869 | memmove(rl + 2, rl, (rl_real_end - rl + 1) * sizeof(*rl)); | ||
| 1870 | /* Finally, setup the three split runs. */ | ||
| 1871 | rl->length = start - rl->vcn; | ||
| 1872 | rl++; | ||
| 1873 | rl->vcn = start; | ||
| 1874 | rl->lcn = LCN_HOLE; | ||
| 1875 | rl->length = length; | ||
| 1876 | rl++; | ||
| 1877 | delta = end - rl->vcn; | ||
| 1878 | rl->vcn = end; | ||
| 1879 | rl->lcn += delta; | ||
| 1880 | rl->length -= delta; | ||
| 1881 | ntfs_debug("Done (split both)."); | ||
| 1882 | return 0; | ||
| 1883 | enomem_out: | ||
| 1884 | ntfs_error(vol->sb, "Not enough memory to extend runlist buffer."); | ||
| 1885 | return -ENOMEM; | ||
| 1886 | } | ||
| 1887 | |||
| 1556 | #endif /* NTFS_RW */ | 1888 | #endif /* NTFS_RW */ |
diff --git a/fs/ntfs/runlist.h b/fs/ntfs/runlist.h index aa0ee6540e7c..47728fbb610b 100644 --- a/fs/ntfs/runlist.h +++ b/fs/ntfs/runlist.h | |||
| @@ -94,6 +94,9 @@ extern int ntfs_mapping_pairs_build(const ntfs_volume *vol, s8 *dst, | |||
| 94 | extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol, | 94 | extern int ntfs_rl_truncate_nolock(const ntfs_volume *vol, |
| 95 | runlist *const runlist, const s64 new_length); | 95 | runlist *const runlist, const s64 new_length); |
| 96 | 96 | ||
| 97 | int ntfs_rl_punch_nolock(const ntfs_volume *vol, runlist *const runlist, | ||
| 98 | const VCN start, const s64 length); | ||
| 99 | |||
| 97 | #endif /* NTFS_RW */ | 100 | #endif /* NTFS_RW */ |
| 98 | 101 | ||
| 99 | #endif /* _LINUX_NTFS_RUNLIST_H */ | 102 | #endif /* _LINUX_NTFS_RUNLIST_H */ |
diff --git a/fs/ntfs/super.c b/fs/ntfs/super.c index 41aa8eb6755b..b2b392961268 100644 --- a/fs/ntfs/super.c +++ b/fs/ntfs/super.c | |||
| @@ -1133,7 +1133,8 @@ mft_unmap_out: | |||
| 1133 | * | 1133 | * |
| 1134 | * Return TRUE on success or FALSE on error. | 1134 | * Return TRUE on success or FALSE on error. |
| 1135 | */ | 1135 | */ |
| 1136 | static BOOL load_and_check_logfile(ntfs_volume *vol) | 1136 | static BOOL load_and_check_logfile(ntfs_volume *vol, |
| 1137 | RESTART_PAGE_HEADER **rp) | ||
| 1137 | { | 1138 | { |
| 1138 | struct inode *tmp_ino; | 1139 | struct inode *tmp_ino; |
| 1139 | 1140 | ||
| @@ -1145,7 +1146,7 @@ static BOOL load_and_check_logfile(ntfs_volume *vol) | |||
| 1145 | /* Caller will display error message. */ | 1146 | /* Caller will display error message. */ |
| 1146 | return FALSE; | 1147 | return FALSE; |
| 1147 | } | 1148 | } |
| 1148 | if (!ntfs_check_logfile(tmp_ino)) { | 1149 | if (!ntfs_check_logfile(tmp_ino, rp)) { |
| 1149 | iput(tmp_ino); | 1150 | iput(tmp_ino); |
| 1150 | /* ntfs_check_logfile() will have displayed error output. */ | 1151 | /* ntfs_check_logfile() will have displayed error output. */ |
| 1151 | return FALSE; | 1152 | return FALSE; |
| @@ -1689,6 +1690,7 @@ static BOOL load_system_files(ntfs_volume *vol) | |||
| 1689 | VOLUME_INFORMATION *vi; | 1690 | VOLUME_INFORMATION *vi; |
| 1690 | ntfs_attr_search_ctx *ctx; | 1691 | ntfs_attr_search_ctx *ctx; |
| 1691 | #ifdef NTFS_RW | 1692 | #ifdef NTFS_RW |
| 1693 | RESTART_PAGE_HEADER *rp; | ||
| 1692 | int err; | 1694 | int err; |
| 1693 | #endif /* NTFS_RW */ | 1695 | #endif /* NTFS_RW */ |
| 1694 | 1696 | ||
| @@ -1841,8 +1843,9 @@ get_ctx_vol_failed: | |||
| 1841 | * Get the inode for the logfile, check it and determine if the volume | 1843 | * Get the inode for the logfile, check it and determine if the volume |
| 1842 | * was shutdown cleanly. | 1844 | * was shutdown cleanly. |
| 1843 | */ | 1845 | */ |
| 1844 | if (!load_and_check_logfile(vol) || | 1846 | rp = NULL; |
| 1845 | !ntfs_is_logfile_clean(vol->logfile_ino)) { | 1847 | if (!load_and_check_logfile(vol, &rp) || |
| 1848 | !ntfs_is_logfile_clean(vol->logfile_ino, rp)) { | ||
| 1846 | static const char *es1a = "Failed to load $LogFile"; | 1849 | static const char *es1a = "Failed to load $LogFile"; |
| 1847 | static const char *es1b = "$LogFile is not clean"; | 1850 | static const char *es1b = "$LogFile is not clean"; |
| 1848 | static const char *es2 = ". Mount in Windows."; | 1851 | static const char *es2 = ". Mount in Windows."; |
| @@ -1857,6 +1860,10 @@ get_ctx_vol_failed: | |||
| 1857 | "continue nor on_errors=" | 1860 | "continue nor on_errors=" |
| 1858 | "remount-ro was specified%s", | 1861 | "remount-ro was specified%s", |
| 1859 | es1, es2); | 1862 | es1, es2); |
| 1863 | if (vol->logfile_ino) { | ||
| 1864 | BUG_ON(!rp); | ||
| 1865 | ntfs_free(rp); | ||
| 1866 | } | ||
| 1860 | goto iput_logfile_err_out; | 1867 | goto iput_logfile_err_out; |
| 1861 | } | 1868 | } |
| 1862 | sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME; | 1869 | sb->s_flags |= MS_RDONLY | MS_NOATIME | MS_NODIRATIME; |
| @@ -1867,6 +1874,7 @@ get_ctx_vol_failed: | |||
| 1867 | /* This will prevent a read-write remount. */ | 1874 | /* This will prevent a read-write remount. */ |
| 1868 | NVolSetErrors(vol); | 1875 | NVolSetErrors(vol); |
| 1869 | } | 1876 | } |
| 1877 | ntfs_free(rp); | ||
| 1870 | #endif /* NTFS_RW */ | 1878 | #endif /* NTFS_RW */ |
| 1871 | /* Get the root directory inode so we can do path lookups. */ | 1879 | /* Get the root directory inode so we can do path lookups. */ |
| 1872 | vol->root_ino = ntfs_iget(sb, FILE_root); | 1880 | vol->root_ino = ntfs_iget(sb, FILE_root); |
diff --git a/fs/ntfs/unistr.c b/fs/ntfs/unistr.c index 19c42e231b44..a389a5a16c84 100644 --- a/fs/ntfs/unistr.c +++ b/fs/ntfs/unistr.c | |||
| @@ -372,7 +372,8 @@ retry: wc = nls->uni2char(le16_to_cpu(ins[i]), ns + o, | |||
| 372 | return -EINVAL; | 372 | return -EINVAL; |
| 373 | conversion_err: | 373 | conversion_err: |
| 374 | ntfs_error(vol->sb, "Unicode name contains characters that cannot be " | 374 | ntfs_error(vol->sb, "Unicode name contains characters that cannot be " |
| 375 | "converted to character set %s.", nls->charset); | 375 | "converted to character set %s. You might want to " |
| 376 | "try to use the mount option nls=utf8.", nls->charset); | ||
| 376 | if (ns != *outs) | 377 | if (ns != *outs) |
| 377 | kfree(ns); | 378 | kfree(ns); |
| 378 | if (wc != -ENAMETOOLONG) | 379 | if (wc != -ENAMETOOLONG) |
diff --git a/fs/xfs/Makefile-linux-2.6 b/fs/xfs/Makefile-linux-2.6 index 8e18ff157247..d8c87fa21ad1 100644 --- a/fs/xfs/Makefile-linux-2.6 +++ b/fs/xfs/Makefile-linux-2.6 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | # | 1 | # |
| 2 | # Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. | 2 | # Copyright (c) 2000-2005 Silicon Graphics, Inc. All Rights Reserved. |
| 3 | # | 3 | # |
| 4 | # This program is free software; you can redistribute it and/or modify it | 4 | # This program is free software; you can redistribute it and/or modify it |
| 5 | # under the terms of version 2 of the GNU General Public License as | 5 | # under the terms of version 2 of the GNU General Public License as |
| @@ -55,7 +55,18 @@ ifeq ($(CONFIG_XFS_TRACE),y) | |||
| 55 | endif | 55 | endif |
| 56 | 56 | ||
| 57 | obj-$(CONFIG_XFS_FS) += xfs.o | 57 | obj-$(CONFIG_XFS_FS) += xfs.o |
| 58 | xfs-$(CONFIG_XFS_QUOTA) += quota/ | 58 | |
| 59 | xfs-$(CONFIG_XFS_QUOTA) += $(addprefix quota/, \ | ||
| 60 | xfs_dquot.o \ | ||
| 61 | xfs_dquot_item.o \ | ||
| 62 | xfs_trans_dquot.o \ | ||
| 63 | xfs_qm_syscalls.o \ | ||
| 64 | xfs_qm_bhv.o \ | ||
| 65 | xfs_qm.o) | ||
| 66 | |||
| 67 | ifeq ($(CONFIG_XFS_QUOTA),y) | ||
| 68 | xfs-$(CONFIG_PROC_FS) += quota/xfs_qm_stats.o | ||
| 69 | endif | ||
| 59 | 70 | ||
| 60 | xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o | 71 | xfs-$(CONFIG_XFS_RT) += xfs_rtalloc.o |
| 61 | xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o | 72 | xfs-$(CONFIG_XFS_POSIX_ACL) += xfs_acl.o |
diff --git a/include/asm-alpha/pci.h b/include/asm-alpha/pci.h index f681e675b823..4e115f368d5f 100644 --- a/include/asm-alpha/pci.h +++ b/include/asm-alpha/pci.h | |||
| @@ -254,6 +254,19 @@ extern void pcibios_resource_to_bus(struct pci_dev *, struct pci_bus_region *, | |||
| 254 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 254 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 255 | struct pci_bus_region *region); | 255 | struct pci_bus_region *region); |
| 256 | 256 | ||
| 257 | static inline struct resource * | ||
| 258 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 259 | { | ||
| 260 | struct resource *root = NULL; | ||
| 261 | |||
| 262 | if (res->flags & IORESOURCE_IO) | ||
| 263 | root = &ioport_resource; | ||
| 264 | if (res->flags & IORESOURCE_MEM) | ||
| 265 | root = &iomem_resource; | ||
| 266 | |||
| 267 | return root; | ||
| 268 | } | ||
| 269 | |||
| 257 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index | 270 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index |
| 258 | 271 | ||
| 259 | static inline int pci_proc_domain(struct pci_bus *bus) | 272 | static inline int pci_proc_domain(struct pci_bus *bus) |
diff --git a/include/asm-arm/arch-pxa/hardware.h b/include/asm-arm/arch-pxa/hardware.h index 72b04d846a23..cf35721cfa45 100644 --- a/include/asm-arm/arch-pxa/hardware.h +++ b/include/asm-arm/arch-pxa/hardware.h | |||
| @@ -44,24 +44,12 @@ | |||
| 44 | 44 | ||
| 45 | #ifndef __ASSEMBLY__ | 45 | #ifndef __ASSEMBLY__ |
| 46 | 46 | ||
| 47 | #if 0 | 47 | # define __REG(x) (*((volatile unsigned long *)io_p2v(x))) |
| 48 | # define __REG(x) (*((volatile u32 *)io_p2v(x))) | ||
| 49 | #else | ||
| 50 | /* | ||
| 51 | * This __REG() version gives the same results as the one above, except | ||
| 52 | * that we are fooling gcc somehow so it generates far better and smaller | ||
| 53 | * assembly code for access to contigous registers. It's a shame that gcc | ||
| 54 | * doesn't guess this by itself. | ||
| 55 | */ | ||
| 56 | #include <asm/types.h> | ||
| 57 | typedef struct { volatile u32 offset[4096]; } __regbase; | ||
| 58 | # define __REGP(x) ((__regbase *)((x)&~4095))->offset[((x)&4095)>>2] | ||
| 59 | # define __REG(x) __REGP(io_p2v(x)) | ||
| 60 | #endif | ||
| 61 | 48 | ||
| 62 | /* With indexed regs we don't want to feed the index through io_p2v() | 49 | /* With indexed regs we don't want to feed the index through io_p2v() |
| 63 | especially if it is a variable, otherwise horrible code will result. */ | 50 | especially if it is a variable, otherwise horrible code will result. */ |
| 64 | # define __REG2(x,y) (*(volatile u32 *)((u32)&__REG(x) + (y))) | 51 | # define __REG2(x,y) \ |
| 52 | (*(volatile unsigned long *)((unsigned long)&__REG(x) + (y))) | ||
| 65 | 53 | ||
| 66 | # define __PREG(x) (io_v2p((u32)&(x))) | 54 | # define __PREG(x) (io_v2p((u32)&(x))) |
| 67 | 55 | ||
diff --git a/include/asm-arm/arch-pxa/i2c.h b/include/asm-arm/arch-pxa/i2c.h new file mode 100644 index 000000000000..46ec2243974a --- /dev/null +++ b/include/asm-arm/arch-pxa/i2c.h | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | /* | ||
| 2 | * i2c_pxa.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2002 Intrinsyc Software Inc. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 as | ||
| 8 | * published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | */ | ||
| 11 | #ifndef _I2C_PXA_H_ | ||
| 12 | #define _I2C_PXA_H_ | ||
| 13 | |||
| 14 | #if 0 | ||
| 15 | #define DEF_TIMEOUT 3 | ||
| 16 | #else | ||
| 17 | /* need a longer timeout if we're dealing with the fact we may well be | ||
| 18 | * looking at a multi-master environment | ||
| 19 | */ | ||
| 20 | #define DEF_TIMEOUT 32 | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #define BUS_ERROR (-EREMOTEIO) | ||
| 24 | #define XFER_NAKED (-ECONNREFUSED) | ||
| 25 | #define I2C_RETRY (-2000) /* an error has occurred retry transmit */ | ||
| 26 | |||
| 27 | /* ICR initialize bit values | ||
| 28 | * | ||
| 29 | * 15. FM 0 (100 Khz operation) | ||
| 30 | * 14. UR 0 (No unit reset) | ||
| 31 | * 13. SADIE 0 (Disables the unit from interrupting on slave addresses | ||
| 32 | * matching its slave address) | ||
| 33 | * 12. ALDIE 0 (Disables the unit from interrupt when it loses arbitration | ||
| 34 | * in master mode) | ||
| 35 | * 11. SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode) | ||
| 36 | * 10. BEIE 1 (Enable interrupts from detected bus errors, no ACK sent) | ||
| 37 | * 9. IRFIE 1 (Enable interrupts from full buffer received) | ||
| 38 | * 8. ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty) | ||
| 39 | * 7. GCD 1 (Disables i2c unit response to general call messages as a slave) | ||
| 40 | * 6. IUE 0 (Disable unit until we change settings) | ||
| 41 | * 5. SCLE 1 (Enables the i2c clock output for master mode (drives SCL) | ||
| 42 | * 4. MA 0 (Only send stop with the ICR stop bit) | ||
| 43 | * 3. TB 0 (We are not transmitting a byte initially) | ||
| 44 | * 2. ACKNAK 0 (Send an ACK after the unit receives a byte) | ||
| 45 | * 1. STOP 0 (Do not send a STOP) | ||
| 46 | * 0. START 0 (Do not send a START) | ||
| 47 | * | ||
| 48 | */ | ||
| 49 | #define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE) | ||
| 50 | |||
| 51 | /* I2C status register init values | ||
| 52 | * | ||
| 53 | * 10. BED 1 (Clear bus error detected) | ||
| 54 | * 9. SAD 1 (Clear slave address detected) | ||
| 55 | * 7. IRF 1 (Clear IDBR Receive Full) | ||
| 56 | * 6. ITE 1 (Clear IDBR Transmit Empty) | ||
| 57 | * 5. ALD 1 (Clear Arbitration Loss Detected) | ||
| 58 | * 4. SSD 1 (Clear Slave Stop Detected) | ||
| 59 | */ | ||
| 60 | #define I2C_ISR_INIT 0x7FF /* status register init */ | ||
| 61 | |||
| 62 | struct i2c_slave_client; | ||
| 63 | |||
| 64 | struct i2c_pxa_platform_data { | ||
| 65 | unsigned int slave_addr; | ||
| 66 | struct i2c_slave_client *slave; | ||
| 67 | }; | ||
| 68 | |||
| 69 | extern void pxa_set_i2c_info(struct i2c_pxa_platform_data *info); | ||
| 70 | #endif | ||
diff --git a/include/asm-arm/arch-pxa/mmc.h b/include/asm-arm/arch-pxa/mmc.h index 9718063a2119..88c17dd02ed2 100644 --- a/include/asm-arm/arch-pxa/mmc.h +++ b/include/asm-arm/arch-pxa/mmc.h | |||
| @@ -9,6 +9,7 @@ struct mmc_host; | |||
| 9 | 9 | ||
| 10 | struct pxamci_platform_data { | 10 | struct pxamci_platform_data { |
| 11 | unsigned int ocr_mask; /* available voltages */ | 11 | unsigned int ocr_mask; /* available voltages */ |
| 12 | unsigned long detect_delay; /* delay in jiffies before detecting cards after interrupt */ | ||
| 12 | int (*init)(struct device *, irqreturn_t (*)(int, void *, struct pt_regs *), void *); | 13 | int (*init)(struct device *, irqreturn_t (*)(int, void *, struct pt_regs *), void *); |
| 13 | int (*get_ro)(struct device *); | 14 | int (*get_ro)(struct device *); |
| 14 | void (*setpower)(struct device *, unsigned int); | 15 | void (*setpower)(struct device *, unsigned int); |
diff --git a/include/asm-arm/arch-sa1100/hardware.h b/include/asm-arm/arch-sa1100/hardware.h index 10c62db34362..19c3b1e186bb 100644 --- a/include/asm-arm/arch-sa1100/hardware.h +++ b/include/asm-arm/arch-sa1100/hardware.h | |||
| @@ -49,23 +49,9 @@ | |||
| 49 | ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) | 49 | ( (((x)&0x00ffffff) | (((x)&(0x30000000>>VIO_SHIFT))<<VIO_SHIFT)) + PIO_START ) |
| 50 | 50 | ||
| 51 | #ifndef __ASSEMBLY__ | 51 | #ifndef __ASSEMBLY__ |
| 52 | #include <asm/types.h> | ||
| 53 | 52 | ||
| 54 | #if 0 | 53 | # define __REG(x) (*((volatile unsigned long *)io_p2v(x))) |
| 55 | # define __REG(x) (*((volatile u32 *)io_p2v(x))) | 54 | # define __PREG(x) (io_v2p((unsigned long)&(x))) |
| 56 | #else | ||
| 57 | /* | ||
| 58 | * This __REG() version gives the same results as the one above, except | ||
| 59 | * that we are fooling gcc somehow so it generates far better and smaller | ||
| 60 | * assembly code for access to contigous registers. It's a shame that gcc | ||
| 61 | * doesn't guess this by itself. | ||
| 62 | */ | ||
| 63 | typedef struct { volatile u32 offset[4096]; } __regbase; | ||
| 64 | # define __REGP(x) ((__regbase *)((x)&~4095))->offset[((x)&4095)>>2] | ||
| 65 | # define __REG(x) __REGP(io_p2v(x)) | ||
| 66 | #endif | ||
| 67 | |||
| 68 | # define __PREG(x) (io_v2p((u32)&(x))) | ||
| 69 | 55 | ||
| 70 | #else | 56 | #else |
| 71 | 57 | ||
diff --git a/include/asm-arm/cacheflush.h b/include/asm-arm/cacheflush.h index 035cdcff43d2..e81baff4f54b 100644 --- a/include/asm-arm/cacheflush.h +++ b/include/asm-arm/cacheflush.h | |||
| @@ -256,7 +256,7 @@ extern void dmac_flush_range(unsigned long, unsigned long); | |||
| 256 | * Convert calls to our calling convention. | 256 | * Convert calls to our calling convention. |
| 257 | */ | 257 | */ |
| 258 | #define flush_cache_all() __cpuc_flush_kern_all() | 258 | #define flush_cache_all() __cpuc_flush_kern_all() |
| 259 | 259 | #ifndef CONFIG_CPU_CACHE_VIPT | |
| 260 | static inline void flush_cache_mm(struct mm_struct *mm) | 260 | static inline void flush_cache_mm(struct mm_struct *mm) |
| 261 | { | 261 | { |
| 262 | if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) | 262 | if (cpu_isset(smp_processor_id(), mm->cpu_vm_mask)) |
| @@ -279,6 +279,11 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned l | |||
| 279 | __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); | 279 | __cpuc_flush_user_range(addr, addr + PAGE_SIZE, vma->vm_flags); |
| 280 | } | 280 | } |
| 281 | } | 281 | } |
| 282 | #else | ||
| 283 | extern void flush_cache_mm(struct mm_struct *mm); | ||
| 284 | extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end); | ||
| 285 | extern void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsigned long pfn); | ||
| 286 | #endif | ||
| 282 | 287 | ||
| 283 | /* | 288 | /* |
| 284 | * flush_cache_user_range is used when we want to ensure that the | 289 | * flush_cache_user_range is used when we want to ensure that the |
diff --git a/include/asm-arm/pci.h b/include/asm-arm/pci.h index 38ea5899a580..ead3ced38cb8 100644 --- a/include/asm-arm/pci.h +++ b/include/asm-arm/pci.h | |||
| @@ -64,6 +64,19 @@ extern void | |||
| 64 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 64 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 65 | struct pci_bus_region *region); | 65 | struct pci_bus_region *region); |
| 66 | 66 | ||
| 67 | static inline struct resource * | ||
| 68 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 69 | { | ||
| 70 | struct resource *root = NULL; | ||
| 71 | |||
| 72 | if (res->flags & IORESOURCE_IO) | ||
| 73 | root = &ioport_resource; | ||
| 74 | if (res->flags & IORESOURCE_MEM) | ||
| 75 | root = &iomem_resource; | ||
| 76 | |||
| 77 | return root; | ||
| 78 | } | ||
| 79 | |||
| 67 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) | 80 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) |
| 68 | { | 81 | { |
| 69 | } | 82 | } |
diff --git a/include/asm-generic/pci.h b/include/asm-generic/pci.h index ee1d8b5d8168..c36a77d3bf44 100644 --- a/include/asm-generic/pci.h +++ b/include/asm-generic/pci.h | |||
| @@ -30,6 +30,19 @@ pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | |||
| 30 | res->end = region->end; | 30 | res->end = region->end; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | static inline struct resource * | ||
| 34 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 35 | { | ||
| 36 | struct resource *root = NULL; | ||
| 37 | |||
| 38 | if (res->flags & IORESOURCE_IO) | ||
| 39 | root = &ioport_resource; | ||
| 40 | if (res->flags & IORESOURCE_MEM) | ||
| 41 | root = &iomem_resource; | ||
| 42 | |||
| 43 | return root; | ||
| 44 | } | ||
| 45 | |||
| 33 | #define pcibios_scan_all_fns(a, b) 0 | 46 | #define pcibios_scan_all_fns(a, b) 0 |
| 34 | 47 | ||
| 35 | #ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ | 48 | #ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ |
diff --git a/include/asm-ia64/iosapic.h b/include/asm-ia64/iosapic.h index a429fe225b07..20f98f1751a1 100644 --- a/include/asm-ia64/iosapic.h +++ b/include/asm-ia64/iosapic.h | |||
| @@ -80,12 +80,9 @@ extern int iosapic_remove (unsigned int gsi_base); | |||
| 80 | #endif /* CONFIG_HOTPLUG */ | 80 | #endif /* CONFIG_HOTPLUG */ |
| 81 | extern int gsi_to_vector (unsigned int gsi); | 81 | extern int gsi_to_vector (unsigned int gsi); |
| 82 | extern int gsi_to_irq (unsigned int gsi); | 82 | extern int gsi_to_irq (unsigned int gsi); |
| 83 | extern void iosapic_enable_intr (unsigned int vector); | ||
| 84 | extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, | 83 | extern int iosapic_register_intr (unsigned int gsi, unsigned long polarity, |
| 85 | unsigned long trigger); | 84 | unsigned long trigger); |
| 86 | #ifdef CONFIG_ACPI_DEALLOCATE_IRQ | ||
| 87 | extern void iosapic_unregister_intr (unsigned int irq); | 85 | extern void iosapic_unregister_intr (unsigned int irq); |
| 88 | #endif | ||
| 89 | extern void __init iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, | 86 | extern void __init iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi, |
| 90 | unsigned long polarity, | 87 | unsigned long polarity, |
| 91 | unsigned long trigger); | 88 | unsigned long trigger); |
| @@ -97,7 +94,6 @@ extern int __init iosapic_register_platform_intr (u32 int_type, | |||
| 97 | unsigned long trigger); | 94 | unsigned long trigger); |
| 98 | extern unsigned int iosapic_version (char __iomem *addr); | 95 | extern unsigned int iosapic_version (char __iomem *addr); |
| 99 | 96 | ||
| 100 | extern void iosapic_pci_fixup (int); | ||
| 101 | #ifdef CONFIG_NUMA | 97 | #ifdef CONFIG_NUMA |
| 102 | extern void __devinit map_iosapic_to_node (unsigned int, int); | 98 | extern void __devinit map_iosapic_to_node (unsigned int, int); |
| 103 | #endif | 99 | #endif |
diff --git a/include/asm-ia64/irq.h b/include/asm-ia64/irq.h index cd984d08fd15..dbe86c0bbce5 100644 --- a/include/asm-ia64/irq.h +++ b/include/asm-ia64/irq.h | |||
| @@ -35,8 +35,4 @@ extern void disable_irq_nosync (unsigned int); | |||
| 35 | extern void enable_irq (unsigned int); | 35 | extern void enable_irq (unsigned int); |
| 36 | extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); | 36 | extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); |
| 37 | 37 | ||
| 38 | struct irqaction; | ||
| 39 | struct pt_regs; | ||
| 40 | int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); | ||
| 41 | |||
| 42 | #endif /* _ASM_IA64_IRQ_H */ | 38 | #endif /* _ASM_IA64_IRQ_H */ |
diff --git a/include/asm-ia64/pci.h b/include/asm-ia64/pci.h index dba9f220be71..ef616fd4cb1b 100644 --- a/include/asm-ia64/pci.h +++ b/include/asm-ia64/pci.h | |||
| @@ -156,6 +156,19 @@ extern void pcibios_resource_to_bus(struct pci_dev *dev, | |||
| 156 | extern void pcibios_bus_to_resource(struct pci_dev *dev, | 156 | extern void pcibios_bus_to_resource(struct pci_dev *dev, |
| 157 | struct resource *res, struct pci_bus_region *region); | 157 | struct resource *res, struct pci_bus_region *region); |
| 158 | 158 | ||
| 159 | static inline struct resource * | ||
| 160 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 161 | { | ||
| 162 | struct resource *root = NULL; | ||
| 163 | |||
| 164 | if (res->flags & IORESOURCE_IO) | ||
| 165 | root = &ioport_resource; | ||
| 166 | if (res->flags & IORESOURCE_MEM) | ||
| 167 | root = &iomem_resource; | ||
| 168 | |||
| 169 | return root; | ||
| 170 | } | ||
| 171 | |||
| 159 | #define pcibios_scan_all_fns(a, b) 0 | 172 | #define pcibios_scan_all_fns(a, b) 0 |
| 160 | 173 | ||
| 161 | #endif /* _ASM_IA64_PCI_H */ | 174 | #endif /* _ASM_IA64_PCI_H */ |
diff --git a/include/asm-m68knommu/coldfire.h b/include/asm-m68knommu/coldfire.h index 16f32cc80c40..1df3f666a28e 100644 --- a/include/asm-m68knommu/coldfire.h +++ b/include/asm-m68knommu/coldfire.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define MCF_MBAR2 0x80000000 | 22 | #define MCF_MBAR2 0x80000000 |
| 23 | #define MCF_IPSBAR 0x40000000 | 23 | #define MCF_IPSBAR 0x40000000 |
| 24 | 24 | ||
| 25 | #if defined(CONFIG_M527x) || defined(CONFIG_M528x) | 25 | #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) |
| 26 | #undef MCF_MBAR | 26 | #undef MCF_MBAR |
| 27 | #define MCF_MBAR MCF_IPSBAR | 27 | #define MCF_MBAR MCF_IPSBAR |
| 28 | #endif | 28 | #endif |
| @@ -54,6 +54,8 @@ | |||
| 54 | #define MCF_CLK 54000000 | 54 | #define MCF_CLK 54000000 |
| 55 | #elif defined(CONFIG_CLOCK_60MHz) | 55 | #elif defined(CONFIG_CLOCK_60MHz) |
| 56 | #define MCF_CLK 60000000 | 56 | #define MCF_CLK 60000000 |
| 57 | #elif defined(CONFIG_CLOCK_62_5MHz) | ||
| 58 | #define MCF_CLK 62500000 | ||
| 57 | #elif defined(CONFIG_CLOCK_64MHz) | 59 | #elif defined(CONFIG_CLOCK_64MHz) |
| 58 | #define MCF_CLK 64000000 | 60 | #define MCF_CLK 64000000 |
| 59 | #elif defined(CONFIG_CLOCK_66MHz) | 61 | #elif defined(CONFIG_CLOCK_66MHz) |
| @@ -76,7 +78,7 @@ | |||
| 76 | * One some ColdFire family members the bus clock (used by internal | 78 | * One some ColdFire family members the bus clock (used by internal |
| 77 | * peripherals) is not the same as the CPU clock. | 79 | * peripherals) is not the same as the CPU clock. |
| 78 | */ | 80 | */ |
| 79 | #if defined(CONFIG_M5249) || defined(CONFIG_M527x) | 81 | #if defined(CONFIG_M523x) || defined(CONFIG_M5249) || defined(CONFIG_M527x) |
| 80 | #define MCF_BUSCLK (MCF_CLK / 2) | 82 | #define MCF_BUSCLK (MCF_CLK / 2) |
| 81 | #else | 83 | #else |
| 82 | #define MCF_BUSCLK MCF_CLK | 84 | #define MCF_BUSCLK MCF_CLK |
diff --git a/include/asm-m68knommu/m523xsim.h b/include/asm-m68knommu/m523xsim.h new file mode 100644 index 000000000000..926cfb805df7 --- /dev/null +++ b/include/asm-m68knommu/m523xsim.h | |||
| @@ -0,0 +1,46 @@ | |||
| 1 | /****************************************************************************/ | ||
| 2 | |||
| 3 | /* | ||
| 4 | * m523xsim.h -- ColdFire 523x System Integration Module support. | ||
| 5 | * | ||
| 6 | * (C) Copyright 2003-2005, Greg Ungerer <gerg@snapgear.com> | ||
| 7 | */ | ||
| 8 | |||
| 9 | /****************************************************************************/ | ||
| 10 | #ifndef m523xsim_h | ||
| 11 | #define m523xsim_h | ||
| 12 | /****************************************************************************/ | ||
| 13 | |||
| 14 | #include <linux/config.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Define the 523x SIM register set addresses. | ||
| 18 | */ | ||
| 19 | #define MCFICM_INTC0 0x0c00 /* Base for Interrupt Ctrl 0 */ | ||
| 20 | #define MCFICM_INTC1 0x0d00 /* Base for Interrupt Ctrl 0 */ | ||
| 21 | #define MCFINTC_IPRH 0x00 /* Interrupt pending 32-63 */ | ||
| 22 | #define MCFINTC_IPRL 0x04 /* Interrupt pending 1-31 */ | ||
| 23 | #define MCFINTC_IMRH 0x08 /* Interrupt mask 32-63 */ | ||
| 24 | #define MCFINTC_IMRL 0x0c /* Interrupt mask 1-31 */ | ||
| 25 | #define MCFINTC_INTFRCH 0x10 /* Interrupt force 32-63 */ | ||
| 26 | #define MCFINTC_INTFRCL 0x14 /* Interrupt force 1-31 */ | ||
| 27 | #define MCFINTC_IRLR 0x18 /* */ | ||
| 28 | #define MCFINTC_IACKL 0x19 /* */ | ||
| 29 | #define MCFINTC_ICR0 0x40 /* Base ICR register */ | ||
| 30 | |||
| 31 | #define MCFINT_VECBASE 64 /* Vector base number */ | ||
| 32 | #define MCFINT_UART0 13 /* Interrupt number for UART0 */ | ||
| 33 | #define MCFINT_PIT1 36 /* Interrupt number for PIT1 */ | ||
| 34 | #define MCFINT_QSPI 18 /* Interrupt number for QSPI */ | ||
| 35 | |||
| 36 | /* | ||
| 37 | * SDRAM configuration registers. | ||
| 38 | */ | ||
| 39 | #define MCFSIM_DCR 0x44 /* SDRAM control */ | ||
| 40 | #define MCFSIM_DACR0 0x48 /* SDRAM base address 0 */ | ||
| 41 | #define MCFSIM_DMR0 0x4c /* SDRAM address mask 0 */ | ||
| 42 | #define MCFSIM_DACR1 0x50 /* SDRAM base address 1 */ | ||
| 43 | #define MCFSIM_DMR1 0x54 /* SDRAM address mask 1 */ | ||
| 44 | |||
| 45 | /****************************************************************************/ | ||
| 46 | #endif /* m523xsim_h */ | ||
diff --git a/include/asm-m68knommu/mcfsim.h b/include/asm-m68knommu/mcfsim.h index 522e513c2bc6..b0c7736f7a99 100644 --- a/include/asm-m68knommu/mcfsim.h +++ b/include/asm-m68knommu/mcfsim.h | |||
| @@ -15,13 +15,15 @@ | |||
| 15 | #include <linux/config.h> | 15 | #include <linux/config.h> |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | * Include 5204, 5206/e, 5249, 5270/5271, 5272, 5280/5282, 5307 or | 18 | * Include 5204, 5206/e, 5235, 5249, 5270/5271, 5272, 5280/5282, |
| 19 | * 5407 specific addresses. | 19 | * 5307 or 5407 specific addresses. |
| 20 | */ | 20 | */ |
| 21 | #if defined(CONFIG_M5204) | 21 | #if defined(CONFIG_M5204) |
| 22 | #include <asm/m5204sim.h> | 22 | #include <asm/m5204sim.h> |
| 23 | #elif defined(CONFIG_M5206) || defined(CONFIG_M5206e) | 23 | #elif defined(CONFIG_M5206) || defined(CONFIG_M5206e) |
| 24 | #include <asm/m5206sim.h> | 24 | #include <asm/m5206sim.h> |
| 25 | #elif defined(CONFIG_M523x) | ||
| 26 | #include <asm/m523xsim.h> | ||
| 25 | #elif defined(CONFIG_M5249) | 27 | #elif defined(CONFIG_M5249) |
| 26 | #include <asm/m5249sim.h> | 28 | #include <asm/m5249sim.h> |
| 27 | #elif defined(CONFIG_M527x) | 29 | #elif defined(CONFIG_M527x) |
diff --git a/include/asm-m68knommu/mcfuart.h b/include/asm-m68knommu/mcfuart.h index 54d4a85f4fdf..9c1210613bc7 100644 --- a/include/asm-m68knommu/mcfuart.h +++ b/include/asm-m68knommu/mcfuart.h | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | #define MCFUART_BASE1 0x140 /* Base address of UART1 */ | 29 | #define MCFUART_BASE1 0x140 /* Base address of UART1 */ |
| 30 | #define MCFUART_BASE2 0x180 /* Base address of UART2 */ | 30 | #define MCFUART_BASE2 0x180 /* Base address of UART2 */ |
| 31 | #endif | 31 | #endif |
| 32 | #elif defined(CONFIG_M527x) || defined(CONFIG_M528x) | 32 | #elif defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) |
| 33 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ | 33 | #define MCFUART_BASE1 0x200 /* Base address of UART1 */ |
| 34 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ | 34 | #define MCFUART_BASE2 0x240 /* Base address of UART2 */ |
| 35 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ | 35 | #define MCFUART_BASE3 0x280 /* Base address of UART3 */ |
diff --git a/include/asm-parisc/pci.h b/include/asm-parisc/pci.h index 98d79a3d54fa..d0b761f690b5 100644 --- a/include/asm-parisc/pci.h +++ b/include/asm-parisc/pci.h | |||
| @@ -257,6 +257,19 @@ extern void | |||
| 257 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 257 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 258 | struct pci_bus_region *region); | 258 | struct pci_bus_region *region); |
| 259 | 259 | ||
| 260 | static inline struct resource * | ||
| 261 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 262 | { | ||
| 263 | struct resource *root = NULL; | ||
| 264 | |||
| 265 | if (res->flags & IORESOURCE_IO) | ||
| 266 | root = &ioport_resource; | ||
| 267 | if (res->flags & IORESOURCE_MEM) | ||
| 268 | root = &iomem_resource; | ||
| 269 | |||
| 270 | return root; | ||
| 271 | } | ||
| 272 | |||
| 260 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) | 273 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) |
| 261 | { | 274 | { |
| 262 | } | 275 | } |
diff --git a/include/asm-powerpc/8253pit.h b/include/asm-powerpc/8253pit.h index 862708a749b0..b70d6e53b303 100644 --- a/include/asm-powerpc/8253pit.h +++ b/include/asm-powerpc/8253pit.h | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | #ifndef _ASM_POWERPC_8253PIT_H | ||
| 2 | #define _ASM_POWERPC_8253PIT_H | ||
| 3 | |||
| 1 | /* | 4 | /* |
| 2 | * 8253/8254 Programmable Interval Timer | 5 | * 8253/8254 Programmable Interval Timer |
| 3 | */ | 6 | */ |
| 4 | 7 | ||
| 5 | #ifndef _8253PIT_H | ||
| 6 | #define _8253PIT_H | ||
| 7 | |||
| 8 | #define PIT_TICK_RATE 1193182UL | 8 | #define PIT_TICK_RATE 1193182UL |
| 9 | 9 | ||
| 10 | #endif | 10 | #endif /* _ASM_POWERPC_8253PIT_H */ |
diff --git a/include/asm-powerpc/agp.h b/include/asm-powerpc/agp.h index ca9e423307f4..885b4631a6cf 100644 --- a/include/asm-powerpc/agp.h +++ b/include/asm-powerpc/agp.h | |||
| @@ -1,10 +1,8 @@ | |||
| 1 | #ifndef AGP_H | 1 | #ifndef _ASM_POWERPC_AGP_H |
| 2 | #define AGP_H 1 | 2 | #define _ASM_POWERPC_AGP_H |
| 3 | 3 | ||
| 4 | #include <asm/io.h> | 4 | #include <asm/io.h> |
| 5 | 5 | ||
| 6 | /* nothing much needed here */ | ||
| 7 | |||
| 8 | #define map_page_into_agp(page) | 6 | #define map_page_into_agp(page) |
| 9 | #define unmap_page_from_agp(page) | 7 | #define unmap_page_from_agp(page) |
| 10 | #define flush_agp_mappings() | 8 | #define flush_agp_mappings() |
| @@ -20,4 +18,4 @@ | |||
| 20 | #define free_gatt_pages(table, order) \ | 18 | #define free_gatt_pages(table, order) \ |
| 21 | free_pages((unsigned long)(table), (order)) | 19 | free_pages((unsigned long)(table), (order)) |
| 22 | 20 | ||
| 23 | #endif | 21 | #endif /* _ASM_POWERPC_AGP_H */ |
diff --git a/include/asm-powerpc/bugs.h b/include/asm-powerpc/bugs.h index 310187d0e33a..42fdb73e3068 100644 --- a/include/asm-powerpc/bugs.h +++ b/include/asm-powerpc/bugs.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_BUGS_H | 1 | #ifndef _ASM_POWERPC_BUGS_H |
| 2 | #define _POWERPC_BUGS_H | 2 | #define _ASM_POWERPC_BUGS_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -13,6 +13,6 @@ | |||
| 13 | * architecture-dependent bugs. | 13 | * architecture-dependent bugs. |
| 14 | */ | 14 | */ |
| 15 | 15 | ||
| 16 | extern void check_bugs(void); | 16 | static inline void check_bugs(void) { } |
| 17 | 17 | ||
| 18 | #endif /* _POWERPC_BUGS_H */ | 18 | #endif /* _ASM_POWERPC_BUGS_H */ |
diff --git a/include/asm-powerpc/errno.h b/include/asm-powerpc/errno.h index 19f20bd41ae6..8c145fd17d86 100644 --- a/include/asm-powerpc/errno.h +++ b/include/asm-powerpc/errno.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _PPC_ERRNO_H | 1 | #ifndef _ASM_POWERPC_ERRNO_H |
| 2 | #define _PPC_ERRNO_H | 2 | #define _ASM_POWERPC_ERRNO_H |
| 3 | 3 | ||
| 4 | #include <asm-generic/errno.h> | 4 | #include <asm-generic/errno.h> |
| 5 | 5 | ||
| @@ -8,4 +8,4 @@ | |||
| 8 | 8 | ||
| 9 | #define _LAST_ERRNO 516 | 9 | #define _LAST_ERRNO 516 |
| 10 | 10 | ||
| 11 | #endif | 11 | #endif /* _ASM_POWERPC_ERRNO_H */ |
diff --git a/include/asm-powerpc/ioctl.h b/include/asm-powerpc/ioctl.h index 93c6acfdd0fd..8eb99848c402 100644 --- a/include/asm-powerpc/ioctl.h +++ b/include/asm-powerpc/ioctl.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _PPC_IOCTL_H | 1 | #ifndef _ASM_POWERPC_IOCTL_H |
| 2 | #define _PPC_IOCTL_H | 2 | #define _ASM_POWERPC_IOCTL_H |
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | /* | 5 | /* |
| @@ -66,4 +66,4 @@ extern unsigned int __invalid_size_argument_for_IOC; | |||
| 66 | #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) | 66 | #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) |
| 67 | #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) | 67 | #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) |
| 68 | 68 | ||
| 69 | #endif | 69 | #endif /* _ASM_POWERPC_IOCTL_H */ |
diff --git a/include/asm-powerpc/ioctls.h b/include/asm-powerpc/ioctls.h index f5b7f2b055e7..5b94ff489b8b 100644 --- a/include/asm-powerpc/ioctls.h +++ b/include/asm-powerpc/ioctls.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _ASM_PPC_IOCTLS_H | 1 | #ifndef _ASM_POWERPC_IOCTLS_H |
| 2 | #define _ASM_PPC_IOCTLS_H | 2 | #define _ASM_POWERPC_IOCTLS_H |
| 3 | 3 | ||
| 4 | #include <asm/ioctl.h> | 4 | #include <asm/ioctl.h> |
| 5 | 5 | ||
| @@ -104,4 +104,4 @@ | |||
| 104 | #define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ | 104 | #define TIOCMIWAIT 0x545C /* wait for a change on serial input line(s) */ |
| 105 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ | 105 | #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ |
| 106 | 106 | ||
| 107 | #endif /* _ASM_PPC_IOCTLS_H */ | 107 | #endif /* _ASM_POWERPC_IOCTLS_H */ |
diff --git a/include/asm-powerpc/linkage.h b/include/asm-powerpc/linkage.h index 291c2d01c44f..e1c4ac1cc4ba 100644 --- a/include/asm-powerpc/linkage.h +++ b/include/asm-powerpc/linkage.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #ifndef __ASM_LINKAGE_H | 1 | #ifndef _ASM_POWERPC_LINKAGE_H |
| 2 | #define __ASM_LINKAGE_H | 2 | #define _ASM_POWERPC_LINKAGE_H |
| 3 | 3 | ||
| 4 | /* Nothing to see here... */ | 4 | /* Nothing to see here... */ |
| 5 | 5 | ||
| 6 | #endif | 6 | #endif /* _ASM_POWERPC_LINKAGE_H */ |
diff --git a/include/asm-powerpc/mc146818rtc.h b/include/asm-powerpc/mc146818rtc.h index a5619a2a1393..f2741c8b59a1 100644 --- a/include/asm-powerpc/mc146818rtc.h +++ b/include/asm-powerpc/mc146818rtc.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_MC146818RTC_H | 1 | #ifndef _ASM_POWERPC_MC146818RTC_H |
| 2 | #define _POWERPC_MC146818RTC_H | 2 | #define _ASM_POWERPC_MC146818RTC_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * Machine dependent access functions for RTC registers. | 5 | * Machine dependent access functions for RTC registers. |
| @@ -33,4 +33,4 @@ outb_p((val),RTC_PORT(1)); \ | |||
| 33 | }) | 33 | }) |
| 34 | 34 | ||
| 35 | #endif /* __KERNEL__ */ | 35 | #endif /* __KERNEL__ */ |
| 36 | #endif /* _POWERPC_MC146818RTC_H */ | 36 | #endif /* _ASM_POWERPC_MC146818RTC_H */ |
diff --git a/include/asm-powerpc/mman.h b/include/asm-powerpc/mman.h index f2d55988d749..f5e5342fcac5 100644 --- a/include/asm-powerpc/mman.h +++ b/include/asm-powerpc/mman.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_MMAN_H | 1 | #ifndef _ASM_POWERPC_MMAN_H |
| 2 | #define _POWERPC_MMAN_H | 2 | #define _ASM_POWERPC_MMAN_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -49,4 +49,4 @@ | |||
| 49 | #define MAP_ANON MAP_ANONYMOUS | 49 | #define MAP_ANON MAP_ANONYMOUS |
| 50 | #define MAP_FILE 0 | 50 | #define MAP_FILE 0 |
| 51 | 51 | ||
| 52 | #endif /* _POWERPC_MMAN_H */ | 52 | #endif /* _ASM_POWERPC_MMAN_H */ |
diff --git a/include/asm-powerpc/module.h b/include/asm-powerpc/module.h index 4438f4fd6524..7ecd05e03051 100644 --- a/include/asm-powerpc/module.h +++ b/include/asm-powerpc/module.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_MODULE_H | 1 | #ifndef _ASM_POWERPC_MODULE_H |
| 2 | #define _POWERPC_MODULE_H | 2 | #define _ASM_POWERPC_MODULE_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -74,4 +74,4 @@ struct exception_table_entry; | |||
| 74 | void sort_ex_table(struct exception_table_entry *start, | 74 | void sort_ex_table(struct exception_table_entry *start, |
| 75 | struct exception_table_entry *finish); | 75 | struct exception_table_entry *finish); |
| 76 | 76 | ||
| 77 | #endif /* _POWERPC_MODULE_H */ | 77 | #endif /* _ASM_POWERPC_MODULE_H */ |
diff --git a/include/asm-ppc/msgbuf.h b/include/asm-powerpc/msgbuf.h index 1053452a9376..dd76743c7537 100644 --- a/include/asm-ppc/msgbuf.h +++ b/include/asm-powerpc/msgbuf.h | |||
| @@ -1,17 +1,25 @@ | |||
| 1 | #ifndef _PPC_MSGBUF_H | 1 | #ifndef _ASM_POWERPC_MSGBUF_H |
| 2 | #define _PPC_MSGBUF_H | 2 | #define _ASM_POWERPC_MSGBUF_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * The msqid64_ds structure for the PPC architecture. | 5 | * The msqid64_ds structure for the PowerPC architecture. |
| 6 | * Note extra padding because this structure is passed back and forth | ||
| 7 | * between kernel and user space. | ||
| 6 | */ | 8 | */ |
| 7 | 9 | ||
| 8 | struct msqid64_ds { | 10 | struct msqid64_ds { |
| 9 | struct ipc64_perm msg_perm; | 11 | struct ipc64_perm msg_perm; |
| 12 | #ifndef __powerpc64__ | ||
| 10 | unsigned int __unused1; | 13 | unsigned int __unused1; |
| 14 | #endif | ||
| 11 | __kernel_time_t msg_stime; /* last msgsnd time */ | 15 | __kernel_time_t msg_stime; /* last msgsnd time */ |
| 16 | #ifndef __powerpc64__ | ||
| 12 | unsigned int __unused2; | 17 | unsigned int __unused2; |
| 18 | #endif | ||
| 13 | __kernel_time_t msg_rtime; /* last msgrcv time */ | 19 | __kernel_time_t msg_rtime; /* last msgrcv time */ |
| 20 | #ifndef __powerpc64__ | ||
| 14 | unsigned int __unused3; | 21 | unsigned int __unused3; |
| 22 | #endif | ||
| 15 | __kernel_time_t msg_ctime; /* last change time */ | 23 | __kernel_time_t msg_ctime; /* last change time */ |
| 16 | unsigned long msg_cbytes; /* current number of bytes on queue */ | 24 | unsigned long msg_cbytes; /* current number of bytes on queue */ |
| 17 | unsigned long msg_qnum; /* number of messages in queue */ | 25 | unsigned long msg_qnum; /* number of messages in queue */ |
| @@ -22,4 +30,4 @@ struct msqid64_ds { | |||
| 22 | unsigned long __unused5; | 30 | unsigned long __unused5; |
| 23 | }; | 31 | }; |
| 24 | 32 | ||
| 25 | #endif /* _PPC_MSGBUF_H */ | 33 | #endif /* _ASM_POWERPC_MSGBUF_H */ |
diff --git a/include/asm-powerpc/namei.h b/include/asm-powerpc/namei.h index 29c9ec832133..657443474a6a 100644 --- a/include/asm-powerpc/namei.h +++ b/include/asm-powerpc/namei.h | |||
| @@ -1,14 +1,14 @@ | |||
| 1 | #ifndef _ASM_POWERPC_NAMEI_H | ||
| 2 | #define _ASM_POWERPC_NAMEI_H | ||
| 3 | |||
| 4 | #ifdef __KERNEL__ | ||
| 5 | |||
| 1 | /* | 6 | /* |
| 2 | * include/asm-ppc/namei.h | ||
| 3 | * Adapted from include/asm-alpha/namei.h | 7 | * Adapted from include/asm-alpha/namei.h |
| 4 | * | 8 | * |
| 5 | * Included from fs/namei.c | 9 | * Included from fs/namei.c |
| 6 | */ | 10 | */ |
| 7 | 11 | ||
| 8 | #ifdef __KERNEL__ | ||
| 9 | #ifndef __PPC_NAMEI_H | ||
| 10 | #define __PPC_NAMEI_H | ||
| 11 | |||
| 12 | /* This dummy routine maybe changed to something useful | 12 | /* This dummy routine maybe changed to something useful |
| 13 | * for /usr/gnemul/ emulation stuff. | 13 | * for /usr/gnemul/ emulation stuff. |
| 14 | * Look at asm-sparc/namei.h for details. | 14 | * Look at asm-sparc/namei.h for details. |
| @@ -16,5 +16,5 @@ | |||
| 16 | 16 | ||
| 17 | #define __emul_prefix() NULL | 17 | #define __emul_prefix() NULL |
| 18 | 18 | ||
| 19 | #endif /* __PPC_NAMEI_H */ | 19 | #endif /* __KERNEL__ */ |
| 20 | #endif /* __KERNEL__ */ | 20 | #endif /* _ASM_POWERPC_NAMEI_H */ |
diff --git a/include/asm-ppc/param.h b/include/asm-powerpc/param.h index 6198b1657a45..bdc724f70884 100644 --- a/include/asm-ppc/param.h +++ b/include/asm-powerpc/param.h | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | #ifndef _ASM_PPC_PARAM_H | 1 | #ifndef _ASM_POWERPC_PARAM_H |
| 2 | #define _ASM_PPC_PARAM_H | 2 | #define _ASM_POWERPC_PARAM_H |
| 3 | 3 | ||
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | 5 | ||
| 6 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
| 7 | #define HZ CONFIG_HZ /* internal timer frequency */ | 7 | #define HZ CONFIG_HZ /* internal kernel timer frequency */ |
| 8 | #define USER_HZ 100 /* for user interfaces in "ticks" */ | 8 | #define USER_HZ 100 /* for user interfaces in "ticks" */ |
| 9 | #define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */ | 9 | #define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */ |
| 10 | #endif /* __KERNEL__ */ | 10 | #endif /* __KERNEL__ */ |
| @@ -21,4 +21,4 @@ | |||
| 21 | 21 | ||
| 22 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | 22 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ |
| 23 | 23 | ||
| 24 | #endif | 24 | #endif /* _ASM_POWERPC_PARAM_H */ |
diff --git a/include/asm-powerpc/poll.h b/include/asm-powerpc/poll.h index be5024913c62..edd2054da86b 100644 --- a/include/asm-powerpc/poll.h +++ b/include/asm-powerpc/poll.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef __PPC_POLL_H | 1 | #ifndef _ASM_POWERPC_POLL_H |
| 2 | #define __PPC_POLL_H | 2 | #define _ASM_POWERPC_POLL_H |
| 3 | 3 | ||
| 4 | #define POLLIN 0x0001 | 4 | #define POLLIN 0x0001 |
| 5 | #define POLLPRI 0x0002 | 5 | #define POLLPRI 0x0002 |
| @@ -20,4 +20,4 @@ struct pollfd { | |||
| 20 | short revents; | 20 | short revents; |
| 21 | }; | 21 | }; |
| 22 | 22 | ||
| 23 | #endif | 23 | #endif /* _ASM_POWERPC_POLL_H */ |
diff --git a/include/asm-powerpc/sembuf.h b/include/asm-powerpc/sembuf.h index c98fc18fe805..99a41938ae3d 100644 --- a/include/asm-powerpc/sembuf.h +++ b/include/asm-powerpc/sembuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_SEMBUF_H | 1 | #ifndef _ASM_POWERPC_SEMBUF_H |
| 2 | #define _POWERPC_SEMBUF_H | 2 | #define _ASM_POWERPC_SEMBUF_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -33,4 +33,4 @@ struct semid64_ds { | |||
| 33 | unsigned long __unused4; | 33 | unsigned long __unused4; |
| 34 | }; | 34 | }; |
| 35 | 35 | ||
| 36 | #endif /* _POWERPC_SEMBUF_H */ | 36 | #endif /* _ASM_POWERPC_SEMBUF_H */ |
diff --git a/include/asm-powerpc/setup.h b/include/asm-powerpc/setup.h new file mode 100644 index 000000000000..3d9740aae018 --- /dev/null +++ b/include/asm-powerpc/setup.h | |||
| @@ -0,0 +1,9 @@ | |||
| 1 | #ifndef _ASM_POWERPC_SETUP_H | ||
| 2 | #define _ASM_POWERPC_SETUP_H | ||
| 3 | |||
| 4 | #ifdef __KERNEL__ | ||
| 5 | |||
| 6 | #define COMMAND_LINE_SIZE 512 | ||
| 7 | |||
| 8 | #endif /* __KERNEL__ */ | ||
| 9 | #endif /* _ASM_POWERPC_SETUP_H */ | ||
diff --git a/include/asm-powerpc/shmbuf.h b/include/asm-powerpc/shmbuf.h index 29632db3b178..8efa39698b6c 100644 --- a/include/asm-powerpc/shmbuf.h +++ b/include/asm-powerpc/shmbuf.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_SHMBUF_H | 1 | #ifndef _ASM_POWERPC_SHMBUF_H |
| 2 | #define _POWERPC_SHMBUF_H | 2 | #define _ASM_POWERPC_SHMBUF_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -21,19 +21,19 @@ | |||
| 21 | 21 | ||
| 22 | struct shmid64_ds { | 22 | struct shmid64_ds { |
| 23 | struct ipc64_perm shm_perm; /* operation perms */ | 23 | struct ipc64_perm shm_perm; /* operation perms */ |
| 24 | #ifndef __power64__ | 24 | #ifndef __powerpc64__ |
| 25 | unsigned long __unused1; | 25 | unsigned long __unused1; |
| 26 | #endif | 26 | #endif |
| 27 | __kernel_time_t shm_atime; /* last attach time */ | 27 | __kernel_time_t shm_atime; /* last attach time */ |
| 28 | #ifndef __power64__ | 28 | #ifndef __powerpc64__ |
| 29 | unsigned long __unused2; | 29 | unsigned long __unused2; |
| 30 | #endif | 30 | #endif |
| 31 | __kernel_time_t shm_dtime; /* last detach time */ | 31 | __kernel_time_t shm_dtime; /* last detach time */ |
| 32 | #ifndef __power64__ | 32 | #ifndef __powerpc64__ |
| 33 | unsigned long __unused3; | 33 | unsigned long __unused3; |
| 34 | #endif | 34 | #endif |
| 35 | __kernel_time_t shm_ctime; /* last change time */ | 35 | __kernel_time_t shm_ctime; /* last change time */ |
| 36 | #ifndef __power64__ | 36 | #ifndef __powerpc64__ |
| 37 | unsigned long __unused4; | 37 | unsigned long __unused4; |
| 38 | #endif | 38 | #endif |
| 39 | size_t shm_segsz; /* size of segment (bytes) */ | 39 | size_t shm_segsz; /* size of segment (bytes) */ |
| @@ -56,4 +56,4 @@ struct shminfo64 { | |||
| 56 | unsigned long __unused4; | 56 | unsigned long __unused4; |
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | #endif /* _POWERPC_SHMBUF_H */ | 59 | #endif /* _ASM_POWERPC_SHMBUF_H */ |
diff --git a/include/asm-powerpc/shmparam.h b/include/asm-powerpc/shmparam.h index d6250602ae64..5cda42a6d39e 100644 --- a/include/asm-powerpc/shmparam.h +++ b/include/asm-powerpc/shmparam.h | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | #ifndef _PPC_SHMPARAM_H | 1 | #ifndef _ASM_POWERPC_SHMPARAM_H |
| 2 | #define _PPC_SHMPARAM_H | 2 | #define _ASM_POWERPC_SHMPARAM_H |
| 3 | 3 | ||
| 4 | #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ | 4 | #define SHMLBA PAGE_SIZE /* attach addr a multiple of this */ |
| 5 | 5 | ||
| 6 | #endif /* _PPC_SHMPARAM_H */ | 6 | #endif /* _ASM_POWERPC_SHMPARAM_H */ |
diff --git a/include/asm-powerpc/siginfo.h b/include/asm-powerpc/siginfo.h index ae70b8010b19..538ea8ef509b 100644 --- a/include/asm-powerpc/siginfo.h +++ b/include/asm-powerpc/siginfo.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_SIGINFO_H | 1 | #ifndef _ASM_POWERPC_SIGINFO_H |
| 2 | #define _POWERPC_SIGINFO_H | 2 | #define _ASM_POWERPC_SIGINFO_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -15,4 +15,4 @@ | |||
| 15 | 15 | ||
| 16 | #include <asm-generic/siginfo.h> | 16 | #include <asm-generic/siginfo.h> |
| 17 | 17 | ||
| 18 | #endif /* _POWERPC_SIGINFO_H */ | 18 | #endif /* _ASM_POWERPC_SIGINFO_H */ |
diff --git a/include/asm-powerpc/socket.h b/include/asm-powerpc/socket.h index 51a0cf5ee9f0..e4b8177d4acc 100644 --- a/include/asm-powerpc/socket.h +++ b/include/asm-powerpc/socket.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_SOCKET_H | 1 | #ifndef _ASM_POWERPC_SOCKET_H |
| 2 | #define _POWERPC_SOCKET_H | 2 | #define _ASM_POWERPC_SOCKET_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -56,4 +56,4 @@ | |||
| 56 | 56 | ||
| 57 | #define SO_PEERSEC 31 | 57 | #define SO_PEERSEC 31 |
| 58 | 58 | ||
| 59 | #endif /* _POWERPC_SOCKET_H */ | 59 | #endif /* _ASM_POWERPC_SOCKET_H */ |
diff --git a/include/asm-powerpc/sockios.h b/include/asm-powerpc/sockios.h index ef7ff664167e..590078d8ed28 100644 --- a/include/asm-powerpc/sockios.h +++ b/include/asm-powerpc/sockios.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_SOCKIOS_H | 1 | #ifndef _ASM_POWERPC_SOCKIOS_H |
| 2 | #define _POWERPC_SOCKIOS_H | 2 | #define _ASM_POWERPC_SOCKIOS_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -16,4 +16,4 @@ | |||
| 16 | #define SIOCATMARK 0x8905 | 16 | #define SIOCATMARK 0x8905 |
| 17 | #define SIOCGSTAMP 0x8906 /* Get stamp */ | 17 | #define SIOCGSTAMP 0x8906 /* Get stamp */ |
| 18 | 18 | ||
| 19 | #endif /* _POWERPC_SOCKIOS_H */ | 19 | #endif /* _ASM_POWERPC_SOCKIOS_H */ |
diff --git a/include/asm-powerpc/string.h b/include/asm-powerpc/string.h index 225575997392..8606a696c088 100644 --- a/include/asm-powerpc/string.h +++ b/include/asm-powerpc/string.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _PPC_STRING_H_ | 1 | #ifndef _ASM_POWERPC_STRING_H |
| 2 | #define _PPC_STRING_H_ | 2 | #define _ASM_POWERPC_STRING_H |
| 3 | 3 | ||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 5 | 5 | ||
| @@ -29,4 +29,4 @@ extern void * memchr(const void *,int,__kernel_size_t); | |||
| 29 | 29 | ||
| 30 | #endif /* __KERNEL__ */ | 30 | #endif /* __KERNEL__ */ |
| 31 | 31 | ||
| 32 | #endif | 32 | #endif /* _ASM_POWERPC_STRING_H */ |
diff --git a/include/asm-powerpc/termbits.h b/include/asm-powerpc/termbits.h index 2c5bf85a8c3c..ebf6055481dc 100644 --- a/include/asm-powerpc/termbits.h +++ b/include/asm-powerpc/termbits.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_TERMBITS_H | 1 | #ifndef _ASM_POWERPC_TERMBITS_H |
| 2 | #define _POWERPC_TERMBITS_H | 2 | #define _ASM_POWERPC_TERMBITS_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
| @@ -188,4 +188,4 @@ struct termios { | |||
| 188 | #define TCSADRAIN 1 | 188 | #define TCSADRAIN 1 |
| 189 | #define TCSAFLUSH 2 | 189 | #define TCSAFLUSH 2 |
| 190 | 190 | ||
| 191 | #endif /* _POWERPC_TERMBITS_H */ | 191 | #endif /* _ASM_POWERPC_TERMBITS_H */ |
diff --git a/include/asm-powerpc/termios.h b/include/asm-powerpc/termios.h index 237533bb0e9f..c5b8e5358f83 100644 --- a/include/asm-powerpc/termios.h +++ b/include/asm-powerpc/termios.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | #ifndef _POWERPC_TERMIOS_H | 1 | #ifndef _ASM_POWERPC_TERMIOS_H |
| 2 | #define _POWERPC_TERMIOS_H | 2 | #define _ASM_POWERPC_TERMIOS_H |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| 5 | * Liberally adapted from alpha/termios.h. In particular, the c_cc[] | 5 | * Liberally adapted from alpha/termios.h. In particular, the c_cc[] |
| @@ -233,4 +233,4 @@ struct termio { | |||
| 233 | 233 | ||
| 234 | #endif /* __KERNEL__ */ | 234 | #endif /* __KERNEL__ */ |
| 235 | 235 | ||
| 236 | #endif /* _POWERPC_TERMIOS_H */ | 236 | #endif /* _ASM_POWERPC_TERMIOS_H */ |
diff --git a/include/asm-ppc/timex.h b/include/asm-powerpc/timex.h index cffc8712077c..51c5b316be55 100644 --- a/include/asm-ppc/timex.h +++ b/include/asm-powerpc/timex.h | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | #ifndef _ASM_POWERPC_TIMEX_H | ||
| 2 | #define _ASM_POWERPC_TIMEX_H | ||
| 3 | |||
| 4 | #ifdef __KERNEL__ | ||
| 5 | |||
| 1 | /* | 6 | /* |
| 2 | * include/asm-ppc/timex.h | 7 | * PowerPC architecture timex specifications |
| 3 | * | ||
| 4 | * ppc architecture timex specifications | ||
| 5 | */ | 8 | */ |
| 6 | #ifdef __KERNEL__ | ||
| 7 | #ifndef _ASMppc_TIMEX_H | ||
| 8 | #define _ASMppc_TIMEX_H | ||
| 9 | 9 | ||
| 10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
| 11 | #include <asm/cputable.h> | 11 | #include <asm/cputable.h> |
| @@ -14,14 +14,21 @@ | |||
| 14 | 14 | ||
| 15 | typedef unsigned long cycles_t; | 15 | typedef unsigned long cycles_t; |
| 16 | 16 | ||
| 17 | /* | ||
| 18 | * For the "cycle" counter we use the timebase lower half. | ||
| 19 | * Currently only used on SMP. | ||
| 20 | */ | ||
| 21 | |||
| 22 | static inline cycles_t get_cycles(void) | 17 | static inline cycles_t get_cycles(void) |
| 23 | { | 18 | { |
| 24 | cycles_t ret = 0; | 19 | cycles_t ret; |
| 20 | |||
| 21 | #ifdef __powerpc64__ | ||
| 22 | |||
| 23 | __asm__ __volatile__("mftb %0" : "=r" (ret) : ); | ||
| 24 | |||
| 25 | #else | ||
| 26 | /* | ||
| 27 | * For the "cycle" counter we use the timebase lower half. | ||
| 28 | * Currently only used on SMP. | ||
| 29 | */ | ||
| 30 | |||
| 31 | ret = 0; | ||
| 25 | 32 | ||
| 26 | __asm__ __volatile__( | 33 | __asm__ __volatile__( |
| 27 | "98: mftb %0\n" | 34 | "98: mftb %0\n" |
| @@ -33,8 +40,10 @@ static inline cycles_t get_cycles(void) | |||
| 33 | " .long 99b\n" | 40 | " .long 99b\n" |
| 34 | ".previous" | 41 | ".previous" |
| 35 | : "=r" (ret) : "i" (CPU_FTR_601)); | 42 | : "=r" (ret) : "i" (CPU_FTR_601)); |
| 43 | #endif | ||
| 44 | |||
| 36 | return ret; | 45 | return ret; |
| 37 | } | 46 | } |
| 38 | 47 | ||
| 39 | #endif | 48 | #endif /* __KERNEL__ */ |
| 40 | #endif /* __KERNEL__ */ | 49 | #endif /* _ASM_POWERPC_TIMEX_H */ |
diff --git a/include/asm-ppc64/topology.h b/include/asm-powerpc/topology.h index 1e9b19073230..2512e3836bf4 100644 --- a/include/asm-ppc64/topology.h +++ b/include/asm-powerpc/topology.h | |||
| @@ -1,11 +1,12 @@ | |||
| 1 | #ifndef _ASM_PPC64_TOPOLOGY_H | 1 | #ifndef _ASM_POWERPC_TOPOLOGY_H |
| 2 | #define _ASM_PPC64_TOPOLOGY_H | 2 | #define _ASM_POWERPC_TOPOLOGY_H |
| 3 | 3 | ||
| 4 | #include <linux/config.h> | 4 | #include <linux/config.h> |
| 5 | #include <asm/mmzone.h> | ||
| 6 | 5 | ||
| 7 | #ifdef CONFIG_NUMA | 6 | #ifdef CONFIG_NUMA |
| 8 | 7 | ||
| 8 | #include <asm/mmzone.h> | ||
| 9 | |||
| 9 | static inline int cpu_to_node(int cpu) | 10 | static inline int cpu_to_node(int cpu) |
| 10 | { | 11 | { |
| 11 | int node; | 12 | int node; |
| @@ -66,4 +67,4 @@ static inline int node_to_first_cpu(int node) | |||
| 66 | 67 | ||
| 67 | #endif /* CONFIG_NUMA */ | 68 | #endif /* CONFIG_NUMA */ |
| 68 | 69 | ||
| 69 | #endif /* _ASM_PPC64_TOPOLOGY_H */ | 70 | #endif /* _ASM_POWERPC_TOPOLOGY_H */ |
diff --git a/include/asm-powerpc/unaligned.h b/include/asm-powerpc/unaligned.h index 45520d9b85d1..6c95dfa2652f 100644 --- a/include/asm-powerpc/unaligned.h +++ b/include/asm-powerpc/unaligned.h | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | #ifndef _ASM_POWERPC_UNALIGNED_H | ||
| 2 | #define _ASM_POWERPC_UNALIGNED_H | ||
| 3 | |||
| 1 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 2 | #ifndef __PPC_UNALIGNED_H | ||
| 3 | #define __PPC_UNALIGNED_H | ||
| 4 | 5 | ||
| 5 | /* | 6 | /* |
| 6 | * The PowerPC can do unaligned accesses itself in big endian mode. | 7 | * The PowerPC can do unaligned accesses itself in big endian mode. |
| @@ -14,5 +15,5 @@ | |||
| 14 | 15 | ||
| 15 | #define put_unaligned(val, ptr) ((void)( *(ptr) = (val) )) | 16 | #define put_unaligned(val, ptr) ((void)( *(ptr) = (val) )) |
| 16 | 17 | ||
| 17 | #endif | 18 | #endif /* __KERNEL__ */ |
| 18 | #endif /* __KERNEL__ */ | 19 | #endif /* _ASM_POWERPC_UNALIGNED_H */ |
diff --git a/include/asm-ppc/user.h b/include/asm-powerpc/user.h index d662b2151370..e59ade4b3dfb 100644 --- a/include/asm-ppc/user.h +++ b/include/asm-powerpc/user.h | |||
| @@ -1,13 +1,14 @@ | |||
| 1 | #ifdef __KERNEL__ | 1 | #ifndef _ASM_POWERPC_USER_H |
| 2 | #ifndef _PPC_USER_H | 2 | #define _ASM_POWERPC_USER_H |
| 3 | #define _PPC_USER_H | ||
| 4 | 3 | ||
| 5 | /* Adapted from <asm-alpha/user.h> */ | 4 | #ifdef __KERNEL__ |
| 6 | 5 | ||
| 7 | #include <linux/ptrace.h> | 6 | #include <asm/ptrace.h> |
| 8 | #include <asm/page.h> | 7 | #include <asm/page.h> |
| 9 | 8 | ||
| 10 | /* | 9 | /* |
| 10 | * Adapted from <asm-alpha/user.h> | ||
| 11 | * | ||
| 11 | * Core file format: The core file is written in such a way that gdb | 12 | * Core file format: The core file is written in such a way that gdb |
| 12 | * can understand it and provide useful information to the user (under | 13 | * can understand it and provide useful information to the user (under |
| 13 | * linux we use the `trad-core' bfd, NOT the osf-core). The file contents | 14 | * linux we use the `trad-core' bfd, NOT the osf-core). The file contents |
| @@ -50,5 +51,5 @@ struct user { | |||
| 50 | #define HOST_DATA_START_ADDR (u.start_data) | 51 | #define HOST_DATA_START_ADDR (u.start_data) |
| 51 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | 52 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) |
| 52 | 53 | ||
| 53 | #endif /* _PPC_USER_H */ | 54 | #endif /* __KERNEL__ */ |
| 54 | #endif /* __KERNEL__ */ | 55 | #endif /* _ASM_POWERPC_USER_H */ |
diff --git a/include/asm-ppc/pci.h b/include/asm-ppc/pci.h index a811e440c978..9dd06cd40096 100644 --- a/include/asm-ppc/pci.h +++ b/include/asm-ppc/pci.h | |||
| @@ -109,6 +109,19 @@ extern void | |||
| 109 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 109 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 110 | struct pci_bus_region *region); | 110 | struct pci_bus_region *region); |
| 111 | 111 | ||
| 112 | static inline struct resource * | ||
| 113 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 114 | { | ||
| 115 | struct resource *root = NULL; | ||
| 116 | |||
| 117 | if (res->flags & IORESOURCE_IO) | ||
| 118 | root = &ioport_resource; | ||
| 119 | if (res->flags & IORESOURCE_MEM) | ||
| 120 | root = &iomem_resource; | ||
| 121 | |||
| 122 | return root; | ||
| 123 | } | ||
| 124 | |||
| 112 | extern void pcibios_add_platform_entries(struct pci_dev *dev); | 125 | extern void pcibios_add_platform_entries(struct pci_dev *dev); |
| 113 | 126 | ||
| 114 | struct file; | 127 | struct file; |
diff --git a/include/asm-ppc/setup.h b/include/asm-ppc/setup.h deleted file mode 100644 index d2d19ee103df..000000000000 --- a/include/asm-ppc/setup.h +++ /dev/null | |||
| @@ -1,14 +0,0 @@ | |||
| 1 | #ifdef __KERNEL__ | ||
| 2 | #ifndef _PPC_SETUP_H | ||
| 3 | #define _PPC_SETUP_H | ||
| 4 | |||
| 5 | #define m68k_num_memory num_memory | ||
| 6 | #define m68k_memory memory | ||
| 7 | |||
| 8 | #include <asm-m68k/setup.h> | ||
| 9 | /* We have a bigger command line buffer. */ | ||
| 10 | #undef COMMAND_LINE_SIZE | ||
| 11 | #define COMMAND_LINE_SIZE 512 | ||
| 12 | |||
| 13 | #endif /* _PPC_SETUP_H */ | ||
| 14 | #endif /* __KERNEL__ */ | ||
diff --git a/include/asm-ppc/topology.h b/include/asm-ppc/topology.h deleted file mode 100644 index 6a029bbba6e1..000000000000 --- a/include/asm-ppc/topology.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef _ASM_PPC_TOPOLOGY_H | ||
| 2 | #define _ASM_PPC_TOPOLOGY_H | ||
| 3 | |||
| 4 | #include <asm-generic/topology.h> | ||
| 5 | |||
| 6 | #endif /* _ASM_PPC_TOPOLOGY_H */ | ||
diff --git a/include/asm-ppc64/eeh.h b/include/asm-ppc64/eeh.h index 94298b106a4b..40c8eb57493e 100644 --- a/include/asm-ppc64/eeh.h +++ b/include/asm-ppc64/eeh.h | |||
| @@ -219,23 +219,24 @@ static inline void eeh_raw_writeq(u64 val, volatile void __iomem *addr) | |||
| 219 | static inline void eeh_memset_io(volatile void __iomem *addr, int c, | 219 | static inline void eeh_memset_io(volatile void __iomem *addr, int c, |
| 220 | unsigned long n) | 220 | unsigned long n) |
| 221 | { | 221 | { |
| 222 | void *p = (void __force *)addr; | ||
| 222 | u32 lc = c; | 223 | u32 lc = c; |
| 223 | lc |= lc << 8; | 224 | lc |= lc << 8; |
| 224 | lc |= lc << 16; | 225 | lc |= lc << 16; |
| 225 | 226 | ||
| 226 | while(n && !EEH_CHECK_ALIGN(addr, 4)) { | 227 | while(n && !EEH_CHECK_ALIGN(p, 4)) { |
| 227 | *((volatile u8 *)addr) = c; | 228 | *((volatile u8 *)p) = c; |
| 228 | addr = (void *)((unsigned long)addr + 1); | 229 | p++; |
| 229 | n--; | 230 | n--; |
| 230 | } | 231 | } |
| 231 | while(n >= 4) { | 232 | while(n >= 4) { |
| 232 | *((volatile u32 *)addr) = lc; | 233 | *((volatile u32 *)p) = lc; |
| 233 | addr = (void *)((unsigned long)addr + 4); | 234 | p += 4; |
| 234 | n -= 4; | 235 | n -= 4; |
| 235 | } | 236 | } |
| 236 | while(n) { | 237 | while(n) { |
| 237 | *((volatile u8 *)addr) = c; | 238 | *((volatile u8 *)p) = c; |
| 238 | addr = (void *)((unsigned long)addr + 1); | 239 | p++; |
| 239 | n--; | 240 | n--; |
| 240 | } | 241 | } |
| 241 | __asm__ __volatile__ ("sync" : : : "memory"); | 242 | __asm__ __volatile__ ("sync" : : : "memory"); |
| @@ -250,22 +251,22 @@ static inline void eeh_memcpy_fromio(void *dest, const volatile void __iomem *sr | |||
| 250 | while(n && (!EEH_CHECK_ALIGN(vsrc, 4) || !EEH_CHECK_ALIGN(dest, 4))) { | 251 | while(n && (!EEH_CHECK_ALIGN(vsrc, 4) || !EEH_CHECK_ALIGN(dest, 4))) { |
| 251 | *((u8 *)dest) = *((volatile u8 *)vsrc); | 252 | *((u8 *)dest) = *((volatile u8 *)vsrc); |
| 252 | __asm__ __volatile__ ("eieio" : : : "memory"); | 253 | __asm__ __volatile__ ("eieio" : : : "memory"); |
| 253 | vsrc = (void *)((unsigned long)vsrc + 1); | 254 | vsrc++; |
| 254 | dest = (void *)((unsigned long)dest + 1); | 255 | dest++; |
| 255 | n--; | 256 | n--; |
| 256 | } | 257 | } |
| 257 | while(n > 4) { | 258 | while(n > 4) { |
| 258 | *((u32 *)dest) = *((volatile u32 *)vsrc); | 259 | *((u32 *)dest) = *((volatile u32 *)vsrc); |
| 259 | __asm__ __volatile__ ("eieio" : : : "memory"); | 260 | __asm__ __volatile__ ("eieio" : : : "memory"); |
| 260 | vsrc = (void *)((unsigned long)vsrc + 4); | 261 | vsrc += 4; |
| 261 | dest = (void *)((unsigned long)dest + 4); | 262 | dest += 4; |
| 262 | n -= 4; | 263 | n -= 4; |
| 263 | } | 264 | } |
| 264 | while(n) { | 265 | while(n) { |
| 265 | *((u8 *)dest) = *((volatile u8 *)vsrc); | 266 | *((u8 *)dest) = *((volatile u8 *)vsrc); |
| 266 | __asm__ __volatile__ ("eieio" : : : "memory"); | 267 | __asm__ __volatile__ ("eieio" : : : "memory"); |
| 267 | vsrc = (void *)((unsigned long)vsrc + 1); | 268 | vsrc++; |
| 268 | dest = (void *)((unsigned long)dest + 1); | 269 | dest++; |
| 269 | n--; | 270 | n--; |
| 270 | } | 271 | } |
| 271 | __asm__ __volatile__ ("sync" : : : "memory"); | 272 | __asm__ __volatile__ ("sync" : : : "memory"); |
| @@ -286,20 +287,20 @@ static inline void eeh_memcpy_toio(volatile void __iomem *dest, const void *src, | |||
| 286 | 287 | ||
| 287 | while(n && (!EEH_CHECK_ALIGN(vdest, 4) || !EEH_CHECK_ALIGN(src, 4))) { | 288 | while(n && (!EEH_CHECK_ALIGN(vdest, 4) || !EEH_CHECK_ALIGN(src, 4))) { |
| 288 | *((volatile u8 *)vdest) = *((u8 *)src); | 289 | *((volatile u8 *)vdest) = *((u8 *)src); |
| 289 | src = (void *)((unsigned long)src + 1); | 290 | src++; |
| 290 | vdest = (void *)((unsigned long)vdest + 1); | 291 | vdest++; |
| 291 | n--; | 292 | n--; |
| 292 | } | 293 | } |
| 293 | while(n > 4) { | 294 | while(n > 4) { |
| 294 | *((volatile u32 *)vdest) = *((volatile u32 *)src); | 295 | *((volatile u32 *)vdest) = *((volatile u32 *)src); |
| 295 | src = (void *)((unsigned long)src + 4); | 296 | src += 4; |
| 296 | vdest = (void *)((unsigned long)vdest + 4); | 297 | vdest += 4; |
| 297 | n-=4; | 298 | n-=4; |
| 298 | } | 299 | } |
| 299 | while(n) { | 300 | while(n) { |
| 300 | *((volatile u8 *)vdest) = *((u8 *)src); | 301 | *((volatile u8 *)vdest) = *((u8 *)src); |
| 301 | src = (void *)((unsigned long)src + 1); | 302 | src++; |
| 302 | vdest = (void *)((unsigned long)vdest + 1); | 303 | vdest++; |
| 303 | n--; | 304 | n--; |
| 304 | } | 305 | } |
| 305 | __asm__ __volatile__ ("sync" : : : "memory"); | 306 | __asm__ __volatile__ ("sync" : : : "memory"); |
diff --git a/include/asm-ppc64/io.h b/include/asm-ppc64/io.h index aba1dfa388ba..59c958aea4db 100644 --- a/include/asm-ppc64/io.h +++ b/include/asm-ppc64/io.h | |||
| @@ -20,10 +20,10 @@ | |||
| 20 | 20 | ||
| 21 | #include <asm-generic/iomap.h> | 21 | #include <asm-generic/iomap.h> |
| 22 | 22 | ||
| 23 | #define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 *)(p), (a), (c)) | 23 | #define __ide_mm_insw(p, a, c) _insw_ns((volatile u16 __iomem *)(p), (a), (c)) |
| 24 | #define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 *)(p), (a), (c)) | 24 | #define __ide_mm_insl(p, a, c) _insl_ns((volatile u32 __iomem *)(p), (a), (c)) |
| 25 | #define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 *)(p), (a), (c)) | 25 | #define __ide_mm_outsw(p, a, c) _outsw_ns((volatile u16 __iomem *)(p), (a), (c)) |
| 26 | #define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 *)(p), (a), (c)) | 26 | #define __ide_mm_outsl(p, a, c) _outsl_ns((volatile u32 __iomem *)(p), (a), (c)) |
| 27 | 27 | ||
| 28 | 28 | ||
| 29 | #define SIO_CONFIG_RA 0x398 | 29 | #define SIO_CONFIG_RA 0x398 |
| @@ -71,8 +71,8 @@ extern unsigned long io_page_mask; | |||
| 71 | * Neither do the standard versions now, these are just here | 71 | * Neither do the standard versions now, these are just here |
| 72 | * for older code. | 72 | * for older code. |
| 73 | */ | 73 | */ |
| 74 | #define insw_ns(port, buf, ns) _insw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) | 74 | #define insw_ns(port, buf, ns) _insw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns)) |
| 75 | #define insl_ns(port, buf, nl) _insl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) | 75 | #define insl_ns(port, buf, nl) _insl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl)) |
| 76 | #else | 76 | #else |
| 77 | 77 | ||
| 78 | static inline unsigned char __raw_readb(const volatile void __iomem *addr) | 78 | static inline unsigned char __raw_readb(const volatile void __iomem *addr) |
| @@ -136,9 +136,9 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) | |||
| 136 | #define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns)) | 136 | #define insw_ns(port, buf, ns) eeh_insw_ns((port), (buf), (ns)) |
| 137 | #define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl)) | 137 | #define insl_ns(port, buf, nl) eeh_insl_ns((port), (buf), (nl)) |
| 138 | 138 | ||
| 139 | #define outsb(port, buf, ns) _outsb((u8 *)((port)+pci_io_base), (buf), (ns)) | 139 | #define outsb(port, buf, ns) _outsb((u8 __iomem *)((port)+pci_io_base), (buf), (ns)) |
| 140 | #define outsw(port, buf, ns) _outsw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) | 140 | #define outsw(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns)) |
| 141 | #define outsl(port, buf, nl) _outsl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) | 141 | #define outsl(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl)) |
| 142 | 142 | ||
| 143 | #endif | 143 | #endif |
| 144 | 144 | ||
| @@ -147,16 +147,16 @@ static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr) | |||
| 147 | #define readl_relaxed(addr) readl(addr) | 147 | #define readl_relaxed(addr) readl(addr) |
| 148 | #define readq_relaxed(addr) readq(addr) | 148 | #define readq_relaxed(addr) readq(addr) |
| 149 | 149 | ||
| 150 | extern void _insb(volatile u8 *port, void *buf, int ns); | 150 | extern void _insb(volatile u8 __iomem *port, void *buf, int ns); |
| 151 | extern void _outsb(volatile u8 *port, const void *buf, int ns); | 151 | extern void _outsb(volatile u8 __iomem *port, const void *buf, int ns); |
| 152 | extern void _insw(volatile u16 *port, void *buf, int ns); | 152 | extern void _insw(volatile u16 __iomem *port, void *buf, int ns); |
| 153 | extern void _outsw(volatile u16 *port, const void *buf, int ns); | 153 | extern void _outsw(volatile u16 __iomem *port, const void *buf, int ns); |
| 154 | extern void _insl(volatile u32 *port, void *buf, int nl); | 154 | extern void _insl(volatile u32 __iomem *port, void *buf, int nl); |
| 155 | extern void _outsl(volatile u32 *port, const void *buf, int nl); | 155 | extern void _outsl(volatile u32 __iomem *port, const void *buf, int nl); |
| 156 | extern void _insw_ns(volatile u16 *port, void *buf, int ns); | 156 | extern void _insw_ns(volatile u16 __iomem *port, void *buf, int ns); |
| 157 | extern void _outsw_ns(volatile u16 *port, const void *buf, int ns); | 157 | extern void _outsw_ns(volatile u16 __iomem *port, const void *buf, int ns); |
| 158 | extern void _insl_ns(volatile u32 *port, void *buf, int nl); | 158 | extern void _insl_ns(volatile u32 __iomem *port, void *buf, int nl); |
| 159 | extern void _outsl_ns(volatile u32 *port, const void *buf, int nl); | 159 | extern void _outsl_ns(volatile u32 __iomem *port, const void *buf, int nl); |
| 160 | 160 | ||
| 161 | #define mmiowb() | 161 | #define mmiowb() |
| 162 | 162 | ||
| @@ -176,8 +176,8 @@ extern void _outsl_ns(volatile u32 *port, const void *buf, int nl); | |||
| 176 | * Neither do the standard versions now, these are just here | 176 | * Neither do the standard versions now, these are just here |
| 177 | * for older code. | 177 | * for older code. |
| 178 | */ | 178 | */ |
| 179 | #define outsw_ns(port, buf, ns) _outsw_ns((u16 *)((port)+pci_io_base), (buf), (ns)) | 179 | #define outsw_ns(port, buf, ns) _outsw_ns((u16 __iomem *)((port)+pci_io_base), (buf), (ns)) |
| 180 | #define outsl_ns(port, buf, nl) _outsl_ns((u32 *)((port)+pci_io_base), (buf), (nl)) | 180 | #define outsl_ns(port, buf, nl) _outsl_ns((u32 __iomem *)((port)+pci_io_base), (buf), (nl)) |
| 181 | 181 | ||
| 182 | 182 | ||
| 183 | #define IO_SPACE_LIMIT ~(0UL) | 183 | #define IO_SPACE_LIMIT ~(0UL) |
diff --git a/include/asm-ppc64/msgbuf.h b/include/asm-ppc64/msgbuf.h deleted file mode 100644 index 31c1cbf133cc..000000000000 --- a/include/asm-ppc64/msgbuf.h +++ /dev/null | |||
| @@ -1,27 +0,0 @@ | |||
| 1 | #ifndef _PPC64_MSGBUF_H | ||
| 2 | #define _PPC64_MSGBUF_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * The msqid64_ds structure for the PPC architecture. | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * as published by the Free Software Foundation; either version | ||
| 10 | * 2 of the License, or (at your option) any later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | struct msqid64_ds { | ||
| 14 | struct ipc64_perm msg_perm; | ||
| 15 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
| 16 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
| 17 | __kernel_time_t msg_ctime; /* last change time */ | ||
| 18 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
| 19 | unsigned long msg_qnum; /* number of messages in queue */ | ||
| 20 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
| 21 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
| 22 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
| 23 | unsigned long __unused1; | ||
| 24 | unsigned long __unused2; | ||
| 25 | }; | ||
| 26 | |||
| 27 | #endif /* _PPC64_MSGBUF_H */ | ||
diff --git a/include/asm-ppc64/param.h b/include/asm-ppc64/param.h deleted file mode 100644 index 76c212d475b3..000000000000 --- a/include/asm-ppc64/param.h +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | #ifndef _ASM_PPC64_PARAM_H | ||
| 2 | #define _ASM_PPC64_PARAM_H | ||
| 3 | |||
| 4 | #include <linux/config.h> | ||
| 5 | |||
| 6 | /* | ||
| 7 | * This program is free software; you can redistribute it and/or | ||
| 8 | * modify it under the terms of the GNU General Public License | ||
| 9 | * as published by the Free Software Foundation; either version | ||
| 10 | * 2 of the License, or (at your option) any later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifdef __KERNEL__ | ||
| 14 | # define HZ CONFIG_HZ /* Internal kernel timer frequency */ | ||
| 15 | # define USER_HZ 100 /* .. some user interfaces are in "ticks" */ | ||
| 16 | # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ | ||
| 17 | #endif | ||
| 18 | |||
| 19 | #ifndef HZ | ||
| 20 | #define HZ 100 | ||
| 21 | #endif | ||
| 22 | |||
| 23 | #define EXEC_PAGESIZE 4096 | ||
| 24 | |||
| 25 | #ifndef NOGROUP | ||
| 26 | #define NOGROUP (-1) | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | ||
| 30 | |||
| 31 | #endif /* _ASM_PPC64_PARAM_H */ | ||
diff --git a/include/asm-ppc64/pci-bridge.h b/include/asm-ppc64/pci-bridge.h index c4f9023ea5ed..6b4a5b1f695e 100644 --- a/include/asm-ppc64/pci-bridge.h +++ b/include/asm-ppc64/pci-bridge.h | |||
| @@ -48,19 +48,52 @@ struct pci_controller { | |||
| 48 | unsigned long dma_window_size; | 48 | unsigned long dma_window_size; |
| 49 | }; | 49 | }; |
| 50 | 50 | ||
| 51 | /* | ||
| 52 | * PCI stuff, for nodes representing PCI devices, pointed to | ||
| 53 | * by device_node->data. | ||
| 54 | */ | ||
| 55 | struct pci_controller; | ||
| 56 | struct iommu_table; | ||
| 57 | |||
| 58 | struct pci_dn { | ||
| 59 | int busno; /* for pci devices */ | ||
| 60 | int bussubno; /* for pci devices */ | ||
| 61 | int devfn; /* for pci devices */ | ||
| 62 | int eeh_mode; /* See eeh.h for possible EEH_MODEs */ | ||
| 63 | int eeh_config_addr; | ||
| 64 | int eeh_capable; /* from firmware */ | ||
| 65 | int eeh_check_count; /* # times driver ignored error */ | ||
| 66 | int eeh_freeze_count; /* # times this device froze up. */ | ||
| 67 | int eeh_is_bridge; /* device is pci-to-pci bridge */ | ||
| 68 | |||
| 69 | int pci_ext_config_space; /* for pci devices */ | ||
| 70 | struct pci_controller *phb; /* for pci devices */ | ||
| 71 | struct iommu_table *iommu_table; /* for phb's or bridges */ | ||
| 72 | struct pci_dev *pcidev; /* back-pointer to the pci device */ | ||
| 73 | struct device_node *node; /* back-pointer to the device_node */ | ||
| 74 | u32 config_space[16]; /* saved PCI config space */ | ||
| 75 | }; | ||
| 76 | |||
| 77 | /* Get the pointer to a device_node's pci_dn */ | ||
| 78 | #define PCI_DN(dn) ((struct pci_dn *) (dn)->data) | ||
| 79 | |||
| 51 | struct device_node *fetch_dev_dn(struct pci_dev *dev); | 80 | struct device_node *fetch_dev_dn(struct pci_dev *dev); |
| 52 | 81 | ||
| 53 | /* Get a device_node from a pci_dev. This code must be fast except in the case | 82 | /* Get a device_node from a pci_dev. This code must be fast except |
| 54 | * where the sysdata is incorrect and needs to be fixed up (hopefully just once) | 83 | * in the case where the sysdata is incorrect and needs to be fixed |
| 84 | * up (this will only happen once). | ||
| 85 | * In this case the sysdata will have been inherited from a PCI host | ||
| 86 | * bridge or a PCI-PCI bridge further up the tree, so it will point | ||
| 87 | * to a valid struct pci_dn, just not the one we want. | ||
| 55 | */ | 88 | */ |
| 56 | static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) | 89 | static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev) |
| 57 | { | 90 | { |
| 58 | struct device_node *dn = dev->sysdata; | 91 | struct device_node *dn = dev->sysdata; |
| 92 | struct pci_dn *pdn = dn->data; | ||
| 59 | 93 | ||
| 60 | if (dn->devfn == dev->devfn && dn->busno == dev->bus->number) | 94 | if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number) |
| 61 | return dn; /* fast path. sysdata is good */ | 95 | return dn; /* fast path. sysdata is good */ |
| 62 | else | 96 | return fetch_dev_dn(dev); |
| 63 | return fetch_dev_dn(dev); | ||
| 64 | } | 97 | } |
| 65 | 98 | ||
| 66 | static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) | 99 | static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus) |
| @@ -83,7 +116,7 @@ static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus) | |||
| 83 | struct device_node *busdn = bus->sysdata; | 116 | struct device_node *busdn = bus->sysdata; |
| 84 | 117 | ||
| 85 | BUG_ON(busdn == NULL); | 118 | BUG_ON(busdn == NULL); |
| 86 | return busdn->phb; | 119 | return PCI_DN(busdn)->phb; |
| 87 | } | 120 | } |
| 88 | 121 | ||
| 89 | #endif | 122 | #endif |
diff --git a/include/asm-ppc64/pci.h b/include/asm-ppc64/pci.h index 4d057452f59b..a88bbfc26967 100644 --- a/include/asm-ppc64/pci.h +++ b/include/asm-ppc64/pci.h | |||
| @@ -138,6 +138,19 @@ extern void | |||
| 138 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 138 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 139 | struct pci_bus_region *region); | 139 | struct pci_bus_region *region); |
| 140 | 140 | ||
| 141 | static inline struct resource * | ||
| 142 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | ||
| 143 | { | ||
| 144 | struct resource *root = NULL; | ||
| 145 | |||
| 146 | if (res->flags & IORESOURCE_IO) | ||
| 147 | root = &ioport_resource; | ||
| 148 | if (res->flags & IORESOURCE_MEM) | ||
| 149 | root = &iomem_resource; | ||
| 150 | |||
| 151 | return root; | ||
| 152 | } | ||
| 153 | |||
| 141 | extern int | 154 | extern int |
| 142 | unmap_bus_range(struct pci_bus *bus); | 155 | unmap_bus_range(struct pci_bus *bus); |
| 143 | 156 | ||
diff --git a/include/asm-ppc64/prom.h b/include/asm-ppc64/prom.h index dc5330b39509..c02ec1d6b909 100644 --- a/include/asm-ppc64/prom.h +++ b/include/asm-ppc64/prom.h | |||
| @@ -116,14 +116,6 @@ struct property { | |||
| 116 | struct property *next; | 116 | struct property *next; |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | /* NOTE: the device_node contains PCI specific info for pci devices. | ||
| 120 | * This perhaps could be hung off the device_node with another struct, | ||
| 121 | * but for now it is directly in the node. The phb ptr is a good | ||
| 122 | * indication of a real PCI node. Other nodes leave these fields zeroed. | ||
| 123 | */ | ||
| 124 | struct pci_controller; | ||
| 125 | struct iommu_table; | ||
| 126 | |||
| 127 | struct device_node { | 119 | struct device_node { |
| 128 | char *name; | 120 | char *name; |
| 129 | char *type; | 121 | char *type; |
| @@ -135,16 +127,6 @@ struct device_node { | |||
| 135 | struct interrupt_info *intrs; | 127 | struct interrupt_info *intrs; |
| 136 | char *full_name; | 128 | char *full_name; |
| 137 | 129 | ||
| 138 | /* PCI stuff probably doesn't belong here */ | ||
| 139 | int busno; /* for pci devices */ | ||
| 140 | int bussubno; /* for pci devices */ | ||
| 141 | int devfn; /* for pci devices */ | ||
| 142 | int eeh_mode; /* See eeh.h for possible EEH_MODEs */ | ||
| 143 | int eeh_config_addr; | ||
| 144 | int pci_ext_config_space; /* for pci devices */ | ||
| 145 | struct pci_controller *phb; /* for pci devices */ | ||
| 146 | struct iommu_table *iommu_table; /* for phb's or bridges */ | ||
| 147 | |||
| 148 | struct property *properties; | 130 | struct property *properties; |
| 149 | struct device_node *parent; | 131 | struct device_node *parent; |
| 150 | struct device_node *child; | 132 | struct device_node *child; |
| @@ -154,6 +136,7 @@ struct device_node { | |||
| 154 | struct proc_dir_entry *pde; /* this node's proc directory */ | 136 | struct proc_dir_entry *pde; /* this node's proc directory */ |
| 155 | struct kref kref; | 137 | struct kref kref; |
| 156 | unsigned long _flags; | 138 | unsigned long _flags; |
| 139 | void *data; | ||
| 157 | }; | 140 | }; |
| 158 | 141 | ||
| 159 | extern struct device_node *of_chosen; | 142 | extern struct device_node *of_chosen; |
diff --git a/include/asm-ppc64/segment.h b/include/asm-ppc64/segment.h deleted file mode 100644 index d80fb68cc79e..000000000000 --- a/include/asm-ppc64/segment.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef __PPC64_SEGMENT_H | ||
| 2 | #define __PPC64_SEGMENT_H | ||
| 3 | |||
| 4 | /* Only here because we have some old header files that expect it.. */ | ||
| 5 | |||
| 6 | #endif /* __PPC64_SEGMENT_H */ | ||
diff --git a/include/asm-ppc64/setup.h b/include/asm-ppc64/setup.h deleted file mode 100644 index b257b8348c73..000000000000 --- a/include/asm-ppc64/setup.h +++ /dev/null | |||
| @@ -1,6 +0,0 @@ | |||
| 1 | #ifndef _PPC_SETUP_H | ||
| 2 | #define _PPC_SETUP_H | ||
| 3 | |||
| 4 | #define COMMAND_LINE_SIZE 512 | ||
| 5 | |||
| 6 | #endif /* _PPC_SETUP_H */ | ||
diff --git a/include/asm-ppc64/timex.h b/include/asm-ppc64/timex.h deleted file mode 100644 index 8db4da4064cd..000000000000 --- a/include/asm-ppc64/timex.h +++ /dev/null | |||
| @@ -1,26 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/include/asm-ppc/timex.h | ||
| 3 | * | ||
| 4 | * PPC64 architecture timex specifications | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | #ifndef _ASMPPC64_TIMEX_H | ||
| 12 | #define _ASMPPC64_TIMEX_H | ||
| 13 | |||
| 14 | #define CLOCK_TICK_RATE 1193180 /* Underlying HZ */ | ||
| 15 | |||
| 16 | typedef unsigned long cycles_t; | ||
| 17 | |||
| 18 | static inline cycles_t get_cycles(void) | ||
| 19 | { | ||
| 20 | cycles_t ret; | ||
| 21 | |||
| 22 | __asm__ __volatile__("mftb %0" : "=r" (ret) : ); | ||
| 23 | return ret; | ||
| 24 | } | ||
| 25 | |||
| 26 | #endif | ||
diff --git a/include/asm-ppc64/user.h b/include/asm-ppc64/user.h deleted file mode 100644 index d7d6554a421f..000000000000 --- a/include/asm-ppc64/user.h +++ /dev/null | |||
| @@ -1,58 +0,0 @@ | |||
| 1 | #ifndef _PPC_USER_H | ||
| 2 | #define _PPC_USER_H | ||
| 3 | |||
| 4 | /* Adapted from <asm-alpha/user.h> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public License | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the License, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include <asm/ptrace.h> | ||
| 13 | #include <asm/page.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * Core file format: The core file is written in such a way that gdb | ||
| 17 | * can understand it and provide useful information to the user (under | ||
| 18 | * linux we use the `trad-core' bfd, NOT the osf-core). The file contents | ||
| 19 | * are as follows: | ||
| 20 | * | ||
| 21 | * upage: 1 page consisting of a user struct that tells gdb | ||
| 22 | * what is present in the file. Directly after this is a | ||
| 23 | * copy of the task_struct, which is currently not used by gdb, | ||
| 24 | * but it may come in handy at some point. All of the registers | ||
| 25 | * are stored as part of the upage. The upage should always be | ||
| 26 | * only one page long. | ||
| 27 | * data: The data segment follows next. We use current->end_text to | ||
| 28 | * current->brk to pick up all of the user variables, plus any memory | ||
| 29 | * that may have been sbrk'ed. No attempt is made to determine if a | ||
| 30 | * page is demand-zero or if a page is totally unused, we just cover | ||
| 31 | * the entire range. All of the addresses are rounded in such a way | ||
| 32 | * that an integral number of pages is written. | ||
| 33 | * stack: We need the stack information in order to get a meaningful | ||
| 34 | * backtrace. We need to write the data from usp to | ||
| 35 | * current->start_stack, so we round each of these in order to be able | ||
| 36 | * to write an integer number of pages. | ||
| 37 | */ | ||
| 38 | struct user { | ||
| 39 | struct pt_regs regs; /* entire machine state */ | ||
| 40 | size_t u_tsize; /* text size (pages) */ | ||
| 41 | size_t u_dsize; /* data size (pages) */ | ||
| 42 | size_t u_ssize; /* stack size (pages) */ | ||
| 43 | unsigned long start_code; /* text starting address */ | ||
| 44 | unsigned long start_data; /* data starting address */ | ||
| 45 | unsigned long start_stack; /* stack starting address */ | ||
| 46 | long int signal; /* signal causing core dump */ | ||
| 47 | struct regs * u_ar0; /* help gdb find registers */ | ||
| 48 | unsigned long magic; /* identifies a core file */ | ||
| 49 | char u_comm[32]; /* user command name */ | ||
| 50 | }; | ||
| 51 | |||
| 52 | #define NBPG PAGE_SIZE | ||
| 53 | #define UPAGES 1 | ||
| 54 | #define HOST_TEXT_START_ADDR (u.start_code) | ||
| 55 | #define HOST_DATA_START_ADDR (u.start_data) | ||
| 56 | #define HOST_STACK_END_ADDR (u.start_stack + u.u_ssize * NBPG) | ||
| 57 | |||
| 58 | #endif /* _PPC_USER_H */ | ||
diff --git a/include/asm-sparc64/pci.h b/include/asm-sparc64/pci.h index a4ab0ec7143a..89bd71b1c0d8 100644 --- a/include/asm-sparc64/pci.h +++ b/include/asm-sparc64/pci.h | |||
| @@ -269,6 +269,8 @@ extern void | |||
| 269 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 269 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
| 270 | struct pci_bus_region *region); | 270 | struct pci_bus_region *region); |
| 271 | 271 | ||
| 272 | extern struct resource *pcibios_select_root(struct pci_dev *, struct resource *); | ||
| 273 | |||
| 272 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) | 274 | static inline void pcibios_add_platform_entries(struct pci_dev *dev) |
| 273 | { | 275 | { |
| 274 | } | 276 | } |
diff --git a/include/asm-sparc64/system.h b/include/asm-sparc64/system.h index 5e94c05dc2fc..b5417529f6f1 100644 --- a/include/asm-sparc64/system.h +++ b/include/asm-sparc64/system.h | |||
| @@ -28,13 +28,48 @@ enum sparc_cpu { | |||
| 28 | #define ARCH_SUN4C_SUN4 0 | 28 | #define ARCH_SUN4C_SUN4 0 |
| 29 | #define ARCH_SUN4 0 | 29 | #define ARCH_SUN4 0 |
| 30 | 30 | ||
| 31 | extern void mb(void); | 31 | /* These are here in an effort to more fully work around Spitfire Errata |
| 32 | extern void rmb(void); | 32 | * #51. Essentially, if a memory barrier occurs soon after a mispredicted |
| 33 | extern void wmb(void); | 33 | * branch, the chip can stop executing instructions until a trap occurs. |
| 34 | extern void membar_storeload(void); | 34 | * Therefore, if interrupts are disabled, the chip can hang forever. |
| 35 | extern void membar_storeload_storestore(void); | 35 | * |
| 36 | extern void membar_storeload_loadload(void); | 36 | * It used to be believed that the memory barrier had to be right in the |
| 37 | extern void membar_storestore_loadstore(void); | 37 | * delay slot, but a case has been traced recently wherein the memory barrier |
| 38 | * was one instruction after the branch delay slot and the chip still hung. | ||
| 39 | * The offending sequence was the following in sym_wakeup_done() of the | ||
| 40 | * sym53c8xx_2 driver: | ||
| 41 | * | ||
| 42 | * call sym_ccb_from_dsa, 0 | ||
| 43 | * movge %icc, 0, %l0 | ||
| 44 | * brz,pn %o0, .LL1303 | ||
| 45 | * mov %o0, %l2 | ||
| 46 | * membar #LoadLoad | ||
| 47 | * | ||
| 48 | * The branch has to be mispredicted for the bug to occur. Therefore, we put | ||
| 49 | * the memory barrier explicitly into a "branch always, predicted taken" | ||
| 50 | * delay slot to avoid the problem case. | ||
| 51 | */ | ||
| 52 | #define membar_safe(type) \ | ||
| 53 | do { __asm__ __volatile__("ba,pt %%xcc, 1f\n\t" \ | ||
| 54 | " membar " type "\n" \ | ||
| 55 | "1:\n" \ | ||
| 56 | : : : "memory"); \ | ||
| 57 | } while (0) | ||
| 58 | |||
| 59 | #define mb() \ | ||
| 60 | membar_safe("#LoadLoad | #LoadStore | #StoreStore | #StoreLoad") | ||
| 61 | #define rmb() \ | ||
| 62 | membar_safe("#LoadLoad") | ||
| 63 | #define wmb() \ | ||
| 64 | membar_safe("#StoreStore") | ||
| 65 | #define membar_storeload() \ | ||
| 66 | membar_safe("#StoreLoad") | ||
| 67 | #define membar_storeload_storestore() \ | ||
| 68 | membar_safe("#StoreLoad | #StoreStore") | ||
| 69 | #define membar_storeload_loadload() \ | ||
| 70 | membar_safe("#StoreLoad | #LoadLoad") | ||
| 71 | #define membar_storestore_loadstore() \ | ||
| 72 | membar_safe("#StoreStore | #LoadStore") | ||
| 38 | 73 | ||
| 39 | #endif | 74 | #endif |
| 40 | 75 | ||
diff --git a/include/linux/i2c-pxa.h b/include/linux/i2c-pxa.h new file mode 100644 index 000000000000..5f3eaf802223 --- /dev/null +++ b/include/linux/i2c-pxa.h | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | #ifndef _LINUX_I2C_ALGO_PXA_H | ||
| 2 | #define _LINUX_I2C_ALGO_PXA_H | ||
| 3 | |||
| 4 | struct i2c_eeprom_emu_watcher { | ||
| 5 | void (*write)(void *, unsigned int addr, unsigned char newval); | ||
| 6 | }; | ||
| 7 | |||
| 8 | struct i2c_eeprom_emu_watch { | ||
| 9 | struct list_head node; | ||
| 10 | unsigned int start; | ||
| 11 | unsigned int end; | ||
| 12 | struct i2c_eeprom_emu_watcher *ops; | ||
| 13 | void *data; | ||
| 14 | }; | ||
| 15 | |||
| 16 | #define I2C_EEPROM_EMU_SIZE (256) | ||
| 17 | |||
| 18 | struct i2c_eeprom_emu { | ||
| 19 | unsigned int size; | ||
| 20 | unsigned int ptr; | ||
| 21 | unsigned int seen_start; | ||
| 22 | struct list_head watch; | ||
| 23 | |||
| 24 | unsigned char bytes[I2C_EEPROM_EMU_SIZE]; | ||
| 25 | }; | ||
| 26 | |||
| 27 | typedef enum i2c_slave_event_e { | ||
| 28 | I2C_SLAVE_EVENT_START_READ, | ||
| 29 | I2C_SLAVE_EVENT_START_WRITE, | ||
| 30 | I2C_SLAVE_EVENT_STOP | ||
| 31 | } i2c_slave_event_t; | ||
| 32 | |||
| 33 | struct i2c_slave_client { | ||
| 34 | void *data; | ||
| 35 | void (*event)(void *ptr, i2c_slave_event_t event); | ||
| 36 | int (*read) (void *ptr); | ||
| 37 | void (*write)(void *ptr, unsigned int val); | ||
| 38 | }; | ||
| 39 | |||
| 40 | extern int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *, void *data, | ||
| 41 | unsigned int addr, unsigned int size, | ||
| 42 | struct i2c_eeprom_emu_watcher *); | ||
| 43 | |||
| 44 | extern void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *, void *data, struct i2c_eeprom_emu_watcher *watcher); | ||
| 45 | |||
| 46 | extern struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void); | ||
| 47 | |||
| 48 | #endif /* _LINUX_I2C_ALGO_PXA_H */ | ||
diff --git a/include/linux/in6.h b/include/linux/in6.h index dcf5720ffcbb..bd32b79d6295 100644 --- a/include/linux/in6.h +++ b/include/linux/in6.h | |||
| @@ -148,13 +148,13 @@ struct in6_flowlabel_req | |||
| 148 | */ | 148 | */ |
| 149 | 149 | ||
| 150 | #define IPV6_ADDRFORM 1 | 150 | #define IPV6_ADDRFORM 1 |
| 151 | #define IPV6_PKTINFO 2 | 151 | #define IPV6_2292PKTINFO 2 |
| 152 | #define IPV6_HOPOPTS 3 | 152 | #define IPV6_2292HOPOPTS 3 |
| 153 | #define IPV6_DSTOPTS 4 | 153 | #define IPV6_2292DSTOPTS 4 |
| 154 | #define IPV6_RTHDR 5 | 154 | #define IPV6_2292RTHDR 5 |
| 155 | #define IPV6_PKTOPTIONS 6 | 155 | #define IPV6_2292PKTOPTIONS 6 |
| 156 | #define IPV6_CHECKSUM 7 | 156 | #define IPV6_CHECKSUM 7 |
| 157 | #define IPV6_HOPLIMIT 8 | 157 | #define IPV6_2292HOPLIMIT 8 |
| 158 | #define IPV6_NEXTHOP 9 | 158 | #define IPV6_NEXTHOP 9 |
| 159 | #define IPV6_AUTHHDR 10 /* obsolete */ | 159 | #define IPV6_AUTHHDR 10 /* obsolete */ |
| 160 | #define IPV6_FLOWINFO 11 | 160 | #define IPV6_FLOWINFO 11 |
| @@ -198,4 +198,28 @@ struct in6_flowlabel_req | |||
| 198 | * MCAST_MSFILTER 48 | 198 | * MCAST_MSFILTER 48 |
| 199 | */ | 199 | */ |
| 200 | 200 | ||
| 201 | /* RFC3542 advanced socket options (50-67) */ | ||
| 202 | #define IPV6_RECVPKTINFO 50 | ||
| 203 | #define IPV6_PKTINFO 51 | ||
| 204 | #if 0 | ||
| 205 | #define IPV6_RECVPATHMTU 52 | ||
| 206 | #define IPV6_PATHMTU 53 | ||
| 207 | #define IPV6_DONTFRAG 54 | ||
| 208 | #define IPV6_USE_MIN_MTU 55 | ||
| 209 | #endif | ||
| 210 | #define IPV6_RECVHOPOPTS 56 | ||
| 211 | #define IPV6_HOPOPTS 57 | ||
| 212 | #if 0 | ||
| 213 | #define IPV6_RECVRTHDRDSTOPTS 58 /* Unused, see net/ipv6/datagram.c */ | ||
| 214 | #endif | ||
| 215 | #define IPV6_RTHDRDSTOPTS 59 | ||
| 216 | #define IPV6_RECVRTHDR 60 | ||
| 217 | #define IPV6_RTHDR 61 | ||
| 218 | #define IPV6_RECVDSTOPTS 62 | ||
| 219 | #define IPV6_DSTOPTS 63 | ||
| 220 | #define IPV6_RECVHOPLIMIT 64 | ||
| 221 | #define IPV6_HOPLIMIT 65 | ||
| 222 | #define IPV6_RECVTCLASS 66 | ||
| 223 | #define IPV6_TCLASS 67 | ||
| 224 | |||
| 201 | #endif | 225 | #endif |
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 3c7dbc6a0a70..6c5f7b39a4b0 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h | |||
| @@ -189,6 +189,7 @@ struct inet6_skb_parm { | |||
| 189 | __u16 dst0; | 189 | __u16 dst0; |
| 190 | __u16 srcrt; | 190 | __u16 srcrt; |
| 191 | __u16 dst1; | 191 | __u16 dst1; |
| 192 | __u16 lastopt; | ||
| 192 | }; | 193 | }; |
| 193 | 194 | ||
| 194 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) | 195 | #define IP6CB(skb) ((struct inet6_skb_parm*)((skb)->cb)) |
| @@ -234,14 +235,20 @@ struct ipv6_pinfo { | |||
| 234 | /* pktoption flags */ | 235 | /* pktoption flags */ |
| 235 | union { | 236 | union { |
| 236 | struct { | 237 | struct { |
| 237 | __u8 srcrt:2, | 238 | __u16 srcrt:2, |
| 239 | osrcrt:2, | ||
| 238 | rxinfo:1, | 240 | rxinfo:1, |
| 241 | rxoinfo:1, | ||
| 239 | rxhlim:1, | 242 | rxhlim:1, |
| 243 | rxohlim:1, | ||
| 240 | hopopts:1, | 244 | hopopts:1, |
| 245 | ohopopts:1, | ||
| 241 | dstopts:1, | 246 | dstopts:1, |
| 242 | rxflow:1; | 247 | odstopts:1, |
| 248 | rxflow:1, | ||
| 249 | rxtclass:1; | ||
| 243 | } bits; | 250 | } bits; |
| 244 | __u8 all; | 251 | __u16 all; |
| 245 | } rxopt; | 252 | } rxopt; |
| 246 | 253 | ||
| 247 | /* sockopt flags */ | 254 | /* sockopt flags */ |
| @@ -250,6 +257,7 @@ struct ipv6_pinfo { | |||
| 250 | sndflow:1, | 257 | sndflow:1, |
| 251 | pmtudisc:2, | 258 | pmtudisc:2, |
| 252 | ipv6only:1; | 259 | ipv6only:1; |
| 260 | __u8 tclass; | ||
| 253 | 261 | ||
| 254 | __u32 dst_cookie; | 262 | __u32 dst_cookie; |
| 255 | 263 | ||
| @@ -263,6 +271,7 @@ struct ipv6_pinfo { | |||
| 263 | struct ipv6_txoptions *opt; | 271 | struct ipv6_txoptions *opt; |
| 264 | struct rt6_info *rt; | 272 | struct rt6_info *rt; |
| 265 | int hop_limit; | 273 | int hop_limit; |
| 274 | int tclass; | ||
| 266 | } cork; | 275 | } cork; |
| 267 | }; | 276 | }; |
| 268 | 277 | ||
diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h index 94a46f38c532..58385ee1c0ac 100644 --- a/include/linux/mempolicy.h +++ b/include/linux/mempolicy.h | |||
| @@ -155,6 +155,7 @@ struct mempolicy *get_vma_policy(struct task_struct *task, | |||
| 155 | 155 | ||
| 156 | extern void numa_default_policy(void); | 156 | extern void numa_default_policy(void); |
| 157 | extern void numa_policy_init(void); | 157 | extern void numa_policy_init(void); |
| 158 | extern struct mempolicy default_policy; | ||
| 158 | 159 | ||
| 159 | #else | 160 | #else |
| 160 | 161 | ||
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 6014160d9c06..c1f021eddffa 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h | |||
| @@ -109,6 +109,8 @@ struct mmc_host { | |||
| 109 | struct mmc_card *card_selected; /* the selected MMC card */ | 109 | struct mmc_card *card_selected; /* the selected MMC card */ |
| 110 | 110 | ||
| 111 | struct work_struct detect; | 111 | struct work_struct detect; |
| 112 | |||
| 113 | unsigned long private[0] ____cacheline_aligned; | ||
| 112 | }; | 114 | }; |
| 113 | 115 | ||
| 114 | extern struct mmc_host *mmc_alloc_host(int extra, struct device *); | 116 | extern struct mmc_host *mmc_alloc_host(int extra, struct device *); |
| @@ -116,14 +118,18 @@ extern int mmc_add_host(struct mmc_host *); | |||
| 116 | extern void mmc_remove_host(struct mmc_host *); | 118 | extern void mmc_remove_host(struct mmc_host *); |
| 117 | extern void mmc_free_host(struct mmc_host *); | 119 | extern void mmc_free_host(struct mmc_host *); |
| 118 | 120 | ||
| 119 | #define mmc_priv(x) ((void *)((x) + 1)) | 121 | static inline void *mmc_priv(struct mmc_host *host) |
| 122 | { | ||
| 123 | return (void *)host->private; | ||
| 124 | } | ||
| 125 | |||
| 120 | #define mmc_dev(x) ((x)->dev) | 126 | #define mmc_dev(x) ((x)->dev) |
| 121 | #define mmc_hostname(x) ((x)->class_dev.class_id) | 127 | #define mmc_hostname(x) ((x)->class_dev.class_id) |
| 122 | 128 | ||
| 123 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); | 129 | extern int mmc_suspend_host(struct mmc_host *, pm_message_t); |
| 124 | extern int mmc_resume_host(struct mmc_host *); | 130 | extern int mmc_resume_host(struct mmc_host *); |
| 125 | 131 | ||
| 126 | extern void mmc_detect_change(struct mmc_host *); | 132 | extern void mmc_detect_change(struct mmc_host *, unsigned long delay); |
| 127 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); | 133 | extern void mmc_request_done(struct mmc_host *, struct mmc_request *); |
| 128 | 134 | ||
| 129 | #endif | 135 | #endif |
diff --git a/include/linux/pci.h b/include/linux/pci.h index bc4c40000c0d..6caaba0af469 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
| @@ -19,436 +19,10 @@ | |||
| 19 | 19 | ||
| 20 | #include <linux/mod_devicetable.h> | 20 | #include <linux/mod_devicetable.h> |
| 21 | 21 | ||
| 22 | /* | 22 | /* Include the pci register defines */ |
| 23 | * Under PCI, each device has 256 bytes of configuration address space, | 23 | #include <linux/pci_regs.h> |
| 24 | * of which the first 64 bytes are standardized as follows: | ||
| 25 | */ | ||
| 26 | #define PCI_VENDOR_ID 0x00 /* 16 bits */ | ||
| 27 | #define PCI_DEVICE_ID 0x02 /* 16 bits */ | ||
| 28 | #define PCI_COMMAND 0x04 /* 16 bits */ | ||
| 29 | #define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ | ||
| 30 | #define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ | ||
| 31 | #define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ | ||
| 32 | #define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ | ||
| 33 | #define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ | ||
| 34 | #define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ | ||
| 35 | #define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ | ||
| 36 | #define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ | ||
| 37 | #define PCI_COMMAND_SERR 0x100 /* Enable SERR */ | ||
| 38 | #define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ | ||
| 39 | #define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */ | ||
| 40 | |||
| 41 | #define PCI_STATUS 0x06 /* 16 bits */ | ||
| 42 | #define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ | ||
| 43 | #define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ | ||
| 44 | #define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ | ||
| 45 | #define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ | ||
| 46 | #define PCI_STATUS_PARITY 0x100 /* Detected parity error */ | ||
| 47 | #define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ | ||
| 48 | #define PCI_STATUS_DEVSEL_FAST 0x000 | ||
| 49 | #define PCI_STATUS_DEVSEL_MEDIUM 0x200 | ||
| 50 | #define PCI_STATUS_DEVSEL_SLOW 0x400 | ||
| 51 | #define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ | ||
| 52 | #define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ | ||
| 53 | #define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ | ||
| 54 | #define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ | ||
| 55 | #define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ | ||
| 56 | |||
| 57 | #define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 | ||
| 58 | revision */ | ||
| 59 | #define PCI_REVISION_ID 0x08 /* Revision ID */ | ||
| 60 | #define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ | ||
| 61 | #define PCI_CLASS_DEVICE 0x0a /* Device class */ | ||
| 62 | |||
| 63 | #define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ | ||
| 64 | #define PCI_LATENCY_TIMER 0x0d /* 8 bits */ | ||
| 65 | #define PCI_HEADER_TYPE 0x0e /* 8 bits */ | ||
| 66 | #define PCI_HEADER_TYPE_NORMAL 0 | ||
| 67 | #define PCI_HEADER_TYPE_BRIDGE 1 | ||
| 68 | #define PCI_HEADER_TYPE_CARDBUS 2 | ||
| 69 | |||
| 70 | #define PCI_BIST 0x0f /* 8 bits */ | ||
| 71 | #define PCI_BIST_CODE_MASK 0x0f /* Return result */ | ||
| 72 | #define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ | ||
| 73 | #define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ | ||
| 74 | |||
| 75 | /* | ||
| 76 | * Base addresses specify locations in memory or I/O space. | ||
| 77 | * Decoded size can be determined by writing a value of | ||
| 78 | * 0xffffffff to the register, and reading it back. Only | ||
| 79 | * 1 bits are decoded. | ||
| 80 | */ | ||
| 81 | #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ | ||
| 82 | #define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ | ||
| 83 | #define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ | ||
| 84 | #define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ | ||
| 85 | #define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ | ||
| 86 | #define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ | ||
| 87 | #define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ | ||
| 88 | #define PCI_BASE_ADDRESS_SPACE_IO 0x01 | ||
| 89 | #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 | ||
| 90 | #define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 | ||
| 91 | #define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ | ||
| 92 | #define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ | ||
| 93 | #define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ | ||
| 94 | #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ | ||
| 95 | #define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL) | ||
| 96 | #define PCI_BASE_ADDRESS_IO_MASK (~0x03UL) | ||
| 97 | /* bit 1 is reserved if address_space = 1 */ | ||
| 98 | |||
| 99 | /* Header type 0 (normal devices) */ | ||
| 100 | #define PCI_CARDBUS_CIS 0x28 | ||
| 101 | #define PCI_SUBSYSTEM_VENDOR_ID 0x2c | ||
| 102 | #define PCI_SUBSYSTEM_ID 0x2e | ||
| 103 | #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ | ||
| 104 | #define PCI_ROM_ADDRESS_ENABLE 0x01 | ||
| 105 | #define PCI_ROM_ADDRESS_MASK (~0x7ffUL) | ||
| 106 | |||
| 107 | #define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ | ||
| 108 | |||
| 109 | /* 0x35-0x3b are reserved */ | ||
| 110 | #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ | ||
| 111 | #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ | ||
| 112 | #define PCI_MIN_GNT 0x3e /* 8 bits */ | ||
| 113 | #define PCI_MAX_LAT 0x3f /* 8 bits */ | ||
| 114 | |||
| 115 | /* Header type 1 (PCI-to-PCI bridges) */ | ||
| 116 | #define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ | ||
| 117 | #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ | ||
| 118 | #define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ | ||
| 119 | #define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ | ||
| 120 | #define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ | ||
| 121 | #define PCI_IO_LIMIT 0x1d | ||
| 122 | #define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */ | ||
| 123 | #define PCI_IO_RANGE_TYPE_16 0x00 | ||
| 124 | #define PCI_IO_RANGE_TYPE_32 0x01 | ||
| 125 | #define PCI_IO_RANGE_MASK (~0x0fUL) | ||
| 126 | #define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */ | ||
| 127 | #define PCI_MEMORY_BASE 0x20 /* Memory range behind */ | ||
| 128 | #define PCI_MEMORY_LIMIT 0x22 | ||
| 129 | #define PCI_MEMORY_RANGE_TYPE_MASK 0x0fUL | ||
| 130 | #define PCI_MEMORY_RANGE_MASK (~0x0fUL) | ||
| 131 | #define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ | ||
| 132 | #define PCI_PREF_MEMORY_LIMIT 0x26 | ||
| 133 | #define PCI_PREF_RANGE_TYPE_MASK 0x0fUL | ||
| 134 | #define PCI_PREF_RANGE_TYPE_32 0x00 | ||
| 135 | #define PCI_PREF_RANGE_TYPE_64 0x01 | ||
| 136 | #define PCI_PREF_RANGE_MASK (~0x0fUL) | ||
| 137 | #define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ | ||
| 138 | #define PCI_PREF_LIMIT_UPPER32 0x2c | ||
| 139 | #define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ | ||
| 140 | #define PCI_IO_LIMIT_UPPER16 0x32 | ||
| 141 | /* 0x34 same as for htype 0 */ | ||
| 142 | /* 0x35-0x3b is reserved */ | ||
| 143 | #define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ | ||
| 144 | /* 0x3c-0x3d are same as for htype 0 */ | ||
| 145 | #define PCI_BRIDGE_CONTROL 0x3e | ||
| 146 | #define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ | ||
| 147 | #define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ | ||
| 148 | #define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ | ||
| 149 | #define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ | ||
| 150 | #define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ | ||
| 151 | #define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ | ||
| 152 | #define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ | ||
| 153 | |||
| 154 | /* Header type 2 (CardBus bridges) */ | ||
| 155 | #define PCI_CB_CAPABILITY_LIST 0x14 | ||
| 156 | /* 0x15 reserved */ | ||
| 157 | #define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ | ||
| 158 | #define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ | ||
| 159 | #define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ | ||
| 160 | #define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ | ||
| 161 | #define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ | ||
| 162 | #define PCI_CB_MEMORY_BASE_0 0x1c | ||
| 163 | #define PCI_CB_MEMORY_LIMIT_0 0x20 | ||
| 164 | #define PCI_CB_MEMORY_BASE_1 0x24 | ||
| 165 | #define PCI_CB_MEMORY_LIMIT_1 0x28 | ||
| 166 | #define PCI_CB_IO_BASE_0 0x2c | ||
| 167 | #define PCI_CB_IO_BASE_0_HI 0x2e | ||
| 168 | #define PCI_CB_IO_LIMIT_0 0x30 | ||
| 169 | #define PCI_CB_IO_LIMIT_0_HI 0x32 | ||
| 170 | #define PCI_CB_IO_BASE_1 0x34 | ||
| 171 | #define PCI_CB_IO_BASE_1_HI 0x36 | ||
| 172 | #define PCI_CB_IO_LIMIT_1 0x38 | ||
| 173 | #define PCI_CB_IO_LIMIT_1_HI 0x3a | ||
| 174 | #define PCI_CB_IO_RANGE_MASK (~0x03UL) | ||
| 175 | /* 0x3c-0x3d are same as for htype 0 */ | ||
| 176 | #define PCI_CB_BRIDGE_CONTROL 0x3e | ||
| 177 | #define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ | ||
| 178 | #define PCI_CB_BRIDGE_CTL_SERR 0x02 | ||
| 179 | #define PCI_CB_BRIDGE_CTL_ISA 0x04 | ||
| 180 | #define PCI_CB_BRIDGE_CTL_VGA 0x08 | ||
| 181 | #define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 | ||
| 182 | #define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ | ||
| 183 | #define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ | ||
| 184 | #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ | ||
| 185 | #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 | ||
| 186 | #define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 | ||
| 187 | #define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 | ||
| 188 | #define PCI_CB_SUBSYSTEM_ID 0x42 | ||
| 189 | #define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ | ||
| 190 | /* 0x48-0x7f reserved */ | ||
| 191 | |||
| 192 | /* Capability lists */ | ||
| 193 | |||
| 194 | #define PCI_CAP_LIST_ID 0 /* Capability ID */ | ||
| 195 | #define PCI_CAP_ID_PM 0x01 /* Power Management */ | ||
| 196 | #define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ | ||
| 197 | #define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ | ||
| 198 | #define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ | ||
| 199 | #define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ | ||
| 200 | #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ | ||
| 201 | #define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ | ||
| 202 | #define PCI_CAP_ID_SHPC 0x0C /* PCI Standard Hot-Plug Controller */ | ||
| 203 | #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ | ||
| 204 | #define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ | ||
| 205 | #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ | ||
| 206 | #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ | ||
| 207 | #define PCI_CAP_SIZEOF 4 | ||
| 208 | |||
| 209 | /* Power Management Registers */ | ||
| 210 | |||
| 211 | #define PCI_PM_PMC 2 /* PM Capabilities Register */ | ||
| 212 | #define PCI_PM_CAP_VER_MASK 0x0007 /* Version */ | ||
| 213 | #define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */ | ||
| 214 | #define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */ | ||
| 215 | #define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */ | ||
| 216 | #define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */ | ||
| 217 | #define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ | ||
| 218 | #define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ | ||
| 219 | #define PCI_PM_CAP_PME 0x0800 /* PME pin supported */ | ||
| 220 | #define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */ | ||
| 221 | #define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */ | ||
| 222 | #define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */ | ||
| 223 | #define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */ | ||
| 224 | #define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */ | ||
| 225 | #define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */ | ||
| 226 | #define PCI_PM_CTRL 4 /* PM control and status register */ | ||
| 227 | #define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ | ||
| 228 | #define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ | ||
| 229 | #define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */ | ||
| 230 | #define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ | ||
| 231 | #define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ | ||
| 232 | #define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */ | ||
| 233 | #define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */ | ||
| 234 | #define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */ | ||
| 235 | #define PCI_PM_DATA_REGISTER 7 /* (??) */ | ||
| 236 | #define PCI_PM_SIZEOF 8 | ||
| 237 | |||
| 238 | /* AGP registers */ | ||
| 239 | |||
| 240 | #define PCI_AGP_VERSION 2 /* BCD version number */ | ||
| 241 | #define PCI_AGP_RFU 3 /* Rest of capability flags */ | ||
| 242 | #define PCI_AGP_STATUS 4 /* Status register */ | ||
| 243 | #define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ | ||
| 244 | #define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ | ||
| 245 | #define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */ | ||
| 246 | #define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */ | ||
| 247 | #define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */ | ||
| 248 | #define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */ | ||
| 249 | #define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */ | ||
| 250 | #define PCI_AGP_COMMAND 8 /* Control register */ | ||
| 251 | #define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ | ||
| 252 | #define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ | ||
| 253 | #define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ | ||
| 254 | #define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */ | ||
| 255 | #define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */ | ||
| 256 | #define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */ | ||
| 257 | #define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate */ | ||
| 258 | #define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */ | ||
| 259 | #define PCI_AGP_SIZEOF 12 | ||
| 260 | |||
| 261 | /* Vital Product Data */ | ||
| 262 | |||
| 263 | #define PCI_VPD_ADDR 2 /* Address to access (15 bits!) */ | ||
| 264 | #define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */ | ||
| 265 | #define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */ | ||
| 266 | #define PCI_VPD_DATA 4 /* 32-bits of data returned here */ | ||
| 267 | |||
| 268 | /* Slot Identification */ | ||
| 269 | |||
| 270 | #define PCI_SID_ESR 2 /* Expansion Slot Register */ | ||
| 271 | #define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ | ||
| 272 | #define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ | ||
| 273 | #define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ | ||
| 274 | |||
| 275 | /* Message Signalled Interrupts registers */ | ||
| 276 | |||
| 277 | #define PCI_MSI_FLAGS 2 /* Various flags */ | ||
| 278 | #define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ | ||
| 279 | #define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ | ||
| 280 | #define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ | ||
| 281 | #define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ | ||
| 282 | #define PCI_MSI_FLAGS_MASKBIT 0x100 /* 64-bit mask bits allowed */ | ||
| 283 | #define PCI_MSI_RFU 3 /* Rest of capability flags */ | ||
| 284 | #define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ | ||
| 285 | #define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ | ||
| 286 | #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ | ||
| 287 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ | ||
| 288 | #define PCI_MSI_MASK_BIT 16 /* Mask bits register */ | ||
| 289 | |||
| 290 | /* CompactPCI Hotswap Register */ | ||
| 291 | |||
| 292 | #define PCI_CHSWP_CSR 2 /* Control and Status Register */ | ||
| 293 | #define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */ | ||
| 294 | #define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */ | ||
| 295 | #define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */ | ||
| 296 | #define PCI_CHSWP_LOO 0x08 /* LED On / Off */ | ||
| 297 | #define PCI_CHSWP_PI 0x30 /* Programming Interface */ | ||
| 298 | #define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ | ||
| 299 | #define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ | ||
| 300 | |||
| 301 | /* PCI-X registers */ | ||
| 302 | |||
| 303 | #define PCI_X_CMD 2 /* Modes & Features */ | ||
| 304 | #define PCI_X_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */ | ||
| 305 | #define PCI_X_CMD_ERO 0x0002 /* Enable Relaxed Ordering */ | ||
| 306 | #define PCI_X_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */ | ||
| 307 | #define PCI_X_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */ | ||
| 308 | #define PCI_X_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */ | ||
| 309 | #define PCI_X_STATUS 4 /* PCI-X capabilities */ | ||
| 310 | #define PCI_X_STATUS_DEVFN 0x000000ff /* A copy of devfn */ | ||
| 311 | #define PCI_X_STATUS_BUS 0x0000ff00 /* A copy of bus nr */ | ||
| 312 | #define PCI_X_STATUS_64BIT 0x00010000 /* 64-bit device */ | ||
| 313 | #define PCI_X_STATUS_133MHZ 0x00020000 /* 133 MHz capable */ | ||
| 314 | #define PCI_X_STATUS_SPL_DISC 0x00040000 /* Split Completion Discarded */ | ||
| 315 | #define PCI_X_STATUS_UNX_SPL 0x00080000 /* Unexpected Split Completion */ | ||
| 316 | #define PCI_X_STATUS_COMPLEX 0x00100000 /* Device Complexity */ | ||
| 317 | #define PCI_X_STATUS_MAX_READ 0x00600000 /* Designed Max Memory Read Count */ | ||
| 318 | #define PCI_X_STATUS_MAX_SPLIT 0x03800000 /* Designed Max Outstanding Split Transactions */ | ||
| 319 | #define PCI_X_STATUS_MAX_CUM 0x1c000000 /* Designed Max Cumulative Read Size */ | ||
| 320 | #define PCI_X_STATUS_SPL_ERR 0x20000000 /* Rcvd Split Completion Error Msg */ | ||
| 321 | #define PCI_X_STATUS_266MHZ 0x40000000 /* 266 MHz capable */ | ||
| 322 | #define PCI_X_STATUS_533MHZ 0x80000000 /* 533 MHz capable */ | ||
| 323 | |||
| 324 | /* PCI Express capability registers */ | ||
| 325 | |||
| 326 | #define PCI_EXP_FLAGS 2 /* Capabilities register */ | ||
| 327 | #define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ | ||
| 328 | #define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ | ||
| 329 | #define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ | ||
| 330 | #define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ | ||
| 331 | #define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ | ||
| 332 | #define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ | ||
| 333 | #define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ | ||
| 334 | #define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ | ||
| 335 | #define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ | ||
| 336 | #define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ | ||
| 337 | #define PCI_EXP_DEVCAP 4 /* Device capabilities */ | ||
| 338 | #define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */ | ||
| 339 | #define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */ | ||
| 340 | #define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */ | ||
| 341 | #define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */ | ||
| 342 | #define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */ | ||
| 343 | #define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ | ||
| 344 | #define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ | ||
| 345 | #define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ | ||
| 346 | #define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ | ||
| 347 | #define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ | ||
| 348 | #define PCI_EXP_DEVCTL 8 /* Device Control */ | ||
| 349 | #define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ | ||
| 350 | #define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ | ||
| 351 | #define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */ | ||
| 352 | #define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */ | ||
| 353 | #define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */ | ||
| 354 | #define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ | ||
| 355 | #define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ | ||
| 356 | #define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ | ||
| 357 | #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ | ||
| 358 | #define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ | ||
| 359 | #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ | ||
| 360 | #define PCI_EXP_DEVSTA 10 /* Device Status */ | ||
| 361 | #define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ | ||
| 362 | #define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ | ||
| 363 | #define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */ | ||
| 364 | #define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */ | ||
| 365 | #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ | ||
| 366 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ | ||
| 367 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ | ||
| 368 | #define PCI_EXP_LNKCTL 16 /* Link Control */ | ||
| 369 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | ||
| 370 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ | ||
| 371 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ | ||
| 372 | #define PCI_EXP_SLTSTA 26 /* Slot Status */ | ||
| 373 | #define PCI_EXP_RTCTL 28 /* Root Control */ | ||
| 374 | #define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */ | ||
| 375 | #define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */ | ||
| 376 | #define PCI_EXP_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */ | ||
| 377 | #define PCI_EXP_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */ | ||
| 378 | #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ | ||
| 379 | #define PCI_EXP_RTCAP 30 /* Root Capabilities */ | ||
| 380 | #define PCI_EXP_RTSTA 32 /* Root Status */ | ||
| 381 | |||
| 382 | /* Extended Capabilities (PCI-X 2.0 and Express) */ | ||
| 383 | #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) | ||
| 384 | #define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf) | ||
| 385 | #define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc) | ||
| 386 | |||
| 387 | #define PCI_EXT_CAP_ID_ERR 1 | ||
| 388 | #define PCI_EXT_CAP_ID_VC 2 | ||
| 389 | #define PCI_EXT_CAP_ID_DSN 3 | ||
| 390 | #define PCI_EXT_CAP_ID_PWR 4 | ||
| 391 | |||
| 392 | /* Advanced Error Reporting */ | ||
| 393 | #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ | ||
| 394 | #define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */ | ||
| 395 | #define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */ | ||
| 396 | #define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */ | ||
| 397 | #define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */ | ||
| 398 | #define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */ | ||
| 399 | #define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */ | ||
| 400 | #define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */ | ||
| 401 | #define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */ | ||
| 402 | #define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */ | ||
| 403 | #define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ | ||
| 404 | #define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ | ||
| 405 | #define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ | ||
| 406 | /* Same bits as above */ | ||
| 407 | #define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */ | ||
| 408 | /* Same bits as above */ | ||
| 409 | #define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */ | ||
| 410 | #define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */ | ||
| 411 | #define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */ | ||
| 412 | #define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */ | ||
| 413 | #define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ | ||
| 414 | #define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ | ||
| 415 | #define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */ | ||
| 416 | /* Same bits as above */ | ||
| 417 | #define PCI_ERR_CAP 24 /* Advanced Error Capabilities */ | ||
| 418 | #define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */ | ||
| 419 | #define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */ | ||
| 420 | #define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */ | ||
| 421 | #define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */ | ||
| 422 | #define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ | ||
| 423 | #define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */ | ||
| 424 | #define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */ | ||
| 425 | #define PCI_ERR_ROOT_STATUS 48 | ||
| 426 | #define PCI_ERR_ROOT_COR_SRC 52 | ||
| 427 | #define PCI_ERR_ROOT_SRC 54 | ||
| 428 | |||
| 429 | /* Virtual Channel */ | ||
| 430 | #define PCI_VC_PORT_REG1 4 | ||
| 431 | #define PCI_VC_PORT_REG2 8 | ||
| 432 | #define PCI_VC_PORT_CTRL 12 | ||
| 433 | #define PCI_VC_PORT_STATUS 14 | ||
| 434 | #define PCI_VC_RES_CAP 16 | ||
| 435 | #define PCI_VC_RES_CTRL 20 | ||
| 436 | #define PCI_VC_RES_STATUS 26 | ||
| 437 | |||
| 438 | /* Power Budgeting */ | ||
| 439 | #define PCI_PWR_DSR 4 /* Data Select Register */ | ||
| 440 | #define PCI_PWR_DATA 8 /* Data Register */ | ||
| 441 | #define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ | ||
| 442 | #define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ | ||
| 443 | #define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ | ||
| 444 | #define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ | ||
| 445 | #define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ | ||
| 446 | #define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ | ||
| 447 | #define PCI_PWR_CAP 12 /* Capability */ | ||
| 448 | #define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ | ||
| 449 | 24 | ||
| 450 | /* Include the ID list */ | 25 | /* Include the ID list */ |
| 451 | |||
| 452 | #include <linux/pci_ids.h> | 26 | #include <linux/pci_ids.h> |
| 453 | 27 | ||
| 454 | /* | 28 | /* |
| @@ -496,11 +70,12 @@ enum pci_mmap_state { | |||
| 496 | 70 | ||
| 497 | typedef int __bitwise pci_power_t; | 71 | typedef int __bitwise pci_power_t; |
| 498 | 72 | ||
| 499 | #define PCI_D0 ((pci_power_t __force) 0) | 73 | #define PCI_D0 ((pci_power_t __force) 0) |
| 500 | #define PCI_D1 ((pci_power_t __force) 1) | 74 | #define PCI_D1 ((pci_power_t __force) 1) |
| 501 | #define PCI_D2 ((pci_power_t __force) 2) | 75 | #define PCI_D2 ((pci_power_t __force) 2) |
| 502 | #define PCI_D3hot ((pci_power_t __force) 3) | 76 | #define PCI_D3hot ((pci_power_t __force) 3) |
| 503 | #define PCI_D3cold ((pci_power_t __force) 4) | 77 | #define PCI_D3cold ((pci_power_t __force) 4) |
| 78 | #define PCI_UNKNOWN ((pci_power_t __force) 5) | ||
| 504 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) | 79 | #define PCI_POWER_ERROR ((pci_power_t __force) -1) |
| 505 | 80 | ||
| 506 | /* | 81 | /* |
| @@ -562,11 +137,6 @@ struct pci_dev { | |||
| 562 | struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ | 137 | struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ |
| 563 | int rom_attr_enabled; /* has display of the rom attribute been enabled? */ | 138 | int rom_attr_enabled; /* has display of the rom attribute been enabled? */ |
| 564 | struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ | 139 | struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ |
| 565 | #ifdef CONFIG_PCI_NAMES | ||
| 566 | #define PCI_NAME_SIZE 255 | ||
| 567 | #define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */ | ||
| 568 | char pretty_name[PCI_NAME_SIZE]; /* pretty name for users to see */ | ||
| 569 | #endif | ||
| 570 | }; | 140 | }; |
| 571 | 141 | ||
| 572 | #define pci_dev_g(n) list_entry(n, struct pci_dev, global_list) | 142 | #define pci_dev_g(n) list_entry(n, struct pci_dev, global_list) |
| @@ -582,15 +152,15 @@ struct pci_dev { | |||
| 582 | * 7-10 bridges: address space assigned to buses behind the bridge | 152 | * 7-10 bridges: address space assigned to buses behind the bridge |
| 583 | */ | 153 | */ |
| 584 | 154 | ||
| 585 | #define PCI_ROM_RESOURCE 6 | 155 | #define PCI_ROM_RESOURCE 6 |
| 586 | #define PCI_BRIDGE_RESOURCES 7 | 156 | #define PCI_BRIDGE_RESOURCES 7 |
| 587 | #define PCI_NUM_RESOURCES 11 | 157 | #define PCI_NUM_RESOURCES 11 |
| 588 | 158 | ||
| 589 | #ifndef PCI_BUS_NUM_RESOURCES | 159 | #ifndef PCI_BUS_NUM_RESOURCES |
| 590 | #define PCI_BUS_NUM_RESOURCES 8 | 160 | #define PCI_BUS_NUM_RESOURCES 8 |
| 591 | #endif | 161 | #endif |
| 592 | 162 | ||
| 593 | #define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */ | 163 | #define PCI_REGION_FLAG_MASK 0x0fU /* These bits of resource flags tell us the PCI region flags */ |
| 594 | 164 | ||
| 595 | struct pci_bus { | 165 | struct pci_bus { |
| 596 | struct list_head node; /* node in list of buses */ | 166 | struct list_head node; /* node in list of buses */ |
| @@ -699,7 +269,7 @@ struct pci_driver { | |||
| 699 | * @dev_class_mask: the class mask for this device | 269 | * @dev_class_mask: the class mask for this device |
| 700 | * | 270 | * |
| 701 | * This macro is used to create a struct pci_device_id that matches a | 271 | * This macro is used to create a struct pci_device_id that matches a |
| 702 | * specific PCI class. The vendor, device, subvendor, and subdevice | 272 | * specific PCI class. The vendor, device, subvendor, and subdevice |
| 703 | * fields will be set to PCI_ANY_ID. | 273 | * fields will be set to PCI_ANY_ID. |
| 704 | */ | 274 | */ |
| 705 | #define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \ | 275 | #define PCI_DEVICE_CLASS(dev_class,dev_class_mask) \ |
| @@ -707,7 +277,7 @@ struct pci_driver { | |||
| 707 | .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ | 277 | .vendor = PCI_ANY_ID, .device = PCI_ANY_ID, \ |
| 708 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID | 278 | .subvendor = PCI_ANY_ID, .subdevice = PCI_ANY_ID |
| 709 | 279 | ||
| 710 | /* | 280 | /* |
| 711 | * pci_module_init is obsolete, this stays here till we fix up all usages of it | 281 | * pci_module_init is obsolete, this stays here till we fix up all usages of it |
| 712 | * in the tree. | 282 | * in the tree. |
| 713 | */ | 283 | */ |
| @@ -749,8 +319,6 @@ int pci_scan_slot(struct pci_bus *bus, int devfn); | |||
| 749 | struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn); | 319 | struct pci_dev * pci_scan_single_device(struct pci_bus *bus, int devfn); |
| 750 | unsigned int pci_scan_child_bus(struct pci_bus *bus); | 320 | unsigned int pci_scan_child_bus(struct pci_bus *bus); |
| 751 | void pci_bus_add_device(struct pci_dev *dev); | 321 | void pci_bus_add_device(struct pci_dev *dev); |
| 752 | void pci_name_device(struct pci_dev *dev); | ||
| 753 | char *pci_class_name(u32 class); | ||
| 754 | void pci_read_bridge_bases(struct pci_bus *child); | 322 | void pci_read_bridge_bases(struct pci_bus *child); |
| 755 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); | 323 | struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res); |
| 756 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); | 324 | int pci_get_interrupt_pin(struct pci_dev *dev, struct pci_dev **bridge); |
| @@ -815,9 +383,12 @@ void pci_set_master(struct pci_dev *dev); | |||
| 815 | #define HAVE_PCI_SET_MWI | 383 | #define HAVE_PCI_SET_MWI |
| 816 | int pci_set_mwi(struct pci_dev *dev); | 384 | int pci_set_mwi(struct pci_dev *dev); |
| 817 | void pci_clear_mwi(struct pci_dev *dev); | 385 | void pci_clear_mwi(struct pci_dev *dev); |
| 386 | void pci_intx(struct pci_dev *dev, int enable); | ||
| 818 | int pci_set_dma_mask(struct pci_dev *dev, u64 mask); | 387 | int pci_set_dma_mask(struct pci_dev *dev, u64 mask); |
| 819 | int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); | 388 | int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask); |
| 389 | void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno); | ||
| 820 | int pci_assign_resource(struct pci_dev *dev, int i); | 390 | int pci_assign_resource(struct pci_dev *dev, int i); |
| 391 | void pci_restore_bars(struct pci_dev *dev); | ||
| 821 | 392 | ||
| 822 | /* ROM control related routines */ | 393 | /* ROM control related routines */ |
| 823 | void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size); | 394 | void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size); |
| @@ -865,6 +436,9 @@ const struct pci_device_id *pci_match_device(struct pci_driver *drv, struct pci_ | |||
| 865 | const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, struct pci_dev *dev); | 436 | const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, struct pci_dev *dev); |
| 866 | int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass); | 437 | int pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass); |
| 867 | 438 | ||
| 439 | void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *), | ||
| 440 | void *userdata); | ||
| 441 | |||
| 868 | /* kmem_cache style wrapper around pci_alloc_consistent() */ | 442 | /* kmem_cache style wrapper around pci_alloc_consistent() */ |
| 869 | 443 | ||
| 870 | #include <linux/dmapool.h> | 444 | #include <linux/dmapool.h> |
| @@ -912,18 +486,26 @@ extern void pci_disable_msix(struct pci_dev *dev); | |||
| 912 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); | 486 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); |
| 913 | #endif | 487 | #endif |
| 914 | 488 | ||
| 915 | #endif /* CONFIG_PCI */ | 489 | /* |
| 916 | 490 | * PCI domain support. Sometimes called PCI segment (eg by ACPI), | |
| 917 | /* Include architecture-dependent settings and functions */ | 491 | * a PCI domain is defined to be a set of PCI busses which share |
| 492 | * configuration space. | ||
| 493 | */ | ||
| 494 | #ifndef CONFIG_PCI_DOMAINS | ||
| 495 | static inline int pci_domain_nr(struct pci_bus *bus) { return 0; } | ||
| 496 | static inline int pci_proc_domain(struct pci_bus *bus) | ||
| 497 | { | ||
| 498 | return 0; | ||
| 499 | } | ||
| 500 | #endif | ||
| 918 | 501 | ||
| 919 | #include <asm/pci.h> | 502 | #else /* CONFIG_PCI is not enabled */ |
| 920 | 503 | ||
| 921 | /* | 504 | /* |
| 922 | * If the system does not have PCI, clearly these return errors. Define | 505 | * If the system does not have PCI, clearly these return errors. Define |
| 923 | * these as simple inline functions to avoid hair in drivers. | 506 | * these as simple inline functions to avoid hair in drivers. |
| 924 | */ | 507 | */ |
| 925 | 508 | ||
| 926 | #ifndef CONFIG_PCI | ||
| 927 | #define _PCI_NOP(o,s,t) \ | 509 | #define _PCI_NOP(o,s,t) \ |
| 928 | static inline int pci_##o##_config_##s (struct pci_dev *dev, int where, t val) \ | 510 | static inline int pci_##o##_config_##s (struct pci_dev *dev, int where, t val) \ |
| 929 | { return PCIBIOS_FUNC_NOT_SUPPORTED; } | 511 | { return PCIBIOS_FUNC_NOT_SUPPORTED; } |
| @@ -974,21 +556,11 @@ static inline int pci_enable_wake(struct pci_dev *dev, pci_power_t state, int en | |||
| 974 | 556 | ||
| 975 | #define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0) | 557 | #define pci_dma_burst_advice(pdev, strat, strategy_parameter) do { } while (0) |
| 976 | 558 | ||
| 977 | #else | 559 | #endif /* CONFIG_PCI */ |
| 978 | 560 | ||
| 979 | /* | 561 | /* Include architecture-dependent settings and functions */ |
| 980 | * PCI domain support. Sometimes called PCI segment (eg by ACPI), | 562 | |
| 981 | * a PCI domain is defined to be a set of PCI busses which share | 563 | #include <asm/pci.h> |
| 982 | * configuration space. | ||
| 983 | */ | ||
| 984 | #ifndef CONFIG_PCI_DOMAINS | ||
| 985 | static inline int pci_domain_nr(struct pci_bus *bus) { return 0; } | ||
| 986 | static inline int pci_proc_domain(struct pci_bus *bus) | ||
| 987 | { | ||
| 988 | return 0; | ||
| 989 | } | ||
| 990 | #endif | ||
| 991 | #endif /* !CONFIG_PCI */ | ||
| 992 | 564 | ||
| 993 | /* these helpers provide future and backwards compatibility | 565 | /* these helpers provide future and backwards compatibility |
| 994 | * for accessing popular PCI BAR info */ | 566 | * for accessing popular PCI BAR info */ |
| @@ -1025,13 +597,6 @@ static inline char *pci_name(struct pci_dev *pdev) | |||
| 1025 | return pdev->dev.bus_id; | 597 | return pdev->dev.bus_id; |
| 1026 | } | 598 | } |
| 1027 | 599 | ||
| 1028 | /* Some archs want to see the pretty pci name, so use this macro */ | ||
| 1029 | #ifdef CONFIG_PCI_NAMES | ||
| 1030 | #define pci_pretty_name(dev) ((dev)->pretty_name) | ||
| 1031 | #else | ||
| 1032 | #define pci_pretty_name(dev) "" | ||
| 1033 | #endif | ||
| 1034 | |||
| 1035 | 600 | ||
| 1036 | /* Some archs don't want to expose struct resource to userland as-is | 601 | /* Some archs don't want to expose struct resource to userland as-is |
| 1037 | * in sysfs and /proc | 602 | * in sysfs and /proc |
| @@ -1067,7 +632,7 @@ enum pci_fixup_pass { | |||
| 1067 | 632 | ||
| 1068 | /* Anonymous variables would be nice... */ | 633 | /* Anonymous variables would be nice... */ |
| 1069 | #define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, hook) \ | 634 | #define DECLARE_PCI_FIXUP_SECTION(section, name, vendor, device, hook) \ |
| 1070 | static struct pci_fixup __pci_fixup_##name __attribute_used__ \ | 635 | static const struct pci_fixup __pci_fixup_##name __attribute_used__ \ |
| 1071 | __attribute__((__section__(#section))) = { vendor, device, hook }; | 636 | __attribute__((__section__(#section))) = { vendor, device, hook }; |
| 1072 | #define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook) \ | 637 | #define DECLARE_PCI_FIXUP_EARLY(vendor, device, hook) \ |
| 1073 | DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \ | 638 | DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early, \ |
diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h new file mode 100644 index 000000000000..e2a089b051ed --- /dev/null +++ b/include/linux/pci_regs.h | |||
| @@ -0,0 +1,448 @@ | |||
| 1 | /* | ||
| 2 | * pci_regs.h | ||
| 3 | * | ||
| 4 | * PCI standard defines | ||
| 5 | * Copyright 1994, Drew Eckhardt | ||
| 6 | * Copyright 1997--1999 Martin Mares <mj@ucw.cz> | ||
| 7 | * | ||
| 8 | * For more information, please consult the following manuals (look at | ||
| 9 | * http://www.pcisig.com/ for how to get them): | ||
| 10 | * | ||
| 11 | * PCI BIOS Specification | ||
| 12 | * PCI Local Bus Specification | ||
| 13 | * PCI to PCI Bridge Specification | ||
| 14 | * PCI System Design Guide | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef LINUX_PCI_REGS_H | ||
| 18 | #define LINUX_PCI_REGS_H | ||
| 19 | |||
| 20 | /* | ||
| 21 | * Under PCI, each device has 256 bytes of configuration address space, | ||
| 22 | * of which the first 64 bytes are standardized as follows: | ||
| 23 | */ | ||
| 24 | #define PCI_VENDOR_ID 0x00 /* 16 bits */ | ||
| 25 | #define PCI_DEVICE_ID 0x02 /* 16 bits */ | ||
| 26 | #define PCI_COMMAND 0x04 /* 16 bits */ | ||
| 27 | #define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ | ||
| 28 | #define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ | ||
| 29 | #define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ | ||
| 30 | #define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ | ||
| 31 | #define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ | ||
| 32 | #define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ | ||
| 33 | #define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ | ||
| 34 | #define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ | ||
| 35 | #define PCI_COMMAND_SERR 0x100 /* Enable SERR */ | ||
| 36 | #define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ | ||
| 37 | #define PCI_COMMAND_INTX_DISABLE 0x400 /* INTx Emulation Disable */ | ||
| 38 | |||
| 39 | #define PCI_STATUS 0x06 /* 16 bits */ | ||
| 40 | #define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ | ||
| 41 | #define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ | ||
| 42 | #define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ | ||
| 43 | #define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ | ||
| 44 | #define PCI_STATUS_PARITY 0x100 /* Detected parity error */ | ||
| 45 | #define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ | ||
| 46 | #define PCI_STATUS_DEVSEL_FAST 0x000 | ||
| 47 | #define PCI_STATUS_DEVSEL_MEDIUM 0x200 | ||
| 48 | #define PCI_STATUS_DEVSEL_SLOW 0x400 | ||
| 49 | #define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ | ||
| 50 | #define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ | ||
| 51 | #define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ | ||
| 52 | #define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ | ||
| 53 | #define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ | ||
| 54 | |||
| 55 | #define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 revision */ | ||
| 56 | #define PCI_REVISION_ID 0x08 /* Revision ID */ | ||
| 57 | #define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ | ||
| 58 | #define PCI_CLASS_DEVICE 0x0a /* Device class */ | ||
| 59 | |||
| 60 | #define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ | ||
| 61 | #define PCI_LATENCY_TIMER 0x0d /* 8 bits */ | ||
| 62 | #define PCI_HEADER_TYPE 0x0e /* 8 bits */ | ||
| 63 | #define PCI_HEADER_TYPE_NORMAL 0 | ||
| 64 | #define PCI_HEADER_TYPE_BRIDGE 1 | ||
| 65 | #define PCI_HEADER_TYPE_CARDBUS 2 | ||
| 66 | |||
| 67 | #define PCI_BIST 0x0f /* 8 bits */ | ||
| 68 | #define PCI_BIST_CODE_MASK 0x0f /* Return result */ | ||
| 69 | #define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ | ||
| 70 | #define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ | ||
| 71 | |||
| 72 | /* | ||
| 73 | * Base addresses specify locations in memory or I/O space. | ||
| 74 | * Decoded size can be determined by writing a value of | ||
| 75 | * 0xffffffff to the register, and reading it back. Only | ||
| 76 | * 1 bits are decoded. | ||
| 77 | */ | ||
| 78 | #define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ | ||
| 79 | #define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ | ||
| 80 | #define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ | ||
| 81 | #define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ | ||
| 82 | #define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ | ||
| 83 | #define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ | ||
| 84 | #define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ | ||
| 85 | #define PCI_BASE_ADDRESS_SPACE_IO 0x01 | ||
| 86 | #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 | ||
| 87 | #define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 | ||
| 88 | #define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ | ||
| 89 | #define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ | ||
| 90 | #define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ | ||
| 91 | #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ | ||
| 92 | #define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL) | ||
| 93 | #define PCI_BASE_ADDRESS_IO_MASK (~0x03UL) | ||
| 94 | /* bit 1 is reserved if address_space = 1 */ | ||
| 95 | |||
| 96 | /* Header type 0 (normal devices) */ | ||
| 97 | #define PCI_CARDBUS_CIS 0x28 | ||
| 98 | #define PCI_SUBSYSTEM_VENDOR_ID 0x2c | ||
| 99 | #define PCI_SUBSYSTEM_ID 0x2e | ||
| 100 | #define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ | ||
| 101 | #define PCI_ROM_ADDRESS_ENABLE 0x01 | ||
| 102 | #define PCI_ROM_ADDRESS_MASK (~0x7ffUL) | ||
| 103 | |||
| 104 | #define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ | ||
| 105 | |||
| 106 | /* 0x35-0x3b are reserved */ | ||
| 107 | #define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ | ||
| 108 | #define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ | ||
| 109 | #define PCI_MIN_GNT 0x3e /* 8 bits */ | ||
| 110 | #define PCI_MAX_LAT 0x3f /* 8 bits */ | ||
| 111 | |||
| 112 | /* Header type 1 (PCI-to-PCI bridges) */ | ||
| 113 | #define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ | ||
| 114 | #define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ | ||
| 115 | #define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ | ||
| 116 | #define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ | ||
| 117 | #define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ | ||
| 118 | #define PCI_IO_LIMIT 0x1d | ||
| 119 | #define PCI_IO_RANGE_TYPE_MASK 0x0fUL /* I/O bridging type */ | ||
| 120 | #define PCI_IO_RANGE_TYPE_16 0x00 | ||
| 121 | #define PCI_IO_RANGE_TYPE_32 0x01 | ||
| 122 | #define PCI_IO_RANGE_MASK (~0x0fUL) | ||
| 123 | #define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */ | ||
| 124 | #define PCI_MEMORY_BASE 0x20 /* Memory range behind */ | ||
| 125 | #define PCI_MEMORY_LIMIT 0x22 | ||
| 126 | #define PCI_MEMORY_RANGE_TYPE_MASK 0x0fUL | ||
| 127 | #define PCI_MEMORY_RANGE_MASK (~0x0fUL) | ||
| 128 | #define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ | ||
| 129 | #define PCI_PREF_MEMORY_LIMIT 0x26 | ||
| 130 | #define PCI_PREF_RANGE_TYPE_MASK 0x0fUL | ||
| 131 | #define PCI_PREF_RANGE_TYPE_32 0x00 | ||
| 132 | #define PCI_PREF_RANGE_TYPE_64 0x01 | ||
| 133 | #define PCI_PREF_RANGE_MASK (~0x0fUL) | ||
| 134 | #define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ | ||
| 135 | #define PCI_PREF_LIMIT_UPPER32 0x2c | ||
| 136 | #define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ | ||
| 137 | #define PCI_IO_LIMIT_UPPER16 0x32 | ||
| 138 | /* 0x34 same as for htype 0 */ | ||
| 139 | /* 0x35-0x3b is reserved */ | ||
| 140 | #define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ | ||
| 141 | /* 0x3c-0x3d are same as for htype 0 */ | ||
| 142 | #define PCI_BRIDGE_CONTROL 0x3e | ||
| 143 | #define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ | ||
| 144 | #define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ | ||
| 145 | #define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ | ||
| 146 | #define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ | ||
| 147 | #define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ | ||
| 148 | #define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ | ||
| 149 | #define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ | ||
| 150 | |||
| 151 | /* Header type 2 (CardBus bridges) */ | ||
| 152 | #define PCI_CB_CAPABILITY_LIST 0x14 | ||
| 153 | /* 0x15 reserved */ | ||
| 154 | #define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ | ||
| 155 | #define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ | ||
| 156 | #define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ | ||
| 157 | #define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ | ||
| 158 | #define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ | ||
| 159 | #define PCI_CB_MEMORY_BASE_0 0x1c | ||
| 160 | #define PCI_CB_MEMORY_LIMIT_0 0x20 | ||
| 161 | #define PCI_CB_MEMORY_BASE_1 0x24 | ||
| 162 | #define PCI_CB_MEMORY_LIMIT_1 0x28 | ||
| 163 | #define PCI_CB_IO_BASE_0 0x2c | ||
| 164 | #define PCI_CB_IO_BASE_0_HI 0x2e | ||
| 165 | #define PCI_CB_IO_LIMIT_0 0x30 | ||
| 166 | #define PCI_CB_IO_LIMIT_0_HI 0x32 | ||
| 167 | #define PCI_CB_IO_BASE_1 0x34 | ||
| 168 | #define PCI_CB_IO_BASE_1_HI 0x36 | ||
| 169 | #define PCI_CB_IO_LIMIT_1 0x38 | ||
| 170 | #define PCI_CB_IO_LIMIT_1_HI 0x3a | ||
| 171 | #define PCI_CB_IO_RANGE_MASK (~0x03UL) | ||
| 172 | /* 0x3c-0x3d are same as for htype 0 */ | ||
| 173 | #define PCI_CB_BRIDGE_CONTROL 0x3e | ||
| 174 | #define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ | ||
| 175 | #define PCI_CB_BRIDGE_CTL_SERR 0x02 | ||
| 176 | #define PCI_CB_BRIDGE_CTL_ISA 0x04 | ||
| 177 | #define PCI_CB_BRIDGE_CTL_VGA 0x08 | ||
| 178 | #define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 | ||
| 179 | #define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ | ||
| 180 | #define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ | ||
| 181 | #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ | ||
| 182 | #define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 | ||
| 183 | #define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 | ||
| 184 | #define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 | ||
| 185 | #define PCI_CB_SUBSYSTEM_ID 0x42 | ||
| 186 | #define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ | ||
| 187 | /* 0x48-0x7f reserved */ | ||
| 188 | |||
| 189 | /* Capability lists */ | ||
| 190 | |||
| 191 | #define PCI_CAP_LIST_ID 0 /* Capability ID */ | ||
| 192 | #define PCI_CAP_ID_PM 0x01 /* Power Management */ | ||
| 193 | #define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ | ||
| 194 | #define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ | ||
| 195 | #define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ | ||
| 196 | #define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ | ||
| 197 | #define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ | ||
| 198 | #define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ | ||
| 199 | #define PCI_CAP_ID_SHPC 0x0C /* PCI Standard Hot-Plug Controller */ | ||
| 200 | #define PCI_CAP_ID_EXP 0x10 /* PCI Express */ | ||
| 201 | #define PCI_CAP_ID_MSIX 0x11 /* MSI-X */ | ||
| 202 | #define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ | ||
| 203 | #define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ | ||
| 204 | #define PCI_CAP_SIZEOF 4 | ||
| 205 | |||
| 206 | /* Power Management Registers */ | ||
| 207 | |||
| 208 | #define PCI_PM_PMC 2 /* PM Capabilities Register */ | ||
| 209 | #define PCI_PM_CAP_VER_MASK 0x0007 /* Version */ | ||
| 210 | #define PCI_PM_CAP_PME_CLOCK 0x0008 /* PME clock required */ | ||
| 211 | #define PCI_PM_CAP_RESERVED 0x0010 /* Reserved field */ | ||
| 212 | #define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization */ | ||
| 213 | #define PCI_PM_CAP_AUX_POWER 0x01C0 /* Auxilliary power support mask */ | ||
| 214 | #define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ | ||
| 215 | #define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ | ||
| 216 | #define PCI_PM_CAP_PME 0x0800 /* PME pin supported */ | ||
| 217 | #define PCI_PM_CAP_PME_MASK 0xF800 /* PME Mask of all supported states */ | ||
| 218 | #define PCI_PM_CAP_PME_D0 0x0800 /* PME# from D0 */ | ||
| 219 | #define PCI_PM_CAP_PME_D1 0x1000 /* PME# from D1 */ | ||
| 220 | #define PCI_PM_CAP_PME_D2 0x2000 /* PME# from D2 */ | ||
| 221 | #define PCI_PM_CAP_PME_D3 0x4000 /* PME# from D3 (hot) */ | ||
| 222 | #define PCI_PM_CAP_PME_D3cold 0x8000 /* PME# from D3 (cold) */ | ||
| 223 | #define PCI_PM_CTRL 4 /* PM control and status register */ | ||
| 224 | #define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ | ||
| 225 | #define PCI_PM_CTRL_NO_SOFT_RESET 0x0004 /* No reset for D3hot->D0 */ | ||
| 226 | #define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ | ||
| 227 | #define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* Data select (??) */ | ||
| 228 | #define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ | ||
| 229 | #define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ | ||
| 230 | #define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions (??) */ | ||
| 231 | #define PCI_PM_PPB_B2_B3 0x40 /* Stop clock when in D3hot (??) */ | ||
| 232 | #define PCI_PM_BPCC_ENABLE 0x80 /* Bus power/clock control enable (??) */ | ||
| 233 | #define PCI_PM_DATA_REGISTER 7 /* (??) */ | ||
| 234 | #define PCI_PM_SIZEOF 8 | ||
| 235 | |||
| 236 | /* AGP registers */ | ||
| 237 | |||
| 238 | #define PCI_AGP_VERSION 2 /* BCD version number */ | ||
| 239 | #define PCI_AGP_RFU 3 /* Rest of capability flags */ | ||
| 240 | #define PCI_AGP_STATUS 4 /* Status register */ | ||
| 241 | #define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ | ||
| 242 | #define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ | ||
| 243 | #define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing supported */ | ||
| 244 | #define PCI_AGP_STATUS_FW 0x0010 /* FW transfers supported */ | ||
| 245 | #define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported */ | ||
| 246 | #define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported */ | ||
| 247 | #define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported */ | ||
| 248 | #define PCI_AGP_COMMAND 8 /* Control register */ | ||
| 249 | #define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ | ||
| 250 | #define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ | ||
| 251 | #define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ | ||
| 252 | #define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow processing of 64-bit addresses */ | ||
| 253 | #define PCI_AGP_COMMAND_FW 0x0010 /* Force FW transfers */ | ||
| 254 | #define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate */ | ||
| 255 | #define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate */ | ||
| 256 | #define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate */ | ||
| 257 | #define PCI_AGP_SIZEOF 12 | ||
| 258 | |||
| 259 | /* Vital Product Data */ | ||
| 260 | |||
| 261 | #define PCI_VPD_ADDR 2 /* Address to access (15 bits!) */ | ||
| 262 | #define PCI_VPD_ADDR_MASK 0x7fff /* Address mask */ | ||
| 263 | #define PCI_VPD_ADDR_F 0x8000 /* Write 0, 1 indicates completion */ | ||
| 264 | #define PCI_VPD_DATA 4 /* 32-bits of data returned here */ | ||
| 265 | |||
| 266 | /* Slot Identification */ | ||
| 267 | |||
| 268 | #define PCI_SID_ESR 2 /* Expansion Slot Register */ | ||
| 269 | #define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ | ||
| 270 | #define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ | ||
| 271 | #define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ | ||
| 272 | |||
| 273 | /* Message Signalled Interrupts registers */ | ||
| 274 | |||
| 275 | #define PCI_MSI_FLAGS 2 /* Various flags */ | ||
| 276 | #define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ | ||
| 277 | #define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ | ||
| 278 | #define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ | ||
| 279 | #define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ | ||
| 280 | #define PCI_MSI_FLAGS_MASKBIT 0x100 /* 64-bit mask bits allowed */ | ||
| 281 | #define PCI_MSI_RFU 3 /* Rest of capability flags */ | ||
| 282 | #define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ | ||
| 283 | #define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ | ||
| 284 | #define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ | ||
| 285 | #define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ | ||
| 286 | #define PCI_MSI_MASK_BIT 16 /* Mask bits register */ | ||
| 287 | |||
| 288 | /* CompactPCI Hotswap Register */ | ||
| 289 | |||
| 290 | #define PCI_CHSWP_CSR 2 /* Control and Status Register */ | ||
| 291 | #define PCI_CHSWP_DHA 0x01 /* Device Hiding Arm */ | ||
| 292 | #define PCI_CHSWP_EIM 0x02 /* ENUM# Signal Mask */ | ||
| 293 | #define PCI_CHSWP_PIE 0x04 /* Pending Insert or Extract */ | ||
| 294 | #define PCI_CHSWP_LOO 0x08 /* LED On / Off */ | ||
| 295 | #define PCI_CHSWP_PI 0x30 /* Programming Interface */ | ||
| 296 | #define PCI_CHSWP_EXT 0x40 /* ENUM# status - extraction */ | ||
| 297 | #define PCI_CHSWP_INS 0x80 /* ENUM# status - insertion */ | ||
| 298 | |||
| 299 | /* PCI-X registers */ | ||
| 300 | |||
| 301 | #define PCI_X_CMD 2 /* Modes & Features */ | ||
| 302 | #define PCI_X_CMD_DPERR_E 0x0001 /* Data Parity Error Recovery Enable */ | ||
| 303 | #define PCI_X_CMD_ERO 0x0002 /* Enable Relaxed Ordering */ | ||
| 304 | #define PCI_X_CMD_MAX_READ 0x000c /* Max Memory Read Byte Count */ | ||
| 305 | #define PCI_X_CMD_MAX_SPLIT 0x0070 /* Max Outstanding Split Transactions */ | ||
| 306 | #define PCI_X_CMD_VERSION(x) (((x) >> 12) & 3) /* Version */ | ||
| 307 | #define PCI_X_STATUS 4 /* PCI-X capabilities */ | ||
| 308 | #define PCI_X_STATUS_DEVFN 0x000000ff /* A copy of devfn */ | ||
| 309 | #define PCI_X_STATUS_BUS 0x0000ff00 /* A copy of bus nr */ | ||
| 310 | #define PCI_X_STATUS_64BIT 0x00010000 /* 64-bit device */ | ||
| 311 | #define PCI_X_STATUS_133MHZ 0x00020000 /* 133 MHz capable */ | ||
| 312 | #define PCI_X_STATUS_SPL_DISC 0x00040000 /* Split Completion Discarded */ | ||
| 313 | #define PCI_X_STATUS_UNX_SPL 0x00080000 /* Unexpected Split Completion */ | ||
| 314 | #define PCI_X_STATUS_COMPLEX 0x00100000 /* Device Complexity */ | ||
| 315 | #define PCI_X_STATUS_MAX_READ 0x00600000 /* Designed Max Memory Read Count */ | ||
| 316 | #define PCI_X_STATUS_MAX_SPLIT 0x03800000 /* Designed Max Outstanding Split Transactions */ | ||
| 317 | #define PCI_X_STATUS_MAX_CUM 0x1c000000 /* Designed Max Cumulative Read Size */ | ||
| 318 | #define PCI_X_STATUS_SPL_ERR 0x20000000 /* Rcvd Split Completion Error Msg */ | ||
| 319 | #define PCI_X_STATUS_266MHZ 0x40000000 /* 266 MHz capable */ | ||
| 320 | #define PCI_X_STATUS_533MHZ 0x80000000 /* 533 MHz capable */ | ||
| 321 | |||
| 322 | /* PCI Express capability registers */ | ||
| 323 | |||
| 324 | #define PCI_EXP_FLAGS 2 /* Capabilities register */ | ||
| 325 | #define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ | ||
| 326 | #define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ | ||
| 327 | #define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ | ||
| 328 | #define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ | ||
| 329 | #define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ | ||
| 330 | #define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ | ||
| 331 | #define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ | ||
| 332 | #define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ | ||
| 333 | #define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ | ||
| 334 | #define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ | ||
| 335 | #define PCI_EXP_DEVCAP 4 /* Device capabilities */ | ||
| 336 | #define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */ | ||
| 337 | #define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */ | ||
| 338 | #define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */ | ||
| 339 | #define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */ | ||
| 340 | #define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */ | ||
| 341 | #define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ | ||
| 342 | #define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ | ||
| 343 | #define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ | ||
| 344 | #define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ | ||
| 345 | #define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ | ||
| 346 | #define PCI_EXP_DEVCTL 8 /* Device Control */ | ||
| 347 | #define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En. */ | ||
| 348 | #define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting Enable */ | ||
| 349 | #define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */ | ||
| 350 | #define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting En. */ | ||
| 351 | #define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */ | ||
| 352 | #define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ | ||
| 353 | #define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ | ||
| 354 | #define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ | ||
| 355 | #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ | ||
| 356 | #define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ | ||
| 357 | #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ | ||
| 358 | #define PCI_EXP_DEVSTA 10 /* Device Status */ | ||
| 359 | #define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ | ||
| 360 | #define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ | ||
| 361 | #define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */ | ||
| 362 | #define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */ | ||
| 363 | #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ | ||
| 364 | #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ | ||
| 365 | #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ | ||
| 366 | #define PCI_EXP_LNKCTL 16 /* Link Control */ | ||
| 367 | #define PCI_EXP_LNKSTA 18 /* Link Status */ | ||
| 368 | #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ | ||
| 369 | #define PCI_EXP_SLTCTL 24 /* Slot Control */ | ||
| 370 | #define PCI_EXP_SLTSTA 26 /* Slot Status */ | ||
| 371 | #define PCI_EXP_RTCTL 28 /* Root Control */ | ||
| 372 | #define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Correctable Error */ | ||
| 373 | #define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Error */ | ||
| 374 | #define PCI_EXP_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */ | ||
| 375 | #define PCI_EXP_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */ | ||
| 376 | #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility Enable */ | ||
| 377 | #define PCI_EXP_RTCAP 30 /* Root Capabilities */ | ||
| 378 | #define PCI_EXP_RTSTA 32 /* Root Status */ | ||
| 379 | |||
| 380 | /* Extended Capabilities (PCI-X 2.0 and Express) */ | ||
| 381 | #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) | ||
| 382 | #define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf) | ||
| 383 | #define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc) | ||
| 384 | |||
| 385 | #define PCI_EXT_CAP_ID_ERR 1 | ||
| 386 | #define PCI_EXT_CAP_ID_VC 2 | ||
| 387 | #define PCI_EXT_CAP_ID_DSN 3 | ||
| 388 | #define PCI_EXT_CAP_ID_PWR 4 | ||
| 389 | |||
| 390 | /* Advanced Error Reporting */ | ||
| 391 | #define PCI_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status */ | ||
| 392 | #define PCI_ERR_UNC_TRAIN 0x00000001 /* Training */ | ||
| 393 | #define PCI_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */ | ||
| 394 | #define PCI_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */ | ||
| 395 | #define PCI_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */ | ||
| 396 | #define PCI_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */ | ||
| 397 | #define PCI_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */ | ||
| 398 | #define PCI_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */ | ||
| 399 | #define PCI_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */ | ||
| 400 | #define PCI_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */ | ||
| 401 | #define PCI_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ | ||
| 402 | #define PCI_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ | ||
| 403 | #define PCI_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ | ||
| 404 | /* Same bits as above */ | ||
| 405 | #define PCI_ERR_UNCOR_SEVER 12 /* Uncorrectable Error Severity */ | ||
| 406 | /* Same bits as above */ | ||
| 407 | #define PCI_ERR_COR_STATUS 16 /* Correctable Error Status */ | ||
| 408 | #define PCI_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */ | ||
| 409 | #define PCI_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */ | ||
| 410 | #define PCI_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */ | ||
| 411 | #define PCI_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ | ||
| 412 | #define PCI_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ | ||
| 413 | #define PCI_ERR_COR_MASK 20 /* Correctable Error Mask */ | ||
| 414 | /* Same bits as above */ | ||
| 415 | #define PCI_ERR_CAP 24 /* Advanced Error Capabilities */ | ||
| 416 | #define PCI_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */ | ||
| 417 | #define PCI_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */ | ||
| 418 | #define PCI_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */ | ||
| 419 | #define PCI_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */ | ||
| 420 | #define PCI_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ | ||
| 421 | #define PCI_ERR_HEADER_LOG 28 /* Header Log Register (16 bytes) */ | ||
| 422 | #define PCI_ERR_ROOT_COMMAND 44 /* Root Error Command */ | ||
| 423 | #define PCI_ERR_ROOT_STATUS 48 | ||
| 424 | #define PCI_ERR_ROOT_COR_SRC 52 | ||
| 425 | #define PCI_ERR_ROOT_SRC 54 | ||
| 426 | |||
| 427 | /* Virtual Channel */ | ||
| 428 | #define PCI_VC_PORT_REG1 4 | ||
| 429 | #define PCI_VC_PORT_REG2 8 | ||
| 430 | #define PCI_VC_PORT_CTRL 12 | ||
| 431 | #define PCI_VC_PORT_STATUS 14 | ||
| 432 | #define PCI_VC_RES_CAP 16 | ||
| 433 | #define PCI_VC_RES_CTRL 20 | ||
| 434 | #define PCI_VC_RES_STATUS 26 | ||
| 435 | |||
| 436 | /* Power Budgeting */ | ||
| 437 | #define PCI_PWR_DSR 4 /* Data Select Register */ | ||
| 438 | #define PCI_PWR_DATA 8 /* Data Register */ | ||
| 439 | #define PCI_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ | ||
| 440 | #define PCI_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ | ||
| 441 | #define PCI_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ | ||
| 442 | #define PCI_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ | ||
| 443 | #define PCI_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ | ||
| 444 | #define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ | ||
| 445 | #define PCI_PWR_CAP 12 /* Capability */ | ||
| 446 | #define PCI_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in system budget */ | ||
| 447 | |||
| 448 | #endif /* LINUX_PCI_REGS_H */ | ||
diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h index d8a023d804d4..317a979b24de 100644 --- a/include/linux/serial_8250.h +++ b/include/linux/serial_8250.h | |||
| @@ -30,6 +30,21 @@ struct plat_serial8250_port { | |||
| 30 | }; | 30 | }; |
| 31 | 31 | ||
| 32 | /* | 32 | /* |
| 33 | * Allocate 8250 platform device IDs. Nothing is implied by | ||
| 34 | * the numbering here, except for the legacy entry being -1. | ||
| 35 | */ | ||
| 36 | enum { | ||
| 37 | PLAT8250_DEV_LEGACY = -1, | ||
| 38 | PLAT8250_DEV_PLATFORM, | ||
| 39 | PLAT8250_DEV_PLATFORM1, | ||
| 40 | PLAT8250_DEV_FOURPORT, | ||
| 41 | PLAT8250_DEV_ACCENT, | ||
| 42 | PLAT8250_DEV_BOCA, | ||
| 43 | PLAT8250_DEV_HUB6, | ||
| 44 | PLAT8250_DEV_MCA, | ||
| 45 | }; | ||
| 46 | |||
| 47 | /* | ||
| 33 | * This should be used by drivers which want to register | 48 | * This should be used by drivers which want to register |
| 34 | * their own 8250 ports without registering their own | 49 | * their own 8250 ports without registering their own |
| 35 | * platform device. Using these will make your driver | 50 | * platform device. Using these will make your driver |
diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h index 9b12fe731612..27db8da43aa4 100644 --- a/include/linux/serial_core.h +++ b/include/linux/serial_core.h | |||
| @@ -401,6 +401,9 @@ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch, | |||
| 401 | #endif | 401 | #endif |
| 402 | return 0; | 402 | return 0; |
| 403 | } | 403 | } |
| 404 | #ifndef SUPPORT_SYSRQ | ||
| 405 | #define uart_handle_sysrq_char(port,ch,regs) uart_handle_sysrq_char(port, 0, NULL) | ||
| 406 | #endif | ||
| 404 | 407 | ||
| 405 | /* | 408 | /* |
| 406 | * We do the SysRQ and SAK checking like this... | 409 | * We do the SysRQ and SAK checking like this... |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index da7da9c0ed1b..2741c0c55e83 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
| @@ -1167,7 +1167,7 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb, | |||
| 1167 | 1167 | ||
| 1168 | static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) | 1168 | static inline int pskb_trim_rcsum(struct sk_buff *skb, unsigned int len) |
| 1169 | { | 1169 | { |
| 1170 | if (len >= skb->len) | 1170 | if (likely(len >= skb->len)) |
| 1171 | return 0; | 1171 | return 0; |
| 1172 | if (skb->ip_summed == CHECKSUM_HW) | 1172 | if (skb->ip_summed == CHECKSUM_HW) |
| 1173 | skb->ip_summed = CHECKSUM_NONE; | 1173 | skb->ip_summed = CHECKSUM_NONE; |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 724637792996..4dbe580f9335 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | #include <linux/usb_ch9.h> | 5 | #include <linux/usb_ch9.h> |
| 6 | 6 | ||
| 7 | #define USB_MAJOR 180 | 7 | #define USB_MAJOR 180 |
| 8 | #define USB_DEVICE_MAJOR 189 | ||
| 8 | 9 | ||
| 9 | 10 | ||
| 10 | #ifdef __KERNEL__ | 11 | #ifdef __KERNEL__ |
| @@ -349,6 +350,7 @@ struct usb_device { | |||
| 349 | char *manufacturer; | 350 | char *manufacturer; |
| 350 | char *serial; /* static strings from the device */ | 351 | char *serial; /* static strings from the device */ |
| 351 | struct list_head filelist; | 352 | struct list_head filelist; |
| 353 | struct class_device *class_dev; | ||
| 352 | struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ | 354 | struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */ |
| 353 | 355 | ||
| 354 | /* | 356 | /* |
| @@ -614,7 +616,6 @@ extern int usb_disabled(void); | |||
| 614 | #define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ | 616 | #define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame ignored */ |
| 615 | #define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ | 617 | #define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma valid on submit */ |
| 616 | #define URB_NO_SETUP_DMA_MAP 0x0008 /* urb->setup_dma valid on submit */ | 618 | #define URB_NO_SETUP_DMA_MAP 0x0008 /* urb->setup_dma valid on submit */ |
| 617 | #define URB_ASYNC_UNLINK 0x0010 /* usb_unlink_urb() returns asap */ | ||
| 618 | #define URB_NO_FSBR 0x0020 /* UHCI-specific */ | 619 | #define URB_NO_FSBR 0x0020 /* UHCI-specific */ |
| 619 | #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ | 620 | #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with short packet */ |
| 620 | #define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */ | 621 | #define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error interrupt needed */ |
| @@ -722,13 +723,7 @@ typedef void (*usb_complete_t)(struct urb *, struct pt_regs *); | |||
| 722 | * Initialization: | 723 | * Initialization: |
| 723 | * | 724 | * |
| 724 | * All URBs submitted must initialize the dev, pipe, transfer_flags (may be | 725 | * All URBs submitted must initialize the dev, pipe, transfer_flags (may be |
| 725 | * zero), and complete fields. | 726 | * zero), and complete fields. All URBs must also initialize |
| 726 | * The URB_ASYNC_UNLINK transfer flag affects later invocations of | ||
| 727 | * the usb_unlink_urb() routine. Note: Failure to set URB_ASYNC_UNLINK | ||
| 728 | * with usb_unlink_urb() is deprecated. For synchronous unlinks use | ||
| 729 | * usb_kill_urb() instead. | ||
| 730 | * | ||
| 731 | * All URBs must also initialize | ||
| 732 | * transfer_buffer and transfer_buffer_length. They may provide the | 727 | * transfer_buffer and transfer_buffer_length. They may provide the |
| 733 | * URB_SHORT_NOT_OK transfer flag, indicating that short reads are | 728 | * URB_SHORT_NOT_OK transfer flag, indicating that short reads are |
| 734 | * to be treated as errors; that flag is invalid for write requests. | 729 | * to be treated as errors; that flag is invalid for write requests. |
diff --git a/include/linux/usb_isp116x.h b/include/linux/usb_isp116x.h index 5f5a9d9bd6c2..436dd8a2b64a 100644 --- a/include/linux/usb_isp116x.h +++ b/include/linux/usb_isp116x.h | |||
| @@ -7,36 +7,18 @@ | |||
| 7 | struct isp116x_platform_data { | 7 | struct isp116x_platform_data { |
| 8 | /* Enable internal resistors on downstream ports */ | 8 | /* Enable internal resistors on downstream ports */ |
| 9 | unsigned sel15Kres:1; | 9 | unsigned sel15Kres:1; |
| 10 | /* Chip's internal clock won't be stopped in suspended state. | 10 | /* On-chip overcurrent detection */ |
| 11 | Setting/unsetting this bit takes effect only if | ||
| 12 | 'remote_wakeup_enable' below is not set. */ | ||
| 13 | unsigned clknotstop:1; | ||
| 14 | /* On-chip overcurrent protection */ | ||
| 15 | unsigned oc_enable:1; | 11 | unsigned oc_enable:1; |
| 16 | /* INT output polarity */ | 12 | /* INT output polarity */ |
| 17 | unsigned int_act_high:1; | 13 | unsigned int_act_high:1; |
| 18 | /* INT edge or level triggered */ | 14 | /* INT edge or level triggered */ |
| 19 | unsigned int_edge_triggered:1; | 15 | unsigned int_edge_triggered:1; |
| 20 | /* WAKEUP pin connected - NOT SUPPORTED */ | 16 | /* Enable wakeup by devices on usb bus (e.g. wakeup |
| 21 | /* unsigned remote_wakeup_connected:1; */ | 17 | by attachment/detachment or by device activity |
| 22 | /* Wakeup by devices on usb bus enabled */ | 18 | such as moving a mouse). When chosen, this option |
| 19 | prevents stopping internal clock, increasing | ||
| 20 | thereby power consumption in suspended state. */ | ||
| 23 | unsigned remote_wakeup_enable:1; | 21 | unsigned remote_wakeup_enable:1; |
| 24 | /* Switch or not to switch (keep always powered) */ | ||
| 25 | unsigned no_power_switching:1; | ||
| 26 | /* Ganged port power switching (0) or individual port | ||
| 27 | power switching (1) */ | ||
| 28 | unsigned power_switching_mode:1; | ||
| 29 | /* Given port_power, msec/2 after power on till power good */ | ||
| 30 | u8 potpg; | ||
| 31 | /* Hardware reset set/clear. If implemented, this function must: | ||
| 32 | if set == 0, deassert chip's HW reset pin | ||
| 33 | otherwise, assert chip's HW reset pin */ | ||
| 34 | void (*reset) (struct device * dev, int set); | ||
| 35 | /* Hardware clock start/stop. If implemented, this function must: | ||
| 36 | if start == 0, stop the external clock | ||
| 37 | otherwise, start the external clock | ||
| 38 | */ | ||
| 39 | void (*clock) (struct device * dev, int start); | ||
| 40 | /* Inter-io delay (ns). The chip is picky about access timings; it | 22 | /* Inter-io delay (ns). The chip is picky about access timings; it |
| 41 | expects at least: | 23 | expects at least: |
| 42 | 150ns delay between consecutive accesses to DATA_REG, | 24 | 150ns delay between consecutive accesses to DATA_REG, |
diff --git a/include/net/ax25.h b/include/net/ax25.h index 364b046e9f47..227d3378decd 100644 --- a/include/net/ax25.h +++ b/include/net/ax25.h | |||
| @@ -258,7 +258,7 @@ extern struct sock *ax25_make_new(struct sock *, struct ax25_dev *); | |||
| 258 | /* ax25_addr.c */ | 258 | /* ax25_addr.c */ |
| 259 | extern ax25_address null_ax25_address; | 259 | extern ax25_address null_ax25_address; |
| 260 | extern char *ax2asc(char *buf, ax25_address *); | 260 | extern char *ax2asc(char *buf, ax25_address *); |
| 261 | extern ax25_address *asc2ax(char *); | 261 | extern void asc2ax(ax25_address *addr, char *callsign); |
| 262 | extern int ax25cmp(ax25_address *, ax25_address *); | 262 | extern int ax25cmp(ax25_address *, ax25_address *); |
| 263 | extern int ax25digicmp(ax25_digi *, ax25_digi *); | 263 | extern int ax25digicmp(ax25_digi *, ax25_digi *); |
| 264 | extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *); | 264 | extern unsigned char *ax25_addr_parse(unsigned char *, int, ax25_address *, ax25_address *, ax25_digi *, int *, int *); |
diff --git a/include/net/compat.h b/include/net/compat.h index 482eb820f13a..290bab46d457 100644 --- a/include/net/compat.h +++ b/include/net/compat.h | |||
| @@ -33,7 +33,8 @@ extern asmlinkage long compat_sys_sendmsg(int,struct compat_msghdr __user *,unsi | |||
| 33 | extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned); | 33 | extern asmlinkage long compat_sys_recvmsg(int,struct compat_msghdr __user *,unsigned); |
| 34 | extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *); | 34 | extern asmlinkage long compat_sys_getsockopt(int, int, int, char __user *, int __user *); |
| 35 | extern int put_cmsg_compat(struct msghdr*, int, int, int, void *); | 35 | extern int put_cmsg_compat(struct msghdr*, int, int, int, void *); |
| 36 | extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, | 36 | |
| 37 | int); | 37 | struct sock; |
| 38 | extern int cmsghdr_from_user_compat_to_kern(struct msghdr *, struct sock *, unsigned char *, int); | ||
| 38 | 39 | ||
| 39 | #endif /* NET_COMPAT_H */ | 40 | #endif /* NET_COMPAT_H */ |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 3203eaff4bd4..65ec86678a08 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
| @@ -233,6 +233,10 @@ extern int ip6_ra_control(struct sock *sk, int sel, | |||
| 233 | extern int ipv6_parse_hopopts(struct sk_buff *skb, int); | 233 | extern int ipv6_parse_hopopts(struct sk_buff *skb, int); |
| 234 | 234 | ||
| 235 | extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); | 235 | extern struct ipv6_txoptions * ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt); |
| 236 | extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | ||
| 237 | int newtype, | ||
| 238 | struct ipv6_opt_hdr __user *newopt, | ||
| 239 | int newoptlen); | ||
| 236 | 240 | ||
| 237 | extern int ip6_frag_nqueues; | 241 | extern int ip6_frag_nqueues; |
| 238 | extern atomic_t ip6_frag_mem; | 242 | extern atomic_t ip6_frag_mem; |
| @@ -373,6 +377,7 @@ extern int ip6_append_data(struct sock *sk, | |||
| 373 | int length, | 377 | int length, |
| 374 | int transhdrlen, | 378 | int transhdrlen, |
| 375 | int hlimit, | 379 | int hlimit, |
| 380 | int tclass, | ||
| 376 | struct ipv6_txoptions *opt, | 381 | struct ipv6_txoptions *opt, |
| 377 | struct flowi *fl, | 382 | struct flowi *fl, |
| 378 | struct rt6_info *rt, | 383 | struct rt6_info *rt, |
diff --git a/include/net/transp_v6.h b/include/net/transp_v6.h index 8b075ab7a26c..4e86f2de6638 100644 --- a/include/net/transp_v6.h +++ b/include/net/transp_v6.h | |||
| @@ -37,7 +37,7 @@ extern int datagram_recv_ctl(struct sock *sk, | |||
| 37 | extern int datagram_send_ctl(struct msghdr *msg, | 37 | extern int datagram_send_ctl(struct msghdr *msg, |
| 38 | struct flowi *fl, | 38 | struct flowi *fl, |
| 39 | struct ipv6_txoptions *opt, | 39 | struct ipv6_txoptions *opt, |
| 40 | int *hlimit); | 40 | int *hlimit, int *tclass); |
| 41 | 41 | ||
| 42 | #define LOOPBACK4_IPV6 __constant_htonl(0x7f000006) | 42 | #define LOOPBACK4_IPV6 __constant_htonl(0x7f000006) |
| 43 | 43 | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 13492d66b7c8..afa06e184d88 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -88,7 +88,7 @@ static kmem_cache_t *sn_cache; | |||
| 88 | policied. */ | 88 | policied. */ |
| 89 | static int policy_zone; | 89 | static int policy_zone; |
| 90 | 90 | ||
| 91 | static struct mempolicy default_policy = { | 91 | struct mempolicy default_policy = { |
| 92 | .refcnt = ATOMIC_INIT(1), /* never free it */ | 92 | .refcnt = ATOMIC_INIT(1), /* never free it */ |
| 93 | .policy = MPOL_DEFAULT, | 93 | .policy = MPOL_DEFAULT, |
| 94 | }; | 94 | }; |
diff --git a/net/ax25/ax25_addr.c b/net/ax25/ax25_addr.c index dca179daf415..0164a155b8c4 100644 --- a/net/ax25/ax25_addr.c +++ b/net/ax25/ax25_addr.c | |||
| @@ -67,37 +67,34 @@ char *ax2asc(char *buf, ax25_address *a) | |||
| 67 | /* | 67 | /* |
| 68 | * ascii -> ax25 conversion | 68 | * ascii -> ax25 conversion |
| 69 | */ | 69 | */ |
| 70 | ax25_address *asc2ax(char *callsign) | 70 | void asc2ax(ax25_address *addr, char *callsign) |
| 71 | { | 71 | { |
| 72 | static ax25_address addr; | ||
| 73 | char *s; | 72 | char *s; |
| 74 | int n; | 73 | int n; |
| 75 | 74 | ||
| 76 | for (s = callsign, n = 0; n < 6; n++) { | 75 | for (s = callsign, n = 0; n < 6; n++) { |
| 77 | if (*s != '\0' && *s != '-') | 76 | if (*s != '\0' && *s != '-') |
| 78 | addr.ax25_call[n] = *s++; | 77 | addr->ax25_call[n] = *s++; |
| 79 | else | 78 | else |
| 80 | addr.ax25_call[n] = ' '; | 79 | addr->ax25_call[n] = ' '; |
| 81 | addr.ax25_call[n] <<= 1; | 80 | addr->ax25_call[n] <<= 1; |
| 82 | addr.ax25_call[n] &= 0xFE; | 81 | addr->ax25_call[n] &= 0xFE; |
| 83 | } | 82 | } |
| 84 | 83 | ||
| 85 | if (*s++ == '\0') { | 84 | if (*s++ == '\0') { |
| 86 | addr.ax25_call[6] = 0x00; | 85 | addr->ax25_call[6] = 0x00; |
| 87 | return &addr; | 86 | return; |
| 88 | } | 87 | } |
| 89 | 88 | ||
| 90 | addr.ax25_call[6] = *s++ - '0'; | 89 | addr->ax25_call[6] = *s++ - '0'; |
| 91 | 90 | ||
| 92 | if (*s != '\0') { | 91 | if (*s != '\0') { |
| 93 | addr.ax25_call[6] *= 10; | 92 | addr->ax25_call[6] *= 10; |
| 94 | addr.ax25_call[6] += *s++ - '0'; | 93 | addr->ax25_call[6] += *s++ - '0'; |
| 95 | } | 94 | } |
| 96 | 95 | ||
| 97 | addr.ax25_call[6] <<= 1; | 96 | addr->ax25_call[6] <<= 1; |
| 98 | addr.ax25_call[6] &= 0x1E; | 97 | addr->ax25_call[6] &= 0x1E; |
| 99 | |||
| 100 | return &addr; | ||
| 101 | } | 98 | } |
| 102 | 99 | ||
| 103 | /* | 100 | /* |
diff --git a/net/ieee80211/Kconfig b/net/ieee80211/Kconfig index 58ed4319e693..91b16fbf91f0 100644 --- a/net/ieee80211/Kconfig +++ b/net/ieee80211/Kconfig | |||
| @@ -1,6 +1,5 @@ | |||
| 1 | config IEEE80211 | 1 | config IEEE80211 |
| 2 | tristate "Generic IEEE 802.11 Networking Stack" | 2 | tristate "Generic IEEE 802.11 Networking Stack" |
| 3 | select NET_RADIO | ||
| 4 | ---help--- | 3 | ---help--- |
| 5 | This option enables the hardware independent IEEE 802.11 | 4 | This option enables the hardware independent IEEE 802.11 |
| 6 | networking stack. | 5 | networking stack. |
diff --git a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c index 2b5cf9c51309..bb7246683b74 100644 --- a/net/ipv4/netfilter/ip_conntrack_netbios_ns.c +++ b/net/ipv4/netfilter/ip_conntrack_netbios_ns.c | |||
| @@ -104,12 +104,28 @@ out: | |||
| 104 | static struct ip_conntrack_helper helper = { | 104 | static struct ip_conntrack_helper helper = { |
| 105 | .name = "netbios-ns", | 105 | .name = "netbios-ns", |
| 106 | .tuple = { | 106 | .tuple = { |
| 107 | .src.u.udp.port = __constant_htons(137), | 107 | .src = { |
| 108 | .dst.protonum = IPPROTO_UDP, | 108 | .u = { |
| 109 | .udp = { | ||
| 110 | .port = __constant_htons(137), | ||
| 111 | } | ||
| 112 | } | ||
| 113 | }, | ||
| 114 | .dst = { | ||
| 115 | .protonum = IPPROTO_UDP, | ||
| 116 | }, | ||
| 109 | }, | 117 | }, |
| 110 | .mask = { | 118 | .mask = { |
| 111 | .src.u.udp.port = 0xFFFF, | 119 | .src = { |
| 112 | .dst.protonum = 0xFF, | 120 | .u = { |
| 121 | .udp = { | ||
| 122 | .port = 0xFFFF, | ||
| 123 | } | ||
| 124 | } | ||
| 125 | }, | ||
| 126 | .dst = { | ||
| 127 | .protonum = 0xFF, | ||
| 128 | }, | ||
| 113 | }, | 129 | }, |
| 114 | .max_expected = 1, | 130 | .max_expected = 1, |
| 115 | .me = THIS_MODULE, | 131 | .me = THIS_MODULE, |
diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c index f115a84a4ac6..f057025a719e 100644 --- a/net/ipv4/netfilter/ipt_REJECT.c +++ b/net/ipv4/netfilter/ipt_REJECT.c | |||
| @@ -92,10 +92,7 @@ static inline struct rtable *route_reverse(struct sk_buff *skb, | |||
| 92 | fl.fl_ip_sport = tcph->dest; | 92 | fl.fl_ip_sport = tcph->dest; |
| 93 | fl.fl_ip_dport = tcph->source; | 93 | fl.fl_ip_dport = tcph->source; |
| 94 | 94 | ||
| 95 | if (xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0)) { | 95 | xfrm_lookup((struct dst_entry **)&rt, &fl, NULL, 0); |
| 96 | dst_release(&rt->u.dst); | ||
| 97 | rt = NULL; | ||
| 98 | } | ||
| 99 | 96 | ||
| 100 | return rt; | 97 | return rt; |
| 101 | } | 98 | } |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 8c0b14e3beec..8549f26e2495 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1760,6 +1760,7 @@ static inline int __mkroute_input(struct sk_buff *skb, | |||
| 1760 | goto cleanup; | 1760 | goto cleanup; |
| 1761 | } | 1761 | } |
| 1762 | 1762 | ||
| 1763 | atomic_set(&rth->u.dst.__refcnt, 1); | ||
| 1763 | rth->u.dst.flags= DST_HOST; | 1764 | rth->u.dst.flags= DST_HOST; |
| 1764 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED | 1765 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED |
| 1765 | if (res->fi->fib_nhs > 1) | 1766 | if (res->fi->fib_nhs > 1) |
| @@ -1820,7 +1821,6 @@ static inline int ip_mkroute_input_def(struct sk_buff *skb, | |||
| 1820 | err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth); | 1821 | err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, &rth); |
| 1821 | if (err) | 1822 | if (err) |
| 1822 | return err; | 1823 | return err; |
| 1823 | atomic_set(&rth->u.dst.__refcnt, 1); | ||
| 1824 | 1824 | ||
| 1825 | /* put it into the cache */ | 1825 | /* put it into the cache */ |
| 1826 | hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); | 1826 | hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); |
| @@ -1834,8 +1834,8 @@ static inline int ip_mkroute_input(struct sk_buff *skb, | |||
| 1834 | u32 daddr, u32 saddr, u32 tos) | 1834 | u32 daddr, u32 saddr, u32 tos) |
| 1835 | { | 1835 | { |
| 1836 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED | 1836 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED |
| 1837 | struct rtable* rth = NULL; | 1837 | struct rtable* rth = NULL, *rtres; |
| 1838 | unsigned char hop, hopcount, lasthop; | 1838 | unsigned char hop, hopcount; |
| 1839 | int err = -EINVAL; | 1839 | int err = -EINVAL; |
| 1840 | unsigned int hash; | 1840 | unsigned int hash; |
| 1841 | 1841 | ||
| @@ -1844,8 +1844,6 @@ static inline int ip_mkroute_input(struct sk_buff *skb, | |||
| 1844 | else | 1844 | else |
| 1845 | hopcount = 1; | 1845 | hopcount = 1; |
| 1846 | 1846 | ||
| 1847 | lasthop = hopcount - 1; | ||
| 1848 | |||
| 1849 | /* distinguish between multipath and singlepath */ | 1847 | /* distinguish between multipath and singlepath */ |
| 1850 | if (hopcount < 2) | 1848 | if (hopcount < 2) |
| 1851 | return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, | 1849 | return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, |
| @@ -1855,6 +1853,10 @@ static inline int ip_mkroute_input(struct sk_buff *skb, | |||
| 1855 | for (hop = 0; hop < hopcount; hop++) { | 1853 | for (hop = 0; hop < hopcount; hop++) { |
| 1856 | res->nh_sel = hop; | 1854 | res->nh_sel = hop; |
| 1857 | 1855 | ||
| 1856 | /* put reference to previous result */ | ||
| 1857 | if (hop) | ||
| 1858 | ip_rt_put(rtres); | ||
| 1859 | |||
| 1858 | /* create a routing cache entry */ | 1860 | /* create a routing cache entry */ |
| 1859 | err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, | 1861 | err = __mkroute_input(skb, res, in_dev, daddr, saddr, tos, |
| 1860 | &rth); | 1862 | &rth); |
| @@ -1863,7 +1865,7 @@ static inline int ip_mkroute_input(struct sk_buff *skb, | |||
| 1863 | 1865 | ||
| 1864 | /* put it into the cache */ | 1866 | /* put it into the cache */ |
| 1865 | hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); | 1867 | hash = rt_hash_code(daddr, saddr ^ (fl->iif << 5), tos); |
| 1866 | err = rt_intern_hash(hash, rth, (struct rtable**)&skb->dst); | 1868 | err = rt_intern_hash(hash, rth, &rtres); |
| 1867 | if (err) | 1869 | if (err) |
| 1868 | return err; | 1870 | return err; |
| 1869 | 1871 | ||
| @@ -1873,13 +1875,8 @@ static inline int ip_mkroute_input(struct sk_buff *skb, | |||
| 1873 | FIB_RES_NETMASK(*res), | 1875 | FIB_RES_NETMASK(*res), |
| 1874 | res->prefixlen, | 1876 | res->prefixlen, |
| 1875 | &FIB_RES_NH(*res)); | 1877 | &FIB_RES_NH(*res)); |
| 1876 | |||
| 1877 | /* only for the last hop the reference count is handled | ||
| 1878 | * outside | ||
| 1879 | */ | ||
| 1880 | if (hop == lasthop) | ||
| 1881 | atomic_set(&(skb->dst->__refcnt), 1); | ||
| 1882 | } | 1878 | } |
| 1879 | skb->dst = &rtres->u.dst; | ||
| 1883 | return err; | 1880 | return err; |
| 1884 | #else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */ | 1881 | #else /* CONFIG_IP_ROUTE_MULTIPATH_CACHED */ |
| 1885 | return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos); | 1882 | return ip_mkroute_input_def(skb, res, fl, in_dev, daddr, saddr, tos); |
| @@ -2208,6 +2205,7 @@ static inline int __mkroute_output(struct rtable **result, | |||
| 2208 | goto cleanup; | 2205 | goto cleanup; |
| 2209 | } | 2206 | } |
| 2210 | 2207 | ||
| 2208 | atomic_set(&rth->u.dst.__refcnt, 1); | ||
| 2211 | rth->u.dst.flags= DST_HOST; | 2209 | rth->u.dst.flags= DST_HOST; |
| 2212 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED | 2210 | #ifdef CONFIG_IP_ROUTE_MULTIPATH_CACHED |
| 2213 | if (res->fi) { | 2211 | if (res->fi) { |
| @@ -2290,8 +2288,6 @@ static inline int ip_mkroute_output_def(struct rtable **rp, | |||
| 2290 | if (err == 0) { | 2288 | if (err == 0) { |
| 2291 | u32 tos = RT_FL_TOS(oldflp); | 2289 | u32 tos = RT_FL_TOS(oldflp); |
| 2292 | 2290 | ||
| 2293 | atomic_set(&rth->u.dst.__refcnt, 1); | ||
| 2294 | |||
| 2295 | hash = rt_hash_code(oldflp->fl4_dst, | 2291 | hash = rt_hash_code(oldflp->fl4_dst, |
| 2296 | oldflp->fl4_src ^ (oldflp->oif << 5), tos); | 2292 | oldflp->fl4_src ^ (oldflp->oif << 5), tos); |
| 2297 | err = rt_intern_hash(hash, rth, rp); | 2293 | err = rt_intern_hash(hash, rth, rp); |
| @@ -2326,6 +2322,10 @@ static inline int ip_mkroute_output(struct rtable** rp, | |||
| 2326 | dev2nexthop = FIB_RES_DEV(*res); | 2322 | dev2nexthop = FIB_RES_DEV(*res); |
| 2327 | dev_hold(dev2nexthop); | 2323 | dev_hold(dev2nexthop); |
| 2328 | 2324 | ||
| 2325 | /* put reference to previous result */ | ||
| 2326 | if (hop) | ||
| 2327 | ip_rt_put(*rp); | ||
| 2328 | |||
| 2329 | err = __mkroute_output(&rth, res, fl, oldflp, | 2329 | err = __mkroute_output(&rth, res, fl, oldflp, |
| 2330 | dev2nexthop, flags); | 2330 | dev2nexthop, flags); |
| 2331 | 2331 | ||
| @@ -2350,7 +2350,6 @@ static inline int ip_mkroute_output(struct rtable** rp, | |||
| 2350 | if (err != 0) | 2350 | if (err != 0) |
| 2351 | return err; | 2351 | return err; |
| 2352 | } | 2352 | } |
| 2353 | atomic_set(&(*rp)->u.dst.__refcnt, 1); | ||
| 2354 | return err; | 2353 | return err; |
| 2355 | } else { | 2354 | } else { |
| 2356 | return ip_mkroute_output_def(rp, res, fl, oldflp, dev_out, | 2355 | return ip_mkroute_output_def(rp, res, fl, oldflp, dev_out, |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 6094db5e11be..15e1134da1b2 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -499,7 +499,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, unsigned int mss | |||
| 499 | /* If this packet has been sent out already, we must | 499 | /* If this packet has been sent out already, we must |
| 500 | * adjust the various packet counters. | 500 | * adjust the various packet counters. |
| 501 | */ | 501 | */ |
| 502 | if (after(tp->snd_nxt, TCP_SKB_CB(buff)->end_seq)) { | 502 | if (!before(tp->snd_nxt, TCP_SKB_CB(buff)->end_seq)) { |
| 503 | int diff = old_factor - tcp_skb_pcount(skb) - | 503 | int diff = old_factor - tcp_skb_pcount(skb) - |
| 504 | tcp_skb_pcount(buff); | 504 | tcp_skb_pcount(buff); |
| 505 | 505 | ||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index e5beca7de86c..e0bd1013cb0d 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1141,7 +1141,7 @@ int udp_rcv(struct sk_buff *skb) | |||
| 1141 | if (ulen > len || ulen < sizeof(*uh)) | 1141 | if (ulen > len || ulen < sizeof(*uh)) |
| 1142 | goto short_packet; | 1142 | goto short_packet; |
| 1143 | 1143 | ||
| 1144 | if (pskb_trim(skb, ulen)) | 1144 | if (pskb_trim_rcsum(skb, ulen)) |
| 1145 | goto short_packet; | 1145 | goto short_packet; |
| 1146 | 1146 | ||
| 1147 | if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0) | 1147 | if (udp_checksum_init(skb, uh, ulen, saddr, daddr) < 0) |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index 01468fab3d3d..cc518405b3e1 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
| @@ -175,10 +175,8 @@ ipv4_connected: | |||
| 175 | if (final_p) | 175 | if (final_p) |
| 176 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 176 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
| 177 | 177 | ||
| 178 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 178 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 179 | dst_release(dst); | ||
| 180 | goto out; | 179 | goto out; |
| 181 | } | ||
| 182 | 180 | ||
| 183 | /* source address lookup done in ip6_dst_lookup */ | 181 | /* source address lookup done in ip6_dst_lookup */ |
| 184 | 182 | ||
| @@ -390,32 +388,101 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb) | |||
| 390 | put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); | 388 | put_cmsg(msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); |
| 391 | } | 389 | } |
| 392 | 390 | ||
| 391 | if (np->rxopt.bits.rxtclass) { | ||
| 392 | int tclass = (ntohl(*(u32 *)skb->nh.ipv6h) >> 20) & 0xff; | ||
| 393 | put_cmsg(msg, SOL_IPV6, IPV6_TCLASS, sizeof(tclass), &tclass); | ||
| 394 | } | ||
| 395 | |||
| 393 | if (np->rxopt.bits.rxflow && (*(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK)) { | 396 | if (np->rxopt.bits.rxflow && (*(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK)) { |
| 394 | u32 flowinfo = *(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK; | 397 | u32 flowinfo = *(u32*)skb->nh.raw & IPV6_FLOWINFO_MASK; |
| 395 | put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo); | 398 | put_cmsg(msg, SOL_IPV6, IPV6_FLOWINFO, sizeof(flowinfo), &flowinfo); |
| 396 | } | 399 | } |
| 400 | |||
| 401 | /* HbH is allowed only once */ | ||
| 397 | if (np->rxopt.bits.hopopts && opt->hop) { | 402 | if (np->rxopt.bits.hopopts && opt->hop) { |
| 398 | u8 *ptr = skb->nh.raw + opt->hop; | 403 | u8 *ptr = skb->nh.raw + opt->hop; |
| 399 | put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr); | 404 | put_cmsg(msg, SOL_IPV6, IPV6_HOPOPTS, (ptr[1]+1)<<3, ptr); |
| 400 | } | 405 | } |
| 401 | if (np->rxopt.bits.dstopts && opt->dst0) { | 406 | |
| 407 | if (opt->lastopt && | ||
| 408 | (np->rxopt.bits.dstopts || np->rxopt.bits.srcrt)) { | ||
| 409 | /* | ||
| 410 | * Silly enough, but we need to reparse in order to | ||
| 411 | * report extension headers (except for HbH) | ||
| 412 | * in order. | ||
| 413 | * | ||
| 414 | * Also note that IPV6_RECVRTHDRDSTOPTS is NOT | ||
| 415 | * (and WILL NOT be) defined because | ||
| 416 | * IPV6_RECVDSTOPTS is more generic. --yoshfuji | ||
| 417 | */ | ||
| 418 | unsigned int off = sizeof(struct ipv6hdr); | ||
| 419 | u8 nexthdr = skb->nh.ipv6h->nexthdr; | ||
| 420 | |||
| 421 | while (off <= opt->lastopt) { | ||
| 422 | unsigned len; | ||
| 423 | u8 *ptr = skb->nh.raw + off; | ||
| 424 | |||
| 425 | switch(nexthdr) { | ||
| 426 | case IPPROTO_DSTOPTS: | ||
| 427 | nexthdr = ptr[0]; | ||
| 428 | len = (ptr[1] + 1) << 3; | ||
| 429 | if (np->rxopt.bits.dstopts) | ||
| 430 | put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, len, ptr); | ||
| 431 | break; | ||
| 432 | case IPPROTO_ROUTING: | ||
| 433 | nexthdr = ptr[0]; | ||
| 434 | len = (ptr[1] + 1) << 3; | ||
| 435 | if (np->rxopt.bits.srcrt) | ||
| 436 | put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, len, ptr); | ||
| 437 | break; | ||
| 438 | case IPPROTO_AH: | ||
| 439 | nexthdr = ptr[0]; | ||
| 440 | len = (ptr[1] + 1) << 2; | ||
| 441 | break; | ||
| 442 | default: | ||
| 443 | nexthdr = ptr[0]; | ||
| 444 | len = (ptr[1] + 1) << 3; | ||
| 445 | break; | ||
| 446 | } | ||
| 447 | |||
| 448 | off += len; | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | /* socket options in old style */ | ||
| 453 | if (np->rxopt.bits.rxoinfo) { | ||
| 454 | struct in6_pktinfo src_info; | ||
| 455 | |||
| 456 | src_info.ipi6_ifindex = opt->iif; | ||
| 457 | ipv6_addr_copy(&src_info.ipi6_addr, &skb->nh.ipv6h->daddr); | ||
| 458 | put_cmsg(msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); | ||
| 459 | } | ||
| 460 | if (np->rxopt.bits.rxohlim) { | ||
| 461 | int hlim = skb->nh.ipv6h->hop_limit; | ||
| 462 | put_cmsg(msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim); | ||
| 463 | } | ||
| 464 | if (np->rxopt.bits.ohopopts && opt->hop) { | ||
| 465 | u8 *ptr = skb->nh.raw + opt->hop; | ||
| 466 | put_cmsg(msg, SOL_IPV6, IPV6_2292HOPOPTS, (ptr[1]+1)<<3, ptr); | ||
| 467 | } | ||
| 468 | if (np->rxopt.bits.odstopts && opt->dst0) { | ||
| 402 | u8 *ptr = skb->nh.raw + opt->dst0; | 469 | u8 *ptr = skb->nh.raw + opt->dst0; |
| 403 | put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, (ptr[1]+1)<<3, ptr); | 470 | put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr); |
| 404 | } | 471 | } |
| 405 | if (np->rxopt.bits.srcrt && opt->srcrt) { | 472 | if (np->rxopt.bits.osrcrt && opt->srcrt) { |
| 406 | struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(skb->nh.raw + opt->srcrt); | 473 | struct ipv6_rt_hdr *rthdr = (struct ipv6_rt_hdr *)(skb->nh.raw + opt->srcrt); |
| 407 | put_cmsg(msg, SOL_IPV6, IPV6_RTHDR, (rthdr->hdrlen+1) << 3, rthdr); | 474 | put_cmsg(msg, SOL_IPV6, IPV6_2292RTHDR, (rthdr->hdrlen+1) << 3, rthdr); |
| 408 | } | 475 | } |
| 409 | if (np->rxopt.bits.dstopts && opt->dst1) { | 476 | if (np->rxopt.bits.odstopts && opt->dst1) { |
| 410 | u8 *ptr = skb->nh.raw + opt->dst1; | 477 | u8 *ptr = skb->nh.raw + opt->dst1; |
| 411 | put_cmsg(msg, SOL_IPV6, IPV6_DSTOPTS, (ptr[1]+1)<<3, ptr); | 478 | put_cmsg(msg, SOL_IPV6, IPV6_2292DSTOPTS, (ptr[1]+1)<<3, ptr); |
| 412 | } | 479 | } |
| 413 | return 0; | 480 | return 0; |
| 414 | } | 481 | } |
| 415 | 482 | ||
| 416 | int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | 483 | int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, |
| 417 | struct ipv6_txoptions *opt, | 484 | struct ipv6_txoptions *opt, |
| 418 | int *hlimit) | 485 | int *hlimit, int *tclass) |
| 419 | { | 486 | { |
| 420 | struct in6_pktinfo *src_info; | 487 | struct in6_pktinfo *src_info; |
| 421 | struct cmsghdr *cmsg; | 488 | struct cmsghdr *cmsg; |
| @@ -438,6 +505,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 438 | 505 | ||
| 439 | switch (cmsg->cmsg_type) { | 506 | switch (cmsg->cmsg_type) { |
| 440 | case IPV6_PKTINFO: | 507 | case IPV6_PKTINFO: |
| 508 | case IPV6_2292PKTINFO: | ||
| 441 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) { | 509 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct in6_pktinfo))) { |
| 442 | err = -EINVAL; | 510 | err = -EINVAL; |
| 443 | goto exit_f; | 511 | goto exit_f; |
| @@ -492,6 +560,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 492 | fl->fl6_flowlabel = IPV6_FLOWINFO_MASK & *(u32 *)CMSG_DATA(cmsg); | 560 | fl->fl6_flowlabel = IPV6_FLOWINFO_MASK & *(u32 *)CMSG_DATA(cmsg); |
| 493 | break; | 561 | break; |
| 494 | 562 | ||
| 563 | case IPV6_2292HOPOPTS: | ||
| 495 | case IPV6_HOPOPTS: | 564 | case IPV6_HOPOPTS: |
| 496 | if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { | 565 | if (opt->hopopt || cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { |
| 497 | err = -EINVAL; | 566 | err = -EINVAL; |
| @@ -512,7 +581,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 512 | opt->hopopt = hdr; | 581 | opt->hopopt = hdr; |
| 513 | break; | 582 | break; |
| 514 | 583 | ||
| 515 | case IPV6_DSTOPTS: | 584 | case IPV6_2292DSTOPTS: |
| 516 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { | 585 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { |
| 517 | err = -EINVAL; | 586 | err = -EINVAL; |
| 518 | goto exit_f; | 587 | goto exit_f; |
| @@ -536,6 +605,33 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 536 | opt->dst1opt = hdr; | 605 | opt->dst1opt = hdr; |
| 537 | break; | 606 | break; |
| 538 | 607 | ||
| 608 | case IPV6_DSTOPTS: | ||
| 609 | case IPV6_RTHDRDSTOPTS: | ||
| 610 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_opt_hdr))) { | ||
| 611 | err = -EINVAL; | ||
| 612 | goto exit_f; | ||
| 613 | } | ||
| 614 | |||
| 615 | hdr = (struct ipv6_opt_hdr *)CMSG_DATA(cmsg); | ||
| 616 | len = ((hdr->hdrlen + 1) << 3); | ||
| 617 | if (cmsg->cmsg_len < CMSG_LEN(len)) { | ||
| 618 | err = -EINVAL; | ||
| 619 | goto exit_f; | ||
| 620 | } | ||
| 621 | if (!capable(CAP_NET_RAW)) { | ||
| 622 | err = -EPERM; | ||
| 623 | goto exit_f; | ||
| 624 | } | ||
| 625 | if (cmsg->cmsg_type == IPV6_DSTOPTS) { | ||
| 626 | opt->opt_flen += len; | ||
| 627 | opt->dst1opt = hdr; | ||
| 628 | } else { | ||
| 629 | opt->opt_nflen += len; | ||
| 630 | opt->dst0opt = hdr; | ||
| 631 | } | ||
| 632 | break; | ||
| 633 | |||
| 634 | case IPV6_2292RTHDR: | ||
| 539 | case IPV6_RTHDR: | 635 | case IPV6_RTHDR: |
| 540 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) { | 636 | if (cmsg->cmsg_len < CMSG_LEN(sizeof(struct ipv6_rt_hdr))) { |
| 541 | err = -EINVAL; | 637 | err = -EINVAL; |
| @@ -568,7 +664,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 568 | opt->opt_nflen += len; | 664 | opt->opt_nflen += len; |
| 569 | opt->srcrt = rthdr; | 665 | opt->srcrt = rthdr; |
| 570 | 666 | ||
| 571 | if (opt->dst1opt) { | 667 | if (cmsg->cmsg_type == IPV6_2292RTHDR && opt->dst1opt) { |
| 572 | int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3); | 668 | int dsthdrlen = ((opt->dst1opt->hdrlen+1)<<3); |
| 573 | 669 | ||
| 574 | opt->opt_nflen += dsthdrlen; | 670 | opt->opt_nflen += dsthdrlen; |
| @@ -579,6 +675,7 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 579 | 675 | ||
| 580 | break; | 676 | break; |
| 581 | 677 | ||
| 678 | case IPV6_2292HOPLIMIT: | ||
| 582 | case IPV6_HOPLIMIT: | 679 | case IPV6_HOPLIMIT: |
| 583 | if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { | 680 | if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { |
| 584 | err = -EINVAL; | 681 | err = -EINVAL; |
| @@ -588,6 +685,24 @@ int datagram_send_ctl(struct msghdr *msg, struct flowi *fl, | |||
| 588 | *hlimit = *(int *)CMSG_DATA(cmsg); | 685 | *hlimit = *(int *)CMSG_DATA(cmsg); |
| 589 | break; | 686 | break; |
| 590 | 687 | ||
| 688 | case IPV6_TCLASS: | ||
| 689 | { | ||
| 690 | int tc; | ||
| 691 | |||
| 692 | err = -EINVAL; | ||
| 693 | if (cmsg->cmsg_len != CMSG_LEN(sizeof(int))) { | ||
| 694 | goto exit_f; | ||
| 695 | } | ||
| 696 | |||
| 697 | tc = *(int *)CMSG_DATA(cmsg); | ||
| 698 | if (tc < 0 || tc > 0xff) | ||
| 699 | goto exit_f; | ||
| 700 | |||
| 701 | err = 0; | ||
| 702 | *tclass = tc; | ||
| 703 | |||
| 704 | break; | ||
| 705 | } | ||
| 591 | default: | 706 | default: |
| 592 | LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n", | 707 | LIMIT_NETDEBUG(KERN_DEBUG "invalid cmsg type: %d\n", |
| 593 | cmsg->cmsg_type); | 708 | cmsg->cmsg_type); |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 5be6da2584ee..47122728212a 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
| @@ -164,6 +164,7 @@ static int ipv6_destopt_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | |||
| 164 | return -1; | 164 | return -1; |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | opt->lastopt = skb->h.raw - skb->nh.raw; | ||
| 167 | opt->dst1 = skb->h.raw - skb->nh.raw; | 168 | opt->dst1 = skb->h.raw - skb->nh.raw; |
| 168 | 169 | ||
| 169 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { | 170 | if (ip6_parse_tlv(tlvprocdestopt_lst, skb)) { |
| @@ -243,6 +244,7 @@ static int ipv6_rthdr_rcv(struct sk_buff **skbp, unsigned int *nhoffp) | |||
| 243 | 244 | ||
| 244 | looped_back: | 245 | looped_back: |
| 245 | if (hdr->segments_left == 0) { | 246 | if (hdr->segments_left == 0) { |
| 247 | opt->lastopt = skb->h.raw - skb->nh.raw; | ||
| 246 | opt->srcrt = skb->h.raw - skb->nh.raw; | 248 | opt->srcrt = skb->h.raw - skb->nh.raw; |
| 247 | skb->h.raw += (hdr->hdrlen + 1) << 3; | 249 | skb->h.raw += (hdr->hdrlen + 1) << 3; |
| 248 | opt->dst0 = opt->dst1; | 250 | opt->dst0 = opt->dst1; |
| @@ -459,11 +461,10 @@ static int ipv6_hop_jumbo(struct sk_buff *skb, int optoff) | |||
| 459 | IP6_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS); | 461 | IP6_INC_STATS_BH(IPSTATS_MIB_INTRUNCATEDPKTS); |
| 460 | goto drop; | 462 | goto drop; |
| 461 | } | 463 | } |
| 462 | if (pkt_len + sizeof(struct ipv6hdr) < skb->len) { | 464 | |
| 463 | __pskb_trim(skb, pkt_len + sizeof(struct ipv6hdr)); | 465 | if (pskb_trim_rcsum(skb, pkt_len + sizeof(struct ipv6hdr))) |
| 464 | if (skb->ip_summed == CHECKSUM_HW) | 466 | goto drop; |
| 465 | skb->ip_summed = CHECKSUM_NONE; | 467 | |
| 466 | } | ||
| 467 | return 1; | 468 | return 1; |
| 468 | 469 | ||
| 469 | drop: | 470 | drop: |
| @@ -539,10 +540,15 @@ void ipv6_push_nfrag_opts(struct sk_buff *skb, struct ipv6_txoptions *opt, | |||
| 539 | u8 *proto, | 540 | u8 *proto, |
| 540 | struct in6_addr **daddr) | 541 | struct in6_addr **daddr) |
| 541 | { | 542 | { |
| 542 | if (opt->srcrt) | 543 | if (opt->srcrt) { |
| 543 | ipv6_push_rthdr(skb, proto, opt->srcrt, daddr); | 544 | ipv6_push_rthdr(skb, proto, opt->srcrt, daddr); |
| 544 | if (opt->dst0opt) | 545 | /* |
| 545 | ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); | 546 | * IPV6_RTHDRDSTOPTS is ignored |
| 547 | * unless IPV6_RTHDR is set (RFC3542). | ||
| 548 | */ | ||
| 549 | if (opt->dst0opt) | ||
| 550 | ipv6_push_exthdr(skb, proto, NEXTHDR_DEST, opt->dst0opt); | ||
| 551 | } | ||
| 546 | if (opt->hopopt) | 552 | if (opt->hopopt) |
| 547 | ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); | 553 | ipv6_push_exthdr(skb, proto, NEXTHDR_HOP, opt->hopopt); |
| 548 | } | 554 | } |
| @@ -573,3 +579,97 @@ ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt) | |||
| 573 | } | 579 | } |
| 574 | return opt2; | 580 | return opt2; |
| 575 | } | 581 | } |
| 582 | |||
| 583 | static int ipv6_renew_option(void *ohdr, | ||
| 584 | struct ipv6_opt_hdr __user *newopt, int newoptlen, | ||
| 585 | int inherit, | ||
| 586 | struct ipv6_opt_hdr **hdr, | ||
| 587 | char **p) | ||
| 588 | { | ||
| 589 | if (inherit) { | ||
| 590 | if (ohdr) { | ||
| 591 | memcpy(*p, ohdr, ipv6_optlen((struct ipv6_opt_hdr *)ohdr)); | ||
| 592 | *hdr = (struct ipv6_opt_hdr *)*p; | ||
| 593 | *p += CMSG_ALIGN(ipv6_optlen(*(struct ipv6_opt_hdr **)hdr)); | ||
| 594 | } | ||
| 595 | } else { | ||
| 596 | if (newopt) { | ||
| 597 | if (copy_from_user(*p, newopt, newoptlen)) | ||
| 598 | return -EFAULT; | ||
| 599 | *hdr = (struct ipv6_opt_hdr *)*p; | ||
| 600 | if (ipv6_optlen(*(struct ipv6_opt_hdr **)hdr) > newoptlen) | ||
| 601 | return -EINVAL; | ||
| 602 | *p += CMSG_ALIGN(newoptlen); | ||
| 603 | } | ||
| 604 | } | ||
| 605 | return 0; | ||
| 606 | } | ||
| 607 | |||
| 608 | struct ipv6_txoptions * | ||
| 609 | ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | ||
| 610 | int newtype, | ||
| 611 | struct ipv6_opt_hdr __user *newopt, int newoptlen) | ||
| 612 | { | ||
| 613 | int tot_len = 0; | ||
| 614 | char *p; | ||
| 615 | struct ipv6_txoptions *opt2; | ||
| 616 | int err; | ||
| 617 | |||
| 618 | if (newtype != IPV6_HOPOPTS && opt->hopopt) | ||
| 619 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->hopopt)); | ||
| 620 | if (newtype != IPV6_RTHDRDSTOPTS && opt->dst0opt) | ||
| 621 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst0opt)); | ||
| 622 | if (newtype != IPV6_RTHDR && opt->srcrt) | ||
| 623 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->srcrt)); | ||
| 624 | if (newtype != IPV6_DSTOPTS && opt->dst1opt) | ||
| 625 | tot_len += CMSG_ALIGN(ipv6_optlen(opt->dst1opt)); | ||
| 626 | if (newopt && newoptlen) | ||
| 627 | tot_len += CMSG_ALIGN(newoptlen); | ||
| 628 | |||
| 629 | if (!tot_len) | ||
| 630 | return NULL; | ||
| 631 | |||
| 632 | opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC); | ||
| 633 | if (!opt2) | ||
| 634 | return ERR_PTR(-ENOBUFS); | ||
| 635 | |||
| 636 | memset(opt2, 0, tot_len); | ||
| 637 | |||
| 638 | opt2->tot_len = tot_len; | ||
| 639 | p = (char *)(opt2 + 1); | ||
| 640 | |||
| 641 | err = ipv6_renew_option(opt->hopopt, newopt, newoptlen, | ||
| 642 | newtype != IPV6_HOPOPTS, | ||
| 643 | &opt2->hopopt, &p); | ||
| 644 | if (err) | ||
| 645 | goto out; | ||
| 646 | |||
| 647 | err = ipv6_renew_option(opt->dst0opt, newopt, newoptlen, | ||
| 648 | newtype != IPV6_RTHDRDSTOPTS, | ||
| 649 | &opt2->dst0opt, &p); | ||
| 650 | if (err) | ||
| 651 | goto out; | ||
| 652 | |||
| 653 | err = ipv6_renew_option(opt->srcrt, newopt, newoptlen, | ||
| 654 | newtype != IPV6_RTHDR, | ||
| 655 | (struct ipv6_opt_hdr **)opt2->srcrt, &p); | ||
| 656 | if (err) | ||
| 657 | goto out; | ||
| 658 | |||
| 659 | err = ipv6_renew_option(opt->dst1opt, newopt, newoptlen, | ||
| 660 | newtype != IPV6_DSTOPTS, | ||
| 661 | &opt2->dst1opt, &p); | ||
| 662 | if (err) | ||
| 663 | goto out; | ||
| 664 | |||
| 665 | opt2->opt_nflen = (opt2->hopopt ? ipv6_optlen(opt2->hopopt) : 0) + | ||
| 666 | (opt2->dst0opt ? ipv6_optlen(opt2->dst0opt) : 0) + | ||
| 667 | (opt2->srcrt ? ipv6_optlen(opt2->srcrt) : 0); | ||
| 668 | opt2->opt_flen = (opt2->dst1opt ? ipv6_optlen(opt2->dst1opt) : 0); | ||
| 669 | |||
| 670 | return opt2; | ||
| 671 | out: | ||
| 672 | sock_kfree_s(sk, p, tot_len); | ||
| 673 | return ERR_PTR(err); | ||
| 674 | } | ||
| 675 | |||
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index fa8f1bb0aa52..b7185fb3377c 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
| @@ -287,7 +287,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 287 | int iif = 0; | 287 | int iif = 0; |
| 288 | int addr_type = 0; | 288 | int addr_type = 0; |
| 289 | int len; | 289 | int len; |
| 290 | int hlimit; | 290 | int hlimit, tclass; |
| 291 | int err = 0; | 291 | int err = 0; |
| 292 | 292 | ||
| 293 | if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail) | 293 | if ((u8*)hdr < skb->head || (u8*)(hdr+1) > skb->tail) |
| @@ -374,7 +374,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 374 | if (err) | 374 | if (err) |
| 375 | goto out; | 375 | goto out; |
| 376 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 376 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 377 | goto out_dst_release; | 377 | goto out; |
| 378 | 378 | ||
| 379 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) | 379 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) |
| 380 | hlimit = np->mcast_hops; | 380 | hlimit = np->mcast_hops; |
| @@ -385,6 +385,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 385 | if (hlimit < 0) | 385 | if (hlimit < 0) |
| 386 | hlimit = ipv6_get_hoplimit(dst->dev); | 386 | hlimit = ipv6_get_hoplimit(dst->dev); |
| 387 | 387 | ||
| 388 | tclass = np->cork.tclass; | ||
| 389 | if (tclass < 0) | ||
| 390 | tclass = 0; | ||
| 391 | |||
| 388 | msg.skb = skb; | 392 | msg.skb = skb; |
| 389 | msg.offset = skb->nh.raw - skb->data; | 393 | msg.offset = skb->nh.raw - skb->data; |
| 390 | 394 | ||
| @@ -400,7 +404,7 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
| 400 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, | 404 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, |
| 401 | len + sizeof(struct icmp6hdr), | 405 | len + sizeof(struct icmp6hdr), |
| 402 | sizeof(struct icmp6hdr), | 406 | sizeof(struct icmp6hdr), |
| 403 | hlimit, NULL, &fl, (struct rt6_info*)dst, | 407 | hlimit, tclass, NULL, &fl, (struct rt6_info*)dst, |
| 404 | MSG_DONTWAIT); | 408 | MSG_DONTWAIT); |
| 405 | if (err) { | 409 | if (err) { |
| 406 | ip6_flush_pending_frames(sk); | 410 | ip6_flush_pending_frames(sk); |
| @@ -434,6 +438,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 434 | struct dst_entry *dst; | 438 | struct dst_entry *dst; |
| 435 | int err = 0; | 439 | int err = 0; |
| 436 | int hlimit; | 440 | int hlimit; |
| 441 | int tclass; | ||
| 437 | 442 | ||
| 438 | saddr = &skb->nh.ipv6h->daddr; | 443 | saddr = &skb->nh.ipv6h->daddr; |
| 439 | 444 | ||
| @@ -464,7 +469,7 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 464 | if (err) | 469 | if (err) |
| 465 | goto out; | 470 | goto out; |
| 466 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) | 471 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 467 | goto out_dst_release; | 472 | goto out; |
| 468 | 473 | ||
| 469 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) | 474 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) |
| 470 | hlimit = np->mcast_hops; | 475 | hlimit = np->mcast_hops; |
| @@ -475,13 +480,17 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 475 | if (hlimit < 0) | 480 | if (hlimit < 0) |
| 476 | hlimit = ipv6_get_hoplimit(dst->dev); | 481 | hlimit = ipv6_get_hoplimit(dst->dev); |
| 477 | 482 | ||
| 483 | tclass = np->cork.tclass; | ||
| 484 | if (tclass < 0) | ||
| 485 | tclass = 0; | ||
| 486 | |||
| 478 | idev = in6_dev_get(skb->dev); | 487 | idev = in6_dev_get(skb->dev); |
| 479 | 488 | ||
| 480 | msg.skb = skb; | 489 | msg.skb = skb; |
| 481 | msg.offset = 0; | 490 | msg.offset = 0; |
| 482 | 491 | ||
| 483 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), | 492 | err = ip6_append_data(sk, icmpv6_getfrag, &msg, skb->len + sizeof(struct icmp6hdr), |
| 484 | sizeof(struct icmp6hdr), hlimit, NULL, &fl, | 493 | sizeof(struct icmp6hdr), hlimit, tclass, NULL, &fl, |
| 485 | (struct rt6_info*)dst, MSG_DONTWAIT); | 494 | (struct rt6_info*)dst, MSG_DONTWAIT); |
| 486 | 495 | ||
| 487 | if (err) { | 496 | if (err) { |
| @@ -496,7 +505,6 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
| 496 | out_put: | 505 | out_put: |
| 497 | if (likely(idev != NULL)) | 506 | if (likely(idev != NULL)) |
| 498 | in6_dev_put(idev); | 507 | in6_dev_put(idev); |
| 499 | out_dst_release: | ||
| 500 | dst_release(dst); | 508 | dst_release(dst); |
| 501 | out: | 509 | out: |
| 502 | icmpv6_xmit_unlock(); | 510 | icmpv6_xmit_unlock(); |
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index b6c73da5ff35..a7db762de14a 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
| @@ -225,16 +225,20 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space, | |||
| 225 | struct ip6_flowlabel * fl, | 225 | struct ip6_flowlabel * fl, |
| 226 | struct ipv6_txoptions * fopt) | 226 | struct ipv6_txoptions * fopt) |
| 227 | { | 227 | { |
| 228 | struct ipv6_txoptions * fl_opt = fl->opt; | 228 | struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL; |
| 229 | 229 | ||
| 230 | if (fopt == NULL || fopt->opt_flen == 0) | 230 | if (fopt == NULL || fopt->opt_flen == 0) { |
| 231 | return fl_opt; | 231 | if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt) |
| 232 | return fl_opt; | ||
| 233 | } | ||
| 232 | 234 | ||
| 233 | if (fl_opt != NULL) { | 235 | if (fl_opt != NULL) { |
| 234 | opt_space->hopopt = fl_opt->hopopt; | 236 | opt_space->hopopt = fl_opt->hopopt; |
| 235 | opt_space->dst0opt = fl_opt->dst0opt; | 237 | opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL; |
| 236 | opt_space->srcrt = fl_opt->srcrt; | 238 | opt_space->srcrt = fl_opt->srcrt; |
| 237 | opt_space->opt_nflen = fl_opt->opt_nflen; | 239 | opt_space->opt_nflen = fl_opt->opt_nflen; |
| 240 | if (fl_opt->dst0opt && !fl_opt->srcrt) | ||
| 241 | opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt); | ||
| 238 | } else { | 242 | } else { |
| 239 | if (fopt->opt_nflen == 0) | 243 | if (fopt->opt_nflen == 0) |
| 240 | return fopt; | 244 | return fopt; |
| @@ -310,7 +314,7 @@ fl_create(struct in6_flowlabel_req *freq, char __user *optval, int optlen, int * | |||
| 310 | msg.msg_control = (void*)(fl->opt+1); | 314 | msg.msg_control = (void*)(fl->opt+1); |
| 311 | flowi.oif = 0; | 315 | flowi.oif = 0; |
| 312 | 316 | ||
| 313 | err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk); | 317 | err = datagram_send_ctl(&msg, &flowi, fl->opt, &junk, &junk); |
| 314 | if (err) | 318 | if (err) |
| 315 | goto done; | 319 | goto done; |
| 316 | err = -EINVAL; | 320 | err = -EINVAL; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 01ef94f7c7f1..2f589f24c093 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -166,7 +166,7 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
| 166 | struct ipv6hdr *hdr; | 166 | struct ipv6hdr *hdr; |
| 167 | u8 proto = fl->proto; | 167 | u8 proto = fl->proto; |
| 168 | int seg_len = skb->len; | 168 | int seg_len = skb->len; |
| 169 | int hlimit; | 169 | int hlimit, tclass; |
| 170 | u32 mtu; | 170 | u32 mtu; |
| 171 | 171 | ||
| 172 | if (opt) { | 172 | if (opt) { |
| @@ -202,7 +202,6 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
| 202 | * Fill in the IPv6 header | 202 | * Fill in the IPv6 header |
| 203 | */ | 203 | */ |
| 204 | 204 | ||
| 205 | *(u32*)hdr = htonl(0x60000000) | fl->fl6_flowlabel; | ||
| 206 | hlimit = -1; | 205 | hlimit = -1; |
| 207 | if (np) | 206 | if (np) |
| 208 | hlimit = np->hop_limit; | 207 | hlimit = np->hop_limit; |
| @@ -211,6 +210,14 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl, | |||
| 211 | if (hlimit < 0) | 210 | if (hlimit < 0) |
| 212 | hlimit = ipv6_get_hoplimit(dst->dev); | 211 | hlimit = ipv6_get_hoplimit(dst->dev); |
| 213 | 212 | ||
| 213 | tclass = -1; | ||
| 214 | if (np) | ||
| 215 | tclass = np->tclass; | ||
| 216 | if (tclass < 0) | ||
| 217 | tclass = 0; | ||
| 218 | |||
| 219 | *(u32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl->fl6_flowlabel; | ||
| 220 | |||
| 214 | hdr->payload_len = htons(seg_len); | 221 | hdr->payload_len = htons(seg_len); |
| 215 | hdr->nexthdr = proto; | 222 | hdr->nexthdr = proto; |
| 216 | hdr->hop_limit = hlimit; | 223 | hdr->hop_limit = hlimit; |
| @@ -762,10 +769,11 @@ out_err_release: | |||
| 762 | return err; | 769 | return err; |
| 763 | } | 770 | } |
| 764 | 771 | ||
| 765 | int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offset, int len, int odd, struct sk_buff *skb), | 772 | int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, |
| 766 | void *from, int length, int transhdrlen, | 773 | int offset, int len, int odd, struct sk_buff *skb), |
| 767 | int hlimit, struct ipv6_txoptions *opt, struct flowi *fl, struct rt6_info *rt, | 774 | void *from, int length, int transhdrlen, |
| 768 | unsigned int flags) | 775 | int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi *fl, |
| 776 | struct rt6_info *rt, unsigned int flags) | ||
| 769 | { | 777 | { |
| 770 | struct inet_sock *inet = inet_sk(sk); | 778 | struct inet_sock *inet = inet_sk(sk); |
| 771 | struct ipv6_pinfo *np = inet6_sk(sk); | 779 | struct ipv6_pinfo *np = inet6_sk(sk); |
| @@ -803,6 +811,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to, int offse | |||
| 803 | np->cork.rt = rt; | 811 | np->cork.rt = rt; |
| 804 | inet->cork.fl = *fl; | 812 | inet->cork.fl = *fl; |
| 805 | np->cork.hop_limit = hlimit; | 813 | np->cork.hop_limit = hlimit; |
| 814 | np->cork.tclass = tclass; | ||
| 806 | inet->cork.fragsize = mtu = dst_mtu(rt->u.dst.path); | 815 | inet->cork.fragsize = mtu = dst_mtu(rt->u.dst.path); |
| 807 | if (dst_allfrag(rt->u.dst.path)) | 816 | if (dst_allfrag(rt->u.dst.path)) |
| 808 | inet->cork.flags |= IPCORK_ALLFRAG; | 817 | inet->cork.flags |= IPCORK_ALLFRAG; |
| @@ -1084,7 +1093,8 @@ int ip6_push_pending_frames(struct sock *sk) | |||
| 1084 | 1093 | ||
| 1085 | skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr)); | 1094 | skb->nh.ipv6h = hdr = (struct ipv6hdr*) skb_push(skb, sizeof(struct ipv6hdr)); |
| 1086 | 1095 | ||
| 1087 | *(u32*)hdr = fl->fl6_flowlabel | htonl(0x60000000); | 1096 | *(u32*)hdr = fl->fl6_flowlabel | |
| 1097 | htonl(0x60000000 | ((int)np->cork.tclass << 20)); | ||
| 1088 | 1098 | ||
| 1089 | if (skb->len <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) | 1099 | if (skb->len <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) |
| 1090 | hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); | 1100 | hdr->payload_len = htons(skb->len - sizeof(struct ipv6hdr)); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 09613729404c..cf94372d1af3 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -673,11 +673,12 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 673 | 673 | ||
| 674 | if ((dst = ip6_tnl_dst_check(t)) != NULL) | 674 | if ((dst = ip6_tnl_dst_check(t)) != NULL) |
| 675 | dst_hold(dst); | 675 | dst_hold(dst); |
| 676 | else | 676 | else { |
| 677 | dst = ip6_route_output(NULL, &fl); | 677 | dst = ip6_route_output(NULL, &fl); |
| 678 | 678 | ||
| 679 | if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0) < 0) | 679 | if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0) < 0) |
| 680 | goto tx_err_link_failure; | 680 | goto tx_err_link_failure; |
| 681 | } | ||
| 681 | 682 | ||
| 682 | tdev = dst->dev; | 683 | tdev = dst->dev; |
| 683 | 684 | ||
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 76466af8331e..8567873d0dd8 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
| @@ -210,39 +210,139 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
| 210 | retv = 0; | 210 | retv = 0; |
| 211 | break; | 211 | break; |
| 212 | 212 | ||
| 213 | case IPV6_PKTINFO: | 213 | case IPV6_RECVPKTINFO: |
| 214 | np->rxopt.bits.rxinfo = valbool; | 214 | np->rxopt.bits.rxinfo = valbool; |
| 215 | retv = 0; | 215 | retv = 0; |
| 216 | break; | 216 | break; |
| 217 | |||
| 218 | case IPV6_2292PKTINFO: | ||
| 219 | np->rxopt.bits.rxoinfo = valbool; | ||
| 220 | retv = 0; | ||
| 221 | break; | ||
| 217 | 222 | ||
| 218 | case IPV6_HOPLIMIT: | 223 | case IPV6_RECVHOPLIMIT: |
| 219 | np->rxopt.bits.rxhlim = valbool; | 224 | np->rxopt.bits.rxhlim = valbool; |
| 220 | retv = 0; | 225 | retv = 0; |
| 221 | break; | 226 | break; |
| 222 | 227 | ||
| 223 | case IPV6_RTHDR: | 228 | case IPV6_2292HOPLIMIT: |
| 229 | np->rxopt.bits.rxohlim = valbool; | ||
| 230 | retv = 0; | ||
| 231 | break; | ||
| 232 | |||
| 233 | case IPV6_RECVRTHDR: | ||
| 224 | if (val < 0 || val > 2) | 234 | if (val < 0 || val > 2) |
| 225 | goto e_inval; | 235 | goto e_inval; |
| 226 | np->rxopt.bits.srcrt = val; | 236 | np->rxopt.bits.srcrt = val; |
| 227 | retv = 0; | 237 | retv = 0; |
| 228 | break; | 238 | break; |
| 229 | 239 | ||
| 230 | case IPV6_HOPOPTS: | 240 | case IPV6_2292RTHDR: |
| 241 | if (val < 0 || val > 2) | ||
| 242 | goto e_inval; | ||
| 243 | np->rxopt.bits.osrcrt = val; | ||
| 244 | retv = 0; | ||
| 245 | break; | ||
| 246 | |||
| 247 | case IPV6_RECVHOPOPTS: | ||
| 231 | np->rxopt.bits.hopopts = valbool; | 248 | np->rxopt.bits.hopopts = valbool; |
| 232 | retv = 0; | 249 | retv = 0; |
| 233 | break; | 250 | break; |
| 234 | 251 | ||
| 235 | case IPV6_DSTOPTS: | 252 | case IPV6_2292HOPOPTS: |
| 253 | np->rxopt.bits.ohopopts = valbool; | ||
| 254 | retv = 0; | ||
| 255 | break; | ||
| 256 | |||
| 257 | case IPV6_RECVDSTOPTS: | ||
| 236 | np->rxopt.bits.dstopts = valbool; | 258 | np->rxopt.bits.dstopts = valbool; |
| 237 | retv = 0; | 259 | retv = 0; |
| 238 | break; | 260 | break; |
| 239 | 261 | ||
| 262 | case IPV6_2292DSTOPTS: | ||
| 263 | np->rxopt.bits.odstopts = valbool; | ||
| 264 | retv = 0; | ||
| 265 | break; | ||
| 266 | |||
| 267 | case IPV6_TCLASS: | ||
| 268 | if (val < 0 || val > 0xff) | ||
| 269 | goto e_inval; | ||
| 270 | np->tclass = val; | ||
| 271 | retv = 0; | ||
| 272 | break; | ||
| 273 | |||
| 274 | case IPV6_RECVTCLASS: | ||
| 275 | np->rxopt.bits.rxtclass = valbool; | ||
| 276 | retv = 0; | ||
| 277 | break; | ||
| 278 | |||
| 240 | case IPV6_FLOWINFO: | 279 | case IPV6_FLOWINFO: |
| 241 | np->rxopt.bits.rxflow = valbool; | 280 | np->rxopt.bits.rxflow = valbool; |
| 242 | retv = 0; | 281 | retv = 0; |
| 243 | break; | 282 | break; |
| 244 | 283 | ||
| 245 | case IPV6_PKTOPTIONS: | 284 | case IPV6_HOPOPTS: |
| 285 | case IPV6_RTHDRDSTOPTS: | ||
| 286 | case IPV6_RTHDR: | ||
| 287 | case IPV6_DSTOPTS: | ||
| 288 | { | ||
| 289 | struct ipv6_txoptions *opt; | ||
| 290 | if (optlen == 0) | ||
| 291 | optval = 0; | ||
| 292 | |||
| 293 | /* hop-by-hop / destination options are privileged option */ | ||
| 294 | retv = -EPERM; | ||
| 295 | if (optname != IPV6_RTHDR && !capable(CAP_NET_RAW)) | ||
| 296 | break; | ||
| 297 | |||
| 298 | retv = -EINVAL; | ||
| 299 | if (optlen & 0x7 || optlen > 8 * 255) | ||
| 300 | break; | ||
| 301 | |||
| 302 | opt = ipv6_renew_options(sk, np->opt, optname, | ||
| 303 | (struct ipv6_opt_hdr __user *)optval, | ||
| 304 | optlen); | ||
| 305 | if (IS_ERR(opt)) { | ||
| 306 | retv = PTR_ERR(opt); | ||
| 307 | break; | ||
| 308 | } | ||
| 309 | |||
| 310 | /* routing header option needs extra check */ | ||
| 311 | if (optname == IPV6_RTHDR && opt->srcrt) { | ||
| 312 | struct ipv6_rt_hdr *rthdr = opt->srcrt; | ||
| 313 | if (rthdr->type) | ||
| 314 | goto sticky_done; | ||
| 315 | if ((rthdr->hdrlen & 1) || | ||
| 316 | (rthdr->hdrlen >> 1) != rthdr->segments_left) | ||
| 317 | goto sticky_done; | ||
| 318 | } | ||
| 319 | |||
| 320 | retv = 0; | ||
| 321 | if (sk->sk_type == SOCK_STREAM) { | ||
| 322 | if (opt) { | ||
| 323 | struct tcp_sock *tp = tcp_sk(sk); | ||
| 324 | if (!((1 << sk->sk_state) & | ||
| 325 | (TCPF_LISTEN | TCPF_CLOSE)) | ||
| 326 | && inet_sk(sk)->daddr != LOOPBACK4_IPV6) { | ||
| 327 | tp->ext_header_len = opt->opt_flen + opt->opt_nflen; | ||
| 328 | tcp_sync_mss(sk, tp->pmtu_cookie); | ||
| 329 | } | ||
| 330 | } | ||
| 331 | opt = xchg(&np->opt, opt); | ||
| 332 | sk_dst_reset(sk); | ||
| 333 | } else { | ||
| 334 | write_lock(&sk->sk_dst_lock); | ||
| 335 | opt = xchg(&np->opt, opt); | ||
| 336 | write_unlock(&sk->sk_dst_lock); | ||
| 337 | sk_dst_reset(sk); | ||
| 338 | } | ||
| 339 | sticky_done: | ||
| 340 | if (opt) | ||
| 341 | sock_kfree_s(sk, opt, opt->tot_len); | ||
| 342 | break; | ||
| 343 | } | ||
| 344 | |||
| 345 | case IPV6_2292PKTOPTIONS: | ||
| 246 | { | 346 | { |
| 247 | struct ipv6_txoptions *opt = NULL; | 347 | struct ipv6_txoptions *opt = NULL; |
| 248 | struct msghdr msg; | 348 | struct msghdr msg; |
| @@ -276,7 +376,7 @@ int ipv6_setsockopt(struct sock *sk, int level, int optname, | |||
| 276 | msg.msg_controllen = optlen; | 376 | msg.msg_controllen = optlen; |
| 277 | msg.msg_control = (void*)(opt+1); | 377 | msg.msg_control = (void*)(opt+1); |
| 278 | 378 | ||
| 279 | retv = datagram_send_ctl(&msg, &fl, opt, &junk); | 379 | retv = datagram_send_ctl(&msg, &fl, opt, &junk, &junk); |
| 280 | if (retv) | 380 | if (retv) |
| 281 | goto done; | 381 | goto done; |
| 282 | update: | 382 | update: |
| @@ -529,6 +629,17 @@ e_inval: | |||
| 529 | return -EINVAL; | 629 | return -EINVAL; |
| 530 | } | 630 | } |
| 531 | 631 | ||
| 632 | int ipv6_getsockopt_sticky(struct sock *sk, struct ipv6_opt_hdr *hdr, | ||
| 633 | char __user *optval, int len) | ||
| 634 | { | ||
| 635 | if (!hdr) | ||
| 636 | return 0; | ||
| 637 | len = min_t(int, len, ipv6_optlen(hdr)); | ||
| 638 | if (copy_to_user(optval, hdr, ipv6_optlen(hdr))) | ||
| 639 | return -EFAULT; | ||
| 640 | return len; | ||
| 641 | } | ||
| 642 | |||
| 532 | int ipv6_getsockopt(struct sock *sk, int level, int optname, | 643 | int ipv6_getsockopt(struct sock *sk, int level, int optname, |
| 533 | char __user *optval, int __user *optlen) | 644 | char __user *optval, int __user *optlen) |
| 534 | { | 645 | { |
| @@ -567,7 +678,7 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
| 567 | return err; | 678 | return err; |
| 568 | } | 679 | } |
| 569 | 680 | ||
| 570 | case IPV6_PKTOPTIONS: | 681 | case IPV6_2292PKTOPTIONS: |
| 571 | { | 682 | { |
| 572 | struct msghdr msg; | 683 | struct msghdr msg; |
| 573 | struct sk_buff *skb; | 684 | struct sk_buff *skb; |
| @@ -601,6 +712,16 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
| 601 | int hlim = np->mcast_hops; | 712 | int hlim = np->mcast_hops; |
| 602 | put_cmsg(&msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); | 713 | put_cmsg(&msg, SOL_IPV6, IPV6_HOPLIMIT, sizeof(hlim), &hlim); |
| 603 | } | 714 | } |
| 715 | if (np->rxopt.bits.rxoinfo) { | ||
| 716 | struct in6_pktinfo src_info; | ||
| 717 | src_info.ipi6_ifindex = np->mcast_oif; | ||
| 718 | ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr); | ||
| 719 | put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); | ||
| 720 | } | ||
| 721 | if (np->rxopt.bits.rxohlim) { | ||
| 722 | int hlim = np->mcast_hops; | ||
| 723 | put_cmsg(&msg, SOL_IPV6, IPV6_2292HOPLIMIT, sizeof(hlim), &hlim); | ||
| 724 | } | ||
| 604 | } | 725 | } |
| 605 | len -= msg.msg_controllen; | 726 | len -= msg.msg_controllen; |
| 606 | return put_user(len, optlen); | 727 | return put_user(len, optlen); |
| @@ -625,26 +746,67 @@ int ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
| 625 | val = np->ipv6only; | 746 | val = np->ipv6only; |
| 626 | break; | 747 | break; |
| 627 | 748 | ||
| 628 | case IPV6_PKTINFO: | 749 | case IPV6_RECVPKTINFO: |
| 629 | val = np->rxopt.bits.rxinfo; | 750 | val = np->rxopt.bits.rxinfo; |
| 630 | break; | 751 | break; |
| 631 | 752 | ||
| 632 | case IPV6_HOPLIMIT: | 753 | case IPV6_2292PKTINFO: |
| 754 | val = np->rxopt.bits.rxoinfo; | ||
| 755 | break; | ||
| 756 | |||
| 757 | case IPV6_RECVHOPLIMIT: | ||
| 633 | val = np->rxopt.bits.rxhlim; | 758 | val = np->rxopt.bits.rxhlim; |
| 634 | break; | 759 | break; |
| 635 | 760 | ||
| 636 | case IPV6_RTHDR: | 761 | case IPV6_2292HOPLIMIT: |
| 762 | val = np->rxopt.bits.rxohlim; | ||
| 763 | break; | ||
| 764 | |||
| 765 | case IPV6_RECVRTHDR: | ||
| 637 | val = np->rxopt.bits.srcrt; | 766 | val = np->rxopt.bits.srcrt; |
| 638 | break; | 767 | break; |
| 639 | 768 | ||
| 769 | case IPV6_2292RTHDR: | ||
| 770 | val = np->rxopt.bits.osrcrt; | ||
| 771 | break; | ||
| 772 | |||
| 640 | case IPV6_HOPOPTS: | 773 | case IPV6_HOPOPTS: |
| 774 | case IPV6_RTHDRDSTOPTS: | ||
| 775 | case IPV6_RTHDR: | ||
| 776 | case IPV6_DSTOPTS: | ||
| 777 | { | ||
| 778 | |||
| 779 | lock_sock(sk); | ||
| 780 | len = ipv6_getsockopt_sticky(sk, np->opt->hopopt, | ||
| 781 | optval, len); | ||
| 782 | release_sock(sk); | ||
| 783 | return put_user(len, optlen); | ||
| 784 | } | ||
| 785 | |||
| 786 | case IPV6_RECVHOPOPTS: | ||
| 641 | val = np->rxopt.bits.hopopts; | 787 | val = np->rxopt.bits.hopopts; |
| 642 | break; | 788 | break; |
| 643 | 789 | ||
| 644 | case IPV6_DSTOPTS: | 790 | case IPV6_2292HOPOPTS: |
| 791 | val = np->rxopt.bits.ohopopts; | ||
| 792 | break; | ||
| 793 | |||
| 794 | case IPV6_RECVDSTOPTS: | ||
| 645 | val = np->rxopt.bits.dstopts; | 795 | val = np->rxopt.bits.dstopts; |
| 646 | break; | 796 | break; |
| 647 | 797 | ||
| 798 | case IPV6_2292DSTOPTS: | ||
| 799 | val = np->rxopt.bits.odstopts; | ||
| 800 | break; | ||
| 801 | |||
| 802 | case IPV6_TCLASS: | ||
| 803 | val = np->tclass; | ||
| 804 | break; | ||
| 805 | |||
| 806 | case IPV6_RECVTCLASS: | ||
| 807 | val = np->rxopt.bits.rxtclass; | ||
| 808 | break; | ||
| 809 | |||
| 648 | case IPV6_FLOWINFO: | 810 | case IPV6_FLOWINFO: |
| 649 | val = np->rxopt.bits.rxflow; | 811 | val = np->rxopt.bits.rxflow; |
| 650 | break; | 812 | break; |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index a7eae30f4554..555a31347eda 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -447,10 +447,8 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
| 447 | return; | 447 | return; |
| 448 | 448 | ||
| 449 | err = xfrm_lookup(&dst, &fl, NULL, 0); | 449 | err = xfrm_lookup(&dst, &fl, NULL, 0); |
| 450 | if (err < 0) { | 450 | if (err < 0) |
| 451 | dst_release(dst); | ||
| 452 | return; | 451 | return; |
| 453 | } | ||
| 454 | 452 | ||
| 455 | if (inc_opt) { | 453 | if (inc_opt) { |
| 456 | if (dev->addr_len) | 454 | if (dev->addr_len) |
| @@ -539,10 +537,8 @@ void ndisc_send_ns(struct net_device *dev, struct neighbour *neigh, | |||
| 539 | return; | 537 | return; |
| 540 | 538 | ||
| 541 | err = xfrm_lookup(&dst, &fl, NULL, 0); | 539 | err = xfrm_lookup(&dst, &fl, NULL, 0); |
| 542 | if (err < 0) { | 540 | if (err < 0) |
| 543 | dst_release(dst); | ||
| 544 | return; | 541 | return; |
| 545 | } | ||
| 546 | 542 | ||
| 547 | len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); | 543 | len = sizeof(struct icmp6hdr) + sizeof(struct in6_addr); |
| 548 | send_llinfo = dev->addr_len && !ipv6_addr_any(saddr); | 544 | send_llinfo = dev->addr_len && !ipv6_addr_any(saddr); |
| @@ -616,10 +612,8 @@ void ndisc_send_rs(struct net_device *dev, struct in6_addr *saddr, | |||
| 616 | return; | 612 | return; |
| 617 | 613 | ||
| 618 | err = xfrm_lookup(&dst, &fl, NULL, 0); | 614 | err = xfrm_lookup(&dst, &fl, NULL, 0); |
| 619 | if (err < 0) { | 615 | if (err < 0) |
| 620 | dst_release(dst); | ||
| 621 | return; | 616 | return; |
| 622 | } | ||
| 623 | 617 | ||
| 624 | len = sizeof(struct icmp6hdr); | 618 | len = sizeof(struct icmp6hdr); |
| 625 | if (dev->addr_len) | 619 | if (dev->addr_len) |
| @@ -1353,10 +1347,8 @@ void ndisc_send_redirect(struct sk_buff *skb, struct neighbour *neigh, | |||
| 1353 | return; | 1347 | return; |
| 1354 | 1348 | ||
| 1355 | err = xfrm_lookup(&dst, &fl, NULL, 0); | 1349 | err = xfrm_lookup(&dst, &fl, NULL, 0); |
| 1356 | if (err) { | 1350 | if (err) |
| 1357 | dst_release(dst); | ||
| 1358 | return; | 1351 | return; |
| 1359 | } | ||
| 1360 | 1352 | ||
| 1361 | rt = (struct rt6_info *) dst; | 1353 | rt = (struct rt6_info *) dst; |
| 1362 | 1354 | ||
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index 14316c3ebde4..b03e87adca93 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c | |||
| @@ -100,11 +100,8 @@ static void send_reset(struct sk_buff *oldskb) | |||
| 100 | dst = ip6_route_output(NULL, &fl); | 100 | dst = ip6_route_output(NULL, &fl); |
| 101 | if (dst == NULL) | 101 | if (dst == NULL) |
| 102 | return; | 102 | return; |
| 103 | if (dst->error || | 103 | if (dst->error || xfrm_lookup(&dst, &fl, NULL, 0)) |
| 104 | xfrm_lookup(&dst, &fl, NULL, 0)) { | ||
| 105 | dst_release(dst); | ||
| 106 | return; | 104 | return; |
| 107 | } | ||
| 108 | 105 | ||
| 109 | hh_len = (dst->dev->hard_header_len + 15)&~15; | 106 | hh_len = (dst->dev->hard_header_len + 15)&~15; |
| 110 | nskb = alloc_skb(hh_len + 15 + dst->header_len + sizeof(struct ipv6hdr) | 107 | nskb = alloc_skb(hh_len + 15 + dst->header_len + sizeof(struct ipv6hdr) |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index ed3a76b30fd9..5aa3691c578d 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
| @@ -655,6 +655,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 655 | struct flowi fl; | 655 | struct flowi fl; |
| 656 | int addr_len = msg->msg_namelen; | 656 | int addr_len = msg->msg_namelen; |
| 657 | int hlimit = -1; | 657 | int hlimit = -1; |
| 658 | int tclass = -1; | ||
| 658 | u16 proto; | 659 | u16 proto; |
| 659 | int err; | 660 | int err; |
| 660 | 661 | ||
| @@ -740,7 +741,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 740 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 741 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
| 741 | opt->tot_len = sizeof(struct ipv6_txoptions); | 742 | opt->tot_len = sizeof(struct ipv6_txoptions); |
| 742 | 743 | ||
| 743 | err = datagram_send_ctl(msg, &fl, opt, &hlimit); | 744 | err = datagram_send_ctl(msg, &fl, opt, &hlimit, &tclass); |
| 744 | if (err < 0) { | 745 | if (err < 0) { |
| 745 | fl6_sock_release(flowlabel); | 746 | fl6_sock_release(flowlabel); |
| 746 | return err; | 747 | return err; |
| @@ -755,8 +756,7 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 755 | } | 756 | } |
| 756 | if (opt == NULL) | 757 | if (opt == NULL) |
| 757 | opt = np->opt; | 758 | opt = np->opt; |
| 758 | if (flowlabel) | 759 | opt = fl6_merge_options(&opt_space, flowlabel, opt); |
| 759 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
| 760 | 760 | ||
| 761 | fl.proto = proto; | 761 | fl.proto = proto; |
| 762 | rawv6_probe_proto_opt(&fl, msg); | 762 | rawv6_probe_proto_opt(&fl, msg); |
| @@ -782,10 +782,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 782 | if (final_p) | 782 | if (final_p) |
| 783 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 783 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
| 784 | 784 | ||
| 785 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 785 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 786 | dst_release(dst); | ||
| 787 | goto out; | 786 | goto out; |
| 788 | } | ||
| 789 | 787 | ||
| 790 | if (hlimit < 0) { | 788 | if (hlimit < 0) { |
| 791 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) | 789 | if (ipv6_addr_is_multicast(&fl.fl6_dst)) |
| @@ -798,6 +796,12 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 798 | hlimit = ipv6_get_hoplimit(dst->dev); | 796 | hlimit = ipv6_get_hoplimit(dst->dev); |
| 799 | } | 797 | } |
| 800 | 798 | ||
| 799 | if (tclass < 0) { | ||
| 800 | tclass = np->cork.tclass; | ||
| 801 | if (tclass < 0) | ||
| 802 | tclass = 0; | ||
| 803 | } | ||
| 804 | |||
| 801 | if (msg->msg_flags&MSG_CONFIRM) | 805 | if (msg->msg_flags&MSG_CONFIRM) |
| 802 | goto do_confirm; | 806 | goto do_confirm; |
| 803 | 807 | ||
| @@ -806,8 +810,9 @@ back_from_confirm: | |||
| 806 | err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags); | 810 | err = rawv6_send_hdrinc(sk, msg->msg_iov, len, &fl, (struct rt6_info*)dst, msg->msg_flags); |
| 807 | } else { | 811 | } else { |
| 808 | lock_sock(sk); | 812 | lock_sock(sk); |
| 809 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, len, 0, | 813 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, |
| 810 | hlimit, opt, &fl, (struct rt6_info*)dst, msg->msg_flags); | 814 | len, 0, hlimit, tclass, opt, &fl, (struct rt6_info*)dst, |
| 815 | msg->msg_flags); | ||
| 811 | 816 | ||
| 812 | if (err) | 817 | if (err) |
| 813 | ip6_flush_pending_frames(sk); | 818 | ip6_flush_pending_frames(sk); |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index 9d9e04344c77..e4fe9ee484dd 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -479,12 +479,9 @@ static void ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, | |||
| 479 | /* Point into the IP datagram 'data' part. */ | 479 | /* Point into the IP datagram 'data' part. */ |
| 480 | if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) | 480 | if (!pskb_pull(skb, (u8 *) (fhdr + 1) - skb->data)) |
| 481 | goto err; | 481 | goto err; |
| 482 | if (end-offset < skb->len) { | 482 | |
| 483 | if (pskb_trim(skb, end - offset)) | 483 | if (pskb_trim_rcsum(skb, end - offset)) |
| 484 | goto err; | 484 | goto err; |
| 485 | if (skb->ip_summed != CHECKSUM_UNNECESSARY) | ||
| 486 | skb->ip_summed = CHECKSUM_NONE; | ||
| 487 | } | ||
| 488 | 485 | ||
| 489 | /* Find out which fragments are in front and at the back of us | 486 | /* Find out which fragments are in front and at the back of us |
| 490 | * in the chain of fragments so far. We must know where to put | 487 | * in the chain of fragments so far. We must know where to put |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 794734f1d230..80643e6b346b 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -632,10 +632,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, | |||
| 632 | if (final_p) | 632 | if (final_p) |
| 633 | ipv6_addr_copy(&fl.fl6_dst, final_p); | 633 | ipv6_addr_copy(&fl.fl6_dst, final_p); |
| 634 | 634 | ||
| 635 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 635 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) |
| 636 | dst_release(dst); | ||
| 637 | goto failure; | 636 | goto failure; |
| 638 | } | ||
| 639 | 637 | ||
| 640 | if (saddr == NULL) { | 638 | if (saddr == NULL) { |
| 641 | saddr = &fl.fl6_src; | 639 | saddr = &fl.fl6_src; |
| @@ -849,7 +847,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
| 849 | if (dst == NULL) { | 847 | if (dst == NULL) { |
| 850 | opt = np->opt; | 848 | opt = np->opt; |
| 851 | if (opt == NULL && | 849 | if (opt == NULL && |
| 852 | np->rxopt.bits.srcrt == 2 && | 850 | np->rxopt.bits.osrcrt == 2 && |
| 853 | treq->pktopts) { | 851 | treq->pktopts) { |
| 854 | struct sk_buff *pktopts = treq->pktopts; | 852 | struct sk_buff *pktopts = treq->pktopts; |
| 855 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); | 853 | struct inet6_skb_parm *rxopt = IP6CB(pktopts); |
| @@ -888,7 +886,6 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
| 888 | } | 886 | } |
| 889 | 887 | ||
| 890 | done: | 888 | done: |
| 891 | dst_release(dst); | ||
| 892 | if (opt && opt != np->opt) | 889 | if (opt && opt != np->opt) |
| 893 | sock_kfree_s(sk, opt, opt->tot_len); | 890 | sock_kfree_s(sk, opt, opt->tot_len); |
| 894 | return err; | 891 | return err; |
| @@ -915,11 +912,10 @@ static int ipv6_opt_accepted(struct sock *sk, struct sk_buff *skb) | |||
| 915 | struct inet6_skb_parm *opt = IP6CB(skb); | 912 | struct inet6_skb_parm *opt = IP6CB(skb); |
| 916 | 913 | ||
| 917 | if (np->rxopt.all) { | 914 | if (np->rxopt.all) { |
| 918 | if ((opt->hop && np->rxopt.bits.hopopts) || | 915 | if ((opt->hop && (np->rxopt.bits.hopopts || np->rxopt.bits.ohopopts)) || |
| 919 | ((IPV6_FLOWINFO_MASK&*(u32*)skb->nh.raw) && | 916 | ((IPV6_FLOWINFO_MASK & *(u32*)skb->nh.raw) && np->rxopt.bits.rxflow) || |
| 920 | np->rxopt.bits.rxflow) || | 917 | (opt->srcrt && (np->rxopt.bits.srcrt || np->rxopt.bits.osrcrt)) || |
| 921 | (opt->srcrt && np->rxopt.bits.srcrt) || | 918 | ((opt->dst1 || opt->dst0) && (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts))) |
| 922 | ((opt->dst1 || opt->dst0) && np->rxopt.bits.dstopts)) | ||
| 923 | return 1; | 919 | return 1; |
| 924 | } | 920 | } |
| 925 | return 0; | 921 | return 0; |
| @@ -1001,10 +997,8 @@ static void tcp_v6_send_reset(struct sk_buff *skb) | |||
| 1001 | /* sk = NULL, but it is safe for now. RST socket required. */ | 997 | /* sk = NULL, but it is safe for now. RST socket required. */ |
| 1002 | if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { | 998 | if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { |
| 1003 | 999 | ||
| 1004 | if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { | 1000 | if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) |
| 1005 | dst_release(buff->dst); | ||
| 1006 | return; | 1001 | return; |
| 1007 | } | ||
| 1008 | 1002 | ||
| 1009 | ip6_xmit(NULL, buff, &fl, NULL, 0); | 1003 | ip6_xmit(NULL, buff, &fl, NULL, 0); |
| 1010 | TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); | 1004 | TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); |
| @@ -1068,10 +1062,8 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 | |||
| 1068 | fl.fl_ip_sport = t1->source; | 1062 | fl.fl_ip_sport = t1->source; |
| 1069 | 1063 | ||
| 1070 | if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { | 1064 | if (!ip6_dst_lookup(NULL, &buff->dst, &fl)) { |
| 1071 | if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) { | 1065 | if ((xfrm_lookup(&buff->dst, &fl, NULL, 0)) < 0) |
| 1072 | dst_release(buff->dst); | ||
| 1073 | return; | 1066 | return; |
| 1074 | } | ||
| 1075 | ip6_xmit(NULL, buff, &fl, NULL, 0); | 1067 | ip6_xmit(NULL, buff, &fl, NULL, 0); |
| 1076 | TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); | 1068 | TCP_INC_STATS_BH(TCP_MIB_OUTSEGS); |
| 1077 | return; | 1069 | return; |
| @@ -1190,8 +1182,8 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | |||
| 1190 | TCP_ECN_create_request(req, skb->h.th); | 1182 | TCP_ECN_create_request(req, skb->h.th); |
| 1191 | treq->pktopts = NULL; | 1183 | treq->pktopts = NULL; |
| 1192 | if (ipv6_opt_accepted(sk, skb) || | 1184 | if (ipv6_opt_accepted(sk, skb) || |
| 1193 | np->rxopt.bits.rxinfo || | 1185 | np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo || |
| 1194 | np->rxopt.bits.rxhlim) { | 1186 | np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) { |
| 1195 | atomic_inc(&skb->users); | 1187 | atomic_inc(&skb->users); |
| 1196 | treq->pktopts = skb; | 1188 | treq->pktopts = skb; |
| 1197 | } | 1189 | } |
| @@ -1288,7 +1280,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, | |||
| 1288 | if (sk_acceptq_is_full(sk)) | 1280 | if (sk_acceptq_is_full(sk)) |
| 1289 | goto out_overflow; | 1281 | goto out_overflow; |
| 1290 | 1282 | ||
| 1291 | if (np->rxopt.bits.srcrt == 2 && | 1283 | if (np->rxopt.bits.osrcrt == 2 && |
| 1292 | opt == NULL && treq->pktopts) { | 1284 | opt == NULL && treq->pktopts) { |
| 1293 | struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); | 1285 | struct inet6_skb_parm *rxopt = IP6CB(treq->pktopts); |
| 1294 | if (rxopt->srcrt) | 1286 | if (rxopt->srcrt) |
| @@ -1544,9 +1536,9 @@ ipv6_pktoptions: | |||
| 1544 | tp = tcp_sk(sk); | 1536 | tp = tcp_sk(sk); |
| 1545 | if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt && | 1537 | if (TCP_SKB_CB(opt_skb)->end_seq == tp->rcv_nxt && |
| 1546 | !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) { | 1538 | !((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN))) { |
| 1547 | if (np->rxopt.bits.rxinfo) | 1539 | if (np->rxopt.bits.rxinfo || np->rxopt.bits.rxoinfo) |
| 1548 | np->mcast_oif = inet6_iif(opt_skb); | 1540 | np->mcast_oif = inet6_iif(opt_skb); |
| 1549 | if (np->rxopt.bits.rxhlim) | 1541 | if (np->rxopt.bits.rxhlim || np->rxopt.bits.rxohlim) |
| 1550 | np->mcast_hops = opt_skb->nh.ipv6h->hop_limit; | 1542 | np->mcast_hops = opt_skb->nh.ipv6h->hop_limit; |
| 1551 | if (ipv6_opt_accepted(sk, opt_skb)) { | 1543 | if (ipv6_opt_accepted(sk, opt_skb)) { |
| 1552 | skb_set_owner_r(opt_skb, sk); | 1544 | skb_set_owner_r(opt_skb, sk); |
| @@ -1734,7 +1726,6 @@ static int tcp_v6_rebuild_header(struct sock *sk) | |||
| 1734 | 1726 | ||
| 1735 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 1727 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { |
| 1736 | sk->sk_err_soft = -err; | 1728 | sk->sk_err_soft = -err; |
| 1737 | dst_release(dst); | ||
| 1738 | return err; | 1729 | return err; |
| 1739 | } | 1730 | } |
| 1740 | 1731 | ||
| @@ -1787,7 +1778,6 @@ static int tcp_v6_xmit(struct sk_buff *skb, int ipfragok) | |||
| 1787 | 1778 | ||
| 1788 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { | 1779 | if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { |
| 1789 | sk->sk_route_caps = 0; | 1780 | sk->sk_route_caps = 0; |
| 1790 | dst_release(dst); | ||
| 1791 | return err; | 1781 | return err; |
| 1792 | } | 1782 | } |
| 1793 | 1783 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 390d750449ce..69b146843a20 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -483,7 +483,7 @@ static int udpv6_rcv(struct sk_buff **pskb, unsigned int *nhoffp) | |||
| 483 | } | 483 | } |
| 484 | 484 | ||
| 485 | if (ulen < skb->len) { | 485 | if (ulen < skb->len) { |
| 486 | if (__pskb_trim(skb, ulen)) | 486 | if (pskb_trim_rcsum(skb, ulen)) |
| 487 | goto discard; | 487 | goto discard; |
| 488 | saddr = &skb->nh.ipv6h->saddr; | 488 | saddr = &skb->nh.ipv6h->saddr; |
| 489 | daddr = &skb->nh.ipv6h->daddr; | 489 | daddr = &skb->nh.ipv6h->daddr; |
| @@ -637,6 +637,7 @@ static int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
| 637 | int addr_len = msg->msg_namelen; | 637 | int addr_len = msg->msg_namelen; |
| 638 | int ulen = len; | 638 | int ulen = len; |
| 639 | int hlimit = -1; | 639 | int hlimit = -1; |
| 640 | int tclass = -1; | ||
| 640 | int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; | 641 | int corkreq = up->corkflag || msg->msg_flags&MSG_MORE; |
| 641 | int err; | 642 | int err; |
| 642 | 643 | ||
| @@ -758,7 +759,7 @@ do_udp_sendmsg: | |||
| 758 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 759 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
| 759 | opt->tot_len = sizeof(*opt); | 760 | opt->tot_len = sizeof(*opt); |
| 760 | 761 | ||
| 761 | err = datagram_send_ctl(msg, fl, opt, &hlimit); | 762 | err = datagram_send_ctl(msg, fl, opt, &hlimit, &tclass); |
| 762 | if (err < 0) { | 763 | if (err < 0) { |
| 763 | fl6_sock_release(flowlabel); | 764 | fl6_sock_release(flowlabel); |
| 764 | return err; | 765 | return err; |
| @@ -773,8 +774,7 @@ do_udp_sendmsg: | |||
| 773 | } | 774 | } |
| 774 | if (opt == NULL) | 775 | if (opt == NULL) |
| 775 | opt = np->opt; | 776 | opt = np->opt; |
| 776 | if (flowlabel) | 777 | opt = fl6_merge_options(&opt_space, flowlabel, opt); |
| 777 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
| 778 | 778 | ||
| 779 | fl->proto = IPPROTO_UDP; | 779 | fl->proto = IPPROTO_UDP; |
| 780 | ipv6_addr_copy(&fl->fl6_dst, daddr); | 780 | ipv6_addr_copy(&fl->fl6_dst, daddr); |
| @@ -799,10 +799,8 @@ do_udp_sendmsg: | |||
| 799 | if (final_p) | 799 | if (final_p) |
| 800 | ipv6_addr_copy(&fl->fl6_dst, final_p); | 800 | ipv6_addr_copy(&fl->fl6_dst, final_p); |
| 801 | 801 | ||
| 802 | if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) { | 802 | if ((err = xfrm_lookup(&dst, fl, sk, 0)) < 0) |
| 803 | dst_release(dst); | ||
| 804 | goto out; | 803 | goto out; |
| 805 | } | ||
| 806 | 804 | ||
| 807 | if (hlimit < 0) { | 805 | if (hlimit < 0) { |
| 808 | if (ipv6_addr_is_multicast(&fl->fl6_dst)) | 806 | if (ipv6_addr_is_multicast(&fl->fl6_dst)) |
| @@ -815,6 +813,12 @@ do_udp_sendmsg: | |||
| 815 | hlimit = ipv6_get_hoplimit(dst->dev); | 813 | hlimit = ipv6_get_hoplimit(dst->dev); |
| 816 | } | 814 | } |
| 817 | 815 | ||
| 816 | if (tclass < 0) { | ||
| 817 | tclass = np->tclass; | ||
| 818 | if (tclass < 0) | ||
| 819 | tclass = 0; | ||
| 820 | } | ||
| 821 | |||
| 818 | if (msg->msg_flags&MSG_CONFIRM) | 822 | if (msg->msg_flags&MSG_CONFIRM) |
| 819 | goto do_confirm; | 823 | goto do_confirm; |
| 820 | back_from_confirm: | 824 | back_from_confirm: |
| @@ -834,9 +838,10 @@ back_from_confirm: | |||
| 834 | 838 | ||
| 835 | do_append_data: | 839 | do_append_data: |
| 836 | up->len += ulen; | 840 | up->len += ulen; |
| 837 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen, sizeof(struct udphdr), | 841 | err = ip6_append_data(sk, ip_generic_getfrag, msg->msg_iov, ulen, |
| 838 | hlimit, opt, fl, (struct rt6_info*)dst, | 842 | sizeof(struct udphdr), hlimit, tclass, opt, fl, |
| 839 | corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); | 843 | (struct rt6_info*)dst, |
| 844 | corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags); | ||
| 840 | if (err) | 845 | if (err) |
| 841 | udp_v6_flush_pending_frames(sk); | 846 | udp_v6_flush_pending_frames(sk); |
| 842 | else if (!corkreq) | 847 | else if (!corkreq) |
diff --git a/net/rose/rose_subr.c b/net/rose/rose_subr.c index 02891ce2db37..36a77944622b 100644 --- a/net/rose/rose_subr.c +++ b/net/rose/rose_subr.c | |||
| @@ -337,13 +337,13 @@ static int rose_parse_ccitt(unsigned char *p, struct rose_facilities_struct *fac | |||
| 337 | memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN); | 337 | memcpy(&facilities->source_addr, p + 7, ROSE_ADDR_LEN); |
| 338 | memcpy(callsign, p + 12, l - 10); | 338 | memcpy(callsign, p + 12, l - 10); |
| 339 | callsign[l - 10] = '\0'; | 339 | callsign[l - 10] = '\0'; |
| 340 | facilities->source_call = *asc2ax(callsign); | 340 | asc2ax(&facilities->source_call, callsign); |
| 341 | } | 341 | } |
| 342 | if (*p == FAC_CCITT_SRC_NSAP) { | 342 | if (*p == FAC_CCITT_SRC_NSAP) { |
| 343 | memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN); | 343 | memcpy(&facilities->dest_addr, p + 7, ROSE_ADDR_LEN); |
| 344 | memcpy(callsign, p + 12, l - 10); | 344 | memcpy(callsign, p + 12, l - 10); |
| 345 | callsign[l - 10] = '\0'; | 345 | callsign[l - 10] = '\0'; |
| 346 | facilities->dest_call = *asc2ax(callsign); | 346 | asc2ax(&facilities->dest_call, callsign); |
| 347 | } | 347 | } |
| 348 | p += l + 2; | 348 | p += l + 2; |
| 349 | n += l + 2; | 349 | n += l + 2; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 83c8135e1764..fda737d77edc 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -765,8 +765,8 @@ restart: | |||
| 765 | switch (policy->action) { | 765 | switch (policy->action) { |
| 766 | case XFRM_POLICY_BLOCK: | 766 | case XFRM_POLICY_BLOCK: |
| 767 | /* Prohibit the flow */ | 767 | /* Prohibit the flow */ |
| 768 | xfrm_pol_put(policy); | 768 | err = -EPERM; |
| 769 | return -EPERM; | 769 | goto error; |
| 770 | 770 | ||
| 771 | case XFRM_POLICY_ALLOW: | 771 | case XFRM_POLICY_ALLOW: |
| 772 | if (policy->xfrm_nr == 0) { | 772 | if (policy->xfrm_nr == 0) { |
| @@ -782,8 +782,8 @@ restart: | |||
| 782 | */ | 782 | */ |
| 783 | dst = xfrm_find_bundle(fl, policy, family); | 783 | dst = xfrm_find_bundle(fl, policy, family); |
| 784 | if (IS_ERR(dst)) { | 784 | if (IS_ERR(dst)) { |
| 785 | xfrm_pol_put(policy); | 785 | err = PTR_ERR(dst); |
| 786 | return PTR_ERR(dst); | 786 | goto error; |
| 787 | } | 787 | } |
| 788 | 788 | ||
| 789 | if (dst) | 789 | if (dst) |
diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c index 5aa5fe651a8a..bfbec5876659 100644 --- a/sound/usb/usbaudio.c +++ b/sound/usb/usbaudio.c | |||
| @@ -735,10 +735,9 @@ static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep) | |||
| 735 | if (test_bit(i, &subs->active_mask)) { | 735 | if (test_bit(i, &subs->active_mask)) { |
| 736 | if (! test_and_set_bit(i, &subs->unlink_mask)) { | 736 | if (! test_and_set_bit(i, &subs->unlink_mask)) { |
| 737 | struct urb *u = subs->dataurb[i].urb; | 737 | struct urb *u = subs->dataurb[i].urb; |
| 738 | if (async) { | 738 | if (async) |
| 739 | u->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 740 | usb_unlink_urb(u); | 739 | usb_unlink_urb(u); |
| 741 | } else | 740 | else |
| 742 | usb_kill_urb(u); | 741 | usb_kill_urb(u); |
| 743 | } | 742 | } |
| 744 | } | 743 | } |
| @@ -748,10 +747,9 @@ static int deactivate_urbs(snd_usb_substream_t *subs, int force, int can_sleep) | |||
| 748 | if (test_bit(i+16, &subs->active_mask)) { | 747 | if (test_bit(i+16, &subs->active_mask)) { |
| 749 | if (! test_and_set_bit(i+16, &subs->unlink_mask)) { | 748 | if (! test_and_set_bit(i+16, &subs->unlink_mask)) { |
| 750 | struct urb *u = subs->syncurb[i].urb; | 749 | struct urb *u = subs->syncurb[i].urb; |
| 751 | if (async) { | 750 | if (async) |
| 752 | u->transfer_flags |= URB_ASYNC_UNLINK; | ||
| 753 | usb_unlink_urb(u); | 751 | usb_unlink_urb(u); |
| 754 | } else | 752 | else |
| 755 | usb_kill_urb(u); | 753 | usb_kill_urb(u); |
| 756 | } | 754 | } |
| 757 | } | 755 | } |
