Commit 5b17082f authored by Linus Torvalds's avatar Linus Torvalds

Import 2.3.20

parent 433b8708
This diff is collapsed.
......@@ -59,29 +59,30 @@ comment 'General setup'
bool 'BIGMEM support' CONFIG_BIGMEM
bool 'Networking support' CONFIG_NET
bool 'PCI support' CONFIG_PCI
if [ "$CONFIG_PCI" = "y" ]; then
choice 'PCI access mode' \
"BIOS CONFIG_PCI_GOBIOS \
Direct CONFIG_PCI_GODIRECT \
Any CONFIG_PCI_GOANY" Any
if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
define_bool CONFIG_PCI_BIOS y
fi
if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
define_bool CONFIG_PCI_DIRECT y
fi
fi
bool 'MCA support' CONFIG_MCA
bool 'SGI Visual Workstation support' CONFIG_VISWS
if [ "$CONFIG_VISWS" = "y" ]; then
define_bool CONFIG_X86_VISWS_APIC y
define_bool CONFIG_X86_LOCAL_APIC y
define_bool CONFIG_PCI y
else
if [ "$CONFIG_SMP" = "y" ]; then
define_bool CONFIG_X86_IO_APIC y
define_bool CONFIG_X86_LOCAL_APIC y
fi
bool 'PCI support' CONFIG_PCI
if [ "$CONFIG_PCI" = "y" ]; then
choice 'PCI access mode' \
"BIOS CONFIG_PCI_GOBIOS \
Direct CONFIG_PCI_GODIRECT \
Any CONFIG_PCI_GOANY" Any
if [ "$CONFIG_PCI_GOBIOS" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
define_bool CONFIG_PCI_BIOS y
fi
if [ "$CONFIG_PCI_GODIRECT" = "y" -o "$CONFIG_PCI_GOANY" = "y" ]; then
define_bool CONFIG_PCI_DIRECT y
fi
fi
bool 'MCA support' CONFIG_MCA
fi
source drivers/pcmcia/Config.in
......
......@@ -19,7 +19,12 @@ OX_OBJS := i386_ksyms.o
MX_OBJS :=
ifdef CONFIG_PCI
O_OBJS += bios32.o
O_OBJS += pci-i386.o
ifdef CONFIG_VISWS
O_OBJS += pci-visws.o
else
O_OBJS += pci-pc.o
endif
endif
ifdef CONFIG_MCA
......
......@@ -223,6 +223,8 @@
19990819 Alan Cox <alan@redhat.com>
Tested Zoltan's changes on a pre production Athlon - 100%
success.
19991008 Manfred Spraul <manfreds@colorfullife.com>
replaced spin_lock_reschedule() with a normal semaphore.
*/
#include <linux/types.h>
#include <linux/errno.h>
......@@ -303,8 +305,6 @@ typedef u8 mtrr_type;
TRUE)
#endif
#define spin_lock_reschedule(lock) while (!spin_trylock(lock)) schedule ();
#ifndef CONFIG_PROC_FS
# define compute_ascii() while (0)
#endif
......@@ -314,7 +314,7 @@ static char *ascii_buffer = NULL;
static unsigned int ascii_buf_bytes = 0;
#endif
static unsigned int *usage_table = NULL;
static spinlock_t main_lock = SPIN_LOCK_UNLOCKED;
static DECLARE_MUTEX(main_lock);
/* Private functions */
#ifdef CONFIG_PROC_FS
......@@ -1172,7 +1172,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
increment = increment ? 1 : 0;
max = get_num_var_ranges ();
/* Search for existing MTRR */
spin_lock_reschedule (&main_lock);
down(&main_lock);
for (i = 0; i < max; ++i)
{
(*get_mtrr) (i, &lbase, &lsize, &ltype);
......@@ -1181,7 +1181,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
/* At this point we know there is some kind of overlap/enclosure */
if ( (base < lbase) || (base + size > lbase + lsize) )
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: 0x%lx,0x%lx overlaps existing 0x%lx,0x%lx\n",
base, size, lbase, lsize);
return -EINVAL;
......@@ -1190,14 +1190,14 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
if (ltype != type)
{
if (type == MTRR_TYPE_UNCACHABLE) continue;
spin_unlock (&main_lock);
up(&main_lock);
printk ( "mtrr: type mismatch for %lx,%lx old: %s new: %s\n",
base, size, attrib_to_str (ltype), attrib_to_str (type) );
return -EINVAL;
}
if (increment) ++usage_table[i];
compute_ascii ();
spin_unlock (&main_lock);
up(&main_lock);
return i;
}
/* Search for an empty MTRR */
......@@ -1211,7 +1211,7 @@ int mtrr_add (unsigned long base, unsigned long size, unsigned int type,
set_mtrr (i, base, size, type);
usage_table[i] = 1;
compute_ascii ();
spin_unlock (&main_lock);
up(&main_lock);
return i;
} /* End Function mtrr_add */
......@@ -1232,7 +1232,7 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
if ( !(boot_cpu_data.x86_capability & X86_FEATURE_MTRR) ) return -ENODEV;
max = get_num_var_ranges ();
spin_lock_reschedule (&main_lock);
down(&main_lock);
if (reg < 0)
{
/* Search for existing MTRR */
......@@ -1247,14 +1247,14 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
}
if (reg < 0)
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: no MTRR for %lx,%lx found\n", base, size);
return -EINVAL;
}
}
if (reg >= max)
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: register: %d too big\n", reg);
return -EINVAL;
}
......@@ -1262,7 +1262,7 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
{
if ((reg == 3) && arr3_protected)
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: ARR3 cannot be changed\n");
return -EINVAL;
}
......@@ -1270,19 +1270,19 @@ int mtrr_del (int reg, unsigned long base, unsigned long size)
(*get_mtrr) (reg, &lbase, &lsize, &ltype);
if (lsize < 1)
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: MTRR %d not used\n", reg);
return -EINVAL;
}
if (usage_table[reg] < 1)
{
spin_unlock (&main_lock);
up(&main_lock);
printk ("mtrr: reg: %d has count=0\n", reg);
return -EINVAL;
}
if (--usage_table[reg] < 1) set_mtrr (reg, 0, 0, 0);
compute_ascii ();
spin_unlock (&main_lock);
up(&main_lock);
return reg;
} /* End Function mtrr_del */
......
This diff is collapsed.
/*
* Low-Level PCI Access for i386 machines.
*
* (c) 1999 Martin Mares <mj@ucw.cz>
*/
#undef DEBUG
#ifdef DEBUG
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif
#define PCI_PROBE_BIOS 1
#define PCI_PROBE_CONF1 2
#define PCI_PROBE_CONF2 4
#define PCI_NO_SORT 0x100
#define PCI_BIOS_SORT 0x200
#define PCI_NO_CHECKS 0x400
#define PCI_NO_PEER_FIXUP 0x800
#define PCI_ASSIGN_ROMS 0x1000
#define PCI_NO_IRQ_SCAN 0x2000
extern unsigned int pci_probe;
/* pci-i386.c */
void pcibios_resource_survey(void);
/*
* Low-Level PCI Support for SGI Visual Workstation
*
* (c) 1999 Martin Mares <mj@ucw.cz>
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <asm/smp.h>
#include <asm/lithium.h>
#include "pci-i386.h"
unsigned int pci_probe = 0;
/*
* The VISWS uses configuration access type 1 only.
*/
#define CONFIG_CMD(dev, where) (0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | (where & ~3))
static int pci_conf1_read_config_byte(struct pci_dev *dev, int where, u8 *value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
*value = inb(0xCFC + (where&3));
return PCIBIOS_SUCCESSFUL;
}
static int pci_conf1_read_config_word(struct pci_dev *dev, int where, u16 *value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
*value = inw(0xCFC + (where&2));
return PCIBIOS_SUCCESSFUL;
}
static int pci_conf1_read_config_dword(struct pci_dev *dev, int where, u32 *value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
*value = inl(0xCFC);
return PCIBIOS_SUCCESSFUL;
}
static int pci_conf1_write_config_byte(struct pci_dev *dev, int where, u8 value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
outb(value, 0xCFC + (where&3));
return PCIBIOS_SUCCESSFUL;
}
static int pci_conf1_write_config_word(struct pci_dev *dev, int where, u16 value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
outw(value, 0xCFC + (where&2));
return PCIBIOS_SUCCESSFUL;
}
static int pci_conf1_write_config_dword(struct pci_dev *dev, int where, u32 value)
{
outl(CONFIG_CMD(dev,where), 0xCF8);
outl(value, 0xCFC);
return PCIBIOS_SUCCESSFUL;
}
#undef CONFIG_CMD
static struct pci_ops visws_pci_ops = {
pci_conf1_read_config_byte,
pci_conf1_read_config_word,
pci_conf1_read_config_dword,
pci_conf1_write_config_byte,
pci_conf1_write_config_word,
pci_conf1_write_config_dword
};
static void __init pcibios_fixup_irqs(void)
{
struct pci_dev *dev, *p;
u8 pin;
int irq;
for(dev=pci_devices; dev; dev=dev->next) {
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
dev->irq = 0;
if (!pin)
continue;
pin--;
if (dev->bus->parent) {
p = dev->bus->parent->self;
pin = (pin + PCI_SLOT(dev->devfn)) % 4;
} else
p = dev;
irq = visws_get_PCI_irq_vector(p->bus->number, PCI_SLOT(p->devfn), pin+1);
if (irq >= 0)
dev->irq = irq;
DBG("PCI IRQ: %s pin %d -> %d\n", dev->slot_name, pin, irq);
}
}
void __init pcibios_fixup_bus(struct pci_bus *b)
{
pci_read_bridge_bases(b);
}
#if 0
static struct resource visws_pci_bus_resources[2] = {
{ "Host bus 1", 0xf4000000, 0xf7ffffff, 0 },
{ "Host bus 2", 0xf0000000, 0xf3ffffff, 0 }
};
#endif
void __init pcibios_init(void)
{
unsigned int sec_bus = li_pcib_read16(LI_PCI_BUSNUM) & 0xff;
printk("PCI: Probing PCI hardware on host buses 00 and %02x\n", sec_bus);
pci_scan_bus(0, &visws_pci_ops, NULL);
pci_scan_bus(sec_bus, &visws_pci_ops, NULL);
pcibios_fixup_irqs();
pcibios_resource_survey();
}
char * __init pcibios_setup(char *str)
{
return str;
}
......@@ -507,7 +507,7 @@ static void __init ide_setup_pci_device (struct pci_dev *dev, ide_pci_device_t *
if ((hwif = ide_match_hwif(base, d->bootable, d->name)) == NULL)
continue; /* no room in ide_hwifs[] */
if (hwif->io_ports[IDE_DATA_OFFSET] != base) {
ide_init_hwif_ports(&hwif->hw, base, (ctl + 2), NULL);
ide_init_hwif_ports(&hwif->hw, base, (ctl | 2), NULL);
memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports));
hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
}
......
......@@ -22,6 +22,7 @@
#include <linux/malloc.h>
#include <linux/mm.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/sched.h>
#include <linux/videodev.h>
......
......@@ -51,6 +51,10 @@
static struct acpi_facp *acpi_facp = NULL;
static unsigned long acpi_facp_addr = 0;
static unsigned long acpi_dsdt_addr = 0;
static volatile u32 acpi_pm1_status = 0;
static volatile u32 acpi_gpe_status = 0;
static volatile u32 acpi_gpe_level = 0;
static DECLARE_WAIT_QUEUE_HEAD(acpi_wait_event);
/*
......@@ -77,6 +81,19 @@ static void acpi_write_pm1_status(struct acpi_facp *facp, u32 value)
}
}
/*
* Get the value of the fixed event enable register
*/
static u32 acpi_read_pm1_enable(struct acpi_facp *facp)
{
int offset = facp->pm1_evt_len >> 1;
u32 value = inw(facp->pm1a_evt + offset);
if (facp->pm1b_evt) {
value |= inw(facp->pm1b_evt + offset);
}
return value;
}
/*
* Set the value of the fixed event enable register (enable events)
*/
......@@ -132,6 +149,28 @@ static void acpi_write_gpe_status(struct acpi_facp *facp, u32 value)
}
}
/*
* Get the value of the general-purpose event enable register
*/
static u32 acpi_read_gpe_enable(struct acpi_facp *facp)
{
u32 value = 0;
int i, size, offset;
offset = facp->gpe0_len >> 1;
if (facp->gpe1) {
size = facp->gpe1_len >> 1;
for (i = size - 1; i >= 0; i--) {
value = (value << 8) | inb(facp->gpe1 + offset + i);
}
}
size = facp->gpe0_len >> 1;
for (i = size - 1; i >= 0; i--) {
value = (value << 8) | inb(facp->gpe0 + offset + i);
}
return value;
}
/*
* Set the value of the general-purpose event enable register (enable events)
*/
......@@ -162,7 +201,8 @@ static struct acpi_table *__init acpi_map_table(u32 addr)
if (addr) {
// map table header to determine size
table = (struct acpi_table *)
ioremap_nocache((unsigned long) addr, sizeof(struct acpi_table));
ioremap_nocache((unsigned long) addr,
sizeof(struct acpi_table));
if (table) {
unsigned long table_size = table->length;
iounmap(table);
......@@ -206,10 +246,13 @@ static int __init acpi_map_tables(void)
// strip trailing space and print OEM identifier
memcpy_fromio(oem, rsdp->oem, 6);
oem[6] = '\0';
for (j = 5; j > 0 && (oem[j] == '\0' || oem[j] == ' '); j--) {
for (j = 5;
j > 0 && (oem[j] == '\0' || oem[j] == ' ');
j--) {
oem[j] = '\0';
}
printk(KERN_INFO "ACPI: \"%s\" found at 0x%p\n", oem, (void *) i);
printk(KERN_INFO "ACPI: \"%s\" found at 0x%p\n",
oem, (void *) i);
break;
}
......@@ -269,17 +312,32 @@ static void acpi_unmap_tables(void)
*/
static void acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
{
u32 status;
// detect and disable any fixed events
status = acpi_read_pm1_status(acpi_facp);
acpi_write_pm1_enable(acpi_facp, ~status);
// detect and disable any general-purpose events
status = acpi_read_gpe_status(acpi_facp);
acpi_write_gpe_enable(acpi_facp, ~status);
u32 pm1_status, gpe_status, gpe_level, gpe_edge;
// detect and clear fixed events
pm1_status = (acpi_read_pm1_status(acpi_facp)
& acpi_read_pm1_enable(acpi_facp));
acpi_write_pm1_status(acpi_facp, pm1_status);
// detect and handle general-purpose events
gpe_status = (acpi_read_gpe_status(acpi_facp)
& acpi_read_gpe_enable(acpi_facp));
gpe_level = gpe_status & acpi_gpe_level;
if (gpe_level) {
// disable level-triggered events
acpi_write_gpe_enable(
acpi_facp,
acpi_read_gpe_enable(acpi_facp) & ~gpe_level);
}
gpe_edge = gpe_status & ~gpe_level;
if (gpe_edge) {
// clear edge-triggered events
while (acpi_read_gpe_status(acpi_facp) & gpe_edge)
acpi_write_gpe_status(acpi_facp, gpe_edge);
}
// notify process reading /dev/acpi
acpi_pm1_status |= pm1_status;
acpi_gpe_status |= gpe_status;
wake_up_interruptible(&acpi_wait_event);
}
......@@ -317,17 +375,79 @@ static int acpi_ioctl(struct inode *inode,
(void *) arg,
sizeof(struct acpi_find_tables));
if (!status) {
struct acpi_find_tables *rqst = (struct acpi_find_tables *) arg;
struct acpi_find_tables *rqst
= (struct acpi_find_tables *) arg;
put_user(acpi_facp_addr, &rqst->facp);
put_user(acpi_dsdt_addr, &rqst->dsdt);
status = 0;
}
break;
case ACPI_ENABLE_EVENT:
status = verify_area(VERIFY_READ,
(void *) arg,
sizeof(struct acpi_enable_event));
if (!status) {
struct acpi_enable_event *rqst
= (struct acpi_enable_event *) arg;
u32 pm1_enable, gpe_enable, gpe_level;
u32 pm1_enabling, gpe_enabling;
get_user(pm1_enable, &rqst->pm1_enable);
get_user(gpe_enable, &rqst->gpe_enable);
get_user(gpe_level, &rqst->gpe_level);
gpe_level &= gpe_enable;
// clear previously disabled events before enabling
pm1_enabling = (pm1_enable
& ~acpi_read_pm1_enable(acpi_facp));
acpi_write_pm1_status(acpi_facp, pm1_enabling);
gpe_enabling = (gpe_enable &
~acpi_read_gpe_enable(acpi_facp));
while (acpi_read_gpe_status(acpi_facp) & gpe_enabling)
acpi_write_gpe_status(acpi_facp, gpe_enabling);
acpi_write_pm1_enable(acpi_facp, pm1_enable);
acpi_write_gpe_enable(acpi_facp, gpe_enable);
acpi_gpe_level = gpe_level;
status = 0;
}
break;
case ACPI_WAIT_EVENT:
interruptible_sleep_on(&acpi_wait_event);
if (signal_pending(current))
return -ERESTARTSYS;
status = 0;
status = verify_area(VERIFY_WRITE,
(void *) arg,
sizeof(struct acpi_wait_event));
if (!status) {
struct acpi_wait_event *rqst
= (struct acpi_wait_event *) arg;
u32 pm1_status = 0;
u32 gpe_status = 0;
for (;;) {
unsigned long flags;
// we need an atomic exchange here
save_flags(flags);
cli();
pm1_status = acpi_pm1_status;
acpi_pm1_status = 0;
gpe_status = acpi_gpe_status;
acpi_gpe_status = 0;
restore_flags(flags);
if (pm1_status || gpe_status)
break;
// wait for an event to arrive
interruptible_sleep_on(&acpi_wait_event);
if (signal_pending(current))
return -ERESTARTSYS;
}
put_user(pm1_status, &rqst->pm1_status);
put_user(gpe_status, &rqst->gpe_status);
status = 0;
}
break;
}
return status;
......@@ -448,7 +568,8 @@ static void __exit acpi_exit(void)
// disable and clear any pending events
acpi_write_gpe_enable(acpi_facp, 0);
while (acpi_read_gpe_status(acpi_facp)) {
acpi_write_gpe_status(acpi_facp, acpi_read_gpe_status(acpi_facp));
acpi_write_gpe_status(acpi_facp,
acpi_read_gpe_status(acpi_facp));
}
acpi_write_pm1_enable(acpi_facp, 0);
acpi_write_pm1_status(acpi_facp, acpi_read_pm1_status(acpi_facp));
......@@ -464,6 +585,7 @@ static void __exit acpi_exit(void)
module_init(acpi_init)
module_exit(acpi_exit)
#else
__initcall(acpi_init);
......
......@@ -151,8 +151,6 @@ static void parport_ieee1284_terminate (struct parport *port)
{
port = port->physport;
port->ieee1284.phase = IEEE1284_PH_TERMINATE;
/* EPP terminates differently. */
switch (port->ieee1284.mode) {
case IEEE1284_MODE_EPP:
......@@ -171,7 +169,32 @@ static void parport_ieee1284_terminate (struct parport *port)
PARPORT_CONTROL_SELECT
| PARPORT_CONTROL_INIT);
break;
case IEEE1284_MODE_ECP:
case IEEE1284_MODE_ECPRLE:
case IEEE1284_MODE_ECPSWE:
/* In ECP we can only terminate from fwd idle phase. */
if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE) {
/* Event 47: Set nInit high */
parport_frob_control (port,
PARPORT_CONTROL_INIT
| PARPORT_CONTROL_AUTOFD,
PARPORT_CONTROL_INIT
| PARPORT_CONTROL_AUTOFD);
/* Event 49: PError goes high */
parport_wait_peripheral (port,
PARPORT_STATUS_PAPEROUT,
PARPORT_STATUS_PAPEROUT);
parport_data_forward (port);
DPRINTK (KERN_DEBUG "%s: ECP direction: forward\n",
port->name);
port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
}
/* fall-though.. */
default:
/* Terminate from all other modes. */
......
......@@ -1758,6 +1758,8 @@ static int __init parport_pc_init_pci (int irq, int dma)
{ { 0, -1 }, } },
{ PCI_VENDOR_ID_LAVA, PCI_DEVICE_ID_LAVA_DUAL_PAR_B, 1,
{ { 0, -1 }, } },
{ PCI_VENDOR_ID_EXSYS, PCI_DEVICE_ID_EXSYS_4014, 2,
{ { 2, -1 }, { 3, -1 }, } },
{ 0, }
};
......
......@@ -989,6 +989,10 @@ VENDOR( ATRONICS, "Atronics" )
DEVICE( ATRONICS, ATRONICS_2015, "IDE-2015PL")
ENDVENDOR()
VENDOR( EXSYS, "Exsys" )
DEVICE( EXSYS, EXSYS_4014, "EX-4014")
ENDVENDOR()
VENDOR( TIGERJET, "TigerJet" )
DEVICE( TIGERJET, TIGERJET_300, "Tiger300 ISDN")
ENDVENDOR()
......
......@@ -176,10 +176,38 @@ static int ioctl_internal_command(Scsi_Device * dev, char *cmd,
}
/*
* This interface is depreciated - users should use the scsi generics
* This interface is depreciated - users should use the scsi generic (sg)
* interface instead, as this is a more flexible approach to performing
* generic SCSI commands on a device.
*
* The structure that we are passed should look like:
*
* struct sdata {
* unsigned int inlen; [i] Length of data to be written to device
* unsigned int outlen; [i] Length of data to be read from device
* unsigned char cmd[x]; [i] SCSI command (6 <= x <= 12).
* [o] Data read from device starts here.
* [o] On error, sense buffer starts here.
* unsigned char wdata[y]; [i] Data written to device starts here.
* };
* Notes:
* - The SCSI command length is determined by examining the 1st byte
* of the given command. There is no way to override this.
* - Data transfers are limited to PAGE_SIZE (4K on i386, 8K on alpha).
* - The length (x + y) must be at least OMAX_SB_LEN bytes long to
* accomodate the sense buffer when an error occurs.
* The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that
* old code will not be surprised.
* - If a Unix error occurs (e.g. ENOMEM) then the user will receive
* a negative return and the Unix error code in 'errno'.
* If the SCSI command succeeds then 0 is returned.
* Positive numbers returned are the compacted SCSI error codes (4
* bytes in one int) where the lowest byte is the SCSI status.
* See the drivers/scsi/scsi.h file for more information on this.
*
*/
#define OMAX_SB_LEN 16 /* Old sense buffer length */
int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
{
unsigned long flags;
......@@ -195,8 +223,6 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
if (!sic)
return -EINVAL;
/*
* Verify that we can read at least this much.
*/
......@@ -204,23 +230,13 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
if (result)
return result;
/*
* The structure that we are passed should look like:
*
* struct sdata {
* unsigned int inlen;
* unsigned int outlen;
* unsigned char cmd[]; # However many bytes are used for cmd.
* unsigned char data[];
* };
*/
get_user(inlen, &sic->inlen);
get_user(outlen, &sic->outlen);
/*
* We do not transfer more than MAX_BUF with this interface.
* If the user needs to transfer more data than this, they
* should use scsi_generics instead.
* should use scsi_generics (sg) instead.
*/
if (inlen > MAX_BUF)
return -EINVAL;
......@@ -249,19 +265,16 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
*/
cmdlen = COMMAND_SIZE(opcode);
result = verify_area(VERIFY_READ, cmd_in,
cmdlen + inlen > MAX_BUF ? MAX_BUF : cmdlen + inlen);
result = verify_area(VERIFY_READ, cmd_in, cmdlen + inlen);
if (result)
return result;
copy_from_user((void *) cmd, cmd_in, cmdlen);
copy_from_user(cmd, cmd_in, cmdlen);
/*
* Obtain the data to be sent to the device (if any).
*/
copy_from_user((void *) buf,
(void *) (cmd_in + cmdlen),
inlen);
copy_from_user(buf, cmd_in + cmdlen, inlen);
/*
* Set the lun field to the correct value.
......@@ -311,19 +324,18 @@ int scsi_ioctl_send_command(Scsi_Device * dev, Scsi_Ioctl_Command * sic)
* If there was an error condition, pass the info back to the user.
*/
if (SCpnt->result) {
result = verify_area(VERIFY_WRITE,
cmd_in,
sizeof(SCpnt->sense_buffer));
int sb_len = sizeof(SCpnt->sense_buffer);
sb_len = (sb_len > OMAX_SB_LEN) ? OMAX_SB_LEN : sb_len;
result = verify_area(VERIFY_WRITE, cmd_in, sb_len);
if (result)
return result;
copy_to_user((void *) cmd_in,
SCpnt->sense_buffer,
sizeof(SCpnt->sense_buffer));
copy_to_user(cmd_in, SCpnt->sense_buffer, sb_len);
} else {
result = verify_area(VERIFY_WRITE, cmd_in, outlen);
if (result)
return result;
copy_to_user((void *) cmd_in, buf, outlen);
copy_to_user(cmd_in, buf, outlen);
}
result = SCpnt->result;
......
......@@ -815,7 +815,7 @@ static void sg_command_done(Scsi_Cmnd * SCpnt)
/* Now wake up any sg_read() that is waiting for this packet. */
wake_up_interruptible(&sfp->read_wait);
if ((sfp->async_qp) && (! closed))
kill_fasync(sfp->async_qp, SIGPOLL, POLL_IN);
kill_fasync(sfp->async_qp, SIGPOLL);
}
static void sg_debug_all(const Sg_fd * sfp)
......
......@@ -44,7 +44,7 @@ comment 'USB Devices'
dep_tristate ' USB CPiA Camera support' CONFIG_USB_CPIA $CONFIG_USB
dep_tristate ' USB SCSI Support' CONFIG_USB_SCSI $CONFIG_USB
if [ "$CONFIG_USB_SCSI" != "n" ]; then
dep_tristate ' USB SCSI verbose debug' CONFIG_USB_SCSI_DEBUG $CONFIG_USB_SCSI
bool ' USB SCSI verbose debug' CONFIG_USB_SCSI_DEBUG
fi
dep_tristate ' USS720 parport driver' CONFIG_USB_USS720 $CONFIG_USB $CONFIG_PARPORT
fi
......
......@@ -6,6 +6,8 @@ int usb_printer_init(void);
void usb_hub_cleanup(void);
void usb_mouse_cleanup(void);
int usb_scsi_init(void);
int usb_hp_scanner_init(void);
void usb_hp_scanner_cleanup(void);
int proc_usb_init (void);
void proc_usb_cleanup (void);
int usb_serial_init (void);
......@@ -120,7 +120,7 @@ static int mouse_irq(int state, void *__buffer, int len, void *dev_id)
wake_up_interruptible(&mouse->wait);
if (mouse->fasync)
kill_fasync(mouse->fasync, SIGIO, POLL_IN);
kill_fasync(mouse->fasync, SIGIO);
return 1;
}
......
......@@ -286,9 +286,12 @@ static int usb_dump_desc (const struct usb_device *dev, char *buf, int *len)
static int usb_hcd_bandwidth (const struct usb_device *dev, char *buf, int *len)
{
*len += sprintf (buf + *len, format_bandwidth,
dev->bus->bandwidth_allocated, FRAME_TIME_MAX_USECS_ALLOC,
100 * dev->bus->bandwidth_allocated / FRAME_TIME_MAX_USECS_ALLOC,
dev->bus->bandwidth_int_reqs, dev->bus->bandwidth_isoc_reqs
dev->bus->bandwidth_allocated,
FRAME_TIME_MAX_USECS_ALLOC,
(100 * dev->bus->bandwidth_allocated + FRAME_TIME_MAX_USECS_ALLOC / 2) /
FRAME_TIME_MAX_USECS_ALLOC,
dev->bus->bandwidth_int_reqs,
dev->bus->bandwidth_isoc_reqs
);
return (*len >= DUMP_LIMIT) ? -1 : 0;
......@@ -360,12 +363,12 @@ static int usb_device_dump (char *buf, int *len,
if (*len >= DUMP_LIMIT)
return -1;
if (usbdev->devnum > 0) { /* for any except root hub */
if (usb_dump_desc (usbdev, buf, len) < 0)
if ((level == 0) && (usbdev->devnum < 0)) { /* for root hub */
if (usb_hcd_bandwidth (usbdev, buf, len) < 0)
return -1;
}
else { /* for a host controller */
if (usb_hcd_bandwidth (usbdev, buf, len) < 0)
else { /* for anything but a root hub */
if (usb_dump_desc (usbdev, buf, len) < 0)
return -1;
}
......
......@@ -683,7 +683,7 @@ int init_module(void)
void cleanup_module(void)
{
tty_unregister_driver(&acm_tty_driver);
tty_unregister_driver(&serial_tty_driver);
usb_deregister(&usb_serial_driver);
}
......
......@@ -2,16 +2,16 @@
* driver/usb/usb-core.c
*
* (C) Copyright David Waite 1999
* based on code from usb.c, by Linus Torvolds
* based on code from usb.c, by Linus Torvalds
*
* The purpose of this file is to pull any and all generic modular code from
* usb.c and put it in a separate file. This way usb.c is kept as a generic
* library, while this file handles starting drivers, etc.
*
*/
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/module.h>
#include "inits.h"
#include "usb.h"
......@@ -28,7 +28,6 @@
# endif
#endif
int usb_init(void)
{
#ifdef CONFIG_USB_PROC
......@@ -77,6 +76,7 @@ int usb_init(void)
#endif
return 0;
}
/*
* Clean up when unloading the module
*/
......@@ -103,10 +103,9 @@ int init_module(void)
{
return usb_init();
}
void cleanup_module(void)
{
cleanup_drivers();
}
#endif
......@@ -13,9 +13,14 @@
* are evil.
*/
#ifndef EXPORT_SYMTAB
#define EXPORT_SYMTAB
#endif
#define USB_DEBUG 1
#include <linux/config.h>
#include <linux/module.h>
#include <linux/string.h>
#include <linux/bitops.h>
#include <linux/malloc.h>
......@@ -177,7 +182,7 @@ static long calc_bus_time (int low_speed, int input_dir, int isoc, int bytecount
* However, this first cut at USB bandwidth allocation does not
* contain any frame allocation tracking.
*/
int check_bandwidth_alloc (unsigned int old_alloc, long bustime)
static int check_bandwidth_alloc (unsigned int old_alloc, long bustime)
{
unsigned int new_alloc;
......@@ -269,6 +274,7 @@ static void usb_check_support(struct usb_device *dev)
if (!dev->driver && dev->devnum > 0)
usb_find_driver(dev);
}
/*
* This entrypoint gets called for each new device.
*
......@@ -996,7 +1002,6 @@ int usb_get_configuration(struct usb_device *dev)
return 0;
}
char *usb_string(struct usb_device *dev, int index)
{
int len, i;
......@@ -1153,9 +1158,10 @@ int usb_request_irq(struct usb_device *dev, unsigned int pipe, usb_device_irq ha
if (!ret) {
dev->bus->bandwidth_allocated += bustime;
dev->bus->bandwidth_int_reqs++;
PRINTD ("bw_alloc bumped to %d for %d requesters\n",
PRINTD ("bw_alloc bumped to %d for %d requesters",
dev->bus->bandwidth_allocated,
dev->bus->bandwidth_int_reqs);
dev->bus->bandwidth_int_reqs +
dev->bus->bandwidth_isoc_reqs);
}
return ret;
......@@ -1185,9 +1191,10 @@ int usb_release_irq(struct usb_device *dev, void *handle, unsigned int pipe)
bustime = NS_TO_US(bustime);
dev->bus->bandwidth_allocated -= bustime;
dev->bus->bandwidth_int_reqs--;
PRINTD ("bw_alloc reduced to %d for %d requesters\n",
PRINTD ("bw_alloc reduced to %d for %d requesters",
dev->bus->bandwidth_allocated,
dev->bus->bandwidth_int_reqs);
dev->bus->bandwidth_int_reqs +
dev->bus->bandwidth_isoc_reqs);
}
return err;
......@@ -1213,11 +1220,14 @@ int usb_init_isoc (struct usb_device *usb_dev,
long bustime;
int err;
if (frame_count <= 0)
return -EINVAL;
/* Check host controller's bandwidth for this Isoc. request. */
/* TBD: some way to factor in frame_spacing ??? */
bustime = calc_bus_time (0, usb_pipein(pipe), 1,
usb_maxpacket(usb_dev, pipe, usb_pipeout(pipe)));
bustime = NS_TO_US(bustime); /* work in microseconds */
bustime = NS_TO_US(bustime) / frame_count; /* work in microseconds */
if (check_bandwidth_alloc (usb_dev->bus->bandwidth_allocated, bustime))
return USB_ST_BANDWIDTH_ERROR;
......@@ -1227,8 +1237,9 @@ int usb_init_isoc (struct usb_device *usb_dev,
if (!err) {
usb_dev->bus->bandwidth_allocated += bustime;
usb_dev->bus->bandwidth_isoc_reqs++;
PRINTD ("bw_alloc bumped to %d for %d requesters\n",
PRINTD ("bw_alloc bumped to %d for %d requesters",
usb_dev->bus->bandwidth_allocated,
usb_dev->bus->bandwidth_int_reqs +
usb_dev->bus->bandwidth_isoc_reqs);
}
......@@ -1243,11 +1254,12 @@ void usb_free_isoc (struct usb_isoc_desc *isocdesc)
bustime = calc_bus_time (0, usb_pipein(isocdesc->pipe), 1,
usb_maxpacket(isocdesc->usb_dev, isocdesc->pipe,
usb_pipeout(isocdesc->pipe)));
bustime = NS_TO_US(bustime);
bustime = NS_TO_US(bustime) / isocdesc->frame_count;
isocdesc->usb_dev->bus->bandwidth_allocated -= bustime;
isocdesc->usb_dev->bus->bandwidth_isoc_reqs--;
PRINTD ("bw_alloc reduced to %d for %d requesters\n",
PRINTD ("bw_alloc reduced to %d for %d requesters",
isocdesc->usb_dev->bus->bandwidth_allocated,
isocdesc->usb_dev->bus->bandwidth_int_reqs +
isocdesc->usb_dev->bus->bandwidth_isoc_reqs);
isocdesc->usb_dev->bus->op->free_isoc (isocdesc);
......@@ -1276,3 +1288,49 @@ struct list_head *usb_bus_get_list(void)
}
#endif
/*
* USB may be built into the kernel or be built as modules.
* If the USB core [and maybe a host controller driver] is built
* into the kernel, and other device drivers are built as modules,
* then these symbols need to be exported for the modules to use.
*/
EXPORT_SYMBOL(usb_register);
EXPORT_SYMBOL(usb_deregister);
EXPORT_SYMBOL(usb_alloc_bus);
EXPORT_SYMBOL(usb_free_bus);
EXPORT_SYMBOL(usb_register_bus);
EXPORT_SYMBOL(usb_deregister_bus);
EXPORT_SYMBOL(usb_alloc_dev);
EXPORT_SYMBOL(usb_free_dev);
EXPORT_SYMBOL(usb_inc_dev_use);
EXPORT_SYMBOL(usb_init_root_hub);
EXPORT_SYMBOL(usb_new_device);
EXPORT_SYMBOL(usb_connect);
EXPORT_SYMBOL(usb_disconnect);
EXPORT_SYMBOL(usb_set_address);
EXPORT_SYMBOL(usb_get_descriptor);
EXPORT_SYMBOL(usb_get_string);
EXPORT_SYMBOL(usb_string);
EXPORT_SYMBOL(usb_get_protocol);
EXPORT_SYMBOL(usb_set_protocol);
EXPORT_SYMBOL(usb_get_report);
EXPORT_SYMBOL(usb_set_idle);
EXPORT_SYMBOL(usb_clear_halt);
EXPORT_SYMBOL(usb_set_interface);
EXPORT_SYMBOL(usb_get_configuration);
EXPORT_SYMBOL(usb_set_configuration);
EXPORT_SYMBOL(usb_control_msg);
EXPORT_SYMBOL(usb_request_irq);
EXPORT_SYMBOL(usb_release_irq);
/* EXPORT_SYMBOL(usb_bulk_msg); */
EXPORT_SYMBOL(usb_request_bulk);
EXPORT_SYMBOL(usb_terminate_bulk);
EXPORT_SYMBOL(usb_get_current_frame_number);
EXPORT_SYMBOL(usb_init_isoc);
EXPORT_SYMBOL(usb_free_isoc);
EXPORT_SYMBOL(usb_run_isoc);
EXPORT_SYMBOL(usb_kill_isoc);
......@@ -49,6 +49,15 @@
#define USB_DIR_OUT 0
#define USB_DIR_IN 0x80
#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
#define USB_ENDPOINT_DIR_MASK 0x80
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
#define USB_ENDPOINT_XFER_CONTROL 0
#define USB_ENDPOINT_XFER_ISOC 1
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
/*
* USB Packet IDs (PIDs)
*/
......@@ -706,7 +715,7 @@ void usb_show_string(struct usb_device *dev, char *id, int index);
#ifdef USB_DEBUG
#define PRINTD(format, args...) printk("usb: " format "\n" , ## args);
#else /* NOT DEBUGGING */
#define PRINTD(fmt, arg...) do {} while (0) /**/
#define PRINTD(fmt, arg...) do {} while (0)
#endif /* USB_DEBUG */
/* A simple way to change one line from DEBUG to NOT DEBUG: */
#define XPRINTD(fmt, arg...) do {} while (0)
......
......@@ -5,7 +5,6 @@
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/signal.h>
......
......@@ -1512,8 +1512,8 @@ int block_write_cont_page(struct file *file, struct page *page, unsigned long of
char * target_buf, *target_data;
unsigned long data_offset = offset;
offset = page->offset-inode->i_size;
if (offset < 0)
offset = inode->i_size - page->offset;
if (page->offset>inode->i_size)
offset = 0;
else if (offset >= data_offset)
offset = data_offset;
......
......@@ -60,7 +60,7 @@ struct inode_operations fat_file_inode_operations = {
fat_get_block, /* get_block */
block_read_full_page, /* readpage */
NULL, /* writepage */
NULL, /* flushpage */
block_flushpage, /* flushpage */
fat_truncate, /* truncate */
NULL, /* permission */
NULL, /* smap */
......@@ -118,7 +118,7 @@ static int fat_write_partial_page(struct file *file, struct page *page, unsigned
unsigned long page_cache = 0;
long status;
pgpos = inode->i_size & PAGE_CACHE_MASK;
pgpos = MSDOS_I(inode)->i_realsize & PAGE_CACHE_MASK;
while (pgpos < page->offset) {
hash = page_hash(inode, pgpos);
repeat_find: new_page = __find_lock_page(inode, pgpos, hash);
......
......@@ -183,22 +183,6 @@ dentry->d_parent->d_name.name, dentry->d_name.name);
}
}
/*
* Generate a unique inode number.
*/
ino_t ncp_invent_inos(unsigned long n)
{
static ino_t ino = 2;
if (ino + 2*n < ino)
{
/* wrap around */
ino = 2;
}
ino += n;
return ino;
}
static inline int
ncp_single_volume(struct ncp_server *server)
{
......@@ -449,7 +433,7 @@ ncp_do_simple_filldir(struct file *filp, char* name, int len,
ino = find_inode_number(dentry, &qname);
if (!ino)
ino = ncp_invent_inos(1);
ino = iunique(2);
result = filldir(dirent, name, len, filp->f_pos, ino);
if (!result)
......@@ -494,7 +478,7 @@ ncp_do_filldir(struct file *filp, struct ncp_entry_info *entry, void *dirent,
if (!newdent->d_inode) {
entry->opened = 0;
entry->ino = ncp_invent_inos(1);
entry->ino = iunique(2);
newino = ncp_iget(inode->i_sb, entry);
if (newino) {
newdent->d_op = &ncp_dentry_operations;
......@@ -517,7 +501,7 @@ ncp_do_filldir(struct file *filp, struct ncp_entry_info *entry, void *dirent,
ino = find_inode_number(dentry, &qname);
if (!ino)
ino = ncp_invent_inos(1);
ino = iunique(2);
result = filldir(dirent, entry->i.entryName, entry->i.nameLen,
filp->f_pos, ino);
......@@ -810,7 +794,7 @@ dentry->d_parent->d_name.name, __name, res);
* Create an inode for the entry.
*/
finfo.opened = 0;
finfo.ino = ncp_invent_inos(1);
finfo.ino = iunique(2);
error = -EACCES;
inode = ncp_iget(dir->i_sb, &finfo);
......@@ -838,7 +822,7 @@ static int ncp_instantiate(struct inode *dir, struct dentry *dentry,
struct inode *inode;
int error = -EINVAL;
finfo->ino = ncp_invent_inos(1);
finfo->ino = iunique(2);
inode = ncp_iget(dir->i_sb, finfo);
if (!inode)
goto out_close;
......
......@@ -31,7 +31,6 @@
#include "ncplib_kernel.h"
static void ncp_read_inode(struct inode *);
static void ncp_put_inode(struct inode *);
static void ncp_delete_inode(struct inode *);
static void ncp_put_super(struct super_block *);
......@@ -39,7 +38,7 @@ static int ncp_statfs(struct super_block *, struct statfs *, int);
static struct super_operations ncp_sops =
{
ncp_read_inode, /* read inode */
NULL, /* read inode */
NULL, /* write inode */
ncp_put_inode, /* put inode */
ncp_delete_inode, /* delete inode */
......@@ -56,9 +55,6 @@ extern struct inode_operations ncp_symlink_inode_operations;
extern int ncp_symlink(struct inode*, struct dentry*, const char*);
#endif
static struct ncp_entry_info *read_nwinfo = NULL;
static DECLARE_MUTEX(read_sem);
/*
* Fill in the ncpfs-specific information in the inode.
*/
......@@ -216,33 +212,7 @@ static void ncp_set_attr(struct inode *inode, struct ncp_entry_info *nwinfo)
}
/*
* This is called from iget() with the read semaphore held.
* The global ncp_entry_info structure has been set up by ncp_iget.
*/
static void ncp_read_inode(struct inode *inode)
{
if (read_nwinfo == NULL) {
printk(KERN_ERR "ncp_read_inode: invalid call\n");
return;
}
ncp_set_attr(inode, read_nwinfo);
if (S_ISREG(inode->i_mode)) {
inode->i_op = &ncp_file_inode_operations;
} else if (S_ISDIR(inode->i_mode)) {
inode->i_op = &ncp_dir_inode_operations;
#ifdef CONFIG_NCPFS_EXTRAS
} else if (S_ISLNK(inode->i_mode)) {
inode->i_op = &ncp_symlink_inode_operations;
#endif
} else {
inode->i_op = NULL;
}
}
/*
* Set up the ncp_entry_info pointer and get a new inode.
* Get a new inode.
*/
struct inode *
ncp_iget(struct super_block *sb, struct ncp_entry_info *info)
......@@ -254,12 +224,23 @@ ncp_iget(struct super_block *sb, struct ncp_entry_info *info)
return NULL;
}
down(&read_sem);
read_nwinfo = info;
inode = iget(sb, info->ino);
read_nwinfo = NULL;
up(&read_sem);
if (!inode)
inode = get_empty_inode();
if (inode) {
inode->i_sb = sb;
inode->i_dev = sb->s_dev;
inode->i_ino = info->ino;
ncp_set_attr(inode, info);
if (S_ISREG(inode->i_mode)) {
inode->i_op = &ncp_file_inode_operations;
} else if (S_ISDIR(inode->i_mode)) {
inode->i_op = &ncp_dir_inode_operations;
#ifdef CONFIG_NCPFS_EXTRAS
} else if (S_ISLNK(inode->i_mode)) {
inode->i_op = &ncp_symlink_inode_operations;
#endif
}
insert_inode_hash(inode);
} else
printk(KERN_ERR "ncp_iget: iget failed!\n");
return inode;
}
......@@ -710,9 +691,6 @@ int init_module(void)
{
DPRINTK(KERN_DEBUG "ncpfs: init_module called\n");
init_MUTEX(&read_sem);
read_nwinfo = NULL;
#ifdef DEBUG_NCP_MALLOC
ncp_malloced = 0;
ncp_current_malloced = 0;
......
......@@ -38,21 +38,14 @@
#define ACPI_FACP_SIG 0x50434146 /* 'FACP' */
#define ACPI_DSDT_SIG 0x54445344 /* 'DSDT' */
/* PM1_STS flags */
#define ACPI_TMR_STS 0x0001
#define ACPI_BM_STS 0x0010
#define ACPI_GBL_STS 0x0020
#define ACPI_PWRBTN_STS 0x0100
#define ACPI_SLPBTN_STS 0x0200
#define ACPI_RTC_STS 0x0400
#define ACPI_WAK_STS 0x8000
/* PM1_EN flags */
#define ACPI_TMR_EN 0x0001
#define ACPI_GBL_EN 0x0020
#define ACPI_PWRBTN_EN 0x0100
#define ACPI_SLPBTN_EN 0x0200
#define ACPI_RTC_EN 0x0400
/* PM1_STS/EN flags */
#define ACPI_TMR 0x0001
#define ACPI_BM 0x0010
#define ACPI_GBL 0x0020
#define ACPI_PWRBTN 0x0100
#define ACPI_SLPBTN 0x0200
#define ACPI_RTC 0x0400
#define ACPI_WAK 0x8000
/* PM1_CNT flags */
#define ACPI_SCI_EN 0x0001
......@@ -150,11 +143,23 @@ struct acpi_facp {
};
#define ACPI_FIND_TABLES _IOR('A', 1, struct acpi_find_tables)
#define ACPI_WAIT_EVENT _IO('A', 2)
#define ACPI_ENABLE_EVENT _IOW('A', 2, struct acpi_enable_event)
#define ACPI_WAIT_EVENT _IOR('A', 3, struct acpi_wait_event)
struct acpi_find_tables {
unsigned long facp;
unsigned long dsdt;
unsigned long facp; /* FACP physical address */
unsigned long dsdt; /* DSDT physical address */
};
struct acpi_enable_event {
__u32 pm1_enable; /* fixed events */
__u32 gpe_enable; /* general-purpose events (GPEs) */
__u32 gpe_level; /* level-triggered GPEs */
};
struct acpi_wait_event {
__u32 pm1_status; /* fixed events */
__u32 gpe_status; /* general-purpose events */
};
#ifdef __KERNEL__
......
......@@ -1073,6 +1073,9 @@
#define PCI_VENDOR_ID_HOLTEK 0x9412
#define PCI_DEVICE_ID_HOLTEK_6565 0x6565
#define PCI_VENDOR_ID_EXSYS 0xd84d
#define PCI_DEVICE_ID_EXSYS_4014 0x4014
#define PCI_VENDOR_ID_TIGERJET 0xe159
#define PCI_DEVICE_ID_TIGERJET_300 0x0001
......
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