diff options
Diffstat (limited to 'drivers/pci/proc.c')
| -rw-r--r-- | drivers/pci/proc.c | 107 | 
1 files changed, 31 insertions, 76 deletions
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c index 297b72c880a..3f155e78513 100644 --- a/drivers/pci/proc.c +++ b/drivers/pci/proc.c @@ -10,7 +10,6 @@  #include <linux/module.h>  #include <linux/proc_fs.h>  #include <linux/seq_file.h> -#include <linux/smp_lock.h>  #include <linux/capability.h>  #include <asm/uaccess.h>  #include <asm/byteorder.h> @@ -18,38 +17,16 @@  static int proc_initialized;	/* = 0 */ -static loff_t -proc_bus_pci_lseek(struct file *file, loff_t off, int whence) +static loff_t proc_bus_pci_lseek(struct file *file, loff_t off, int whence)  { -	loff_t new = -1; -	struct inode *inode = file->f_path.dentry->d_inode; - -	mutex_lock(&inode->i_mutex); -	switch (whence) { -	case 0: -		new = off; -		break; -	case 1: -		new = file->f_pos + off; -		break; -	case 2: -		new = inode->i_size + off; -		break; -	} -	if (new < 0 || new > inode->i_size) -		new = -EINVAL; -	else -		file->f_pos = new; -	mutex_unlock(&inode->i_mutex); -	return new; +	struct pci_dev *dev = PDE_DATA(file_inode(file)); +	return fixed_size_llseek(file, off, whence, dev->cfg_size);  } -static ssize_t -proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) +static ssize_t proc_bus_pci_read(struct file *file, char __user *buf, +				 size_t nbytes, loff_t *ppos)  { -	const struct inode *ino = file->f_path.dentry->d_inode; -	const struct proc_dir_entry *dp = PDE(ino); -	struct pci_dev *dev = dp->data; +	struct pci_dev *dev = PDE_DATA(file_inode(file));  	unsigned int pos = *ppos;  	unsigned int cnt, size; @@ -60,7 +37,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp  	 */  	if (capable(CAP_SYS_ADMIN)) -		size = dp->size; +		size = dev->cfg_size;  	else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)  		size = 128;  	else @@ -77,6 +54,8 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp  	if (!access_ok(VERIFY_WRITE, buf, cnt))  		return -EINVAL; +	pci_config_pm_runtime_get(dev); +  	if ((pos & 1) && cnt) {  		unsigned char val;  		pci_user_read_config_byte(dev, pos, &val); @@ -122,18 +101,19 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp  		cnt--;  	} +	pci_config_pm_runtime_put(dev); +  	*ppos = pos;  	return nbytes;  } -static ssize_t -proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos) +static ssize_t proc_bus_pci_write(struct file *file, const char __user *buf, +				  size_t nbytes, loff_t *ppos)  { -	struct inode *ino = file->f_path.dentry->d_inode; -	const struct proc_dir_entry *dp = PDE(ino); -	struct pci_dev *dev = dp->data; +	struct inode *ino = file_inode(file); +	struct pci_dev *dev = PDE_DATA(ino);  	int pos = *ppos; -	int size = dp->size; +	int size = dev->cfg_size;  	int cnt;  	if (pos >= size) @@ -147,6 +127,8 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof  	if (!access_ok(VERIFY_READ, buf, cnt))  		return -EINVAL; +	pci_config_pm_runtime_get(dev); +  	if ((pos & 1) && cnt) {  		unsigned char val;  		__get_user(val, buf); @@ -192,8 +174,10 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof  		cnt--;  	} +	pci_config_pm_runtime_put(dev); +  	*ppos = pos; -	i_size_write(ino, dp->size); +	i_size_write(ino, dev->cfg_size);  	return nbytes;  } @@ -205,8 +189,7 @@ struct pci_filp_private {  static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,  			       unsigned long arg)  { -	const struct proc_dir_entry *dp = PDE(file->f_dentry->d_inode); -	struct pci_dev *dev = dp->data; +	struct pci_dev *dev = PDE_DATA(file_inode(file));  #ifdef HAVE_PCI_MMAP  	struct pci_filp_private *fpriv = file->private_data;  #endif /* HAVE_PCI_MMAP */ @@ -238,7 +221,7 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,  	default:  		ret = -EINVAL;  		break; -	}; +	}  	return ret;  } @@ -246,9 +229,7 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,  #ifdef HAVE_PCI_MMAP  static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)  { -	struct inode *inode = file->f_path.dentry->d_inode; -	const struct proc_dir_entry *dp = PDE(inode); -	struct pci_dev *dev = dp->data; +	struct pci_dev *dev = PDE_DATA(file_inode(file));  	struct pci_filp_private *fpriv = file->private_data;  	int i, ret; @@ -257,7 +238,7 @@ static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)  	/* Make sure the caller is mapping a real resource for this device */  	for (i = 0; i < PCI_ROM_RESOURCE; i++) { -		if (pci_mmap_fits(dev, i, vma)) +		if (pci_mmap_fits(dev, i, vma,  PCI_MMAP_PROCFS))  			break;  	} @@ -418,7 +399,7 @@ int pci_proc_attach_device(struct pci_dev *dev)  			     &proc_bus_pci_operations, dev);  	if (!e)  		return -ENOMEM; -	e->size = dev->cfg_size; +	proc_set_size(e, dev->cfg_size);  	dev->procent = e;  	return 0; @@ -426,39 +407,14 @@ int pci_proc_attach_device(struct pci_dev *dev)  int pci_proc_detach_device(struct pci_dev *dev)  { -	struct proc_dir_entry *e; - -	if ((e = dev->procent)) { -		remove_proc_entry(e->name, dev->bus->procdir); -		dev->procent = NULL; -	} +	proc_remove(dev->procent); +	dev->procent = NULL;  	return 0;  } -#if 0 -int pci_proc_attach_bus(struct pci_bus* bus) +int pci_proc_detach_bus(struct pci_bus *bus)  { -	struct proc_dir_entry *de = bus->procdir; - -	if (!proc_initialized) -		return -EACCES; - -	if (!de) { -		char name[16]; -		sprintf(name, "%02x", bus->number); -		de = bus->procdir = proc_mkdir(name, proc_bus_pci_dir); -		if (!de) -			return -ENOMEM; -	} -	return 0; -} -#endif  /*  0  */ - -int pci_proc_detach_bus(struct pci_bus* bus) -{ -	struct proc_dir_entry *de = bus->procdir; -	if (de) -		remove_proc_entry(de->name, proc_bus_pci_dir); +	proc_remove(bus->procdir);  	return 0;  } @@ -466,6 +422,7 @@ static int proc_bus_pci_dev_open(struct inode *inode, struct file *file)  {  	return seq_open(file, &proc_bus_pci_devices_op);  } +  static const struct file_operations proc_bus_pci_dev_operations = {  	.owner		= THIS_MODULE,  	.open		= proc_bus_pci_dev_open, @@ -486,6 +443,4 @@ static int __init pci_proc_init(void)  	return 0;  } -  device_initcall(pci_proc_init); -  | 
