diff -urN linux-2.4.16-wt2-2b/drivers/scsi/aic7xxx/aic7xxx_linux.c wt2/drivers/scsi/aic7xxx/aic7xxx_linux.c --- linux-2.4.16-wt2-2b/drivers/scsi/aic7xxx/aic7xxx_linux.c Sat Dec 1 18:27:13 2001 +++ wt2/drivers/scsi/aic7xxx/aic7xxx_linux.c Sat Dec 1 19:34:18 2001 @@ -625,9 +625,10 @@ { int consumed; - if ((scb->sg_count + 1) > AHC_NSEG) - panic("Too few segs for dma mapping. " - "Increase AHC_NSEG\n"); + if ((scb->sg_count + 1) > AHC_NSEG) { + printk("Too few segs for dma mapping. Increase AHC_NSEG\n"); + return -1; + } consumed = 1; sg->addr = ahc_htole32(addr & 0xFFFFFFFF); @@ -1675,6 +1676,13 @@ len = sg_dma_len(cur_seg); consumed = ahc_linux_map_seg(ahc, scb, sg, addr, len); + if (consumed == -1) { + printk("aic7xxx: scsi segs %d, + pci segs %d, aic segs %d\n", + cmd->use_sg, nseg, + scb->sg_count); + BUG(); + } sg += consumed; scb->sg_count += consumed; cur_seg++; @@ -1706,6 +1714,8 @@ scb->sg_count = ahc_linux_map_seg(ahc, scb, sg, addr, cmd->request_bufflen); + if (scb->sg_count == -1) + BUG(); sg->len |= ahc_htole32(AHC_DMA_LAST_SEG); /*