/*
- * $Id: proc.c,v 1.6 1999/08/31 05:58:07 ecd Exp $
- *
* The PCI Library -- Configuration Access via /proc/bus/pci
*
- * Copyright (c) 1997--1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
+ * Copyright (c) 1997--2003 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
#elif defined(i386)
/* old libc on i386 -> call syscalls directly the old way */
#include <asm/unistd.h>
-static _syscall4(int, pread, unsigned int, fd, void *, buf, size_t, size, loff_t, where);
-static _syscall4(int, pwrite, unsigned int, fd, void *, buf, size_t, size, loff_t, where);
+static _syscall5(int, pread, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi);
+static _syscall5(int, pwrite, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi);
+static int do_read(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pread(fd, buf, size, where, 0); }
+static int do_write(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pwrite(fd, buf, size, where, 0); }
+#define HAVE_DO_READ
#else
/* In all other cases we use lseek/read/write instead to be safe */
#define make_rw_glue(op) \
- static int do_##op(struct pci_dev *d, int fd, void *buf, size_t size, loff_t where) \
+ static int do_##op(struct pci_dev *d, int fd, void *buf, size_t size, int where) \
{ \
struct pci_access *a = d->access; \
int r; \
struct pci_dev *d = pci_alloc_dev(a);
unsigned int dfn, vend, cnt, known;
- cnt = sscanf(buf,
-#ifdef HAVE_LONG_ADDRESS
- "%x %x %x %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx %llx",
-#else
- "%x %x %x %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx %lx",
-#endif
+#define F " " PCIADDR_T_FMT
+ cnt = sscanf(buf, "%x %x %x" F F F F F F F F F F F F F F,
&dfn,
&vend,
&d->irq,
&d->size[4],
&d->size[5],
&d->rom_size);
+#undef F
if (cnt != 9 && cnt != 10 && cnt != 17)
a->error("proc: parse error (read only %d items)", cnt);
d->bus = dfn >> 8U;
d->func = PCI_FUNC(dfn & 0xff);
d->vendor_id = vend >> 16U;
d->device_id = vend & 0xffff;
+ d->hdrtype = pci_read_byte(d, PCI_HEADER_TYPE) & 0x7f;
known = PCI_FILL_IDENT;
if (!a->buscentric)
{