On Wed, 17 Jun 2009 22:34:40 +0800 Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > On Wed, 17 Jun 2009, Alek Du wrote: > > > It is not simple just let ehci_qh contain the soft part, since the ehci_shadow requires > > the hardware part to be the first part... > > > > I don't see any problem. Just do this: > > union ehci_shadow { > struct ehci_qh_hw *qh_hw; /* Q_TYPE_QH */ > struct ehci_itd *itd; /* Q_TYPE_ITD */ > struct ehci_sitd *sitd; /* Q_TYPE_SITD */ > struct ehci_fstn *fstn; /* Q_TYPE_FSTN */ > __hc32 *hw_next; /* (all types) */ > void *ptr; > }; > > Alan Stern > That won't work, for example, some place use ehci_shadow to access qh software part... Please see the q->qh->usecs, after the above change, the ehci_shadow won't contain the software part... static unsigned short periodic_usecs (struct ehci_hcd *ehci, unsigned frame, unsigned uframe) { __hc32 *hw_p = &ehci->periodic [frame]; union ehci_shadow *q = &ehci->pshadow [frame]; unsigned usecs = 0; while (q->ptr) { switch (hc32_to_cpu(ehci, Q_NEXT_TYPE(ehci, *hw_p))) { case Q_TYPE_QH: /* is it in the S-mask? */ if (q->qh->hw_info2 & cpu_to_hc32(ehci, 1 << uframe)) usecs += q->qh->usecs; Alek -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html