Commit 3dd5a454 authored by Anton Blanchard's avatar Anton Blanchard

Merge samba.org:/scratch/anton/linux-2.5

into samba.org:/scratch/anton/linux-2.5_ppc64
parents f733206b 4f9af681
...@@ -104,8 +104,8 @@ APISOURCES := $(TOPDIR)/drivers/media/video/videodev.c \ ...@@ -104,8 +104,8 @@ APISOURCES := $(TOPDIR)/drivers/media/video/videodev.c \
$(TOPDIR)/sound/sound_firmware.c \ $(TOPDIR)/sound/sound_firmware.c \
$(TOPDIR)/drivers/net/wan/syncppp.c \ $(TOPDIR)/drivers/net/wan/syncppp.c \
$(TOPDIR)/drivers/net/wan/z85230.c \ $(TOPDIR)/drivers/net/wan/z85230.c \
$(TOPDIR)/drivers/usb/hcd.c \ $(TOPDIR)/drivers/usb/core/hcd.c \
$(TOPDIR)/drivers/usb/usb.c \ $(TOPDIR)/drivers/usb/core/usb.c \
$(TOPDIR)/drivers/video/fbmem.c \ $(TOPDIR)/drivers/video/fbmem.c \
$(TOPDIR)/drivers/video/fbcmap.c \ $(TOPDIR)/drivers/video/fbcmap.c \
$(TOPDIR)/drivers/video/fbcon.c \ $(TOPDIR)/drivers/video/fbcon.c \
......
...@@ -282,7 +282,7 @@ ...@@ -282,7 +282,7 @@
</sect1> </sect1>
<sect1><title>USB Core APIs</title> <sect1><title>USB Core APIs</title>
!Edrivers/usb/usb.c !Edrivers/usb/core/usb.c
</sect1> </sect1>
<sect1><title>Host Controller APIs</title> <sect1><title>Host Controller APIs</title>
...@@ -290,7 +290,7 @@ ...@@ -290,7 +290,7 @@
most of which implement standard register interfaces such as most of which implement standard register interfaces such as
EHCI, OHCI, or UHCI. EHCI, OHCI, or UHCI.
</para> </para>
!Edrivers/usb/hcd.c !Edrivers/usb/core/hcd.c
</sect1> </sect1>
</chapter> </chapter>
......
...@@ -70,6 +70,10 @@ Driver details: ...@@ -70,6 +70,10 @@ Driver details:
Change history: Change history:
Version 0.9.7:
* Support other i8xx chipsets too (by adding 82801BA(M) and
82801CA(M) detection)
Version 0.9.6: Version 0.9.6:
* Internal driver cleanups, prep for 1.0.0 release. * Internal driver cleanups, prep for 1.0.0 release.
......
...@@ -1386,6 +1386,13 @@ P: Ingo Molnar ...@@ -1386,6 +1386,13 @@ P: Ingo Molnar
M: mingo@redhat.com M: mingo@redhat.com
S: Maintained S: Maintained
SIS 5513 IDE CONTROLLER DRIVER
P: Lionel Bouton
M: Lionel.Bouton@inet6.fr
W: http://inet6.dyn.dhs.org/sponsoring/sis5513/index.html
W: http://gyver.homeip.net/sis5513/index.html
S: Maintained
SIS 900/7016 FAST ETHERNET DRIVER SIS 900/7016 FAST ETHERNET DRIVER
P: Ollie Lho P: Ollie Lho
M: ollie@sis.com.tw M: ollie@sis.com.tw
......
...@@ -826,13 +826,15 @@ CONFIG_USB=y ...@@ -826,13 +826,15 @@ CONFIG_USB=y
# CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_OHCI_HCD is not set
CONFIG_USB_UHCI_ALT=y CONFIG_USB_UHCI_ALT=y
# CONFIG_USB_OHCI is not set # CONFIG_USB_OHCI is not set
CONFIG_USB_HOST=y
# #
# USB Device Class drivers # USB Device Class drivers
# #
# CONFIG_USB_AUDIO is not set # CONFIG_USB_AUDIO is not set
# CONFIG_USB_EMI26 is not set # CONFIG_USB_BLUETOOTH_TTY is not set
# CONFIG_USB_BLUETOOTH is not set # CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_DEBUG is not set # CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set # CONFIG_USB_STORAGE_DATAFAB is not set
...@@ -842,8 +844,6 @@ CONFIG_USB_STORAGE=y ...@@ -842,8 +844,6 @@ CONFIG_USB_STORAGE=y
# CONFIG_USB_STORAGE_HP8200e is not set # CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set # CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set # CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
# #
# USB Human Interface Devices (HID) # USB Human Interface Devices (HID)
...@@ -871,19 +871,28 @@ CONFIG_USB_STORAGE=y ...@@ -871,19 +871,28 @@ CONFIG_USB_STORAGE=y
# #
# USB Multimedia devices # USB Multimedia devices
# #
# CONFIG_USB_DABUSB is not set
# #
# Video4Linux support is needed for USB Multimedia device support # Video4Linux support is needed for USB Multimedia device support
# #
# CONFIG_USB_VICAM is not set
# CONFIG_USB_DSBR is not set
# CONFIG_USB_IBMCAM is not set
# CONFIG_USB_KONICAWC is not set
# CONFIG_USB_OV511 is not set
# CONFIG_USB_PWC is not set
# CONFIG_USB_SE401 is not set
# CONFIG_USB_STV680 is not set
# #
# USB Network adaptors # USB Network adaptors
# #
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set # CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set # CONFIG_USB_CDCETHER is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_RTL8150 is not set
# CONFIG_USB_USBNET is not set # CONFIG_USB_USBNET is not set
# #
...@@ -927,9 +936,10 @@ CONFIG_USB_STORAGE=y ...@@ -927,9 +936,10 @@ CONFIG_USB_STORAGE=y
# #
# USB Miscellaneous drivers # USB Miscellaneous drivers
# #
# CONFIG_USB_RIO500 is not set # CONFIG_USB_EMI26 is not set
# CONFIG_USB_AUERSWALD is not set
# CONFIG_USB_TIGL is not set # CONFIG_USB_TIGL is not set
# CONFIG_USB_AUERSWALD is not set
# CONFIG_USB_RIO500 is not set
# #
# Kernel hacking # Kernel hacking
......
...@@ -637,7 +637,7 @@ static int __init detect_init_APIC (void) ...@@ -637,7 +637,7 @@ static int __init detect_init_APIC (void)
printk("Could not enable APIC!\n"); printk("Could not enable APIC!\n");
return -1; return -1;
} }
set_bit(X86_FEATURE_APIC, &boot_cpu_data.x86_capability); set_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
boot_cpu_physical_apicid = 0; boot_cpu_physical_apicid = 0;
if (nmi_watchdog != NMI_NONE) if (nmi_watchdog != NMI_NONE)
......
...@@ -284,7 +284,7 @@ static void __init intel_mcheck_init(struct cpuinfo_x86 *c) ...@@ -284,7 +284,7 @@ static void __init intel_mcheck_init(struct cpuinfo_x86 *c)
* Check for MCE support * Check for MCE support
*/ */
if( !test_bit(X86_FEATURE_MCE, &c->x86_capability) ) if( !test_bit(X86_FEATURE_MCE, c->x86_capability) )
return; return;
/* /*
...@@ -314,7 +314,7 @@ static void __init intel_mcheck_init(struct cpuinfo_x86 *c) ...@@ -314,7 +314,7 @@ static void __init intel_mcheck_init(struct cpuinfo_x86 *c)
* Check for PPro style MCA * Check for PPro style MCA
*/ */
if( !test_bit(X86_FEATURE_MCA, &c->x86_capability) ) if( !test_bit(X86_FEATURE_MCA, c->x86_capability) )
return; return;
/* Ok machine check is available */ /* Ok machine check is available */
......
...@@ -387,7 +387,7 @@ static void set_mtrr_prepare_save (struct set_mtrr_context *ctxt) ...@@ -387,7 +387,7 @@ static void set_mtrr_prepare_save (struct set_mtrr_context *ctxt)
return; return;
/* Save value of CR4 and clear Page Global Enable (bit 7) */ /* Save value of CR4 and clear Page Global Enable (bit 7) */
if ( test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability) ) { if ( test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability) ) {
ctxt->cr4val = read_cr4(); ctxt->cr4val = read_cr4();
write_cr4(ctxt->cr4val & (unsigned char) ~(1<<7)); write_cr4(ctxt->cr4val & (unsigned char) ~(1<<7));
} }
...@@ -448,7 +448,7 @@ static void set_mtrr_done (struct set_mtrr_context *ctxt) ...@@ -448,7 +448,7 @@ static void set_mtrr_done (struct set_mtrr_context *ctxt)
write_cr0( read_cr0() & 0xbfffffff ); write_cr0( read_cr0() & 0xbfffffff );
/* Restore value of CR4 */ /* Restore value of CR4 */
if ( test_bit(X86_FEATURE_PGE, &boot_cpu_data.x86_capability) ) if ( test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability) )
write_cr4(ctxt->cr4val); write_cr4(ctxt->cr4val);
/* Re-enable interrupts locally (if enabled previously) */ /* Re-enable interrupts locally (if enabled previously) */
...@@ -2122,7 +2122,7 @@ static void __init centaur_mcr_init(void) ...@@ -2122,7 +2122,7 @@ static void __init centaur_mcr_init(void)
static int __init mtrr_setup(void) static int __init mtrr_setup(void)
{ {
if ( test_bit(X86_FEATURE_MTRR, &boot_cpu_data.x86_capability) ) { if ( test_bit(X86_FEATURE_MTRR, boot_cpu_data.x86_capability) ) {
/* Intel (P6) standard MTRRs */ /* Intel (P6) standard MTRRs */
mtrr_if = MTRR_IF_INTEL; mtrr_if = MTRR_IF_INTEL;
get_mtrr = intel_get_mtrr; get_mtrr = intel_get_mtrr;
...@@ -2166,14 +2166,14 @@ static int __init mtrr_setup(void) ...@@ -2166,14 +2166,14 @@ static int __init mtrr_setup(void)
break; break;
} }
} else if ( test_bit(X86_FEATURE_K6_MTRR, &boot_cpu_data.x86_capability) ) { } else if ( test_bit(X86_FEATURE_K6_MTRR, boot_cpu_data.x86_capability) ) {
/* Pre-Athlon (K6) AMD CPU MTRRs */ /* Pre-Athlon (K6) AMD CPU MTRRs */
mtrr_if = MTRR_IF_AMD_K6; mtrr_if = MTRR_IF_AMD_K6;
get_mtrr = amd_get_mtrr; get_mtrr = amd_get_mtrr;
set_mtrr_up = amd_set_mtrr_up; set_mtrr_up = amd_set_mtrr_up;
size_or_mask = 0xfff00000; /* 32 bits */ size_or_mask = 0xfff00000; /* 32 bits */
size_and_mask = 0; size_and_mask = 0;
} else if ( test_bit(X86_FEATURE_CYRIX_ARR, &boot_cpu_data.x86_capability) ) { } else if ( test_bit(X86_FEATURE_CYRIX_ARR, boot_cpu_data.x86_capability) ) {
/* Cyrix ARRs */ /* Cyrix ARRs */
mtrr_if = MTRR_IF_CYRIX_ARR; mtrr_if = MTRR_IF_CYRIX_ARR;
get_mtrr = cyrix_get_arr; get_mtrr = cyrix_get_arr;
...@@ -2182,7 +2182,7 @@ static int __init mtrr_setup(void) ...@@ -2182,7 +2182,7 @@ static int __init mtrr_setup(void)
cyrix_arr_init(); cyrix_arr_init();
size_or_mask = 0xfff00000; /* 32 bits */ size_or_mask = 0xfff00000; /* 32 bits */
size_and_mask = 0; size_and_mask = 0;
} else if ( test_bit(X86_FEATURE_CENTAUR_MCR, &boot_cpu_data.x86_capability) ) { } else if ( test_bit(X86_FEATURE_CENTAUR_MCR, boot_cpu_data.x86_capability) ) {
/* Centaur MCRs */ /* Centaur MCRs */
mtrr_if = MTRR_IF_CENTAUR_MCR; mtrr_if = MTRR_IF_CENTAUR_MCR;
get_mtrr = centaur_get_mcr; get_mtrr = centaur_get_mcr;
......
This diff is collapsed.
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
/* /*
* core module and version information * core module and version information
*/ */
#define RNG_VERSION "0.9.6" #define RNG_VERSION "0.9.7"
#define RNG_MODULE_NAME "i810_rng" #define RNG_MODULE_NAME "i810_rng"
#define RNG_DRIVER_NAME RNG_MODULE_NAME " hardware driver " RNG_VERSION #define RNG_DRIVER_NAME RNG_MODULE_NAME " hardware driver " RNG_VERSION
#define PFX RNG_MODULE_NAME ": " #define PFX RNG_MODULE_NAME ": "
...@@ -334,7 +334,8 @@ static int __init rng_init_one (struct pci_dev *dev) ...@@ -334,7 +334,8 @@ static int __init rng_init_one (struct pci_dev *dev)
static struct pci_device_id rng_pci_tbl[] __initdata = { static struct pci_device_id rng_pci_tbl[] __initdata = {
{ 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, }, { 0x8086, 0x2418, PCI_ANY_ID, PCI_ANY_ID, },
{ 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, }, { 0x8086, 0x2428, PCI_ANY_ID, PCI_ANY_ID, },
{ 0x8086, 0x1130, PCI_ANY_ID, PCI_ANY_ID, }, { 0x8086, 0x2448, PCI_ANY_ID, PCI_ANY_ID, },
{ 0x8086, 0x244e, PCI_ANY_ID, PCI_ANY_ID, },
{ 0, }, { 0, },
}; };
MODULE_DEVICE_TABLE (pci, rng_pci_tbl); MODULE_DEVICE_TABLE (pci, rng_pci_tbl);
......
...@@ -173,10 +173,10 @@ static inline int noncached_address(unsigned long addr) ...@@ -173,10 +173,10 @@ static inline int noncached_address(unsigned long addr)
* caching for the high addresses through the KEN pin, but * caching for the high addresses through the KEN pin, but
* we maintain the tradition of paranoia in this code. * we maintain the tradition of paranoia in this code.
*/ */
return !( test_bit(X86_FEATURE_MTRR, &boot_cpu_data.x86_capability) || return !( test_bit(X86_FEATURE_MTRR, boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_K6_MTRR, &boot_cpu_data.x86_capability) || test_bit(X86_FEATURE_K6_MTRR, boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_CYRIX_ARR, &boot_cpu_data.x86_capability) || test_bit(X86_FEATURE_CYRIX_ARR, boot_cpu_data.x86_capability) ||
test_bit(X86_FEATURE_CENTAUR_MCR, &boot_cpu_data.x86_capability) ) test_bit(X86_FEATURE_CENTAUR_MCR, boot_cpu_data.x86_capability) )
&& addr >= __pa(high_memory); && addr >= __pa(high_memory);
#else #else
return addr >= __pa(high_memory); return addr >= __pa(high_memory);
......
...@@ -736,7 +736,7 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num) ...@@ -736,7 +736,7 @@ static void add_timer_randomness(struct timer_rand_state *state, unsigned num)
int entropy = 0; int entropy = 0;
#if defined (__i386__) #if defined (__i386__)
if ( test_bit(X86_FEATURE_TSC, &boot_cpu_data.x86_capability) ) { if ( test_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability) ) {
__u32 high; __u32 high;
rdtsc(time, high); rdtsc(time, high);
num ^= high; num ^= high;
......
...@@ -212,9 +212,8 @@ void __init init_ali14xx (void) ...@@ -212,9 +212,8 @@ void __init init_ali14xx (void)
ide_hwifs[1].chipset = ide_ali14xx; ide_hwifs[1].chipset = ide_ali14xx;
ide_hwifs[0].tuneproc = &ali14xx_tune_drive; ide_hwifs[0].tuneproc = &ali14xx_tune_drive;
ide_hwifs[1].tuneproc = &ali14xx_tune_drive; ide_hwifs[1].tuneproc = &ali14xx_tune_drive;
ide_hwifs[0].mate = &ide_hwifs[1]; ide_hwifs[0].unit = ATA_PRIMARY;
ide_hwifs[1].mate = &ide_hwifs[0]; ide_hwifs[1].unit = ATA_SECONDARY;
ide_hwifs[1].unit = 1;
/* initialize controller registers */ /* initialize controller registers */
if (!initRegisters()) { if (!initRegisters()) {
......
...@@ -689,7 +689,7 @@ static void cmd640_tune_drive (ide_drive_t *drive, byte mode_wanted) ...@@ -689,7 +689,7 @@ static void cmd640_tune_drive (ide_drive_t *drive, byte mode_wanted)
/* /*
* Probe for a cmd640 chipset, and initialize it if found. Called from ide.c * Probe for a cmd640 chipset, and initialize it if found. Called from ide.c
*/ */
int __init ide_probe_for_cmd640x (void) int __init ide_probe_for_cmd640x(void)
{ {
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
int second_port_toggled = 0; int second_port_toggled = 0;
...@@ -793,9 +793,7 @@ int __init ide_probe_for_cmd640x (void) ...@@ -793,9 +793,7 @@ int __init ide_probe_for_cmd640x (void)
cmd_hwif0->serialized = 1; cmd_hwif0->serialized = 1;
cmd_hwif1->serialized = 1; cmd_hwif1->serialized = 1;
cmd_hwif1->chipset = ide_cmd640; cmd_hwif1->chipset = ide_cmd640;
cmd_hwif0->mate = cmd_hwif1; cmd_hwif1->unit = ATA_SECONDARY;
cmd_hwif1->mate = cmd_hwif0;
cmd_hwif1->unit = 1;
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
cmd_hwif1->tuneproc = &cmd640_tune_drive; cmd_hwif1->tuneproc = &cmd640_tune_drive;
#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */ #endif /* CONFIG_BLK_DEV_CMD640_ENHANCED */
...@@ -811,8 +809,8 @@ int __init ide_probe_for_cmd640x (void) ...@@ -811,8 +809,8 @@ int __init ide_probe_for_cmd640x (void)
ide_drive_t *drive = cmd_drives[index]; ide_drive_t *drive = cmd_drives[index];
#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED #ifdef CONFIG_BLK_DEV_CMD640_ENHANCED
if (drive->autotune || ((index > 1) && second_port_toggled)) { if (drive->autotune || ((index > 1) && second_port_toggled)) {
/* /*
* Reset timing to the slowest speed and turn off prefetch. * Reset timing to the slowest speed and turn off prefetch.
* This way, the drive identify code has a better chance. * This way, the drive identify code has a better chance.
*/ */
setup_counts [index] = 4; /* max possible */ setup_counts [index] = 4; /* max possible */
......
...@@ -346,8 +346,7 @@ unsigned int __init pci_init_cs5530(struct pci_dev *dev) ...@@ -346,8 +346,7 @@ unsigned int __init pci_init_cs5530(struct pci_dev *dev)
*/ */
void __init ide_init_cs5530(struct ata_channel *hwif) void __init ide_init_cs5530(struct ata_channel *hwif)
{ {
if (hwif->mate) hwif->serialized = 1;
hwif->serialized = hwif->mate->serialized = 1;
if (!hwif->dma_base) { if (!hwif->dma_base) {
hwif->autodma = 0; hwif->autodma = 0;
} else { } else {
......
...@@ -124,7 +124,6 @@ void __init init_dtc2278 (void) ...@@ -124,7 +124,6 @@ void __init init_dtc2278 (void)
ide_hwifs[0].drives[1].no_unmask = 1; ide_hwifs[0].drives[1].no_unmask = 1;
ide_hwifs[1].drives[0].no_unmask = 1; ide_hwifs[1].drives[0].no_unmask = 1;
ide_hwifs[1].drives[1].no_unmask = 1; ide_hwifs[1].drives[1].no_unmask = 1;
ide_hwifs[0].mate = &ide_hwifs[1]; ide_hwifs[0].unit = ATA_PRIMARY;
ide_hwifs[1].mate = &ide_hwifs[0]; ide_hwifs[1].unit = ATA_SECONDARY;
ide_hwifs[1].unit = 1;
} }
...@@ -1125,13 +1125,13 @@ unsigned int __init pci_init_hpt366(struct pci_dev *dev) ...@@ -1125,13 +1125,13 @@ unsigned int __init pci_init_hpt366(struct pci_dev *dev)
if (n_hpt_devs < HPT366_MAX_DEVS) if (n_hpt_devs < HPT366_MAX_DEVS)
hpt_devs[n_hpt_devs++] = dev; hpt_devs[n_hpt_devs++] = dev;
#if defined(DISPLAY_HPT366_TIMINGS) && defined(CONFIG_PROC_FS) #if defined(DISPLAY_HPT366_TIMINGS) && defined(CONFIG_PROC_FS)
if (!hpt366_proc) { if (!hpt366_proc) {
hpt366_proc = 1; hpt366_proc = 1;
hpt366_display_info = &hpt366_get_info; hpt366_display_info = &hpt366_get_info;
} }
#endif /* DISPLAY_HPT366_TIMINGS && CONFIG_PROC_FS */ #endif
return dev->irq; return dev->irq;
} }
...@@ -1146,7 +1146,7 @@ unsigned int __init ata66_hpt366(struct ata_channel *hwif) ...@@ -1146,7 +1146,7 @@ unsigned int __init ata66_hpt366(struct ata_channel *hwif)
printk("HPT366: reg5ah=0x%02x ATA-%s Cable Port%d\n", printk("HPT366: reg5ah=0x%02x ATA-%s Cable Port%d\n",
ata66, (ata66 & regmask) ? "33" : "66", ata66, (ata66 & regmask) ? "33" : "66",
PCI_FUNC(hwif->pci_dev->devfn)); PCI_FUNC(hwif->pci_dev->devfn));
#endif /* DEBUG */ #endif
return ((ata66 & regmask) ? 0 : 1); return ((ata66 & regmask) ? 0 : 1);
} }
......
...@@ -319,10 +319,9 @@ void __init init_ht6560b (void) ...@@ -319,10 +319,9 @@ void __init init_ht6560b (void)
ide_hwifs[1].tuneproc = &tune_ht6560b; ide_hwifs[1].tuneproc = &tune_ht6560b;
ide_hwifs[0].serialized = 1; /* is this needed? */ ide_hwifs[0].serialized = 1; /* is this needed? */
ide_hwifs[1].serialized = 1; /* is this needed? */ ide_hwifs[1].serialized = 1; /* is this needed? */
ide_hwifs[0].mate = &ide_hwifs[1]; ide_hwifs[0].unit = ATA_PRIMARY;
ide_hwifs[1].mate = &ide_hwifs[0]; ide_hwifs[1].unit = ATA_SECONDARY;
ide_hwifs[1].unit = 1;
/* /*
* Setting default configurations for drives * Setting default configurations for drives
*/ */
......
...@@ -421,7 +421,7 @@ int check_drive_lists (ide_drive_t *drive, int good_bad) ...@@ -421,7 +421,7 @@ int check_drive_lists (ide_drive_t *drive, int good_bad)
return 0; return 0;
} }
static int report_drive_dmaing (ide_drive_t *drive) int report_drive_dmaing (ide_drive_t *drive)
{ {
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
......
...@@ -182,7 +182,7 @@ typedef struct ide_pci_device_s { ...@@ -182,7 +182,7 @@ typedef struct ide_pci_device_s {
unsigned short device; unsigned short device;
unsigned int (*init_chipset)(struct pci_dev *dev); unsigned int (*init_chipset)(struct pci_dev *dev);
unsigned int (*ata66_check)(struct ata_channel *hwif); unsigned int (*ata66_check)(struct ata_channel *hwif);
void (*init_hwif)(struct ata_channel *hwif); void (*init_channel)(struct ata_channel *hwif);
void (*dma_init)(struct ata_channel *hwif, unsigned long dmabase); void (*dma_init)(struct ata_channel *hwif, unsigned long dmabase);
ide_pci_enablebit_t enablebits[2]; ide_pci_enablebit_t enablebits[2];
unsigned int bootable; unsigned int bootable;
...@@ -436,24 +436,21 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co ...@@ -436,24 +436,21 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co
unsigned long dma_base = 0; unsigned long dma_base = 0;
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
/* dma_base = pci_resource_start(dev, 4);
* If we are on the second channel, the dma base address will be one
* entry away from the primary interface.
*/
if (hwif->mate && hwif->mate->dma_base)
dma_base = hwif->mate->dma_base - (hwif->unit ? 0 : 8);
else
dma_base = pci_resource_start(dev, 4);
if (!dma_base) if (!dma_base)
return 0; return 0;
if (extra) /* PDC20246, PDC20262, HPT343, & HPT366 */ /* PDC20246, PDC20262, HPT343, & HPT366 */
if (extra) {
request_region(dma_base + 16, extra, name); request_region(dma_base + 16, extra, name);
hwif->dma_extra = extra;
}
dma_base += hwif->unit ? 8 : 0; /* If we are on the second channel, the dma base address will be one
hwif->dma_extra = extra; * entry away from the primary interface.
*/
if (hwif->unit == ATA_SECONDARY)
dma_base += 8;
if ((dev->vendor == PCI_VENDOR_ID_AL && dev->device == PCI_DEVICE_ID_AL_M5219) || if ((dev->vendor == PCI_VENDOR_ID_AL && dev->device == PCI_DEVICE_ID_AL_M5219) ||
(dev->vendor == PCI_VENDOR_ID_AMD && dev->device == PCI_DEVICE_ID_AMD_VIPER_7409) || (dev->vendor == PCI_VENDOR_ID_AMD && dev->device == PCI_DEVICE_ID_AMD_VIPER_7409) ||
...@@ -463,8 +460,7 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co ...@@ -463,8 +460,7 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co
printk(KERN_INFO "%s: simplex device: DMA forced\n", name); printk(KERN_INFO "%s: simplex device: DMA forced\n", name);
} else { } else {
/* /* If the device claims "simplex" DMA, this means only one of
* If the device claims "simplex" DMA, this means only one of
* the two interfaces can be trusted with DMA at any point in * the two interfaces can be trusted with DMA at any point in
* time. So we should enable DMA only on one of the two * time. So we should enable DMA only on one of the two
* interfaces. * interfaces.
...@@ -472,7 +468,7 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co ...@@ -472,7 +468,7 @@ static unsigned long __init get_dma_base(struct ata_channel *hwif, int extra, co
if ((inb(dma_base + 2) & 0x80)) { if ((inb(dma_base + 2) & 0x80)) {
if ((!hwif->drives[0].present && !hwif->drives[1].present) || if ((!hwif->drives[0].present && !hwif->drives[1].present) ||
(hwif->mate && hwif->mate->dma_base)) { hwif->unit == ATA_SECONDARY) {
printk("%s: simplex device: DMA disabled\n", name); printk("%s: simplex device: DMA disabled\n", name);
dma_base = 0; dma_base = 0;
} }
...@@ -489,8 +485,9 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d ...@@ -489,8 +485,9 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d
ide_pci_device_t *d, ide_pci_device_t *d,
int port, int port,
u8 class_rev, u8 class_rev,
int pciirq, struct ata_channel **mate, int pciirq,
int autodma, unsigned short *pcicmd) int autodma,
unsigned short *pcicmd)
{ {
unsigned long dma_base; unsigned long dma_base;
...@@ -503,8 +500,13 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d ...@@ -503,8 +500,13 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d
if (!((d->flags & ATA_F_DMA) || ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 0x80)))) if (!((d->flags & ATA_F_DMA) || ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 0x80))))
return; return;
dma_base = get_dma_base(hwif, (!*mate && d->extra) ? d->extra : 0, dev->name); dma_base = get_dma_base(hwif, ((port == ATA_PRIMARY) && d->extra) ? d->extra : 0, dev->name);
if (dma_base && !(*pcicmd & PCI_COMMAND_MASTER)) { if (!dma_base) {
printk("%s: %s Bus-Master DMA was disabled by BIOS\n", hwif->name, dev->name);
return;
}
if (!(*pcicmd & PCI_COMMAND_MASTER)) {
/* /*
* Set up BM-DMA capability (PnP BIOS should have done this already) * Set up BM-DMA capability (PnP BIOS should have done this already)
...@@ -517,13 +519,10 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d ...@@ -517,13 +519,10 @@ static void __init setup_channel_dma(struct ata_channel *hwif, struct pci_dev *d
dma_base = 0; dma_base = 0;
} }
} }
if (dma_base) { if (d->dma_init)
if (d->dma_init) d->dma_init(hwif, dma_base);
d->dma_init(hwif, dma_base); else
else ide_setup_dma(hwif, dma_base, 8);
ide_setup_dma(hwif, dma_base, 8);
} else
printk("%s: %s Bus-Master DMA was disabled by BIOS\n", hwif->name, dev->name);
} }
#endif #endif
...@@ -537,17 +536,16 @@ static int __init setup_host_channel(struct pci_dev *dev, ...@@ -537,17 +536,16 @@ static int __init setup_host_channel(struct pci_dev *dev,
int port, int port,
u8 class_rev, u8 class_rev,
int pciirq, int pciirq,
struct ata_channel **mate,
int autodma, int autodma,
unsigned short *pcicmd) unsigned short *pcicmd)
{ {
unsigned long base = 0; unsigned long base = 0;
unsigned long ctl = 0; unsigned long ctl = 0;
ide_pci_enablebit_t *e = &(d->enablebits[port]); ide_pci_enablebit_t *e = &(d->enablebits[port]);
struct ata_channel *hwif; struct ata_channel *ch;
u8 tmp; u8 tmp;
if (port == 1) { if (port == ATA_SECONDARY) {
/* If this is a Promise FakeRaid controller, the 2nd controller /* If this is a Promise FakeRaid controller, the 2nd controller
* will be marked as disabled while it is actually there and * will be marked as disabled while it is actually there and
...@@ -569,7 +567,7 @@ static int __init setup_host_channel(struct pci_dev *dev, ...@@ -569,7 +567,7 @@ static int __init setup_host_channel(struct pci_dev *dev,
/* Nothing to be done for the second port. /* Nothing to be done for the second port.
*/ */
if (port == 1) { if (port == ATA_SECONDARY) {
if ((d->flags & ATA_F_HPTHACK) && (class_rev < 0x03)) if ((d->flags & ATA_F_HPTHACK) && (class_rev < 0x03))
return 0; return 0;
} }
...@@ -599,57 +597,50 @@ static int __init setup_host_channel(struct pci_dev *dev, ...@@ -599,57 +597,50 @@ static int __init setup_host_channel(struct pci_dev *dev,
if (!base) if (!base)
base = port ? 0x170 : 0x1f0; base = port ? 0x170 : 0x1f0;
if ((hwif = lookup_hwif(base, d->bootable, dev->name)) == NULL) if ((ch = lookup_hwif(base, d->bootable, dev->name)) == NULL)
return -ENOMEM; /* no room in ide_hwifs[] */ return -ENOMEM; /* no room in ide_hwifs[] */
if (hwif->io_ports[IDE_DATA_OFFSET] != base) { if (ch->io_ports[IDE_DATA_OFFSET] != base) {
ide_init_hwif_ports(&hwif->hw, base, (ctl | 2), NULL); ide_init_hwif_ports(&ch->hw, base, (ctl | 2), NULL);
memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); memcpy(ch->io_ports, ch->hw.io_ports, sizeof(ch->io_ports));
hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET]; ch->noprobe = !ch->io_ports[IDE_DATA_OFFSET];
} }
hwif->chipset = ide_pci; ch->chipset = ide_pci;
hwif->pci_dev = dev; ch->pci_dev = dev;
hwif->unit = port; ch->unit = port;
if (!hwif->irq) if (!ch->irq)
hwif->irq = pciirq; ch->irq = pciirq;
/* Setup the mate interface if we have two channels. /* Serialize the interfaces if requested by configuration information.
*/ */
if (*mate) { if (d->flags & ATA_F_SER)
hwif->mate = *mate; ch->serialized = 1;
(*mate)->mate = hwif;
if (d->flags & ATA_F_SER) {
hwif->serialized = 1;
(*mate)->serialized = 1;
}
}
/* Cross wired IRQ lines on UMC chips and no DMA transfers.*/ /* Cross wired IRQ lines on UMC chips and no DMA transfers.*/
if (d->flags & ATA_F_FIXIRQ) { if (d->flags & ATA_F_FIXIRQ) {
hwif->irq = port ? 15 : 14; ch->irq = port ? 15 : 14;
goto no_dma; goto no_dma;
} }
if (d->flags & ATA_F_NODMA) if (d->flags & ATA_F_NODMA)
goto no_dma; goto no_dma;
/* Check whatever this interface is UDMA4 mode capable. */ /* Check whatever this interface is UDMA4 mode capable. */
if (hwif->udma_four) { if (ch->udma_four) {
printk("%s: warning: ATA-66/100 forced bit set!\n", dev->name); printk("%s: warning: ATA-66/100 forced bit set!\n", dev->name);
} else { } else {
if (d->ata66_check) if (d->ata66_check)
hwif->udma_four = d->ata66_check(hwif); ch->udma_four = d->ata66_check(ch);
} }
#ifdef CONFIG_BLK_DEV_IDEDMA #ifdef CONFIG_BLK_DEV_IDEDMA
setup_channel_dma(hwif, dev, d, port, class_rev, pciirq, mate, autodma, pcicmd); setup_channel_dma(ch, dev, d, port, class_rev, pciirq, autodma, pcicmd);
#endif #endif
no_dma: no_dma:
if (d->init_hwif) /* Call chipset-specific routine for each enabled hwif */ /* Call chipset-specific routine for each enabled channel. */
d->init_hwif(hwif); if (d->init_channel)
d->init_channel(ch);
*mate = hwif;
return 0; return 0;
} }
...@@ -671,7 +662,6 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d) ...@@ -671,7 +662,6 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d)
int pciirq = 0; int pciirq = 0;
unsigned short pcicmd = 0; unsigned short pcicmd = 0;
unsigned short tried_config = 0; unsigned short tried_config = 0;
struct ata_channel *mate = NULL;
unsigned int class_rev; unsigned int class_rev;
#ifdef CONFIG_IDEDMA_AUTO #ifdef CONFIG_IDEDMA_AUTO
...@@ -679,9 +669,9 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d) ...@@ -679,9 +669,9 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d)
autodma = 1; autodma = 1;
#endif #endif
if (d->init_hwif == IDE_NO_DRIVER) { if (d->init_channel == IDE_NO_DRIVER) {
printk(KERN_WARNING "%s: detected chipset, but driver not compiled in!\n", dev->name); printk(KERN_WARNING "%s: detected chipset, but driver not compiled in!\n", dev->name);
d->init_hwif = NULL; d->init_channel = NULL;
} }
if (pci_enable_device(dev)) { if (pci_enable_device(dev)) {
...@@ -779,8 +769,8 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d) ...@@ -779,8 +769,8 @@ static void __init setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d)
/* /*
* Set up IDE chanells. First the primary, then the secondary. * Set up IDE chanells. First the primary, then the secondary.
*/ */
setup_host_channel(dev, d, 0, class_rev, pciirq, &mate, autodma, &pcicmd); setup_host_channel(dev, d, ATA_PRIMARY, class_rev, pciirq, autodma, &pcicmd);
setup_host_channel(dev, d, 1, class_rev, pciirq, &mate, autodma, &pcicmd); setup_host_channel(dev, d, ATA_SECONDARY, class_rev, pciirq, autodma, &pcicmd);
} }
static void __init pdc20270_device_order_fixup (struct pci_dev *dev, ide_pci_device_t *d) static void __init pdc20270_device_order_fixup (struct pci_dev *dev, ide_pci_device_t *d)
...@@ -856,12 +846,6 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, ide_pci_devic ...@@ -856,12 +846,6 @@ static void __init hpt366_device_order_fixup (struct pci_dev *dev, ide_pci_devic
if (hpt363_shared_pin && hpt363_shared_irq) { if (hpt363_shared_pin && hpt363_shared_irq) {
d->bootable = ON_BOARD; d->bootable = ON_BOARD;
printk("%s: onboard version of chipset, pin1=%d pin2=%d\n", dev->name, pin1, pin2); printk("%s: onboard version of chipset, pin1=%d pin2=%d\n", dev->name, pin1, pin2);
#if 0
/* I forgot why I did this once, but it fixed something. */
pci_write_config_byte(dev2, PCI_INTERRUPT_PIN, dev->irq);
printk("PCI: %s: Fixing interrupt %d pin %d to ZERO \n", d->name, dev2->irq, pin2);
pci_write_config_byte(dev2, PCI_INTERRUPT_LINE, 0);
#endif
} }
break; break;
} }
...@@ -894,7 +878,7 @@ static void __init scan_pcidev(struct pci_dev *dev) ...@@ -894,7 +878,7 @@ static void __init scan_pcidev(struct pci_dev *dev)
while (d->vendor && !(d->vendor == vendor && d->device == device)) while (d->vendor && !(d->vendor == vendor && d->device == device))
++d; ++d;
if (d->init_hwif == ATA_PCI_IGNORE) if (d->init_channel == ATA_PCI_IGNORE)
printk("%s: has been ignored by PCI bus scan\n", dev->name); printk("%s: has been ignored by PCI bus scan\n", dev->name);
else if ((d->vendor == PCI_VENDOR_ID_OPTI && d->device == PCI_DEVICE_ID_OPTI_82C558) && !(PCI_FUNC(dev->devfn) & 1)) else if ((d->vendor == PCI_VENDOR_ID_OPTI && d->device == PCI_DEVICE_ID_OPTI_82C558) && !(PCI_FUNC(dev->devfn) & 1))
return; return;
......
This diff is collapsed.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#include <linux/types.h>
#include <linux/ide.h> #include <linux/ide.h>
#include <linux/init.h> #include <linux/init.h>
......
...@@ -140,7 +140,7 @@ static inline void do_identify (ide_drive_t *drive, byte cmd) ...@@ -140,7 +140,7 @@ static inline void do_identify (ide_drive_t *drive, byte cmd)
/* kludge for Apple PowerBook internal zip */ /* kludge for Apple PowerBook internal zip */
if (!strstr(id->model, "CD-ROM") && strstr(id->model, "ZIP")) { if (!strstr(id->model, "CD-ROM") && strstr(id->model, "ZIP")) {
printk ("FLOPPY"); printk ("FLOPPY");
type = ide_floppy; type = ATA_FLOPPY;
break; break;
} }
#endif #endif
...@@ -666,13 +666,12 @@ static int init_irq(struct ata_channel *hwif) ...@@ -666,13 +666,12 @@ static int init_irq(struct ata_channel *hwif)
hwif->sharing_irq = h->sharing_irq = 1; hwif->sharing_irq = h->sharing_irq = 1;
if (hwif->chipset != ide_pci || h->chipset != ide_pci) if (hwif->chipset != ide_pci || h->chipset != ide_pci)
save_match(hwif, h, &match); save_match(hwif, h, &match);
}
if (hwif->serialized) { /* FIXME: This is still confusing. What would
if (hwif->mate && hwif->mate->irq == h->irq) * happen if we match-ed two times?
save_match(hwif, h, &match); */
}
if (h->serialized) { if (hwif->serialized || h->serialized)
if (h->mate && hwif->irq == h->mate->irq)
save_match(hwif, h, &match); save_match(hwif, h, &match);
} }
} }
...@@ -823,12 +822,11 @@ static void init_gendisk(struct ata_channel *hwif) ...@@ -823,12 +822,11 @@ static void init_gendisk(struct ata_channel *hwif)
for (unit = 0; unit < MAX_DRIVES; ++unit) { for (unit = 0; unit < MAX_DRIVES; ++unit) {
char name[80]; char name[80];
ide_add_generic_settings(hwif->drives + unit); ide_add_generic_settings(hwif->drives + unit);
hwif->drives[unit].dn = ((hwif->unit ? 2 : 0) + unit); hwif->drives[unit].dn = ((hwif->unit ? 2 : 0) + unit);
sprintf (name, "host%d/bus%d/target%d/lun%d", sprintf (name, "host%d/bus%d/target%d/lun%d",
(hwif->unit && hwif->mate) ? hwif->index, hwif->unit, unit, hwif->drives[unit].lun);
hwif->mate->index : hwif->index,
hwif->unit, unit, hwif->drives[unit].lun);
if (hwif->drives[unit].present) if (hwif->drives[unit].present)
hwif->drives[unit].de = devfs_mk_dir(ide_devfs_handle, name, NULL); hwif->drives[unit].de = devfs_mk_dir(ide_devfs_handle, name, NULL);
} }
......
...@@ -164,19 +164,6 @@ static int proc_ide_read_imodel ...@@ -164,19 +164,6 @@ static int proc_ide_read_imodel
PROC_IDE_READ_RETURN(page,start,off,count,eof,len); PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
} }
static int proc_ide_read_mate
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
struct ata_channel *hwif = data;
int len;
if (hwif && hwif->mate && hwif->mate->present)
len = sprintf(page, "%s\n", hwif->mate->name);
else
len = sprintf(page, "(none)\n");
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
static int proc_ide_read_channel static int proc_ide_read_channel
(char *page, char **start, off_t off, int count, int *eof, void *data) (char *page, char **start, off_t off, int count, int *eof, void *data)
{ {
...@@ -493,7 +480,6 @@ void destroy_proc_ide_drives(struct ata_channel *hwif) ...@@ -493,7 +480,6 @@ void destroy_proc_ide_drives(struct ata_channel *hwif)
static ide_proc_entry_t hwif_entries[] = { static ide_proc_entry_t hwif_entries[] = {
{ "channel", S_IFREG|S_IRUGO, proc_ide_read_channel, NULL }, { "channel", S_IFREG|S_IRUGO, proc_ide_read_channel, NULL },
{ "mate", S_IFREG|S_IRUGO, proc_ide_read_mate, NULL },
{ "model", S_IFREG|S_IRUGO, proc_ide_read_imodel, NULL }, { "model", S_IFREG|S_IRUGO, proc_ide_read_imodel, NULL },
{ NULL, 0, NULL, NULL } { NULL, 0, NULL, NULL }
}; };
......
...@@ -2177,7 +2177,7 @@ int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp) ...@@ -2177,7 +2177,7 @@ int ide_register_hw(hw_regs_t *hw, struct ata_channel **hwifp)
} }
for (h = 0; h < MAX_HWIFS; ++h) { for (h = 0; h < MAX_HWIFS; ++h) {
hwif = &ide_hwifs[h]; hwif = &ide_hwifs[h];
if ((!hwif->present && !hwif->mate && !initializing) || if ((!hwif->present && (hwif->unit == ATA_PRIMARY) && !initializing) ||
(!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing)) (!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing))
goto found; goto found;
} }
...@@ -3052,9 +3052,13 @@ int __init ide_setup (char *s) ...@@ -3052,9 +3052,13 @@ int __init ide_setup (char *s)
goto done; goto done;
case -2: /* "serialize" */ case -2: /* "serialize" */
do_serialize: do_serialize:
hwif->mate = &ide_hwifs[hw^1]; {
hwif->mate->mate = hwif; struct ata_channel *mate;
hwif->serialized = hwif->mate->serialized = 1;
mate = &ide_hwifs[hw ^ 1];
hwif->serialized = 1;
mate->serialized = 1;
}
goto done; goto done;
case -1: /* "noprobe" */ case -1: /* "noprobe" */
......
...@@ -141,11 +141,21 @@ void __init ide_init_ns87415(struct ata_channel *hwif) ...@@ -141,11 +141,21 @@ void __init ide_init_ns87415(struct ata_channel *hwif)
using_inta = progif & (1 << (hwif->unit << 1)); using_inta = progif & (1 << (hwif->unit << 1));
if (!using_inta) if (!using_inta)
using_inta = ctrl & (1 << (4 + hwif->unit)); using_inta = ctrl & (1 << (4 + hwif->unit));
if (hwif->mate) { if (hwif->unit == ATA_SECONDARY) {
hwif->select_data = hwif->mate->select_data;
/* FIXME: If we are initializing the secondary channel, let us
* assume that the primary channel got initialized just a tad
* bit before now. It would be much cleaner if the data in
* ns87415_control just got duplicated.
*/
if (!hwif->select_data)
hwif->select_data = (unsigned long)
&ns87415_control[ns87415_count - 1];
} else { } else {
hwif->select_data = (unsigned long) if (!hwif->select_data)
&ns87415_control[ns87415_count++]; hwif->select_data = (unsigned long)
&ns87415_control[ns87415_count++];
ctrl |= (1 << 8) | (1 << 9); /* mask both IRQs */ ctrl |= (1 << 8) | (1 << 9); /* mask both IRQs */
if (using_inta) if (using_inta)
ctrl &= ~(1 << 6); /* unmask INTA */ ctrl &= ~(1 << 6); /* unmask INTA */
...@@ -170,9 +180,9 @@ void __init ide_init_ns87415(struct ata_channel *hwif) ...@@ -170,9 +180,9 @@ void __init ide_init_ns87415(struct ata_channel *hwif)
do { do {
udelay(50); udelay(50);
stat = inb(hwif->io_ports[IDE_STATUS_OFFSET]); stat = inb(hwif->io_ports[IDE_STATUS_OFFSET]);
if (stat == 0xff) if (stat == 0xff)
break; break;
} while ((stat & BUSY_STAT) && --timeout); } while ((stat & BUSY_STAT) && --timeout);
#endif #endif
} }
...@@ -181,13 +191,23 @@ void __init ide_init_ns87415(struct ata_channel *hwif) ...@@ -181,13 +191,23 @@ void __init ide_init_ns87415(struct ata_channel *hwif)
if (!using_inta) if (!using_inta)
hwif->irq = hwif->unit ? 15 : 14; /* legacy mode */ hwif->irq = hwif->unit ? 15 : 14; /* legacy mode */
else if (!hwif->irq && hwif->mate && hwif->mate->irq) else {
hwif->irq = hwif->mate->irq; /* share IRQ with mate */ static int primary_irq = 0;
/* Ugly way to let the primary and secondary channel on the
* chip use the same IRQ line.
*/
if (hwif->unit == ATA_PRIMARY)
primary_irq = hwif->irq;
else if (!hwif->irq)
hwif->irq = primary_irq;
}
#ifdef CONFIG_BLK_DEV_IDEDMA #ifdef CONFIG_BLK_DEV_IDEDMA
if (hwif->dma_base) if (hwif->dma_base)
hwif->dmaproc = &ns87415_dmaproc; hwif->dmaproc = &ns87415_dmaproc;
#endif /* CONFIG_BLK_DEV_IDEDMA */ #endif
hwif->selectproc = &ns87415_selectproc; hwif->selectproc = &ns87415_selectproc;
} }
...@@ -162,7 +162,7 @@ int __init setup_pdc4030(struct ata_channel *hwif) ...@@ -162,7 +162,7 @@ int __init setup_pdc4030(struct ata_channel *hwif)
struct dc_ident ident; struct dc_ident ident;
int i; int i;
ide_startstop_t startstop; ide_startstop_t startstop;
if (!hwif) return 0; if (!hwif) return 0;
drive = &hwif->drives[0]; drive = &hwif->drives[0];
...@@ -224,9 +224,8 @@ int __init setup_pdc4030(struct ata_channel *hwif) ...@@ -224,9 +224,8 @@ int __init setup_pdc4030(struct ata_channel *hwif)
*/ */
hwif->chipset = hwif2->chipset = ide_pdc4030; hwif->chipset = hwif2->chipset = ide_pdc4030;
hwif->mate = hwif2; hwif->unit = ATA_PRIMARY;
hwif2->mate = hwif; hwif2->unit = ATA_SECONDARY;
hwif2->unit = 1;
hwif->selectproc = hwif2->selectproc = &promise_selectproc; hwif->selectproc = hwif2->selectproc = &promise_selectproc;
hwif->serialized = hwif2->serialized = 1; hwif->serialized = hwif2->serialized = 1;
......
/* /*
* $Id: piix.c,v 1.2 2002/03/13 22:50:43 vojtech Exp $ * $Id: piix.c,v 1.3 2002/03/29 16:06:06 vojtech Exp $
* *
* Copyright (c) 2000-2002 Vojtech Pavlik * Copyright (c) 2000-2002 Vojtech Pavlik
* *
...@@ -128,7 +128,7 @@ static int piix_get_info(char *buffer, char **addr, off_t offset, int count) ...@@ -128,7 +128,7 @@ static int piix_get_info(char *buffer, char **addr, off_t offset, int count)
piix_print("----------PIIX BusMastering IDE Configuration---------------"); piix_print("----------PIIX BusMastering IDE Configuration---------------");
piix_print("Driver Version: 1.2"); piix_print("Driver Version: 1.3");
piix_print("South Bridge: %s", bmide_dev->name); piix_print("South Bridge: %s", bmide_dev->name);
pci_read_config_byte(dev, PCI_REVISION_ID, &t); pci_read_config_byte(dev, PCI_REVISION_ID, &t);
...@@ -331,7 +331,7 @@ static int piix_set_drive(ide_drive_t *drive, unsigned char speed) ...@@ -331,7 +331,7 @@ static int piix_set_drive(ide_drive_t *drive, unsigned char speed)
umul = 2; umul = 2;
T = 1000000000 / piix_clock; T = 1000000000 / piix_clock;
UT = T / umul; UT = umul ? (T / umul) : 0;
ata_timing_compute(drive, speed, &t, T, UT); ata_timing_compute(drive, speed, &t, T, UT);
......
...@@ -411,22 +411,23 @@ int __init probe (int base) ...@@ -411,22 +411,23 @@ int __init probe (int base)
return 1; return 1;
} else { } else {
int i,j; int i;
/* secondary enabled */ /* secondary enabled */
printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n", printk(KERN_INFO "%s&%s: qd6580: dual IDE board\n",
ide_hwifs[0].name,ide_hwifs[1].name); ide_hwifs[0].name,ide_hwifs[1].name);
for (i=0;i<2;i++) { for (i = 0; i < 2; i++) {
int j;
ide_hwifs[i].chipset = ide_qd65xx; ide_hwifs[i].chipset = ide_qd65xx;
ide_hwifs[i].mate = &ide_hwifs[i^1];
ide_hwifs[i].unit = i; ide_hwifs[i].unit = i;
ide_hwifs[i].select_data = base; ide_hwifs[i].select_data = base;
ide_hwifs[i].config_data = config | (control <<8); ide_hwifs[i].config_data = config | (control <<8);
ide_hwifs[i].tuneproc = &qd6580_tune_drive; ide_hwifs[i].tuneproc = &qd6580_tune_drive;
for (j=0;j<2;j++) { for (j = 0; j < 2; j++) {
ide_hwifs[i].drives[j].drive_data = ide_hwifs[i].drives[j].drive_data =
i?QD6580_DEF_DATA2:QD6580_DEF_DATA; i?QD6580_DEF_DATA2:QD6580_DEF_DATA;
ide_hwifs[i].drives[j].io_32bit = 1; ide_hwifs[i].drives[j].io_32bit = 1;
......
This diff is collapsed.
...@@ -248,8 +248,19 @@ void __init ide_init_trm290(struct ata_channel *hwif) ...@@ -248,8 +248,19 @@ void __init ide_init_trm290(struct ata_channel *hwif)
if ((reg & 0x10)) if ((reg & 0x10))
hwif->irq = hwif->unit ? 15 : 14; /* legacy mode */ hwif->irq = hwif->unit ? 15 : 14; /* legacy mode */
else if (!hwif->irq && hwif->mate && hwif->mate->irq) else {
hwif->irq = hwif->mate->irq; /* sharing IRQ with mate */ static int primary_irq = 0;
/* Ugly way to let the primary and secondary channel on the
* chip use the same IRQ line.
*/
if (hwif->unit == ATA_PRIMARY)
primary_irq = hwif->irq;
else if (!hwif->irq)
hwif->irq = primary_irq;
}
ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->unit ? 0x0080 : 0x0000), 3); ide_setup_dma(hwif, (hwif->config_data + 4) ^ (hwif->unit ? 0x0080 : 0x0000), 3);
#ifdef CONFIG_BLK_DEV_IDEDMA #ifdef CONFIG_BLK_DEV_IDEDMA
......
...@@ -146,7 +146,7 @@ void __init init_umc8672 (void) /* called from ide.c */ ...@@ -146,7 +146,7 @@ void __init init_umc8672 (void) /* called from ide.c */
{ {
__restore_flags(flags); /* local CPU only */ __restore_flags(flags); /* local CPU only */
printk ("umc8672: not found\n"); printk ("umc8672: not found\n");
return; return;
} }
outb_p (0xa5,0x108); /* disable umc */ outb_p (0xa5,0x108); /* disable umc */
...@@ -158,7 +158,6 @@ void __init init_umc8672 (void) /* called from ide.c */ ...@@ -158,7 +158,6 @@ void __init init_umc8672 (void) /* called from ide.c */
ide_hwifs[1].chipset = ide_umc8672; ide_hwifs[1].chipset = ide_umc8672;
ide_hwifs[0].tuneproc = &tune_umc; ide_hwifs[0].tuneproc = &tune_umc;
ide_hwifs[1].tuneproc = &tune_umc; ide_hwifs[1].tuneproc = &tune_umc;
ide_hwifs[0].mate = &ide_hwifs[1]; ide_hwifs[0].unit = ATA_PRIMARY;
ide_hwifs[1].mate = &ide_hwifs[0]; ide_hwifs[1].unit = ATA_SECONDARY;
ide_hwifs[1].unit = 1;
} }
This diff is collapsed.
CONFIG_USB_ACM
This driver supports USB modems and ISDN adapters which support the
Communication Device Class Abstract Control Model interface.
Please read <file:Documentation/usb/acm.txt> for details.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called acm.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_AUDIO
Say Y here if you want to connect USB audio equipment such as
speakers to your computer's USB port.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_BLUETOOTH_TTY
Say Y here if you want to connect a USB Bluetooth device to your
computer's USB port. You will need the Bluetooth stack (available
at <http://developer.axis.com/software/index.shtml>) to fully use
the device.
This driver implements a tty inteface to a Bluetooth device. If
you want to use a socket based Bluetooth stack (like the BlueZ
stack), do not use this driver.
If in doubt, say N here.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called bluetty.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_PRINTER
Say Y here if you want to connect a USB printer to your computer's
USB port.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called printer.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
# #
comment 'USB Device Class drivers' comment 'USB Device Class drivers'
dep_tristate ' USB Audio support' CONFIG_USB_AUDIO $CONFIG_USB $CONFIG_SOUND dep_tristate ' USB Audio support' CONFIG_USB_AUDIO $CONFIG_USB $CONFIG_SOUND
dep_tristate ' USB Bluetooth support (EXPERIMENTAL)' CONFIG_USB_BLUETOOTH $CONFIG_USB $CONFIG_EXPERIMENTAL dep_tristate ' USB Bluetooth TTY support' CONFIG_USB_BLUETOOTH_TTY $CONFIG_USB
dep_tristate ' USB Modem (CDC ACM) support' CONFIG_USB_ACM $CONFIG_USB dep_tristate ' USB Modem (CDC ACM) support' CONFIG_USB_ACM $CONFIG_USB
dep_tristate ' USB Printer support' CONFIG_USB_PRINTER $CONFIG_USB dep_tristate ' USB Printer support' CONFIG_USB_PRINTER $CONFIG_USB
# Turn on CONFIG_USB_CLASS if any of the drivers are compiled into the kernel # Turn on CONFIG_USB_CLASS if any of the drivers are compiled into the kernel
# to make our Makefile logic a bit simpler. # to make our Makefile logic a bit simpler.
if [ "$CONFIG_USB_AUDIO" = "y" -o "$CONFIG_USB_BLUETOOTH" = "y" ]; then if [ "$CONFIG_USB_AUDIO" = "y" -o "$CONFIG_USB_BLUETOOTH_TTY" = "y" ]; then
define_bool CONFIG_USB_CLASS y define_bool CONFIG_USB_CLASS y
fi fi
if [ "$CONFIG_USB_ACM" = "y" -o "$CONFIG_USB_PRINTER" = "y" ]; then if [ "$CONFIG_USB_ACM" = "y" -o "$CONFIG_USB_PRINTER" = "y" ]; then
......
...@@ -7,7 +7,7 @@ O_TARGET := usb-class.o ...@@ -7,7 +7,7 @@ O_TARGET := usb-class.o
obj-$(CONFIG_USB_ACM) += cdc-acm.o obj-$(CONFIG_USB_ACM) += cdc-acm.o
obj-$(CONFIG_USB_AUDIO) += audio.o obj-$(CONFIG_USB_AUDIO) += audio.o
obj-$(CONFIG_USB_BLUETOOTH) += bluetooth.o obj-$(CONFIG_USB_BLUETOOTH_TTY) += bluetty.o
obj-$(CONFIG_USB_PRINTER) += printer.o obj-$(CONFIG_USB_PRINTER) += printer.o
......
/* /*
* bluetooth.c Version 0.13 * bluetty.c Version 0.13
* *
* Copyright (c) 2000, 2001 Greg Kroah-Hartman <greg@kroah.com> * Copyright (c) 2000, 2001 Greg Kroah-Hartman <greg@kroah.com>
* Copyright (c) 2000 Mark Douglas Corner <mcorner@umich.edu> * Copyright (c) 2000 Mark Douglas Corner <mcorner@umich.edu>
* *
* USB Bluetooth driver, based on the Bluetooth Spec version 1.0B * USB Bluetooth TTY driver, based on the Bluetooth Spec version 1.0B
* *
* (2001/11/30) Version 0.13 gkh * (2001/11/30) Version 0.13 gkh
* - added locking patch from Masoodur Rahman <rmasoodu@in.ibm.com> * - added locking patch from Masoodur Rahman <rmasoodu@in.ibm.com>
...@@ -237,7 +237,7 @@ static struct usb_device_id usb_bluetooth_ids [] = { ...@@ -237,7 +237,7 @@ static struct usb_device_id usb_bluetooth_ids [] = {
MODULE_DEVICE_TABLE (usb, usb_bluetooth_ids); MODULE_DEVICE_TABLE (usb, usb_bluetooth_ids);
static struct usb_driver usb_bluetooth_driver = { static struct usb_driver usb_bluetooth_driver = {
name: "bluetooth", name: "bluetty",
probe: usb_bluetooth_probe, probe: usb_bluetooth_probe,
disconnect: usb_bluetooth_disconnect, disconnect: usb_bluetooth_disconnect,
id_table: usb_bluetooth_ids, id_table: usb_bluetooth_ids,
......
...@@ -597,33 +597,31 @@ static int proc_bulk(struct dev_state *ps, void *arg) ...@@ -597,33 +597,31 @@ static int proc_bulk(struct dev_state *ps, void *arg)
if (!usb_maxpacket(dev, pipe, !(bulk.ep & USB_DIR_IN))) if (!usb_maxpacket(dev, pipe, !(bulk.ep & USB_DIR_IN)))
return -EINVAL; return -EINVAL;
len1 = bulk.len; len1 = bulk.len;
if (len1 > PAGE_SIZE) if (!(tbuf = kmalloc(len1, GFP_KERNEL)))
return -EINVAL;
if (!(tbuf = (unsigned char *)__get_free_page(GFP_KERNEL)))
return -ENOMEM; return -ENOMEM;
tmo = (bulk.timeout * HZ + 999) / 1000; tmo = (bulk.timeout * HZ + 999) / 1000;
if (bulk.ep & 0x80) { if (bulk.ep & 0x80) {
if (len1 && !access_ok(VERIFY_WRITE, bulk.data, len1)) { if (len1 && !access_ok(VERIFY_WRITE, bulk.data, len1)) {
free_page((unsigned long)tbuf); kfree(tbuf);
return -EINVAL; return -EINVAL;
} }
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo); i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
if (!i && len2) { if (!i && len2) {
if (copy_to_user(bulk.data, tbuf, len2)) { if (copy_to_user(bulk.data, tbuf, len2)) {
free_page((unsigned long)tbuf); kfree(tbuf);
return -EFAULT; return -EFAULT;
} }
} }
} else { } else {
if (len1) { if (len1) {
if (copy_from_user(tbuf, bulk.data, len1)) { if (copy_from_user(tbuf, bulk.data, len1)) {
free_page((unsigned long)tbuf); kfree(tbuf);
return -EFAULT; return -EFAULT;
} }
} }
i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo); i = usb_bulk_msg(dev, pipe, tbuf, len1, &len2, tmo);
} }
free_page((unsigned long)tbuf); kfree(tbuf);
if (i < 0) { if (i < 0) {
printk(KERN_WARNING "usbfs: USBDEVFS_BULK failed dev %d ep 0x%x len %u ret %d\n", printk(KERN_WARNING "usbfs: USBDEVFS_BULK failed dev %d ep 0x%x len %u ret %d\n",
dev->devnum, bulk.ep, bulk.len, i); dev->devnum, bulk.ep, bulk.len, i);
...@@ -1059,6 +1057,8 @@ static int proc_ioctl (struct dev_state *ps, void *arg) ...@@ -1059,6 +1057,8 @@ static int proc_ioctl (struct dev_state *ps, void *arg)
int size; int size;
void *buf = 0; void *buf = 0;
int retval = 0; int retval = 0;
struct usb_interface *ifp = 0;
struct usb_driver *driver = 0;
/* get input parameters and alloc buffer */ /* get input parameters and alloc buffer */
if (copy_from_user(&ctrl, (void *) arg, sizeof (ctrl))) if (copy_from_user(&ctrl, (void *) arg, sizeof (ctrl)))
...@@ -1076,33 +1076,41 @@ static int proc_ioctl (struct dev_state *ps, void *arg) ...@@ -1076,33 +1076,41 @@ static int proc_ioctl (struct dev_state *ps, void *arg)
} }
} }
/* ioctl to device */ if (!ps->dev)
if (ctrl.ifno < 0) { retval = -ENODEV;
switch (ctrl.ioctl_code) { else if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
/* access/release token for issuing control messages retval = -EINVAL;
* ask a particular driver to bind/unbind, ... etc else switch (ctrl.ioctl_code) {
*/
} /* disconnect kernel driver from interface, leaving it unbound. */
retval = -ENOSYS; case USBDEVFS_DISCONNECT:
driver = ifp->driver;
/* ioctl to the driver which has claimed a given interface */ if (driver) {
} else { down (&driver->serialize);
struct usb_interface *ifp = 0; dbg ("disconnect '%s' from dev %d interface %d",
if (!ps->dev) driver->name, ps->dev->devnum, ctrl.ifno);
retval = -ENODEV; driver->disconnect (ps->dev, ifp->private_data);
else if (ctrl.ifno >= ps->dev->actconfig->bNumInterfaces) usb_driver_release_interface (driver, ifp);
up (&driver->serialize);
} else
retval = -EINVAL; retval = -EINVAL;
break;
/* let kernel drivers try to (re)bind to the interface */
case USBDEVFS_CONNECT:
usb_find_interface_driver_for_ifnum (ps->dev, ctrl.ifno);
break;
/* talk directly to the interface's driver */
default:
driver = ifp->driver;
if (driver == 0 || driver->ioctl == 0)
retval = -ENOSYS;
else { else {
if (!(ifp = usb_ifnum_to_if (ps->dev, ctrl.ifno)))
retval = -EINVAL;
else if (ifp->driver == 0 || ifp->driver->ioctl == 0)
retval = -ENOSYS;
}
if (retval == 0) {
if (ifp->driver->owner) if (ifp->driver->owner)
__MOD_INC_USE_COUNT(ifp->driver->owner); __MOD_INC_USE_COUNT(ifp->driver->owner);
/* ifno might usefully be passed ... */ /* ifno might usefully be passed ... */
retval = ifp->driver->ioctl (ps->dev, ctrl.ioctl_code, buf); retval = driver->ioctl (ps->dev, ctrl.ioctl_code, buf);
/* size = min_t(int, size, retval)? */ /* size = min_t(int, size, retval)? */
if (ifp->driver->owner) if (ifp->driver->owner)
__MOD_DEC_USE_COUNT(ifp->driver->owner); __MOD_DEC_USE_COUNT(ifp->driver->owner);
......
...@@ -181,6 +181,24 @@ extern int usb_hcd_pci_resume (struct pci_dev *dev); ...@@ -181,6 +181,24 @@ extern int usb_hcd_pci_resume (struct pci_dev *dev);
#endif /* CONFIG_PCI */ #endif /* CONFIG_PCI */
/* -------------------------------------------------------------------------- */
/* Enumeration is only for the hub driver, or HCD virtual root hubs */
extern struct usb_device *usb_alloc_dev(struct usb_device *parent,
struct usb_bus *);
extern void usb_free_dev(struct usb_device *);
extern int usb_new_device(struct usb_device *dev);
extern void usb_connect(struct usb_device *dev);
extern void usb_disconnect(struct usb_device **);
#ifndef _LINUX_HUB_H
/* exported to hub driver ONLY to support usb_reset_device () */
extern int usb_get_configuration(struct usb_device *dev);
extern void usb_set_maxpacket(struct usb_device *dev);
extern void usb_destroy_configuration(struct usb_device *dev);
extern int usb_set_address(struct usb_device *dev);
#endif /* _LINUX_HUB_H */
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include "hcd.h"
#include "hub.h" #include "hub.h"
/* Wakes up khubd */ /* Wakes up khubd */
......
...@@ -196,6 +196,28 @@ void usb_deregister(struct usb_driver *driver) ...@@ -196,6 +196,28 @@ void usb_deregister(struct usb_driver *driver)
usbfs_update_special(); usbfs_update_special();
} }
/**
* usb_ifnum_to_ifpos - convert the interface number to the interface position
* @dev: the device to use
* @ifnum: the interface number (bInterfaceNumber); not interface position
*
* This is used to convert the interface _number_ (as in
* interface.bInterfaceNumber) to the interface _position_ (as in
* dev->actconfig->interface + position). Note that the number is the same as
* the position for all interfaces _except_ devices with interfaces not
* sequentially numbered (e.g., 0, 2, 3, etc).
*/
int usb_ifnum_to_ifpos(struct usb_device *dev, unsigned ifnum)
{
int i;
for (i = 0; i < dev->actconfig->bNumInterfaces; i++)
if (dev->actconfig->interface[i].altsetting[0].bInterfaceNumber == ifnum)
return i;
return -EINVAL;
}
/** /**
* usb_ifnum_to_if - get the interface object with a given interface number * usb_ifnum_to_if - get the interface object with a given interface number
* @dev: the device whose current configuration is considered * @dev: the device whose current configuration is considered
...@@ -570,6 +592,24 @@ static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum) ...@@ -570,6 +592,24 @@ static int usb_find_interface_driver(struct usb_device *dev, unsigned ifnum)
return -1; return -1;
} }
/**
* usb_find_interface_driver_for_ifnum - finds a usb interface driver for the specified ifnum
* @dev: the device to use
* @ifnum: the interface number (bInterfaceNumber); not interface position!
*
* This converts a ifnum to ifpos via a call to usb_ifnum_to_ifpos and then
* calls usb_find_interface_driver() with the found ifpos. Note
* usb_find_interface_driver's ifnum parameter is actually interface position.
*/
int usb_find_interface_driver_for_ifnum(struct usb_device *dev, unsigned ifnum)
{
int ifpos = usb_ifnum_to_ifpos(dev, ifnum);
if (0 > ifpos)
return -EINVAL;
return usb_find_interface_driver(dev, ifpos);
}
#ifdef CONFIG_HOTPLUG #ifdef CONFIG_HOTPLUG
...@@ -789,50 +829,32 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus) ...@@ -789,50 +829,32 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, struct usb_bus *bus)
return dev; return dev;
} }
// usbcore-internal ... /**
// but usb_dec_dev_use() is #defined to this, and that's public!! * usb_free_dev - free a usb device structure (usbcore-internal)
// FIXME the public call should BUG() whenever count goes to zero, * @dev: device that's been disconnected
// the usbcore-internal one should do so _unless_ it does so... * Context: !in_interrupt ()
*
* Used by hub and virtual root hub drivers. The device is completely
* gone, everything is cleaned up, so it's time to get rid of these last
* records of this device.
*/
void usb_free_dev(struct usb_device *dev) void usb_free_dev(struct usb_device *dev)
{ {
if (atomic_dec_and_test(&dev->refcnt)) { if (in_interrupt ())
/* Normally only goes to zero in usb_disconnect(), from BUG ();
* khubd or from roothub shutdown (rmmod/apmd/... thread). if (!atomic_dec_and_test (&dev->refcnt)) {
* Abnormally, roothub init errors can happen, so HCDs /* MUST go to zero here, else someone's hanging on to
* call this directly. * a device that's supposed to have been cleaned up!!
*
* Otherwise this is a nasty device driver bug, often in
* disconnect processing.
*/ */
if (in_interrupt ()) BUG ();
BUG ();
dev->bus->op->deallocate(dev);
usb_destroy_configuration(dev);
usb_bus_put(dev->bus);
kfree(dev);
} }
}
/** dev->bus->op->deallocate (dev);
* usb_inc_dev_use - record another reference to a device usb_destroy_configuration (dev);
* @dev: the device being referenced usb_bus_put (dev->bus);
* kfree (dev);
* Each live reference to a device should be refcounted.
*
* Device drivers should normally record such references in their
* open() methods.
* Drivers should then release them, using usb_dec_dev_use(), in their
* close() methods.
*/
void usb_inc_dev_use(struct usb_device *dev)
{
atomic_inc(&dev->refcnt);
} }
/** /**
* usb_alloc_urb - creates a new urb for a USB driver to use * usb_alloc_urb - creates a new urb for a USB driver to use
* @iso_packets: number of iso packets for this urb * @iso_packets: number of iso packets for this urb
...@@ -2636,6 +2658,7 @@ module_exit(usb_exit); ...@@ -2636,6 +2658,7 @@ module_exit(usb_exit);
* into the kernel, and other device drivers are built as modules, * into the kernel, and other device drivers are built as modules,
* then these symbols need to be exported for the modules to use. * then these symbols need to be exported for the modules to use.
*/ */
EXPORT_SYMBOL(usb_ifnum_to_ifpos);
EXPORT_SYMBOL(usb_ifnum_to_if); EXPORT_SYMBOL(usb_ifnum_to_if);
EXPORT_SYMBOL(usb_epnum_to_ep_desc); EXPORT_SYMBOL(usb_epnum_to_ep_desc);
...@@ -2647,6 +2670,7 @@ EXPORT_SYMBOL(usb_alloc_dev); ...@@ -2647,6 +2670,7 @@ EXPORT_SYMBOL(usb_alloc_dev);
EXPORT_SYMBOL(usb_free_dev); EXPORT_SYMBOL(usb_free_dev);
EXPORT_SYMBOL(usb_inc_dev_use); EXPORT_SYMBOL(usb_inc_dev_use);
EXPORT_SYMBOL(usb_find_interface_driver_for_ifnum);
EXPORT_SYMBOL(usb_driver_claim_interface); EXPORT_SYMBOL(usb_driver_claim_interface);
EXPORT_SYMBOL(usb_interface_claimed); EXPORT_SYMBOL(usb_interface_claimed);
EXPORT_SYMBOL(usb_driver_release_interface); EXPORT_SYMBOL(usb_driver_release_interface);
......
...@@ -749,7 +749,7 @@ static void uhci_inc_fsbr(struct uhci *uhci, struct urb *urb) ...@@ -749,7 +749,7 @@ static void uhci_inc_fsbr(struct uhci *uhci, struct urb *urb)
if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) { if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) {
urbp->fsbr = 1; urbp->fsbr = 1;
if (!uhci->fsbr++) if (!uhci->fsbr++ && !uhci->fsbrtimeout)
uhci->skel_term_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH; uhci->skel_term_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH;
} }
...@@ -1631,8 +1631,7 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb) ...@@ -1631,8 +1631,7 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb)
if (urb->status != -EINPROGRESS) { if (urb->status != -EINPROGRESS) {
info("uhci_transfer_result: called for URB %p not in flight?", urb); info("uhci_transfer_result: called for URB %p not in flight?", urb);
spin_unlock_irqrestore(&urb->lock, flags); goto out;
return;
} }
switch (usb_pipetype(urb->pipe)) { switch (usb_pipetype(urb->pipe)) {
...@@ -1652,10 +1651,8 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb) ...@@ -1652,10 +1651,8 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb)
urbp->status = ret; urbp->status = ret;
if (ret == -EINPROGRESS) { if (ret == -EINPROGRESS)
spin_unlock_irqrestore(&urb->lock, flags); goto out;
return;
}
switch (usb_pipetype(urb->pipe)) { switch (usb_pipetype(urb->pipe)) {
case PIPE_CONTROL: case PIPE_CONTROL:
...@@ -1669,11 +1666,8 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb) ...@@ -1669,11 +1666,8 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb)
break; break;
case PIPE_INTERRUPT: case PIPE_INTERRUPT:
/* Interrupts are an exception */ /* Interrupts are an exception */
if (urb->interval) { if (urb->interval)
uhci_add_complete(urb); goto out_complete;
spin_unlock_irqrestore(&urb->lock, flags);
return; /* <-- note return */
}
/* Release bandwidth for Interrupt or Isoc. transfers */ /* Release bandwidth for Interrupt or Isoc. transfers */
/* Spinlock needed ? */ /* Spinlock needed ? */
...@@ -1689,8 +1683,10 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb) ...@@ -1689,8 +1683,10 @@ static void uhci_transfer_result(struct uhci *uhci, struct urb *urb)
/* Remove it from uhci->urb_list */ /* Remove it from uhci->urb_list */
list_del_init(&urb->urb_list); list_del_init(&urb->urb_list);
out_complete:
uhci_add_complete(urb); uhci_add_complete(urb);
out:
spin_unlock_irqrestore(&urb->lock, flags); spin_unlock_irqrestore(&urb->lock, flags);
} }
...@@ -1820,6 +1816,9 @@ static int uhci_unlink_urb(struct urb *urb) ...@@ -1820,6 +1816,9 @@ static int uhci_unlink_urb(struct urb *urb)
} else { } else {
urb->status = -ENOENT; urb->status = -ENOENT;
spin_unlock(&urb->lock);
spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
if (in_interrupt()) { /* wait at least 1 frame */ if (in_interrupt()) { /* wait at least 1 frame */
static int errorcount = 10; static int errorcount = 10;
...@@ -1829,9 +1828,6 @@ static int uhci_unlink_urb(struct urb *urb) ...@@ -1829,9 +1828,6 @@ static int uhci_unlink_urb(struct urb *urb)
} else } else
schedule_timeout(1+1*HZ/1000); schedule_timeout(1+1*HZ/1000);
spin_unlock(&urb->lock);
spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
uhci_call_completion(urb); uhci_call_completion(urb);
} }
} }
...@@ -1846,10 +1842,6 @@ static int uhci_fsbr_timeout(struct uhci *uhci, struct urb *urb) ...@@ -1846,10 +1842,6 @@ static int uhci_fsbr_timeout(struct uhci *uhci, struct urb *urb)
uhci_dec_fsbr(uhci, urb); uhci_dec_fsbr(uhci, urb);
/* There is a race with updating IOC in here, but it's not worth */
/* trying to fix since this is merely an optimization. The only */
/* time we'd lose is if the status of the packet got updated */
/* and we'd be turning on FSBR next frame anyway, so it's a wash */
urbp->fsbr_timeout = 1; urbp->fsbr_timeout = 1;
head = &urbp->td_list; head = &urbp->td_list;
...@@ -2013,23 +2005,23 @@ static void rh_int_timer_do(unsigned long ptr) ...@@ -2013,23 +2005,23 @@ static void rh_int_timer_do(unsigned long ptr)
tmp = head->next; tmp = head->next;
while (tmp != head) { while (tmp != head) {
struct urb *u = list_entry(tmp, struct urb, urb_list); struct urb *u = list_entry(tmp, struct urb, urb_list);
struct urb_priv *urbp = (struct urb_priv *)u->hcpriv; struct urb_priv *up = (struct urb_priv *)u->hcpriv;
tmp = tmp->next; tmp = tmp->next;
spin_lock(&urb->lock); spin_lock(&u->lock);
/* Check if the FSBR timed out */ /* Check if the FSBR timed out */
if (urbp->fsbr && !urbp->fsbr_timeout && time_after_eq(jiffies, urbp->fsbrtime + IDLE_TIMEOUT)) if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies, up->fsbrtime + IDLE_TIMEOUT))
uhci_fsbr_timeout(uhci, u); uhci_fsbr_timeout(uhci, u);
/* Check if the URB timed out */ /* Check if the URB timed out */
if (u->timeout && time_after_eq(jiffies, urbp->inserttime + u->timeout)) { if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout)) {
list_del(&u->urb_list); list_del(&u->urb_list);
list_add_tail(&u->urb_list, &list); list_add_tail(&u->urb_list, &list);
} }
spin_unlock(&urb->lock); spin_unlock(&u->lock);
} }
spin_unlock_irqrestore(&uhci->urb_list_lock, flags); spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
...@@ -2202,12 +2194,12 @@ static int rh_submit_urb(struct urb *urb) ...@@ -2202,12 +2194,12 @@ static int rh_submit_urb(struct urb *urb)
OK(0); OK(0);
case RH_PORT_RESET: case RH_PORT_RESET:
SET_RH_PORTSTAT(USBPORTSC_PR); SET_RH_PORTSTAT(USBPORTSC_PR);
wait_ms(50); /* USB v1.1 7.1.7.3 */ mdelay(50); /* USB v1.1 7.1.7.3 */
uhci->rh.c_p_r[wIndex - 1] = 1; uhci->rh.c_p_r[wIndex - 1] = 1;
CLR_RH_PORTSTAT(USBPORTSC_PR); CLR_RH_PORTSTAT(USBPORTSC_PR);
udelay(10); udelay(10);
SET_RH_PORTSTAT(USBPORTSC_PE); SET_RH_PORTSTAT(USBPORTSC_PE);
wait_ms(10); mdelay(10);
SET_RH_PORTSTAT(0xa); SET_RH_PORTSTAT(0xa);
OK(0); OK(0);
case RH_PORT_POWER: case RH_PORT_POWER:
...@@ -2724,6 +2716,7 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io ...@@ -2724,6 +2716,7 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io
} }
uhci->dev = dev; uhci->dev = dev;
uhci->irq = dev->irq;
uhci->io_addr = io_addr; uhci->io_addr = io_addr;
uhci->io_size = io_size; uhci->io_size = io_size;
pci_set_drvdata(dev, uhci); pci_set_drvdata(dev, uhci);
...@@ -2750,6 +2743,11 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io ...@@ -2750,6 +2743,11 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io
/* or broken setup */ /* or broken setup */
reset_hc(uhci); reset_hc(uhci);
uhci->fsbr = 0;
uhci->fsbrtimeout = 0;
uhci->is_suspended = 0;
spin_lock_init(&uhci->qh_remove_list_lock); spin_lock_init(&uhci->qh_remove_list_lock);
INIT_LIST_HEAD(&uhci->qh_remove_list); INIT_LIST_HEAD(&uhci->qh_remove_list);
...@@ -2932,8 +2930,6 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io ...@@ -2932,8 +2930,6 @@ static int alloc_uhci(struct pci_dev *dev, unsigned int io_addr, unsigned int io
if (request_irq(dev->irq, uhci_interrupt, SA_SHIRQ, "usb-uhci", uhci)) if (request_irq(dev->irq, uhci_interrupt, SA_SHIRQ, "usb-uhci", uhci))
goto err_request_irq; goto err_request_irq;
uhci->irq = dev->irq;
/* disable legacy emulation */ /* disable legacy emulation */
pci_write_config_word(uhci->dev, USBLEGSUP, USBLEGSUP_DEFAULT); pci_write_config_word(uhci->dev, USBLEGSUP, USBLEGSUP_DEFAULT);
......
...@@ -287,17 +287,17 @@ struct virt_root_hub { ...@@ -287,17 +287,17 @@ struct virt_root_hub {
struct uhci { struct uhci {
struct pci_dev *dev; struct pci_dev *dev;
#ifdef CONFIG_PROC_FS
/* procfs */ /* procfs */
int num; int num;
struct proc_dir_entry *proc_entry; struct proc_dir_entry *proc_entry;
#endif
/* Grabbed from PCI */ /* Grabbed from PCI */
int irq; int irq;
unsigned int io_addr; unsigned int io_addr;
unsigned int io_size; unsigned int io_size;
struct list_head uhci_list;
struct pci_pool *qh_pool; struct pci_pool *qh_pool;
struct pci_pool *td_pool; struct pci_pool *td_pool;
......
...@@ -11,7 +11,7 @@ static __inline__ void uhci_wait_ms(unsigned int ms) ...@@ -11,7 +11,7 @@ static __inline__ void uhci_wait_ms(unsigned int ms)
{ {
if(!in_interrupt()) if(!in_interrupt())
{ {
current->state = TASK_UNINTERRUPTIBLE; set_current_state(TASK_UNINTERRUPTIBLE);
schedule_timeout(1 + ms * HZ / 1000); schedule_timeout(1 + ms * HZ / 1000);
} }
else else
......
CONFIG_USB_DC2XX
Say Y here if you want to connect this type of still camera to your
computer's USB port. See <file:Documentation/usb/dc2xx.txt> for
more information; some non-Kodak cameras may also work with this
driver, given application support (such as <http://www.gphoto.org/>).
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called dc2xx.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_MDC800
Say Y here if you want to connect this type of still camera to
your computer's USB port. This driver can be used with gphoto 0.4.3
and higher (look at <http://www.gphoto.org/>).
To use it create a device node with "mknod /dev/mustek c 180 32" and
configure it in your software.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called mdc800.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_HPUSBSCSI
Say Y here if you want support for the HP 53xx series of scanners
and the Minolta Scan Dual. This driver is experimental.
The scanner will be accessible as a SCSI device.
This can be compiled as a module, called hpusbscsi.o.
CONFIG_USB_MICROTEK
Say Y here if you want support for the Microtek X6USB and
possibly the Phantom 336CX, Phantom C6 and ScanMaker V6U(S)L.
Support for anything but the X6 is experimental.
Please report failures and successes.
The scanner will appear as a scsi generic device to the rest
of the system. Scsi support is required.
This driver can be compiled as a module, called microtek.o.
CONFIG_USB_SCANNER
Say Y here if you want to connect a USB scanner to your computer's
USB port. Please read <file:Documentation/usb/scanner.txt> and
<file:Documentation/usb/scanner-hp-sane.txt> for more information.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called scanner.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_HID
Say Y here if you want full HID support to connect keyboards,
mice, joysticks, graphic tablets, or any other HID based devices
to your computer via USB. You also need to select HID Input layer
support (below) if you want to use keyboards, mice, joysticks and
the like.
You can't use this driver and the HIDBP (Boot Protocol) keyboard
and mouse drivers at the same time. More information is available:
<file:Documentation/input/input.txt>.
If unsure, say Y.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called hid.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_HIDINPUT
Say Y here if you want to use a USB keyboard, mouse or joystick,
or any other HID input device. You also need Input layer support,
(CONFIG_INPUT) which you select under "Input core support".
If unsure, say Y.
CONFIG_USB_HIDDEV
Say Y here if you want to support HID devices (from the USB
specification standpoint) that aren't strictly user interface
devices, like monitor controls and Uninterruptable Power Supplies.
This module supports these devices separately using a separate
event interface on /dev/usb/hiddevX (char 180:96 to 180:111).
This driver requires CONFIG_USB_HID.
If unsure, say Y.
CONFIG_USB_KBD
Say Y here only if you are absolutely sure that you don't want
to use the generic HID driver for your USB keyboard and prefer
to use the keyboard in its limited Boot Protocol mode instead.
This is almost certainly not what you want.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called usbkbd.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
If even remotely unsure, say N.
CONFIG_USB_MOUSE
Say Y here only if you are absolutely sure that you don't want
to use the generic HID driver for your USB keyboard and prefer
to use the keyboard in its limited Boot Protocol mode instead.
This is almost certainly not what you want.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called usbmouse.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
If even remotely unsure, say N.
CONFIG_USB_WACOM
Say Y here if you want to use the USB version of the Wacom Intuos
or Graphire tablet. Make sure to say Y to "Mouse support"
(CONFIG_INPUT_MOUSEDEV) and/or "Event interface support"
(CONFIG_INPUT_EVDEV) as well.
This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called wacom.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_DABUSB
A Digital Audio Broadcasting (DAB) Receiver for USB and Linux
brought to you by the DAB-Team (<http://dab.in.tum.de/>). This
driver can be taken as an example for URB-based bulk, control, and
isochronous transactions. URB's are explained in
<file:Documentation/usb/URB.txt>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called dabusb.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_DSBR
Say Y here if you want to connect this type of radio to your
computer's USB port. Note that the audio is not digital, and
you must connect the line out connector to a sound card or a
set of speakers.
This driver uses the Video For Linux API. You must enable
(Y or M in config) Video For Linux (under Character Devices)
to use this driver. Information on this API and pointers to
"v4l" programs may be found on the WWW at
<http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called dsbr100.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_IBMCAM
Say Y here if you want to connect a IBM "C-It" camera, also known as
"Xirlink PC Camera" to your computer's USB port. For more
information, read <file:Documentation/usb/ibmcam.txt>.
This driver uses the Video For Linux API. You must enable
(Y or M in config) Video For Linux (under Character Devices)
to use this driver. Information on this API and pointers to
"v4l" programs may be found on the WWW at
<http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called ibmcam.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. This
camera has several configuration options which can be specified when
you load the module. Read <file:Documentation/usb/ibmcam.txt> to
learn more.
CONFIG_USB_KONICAWC
Say Y here if you want support for webcams based on a Konica
chipset. This is known to work with the Intel YC76 webcam.
This driver uses the Video For Linux API. You must enable
(Y or M in config) Video For Linux (under Character Devices)
to use this driver. Information on this API and pointers to
"v4l" programs may be found on the WWW at
<http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called konicawc.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_OV511
Say Y here if you want to connect this type of camera to your
computer's USB port. See <file:Documentation/usb/ov511.txt> for more
information and for a list of supported cameras.
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Character Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called ov511.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_PWC
Say Y or M here if you want to use one of these Philips USB webcams:
PCA645, PCA646, PCVC675, PCVC680, PCVC690, PCVC730, PCVC740, or
the Askey VC010. The PCA635, PCVC665 and PCVC720 are not supported
by this driver and never will be.
This driver has an optional plugin, which is distributed as a binary
module only. It contains code that allow you to use higher
resolutions and framerates but may not be distributed as source.
But even without this plugin you can these cams for most
applications.
See <file:Documentation/usb/philips.txt> for more information and
installation instructions.
The built-in microphone is enabled by selecting USB Audio support.
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Character Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called pwc.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_SE401
Say Y here if you want to connect this type of camera to your
computer's USB port. See <file:Documentation/usb/se401.txt> for more
information and for a list of supported cameras.
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Multimedia Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called se401.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_STV680
Say Y here if you want to connect this type of camera to your
computer's USB port. This includes the Pencam line of cameras.
See <file:Documentation/usb/stv680.txt> for more information and for
a list of supported cameras.
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Multimedia Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called stv680.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_VICAM
Say Y here if you have 3com homeconnect camera (vicam).
This driver uses the Video For Linux API. You must say Y or M to
"Video For Linux" (under Multimedia Devices) to use this driver.
Information on this API and pointers to "v4l" programs may be found
on the WWW at <http://roadrunner.swansea.uk.linux.org/v4l.shtml>.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called vicam.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_AUERSWALD
Say Y here if you want to connect an Auerswald USB ISDN Device
to your computer's USB port.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called auerswald.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_EMI26
This driver loads firmware to Emagic EMI 2|6 low latency USB
Audio interface.
After firmware load the device is handled with standard linux
USB Audio driver.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called audio.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_RIO500
Say Y here if you want to connect a USB Rio500 mp3 player to your
computer's USB port. Please read <file:Documentation/usb/rio.txt>
for more information.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called rio500.o. If you want to compile it as
a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_TIGL
If you own a Texas Instruments graphing calculator and use a
TI-GRAPH LINK USB cable (aka SilverLink), then you might be
interested in this driver.
If you enable this driver, you will be able to communicate with
your calculator through a set of device nodes under /dev.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called tiglusb.o. If you want to compile it as a
module, say M here and read Documentation/modules.txt.
If you don't know what the SilverLink cable is or what a Texas
Instruments graphing calculator is, then you probably don't need this
driver.
If unsure, say N.
CONFIG_USB_USS720
This driver is for USB parallel port adapters that use the Lucent
Technologies USS-720 chip. These cables are plugged into your USB
port and provide USB compatibility to peripherals designed with
parallel port interfaces.
The chip has two modes: automatic mode and manual mode. In automatic
mode, it looks to the computer like a standard USB printer. Only
printers may be connected to the USS-720 in this mode. The generic
USB printer driver ("USB Printer support", above) may be used in
that mode, and you can say N here if you want to use the chip only
in this mode.
Manual mode is not limited to printers, any parallel port
device should work. This driver utilizes manual mode.
Note however that some operations are three orders of magnitude
slower than on a PCI/ISA Parallel Port, so timing critical
applications might not work.
Say Y here if you own an USS-720 USB->Parport cable and intend to
connect anything other than a printer to it.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called uss720.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_CATC
Say Y if you want to use one of the following 10Mbps USB Ethernet
device based on the EL1210A chip. Supported devices are:
Belkin F5U011
Belkin F5U111
CATC NetMate
CATC NetMate II
smartBridges smartNIC
This driver makes the adapter appear as a normal Ethernet interface,
typically on eth0, if it is the only ethernet device, or perhaps on
eth1, if you have a PCI or ISA ethernet card installed.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called catc.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_CDCETHER
This driver supports devices conforming to the Communication Device
Class Ethernet Control Model. This is used in some cable modems.
For more details on the specification, get the Communication Device
Class specification from <http://www.usb.org/>.
This driver should work with the following devices:
* Ericsson PipeRider (all variants)
* Motorola (DM100 and SB4100)
* Broadcom Cable Modem (reference design)
* Toshiba PCX1100U and possibly other cable modems
The device creates a network device (ethX, where X depends on what
other networking devices you have in use), as for a normal PCI
or ISA based ethernet network card.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called cdc-ether.o. If you want to compile it
as a module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_KAWETH
Say Y here if you want to use one of the following 10Mbps only
USB Ethernet adapters based on the KLSI KL5KUSB101B chipset:
3Com 3C19250
ADS USB-10BT
ATEN USB Ethernet
ASANTE USB To Ethernet Adapter
AOX Endpoints USB Ethernet
Correga K.K.
D-Link DSB-650C and DU-E10
Entrega / Portgear E45
I-O DATA USB-ET/T
Jaton USB Ethernet Device Adapter
Kingston Technology USB Ethernet Adapter
Linksys USB10T
Mobility USB-Ethernet Adapter
NetGear EA-101
Peracom Enet and Enet2
Portsmith Express Ethernet Adapter
Shark Pocket Adapter
SMC 2202USB
Sony Vaio port extender
This driver is likely to work with most 10Mbps only USB Ethernet
adapters, including some "no brand" devices. It does NOT work on
SmartBridges smartNIC or on Belkin F5U111 devices - you should use
the CATC NetMate driver for those. If you are not sure which one
you need, select both, and the correct one should be selected for
you.
This driver makes the adapter appear as a normal Ethernet interface,
typically on eth0, if it is the only ethernet device, or perhaps on
eth1, if you have a PCI or ISA ethernet card installed.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called kaweth.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_PEGASUS
Say Y here if you know you have Pegasus or Pegasus-II based adapter.
If in doubt then look at linux/drivers/usb/pegasus.h for the complete
list of supported devices.
If your particular adapter is not in the list and you are _sure_ it
is Pegasus or Pegasus II based then send me (petkan@users.sourceforge.net)
vendor and device IDs.
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called pegasus.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_RTL8150
Say Y here if you have RTL8150 based usb-ethernet adapter.
Send me (petkan@users.sourceforge.net) any comments you may have.
You can also check for updates at http://pegasus2.sourceforge.net/
This code is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called rtl8150.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_USB_USBNET
This driver supports network links over USB with USB "Network"
or "data transfer" cables, often used to network laptops to PCs.
Such cables have chips from suppliers such as Belkin/eTEK, GeneSys
(GeneLink), NetChip and Prolific. Intelligent USB devices could also
use this approach to provide Internet access, using standard USB
cabling. You can find these chips also on some motherboards with
USB PC2PC support.
These links will have names like "usb0", "usb1", etc. They act
like two-node Ethernets, so you can use 802.1d Ethernet Bridging
(CONFIG_BRIDGE) to simplify your network routing.
This code is also available as a kernel module (code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called usbnet.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
/* /*
* USB Host-to-Host Links * USB Host-to-Host Links
* Copyright (C) 2000-2001 by David Brownell <dbrownell@users.sourceforge.net> * Copyright (C) 2000-2002 by David Brownell <dbrownell@users.sourceforge.net>
*/ */
/* /*
...@@ -62,6 +62,7 @@ ...@@ -62,6 +62,7 @@
* 18-dec-2000 (db) tx watchdog, "net1080" renaming to "usbnet", device_info * 18-dec-2000 (db) tx watchdog, "net1080" renaming to "usbnet", device_info
* and prolific support, isolate net1080-specific bits, cleanup. * and prolific support, isolate net1080-specific bits, cleanup.
* fix unlink_urbs oops in D3 PM resume code path. * fix unlink_urbs oops in D3 PM resume code path.
*
* 02-feb-2001 (db) fix tx skb sharing, packet length, match_flags, ... * 02-feb-2001 (db) fix tx skb sharing, packet length, match_flags, ...
* 08-feb-2001 stubbed in "linuxdev", maybe the SA-1100 folk can use it; * 08-feb-2001 stubbed in "linuxdev", maybe the SA-1100 folk can use it;
* AnchorChips 2720 support (from spec) for testing; * AnchorChips 2720 support (from spec) for testing;
...@@ -83,6 +84,11 @@ ...@@ -83,6 +84,11 @@
* tie mostly to (sub)driver info. Workaround some PL-2302 * tie mostly to (sub)driver info. Workaround some PL-2302
* chips that seem to reject SET_INTERFACE requests. * chips that seem to reject SET_INTERFACE requests.
* *
* 06-apr-2002 Added ethtool support, based on a patch from Brad Hards.
* Level of diagnostics is more configurable; they use device
* location (usb_device->devpath) instead of address (2.5).
* For tx_fixup, memflags can't be NOIO.
*
*-------------------------------------------------------------------------*/ *-------------------------------------------------------------------------*/
#include <linux/config.h> #include <linux/config.h>
...@@ -93,6 +99,8 @@ ...@@ -93,6 +99,8 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/ethtool.h>
#include <asm/uaccess.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
// #define DEBUG // error path messages, extra info // #define DEBUG // error path messages, extra info
...@@ -113,6 +121,8 @@ ...@@ -113,6 +121,8 @@
#define CONFIG_USB_PL2301 #define CONFIG_USB_PL2301
#define DRIVER_VERSION "06-Apr-2002"
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
...@@ -164,6 +174,7 @@ struct usbnet { ...@@ -164,6 +174,7 @@ struct usbnet {
// protocol/interface state // protocol/interface state
struct net_device net; struct net_device net;
struct net_device_stats stats; struct net_device_stats stats;
int msg_level;
#ifdef CONFIG_USB_NET1080 #ifdef CONFIG_USB_NET1080
u16 packet_id; u16 packet_id;
...@@ -224,6 +235,13 @@ struct skb_data { // skb->cb is one of these ...@@ -224,6 +235,13 @@ struct skb_data { // skb->cb is one of these
size_t length; size_t length;
}; };
static const char driver_name [] = "usbnet";
/* use ethtool to change the level for any given device */
static int msg_level = 1;
MODULE_PARM (msg_level, "i");
MODULE_PARM_DESC (msg_level, "Initial message level (default = 1)");
#define mutex_lock(x) down(x) #define mutex_lock(x) down(x)
#define mutex_unlock(x) up(x) #define mutex_unlock(x) up(x)
...@@ -241,7 +259,9 @@ struct skb_data { // skb->cb is one of these ...@@ -241,7 +259,9 @@ struct skb_data { // skb->cb is one of these
#endif #endif
#define devinfo(usbnet, fmt, arg...) \ #define devinfo(usbnet, fmt, arg...) \
printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net.name, ## arg) do { if ((usbnet)->msg_level >= 1) \
printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net.name, ## arg); \
} while (0)
#ifdef CONFIG_USB_AN2720 #ifdef CONFIG_USB_AN2720
...@@ -948,10 +968,11 @@ static int net1080_reset (struct usbnet *dev) ...@@ -948,10 +968,11 @@ static int net1080_reset (struct usbnet *dev)
MK_TTL (NC_READ_TTL_MS, TTL_OTHER (ttl)) ); MK_TTL (NC_READ_TTL_MS, TTL_OTHER (ttl)) );
dbg ("%s: assigned TTL, %d ms", dev->net.name, NC_READ_TTL_MS); dbg ("%s: assigned TTL, %d ms", dev->net.name, NC_READ_TTL_MS);
devdbg (dev, "port %c, peer %sconnected", if (dev->msg_level >= 2)
(status & STATUS_PORT_A) ? 'A' : 'B', devinfo (dev, "port %c, peer %sconnected",
(status & STATUS_CONN_OTHER) ? "" : "dis" (status & STATUS_PORT_A) ? 'A' : 'B',
); (status & STATUS_CONN_OTHER) ? "" : "dis"
);
retval = 0; retval = 0;
done: done:
...@@ -1441,10 +1462,11 @@ static int usbnet_stop (struct net_device *net) ...@@ -1441,10 +1462,11 @@ static int usbnet_stop (struct net_device *net)
mutex_lock (&dev->mutex); mutex_lock (&dev->mutex);
netif_stop_queue (net); netif_stop_queue (net);
devdbg (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld", if (dev->msg_level >= 2)
dev->stats.rx_packets, dev->stats.tx_packets, devinfo (dev, "stop stats: rx/tx %ld/%ld, errs %ld/%ld",
dev->stats.rx_errors, dev->stats.tx_errors dev->stats.rx_packets, dev->stats.tx_packets,
); dev->stats.rx_errors, dev->stats.tx_errors
);
// ensure there are no more active urbs // ensure there are no more active urbs
add_wait_queue (&unlink_wakeup, &wait); add_wait_queue (&unlink_wakeup, &wait);
...@@ -1482,9 +1504,10 @@ static int usbnet_open (struct net_device *net) ...@@ -1482,9 +1504,10 @@ static int usbnet_open (struct net_device *net)
// put into "known safe" state // put into "known safe" state
if (info->reset && (retval = info->reset (dev)) < 0) { if (info->reset && (retval = info->reset (dev)) < 0) {
devinfo (dev, "open reset fail (%d) usbnet %03d/%03d, %s", devinfo (dev, "open reset fail (%d) usbnet bus%d%s, %s",
retval, retval,
dev->udev->bus->busnum, dev->udev->devnum, // FIXME busnum is unstable
dev->udev->bus->busnum, dev->udev->devpath,
info->description); info->description);
goto done; goto done;
} }
...@@ -1496,14 +1519,16 @@ static int usbnet_open (struct net_device *net) ...@@ -1496,14 +1519,16 @@ static int usbnet_open (struct net_device *net)
} }
netif_start_queue (net); netif_start_queue (net);
devdbg (dev, "open: enable queueing (rx %d, tx %d) mtu %d %s framing", if (dev->msg_level >= 2)
RX_QLEN, TX_QLEN, dev->net.mtu, devinfo (dev, "open: enable queueing "
(info->flags & (FLAG_FRAMING_NC | FLAG_FRAMING_GL)) "(rx %d, tx %d) mtu %d %s framing",
? ((info->flags & FLAG_FRAMING_NC) RX_QLEN, TX_QLEN, dev->net.mtu,
? "NetChip" (info->flags & (FLAG_FRAMING_NC | FLAG_FRAMING_GL))
: "GeneSys") ? ((info->flags & FLAG_FRAMING_NC)
: "raw" ? "NetChip"
); : "GeneSys")
: "raw"
);
// delay posting reads until we're fully open // delay posting reads until we're fully open
tasklet_schedule (&dev->bh); tasklet_schedule (&dev->bh);
...@@ -1514,6 +1539,80 @@ static int usbnet_open (struct net_device *net) ...@@ -1514,6 +1539,80 @@ static int usbnet_open (struct net_device *net)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static int usbnet_ethtool_ioctl (struct net_device *net, void *useraddr)
{
struct usbnet *dev = (struct usbnet *) net->priv;
u32 cmd;
if (get_user (cmd, (u32 *)useraddr))
return -EFAULT;
switch (cmd) {
case ETHTOOL_GDRVINFO: { /* get driver info */
struct ethtool_drvinfo info;
memset (&info, 0, sizeof info);
info.cmd = ETHTOOL_GDRVINFO;
strncpy (info.driver, driver_name, sizeof info.driver);
strncpy (info.version, DRIVER_VERSION, sizeof info.version);
strncpy (info.fw_version, dev->driver_info->description,
sizeof info.fw_version);
snprintf (info.bus_info, sizeof info.bus_info, "USB bus%d%s",
/* FIXME busnums are bogus/unstable IDs */
dev->udev->bus->busnum, dev->udev->devpath);
if (copy_to_user (useraddr, &info, sizeof (info)))
return -EFAULT;
return 0;
}
case ETHTOOL_GLINK: /* get link status */
if (dev->driver_info->check_connect) {
struct ethtool_value edata = { ETHTOOL_GLINK };
edata.data = dev->driver_info->check_connect (dev);
if (copy_to_user (useraddr, &edata, sizeof (edata)))
return -EFAULT;
return 0;
}
break;
case ETHTOOL_GMSGLVL: { /* get message-level */
struct ethtool_value edata = {ETHTOOL_GMSGLVL};
edata.data = dev->msg_level;
if (copy_to_user (useraddr, &edata, sizeof (edata)))
return -EFAULT;
return 0;
}
case ETHTOOL_SMSGLVL: { /* set message-level */
struct ethtool_value edata;
if (copy_from_user (&edata, useraddr, sizeof (edata)))
return -EFAULT;
dev->msg_level = edata.data;
return 0;
}
/* could also map RINGPARAM to RX/TX QLEN */
}
/* Note that the ethtool user space code requires EOPNOTSUPP */
return -EOPNOTSUPP;
}
static int usbnet_ioctl (struct net_device *net, struct ifreq *rq, int cmd)
{
switch (cmd) {
case SIOCETHTOOL:
return usbnet_ethtool_ioctl (net, (void *)rq->ifr_data);
default:
return -EOPNOTSUPP;
}
}
/*-------------------------------------------------------------------------*/
/* usb_clear_halt cannot be called in interrupt context */ /* usb_clear_halt cannot be called in interrupt context */
static void static void
...@@ -1576,12 +1675,10 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net) ...@@ -1576,12 +1675,10 @@ static int usbnet_start_xmit (struct sk_buff *skb, struct net_device *net)
struct nc_trailer *trailer = 0; struct nc_trailer *trailer = 0;
#endif /* CONFIG_USB_NET1080 */ #endif /* CONFIG_USB_NET1080 */
flags = in_interrupt () ? GFP_ATOMIC : GFP_NOIO; /* might be used for nfs */
// some devices want funky USB-level framing, for // some devices want funky USB-level framing, for
// win32 driver (usually) and/or hardware quirks // win32 driver (usually) and/or hardware quirks
if (info->tx_fixup) { if (info->tx_fixup) {
skb = info->tx_fixup (dev, skb, flags); skb = info->tx_fixup (dev, skb, GFP_ATOMIC);
if (!skb) { if (!skb) {
dbg ("can't tx_fixup skb"); dbg ("can't tx_fixup skb");
goto drop; goto drop;
...@@ -1750,8 +1847,9 @@ static void usbnet_disconnect (struct usb_device *udev, void *ptr) ...@@ -1750,8 +1847,9 @@ static void usbnet_disconnect (struct usb_device *udev, void *ptr)
{ {
struct usbnet *dev = (struct usbnet *) ptr; struct usbnet *dev = (struct usbnet *) ptr;
devinfo (dev, "unregister usbnet %03d/%03d, %s", devinfo (dev, "unregister usbnet bus%d%s, %s",
udev->bus->busnum, udev->devnum, // FIXME busnum is unstable
udev->bus->busnum, udev->devpath,
dev->driver_info->description); dev->driver_info->description);
unregister_netdev (&dev->net); unregister_netdev (&dev->net);
...@@ -1811,6 +1909,7 @@ usbnet_probe (struct usb_device *udev, unsigned ifnum, ...@@ -1811,6 +1909,7 @@ usbnet_probe (struct usb_device *udev, unsigned ifnum,
usb_inc_dev_use (udev); usb_inc_dev_use (udev);
dev->udev = udev; dev->udev = udev;
dev->driver_info = info; dev->driver_info = info;
dev->msg_level = msg_level;
INIT_LIST_HEAD (&dev->dev_list); INIT_LIST_HEAD (&dev->dev_list);
skb_queue_head_init (&dev->rxq); skb_queue_head_init (&dev->rxq);
skb_queue_head_init (&dev->txq); skb_queue_head_init (&dev->txq);
...@@ -1836,10 +1935,12 @@ usbnet_probe (struct usb_device *udev, unsigned ifnum, ...@@ -1836,10 +1935,12 @@ usbnet_probe (struct usb_device *udev, unsigned ifnum,
net->stop = usbnet_stop; net->stop = usbnet_stop;
net->watchdog_timeo = TX_TIMEOUT_JIFFIES; net->watchdog_timeo = TX_TIMEOUT_JIFFIES;
net->tx_timeout = usbnet_tx_timeout; net->tx_timeout = usbnet_tx_timeout;
net->do_ioctl = usbnet_ioctl;
register_netdev (&dev->net); register_netdev (&dev->net);
devinfo (dev, "register usbnet %03d/%03d, %s", devinfo (dev, "register usbnet bus%d%s, %s",
udev->bus->busnum, udev->devnum, // FIXME busnum is unstable
udev->bus->busnum, udev->devpath,
dev->driver_info->description); dev->driver_info->description);
// ok, it's ready to go. // ok, it's ready to go.
...@@ -1936,7 +2037,7 @@ static const struct usb_device_id products [] = { ...@@ -1936,7 +2037,7 @@ static const struct usb_device_id products [] = {
MODULE_DEVICE_TABLE (usb, products); MODULE_DEVICE_TABLE (usb, products);
static struct usb_driver usbnet_driver = { static struct usb_driver usbnet_driver = {
name: "usbnet", name: driver_name,
id_table: products, id_table: products,
probe: usbnet_probe, probe: usbnet_probe,
disconnect: usbnet_disconnect, disconnect: usbnet_disconnect,
......
#ifndef _ASM_GENERIC_PERCPU_H_
#define _ASM_GENERIC_PERCPU_H_
#define __GENERIC_PER_CPU
#include <linux/compiler.h>
extern unsigned long __per_cpu_offset[NR_CPUS];
/* var is in discarded region: offset to particular copy we want */
#define per_cpu(var, cpu) (*RELOC_HIDE(&var, __per_cpu_offset[cpu]))
#define this_cpu(var) per_cpu(var, smp_processor_id())
#endif /* _ASM_GENERIC_PERCPU_H_ */
...@@ -194,7 +194,7 @@ static void __init check_config(void) ...@@ -194,7 +194,7 @@ static void __init check_config(void)
*/ */
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_GOOD_APIC) #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_GOOD_APIC)
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL
&& test_bit(X86_FEATURE_APIC, &boot_cpu_data.x86_capability) && test_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability)
&& boot_cpu_data.x86 == 5 && boot_cpu_data.x86 == 5
&& boot_cpu_data.x86_model == 2 && boot_cpu_data.x86_model == 2
&& (boot_cpu_data.x86_mask < 6 || boot_cpu_data.x86_mask == 11)) && (boot_cpu_data.x86_mask < 6 || boot_cpu_data.x86_mask == 11))
......
#ifndef __ARCH_I386_PERCPU__
#define __ARCH_I386_PERCPU__
#include <asm-generic/percpu.h>
#endif /* __ARCH_I386_PERCPU__ */
...@@ -40,7 +40,7 @@ struct cpuinfo_x86 { ...@@ -40,7 +40,7 @@ struct cpuinfo_x86 {
char hard_math; char hard_math;
char rfu; char rfu;
int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */ int cpuid_level; /* Maximum supported CPUID level, -1=no CPUID */
__u32 x86_capability[NCAPINTS]; unsigned long x86_capability[NCAPINTS];
char x86_vendor_id[16]; char x86_vendor_id[16];
char x86_model_id[64]; char x86_model_id[64];
int x86_cache_size; /* in KB - valid for CPUS which support this int x86_cache_size; /* in KB - valid for CPUS which support this
......
#ifndef __ARCH_PPC_PERCPU__
#define __ARCH_PPC_PERCPU__
#include <asm-generic/percpu.h>
#endif /* __ARCH_PPC_PERCPU__ */
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -142,6 +142,8 @@ struct usbdevfs_hub_portinfo { ...@@ -142,6 +142,8 @@ struct usbdevfs_hub_portinfo {
#define USBDEVFS_HUB_PORTINFO _IOR('U', 19, struct usbdevfs_hub_portinfo) #define USBDEVFS_HUB_PORTINFO _IOR('U', 19, struct usbdevfs_hub_portinfo)
#define USBDEVFS_RESET _IO('U', 20) #define USBDEVFS_RESET _IO('U', 20)
#define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int) #define USBDEVFS_CLEAR_HALT _IOR('U', 21, unsigned int)
#define USBDEVFS_DISCONNECT _IO('U', 22)
#define USBDEVFS_CONNECT _IO('U', 23)
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment