Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Sun, 8 Dec 2002 00:05:04 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Sun, 8 Dec 2002 00:05:04 -0500 Received: from CPE3236333432363339.cpe.net.cable.rogers.com ([24.114.185.204]:1796 "HELO coredump.sh0n.net") by vger.kernel.org with SMTP id ; Sun, 8 Dec 2002 00:05:00 -0500 From: Shawn Starr Organization: sh0n.net To: Linux Kernel Subject: Re: [PATCH][2.5][RFT] ide-pnp.c conversion to new PnP layer Date: Sun, 8 Dec 2002 00:14:38 -0500 User-Agent: KMail/1.5 References: <200212072245.56906.spstarr@sh0n.net> <200212072320.38373.spstarr@sh0n.net> In-Reply-To: <200212072320.38373.spstarr@sh0n.net> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Message-Id: <200212080014.38583.spstarr@sh0n.net> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 9478 Lines: 276 Found the jumper for the PS/2 connector. Enabled this. PNP still wants IRQ12 though. So if I had a PS/2 mouse, it would conflict with the old ISA Sound blaster IDE Controller. Shawn. > > On December 7, 2002 10:48 pm, Shawn Starr wrote: > > Things have been going on the background (this issue that is). The drive > > is detected with TCQ disabled (kernel panics when enabled). > > > > pnp: the driver 'ide-pnp' has been registered > > pnp: pnp: match found with the PnP device 'er' and the driver 'ide-pnp' > > pnp: the device 'er' has been activated > > ide6: ISA Plug and Play IDE interface > > hdm: probing with STATUS(0x50) instead of ALTSTATUS(0xff) > > hdm: WDC AC32500H, ATA DISK drive > > hdn: probing with STATUS(0x00) instead of ALTSTATUS(0xff) > > hdn: probing with STATUS(0x01) instead of ALTSTATUS(0xff) > > isa bounce pool size: 16 pages > > ide6 at 0x100-0x107,0x300 on irq 12 > > hda: host protected area => 1 > > hda: 78177792 sectors (40027 MB) w/1819KiB Cache, CHS=4866/255/63, (U)DMA > > hda: hda1 hda2 > > hdm: irq timeout: status=0x50 { DriveReady SeekComplete } > > > > hdm: setmax LBA 252928064, native 4999680 > > hdm: 4999680 sectors (2560 MB) w/128KiB Cache, CHS=4960/16/63 > > hdm:hdm: irq timeout: status=0x50 { DriveReady SeekComplete } > > ide6: unexpected interrupt, status=0x58, count=1 > > ide6: reset: master: error (0x00?) > > ide6: reset: master: error (0x00?) > > end_request: I/O error, dev hdm, sector 0 > > unknown partition table > > > > The odd thing is its reporting ide6 when I only have ide0, ide1 :-) > > (onboard PIIX3 IDE controller). > > > > We can't use IRQ 12 because this board has a PS/2 port (but I don't think > > the jumper [if there is one] is enabled). > > > > Just thought i'd keep LKML in the loop with the progress. > > > > On December 7, 2002 07:37 pm, Zwane Mwaikambo wrote: > > > Here is a traditional diff in contrast to the CVS thing which doesn't > > > seem to apply to anyone else's tree. > > > > > > --- linux-2.5.50-bochs/drivers/ide/ide-pnp.c.orig 2002-12-07 > > > 19:35:04.000000000 -0500 +++ > > > linux-2.5.50-bochs/drivers/ide/ide-pnp.c 2002-12-07 19:35:13.000000000 > > > -0500 @@ -18,13 +18,11 @@ > > > > > > #include > > > #include > > > - > > > -#include > > > +#include > > > > > > #define DEV_IO(dev, index) (dev->resource[index].start) > > > #define DEV_IRQ(dev, index) (dev->irq_resource[index].start) > > > - > > > -#define DEV_NAME(dev) (dev->bus->name ? dev->bus->name : "ISA PnP") > > > +#define DEV_NAME(dev) (dev->protocol->name ? dev->protocol->name : > > > "ISA PnP") > > > > > > #define GENERIC_HD_DATA 0 > > > #define GENERIC_HD_ERROR 1 > > > @@ -35,125 +33,125 @@ > > > #define GENERIC_HD_SELECT 6 > > > #define GENERIC_HD_STATUS 7 > > > > > > -static int generic_ide_offsets[IDE_NR_PORTS] __initdata = { > > > +static int generic_ide_offsets[IDE_NR_PORTS] = { > > > GENERIC_HD_DATA, GENERIC_HD_ERROR, GENERIC_HD_NSECTOR, > > > GENERIC_HD_SECTOR, GENERIC_HD_LCYL, GENERIC_HD_HCYL, > > > GENERIC_HD_SELECT, GENERIC_HD_STATUS, -1, -1 > > > }; > > > > > > /* ISA PnP device table entry */ > > > -struct pnp_dev_t { > > > - unsigned short card_vendor, card_device, vendor, device; > > > - int (*init_fn)(struct pci_dev *dev, int enable); > > > +struct idepnp_private { > > > + struct pnp_dev *dev; > > > + struct pci_dev pci_dev; /* we need this for the upper layers */ > > > + int (*init_fn)(struct idepnp_private *device, int enable); > > > }; > > > > > > -/* Generic initialisation function for ISA PnP IDE interface */ > > > +/* Barf bags at the ready! Enough to satisfy IDE core */ > > > +static void pnp_to_pci(struct pnp_dev *pnp_dev, struct pci_dev > > > *pci_dev) +{ > > > + pci_dev->dev = pnp_dev->dev; > > > + pci_dev->driver_data = pnp_get_drvdata(pnp_dev); > > > + pci_dev->irq = DEV_IRQ(pnp_dev, 0); > > > + pci_set_dma_mask(pci_dev, 0x00ffffff); > > > +} > > > > > > -static int __init pnpide_generic_init(struct pci_dev *dev, int enable) > > > +/* Generic initialisation function for ISA PnP IDE interface */ > > > +static int pnpide_generic_init(struct idepnp_private *device, int > > > enable) { > > > hw_regs_t hw; > > > ide_hwif_t *hwif; > > > int index; > > > + struct pnp_dev *dev = device->dev; > > > > > > - if (!enable) > > > + if (!enable) { > > > + /* nothing to do for now */ > > > return 0; > > > + } > > > > > > if (!(DEV_IO(dev, 0) && DEV_IO(dev, 1) && DEV_IRQ(dev, 0))) > > > - return 1; > > > + return -EINVAL; > > > > > > ide_setup_ports(&hw, (ide_ioreg_t) DEV_IO(dev, 0), > > > generic_ide_offsets, > > > (ide_ioreg_t) DEV_IO(dev, 1), > > > 0, NULL, > > > -// generic_pnp_ide_iops, > > > + /* generic_pnp_ide_iops, */ > > > DEV_IRQ(dev, 0)); > > > > > > index = ide_register_hw(&hw, &hwif); > > > > > > if (index != -1) { > > > printk(KERN_INFO "ide%d: %s IDE interface\n", index, > > > DEV_NAME(dev)); - hwif->pci_dev = dev; > > > + hwif->pci_dev = &device->pci_dev; > > > return 0; > > > } > > > > > > - return 1; > > > + return -ENODEV; > > > } > > > > > > /* Add your devices here :)) */ > > > -struct pnp_dev_t idepnp_devices[] __initdata = { > > > - /* Generic ESDI/IDE/ATA compatible hard disk controller */ > > > - { ISAPNP_ANY_ID, ISAPNP_ANY_ID, > > > - ISAPNP_VENDOR('P', 'N', 'P'), ISAPNP_DEVICE(0x0600), > > > - pnpide_generic_init }, > > > - { 0 } > > > +#define IDEPNP_GENERIC_INIT 0 > > > +static const struct pnp_device_id pnp_ide_devs[] = { > > > + /* Generic ESDI/IDE/ATA compatible hard disk controller */ > > > + {"PNP0600", IDEPNP_GENERIC_INIT}, > > > + {"", 0} > > > }; > > > > > > #define NR_PNP_DEVICES 8 > > > -struct pnp_dev_inst { > > > - struct pci_dev *dev; > > > - struct pnp_dev_t *dev_type; > > > -}; > > > -static struct pnp_dev_inst devices[NR_PNP_DEVICES]; > > > -static int pnp_ide_dev_idx = 0; > > > +/* Nb. pnpide_generic_init is indexed as IDEPNP_GENERIC_INIT */ > > > +static int (*init_functions[])(struct idepnp_private *device, int > > > enable) = {pnpide_generic_init}; +static struct idepnp_private > > > devices[NR_PNP_DEVICES]; > > > +static int pnp_ide_dev_idx; > > > > > > /* > > > * Probe for ISA PnP IDE interfaces. > > > */ > > > - > > > -void __init pnpide_init(int enable) > > > +static int pnp_ide_probe(struct pnp_dev *pdev, const struct > > > pnp_device_id *dev_id) { > > > - struct pci_dev *dev = NULL; > > > - struct pnp_dev_t *dev_type; > > > + int ret; > > > + struct idepnp_private *p; > > > > > > - if (!isapnp_present()) > > > - return; > > > + /* > > > + * Register device in the array to > > > + * deactivate it on a module unload. > > > + */ > > > + if (pnp_ide_dev_idx >= NR_PNP_DEVICES) > > > + return -ENOSPC; > > > + > > > + p = &devices[pnp_ide_dev_idx]; > > > + p->init_fn = init_functions[dev_id->driver_data]; > > > + p->dev = pdev; > > > + pnp_set_drvdata(pdev, p); > > > + pnp_to_pci(p->dev, &p->pci_dev); > > > + ret = p->init_fn(p, 1); > > > + if (!ret) > > > + pnp_ide_dev_idx++; > > > + > > > + return ret; > > > +} > > > > > > - /* Module unload, deactivate all registered devices. */ > > > - if (!enable) { > > > - int i; > > > - for (i = 0; i < pnp_ide_dev_idx; i++) { > > > - dev = devices[i].dev; > > > - devices[i].dev_type->init_fn(dev, 0); > > > - if (dev->deactivate) > > > - dev->deactivate(dev); > > > - } > > > - return; > > > - } > > > +static void pnp_ide_remove(struct pnp_dev *dev) > > > +{ > > > + struct idepnp_private *p = pnp_get_drvdata(dev); > > > + > > > + /* if p is null you have a bug elsewhere */ > > > + p->init_fn(p, 0); > > > + pnp_ide_dev_idx--; > > > + return; > > > +} > > > > > > - for (dev_type = idepnp_devices; dev_type->vendor; dev_type++) { > > > - while ((dev = isapnp_find_dev(NULL, dev_type->vendor, > > > - dev_type->device, dev))) { > > > - > > > - if (dev->active) > > > - continue; > > > - > > > - if (dev->prepare && dev->prepare(dev) < 0) { > > > - printk(KERN_ERR"ide-pnp: %s prepare failed\n", DEV_NAME(dev)); > > > - continue; > > > - } > > > - > > > - if (dev->activate && dev->activate(dev) < 0) { > > > - printk(KERN_ERR"ide: %s activate failed\n", DEV_NAME(dev)); > > > - continue; > > > - } > > > - > > > - /* Call device initialization function */ > > > - if (dev_type->init_fn(dev, 1)) { > > > - if (dev->deactivate(dev)) > > > - dev->deactivate(dev); > > > - } else { > > > -#ifdef MODULE > > > - /* > > > - * Register device in the array to > > > - * deactivate it on a module unload. > > > - */ > > > - if (pnp_ide_dev_idx >= NR_PNP_DEVICES) > > > - return; > > > - devices[pnp_ide_dev_idx].dev = dev; > > > - devices[pnp_ide_dev_idx].dev_type = dev_type; > > > - pnp_ide_dev_idx++; > > > -#endif > > > - } > > > - } > > > - } > > > +static struct pnp_driver idepnp_driver = { > > > + .name = "ide-pnp", > > > + .id_table = pnp_ide_devs, > > > + .probe = pnp_ide_probe, > > > + .remove = pnp_ide_remove > > > +}; > > > + > > > +void pnpide_init(int enable) > > > +{ > > > + if (enable) > > > + pnp_register_driver(&idepnp_driver); > > > + else > > > + pnp_unregister_driver(&idepnp_driver); > > > } > > > + - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/