Re: INITIO scsi driver fails to work properly

James Bottomley
2008-01-11T05:16:30Z

On Fri, 2008-01-04 at 02:18 +0200, Filippos Papadopoulos wrote:
> First of all let me wish a happy new year.
> I come back from the vacations and i compiled the initio driver with
>
> #define DEBUG_INTERRUPT 1
> #define DEBUG_QUEUE 1
> #define DEBUG_STATE 1
> #define INT_DISC 1
>
> I used the sources from 2.6.24-rc6-git9 kernel. At kernel boot time the initio
> driver prints the following:
>
> " scsi: Initio INI-9X00U/UW SCSI device driver
> Find scb at c0c00000
> Append pend scb c0c00000;"
>
> After 3 seconds the whole system freezes there and i have to reboot.
>
>
>
> P.S here is the info from 'lspci -vv' running 2.6.16.13 kernel:
>
> "00:08.0 SCSI storage controller: Initio Corporation 360P (rev 02)
> Subsystem: Unknown device 9292:0202
> Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop-
> ParErr- Stepping- SERR- FastB2B-
> Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium
> >TAbort- <TAbort- <MAbort- >SERR- <PERR-
> Latency: 32, Cache Line Size 08
> Interrupt: pin A routed to IRQ 11
> Region 0: I/O ports at d000 [size=256]

This proves the BAR0 to be non zero, but I also take it from your report
that the

initio: I/O port range 0x0 is busy.

message is also gone?

> Region 1: Memory at ef000000 (32-bit, non-prefetchable) [size=4K]
> [virtual] Expansion ROM at 50000000 [disabled] [size=128K]
> "

I think there's still one remaining bug from the sg_list conversion,
namely that cblk->sglen is never set, but it is used to count the number
of elements in the sg array. Could you try this patch (on top of
everything else) and see if the problem is finally fixed?

Thanks,

James

---
diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c
index 01bf018..d038459 100644
--- a/drivers/scsi/initio.c
+++ b/drivers/scsi/initio.c
@@ -2603,6 +2603,7 @@ static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * c
nseg = scsi_dma_map(cmnd);
BUG_ON(nseg < 0);
if (nseg) {
+ cblk->sglen = nseg;
dma_addr = dma_map_single(&host->pci_dev->dev, &cblk->sglist[0],
sizeof(struct sg_entry) * TOTAL_SG_ENTRY,
DMA_BIDIRECTIONAL);