/** * Open PCI configuration space * * @v pci PCI device * @v flags Access mode flags * @v where Address within configuration space * @ret fd File handle, or negative error */ static int linux_pci_open ( struct pci_device *pci, int flags, unsigned long where ) { char filename[ 22 /* "/proc/bus/pci/xx/xx.x" + NUL */ ]; int fd; int rc; /* Construct filename */ snprintf ( filename, sizeof ( filename ), "/proc/bus/pci/%02x/%02x.%x", PCI_BUS ( pci->busdevfn ), PCI_SLOT ( pci->busdevfn ), PCI_FUNC ( pci->busdevfn ) ); /* Open file */ fd = linux_open ( filename, flags ); if ( fd < 0 ) { DBGC ( pci, "PCI could not open %s: %s\n", filename, linux_strerror ( linux_errno ) ); rc = -ELINUX ( linux_errno ); goto err_open; } /* Seek to location */ if ( linux_lseek ( fd, where, SEEK_SET ) < 0 ) { DBGC ( pci, "PCI could not seek to %s offset %#02lx: %s\n", filename, where, linux_strerror ( linux_errno ) ); rc = -ELINUX ( linux_errno ); goto err_seek; } return fd; err_seek: linux_close ( fd ); err_open: return rc; }
static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags) { struct hf_platform_data *hf = cdev->priv; int fd = hf->fd; if (linux_lseek(fd, offset) != offset) return -EINVAL; return linux_write(fd, buf, count); }