patch-2.4.21 linux-2.4.21/drivers/ide/ide-proc.c
Next file: linux-2.4.21/drivers/ide/ide-sibyte.c
Previous file: linux-2.4.21/drivers/ide/ide-probe.c
Back to the patch index
Back to the overall index
- Lines: 839
- Date:
2003-06-13 07:51:33.000000000 -0700
- Orig file:
linux-2.4.20/drivers/ide/ide-proc.c
- Orig date:
2002-08-02 17:39:44.000000000 -0700
diff -urN linux-2.4.20/drivers/ide/ide-proc.c linux-2.4.21/drivers/ide/ide-proc.c
@@ -1,7 +1,8 @@
/*
- * linux/drivers/ide/ide-proc.c Version 1.03 January 2, 1998
+ * linux/drivers/ide/ide-proc.c Version 1.05 Mar 05, 2003
*
* Copyright (C) 1997-1998 Mark Lord
+ * Copyright (C) 2003 Red Hat <alan@redhat.com>
*/
/*
@@ -57,6 +58,9 @@
*/
#include <linux/config.h>
+#define __NO_VERSION__
+#include <linux/module.h>
+
#include <asm/uaccess.h>
#include <linux/errno.h>
#include <linux/sched.h>
@@ -70,63 +74,15 @@
#include <asm/io.h>
+#ifdef CONFIG_ALL_PPC
+#include <asm/prom.h>
+#include <asm/pci-bridge.h>
+#endif
+
#ifndef MIN
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#endif
-#ifdef CONFIG_BLK_DEV_AEC62XX
-extern byte aec62xx_proc;
-int (*aec62xx_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_AEC62XX */
-#ifdef CONFIG_BLK_DEV_ALI15X3
-extern byte ali_proc;
-int (*ali_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_ALI15X3 */
-#ifdef CONFIG_BLK_DEV_AMD74XX
-extern byte amd74xx_proc;
-int (*amd74xx_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_AMD74XX */
-#ifdef CONFIG_BLK_DEV_CMD64X
-extern byte cmd64x_proc;
-int (*cmd64x_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_CMD64X */
-#ifdef CONFIG_BLK_DEV_CS5530
-extern byte cs5530_proc;
-int (*cs5530_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_CS5530 */
-#ifdef CONFIG_BLK_DEV_HPT34X
-extern byte hpt34x_proc;
-int (*hpt34x_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_HPT34X */
-#ifdef CONFIG_BLK_DEV_HPT366
-extern byte hpt366_proc;
-int (*hpt366_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_HPT366 */
-#ifdef CONFIG_BLK_DEV_PDC202XX
-extern byte pdc202xx_proc;
-int (*pdc202xx_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_PDC202XX */
-#ifdef CONFIG_BLK_DEV_PIIX
-extern byte piix_proc;
-int (*piix_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_PIIX */
-#ifdef CONFIG_BLK_DEV_SVWKS
-extern byte svwks_proc;
-int (*svwks_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_SVWKS */
-#ifdef CONFIG_BLK_DEV_SIS5513
-extern byte sis_proc;
-int (*sis_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_SIS5513 */
-#ifdef CONFIG_BLK_DEV_SLC90E66
-extern byte slc90e66_proc;
-int (*slc90e66_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_SLC90E66 */
-#ifdef CONFIG_BLK_DEV_VIA82CXXX
-extern byte via_proc;
-int (*via_display_info)(char *, char **, off_t, int) = NULL;
-#endif /* CONFIG_BLK_DEV_VIA82CXXX */
-
static int ide_getxdigit(char c)
{
int digit;
@@ -160,6 +116,17 @@
static struct proc_dir_entry * proc_ide_root = NULL;
+#ifdef CONFIG_BLK_DEV_IDEPCI
+#include <linux/delay.h>
+/*
+ * This is the list of registered PCI chipset driver data structures.
+ */
+static ide_pci_host_proc_t * ide_pci_host_proc_list;
+
+#endif /* CONFIG_BLK_DEV_IDEPCI */
+
+#undef __PROC_HELL
+
static int proc_ide_write_config
(struct file *file, const char *buffer, unsigned long count, void *data)
{
@@ -181,7 +148,11 @@
* Do one full pass to verify all parameters,
* then do another to actually write the regs.
*/
+#ifndef __PROC_HELL
save_flags(flags); /* all CPUs */
+#else
+ spin_lock_irqsave(&io_request_lock, flags);
+#endif
do {
const char *p;
if (for_real) {
@@ -190,15 +161,32 @@
ide_hwgroup_t *mategroup = NULL;
if (hwif->mate && hwif->mate->hwgroup)
mategroup = (ide_hwgroup_t *)(hwif->mate->hwgroup);
+#ifndef __PROC_HELL
cli(); /* all CPUs; ensure all writes are done together */
- while (mygroup->busy || (mategroup && mategroup->busy)) {
+#else
+ spin_lock_irqsave(&io_request_lock, flags);
+#endif
+ while (mygroup->busy ||
+ (mategroup && mategroup->busy)) {
+#ifndef __PROC_HELL
sti(); /* all CPUs */
- if (0 < (signed long)(jiffies - timeout)) {
+#else
+ spin_unlock_irqrestore(&io_request_lock, flags);
+#endif
+ if (time_after(jiffies, timeout)) {
printk("/proc/ide/%s/config: channel(s) busy, cannot write\n", hwif->name);
+#ifndef __PROC_HELL
restore_flags(flags); /* all CPUs */
+#else
+ spin_unlock_irqrestore(&io_request_lock, flags);
+#endif
return -EBUSY;
}
+#ifndef __PROC_HELL
cli(); /* all CPUs */
+#else
+ spin_lock_irqsave(&io_request_lock, flags);
+#endif
}
}
p = buffer;
@@ -213,7 +201,7 @@
break;
case 'P': is_pci = 1;
#ifdef CONFIG_BLK_DEV_IDEPCI
- if (hwif->pci_dev && !IDE_PCI_DEVID_EQ(hwif->pci_devid, IDE_PCI_DEVID_NULL))
+ if (hwif->pci_dev && !hwif->pci_dev->vendor)
break;
#endif /* CONFIG_BLK_DEV_IDEPCI */
msg = "not a PCI device";
@@ -281,7 +269,11 @@
break;
}
if (rc) {
+#ifndef __PROC_HELL
restore_flags(flags); /* all CPUs */
+#else
+ spin_unlock_irqrestore(&io_request_lock, flags);
+#endif
printk("proc_ide_write_config: error writing %s at bus %02x dev %02x reg 0x%x value 0x%x\n",
msg, dev->bus->number, dev->devfn, reg, val);
printk("proc_ide_write_config: error %d\n", rc);
@@ -311,11 +303,11 @@
*
*/
switch (digits) {
- case 2: outb(val, reg);
+ case 2: hwif->OUTB(val, reg);
break;
- case 4: outw(val, reg);
+ case 4: hwif->OUTW(val, reg);
break;
- case 8: outl(val, reg);
+ case 8: hwif->OUTL(val, reg);
break;
}
#endif /* !__mc68000__ && !CONFIG_APUS */
@@ -323,15 +315,23 @@
}
}
} while (!for_real++);
+#ifndef __PROC_HELL
restore_flags(flags); /* all CPUs */
+#else
+ spin_unlock_irqrestore(&io_request_lock, flags);
+#endif
return count;
parse_error:
+#ifndef __PROC_HELL
restore_flags(flags); /* all CPUs */
+#else
+ spin_unlock_irqrestore(&io_request_lock, flags);
+#endif
printk("parse error\n");
return xx_xx_parse_error(start, startn, msg);
}
-static int proc_ide_read_config
+int proc_ide_read_config
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
char *out = page;
@@ -340,20 +340,26 @@
#ifdef CONFIG_BLK_DEV_IDEPCI
ide_hwif_t *hwif = (ide_hwif_t *)data;
struct pci_dev *dev = hwif->pci_dev;
- if (!IDE_PCI_DEVID_EQ(hwif->pci_devid, IDE_PCI_DEVID_NULL) && dev && dev->bus) {
+ if ((hwif->pci_dev && hwif->pci_dev->vendor) && dev && dev->bus) {
int reg = 0;
- out += sprintf(out, "pci bus %02x device %02x vid %04x did %04x channel %d\n",
- dev->bus->number, dev->devfn, hwif->pci_devid.vid, hwif->pci_devid.did, hwif->channel);
+ out += sprintf(out, "pci bus %02x device %02x vendor %04x "
+ "device %04x channel %d\n",
+ dev->bus->number, dev->devfn,
+ hwif->pci_dev->vendor, hwif->pci_dev->device,
+ hwif->channel);
do {
- byte val;
+ u8 val;
int rc = pci_read_config_byte(dev, reg, &val);
if (rc) {
- printk("proc_ide_read_config: error %d reading bus %02x dev %02x reg 0x%02x\n",
+ printk("proc_ide_read_config: error %d reading"
+ " bus %02x dev %02x reg 0x%02x\n",
rc, dev->bus->number, dev->devfn, reg);
- out += sprintf(out, "??%c", (++reg & 0xf) ? ' ' : '\n');
+ out += sprintf(out, "??%c",
+ (++reg & 0xf) ? ' ' : '\n');
} else
- out += sprintf(out, "%02x%c", val, (++reg & 0xf) ? ' ' : '\n');
+ out += sprintf(out, "%02x%c",
+ val, (++reg & 0xf) ? ' ' : '\n');
} while (reg < 0x100);
} else
#endif /* CONFIG_BLK_DEV_IDEPCI */
@@ -362,6 +368,7 @@
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
+EXPORT_SYMBOL(proc_ide_read_config);
static int ide_getdigit(char c)
{
@@ -373,7 +380,7 @@
return digit;
}
-static int proc_ide_read_drivers
+int proc_ide_read_drivers
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
char *out = page;
@@ -384,14 +391,17 @@
while (p) {
driver = (ide_driver_t *) p->info;
if (driver)
- out += sprintf(out, "%s version %s\n", driver->name, driver->version);
+ out += sprintf(out, "%s version %s\n",
+ driver->name, driver->version);
p = p->next;
}
len = out - page;
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_imodel
+EXPORT_SYMBOL(proc_ide_read_drivers);
+
+int proc_ide_read_imodel
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_hwif_t *hwif = (ide_hwif_t *) data;
@@ -414,14 +424,38 @@
case ide_cmd646: name = "cmd646"; break;
case ide_cy82c693: name = "cy82c693"; break;
case ide_4drives: name = "4drives"; break;
- case ide_pmac: name = "mac-io"; break;
+ case ide_pmac: name = "pmac"; break;
default: name = "(unknown)"; break;
}
len = sprintf(page, "%s\n", name);
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_mate
+#ifdef CONFIG_ALL_PPC
+static int proc_ide_read_devspec
+ (char *page, char **start, off_t off, int count, int *eof, void *data)
+{
+ ide_hwif_t *hwif = (ide_hwif_t *) data;
+ int len;
+ struct device_node *ofnode = NULL;
+
+#ifdef CONFIG_BLK_DEV_IDE_PMAC
+ extern struct device_node* pmac_ide_get_of_node(int index);
+ if (hwif->chipset == ide_pmac)
+ ofnode = pmac_ide_get_of_node(hwif->index);
+#endif /* CONFIG_BLK_DEV_IDE_PMAC */
+#ifdef CONFIG_PCI
+ if (ofnode == NULL && hwif->pci_dev)
+ ofnode = pci_device_to_OF_node(hwif->pci_dev);
+#endif /* CONFIG_PCI */
+ len = sprintf(page, "%s\n", ofnode ? ofnode->full_name : "");
+ PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
+}
+#endif /* CONFIG_ALL_PPC */
+
+EXPORT_SYMBOL(proc_ide_read_imodel);
+
+int proc_ide_read_mate
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_hwif_t *hwif = (ide_hwif_t *) data;
@@ -434,7 +468,9 @@
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_channel
+EXPORT_SYMBOL(proc_ide_read_mate);
+
+int proc_ide_read_channel
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_hwif_t *hwif = (ide_hwif_t *) data;
@@ -446,41 +482,53 @@
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_get_identify(ide_drive_t *drive, byte *buf)
-{
- struct hd_drive_task_hdr taskfile;
- struct hd_drive_hob_hdr hobfile;
- memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
- memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
-
- taskfile.sector_count = 0x01;
- taskfile.command = (drive->media == ide_disk) ? WIN_IDENTIFY : WIN_PIDENTIFY ;
-
- return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
-}
+EXPORT_SYMBOL(proc_ide_read_channel);
-static int proc_ide_read_identify
+int proc_ide_read_identify
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *)data;
int len = 0, i = 0;
+ int err = 0;
- if (drive && !proc_ide_get_identify(drive, page)) {
+ len = sprintf(page, "\n");
+
+ if (drive)
+ {
unsigned short *val = (unsigned short *) page;
- char *out = ((char *)val) + (SECTOR_WORDS * 4);
- page = out;
- do {
- out += sprintf(out, "%04x%c", le16_to_cpu(*val), (++i & 7) ? ' ' : '\n');
- val += 1;
- } while (i < (SECTOR_WORDS * 2));
- len = out - page;
+
+ /*
+ * The current code can't handle a driverless
+ * identify query taskfile. Now the right fix is
+ * to add a 'default' driver but that is a bit
+ * more work.
+ *
+ * FIXME: this has to be fixed for hotswap devices
+ */
+
+ if(DRIVER(drive))
+ err = taskfile_lib_get_identify(drive, page);
+ else /* This relies on the ID changes */
+ val = (unsigned short *)drive->id;
+
+ if(!err)
+ {
+ char *out = ((char *)page) + (SECTOR_WORDS * 4);
+ page = out;
+ do {
+ out += sprintf(out, "%04x%c",
+ le16_to_cpu(*val), (++i & 7) ? ' ' : '\n');
+ val += 1;
+ } while (i < (SECTOR_WORDS * 2));
+ len = out - page;
+ }
}
- else
- len = sprintf(page, "\n");
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_settings
+EXPORT_SYMBOL(proc_ide_read_identify);
+
+int proc_ide_read_settings
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
@@ -488,6 +536,7 @@
char *out = page;
int len, rc, mul_factor, div_factor;
+ down(&ide_setting_sem);
out += sprintf(out, "name\t\t\tvalue\t\tmin\t\tmax\t\tmode\n");
out += sprintf(out, "----\t\t\t-----\t\t---\t\t---\t\t----\n");
while(setting) {
@@ -507,12 +556,15 @@
setting = setting->next;
}
len = out - page;
+ up(&ide_setting_sem);
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
+EXPORT_SYMBOL(proc_ide_read_settings);
+
#define MAX_LEN 30
-static int proc_ide_write_settings
+int proc_ide_write_settings
(struct file *file, const char *buffer, unsigned long count, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
@@ -573,12 +625,17 @@
--n;
++p;
}
+
+ down(&ide_setting_sem);
setting = ide_find_setting_by_name(drive, name);
if (!setting)
+ {
+ up(&ide_setting_sem);
goto parse_error;
-
+ }
if (for_real)
ide_write_setting(drive, setting, val * setting->div_factor / setting->mul_factor);
+ up(&ide_setting_sem);
}
} while (!for_real++);
return count;
@@ -587,21 +644,21 @@
return -EINVAL;
}
+EXPORT_SYMBOL(proc_ide_write_settings);
+
int proc_ide_read_capacity
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
- ide_driver_t *driver = (ide_driver_t *) drive->driver;
int len;
- if (!driver)
- len = sprintf(page, "(none)\n");
- else
- len = sprintf(page,"%llu\n",
- (unsigned long long) ((ide_driver_t *)drive->driver)->capacity(drive));
+ len = sprintf(page,"%llu\n",
+ (u64) ((ide_driver_t *)drive->driver)->capacity(drive));
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
+EXPORT_SYMBOL(proc_ide_read_capacity);
+
int proc_ide_read_geometry
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
@@ -609,38 +666,46 @@
char *out = page;
int len;
- out += sprintf(out,"physical %d/%d/%d\n", drive->cyl, drive->head, drive->sect);
- out += sprintf(out,"logical %d/%d/%d\n", drive->bios_cyl, drive->bios_head, drive->bios_sect);
+ out += sprintf(out,"physical %d/%d/%d\n",
+ drive->cyl, drive->head, drive->sect);
+ out += sprintf(out,"logical %d/%d/%d\n",
+ drive->bios_cyl, drive->bios_head, drive->bios_sect);
+
len = out - page;
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_dmodel
+EXPORT_SYMBOL(proc_ide_read_geometry);
+
+int proc_ide_read_dmodel
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
struct hd_driveid *id = drive->id;
int len;
- len = sprintf(page, "%.40s\n", (id && id->model[0]) ? (char *)id->model : "(none)");
+ len = sprintf(page, "%.40s\n",
+ (id && id->model[0]) ? (char *)id->model : "(none)");
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_read_driver
+EXPORT_SYMBOL(proc_ide_read_dmodel);
+
+int proc_ide_read_driver
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
ide_driver_t *driver = (ide_driver_t *) drive->driver;
int len;
- if (!driver)
- len = sprintf(page, "(none)\n");
- else
- len = sprintf(page, "%s version %s\n", driver->name, driver->version);
+ len = sprintf(page, "%s version %s\n",
+ driver->name, driver->version);
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
-static int proc_ide_write_driver
+EXPORT_SYMBOL(proc_ide_read_driver);
+
+int proc_ide_write_driver
(struct file *file, const char *buffer, unsigned long count, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
@@ -652,7 +717,9 @@
return count;
}
-static int proc_ide_read_media
+EXPORT_SYMBOL(proc_ide_write_driver);
+
+int proc_ide_read_media
(char *page, char **start, off_t off, int count, int *eof, void *data)
{
ide_drive_t *drive = (ide_drive_t *) data;
@@ -676,6 +743,8 @@
PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
}
+EXPORT_SYMBOL(proc_ide_read_media);
+
static ide_proc_entry_t generic_drive_entries[] = {
{ "driver", S_IFREG|S_IRUGO, proc_ide_read_driver, proc_ide_write_driver },
{ "identify", S_IFREG|S_IRUSR, proc_ide_read_identify, NULL },
@@ -702,6 +771,8 @@
}
}
+EXPORT_SYMBOL(ide_add_proc_entries);
+
void ide_remove_proc_entries(struct proc_dir_entry *dir, ide_proc_entry_t *p)
{
if (!dir || !p)
@@ -712,7 +783,9 @@
}
}
-static void create_proc_ide_drives(ide_hwif_t *hwif)
+EXPORT_SYMBOL(ide_remove_proc_entries);
+
+void create_proc_ide_drives(ide_hwif_t *hwif)
{
int d;
struct proc_dir_entry *ent;
@@ -742,6 +815,8 @@
}
}
+EXPORT_SYMBOL(create_proc_ide_drives);
+
void recreate_proc_ide_device(ide_hwif_t *hwif, ide_drive_t *drive)
{
struct proc_dir_entry *ent;
@@ -769,13 +844,14 @@
}
}
+EXPORT_SYMBOL(recreate_proc_ide_device);
+
void destroy_proc_ide_device(ide_hwif_t *hwif, ide_drive_t *drive)
{
ide_driver_t *driver = drive->driver;
if (drive->proc) {
- if (driver)
- ide_remove_proc_entries(drive->proc, driver->proc);
+ ide_remove_proc_entries(drive->proc, driver->proc);
ide_remove_proc_entries(drive->proc, generic_drive_entries);
remove_proc_entry(drive->name, proc_ide_root);
remove_proc_entry(drive->name, hwif->proc);
@@ -783,24 +859,29 @@
}
}
+EXPORT_SYMBOL(destroy_proc_ide_device);
+
void destroy_proc_ide_drives(ide_hwif_t *hwif)
{
int d;
for (d = 0; d < MAX_DRIVES; d++) {
ide_drive_t *drive = &hwif->drives[d];
-// ide_driver_t *driver = drive->driver;
-
if (drive->proc)
destroy_proc_ide_device(hwif, drive);
}
}
+EXPORT_SYMBOL(destroy_proc_ide_drives);
+
static ide_proc_entry_t hwif_entries[] = {
{ "channel", S_IFREG|S_IRUGO, proc_ide_read_channel, NULL },
{ "config", S_IFREG|S_IRUGO|S_IWUSR,proc_ide_read_config, proc_ide_write_config },
{ "mate", S_IFREG|S_IRUGO, proc_ide_read_mate, NULL },
{ "model", S_IFREG|S_IRUGO, proc_ide_read_imodel, NULL },
+#ifdef CONFIG_ALL_PPC
+ { "devspec", S_IFREG|S_IRUGO, proc_ide_read_devspec, NULL },
+#endif
{ NULL, 0, NULL, NULL }
};
@@ -823,7 +904,9 @@
}
}
-static void destroy_proc_ide_interfaces(void)
+EXPORT_SYMBOL(create_proc_ide_interfaces);
+
+void destroy_proc_ide_interfaces(void)
{
int h;
@@ -844,8 +927,34 @@
}
}
+EXPORT_SYMBOL(destroy_proc_ide_interfaces);
+
+#ifdef CONFIG_BLK_DEV_IDEPCI
+void ide_pci_register_host_proc (ide_pci_host_proc_t *p)
+{
+ ide_pci_host_proc_t *tmp;
+
+ if (!p) return;
+ p->next = NULL;
+ p->set = 1;
+ if (ide_pci_host_proc_list) {
+ tmp = ide_pci_host_proc_list;
+ while (tmp->next) tmp = tmp->next;
+ tmp->next = p;
+ } else
+ ide_pci_host_proc_list = p;
+}
+
+EXPORT_SYMBOL(ide_pci_register_host_proc);
+
+#endif /* CONFIG_BLK_DEV_IDEPCI */
+
void proc_ide_create(void)
{
+#ifdef CONFIG_BLK_DEV_IDEPCI
+ ide_pci_host_proc_t *p = ide_pci_host_proc_list;
+#endif /* CONFIG_BLK_DEV_IDEPCI */
+
proc_ide_root = proc_mkdir("ide", 0);
if (!proc_ide_root) return;
@@ -854,120 +963,40 @@
create_proc_read_entry("drivers", 0, proc_ide_root,
proc_ide_read_drivers, NULL);
-#ifdef CONFIG_BLK_DEV_AEC62XX
- if ((aec62xx_display_info) && (aec62xx_proc))
- create_proc_info_entry("aec62xx", 0, proc_ide_root, aec62xx_display_info);
-#endif /* CONFIG_BLK_DEV_AEC62XX */
-#ifdef CONFIG_BLK_DEV_ALI15X3
- if ((ali_display_info) && (ali_proc))
- create_proc_info_entry("ali", 0, proc_ide_root, ali_display_info);
-#endif /* CONFIG_BLK_DEV_ALI15X3 */
-#ifdef CONFIG_BLK_DEV_AMD74XX
- if ((amd74xx_display_info) && (amd74xx_proc))
- create_proc_info_entry("amd74xx", 0, proc_ide_root, amd74xx_display_info);
-#endif /* CONFIG_BLK_DEV_AMD74XX */
-#ifdef CONFIG_BLK_DEV_CMD64X
- if ((cmd64x_display_info) && (cmd64x_proc))
- create_proc_info_entry("cmd64x", 0, proc_ide_root, cmd64x_display_info);
-#endif /* CONFIG_BLK_DEV_CMD64X */
-#ifdef CONFIG_BLK_DEV_CS5530
- if ((cs5530_display_info) && (cs5530_proc))
- create_proc_info_entry("cs5530", 0, proc_ide_root, cs5530_display_info);
-#endif /* CONFIG_BLK_DEV_CS5530 */
-#ifdef CONFIG_BLK_DEV_HPT34X
- if ((hpt34x_display_info) && (hpt34x_proc))
- create_proc_info_entry("hpt34x", 0, proc_ide_root, hpt34x_display_info);
-#endif /* CONFIG_BLK_DEV_HPT34X */
-#ifdef CONFIG_BLK_DEV_HPT366
- if ((hpt366_display_info) && (hpt366_proc))
- create_proc_info_entry("hpt366", 0, proc_ide_root, hpt366_display_info);
-#endif /* CONFIG_BLK_DEV_HPT366 */
-#ifdef CONFIG_BLK_DEV_SVWKS
- if ((svwks_display_info) && (svwks_proc))
- create_proc_info_entry("svwks", 0, proc_ide_root, svwks_display_info);
-#endif /* CONFIG_BLK_DEV_SVWKS */
-#ifdef CONFIG_BLK_DEV_PDC202XX
- if ((pdc202xx_display_info) && (pdc202xx_proc))
- create_proc_info_entry("pdc202xx", 0, proc_ide_root, pdc202xx_display_info);
-#endif /* CONFIG_BLK_DEV_PDC202XX */
-#ifdef CONFIG_BLK_DEV_PIIX
- if ((piix_display_info) && (piix_proc))
- create_proc_info_entry("piix", 0, proc_ide_root, piix_display_info);
-#endif /* CONFIG_BLK_DEV_PIIX */
-#ifdef CONFIG_BLK_DEV_SIS5513
- if ((sis_display_info) && (sis_proc))
- create_proc_info_entry("sis", 0, proc_ide_root, sis_display_info);
-#endif /* CONFIG_BLK_DEV_SIS5513 */
-#ifdef CONFIG_BLK_DEV_SLC90E66
- if ((slc90e66_display_info) && (slc90e66_proc))
- create_proc_info_entry("slc90e66", 0, proc_ide_root, slc90e66_display_info);
-#endif /* CONFIG_BLK_DEV_SLC90E66 */
-#ifdef CONFIG_BLK_DEV_VIA82CXXX
- if ((via_display_info) && (via_proc))
- create_proc_info_entry("via", 0, proc_ide_root, via_display_info);
-#endif /* CONFIG_BLK_DEV_VIA82CXXX */
+#ifdef CONFIG_BLK_DEV_IDEPCI
+ while (p != NULL)
+ {
+ if (p->name != NULL && p->set == 1 && p->get_info != NULL)
+ {
+ p->parent = proc_ide_root;
+ create_proc_info_entry(p->name, 0, p->parent, p->get_info);
+ p->set = 2;
+ }
+ p = p->next;
+ }
+#endif /* CONFIG_BLK_DEV_IDEPCI */
}
+EXPORT_SYMBOL(proc_ide_create);
+
void proc_ide_destroy(void)
{
- /*
- * Mmmm.. does this free up all resources,
- * or do we need to do a more proper cleanup here ??
- */
-#ifdef CONFIG_BLK_DEV_AEC62XX
- if ((aec62xx_display_info) && (aec62xx_proc))
- remove_proc_entry("ide/aec62xx",0);
-#endif /* CONFIG_BLK_DEV_AEC62XX */
-#ifdef CONFIG_BLK_DEV_ALI15X3
- if ((ali_display_info) && (ali_proc))
- remove_proc_entry("ide/ali",0);
-#endif /* CONFIG_BLK_DEV_ALI15X3 */
-#ifdef CONFIG_BLK_DEV_AMD74XX
- if ((amd74xx_display_info) && (amd74xx_proc))
- remove_proc_entry("ide/amd74xx",0);
-#endif /* CONFIG_BLK_DEV_AMD74XX */
-#ifdef CONFIG_BLK_DEV_CMD64X
- if ((cmd64x_display_info) && (cmd64x_proc))
- remove_proc_entry("ide/cmd64x",0);
-#endif /* CONFIG_BLK_DEV_CMD64X */
-#ifdef CONFIG_BLK_DEV_CS5530
- if ((cs5530_display_info) && (cs5530_proc))
- remove_proc_entry("ide/cs5530",0);
-#endif /* CONFIG_BLK_DEV_CS5530 */
-#ifdef CONFIG_BLK_DEV_HPT34X
- if ((hpt34x_display_info) && (hpt34x_proc))
- remove_proc_entry("ide/hpt34x",0);
-#endif /* CONFIG_BLK_DEV_HPT34X */
-#ifdef CONFIG_BLK_DEV_HPT366
- if ((hpt366_display_info) && (hpt366_proc))
- remove_proc_entry("ide/hpt366",0);
-#endif /* CONFIG_BLK_DEV_HPT366 */
-#ifdef CONFIG_BLK_DEV_PDC202XX
- if ((pdc202xx_display_info) && (pdc202xx_proc))
- remove_proc_entry("ide/pdc202xx",0);
-#endif /* CONFIG_BLK_DEV_PDC202XX */
-#ifdef CONFIG_BLK_DEV_PIIX
- if ((piix_display_info) && (piix_proc))
- remove_proc_entry("ide/piix",0);
-#endif /* CONFIG_BLK_DEV_PIIX */
-#ifdef CONFIG_BLK_DEV_SVWKS
- if ((svwks_display_info) && (svwks_proc))
- remove_proc_entry("ide/svwks",0);
-#endif /* CONFIG_BLK_DEV_SVWKS */
-#ifdef CONFIG_BLK_DEV_SIS5513
- if ((sis_display_info) && (sis_proc))
- remove_proc_entry("ide/sis", 0);
-#endif /* CONFIG_BLK_DEV_SIS5513 */
-#ifdef CONFIG_BLK_DEV_SLC90E66
- if ((slc90e66_display_info) && (slc90e66_proc))
- remove_proc_entry("ide/slc90e66",0);
-#endif /* CONFIG_BLK_DEV_SLC90E66 */
-#ifdef CONFIG_BLK_DEV_VIA82CXXX
- if ((via_display_info) && (via_proc))
- remove_proc_entry("ide/via",0);
-#endif /* CONFIG_BLK_DEV_VIA82CXXX */
+#ifdef CONFIG_BLK_DEV_IDEPCI
+ ide_pci_host_proc_t *p = ide_pci_host_proc_list;
+ char name[32];
- remove_proc_entry("ide/drivers", 0);
+ while ((p->name != NULL) && (p->set) && (p->get_info != NULL)) {
+ name[0] = '\0';
+ sprintf(name, "ide/%s", p->name);
+ if (p->set == 2)
+ remove_proc_entry(p->name, p->parent);
+ if (p->next == NULL) break;
+ p = p->next;
+ }
+#endif /* CONFIG_BLK_DEV_IDEPCI */
+ remove_proc_entry("ide/drivers", proc_ide_root);
destroy_proc_ide_interfaces();
remove_proc_entry("ide", 0);
}
+
+EXPORT_SYMBOL(proc_ide_destroy);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)