patch-2.4.27 linux-2.4.27/drivers/hotplug/pci_hotplug_core.c
Next file: linux-2.4.27/drivers/hotplug/pciehp.h
Previous file: linux-2.4.27/drivers/hotplug/pci_hotplug.h
Back to the patch index
Back to the overall index
- Lines: 249
- Date:
2004-08-07 16:26:04.740350311 -0700
- Orig file:
linux-2.4.26/drivers/hotplug/pci_hotplug_core.c
- Orig date:
2003-11-28 10:26:20.000000000 -0800
diff -urN linux-2.4.26/drivers/hotplug/pci_hotplug_core.c linux-2.4.27/drivers/hotplug/pci_hotplug_core.c
@@ -74,6 +74,7 @@
struct dentry *attention_dentry;
struct dentry *latch_dentry;
struct dentry *adapter_dentry;
+ struct dentry *address_dentry;
struct dentry *test_dentry;
struct dentry *max_bus_speed_dentry;
struct dentry *cur_bus_speed_dentry;
@@ -111,6 +112,7 @@
"66 MHz PCIX 533", /* 0x11 */
"100 MHz PCIX 533", /* 0x12 */
"133 MHz PCIX 533", /* 0x13 */
+ "25 GBps PCI-E", /* 0x14 */
};
static int pcihpfs_statfs (struct super_block *sb, struct statfs *buf)
@@ -312,6 +314,15 @@
llseek: default_file_lseek,
};
+/* file ops for the "address" files */
+static ssize_t address_read_file (struct file *file, char *buf, size_t count, loff_t *offset);
+static struct file_operations address_file_operations = {
+ read: address_read_file,
+ write: default_write_file,
+ open: default_open,
+ llseek: default_file_lseek,
+};
+
/* file ops for the "max bus speed" files */
static ssize_t max_bus_speed_read_file (struct file *file, char *buf, size_t count, loff_t *offset);
static struct file_operations max_bus_speed_file_operations = {
@@ -566,6 +577,7 @@
GET_STATUS(attention_status, u8)
GET_STATUS(latch_status, u8)
GET_STATUS(adapter_status, u8)
+GET_STATUS(address, u32)
GET_STATUS(max_bus_speed, enum pci_bus_speed)
GET_STATUS(cur_bus_speed, enum pci_bus_speed)
@@ -604,7 +616,7 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = len;
retval = len;
exit:
@@ -715,7 +727,7 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = len;
retval = len;
exit:
@@ -780,14 +792,15 @@
int retval;
int len;
u8 value;
+ loff_t off = *offset;
- dbg("count = %d, offset = %lld\n", count, *offset);
+ dbg("count = %d, offset = %lld\n", count, off);
- if (*offset < 0)
+ if (off < 0)
return -EINVAL;
if (count <= 0)
return 0;
- if (*offset != 0)
+ if (off != 0)
return 0;
if (slot == NULL) {
@@ -808,7 +821,7 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = off + len;
retval = len;
exit:
@@ -823,14 +836,15 @@
int retval;
int len;
u8 value;
+ loff_t off = *offset;
dbg("count = %d, offset = %lld\n", count, *offset);
- if (*offset < 0)
+ if (off < 0)
return -EINVAL;
if (count <= 0)
return 0;
- if (*offset != 0)
+ if (off != 0)
return 0;
if (slot == NULL) {
@@ -851,7 +865,54 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = off + len;
+ retval = len;
+
+exit:
+ free_page((unsigned long)page);
+ return retval;
+}
+
+static ssize_t address_read_file (struct file *file, char *buf, size_t count, loff_t *offset)
+{
+ struct hotplug_slot *slot = file->private_data;
+ unsigned char *page;
+ int retval;
+ int len;
+ u32 address;
+ loff_t off = *offset;
+
+ dbg("count = %d, offset = %lld\n", count, off);
+
+ if (off < 0)
+ return -EINVAL;
+ if (count <= 0)
+ return 0;
+ if (off != 0)
+ return 0;
+
+ if (slot == NULL) {
+ dbg("slot == NULL???\n");
+ return -ENODEV;
+ }
+
+ page = (unsigned char *)__get_free_page(GFP_KERNEL);
+ if (!page)
+ return -ENOMEM;
+
+ retval = get_address (slot, &address);
+ if (retval)
+ goto exit;
+ len = sprintf (page, "%04x:%02x:%02x\n",
+ (address >> 16) & 0xffff,
+ (address >> 8) & 0xff,
+ address & 0xff);
+
+ if (copy_to_user (buf, page, len)) {
+ retval = -EFAULT;
+ goto exit;
+ }
+ *offset = off + len;
retval = len;
exit:
@@ -869,14 +930,15 @@
int retval;
int len = 0;
enum pci_bus_speed value;
+ loff_t off = *offset;
- dbg ("count = %d, offset = %lld\n", count, *offset);
+ dbg ("count = %d, offset = %lld\n", count, off);
- if (*offset < 0)
+ if (off < 0)
return -EINVAL;
if (count <= 0)
return 0;
- if (*offset != 0)
+ if (off != 0)
return 0;
if (slot == NULL) {
@@ -903,7 +965,7 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = off + len;
retval = len;
exit:
@@ -919,14 +981,15 @@
int retval;
int len = 0;
enum pci_bus_speed value;
+ loff_t off = *offset;
- dbg ("count = %d, offset = %lld\n", count, *offset);
+ dbg ("count = %d, offset = %lld\n", count, off);
- if (*offset < 0)
+ if (off < 0)
return -EINVAL;
if (count <= 0)
return 0;
- if (*offset != 0)
+ if (off != 0)
return 0;
if (slot == NULL) {
@@ -953,7 +1016,7 @@
retval = -EFAULT;
goto exit;
}
- *offset += len;
+ *offset = off + len;
retval = len;
exit:
@@ -1055,6 +1118,13 @@
core->dir_dentry, slot,
&presence_file_operations);
+ if (slot->ops->get_address)
+ core->address_dentry =
+ fs_create_file ("address",
+ S_IFREG | S_IRUGO,
+ core->dir_dentry, slot,
+ &address_file_operations);
+
if (slot->ops->get_max_bus_speed)
core->max_bus_speed_dentry =
fs_create_file ("max_bus_speed",
@@ -1092,6 +1162,8 @@
fs_remove_file (core->latch_dentry);
if (core->adapter_dentry)
fs_remove_file (core->adapter_dentry);
+ if (core->address_dentry)
+ fs_remove_file (core->address_dentry);
if (core->max_bus_speed_dentry)
fs_remove_file (core->max_bus_speed_dentry);
if (core->cur_bus_speed_dentry)
@@ -1243,6 +1315,9 @@
if ((core->adapter_dentry) &&
(temp->info->adapter_status != info->adapter_status))
update_dentry_inode_time (core->adapter_dentry);
+ if ((core->address_dentry) &&
+ (temp->info->address != info->address))
+ update_dentry_inode_time (core->address_dentry);
if ((core->cur_bus_speed_dentry) &&
(temp->info->cur_bus_speed != info->cur_bus_speed))
update_dentry_inode_time (core->cur_bus_speed_dentry);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)