On 07/06/07, Rob Landley <[EMAIL PROTECTED]> wrote:
In the 2.6.21 kernel the sym53c8xx_2 SCSI controller changed in a way that QEMU's virtual SCSI controller doesn't handle this properly:
I spent some time yesterday trying to find out what was happening and the results are below. QEMU's virtual SCSI controller does handle it properly and the kernel sym53c8xx_2 driver changes are not at fault. The first surprising fact, and one which took me long to figure out, was that all the SCSI errors are a result of a case of simple interrupts from the controller not reaching the SCSI driver, hence the timeouts and whatnot. The sym53c8xx_2 driver gets irq 0 instead of 27, from the tiwsted PCI irq number assignment logic. This was because the VersatilePB PCI driver was reading the irq pin number from a wrong address in the scsi controller's (which is a pci device) config structure, and the read always returned a 0 which normally means that the device uses no interrupts (actually all 8-bit accesses were broken). I corrected the versatile PCI code and sent a patch to linux. However, the funny part is that this code had not changed since 2.6.18, so how did it break in 2.6.21? Well, it was broken all the time, but there was a bug in generic PCI code in drivers/pci/setup-irq.c, which effectively caused the value read from the device's supplied config, to be discarded, which got fixed in 2.6.21. If you definitely must use 2.6.21, this qemu workaround also works (need to do the same for any other PCI device you want to use): diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c index 19bf2a1..eedbc1d 100644 --- a/hw/lsi53c895a.c +++ b/hw/lsi53c895a.c @@ -1845,6 +1845,7 @@ void *lsi_scsi_init(PCIBus *bus, int devfn) s->pci_dev.config[0x02] = 0x12; s->pci_dev.config[0x03] = 0x00; s->pci_dev.config[0x0b] = 0x01; + s->pci_dev.config[0x3c] = 0x01; /* ugly workaround */ s->pci_dev.config[0x3d] = 0x01; /* interrupt pin 1 */ s->mmio_io_addr = cpu_register_io_memory(0, lsi_mmio_readfn, Regards