diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/ata_piix.c linux-2.4.33-pre3/drivers/scsi/ata_piix.c --- linux-2.4.33-pre3.orig/drivers/scsi/ata_piix.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/ata_piix.c 2006-09-06 11:46:16.000000000 -0700 @@ -144,6 +144,9 @@ static Scsi_Host_Template piix_sht = { .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/libata-core.c linux-2.4.33-pre3/drivers/scsi/libata-core.c --- linux-2.4.33-pre3.orig/drivers/scsi/libata-core.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/libata-core.c 2006-09-06 11:46:16.000000000 -0700 @@ -4871,6 +4871,50 @@ int pci_test_config_bits(struct pci_dev } #endif /* CONFIG_PCI */ +#ifdef CONFIG_PROC_FS +int ata_scsi_proc_info(char *buffer, char **start, off_t offset, int length, int hostno, int inout) +{ + struct Scsi_Host *host = NULL; + struct ata_port *ap; + char *pos = buffer; + int i, pci_bus, pci_slot, pci_func; + + for (host = scsi_hostlist; host; host = host->next) { + if (host->host_no == hostno) { + break; + } + } + if (!host) { + printk(KERN_WARNING "ata: scsi host %d not found.\n", hostno); + return (-EINVAL); + } + if (inout) { /* write requested */ + return (-EINVAL); + } + ap = (struct ata_port *) &host->hostdata[0]; + pci_bus = ap->host_set->dev->pdev.bus->number; + pci_slot = PCI_SLOT(ap->host_set->dev->pdev.devfn); + pci_func = PCI_FUNC(ap->host_set->dev->pdev.devfn); + + pos += sprintf(pos, "%x:%x:%x ATA Port %d Drive(s)", pci_bus, pci_slot, pci_func, ap->hard_port_no); + for (i = 0; i < ATA_MAX_DEVICES; i++) { + if (ata_dev_present(&ap->device[i])) { + pos += sprintf(pos, " %d", ap->device[i].devno); + } + } + pos += sprintf(pos, "\n"); + *start = buffer + offset; + if(pos - buffer < offset) { + return 0; + } + else if(pos - buffer - offset < length) { + return (pos - buffer - offset); + } + else { + return length; + } +} +#endif /* CONFIG_PROC_FS */ static int __init ata_init(void) { @@ -4970,3 +5014,8 @@ EXPORT_SYMBOL_GPL(ata_pci_init_native_mo EXPORT_SYMBOL_GPL(ata_pci_init_one); EXPORT_SYMBOL_GPL(ata_pci_remove_one); #endif /* CONFIG_PCI */ + +#ifdef CONFIG_PROC_FS +EXPORT_SYMBOL_GPL(ata_scsi_proc_info); +#endif /* CONFIG_PROC_FS */ + diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/libata.h linux-2.4.33-pre3/drivers/scsi/libata.h --- linux-2.4.33-pre3.orig/drivers/scsi/libata.h 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/libata.h 2006-09-06 11:46:16.000000000 -0700 @@ -52,7 +52,6 @@ extern void swap_buf_le16(u16 *buf, unsi extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg); extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg); - /* libata-scsi.c */ extern int ata_scsi_error(struct Scsi_Host *host); extern unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf, diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_nv.c linux-2.4.33-pre3/drivers/scsi/sata_nv.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_nv.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_nv.c 2006-09-06 11:46:16.000000000 -0700 @@ -235,6 +235,9 @@ static Scsi_Host_Template nv_sht = { .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_promise.c linux-2.4.33-pre3/drivers/scsi/sata_promise.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_promise.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_promise.c 2006-09-06 11:46:16.000000000 -0700 @@ -110,6 +110,9 @@ static Scsi_Host_Template pdc_ata_sht = .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_qstor.c linux-2.4.33-pre3/drivers/scsi/sata_qstor.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_qstor.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_qstor.c 2006-09-06 11:46:16.000000000 -0700 @@ -145,6 +145,9 @@ static Scsi_Host_Template qs_ata_sht = { //FIXME .use_clustering = ATA_SHT_USE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_svw.c linux-2.4.33-pre3/drivers/scsi/sata_svw.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_svw.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_svw.c 2006-09-06 11:46:16.000000000 -0700 @@ -300,8 +300,12 @@ static Scsi_Host_Template k2_sata_sht = .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS #ifdef CONFIG_PPC_OF .proc_info = k2_sata_proc_info, +#else + .proc_info = ata_scsi_proc_info, +#endif #endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_sx4.c linux-2.4.33-pre3/drivers/scsi/sata_sx4.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_sx4.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_sx4.c 2006-09-06 11:46:16.000000000 -0700 @@ -193,6 +193,9 @@ static Scsi_Host_Template pdc_sata_sht = .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_uli.c linux-2.4.33-pre3/drivers/scsi/sata_uli.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_uli.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_uli.c 2006-09-06 11:46:16.000000000 -0700 @@ -87,6 +87,9 @@ static Scsi_Host_Template uli_sht = { .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_via.c linux-2.4.33-pre3/drivers/scsi/sata_via.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_via.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_via.c 2006-09-06 11:46:16.000000000 -0700 @@ -106,6 +106,9 @@ static Scsi_Host_Template svia_sht = { .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/drivers/scsi/sata_vsc.c linux-2.4.33-pre3/drivers/scsi/sata_vsc.c --- linux-2.4.33-pre3.orig/drivers/scsi/sata_vsc.c 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/drivers/scsi/sata_vsc.c 2006-09-06 11:46:16.000000000 -0700 @@ -234,6 +234,9 @@ static Scsi_Host_Template vsc_sata_sht = .emulated = ATA_SHT_EMULATED, .use_clustering = ATA_SHT_USE_CLUSTERING, .proc_name = DRV_NAME, +#ifdef CONFIG_PROC_FS + .proc_info = ata_scsi_proc_info, +#endif .bios_param = ata_std_bios_param, }; diff -urNp linux-2.4.33-pre3.orig/include/linux/libata.h linux-2.4.33-pre3/include/linux/libata.h --- linux-2.4.33-pre3.orig/include/linux/libata.h 2006-05-04 10:35:42.000000000 -0700 +++ linux-2.4.33-pre3/include/linux/libata.h 2006-09-06 11:46:45.000000000 -0700 @@ -526,6 +526,10 @@ extern int pci_test_config_bits(struct p #endif /* CONFIG_PCI */ +#ifdef CONFIG_PROC_FS +extern int ata_scsi_proc_info(char *buffer, char **start, off_t offset, + int length, int hostno, int inout); +#endif /* CONFIG_PROC_FS */ static inline int ata_sg_is_last(struct scatterlist *sg, struct ata_queued_cmd *qc)