Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: ehci: remove the 1st wmb in qh_append_tds

According to ehci spec 4.10.2, Advance Queue

If the fetched qTD has its Active bit set to a zero, the
host controller aborts the queue advance and follows the
queue head's horizontal pointer to the next schedule data
structure.

the 'qtd' will be linked into qh hardware queue after the line
below

*dummy = *qtd;

is executed and observed by EHCI HC, but EHCI HC won't have chance to
fetch the qtd descriptor pointed by 'qtd' in qh_append_tds until the
line below

dummy->hw_token = token; #set Active bit here

is executed by CPU and observed by EHCI HC.

There is already one 'wmb' to order writing to 'dummy'/'qtd' descriptors
and writing 'token' to 'dummy' descriptor(set Active bit), so the 1st
wmb is not needed and can be removed.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Ming Lei and committed by
Greg Kroah-Hartman
41f05ded fcda37cb

+1 -1
+1 -1
drivers/usb/host/ehci-q.c
··· 1056 1056 */ 1057 1057 token = qtd->hw_token; 1058 1058 qtd->hw_token = HALT_BIT(ehci); 1059 - wmb (); 1059 + 1060 1060 dummy = qh->dummy; 1061 1061 1062 1062 dma = dummy->qtd_dma;