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