patch-2.3.17 linux/arch/alpha/kernel/pci_syscall.c
Next file: linux/arch/alpha/kernel/sys_rawhide.c
Previous file: linux/arch/alpha/kernel/pci_setup.c
Back to the patch index
Back to the overall index
- Lines: 149
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.3.16/linux/arch/alpha/kernel/pci_syscall.c
- Orig date:
Tue Aug 31 17:29:12 1999
diff -u --recursive --new-file v2.3.16/linux/arch/alpha/kernel/pci_syscall.c linux/arch/alpha/kernel/pci_syscall.c
@@ -1,148 +0,0 @@
-/*
- * pci_syscall.c
- */
-
-#include <linux/config.h>
-#include <linux/errno.h>
-#include <linux/pci.h>
-#include <linux/smp_lock.h>
-#include <asm/uaccess.h>
-
-
-#ifndef CONFIG_PCI
-
-asmlinkage int sys_pciconfig_read() { return -ENOSYS; }
-asmlinkage int sys_pciconfig_write() { return -ENOSYS; }
-
-#else
-
-asmlinkage long
-sys_pciconfig_read(unsigned long bus, unsigned long dfn,
- unsigned long off, unsigned long len, void *buf)
-{
- struct pci_dev *dev;
- u8 byte;
- u16 word;
- u32 dword;
- long err, cfg_ret;
-
- err = -EPERM;
- if (!capable(CAP_SYS_ADMIN))
- goto error;
-
- err = -ENODEV;
- dev = pci_find_slot(bus, dfn);
- if (!dev)
- goto error;
-
- lock_kernel();
- switch (len) {
- case 1:
- cfg_ret = pci_read_config_byte(dev, off, &byte);
- break;
- case 2:
- cfg_ret = pci_read_config_word(dev, off, &word);
- break;
- case 4:
- cfg_ret = pci_read_config_dword(dev, off, &dword);
- break;
- default:
- err = -EINVAL;
- unlock_kernel();
- goto error;
- };
- unlock_kernel();
-
- err = -EIO;
- if (cfg_ret != PCIBIOS_SUCCESSFUL)
- goto error;
-
- switch (len) {
- case 1:
- err = put_user(byte, (unsigned char *)buf);
- break;
- case 2:
- err = put_user(word, (unsigned short *)buf);
- break;
- case 4:
- err = put_user(dword, (unsigned int *)buf);
- break;
- };
- return err;
-
-error:
- /* ??? XFree86 doesn't even check the return value. They
- just look for 0xffffffff in the output, since that's what
- they get instead of a machine check on x86. */
- switch (len) {
- case 1:
- put_user(-1, (unsigned char *)buf);
- break;
- case 2:
- put_user(-1, (unsigned short *)buf);
- break;
- case 4:
- put_user(-1, (unsigned int *)buf);
- break;
- };
- return err;
-}
-
-asmlinkage long
-sys_pciconfig_write(unsigned long bus, unsigned long dfn,
- unsigned long off, unsigned long len, void *buf)
-{
- struct pci_dev *dev;
- u8 byte;
- u16 word;
- u32 dword;
- int err = 0;
-
- if (!capable(CAP_SYS_ADMIN))
- return -EPERM;
- if (!pcibios_present())
- return -ENOSYS;
-
- dev = pci_find_slot(bus, dfn);
- if (!dev)
- return -ENODEV;
-
- lock_kernel();
- switch(len) {
- case 1:
- err = get_user(byte, (u8 *)buf);
- if (err)
- break;
- err = pci_write_config_byte(dev, off, byte);
- if (err != PCIBIOS_SUCCESSFUL)
- err = -EIO;
- break;
-
- case 2:
- err = get_user(word, (u16 *)buf);
- if (err)
- break;
- err = pci_write_config_byte(dev, off, word);
- if (err != PCIBIOS_SUCCESSFUL)
- err = -EIO;
- break;
-
- case 4:
- err = get_user(dword, (u32 *)buf);
- if (err)
- break;
- pci_write_config_byte(dev, off, dword);
- if (err != PCIBIOS_SUCCESSFUL)
- err = -EIO;
- break;
-
- default:
- err = -EINVAL;
- break;
- };
- unlock_kernel();
-
- return err;
-}
-
-#endif /* CONFIG_PCI */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)