I'm not sure whether Jens is objecting to adding the extra member to the host template or to making the default alignment something other than 512. Here's my attempt at a compromise patch, which boils the area of disagreement between Kai and Jens down to a single line of code (plus a comment). It doesn't change the host template and it shouldn't slow down any tape I/O programs when using a non-USB device.
If there aren't any more objections to this, I urge James to apply the SCSI parts to a post-2.6.0-final tree, and likewise for Matt and the USB part. Alan Stern ===== scsiglue.c 1.60 vs edited ===== --- 1.60/drivers/usb/storage/scsiglue.c Fri Oct 24 14:53:38 2003 +++ edited/drivers/usb/storage/scsiglue.c Fri Nov 21 12:45:21 2003 @@ -65,6 +65,16 @@ static int slave_configure (struct scsi_device *sdev) { + /* Scatter-gather buffers (all but the last) must have a length + * divisible by the bulk maxpacket size. Otherwise a data packet + * would end up being short, causing a premature end to the data + * transfer. Since high-speed bulk pipes have a maxpacket size + * of 512, we'll use that as the scsi device queue's DMA alignment + * mask. Guaranteeing proper alignment of the first buffer will + * have the desired effect because, except at the beginning and + * the end, scatter-gather buffers follow page boundaries. */ + blk_queue_dma_alignment(sdev->request_queue, (512 - 1)); + /* this is to satisify the compiler, tho I don't think the * return code is ever checked anywhere. */ return 0; ===== sg.c 1.48 vs edited ===== --- 1.48/drivers/scsi/sg.c Fri Oct 24 14:53:37 2003 +++ edited/drivers/scsi/sg.c Fri Nov 21 12:28:52 2003 @@ -1741,7 +1741,11 @@ int sg_tablesize = sfp->parentdp->sg_tablesize; struct scatterlist *sgl; int mx_sc_elems, res; + struct scsi_device *sdev = sfp->parentdp->device; + if (((unsigned long)hp->dxferp & + queue_dma_alignment(sdev->request_queue)) != 0) + return 1; mx_sc_elems = sg_build_sgat(schp, sfp, sg_tablesize); if (mx_sc_elems <= 0) { return 1; ===== st.c 1.45 vs edited ===== --- 1.45/drivers/scsi/st.c Fri Sep 5 12:16:40 2003 +++ edited/drivers/scsi/st.c Fri Nov 21 12:30:34 2003 @@ -1267,7 +1267,8 @@ i = STp->try_dio && try_rdio; else i = STp->try_dio && try_wdio; - if (i) { + if (i && ((unsigned int)buf & queue_dma_alignment( + STp->device->request_queue)) == 0) { i = st_map_user_pages(&(STbp->sg[0]), STbp->use_sg, (unsigned long)buf, count, (is_read ? READ : WRITE), STp->max_pfn); ===== scsi_scan.c 1.52 vs edited ===== --- 1.52/drivers/scsi/scsi_scan.c Fri Oct 24 14:53:37 2003 +++ edited/drivers/scsi/scsi_scan.c Fri Nov 21 12:34:00 2003 @@ -231,6 +231,15 @@ sdev->request_queue->queuedata = sdev; scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun); + /* + * Set the queue's mask to require a mere 8-byte alignment for + * DMA buffers, rather than the default 512. This shouldn't + * inconvenience any user programs and should be okay for most + * host adapters. A host driver can alter this mask in its + * slave_alloc() or slave_configure() callback if necessary. + */ + blk_queue_dma_alignment(sdev->request_queue, (8 - 1)); + if (shost->hostt->slave_alloc) { if (shost->hostt->slave_alloc(sdev)) goto out_free_queue; ------------------------------------------------------- This SF.net email is sponsored by: SF.net Giveback Program. Does SourceForge.net help you be more productive? Does it help you create better code? SHARE THE LOVE, and help us help YOU! Click Here: http://sourceforge.net/donate/ _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel