Commit e2d435ea authored by Stuart Swales's avatar Stuart Swales Committed by James Bottomley

[SCSI] initio: fix module hangs on loading

I've verified (on my Initio 9100 with a DAT drive) that the
2.6.24-rc8-git6 initio module still hangs on loading.

These fixes (other than the printk) are needed to get the module to load
ok (and work correctly) with my adapter & tape drive.

a) printk cosmetic fix

b) cblk->sglen needs setting for later DMA I/O routines to use

c) host->bios_addr needs setting for debug output correctness

d) semaph & semaph_lock initialisation had got lost since 2.6.22

e) since 2.6.22 the bios data address was truncated to 16 bits (needs 20
when shifted left)
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 8f7b3d15
...@@ -823,7 +823,7 @@ static void initio_append_busy_scb(struct initio_host * host, struct scsi_ctrl_b ...@@ -823,7 +823,7 @@ static void initio_append_busy_scb(struct initio_host * host, struct scsi_ctrl_b
{ {
#if DEBUG_QUEUE #if DEBUG_QUEUE
printk("append busy SCB %o; ", scbp); printk("append busy SCB %p; ", scbp);
#endif #endif
if (scbp->tagmsg) if (scbp->tagmsg)
host->act_tags[scbp->target]++; host->act_tags[scbp->target]++;
...@@ -2609,6 +2609,7 @@ static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * c ...@@ -2609,6 +2609,7 @@ static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * c
cblk->bufptr = cpu_to_le32((u32)dma_addr); cblk->bufptr = cpu_to_le32((u32)dma_addr);
cmnd->SCp.dma_handle = dma_addr; cmnd->SCp.dma_handle = dma_addr;
cblk->sglen = nseg;
cblk->flags |= SCF_SG; /* Turn on SG list flag */ cblk->flags |= SCF_SG; /* Turn on SG list flag */
total_len = 0; total_len = 0;
...@@ -2869,6 +2870,7 @@ static int initio_probe_one(struct pci_dev *pdev, ...@@ -2869,6 +2870,7 @@ static int initio_probe_one(struct pci_dev *pdev,
host = (struct initio_host *)shost->hostdata; host = (struct initio_host *)shost->hostdata;
memset(host, 0, sizeof(struct initio_host)); memset(host, 0, sizeof(struct initio_host));
host->addr = pci_resource_start(pdev, 0); host->addr = pci_resource_start(pdev, 0);
host->bios_addr = bios_seg;
if (!request_region(host->addr, 256, "i91u")) { if (!request_region(host->addr, 256, "i91u")) {
printk(KERN_WARNING "initio: I/O port range 0x%x is busy.\n", host->addr); printk(KERN_WARNING "initio: I/O port range 0x%x is busy.\n", host->addr);
...@@ -2895,6 +2897,8 @@ static int initio_probe_one(struct pci_dev *pdev, ...@@ -2895,6 +2897,8 @@ static int initio_probe_one(struct pci_dev *pdev,
host->pci_dev = pdev; host->pci_dev = pdev;
host->semaph = 1;
spin_lock_init(&host->semaph_lock);
host->num_scbs = num_scb; host->num_scbs = num_scb;
host->scb = scb; host->scb = scb;
host->next_pending = scb; host->next_pending = scb;
...@@ -2911,7 +2915,7 @@ static int initio_probe_one(struct pci_dev *pdev, ...@@ -2911,7 +2915,7 @@ static int initio_probe_one(struct pci_dev *pdev,
host->last_avail = prev; host->last_avail = prev;
spin_lock_init(&host->avail_lock); spin_lock_init(&host->avail_lock);
initio_init(host, phys_to_virt(bios_seg << 4)); initio_init(host, phys_to_virt(((u32)bios_seg << 4)));
host->jsstatus0 = 0; host->jsstatus0 = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment