On Tue, 02 Oct 2007 15:38:13 -0500 James Bottomley <James.Bottomley@xxxxxxxxxxxx> wrote: > On Tue, 2007-10-02 at 20:15 +0200, Adrian Bunk wrote: > > Cc's added, the complete bug report is at > > http://lkml.org/lkml/2007/10/2/243 > > > > On Tue, Oct 02, 2007 at 12:48:26PM -0400, Burton Windle wrote: > > > 2.6.23-rc9 fails to boot for me; 2.6.22.9 works fine. > > > > > > System is a Dell Poweredge with PERC 2/DC with RAID1 volume. > > >... > > > > Thanks for your report. > > > > Diff'ing the dmesg's shows: > > > > <-- snip --> > > > > scsi0: scanning scsi channel 4 [P0] for physical devices. > > scsi0: scanning scsi channel 5 [P1] for physical devices. > > st: Version 20070203, fixed bufsize 32768, s/g segs 256 > > -sd 0:0:0:0: [sda] 17547264 512-byte hardware sectors (8984 MB) > > +sd 0:0:0:0: [sda] Sector size 0 reported, assuming 512. > > +sd 0:0:0:0: [sda] 1 512-byte hardware sectors (0 MB) > > sd 0:0:0:0: [sda] Write Protect is off > > sd 0:0:0:0: [sda] Asking for cache data failed > > sd 0:0:0:0: [sda] Assuming drive cache: write through > > -sd 0:0:0:0: [sda] 17547264 512-byte hardware sectors (8984 MB) > > +sd 0:0:0:0: [sda] Sector size 0 reported, assuming 512. > > +sd 0:0:0:0: [sda] 1 512-byte hardware sectors (0 MB) > > sd 0:0:0:0: [sda] Write Protect is off > > sd 0:0:0:0: [sda] Asking for cache data failed > > sd 0:0:0:0: [sda] Assuming drive cache: write through > > sda: sda1 > > + sda: p1 exceeds device capacity > > > > <-- snip --> > > > > - case MEGA_BULK_DATA: > > - if (scb->cmd->use_sg == 0) > > - length = scb->cmd->request_bufflen; > > - else { > > - struct scatterlist *sgl = > > - (struct scatterlist *)scb->cmd->request_buffer; > > - length = sgl->length; > > - } > > - pci_unmap_page(adapter->dev, scb->dma_h_bulkdata, > > - length, scb->dma_direction); > > - break; > > - > > This is the problem piece I think. We've reintroduced a very old bug: > > commit 51c928c34fa7cff38df584ad01de988805877dba > Author: James Bottomley <James.Bottomley@xxxxxxxxxxxx> > Date: Sat Oct 1 09:38:05 2005 -0500 > > [SCSI] Legacy MegaRAID: Fix READ CAPACITY > > Some Legacy megaraid cards can't actually cope with the scatter/gather > version of the READ CAPACITY command (which is what we now send them > since altering all SCSI internal I/O to go via the block layer). Fix > this (and a few other broken megaraid driver assumptions) by sending > the non-sg version of the command if the sg list only has a single > element. > > Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxx> > > So what we have to do is put back the check for use_sg == 1 and send > that as a bulk transfer command. Sorry again. Needs to check sg count before dma mapping. diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c index 3907f67..ae0b220 100644 --- a/drivers/scsi/megaraid.c +++ b/drivers/scsi/megaraid.c @@ -1737,9 +1737,12 @@ mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len) Scsi_Cmnd *cmd; int sgcnt; int idx; + int bulkdata; cmd = scb->cmd; + bulkdata = (scsi_sg_count(cmd) == 1) ? 1 : 0; + /* * Copy Scatter-Gather list info into controller structure. * @@ -1753,6 +1756,14 @@ mega_build_sglist(adapter_t *adapter, scb_t *scb, u32 *buf, u32 *len) *len = 0; + if (bulkdata && !adapter->has_64bit_addr) { + sg = scsi_sglist(cmd); + scb->dma_h_bulkdata = sg_dma_address(sg); + *buf = (u32)scb->dma_h_bulkdata; + *len = sg_dma_len(sg); + return 0; + } + scsi_for_each_sg(cmd, sg, sgcnt, idx) { if (adapter->has_64bit_addr) { scb->sgl64[idx].address = sg_dma_address(sg); - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html