On Sat, 10 Mar 2007, Michael Cook wrote: > Hi, > > I'm trying to understand how the USB Mass Storage Device > works in 2.6. Specifically 2.6.14. I see a fair amount of > churn in this subsystem.
You didn't really ask any specific questions in your email -- you just said you were curious about some things -- and that makes it kind of hard to answer. And exactly what do you mean by "churn"? To me, that word means the subsystem changes a lot from one kernel release to another, which is not true any more (although it was truer at the time 2.6.14 was released). Anyway, 2.6.14 is fairly old. You should try to use a more recent kernel version, if possible. > My principle concern/question is how does data from a file > on the filesystem get transported to a memory stick? I > have dumped info at many stages and see varying URB buffers > sent out. That's how the file data gets transported. :-) > My device is using PIO not DMA. Irrelevant; who cares how the mass-storage device works? Maybe you mean the host controller uses PIO instead of DMA. > ----------------------------- > > As I try to trace through the use of this, I see that the > following flags are changing depending on various SCSI > activity to the memory stick: > > ----------------------------- > > # pehci urb_enqueue: URB:0xef708338 TxFlags:0xc > TxBuff:0xee110000 of 31 bytes [0x55 0x53 0x42 > 0x43...] > pehci urb_enqueue: URB:0xef7084e8 TxFlags:0x5 > TxBuff:0xc240a098 of 36 bytes [0x00 0x00 0x00 > 0x00...] > ..... > > ----------------------------- > > When I actually transfer file contents, I see the buffer > sizes increase dramaitcally: That's what you should expect, since the buffers now have to contain the file contents. > ----------------------------- > > pehci urb_enqueue: URB:0xef7080b0 TxFlags:0x5 > TxBuff:0xc2a40000 of 20480 bytes [0x33 0xcd 0xa9 > 0x71...] > pehci urb_enqueue: URB:0xef708338 TxFlags:0xc > TxBuff:0xee110000 of 13 bytes [0x55 0x53 0x42 > 0x43...] > I'm curious how the TxFlags keep changing... these are > combinations of: > > ----------------------------- > > #define URB_SHORT_NOT_OK 0x0001 /* report short reads as > errors */ > #define URB_ISO_ASAP 0x0002 /* iso-only, urb->start_frame > ignored */ > #define URB_NO_TRANSFER_DMA_MAP 0x0004 /* urb->transfer_dma > valid on submit */ > #define URB_NO_SETUP_DMA_MAP 0x0008 /* urb->setup_dma valid > on submit */ > #define URB_NO_FSBR 0x0020 /* UHCI-specific */ > #define URB_ZERO_PACKET 0x0040 /* Finish bulk OUTs with > short packet */ > #define URB_NO_INTERRUPT 0x0080 /* HINT: no non-error > interrupt needed */ Those aren't TxFlags; they are urb->transfer_flags values. Did you really mean "why the driver sets TxFlags to these changing values"? To understand that, you have to understand what the flags mean and how the driver works. > ----------------------------- > > I only see the flags non-zero once the SCSI system start > discoverying the memorystick. Previous URB enqueues are > all zero for the most part. > > My present situation is that after transfering files I see > file contents that are corrupt, along with system > instability. > > I'm trying to isolate if I'm indeed copying correclty to > and from memory. "if I'm indeed copying correclty to and from memory" Surely _your're_ not doing any copying at all; the drivers are doing it. Do you want to know if the drivers are copying correctly? About the only way to find out is to read the data back from your mass-storage device and see if it is the same as what you wrote. > I see DMA-based HCDs use pools of data. For non DMA based > HCDs I see accomodations have been made in teh hcd.c > allocation system. But wonder if the SCSI USB Mass Storage > device works with this in mind? The device doesn't care where the memory comes from -- or even if there's any memory at all. All it cares about is the data it receives over the USB bus. > I would also like to figure out if/why the flags for DMA > transfers are fluctuating so much... and specifically the > logic behind this snippet: > > ----------------------------- > /* we assume that if transfer_buffer isn't us->iobuf then > it > * hasn't been mapped for DMA. Yes, this is clunky, but > it's > * easier than always having the caller tell us whether > the > * transfer buffer has already been mapped. */ > us->current_urb->transfer_flags = URB_NO_SETUP_DMA_MAP; > if (us->current_urb->transfer_buffer == us->iobuf) > us->current_urb->transfer_flags |= > URB_NO_TRANSFER_DMA_MAP; > us->current_urb->transfer_dma = us->iobuf_dma; > us->current_urb->setup_dma = us->cr_dma; Do you know what the comment means? Do you know what the flag means? If you do, then what part of the logic is unclear? Earlier you implied that your host controller doesn't use DMA. In that case, why do you care about the DMA flag settings? They shouldn't have any effect on your system's operation. > ----------------------------- > > I'm missing something here... I'm just trying to figure out > where I SHOULD be reading & writing from in memory as I'm > presently not and its blowing up whenever the SCSI system > notices my memory stick. I still don't know why you think _you_ should be reading & writing anything in memory. As the computer user, all you do is run programs. As for where the host controller driver should read & write memory, the answer is simple. Since it doesn't use DMA, it should access the memory pointed to by urb->transfer_buffer (and urb->setup_packet for control transfers). Alan Stern ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ [email protected] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
