similar files: fusbh200-hcd.c and fotg210-hcd.c
I executed a clone detection tool* on drivers source code and I found that the files
drivers/usb/host/fusbh200-hcd.c
and
drivers/usb/host/fotg210-hcd.c
are very similar. The main difference between the two files are replacing the string 'USBH20' by 'OTG21' and some white space fixes. Some changes are being applied to only one of the files, such as the commit f848a88d223cafa43cb318839a1171b498cf5ec8 that changes fotg210-hcd.c but not fusbh200-hcd.c.
Should these files be consolidated? And if so how?
Thank you,
Peter
* https://github.com/petersenna/ccfinderx-core
Signature · 1 line
Peter
Quoted 9 lines · Peter Senna Tschudin
I executed a clone detection tool* on drivers source code and I found that the files
drivers/usb/host/fusbh200-hcd.cand
drivers/usb/host/fotg210-hcd.c
Quoted 7 lines
are very similar. The main difference between the two files are replacing the string 'USBH20' by 'OTG21' and some white space fixes. Some changes are being applied to only one of the files, such as the commit
f848a88d223cafa43cb318839a1171b498cf5ec8that changesfotg210-hcd.cbut notfusbh200-hcd.c.Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Signature · 1 line
balbi
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both fusbh200-hcd.c and fotg210-hcd.c in a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered as platform devices and I could not find an obvious way to detect the model at run time. I could successfully load fusbh200-hcd on my fedora notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "fusbh200_hcd should always be loaded before uhci_hcd and ohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?
Other solution for consolidation would be to create a common_code.c, keeping both fusbh200-hcd.c and fotg210-hcd.c only with the code that differ. Is this better than what is there now?
Other ideas?
Signature · 1 line
Peter
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered as
does it matter ? If they work the same way, why does it matter which one's running?
Quoted 2 lines
platform devices and I could not find an obvious way to detect the model at run time. I could successfully load fusbh200-hcd on my fedora
is there a revision register ? Or you may use different platform_device names with platform_device_id table.
Quoted 7 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?
Quoted 5 lines
Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
just combine them :-p Use platform_device_id to differentiate.
Signature · 1 line
balbi
Quoted 10 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered asdoes it matter ? If they work the same way, why does it matter which one's running?
I may be missing something simple, but based on a 2 page product brief, fotg210 has more resources like memory. So even if the .c files are _very_ similar, there are some configuration parameters that differ, for example:
fusbh200.h:
#define BMCSR_VBUS_OFF (1<<4)
#define BMCSR_INT_POLARITY (1<<3)
fotg210.h:
#define OTGCSR_A_BUS_DROP (1 << 5)
#define OTGCSR_A_BUS_REQ (1 << 4)
which are used by {fusbh200,fotg210}_init:
fusbh200-hcd.c:
static void fusbh200_init(struct fusbh200_hcd *fusbh200) {
u32 reg;
reg = fusbh200_readl(fusbh200, &fusbh200->regs->bmcsr); reg |= BMCSR_INT_POLARITY;
reg &= ~BMCSR_VBUS_OFF; fusbh200_writel(fusbh200, reg, &fusbh200->regs->bmcsr);
reg = fusbh200_readl(fusbh200, &fusbh200->regs->bmier); fusbh200_writel(fusbh200, reg | BMIER_OVC_EN | BMIER_VBUS_ERR_EN, &fusbh200->regs->bmier);
}
fotg210-hcd.c:
static void fotg210_init(struct fotg210_hcd *fotg210) {
u32 value;
iowrite32(GMIR_MDEV_INT | GMIR_MOTG_INT | GMIR_INT_POLARITY,
&fotg210->regs->gmir);
value = ioread32(&fotg210->regs->otgcsr);
value &= ~OTGCSR_A_BUS_DROP;
value |= OTGCSR_A_BUS_REQ;iowrite32(value, &fotg210->regs->otgcsr);
}
Then:
fusbh200.h:
#define BMCSR_HOST_SPD_TYP (3<<9)
static inline unsigned intfusbh200_get_speed(struct fusbh200_hcd *fusbh200, unsigned int portsc) {
return (readl(&fusbh200->regs->bmcsr)
& BMCSR_HOST_SPD_TYP) >> 9;
}
fotg210.h:
#define OTGCSR_HOST_SPD_TYP (3 << 22)
static inline unsigned int
fotg210_get_speed(struct fotg210_hcd *fotg210, unsigned int portsc) {
return (readl(&fotg210->regs->otgcsr)
& OTGCSR_HOST_SPD_TYP) >> 22;
}
So my concern is to have a way to identify which is the device version to use the right parameters. I think that the BMCSR_HOST_SPD_TYP vs OTGCSR_HOST_SPD_TYP can be solved, but I'm not sure about the initialization. Ideas?
Quoted 6 lines
Quoted 3 lines
platform devices and I could not find an obvious way to detect the model at run time. I could successfully load fusbh200-hcd on my fedora
is there a revision register ? Or you may use different
platform_devicenames withplatform_device_idtable.
I don't know about revision registers. That would be good. I could not find complete datasheets, only a 2 page product brief, no registry information there.
Quoted 8 lines
Quoted 8 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?
Quoted 7 lines
Quoted 5 lines
Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
just combine them :-p Use
platform_device_idto differentiate.
I'm afraid the combined version will use the correct parameters for only one of the two. But I may be missing something simple. I did a diff between the two files after removing white space differences, and after replacing fusbh200 by fotg210 on the fusbh200 driver. The files are very similar. See: http://pastebin.com/ZRY3xePv
Quoted 3 lines
--
balbi
Signature · 1 line
Peter
Quoted 17 lines · Peter Senna Tschudin
Quoted 10 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered asdoes it matter ? If they work the same way, why does it matter which one's running?
I may be missing something simple, but based on a 2 page product brief, fotg210 has more resources like memory. So even if the .c files are _very_ similar, there are some configuration parameters that differ, for example:
Quoted 7 lines
fusbh200.h:
#defineBMCSR_VBUS_OFF(1<<4)
#defineBMCSR_INT_POLARITY(1<<3)
fotg210.h:
#defineOTGCSR_A_BUS_DROP(1 << 5)
#defineOTGCSR_A_BUS_REQ(1 << 4)
Can you detect that in runtime ? If you can, detect it. If you can't use different platform_device_id.
Quoted 13 lines
Quoted 13 lines
Quoted 12 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
Quoted 7 lines
Quoted 1 line
just combine them :-p Use
platform_device_idto differentiate.I'm afraid the combined version will use the correct parameters for only one of the two. But I may be missing something simple. I did a diff between the two files after removing white space differences, and after replacing fusbh200 by fotg210 on the fusbh200 driver. The files are very similar. See: http://pastebin.com/ZRY3xePv
yeah, you can totally combine them. Grep the tree for examples of how to use platform_device_id as I mentioned.
Signature · 1 line
balbi
Quoted 22 lines · Felipe Balbi
Quoted 21 lines · Peter Senna Tschudin
Quoted 10 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered asdoes it matter ? If they work the same way, why does it matter which one's running?
I may be missing something simple, but based on a 2 page product brief, fotg210 has more resources like memory. So even if the .c files are _very_ similar, there are some configuration parameters that differ, for example:
fusbh200.h:
#defineBMCSR_VBUS_OFF(1<<4)
#defineBMCSR_INT_POLARITY(1<<3)
Quoted 21 lines
Quoted 3 lines
fotg210.h:
#defineOTGCSR_A_BUS_DROP(1 << 5)
#defineOTGCSR_A_BUS_REQ(1 << 4)Can you detect that in runtime ? If you can, detect it. If you can't use different
platform_device_id.Quoted 14 lines
Quoted 14 lines
Quoted 7 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?Quoted 5 lines
Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
just combine them :-p Use
platform_device_idto differentiate.
Can you check the f2xx branch at:
[email protected]:petersenna/linux.git
And tell me if this is the way to go for the consolidation of the two drivers? I started with the newest driver, did code cleanup, and started filling the new driver with parameters from the older FUSBH200. At the moment it compiles for x86 and probably still works for FOTG210 devices. A concrete question I have is if should I keep making many patches for the consolidation or should I do a single big patch with all changes? Comments are welcome.
Quoted 9 lines
Quoted 6 lines
I'm afraid the combined version will use the correct parameters for only one of the two. But I may be missing something simple. I did a diff between the two files after removing white space differences, and after replacing fusbh200 by fotg210 on the fusbh200 driver. The files are very similar. See: http://pastebin.com/ZRY3xePv
yeah, you can totally combine them. Grep the tree for examples of how to use
platform_device_idas I mentioned.
I'll do it. Thank you.
Quoted 3 lines
--
balbi
Signature · 1 line
Peter
Hi,
Quoted 49 lines · Peter Senna Tschudin
Quoted 22 lines · Felipe Balbi
Quoted 21 lines · Peter Senna Tschudin
Quoted 10 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered asdoes it matter ? If they work the same way, why does it matter which one's running?
I may be missing something simple, but based on a 2 page product brief, fotg210 has more resources like memory. So even if the .c files are _very_ similar, there are some configuration parameters that differ, for example:
fusbh200.h:
#defineBMCSR_VBUS_OFF(1<<4)
#defineBMCSR_INT_POLARITY(1<<3)Quoted 21 lines
Quoted 3 lines
fotg210.h:
#defineOTGCSR_A_BUS_DROP(1 << 5)
#defineOTGCSR_A_BUS_REQ(1 << 4)Can you detect that in runtime ? If you can, detect it. If you can't use different
platform_device_id.Quoted 14 lines
Quoted 14 lines
Quoted 7 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?Quoted 5 lines
Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
just combine them :-p Use
platform_device_idto differentiate.Can you check the f2xx branch at:
[email protected]:petersenna/linux.git
Quoted 7 lines
And tell me if this is the way to go for the consolidation of the two drivers? I started with the newest driver, did code cleanup, and started filling the new driver with parameters from the older FUSBH200. At the moment it compiles for x86 and probably still works for FOTG210 devices. A concrete question I have is if should I keep making many patches for the consolidation or should I do a single big patch with all changes? Comments are welcome.
it's best to just send patches. Also, you gave me an ssh URL which I can't use because I don't have write access to your tree (and I don't want to have it).
Signature · 1 line
balbi
cover RFC: Consolidation: FUSB200 and FOTG210
I'm working on the consolidation of two very similar Faraday EHCI drivers:
drivers/usb/host/fusbh200-hcd.c and drivers/usb/host/fotg210-hcd.c
I'm sending the work unfinished because I have some questions, and I would appreciate feedback about the changes. As this is not complete work, please do _not_ apply the series.
Patches from 01 to 10 are fixes to issues reported by checkpatch, patches 11, 12 and 13 are changes to prepare the code to support multiple devices, and patch 14 adds parameters from fusb200 into faraday-hcd.
My questions:
- Is the name faraday-hcd good for the driver that will support both fusb200-hcd and fotg210-hcd?
- Is this patch series in a good direction for consolidating the two drivers? I mean it is a lot of patches, and there are many different orders in which I could send them.
- Is it a good idea to include now changes like patches 06, 09 and 10 that may have impact on performance? Or should I wait until I can get some hw to test?
- Do you know easy to find and cheap devices using this two host controllers?
- Should I worry about drivers/usb/gadget/udc/fotg210-udc.c?
Peter Senna Tschudin (14):
usb/host/fotg210: Fix coding style issues usb/host/fotg210: remove KERN_WARNING from pr_info usb/host/fotg210: Remove useless else statement usb/host/fotg210: Remove NULL checks dma_pool_destroy usb/host/fotg210: change kmalloc by kmalloc_array usb/host/fotg210: replace msleep by usleep_range usb/host/fotg210: Remove a macro from a call to snprintf usb/host/fotg210: convert macro to inline function usb/host/fotg210: Add function: output_buf_tds_dir() usb/host/fotg210: Add function scan_frame_queue() usb/host: Rename fotg210-hcd to faraday-hcd usb/host/faraday-hcd: Replace fotg210 by fhcd2xx usb/host/faraday-hcd: Move #defines outside struct usb/host/faraday-hcd: Import FUSBH200 parameters
drivers/usb/host/Kconfig | 2 +- drivers/usb/host/Makefile | 2 +- drivers/usb/host/faraday-hcd.c | 5792 ++++++++++++++++++++++++++++++++++++++ drivers/usb/host/faraday-hcd.h | 751 +++++ drivers/usb/host/fotg210-hcd.c | 5951 ---------------------------------------- drivers/usb/host/fotg210.h | 686 ----- 6 files changed, 6545 insertions(+), 6639 deletions(-) create mode 100644 drivers/usb/host/faraday-hcd.c create mode 100644 drivers/usb/host/faraday-hcd.h delete mode 100644 drivers/usb/host/fotg210-hcd.c delete mode 100644 drivers/usb/host/fotg210.h
Signature · 1 line
2.1.0
PATCH 1/14 RFC: usb/host/fotg210: Fix coding style issues
This patch fix coding style issues reported by checkpatch that do not change semantics of the code.
--- drivers/usb/host/fotg210-hcd.c | 1248 +++++++++++++++++----------------------- drivers/usb/host/fotg210.h | 36 +- 2 files changed, 558 insertions(+), 726 deletions(-)
drivers/usb/host/fotg210-hcd.c +537 -711
@@ -50,32 +50,30 @@#include <asm/irq.h> #include <asm/unaligned.h> -/*-------------------------------------------------------------------------*/ #define DRIVER_AUTHOR "Yuan-Hsin Chen"#define DRIVER_DESC "FOTG210 Host Controller (EHCI) Driver" - -static const char hcd_name[] ="fotg210_hcd" ; +static const char hcd_name[] ="fotg210_hcd" ;#undef FOTG210_URB_TRACE -#define FOTG210_STATS /* magic numbers that can affect system performance */ -#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ -#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ -#define FOTG210_TUNE_RL_TT 0 -#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ -#define FOTG210_TUNE_MULT_TT 1 +#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ +#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ +#define FOTG210_TUNE_RL_TT 0 +#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ +#define FOTG210_TUNE_MULT_TT 1 +/* -* Some drivers think it's safe to schedule isochronous transfers more than -* 256 ms into the future (partly as a result of an old bug in the scheduling +* Some drivers think it's safe to schedule isochronous transfers more than 256 +* ms into the future (partly as a result of an old bug in the scheduling * code). In an attempt to avoid trouble, we will use a minimum scheduling * length of 512 frames instead of 256. */ -#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ +#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ /* Initial IRQ latency: faster than hw default */ -static int log2_irq_thresh;/* 0 to 6 */ +static int log2_irq_thresh;/* 0 to 6 */ module_param (log2_irq_thresh, int,S_IRUGO );MODULE_PARM_DESC (log2_irq_thresh,"log2 IRQ latency, 1-64 microframes" );
@@ -89,66 +87,57 @@ static unsigned int hird;module_param (hird, int,S_IRUGO );MODULE_PARM_DESC (hird,"host initiated resume duration, +1 for each 75us" ); -#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) +#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)#include "fotg210.h" -/*-------------------------------------------------------------------------*/ - #define fotg210_dbg(fotg210, fmt, args...) \ - dev_dbg(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_err(fotg210, fmt, args...) \ - dev_err(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_info(fotg210, fmt, args...) \ - dev_info(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_warn(fotg210, fmt, args...) \ - dev_warn(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -/* check the values in the HCSPARAMS register -* (host controller _Structural_ parameters) -* see EHCI spec, Table 2-4 for each value +/* check the values in the HCSPARAMS register (host controller _Structural_ +* parameters) see EHCI spec, Table 2-4 for each value */ static void dbg_hcs_params (struct fotg210_hcd *fotg210,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcs_params); +u32 params =fotg210_readl (fotg210, &fotg210->caps->hcs_params); -fotg210_dbg (fotg210, -"%s hcs_params 0x%x ports=%d\n" , - label, params, -HCS_N_PORTS (params) - ); +fotg210_dbg (fotg210,"%s hcs_params 0x%x ports=%d\n" , label, params, +HCS_N_PORTS (params)); } -/* check the values in the HCCPARAMS register -* (host controller _Capability_ parameters) -* see EHCI Spec, Table 2-5 for each value -* */ +/* check the values in the HCCPARAMS register (host controller _Capability_ +* parameters) see EHCI Spec, Table 2-5 for each value +*/ static void dbg_hcc_params (struct fotg210_hcd *fotg210,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcc_params); +u32 params =fotg210_readl (fotg210, &fotg210->caps->hcc_params); -fotg210_dbg (fotg210, -"%s hcc_params %04x uframes %s%s\n" , - label, - params, -HCC_PGM_FRAMELISTLEN (params) ?"256/512/1024" :"1024" , -HCC_CANPARK (params) ?" park" :"" ); +fotg210_dbg (fotg210,"%s hcc_params %04x uframes %s%s\n" , label, + params, +HCC_PGM_FRAMELISTLEN (params) ?"256/512/1024" :"1024" , +HCC_CANPARK (params) ?" park" :"" ); }static void __maybe_unused dbg_qtd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd) {fotg210_dbg (fotg210,"%s td %p n%08x %08x t%08x p0=%08x\n" , label, qtd, -hc32_to_cpup (fotg210, &qtd->hw_next), -hc32_to_cpup (fotg210, &qtd->hw_alt_next), -hc32_to_cpup (fotg210, &qtd->hw_token), -hc32_to_cpup (fotg210, &qtd->hw_buf[0 ])); +hc32_to_cpup (fotg210, &qtd->hw_next), +hc32_to_cpup (fotg210, &qtd->hw_alt_next), +hc32_to_cpup (fotg210, &qtd->hw_token), +hc32_to_cpup (fotg210, &qtd->hw_buf[0 ]));if (qtd->hw_buf[1 ])fotg210_dbg (fotg210," p1=%08x p2=%08x p3=%08x p4=%08x\n" , -hc32_to_cpup (fotg210, &qtd->hw_buf[1 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[2 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[3 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[4 ])); +hc32_to_cpup (fotg210, &qtd->hw_buf[1 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[2 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[3 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[4 ])); } static void __maybe_unused
@@ -156,101 +145,99 @@ dbg_qh(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh) {struct fotg210_qh_hw *hw = qh->hw; -fotg210_dbg (fotg210,"%s qh %p n%08x info %x %x qtd %x\n" , label, - qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); +fotg210_dbg (fotg210,"%s qh %p n%08x info %x %x qtd %x\n" , label, qh, + hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); +dbg_qtd ("overlay" , fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next); }static void __maybe_unused dbg_itd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_itd *itd) { -fotg210_dbg (fotg210,"%s[%d] itd %p, next %08x, urb %p\n" , - label, itd->frame, itd,hc32_to_cpu (fotg210, itd->hw_next), - itd->urb); +fotg210_dbg (fotg210,"%s[%d] itd %p, next %08x, urb %p\n" , label, + itd->frame, itd,hc32_to_cpu (fotg210, itd->hw_next), + itd->urb); +fotg210_dbg (fotg210, -" trans: %08x %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_transaction[0 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[1 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[2 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[3 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[4 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[5 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[6 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[7 ])); +" trans: %08x %08x %08x %08x %08x %08x %08x %08x\n" , +hc32_to_cpu (fotg210, itd->hw_transaction[0 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[1 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[2 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[3 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[4 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[5 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[6 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[7 ])); +fotg210_dbg (fotg210, -" buf: %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_bufp[0 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[1 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[2 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[3 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[4 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[5 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[6 ])); +" buf: %08x %08x %08x %08x %08x %08x %08x\n" , +hc32_to_cpu (fotg210, itd->hw_bufp[0 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[1 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[2 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[3 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[4 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[5 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[6 ])); +fotg210_dbg (fotg210," index: %d %d %d %d %d %d %d %d\n" , - itd->index[0 ], itd->index[1 ], itd->index[2 ], - itd->index[3 ], itd->index[4 ], itd->index[5 ], - itd->index[6 ], itd->index[7 ]); + itd->index[0 ], itd->index[1 ], itd->index[2 ], + itd->index[3 ], itd->index[4 ], itd->index[5 ], + itd->index[6 ], itd->index[7 ]); }static int __maybe_unused dbg_status_buf (char *buf,unsigned len,const char *label,u32 status) { -return scnprintf (buf, len, -"%s%sstatus %04x%s%s%s%s%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , status, - (status &STS_ASS ) ?" Async" :"" , - (status &STS_PSS ) ?" Periodic" :"" , - (status &STS_RECL ) ?" Recl" :"" , - (status &STS_HALT ) ?" Halt" :"" , - (status &STS_IAA ) ?" IAA" :"" , - (status &STS_FATAL ) ?" FATAL" :"" , - (status &STS_FLR ) ?" FLR" :"" , - (status &STS_PCD ) ?" PCD" :"" , - (status &STS_ERR ) ?" ERR" :"" , - (status &STS_INT ) ?" INT" :"" - ); +return scnprintf (buf, len,"%s%sstatus %04x%s%s%s%s%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , status, + (status &STS_ASS ) ?" Async" :"" , + (status &STS_PSS ) ?" Periodic" :"" , + (status &STS_RECL ) ?" Recl" :"" , + (status &STS_HALT ) ?" Halt" :"" , + (status &STS_IAA ) ?" IAA" :"" , + (status &STS_FATAL ) ?" FATAL" :"" , + (status &STS_FLR ) ?" FLR" :"" , + (status &STS_PCD ) ?" PCD" :"" , + (status &STS_ERR ) ?" ERR" :"" , + (status &STS_INT ) ?" INT" :"" ); }static int __maybe_unused dbg_intr_buf (char *buf,unsigned len,const char *label,u32 enable) { -return scnprintf (buf, len, -"%s%sintrenable %02x%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , enable, - (enable &STS_IAA ) ?" IAA" :"" , - (enable &STS_FATAL ) ?" FATAL" :"" , - (enable &STS_FLR ) ?" FLR" :"" , - (enable &STS_PCD ) ?" PCD" :"" , - (enable &STS_ERR ) ?" ERR" :"" , - (enable &STS_INT ) ?" INT" :"" - ); +return scnprintf (buf, len,"%s%sintrenable %02x%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , enable, + (enable &STS_IAA ) ?" IAA" :"" , + (enable &STS_FATAL ) ?" FATAL" :"" , + (enable &STS_FLR ) ?" FLR" :"" , + (enable &STS_PCD ) ?" PCD" :"" , + (enable &STS_ERR ) ?" ERR" :"" , + (enable &STS_INT ) ?" INT" :"" ); }static const char *const fls_strings[] = {"1024" ,"512" ,"256" ,"??" }; -static int -dbg_command_buf (char *buf,unsigned len,const char *label,u32 command) +static int dbg_command_buf (char *buf,unsigned len,const char *label, +u32 command) {return scnprintf (buf, len, -"%s%scommand %07x %s=%d ithresh=%d%s%s%s " -"period=%s%s %s" , - label, label[0 ] ?" " :"" , command, - (command &CMD_PARK ) ?" park" :"(park)" , -CMD_PARK_CNT (command), - (command >>16 ) &0x3f , - (command &CMD_IAAD ) ?" IAAD" :"" , - (command &CMD_ASE ) ?" Async" :"" , - (command &CMD_PSE ) ?" Periodic" :"" , - fls_strings[(command >>2 ) &0x3 ], - (command &CMD_RESET ) ?" Reset" :"" , - (command &CMD_RUN ) ?"RUN" :"HALT" - ); -} - -static char -*dbg_port_buf (char *buf,unsigned len,const char *label,int port,u32 status) -{ -char *sig; +"%s%scommand %07x %s=%d ithresh=%d%s%s%s period=%s%s %s" , + label, label[0 ] ?" " :"" , command, + (command &CMD_PARK ) ?" park" :"(park)" , +CMD_PARK_CNT (command), + (command >>16 ) &0x3f , + (command &CMD_IAAD ) ?" IAAD" :"" , + (command &CMD_ASE ) ?" Async" :"" , + (command &CMD_PSE ) ?" Periodic" :"" , + fls_strings[(command >>2 ) &0x3 ], + (command &CMD_RESET ) ?" Reset" :"" , + (command &CMD_RUN ) ?"RUN" :"HALT" ); +} + +static char *dbg_port_buf (char *buf,unsigned len,const char *label,int port, +u32 status) +{ +char *sig;/* signaling state */ switch (status & (3 <<10 )) {
@@ -268,44 +255,41 @@ static charbreak ; } -scnprintf (buf, len, -"%s%sport:%d status %06x %d " -"sig=%s%s%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , port, status, - status>>25 ,/*device address */ - sig, - (status &PORT_RESET ) ?" RESET" :"" , - (status &PORT_SUSPEND ) ?" SUSPEND" :"" , - (status &PORT_RESUME ) ?" RESUME" :"" , - (status &PORT_PEC ) ?" PEC" :"" , - (status &PORT_PE ) ?" PE" :"" , - (status &PORT_CSC ) ?" CSC" :"" , - (status &PORT_CONNECT ) ?" CONNECT" :"" ); +scnprintf (buf, len,"%s%sport:%d status %06x %d sig=%s%s%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , port, status, + status >>25 ,/*device address */ + sig, + (status &PORT_RESET ) ?" RESET" :"" , + (status &PORT_SUSPEND ) ?" SUSPEND" :"" , + (status &PORT_RESUME ) ?" RESUME" :"" , + (status &PORT_PEC ) ?" PEC" :"" , + (status &PORT_PE ) ?" PE" :"" , + (status &PORT_CSC ) ?" CSC" :"" , + (status &PORT_CONNECT ) ?" CONNECT" :"" ); +return buf; }/* functions have the "wrong" filename when they're output... */ -#define dbg_status (fotg210, label, status) { \ - char _buf[80]; \ - dbg_status_buf(_buf, sizeof(_buf), label, status); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ +#define dbg_status (fotg210, label, status) { \ + char _buf[80]; \ + dbg_status_buf(_buf, sizeof(_buf), label, status); \ + fotg210_dbg(fotg210, "%s\n", _buf); \ } -#define dbg_cmd (fotg210, label, command) { \ - char _buf[80]; \ - dbg_command_buf(_buf, sizeof(_buf), label, command); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ +#define dbg_cmd (fotg210, label, command) { \ + char _buf[80]; \ + dbg_command_buf(_buf, sizeof(_buf), label, command); \ + fotg210_dbg(fotg210, "%s\n", _buf); \ } -#define dbg_port (fotg210, label, port, status) { \ - char _buf[80]; \ - fotg210_dbg(fotg210, "%s\n", dbg_port_buf(_buf, sizeof(_buf), label, port, status) ); \ +#define dbg_port (fotg210, label, port, status) { \ + char _buf[80]; \ + fotg210_dbg(fotg210, "%s\n", \ + dbg_port_buf(_buf, sizeof(_buf), label, port, status)); \ } -/*-------------------------------------------------------------------------*/ -/* troubleshooting help: expose state in debugfs */ -static int debug_async_open (struct inode *,struct file *);static int debug_periodic_open (struct inode *,struct file *);static int debug_registers_open (struct inode *,struct file *);
@@ -373,33 +357,29 @@ static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token)return '/' ; } -static void qh_lines ( -struct fotg210_hcd *fotg210, -struct fotg210_qh *qh, -char **nextp, -unsigned *sizep -) -{ -u32 scratch; -u32 hw_curr; -struct fotg210_qtd *td; -unsigned temp; -unsigned size = *sizep; -char *next = *nextp; -char mark; -__le32 list_end =FOTG210_LIST_END (fotg210); -struct fotg210_qh_hw *hw = qh->hw; - -if (hw->hw_qtd_next == list_end)/* NEC does this */ +static void qh_lines (struct fotg210_hcd *fotg210,struct fotg210_qh *qh, +char **nextp,unsigned *sizep) +{ +u32 scratch; +u32 hw_curr; +struct fotg210_qtd *td; +unsigned temp; +unsigned size = *sizep; +char *next = *nextp; +char mark; +__le32 list_end =FOTG210_LIST_END (fotg210); +struct fotg210_qh_hw *hw = qh->hw; + +if (hw->hw_qtd_next == list_end)/* NEC does this */ mark ='@' ;else mark =token_mark (fotg210, hw->hw_token); -if (mark =='/' ) {/* qh_alt_next controls qh advance? */ -if ((hw->hw_alt_next &QTD_MASK (fotg210)) - == fotg210->async->hw->hw_alt_next) - mark ='#' ;/* blocked */ +if (mark =='/' ) {/* qh_alt_next controls qh advance? */ +if ((hw->hw_alt_next &QTD_MASK (fotg210)) == + fotg210->async->hw->hw_alt_next) + mark ='#' ;/* blocked */ else if (hw->hw_alt_next == list_end) - mark ='.' ;/* use hw_qtd_next */ + mark ='.' ;/* use hw_qtd_next */ /* else alt_next points to some other qtd */ } scratch =hc32_to_cpup (fotg210, &hw->hw_info1);
@@ -462,6 +442,7 @@ static void qh_lines( temp =snprintf (next, size,"\n" );if (size < temp) temp = size; + size -= temp; next += temp;
@@ -472,12 +453,12 @@ done:static ssize_t fill_async_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -unsigned temp, size; -char *next; -struct fotg210_qh *qh; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +unsigned temp, size; +char *next; +struct fotg210_qh *qh; hcd =bus_to_hcd (buf->bus); fotg210 =hcd_to_fotg210 (hcd);
@@ -511,18 +492,19 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)#define DBG_SCHED_LIMIT 64static ssize_t fill_periodic_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -union fotg210_shadow p, *seen; -unsigned temp, size, seen_count; -char *next; -unsigned i; -__hc32 tag; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +union fotg210_shadow p, *seen; +unsigned temp, size, seen_count; +char *next; +unsigned i; +__hc32 tag; seen =kmalloc (DBG_SCHED_LIMIT *sizeof (*seen),GFP_ATOMIC );if (!seen)return 0 ; + seen_count =0 ; hcd =bus_to_hcd (buf->bus);
@@ -542,6 +524,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) p = fotg210->pshadow[i];if (likely (!p.ptr))continue ; + tag =Q_NEXT_TYPE (fotg210, fotg210->periodic[i]); temp =scnprintf (next, size,"%4d: " , i);
@@ -577,10 +560,10 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) }/* show more info the first time around */ if (temp == seen_count) { -u32 scratch =hc32_to_cpup (fotg210, - &hw->hw_info1); -struct fotg210_qtd *qtd; -char *type ="" ; +u32 scratch =hc32_to_cpup (fotg210, + &hw->hw_info1); +struct fotg210_qtd *qtd; +char *type ="" ;/* count tds, get ep direction */ temp =0 ;
@@ -601,8 +584,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) } temp = scnprintf(next, size, - "(%c%d ep%d%s " - "[%d/%d] q%d p%d)", + "(%c%d ep%d%s [%d/%d] q%d p%d)", speed_char(scratch), scratch & 0x007f, (scratch >> 8) & 0x000f, type,
@@ -663,13 +645,13 @@ static const char *rh_state_string(struct fotg210_hcd *fotg210)static ssize_t fill_registers_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -unsigned temp, size, i; -char *next, scratch[80 ]; -static const char fmt[] ="%*s\n" ; -static const char label[] ="" ; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +unsigned temp, size, i; +char *next, scratch[80 ]; +static const char fmt[] ="%*s\n" ; +static const char label[] ="" ; hcd =bus_to_hcd (buf->bus); fotg210 =hcd_to_fotg210 (hcd);
@@ -765,8 +747,8 @@ done:return buf->alloc_size - size; } -static struct debug_buffer *alloc_buffer (struct usb_bus *bus, -ssize_t (*fill_func)(struct debug_buffer *)) +static struct debug_buffer +*alloc_buffer (struct usb_bus *bus,ssize_t (*fill_func)(struct debug_buffer *)) {struct debug_buffer *buf;
@@ -850,6 +832,7 @@ static int debug_async_open(struct inode *inode, struct file *file)static int debug_periodic_open (struct inode *inode,struct file *file) {struct debug_buffer *buf; + buf =alloc_buffer (inode->i_private, fill_periodic_buffer);if (!buf)return -ENOMEM ;
@@ -899,8 +882,6 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)debugfs_remove_recursive (fotg210->debug_dir); } -/*-------------------------------------------------------------------------*/ -/* * handshake - spin reading hc until handshake completes or fails * @ptr: address of hc register to be read
@@ -919,9 +900,9 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)* bridge shutdown: shutting down the bridge before the devices using it. */ static int handshake (struct fotg210_hcd *fotg210,void __iomem *ptr, -u32 mask,u32 done,int usec) +u32 mask,u32 done,int usec) { -u32 result; +u32 result; do { result = fotg210_readl(fotg210, ptr);
@@ -942,7 +923,7 @@ static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr,*/ static int fotg210_halt (struct fotg210_hcd *fotg210) { -u32 temp; +u32 temp;spin_lock_irq (&fotg210->lock);
@@ -971,11 +952,12 @@ static int fotg210_halt(struct fotg210_hcd *fotg210)*/ static int fotg210_reset (struct fotg210_hcd *fotg210) { -int retval; -u32 command =fotg210_readl (fotg210, &fotg210->regs->command); +int retval; +u32 command =fotg210_readl (fotg210, &fotg210->regs->command);/* If the EHCI debug controller is active, special care must be -* taken before and after a host controller reset */ +* taken before and after a host controller reset +*/ if (fotg210->debug && !dbgp_reset_prep (fotg210_to_hcd (fotg210))) fotg210->debug =NULL ;
@@ -1004,7 +986,7 @@ static int fotg210_reset(struct fotg210_hcd *fotg210)*/ static void fotg210_quiesce (struct fotg210_hcd *fotg210) { -u32 temp; +u32 temp;if (fotg210->rh_state !=FOTG210_RH_RUNNING )return ;
@@ -1025,8 +1007,6 @@ static void fotg210_quiesce(struct fotg210_hcd *fotg210) 16 * 125); } -/*-------------------------------------------------------------------------*/ -static void end_unlink_async (struct fotg210_hcd *fotg210);static void unlink_empty_async (struct fotg210_hcd *fotg210);static void fotg210_work (struct fotg210_hcd *fotg210);
@@ -1034,8 +1014,6 @@ static void start_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);static void end_unlink_intr (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); -/*-------------------------------------------------------------------------*/ -/* Set a bit in the USBCMD register */ static void fotg210_set_command_bit (struct fotg210_hcd *fotg210,u32 bit) {
@@ -1056,8 +1034,6 @@ static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit)fotg210_readl (fotg210, &fotg210->regs->command); } -/*-------------------------------------------------------------------------*/ -/* * EHCI timer support... Now using hrtimers. *
@@ -1101,9 +1077,9 @@ static unsigned event_delays_ns[] = {/* Enable a pending hrtimer event */ static void fotg210_enable_event (struct fotg210_hcd *fotg210,unsigned event, -bool resched) +bool resched) { -ktime_t *timeout = &fotg210->hr_timeouts[event]; +ktime_t *timeout = &fotg210->hr_timeouts[event];if (resched) *timeout = ktime_add(ktime_get(),
@@ -1122,7 +1098,7 @@ static void fotg210_enable_event(struct fotg210_hcd *fotg210, unsigned event,/* Poll the STS_ASS status bit; see when it agrees with CMD_ASE */ static void fotg210_poll_ASS (struct fotg210_hcd *fotg210) { -unsigned actual, want; +unsigned actual, want;/* Don't enable anything if the controller isn't running (e.g., died) */ if (fotg210->rh_state !=FOTG210_RH_RUNNING )
@@ -1170,7 +1146,7 @@ static void fotg210_disable_ASE(struct fotg210_hcd *fotg210)/* Poll the STS_PSS status bit; see when it agrees with CMD_PSE */ static void fotg210_poll_PSS (struct fotg210_hcd *fotg210) { -unsigned actual, want; +unsigned actual, want;/* Don't do anything if the controller isn't running (e.g., died) */ if (fotg210->rh_state !=FOTG210_RH_RUNNING )
@@ -1243,7 +1219,7 @@ static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210)/* Handle unlinked interrupt QHs once they are gone from the hardware */ static void fotg210_handle_intr_unlinks (struct fotg210_hcd *fotg210) { -bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING ); +bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING );/* * Process all the QHs on the intr_unlink list that were added
@@ -1254,7 +1230,7 @@ static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210)*/ fotg210->intr_unlinking = true;while (fotg210->intr_unlink) { -struct fotg210_qh *qh = fotg210->intr_unlink; +struct fotg210_qh *qh = fotg210->intr_unlink;if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle)break ;
@@ -1288,7 +1264,7 @@ static void start_free_itds(struct fotg210_hcd *fotg210)/* Wait for controller to stop using old iTDs and siTDs */ static void end_free_itds (struct fotg210_hcd *fotg210) { -struct fotg210_itd *itd, *n; +struct fotg210_itd *itd, *n;if (fotg210->rh_state <FOTG210_RH_RUNNING ) fotg210->last_itd_to_free =NULL ;
@@ -1391,10 +1367,10 @@ static enum hrtimer_restart fotg210_hrtimer_func(struct hrtimer *t) {struct fotg210_hcd *fotg210 = container_of(t, struct fotg210_hcd, hrtimer); -ktime_t now; -unsigned long events; -unsigned long flags; -unsigned e; +ktime_t now; +unsigned long events; +unsigned long flags; +unsigned e;spin_lock_irqsave (&fotg210->lock, flags);
@@ -1418,19 +1394,12 @@ static enum hrtimer_restart fotg210_hrtimer_func(struct hrtimer *t)return HRTIMER_NORESTART ; } -/*-------------------------------------------------------------------------*/ - -#define fotg210_bus_suspend NULL -#define fotg210_bus_resume NULL +#define fotg210_bus_suspend NULL +#define fotg210_bus_resume NULL -/*-------------------------------------------------------------------------*/ - -static int check_reset_complete ( -struct fotg210_hcd *fotg210, -int index, -u32 __iomem *status_reg, -int port_status -) { +static int check_reset_complete (struct fotg210_hcd *fotg210,int index, +u32 __iomem *status_reg,int port_status) +{if (!(port_status &PORT_CONNECT ))return port_status;
@@ -1449,19 +1418,16 @@ static int check_reset_complete(return port_status; } -/*-------------------------------------------------------------------------*/ -/* build "status change" packet (one or two bytes) from HC registers */ -static int -fotg210_hub_status_data (struct usb_hcd *hcd,char *buf) +static int fotg210_hub_status_data (struct usb_hcd *hcd,char *buf) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -u32 temp, status; -u32 mask; -int retval =1 ; -unsigned long flags; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +u32 temp, status; +u32 mask; +int retval =1 ; +unsigned long flags;/* init status to no-changes */ buf[0 ] =0 ;
@@ -1499,15 +1465,11 @@ fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)return status ? retval :0 ; } -/*-------------------------------------------------------------------------*/ - -static void -fotg210_hub_descriptor ( -struct fotg210_hcd *fotg210, -struct usb_hub_descriptor *desc -) { -int ports =HCS_N_PORTS (fotg210->hcs_params); -u16 temp; +static void fotg210_hub_descriptor (struct fotg210_hcd *fotg210, +struct usb_hub_descriptor *desc) +{ +int ports =HCS_N_PORTS (fotg210->hcs_params); +u16 temp; desc->bDescriptorType =USB_DT_HUB ; desc->bPwrOn2PwrGood =10 ;/* fotg210 1.0, 2.3.9 says 20ms max */
@@ -1526,23 +1488,16 @@ fotg210_hub_descriptor( desc->wHubCharacteristics =cpu_to_le16 (temp); } -/*-------------------------------------------------------------------------*/ - -static int fotg210_hub_control ( -struct usb_hcd *hcd, -u16 typeReq, -u16 wValue, -u16 wIndex, -char *buf, -u16 wLength -) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -int ports =HCS_N_PORTS (fotg210->hcs_params); -u32 __iomem *status_reg = &fotg210->regs->port_status; -u32 temp, temp1, status; -unsigned long flags; -int retval =0 ; -unsigned selector; +static int fotg210_hub_control (struct usb_hcd *hcd,u16 typeReq,u16 wValue, +u16 wIndex,char *buf,u16 wLength) +{ +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +int ports =HCS_N_PORTS (fotg210->hcs_params); +u32 __iomem *status_reg = &fotg210->regs->port_status; +u32 temp, temp1, status; +unsigned long flags; +int retval =0 ; +unsigned selector;/* * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
@@ -1862,11 +1817,11 @@ static void __maybe_unused fotg210_relinquish_port(struct usb_hcd *hcd, }static int __maybe_unused fotg210_port_handed_over (struct usb_hcd *hcd, -int portnum) +int portnum) {return 0 ; } -/*-------------------------------------------------------------------------*/ +/* * There's basically three types of memory: * - data used only by the HCD ... kmalloc is fine
@@ -1878,10 +1833,7 @@ static int __maybe_unused fotg210_port_handed_over(struct usb_hcd *hcd,* No memory seen by this driver is pageable. */ -/*-------------------------------------------------------------------------*/ -/* Allocate the key transfer structures from the previously allocated pool */ -static inline void fotg210_qtd_init (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd,dma_addr_t dma) {
@@ -1896,8 +1848,8 @@ static inline void fotg210_qtd_init(struct fotg210_hcd *fotg210,static struct fotg210_qtd *fotg210_qtd_alloc (struct fotg210_hcd *fotg210,gfp_t flags) { -struct fotg210_qtd *qtd; -dma_addr_t dma; +struct fotg210_qtd *qtd; +dma_addr_t dma; qtd =dma_pool_alloc (fotg210->qtd_pool, flags, &dma);if (qtd !=NULL )
@@ -1929,8 +1881,8 @@ static void qh_destroy(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)static struct fotg210_qh *fotg210_qh_alloc (struct fotg210_hcd *fotg210,gfp_t flags) { -struct fotg210_qh *qh; -dma_addr_t dma; +struct fotg210_qh *qh; +dma_addr_t dma; qh =kzalloc (sizeof (*qh),GFP_ATOMIC );if (!qh)
@@ -1958,8 +1910,6 @@ fail:return NULL ; } -/*-------------------------------------------------------------------------*/ -/* The queue heads and transfer descriptors are managed from pools tied * to each of the "per device" structures. * This is the initialisation and cleanup code.
@@ -2058,7 +2008,6 @@ fail:fotg210_mem_cleanup (fotg210);return -ENOMEM ; } -/*-------------------------------------------------------------------------*/ /* * EHCI hardware queue manipulation ... the core. QH/QTD manipulation. *
@@ -2077,16 +2026,12 @@ fail:* buffer low/full speed data so the host collects it at high speed. */ -/*-------------------------------------------------------------------------*/ -/* fill a qtd, returning how much of the buffer we were able to queue up */ - -static int -qtd_fill (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd,dma_addr_t buf, -size_t len,int token,int maxpacket) +static int qtd_fill (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd, +dma_addr_t buf,size_t len,int token,int maxpacket) { -int i, count; -u64 addr = buf; +int i, count; +u64 addr = buf;/* one buffer entry per 4K ... first might be short or unaligned */ qtd->hw_buf[0 ] =cpu_to_hc32 (fotg210, (u32 )addr);
@@ -2121,11 +2066,9 @@ qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd, dma_addr_t buf,return count; } -/*-------------------------------------------------------------------------*/ - -static inline void -qh_update (struct fotg210_hcd *fotg210,struct fotg210_qh *qh, -struct fotg210_qtd *qtd) +static inline void qh_update (struct fotg210_hcd *fotg210, +struct fotg210_qh *qh, +struct fotg210_qtd *qtd) {struct fotg210_qh_hw *hw = qh->hw;
@@ -2141,7 +2084,7 @@ qh_update(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,* ever clear it. */ if (!(hw->hw_info1 &cpu_to_hc32 (fotg210,QH_TOGGLE_CTL ))) { -unsigned is_out, epnum; +unsigned is_out, epnum; is_out = qh->is_out; epnum = (hc32_to_cpup (fotg210, &hw->hw_info1) >>8 ) &0x0f ;
@@ -2158,8 +2101,7 @@ qh_update(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,* overlay, so qh->hw_token wrongly becomes inactive/halted), only fault * recovery (including urb dequeue) would need software changes to a QH... */ -static void -qh_refresh (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static void qh_refresh (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) {struct fotg210_qtd *qtd;
@@ -2185,16 +2127,14 @@ qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)qh_update (fotg210, qh, qtd); } -/*-------------------------------------------------------------------------*/ -static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh);static void fotg210_clear_tt_buffer_complete (struct usb_hcd *hcd, -struct usb_host_endpoint *ep) +struct usb_host_endpoint *ep) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct fotg210_qh *qh = ep->hcpriv; -unsigned long flags; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_qh *qh = ep->hcpriv; +unsigned long flags;spin_lock_irqsave (&fotg210->lock, flags); qh->clearing_tt =0 ;
@@ -2217,6 +2157,7 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210,*/ if (urb->dev->tt && !usb_pipeint (urb->pipe) && !qh->clearing_tt) {struct usb_device *tt = urb->dev->tt->hub; + dev_dbg(&tt->dev, "clear tt buffer port %d, a%d ep%d t%08x\n", urb->dev->ttport, urb->dev->devnum,
@@ -2230,14 +2171,10 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, } } -static int qtd_copy_status ( -struct fotg210_hcd *fotg210, -struct urb *urb, -size_t length, -u32 token -) +static int qtd_copy_status (struct fotg210_hcd *fotg210,struct urb *urb, +size_t length,u32 token) { -int status = -EINPROGRESS ; +int status = -EINPROGRESS ;/* count IN/OUT bytes, not SETUP (even short packets) */ if (likely (QTD_PID (token) !=2 ))
@@ -2293,13 +2230,13 @@ static int qtd_copy_status(return status; } -static void -fotg210_urb_done (struct fotg210_hcd *fotg210,struct urb *urb,int status) +static void fotg210_urb_done (struct fotg210_hcd *fotg210,struct urb *urb, +int status) __releases(fotg210->lock) __acquires(fotg210->lock) {if (likely (urb->hcpriv !=NULL )) { -struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv; +struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv;/* S-mask in a QH means it's an interrupt urb */ if ((qh->hw->hw_info2 &cpu_to_hc32 (fotg210,QH_SMASK )) !=0 ) {
@@ -2342,16 +2279,16 @@ static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);* Chases up to qh->hw_current. Returns number of completions called, * indicating how much "real" work we did. */ -static unsigned -qh_completions (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static unsigned qh_completions (struct fotg210_hcd *fotg210, +struct fotg210_qh *qh) { -struct fotg210_qtd *last, *end = qh->dummy; -struct list_head *entry, *tmp; -int last_status; -int stopped; -unsigned count =0 ; -u8 state; -struct fotg210_qh_hw *hw = qh->hw; +struct fotg210_qtd *last, *end = qh->dummy; +struct list_head *entry, *tmp; +int last_status; +int stopped; +unsigned count =0 ; +u8 state; +struct fotg210_qh_hw *hw = qh->hw;if (unlikely (list_empty (&qh->qtd_list)))return count;
@@ -2370,7 +2307,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh->qh_state =QH_STATE_COMPLETING ; stopped = (state ==QH_STATE_IDLE ); - rescan: +rescan: last =NULL ; last_status = -EINPROGRESS ; qh->needs_rescan =0 ;
@@ -2381,9 +2318,9 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* if queue is stopped, handles unlinks. */ list_for_each_safe (entry, tmp, &qh->qtd_list) { -struct fotg210_qtd *qtd; -struct urb *urb; -u32 token =0 ; +struct fotg210_qtd *qtd; +struct urb *urb; +u32 token =0 ; qtd = list_entry(entry, struct fotg210_qtd, qtd_list); urb = qtd->urb;
@@ -2409,7 +2346,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) token =hc32_to_cpu (fotg210, qtd->hw_token);/* always clean up qtds the hc de-activated */ - retry_xacterr: +retry_xacterr:if ((token &QTD_STS_ACTIVE ) ==0 ) {/* Report Data Buffer Error: non-fatal but useful */
@@ -2615,8 +2552,6 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)return count; } -/*-------------------------------------------------------------------------*/ -/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */ #define hb_mult (wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))/* ... and packet size, for any kind of endpoint descriptor */
@@ -2626,15 +2561,13 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* reverse of qh_urb_transaction: free a list of TDs. * used for cleanup after errors, before HC sees an URB's TDs. */ -static void qtd_list_free ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list -) { -struct list_head *entry, *temp; +static void qtd_list_free (struct fotg210_hcd *fotg210,struct urb *urb, +struct list_head *qtd_list) +{ +struct list_head *entry, *temp;list_for_each_safe (entry, temp, qtd_list) { -struct fotg210_qtd *qtd; +struct fotg210_qtd *qtd; qtd = list_entry(entry, struct fotg210_qtd, qtd_list);list_del (&qtd->qtd_list);
@@ -2645,20 +2578,18 @@ static void qtd_list_free(/* * create a list of filled qtds for this URB; won't link into qh. */ -static struct list_head * -qh_urb_transaction ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *head, -gfp_t flags -) { -struct fotg210_qtd *qtd, *qtd_prev; -dma_addr_t buf; -int len, this_sg_len, maxpacket; -int is_input; -u32 token; -int i; -struct scatterlist *sg; +static struct list_head *qh_urb_transaction (struct fotg210_hcd *fotg210, +struct urb *urb, +struct list_head *head, +gfp_t flags) +{ +struct fotg210_qtd *qtd, *qtd_prev; +dma_addr_t buf; +int len, this_sg_len, maxpacket; +int is_input; +u32 token; +int i; +struct scatterlist *sg;/* * URBs map to sequences of QTDs: one logical transaction
@@ -2778,7 +2709,7 @@ qh_urb_transaction(* (zero length). */ if (likely (urb->transfer_buffer_length !=0 )) { -int one_more =0 ; +int one_more =0 ;if (usb_pipecontrol (urb->pipe)) { one_more =1 ;
@@ -2813,7 +2744,6 @@ cleanup:return NULL ; } -/*-------------------------------------------------------------------------*/ /* * Would be best to create all qh's from config descriptors, * when each interface/altsetting is established. Unlink
@@ -2831,18 +2761,15 @@ cleanup:* just one microframe in the s-mask. For split interrupt transactions * there are additional complications: c-mask, maybe FSTNs. */ -static struct fotg210_qh * -qh_make ( -struct fotg210_hcd *fotg210, -struct urb *urb, -gfp_t flags -) { -struct fotg210_qh *qh =fotg210_qh_alloc (fotg210, flags); -u32 info1 =0 , info2 =0 ; -int is_input, type; -int maxp =0 ; -struct usb_tt *tt = urb->dev->tt; -struct fotg210_qh_hw *hw; +static struct fotg210_qh *qh_make (struct fotg210_hcd *fotg210,struct urb *urb, +gfp_t flags) +{ +struct fotg210_qh *qh =fotg210_qh_alloc (fotg210, flags); +u32 info1 =0 , info2 =0 ; +int is_input, type; +int maxp =0 ; +struct usb_tt *tt = urb->dev->tt; +struct fotg210_qh_hw *hw;if (!qh)return qh;
@@ -2896,7 +2823,7 @@ qh_make( urb->interval = qh->period <<3 ; } }else { -int think_time; +int think_time;/* gap is f(FS/LS transfer times) */ qh->gap_uf = 1 + usb_calc_bus_time(urb->dev->speed,
@@ -3005,8 +2932,6 @@ done:return qh; } -/*-------------------------------------------------------------------------*/ -static void enable_async (struct fotg210_hcd *fotg210) {if (fotg210->async_count++)
@@ -3036,8 +2961,8 @@ static void disable_async(struct fotg210_hcd *fotg210)static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -__hc32 dma =QH_NEXT (fotg210, qh->qh_dma); -struct fotg210_qh *head; +__hc32 dma =QH_NEXT (fotg210, qh->qh_dma); +struct fotg210_qh *head;/* Don't link a QH if there's a Clear-TT-Buffer pending */ if (unlikely (qh->clearing_tt))
@@ -3064,24 +2989,19 @@ static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)enable_async (fotg210); } -/*-------------------------------------------------------------------------*/ -/* * For control/bulk/interrupt, return QH with these TDs appended. * Allocates and initializes the QH if necessary. * Returns null if it can't allocate a QH it needs to. * If the QH has TDs (urbs) already, that's great. */ -static struct fotg210_qh *qh_append_tds ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list, -int epnum, -void **ptr -) +static struct fotg210_qh *qh_append_tds (struct fotg210_hcd *fotg210, +struct urb *urb, +struct list_head *qtd_list,int epnum, +void **ptr) { -struct fotg210_qh *qh =NULL ; -__hc32 qh_addr_mask =cpu_to_hc32 (fotg210,0x7f ); +struct fotg210_qh *qh =NULL ; +__hc32 qh_addr_mask =cpu_to_hc32 (fotg210,0x7f ); qh = (struct fotg210_qh *) *ptr;if (unlikely (qh ==NULL )) {
@@ -3090,7 +3010,7 @@ static struct fotg210_qh *qh_append_tds( *ptr = qh; }if (likely (qh !=NULL )) { -struct fotg210_qtd *qtd; +struct fotg210_qtd *qtd;if (unlikely (list_empty (qtd_list))) qtd =NULL ;
@@ -3109,9 +3029,9 @@ static struct fotg210_qh *qh_append_tds(* only hc or qh_refresh() ever modify the overlay. */ if (likely (qtd !=NULL )) { -struct fotg210_qtd *dummy; -dma_addr_t dma; -__hc32 token; +struct fotg210_qtd *dummy; +dma_addr_t dma; +__hc32 token;/* to avoid racing the HC, use the dummy td instead of * the first td of our list (becomes new dummy). both
@@ -3150,25 +3070,20 @@ static struct fotg210_qh *qh_append_tds(return qh; } -/*-------------------------------------------------------------------------*/ - -static int -submit_async( - struct fotg210_hcd *fotg210, - struct urb *urb, - struct list_head *qtd_list, - gfp_t mem_flags -) { - int epnum; - unsigned long flags; - struct fotg210_qh *qh = NULL; - int rc; +static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb, + struct list_head *qtd_list, gfp_t mem_flags) +{ + int epnum; + unsigned long flags; + struct fotg210_qh *qh = NULL; + int rc; epnum = urb->ep->desc.bEndpointAddress; #ifdef FOTG210_URB_TRACE { struct fotg210_qtd *qtd; + qtd = list_entry(qtd_list->next, struct fotg210_qtd, qtd_list); fotg210_dbg(fotg210, "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n",
@@ -3200,19 +3115,17 @@ submit_async(*/ if (likely (qh->qh_state ==QH_STATE_IDLE ))qh_link_async (fotg210, qh); - done: +done:spin_unlock_irqrestore (&fotg210->lock, flags);if (unlikely (qh ==NULL ))qtd_list_free (fotg210, urb, qtd_list);return rc; } -/*-------------------------------------------------------------------------*/ -static void single_unlink_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -struct fotg210_qh *prev; +struct fotg210_qh *prev;/* Add to the end of the list of QHs waiting for the next IAAD */ qh->qh_state =QH_STATE_UNLINK ;
@@ -3268,10 +3181,10 @@ static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested)static void end_unlink_async (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; +struct fotg210_qh *qh;/* Process the idle QHs */ - restart: +restart: fotg210->async_unlinking = true;while (fotg210->async_iaa) { qh = fotg210->async_iaa;
@@ -3352,18 +3265,16 @@ static void start_unlink_async(struct fotg210_hcd *fotg210,start_iaa_cycle (fotg210, false); } -/*-------------------------------------------------------------------------*/ -static void scan_async (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; -bool check_unlinks_later = false; +struct fotg210_qh *qh; +bool check_unlinks_later = false; fotg210->qh_scan_next = fotg210->async->qh_next.qh;while (fotg210->qh_scan_next) { qh = fotg210->qh_scan_next; fotg210->qh_scan_next = qh->qh_next.qh; - rescan: +rescan:/* clean any finished work for this qh */ if (!list_empty (&qh->qtd_list)) {int temp;
@@ -3401,7 +3312,6 @@ static void scan_async(struct fotg210_hcd *fotg210) ++fotg210->async_unlink_cycle; } } -/*-------------------------------------------------------------------------*/ /* * EHCI scheduled transaction support: interrupt, iso, split iso * These are called "periodic" transactions in the EHCI spec.
@@ -3414,19 +3324,16 @@ static void scan_async(struct fotg210_hcd *fotg210)* It keeps track of every ITD (or SITD) that's linked, and holds enough * pre-calculated schedule data to make appending to the queue be quick. */ -static int fotg210_get_frame (struct usb_hcd *hcd); -/*-------------------------------------------------------------------------*/ -/* * periodic_next_shadow - return "next" pointer on shadow list * @periodic: host pointer to qh/itd * @tag: hardware tag for type of this record */ -static union fotg210_shadow * -periodic_next_shadow (struct fotg210_hcd *fotg210, -union fotg210_shadow *periodic,__hc32 tag) +static union fotg210_shadow *periodic_next_shadow (struct fotg210_hcd *fotg210, +union fotg210_shadow *periodic, +__hc32 tag) {switch (hc32_to_cpu (fotg210, tag)) {case Q_TYPE_QH :
@@ -3438,9 +3345,8 @@ periodic_next_shadow(struct fotg210_hcd *fotg210, } } -static __hc32 * -shadow_next_periodic (struct fotg210_hcd *fotg210, -union fotg210_shadow *periodic,__hc32 tag) +static __hc32 *shadow_next_periodic (struct fotg210_hcd *fotg210, +union fotg210_shadow *periodic,__hc32 tag) {switch (hc32_to_cpu (fotg210, tag)) {/* our fotg210_shadow.qh is actually software part */
@@ -3456,9 +3362,9 @@ shadow_next_periodic(struct fotg210_hcd *fotg210,static void periodic_unlink (struct fotg210_hcd *fotg210,unsigned frame,void *ptr) { -union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow here = *prev_p; +union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow here = *prev_p;/* find predecessor of "ptr"; hw and shadow lists are in sync */ while (here.ptr && here.ptr != ptr) {
@@ -3483,13 +3389,13 @@ static void periodic_unlink(struct fotg210_hcd *fotg210, unsigned frame, }/* how many of the uframe's 125 usecs are allocated? */ -static unsigned short -periodic_usecs (struct fotg210_hcd *fotg210,unsigned frame,unsigned uframe) +static unsigned short periodic_usecs (struct fotg210_hcd *fotg210, +unsigned frame,unsigned uframe) { -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow *q = &fotg210->pshadow[frame]; -unsigned usecs =0 ; -struct fotg210_qh_hw *hw; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow *q = &fotg210->pshadow[frame]; +unsigned usecs =0 ; +struct fotg210_qh_hw *hw;while (q->ptr) {switch (hc32_to_cpu (fotg210,Q_NEXT_TYPE (fotg210, *hw_p))) {
@@ -3530,8 +3436,6 @@ periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe)return usecs; } -/*-------------------------------------------------------------------------*/ -static int same_tt (struct usb_device *dev1,struct usb_device *dev2) {if (!dev1->tt || !dev2->tt)
@@ -3548,13 +3452,8 @@ static int same_tt(struct usb_device *dev1, struct usb_device *dev2)* for a periodic transfer starting at the specified frame, using * all the uframes in the mask. */ -static int tt_no_collision ( -struct fotg210_hcd *fotg210, -unsigned period, -struct usb_device *dev, -unsigned frame, -u32 uf_mask -) +static int tt_no_collision (struct fotg210_hcd *fotg210,unsigned period, +struct usb_device *dev,unsigned frame,u32 uf_mask) {if (period ==0 )/* error */ return 0 ;
@@ -3564,9 +3463,9 @@ static int tt_no_collision(* calling convention doesn't make that distinction. */ for (; frame < fotg210->periodic_size; frame += period) { -union fotg210_shadow here; -__hc32 type; -struct fotg210_qh_hw *hw; +union fotg210_shadow here; +__hc32 type; +struct fotg210_qh_hw *hw; here = fotg210->pshadow[frame]; type =Q_NEXT_TYPE (fotg210, fotg210->periodic[frame]);
@@ -3579,7 +3478,7 @@ static int tt_no_collision(case Q_TYPE_QH : hw = here.qh->hw;if (same_tt (dev, here.qh->dev)) { -u32 mask; +u32 mask; mask =hc32_to_cpu (fotg210, hw->hw_info2);
@@ -3607,8 +3506,6 @@ static int tt_no_collision(return 1 ; } -/*-------------------------------------------------------------------------*/ -static void enable_periodic (struct fotg210_hcd *fotg210) {if (fotg210->periodic_count++)
@@ -3632,8 +3529,6 @@ static void disable_periodic(struct fotg210_hcd *fotg210)fotg210_poll_PSS (fotg210); } -/*-------------------------------------------------------------------------*/ -/* periodic schedule slots have iso tds (normal or split) first, then a * sparse tree for active interrupt transfers. *
@@ -3642,8 +3537,8 @@ static void disable_periodic(struct fotg210_hcd *fotg210)*/ static void qh_link_periodic (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -unsigned i; -unsigned period = qh->period; +unsigned i; +unsigned period = qh->period; dev_dbg(&qh->dev->dev, "link qh%d-%04x/%p start %d [%d/%d us]\n",
@@ -3656,10 +3551,10 @@ static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) period =1 ;for (i = qh->start; i < fotg210->periodic_size; i += period) { -union fotg210_shadow *prev = &fotg210->pshadow[i]; -__hc32 *hw_p = &fotg210->periodic[i]; -union fotg210_shadow here = *prev; -__hc32 type =0 ; +union fotg210_shadow *prev = &fotg210->pshadow[i]; +__hc32 *hw_p = &fotg210->periodic[i]; +union fotg210_shadow here = *prev; +__hc32 type =0 ;/* skip the iso nodes at list head */ while (here.ptr) {
@@ -3709,8 +3604,8 @@ static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)static void qh_unlink_periodic (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -unsigned i; -unsigned period; +unsigned i; +unsigned period;/* * If qh is for a low/full-speed device, simply unlinking it
@@ -3801,8 +3696,8 @@ static void start_unlink_intr(struct fotg210_hcd *fotg210,static void end_unlink_intr (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -struct fotg210_qh_hw *hw = qh->hw; -int rc; +struct fotg210_qh_hw *hw = qh->hw; +int rc; qh->qh_state =QH_STATE_IDLE ; hw->hw_next =FOTG210_LIST_END (fotg210);
@@ -3830,16 +3725,10 @@ static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)disable_periodic (fotg210); } -/*-------------------------------------------------------------------------*/ - -static int check_period ( -struct fotg210_hcd *fotg210, -unsigned frame, -unsigned uframe, -unsigned period, -unsigned usecs -) { -int claimed; +static int check_period (struct fotg210_hcd *fotg210,unsigned frame, +unsigned uframe,unsigned period,unsigned usecs) +{ +int claimed;/* complete split running into next frame? * given FSTN support, we could sometimes check...
@@ -3876,16 +3765,12 @@ static int check_period(return 1 ; } -static int check_intr_schedule ( -struct fotg210_hcd *fotg210, -unsigned frame, -unsigned uframe, -const struct fotg210_qh *qh, -__hc32 *c_maskp -) +static int check_intr_schedule (struct fotg210_hcd *fotg210,unsigned frame, +unsigned uframe,const struct fotg210_qh *qh, +__hc32 *c_maskp) { -int retval = -ENOSPC ; -u8 mask =0 ; +int retval = -ENOSPC ; +u8 mask =0 ;if (qh->c_usecs && uframe >=6 )/* FSTN territory? */ goto done;
@@ -3927,11 +3812,11 @@ done:*/ static int qh_schedule (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -int status; -unsigned uframe; -__hc32 c_mask; -unsigned frame;/* 0..(qh->period - 1), or NO_FRAME */ -struct fotg210_qh_hw *hw = qh->hw; +int status; +unsigned uframe; +__hc32 c_mask; +unsigned frame;/* 0..(qh->period - 1), or NO_FRAME */ +struct fotg210_qh_hw *hw = qh->hw;qh_refresh (fotg210, qh); hw->hw_next =FOTG210_LIST_END (fotg210);
@@ -3954,7 +3839,7 @@ static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)if (status) {/* "normal" case, uframing flexible except with splits */ if (qh->period) { -int i; +int i;for (i = qh->period; status && i >0 ; --i) { frame = ++fotg210->random_frame % qh->period;
@@ -3992,17 +3877,14 @@ done:return status; } -static int intr_submit ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list, -gfp_t mem_flags -) { -unsigned epnum; -unsigned long flags; -struct fotg210_qh *qh; -int status; -struct list_head empty; +static int intr_submit (struct fotg210_hcd *fotg210,struct urb *urb, +struct list_head *qtd_list,gfp_t mem_flags) +{ +unsigned epnum; +unsigned long flags; +struct fotg210_qh *qh; +int status; +struct list_head empty;/* get endpoint and transfer/schedule data */ epnum = urb->ep->desc.bEndpointAddress;
@@ -4050,11 +3932,11 @@ done_not_linked:static void scan_intr (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; +struct fotg210_qh *qh;list_for_each_entry_safe (qh, fotg210->qh_scan_next, &fotg210->intr_qh_list, intr_node) { - rescan: +rescan:/* clean any finished work for this qh */ if (!list_empty (&qh->qtd_list)) {int temp;
@@ -4077,12 +3959,9 @@ static void scan_intr(struct fotg210_hcd *fotg210) } } -/*-------------------------------------------------------------------------*/ -/* fotg210_iso_stream ops work with both ITD and SITD */ -static struct fotg210_iso_stream * -iso_stream_alloc (gfp_t mem_flags) +static struct fotg210_iso_stream *iso_stream_alloc (gfp_t mem_flags) {struct fotg210_iso_stream *stream;
@@ -4095,20 +3974,16 @@ iso_stream_alloc(gfp_t mem_flags)return stream; } -static void -iso_stream_init ( -struct fotg210_hcd *fotg210, -struct fotg210_iso_stream *stream, -struct usb_device *dev, -int pipe, -unsigned interval -) +static void iso_stream_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_stream *stream, +struct usb_device *dev,int pipe, +unsigned interval) { -u32 buf1; -unsigned epnum, maxp; -int is_input; -long bandwidth; -unsigned multi; +u32 buf1; +unsigned epnum, maxp; +int is_input; +long bandwidth; +unsigned multi;/* * this might be a "high bandwidth" highspeed endpoint,
@@ -4153,13 +4028,13 @@ iso_stream_init( stream->maxp = maxp; } -static struct fotg210_iso_stream * -iso_stream_find (struct fotg210_hcd *fotg210,struct urb *urb) +static struct fotg210_iso_stream *iso_stream_find (struct fotg210_hcd *fotg210, +struct urb *urb) { -unsigned epnum; -struct fotg210_iso_stream *stream; +unsigned epnum; +struct fotg210_iso_stream *stream;struct usb_host_endpoint *ep; -unsigned long flags; +unsigned long flags; epnum =usb_pipeendpoint (urb->pipe);if (usb_pipein (urb->pipe))
@@ -4191,15 +4066,13 @@ iso_stream_find(struct fotg210_hcd *fotg210, struct urb *urb)return stream; } -/*-------------------------------------------------------------------------*/ -/* fotg210_iso_sched ops can be ITD-only or SITD-only */ -static struct fotg210_iso_sched * -iso_sched_alloc (unsigned packets,gfp_t mem_flags) +static struct fotg210_iso_sched *iso_sched_alloc (unsigned packets, +gfp_t mem_flags) { -struct fotg210_iso_sched *iso_sched; -int size =sizeof (*iso_sched); +struct fotg210_iso_sched *iso_sched; +int size =sizeof (*iso_sched); size += packets *sizeof (struct fotg210_iso_packet ); iso_sched =kzalloc (size, mem_flags);
@@ -4209,16 +4082,13 @@ iso_sched_alloc(unsigned packets, gfp_t mem_flags)return iso_sched; } -static inline void -itd_sched_init ( -struct fotg210_hcd *fotg210, -struct fotg210_iso_sched *iso_sched, -struct fotg210_iso_stream *stream, -struct urb *urb -) +static inline void itd_sched_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_sched *iso_sched, +struct fotg210_iso_stream *stream, +struct urb *urb) { -unsigned i; -dma_addr_t dma = urb->transfer_dma; +unsigned i; +dma_addr_t dma = urb->transfer_dma;/* how many uframes are needed for these transfers */ iso_sched->span = urb->number_of_packets * stream->interval;
@@ -4227,10 +4097,10 @@ itd_sched_init(* when we fit new itds into the schedule. */ for (i =0 ; i < urb->number_of_packets; i++) { -struct fotg210_iso_packet *uframe = &iso_sched->packet[i]; -unsigned length; -dma_addr_t buf; -u32 trans; +struct fotg210_iso_packet *uframe = &iso_sched->packet[i]; +unsigned length; +dma_addr_t buf; +u32 trans; length = urb->iso_frame_desc[i].length; buf = dma + urb->iso_frame_desc[i].offset;
@@ -4251,11 +4121,8 @@ itd_sched_init( } } -static void -iso_sched_free ( -struct fotg210_iso_stream *stream, -struct fotg210_iso_sched *iso_sched -) +static void iso_sched_free (struct fotg210_iso_stream *stream, +struct fotg210_iso_sched *iso_sched) {if (!iso_sched)return ;
@@ -4264,20 +4131,16 @@ iso_sched_free(kfree (iso_sched); } -static int -itd_urb_transaction ( -struct fotg210_iso_stream *stream, -struct fotg210_hcd *fotg210, -struct urb *urb, -gfp_t mem_flags -) +static int itd_urb_transaction (struct fotg210_iso_stream *stream, +struct fotg210_hcd *fotg210, +struct urb *urb,gfp_t mem_flags) { -struct fotg210_itd *itd; -dma_addr_t itd_dma; -int i; -unsigned num_itds; -struct fotg210_iso_sched *sched; -unsigned long flags; +struct fotg210_itd *itd; +dma_addr_t itd_dma; +int i; +unsigned num_itds; +struct fotg210_iso_sched *sched; +unsigned long flags; sched =iso_sched_alloc (urb->number_of_packets, mem_flags);if (unlikely (sched ==NULL ))
@@ -4306,7 +4169,7 @@ itd_urb_transaction(list_del (&itd->itd_list); itd_dma = itd->itd_dma; }else { - alloc_itd: +alloc_itd:spin_unlock_irqrestore (&fotg210->lock, flags); itd =dma_pool_alloc (fotg210->itd_pool, mem_flags, &itd_dma);
@@ -4330,16 +4193,8 @@ itd_urb_transaction(return 0 ; } -/*-------------------------------------------------------------------------*/ - -static inline int -itd_slot_ok ( -struct fotg210_hcd *fotg210, -u32 mod, -u32 uframe, -u8 usecs, -u32 period -) +static inline int itd_slot_ok (struct fotg210_hcd *fotg210,u32 mod,u32 uframe, +u8 usecs,u32 period) { uframe %= period; do {
@@ -4365,19 +4220,15 @@ itd_slot_ok(* given FOTG210_TUNE_FLS and the slop). Or, write a smarter scheduler! */ -#define SCHEDULE_SLOP 80/* microframes */ +#define SCHEDULE_SLOP 80/* microframes */ -static int -iso_stream_schedule ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct fotg210_iso_stream *stream -) +static int iso_stream_schedule (struct fotg210_hcd *fotg210,struct urb *urb, +struct fotg210_iso_stream *stream) { -u32 now, next, start, period, span; -int status; -unsigned mod = fotg210->periodic_size <<3 ; -struct fotg210_iso_sched *sched = urb->hcpriv; +u32 now, next, start, period, span; +int status; +unsigned mod = fotg210->periodic_size <<3 ; +struct fotg210_iso_sched *sched = urb->hcpriv; period = urb->interval; span = sched->span;
@@ -4396,7 +4247,7 @@ iso_stream_schedule(* slot in the schedule, implicitly assuming URB_ISO_ASAP. */ if (likely (!list_empty (&stream->td_list))) { -u32 excess; +u32 excess;/* For high speed devices, allow scheduling within the * isochronous scheduling threshold. For full speed devices
@@ -4435,6 +4286,7 @@ iso_stream_schedule(*/ else {int done =0 ; + start =SCHEDULE_SLOP + (now & ~0x07 );/* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */
@@ -4485,17 +4337,15 @@ iso_stream_schedule( fotg210->next_frame = now >>3 ;return 0 ; - fail: +fail:iso_sched_free (stream, sched); urb->hcpriv =NULL ;return status; } -/*-------------------------------------------------------------------------*/ - -static inline void -itd_init (struct fotg210_hcd *fotg210,struct fotg210_iso_stream *stream, -struct fotg210_itd *itd) +static inline void itd_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_stream *stream, +struct fotg210_itd *itd) {int i;
@@ -4511,17 +4361,13 @@ itd_init(struct fotg210_hcd *fotg210, struct fotg210_iso_stream *stream,/* All other fields are filled when scheduling */ } -static inline void -itd_patch ( -struct fotg210_hcd *fotg210, -struct fotg210_itd *itd, -struct fotg210_iso_sched *iso_sched, -unsigned index, -u16 uframe -) +static inline void itd_patch (struct fotg210_hcd *fotg210, +struct fotg210_itd *itd, +struct fotg210_iso_sched *iso_sched, +unsigned index,u16 uframe) { -struct fotg210_iso_packet *uf = &iso_sched->packet[index]; -unsigned pg = itd->pg; +struct fotg210_iso_packet *uf = &iso_sched->packet[index]; +unsigned pg = itd->pg; uframe &=0x07 ; itd->index[uframe] = index;
@@ -4533,7 +4379,7 @@ itd_patch(/* iso_frame_desc[].offset must be strictly increasing */ if (unlikely (uf->cross)) { -u64 bufp = uf->bufp +4096 ; +u64 bufp = uf->bufp +4096 ; itd->pg = ++pg; itd->hw_bufp[pg] |=cpu_to_hc32 (fotg210, bufp & ~(u32 )0 );
@@ -4541,13 +4387,13 @@ itd_patch( } } -static inline void -itd_link (struct fotg210_hcd *fotg210,unsigned frame,struct fotg210_itd *itd) +static inline void itd_link (struct fotg210_hcd *fotg210,unsigned frame, +struct fotg210_itd *itd) { -union fotg210_shadow *prev = &fotg210->pshadow[frame]; -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow here = *prev; -__hc32 type =0 ; +union fotg210_shadow *prev = &fotg210->pshadow[frame]; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow here = *prev; +__hc32 type =0 ;/* skip any iso nodes which might belong to previous microframes */ while (here.ptr) {
@@ -4568,17 +4414,13 @@ itd_link(struct fotg210_hcd *fotg210, unsigned frame, struct fotg210_itd *itd) }/* fit urb's itds into the selected schedule slot; activate as needed */ -static void itd_link_urb ( -struct fotg210_hcd *fotg210, -struct urb *urb, -unsigned mod, -struct fotg210_iso_stream *stream -) -{ -int packet; -unsigned next_uframe, uframe, frame; -struct fotg210_iso_sched *iso_sched = urb->hcpriv; -struct fotg210_itd *itd; +static void itd_link_urb (struct fotg210_hcd *fotg210,struct urb *urb, +unsigned mod,struct fotg210_iso_stream *stream) +{ +int packet; +unsigned next_uframe, uframe, frame; +struct fotg210_iso_sched *iso_sched = urb->hcpriv; +struct fotg210_itd *itd; next_uframe = stream->next_uframe & (mod -1 );
@@ -4635,7 +4477,7 @@ static void itd_link_urb(enable_periodic (fotg210); } -#define ISO_ERRS (FOTG210_ISOC_BUF_ERR | FOTG210_ISOC_BABBLE |\ +#define ISO_ERRS (FOTG210_ISOC_BUF_ERR | FOTG210_ISOC_BABBLE |\ FOTG210_ISOC_XACTERR)/* Process and recycle a completed ITD. Return true iff its urb completed,
@@ -4650,14 +4492,14 @@ static void itd_link_urb(*/ static bool itd_complete (struct fotg210_hcd *fotg210,struct fotg210_itd *itd) { -struct urb *urb = itd->urb; -struct usb_iso_packet_descriptor *desc; -u32 t; -unsigned uframe; -int urb_index =-1 ; -struct fotg210_iso_stream *stream = itd->stream; -struct usb_device *dev; -bool retval = false; +struct urb *urb = itd->urb; +struct usb_iso_packet_descriptor *desc; +u32 t; +unsigned uframe; +int urb_index =-1 ; +struct fotg210_iso_stream *stream = itd->stream; +struct usb_device *dev; +bool retval = false;/* for each uframe with a packet */ for (uframe =0 ; uframe <8 ; uframe++) {
@@ -4702,8 +4544,8 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) goto done;/* ASSERT: it's really the last itd for this urb -list_for_each_entry (itd, &stream->td_list, itd_list) -BUG_ON (itd->urb == urb); +* list_for_each_entry (itd, &stream->td_list, itd_list) +* BUG_ON (itd->urb == urb); */ /* give urb back to the driver; completion often (re)submits */
@@ -4740,14 +4582,12 @@ done:return retval; } -/*-------------------------------------------------------------------------*/ -static int itd_submit (struct fotg210_hcd *fotg210,struct urb *urb, -gfp_t mem_flags) +gfp_t mem_flags) { -int status = -EINVAL ; -unsigned long flags; -struct fotg210_iso_stream *stream; +int status = -EINVAL ; +unsigned long flags; +struct fotg210_iso_stream *stream;/* Get iso_stream head */ stream =iso_stream_find (fotg210, urb);
@@ -4756,11 +4596,10 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,return -ENOMEM ; }if (unlikely (urb->interval != stream->interval && -fotg210_port_speed (fotg210,0 ) == -USB_PORT_STAT_HIGH_SPEED )) { -fotg210_dbg (fotg210,"can't change iso interval %d --> %d\n" , - stream->interval, urb->interval); - goto done; +fotg210_port_speed (fotg210,0 ) ==USB_PORT_STAT_HIGH_SPEED )) { +fotg210_dbg (fotg210,"can't change iso interval %d --> %d\n" , + stream->interval, urb->interval); + goto done; }#ifdef FOTG210_URB_TRACE
@@ -4795,9 +4634,9 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,itd_link_urb (fotg210, urb, fotg210->periodic_size <<3 , stream); elseusb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210 ),urb ); - done_not_linked: +done_not_linked:spin_unlock_irqrestore (&fotg210->lock, flags); - done: +done:return status; }
@@ -4897,7 +4736,7 @@ restart: } fotg210->next_frame = now_frame; } -/*-------------------------------------------------------------------------*/ +/* * Display / Set uframe_periodic_max */
@@ -4905,8 +4744,8 @@ static ssize_t show_uframe_periodic_max(struct device *dev,struct device_attribute *attr, char *buf) { - struct fotg210_hcd *fotg210; -int n; + struct fotg210_hcd *fotg210; +int n; fotg210 =hcd_to_fotg210 (bus_to_hcd (dev_get_drvdata (dev))); n =scnprintf (buf,PAGE_SIZE ,"%d\n" , fotg210->uframe_periodic_max);
@@ -4918,12 +4757,12 @@ static ssize_t store_uframe_periodic_max(struct device *dev,struct device_attribute *attr, const char *buf, size_t count) { - struct fotg210_hcd *fotg210; -unsigned uframe_periodic_max; -unsigned frame, uframe; -unsigned short allocated_max; -unsigned long flags; -ssize_t ret; + struct fotg210_hcd *fotg210; +unsigned uframe_periodic_max; +unsigned frame, uframe; +unsigned short allocated_max; +unsigned long flags; +ssize_t ret; fotg210 =hcd_to_fotg210 (bus_to_hcd (dev_get_drvdata (dev)));if (kstrtouint (buf,0 , &uframe_periodic_max) <0 )
@@ -4954,13 +4793,13 @@ static ssize_t store_uframe_periodic_max(struct device *dev,for (frame =0 ; frame < fotg210->periodic_size; ++frame)for (uframe =0 ; uframe <7 ; ++uframe) allocated_max =max (allocated_max, -periodic_usecs (fotg210, frame, uframe)); +periodic_usecs (fotg210, + frame, + uframe));if (allocated_max > uframe_periodic_max) {fotg210_info (fotg210, -"cannot decrease uframe_periodic_max because " -"periodic bandwidth is already allocated " -"(%u > %u)\n" , +"cannot decrease uframe_periodic_max because periodic bandwidth is already allocated (%u > %u)\n" , allocated_max, uframe_periodic_max); goto out_unlock; }
@@ -4987,8 +4826,8 @@ static DEVICE_ATTR(uframe_periodic_max, 0644, show_uframe_periodic_max,static inline int create_sysfs_files (struct fotg210_hcd *fotg210) { -struct device *controller =fotg210_to_hcd (fotg210)->self.controller; -int i =0 ; +struct device *controller =fotg210_to_hcd (fotg210)->self.controller; +int i =0 ;if (i) goto out;
@@ -5000,12 +4839,10 @@ out:static inline void remove_sysfs_files (struct fotg210_hcd *fotg210) { -struct device *controller =fotg210_to_hcd (fotg210)->self.controller; +struct device *controller =fotg210_to_hcd (fotg210)->self.controller;device_remove_file (controller, &dev_attr_uframe_periodic_max); } -/*-------------------------------------------------------------------------*/ -/* On some systems, leaving remote wakeup enabled prevents system shutdown. * The firmware seems to think that powering off is a wakeup event! * This routine turns off remote wakeup and everything else, on all ports.
@@ -5037,7 +4874,7 @@ static void fotg210_silence_controller(struct fotg210_hcd *fotg210)*/ static void fotg210_shutdown (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd);spin_lock_irq (&fotg210->lock); fotg210->shutdown = true;
@@ -5050,8 +4887,6 @@ static void fotg210_shutdown(struct usb_hcd *hcd)hrtimer_cancel (&fotg210->hrtimer); } -/*-------------------------------------------------------------------------*/ -/* * fotg210_work is called from some interrupts, timers, and so on. * it calls driver completion functions, after dropping fotg210->lock.
@@ -5068,7 +4903,7 @@ static void fotg210_work(struct fotg210_hcd *fotg210) } fotg210->scanning = true; - rescan: +rescan: fotg210->need_rescan = false;if (fotg210->async_count)scan_async (fotg210);
@@ -5092,7 +4927,7 @@ static void fotg210_work(struct fotg210_hcd *fotg210)*/ static void fotg210_stop (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd);fotg210_dbg (fotg210,"stop\n" );
@@ -5116,7 +4951,7 @@ static void fotg210_stop(struct usb_hcd *hcd)spin_unlock_irq (&fotg210->lock);fotg210_mem_cleanup (fotg210); -#ifdef FOTG210_STATS +#ifdef FOTG210_STATS fotg210_dbg (fotg210,"irq normal %ld err %ld iaa %ld (lost %ld)\n" , fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa, fotg210->stats.lost_iaa);
@@ -5131,11 +4966,11 @@ static void fotg210_stop(struct usb_hcd *hcd)/* one-time init, only for memory state */ static int hcd_fotg210_init (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -u32 temp; -int retval; -u32 hcc_params; -struct fotg210_qh_hw *hw; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +u32 temp; +int retval; +u32 hcc_params; +struct fotg210_qh_hw *hw;spin_lock_init (&fotg210->lock);
@@ -5238,9 +5073,9 @@ static int hcd_fotg210_init(struct usb_hcd *hcd)/* start HC running; it's halted, hcd_fotg210_init() has been run (once) */ static int fotg210_run (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -u32 temp; -u32 hcc_params; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +u32 temp; +u32 hcc_params; hcd->uses_new_polling =1 ;
@@ -5347,13 +5182,11 @@ static int fotg210_setup(struct usb_hcd *hcd)return 0 ; } -/*-------------------------------------------------------------------------*/ -static irqreturn_t fotg210_irq (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -u32 status, masked_status, pcd_status =0 , cmd; -int bh; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +u32 status, masked_status, pcd_status =0 , cmd; +int bh;spin_lock (&fotg210->lock);
@@ -5485,8 +5318,6 @@ dead:return IRQ_HANDLED ; } -/*-------------------------------------------------------------------------*/ -/* * non-error returns are a promise to giveback() the urb later * we drop ownership so next owner (or urb unlink) can get it
@@ -5499,13 +5330,11 @@ dead:* NOTE: control, bulk, and interrupt share the same code to append TDs * to a (possibly active) QH, and the same QH scanning code. */ -static int fotg210_urb_enqueue ( -struct usb_hcd *hcd, -struct urb *urb, -gfp_t mem_flags -) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct list_head qtd_list; +static int fotg210_urb_enqueue (struct usb_hcd *hcd,struct urb *urb, +gfp_t mem_flags) +{ +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct list_head qtd_list;INIT_LIST_HEAD (&qtd_list);
@@ -5539,10 +5368,10 @@ static int fotg210_urb_enqueue(static int fotg210_urb_dequeue (struct usb_hcd *hcd,struct urb *urb,int status) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct fotg210_qh *qh; -unsigned long flags; -int rc; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_qh *qh; +unsigned long flags; +int rc;spin_lock_irqsave (&fotg210->lock, flags); rc =usb_hcd_check_unlink_urb (hcd, urb, status);
@@ -5603,16 +5432,14 @@ done:return rc; } -/*-------------------------------------------------------------------------*/ -/* bulk qh holds the data toggle */ -static void -fotg210_endpoint_disable (struct usb_hcd *hcd,struct usb_host_endpoint *ep) +static void fotg210_endpoint_disable (struct usb_hcd *hcd, +struct usb_host_endpoint *ep) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -unsigned long flags; -struct fotg210_qh *qh, *tmp; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +unsigned long flags; +struct fotg210_qh *qh, *tmp;/* ASSERT: any requests/urbs are being unlinked */ /* ASSERT: nobody can be submitting urbs for this any more */
@@ -5627,7 +5454,7 @@ rescan:* accelerate iso completions ... so spin a while. */ if (qh->hw ==NULL ) { -struct fotg210_iso_stream *stream = ep->hcpriv; +struct fotg210_iso_stream *stream = ep->hcpriv;if (!list_empty (&stream->td_list)) goto idle_timeout;
@@ -5675,20 +5502,20 @@ idle_timeout: list_empty(&qh->qtd_list) ? "" : "(has tds)");break ; } - done: +done: ep->hcpriv =NULL ;spin_unlock_irqrestore (&fotg210->lock, flags); } -static void -fotg210_endpoint_reset (struct usb_hcd *hcd,struct usb_host_endpoint *ep) +static void fotg210_endpoint_reset (struct usb_hcd *hcd, +struct usb_host_endpoint *ep) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct fotg210_qh *qh; -int eptype =usb_endpoint_type (&ep->desc); -int epnum =usb_endpoint_num (&ep->desc); -int is_out =usb_endpoint_dir_out (&ep->desc); -unsigned long flags; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_qh *qh; +int eptype =usb_endpoint_type (&ep->desc); +int epnum =usb_endpoint_num (&ep->desc); +int is_out =usb_endpoint_dir_out (&ep->desc); +unsigned long flags;if (eptype !=USB_ENDPOINT_XFER_BULK && eptype !=USB_ENDPOINT_XFER_INT )return ;
@@ -5723,13 +5550,12 @@ fotg210_endpoint_reset(struct usb_hcd *hcd, struct usb_host_endpoint *ep)static int fotg210_get_frame (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +return (fotg210_read_frame_index (fotg210) >>3 ) % fotg210->periodic_size; } -/*-------------------------------------------------------------------------*/ -/* * The EHCI in ChipIdea HDRC cannot be a separate module or device, * because its registers (and irq) are shared between host/gadget/otg
@@ -5808,12 +5634,12 @@ static void fotg210_init(struct fotg210_hcd *fotg210)*/ static int fotg210_hcd_probe (struct platform_device *pdev) { -struct device *dev = &pdev->dev; -struct usb_hcd *hcd; -struct resource *res; -int irq; -int retval = -ENODEV ; -struct fotg210_hcd *fotg210; +struct device *dev = &pdev->dev; +struct usb_hcd *hcd; +struct resource *res; +int irq; +int retval = -ENODEV ; +struct fotg210_hcd *fotg210;if (usb_disabled ())return -ENODEV ;
@@ -5883,8 +5709,8 @@ fail_create_hcd:*/ static int fotg210_hcd_remove (struct platform_device *pdev) { -struct device *dev = &pdev->dev; -struct usb_hcd *hcd =dev_get_drvdata (dev); +struct device *dev = &pdev->dev; +struct usb_hcd *hcd =dev_get_drvdata (dev);if (!hcd)return 0 ;
drivers/usb/host/fotg210.h +21 -15
@@ -137,19 +137,25 @@ struct fotg210_hcd { /* one per controller *//* per root hub port */ unsigned long reset_done[FOTG210_MAX_ROOT_PORTS ]; -/* bit vectors (one bit per port) */ -unsigned long bus_suspended;/* which ports were -already suspended at the start of a bus suspend */ -unsigned long companion_ports;/* which ports are -dedicated to the companion controller */ -unsigned long owned_ports;/* which ports are -owned by the companion during a bus suspend */ -unsigned long port_c_suspend;/* which ports have -the change-suspend feature turned on */ -unsigned long suspended_ports;/* which ports are -suspended */ -unsigned long resuming_ports;/* which ports have -started to resume */ +/* bit vectors (one bit per port) +* which ports were already suspended at the start of a bus suspend +*/ +unsigned long bus_suspended; + +/* which ports are edicated to the companion controller */ +unsigned long companion_ports; + +/* which ports are owned by the companion during a bus suspend */ +unsigned long owned_ports; + +/* which ports have the change-suspend feature turned on */ +unsigned long port_c_suspend; + +/* which ports are suspended */ +unsigned long suspended_ports; + +/* which ports have started to resume */ +unsigned long resuming_ports;/* per-HC memory pools (could be per-bus, but ...) */ struct dma_pool *qh_pool;/* qh per active urb */
@@ -585,10 +591,10 @@ struct fotg210_fstn {/* Prepare the PORTSC wakeup flags during controller suspend/resume */ #define fotg210_prepare_ports_for_controller_suspend (fotg210, do_wakeup) \ - fotg210_adjust_port_wakeup_flags(fotg210, true, do_wakeup); + fotg210_adjust_port_wakeup_flags(fotg210, true, do_wakeup)#define fotg210_prepare_ports_for_controller_resume (fotg210) \ - fotg210_adjust_port_wakeup_flags(fotg210, false, false); + fotg210_adjust_port_wakeup_flags(fotg210, false, false)/*-------------------------------------------------------------------------*/
Signature · 1 line
2.1.0
Re: [PATCH 01/14] RFC: usb/host/fotg210: Fix coding style issues
Quoted 75 lines · Peter Senna Tschudin
This patch fix coding style issues reported by checkpatch that do not change semantics of the code.
Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/fotg210-hcd.c | 1248 +++++++++++++++++----------------------- drivers/usb/host/fotg210.h | 36 +- 2 files changed, 558 insertions(+), 726 deletions(-)drivers/usb/host/fotg210-hcd.c +14
-18@@ -50,32 +50,30 @@#include <asm/irq.h> #include <asm/unaligned.h> -/*-------------------------------------------------------------------------*/ #define DRIVER_AUTHOR "Yuan-Hsin Chen"#define DRIVER_DESC "FOTG210 Host Controller (EHCI) Driver" - -static const char hcd_name[] ="fotg210_hcd" ; +static const char hcd_name[] ="fotg210_hcd" ;#undef FOTG210_URB_TRACE -#define FOTG210_STATS /* magic numbers that can affect system performance */ -#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ -#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ -#define FOTG210_TUNE_RL_TT 0 -#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ -#define FOTG210_TUNE_MULT_TT 1 +#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ +#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ +#define FOTG210_TUNE_RL_TT 0 +#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ +#define FOTG210_TUNE_MULT_TT 1 +/* -* Some drivers think it's safe to schedule isochronous transfers more than -* 256 ms into the future (partly as a result of an old bug in the scheduling +* Some drivers think it's safe to schedule isochronous transfers more than 256 +* ms into the future (partly as a result of an old bug in the scheduling * code). In an attempt to avoid trouble, we will use a minimum scheduling * length of 512 frames instead of 256. */ -#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ +#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ /* Initial IRQ latency: faster than hw default */ -static int log2_irq_thresh;/* 0 to 6 */ +static int log2_irq_thresh;/* 0 to 6 */ module_param (log2_irq_thresh, int,S_IRUGO );MODULE_PARM_DESC (log2_irq_thresh,"log2 IRQ latency, 1-64 microframes" );@@ -89,66 +87,57 @@ static unsigned int hird;module_param (hird, int,S_IRUGO );MODULE_PARM_DESC (hird,"host initiated resume duration, +1 for each 75us" ); -#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) +#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)#include "fotg210.h" -/*-------------------------------------------------------------------------*/ - #define fotg210_dbg(fotg210, fmt, args...) \ - dev_dbg(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_err(fotg210, fmt, args...) \ - dev_err(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_info(fotg210, fmt, args...) \
drivers/usb/host/fotg210-hcd.c static unsigned int hird; · line 103
Quoted 10 lines
drivers/usb/host/fotg210-hcd.c +3
-5- dev_info(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_warn(fotg210, fmt, args...) \ - dev_warn(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -/* check the values in the HCSPARAMS register -* (host controller _Structural_ parameters) -* see EHCI spec, Table 2-4 for each value +/* check the values in the HCSPARAMS register (host controller _Structural_
if you're fixing coding style issues, you might as well go ahead and fix this comment style too:
/*
* check the values ....
--
balbi
PATCH 2/14 RFC: usb/host/fotg210: remove KERN_WARNING from pr_info
In reply to Peter Senna TschudinThis patch remove KERN_WARNING from a call to pr_info().
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -5740,7 +5740,7 @@ static int __init fotg210_hcd_init(void)set_bit (USB_EHCI_LOADED , &usb_hcds_loaded);if (test_bit (USB_UHCI_LOADED , &usb_hcds_loaded) ||test_bit (USB_OHCI_LOADED , &usb_hcds_loaded)) -pr_warn (KERN_WARNING "Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); +pr_warn ("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd\n", hcd_name,
Signature · 1 line
2.1.0
Re: [PATCH 02/14] RFC: usb/host/fotg210: remove KERN_WARNING from pr_info
Hello.
Quoted 1 line · Peter Senna Tschudin
This patch remove
KERN_WARNINGfrom a call topr_info().
Not pr_warn()?
Quoted 10 lines
Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/usb/host/fotg210-hcd.c +0
-0
drivers/usb/host/fotg210-hcd.c static int __init fotg210_hcd_init(void) · line 5743
Quoted 5 lines
drivers/usb/host/fotg210-hcd.c +1
-1@@ -5740,7 +5740,7 @@ static int __init fotg210_hcd_init(void)set_bit (USB_EHCI_LOADED , &usb_hcds_loaded);if (test_bit (USB_UHCI_LOADED , &usb_hcds_loaded) ||test_bit (USB_OHCI_LOADED , &usb_hcds_loaded)) -pr_warn (KERN_WARNING "Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); +pr_warn ("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" );
[...]
MBR, Sergei
Re: [PATCH 02/14] RFC: usb/host/fotg210: remove KERN_WARNING from pr_info
In reply to Peter Senna TschudinQuoted 1 line · Peter Senna Tschudin
This patch remove
KERN_WARNINGfrom a call topr_info().
s/pr_info/pr_warn/
other than that, looks good
Quoted 22 lines
Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/usb/host/fotg210-hcd.c +1
-1@@ -5740,7 +5740,7 @@ static int __init fotg210_hcd_init(void)set_bit (USB_EHCI_LOADED , &usb_hcds_loaded);if (test_bit (USB_UHCI_LOADED , &usb_hcds_loaded) ||test_bit (USB_OHCI_LOADED , &usb_hcds_loaded)) -pr_warn (KERN_WARNING "Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); +pr_warn ("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd\n", hcd_name,Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 3/14 RFC: usb/host/fotg210: Remove useless else statement
In reply to Peter Senna TschudinThis patch remove an else statement after a return to make the code easier to understand.
--- drivers/usb/host/fotg210-hcd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/usb/host/fotg210-hcd.c +2 -3
@@ -1410,10 +1410,9 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,"Failed to enable port %d on root hub TT\n" , index+1);return port_status; - }else { -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 ); } +fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , + index +1 );return port_status; }
Signature · 1 line
2.1.0
Re: [PATCH 03/14] RFC: usb/host/fotg210: Remove useless else statement
Quoted 4 lines · Peter Senna Tschudin
This patch remove an else statement after a return to make the code easier to understand.
Signed-off-by Peter Senna Tschudin <[email protected]>
looks good to me.
Quoted 24 lines
--- drivers/usb/host/fotg210-hcd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)drivers/usb/host/fotg210-hcd.c +2
-3@@ -1410,10 +1410,9 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,"Failed to enable port %d on root hub TT\n" , index+1);return port_status; - }else { -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 ); } +fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , + index +1 );return port_status; }Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 4/14 RFC: usb/host/fotg210: Remove NULL checks dma_pool_destroy
In reply to Peter Senna TschudinThis patch remove NULL checks before calls to dma_pool_destroy() as the function now can handle NULL pointers.
--- drivers/usb/host/fotg210-hcd.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/usb/host/fotg210-hcd.c +4 -8
@@ -1925,17 +1925,13 @@ static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210) fotg210->dummy =NULL ;/* DMA consistent memory and pools */ -if (fotg210->qtd_pool) -dma_pool_destroy (fotg210->qtd_pool); +dma_pool_destroy (fotg210->qtd_pool); fotg210->qtd_pool =NULL ; -if (fotg210->qh_pool) { -dma_pool_destroy (fotg210->qh_pool); - fotg210->qh_pool =NULL ; - } +dma_pool_destroy (fotg210->qh_pool); + fotg210->qh_pool =NULL ; -if (fotg210->itd_pool) -dma_pool_destroy (fotg210->itd_pool); +dma_pool_destroy (fotg210->itd_pool); fotg210->itd_pool =NULL ;if (fotg210->periodic)
Signature · 1 line
2.1.0
Re: [PATCH 04/14] RFC: usb/host/fotg210: Remove NULL checks dma_pool_destroy
Quoted 4 lines · Peter Senna Tschudin
This patch remove NULL checks before calls to
dma_pool_destroy()as the function now can handle NULL pointers.Signed-off-by Peter Senna Tschudin <[email protected]>
looks good to me
Quoted 33 lines
--- drivers/usb/host/fotg210-hcd.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)drivers/usb/host/fotg210-hcd.c +4
-8@@ -1925,17 +1925,13 @@ static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210) fotg210->dummy =NULL ;/* DMA consistent memory and pools */ -if (fotg210->qtd_pool) -dma_pool_destroy (fotg210->qtd_pool); +dma_pool_destroy (fotg210->qtd_pool); fotg210->qtd_pool =NULL ; -if (fotg210->qh_pool) { -dma_pool_destroy (fotg210->qh_pool); - fotg210->qh_pool =NULL ; - } +dma_pool_destroy (fotg210->qh_pool); + fotg210->qh_pool =NULL ; -if (fotg210->itd_pool) -dma_pool_destroy (fotg210->itd_pool); +dma_pool_destroy (fotg210->itd_pool); fotg210->itd_pool =NULL ;if (fotg210->periodic)Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 5/14 RFC: usb/host/fotg210: change kmalloc by kmalloc_array
In reply to Peter Senna TschudinThis patch change:
kmalloc(DBG_SCHED_LIMIT * sizeof(*seen), GFP_ATOMIC)
by:
kmalloc_array(DBG_SCHED_LIMIT, sizeof(*seen), GFP_ATOMIC)
as kmalloc_array() should be used for allocating arrays.
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -501,7 +501,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)unsigned i;__hc32 tag; - seen =kmalloc (DBG_SCHED_LIMIT *sizeof (*seen),GFP_ATOMIC ); + seen =kmalloc_array (DBG_SCHED_LIMIT ,sizeof (*seen),GFP_ATOMIC );if (!seen)return 0 ;
Signature · 1 line
2.1.0
Re: [PATCH 05/14] RFC: usb/host/fotg210: change kmalloc by kmalloc_array
Quoted 1 line · Peter Senna Tschudin
This patch change:
"Replaces" maybe?
Quoted 9 lines
kmalloc(DBG_SCHED_LIMIT * sizeof(*seen), GFP_ATOMIC)by:
kmalloc_array(DBG_SCHED_LIMIT, sizeof(*seen), GFP_ATOMIC)as
kmalloc_array()should be used for allocating arrays.Signed-off-by Peter Senna Tschudin <[email protected]>
[...]
MBR, Sergei
Re: [PATCH 05/14] RFC: usb/host/fotg210: change kmalloc by kmalloc_array
In reply to Peter Senna TschudinQuoted 11 lines · Peter Senna Tschudin
This patch change:
kmalloc(DBG_SCHED_LIMIT * sizeof(*seen), GFP_ATOMIC)by:
kmalloc_array(DBG_SCHED_LIMIT, sizeof(*seen), GFP_ATOMIC)as
kmalloc_array()should be used for allocating arrays.Signed-off-by Peter Senna Tschudin <[email protected]>
looks good to me
Quoted 20 lines
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/usb/host/fotg210-hcd.c +1
-1@@ -501,7 +501,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)unsigned i;__hc32 tag; - seen =kmalloc (DBG_SCHED_LIMIT *sizeof (*seen),GFP_ATOMIC ); + seen =kmalloc_array (DBG_SCHED_LIMIT ,sizeof (*seen),GFP_ATOMIC );if (!seen)return 0 ;Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 6/14 RFC: usb/host/fotg210: replace msleep by usleep_range
In reply to Peter Senna Tschudinmsleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by usleep_range(5000, 6000).
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -5122,7 +5122,7 @@ static int fotg210_run(struct usb_hcd *hcd) fotg210->rh_state =FOTG210_RH_RUNNING ;/* unblock posted writes */ fotg210_readl (fotg210, &fotg210->regs->command); -msleep (5 ); +usleep_range (5000 ,6000 );up_write (&ehci_cf_port_reset_rwsem); fotg210->last_periodic_enable =ktime_get_real ();
Signature · 1 line
2.1.0
Re: [PATCH 06/14] RFC: usb/host/fotg210: replace msleep by usleep_range
Quoted 4 lines · Peter Senna Tschudin
msleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by
usleep_range(5000, 6000).Signed-off-by Peter Senna Tschudin <[email protected]>
good catch. I'd apply this straight away. Alan ?
Quoted 20 lines
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/usb/host/fotg210-hcd.c +1
-1@@ -5122,7 +5122,7 @@ static int fotg210_run(struct usb_hcd *hcd) fotg210->rh_state =FOTG210_RH_RUNNING ;/* unblock posted writes */ fotg210_readl (fotg210, &fotg210->regs->command); -msleep (5 ); +usleep_range (5000 ,6000 );up_write (&ehci_cf_port_reset_rwsem); fotg210->last_periodic_enable =ktime_get_real ();Signature · 1 line
2.1.0
Signature · 1 line
balbi
Re: [PATCH 06/14] RFC: usb/host/fotg210: replace msleep by usleep_range
Quoted 7 lines · Felipe Balbi
Quoted 4 lines · Peter Senna Tschudin
msleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by
usleep_range(5000, 6000).Signed-off-by Peter Senna Tschudin <[email protected]>good catch. I'd apply this straight away. Alan ?
It really doesn't matter. As long as the delay is at least 5 ms, it can be arbitrarily long. This won't hurt, and if it prevents automated tools from complaining then it's worthwhile.
Peter, a lot of the changes you have been making will also apply to the ehci-hcd driver. Do you want to update it as well? One caution: The style used for continuation lines is to add two extra tab stops, not to align things with an open paren on the original line.
Alan Stern
Re: [PATCH 06/14] RFC: usb/host/fotg210: replace msleep by usleep_range
Quoted 6 lines · Alan Stern
Quoted 4 lines · Felipe Balbi
Quoted 3 lines · Peter Senna Tschudin
msleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by
usleep_range(5000, 6000).
Quoted 7 lines
Quoted 3 lines
Quoted 1 line
Signed-off-by Peter Senna Tschudin <[email protected]>good catch. I'd apply this straight away. Alan ?
It really doesn't matter. As long as the delay is at least 5 ms, it can be arbitrarily long. This won't hurt, and if it prevents automated tools from complaining then it's worthwhile.
Then is it a good idea to increase the range to reduce chances of creating an interrupt?
usleep_range(5000, 10000)?
Quoted 5 lines
Peter, a lot of the changes you have been making will also apply to the ehci-hcd driver. Do you want to update it as well? One caution: The style used for continuation lines is to add two extra tab stops, not to align things with an open paren on the original line.
The drivers with more checkpatch errors and warnings are:
<number of errors> <number of warnings> <path>
117 586 drivers/usb/host/fusbh200-hcd.c
38 124 drivers/usb/host/ohci-q.c
38 122 drivers/usb/host/ehci-dbg.c
37 118 drivers/usb/host/ohci-dbg.c
36 129 drivers/usb/host/ehci-sched.c
24 136 drivers/usb/host/ohci-hcd.c
23 16 drivers/usb/host/sl811-hcd.c
20 105 drivers/usb/host/ohci-hub.c
18 48 drivers/usb/host/ehci-hub.c
17 70 drivers/usb/host/ehci-hcd.c
13 4 drivers/usb/host/uhci-debug.c
12 93 drivers/usb/host/ehci-q.c
9 83 drivers/usb/host/isp116x-hcd.c
9 32 drivers/usb/host/fotg210-hcd.c
7 29 drivers/usb/host/oxu210hp-hcd.c
6 4 drivers/usb/host/sl811_cs.c
I'll fix ehci-hcd. Do you want patches for the others?
I'll fix the alignment using two extra tabs instead of aligning with opening parenthesis. Thank you.
Signature · 1 line
Peter
Re: [PATCH 06/14] RFC: usb/host/fotg210: replace msleep by usleep_range
Quoted 11 lines · Peter Senna Tschudin
Quoted 10 lines · Alan Stern
Quoted 7 lines · Felipe Balbi
Quoted 4 lines · Peter Senna Tschudin
msleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by
usleep_range(5000, 6000).Signed-off-by Peter Senna Tschudin <[email protected]>good catch. I'd apply this straight away. Alan ?
Quoted 7 lines
Quoted 3 lines
It really doesn't matter. As long as the delay is at least 5 ms, it can be arbitrarily long. This won't hurt, and if it prevents automated tools from complaining then it's worthwhile.
Then is it a good idea to increase the range to reduce chances of creating an interrupt?
usleep_range(5000, 10000)?
That wold be okay.
Quoted 20 lines
Quoted 4 lines
Peter, a lot of the changes you have been making will also apply to the ehci-hcd driver. Do you want to update it as well? One caution: The style used for continuation lines is to add two extra tab stops, not to align things with an open paren on the original line.
The drivers with more checkpatch errors and warnings are:
<number of errors> <number of warnings> <path>
117 586
drivers/usb/host/fusbh200-hcd.c
38 124drivers/usb/host/ohci-q.c
38 122drivers/usb/host/ehci-dbg.c
37 118drivers/usb/host/ohci-dbg.c
36 129drivers/usb/host/ehci-sched.c
24 136drivers/usb/host/ohci-hcd.c
23 16drivers/usb/host/sl811-hcd.c
20 105drivers/usb/host/ohci-hub.c
18 48drivers/usb/host/ehci-hub.c17 70
drivers/usb/host/ehci-hcd.c
Quoted 8 lines
13 4
drivers/usb/host/uhci-debug.c
12 93drivers/usb/host/ehci-q.c
9 83drivers/usb/host/isp116x-hcd.c
9 32drivers/usb/host/fotg210-hcd.c
7 29drivers/usb/host/oxu210hp-hcd.c
6 4drivers/usb/host/sl811_cs.cI'll fix ehci-hcd. Do you want patches for the others?
I was speaking of ehci-*.c, because the code in there is extremely similar to the code you've already been working on.
There's no point in trying to fix _all_ those checkpatch violations. A lot of them are trivial things like an extra space character between a function name and the following left paren.
Alan Stern
PATCH 7/14 RFC: usb/host/fotg210: Remove a macro from snprintf
In reply to Peter Senna TschudinThis patch removes a macro from a call to snprintf() and moves it's content to just before the call to snprintf() assigning a value to a new variable named tmp. The goal of this patch is to make the code easier to understand.
--- drivers/usb/host/fotg210-hcd.c | 43 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-)
drivers/usb/host/fotg210-hcd.c +23 -20
@@ -367,6 +367,8 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,unsigned size = *sizep;char *next = *nextp;char mark; +char *tmp; +__le32 list_end =FOTG210_LIST_END (fotg210);struct fotg210_qh_hw *hw = qh->hw;
@@ -411,28 +413,29 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,else if (td->hw_alt_next != list_end) mark ='/' ; } - temp =snprintf (next, size, -"\n\t%p%c%s len=%d %08x urb %p" , - td, mark, ({char *tmp; -switch ((scratch>>8 )&0x03 ) { -case 0 : - tmp ="out" ; -break ; -case 1 : - tmp ="in" ; -break ; -case 2 : - tmp ="setup" ; -break ; -default : - tmp ="?" ; -break ; - } tmp; }), - (scratch >>16 ) &0x7fff , - scratch, - td->urb); + +switch ((scratch >>8 ) &0x03 ) { +case 0 : + tmp ="out" ; +break ; +case 1 : + tmp ="in" ; +break ; +case 2 : + tmp ="setup" ; +break ; +default : + tmp ="?" ; +break ; + } + + temp =snprintf (next, size,"\n\t%p%c%s len=%d %08x urb %p" , + td, mark, tmp, (scratch >>16 ) &0x7fff , + scratch, td->urb); +if (size < temp) temp = size; + size -= temp; next += temp;if (temp == size)
Signature · 1 line
2.1.0
Re: [PATCH 07/14] RFC: usb/host/fotg210: Remove a macro from snprintf
Quoted 6 lines · Peter Senna Tschudin
This patch removes a macro from a call to
snprintf()and moves it's content to just before the call tosnprintf()assigning a value to a new variable named tmp. The goal of this patch is to make the code easier to understand.Signed-off-by Peter Senna Tschudin <[email protected]>
it's a little unnecessary, but no objections.
Quoted 70 lines
--- drivers/usb/host/fotg210-hcd.c | 43 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 20 deletions(-)drivers/usb/host/fotg210-hcd.c +23
-20@@ -367,6 +367,8 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,unsigned size = *sizep;char *next = *nextp;char mark; +char *tmp; +__le32 list_end =FOTG210_LIST_END (fotg210);struct fotg210_qh_hw *hw = qh->hw;@@ -411,28 +413,29 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,else if (td->hw_alt_next != list_end) mark ='/' ; } - temp =snprintf (next, size, -"\n\t%p%c%s len=%d %08x urb %p" , - td, mark, ({char *tmp; -switch ((scratch>>8 )&0x03 ) { -case 0 : - tmp ="out" ; -break ; -case 1 : - tmp ="in" ; -break ; -case 2 : - tmp ="setup" ; -break ; -default : - tmp ="?" ; -break ; - } tmp; }), - (scratch >>16 ) &0x7fff , - scratch, - td->urb); + +switch ((scratch >>8 ) &0x03 ) { +case 0 : + tmp ="out" ; +break ; +case 1 : + tmp ="in" ; +break ; +case 2 : + tmp ="setup" ; +break ; +default : + tmp ="?" ; +break ; + } + + temp =snprintf (next, size,"\n\t%p%c%s len=%d %08x urb %p" , + td, mark, tmp, (scratch >>16 ) &0x7fff , + scratch, td->urb); +if (size < temp) temp = size; + size -= temp; next += temp;if (temp == size)Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 8/14 RFC: usb/host/fotg210: convert macro to inline function
In reply to Peter Senna TschudinThis patch convert the macro speed_char in an inline function. The goal of this patch is to make the code easier to read.
--- drivers/usb/host/fotg210-hcd.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/usb/host/fotg210-hcd.c +16 -11
@@ -331,17 +331,22 @@ struct debug_buffer {size_t alloc_size; }; -#define speed_char (info1)({ char tmp; \ - switch (info1 & (3 << 12)) { \ - case QH_FULL_SPEED: \ - tmp = 'f'; break; \ - case QH_LOW_SPEED: \ - tmp = 'l'; break; \ - case QH_HIGH_SPEED: \ - tmp = 'h'; break; \ - default: \ - tmp = '?'; break; \ - } tmp; }) +static inline char speed_char (u32 scratch) +{ +switch (scratch & (3 <<12 )) { +case QH_FULL_SPEED : +return 'f' ; + +case QH_LOW_SPEED : +return 'l' ; + +case QH_HIGH_SPEED : +return 'h' ; + +default : +return '?' ; + } +}static inline char token_mark (struct fotg210_hcd *fotg210,__hc32 token) {
Signature · 1 line
2.1.0
Re: [PATCH 08/14] RFC: usb/host/fotg210: convert macro to inline function
Quoted 4 lines · Peter Senna Tschudin
This patch convert the macro
speed_charin an inline function. The goal of this patch is to make the code easier to read.Signed-off-by Peter Senna Tschudin <[email protected]>
looks good
Quoted 45 lines
--- drivers/usb/host/fotg210-hcd.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)drivers/usb/host/fotg210-hcd.c +16
-11@@ -331,17 +331,22 @@ struct debug_buffer {size_t alloc_size; }; -#define speed_char (info1)({ char tmp; \ - switch (info1 & (3 << 12)) { \ - case QH_FULL_SPEED: \ - tmp = 'f'; break; \ - case QH_LOW_SPEED: \ - tmp = 'l'; break; \ - case QH_HIGH_SPEED: \ - tmp = 'h'; break; \ - default: \ - tmp = '?'; break; \ - } tmp; }) +static inline char speed_char (u32 scratch) +{ +switch (scratch & (3 <<12 )) { +case QH_FULL_SPEED : +return 'f' ; + +case QH_LOW_SPEED : +return 'l' ; + +case QH_HIGH_SPEED : +return 'h' ; + +default : +return '?' ; + } +}static inline char token_mark (struct fotg210_hcd *fotg210,__hc32 token) {Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 9/14 RFC: usb/host/fotg210: Add function: output_buf_tds_dir()
In reply to Peter Senna Tschudincheckpatch complains about too many leading tabs because the switch statement starts after 6 tabs.
fill_periodic_buffer() -> for() -> do -> switch() -> if() -> list_for_each_entry() and finally the last switch().
This patch moves the list_for_each_entry() and the last switch() to a new inline function named output_buf_tds_dir(). This change makes the code easier to read and calm down checkpatch. This patch changes it to:
fill_periodic_buffer() -> for() -> do -> switch() -> if() -> output_buf_tds_dir()
--- drivers/usb/host/fotg210-hcd.c | 64 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 31 deletions(-)
drivers/usb/host/fotg210-hcd.c +33 -31
@@ -497,6 +497,36 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)return strlen (buf->output_buf); } +/* count tds, get ep direction */ +static inline unsigned output_buf_tds_dir (char *buf, +struct fotg210_hcd *fotg210, +struct fotg210_qh_hw *hw, +struct fotg210_qh *qh,unsigned size) +{ +u32 scratch =hc32_to_cpup (fotg210, &hw->hw_info1); +struct fotg210_qtd *qtd; +char *type ="" ; +unsigned temp =0 ; + +/* count tds, get ep direction */ +list_for_each_entry (qtd, &qh->qtd_list, qtd_list) { + temp++; +switch (0x03 & (hc32_to_cpu (fotg210, qtd->hw_token) >>8 )) { +case 0 : + type ="out" ; +continue ; +case 1 : + type ="in" ; +continue ; + } + } + +return scnprintf (buf, size,"(%c%d ep%d%s [%d/%d] q%d p%d)" , +speed_char (scratch), scratch &0x007f , + (scratch >>8 ) &0x000f , type, qh->usecs, + qh->c_usecs, temp,0x7ff & (scratch >>16 )); +} +#define DBG_SCHED_LIMIT 64static ssize_t fill_periodic_buffer (struct debug_buffer *buf) {
@@ -568,37 +598,9 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) }/* show more info the first time around */ if (temp == seen_count) { -u32 scratch =hc32_to_cpup (fotg210, - &hw->hw_info1); -struct fotg210_qtd *qtd; -char *type ="" ; - -/* count tds, get ep direction */ - temp =0 ; -list_for_each_entry (qtd, - &p.qh->qtd_list, - qtd_list) { - temp++; -switch (0x03 & (hc32_to_cpu ( - fotg210, - qtd->hw_token) >>8 )) { -case 0 : - type ="out" ; -continue ; -case 1 : - type ="in" ; -continue ; - } - } - - temp =scnprintf (next, size, -"(%c%d ep%d%s [%d/%d] q%d p%d)" , -speed_char (scratch), - scratch &0x007f , - (scratch >>8 ) &0x000f , type, - p.qh->usecs, p.qh->c_usecs, - temp, -0x7ff & (scratch >>16 )); + temp =output_buf_tds_dir (next, + fotg210, hw, + p.qh, size);if (seen_count <DBG_SCHED_LIMIT ) seen[seen_count++].qh = p.qh;
Signature · 1 line
2.1.0
Re: [PATCH 09/14] RFC: usb/host/fotg210: Add function: output_buf_tds_dir()
Quoted 23 lines · Peter Senna Tschudin
checkpatch complains about too many leading tabs because the switch statement starts after 6 tabs.
fill_periodic_buffer()->for()-> do ->switch()->if()->list_for_each_entry()and finally the lastswitch().This patch moves the
list_for_each_entry()and the lastswitch()to a new inline function namedoutput_buf_tds_dir(). This change makes the code easier to read and calm down checkpatch. This patch changes it to:
fill_periodic_buffer()->for()-> do ->switch()->if()->output_buf_tds_dir()Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/fotg210-hcd.c | 64 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 31 deletions(-)drivers/usb/host/fotg210-hcd.c +0
-0
drivers/usb/host/fotg210-hcd.c static ssize_t fill_async_buffer(struct debug_buffer *buf) · line 501
Quoted 5 lines
drivers/usb/host/fotg210-hcd.c +2
-0@@ -497,6 +497,36 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)return strlen (buf->output_buf); } +/* count tds, get ep direction */ +static inline unsigned output_buf_tds_dir(char *buf,
Please drop *inline*, let gcc figure it out.
drivers/usb/host/fotg210-hcd.c static ssize_t fill_async_buffer(struct debug_buffer *buf) · line 514
Quoted 13 lines
drivers/usb/host/fotg210-hcd.c +13
-0+struct fotg210_hcd *fotg210, + struct fotg210_qh_hw *hw, + struct fotg210_qh *qh, unsigned size) +{ + u32 scratch = hc32_to_cpup(fotg210, &hw->hw_info1); +struct fotg210_qtd *qtd; +char *type ="" ; +unsigned temp =0 ; + +/* count tds, get ep direction */ +list_for_each_entry (qtd, &qh->qtd_list, qtd_list) { + temp++; +switch (0x03 & (hc32_to_cpu (fotg210, qtd->hw_token) >>8 )) {
I think the preference is to place immediate value after &.
drivers/usb/host/fotg210-hcd.c static ssize_t fill_async_buffer(struct debug_buffer *buf) · line 527
Quoted 13 lines
drivers/usb/host/fotg210-hcd.c +13
-0+case 0 : + type ="out" ; +continue ; +case 1 : + type ="in" ; +continue ; + } + } + +return scnprintf (buf, size,"(%c%d ep%d%s [%d/%d] q%d p%d)" , +speed_char (scratch), scratch &0x007f , + (scratch >>8 ) &0x000f , type, qh->usecs, + qh->c_usecs, temp,0x7ff & (scratch >>16 ));
Likewise.
[...]
MBR, Sergei
Re: [PATCH 09/14] RFC: usb/host/fotg210: Add function: output_buf_tds_dir()
In reply to Peter Senna TschudinQuoted 6 lines · Peter Senna Tschudin
checkpatch complains about too many leading tabs because the switch statement starts after 6 tabs.
fill_periodic_buffer()->for()-> do ->switch()->if()->list_for_each_entry()and finally the lastswitch().
Quoted 8 lines
This patch moves the
list_for_each_entry()and the lastswitch()to a new inline function namedoutput_buf_tds_dir(). This change makes the code easier to read and calm down checkpatch. This patch changes it to:
fill_periodic_buffer()->for()-> do ->switch()->if()->output_buf_tds_dir()Signed-off-by Peter Senna Tschudin <[email protected]>
if you fix Sergei's comment, then I'm okay with $subject
Quoted 89 lines
--- drivers/usb/host/fotg210-hcd.c | 64 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 31 deletions(-)drivers/usb/host/fotg210-hcd.c +33
-31@@ -497,6 +497,36 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)return strlen (buf->output_buf); } +/* count tds, get ep direction */ +static inline unsigned output_buf_tds_dir (char *buf, +struct fotg210_hcd *fotg210, +struct fotg210_qh_hw *hw, +struct fotg210_qh *qh,unsigned size) +{ +u32 scratch =hc32_to_cpup (fotg210, &hw->hw_info1); +struct fotg210_qtd *qtd; +char *type ="" ; +unsigned temp =0 ; + +/* count tds, get ep direction */ +list_for_each_entry (qtd, &qh->qtd_list, qtd_list) { + temp++; +switch (0x03 & (hc32_to_cpu (fotg210, qtd->hw_token) >>8 )) { +case 0 : + type ="out" ; +continue ; +case 1 : + type ="in" ; +continue ; + } + } + +return scnprintf (buf, size,"(%c%d ep%d%s [%d/%d] q%d p%d)" , +speed_char (scratch), scratch &0x007f , + (scratch >>8 ) &0x000f , type, qh->usecs, + qh->c_usecs, temp,0x7ff & (scratch >>16 )); +} +#define DBG_SCHED_LIMIT 64static ssize_t fill_periodic_buffer (struct debug_buffer *buf) {@@ -568,37 +598,9 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) }/* show more info the first time around */ if (temp == seen_count) { -u32 scratch =hc32_to_cpup (fotg210, - &hw->hw_info1); -struct fotg210_qtd *qtd; -char *type ="" ; - -/* count tds, get ep direction */ - temp =0 ; -list_for_each_entry (qtd, - &p.qh->qtd_list, - qtd_list) { - temp++; -switch (0x03 & (hc32_to_cpu ( - fotg210, - qtd->hw_token) >>8 )) { -case 0 : - type ="out" ; -continue ; -case 1 : - type ="in" ; -continue ; - } - } - - temp =scnprintf (next, size, -"(%c%d ep%d%s [%d/%d] q%d p%d)" , -speed_char (scratch), - scratch &0x007f , - (scratch >>8 ) &0x000f , type, - p.qh->usecs, p.qh->c_usecs, - temp, -0x7ff & (scratch >>16 )); + temp =output_buf_tds_dir (next, + fotg210, hw, + p.qh, size);if (seen_count <DBG_SCHED_LIMIT ) seen[seen_count++].qh = p.qh;Signature · 1 line
2.1.0
Signature · 1 line
balbi
PATCH 10/14 RFC: usb/host/fotg210: Add function scan_frame_queue()
In reply to Peter Senna Tschudincheckpatch complains about too many leading tabs because the if statement starts after 6 tabs:
scan_iosoc() -> for() -> while() -> switch() -> if() -> for() -> if()
There is also a goto statement going backwards in case of failure. This patch creates a new inline function named scan_frame_queue() containing the last 4 nesting levels, and removes the need of backwards goto, making the code easier to read. After the patch it becomes:
scan_iosoc() -> for() -> while() -> scan_frame_queue()
--- drivers/usb/host/fotg210-hcd.c | 142 ++++++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 66 deletions(-)
drivers/usb/host/fotg210-hcd.c +76 -66
@@ -4645,13 +4645,81 @@ done:return status; } -/*-------------------------------------------------------------------------*/ +static inline int scan_frame_queue (struct fotg210_hcd *fotg210,unsigned frame, +unsigned now_frame,bool live) +{ +unsigned uf; +bool modified; +union fotg210_shadow q, *q_p; +__hc32 type, *hw_p; + +/* scan each element in frame's queue for completions */ + q_p = &fotg210->pshadow[frame]; + hw_p = &fotg210->periodic[frame]; + q.ptr = q_p->ptr; + type =Q_NEXT_TYPE (fotg210, *hw_p); + modified = false; + +while (q.ptr !=NULL ) { +switch (hc32_to_cpu (fotg210, type)) { +case Q_TYPE_ITD : +/* If this ITD is still active, leave it for +* later processing ... check the next entry. +* No need to check for activity unless the +* frame is current. +*/ +if (frame == now_frame && live) { +rmb (); +for (uf =0 ; uf <8 ; uf++) { +if (q.itd->hw_transaction[uf] & +ITD_ACTIVE (fotg210)) +break ; + } +if (uf <8 ) { + q_p = &q.itd->itd_next; + hw_p = &q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, + q.itd->hw_next); + q = *q_p; +break ; + } + } + +/* Take finished ITDs out of the schedule +* and process them: recycle, maybe report +* URB completion. HC won't cache the +* pointer for much longer, if at all. +*/ + *q_p = q.itd->itd_next; + *hw_p = q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, q.itd->hw_next); +wmb (); + modified =itd_complete (fotg210, q.itd); + q = *q_p; +break ; +default : +fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , + type, frame, q.ptr); +/* FALL THROUGH */ +case Q_TYPE_QH : +case Q_TYPE_FSTN : +/* End of the iTDs and siTDs */ + q.ptr =NULL ; +break ; + } + +/* assume completion callbacks modify the queue */ +if (unlikely (modified && fotg210->isoc_count >0 )) +return -1 ; + } +return 0 ; +}static void scan_isoc (struct fotg210_hcd *fotg210) { -unsigned uf, now_frame, frame; -unsigned fmask = fotg210->periodic_size -1 ; -bool modified, live; +unsigned uf, now_frame, frame, ret; +unsigned fmask = fotg210->periodic_size -1 ; +bool live;/* * When running, scan from last scan point up to "now"
@@ -4670,69 +4738,11 @@ static void scan_isoc(struct fotg210_hcd *fotg210) frame = fotg210->next_frame;for (;;) { -union fotg210_shadow q, *q_p; -__hc32 type, *hw_p; -restart: -/* scan each element in frame's queue for completions */ - q_p = &fotg210->pshadow[frame]; - hw_p = &fotg210->periodic[frame]; - q.ptr = q_p->ptr; - type =Q_NEXT_TYPE (fotg210, *hw_p); - modified = false; - -while (q.ptr !=NULL ) { -switch (hc32_to_cpu (fotg210, type)) { -case Q_TYPE_ITD : -/* If this ITD is still active, leave it for -* later processing ... check the next entry. -* No need to check for activity unless the -* frame is current. -*/ -if (frame == now_frame && live) { -rmb (); -for (uf =0 ; uf <8 ; uf++) { -if (q.itd->hw_transaction[uf] & -ITD_ACTIVE (fotg210)) -break ; - } -if (uf <8 ) { - q_p = &q.itd->itd_next; - hw_p = &q.itd->hw_next; - type =Q_NEXT_TYPE (fotg210, - q.itd->hw_next); - q = *q_p; -break ; - } - } - -/* Take finished ITDs out of the schedule -* and process them: recycle, maybe report -* URB completion. HC won't cache the -* pointer for much longer, if at all. -*/ - *q_p = q.itd->itd_next; - *hw_p = q.itd->hw_next; - type =Q_NEXT_TYPE (fotg210, q.itd->hw_next); -wmb (); - modified =itd_complete (fotg210, q.itd); - q = *q_p; -break ; -default : -fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , - type, frame, q.ptr); -/* FALL THROUGH */ -case Q_TYPE_QH : -case Q_TYPE_FSTN : -/* End of the iTDs and siTDs */ - q.ptr =NULL ; -break ; - } - -/* assume completion callbacks modify the queue */ -if (unlikely (modified && fotg210->isoc_count >0 )) - goto restart; - } + ret =1 ; +while (ret !=0 ) + ret =scan_frame_queue (fotg210, frame, now_frame, + live);/* Stop when we have reached the current frame */ if (frame == now_frame)
Signature · 1 line
2.1.0
Re: [PATCH 10/14] RFC: usb/host/fotg210: Add function scan_frame_queue()
Quoted 32 lines · Peter Senna Tschudin
checkpatch complains about too many leading tabs because the if statement starts after 6 tabs:
scan_iosoc()->for()->while()->switch()->if()->for()->if()There is also a goto statement going backwards in case of failure. This patch creates a new inline function named
scan_frame_queue()containing the last 4 nesting levels, and removes the need of backwards goto, making the code easier to read. After the patch it becomes:
scan_iosoc()->for()->while()->scan_frame_queue()Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/fotg210-hcd.c | 142 ++++++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 66 deletions(-)drivers/usb/host/fotg210-hcd.c +6
-1@@ -4645,13 +4645,81 @@ done:return status; } -/*-------------------------------------------------------------------------*/ +static inline int scan_frame_queue (struct fotg210_hcd *fotg210,unsigned frame, +unsigned now_frame,bool live) +{ +unsigned uf; +bool modified; +union fotg210_shadow q, *q_p;
drivers/usb/host/fotg210-hcd.c done: · line 4663
Quoted 10 lines
drivers/usb/host/fotg210-hcd.c +10
-0+__hc32 type, *hw_p; + +/* scan each element in frame's queue for completions */ + q_p = &fotg210->pshadow[frame]; + hw_p = &fotg210->periodic[frame]; + q.ptr = q_p->ptr; + type =Q_NEXT_TYPE (fotg210, *hw_p); + modified = false; + +while (q.ptr !=NULL ) {
while (q.ptr) is enough
drivers/usb/host/fotg210-hcd.c done: · line 4666
Quoted 3 lines
drivers/usb/host/fotg210-hcd.c +3
-0+switch (hc32_to_cpu (fotg210, type)) { +case Q_TYPE_ITD : +/* If this ITD is still active, leave it for
comment style
Quoted 12 lines
drivers/usb/host/fotg210-hcd.c +12
-0+* later processing ... check the next entry. +* No need to check for activity unless the +* frame is current. +*/ +if (frame == now_frame && live) { +rmb (); +for (uf =0 ; uf <8 ; uf++) { +if (q.itd->hw_transaction[uf] & +ITD_ACTIVE (fotg210)) +break ; + } +if (uf <8 ) {
drivers/usb/host/fotg210-hcd.c done: · line 4688
Quoted 10 lines
drivers/usb/host/fotg210-hcd.c +10
-0+ q_p = &q.itd->itd_next; + hw_p = &q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, + q.itd->hw_next); + q = *q_p; +break ; + } + } + +/* Take finished ITDs out of the schedule
comment style
Quoted 15 lines
drivers/usb/host/fotg210-hcd.c +15
-0+* and process them: recycle, maybe report +* URB completion. HC won't cache the +* pointer for much longer, if at all. +*/ + *q_p = q.itd->itd_next; + *hw_p = q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, q.itd->hw_next); +wmb (); + modified =itd_complete (fotg210, q.itd); + q = *q_p; +break ; +default : +fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , + type, frame, q.ptr); +/* FALL THROUGH */
drivers/usb/host/fotg210-hcd.c done: · line 4713
Quoted 10 lines
drivers/usb/host/fotg210-hcd.c +10
-0+case Q_TYPE_QH : +case Q_TYPE_FSTN : +/* End of the iTDs and siTDs */ + q.ptr =NULL ; +break ; + } + +/* assume completion callbacks modify the queue */ +if (unlikely (modified && fotg210->isoc_count >0 )) +return -1 ;
can't you add a proper error code here ?
other than these, patch looks good.
Signature · 1 line
balbi
PATCH 11/14 RFC: usb/host: Rename fotg210-hcd to faraday-hcd
In reply to Peter Senna TschudinThis patch renames fotg210-hcd to faraday-hcd as a first step of consolitating Faraday fotg210 and fusbh200 EHCI-like drivers.
The patch also updates Kconfig and Makefile.
--- drivers/usb/host/Kconfig | 2 +- drivers/usb/host/Makefile | 2 +- drivers/usb/host/faraday-hcd.c | 5792 ++++++++++++++++++++++++++++++++++++++++ drivers/usb/host/faraday-hcd.h | 692 +++++ drivers/usb/host/fotg210-hcd.c | 5792 ---------------------------------------- drivers/usb/host/fotg210.h | 692 ----- 6 files changed, 6486 insertions(+), 6486 deletions(-) create mode 100644 drivers/usb/host/faraday-hcd.c create mode 100644 drivers/usb/host/faraday-hcd.h delete mode 100644 drivers/usb/host/fotg210-hcd.c delete mode 100644 drivers/usb/host/fotg210.h
drivers/usb/host/Kconfig +1 -1
@@ -358,7 +358,7 @@ config USB_FUSBH200_HCD To compile this driver as a module, choose M here: the module will be called fusbh200-hcd. -config USB_FOTG210_HCD +config USB_FARADAY_HCD tristate "FOTG210 HCD support" depends on USB ---help---
drivers/usb/host/Makefile +1 -1
@@ -76,5 +76,5 @@ obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o obj-$(CONFIG_USB_FUSBH200_HCD) += fusbh200-hcd.o -obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o +obj-$(CONFIG_USB_FARADAY_HCD) += faraday-hcd.o obj-$(CONFIG_USB_MAX3421_HCD) += max3421-hcd.o
drivers/usb/host/faraday-hcd.c new file +5792 -0
2,986 lines not on this page · raw message
drivers/usb/host/faraday-hcd.h new file +692 -0
692 lines not on this page · raw message
drivers/usb/host/fotg210-hcd.c deleted +0 -5792
5,792 lines not on this page · raw message
drivers/usb/host/fotg210.h deleted +0 -692
692 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.1.0
Part of the diff is not shown here. View the raw message.
Re: [PATCH 11/14] RFC: usb/host: Rename fotg210-hcd to faraday-hcd
Quoted 6 lines · Peter Senna Tschudin
This patch renames fotg210-hcd to faraday-hcd as a first step of consolitating Faraday fotg210 and fusbh200 EHCI-like drivers.
The patch also updates
KconfigandMakefile.Signed-off-by Peter Senna Tschudin <[email protected]>
please regenerate the patch with -C -M added to git format-patch
Signature · 1 line
balbi
PATCH 12/14 RFC: usb/host/faraday-hcd: Replace fotg210 by fhcd2xx
In reply to Peter Senna TschudinThis patch replaces the strings:
FOTG210 by FHCD2XX
fotg210 by fhcd2xx
The goal is to remove all references to fotg210 as the driver will support both fotg210 and fusbh200.
--- drivers/usb/host/faraday-hcd.c | 2612 ++++++++++++++++++++-------------------- drivers/usb/host/faraday-hcd.h | 248 ++-- 2 files changed, 1430 insertions(+), 1430 deletions(-)
drivers/usb/host/faraday-hcd.c +1306 -1306
@@ -52,17 +52,17 @@#define DRIVER_AUTHOR "Yuan-Hsin Chen"#define DRIVER_DESC "FOTG210 Host Controller (EHCI) Driver" -static const char hcd_name[] ="fotg210_hcd" ; +static const char hcd_name[] ="fhcd2xx_hcd" ; -#undef FOTG210_URB_TRACE -#define FOTG210_STATS +#undef FHCD2XX_URB_TRACE +#define FHCD2XX_STATS /* magic numbers that can affect system performance */ -#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ -#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ -#define FOTG210_TUNE_RL_TT 0 -#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ -#define FOTG210_TUNE_MULT_TT 1 +#define FHCD2XX_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ +#define FHCD2XX_TUNE_RL_HS 4/* nak throttle; see 4.9 */ +#define FHCD2XX_TUNE_RL_TT 0 +#define FHCD2XX_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ +#define FHCD2XX_TUNE_MULT_TT 1/* * Some drivers think it's safe to schedule isochronous transfers more than 256
@@ -70,7 +70,7 @@ static const char hcd_name[] = "fotg210_hcd";* code). In an attempt to avoid trouble, we will use a minimum scheduling * length of 512 frames instead of 256. */ -#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ +#define FHCD2XX_TUNE_FLS 1/* (medium) 512-frame schedule */ /* Initial IRQ latency: faster than hw default */ static int log2_irq_thresh;/* 0 to 6 */
@@ -91,95 +91,95 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us");#include "faraday-hcd.h" -#define fotg210_dbg(fotg210, fmt, args...) \ - dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -#define fotg210_err(fotg210, fmt, args...) \ - dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -#define fotg210_info(fotg210, fmt, args...) \ - dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -#define fotg210_warn(fotg210, fmt, args...) \ - dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) +#define fhcd2xx_dbg(fhcd2xx, fmt, args...) \ + dev_dbg(fhcd2xx_to_hcd(fhcd2xx)->self.controller, fmt, ## args) +#define fhcd2xx_err(fhcd2xx, fmt, args...) \ + dev_err(fhcd2xx_to_hcd(fhcd2xx)->self.controller, fmt, ## args) +#define fhcd2xx_info(fhcd2xx, fmt, args...) \ + dev_info(fhcd2xx_to_hcd(fhcd2xx)->self.controller, fmt, ## args) +#define fhcd2xx_warn(fhcd2xx, fmt, args...) \ + dev_warn(fhcd2xx_to_hcd(fhcd2xx)->self.controller, fmt, ## args)/* check the values in the HCSPARAMS register (host controller _Structural_ * parameters) see EHCI spec, Table 2-4 for each value */ -static void dbg_hcs_params (struct fotg210_hcd *fotg210,char *label) +static void dbg_hcs_params (struct fhcd2xx_hcd *fhcd2xx,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcs_params); +u32 params =fhcd2xx_readl (fhcd2xx, &fhcd2xx->caps->hcs_params); -fotg210_dbg (fotg210,"%s hcs_params 0x%x ports=%d\n" , label, params, +fhcd2xx_dbg (fhcd2xx,"%s hcs_params 0x%x ports=%d\n" , label, params,HCS_N_PORTS (params)); }/* check the values in the HCCPARAMS register (host controller _Capability_ * parameters) see EHCI Spec, Table 2-5 for each value */ -static void dbg_hcc_params (struct fotg210_hcd *fotg210,char *label) +static void dbg_hcc_params (struct fhcd2xx_hcd *fhcd2xx,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcc_params); +u32 params =fhcd2xx_readl (fhcd2xx, &fhcd2xx->caps->hcc_params); -fotg210_dbg (fotg210,"%s hcc_params %04x uframes %s%s\n" , label, +fhcd2xx_dbg (fhcd2xx,"%s hcc_params %04x uframes %s%s\n" , label, params,HCC_PGM_FRAMELISTLEN (params) ?"256/512/1024" :"1024" ,HCC_CANPARK (params) ?" park" :"" ); }static void __maybe_unused -dbg_qtd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd) +dbg_qtd (const char *label,struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qtd *qtd) { -fotg210_dbg (fotg210,"%s td %p n%08x %08x t%08x p0=%08x\n" , label, qtd, -hc32_to_cpup (fotg210, &qtd->hw_next), -hc32_to_cpup (fotg210, &qtd->hw_alt_next), -hc32_to_cpup (fotg210, &qtd->hw_token), -hc32_to_cpup (fotg210, &qtd->hw_buf[0 ])); +fhcd2xx_dbg (fhcd2xx,"%s td %p n%08x %08x t%08x p0=%08x\n" , label, qtd, +hc32_to_cpup (fhcd2xx, &qtd->hw_next), +hc32_to_cpup (fhcd2xx, &qtd->hw_alt_next), +hc32_to_cpup (fhcd2xx, &qtd->hw_token), +hc32_to_cpup (fhcd2xx, &qtd->hw_buf[0 ]));if (qtd->hw_buf[1 ]) -fotg210_dbg (fotg210," p1=%08x p2=%08x p3=%08x p4=%08x\n" , -hc32_to_cpup (fotg210, &qtd->hw_buf[1 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[2 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[3 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[4 ])); +fhcd2xx_dbg (fhcd2xx," p1=%08x p2=%08x p3=%08x p4=%08x\n" , +hc32_to_cpup (fhcd2xx, &qtd->hw_buf[1 ]), +hc32_to_cpup (fhcd2xx, &qtd->hw_buf[2 ]), +hc32_to_cpup (fhcd2xx, &qtd->hw_buf[3 ]), +hc32_to_cpup (fhcd2xx, &qtd->hw_buf[4 ])); }static void __maybe_unused -dbg_qh (const char *label,struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +dbg_qh (const char *label,struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh) { -struct fotg210_qh_hw *hw = qh->hw; +struct fhcd2xx_qh_hw *hw = qh->hw; -fotg210_dbg (fotg210,"%s qh %p n%08x info %x %x qtd %x\n" , label, qh, +fhcd2xx_dbg (fhcd2xx,"%s qh %p n%08x info %x %x qtd %x\n" , label, qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); -dbg_qtd ("overlay" , fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next); +dbg_qtd ("overlay" , fhcd2xx, (struct fhcd2xx_qtd *) &hw->hw_qtd_next); }static void __maybe_unused -dbg_itd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_itd *itd) +dbg_itd (const char *label,struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_itd *itd) { -fotg210_dbg (fotg210,"%s[%d] itd %p, next %08x, urb %p\n" , label, - itd->frame, itd,hc32_to_cpu (fotg210, itd->hw_next), +fhcd2xx_dbg (fhcd2xx,"%s[%d] itd %p, next %08x, urb %p\n" , label, + itd->frame, itd,hc32_to_cpu (fhcd2xx, itd->hw_next), itd->urb); -fotg210_dbg (fotg210, +fhcd2xx_dbg (fhcd2xx," trans: %08x %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_transaction[0 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[1 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[2 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[3 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[4 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[5 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[6 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[7 ])); - -fotg210_dbg (fotg210, +hc32_to_cpu (fhcd2xx, itd->hw_transaction[0 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[1 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[2 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[3 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[4 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[5 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[6 ]), +hc32_to_cpu (fhcd2xx, itd->hw_transaction[7 ])); + +fhcd2xx_dbg (fhcd2xx," buf: %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_bufp[0 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[1 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[2 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[3 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[4 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[5 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[6 ])); - -fotg210_dbg (fotg210," index: %d %d %d %d %d %d %d %d\n" , +hc32_to_cpu (fhcd2xx, itd->hw_bufp[0 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[1 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[2 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[3 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[4 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[5 ]), +hc32_to_cpu (fhcd2xx, itd->hw_bufp[6 ])); + +fhcd2xx_dbg (fhcd2xx," index: %d %d %d %d %d %d %d %d\n" , itd->index[0 ], itd->index[1 ], itd->index[2 ], itd->index[3 ], itd->index[4 ], itd->index[5 ], itd->index[6 ], itd->index[7 ]);
@@ -271,21 +271,21 @@ static char *dbg_port_buf(char *buf, unsigned len, const char *label, int port, }/* functions have the "wrong" filename when they're output... */ -#define dbg_status (fotg210, label, status) { \ +#define dbg_status (fhcd2xx, label, status) { \ char _buf[80]; \ dbg_status_buf(_buf, sizeof(_buf), label, status); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ + fhcd2xx_dbg(fhcd2xx, "%s\n", _buf); \ } -#define dbg_cmd (fotg210, label, command) { \ +#define dbg_cmd (fhcd2xx, label, command) { \ char _buf[80]; \ dbg_command_buf(_buf, sizeof(_buf), label, command); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ + fhcd2xx_dbg(fhcd2xx, "%s\n", _buf); \ } -#define dbg_port (fotg210, label, port, status) { \ +#define dbg_port (fhcd2xx, label, port, status) { \ char _buf[80]; \ - fotg210_dbg(fotg210, "%s\n", \ + fhcd2xx_dbg(fhcd2xx, "%s\n", \ dbg_port_buf(_buf, sizeof(_buf), label, port, status)); \ }
@@ -320,7 +320,7 @@ static const struct file_operations debug_registers_fops = { .llseek = default_llseek, }; -static struct dentry *fotg210_debug_root; +static struct dentry *fhcd2xx_debug_root;struct debug_buffer {ssize_t (*fill_func)(struct debug_buffer *);/* fill method */
@@ -348,9 +348,9 @@ static inline char speed_char(u32 scratch) } } -static inline char token_mark (struct fotg210_hcd *fotg210,__hc32 token) +static inline char token_mark (struct fhcd2xx_hcd *fhcd2xx,__hc32 token) { -__u32 v =hc32_to_cpu (fotg210, token); +__u32 v =hc32_to_cpu (fhcd2xx, token);if (v &QTD_STS_ACTIVE )return '*' ;
@@ -362,58 +362,58 @@ static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token)return '/' ; } -static void qh_lines (struct fotg210_hcd *fotg210,struct fotg210_qh *qh, +static void qh_lines (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh,char **nextp,unsigned *sizep) {u32 scratch;u32 hw_curr; -struct fotg210_qtd *td; +struct fhcd2xx_qtd *td;unsigned temp;unsigned size = *sizep;char *next = *nextp;char mark;char *tmp; -__le32 list_end =FOTG210_LIST_END (fotg210); -struct fotg210_qh_hw *hw = qh->hw; +__le32 list_end =FHCD2XX_LIST_END (fhcd2xx); +struct fhcd2xx_qh_hw *hw = qh->hw;if (hw->hw_qtd_next == list_end)/* NEC does this */ mark ='@' ;else - mark =token_mark (fotg210, hw->hw_token); + mark =token_mark (fhcd2xx, hw->hw_token);if (mark =='/' ) {/* qh_alt_next controls qh advance? */ -if ((hw->hw_alt_next &QTD_MASK (fotg210)) == - fotg210->async->hw->hw_alt_next) +if ((hw->hw_alt_next &QTD_MASK (fhcd2xx)) == + fhcd2xx->async->hw->hw_alt_next) mark ='#' ;/* blocked */ else if (hw->hw_alt_next == list_end) mark ='.' ;/* use hw_qtd_next */ /* else alt_next points to some other qtd */ } - scratch =hc32_to_cpup (fotg210, &hw->hw_info1); - hw_curr = (mark =='*' ) ?hc32_to_cpup (fotg210, &hw->hw_current) :0 ; + scratch =hc32_to_cpup (fhcd2xx, &hw->hw_info1); + hw_curr = (mark =='*' ) ?hc32_to_cpup (fhcd2xx, &hw->hw_current) :0 ; temp =scnprintf (next, size,"qh/%p dev%d %cs ep%d %08x %08x(%08x%c %s nak%d)" , qh, scratch &0x007f ,speed_char (scratch), (scratch >>8 ) &0x000f , - scratch,hc32_to_cpup (fotg210, &hw->hw_info2), -hc32_to_cpup (fotg210, &hw->hw_token), mark, - (cpu_to_hc32 (fotg210,QTD_TOGGLE ) & hw->hw_token) + scratch,hc32_to_cpup (fhcd2xx, &hw->hw_info2), +hc32_to_cpup (fhcd2xx, &hw->hw_token), mark, + (cpu_to_hc32 (fhcd2xx,QTD_TOGGLE ) & hw->hw_token) ?"data1" :"data0" , - (hc32_to_cpup (fotg210, &hw->hw_alt_next) >>1 ) &0x0f ); + (hc32_to_cpup (fhcd2xx, &hw->hw_alt_next) >>1 ) &0x0f ); size -= temp; next += temp;/* hc may be modifying the list as we read it ... */ list_for_each_entry (td, &qh->qtd_list, qtd_list) { - scratch =hc32_to_cpup (fotg210, &td->hw_token); + scratch =hc32_to_cpup (fhcd2xx, &td->hw_token); mark =' ' ;if (hw_curr == td->qtd_dma) mark ='*' ; -else if (hw->hw_qtd_next ==cpu_to_hc32 (fotg210, td->qtd_dma)) +else if (hw->hw_qtd_next ==cpu_to_hc32 (fhcd2xx, td->qtd_dma)) mark ='+' ;else if (QTD_LENGTH (scratch)) { -if (td->hw_alt_next == fotg210->async->hw->hw_alt_next) +if (td->hw_alt_next == fhcd2xx->async->hw->hw_alt_next) mark ='#' ;else if (td->hw_alt_next != list_end) mark ='/' ;
@@ -462,14 +462,14 @@ done:static ssize_t fill_async_buffer (struct debug_buffer *buf) {struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; +struct fhcd2xx_hcd *fhcd2xx;unsigned long flags;unsigned temp, size;char *next; -struct fotg210_qh *qh; +struct fhcd2xx_qh *qh; hcd =bus_to_hcd (buf->bus); - fotg210 =hcd_to_fotg210 (hcd); + fhcd2xx =hcd_to_fhcd2xx (hcd); next = buf->output_buf; size = buf->alloc_size;
@@ -479,39 +479,39 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)* usually empty except for long-term bulk reads, or head. * one QH per line, and TDs we know about */ -spin_lock_irqsave (&fotg210->lock, flags); -for (qh = fotg210->async->qh_next.qh; size >0 && qh; +spin_lock_irqsave (&fhcd2xx->lock, flags); +for (qh = fhcd2xx->async->qh_next.qh; size >0 && qh; qh = qh->qh_next.qh) -qh_lines (fotg210, qh, &next, &size); -if (fotg210->async_unlink && size >0 ) { +qh_lines (fhcd2xx, qh, &next, &size); +if (fhcd2xx->async_unlink && size >0 ) { temp =scnprintf (next, size,"\nunlink =\n" ); size -= temp; next += temp; -for (qh = fotg210->async_unlink; size >0 && qh; +for (qh = fhcd2xx->async_unlink; size >0 && qh; qh = qh->unlink_next) -qh_lines (fotg210, qh, &next, &size); +qh_lines (fhcd2xx, qh, &next, &size); } -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);return strlen (buf->output_buf); }/* count tds, get ep direction */ static inline unsigned output_buf_tds_dir (char *buf, -struct fotg210_hcd *fotg210, -struct fotg210_qh_hw *hw, -struct fotg210_qh *qh,unsigned size) +struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh_hw *hw, +struct fhcd2xx_qh *qh,unsigned size) { -u32 scratch =hc32_to_cpup (fotg210, &hw->hw_info1); -struct fotg210_qtd *qtd; +u32 scratch =hc32_to_cpup (fhcd2xx, &hw->hw_info1); +struct fhcd2xx_qtd *qtd;char *type ="" ;unsigned temp =0 ;/* count tds, get ep direction */ list_for_each_entry (qtd, &qh->qtd_list, qtd_list) { temp++; -switch (0x03 & (hc32_to_cpu (fotg210, qtd->hw_token) >>8 )) { +switch (0x03 & (hc32_to_cpu (fhcd2xx, qtd->hw_token) >>8 )) {case 0 : type ="out" ;continue ;
@@ -531,9 +531,9 @@ static inline unsigned output_buf_tds_dir(char *buf,static ssize_t fill_periodic_buffer (struct debug_buffer *buf) {struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; +struct fhcd2xx_hcd *fhcd2xx;unsigned long flags; -union fotg210_shadow p, *seen; +union fhcd2xx_shadow p, *seen;unsigned temp, size, seen_count;char *next;unsigned i;
@@ -546,38 +546,38 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) seen_count = 0; hcd = bus_to_hcd(buf->bus); - fotg210 = hcd_to_fotg210(hcd); + fhcd2xx = hcd_to_fhcd2xx(hcd); next = buf->output_buf; size = buf->alloc_size; - temp = scnprintf(next, size, "size = %d\n", fotg210->periodic_size); + temp = scnprintf(next, size, "size = %d\n", fhcd2xx->periodic_size); size -= temp; next += temp; /* dump a snapshot of the periodic schedule. * iso changes, interrupt usually doesn't. */ - spin_lock_irqsave(&fotg210->lock, flags); - for (i = 0; i < fotg210->periodic_size; i++) { - p = fotg210->pshadow[i]; + spin_lock_irqsave(&fhcd2xx->lock, flags); + for (i = 0; i < fhcd2xx->periodic_size; i++) { + p = fhcd2xx->pshadow[i]; if (likely(!p.ptr)) continue; - tag = Q_NEXT_TYPE(fotg210, fotg210->periodic[i]); + tag = Q_NEXT_TYPE(fhcd2xx, fhcd2xx->periodic[i]); temp = scnprintf(next, size, "%4d: ", i); size -= temp; next += temp; do { - struct fotg210_qh_hw *hw; + struct fhcd2xx_qh_hw *hw; - switch (hc32_to_cpu(fotg210, tag)) { + switch (hc32_to_cpu(fhcd2xx, tag)) { case Q_TYPE_QH: hw = p.qh->hw; temp = scnprintf(next, size, " qh%d-%04x/%p", p.qh->period, - hc32_to_cpup(fotg210, + hc32_to_cpup(fhcd2xx, &hw->hw_info2) /* uframe masks */ & (QH_CMASK | QH_SMASK),
@@ -599,27 +599,27 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)/* show more info the first time around */ if (temp == seen_count) { temp =output_buf_tds_dir (next, - fotg210, hw, + fhcd2xx, hw, p.qh, size);if (seen_count <DBG_SCHED_LIMIT ) seen[seen_count++].qh = p.qh; }else temp =0 ; - tag =Q_NEXT_TYPE (fotg210, hw->hw_next); + tag =Q_NEXT_TYPE (fhcd2xx, hw->hw_next); p = p.qh->qh_next;break ;case Q_TYPE_FSTN : temp =scnprintf (next, size," fstn-%8x/%p" , p.fstn->hw_prev, p.fstn); - tag =Q_NEXT_TYPE (fotg210, p.fstn->hw_next); + tag =Q_NEXT_TYPE (fhcd2xx, p.fstn->hw_next); p = p.fstn->fstn_next;break ;case Q_TYPE_ITD : temp =scnprintf (next, size," itd/%p" , p.itd); - tag =Q_NEXT_TYPE (fotg210, p.itd->hw_next); + tag =Q_NEXT_TYPE (fhcd2xx, p.itd->hw_next); p = p.itd->itd_next;break ; }
@@ -631,23 +631,23 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) size -= temp; next += temp; } -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);kfree (seen);return buf->alloc_size - size; }#undef DBG_SCHED_LIMIT -static const char *rh_state_string (struct fotg210_hcd *fotg210) +static const char *rh_state_string (struct fhcd2xx_hcd *fhcd2xx) { -switch (fotg210->rh_state) { -case FOTG210_RH_HALTED : +switch (fhcd2xx->rh_state) { +case FHCD2XX_RH_HALTED :return "halted" ; -case FOTG210_RH_SUSPENDED : +case FHCD2XX_RH_SUSPENDED :return "suspended" ; -case FOTG210_RH_RUNNING : +case FHCD2XX_RH_RUNNING :return "running" ; -case FOTG210_RH_STOPPING : +case FHCD2XX_RH_STOPPING :return "stopping" ; }return "?" ;
@@ -656,7 +656,7 @@ static const char *rh_state_string(struct fotg210_hcd *fotg210)static ssize_t fill_registers_buffer (struct debug_buffer *buf) {struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; +struct fhcd2xx_hcd *fhcd2xx;unsigned long flags;unsigned temp, size, i;char *next, scratch[80 ];
@@ -664,11 +664,11 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)static const char label[] ="" ; hcd =bus_to_hcd (buf->bus); - fotg210 =hcd_to_fotg210 (hcd); + fhcd2xx =hcd_to_fhcd2xx (hcd); next = buf->output_buf; size = buf->alloc_size; -spin_lock_irqsave (&fotg210->lock, flags); +spin_lock_irqsave (&fhcd2xx->lock, flags);if (!HCD_HW_ACCESSIBLE (hcd)) { size = scnprintf(next, size,
@@ -682,8 +682,8 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) }/* Capability Registers */ - i =HC_VERSION (fotg210,fotg210_readl (fotg210, - &fotg210->caps->hc_capbase)); + i =HC_VERSION (fhcd2xx,fhcd2xx_readl (fhcd2xx, + &fhcd2xx->caps->hc_capbase)); temp =scnprintf (next, size,"bus %s, device %s\n" "%s\n"
@@ -691,68 +691,68 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) hcd->self.controller->bus->name,dev_name (hcd->self.controller), hcd->product_desc, - i >> 8, i & 0x0ff, rh_state_string(fotg210)); + i >> 8, i & 0x0ff, rh_state_string(fhcd2xx)); size -= temp; next += temp;/* FIXME interpret both types of params */ - i =fotg210_readl (fotg210, &fotg210->caps->hcs_params); + i =fhcd2xx_readl (fhcd2xx, &fhcd2xx->caps->hcs_params); temp =scnprintf (next, size,"structural params 0x%08x\n" , i); size -= temp; next += temp; - i =fotg210_readl (fotg210, &fotg210->caps->hcc_params); + i =fhcd2xx_readl (fhcd2xx, &fhcd2xx->caps->hcc_params); temp =scnprintf (next, size,"capability params 0x%08x\n" , i); size -= temp; next += temp;/* Operational Registers */ temp =dbg_status_buf (scratch,sizeof (scratch), label, -fotg210_readl (fotg210, &fotg210->regs->status)); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->status)); temp =scnprintf (next, size, fmt, temp, scratch); size -= temp; next += temp; temp =dbg_command_buf (scratch,sizeof (scratch), label, -fotg210_readl (fotg210, &fotg210->regs->command)); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command)); temp =scnprintf (next, size, fmt, temp, scratch); size -= temp; next += temp; temp =dbg_intr_buf (scratch,sizeof (scratch), label, -fotg210_readl (fotg210, &fotg210->regs->intr_enable)); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->intr_enable)); temp =scnprintf (next, size, fmt, temp, scratch); size -= temp; next += temp; temp =scnprintf (next, size,"uframe %04x\n" , -fotg210_read_frame_index (fotg210)); +fhcd2xx_read_frame_index (fhcd2xx)); size -= temp; next += temp; -if (fotg210->async_unlink) { +if (fhcd2xx->async_unlink) { temp =scnprintf (next, size,"async unlink qh %p\n" , - fotg210->async_unlink); + fhcd2xx->async_unlink); size -= temp; next += temp; } -#ifdef FOTG210_STATS +#ifdef FHCD2XX_STATS temp =scnprintf (next, size,"irq normal %ld err %ld iaa %ld(lost %ld)\n" , - fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa, - fotg210->stats.lost_iaa); + fhcd2xx->stats.normal, fhcd2xx->stats.error, fhcd2xx->stats.iaa, + fhcd2xx->stats.lost_iaa); size -= temp; next += temp; temp =scnprintf (next, size,"complete %ld unlink %ld\n" , - fotg210->stats.complete, fotg210->stats.unlink); + fhcd2xx->stats.complete, fhcd2xx->stats.unlink); size -= temp; next += temp;#endif done: -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);return buf->alloc_size - size; }
@@ -860,36 +860,36 @@ static int debug_registers_open(struct inode *inode, struct file *file)return file->private_data ?0 : -ENOMEM ; } -static inline void create_debug_files (struct fotg210_hcd *fotg210) +static inline void create_debug_files (struct fhcd2xx_hcd *fhcd2xx) { -struct usb_bus *bus = &fotg210_to_hcd (fotg210)->self; +struct usb_bus *bus = &fhcd2xx_to_hcd (fhcd2xx)->self; - fotg210->debug_dir =debugfs_create_dir (bus->bus_name, - fotg210_debug_root); -if (!fotg210->debug_dir) + fhcd2xx->debug_dir =debugfs_create_dir (bus->bus_name, + fhcd2xx_debug_root); +if (!fhcd2xx->debug_dir)return ; -if (!debugfs_create_file ("async" ,S_IRUGO , fotg210->debug_dir, bus, +if (!debugfs_create_file ("async" ,S_IRUGO , fhcd2xx->debug_dir, bus, &debug_async_fops)) goto file_error; -if (!debugfs_create_file ("periodic" ,S_IRUGO , fotg210->debug_dir, bus, +if (!debugfs_create_file ("periodic" ,S_IRUGO , fhcd2xx->debug_dir, bus, &debug_periodic_fops)) goto file_error; -if (!debugfs_create_file ("registers" ,S_IRUGO , fotg210->debug_dir, bus, +if (!debugfs_create_file ("registers" ,S_IRUGO , fhcd2xx->debug_dir, bus, &debug_registers_fops)) goto file_error;return ; file_error: -debugfs_remove_recursive (fotg210->debug_dir); +debugfs_remove_recursive (fhcd2xx->debug_dir); } -static inline void remove_debug_files (struct fotg210_hcd *fotg210) +static inline void remove_debug_files (struct fhcd2xx_hcd *fhcd2xx) { -debugfs_remove_recursive (fotg210->debug_dir); +debugfs_remove_recursive (fhcd2xx->debug_dir); }/*
@@ -909,13 +909,13 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)* before driver shutdown. But it also seems to be caused by bugs in cardbus * bridge shutdown: shutting down the bridge before the devices using it. */ -static int handshake (struct fotg210_hcd *fotg210,void __iomem *ptr, +static int handshake (struct fhcd2xx_hcd *fhcd2xx,void __iomem *ptr,u32 mask,u32 done,int usec) {u32 result; do { - result = fotg210_readl(fotg210, ptr); + result = fhcd2xx_readl(fhcd2xx, ptr); if (result == ~(u32)0) /* card removed */ return -ENODEV; result &= mask;
@@ -931,28 +931,28 @@ static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr,* Force HC to halt state from unknown (EHCI spec section 2.3). * Must be called with interrupts enabled and the lock not held. */ -static int fotg210_halt (struct fotg210_hcd *fotg210) +static int fhcd2xx_halt (struct fhcd2xx_hcd *fhcd2xx) {u32 temp; -spin_lock_irq (&fotg210->lock); +spin_lock_irq (&fhcd2xx->lock);/* disable any irqs left enabled by previous code */ -fotg210_writel (fotg210,0 , &fotg210->regs->intr_enable); +fhcd2xx_writel (fhcd2xx,0 , &fhcd2xx->regs->intr_enable);/* -* This routine gets called during probe before fotg210->command +* This routine gets called during probe before fhcd2xx->command * has been initialized, so we can't rely on its value. */ - fotg210->command &= ~CMD_RUN ; - temp =fotg210_readl (fotg210, &fotg210->regs->command); + fhcd2xx->command &= ~CMD_RUN ; + temp =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command); temp &= ~(CMD_RUN |CMD_IAAD ); -fotg210_writel (fotg210, temp, &fotg210->regs->command); +fhcd2xx_writel (fhcd2xx, temp, &fhcd2xx->regs->command); -spin_unlock_irq (&fotg210->lock); -synchronize_irq (fotg210_to_hcd (fotg210)->irq); +spin_unlock_irq (&fhcd2xx->lock); +synchronize_irq (fhcd2xx_to_hcd (fhcd2xx)->irq); -return handshake (fotg210, &fotg210->regs->status, +return handshake (fhcd2xx, &fhcd2xx->regs->status,STS_HALT ,STS_HALT ,16 *125 ); }
@@ -960,33 +960,33 @@ static int fotg210_halt(struct fotg210_hcd *fotg210)* Reset a non-running (STS_HALT == 1) controller. * Must be called with interrupts enabled and the lock not held. */ -static int fotg210_reset (struct fotg210_hcd *fotg210) +static int fhcd2xx_reset (struct fhcd2xx_hcd *fhcd2xx) {int retval; -u32 command =fotg210_readl (fotg210, &fotg210->regs->command); +u32 command =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command);/* If the EHCI debug controller is active, special care must be * taken before and after a host controller reset */ -if (fotg210->debug && !dbgp_reset_prep (fotg210_to_hcd (fotg210))) - fotg210->debug =NULL ; +if (fhcd2xx->debug && !dbgp_reset_prep (fhcd2xx_to_hcd (fhcd2xx))) + fhcd2xx->debug =NULL ; command |=CMD_RESET ; -dbg_cmd (fotg210,"reset" , command); -fotg210_writel (fotg210, command, &fotg210->regs->command); - fotg210->rh_state =FOTG210_RH_HALTED ; - fotg210->next_statechange = jiffies; - retval =handshake (fotg210, &fotg210->regs->command, +dbg_cmd (fhcd2xx,"reset" , command); +fhcd2xx_writel (fhcd2xx, command, &fhcd2xx->regs->command); + fhcd2xx->rh_state =FHCD2XX_RH_HALTED ; + fhcd2xx->next_statechange = jiffies; + retval =handshake (fhcd2xx, &fhcd2xx->regs->command,CMD_RESET ,0 ,250 *1000 );if (retval)return retval; -if (fotg210->debug) -dbgp_external_startup (fotg210_to_hcd (fotg210)); +if (fhcd2xx->debug) +dbgp_external_startup (fhcd2xx_to_hcd (fhcd2xx)); - fotg210->port_c_suspend = fotg210->suspended_ports = - fotg210->resuming_ports =0 ; + fhcd2xx->port_c_suspend = fhcd2xx->suspended_ports = + fhcd2xx->resuming_ports =0 ;return retval; }
@@ -994,69 +994,69 @@ static int fotg210_reset(struct fotg210_hcd *fotg210)* Idle the controller (turn off the schedules). * Must be called with interrupts enabled and the lock not held. */ -static void fotg210_quiesce (struct fotg210_hcd *fotg210) +static void fhcd2xx_quiesce (struct fhcd2xx_hcd *fhcd2xx) {u32 temp; -if (fotg210->rh_state !=FOTG210_RH_RUNNING ) +if (fhcd2xx->rh_state !=FHCD2XX_RH_RUNNING )return ;/* wait for any schedule enables/disables to take effect */ - temp = (fotg210->command <<10 ) & (STS_ASS |STS_PSS ); -handshake (fotg210, &fotg210->regs->status,STS_ASS |STS_PSS , temp, + temp = (fhcd2xx->command <<10 ) & (STS_ASS |STS_PSS ); +handshake (fhcd2xx, &fhcd2xx->regs->status,STS_ASS |STS_PSS , temp,16 *125 );/* then disable anything that's still active */ -spin_lock_irq (&fotg210->lock); - fotg210->command &= ~(CMD_ASE |CMD_PSE ); -fotg210_writel (fotg210, fotg210->command, &fotg210->regs->command); -spin_unlock_irq (&fotg210->lock); +spin_lock_irq (&fhcd2xx->lock); + fhcd2xx->command &= ~(CMD_ASE |CMD_PSE ); +fhcd2xx_writel (fhcd2xx, fhcd2xx->command, &fhcd2xx->regs->command); +spin_unlock_irq (&fhcd2xx->lock);/* hardware can take 16 microframes to turn off ... */ -handshake (fotg210, &fotg210->regs->status,STS_ASS |STS_PSS ,0 , +handshake (fhcd2xx, &fhcd2xx->regs->status,STS_ASS |STS_PSS ,0 ,16 *125 ); } -static void end_unlink_async (struct fotg210_hcd *fotg210); -static void unlink_empty_async (struct fotg210_hcd *fotg210); -static void fotg210_work (struct fotg210_hcd *fotg210); -static void start_unlink_intr (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh); -static void end_unlink_intr (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); +static void end_unlink_async (struct fhcd2xx_hcd *fhcd2xx); +static void unlink_empty_async (struct fhcd2xx_hcd *fhcd2xx); +static void fhcd2xx_work (struct fhcd2xx_hcd *fhcd2xx); +static void start_unlink_intr (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh *qh); +static void end_unlink_intr (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh);/* Set a bit in the USBCMD register */ -static void fotg210_set_command_bit (struct fotg210_hcd *fotg210,u32 bit) +static void fhcd2xx_set_command_bit (struct fhcd2xx_hcd *fhcd2xx,u32 bit) { - fotg210->command |= bit; -fotg210_writel (fotg210, fotg210->command, &fotg210->regs->command); + fhcd2xx->command |= bit; +fhcd2xx_writel (fhcd2xx, fhcd2xx->command, &fhcd2xx->regs->command);/* unblock posted write */ -fotg210_readl (fotg210, &fotg210->regs->command); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command); }/* Clear a bit in the USBCMD register */ -static void fotg210_clear_command_bit (struct fotg210_hcd *fotg210,u32 bit) +static void fhcd2xx_clear_command_bit (struct fhcd2xx_hcd *fhcd2xx,u32 bit) { - fotg210->command &= ~bit; -fotg210_writel (fotg210, fotg210->command, &fotg210->regs->command); + fhcd2xx->command &= ~bit; +fhcd2xx_writel (fhcd2xx, fhcd2xx->command, &fhcd2xx->regs->command);/* unblock posted write */ -fotg210_readl (fotg210, &fotg210->regs->command); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command); }/* * EHCI timer support... Now using hrtimers. * -* Lots of different events are triggered from fotg210->hrtimer. Whenever +* Lots of different events are triggered from fhcd2xx->hrtimer. Whenever * the timer routine runs, it checks each possible event; events that are * currently enabled and whose expiration time has passed get handled. * The set of enabled events is stored as a collection of bitflags in -* fotg210->enabled_hrtimer_events, and they are numbered in order of +* fhcd2xx->enabled_hrtimer_events, and they are numbered in order of * increasing delay values (ranging between 1 ms and 100 ms). * * Rather than implementing a sorted list or tree of all pending events, * we keep track only of the lowest-numbered pending event, in -* fotg210->next_hrtimer_event. Whenever fotg210->hrtimer gets restarted, its +* fhcd2xx->next_hrtimer_event. Whenever fhcd2xx->hrtimer gets restarted, its * expiration time is set to the timeout value for this event. * * As a result, events might not get handled right away; the actual delay
@@ -1070,166 +1070,166 @@ static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit)/* * Delay lengths for the hrtimer event types. * Keep this list sorted by delay length, in the same order as -* the event types indexed by enum fotg210_hrtimer_event in fotg210.h. +* the event types indexed by enum fhcd2xx_hrtimer_event in fhcd2xx.h. */ static unsigned event_delays_ns[] = { -1 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_POLL_ASS */ -1 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_POLL_PSS */ -1 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_POLL_DEAD */ -1125 *NSEC_PER_USEC ,/* FOTG210_HRTIMER_UNLINK_INTR */ -2 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_FREE_ITDS */ -6 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_ASYNC_UNLINKS */ -10 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_IAA_WATCHDOG */ -10 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_DISABLE_PERIODIC */ -15 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_DISABLE_ASYNC */ -100 *NSEC_PER_MSEC ,/* FOTG210_HRTIMER_IO_WATCHDOG */ +1 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_POLL_ASS */ +1 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_POLL_PSS */ +1 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_POLL_DEAD */ +1125 *NSEC_PER_USEC ,/* FHCD2XX_HRTIMER_UNLINK_INTR */ +2 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_FREE_ITDS */ +6 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_ASYNC_UNLINKS */ +10 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_IAA_WATCHDOG */ +10 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_DISABLE_PERIODIC */ +15 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_DISABLE_ASYNC */ +100 *NSEC_PER_MSEC ,/* FHCD2XX_HRTIMER_IO_WATCHDOG */ };/* Enable a pending hrtimer event */ -static void fotg210_enable_event (struct fotg210_hcd *fotg210,unsigned event, +static void fhcd2xx_enable_event (struct fhcd2xx_hcd *fhcd2xx,unsigned event,bool resched) { -ktime_t *timeout = &fotg210->hr_timeouts[event]; +ktime_t *timeout = &fhcd2xx->hr_timeouts[event];if (resched) *timeout =ktime_add (ktime_get (),ktime_set (0 , event_delays_ns[event])); - fotg210->enabled_hrtimer_events |= (1 << event); + fhcd2xx->enabled_hrtimer_events |= (1 << event);/* Track only the lowest-numbered pending event */ -if (event < fotg210->next_hrtimer_event) { - fotg210->next_hrtimer_event = event; -hrtimer_start_range_ns (&fotg210->hrtimer, *timeout, +if (event < fhcd2xx->next_hrtimer_event) { + fhcd2xx->next_hrtimer_event = event; +hrtimer_start_range_ns (&fhcd2xx->hrtimer, *timeout,NSEC_PER_MSEC ,HRTIMER_MODE_ABS ); } }/* Poll the STS_ASS status bit; see when it agrees with CMD_ASE */ -static void fotg210_poll_ASS (struct fotg210_hcd *fotg210) +static void fhcd2xx_poll_ASS (struct fhcd2xx_hcd *fhcd2xx) {unsigned actual, want;/* Don't enable anything if the controller isn't running (e.g., died) */ -if (fotg210->rh_state !=FOTG210_RH_RUNNING ) +if (fhcd2xx->rh_state !=FHCD2XX_RH_RUNNING )return ; - want = (fotg210->command &CMD_ASE ) ?STS_ASS :0 ; - actual =fotg210_readl (fotg210, &fotg210->regs->status) &STS_ASS ; + want = (fhcd2xx->command &CMD_ASE ) ?STS_ASS :0 ; + actual =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->status) &STS_ASS ;if (want != actual) {/* Poll again later, but give up after about 20 ms */ -if (fotg210->ASS_poll_count++ <20 ) { -fotg210_enable_event (fotg210,FOTG210_HRTIMER_POLL_ASS , +if (fhcd2xx->ASS_poll_count++ <20 ) { +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_POLL_ASS , true);return ; } -fotg210_dbg (fotg210,"Waited too long for the async schedule status (%x/%x), giving up\n" , +fhcd2xx_dbg (fhcd2xx,"Waited too long for the async schedule status (%x/%x), giving up\n" , want, actual); } - fotg210->ASS_poll_count =0 ; + fhcd2xx->ASS_poll_count =0 ;/* The status is up-to-date; restart or stop the schedule as needed */ if (want ==0 ) {/* Stopped */ -if (fotg210->async_count >0 ) -fotg210_set_command_bit (fotg210,CMD_ASE ); +if (fhcd2xx->async_count >0 ) +fhcd2xx_set_command_bit (fhcd2xx,CMD_ASE ); }else {/* Running */ -if (fotg210->async_count ==0 ) { +if (fhcd2xx->async_count ==0 ) {/* Turn off the schedule after a while */ -fotg210_enable_event (fotg210, -FOTG210_HRTIMER_DISABLE_ASYNC , +fhcd2xx_enable_event (fhcd2xx, +FHCD2XX_HRTIMER_DISABLE_ASYNC , true); } } }/* Turn off the async schedule after a brief delay */ -static void fotg210_disable_ASE (struct fotg210_hcd *fotg210) +static void fhcd2xx_disable_ASE (struct fhcd2xx_hcd *fhcd2xx) { -fotg210_clear_command_bit (fotg210,CMD_ASE ); +fhcd2xx_clear_command_bit (fhcd2xx,CMD_ASE ); }/* Poll the STS_PSS status bit; see when it agrees with CMD_PSE */ -static void fotg210_poll_PSS (struct fotg210_hcd *fotg210) +static void fhcd2xx_poll_PSS (struct fhcd2xx_hcd *fhcd2xx) {unsigned actual, want;/* Don't do anything if the controller isn't running (e.g., died) */ -if (fotg210->rh_state !=FOTG210_RH_RUNNING ) +if (fhcd2xx->rh_state !=FHCD2XX_RH_RUNNING )return ; - want = (fotg210->command &CMD_PSE ) ?STS_PSS :0 ; - actual =fotg210_readl (fotg210, &fotg210->regs->status) &STS_PSS ; + want = (fhcd2xx->command &CMD_PSE ) ?STS_PSS :0 ; + actual =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->status) &STS_PSS ;if (want != actual) {/* Poll again later, but give up after about 20 ms */ -if (fotg210->PSS_poll_count++ <20 ) { -fotg210_enable_event (fotg210,FOTG210_HRTIMER_POLL_PSS , +if (fhcd2xx->PSS_poll_count++ <20 ) { +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_POLL_PSS , true);return ; } -fotg210_dbg (fotg210,"Waited too long for the periodic schedule status (%x/%x), giving up\n" , +fhcd2xx_dbg (fhcd2xx,"Waited too long for the periodic schedule status (%x/%x), giving up\n" , want, actual); } - fotg210->PSS_poll_count =0 ; + fhcd2xx->PSS_poll_count =0 ;/* The status is up-to-date; restart or stop the schedule as needed */ if (want ==0 ) {/* Stopped */ -if (fotg210->periodic_count >0 ) -fotg210_set_command_bit (fotg210,CMD_PSE ); +if (fhcd2xx->periodic_count >0 ) +fhcd2xx_set_command_bit (fhcd2xx,CMD_PSE ); }else {/* Running */ -if (fotg210->periodic_count ==0 ) { +if (fhcd2xx->periodic_count ==0 ) {/* Turn off the schedule after a while */ -fotg210_enable_event (fotg210, -FOTG210_HRTIMER_DISABLE_PERIODIC , +fhcd2xx_enable_event (fhcd2xx, +FHCD2XX_HRTIMER_DISABLE_PERIODIC , true); } } }/* Turn off the periodic schedule after a brief delay */ -static void fotg210_disable_PSE (struct fotg210_hcd *fotg210) +static void fhcd2xx_disable_PSE (struct fhcd2xx_hcd *fhcd2xx) { -fotg210_clear_command_bit (fotg210,CMD_PSE ); +fhcd2xx_clear_command_bit (fhcd2xx,CMD_PSE ); }/* Poll the STS_HALT status bit; see when a dead controller stops */ -static void fotg210_handle_controller_death (struct fotg210_hcd *fotg210) +static void fhcd2xx_handle_controller_death (struct fhcd2xx_hcd *fhcd2xx) { -if (!(fotg210_readl (fotg210, &fotg210->regs->status) &STS_HALT )) { +if (!(fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->status) &STS_HALT )) {/* Give up after a few milliseconds */ -if (fotg210->died_poll_count++ <5 ) { +if (fhcd2xx->died_poll_count++ <5 ) {/* Try again later */ -fotg210_enable_event (fotg210, -FOTG210_HRTIMER_POLL_DEAD , true); +fhcd2xx_enable_event (fhcd2xx, +FHCD2XX_HRTIMER_POLL_DEAD , true);return ; } -fotg210_warn (fotg210,"Waited too long for the controller to stop, giving up\n" ); +fhcd2xx_warn (fhcd2xx,"Waited too long for the controller to stop, giving up\n" ); }/* Clean up the mess */ - fotg210->rh_state =FOTG210_RH_HALTED ; -fotg210_writel (fotg210,0 , &fotg210->regs->intr_enable); -fotg210_work (fotg210); -end_unlink_async (fotg210); + fhcd2xx->rh_state =FHCD2XX_RH_HALTED ; +fhcd2xx_writel (fhcd2xx,0 , &fhcd2xx->regs->intr_enable); +fhcd2xx_work (fhcd2xx); +end_unlink_async (fhcd2xx);/* Not in process context, so don't try to reset the controller */ }/* Handle unlinked interrupt QHs once they are gone from the hardware */ -static void fotg210_handle_intr_unlinks (struct fotg210_hcd *fotg210) +static void fhcd2xx_handle_intr_unlinks (struct fhcd2xx_hcd *fhcd2xx) { -bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING ); +bool stopped = (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING );/* * Process all the QHs on the intr_unlink list that were added
@@ -1238,63 +1238,63 @@ static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210)* current cycle. But if the root hub isn't running then * process all the QHs on the list. */ - fotg210->intr_unlinking = true; -while (fotg210->intr_unlink) { -struct fotg210_qh *qh = fotg210->intr_unlink; + fhcd2xx->intr_unlinking = true; +while (fhcd2xx->intr_unlink) { +struct fhcd2xx_qh *qh = fhcd2xx->intr_unlink; -if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle) +if (!stopped && qh->unlink_cycle == fhcd2xx->intr_unlink_cycle)break ; - fotg210->intr_unlink = qh->unlink_next; + fhcd2xx->intr_unlink = qh->unlink_next; qh->unlink_next =NULL ; -end_unlink_intr (fotg210, qh); +end_unlink_intr (fhcd2xx, qh); }/* Handle remaining entries later */ -if (fotg210->intr_unlink) { -fotg210_enable_event (fotg210,FOTG210_HRTIMER_UNLINK_INTR , +if (fhcd2xx->intr_unlink) { +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_UNLINK_INTR , true); - ++fotg210->intr_unlink_cycle; + ++fhcd2xx->intr_unlink_cycle; } - fotg210->intr_unlinking = false; + fhcd2xx->intr_unlinking = false; }/* Start another free-iTDs/siTDs cycle */ -static void start_free_itds (struct fotg210_hcd *fotg210) -{ -if (!(fotg210->enabled_hrtimer_events & -BIT (FOTG210_HRTIMER_FREE_ITDS ))) { - fotg210->last_itd_to_free =list_entry ( - fotg210->cached_itd_list.prev, - struct fotg210_itd, itd_list); -fotg210_enable_event (fotg210,FOTG210_HRTIMER_FREE_ITDS , true); +static void start_free_itds (struct fhcd2xx_hcd *fhcd2xx) +{ +if (!(fhcd2xx->enabled_hrtimer_events & +BIT (FHCD2XX_HRTIMER_FREE_ITDS ))) { + fhcd2xx->last_itd_to_free =list_entry ( + fhcd2xx->cached_itd_list.prev, + struct fhcd2xx_itd, itd_list); +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_FREE_ITDS , true); } }/* Wait for controller to stop using old iTDs and siTDs */ -static void end_free_itds (struct fotg210_hcd *fotg210) +static void end_free_itds (struct fhcd2xx_hcd *fhcd2xx) { -struct fotg210_itd *itd, *n; +struct fhcd2xx_itd *itd, *n; -if (fotg210->rh_state <FOTG210_RH_RUNNING ) - fotg210->last_itd_to_free =NULL ; +if (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING ) + fhcd2xx->last_itd_to_free =NULL ; -list_for_each_entry_safe (itd, n, &fotg210->cached_itd_list, itd_list) { +list_for_each_entry_safe (itd, n, &fhcd2xx->cached_itd_list, itd_list) {list_del (&itd->itd_list); -dma_pool_free (fotg210->itd_pool, itd, itd->itd_dma); -if (itd == fotg210->last_itd_to_free) +dma_pool_free (fhcd2xx->itd_pool, itd, itd->itd_dma); +if (itd == fhcd2xx->last_itd_to_free)break ; } -if (!list_empty (&fotg210->cached_itd_list)) -start_free_itds (fotg210); +if (!list_empty (&fhcd2xx->cached_itd_list)) +start_free_itds (fhcd2xx); }/* Handle lost (or very late) IAA interrupts */ -static void fotg210_iaa_watchdog (struct fotg210_hcd *fotg210) +static void fhcd2xx_iaa_watchdog (struct fhcd2xx_hcd *fhcd2xx) { -if (fotg210->rh_state !=FOTG210_RH_RUNNING ) +if (fhcd2xx->rh_state !=FHCD2XX_RH_RUNNING )return ;/*
@@ -1303,7 +1303,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)* (a) SMP races against real IAA firing and retriggering, and * (b) clean HC shutdown, when IAA watchdog was pending. */ -if (fotg210->async_iaa) { +if (fhcd2xx->async_iaa) {u32 cmd, status;/* If we get here, IAA is *REALLY* late. It's barely
@@ -1312,7 +1312,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)* clear before we read STS_IAA. (The HC should clear * CMD_IAAD when it sets STS_IAA.) */ - cmd =fotg210_readl (fotg210, &fotg210->regs->command); + cmd =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command);/* * If IAA is set here it either legitimately triggered
@@ -1321,36 +1321,36 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)* - VIA seems to set IAA without triggering the IRQ; * - IAAD potentially cleared without setting IAA. */ - status =fotg210_readl (fotg210, &fotg210->regs->status); + status =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->status);if ((status &STS_IAA ) || !(cmd &CMD_IAAD )) { -COUNT (fotg210->stats.lost_iaa); -fotg210_writel (fotg210,STS_IAA , - &fotg210->regs->status); +COUNT (fhcd2xx->stats.lost_iaa); +fhcd2xx_writel (fhcd2xx,STS_IAA , + &fhcd2xx->regs->status); } -fotg210_dbg (fotg210,"IAA watchdog: status %x cmd %x\n" , +fhcd2xx_dbg (fhcd2xx,"IAA watchdog: status %x cmd %x\n" , status, cmd); -end_unlink_async (fotg210); +end_unlink_async (fhcd2xx); } }/* Enable the I/O watchdog, if appropriate */ -static void turn_on_io_watchdog (struct fotg210_hcd *fotg210) +static void turn_on_io_watchdog (struct fhcd2xx_hcd *fhcd2xx) {/* Not needed if the controller isn't running or it's already enabled */ -if (fotg210->rh_state !=FOTG210_RH_RUNNING || - (fotg210->enabled_hrtimer_events & -BIT (FOTG210_HRTIMER_IO_WATCHDOG ))) +if (fhcd2xx->rh_state !=FHCD2XX_RH_RUNNING || + (fhcd2xx->enabled_hrtimer_events & +BIT (FHCD2XX_HRTIMER_IO_WATCHDOG )))return ;/* * Isochronous transfers always need the watchdog. * For other sorts we use it only if the flag is set. */ -if (fotg210->isoc_count >0 || (fotg210->need_io_watchdog && - fotg210->async_count + fotg210->intr_count >0 )) -fotg210_enable_event (fotg210,FOTG210_HRTIMER_IO_WATCHDOG , +if (fhcd2xx->isoc_count >0 || (fhcd2xx->need_io_watchdog && + fhcd2xx->async_count + fhcd2xx->intr_count >0 )) +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_IO_WATCHDOG , true); }
@@ -1358,56 +1358,56 @@ static void turn_on_io_watchdog(struct fotg210_hcd *fotg210)/* * Handler functions for the hrtimer event types. * Keep this array in the same order as the event types indexed by -* enum fotg210_hrtimer_event in fotg210.h. +* enum fhcd2xx_hrtimer_event in fhcd2xx.h. */ -static void (*event_handlers[])(struct fotg210_hcd *) = { - fotg210_poll_ASS,/* FOTG210_HRTIMER_POLL_ASS */ - fotg210_poll_PSS,/* FOTG210_HRTIMER_POLL_PSS */ - fotg210_handle_controller_death,/* FOTG210_HRTIMER_POLL_DEAD */ - fotg210_handle_intr_unlinks,/* FOTG210_HRTIMER_UNLINK_INTR */ - end_free_itds,/* FOTG210_HRTIMER_FREE_ITDS */ - unlink_empty_async,/* FOTG210_HRTIMER_ASYNC_UNLINKS */ - fotg210_iaa_watchdog,/* FOTG210_HRTIMER_IAA_WATCHDOG */ - fotg210_disable_PSE,/* FOTG210_HRTIMER_DISABLE_PERIODIC */ - fotg210_disable_ASE,/* FOTG210_HRTIMER_DISABLE_ASYNC */ - fotg210_work,/* FOTG210_HRTIMER_IO_WATCHDOG */ +static void (*event_handlers[])(struct fhcd2xx_hcd *) = { + fhcd2xx_poll_ASS,/* FHCD2XX_HRTIMER_POLL_ASS */ + fhcd2xx_poll_PSS,/* FHCD2XX_HRTIMER_POLL_PSS */ + fhcd2xx_handle_controller_death,/* FHCD2XX_HRTIMER_POLL_DEAD */ + fhcd2xx_handle_intr_unlinks,/* FHCD2XX_HRTIMER_UNLINK_INTR */ + end_free_itds,/* FHCD2XX_HRTIMER_FREE_ITDS */ + unlink_empty_async,/* FHCD2XX_HRTIMER_ASYNC_UNLINKS */ + fhcd2xx_iaa_watchdog,/* FHCD2XX_HRTIMER_IAA_WATCHDOG */ + fhcd2xx_disable_PSE,/* FHCD2XX_HRTIMER_DISABLE_PERIODIC */ + fhcd2xx_disable_ASE,/* FHCD2XX_HRTIMER_DISABLE_ASYNC */ + fhcd2xx_work,/* FHCD2XX_HRTIMER_IO_WATCHDOG */ }; -static enum hrtimer_restart fotg210_hrtimer_func (struct hrtimer *t) +static enum hrtimer_restart fhcd2xx_hrtimer_func (struct hrtimer *t) { -struct fotg210_hcd *fotg210 = - container_of(t, struct fotg210_hcd, hrtimer); +struct fhcd2xx_hcd *fhcd2xx = + container_of(t, struct fhcd2xx_hcd, hrtimer);ktime_t now;unsigned long events;unsigned long flags;unsigned e; -spin_lock_irqsave (&fotg210->lock, flags); +spin_lock_irqsave (&fhcd2xx->lock, flags); - events = fotg210->enabled_hrtimer_events; - fotg210->enabled_hrtimer_events =0 ; - fotg210->next_hrtimer_event =FOTG210_HRTIMER_NO_EVENT ; + events = fhcd2xx->enabled_hrtimer_events; + fhcd2xx->enabled_hrtimer_events =0 ; + fhcd2xx->next_hrtimer_event =FHCD2XX_HRTIMER_NO_EVENT ;/* * Check each pending event. If its time has expired, handle * the event; otherwise re-enable it. */ now =ktime_get (); -for_each_set_bit (e, &events,FOTG210_HRTIMER_NUM_EVENTS ) { -if (now.tv64 >= fotg210->hr_timeouts[e].tv64) - event_handlers[e](fotg210); +for_each_set_bit (e, &events,FHCD2XX_HRTIMER_NUM_EVENTS ) { +if (now.tv64 >= fhcd2xx->hr_timeouts[e].tv64) + event_handlers[e](fhcd2xx);else -fotg210_enable_event (fotg210, e, false); +fhcd2xx_enable_event (fhcd2xx, e, false); } -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);return HRTIMER_NORESTART ; } -#define fotg210_bus_suspend NULL -#define fotg210_bus_resume NULL +#define fhcd2xx_bus_suspend NULL +#define fhcd2xx_bus_resume NULL -static int check_reset_complete (struct fotg210_hcd *fotg210,int index, +static int check_reset_complete (struct fhcd2xx_hcd *fhcd2xx,int index,u32 __iomem *status_reg,int port_status) {if (!(port_status &PORT_CONNECT ))
@@ -1416,12 +1416,12 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,/* if reset finished and it's still not enabled -- handoff */ if (!(port_status &PORT_PE )) {/* with integrated TT, there's nobody to hand it to! */ -fotg210_dbg (fotg210, +fhcd2xx_dbg (fhcd2xx,"Failed to enable port %d on root hub TT\n" , index+1 );return port_status; } -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , +fhcd2xx_dbg (fhcd2xx,"port %d reset complete, port enabled\n" , index +1 );return port_status;
@@ -1430,9 +1430,9 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,/* build "status change" packet (one or two bytes) from HC registers */ -static int fotg210_hub_status_data (struct usb_hcd *hcd,char *buf) +static int fhcd2xx_hub_status_data (struct usb_hcd *hcd,char *buf) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fhcd2xx_hcd *fhcd2xx =hcd_to_fhcd2xx (hcd);u32 temp, status;u32 mask;int retval =1 ;
@@ -1444,7 +1444,7 @@ static int fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)/* Inform the core about resumes-in-progress by returning * a non-zero value even if there are no status changes. */ - status = fotg210->resuming_ports; + status = fhcd2xx->resuming_ports; mask =PORT_CSC |PORT_PEC ;/* PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND */
@@ -1452,9 +1452,9 @@ static int fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)/* no hub change reports (bit 0) for now (power, ...) */ /* port N changes (bit N)? */ -spin_lock_irqsave (&fotg210->lock, flags); +spin_lock_irqsave (&fhcd2xx->lock, flags); - temp =fotg210_readl (fotg210, &fotg210->regs->port_status); + temp =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->port_status);/* * Return status information even for ports with OWNER set.
@@ -1463,25 +1463,25 @@ static int fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)* controller by the user. */ -if ((temp & mask) !=0 ||test_bit (0 , &fotg210->port_c_suspend) - || (fotg210->reset_done[0 ] &&time_after_eq ( - jiffies, fotg210->reset_done[0 ]))) { +if ((temp & mask) !=0 ||test_bit (0 , &fhcd2xx->port_c_suspend) + || (fhcd2xx->reset_done[0 ] &&time_after_eq ( + jiffies, fhcd2xx->reset_done[0 ]))) { buf[0 ] |=1 <<1 ; status =STS_PCD ; }/* FIXME autosuspend idle root hubs */ -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);return status ? retval :0 ; } -static void fotg210_hub_descriptor (struct fotg210_hcd *fotg210, +static void fhcd2xx_hub_descriptor (struct fhcd2xx_hcd *fhcd2xx,struct usb_hub_descriptor *desc) { -int ports =HCS_N_PORTS (fotg210->hcs_params); +int ports =HCS_N_PORTS (fhcd2xx->hcs_params);u16 temp; desc->bDescriptorType =USB_DT_HUB ; - desc->bPwrOn2PwrGood =10 ;/* fotg210 1.0, 2.3.9 says 20ms max */ + desc->bPwrOn2PwrGood =10 ;/* fhcd2xx 1.0, 2.3.9 says 20ms max */ desc->bHubContrCurrent =0 ; desc->bNbrPorts = ports;
@@ -1497,12 +1497,12 @@ static void fotg210_hub_descriptor(struct fotg210_hcd *fotg210, desc->wHubCharacteristics =cpu_to_le16 (temp); } -static int fotg210_hub_control (struct usb_hcd *hcd,u16 typeReq,u16 wValue, +static int fhcd2xx_hub_control (struct usb_hcd *hcd,u16 typeReq,u16 wValue,u16 wIndex,char *buf,u16 wLength) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -int ports =HCS_N_PORTS (fotg210->hcs_params); -u32 __iomem *status_reg = &fotg210->regs->port_status; +struct fhcd2xx_hcd *fhcd2xx =hcd_to_fhcd2xx (hcd); +int ports =HCS_N_PORTS (fhcd2xx->hcs_params); +u32 __iomem *status_reg = &fhcd2xx->regs->port_status;u32 temp, temp1, status;unsigned long flags;int retval =0 ;
@@ -1515,7 +1515,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,* power, "this is the one", etc. EHCI spec supports this. */ -spin_lock_irqsave (&fotg210->lock, flags); +spin_lock_irqsave (&fhcd2xx->lock, flags);switch (typeReq) {case ClearHubFeature:switch (wValue) {
@@ -1531,7 +1531,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,if (!wIndex || wIndex > ports) goto error; wIndex--; - temp =fotg210_readl (fotg210, status_reg); + temp =fhcd2xx_readl (fhcd2xx, status_reg); temp &= ~PORT_RWC_BITS ;/*
@@ -1543,10 +1543,10 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,switch (wValue) {case USB_PORT_FEAT_ENABLE : -fotg210_writel (fotg210, temp & ~PORT_PE , status_reg); +fhcd2xx_writel (fhcd2xx, temp & ~PORT_PE , status_reg);break ;case USB_PORT_FEAT_C_ENABLE : -fotg210_writel (fotg210, temp |PORT_PEC , status_reg); +fhcd2xx_writel (fhcd2xx, temp |PORT_PEC , status_reg);break ;case USB_PORT_FEAT_SUSPEND :if (temp &PORT_RESET )
@@ -1557,19 +1557,19 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, goto error;/* resume signaling for 20 msec */ -fotg210_writel (fotg210, temp |PORT_RESUME , status_reg); - fotg210->reset_done[wIndex] = jiffies +fhcd2xx_writel (fhcd2xx, temp |PORT_RESUME , status_reg); + fhcd2xx->reset_done[wIndex] = jiffies +msecs_to_jiffies (USB_RESUME_TIMEOUT );break ;case USB_PORT_FEAT_C_SUSPEND : -clear_bit (wIndex, &fotg210->port_c_suspend); +clear_bit (wIndex, &fhcd2xx->port_c_suspend);break ;case USB_PORT_FEAT_C_CONNECTION : -fotg210_writel (fotg210, temp |PORT_CSC , status_reg); +fhcd2xx_writel (fhcd2xx, temp |PORT_CSC , status_reg);break ;case USB_PORT_FEAT_C_OVER_CURRENT : -fotg210_writel (fotg210, temp |OTGISR_OVC , - &fotg210->regs->otgisr); +fhcd2xx_writel (fhcd2xx, temp |OTGISR_OVC , + &fhcd2xx->regs->otgisr);break ;case USB_PORT_FEAT_C_RESET :/* GetPortStatus clears reset */
@@ -1577,10 +1577,10 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,default : goto error; } -fotg210_readl (fotg210, &fotg210->regs->command); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command);break ;case GetHubDescriptor: -fotg210_hub_descriptor (fotg210, (struct usb_hub_descriptor *) +fhcd2xx_hub_descriptor (fhcd2xx, (struct usb_hub_descriptor *) buf);break ;case GetHubStatus:
@@ -1593,7 +1593,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, goto error; wIndex--; status =0 ; - temp =fotg210_readl (fotg210, status_reg); + temp =fhcd2xx_readl (fhcd2xx, status_reg);/* wPortChange bits */ if (temp &PORT_CSC )
@@ -1601,7 +1601,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,if (temp &PORT_PEC ) status |=USB_PORT_STAT_C_ENABLE <<16 ; - temp1 =fotg210_readl (fotg210, &fotg210->regs->otgisr); + temp1 =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->otgisr);if (temp1 &OTGISR_OVC ) status |=USB_PORT_STAT_C_OVERCURRENT <<16 ;
@@ -1609,32 +1609,32 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,if (temp &PORT_RESUME ) {/* Remote Wakeup received? */ -if (!fotg210->reset_done[wIndex]) { +if (!fhcd2xx->reset_done[wIndex]) {/* resume signaling for 20 msec */ - fotg210->reset_done[wIndex] = jiffies + fhcd2xx->reset_done[wIndex] = jiffies +msecs_to_jiffies (20 );/* check the port again */ -mod_timer (&fotg210_to_hcd (fotg210)->rh_timer, - fotg210->reset_done[wIndex]); +mod_timer (&fhcd2xx_to_hcd (fhcd2xx)->rh_timer, + fhcd2xx->reset_done[wIndex]); }/* resume completed? */ else if (time_after_eq (jiffies, - fotg210->reset_done[wIndex])) { -clear_bit (wIndex, &fotg210->suspended_ports); -set_bit (wIndex, &fotg210->port_c_suspend); - fotg210->reset_done[wIndex] =0 ; + fhcd2xx->reset_done[wIndex])) { +clear_bit (wIndex, &fhcd2xx->suspended_ports); +set_bit (wIndex, &fhcd2xx->port_c_suspend); + fhcd2xx->reset_done[wIndex] =0 ;/* stop resume signaling */ - temp =fotg210_readl (fotg210, status_reg); -fotg210_writel (fotg210, + temp =fhcd2xx_readl (fhcd2xx, status_reg); +fhcd2xx_writel (fhcd2xx, temp & ~(PORT_RWC_BITS |PORT_RESUME ), status_reg); -clear_bit (wIndex, &fotg210->resuming_ports); - retval =handshake (fotg210, status_reg, +clear_bit (wIndex, &fhcd2xx->resuming_ports); + retval =handshake (fhcd2xx, status_reg,PORT_RESUME ,0 ,2000 /* 2msec */ );if (retval !=0 ) { -fotg210_err (fotg210, +fhcd2xx_err (fhcd2xx,"port %d resume error %d\n" , wIndex +1 , retval); goto error;
@@ -1646,44 +1646,44 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,/* whoever resets must GetPortStatus to complete it!! */ if ((temp &PORT_RESET ) &&time_after_eq (jiffies, - fotg210->reset_done[wIndex])) { + fhcd2xx->reset_done[wIndex])) { status |=USB_PORT_STAT_C_RESET <<16 ; - fotg210->reset_done[wIndex] =0 ; -clear_bit (wIndex, &fotg210->resuming_ports); + fhcd2xx->reset_done[wIndex] =0 ; +clear_bit (wIndex, &fhcd2xx->resuming_ports);/* force reset to complete */ -fotg210_writel (fotg210, +fhcd2xx_writel (fhcd2xx, temp & ~(PORT_RWC_BITS |PORT_RESET ), status_reg);/* REVISIT: some hardware needs 550+ usec to clear * this bit; seems too long to spin routinely... */ - retval =handshake (fotg210, status_reg, + retval =handshake (fhcd2xx, status_reg,PORT_RESET ,0 ,1000 );if (retval !=0 ) { -fotg210_err (fotg210,"port %d reset error %d\n" , +fhcd2xx_err (fhcd2xx,"port %d reset error %d\n" , wIndex +1 , retval); goto error; }/* see what we found out */ - temp =check_reset_complete (fotg210, wIndex, status_reg, -fotg210_readl (fotg210, status_reg)); + temp =check_reset_complete (fhcd2xx, wIndex, status_reg, +fhcd2xx_readl (fhcd2xx, status_reg)); }if (!(temp & (PORT_RESUME |PORT_RESET ))) { - fotg210->reset_done[wIndex] =0 ; -clear_bit (wIndex, &fotg210->resuming_ports); + fhcd2xx->reset_done[wIndex] =0 ; +clear_bit (wIndex, &fhcd2xx->resuming_ports); }/* transfer dedicated ports to the companion hc */ if ((temp &PORT_CONNECT ) && -test_bit (wIndex, &fotg210->companion_ports)) { +test_bit (wIndex, &fhcd2xx->companion_ports)) { temp &= ~PORT_RWC_BITS ; -fotg210_writel (fotg210, temp, status_reg); -fotg210_dbg (fotg210,"port %d --> companion\n" , +fhcd2xx_writel (fhcd2xx, temp, status_reg); +fhcd2xx_dbg (fhcd2xx,"port %d --> companion\n" , wIndex +1 ); - temp =fotg210_readl (fotg210, status_reg); + temp =fhcd2xx_readl (fhcd2xx, status_reg); }/*
@@ -1694,7 +1694,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,if (temp &PORT_CONNECT ) { status |=USB_PORT_STAT_CONNECTION ; - status |=fotg210_port_speed (fotg210, temp); + status |=fhcd2xx_port_speed (fhcd2xx, temp); }if (temp &PORT_PE ) status |=USB_PORT_STAT_ENABLE ;
@@ -1702,24 +1702,24 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,/* maybe the port was unsuspended without our knowledge */ if (temp & (PORT_SUSPEND |PORT_RESUME )) { status |=USB_PORT_STAT_SUSPEND ; - }else if (test_bit (wIndex, &fotg210->suspended_ports)) { -clear_bit (wIndex, &fotg210->suspended_ports); -clear_bit (wIndex, &fotg210->resuming_ports); - fotg210->reset_done[wIndex] =0 ; + }else if (test_bit (wIndex, &fhcd2xx->suspended_ports)) { +clear_bit (wIndex, &fhcd2xx->suspended_ports); +clear_bit (wIndex, &fhcd2xx->resuming_ports); + fhcd2xx->reset_done[wIndex] =0 ;if (temp &PORT_PE ) -set_bit (wIndex, &fotg210->port_c_suspend); +set_bit (wIndex, &fhcd2xx->port_c_suspend); } - temp1 =fotg210_readl (fotg210, &fotg210->regs->otgisr); + temp1 =fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->otgisr);if (temp1 &OTGISR_OVC ) status |=USB_PORT_STAT_OVERCURRENT ;if (temp &PORT_RESET ) status |=USB_PORT_STAT_RESET ; -if (test_bit (wIndex, &fotg210->port_c_suspend)) +if (test_bit (wIndex, &fhcd2xx->port_c_suspend)) status |=USB_PORT_STAT_C_SUSPEND <<16 ;if (status & ~0xffff )/* only if wPortChange is interesting */ -dbg_port (fotg210,"GetStatus" , wIndex +1 , temp); +dbg_port (fhcd2xx,"GetStatus" , wIndex +1 , temp);put_unaligned_le32 (status, buf);break ;case SetHubFeature:
@@ -1739,7 +1739,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,if (!wIndex || wIndex > ports) goto error; wIndex--; - temp =fotg210_readl (fotg210, status_reg); + temp =fhcd2xx_readl (fhcd2xx, status_reg); temp &= ~PORT_RWC_BITS ;switch (wValue) {case USB_PORT_FEAT_SUSPEND :
@@ -1751,9 +1751,9 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,* Set appropriate bit thus could put phy into low power * mode if we have hostpc feature */ -fotg210_writel (fotg210, temp |PORT_SUSPEND , +fhcd2xx_writel (fhcd2xx, temp |PORT_SUSPEND , status_reg); -set_bit (wIndex, &fotg210->suspended_ports); +set_bit (wIndex, &fhcd2xx->suspended_ports);break ;case USB_PORT_FEAT_RESET :if (temp &PORT_RESUME )
@@ -1762,7 +1762,7 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,* which can be fine if this root hub has a * transaction translator built in. */ -fotg210_dbg (fotg210,"port %d reset\n" , wIndex +1 ); +fhcd2xx_dbg (fhcd2xx,"port %d reset\n" , wIndex +1 ); temp |=PORT_RESET ; temp &= ~PORT_PE ;
@@ -1770,9 +1770,9 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,* caller must wait, then call GetPortStatus * usb 2.0 spec says 50 ms resets on root */ - fotg210->reset_done[wIndex] = jiffies + fhcd2xx->reset_done[wIndex] = jiffies +msecs_to_jiffies (50 ); -fotg210_writel (fotg210, temp, status_reg); +fhcd2xx_writel (fhcd2xx, temp, status_reg);break ;/* For downstream facing ports (these): one hub port is put
@@ -1784,30 +1784,30 @@ static int fotg210_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,case USB_PORT_FEAT_TEST :if (!selector || selector >5 ) goto error; -spin_unlock_irqrestore (&fotg210->lock, flags); -fotg210_quiesce (fotg210); -spin_lock_irqsave (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags); +fhcd2xx_quiesce (fhcd2xx); +spin_lock_irqsave (&fhcd2xx->lock, flags);/* Put all enabled ports into suspend */ - temp =fotg210_readl (fotg210, status_reg) & + temp =fhcd2xx_readl (fhcd2xx, status_reg) & ~PORT_RWC_BITS ;if (temp &PORT_PE ) -fotg210_writel (fotg210, temp |PORT_SUSPEND , +fhcd2xx_writel (fhcd2xx, temp |PORT_SUSPEND , status_reg); -spin_unlock_irqrestore (&fotg210->lock, flags); -fotg210_halt (fotg210); -spin_lock_irqsave (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags); +fhcd2xx_halt (fhcd2xx); +spin_lock_irqsave (&fhcd2xx->lock, flags); - temp =fotg210_readl (fotg210, status_reg); + temp =fhcd2xx_readl (fhcd2xx, status_reg); temp |= selector <<16 ; -fotg210_writel (fotg210, temp, status_reg); +fhcd2xx_writel (fhcd2xx, temp, status_reg);break ;default : goto error; } -fotg210_readl (fotg210, &fotg210->regs->command); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command);break ;default :
@@ -1815,17 +1815,17 @@ error:/* "stall" on error */ retval = -EPIPE ; } -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);return retval; } -static void __maybe_unused fotg210_relinquish_port (struct usb_hcd *hcd, +static void __maybe_unused fhcd2xx_relinquish_port (struct usb_hcd *hcd,int portnum) {return ; } -static int __maybe_unused fotg210_port_handed_over (struct usb_hcd *hcd, +static int __maybe_unused fhcd2xx_port_handed_over (struct usb_hcd *hcd,int portnum) {return 0 ;
@@ -1843,61 +1843,61 @@ static int __maybe_unused fotg210_port_handed_over(struct usb_hcd *hcd,*/ /* Allocate the key transfer structures from the previously allocated pool */ -static inline void fotg210_qtd_init (struct fotg210_hcd *fotg210, -struct fotg210_qtd *qtd,dma_addr_t dma) +static inline void fhcd2xx_qtd_init (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qtd *qtd,dma_addr_t dma) {memset (qtd,0 ,sizeof (*qtd)); qtd->qtd_dma = dma; - qtd->hw_token =cpu_to_hc32 (fotg210,QTD_STS_HALT ); - qtd->hw_next =FOTG210_LIST_END (fotg210); - qtd->hw_alt_next =FOTG210_LIST_END (fotg210); + qtd->hw_token =cpu_to_hc32 (fhcd2xx,QTD_STS_HALT ); + qtd->hw_next =FHCD2XX_LIST_END (fhcd2xx); + qtd->hw_alt_next =FHCD2XX_LIST_END (fhcd2xx);INIT_LIST_HEAD (&qtd->qtd_list); } -static struct fotg210_qtd *fotg210_qtd_alloc (struct fotg210_hcd *fotg210, +static struct fhcd2xx_qtd *fhcd2xx_qtd_alloc (struct fhcd2xx_hcd *fhcd2xx,gfp_t flags) { -struct fotg210_qtd *qtd; +struct fhcd2xx_qtd *qtd;dma_addr_t dma; - qtd =dma_pool_alloc (fotg210->qtd_pool, flags, &dma); + qtd =dma_pool_alloc (fhcd2xx->qtd_pool, flags, &dma);if (qtd !=NULL ) -fotg210_qtd_init (fotg210, qtd, dma); +fhcd2xx_qtd_init (fhcd2xx, qtd, dma);return qtd; } -static inline void fotg210_qtd_free (struct fotg210_hcd *fotg210, -struct fotg210_qtd *qtd) +static inline void fhcd2xx_qtd_free (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qtd *qtd) { -dma_pool_free (fotg210->qtd_pool, qtd, qtd->qtd_dma); +dma_pool_free (fhcd2xx->qtd_pool, qtd, qtd->qtd_dma); } -static void qh_destroy (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static void qh_destroy (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh) {/* clean qtds first, and know this is not linked */ if (!list_empty (&qh->qtd_list) || qh->qh_next.ptr) { -fotg210_dbg (fotg210,"unused qh not empty!\n" ); +fhcd2xx_dbg (fhcd2xx,"unused qh not empty!\n" );BUG (); }if (qh->dummy) -fotg210_qtd_free (fotg210, qh->dummy); -dma_pool_free (fotg210->qh_pool, qh->hw, qh->qh_dma); +fhcd2xx_qtd_free (fhcd2xx, qh->dummy); +dma_pool_free (fhcd2xx->qh_pool, qh->hw, qh->qh_dma);kfree (qh); } -static struct fotg210_qh *fotg210_qh_alloc (struct fotg210_hcd *fotg210, +static struct fhcd2xx_qh *fhcd2xx_qh_alloc (struct fhcd2xx_hcd *fhcd2xx,gfp_t flags) { -struct fotg210_qh *qh; +struct fhcd2xx_qh *qh;dma_addr_t dma; qh =kzalloc (sizeof (*qh),GFP_ATOMIC );if (!qh) goto done; - qh->hw = (struct fotg210_qh_hw *) -dma_pool_alloc (fotg210->qh_pool, flags, &dma); + qh->hw = (struct fhcd2xx_qh_hw *) +dma_pool_alloc (fhcd2xx->qh_pool, flags, &dma);if (!qh->hw) goto fail;memset (qh->hw,0 ,sizeof (*qh->hw));
@@ -1905,15 +1905,15 @@ static struct fotg210_qh *fotg210_qh_alloc(struct fotg210_hcd *fotg210,INIT_LIST_HEAD (&qh->qtd_list);/* dummy td enables safe urb queuing */ - qh->dummy =fotg210_qtd_alloc (fotg210, flags); + qh->dummy =fhcd2xx_qtd_alloc (fhcd2xx, flags);if (qh->dummy ==NULL ) { -fotg210_dbg (fotg210,"no dummy td\n" ); +fhcd2xx_dbg (fhcd2xx,"no dummy td\n" ); goto fail1; } done:return qh; fail1: -dma_pool_free (fotg210->qh_pool, qh->hw, qh->qh_dma); +dma_pool_free (fhcd2xx->qh_pool, qh->hw, qh->qh_dma); fail:kfree (qh);return NULL ;
@@ -1924,93 +1924,93 @@ fail:* This is the initialisation and cleanup code. */ -static void fotg210_mem_cleanup (struct fotg210_hcd *fotg210) +static void fhcd2xx_mem_cleanup (struct fhcd2xx_hcd *fhcd2xx) { -if (fotg210->async) -qh_destroy (fotg210, fotg210->async); - fotg210->async =NULL ; +if (fhcd2xx->async) +qh_destroy (fhcd2xx, fhcd2xx->async); + fhcd2xx->async =NULL ; -if (fotg210->dummy) -qh_destroy (fotg210, fotg210->dummy); - fotg210->dummy =NULL ; +if (fhcd2xx->dummy) +qh_destroy (fhcd2xx, fhcd2xx->dummy); + fhcd2xx->dummy =NULL ;/* DMA consistent memory and pools */ -dma_pool_destroy (fotg210->qtd_pool); - fotg210->qtd_pool =NULL ; +dma_pool_destroy (fhcd2xx->qtd_pool); + fhcd2xx->qtd_pool =NULL ; -dma_pool_destroy (fotg210->qh_pool); - fotg210->qh_pool =NULL ; +dma_pool_destroy (fhcd2xx->qh_pool); + fhcd2xx->qh_pool =NULL ; -dma_pool_destroy (fotg210->itd_pool); - fotg210->itd_pool =NULL ; +dma_pool_destroy (fhcd2xx->itd_pool); + fhcd2xx->itd_pool =NULL ; -if (fotg210->periodic) -dma_free_coherent (fotg210_to_hcd (fotg210)->self.controller, - fotg210->periodic_size *sizeof (u32), - fotg210->periodic, fotg210->periodic_dma); - fotg210->periodic =NULL ; +if (fhcd2xx->periodic) +dma_free_coherent (fhcd2xx_to_hcd (fhcd2xx)->self.controller, + fhcd2xx->periodic_size *sizeof (u32), + fhcd2xx->periodic, fhcd2xx->periodic_dma); + fhcd2xx->periodic =NULL ;/* shadow periodic table */ -kfree (fotg210->pshadow); - fotg210->pshadow =NULL ; +kfree (fhcd2xx->pshadow); + fhcd2xx->pshadow =NULL ; }/* remember to add cleanup code (above) if you add anything here */ -static int fotg210_mem_init (struct fotg210_hcd *fotg210,gfp_t flags) +static int fhcd2xx_mem_init (struct fhcd2xx_hcd *fhcd2xx,gfp_t flags) {int i;/* QTDs for control/bulk/intr transfers */ - fotg210->qtd_pool =dma_pool_create ("fotg210_qtd" , -fotg210_to_hcd (fotg210)->self.controller, -sizeof (struct fotg210_qtd ), + fhcd2xx->qtd_pool =dma_pool_create ("fhcd2xx_qtd" , +fhcd2xx_to_hcd (fhcd2xx)->self.controller, +sizeof (struct fhcd2xx_qtd ),32 /* byte alignment (for hw parts) */ ,4096 /* can't cross 4K */ ); -if (!fotg210->qtd_pool) +if (!fhcd2xx->qtd_pool) goto fail;/* QHs for control/bulk/intr transfers */ - fotg210->qh_pool =dma_pool_create ("fotg210_qh" , -fotg210_to_hcd (fotg210)->self.controller, -sizeof (struct fotg210_qh_hw ), + fhcd2xx->qh_pool =dma_pool_create ("fhcd2xx_qh" , +fhcd2xx_to_hcd (fhcd2xx)->self.controller, +sizeof (struct fhcd2xx_qh_hw ),32 /* byte alignment (for hw parts) */ ,4096 /* can't cross 4K */ ); -if (!fotg210->qh_pool) +if (!fhcd2xx->qh_pool) goto fail; - fotg210->async =fotg210_qh_alloc (fotg210, flags); -if (!fotg210->async) + fhcd2xx->async =fhcd2xx_qh_alloc (fhcd2xx, flags); +if (!fhcd2xx->async) goto fail;/* ITD for high speed ISO transfers */ - fotg210->itd_pool =dma_pool_create ("fotg210_itd" , -fotg210_to_hcd (fotg210)->self.controller, -sizeof (struct fotg210_itd ), + fhcd2xx->itd_pool =dma_pool_create ("fhcd2xx_itd" , +fhcd2xx_to_hcd (fhcd2xx)->self.controller, +sizeof (struct fhcd2xx_itd ),64 /* byte alignment (for hw parts) */ ,4096 /* can't cross 4K */ ); -if (!fotg210->itd_pool) +if (!fhcd2xx->itd_pool) goto fail;/* Hardware periodic table */ - fotg210->periodic = (__le32 *) -dma_alloc_coherent (fotg210_to_hcd (fotg210)->self.controller, - fotg210->periodic_size *sizeof (__le32), - &fotg210->periodic_dma,0 ); -if (fotg210->periodic ==NULL ) + fhcd2xx->periodic = (__le32 *) +dma_alloc_coherent (fhcd2xx_to_hcd (fhcd2xx)->self.controller, + fhcd2xx->periodic_size *sizeof (__le32), + &fhcd2xx->periodic_dma,0 ); +if (fhcd2xx->periodic ==NULL ) goto fail; -for (i =0 ; i < fotg210->periodic_size; i++) - fotg210->periodic[i] =FOTG210_LIST_END (fotg210); +for (i =0 ; i < fhcd2xx->periodic_size; i++) + fhcd2xx->periodic[i] =FHCD2XX_LIST_END (fhcd2xx);/* software shadow of hardware table */ - fotg210->pshadow =kcalloc (fotg210->periodic_size,sizeof (void *), + fhcd2xx->pshadow =kcalloc (fhcd2xx->periodic_size,sizeof (void *), flags); -if (fotg210->pshadow !=NULL ) +if (fhcd2xx->pshadow !=NULL )return 0 ; fail: -fotg210_dbg (fotg210,"couldn't init memory\n" ); -fotg210_mem_cleanup (fotg210); +fhcd2xx_dbg (fhcd2xx,"couldn't init memory\n" ); +fhcd2xx_mem_cleanup (fhcd2xx);return -ENOMEM ; }/*
@@ -2032,15 +2032,15 @@ fail:*/ /* fill a qtd, returning how much of the buffer we were able to queue up */ -static int qtd_fill (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd, +static int qtd_fill (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qtd *qtd,dma_addr_t buf,size_t len,int token,int maxpacket) {int i, count;u64 addr = buf;/* one buffer entry per 4K ... first might be short or unaligned */ - qtd->hw_buf[0 ] =cpu_to_hc32 (fotg210, (u32 )addr); - qtd->hw_buf_hi[0 ] =cpu_to_hc32 (fotg210, (u32)(addr >>32 )); + qtd->hw_buf[0 ] =cpu_to_hc32 (fhcd2xx, (u32 )addr); + qtd->hw_buf_hi[0 ] =cpu_to_hc32 (fhcd2xx, (u32)(addr >>32 )); count =0x1000 - (buf &0x0fff );/* rest of that page */ if (likely (len < count))/* ... iff needed */ count = len;
@@ -2051,8 +2051,8 @@ static int qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd,/* per-qtd limit: from 16K to 20K (best alignment) */ for (i =1 ; count < len && i <5 ; i++) { addr = buf; - qtd->hw_buf[i] =cpu_to_hc32 (fotg210, (u32 )addr); - qtd->hw_buf_hi[i] =cpu_to_hc32 (fotg210, + qtd->hw_buf[i] =cpu_to_hc32 (fhcd2xx, (u32 )addr); + qtd->hw_buf_hi[i] =cpu_to_hc32 (fhcd2xx, (u32)(addr >>32 )); buf +=0x1000 ;if ((count +0x1000 ) < len)
@@ -2065,56 +2065,56 @@ static int qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd,if (count != len) count -= (count % maxpacket); } - qtd->hw_token =cpu_to_hc32 (fotg210, (count <<16 ) | token); + qtd->hw_token =cpu_to_hc32 (fhcd2xx, (count <<16 ) | token); qtd->length = count;return count; } -static inline void qh_update (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh, -struct fotg210_qtd *qtd) +static inline void qh_update (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh *qh, +struct fhcd2xx_qtd *qtd) { -struct fotg210_qh_hw *hw = qh->hw; +struct fhcd2xx_qh_hw *hw = qh->hw;/* writes to an active overlay are unsafe */ BUG_ON (qh->qh_state !=QH_STATE_IDLE ); - hw->hw_qtd_next =QTD_NEXT (fotg210, qtd->qtd_dma); - hw->hw_alt_next =FOTG210_LIST_END (fotg210); + hw->hw_qtd_next =QTD_NEXT (fhcd2xx, qtd->qtd_dma); + hw->hw_alt_next =FHCD2XX_LIST_END (fhcd2xx);/* Except for control endpoints, we make hardware maintain data * toggle (like OHCI) ... here (re)initialize the toggle in the QH, * and set the pseudo-toggle in udev. Only usb_clear_halt() will * ever clear it. */ -if (!(hw->hw_info1 &cpu_to_hc32 (fotg210,QH_TOGGLE_CTL ))) { +if (!(hw->hw_info1 &cpu_to_hc32 (fhcd2xx,QH_TOGGLE_CTL ))) {unsigned is_out, epnum; is_out = qh->is_out; - epnum = (hc32_to_cpup (fotg210, &hw->hw_info1) >>8 ) &0x0f ; + epnum = (hc32_to_cpup (fhcd2xx, &hw->hw_info1) >>8 ) &0x0f ;if (unlikely (!usb_gettoggle (qh->dev, epnum, is_out))) { - hw->hw_token &= ~cpu_to_hc32 (fotg210,QTD_TOGGLE ); + hw->hw_token &= ~cpu_to_hc32 (fhcd2xx,QTD_TOGGLE );usb_settoggle (qh->dev, epnum, is_out,1 ); } } - hw->hw_token &=cpu_to_hc32 (fotg210,QTD_TOGGLE |QTD_STS_PING ); + hw->hw_token &=cpu_to_hc32 (fhcd2xx,QTD_TOGGLE |QTD_STS_PING ); }/* if it weren't for a common silicon quirk (writing the dummy into the qh * overlay, so qh->hw_token wrongly becomes inactive/halted), only fault * recovery (including urb dequeue) would need software changes to a QH... */ -static void qh_refresh (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static void qh_refresh (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh) { -struct fotg210_qtd *qtd; +struct fhcd2xx_qtd *qtd;if (list_empty (&qh->qtd_list)) qtd = qh->dummy;else { qtd =list_entry (qh->qtd_list.next, - struct fotg210_qtd, qtd_list); + struct fhcd2xx_qtd, qtd_list);/* * first qtd may already be partially processed. * If we come here during unlink, the QH overlay region
@@ -2122,35 +2122,35 @@ static void qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* qtd is updated in qh_completions(). Update the QH * overlay here. */ -if (cpu_to_hc32 (fotg210, qtd->qtd_dma) == qh->hw->hw_current) { +if (cpu_to_hc32 (fhcd2xx, qtd->qtd_dma) == qh->hw->hw_current) { qh->hw->hw_qtd_next = qtd->hw_next; qtd =NULL ; } }if (qtd) -qh_update (fotg210, qh, qtd); +qh_update (fhcd2xx, qh, qtd); } -static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); +static void qh_link_async (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh); -static void fotg210_clear_tt_buffer_complete (struct usb_hcd *hcd, +static void fhcd2xx_clear_tt_buffer_complete (struct usb_hcd *hcd,struct usb_host_endpoint *ep) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct fotg210_qh *qh = ep->hcpriv; +struct fhcd2xx_hcd *fhcd2xx =hcd_to_fhcd2xx (hcd); +struct fhcd2xx_qh *qh = ep->hcpriv;unsigned long flags; -spin_lock_irqsave (&fotg210->lock, flags); +spin_lock_irqsave (&fhcd2xx->lock, flags); qh->clearing_tt =0 ;if (qh->qh_state ==QH_STATE_IDLE && !list_empty (&qh->qtd_list) - && fotg210->rh_state ==FOTG210_RH_RUNNING ) -qh_link_async (fotg210, qh); -spin_unlock_irqrestore (&fotg210->lock, flags); + && fhcd2xx->rh_state ==FHCD2XX_RH_RUNNING ) +qh_link_async (fhcd2xx, qh); +spin_unlock_irqrestore (&fhcd2xx->lock, flags); } -static void fotg210_clear_tt_buffer (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh, +static void fhcd2xx_clear_tt_buffer (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh *qh,struct urb *urb,u32 token) {
@@ -2169,14 +2169,14 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, usb_pipeendpoint(urb->pipe), token);if (urb->dev->tt->hub != -fotg210_to_hcd (fotg210)->self.root_hub) { +fhcd2xx_to_hcd (fhcd2xx)->self.root_hub) {if (usb_hub_clear_tt_buffer (urb) ==0 ) qh->clearing_tt =1 ; } } } -static int qtd_copy_status (struct fotg210_hcd *fotg210,struct urb *urb, +static int qtd_copy_status (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,size_t length,u32 token) {int status = -EINPROGRESS ;
@@ -2215,7 +2215,7 @@ static int qtd_copy_status(struct fotg210_hcd *fotg210, struct urb *urb, : -ECOMM; /* hc couldn't write data */ }else if (token &QTD_STS_XACT ) {/* timeout, bad CRC, wrong PID, etc */ -fotg210_dbg (fotg210,"devpath %s ep%d%s 3strikes\n" , +fhcd2xx_dbg (fhcd2xx,"devpath %s ep%d%s 3strikes\n" , urb->dev->devpath,usb_pipeendpoint (urb->pipe),usb_pipein (urb->pipe) ?"in" :"out" );
@@ -2224,7 +2224,7 @@ static int qtd_copy_status(struct fotg210_hcd *fotg210, struct urb *urb, status = -EPROTO ; } - fotg210_dbg(fotg210, + fhcd2xx_dbg(fhcd2xx, "dev%d ep%d%s qtd token %08x --> status %d\n", usb_pipedevice(urb->pipe), usb_pipeendpoint(urb->pipe),
@@ -2235,33 +2235,33 @@ static int qtd_copy_status(struct fotg210_hcd *fotg210, struct urb *urb,return status; } -static void fotg210_urb_done (struct fotg210_hcd *fotg210,struct urb *urb, +static void fhcd2xx_urb_done (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,int status) -__releases(fotg210->lock) -__acquires(fotg210->lock) +__releases(fhcd2xx->lock) +__acquires(fhcd2xx->lock) {if (likely (urb->hcpriv !=NULL )) { -struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv; +struct fhcd2xx_qh *qh = (struct fhcd2xx_qh *) urb->hcpriv;/* S-mask in a QH means it's an interrupt urb */ -if ((qh->hw->hw_info2 &cpu_to_hc32 (fotg210,QH_SMASK )) !=0 ) { +if ((qh->hw->hw_info2 &cpu_to_hc32 (fhcd2xx,QH_SMASK )) !=0 ) {/* ... update hc-wide periodic stats (for usbfs) */ -fotg210_to_hcd (fotg210)->self.bandwidth_int_reqs--; +fhcd2xx_to_hcd (fhcd2xx)->self.bandwidth_int_reqs--; } }if (unlikely (urb->unlinked)) { -COUNT (fotg210->stats.unlink); +COUNT (fhcd2xx->stats.unlink); }else {/* report non-error and short read status as zero */ if (status == -EINPROGRESS || status == -EREMOTEIO ) status =0 ; -COUNT (fotg210->stats.complete); +COUNT (fhcd2xx->stats.complete); } -#ifdef FOTG210_URB_TRACE - fotg210_dbg(fotg210, +#ifdef FHCD2XX_URB_TRACE + fhcd2xx_dbg(fhcd2xx, "%s %s urb %p ep%d%s status %d len %d/%d\n", __func__, urb->dev->devpath, urb, usb_pipeendpoint(urb->pipe),
@@ -2271,29 +2271,29 @@ __acquires(fotg210->lock)#endif /* complete() can reenter this HCD */ -usb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210), urb); -spin_unlock (&fotg210->lock); -usb_hcd_giveback_urb (fotg210_to_hcd (fotg210), urb, status); -spin_lock (&fotg210->lock); +usb_hcd_unlink_urb_from_ep (fhcd2xx_to_hcd (fhcd2xx), urb); +spin_unlock (&fhcd2xx->lock); +usb_hcd_giveback_urb (fhcd2xx_to_hcd (fhcd2xx), urb, status); +spin_lock (&fhcd2xx->lock); } -static int qh_schedule (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); +static int qh_schedule (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh);/* * Process and free completed qtds for a qh, returning URBs to drivers. * Chases up to qh->hw_current. Returns number of completions called, * indicating how much "real" work we did. */ -static unsigned qh_completions (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +static unsigned qh_completions (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh *qh) { -struct fotg210_qtd *last, *end = qh->dummy; +struct fhcd2xx_qtd *last, *end = qh->dummy;struct list_head *entry, *tmp;int last_status;int stopped;unsigned count =0 ;u8 state; -struct fotg210_qh_hw *hw = qh->hw; +struct fhcd2xx_qh_hw *hw = qh->hw;if (unlikely (list_empty (&qh->qtd_list)))return count;
@@ -2323,22 +2323,22 @@ rescan:* if queue is stopped, handles unlinks. */ list_for_each_safe (entry, tmp, &qh->qtd_list) { -struct fotg210_qtd *qtd; +struct fhcd2xx_qtd *qtd;struct urb *urb;u32 token =0 ; - qtd = list_entry(entry, struct fotg210_qtd, qtd_list); + qtd = list_entry(entry, struct fhcd2xx_qtd, qtd_list); urb = qtd->urb;/* clean up any state from previous QTD ...*/ if (last) {if (likely (last->urb != urb)) { -fotg210_urb_done (fotg210, last->urb, +fhcd2xx_urb_done (fhcd2xx, last->urb, last_status); count++; last_status = -EINPROGRESS ; } -fotg210_qtd_free (fotg210, last); +fhcd2xx_qtd_free (fhcd2xx, last); last =NULL ; }
@@ -2348,7 +2348,7 @@ rescan:/* hardware copies qtd out of qh overlay */ rmb (); - token =hc32_to_cpu (fotg210, qtd->hw_token); + token =hc32_to_cpu (fhcd2xx, qtd->hw_token);/* always clean up qtds the hc de-activated */ retry_xacterr:
@@ -2356,7 +2356,7 @@ retry_xacterr:/* Report Data Buffer Error: non-fatal but useful */ if (token &QTD_STS_DBE ) - fotg210_dbg(fotg210, + fhcd2xx_dbg(fhcd2xx, "detected DataBufferErr for urb %p ep%d%s len %d, qtd %p [qh %p]\n", urb, usb_endpoint_num(&urb->ep->desc),
@@ -2378,7 +2378,7 @@ retry_xacterr: QTD_CERR(token) == 0 && ++qh->xacterrs < QH_XACTERR_MAX && !urb->unlinked) { -fotg210_dbg (fotg210, +fhcd2xx_dbg (fhcd2xx,"detected XactErr len %zu/%zu retry %d\n" , qtd->length -QTD_LENGTH (token), qtd->length, qh->xacterrs);
@@ -2389,11 +2389,11 @@ retry_xacterr:*/ token &= ~QTD_STS_HALT ; token |=QTD_STS_ACTIVE | - (FOTG210_TUNE_CERR <<10 ); - qtd->hw_token =cpu_to_hc32 (fotg210, + (FHCD2XX_TUNE_CERR <<10 ); + qtd->hw_token =cpu_to_hc32 (fhcd2xx, token);wmb (); - hw->hw_token =cpu_to_hc32 (fotg210, + hw->hw_token =cpu_to_hc32 (fhcd2xx, token); goto retry_xacterr; }
@@ -2410,13 +2410,13 @@ retry_xacterr:*/ }else if (IS_SHORT_READ (token) && !(qtd->hw_alt_next - &FOTG210_LIST_END (fotg210))) { + &FHCD2XX_LIST_END (fhcd2xx))) { stopped =1 ; }/* stop scanning when we reach qtds the hc is using */ }else if (likely (!stopped - && fotg210->rh_state >=FOTG210_RH_RUNNING )) { + && fhcd2xx->rh_state >=FHCD2XX_RH_RUNNING )) {break ;/* scan the whole queue for unlinks whenever it stops */
@@ -2424,7 +2424,7 @@ retry_xacterr: stopped =1 ;/* cancel everything if we halt, suspend, etc */ -if (fotg210->rh_state <FOTG210_RH_RUNNING ) +if (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING ) last_status = -ESHUTDOWN ;/* this qtd is active; skip it unless a previous qtd
@@ -2435,15 +2435,15 @@ retry_xacterr:/* qh unlinked; token in overlay may be most current */ if (state ==QH_STATE_IDLE - &&cpu_to_hc32 (fotg210, qtd->qtd_dma) + &&cpu_to_hc32 (fhcd2xx, qtd->qtd_dma) == hw->hw_current) { - token =hc32_to_cpu (fotg210, hw->hw_token); + token =hc32_to_cpu (fhcd2xx, hw->hw_token);/* An unlink may leave an incomplete * async transaction in the TT buffer. * We have to clear it. */ -fotg210_clear_tt_buffer (fotg210, qh, urb, +fhcd2xx_clear_tt_buffer (fhcd2xx, qh, urb, token); } }
@@ -2456,11 +2456,11 @@ retry_xacterr:* short read the second must be removed by hand. */ if (last_status == -EINPROGRESS ) { - last_status =qtd_copy_status (fotg210, urb, + last_status =qtd_copy_status (fhcd2xx, urb, qtd->length, token);if (last_status == -EREMOTEIO && (qtd->hw_alt_next - &FOTG210_LIST_END (fotg210))) + &FHCD2XX_LIST_END (fhcd2xx))) last_status = -EINPROGRESS ;/* As part of low/full-speed endpoint-halt processing
@@ -2478,7 +2478,7 @@ retry_xacterr:* is a violation of the spec. */ if (last_status != -EPIPE ) -fotg210_clear_tt_buffer (fotg210, qh, +fhcd2xx_clear_tt_buffer (fhcd2xx, qh, urb, token); } }
@@ -2488,7 +2488,7 @@ retry_xacterr:*/ if (stopped && qtd->qtd_list.prev != &qh->qtd_list) { last =list_entry (qtd->qtd_list.prev, - struct fotg210_qtd, qtd_list); + struct fhcd2xx_qtd, qtd_list); last->hw_next = qtd->hw_next; }
@@ -2502,9 +2502,9 @@ retry_xacterr:/* last urb's completion might still need calling */ if (likely (last !=NULL )) { -fotg210_urb_done (fotg210, last->urb, last_status); +fhcd2xx_urb_done (fhcd2xx, last->urb, last_status); count++; -fotg210_qtd_free (fotg210, last); +fhcd2xx_qtd_free (fhcd2xx, last); }/* Do we need to rescan for URBs dequeued during a giveback? */
@@ -2529,10 +2529,10 @@ retry_xacterr:* it after fault cleanup, or recovering from silicon wrongly * overlaying the dummy qtd (which reduces DMA chatter). */ -if (stopped !=0 || hw->hw_qtd_next ==FOTG210_LIST_END (fotg210)) { +if (stopped !=0 || hw->hw_qtd_next ==FHCD2XX_LIST_END (fhcd2xx)) {switch (state) {case QH_STATE_IDLE : -qh_refresh (fotg210, qh); +qh_refresh (fhcd2xx, qh);break ;case QH_STATE_LINKED :/* We won't refresh a QH that's linked (after the HC
@@ -2566,29 +2566,29 @@ retry_xacterr:* reverse of qh_urb_transaction: free a list of TDs. * used for cleanup after errors, before HC sees an URB's TDs. */ -static void qtd_list_free (struct fotg210_hcd *fotg210,struct urb *urb, +static void qtd_list_free (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,struct list_head *qtd_list) {struct list_head *entry, *temp;list_for_each_safe (entry, temp, qtd_list) { -struct fotg210_qtd *qtd; +struct fhcd2xx_qtd *qtd; - qtd = list_entry(entry, struct fotg210_qtd, qtd_list); + qtd = list_entry(entry, struct fhcd2xx_qtd, qtd_list);list_del (&qtd->qtd_list); -fotg210_qtd_free (fotg210, qtd); +fhcd2xx_qtd_free (fhcd2xx, qtd); } }/* * create a list of filled qtds for this URB; won't link into qh. */ -static struct list_head *qh_urb_transaction (struct fotg210_hcd *fotg210, +static struct list_head *qh_urb_transaction (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,struct list_head *head,gfp_t flags) { -struct fotg210_qtd *qtd, *qtd_prev; +struct fhcd2xx_qtd *qtd, *qtd_prev;dma_addr_t buf;int len, this_sg_len, maxpacket;int is_input;
@@ -2599,32 +2599,32 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,/* * URBs map to sequences of QTDs: one logical transaction */ - qtd =fotg210_qtd_alloc (fotg210, flags); + qtd =fhcd2xx_qtd_alloc (fhcd2xx, flags);if (unlikely (!qtd))return NULL ;list_add_tail (&qtd->qtd_list, head); qtd->urb = urb; token =QTD_STS_ACTIVE ; - token |= (FOTG210_TUNE_CERR <<10 ); + token |= (FHCD2XX_TUNE_CERR <<10 );/* for split transactions, SplitXState initialized to zero */ len = urb->transfer_buffer_length; is_input =usb_pipein (urb->pipe);if (usb_pipecontrol (urb->pipe)) {/* SETUP pid */ -qtd_fill (fotg210, qtd, urb->setup_dma, +qtd_fill (fhcd2xx, qtd, urb->setup_dma,sizeof (struct usb_ctrlrequest ), token | (2 /* "setup" */ <<8 ),8 );/* ... and always at least one more pid */ token ^=QTD_TOGGLE ; qtd_prev = qtd; - qtd =fotg210_qtd_alloc (fotg210, flags); + qtd =fhcd2xx_qtd_alloc (fhcd2xx, flags);if (unlikely (!qtd)) goto cleanup; qtd->urb = urb; - qtd_prev->hw_next =QTD_NEXT (fotg210, qtd->qtd_dma); + qtd_prev->hw_next =QTD_NEXT (fhcd2xx, qtd->qtd_dma);list_add_tail (&qtd->qtd_list, head);/* for zero length DATA stages, STATUS is always IN */
@@ -2664,7 +2664,7 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,for (;;) {int this_qtd_len; - this_qtd_len =qtd_fill (fotg210, qtd, buf, this_sg_len, token, + this_qtd_len =qtd_fill (fhcd2xx, qtd, buf, this_sg_len, token, maxpacket); this_sg_len -= this_qtd_len; len -= this_qtd_len;
@@ -2676,7 +2676,7 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,* (this will usually be overridden later.) */ if (is_input) - qtd->hw_alt_next = fotg210->async->hw->hw_alt_next; + qtd->hw_alt_next = fhcd2xx->async->hw->hw_alt_next;/* qh makes control packets use qtd toggle; maybe switch it */ if ((maxpacket & (this_qtd_len + (maxpacket -1 ))) ==0 )
@@ -2691,11 +2691,11 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210, } qtd_prev = qtd; - qtd =fotg210_qtd_alloc (fotg210, flags); + qtd =fhcd2xx_qtd_alloc (fhcd2xx, flags);if (unlikely (!qtd)) goto cleanup; qtd->urb = urb; - qtd_prev->hw_next =QTD_NEXT (fotg210, qtd->qtd_dma); + qtd_prev->hw_next =QTD_NEXT (fhcd2xx, qtd->qtd_dma);list_add_tail (&qtd->qtd_list, head); }
@@ -2706,7 +2706,7 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210,*/ if (likely ((urb->transfer_flags &URB_SHORT_NOT_OK ) ==0 ||usb_pipecontrol (urb->pipe))) - qtd->hw_alt_next =FOTG210_LIST_END (fotg210); + qtd->hw_alt_next =FHCD2XX_LIST_END (fhcd2xx);/* * control requests may need a terminating data "status" ack;
@@ -2727,25 +2727,25 @@ static struct list_head *qh_urb_transaction(struct fotg210_hcd *fotg210, }if (one_more) { qtd_prev = qtd; - qtd =fotg210_qtd_alloc (fotg210, flags); + qtd =fhcd2xx_qtd_alloc (fhcd2xx, flags);if (unlikely (!qtd)) goto cleanup; qtd->urb = urb; - qtd_prev->hw_next =QTD_NEXT (fotg210, qtd->qtd_dma); + qtd_prev->hw_next =QTD_NEXT (fhcd2xx, qtd->qtd_dma);list_add_tail (&qtd->qtd_list, head);/* never any data in such packets */ -qtd_fill (fotg210, qtd,0 ,0 , token,0 ); +qtd_fill (fhcd2xx, qtd,0 ,0 , token,0 ); } }/* by default, enable interrupt on urb completion */ if (likely (!(urb->transfer_flags &URB_NO_INTERRUPT ))) - qtd->hw_token |=cpu_to_hc32 (fotg210,QTD_IOC ); + qtd->hw_token |=cpu_to_hc32 (fhcd2xx,QTD_IOC );return head; cleanup: -qtd_list_free (fotg210, urb, head); +qtd_list_free (fhcd2xx, urb, head);return NULL ; }
@@ -2766,15 +2766,15 @@ cleanup:* just one microframe in the s-mask. For split interrupt transactions * there are additional complications: c-mask, maybe FSTNs. */ -static struct fotg210_qh *qh_make (struct fotg210_hcd *fotg210,struct urb *urb, +static struct fhcd2xx_qh *qh_make (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,gfp_t flags) { -struct fotg210_qh *qh =fotg210_qh_alloc (fotg210, flags); +struct fhcd2xx_qh *qh =fhcd2xx_qh_alloc (fhcd2xx, flags);u32 info1 =0 , info2 =0 ;int is_input, type;int maxp =0 ;struct usb_tt *tt = urb->dev->tt; -struct fotg210_qh_hw *hw; +struct fhcd2xx_qh_hw *hw;if (!qh)return qh;
@@ -2793,7 +2793,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,* acts like up to 3KB, but is built from smaller packets. */ if (max_packet (maxp) >1024 ) { -fotg210_dbg (fotg210,"bogus qh maxpacket %d\n" , +fhcd2xx_dbg (fhcd2xx,"bogus qh maxpacket %d\n" ,max_packet (maxp)); goto done; }
@@ -2823,8 +2823,8 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,* includes high bandwidth. */ urb->interval =1 ; - }else if (qh->period > fotg210->periodic_size) { - qh->period = fotg210->periodic_size; + }else if (qh->period > fhcd2xx->periodic_size) { + qh->period = fhcd2xx->periodic_size; urb->interval = qh->period <<3 ; } }else {
@@ -2848,8 +2848,8 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,usb_calc_bus_time (urb->dev->speed, is_input, 0, max_packet(maxp))); qh->period = urb->interval; -if (qh->period > fotg210->periodic_size) { - qh->period = fotg210->periodic_size; +if (qh->period > fhcd2xx->periodic_size) { + qh->period = fhcd2xx->periodic_size; urb->interval = qh->period; } }
@@ -2867,19 +2867,19 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,case USB_SPEED_FULL :/* EPS 0 means "full" */ if (type !=PIPE_INTERRUPT ) - info1 |= (FOTG210_TUNE_RL_TT <<28 ); + info1 |= (FHCD2XX_TUNE_RL_TT <<28 );if (type ==PIPE_CONTROL ) { info1 |=QH_CONTROL_EP ;/* for TT */ info1 |=QH_TOGGLE_CTL ;/* toggle from qtd */ } info1 |= maxp <<16 ; - info2 |= (FOTG210_TUNE_MULT_TT <<30 ); + info2 |= (FHCD2XX_TUNE_MULT_TT <<30 );/* Some Freescale processors have an erratum in which the * port number in the queue head was 0..N-1 instead of 1..N. */ -if (fotg210_has_fsl_portno_bug (fotg210)) +if (fhcd2xx_has_fsl_portno_bug (fhcd2xx)) info2 |= (urb->dev->ttport-1 ) <<23 ;else info2 |= urb->dev->ttport <<23 ;
@@ -2887,7 +2887,7 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,/* set the address of the TT; for TDI's integrated * root hub tt, leave it zeroed. */ -if (tt && tt->hub !=fotg210_to_hcd (fotg210)->self.root_hub) +if (tt && tt->hub !=fhcd2xx_to_hcd (fhcd2xx)->self.root_hub) info2 |= tt->hub->devnum <<16 ;/* NOTE: if (PIPE_INTERRUPT) { scheduler sets c-mask } */
@@ -2897,12 +2897,12 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,case USB_SPEED_HIGH :/* no TT involved */ info1 |=QH_HIGH_SPEED ;if (type ==PIPE_CONTROL ) { - info1 |= (FOTG210_TUNE_RL_HS <<28 ); + info1 |= (FHCD2XX_TUNE_RL_HS <<28 ); info1 |=64 <<16 ;/* usb2 fixed maxpacket */ info1 |=QH_TOGGLE_CTL ;/* toggle from qtd */ - info2 |= (FOTG210_TUNE_MULT_HS <<30 ); + info2 |= (FHCD2XX_TUNE_MULT_HS <<30 ); }else if (type ==PIPE_BULK ) { - info1 |= (FOTG210_TUNE_RL_HS <<28 ); + info1 |= (FHCD2XX_TUNE_RL_HS <<28 );/* The USB spec says that high speed bulk endpoints * always use 512 byte maxpacket. But some device * vendors decided to ignore that, and MSFT is happy
@@ -2910,17 +2910,17 @@ static struct fotg210_qh *qh_make(struct fotg210_hcd *fotg210, struct urb *urb,* such nonconformant devices with Linux too; sigh. */ info1 |=max_packet (maxp) <<16 ; - info2 |= (FOTG210_TUNE_MULT_HS <<30 ); + info2 |= (FHCD2XX_TUNE_MULT_HS <<30 ); }else {/* PIPE_INTERRUPT */ info1 |=max_packet (maxp) <<16 ; info2 |=hb_mult (maxp) <<30 ; }break ;default : -fotg210_dbg (fotg210,"bogus dev %p speed %d\n" , urb->dev, +fhcd2xx_dbg (fhcd2xx,"bogus dev %p speed %d\n" , urb->dev, urb->dev->speed); done: -qh_destroy (fotg210, qh); +qh_destroy (fhcd2xx, qh);return NULL ; }
@@ -2929,45 +2929,45 @@ done:/* init as live, toggle clear, advance to dummy */ qh->qh_state =QH_STATE_IDLE ; hw = qh->hw; - hw->hw_info1 =cpu_to_hc32 (fotg210, info1); - hw->hw_info2 =cpu_to_hc32 (fotg210, info2); + hw->hw_info1 =cpu_to_hc32 (fhcd2xx, info1); + hw->hw_info2 =cpu_to_hc32 (fhcd2xx, info2); qh->is_out = !is_input;usb_settoggle (urb->dev,usb_pipeendpoint (urb->pipe), !is_input,1 ); -qh_refresh (fotg210, qh); +qh_refresh (fhcd2xx, qh);return qh; } -static void enable_async (struct fotg210_hcd *fotg210) +static void enable_async (struct fhcd2xx_hcd *fhcd2xx) { -if (fotg210->async_count++) +if (fhcd2xx->async_count++)return ;/* Stop waiting to turn off the async schedule */ - fotg210->enabled_hrtimer_events &= ~BIT (FOTG210_HRTIMER_DISABLE_ASYNC ); + fhcd2xx->enabled_hrtimer_events &= ~BIT (FHCD2XX_HRTIMER_DISABLE_ASYNC );/* Don't start the schedule until ASS is 0 */ -fotg210_poll_ASS (fotg210); -turn_on_io_watchdog (fotg210); +fhcd2xx_poll_ASS (fhcd2xx); +turn_on_io_watchdog (fhcd2xx); } -static void disable_async (struct fotg210_hcd *fotg210) +static void disable_async (struct fhcd2xx_hcd *fhcd2xx) { -if (--fotg210->async_count) +if (--fhcd2xx->async_count)return ;/* The async schedule and async_unlink list are supposed to be empty */ -WARN_ON (fotg210->async->qh_next.qh || fotg210->async_unlink); +WARN_ON (fhcd2xx->async->qh_next.qh || fhcd2xx->async_unlink);/* Don't turn off the schedule until ASS is 1 */ -fotg210_poll_ASS (fotg210); +fhcd2xx_poll_ASS (fhcd2xx); }/* move qh (and its qtds) onto async queue; maybe enable queue. */ -static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static void qh_link_async (struct fhcd2xx_hcd *fhcd2xx,struct fhcd2xx_qh *qh) { -__hc32 dma =QH_NEXT (fotg210, qh->qh_dma); -struct fotg210_qh *head; +__hc32 dma =QH_NEXT (fhcd2xx, qh->qh_dma); +struct fhcd2xx_qh *head;/* Don't link a QH if there's a Clear-TT-Buffer pending */ if (unlikely (qh->clearing_tt))
@@ -2976,10 +2976,10 @@ static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)WARN_ON (qh->qh_state !=QH_STATE_IDLE );/* clear halt and/or toggle; and maybe recover from silicon quirk */ -qh_refresh (fotg210, qh); +qh_refresh (fhcd2xx, qh);/* splice right after start */ - head = fotg210->async; + head = fhcd2xx->async; qh->qh_next = head->qh_next; qh->hw->hw_next = head->hw->hw_next;wmb ();
@@ -2991,7 +2991,7 @@ static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh->qh_state =QH_STATE_LINKED ;/* qtd completions reported later by interrupt */ -enable_async (fotg210); +enable_async (fhcd2xx); }/*
@@ -3000,27 +3000,27 @@ static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* Returns null if it can't allocate a QH it needs to. * If the QH has TDs (urbs) already, that's great. */ -static struct fotg210_qh *qh_append_tds (struct fotg210_hcd *fotg210, +static struct fhcd2xx_qh *qh_append_tds (struct fhcd2xx_hcd *fhcd2xx,struct urb *urb,struct list_head *qtd_list,int epnum,void **ptr) { -struct fotg210_qh *qh =NULL ; -__hc32 qh_addr_mask =cpu_to_hc32 (fotg210,0x7f ); +struct fhcd2xx_qh *qh =NULL ; +__hc32 qh_addr_mask =cpu_to_hc32 (fhcd2xx,0x7f ); - qh = (struct fotg210_qh *) *ptr; + qh = (struct fhcd2xx_qh *) *ptr;if (unlikely (qh ==NULL )) { -/* can't sleep here, we have fotg210->lock... */ - qh =qh_make (fotg210, urb,GFP_ATOMIC ); +/* can't sleep here, we have fhcd2xx->lock... */ + qh =qh_make (fhcd2xx, urb,GFP_ATOMIC ); *ptr = qh; }if (likely (qh !=NULL )) { -struct fotg210_qtd *qtd; +struct fhcd2xx_qtd *qtd;if (unlikely (list_empty (qtd_list))) qtd =NULL ;else - qtd = list_entry(qtd_list->next, struct fotg210_qtd, + qtd = list_entry(qtd_list->next, struct fhcd2xx_qtd, qtd_list);/* control qh may need patching ... */
@@ -3034,7 +3034,7 @@ static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210,* only hc or qh_refresh() ever modify the overlay. */ if (likely (qtd !=NULL )) { -struct fotg210_qtd *dummy; +struct fhcd2xx_qtd *dummy;dma_addr_t dma;__hc32 token;
@@ -3044,7 +3044,7 @@ static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210,* HC is allowed to fetch the old dummy (4.10.2). */ token = qtd->hw_token; - qtd->hw_token =HALT_BIT (fotg210); + qtd->hw_token =HALT_BIT (fhcd2xx); dummy = qh->dummy;
@@ -3056,14 +3056,14 @@ static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210,list_add (&dummy->qtd_list, qtd_list);list_splice_tail (qtd_list, &qh->qtd_list); -fotg210_qtd_init (fotg210, qtd, qtd->qtd_dma); +fhcd2xx_qtd_init (fhcd2xx, qtd, qtd->qtd_dma); qh->dummy = qtd;/* hc must see the new dummy at list end */ dma = qtd->qtd_dma; qtd =list_entry (qh->qtd_list.prev, - struct fotg210_qtd, qtd_list); - qtd->hw_next =QTD_NEXT (fotg210, dma); + struct fhcd2xx_qtd, qtd_list); + qtd->hw_next =QTD_NEXT (fhcd2xx, dma);/* let the hc process these next qtds */ wmb ();
@@ -3075,22 +3075,22 @@ static struct fotg210_qh *qh_append_tds(struct fotg210_hcd *fotg210,return qh; } -static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb, +static int submit_async(struct fhcd2xx_hcd *fhcd2xx, struct urb *urb, struct list_head *qtd_list, gfp_t mem_flags) { int epnum; unsigned long flags; - struct fotg210_qh *qh = NULL; + struct fhcd2xx_qh *qh = NULL; int rc; epnum = urb->ep->desc.bEndpointAddress; -#ifdef FOTG210_URB_TRACE +#ifdef FHCD2XX_URB_TRACE { - struct fotg210_qtd *qtd; + struct fhcd2xx_qtd *qtd; - qtd = list_entry(qtd_list->next, struct fotg210_qtd, qtd_list); - fotg210_dbg(fotg210, + qtd = list_entry(qtd_list->next, struct fhcd2xx_qtd, qtd_list); + fhcd2xx_dbg(fhcd2xx, "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n", __func__, urb->dev->devpath, urb, epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out",
@@ -3099,18 +3099,18 @@ static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb, }#endif -spin_lock_irqsave (&fotg210->lock, flags); -if (unlikely (!HCD_HW_ACCESSIBLE (fotg210_to_hcd (fotg210)))) { +spin_lock_irqsave (&fhcd2xx->lock, flags); +if (unlikely (!HCD_HW_ACCESSIBLE (fhcd2xx_to_hcd (fhcd2xx)))) { rc = -ESHUTDOWN ; goto done; } - rc =usb_hcd_link_urb_to_ep (fotg210_to_hcd (fotg210), urb); + rc =usb_hcd_link_urb_to_ep (fhcd2xx_to_hcd (fhcd2xx), urb);if (unlikely (rc)) goto done; - qh =qh_append_tds (fotg210, urb, qtd_list, epnum, &urb->ep->hcpriv); + qh =qh_append_tds (fhcd2xx, urb, qtd_list, epnum, &urb->ep->hcpriv);if (unlikely (qh ==NULL )) { -usb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210), urb); +usb_hcd_unlink_urb_from_ep (fhcd2xx_to_hcd (fhcd2xx), urb); rc = -ENOMEM ; goto done; }
@@ -3119,110 +3119,110 @@ static int submit_async(struct fotg210_hcd *fotg210, struct urb *urb,* the HC and TT handle it when the TT has a buffer ready. */ if (likely (qh->qh_state ==QH_STATE_IDLE )) -qh_link_async (fotg210, qh); +qh_link_async (fhcd2xx, qh); done: -spin_unlock_irqrestore (&fotg210->lock, flags); +spin_unlock_irqrestore (&fhcd2xx->lock, flags);if (unlikely (qh ==NULL )) -qtd_list_free (fotg210, urb, qtd_list); +qtd_list_free (fhcd2xx, urb, qtd_list);return rc; } -static void single_unlink_async (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +static void single_unlink_async (struct fhcd2xx_hcd *fhcd2xx, +struct fhcd2xx_qh *qh) { -struct fotg210_qh *prev; +struct fhcd2xx_qh *prev;/* Add to the end of the list of QHs waiting for the next IAAD */ qh->qh_state =QH_STATE_UNLINK ; -if (fotg210->async_unlink) - fotg210->async_unlink_last->unlink_next = qh; +if (fhcd2xx->async_unlink) + fhcd2xx->async_unlink_last->unlink_next = qh;else - fotg210->async_unlink = qh; - fotg210->async_unlink_last = qh; + fhcd2xx->async_unlink = qh; + fhcd2xx->async_unlink_last = qh;/* Unlink it from the schedule */ - prev = fotg210->async; + prev = fhcd2xx->async;while (prev->qh_next.qh != qh) prev = prev->qh_next.qh; prev->hw->hw_next = qh->hw->hw_next; prev->qh_next = qh->qh_next; -if (fotg210->qh_scan_next == qh) - fotg210->qh_scan_next = qh->qh_next.qh; +if (fhcd2xx->qh_scan_next == qh) + fhcd2xx->qh_scan_next = qh->qh_next.qh; } -static void start_iaa_cycle (struct fotg210_hcd *fotg210,bool nested) +static void start_iaa_cycle (struct fhcd2xx_hcd *fhcd2xx,bool nested) {/* * Do nothing if an IAA cycle is already running or * if one will be started shortly. */ -if (fotg210->async_iaa || fotg210->async_unlinking) +if (fhcd2xx->async_iaa || fhcd2xx->async_unlinking)return ;/* Do all the waiting QHs at once */ - fotg210->async_iaa = fotg210->async_unlink; - fotg210->async_unlink =NULL ; + fhcd2xx->async_iaa = fhcd2xx->async_unlink; + fhcd2xx->async_unlink =NULL ;/* If the controller isn't running, we don't have to wait for it */ -if (unlikely (fotg210->rh_state <FOTG210_RH_RUNNING )) { +if (unlikely (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING )) {if (!nested)/* Avoid recursion */ -end_unlink_async (fotg210); +end_unlink_async (fhcd2xx);/* Otherwise start a new IAA cycle */ - }else if (likely (fotg210->rh_state ==FOTG210_RH_RUNNING )) { + }else if (likely (fhcd2xx->rh_state ==FHCD2XX_RH_RUNNING )) {/* Make sure the unlinks are all visible to the hardware */ wmb (); -fotg210_writel (fotg210, fotg210->command |CMD_IAAD , - &fotg210->regs->command); -fotg210_readl (fotg210, &fotg210->regs->command); -fotg210_enable_event (fotg210,FOTG210_HRTIMER_IAA_WATCHDOG , +fhcd2xx_writel (fhcd2xx, fhcd2xx->command |CMD_IAAD , + &fhcd2xx->regs->command); +fhcd2xx_readl (fhcd2xx, &fhcd2xx->regs->command); +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_IAA_WATCHDOG , true); } }/* the async qh for the qtds being unlinked are now gone from the HC */ -static void end_unlink_async (struct fotg210_hcd *fotg210) +static void end_unlink_async (struct fhcd2xx_hcd *fhcd2xx) { -struct fotg210_qh *qh; +struct fhcd2xx_qh *qh;/* Process the idle QHs */ restart: - fotg210->async_unlinking = true; -while (fotg210->async_iaa) { - qh = fotg210->async_iaa; - fotg210->async_iaa = qh->unlink_next; + fhcd2xx->async_unlinking = true; +while (fhcd2xx->async_iaa) { + qh = fhcd2xx->async_iaa; + fhcd2xx->async_iaa = qh->unlink_next; qh->unlink_next =NULL ; qh->qh_state =QH_STATE_IDLE ; qh->qh_next.qh =NULL ; -qh_completions (fotg210, qh); +qh_completions (fhcd2xx, qh);if (!list_empty (&qh->qtd_list) && - fotg210->rh_state ==FOTG210_RH_RUNNING ) -qh_link_async (fotg210, qh); -disable_async (fotg210); + fhcd2xx->rh_state ==FHCD2XX_RH_RUNNING ) +qh_link_async (fhcd2xx, qh); +disable_async (fhcd2xx); } - fotg210->async_unlinking = false; + fhcd2xx->async_unlinking = false;/* Start a new IAA cycle if any QHs are waiting for it */ -if (fotg210->async_unlink) { -start_iaa_cycle (fotg210, true); -if (unlikely (fotg210->rh_state <FOTG210_RH_RUNNING )) +if (fhcd2xx->async_unlink) { +start_iaa_cycle (fhcd2xx, true); +if (unlikely (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING )) goto restart; } } -static void unlink_empty_async (struct fotg210_hcd *fotg210) +static void unlink_empty_async (struct fhcd2xx_hcd *fhcd2xx) { -struct fotg210_qh *qh, *next; -bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING ); +struct fhcd2xx_qh *qh, *next; +bool stopped = (fhcd2xx->rh_state <FHCD2XX_RH_RUNNING );bool check_unlinks_later = false;/* Unlink all the async QHs that have been empty for a timer cycle */ - next = fotg210->async->qh_next.qh; + next = fhcd2xx->async->qh_next.qh;while (next) { qh = next; next = qh->qh_next.qh;
@@ -3230,30 +3230,30 @@ static void unlink_empty_async(struct fotg210_hcd *fotg210)if (list_empty (&qh->qtd_list) && qh->qh_state ==QH_STATE_LINKED ) {if (!stopped && qh->unlink_cycle == - fotg210->async_unlink_cycle) + fhcd2xx->async_unlink_cycle) check_unlinks_later = true;else -single_unlink_async (fotg210, qh); +single_unlink_async (fhcd2xx, qh); } }/* Start a new IAA cycle if any QHs are waiting for it */ -if (fotg210->async_unlink) -start_iaa_cycle (fotg210, false); +if (fhcd2xx->async_unlink) +start_iaa_cycle (fhcd2xx, false);/* QHs that haven't been empty for long enough will be handled later */ if (check_unlinks_later) { -fotg210_enable_event (fotg210,FOTG210_HRTIMER_ASYNC_UNLINKS , +fhcd2xx_enable_event (fhcd2xx,FHCD2XX_HRTIMER_ASYNC_UNLINKS , true); - ++fotg210->async_unlink_cycle;
Lines of this file are not shown. View the raw message.
drivers/usb/host/faraday-hcd.h +124 -124
248 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.1.0
Part of the diff is not shown here. View the raw message.
Re: [PATCH 12/14] RFC: usb/host/faraday-hcd: Replace fotg210 by fhcd2xx
Quoted 8 lines · Peter Senna Tschudin
This patch replaces the strings:
FOTG210 by FHCD2XX
fotg210 by fhcd2xxThe goal is to remove all references to fotg210 as the driver will support both fotg210 and fusbh200.
Signed-off-by Peter Senna Tschudin <[email protected]>
after a quick look, it looks okay. Keep in mind I don't have HW.
Signature · 1 line
balbi
PATCH 13/14 RFC: usb/host/faraday-hcd: Move #defines outside struct
In reply to Peter Senna TschudinFor making the code more readable and to facilitate supporting multiple hardware versions, move #defines to outside the struct declaration. This patch also renames fhcd2xx_regs to fotg210_regs as this struct is specific to fotg210.
--- drivers/usb/host/faraday-hcd.h | 137 ++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 63 deletions(-)
drivers/usb/host/faraday-hcd.h +74 -63
@@ -85,7 +85,7 @@ struct fhcd2xx_hcd { /* one per controller *//* glue to PCI and HCD framework */ struct fhcd2xx_caps __iomem *caps; -struct fhcd2xx_regs __iomem *regs; +struct fotg210_regs __iomem *regs;struct ehci_dbg_port __iomem *debug;__u32 hcs_params;/* cached register copy */
@@ -221,84 +221,95 @@ struct fhcd2xx_caps {u8 portroute[8 ];/* nibbles for routing - offset 0xC */ }; - -/* Section 2.3 Host Controller Operational Registers */ -struct fhcd2xx_regs { - -/* USBCMD: offset 0x00 */ -u32 command; -/* EHCI 1.1 addendum */ /* 23:16 is r/w intr rate, in microframes; default "8" == 1/msec */ -#define CMD_PARK (1<<11)/* enable "park" on async qh */ -#define CMD_PARK_CNT (c) (((c)>>8)&3)/* how many transfers to park for */ -#define CMD_IAAD (1<<6)/* "doorbell" interrupt async advance */ -#define CMD_ASE (1<<5)/* async schedule enable */ -#define CMD_PSE (1<<4)/* periodic schedule enable */ +#define CMD_PARK (1<<11)/* enable "park" on async qh */ +#define CMD_PARK_CNT (c) (((c)>>8)&3)/* how many transfers to park for */ +#define CMD_IAAD (1<<6)/* "doorbell" interrupt async advance */ +#define CMD_ASE (1<<5)/* async schedule enable */ +#define CMD_PSE (1<<4)/* periodic schedule enable */ +/* 3:2 is periodic frame list size */ -#define CMD_RESET (1<<1)/* reset HC not bus */ -#define CMD_RUN (1<<0)/* start/stop HC */ +#define CMD_RESET (1<<1)/* reset HC not bus */ +#define CMD_RUN (1<<0)/* start/stop HC */ -/* USBSTS: offset 0x04 */ -u32 status; -#define STS_ASS (1<<15)/* Async Schedule Status */ -#define STS_PSS (1<<14)/* Periodic Schedule Status */ -#define STS_RECL (1<<13)/* Reclamation */ -#define STS_HALT (1<<12)/* Not running (any reason) */ -/* some bits reserved */ -/* these STS_* flags are also intr_enable bits (USBINTR) */ -#define STS_IAA (1<<5)/* Interrupted on async advance */ -#define STS_FATAL (1<<4)/* such as some PCI access errors */ -#define STS_FLR (1<<3)/* frame list rolled over */ -#define STS_PCD (1<<2)/* port change detect */ -#define STS_ERR (1<<1)/* "error" completion (overflow, ...) */ -#define STS_INT (1<<0)/* "normal" completion (short, ...) */ +#define STS_ASS (1<<15)/* Async Schedule Status */ +#define STS_PSS (1<<14)/* Periodic Schedule Status */ +#define STS_RECL (1<<13)/* Reclamation */ +#define STS_HALT (1<<12)/* Not running (any reason) */ + +/* some bits reserved +* these STS_* flags are also intr_enable bits (USBINTR) +*/ +#define STS_IAA (1<<5)/* Interrupted on async advance */ +#define STS_FATAL (1<<4)/* such as some PCI access errors */ +#define STS_FLR (1<<3)/* frame list rolled over */ +#define STS_PCD (1<<2)/* port change detect */ +#define STS_ERR (1<<1)/* "error" completion (overflow, ...) */ +#define STS_INT (1<<0)/* "normal" completion (short, ...) */ -/* USBINTR: offset 0x08 */ -u32 intr_enable; - -/* FRINDEX: offset 0x0C */ -u32 frame_index;/* current microframe number */ -/* CTRLDSSEGMENT: offset 0x10 */ -u32 segment;/* address bits 63:32 if needed */ -/* PERIODICLISTBASE: offset 0x14 */ -u32 frame_list;/* points to periodic list */ -/* ASYNCLISTADDR: offset 0x18 */ -u32 async_next;/* address of next async queue head */ - -u32 reserved1; -/* PORTSC: offset 0x20 */ -u32 port_status;/* 31:23 reserved */ -#define PORT_USB11 (x) (((x)&(3<<10)) == (1<<10))/* USB 1.1 device */ -#define PORT_RESET (1<<8)/* reset port */ -#define PORT_SUSPEND (1<<7)/* suspend port */ -#define PORT_RESUME (1<<6)/* resume it */ -#define PORT_PEC (1<<3)/* port enable change */ -#define PORT_PE (1<<2)/* port enable */ -#define PORT_CSC (1<<1)/* connect status change */ -#define PORT_CONNECT (1<<0)/* device connected */ +#define PORT_USB11 (x) (((x)&(3<<10)) == (1<<10))/* USB 1.1 device */ +#define PORT_RESET (1<<8)/* reset port */ +#define PORT_SUSPEND (1<<7)/* suspend port */ +#define PORT_RESUME (1<<6)/* resume it */ +#define PORT_PEC (1<<3)/* port enable change */ +#define PORT_PE (1<<2)/* port enable */ +#define PORT_CSC (1<<1)/* connect status change */ +#define PORT_CONNECT (1<<0)/* device connected */ #define PORT_RWC_BITS (PORT_CSC | PORT_PEC) -u32 reserved2[19 ]; -/* OTGCSR: offet 0x70 */ -u32 otgcsr; +/* FOTG210 only: */ #define OTGCSR_HOST_SPD_TYP (3 << 22)#define OTGCSR_A_BUS_DROP (1 << 5)#define OTGCSR_A_BUS_REQ (1 << 4) +#define OTGISR_OVC (1 << 10) +#define GMIR_INT_POLARITY (1 << 3)/*Active High*/ +#define GMIR_MHC_INT (1 << 2) +#define GMIR_MOTG_INT (1 << 1) +#define GMIR_MDEV_INT (1 << 0) + +/* Section 2.3 Host Controller Operational Registers */ +struct fotg210_regs { + +/* USBCMD: offset 0x00 */ +u32 command; + +/* USBSTS: offset 0x04 */ +u32 status; + +/* USBINTR: offset 0x08 */ +u32 intr_enable; + +/* FRINDEX: offset 0x0C - current microframe number */ +u32 frame_index; + +/* CTRLDSSEGMENT: offset 0x10 - address bits 63:32 if needed */ +u32 segment; + +/* PERIODICLISTBASE: offset 0x14 - points to periodic list */ +u32 frame_list; + +/* ASYNCLISTADDR: offset 0x18 - address of next async queue head */ +u32 async_next; + +u32 reserved1; + +/* PORTSC: offset 0x20 */ +u32 port_status; + +u32 reserved2[19 ]; + +/* OTGCSR: offet 0x70 */ +u32 otgcsr;/* OTGISR: offset 0x74 */ -u32 otgisr; -#define OTGISR_OVC (1 << 10) +u32 otgisr; -u32 reserved3[15 ]; +u32 reserved3[15 ];/* GMIR: offset 0xB4 */ -u32 gmir; -#define GMIR_INT_POLARITY (1 << 3)/*Active High*/ -#define GMIR_MHC_INT (1 << 2) -#define GMIR_MOTG_INT (1 << 1) -#define GMIR_MDEV_INT (1 << 0) +u32 gmir; };/*-------------------------------------------------------------------------*/
Signature · 1 line
2.1.0
Re: [PATCH 13/14] RFC: usb/host/faraday-hcd: Move #defines outside struct
Quoted 15 lines · Peter Senna Tschudin
For making the code more readable and to facilitate supporting multiple hardware versions, move #defines to outside the struct declaration. This patch also renames
fhcd2xx_regstofotg210_regsas this struct is specific to fotg210.Signed-off-by Peter Senna Tschudin <[email protected]>--- drivers/usb/host/faraday-hcd.h | 137 ++++++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 63 deletions(-)drivers/usb/host/faraday-hcd.h +0
-0
drivers/usb/host/faraday-hcd.h struct fhcd2xx_hcd { /* one per controller */ · line 88
Quoted 5 lines
drivers/usb/host/faraday-hcd.h +1
-1@@ -85,7 +85,7 @@ struct fhcd2xx_hcd { /* one per controller *//* glue to PCI and HCD framework */ struct fhcd2xx_caps __iomem *caps; -struct fhcd2xx_regs __iomem *regs; +struct fotg210_regs __iomem *regs;
should this be in previous patch ?
personally, I don't see what's the benefit of this patch, however not against it either.
Signature · 1 line
balbi
PATCH 14/14 RFC: usb/host/faraday-hcd: Import FUSBH200 parameters
In reply to Peter Senna TschudinThis patch adds FUSBH200 parameters to faraday-hcd.h.
--- drivers/usb/host/faraday-hcd.h | 50 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-)
drivers/usb/host/faraday-hcd.h +49 -1
@@ -259,6 +259,14 @@ struct fhcd2xx_caps {#define PORT_CONNECT (1<<0)/* device connected */ #define PORT_RWC_BITS (PORT_CSC | PORT_PEC) +/* FUSB200 only: */ +#define BMCSR_HOST_SPD_TYP (3<<9) +#define BMCSR_VBUS_OFF (1<<4) +#define BMCSR_INT_POLARITY (1<<3) +#define BMISR_OVC (1<<1) +#define BMIER_OVC_EN (1<<1) +#define BMIER_VBUS_ERR_EN (1<<0) +/* FOTG210 only: */ #define OTGCSR_HOST_SPD_TYP (3 << 22)#define OTGCSR_A_BUS_DROP (1 << 5)
@@ -269,7 +277,47 @@ struct fhcd2xx_caps {#define GMIR_MOTG_INT (1 << 1)#define GMIR_MDEV_INT (1 << 0) -/* Section 2.3 Host Controller Operational Registers */ +/* FUSB200: Section 2.3 Host Controller Operational Registers */ +struct fusbh200_regs { +/* USBCMD: offset 0x00 */ +u32 command; + +/* USBSTS: offset 0x04 */ +u32 status; + +/* USBINTR: offset 0x08 */ +u32 intr_enable; + +/* FRINDEX: offset 0x0C - current microframe number */ +u32 frame_index; + +/* CTRLDSSEGMENT: offset 0x10 - address bits 63:32 if needed */ +u32 segment; + +/* PERIODICLISTBASE: offset 0x14 - points to periodic list */ +u32 frame_list; + +/* ASYNCLISTADDR: offset 0x18 - address of next async queue head */ +u32 async_next; + +u32 reserved1; + +/* PORTSC: offset 0x20 */ +u32 port_status; + +u32 reserved2[3 ]; + +/* BMCSR: offset 0x30 - Bus Moniter Control/Status Register */ +u32 bmcsr; + +/* BMISR: offset 0x34 - Bus Moniter Interrupt Status Register */ +u32 bmisr; + +/* BMIER: offset 0x38 - Bus Moniter Interrupt Enable Register */ +u32 bmier; +}; + +/* FOTG210: Section 2.3 Host Controller Operational Registers */ struct fotg210_regs {/* USBCMD: offset 0x00 */
Signature · 1 line
2.1.0
Re: [PATCH 14/14] RFC: usb/host/faraday-hcd: Import FUSBH200 parameters
Quoted 3 lines · Peter Senna Tschudin
This patch adds FUSBH200 parameters to
faraday-hcd.h.Signed-off-by Peter Senna Tschudin <[email protected]>
fine by me
Signature · 1 line
balbi
PATCH 1/1 usb-host: Remove fusbh200 driver
In reply to Peter Senna Tschudinfusbh200 and fotg210 are very similar. The initial idea was to consolidate both drivers but I'm afraid fusbh200 is not being used.
This patch remove the fusbh200 source code, update Kconfig and two Makefiles.
--- drivers/usb/Makefile | 1 - drivers/usb/host/Kconfig | 10 - drivers/usb/host/Makefile | 1 - drivers/usb/host/fusbh200-hcd.c | 5894 --------------------------------------- drivers/usb/host/fusbh200.h | 675 ----- 5 files changed, 6581 deletions(-) delete mode 100644 drivers/usb/host/fusbh200-hcd.c delete mode 100644 drivers/usb/host/fusbh200.h
drivers/usb/Makefile +0 -1
@@ -27,7 +27,6 @@ obj-$(CONFIG_USB_R8A66597_HCD) += host/ obj-$(CONFIG_USB_HWA_HCD) += host/ obj-$(CONFIG_USB_IMX21_HCD) += host/ obj-$(CONFIG_USB_FSL_MPH_DR_OF) += host/ -obj-$(CONFIG_USB_FUSBH200_HCD) += host/ obj-$(CONFIG_USB_FOTG210_HCD) += host/ obj-$(CONFIG_USB_MAX3421_HCD) += host/
drivers/usb/host/Kconfig +0 -10
@@ -348,16 +348,6 @@ config USB_ISP1362_HCD To compile this driver as a module, choose M here: the module will be called isp1362-hcd. -config USB_FUSBH200_HCD - tristate "FUSBH200 HCD support" - depends on USB - ---help--- - Faraday FUSBH200 is designed to meet USB2.0 EHCI specification - with minor modification. - - To compile this driver as a module, choose M here: the - module will be called fusbh200-hcd. - config USB_FOTG210_HCD tristate "FOTG210 HCD support" depends on USB
drivers/usb/host/Makefile +0 -1
@@ -75,6 +75,5 @@ obj-$(CONFIG_USB_FSL_MPH_DR_OF) += fsl-mph-dr-of.o obj-$(CONFIG_USB_EHCI_FSL) += ehci-fsl.o obj-$(CONFIG_USB_HCD_BCMA) += bcma-hcd.o obj-$(CONFIG_USB_HCD_SSB) += ssb-hcd.o -obj-$(CONFIG_USB_FUSBH200_HCD) += fusbh200-hcd.o obj-$(CONFIG_USB_FOTG210_HCD) += fotg210-hcd.o obj-$(CONFIG_USB_MAX3421_HCD) += max3421-hcd.o
drivers/usb/host/fusbh200-hcd.c deleted +0 -5894
2,971 lines not on this page · raw message
drivers/usb/host/fusbh200.h deleted +0 -675
675 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.1.0
Part of the diff is not shown here. View the raw message.
Re: [PATCH] usb-host: Remove fusbh200 driver
Quoted 7 lines · Peter Senna Tschudin
fusbh200 and fotg210 are very similar. The initial idea was to consolidate both drivers but I'm afraid fusbh200 is not being used.
This patch remove the fusbh200 source code, update
Kconfigand two Makefiles.Signed-off-by Peter Senna Tschudin <[email protected]>
after all this work on these previous patches, you just remove fusbh200 ?
that's a bit odd. Are you sure there are no users for this driver ? It has been in tree since 2013.
Signature · 1 line
balbi
Re: [PATCH] usb-host: Remove fusbh200 driver
Quoted 7 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
fusbh200 and fotg210 are very similar. The initial idea was to consolidate both drivers but I'm afraid fusbh200 is not being used.
This patch remove the fusbh200 source code, update
Kconfigand two Makefiles.
Quoted 6 lines
Quoted 1 line
Signed-off-by Peter Senna Tschudin <[email protected]>after all this work on these previous patches, you just remove fusbh200 ?
that's a bit odd. Are you sure there are no users for this driver ? It has been in tree since 2013.
I don't know about users, but I could not find devices using fusbh200. The closest I got was:
http://www.ebay.fr/itm/Digital-Video-Langzeit-Recorder-H264-DVR-3G-4-Kanal-/370525106495
But it only says: Main Processor: Faraday. I don't know which usb host controller it uses.
The idea of deleting fusbh200 came from contacting the driver authors. I was asking where to find hw for testing, and I was told that the fusbh200 driver can be deleted. Also at least Fedora and Ubuntu build modules for these host controllers by default. If fusbh200 and fotg210 are only available integrated into SOCs, maybe building the modules by default for x86 is not a good idea. But if there are users I'll be happy to continue the integration work, even better if I find hardware for testing.
John Feng-Hsin Chiang, can you confirm that from your side the fusbh200 driver can be deleted?
For the patches I sent, 10 of 14 are for fotg210 which I'll fix and resend.
Signature · 1 line
Peter
Re: [PATCH] usb-host: Remove fusbh200 driver
Quoted 22 lines · Peter Senna Tschudin
Quoted 7 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
fusbh200 and fotg210 are very similar. The initial idea was to consolidate both drivers but I'm afraid fusbh200 is not being used.
This patch remove the fusbh200 source code, update
Kconfigand two Makefiles.Quoted 6 lines
Quoted 1 line
Signed-off-by Peter Senna Tschudin <[email protected]>after all this work on these previous patches, you just remove fusbh200 ?
that's a bit odd. Are you sure there are no users for this driver ? It has been in tree since 2013.
I don't know about users, but I could not find devices using fusbh200. The closest I got was:
http://www.ebay.fr/itm/Digital-Video-Langzeit-Recorder-H264-DVR-3G-4-Kanal-/370525106495
But it only says: Main Processor: Faraday. I don't know which usb host controller it uses.
Quoted 8 lines
The idea of deleting fusbh200 came from contacting the driver authors. I was asking where to find hw for testing, and I was told that the fusbh200 driver can be deleted. Also at least Fedora and Ubuntu build modules for these host controllers by default. If fusbh200 and fotg210 are only available integrated into SOCs, maybe building the modules by default for x86 is not a good idea. But if there are users I'll be happy to continue the integration work, even better if I find hardware for testing.
fair enough, if can be deleted it's fine...
Quoted 2 lines
John Feng-Hsin Chiang, can you confirm that from your side the fusbh200 driver can be deleted?
... but let's get this confirmation.
Quoted 1 line
For the patches I sent, 10 of 14 are for fotg210 which I'll fix and resend.
cool, thanks
Signature · 1 line
balbi
RE: [PATCH] usb-host: Remove fusbh200 driver
Hi Balbi,
Quoted 3 lines
Quoted 2 lines
John Feng-Hsin Chiang, can you confirm that from your side the fusbh200 driver can be deleted?
... but let's get this confirmation.
Yes, you can delete fusbh200.
Best Regards,
John Chiang
-----Original Message-----
From: Felipe Balbi [mailto:[email protected]]
Sent: Sunday, October 04, 2015 5:21 AM
To: Peter Senna Tschudin
Cc: John Feng-Hsin Chiang(江峰興); Yuan-Hsin Chen; Greg Kroah-Hartman; Alan Stern; [email protected]; [email protected]; [email protected]; [email protected]; Laurent Pinchart; [email protected]; [email protected]; Rafał Miłecki; [email protected]; [email protected]; Sergei Shtylyov; Masanari Iida; Randy Dunlap; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCH] usb-host: Remove fusbh200 driver
Quoted 23 lines · Peter Senna Tschudin
Quoted 7 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
fusbh200 and fotg210 are very similar. The initial idea was to consolidate both drivers but I'm afraid fusbh200 is not being used.
This patch remove the fusbh200 source code, update
Kconfigand two Makefiles.Quoted 6 lines
Quoted 1 line
Signed-off-by Peter Senna Tschudin <[email protected]>after all this work on these previous patches, you just remove fusbh200 ?
that's a bit odd. Are you sure there are no users for this driver ? It has been in tree since 2013.
I don't know about users, but I could not find devices using fusbh200. The closest I got was:
http://www.ebay.fr/itm/Digital-Video-Langzeit-Recorder-H264-DVR-3G-4-K
anal-/370525106495But it only says: Main Processor: Faraday. I don't know which usb host controller it uses.
Quoted 8 lines
The idea of deleting fusbh200 came from contacting the driver authors. I was asking where to find hw for testing, and I was told that the fusbh200 driver can be deleted. Also at least Fedora and Ubuntu build modules for these host controllers by default. If fusbh200 and fotg210 are only available integrated into SOCs, maybe building the modules by default for x86 is not a good idea. But if there are users I'll be happy to continue the integration work, even better if I find hardware for testing.
fair enough, if can be deleted it's fine...
Quoted 2 lines
John Feng-Hsin Chiang, can you confirm that from your side the fusbh200 driver can be deleted?
... but let's get this confirmation.
Quoted 1 line
For the patches I sent, 10 of 14 are for fotg210 which I'll fix and resend.
cool, thanks
--
balbi �淸�{.n�+돴윯돪�+%듚�깁負쪐w��{.n�+돴쪐{깸G쳺��{ay����,j�f"톒쉹��묎�z_溫(�쉸듶줷"얎�m����G쳺�◀?솳鈺�&x�~뤳턨O뺞촾퇉v�^�m����띠�◀?뻀�
cover usb/host/fotg210: code style and warning fixes
In reply to Peter Senna TschudinThis patch series fix warnings reported by checkpatch on the FOTG210 EHCI-like driver.
Peter Senna Tschudin (9):
usb/host/fotg210: Fix coding style issues usb/host/fotg210: remove KERN_WARNING from pr_warn usb/host/fotg210: Remove useless else statement usb/host/fotg210: Remove NULL checks dma_pool_destroy usb/host/fotg210: change kmalloc by kmalloc_array usb/host/fotg210: replace msleep by usleep_range usb/host/fotg210: convert macro to inline function usb/host/fotg210: Add function: output_buf_tds_dir() usb/host/fotg210: Add function scan_frame_queue()
drivers/usb/host/fotg210-hcd.c | 1955 ++++++++++++++++++---------------------- drivers/usb/host/fotg210.h | 36 +- 2 files changed, 896 insertions(+), 1095 deletions(-)
Signature · 1 line
2.1.0
PATCH 1/9 usb/host/fotg210: Fix coding style issues
This patch fix coding style issues reported by checkpatch that do not change semantics of the code.
---
This patch introduces one checkpatch warning for line over 80 characters, but my personal feeling is that it looks better and easier to read this way.
drivers/usb/host/fotg210-hcd.c | 1710 ++++++++++++++++++---------------------- drivers/usb/host/fotg210.h | 36 +- 2 files changed, 769 insertions(+), 977 deletions(-)
drivers/usb/host/fotg210-hcd.c +748 -962
@@ -1,5 +1,4 @@ -/* -* Faraday FOTG210 EHCI-like driver +/* Faraday FOTG210 EHCI-like driver * * Copyright (c) 2013 Faraday Technology Corporation *
@@ -50,32 +49,29 @@#include <asm/irq.h> #include <asm/unaligned.h> -/*-------------------------------------------------------------------------*/ #define DRIVER_AUTHOR "Yuan-Hsin Chen"#define DRIVER_DESC "FOTG210 Host Controller (EHCI) Driver" - -static const char hcd_name[] ="fotg210_hcd" ; +static const char hcd_name[] ="fotg210_hcd" ;#undef FOTG210_URB_TRACE -#define FOTG210_STATS /* magic numbers that can affect system performance */ -#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ -#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ -#define FOTG210_TUNE_RL_TT 0 -#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ -#define FOTG210_TUNE_MULT_TT 1 -/* -* Some drivers think it's safe to schedule isochronous transfers more than -* 256 ms into the future (partly as a result of an old bug in the scheduling +#define FOTG210_TUNE_CERR 3/* 0-3 qtd retries; 0 == don't stop */ +#define FOTG210_TUNE_RL_HS 4/* nak throttle; see 4.9 */ +#define FOTG210_TUNE_RL_TT 0 +#define FOTG210_TUNE_MULT_HS 1/* 1-3 transactions/uframe; 4.10.3 */ +#define FOTG210_TUNE_MULT_TT 1 + +/* Some drivers think it's safe to schedule isochronous transfers more than 256 +* ms into the future (partly as a result of an old bug in the scheduling * code). In an attempt to avoid trouble, we will use a minimum scheduling * length of 512 frames instead of 256. */ -#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ +#define FOTG210_TUNE_FLS 1/* (medium) 512-frame schedule */ /* Initial IRQ latency: faster than hw default */ -static int log2_irq_thresh;/* 0 to 6 */ +static int log2_irq_thresh;/* 0 to 6 */ module_param (log2_irq_thresh, int,S_IRUGO );MODULE_PARM_DESC (log2_irq_thresh,"log2 IRQ latency, 1-64 microframes" );
@@ -89,66 +85,57 @@ static unsigned int hird;module_param (hird, int,S_IRUGO );MODULE_PARM_DESC (hird,"host initiated resume duration, +1 for each 75us" ); -#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) +#define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT)#include "fotg210.h" -/*-------------------------------------------------------------------------*/ - #define fotg210_dbg(fotg210, fmt, args...) \ - dev_dbg(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_dbg(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_err(fotg210, fmt, args...) \ - dev_err(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_err(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_info(fotg210, fmt, args...) \ - dev_info(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_info(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) #define fotg210_warn(fotg210, fmt, args...) \ - dev_warn(fotg210_to_hcd(fotg210)->self.controller , fmt , ## args) + dev_warn(fotg210_to_hcd(fotg210)->self.controller, fmt, ## args) -/* check the values in the HCSPARAMS register -* (host controller _Structural_ parameters) -* see EHCI spec, Table 2-4 for each value +/* check the values in the HCSPARAMS register (host controller _Structural_ +* parameters) see EHCI spec, Table 2-4 for each value */ static void dbg_hcs_params (struct fotg210_hcd *fotg210,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcs_params); +u32 params =fotg210_readl (fotg210, &fotg210->caps->hcs_params); -fotg210_dbg (fotg210, -"%s hcs_params 0x%x ports=%d\n" , - label, params, -HCS_N_PORTS (params) - ); +fotg210_dbg (fotg210,"%s hcs_params 0x%x ports=%d\n" , label, params, +HCS_N_PORTS (params)); } -/* check the values in the HCCPARAMS register -* (host controller _Capability_ parameters) -* see EHCI Spec, Table 2-5 for each value -* */ +/* check the values in the HCCPARAMS register (host controller _Capability_ +* parameters) see EHCI Spec, Table 2-5 for each value +*/ static void dbg_hcc_params (struct fotg210_hcd *fotg210,char *label) { -u32 params =fotg210_readl (fotg210, &fotg210->caps->hcc_params); +u32 params =fotg210_readl (fotg210, &fotg210->caps->hcc_params); -fotg210_dbg (fotg210, -"%s hcc_params %04x uframes %s%s\n" , - label, - params, -HCC_PGM_FRAMELISTLEN (params) ?"256/512/1024" :"1024" , -HCC_CANPARK (params) ?" park" :"" ); +fotg210_dbg (fotg210,"%s hcc_params %04x uframes %s%s\n" , label, + params, +HCC_PGM_FRAMELISTLEN (params) ?"256/512/1024" :"1024" , +HCC_CANPARK (params) ?" park" :"" ); }static void __maybe_unused dbg_qtd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd) {fotg210_dbg (fotg210,"%s td %p n%08x %08x t%08x p0=%08x\n" , label, qtd, -hc32_to_cpup (fotg210, &qtd->hw_next), -hc32_to_cpup (fotg210, &qtd->hw_alt_next), -hc32_to_cpup (fotg210, &qtd->hw_token), -hc32_to_cpup (fotg210, &qtd->hw_buf[0 ])); +hc32_to_cpup (fotg210, &qtd->hw_next), +hc32_to_cpup (fotg210, &qtd->hw_alt_next), +hc32_to_cpup (fotg210, &qtd->hw_token), +hc32_to_cpup (fotg210, &qtd->hw_buf[0 ]));if (qtd->hw_buf[1 ])fotg210_dbg (fotg210," p1=%08x p2=%08x p3=%08x p4=%08x\n" , -hc32_to_cpup (fotg210, &qtd->hw_buf[1 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[2 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[3 ]), -hc32_to_cpup (fotg210, &qtd->hw_buf[4 ])); +hc32_to_cpup (fotg210, &qtd->hw_buf[1 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[2 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[3 ]), +hc32_to_cpup (fotg210, &qtd->hw_buf[4 ])); } static void __maybe_unused
@@ -156,101 +143,100 @@ dbg_qh(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh) {struct fotg210_qh_hw *hw = qh->hw; -fotg210_dbg (fotg210,"%s qh %p n%08x info %x %x qtd %x\n" , label, - qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); +fotg210_dbg (fotg210,"%s qh %p n%08x info %x %x qtd %x\n" , label, qh, + hw->hw_next, hw->hw_info1, hw->hw_info2, + hw->hw_current); +dbg_qtd ("overlay" , fotg210, (struct fotg210_qtd *) &hw->hw_qtd_next); }static void __maybe_unused dbg_itd (const char *label,struct fotg210_hcd *fotg210,struct fotg210_itd *itd) { -fotg210_dbg (fotg210,"%s[%d] itd %p, next %08x, urb %p\n" , - label, itd->frame, itd,hc32_to_cpu (fotg210, itd->hw_next), - itd->urb); +fotg210_dbg (fotg210,"%s[%d] itd %p, next %08x, urb %p\n" , label, + itd->frame, itd,hc32_to_cpu (fotg210, itd->hw_next), + itd->urb); +fotg210_dbg (fotg210, -" trans: %08x %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_transaction[0 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[1 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[2 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[3 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[4 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[5 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[6 ]), -hc32_to_cpu (fotg210, itd->hw_transaction[7 ])); +" trans: %08x %08x %08x %08x %08x %08x %08x %08x\n" , +hc32_to_cpu (fotg210, itd->hw_transaction[0 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[1 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[2 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[3 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[4 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[5 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[6 ]), +hc32_to_cpu (fotg210, itd->hw_transaction[7 ])); +fotg210_dbg (fotg210, -" buf: %08x %08x %08x %08x %08x %08x %08x\n" , -hc32_to_cpu (fotg210, itd->hw_bufp[0 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[1 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[2 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[3 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[4 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[5 ]), -hc32_to_cpu (fotg210, itd->hw_bufp[6 ])); +" buf: %08x %08x %08x %08x %08x %08x %08x\n" , +hc32_to_cpu (fotg210, itd->hw_bufp[0 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[1 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[2 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[3 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[4 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[5 ]), +hc32_to_cpu (fotg210, itd->hw_bufp[6 ])); +fotg210_dbg (fotg210," index: %d %d %d %d %d %d %d %d\n" , - itd->index[0 ], itd->index[1 ], itd->index[2 ], - itd->index[3 ], itd->index[4 ], itd->index[5 ], - itd->index[6 ], itd->index[7 ]); + itd->index[0 ], itd->index[1 ], itd->index[2 ], + itd->index[3 ], itd->index[4 ], itd->index[5 ], + itd->index[6 ], itd->index[7 ]); }static int __maybe_unused dbg_status_buf (char *buf,unsigned len,const char *label,u32 status) { -return scnprintf (buf, len, -"%s%sstatus %04x%s%s%s%s%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , status, - (status &STS_ASS ) ?" Async" :"" , - (status &STS_PSS ) ?" Periodic" :"" , - (status &STS_RECL ) ?" Recl" :"" , - (status &STS_HALT ) ?" Halt" :"" , - (status &STS_IAA ) ?" IAA" :"" , - (status &STS_FATAL ) ?" FATAL" :"" , - (status &STS_FLR ) ?" FLR" :"" , - (status &STS_PCD ) ?" PCD" :"" , - (status &STS_ERR ) ?" ERR" :"" , - (status &STS_INT ) ?" INT" :"" - ); +return scnprintf (buf, len,"%s%sstatus %04x%s%s%s%s%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , status, + (status &STS_ASS ) ?" Async" :"" , + (status &STS_PSS ) ?" Periodic" :"" , + (status &STS_RECL ) ?" Recl" :"" , + (status &STS_HALT ) ?" Halt" :"" , + (status &STS_IAA ) ?" IAA" :"" , + (status &STS_FATAL ) ?" FATAL" :"" , + (status &STS_FLR ) ?" FLR" :"" , + (status &STS_PCD ) ?" PCD" :"" , + (status &STS_ERR ) ?" ERR" :"" , + (status &STS_INT ) ?" INT" :"" ); }static int __maybe_unused dbg_intr_buf (char *buf,unsigned len,const char *label,u32 enable) { -return scnprintf (buf, len, -"%s%sintrenable %02x%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , enable, - (enable &STS_IAA ) ?" IAA" :"" , - (enable &STS_FATAL ) ?" FATAL" :"" , - (enable &STS_FLR ) ?" FLR" :"" , - (enable &STS_PCD ) ?" PCD" :"" , - (enable &STS_ERR ) ?" ERR" :"" , - (enable &STS_INT ) ?" INT" :"" - ); +return scnprintf (buf, len,"%s%sintrenable %02x%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , enable, + (enable &STS_IAA ) ?" IAA" :"" , + (enable &STS_FATAL ) ?" FATAL" :"" , + (enable &STS_FLR ) ?" FLR" :"" , + (enable &STS_PCD ) ?" PCD" :"" , + (enable &STS_ERR ) ?" ERR" :"" , + (enable &STS_INT ) ?" INT" :"" ); }static const char *const fls_strings[] = {"1024" ,"512" ,"256" ,"??" }; -static int -dbg_command_buf (char *buf,unsigned len,const char *label,u32 command) +static int dbg_command_buf (char *buf,unsigned len,const char *label, +u32 command) {return scnprintf (buf, len, -"%s%scommand %07x %s=%d ithresh=%d%s%s%s " -"period=%s%s %s" , - label, label[0 ] ?" " :"" , command, - (command &CMD_PARK ) ?" park" :"(park)" , -CMD_PARK_CNT (command), - (command >>16 ) &0x3f , - (command &CMD_IAAD ) ?" IAAD" :"" , - (command &CMD_ASE ) ?" Async" :"" , - (command &CMD_PSE ) ?" Periodic" :"" , - fls_strings[(command >>2 ) &0x3 ], - (command &CMD_RESET ) ?" Reset" :"" , - (command &CMD_RUN ) ?"RUN" :"HALT" - ); -} - -static char -*dbg_port_buf (char *buf,unsigned len,const char *label,int port,u32 status) -{ -char *sig; +"%s%scommand %07x %s=%d ithresh=%d%s%s%s period=%s%s %s" , + label, label[0 ] ?" " :"" , command, + (command &CMD_PARK ) ?" park" :"(park)" , +CMD_PARK_CNT (command), + (command >>16 ) &0x3f , + (command &CMD_IAAD ) ?" IAAD" :"" , + (command &CMD_ASE ) ?" Async" :"" , + (command &CMD_PSE ) ?" Periodic" :"" , + fls_strings[(command >>2 ) &0x3 ], + (command &CMD_RESET ) ?" Reset" :"" , + (command &CMD_RUN ) ?"RUN" :"HALT" ); +} + +static char *dbg_port_buf (char *buf,unsigned len,const char *label,int port, +u32 status) +{ +char *sig;/* signaling state */ switch (status & (3 <<10 )) {
@@ -268,44 +254,41 @@ static charbreak ; } -scnprintf (buf, len, -"%s%sport:%d status %06x %d " -"sig=%s%s%s%s%s%s%s%s" , - label, label[0 ] ?" " :"" , port, status, - status>>25 ,/*device address */ - sig, - (status &PORT_RESET ) ?" RESET" :"" , - (status &PORT_SUSPEND ) ?" SUSPEND" :"" , - (status &PORT_RESUME ) ?" RESUME" :"" , - (status &PORT_PEC ) ?" PEC" :"" , - (status &PORT_PE ) ?" PE" :"" , - (status &PORT_CSC ) ?" CSC" :"" , - (status &PORT_CONNECT ) ?" CONNECT" :"" ); +scnprintf (buf, len,"%s%sport:%d status %06x %d sig=%s%s%s%s%s%s%s%s" , + label, label[0 ] ?" " :"" , port, status, + status >>25 ,/*device address */ + sig, + (status &PORT_RESET ) ?" RESET" :"" , + (status &PORT_SUSPEND ) ?" SUSPEND" :"" , + (status &PORT_RESUME ) ?" RESUME" :"" , + (status &PORT_PEC ) ?" PEC" :"" , + (status &PORT_PE ) ?" PE" :"" , + (status &PORT_CSC ) ?" CSC" :"" , + (status &PORT_CONNECT ) ?" CONNECT" :"" ); +return buf; }/* functions have the "wrong" filename when they're output... */ -#define dbg_status (fotg210, label, status) { \ - char _buf[80]; \ - dbg_status_buf(_buf, sizeof(_buf), label, status); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ +#define dbg_status (fotg210, label, status) { \ + char _buf[80]; \ + dbg_status_buf(_buf, sizeof(_buf), label, status); \ + fotg210_dbg(fotg210, "%s\n", _buf); \ } -#define dbg_cmd (fotg210, label, command) { \ - char _buf[80]; \ - dbg_command_buf(_buf, sizeof(_buf), label, command); \ - fotg210_dbg(fotg210, "%s\n", _buf); \ +#define dbg_cmd (fotg210, label, command) { \ + char _buf[80]; \ + dbg_command_buf(_buf, sizeof(_buf), label, command); \ + fotg210_dbg(fotg210, "%s\n", _buf); \ } -#define dbg_port (fotg210, label, port, status) { \ - char _buf[80]; \ - fotg210_dbg(fotg210, "%s\n", dbg_port_buf(_buf, sizeof(_buf), label, port, status) ); \ +#define dbg_port (fotg210, label, port, status) { \ + char _buf[80]; \ + fotg210_dbg(fotg210, "%s\n", \ + dbg_port_buf(_buf, sizeof(_buf), label, port, status));\ } -/*-------------------------------------------------------------------------*/ -/* troubleshooting help: expose state in debugfs */ -static int debug_async_open (struct inode *,struct file *);static int debug_periodic_open (struct inode *,struct file *);static int debug_registers_open (struct inode *,struct file *);
@@ -373,33 +356,29 @@ static inline char token_mark(struct fotg210_hcd *fotg210, __hc32 token)return '/' ; } -static void qh_lines ( -struct fotg210_hcd *fotg210, -struct fotg210_qh *qh, -char **nextp, -unsigned *sizep -) -{ -u32 scratch; -u32 hw_curr; -struct fotg210_qtd *td; -unsigned temp; -unsigned size = *sizep; -char *next = *nextp; -char mark; -__le32 list_end =FOTG210_LIST_END (fotg210); -struct fotg210_qh_hw *hw = qh->hw; - -if (hw->hw_qtd_next == list_end)/* NEC does this */ +static void qh_lines (struct fotg210_hcd *fotg210,struct fotg210_qh *qh, +char **nextp,unsigned *sizep) +{ +u32 scratch; +u32 hw_curr; +struct fotg210_qtd *td; +unsigned temp; +unsigned size = *sizep; +char *next = *nextp; +char mark; +__le32 list_end =FOTG210_LIST_END (fotg210); +struct fotg210_qh_hw *hw = qh->hw; + +if (hw->hw_qtd_next == list_end)/* NEC does this */ mark ='@' ;else mark =token_mark (fotg210, hw->hw_token); -if (mark =='/' ) {/* qh_alt_next controls qh advance? */ -if ((hw->hw_alt_next &QTD_MASK (fotg210)) - == fotg210->async->hw->hw_alt_next) - mark ='#' ;/* blocked */ +if (mark =='/' ) {/* qh_alt_next controls qh advance? */ +if ((hw->hw_alt_next &QTD_MASK (fotg210)) == + fotg210->async->hw->hw_alt_next) + mark ='#' ;/* blocked */ else if (hw->hw_alt_next == list_end) - mark ='.' ;/* use hw_qtd_next */ + mark ='.' ;/* use hw_qtd_next */ /* else alt_next points to some other qtd */ } scratch =hc32_to_cpup (fotg210, &hw->hw_info1);
@@ -462,6 +441,7 @@ static void qh_lines( temp =snprintf (next, size,"\n" );if (size < temp) temp = size; + size -= temp; next += temp;
@@ -472,12 +452,12 @@ done:static ssize_t fill_async_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -unsigned temp, size; -char *next; -struct fotg210_qh *qh; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +unsigned temp, size; +char *next; +struct fotg210_qh *qh; hcd =bus_to_hcd (buf->bus); fotg210 =hcd_to_fotg210 (hcd);
@@ -492,7 +472,7 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)*/ spin_lock_irqsave (&fotg210->lock, flags);for (qh = fotg210->async->qh_next.qh; size >0 && qh; - qh = qh->qh_next.qh) + qh = qh->qh_next.qh)qh_lines (fotg210, qh, &next, &size);if (fotg210->async_unlink && size >0 ) { temp =scnprintf (next, size,"\nunlink =\n" );
@@ -511,18 +491,19 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)#define DBG_SCHED_LIMIT 64static ssize_t fill_periodic_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -union fotg210_shadow p, *seen; -unsigned temp, size, seen_count; -char *next; -unsigned i; -__hc32 tag; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +union fotg210_shadow p, *seen; +unsigned temp, size, seen_count; +char *next; +unsigned i; +__hc32 tag; seen =kmalloc (DBG_SCHED_LIMIT *sizeof (*seen),GFP_ATOMIC );if (!seen)return 0 ; + seen_count =0 ; hcd =bus_to_hcd (buf->bus);
@@ -542,6 +523,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) p = fotg210->pshadow[i];if (likely (!p.ptr))continue ; + tag =Q_NEXT_TYPE (fotg210, fotg210->periodic[i]); temp =scnprintf (next, size,"%4d: " , i);
@@ -569,7 +551,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)continue ;if (p.qh->qh_next.ptr) { temp =scnprintf (next, size, -" ..." ); +" ..." ); size -= temp; next += temp; }
@@ -577,10 +559,10 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) }/* show more info the first time around */ if (temp == seen_count) { -u32 scratch =hc32_to_cpup (fotg210, +u32 scratch =hc32_to_cpup (fotg210, &hw->hw_info1); -struct fotg210_qtd *qtd; -char *type ="" ; +struct fotg210_qtd *qtd; +char *type ="" ;/* count tds, get ep direction */ temp =0 ;
@@ -601,8 +583,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) } temp = scnprintf(next, size, - "(%c%d ep%d%s " - "[%d/%d] q%d p%d)", + "(%c%d ep%d%s [%d/%d] q%d p%d)", speed_char(scratch), scratch & 0x007f, (scratch >> 8) & 0x000f, type,
@@ -619,14 +600,14 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)break ;case Q_TYPE_FSTN : temp =scnprintf (next, size, -" fstn-%8x/%p" , p.fstn->hw_prev, - p.fstn); +" fstn-%8x/%p" , + p.fstn->hw_prev, p.fstn); tag =Q_NEXT_TYPE (fotg210, p.fstn->hw_next); p = p.fstn->fstn_next;break ;case Q_TYPE_ITD : temp =scnprintf (next, size, -" itd/%p" , p.itd); +" itd/%p" , p.itd); tag =Q_NEXT_TYPE (fotg210, p.itd->hw_next); p = p.itd->itd_next;break ;
@@ -663,13 +644,13 @@ static const char *rh_state_string(struct fotg210_hcd *fotg210)static ssize_t fill_registers_buffer (struct debug_buffer *buf) { -struct usb_hcd *hcd; -struct fotg210_hcd *fotg210; -unsigned long flags; -unsigned temp, size, i; -char *next, scratch[80 ]; -static const char fmt[] ="%*s\n" ; -static const char label[] ="" ; +struct usb_hcd *hcd; +struct fotg210_hcd *fotg210; +unsigned long flags; +unsigned temp, size, i; +char *next, scratch[80 ]; +static const char fmt[] ="%*s\n" ; +static const char label[] ="" ; hcd =bus_to_hcd (buf->bus); fotg210 =hcd_to_fotg210 (hcd);
@@ -680,26 +661,26 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)if (!HCD_HW_ACCESSIBLE (hcd)) { size =scnprintf (next, size, -"bus %s, device %s\n" -"%s\n" -"SUSPENDED(no register access)\n" , - hcd->self.controller->bus->name, -dev_name (hcd->self.controller), - hcd->product_desc); +"bus %s, device %s\n" +"%s\n" +"SUSPENDED(no register access)\n" , + hcd->self.controller->bus->name, +dev_name (hcd->self.controller), + hcd->product_desc); goto done; }/* Capability Registers */ i =HC_VERSION (fotg210,fotg210_readl (fotg210, - &fotg210->caps->hc_capbase)); + &fotg210->caps->hc_capbase)); temp =scnprintf (next, size, -"bus %s, device %s\n" -"%s\n" -"EHCI %x.%02x, rh state %s\n" , - hcd->self.controller->bus->name, -dev_name (hcd->self.controller), - hcd->product_desc, - i >>8 , i &0x0ff ,rh_state_string (fotg210)); +"bus %s, device %s\n" +"%s\n" +"EHCI %x.%02x, rh state %s\n" , + hcd->self.controller->bus->name, +dev_name (hcd->self.controller), + hcd->product_desc, + i >>8 , i &0x0ff ,rh_state_string (fotg210)); size -= temp; next += temp;
@@ -747,14 +728,14 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)#ifdef FOTG210_STATS temp =scnprintf (next, size, -"irq normal %ld err %ld iaa %ld(lost %ld)\n" , - fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa, - fotg210->stats.lost_iaa); +"irq normal %ld err %ld iaa %ld(lost %ld)\n" , + fotg210->stats.normal, fotg210->stats.error, + fotg210->stats.iaa, fotg210->stats.lost_iaa); size -= temp; next += temp; temp =scnprintf (next, size,"complete %ld unlink %ld\n" , - fotg210->stats.complete, fotg210->stats.unlink); + fotg210->stats.complete, fotg210->stats.unlink); size -= temp; next += temp;#endif
@@ -765,8 +746,8 @@ done:return buf->alloc_size - size; } -static struct debug_buffer *alloc_buffer (struct usb_bus *bus, -ssize_t (*fill_func)(struct debug_buffer *)) +static struct debug_buffer +*alloc_buffer (struct usb_bus *bus,ssize_t (*fill_func)(struct debug_buffer *)) {struct debug_buffer *buf;
@@ -806,7 +787,7 @@ out: }static ssize_t debug_output (struct file *file,char __user *user_buf, -size_t len,loff_t *offset) +size_t len,loff_t *offset) {struct debug_buffer *buf = file->private_data;int ret =0 ;
@@ -822,7 +803,7 @@ static ssize_t debug_output(struct file *file, char __user *user_buf,mutex_unlock (&buf->mutex); ret =simple_read_from_buffer (user_buf, len, offset, - buf->output_buf, buf->count); + buf->output_buf, buf->count); out:return ret;
@@ -850,6 +831,7 @@ static int debug_async_open(struct inode *inode, struct file *file)static int debug_periodic_open (struct inode *inode,struct file *file) {struct debug_buffer *buf; + buf =alloc_buffer (inode->i_private, fill_periodic_buffer);if (!buf)return -ENOMEM ;
@@ -862,7 +844,7 @@ static int debug_periodic_open(struct inode *inode, struct file *file)static int debug_registers_open (struct inode *inode,struct file *file) { file->private_data =alloc_buffer (inode->i_private, - fill_registers_buffer); + fill_registers_buffer);return file->private_data ?0 : -ENOMEM ; }
@@ -872,20 +854,20 @@ static inline void create_debug_files(struct fotg210_hcd *fotg210)struct usb_bus *bus = &fotg210_to_hcd (fotg210)->self; fotg210->debug_dir =debugfs_create_dir (bus->bus_name, - fotg210_debug_root); + fotg210_debug_root);if (!fotg210->debug_dir)return ;if (!debugfs_create_file ("async" ,S_IRUGO , fotg210->debug_dir, bus, - &debug_async_fops)) + &debug_async_fops)) goto file_error;if (!debugfs_create_file ("periodic" ,S_IRUGO , fotg210->debug_dir, bus, - &debug_periodic_fops)) + &debug_periodic_fops)) goto file_error;if (!debugfs_create_file ("registers" ,S_IRUGO , fotg210->debug_dir, bus, - &debug_registers_fops)) + &debug_registers_fops)) goto file_error;return ;
@@ -899,10 +881,7 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)debugfs_remove_recursive (fotg210->debug_dir); } -/*-------------------------------------------------------------------------*/ - -/* -* handshake - spin reading hc until handshake completes or fails +/* handshake - spin reading hc until handshake completes or fails * @ptr: address of hc register to be read * @mask: bits to look at in result of read * @done: value of those bits when handshake succeeds
@@ -919,9 +898,9 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)* bridge shutdown: shutting down the bridge before the devices using it. */ static int handshake (struct fotg210_hcd *fotg210,void __iomem *ptr, -u32 mask,u32 done,int usec) +u32 mask,u32 done,int usec) { -u32 result; +u32 result; do { result = fotg210_readl(fotg210, ptr);
@@ -936,13 +915,12 @@ static int handshake(struct fotg210_hcd *fotg210, void __iomem *ptr,return -ETIMEDOUT ; } -/* -* Force HC to halt state from unknown (EHCI spec section 2.3). +/* Force HC to halt state from unknown (EHCI spec section 2.3). * Must be called with interrupts enabled and the lock not held. */ static int fotg210_halt (struct fotg210_hcd *fotg210) { -u32 temp; +u32 temp;spin_lock_irq (&fotg210->lock);
@@ -962,20 +940,20 @@ static int fotg210_halt(struct fotg210_hcd *fotg210)synchronize_irq (fotg210_to_hcd (fotg210)->irq);return handshake (fotg210, &fotg210->regs->status, -STS_HALT ,STS_HALT ,16 *125 ); +STS_HALT ,STS_HALT ,16 *125 ); } -/* -* Reset a non-running (STS_HALT == 1) controller. +/* Reset a non-running (STS_HALT == 1) controller. * Must be called with interrupts enabled and the lock not held. */ static int fotg210_reset (struct fotg210_hcd *fotg210) { -int retval; -u32 command =fotg210_readl (fotg210, &fotg210->regs->command); +int retval; +u32 command =fotg210_readl (fotg210, &fotg210->regs->command);/* If the EHCI debug controller is active, special care must be -* taken before and after a host controller reset */ +* taken before and after a host controller reset +*/ if (fotg210->debug && !dbgp_reset_prep (fotg210_to_hcd (fotg210))) fotg210->debug =NULL ;
@@ -985,7 +963,7 @@ static int fotg210_reset(struct fotg210_hcd *fotg210) fotg210->rh_state =FOTG210_RH_HALTED ; fotg210->next_statechange = jiffies; retval =handshake (fotg210, &fotg210->regs->command, -CMD_RESET ,0 ,250 *1000 ); +CMD_RESET ,0 ,250 *1000 );if (retval)return retval;
@@ -998,13 +976,12 @@ static int fotg210_reset(struct fotg210_hcd *fotg210)return retval; } -/* -* Idle the controller (turn off the schedules). +/* Idle the controller (turn off the schedules). * Must be called with interrupts enabled and the lock not held. */ static void fotg210_quiesce (struct fotg210_hcd *fotg210) { -u32 temp; +u32 temp;if (fotg210->rh_state !=FOTG210_RH_RUNNING )return ;
@@ -1012,7 +989,7 @@ static void fotg210_quiesce(struct fotg210_hcd *fotg210)/* wait for any schedule enables/disables to take effect */ temp = (fotg210->command <<10 ) & (STS_ASS |STS_PSS );handshake (fotg210, &fotg210->regs->status,STS_ASS |STS_PSS , temp, -16 *125 ); +16 *125 );/* then disable anything that's still active */ spin_lock_irq (&fotg210->lock);
@@ -1022,11 +999,9 @@ static void fotg210_quiesce(struct fotg210_hcd *fotg210)/* hardware can take 16 microframes to turn off ... */ handshake (fotg210, &fotg210->regs->status,STS_ASS |STS_PSS ,0 , -16 *125 ); +16 *125 ); } -/*-------------------------------------------------------------------------*/ -static void end_unlink_async (struct fotg210_hcd *fotg210);static void unlink_empty_async (struct fotg210_hcd *fotg210);static void fotg210_work (struct fotg210_hcd *fotg210);
@@ -1034,8 +1009,6 @@ static void start_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh);static void end_unlink_intr (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); -/*-------------------------------------------------------------------------*/ -/* Set a bit in the USBCMD register */ static void fotg210_set_command_bit (struct fotg210_hcd *fotg210,u32 bit) {
@@ -1056,10 +1029,7 @@ static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit)fotg210_readl (fotg210, &fotg210->regs->command); } -/*-------------------------------------------------------------------------*/ - -/* -* EHCI timer support... Now using hrtimers. +/* EHCI timer support... Now using hrtimers. * * Lots of different events are triggered from fotg210->hrtimer. Whenever * the timer routine runs, it checks each possible event; events that are
@@ -1081,8 +1051,7 @@ static void fotg210_clear_command_bit(struct fotg210_hcd *fotg210, u32 bit)* allow for an expiration range of 1 ms. */ -/* -* Delay lengths for the hrtimer event types. +/* Delay lengths for the hrtimer event types. * Keep this list sorted by delay length, in the same order as * the event types indexed by enum fotg210_hrtimer_event in fotg210.h. */
@@ -1103,7 +1072,7 @@ static unsigned event_delays_ns[] = {static void fotg210_enable_event (struct fotg210_hcd *fotg210,unsigned event,bool resched) { -ktime_t *timeout = &fotg210->hr_timeouts[event]; +ktime_t *timeout = &fotg210->hr_timeouts[event];if (resched) *timeout = ktime_add(ktime_get(),
@@ -1122,7 +1091,7 @@ static void fotg210_enable_event(struct fotg210_hcd *fotg210, unsigned event,/* Poll the STS_ASS status bit; see when it agrees with CMD_ASE */ static void fotg210_poll_ASS (struct fotg210_hcd *fotg210) { -unsigned actual, want; +unsigned actual, want;/* Don't enable anything if the controller isn't running (e.g., died) */ if (fotg210->rh_state !=FOTG210_RH_RUNNING )
@@ -1136,7 +1105,7 @@ static void fotg210_poll_ASS(struct fotg210_hcd *fotg210)/* Poll again later, but give up after about 20 ms */ if (fotg210->ASS_poll_count++ <20 ) {fotg210_enable_event (fotg210,FOTG210_HRTIMER_POLL_ASS , - true); + true);return ; } fotg210_dbg(fotg210, "Waited too long for the async schedule status (%x/%x), giving up\n",
@@ -1154,8 +1123,8 @@ static void fotg210_poll_ASS(struct fotg210_hcd *fotg210)/* Turn off the schedule after a while */ fotg210_enable_event (fotg210, -FOTG210_HRTIMER_DISABLE_ASYNC , - true); +FOTG210_HRTIMER_DISABLE_ASYNC , + true); } } }
@@ -1170,7 +1139,7 @@ static void fotg210_disable_ASE(struct fotg210_hcd *fotg210)/* Poll the STS_PSS status bit; see when it agrees with CMD_PSE */ static void fotg210_poll_PSS (struct fotg210_hcd *fotg210) { -unsigned actual, want; +unsigned actual, want;/* Don't do anything if the controller isn't running (e.g., died) */ if (fotg210->rh_state !=FOTG210_RH_RUNNING )
@@ -1184,7 +1153,7 @@ static void fotg210_poll_PSS(struct fotg210_hcd *fotg210)/* Poll again later, but give up after about 20 ms */ if (fotg210->PSS_poll_count++ <20 ) {fotg210_enable_event (fotg210,FOTG210_HRTIMER_POLL_PSS , - true); + true);return ; } fotg210_dbg(fotg210, "Waited too long for the periodic schedule status (%x/%x), giving up\n",
@@ -1202,8 +1171,8 @@ static void fotg210_poll_PSS(struct fotg210_hcd *fotg210)/* Turn off the schedule after a while */ fotg210_enable_event (fotg210, -FOTG210_HRTIMER_DISABLE_PERIODIC , - true); +FOTG210_HRTIMER_DISABLE_PERIODIC , + true); } } }
@@ -1224,7 +1193,7 @@ static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210)if (fotg210->died_poll_count++ <5 ) {/* Try again later */ fotg210_enable_event (fotg210, -FOTG210_HRTIMER_POLL_DEAD , true); +FOTG210_HRTIMER_POLL_DEAD , true);return ; }fotg210_warn (fotg210,"Waited too long for the controller to stop, giving up\n" );
@@ -1243,7 +1212,7 @@ static void fotg210_handle_controller_death(struct fotg210_hcd *fotg210)/* Handle unlinked interrupt QHs once they are gone from the hardware */ static void fotg210_handle_intr_unlinks (struct fotg210_hcd *fotg210) { -bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING ); +bool stopped = (fotg210->rh_state <FOTG210_RH_RUNNING );/* * Process all the QHs on the intr_unlink list that were added
@@ -1254,7 +1223,7 @@ static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210)*/ fotg210->intr_unlinking = true;while (fotg210->intr_unlink) { -struct fotg210_qh *qh = fotg210->intr_unlink; +struct fotg210_qh *qh = fotg210->intr_unlink;if (!stopped && qh->unlink_cycle == fotg210->intr_unlink_cycle)break ;
@@ -1266,7 +1235,7 @@ static void fotg210_handle_intr_unlinks(struct fotg210_hcd *fotg210)/* Handle remaining entries later */ if (fotg210->intr_unlink) {fotg210_enable_event (fotg210,FOTG210_HRTIMER_UNLINK_INTR , - true); + true); ++fotg210->intr_unlink_cycle; } fotg210->intr_unlinking = false;
@@ -1288,7 +1257,7 @@ static void start_free_itds(struct fotg210_hcd *fotg210)/* Wait for controller to stop using old iTDs and siTDs */ static void end_free_itds (struct fotg210_hcd *fotg210) { -struct fotg210_itd *itd, *n; +struct fotg210_itd *itd, *n;if (fotg210->rh_state <FOTG210_RH_RUNNING ) fotg210->last_itd_to_free =NULL ;
@@ -1339,7 +1308,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)if ((status &STS_IAA ) || !(cmd &CMD_IAAD )) {COUNT (fotg210->stats.lost_iaa);fotg210_writel (fotg210,STS_IAA , - &fotg210->regs->status); + &fotg210->regs->status); } fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n",
@@ -1355,7 +1324,7 @@ static void turn_on_io_watchdog(struct fotg210_hcd *fotg210)/* Not needed if the controller isn't running or it's already enabled */ if (fotg210->rh_state !=FOTG210_RH_RUNNING || (fotg210->enabled_hrtimer_events & -BIT (FOTG210_HRTIMER_IO_WATCHDOG ))) +BIT (FOTG210_HRTIMER_IO_WATCHDOG )))return ;/*
@@ -1365,12 +1334,11 @@ static void turn_on_io_watchdog(struct fotg210_hcd *fotg210)if (fotg210->isoc_count >0 || (fotg210->need_io_watchdog && fotg210->async_count + fotg210->intr_count >0 ))fotg210_enable_event (fotg210,FOTG210_HRTIMER_IO_WATCHDOG , - true); + true); } -/* -* Handler functions for the hrtimer event types. +/* Handler functions for the hrtimer event types. * Keep this array in the same order as the event types indexed by * enum fotg210_hrtimer_event in fotg210.h. */
@@ -1391,10 +1359,10 @@ static enum hrtimer_restart fotg210_hrtimer_func(struct hrtimer *t) {struct fotg210_hcd *fotg210 = container_of(t, struct fotg210_hcd, hrtimer); -ktime_t now; -unsigned long events; -unsigned long flags; -unsigned e; +ktime_t now; +unsigned long events; +unsigned long flags; +unsigned e;spin_lock_irqsave (&fotg210->lock, flags);
@@ -1418,19 +1386,12 @@ static enum hrtimer_restart fotg210_hrtimer_func(struct hrtimer *t)return HRTIMER_NORESTART ; } -/*-------------------------------------------------------------------------*/ - -#define fotg210_bus_suspend NULL -#define fotg210_bus_resume NULL - -/*-------------------------------------------------------------------------*/ +#define fotg210_bus_suspend NULL +#define fotg210_bus_resume NULL -static int check_reset_complete ( -struct fotg210_hcd *fotg210, -int index, -u32 __iomem *status_reg, -int port_status -) { +static int check_reset_complete (struct fotg210_hcd *fotg210,int index, +u32 __iomem *status_reg,int port_status) +{if (!(port_status &PORT_CONNECT ))return port_status;
@@ -1438,30 +1399,27 @@ static int check_reset_complete(if (!(port_status &PORT_PE )) {/* with integrated TT, there's nobody to hand it to! */ fotg210_dbg (fotg210, -"Failed to enable port %d on root hub TT\n" , - index+1 ); +"Failed to enable port %d on root hub TT\n" , + index +1 );return port_status; }else {fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 ); + index +1 ); }return port_status; } -/*-------------------------------------------------------------------------*/ -/* build "status change" packet (one or two bytes) from HC registers */ -static int -fotg210_hub_status_data (struct usb_hcd *hcd,char *buf) +static int fotg210_hub_status_data (struct usb_hcd *hcd,char *buf) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -u32 temp, status; -u32 mask; -int retval =1 ; -unsigned long flags; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +u32 temp, status; +u32 mask; +int retval =1 ; +unsigned long flags;/* init status to no-changes */ buf[0 ] =0 ;
@@ -1488,9 +1446,9 @@ fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)* controller by the user. */ -if ((temp & mask) !=0 ||test_bit (0 , &fotg210->port_c_suspend) - || (fotg210->reset_done[0 ] &&time_after_eq ( - jiffies, fotg210->reset_done[0 ]))) { +if ((temp & mask) !=0 ||test_bit (0 , &fotg210->port_c_suspend) || + (fotg210->reset_done[0 ] && +time_after_eq (jiffies, fotg210->reset_done[0 ]))) { buf[0 ] |=1 <<1 ; status =STS_PCD ; }
@@ -1499,15 +1457,11 @@ fotg210_hub_status_data(struct usb_hcd *hcd, char *buf)return status ? retval :0 ; } -/*-------------------------------------------------------------------------*/ - -static void -fotg210_hub_descriptor ( -struct fotg210_hcd *fotg210, -struct usb_hub_descriptor *desc -) { -int ports =HCS_N_PORTS (fotg210->hcs_params); -u16 temp; +static void fotg210_hub_descriptor (struct fotg210_hcd *fotg210, +struct usb_hub_descriptor *desc) +{ +int ports =HCS_N_PORTS (fotg210->hcs_params); +u16 temp; desc->bDescriptorType =USB_DT_HUB ; desc->bPwrOn2PwrGood =10 ;/* fotg210 1.0, 2.3.9 says 20ms max */
@@ -1526,23 +1480,16 @@ fotg210_hub_descriptor( desc->wHubCharacteristics =cpu_to_le16 (temp); } -/*-------------------------------------------------------------------------*/ - -static int fotg210_hub_control ( -struct usb_hcd *hcd, -u16 typeReq, -u16 wValue, -u16 wIndex, -char *buf, -u16 wLength -) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -int ports =HCS_N_PORTS (fotg210->hcs_params); -u32 __iomem *status_reg = &fotg210->regs->port_status; -u32 temp, temp1, status; -unsigned long flags; -int retval =0 ; -unsigned selector; +static int fotg210_hub_control (struct usb_hcd *hcd,u16 typeReq,u16 wValue, +u16 wIndex,char *buf,u16 wLength) +{ +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +int ports =HCS_N_PORTS (fotg210->hcs_params); +u32 __iomem *status_reg = &fotg210->regs->port_status; +u32 temp, temp1, status; +unsigned long flags; +int retval =0 ; +unsigned selector;/* * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR.
@@ -1605,7 +1552,7 @@ static int fotg210_hub_control(break ;case USB_PORT_FEAT_C_OVER_CURRENT :fotg210_writel (fotg210, temp |OTGISR_OVC , - &fotg210->regs->otgisr); + &fotg210->regs->otgisr);break ;case USB_PORT_FEAT_C_RESET :/* GetPortStatus clears reset */
@@ -1617,7 +1564,7 @@ static int fotg210_hub_control(break ;case GetHubDescriptor:fotg210_hub_descriptor (fotg210, (struct usb_hub_descriptor *) - buf); + buf);break ;case GetHubStatus:/* no hub-wide feature/status flags */
@@ -1663,16 +1610,16 @@ static int fotg210_hub_control(/* stop resume signaling */ temp =fotg210_readl (fotg210, status_reg); -fotg210_writel (fotg210, - temp & ~(PORT_RWC_BITS |PORT_RESUME ), - status_reg); +fotg210_writel (fotg210, temp & + ~(PORT_RWC_BITS |PORT_RESUME ), + status_reg);clear_bit (wIndex, &fotg210->resuming_ports); retval =handshake (fotg210, status_reg, -PORT_RESUME ,0 ,2000 /* 2msec */ ); +PORT_RESUME ,0 ,2000 );/* 2ms */ if (retval !=0 ) {fotg210_err (fotg210, -"port %d resume error %d\n" , - wIndex +1 , retval); +"port %d resume error %d\n" , + wIndex +1 , retval); goto error; } temp &= ~(PORT_SUSPEND |PORT_RESUME |(3 <<10 ));
@@ -1680,17 +1627,16 @@ static int fotg210_hub_control( }/* whoever resets must GetPortStatus to complete it!! */ -if ((temp &PORT_RESET ) - &&time_after_eq (jiffies, - fotg210->reset_done[wIndex])) { +if ((temp &PORT_RESET ) &&time_after_eq (jiffies, + fotg210->reset_done[wIndex])) { status |=USB_PORT_STAT_C_RESET <<16 ; fotg210->reset_done[wIndex] =0 ;clear_bit (wIndex, &fotg210->resuming_ports);/* force reset to complete */ fotg210_writel (fotg210, - temp & ~(PORT_RWC_BITS |PORT_RESET ), - status_reg); + temp & ~(PORT_RWC_BITS |PORT_RESET ), + status_reg);/* REVISIT: some hardware needs 550+ usec to clear * this bit; seems too long to spin routinely... */
@@ -1698,7 +1644,7 @@ static int fotg210_hub_control( PORT_RESET, 0, 1000);if (retval !=0 ) {fotg210_err (fotg210,"port %d reset error %d\n" , - wIndex +1 , retval); + wIndex +1 , retval); goto error; }
@@ -1718,7 +1664,7 @@ static int fotg210_hub_control( temp &= ~PORT_RWC_BITS ;fotg210_writel (fotg210, temp, status_reg);fotg210_dbg (fotg210,"port %d --> companion\n" , - wIndex +1 ); + wIndex +1 ); temp =fotg210_readl (fotg210, status_reg); }
@@ -1788,7 +1734,7 @@ static int fotg210_hub_control(* mode if we have hostpc feature */ fotg210_writel (fotg210, temp |PORT_SUSPEND , - status_reg); + status_reg);set_bit (wIndex, &fotg210->suspended_ports);break ;case USB_PORT_FEAT_RESET :
@@ -1866,9 +1812,8 @@ static int __maybe_unused fotg210_port_handed_over(struct usb_hcd *hcd, {return 0 ; } -/*-------------------------------------------------------------------------*/ -/* -* There's basically three types of memory: + +/* There's basically three types of memory: * - data used only by the HCD ... kmalloc is fine * - async and periodic schedules, shared by HC and HCD ... these * need to use dma_pool or dma_alloc_coherent
@@ -1878,12 +1823,9 @@ static int __maybe_unused fotg210_port_handed_over(struct usb_hcd *hcd,* No memory seen by this driver is pageable. */ -/*-------------------------------------------------------------------------*/ -/* Allocate the key transfer structures from the previously allocated pool */ -static inline void fotg210_qtd_init (struct fotg210_hcd *fotg210, -struct fotg210_qtd *qtd,dma_addr_t dma) +struct fotg210_qtd *qtd,dma_addr_t dma) {memset (qtd,0 ,sizeof (*qtd)); qtd->qtd_dma = dma;
@@ -1894,10 +1836,10 @@ static inline void fotg210_qtd_init(struct fotg210_hcd *fotg210, }static struct fotg210_qtd *fotg210_qtd_alloc (struct fotg210_hcd *fotg210, -gfp_t flags) +gfp_t flags) { -struct fotg210_qtd *qtd; -dma_addr_t dma; +struct fotg210_qtd *qtd; +dma_addr_t dma; qtd =dma_pool_alloc (fotg210->qtd_pool, flags, &dma);if (qtd !=NULL )
@@ -1907,7 +1849,7 @@ static struct fotg210_qtd *fotg210_qtd_alloc(struct fotg210_hcd *fotg210, }static inline void fotg210_qtd_free (struct fotg210_hcd *fotg210, -struct fotg210_qtd *qtd) +struct fotg210_qtd *qtd) {dma_pool_free (fotg210->qtd_pool, qtd, qtd->qtd_dma); }
@@ -1927,10 +1869,10 @@ static void qh_destroy(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) }static struct fotg210_qh *fotg210_qh_alloc (struct fotg210_hcd *fotg210, -gfp_t flags) +gfp_t flags) { -struct fotg210_qh *qh; -dma_addr_t dma; +struct fotg210_qh *qh; +dma_addr_t dma; qh =kzalloc (sizeof (*qh),GFP_ATOMIC );if (!qh)
@@ -1958,8 +1900,6 @@ fail:return NULL ; } -/*-------------------------------------------------------------------------*/ -/* The queue heads and transfer descriptors are managed from pools tied * to each of the "per device" structures. * This is the initialisation and cleanup code.
@@ -1991,8 +1931,8 @@ static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210)if (fotg210->periodic)dma_free_coherent (fotg210_to_hcd (fotg210)->self.controller, - fotg210->periodic_size *sizeof (u32), - fotg210->periodic, fotg210->periodic_dma); + fotg210->periodic_size *sizeof (u32), + fotg210->periodic, fotg210->periodic_dma); fotg210->periodic =NULL ;/* shadow periodic table */
@@ -2039,8 +1979,8 @@ static int fotg210_mem_init(struct fotg210_hcd *fotg210, gfp_t flags)/* Hardware periodic table */ fotg210->periodic = (__le32 *)dma_alloc_coherent (fotg210_to_hcd (fotg210)->self.controller, - fotg210->periodic_size *sizeof (__le32), - &fotg210->periodic_dma,0 ); + fotg210->periodic_size *sizeof (__le32), + &fotg210->periodic_dma,0 );if (fotg210->periodic ==NULL ) goto fail;
@@ -2049,7 +1989,7 @@ static int fotg210_mem_init(struct fotg210_hcd *fotg210, gfp_t flags)/* software shadow of hardware table */ fotg210->pshadow =kcalloc (fotg210->periodic_size,sizeof (void *), - flags); + flags);if (fotg210->pshadow !=NULL )return 0 ;
@@ -2058,9 +1998,7 @@ fail:fotg210_mem_cleanup (fotg210);return -ENOMEM ; } -/*-------------------------------------------------------------------------*/ -/* -* EHCI hardware queue manipulation ... the core. QH/QTD manipulation. +/* EHCI hardware queue manipulation ... the core. QH/QTD manipulation. * * Control, bulk, and interrupt traffic all use "qh" lists. They list "qtd" * entries describing USB transactions, max 16-20kB/entry (with 4kB-aligned
@@ -2077,16 +2015,12 @@ fail:* buffer low/full speed data so the host collects it at high speed. */ -/*-------------------------------------------------------------------------*/ -/* fill a qtd, returning how much of the buffer we were able to queue up */ - -static int -qtd_fill (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd,dma_addr_t buf, -size_t len,int token,int maxpacket) +static int qtd_fill (struct fotg210_hcd *fotg210,struct fotg210_qtd *qtd, +dma_addr_t buf,size_t len,int token,int maxpacket) { -int i, count; -u64 addr = buf; +int i, count; +u64 addr = buf;/* one buffer entry per 4K ... first might be short or unaligned */ qtd->hw_buf[0 ] =cpu_to_hc32 (fotg210, (u32 )addr);
@@ -2121,11 +2055,8 @@ qtd_fill(struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd, dma_addr_t buf,return count; } -/*-------------------------------------------------------------------------*/ - -static inline void -qh_update (struct fotg210_hcd *fotg210,struct fotg210_qh *qh, -struct fotg210_qtd *qtd) +static inline void qh_update (struct fotg210_hcd *fotg210, +struct fotg210_qh *qh,struct fotg210_qtd *qtd) {struct fotg210_qh_hw *hw = qh->hw;
@@ -2141,7 +2072,7 @@ qh_update(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,* ever clear it. */ if (!(hw->hw_info1 &cpu_to_hc32 (fotg210,QH_TOGGLE_CTL ))) { -unsigned is_out, epnum; +unsigned is_out, epnum; is_out = qh->is_out; epnum = (hc32_to_cpup (fotg210, &hw->hw_info1) >>8 ) &0x0f ;
@@ -2158,8 +2089,7 @@ qh_update(struct fotg210_hcd *fotg210, struct fotg210_qh *qh,* overlay, so qh->hw_token wrongly becomes inactive/halted), only fault * recovery (including urb dequeue) would need software changes to a QH... */ -static void -qh_refresh (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static void qh_refresh (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) {struct fotg210_qtd *qtd;
@@ -2185,16 +2115,14 @@ qh_refresh(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)qh_update (fotg210, qh, qtd); } -/*-------------------------------------------------------------------------*/ -static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh);static void fotg210_clear_tt_buffer_complete (struct usb_hcd *hcd,struct usb_host_endpoint *ep) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); -struct fotg210_qh *qh = ep->hcpriv; -unsigned long flags; +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_qh *qh = ep->hcpriv; +unsigned long flags;spin_lock_irqsave (&fotg210->lock, flags); qh->clearing_tt =0 ;
@@ -2205,8 +2133,7 @@ static void fotg210_clear_tt_buffer_complete(struct usb_hcd *hcd, }static void fotg210_clear_tt_buffer (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh, -struct urb *urb,u32 token) +struct fotg210_qh *qh,struct urb *urb,u32 token) {/* If an async split transaction gets an error or is unlinked,
@@ -2217,27 +2144,24 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210,*/ if (urb->dev->tt && !usb_pipeint (urb->pipe) && !qh->clearing_tt) {struct usb_device *tt = urb->dev->tt->hub; +dev_dbg (&tt->dev, -"clear tt buffer port %d, a%d ep%d t%08x\n" , - urb->dev->ttport, urb->dev->devnum, -usb_pipeendpoint (urb->pipe), token); +"clear tt buffer port %d, a%d ep%d t%08x\n" , + urb->dev->ttport, urb->dev->devnum, +usb_pipeendpoint (urb->pipe), token);if (urb->dev->tt->hub != -fotg210_to_hcd (fotg210)->self.root_hub) { +fotg210_to_hcd (fotg210)->self.root_hub) {if (usb_hub_clear_tt_buffer (urb) ==0 ) qh->clearing_tt =1 ; } } } -static int qtd_copy_status ( -struct fotg210_hcd *fotg210, -struct urb *urb, -size_t length, -u32 token -) +static int qtd_copy_status (struct fotg210_hcd *fotg210,struct urb *urb, +size_t length,u32 token) { -int status = -EINPROGRESS ; +int status = -EINPROGRESS ;/* count IN/OUT bytes, not SETUP (even short packets) */ if (likely (QTD_PID (token) !=2 ))
@@ -2274,32 +2198,32 @@ static int qtd_copy_status( }else if (token &QTD_STS_XACT ) {/* timeout, bad CRC, wrong PID, etc */ fotg210_dbg (fotg210,"devpath %s ep%d%s 3strikes\n" , - urb->dev->devpath, -usb_pipeendpoint (urb->pipe), -usb_pipein (urb->pipe) ?"in" :"out" ); + urb->dev->devpath, +usb_pipeendpoint (urb->pipe), +usb_pipein (urb->pipe) ?"in" :"out" ); status = -EPROTO ; }else {/* unknown */ status = -EPROTO ; }fotg210_dbg (fotg210, -"dev%d ep%d%s qtd token %08x --> status %d\n" , -usb_pipedevice (urb->pipe), -usb_pipeendpoint (urb->pipe), -usb_pipein (urb->pipe) ?"in" :"out" , - token, status); +"dev%d ep%d%s qtd token %08x --> status %d\n" , +usb_pipedevice (urb->pipe), +usb_pipeendpoint (urb->pipe), +usb_pipein (urb->pipe) ?"in" :"out" , + token, status); }return status; } -static void -fotg210_urb_done (struct fotg210_hcd *fotg210,struct urb *urb,int status) +static void fotg210_urb_done (struct fotg210_hcd *fotg210,struct urb *urb, +int status) __releases(fotg210->lock) __acquires(fotg210->lock) {if (likely (urb->hcpriv !=NULL )) { -struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv; +struct fotg210_qh *qh = (struct fotg210_qh *) urb->hcpriv;/* S-mask in a QH means it's an interrupt urb */ if ((qh->hw->hw_info2 &cpu_to_hc32 (fotg210,QH_SMASK )) !=0 ) {
@@ -2320,12 +2244,12 @@ __acquires(fotg210->lock)#ifdef FOTG210_URB_TRACE fotg210_dbg (fotg210, -"%s %s urb %p ep%d%s status %d len %d/%d\n" , - __func__, urb->dev->devpath, urb, -usb_pipeendpoint (urb->pipe), -usb_pipein (urb->pipe) ?"in" :"out" , - status, - urb->actual_length, urb->transfer_buffer_length); +"%s %s urb %p ep%d%s status %d len %d/%d\n" , + __func__, urb->dev->devpath, urb, +usb_pipeendpoint (urb->pipe), +usb_pipein (urb->pipe) ?"in" :"out" , + status, + urb->actual_length, urb->transfer_buffer_length);#endif /* complete() can reenter this HCD */
@@ -2337,21 +2261,20 @@ __acquires(fotg210->lock)static int qh_schedule (struct fotg210_hcd *fotg210,struct fotg210_qh *qh); -/* -* Process and free completed qtds for a qh, returning URBs to drivers. +/* Process and free completed qtds for a qh, returning URBs to drivers. * Chases up to qh->hw_current. Returns number of completions called, * indicating how much "real" work we did. */ -static unsigned -qh_completions (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) +static unsigned qh_completions (struct fotg210_hcd *fotg210, +struct fotg210_qh *qh) { -struct fotg210_qtd *last, *end = qh->dummy; -struct list_head *entry, *tmp; -int last_status; -int stopped; -unsigned count =0 ; -u8 state; -struct fotg210_qh_hw *hw = qh->hw; +struct fotg210_qtd *last, *end = qh->dummy; +struct list_head *entry, *tmp; +int last_status; +int stopped; +unsigned count =0 ; +u8 state; +struct fotg210_qh_hw *hw = qh->hw;if (unlikely (list_empty (&qh->qtd_list)))return count;
@@ -2370,7 +2293,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) qh->qh_state =QH_STATE_COMPLETING ; stopped = (state ==QH_STATE_IDLE ); - rescan: +rescan: last =NULL ; last_status = -EINPROGRESS ; qh->needs_rescan =0 ;
@@ -2381,9 +2304,9 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* if queue is stopped, handles unlinks. */ list_for_each_safe (entry, tmp, &qh->qtd_list) { -struct fotg210_qtd *qtd; -struct urb *urb; -u32 token =0 ; +struct fotg210_qtd *qtd; +struct urb *urb; +u32 token =0 ; qtd = list_entry(entry, struct fotg210_qtd, qtd_list); urb = qtd->urb;
@@ -2392,7 +2315,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)if (last) {if (likely (last->urb != urb)) {fotg210_urb_done (fotg210, last->urb, - last_status); + last_status); count++; last_status = -EINPROGRESS ; }
@@ -2409,20 +2332,17 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) token =hc32_to_cpu (fotg210, qtd->hw_token);/* always clean up qtds the hc de-activated */ - retry_xacterr: +retry_xacterr:if ((token &QTD_STS_ACTIVE ) ==0 ) {/* Report Data Buffer Error: non-fatal but useful */ if (token &QTD_STS_DBE )fotg210_dbg (fotg210,"detected DataBufferErr for urb %p ep%d%s len %d, qtd %p [qh %p]\n" , - urb, -usb_endpoint_num (&urb->ep->desc), + urb,usb_endpoint_num (&urb->ep->desc),usb_endpoint_dir_in (&urb->ep->desc) ?"in" :"out" , - urb->transfer_buffer_length, - qtd, - qh); + urb->transfer_buffer_length, qtd, qh);/* on STALL, error, and short reads this urb must * complete and all its qtds must be recycled.
@@ -2433,12 +2353,14 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* reach the software xacterr limit */ if ((token &QTD_STS_XACT ) && -QTD_CERR (token) ==0 && - ++qh->xacterrs <QH_XACTERR_MAX && - !urb->unlinked) { +QTD_CERR (token) ==0 && + ++qh->xacterrs <QH_XACTERR_MAX && + !urb->unlinked) {fotg210_dbg (fotg210, -"detected XactErr len %zu/%zu retry %d\n" , - qtd->length -QTD_LENGTH (token), qtd->length, qh->xacterrs); +"detected XactErr len %zu/%zu retry %d\n" , + qtd->length -QTD_LENGTH (token), + qtd->length, + qh->xacterrs);/* reset the token in the qtd and the * qh overlay (which still contains
@@ -2466,9 +2388,9 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* URB_SHORT_NOT_OK was set so the driver submitting * the urbs could clean it up. */ - }else if (IS_SHORT_READ (token) - && !(qtd->hw_alt_next - &FOTG210_LIST_END (fotg210))) { + }else if (IS_SHORT_READ (token) && + !(qtd->hw_alt_next & +FOTG210_LIST_END (fotg210))) { stopped =1 ; }
@@ -2492,9 +2414,9 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)continue ;/* qh unlinked; token in overlay may be most current */ -if (state ==QH_STATE_IDLE - &&cpu_to_hc32 (fotg210, qtd->qtd_dma) - == hw->hw_current) { +if (state ==QH_STATE_IDLE && +cpu_to_hc32 (fotg210, qtd->qtd_dma) + == hw->hw_current) { token =hc32_to_cpu (fotg210, hw->hw_token);/* An unlink may leave an incomplete
@@ -2502,7 +2424,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)* We have to clear it. */ fotg210_clear_tt_buffer (fotg210, qh, urb, - token); + token); } }
@@ -2516,9 +2438,9 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)if (last_status == -EINPROGRESS ) { last_status =qtd_copy_status (fotg210, urb, qtd->length, token); -if (last_status == -EREMOTEIO - && (qtd->hw_alt_next - &FOTG210_LIST_END (fotg210))) +if (last_status == -EREMOTEIO && + (qtd->hw_alt_next & +FOTG210_LIST_END (fotg210))) last_status = -EINPROGRESS ;/* As part of low/full-speed endpoint-halt processing
@@ -2537,7 +2459,7 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)*/ if (last_status != -EPIPE )fotg210_clear_tt_buffer (fotg210, qh, - urb, token); + urb, token); } }
@@ -2615,26 +2537,21 @@ qh_completions(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)return count; } -/*-------------------------------------------------------------------------*/ -/* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */ #define hb_mult (wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))/* ... and packet size, for any kind of endpoint descriptor */ #define max_packet (wMaxPacketSize) ((wMaxPacketSize) & 0x07ff) -/* -* reverse of qh_urb_transaction: free a list of TDs. +/* reverse of qh_urb_transaction: free a list of TDs. * used for cleanup after errors, before HC sees an URB's TDs. */ -static void qtd_list_free ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list -) { -struct list_head *entry, *temp; +static void qtd_list_free (struct fotg210_hcd *fotg210,struct urb *urb, +struct list_head *qtd_list) +{ +struct list_head *entry, *temp;list_for_each_safe (entry, temp, qtd_list) { -struct fotg210_qtd *qtd; +struct fotg210_qtd *qtd; qtd = list_entry(entry, struct fotg210_qtd, qtd_list);list_del (&qtd->qtd_list);
@@ -2642,23 +2559,18 @@ static void qtd_list_free( } } -/* -* create a list of filled qtds for this URB; won't link into qh. +/* create a list of filled qtds for this URB; won't link into qh. */ -static struct list_head * -qh_urb_transaction ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *head, -gfp_t flags -) { -struct fotg210_qtd *qtd, *qtd_prev; -dma_addr_t buf; -int len, this_sg_len, maxpacket; -int is_input; -u32 token; -int i; -struct scatterlist *sg; +static struct list_head *qh_urb_transaction (struct fotg210_hcd *fotg210, +struct urb *urb,struct list_head *head,gfp_t flags) +{ +struct fotg210_qtd *qtd, *qtd_prev; +dma_addr_t buf; +int len, this_sg_len, maxpacket; +int is_input; +u32 token; +int i; +struct scatterlist *sg;/* * URBs map to sequences of QTDs: one logical transaction
@@ -2768,8 +2680,8 @@ qh_urb_transaction(* have the alt_next mechanism keep the queue running after the * last data qtd (the only one, for control and most other cases). */ -if (likely ((urb->transfer_flags &URB_SHORT_NOT_OK ) ==0 - ||usb_pipecontrol (urb->pipe))) +if (likely ((urb->transfer_flags &URB_SHORT_NOT_OK ) ==0 || +usb_pipecontrol (urb->pipe))) qtd->hw_alt_next =FOTG210_LIST_END (fotg210);/*
@@ -2778,7 +2690,7 @@ qh_urb_transaction(* (zero length). */ if (likely (urb->transfer_buffer_length !=0 )) { -int one_more =0 ; +int one_more =0 ;if (usb_pipecontrol (urb->pipe)) { one_more =1 ;
@@ -2813,9 +2725,7 @@ cleanup:return NULL ; } -/*-------------------------------------------------------------------------*/ -/* -* Would be best to create all qh's from config descriptors, +/* Would be best to create all qh's from config descriptors, * when each interface/altsetting is established. Unlink * any previous qh and cancel its urbs first; endpoints are * implicitly reset then (data toggle too).
@@ -2823,26 +2733,22 @@ cleanup:*/ -/* -* Each QH holds a qtd list; a QH is used for everything except iso. +/* Each QH holds a qtd list; a QH is used for everything except iso. * * For interrupt urbs, the scheduler must set the microframe scheduling * mask(s) each time the QH gets scheduled. For highspeed, that's * just one microframe in the s-mask. For split interrupt transactions * there are additional complications: c-mask, maybe FSTNs. */ -static struct fotg210_qh * -qh_make ( -struct fotg210_hcd *fotg210, -struct urb *urb, -gfp_t flags -) { -struct fotg210_qh *qh =fotg210_qh_alloc (fotg210, flags); -u32 info1 =0 , info2 =0 ; -int is_input, type; -int maxp =0 ; -struct usb_tt *tt = urb->dev->tt; -struct fotg210_qh_hw *hw; +static struct fotg210_qh *qh_make (struct fotg210_hcd *fotg210,struct urb *urb, +gfp_t flags) +{ +struct fotg210_qh *qh =fotg210_qh_alloc (fotg210, flags); +u32 info1 =0 , info2 =0 ; +int is_input, type; +int maxp =0 ; +struct usb_tt *tt = urb->dev->tt; +struct fotg210_qh_hw *hw;if (!qh)return qh;
@@ -2862,7 +2768,7 @@ qh_make(*/ if (max_packet (maxp) >1024 ) {fotg210_dbg (fotg210,"bogus qh maxpacket %d\n" , -max_packet (maxp)); +max_packet (maxp)); goto done; }
@@ -2896,7 +2802,7 @@ qh_make( urb->interval = qh->period <<3 ; } }else { -int think_time; +int think_time;/* gap is f(FS/LS transfer times) */ qh->gap_uf = 1 + usb_calc_bus_time(urb->dev->speed,
@@ -2986,7 +2892,7 @@ qh_make(break ;default :fotg210_dbg (fotg210,"bogus dev %p speed %d\n" , urb->dev, - urb->dev->speed); + urb->dev->speed); done:qh_destroy (fotg210, qh);return NULL ;
@@ -3005,8 +2911,6 @@ done:return qh; } -/*-------------------------------------------------------------------------*/ -static void enable_async (struct fotg210_hcd *fotg210) {if (fotg210->async_count++)
@@ -3036,8 +2940,8 @@ static void disable_async(struct fotg210_hcd *fotg210)static void qh_link_async (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -__hc32 dma =QH_NEXT (fotg210, qh->qh_dma); -struct fotg210_qh *head; +__hc32 dma =QH_NEXT (fotg210, qh->qh_dma); +struct fotg210_qh *head;/* Don't link a QH if there's a Clear-TT-Buffer pending */ if (unlikely (qh->clearing_tt))
@@ -3064,24 +2968,17 @@ static void qh_link_async(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)enable_async (fotg210); } -/*-------------------------------------------------------------------------*/ - -/* -* For control/bulk/interrupt, return QH with these TDs appended. +/* For control/bulk/interrupt, return QH with these TDs appended. * Allocates and initializes the QH if necessary. * Returns null if it can't allocate a QH it needs to. * If the QH has TDs (urbs) already, that's great. */ -static struct fotg210_qh *qh_append_tds ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list, -int epnum, -void **ptr -) +static struct fotg210_qh *qh_append_tds (struct fotg210_hcd *fotg210, +struct urb *urb,struct list_head *qtd_list, +int epnum,void **ptr) { -struct fotg210_qh *qh =NULL ; -__hc32 qh_addr_mask =cpu_to_hc32 (fotg210,0x7f ); +struct fotg210_qh *qh =NULL ; +__hc32 qh_addr_mask =cpu_to_hc32 (fotg210,0x7f ); qh = (struct fotg210_qh *) *ptr;if (unlikely (qh ==NULL )) {
@@ -3090,7 +2987,7 @@ static struct fotg210_qh *qh_append_tds( *ptr = qh; }if (likely (qh !=NULL )) { -struct fotg210_qtd *qtd; +struct fotg210_qtd *qtd;if (unlikely (list_empty (qtd_list))) qtd =NULL ;
@@ -3109,9 +3006,9 @@ static struct fotg210_qh *qh_append_tds(* only hc or qh_refresh() ever modify the overlay. */ if (likely (qtd !=NULL )) { -struct fotg210_qtd *dummy; -dma_addr_t dma; -__hc32 token; +struct fotg210_qtd *dummy; +dma_addr_t dma; +__hc32 token;/* to avoid racing the HC, use the dummy td instead of * the first td of our list (becomes new dummy). both
@@ -3150,32 +3047,28 @@ static struct fotg210_qh *qh_append_tds(return qh; } -/*-------------------------------------------------------------------------*/ - -static int -submit_async ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list, -gfp_t mem_flags -) { -int epnum; -unsigned long flags; -struct fotg210_qh *qh =NULL ; -int rc; +static int submit_async (struct fotg210_hcd *fotg210,struct urb *urb, +struct list_head *qtd_list,gfp_t mem_flags) +{ +int epnum; +unsigned long flags; +struct fotg210_qh *qh =NULL ; +int rc; epnum = urb->ep->desc.bEndpointAddress;#ifdef FOTG210_URB_TRACE {struct fotg210_qtd *qtd; + qtd = list_entry(qtd_list->next, struct fotg210_qtd, qtd_list);fotg210_dbg (fotg210, -"%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n" , - __func__, urb->dev->devpath, urb, - epnum &0x0f , (epnum &USB_DIR_IN ) ?"in" :"out" , - urb->transfer_buffer_length, - qtd, urb->ep->hcpriv); +"%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n" , + __func__, urb->dev->devpath, urb, + epnum &0x0f , (epnum &USB_DIR_IN ) + ?"in" :"out" , + urb->transfer_buffer_length, + qtd, urb->ep->hcpriv); }#endif
@@ -3200,19 +3093,17 @@ submit_async(*/ if (likely (qh->qh_state ==QH_STATE_IDLE ))qh_link_async (fotg210, qh); - done: +done:spin_unlock_irqrestore (&fotg210->lock, flags);if (unlikely (qh ==NULL ))qtd_list_free (fotg210, urb, qtd_list);return rc; } -/*-------------------------------------------------------------------------*/ -static void single_unlink_async (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +struct fotg210_qh *qh) { -struct fotg210_qh *prev; +struct fotg210_qh *prev;/* Add to the end of the list of QHs waiting for the next IAAD */ qh->qh_state =QH_STATE_UNLINK ;
@@ -3260,7 +3151,7 @@ static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested) &fotg210->regs->command);fotg210_readl (fotg210, &fotg210->regs->command);fotg210_enable_event (fotg210,FOTG210_HRTIMER_IAA_WATCHDOG , - true); + true); } }
@@ -3268,10 +3159,10 @@ static void start_iaa_cycle(struct fotg210_hcd *fotg210, bool nested)static void end_unlink_async (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; +struct fotg210_qh *qh;/* Process the idle QHs */ - restart: +restart: fotg210->async_unlinking = true;while (fotg210->async_iaa) { qh = fotg210->async_iaa;
@@ -3326,7 +3217,7 @@ static void unlink_empty_async(struct fotg210_hcd *fotg210)/* QHs that haven't been empty for long enough will be handled later */ if (check_unlinks_later) {fotg210_enable_event (fotg210,FOTG210_HRTIMER_ASYNC_UNLINKS , - true); + true); ++fotg210->async_unlink_cycle; } }
@@ -3335,7 +3226,7 @@ static void unlink_empty_async(struct fotg210_hcd *fotg210)/* caller must own fotg210->lock */ static void start_unlink_async (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +struct fotg210_qh *qh) {/* * If the QH isn't linked then there's nothing we can do
@@ -3352,18 +3243,16 @@ static void start_unlink_async(struct fotg210_hcd *fotg210,start_iaa_cycle (fotg210, false); } -/*-------------------------------------------------------------------------*/ -static void scan_async (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; -bool check_unlinks_later = false; +struct fotg210_qh *qh; +bool check_unlinks_later = false; fotg210->qh_scan_next = fotg210->async->qh_next.qh;while (fotg210->qh_scan_next) { qh = fotg210->qh_scan_next; fotg210->qh_scan_next = qh->qh_next.qh; - rescan: +rescan:/* clean any finished work for this qh */ if (!list_empty (&qh->qtd_list)) {int temp;
@@ -3395,15 +3284,13 @@ static void scan_async(struct fotg210_hcd *fotg210)*/ if (check_unlinks_later && fotg210->rh_state ==FOTG210_RH_RUNNING && !(fotg210->enabled_hrtimer_events & -BIT (FOTG210_HRTIMER_ASYNC_UNLINKS ))) { +BIT (FOTG210_HRTIMER_ASYNC_UNLINKS ))) {fotg210_enable_event (fotg210, -FOTG210_HRTIMER_ASYNC_UNLINKS , true); +FOTG210_HRTIMER_ASYNC_UNLINKS , true); ++fotg210->async_unlink_cycle; } } -/*-------------------------------------------------------------------------*/ -/* -* EHCI scheduled transaction support: interrupt, iso, split iso +/* EHCI scheduled transaction support: interrupt, iso, split iso * These are called "periodic" transactions in the EHCI spec. * * Note that for interrupt transfers, the QH/QTD manipulation is shared
@@ -3414,19 +3301,14 @@ static void scan_async(struct fotg210_hcd *fotg210)* It keeps track of every ITD (or SITD) that's linked, and holds enough * pre-calculated schedule data to make appending to the queue be quick. */ -static int fotg210_get_frame (struct usb_hcd *hcd); -/*-------------------------------------------------------------------------*/ - -/* -* periodic_next_shadow - return "next" pointer on shadow list +/* periodic_next_shadow - return "next" pointer on shadow list * @periodic: host pointer to qh/itd * @tag: hardware tag for type of this record */ -static union fotg210_shadow * -periodic_next_shadow (struct fotg210_hcd *fotg210, -union fotg210_shadow *periodic,__hc32 tag) +static union fotg210_shadow *periodic_next_shadow (struct fotg210_hcd *fotg210, +union fotg210_shadow *periodic,__hc32 tag) {switch (hc32_to_cpu (fotg210, tag)) {case Q_TYPE_QH :
@@ -3438,9 +3320,8 @@ periodic_next_shadow(struct fotg210_hcd *fotg210, } } -static __hc32 * -shadow_next_periodic (struct fotg210_hcd *fotg210, -union fotg210_shadow *periodic,__hc32 tag) +static __hc32 *shadow_next_periodic (struct fotg210_hcd *fotg210, +union fotg210_shadow *periodic,__hc32 tag) {switch (hc32_to_cpu (fotg210, tag)) {/* our fotg210_shadow.qh is actually software part */
@@ -3454,11 +3335,11 @@ shadow_next_periodic(struct fotg210_hcd *fotg210,/* caller must hold fotg210->lock */ static void periodic_unlink (struct fotg210_hcd *fotg210,unsigned frame, -void *ptr) +void *ptr) { -union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow here = *prev_p; +union fotg210_shadow *prev_p = &fotg210->pshadow[frame]; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow here = *prev_p;/* find predecessor of "ptr"; hw and shadow lists are in sync */ while (here.ptr && here.ptr != ptr) {
@@ -3479,17 +3360,17 @@ static void periodic_unlink(struct fotg210_hcd *fotg210, unsigned frame, Q_NEXT_TYPE(fotg210, *hw_p)); *hw_p = *shadow_next_periodic (fotg210, &here, -Q_NEXT_TYPE (fotg210, *hw_p)); +Q_NEXT_TYPE (fotg210, *hw_p)); }/* how many of the uframe's 125 usecs are allocated? */ -static unsigned short -periodic_usecs (struct fotg210_hcd *fotg210,unsigned frame,unsigned uframe) +static unsigned short periodic_usecs (struct fotg210_hcd *fotg210, +unsigned frame,unsigned uframe) { -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow *q = &fotg210->pshadow[frame]; -unsigned usecs =0 ; -struct fotg210_qh_hw *hw; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow *q = &fotg210->pshadow[frame]; +unsigned usecs =0 ; +struct fotg210_qh_hw *hw;while (q->ptr) {switch (hc32_to_cpu (fotg210,Q_NEXT_TYPE (fotg210, *hw_p))) {
@@ -3526,12 +3407,10 @@ periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe) }if (usecs > fotg210->uframe_periodic_max)fotg210_err (fotg210,"uframe %d sched overrun: %d usecs\n" , - frame *8 + uframe, usecs); + frame *8 + uframe, usecs);return usecs; } -/*-------------------------------------------------------------------------*/ -static int same_tt (struct usb_device *dev1,struct usb_device *dev2) {if (!dev1->tt || !dev2->tt)
@@ -3548,13 +3427,8 @@ static int same_tt(struct usb_device *dev1, struct usb_device *dev2)* for a periodic transfer starting at the specified frame, using * all the uframes in the mask. */ -static int tt_no_collision ( -struct fotg210_hcd *fotg210, -unsigned period, -struct usb_device *dev, -unsigned frame, -u32 uf_mask -) +static int tt_no_collision (struct fotg210_hcd *fotg210,unsigned period, +struct usb_device *dev,unsigned frame,u32 uf_mask) {if (period ==0 )/* error */ return 0 ;
@@ -3564,9 +3438,9 @@ static int tt_no_collision(* calling convention doesn't make that distinction. */ for (; frame < fotg210->periodic_size; frame += period) { -union fotg210_shadow here; -__hc32 type; -struct fotg210_qh_hw *hw; +union fotg210_shadow here; +__hc32 type; +struct fotg210_qh_hw *hw; here = fotg210->pshadow[frame]; type =Q_NEXT_TYPE (fotg210, fotg210->periodic[frame]);
@@ -3579,7 +3453,7 @@ static int tt_no_collision(case Q_TYPE_QH : hw = here.qh->hw;if (same_tt (dev, here.qh->dev)) { -u32 mask; +u32 mask; mask =hc32_to_cpu (fotg210, hw->hw_info2);
@@ -3594,8 +3468,8 @@ static int tt_no_collision(/* case Q_TYPE_FSTN: */ default :fotg210_dbg (fotg210, -"periodic frame %d bogus type %d\n" , - frame, type); +"periodic frame %d bogus type %d\n" , + frame, type); }/* collision or error */
@@ -3607,8 +3481,6 @@ static int tt_no_collision(return 1 ; } -/*-------------------------------------------------------------------------*/ -static void enable_periodic (struct fotg210_hcd *fotg210) {if (fotg210->periodic_count++)
@@ -3632,8 +3504,6 @@ static void disable_periodic(struct fotg210_hcd *fotg210)fotg210_poll_PSS (fotg210); } -/*-------------------------------------------------------------------------*/ -/* periodic schedule slots have iso tds (normal or split) first, then a * sparse tree for active interrupt transfers. *
@@ -3642,24 +3512,24 @@ static void disable_periodic(struct fotg210_hcd *fotg210)*/ static void qh_link_periodic (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -unsigned i; -unsigned period = qh->period; +unsigned i; +unsigned period = qh->period;dev_dbg (&qh->dev->dev, -"link qh%d-%04x/%p start %d [%d/%d us]\n" , - period,hc32_to_cpup (fotg210, &qh->hw->hw_info2) - & (QH_CMASK |QH_SMASK ), - qh, qh->start, qh->usecs, qh->c_usecs); +"link qh%d-%04x/%p start %d [%d/%d us]\n" , period, +hc32_to_cpup (fotg210, &qh->hw->hw_info2) & + (QH_CMASK |QH_SMASK ), qh, qh->start, qh->usecs, + qh->c_usecs);/* high bandwidth, or otherwise every microframe */ if (period ==0 ) period =1 ;for (i = qh->start; i < fotg210->periodic_size; i += period) { -union fotg210_shadow *prev = &fotg210->pshadow[i]; -__hc32 *hw_p = &fotg210->periodic[i]; -union fotg210_shadow here = *prev; -__hc32 type =0 ; +union fotg210_shadow *prev = &fotg210->pshadow[i]; +__hc32 *hw_p = &fotg210->periodic[i]; +union fotg210_shadow here = *prev; +__hc32 type =0 ;/* skip the iso nodes at list head */ while (here.ptr) {
@@ -3707,10 +3577,10 @@ static void qh_link_periodic(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) }static void qh_unlink_periodic (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +struct fotg210_qh *qh) { -unsigned i; -unsigned period; +unsigned i; +unsigned period;/* * If qh is for a low/full-speed device, simply unlinking it
@@ -3741,10 +3611,10 @@ static void qh_unlink_periodic(struct fotg210_hcd *fotg210, : (qh->usecs * 8);dev_dbg (&qh->dev->dev, -"unlink qh%d-%04x/%p start %d [%d/%d us]\n" , - qh->period, -hc32_to_cpup (fotg210, &qh->hw->hw_info2) & - (QH_CMASK |QH_SMASK ), qh, qh->start, qh->usecs, qh->c_usecs); +"unlink qh%d-%04x/%p start %d [%d/%d us]\n" , + qh->period,hc32_to_cpup (fotg210, &qh->hw->hw_info2) & + (QH_CMASK |QH_SMASK ), qh, qh->start, qh->usecs, + qh->c_usecs);/* qh->qh_next still "live" to HC */ qh->qh_state =QH_STATE_UNLINK ;
@@ -3757,7 +3627,7 @@ static void qh_unlink_periodic(struct fotg210_hcd *fotg210, }static void start_unlink_intr (struct fotg210_hcd *fotg210, -struct fotg210_qh *qh) +struct fotg210_qh *qh) {/* If the QH isn't linked then there's nothing we can do * unless we were called during a giveback, in which case
@@ -3794,15 +3664,15 @@ static void start_unlink_intr(struct fotg210_hcd *fotg210,fotg210_handle_intr_unlinks (fotg210); else if (fotg210->intr_unlink == qh) {fotg210_enable_event (fotg210,FOTG210_HRTIMER_UNLINK_INTR , - true); + true); ++fotg210->intr_unlink_cycle; } }static void end_unlink_intr (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -struct fotg210_qh_hw *hw = qh->hw; -int rc; +struct fotg210_qh_hw *hw = qh->hw; +int rc; qh->qh_state =QH_STATE_IDLE ; hw->hw_next =FOTG210_LIST_END (fotg210);
@@ -3811,7 +3681,7 @@ static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)/* reschedule QH iff another request is queued */ if (!list_empty (&qh->qtd_list) && - fotg210->rh_state ==FOTG210_RH_RUNNING ) { + fotg210->rh_state ==FOTG210_RH_RUNNING ) { rc =qh_schedule (fotg210, qh);/* An error here likely indicates handshake failure
@@ -3830,16 +3700,10 @@ static void end_unlink_intr(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)disable_periodic (fotg210); } -/*-------------------------------------------------------------------------*/ - -static int check_period ( -struct fotg210_hcd *fotg210, -unsigned frame, -unsigned uframe, -unsigned period, -unsigned usecs -) { -int claimed; +static int check_period (struct fotg210_hcd *fotg210,unsigned frame, +unsigned uframe,unsigned period,unsigned usecs) +{ +int claimed;/* complete split running into next frame? * given FSTN support, we could sometimes check...
@@ -3857,7 +3721,7 @@ static int check_period( do { for (uframe = 0; uframe < 7; uframe++) { claimed = periodic_usecs(fotg210, frame, - uframe); + uframe); if (claimed > usecs) return 0; }
@@ -3876,16 +3740,11 @@ static int check_period(return 1 ; } -static int check_intr_schedule ( -struct fotg210_hcd *fotg210, -unsigned frame, -unsigned uframe, -const struct fotg210_qh *qh, -__hc32 *c_maskp -) +static int check_intr_schedule (struct fotg210_hcd *fotg210,unsigned frame, +unsigned uframe,const struct fotg210_qh *qh,__hc32 *c_maskp) { -int retval = -ENOSPC ; -u8 mask =0 ; +int retval = -ENOSPC ; +u8 mask =0 ;if (qh->c_usecs && uframe >=6 )/* FSTN territory? */ goto done;
@@ -3911,10 +3770,10 @@ static int check_intr_schedule( mask |=1 << uframe;if (tt_no_collision (fotg210, qh->period, qh->dev, frame, mask)) {if (!check_period (fotg210, frame, uframe + qh->gap_uf +1 , - qh->period, qh->c_usecs)) + qh->period, qh->c_usecs)) goto done;if (!check_period (fotg210, frame, uframe + qh->gap_uf, - qh->period, qh->c_usecs)) + qh->period, qh->c_usecs)) goto done; retval =0 ; }
@@ -3927,11 +3786,11 @@ done:*/ static int qh_schedule (struct fotg210_hcd *fotg210,struct fotg210_qh *qh) { -int status; -unsigned uframe; -__hc32 c_mask; -unsigned frame;/* 0..(qh->period - 1), or NO_FRAME */ -struct fotg210_qh_hw *hw = qh->hw; +int status; +unsigned uframe; +__hc32 c_mask; +unsigned frame;/* 0..(qh->period - 1), or NO_FRAME */ +struct fotg210_qh_hw *hw = qh->hw;qh_refresh (fotg210, qh); hw->hw_next =FOTG210_LIST_END (fotg210);
@@ -3954,7 +3813,7 @@ static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh)if (status) {/* "normal" case, uframing flexible except with splits */ if (qh->period) { -int i; +int i;for (i = qh->period; status && i >0 ; --i) { frame = ++fotg210->random_frame % qh->period;
@@ -3971,7 +3830,7 @@ static int qh_schedule(struct fotg210_hcd *fotg210, struct fotg210_qh *qh) }else { frame =0 ; status =check_intr_schedule (fotg210,0 ,0 , qh, - &c_mask); + &c_mask); }if (status) goto done;
@@ -3992,17 +3851,14 @@ done:return status; } -static int intr_submit ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct list_head *qtd_list, -gfp_t mem_flags -) { -unsigned epnum; -unsigned long flags; -struct fotg210_qh *qh; -int status; -struct list_head empty; +static int intr_submit (struct fotg210_hcd *fotg210,struct urb *urb, +struct list_head *qtd_list,gfp_t mem_flags) +{ +unsigned epnum; +unsigned long flags; +struct fotg210_qh *qh; +int status; +struct list_head empty;/* get endpoint and transfer/schedule data */ epnum = urb->ep->desc.bEndpointAddress;
@@ -4050,11 +3906,11 @@ done_not_linked:static void scan_intr (struct fotg210_hcd *fotg210) { -struct fotg210_qh *qh; +struct fotg210_qh *qh;list_for_each_entry_safe (qh, fotg210->qh_scan_next, - &fotg210->intr_qh_list, intr_node) { - rescan: + &fotg210->intr_qh_list, intr_node) { +rescan:/* clean any finished work for this qh */ if (!list_empty (&qh->qtd_list)) {int temp;
@@ -4069,7 +3925,7 @@ static void scan_intr(struct fotg210_hcd *fotg210) temp =qh_completions (fotg210, qh);if (unlikely (qh->needs_rescan || (list_empty (&qh->qtd_list) && - qh->qh_state ==QH_STATE_LINKED ))) + qh->qh_state ==QH_STATE_LINKED )))start_unlink_intr (fotg210, qh);else if (temp !=0 ) goto rescan;
@@ -4077,12 +3933,9 @@ static void scan_intr(struct fotg210_hcd *fotg210) } } -/*-------------------------------------------------------------------------*/ -/* fotg210_iso_stream ops work with both ITD and SITD */ -static struct fotg210_iso_stream * -iso_stream_alloc (gfp_t mem_flags) +static struct fotg210_iso_stream *iso_stream_alloc (gfp_t mem_flags) {struct fotg210_iso_stream *stream;
@@ -4095,20 +3948,15 @@ iso_stream_alloc(gfp_t mem_flags)return stream; } -static void -iso_stream_init ( -struct fotg210_hcd *fotg210, -struct fotg210_iso_stream *stream, -struct usb_device *dev, -int pipe, -unsigned interval -) +static void iso_stream_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_stream *stream,struct usb_device *dev, +int pipe,unsigned interval) { -u32 buf1; -unsigned epnum, maxp; -int is_input; -long bandwidth; -unsigned multi; +u32 buf1; +unsigned epnum, maxp; +int is_input; +long bandwidth; +unsigned multi;/* * this might be a "high bandwidth" highspeed endpoint,
@@ -4153,13 +4001,13 @@ iso_stream_init( stream->maxp = maxp; } -static struct fotg210_iso_stream * -iso_stream_find (struct fotg210_hcd *fotg210,struct urb *urb) +static struct fotg210_iso_stream *iso_stream_find (struct fotg210_hcd *fotg210, +struct urb *urb) { -unsigned epnum; -struct fotg210_iso_stream *stream; +unsigned epnum; +struct fotg210_iso_stream *stream;struct usb_host_endpoint *ep; -unsigned long flags; +unsigned long flags; epnum =usb_pipeendpoint (urb->pipe);if (usb_pipein (urb->pipe))
@@ -4182,8 +4030,8 @@ iso_stream_find(struct fotg210_hcd *fotg210, struct urb *urb)/* if dev->ep[epnum] is a QH, hw is set */ }else if (unlikely (stream->hw !=NULL )) {fotg210_dbg (fotg210,"dev %s ep%d%s, not iso??\n" , - urb->dev->devpath, epnum, -usb_pipein (urb->pipe) ?"in" :"out" ); + urb->dev->devpath, epnum, +usb_pipein (urb->pipe) ?"in" :"out" ); stream =NULL ; }
@@ -4191,15 +4039,13 @@ iso_stream_find(struct fotg210_hcd *fotg210, struct urb *urb)return stream; } -/*-------------------------------------------------------------------------*/ -/* fotg210_iso_sched ops can be ITD-only or SITD-only */ -static struct fotg210_iso_sched * -iso_sched_alloc (unsigned packets,gfp_t mem_flags) +static struct fotg210_iso_sched *iso_sched_alloc (unsigned packets, +gfp_t mem_flags) { -struct fotg210_iso_sched *iso_sched; -int size =sizeof (*iso_sched); +struct fotg210_iso_sched *iso_sched; +int size =sizeof (*iso_sched); size += packets *sizeof (struct fotg210_iso_packet ); iso_sched =kzalloc (size, mem_flags);
@@ -4209,16 +4055,12 @@ iso_sched_alloc(unsigned packets, gfp_t mem_flags)return iso_sched; } -static inline void -itd_sched_init ( -struct fotg210_hcd *fotg210, -struct fotg210_iso_sched *iso_sched, -struct fotg210_iso_stream *stream, -struct urb *urb -) +static inline void itd_sched_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_sched *iso_sched, +struct fotg210_iso_stream *stream,struct urb *urb) { -unsigned i; -dma_addr_t dma = urb->transfer_dma; +unsigned i; +dma_addr_t dma = urb->transfer_dma;/* how many uframes are needed for these transfers */ iso_sched->span = urb->number_of_packets * stream->interval;
@@ -4227,10 +4069,10 @@ itd_sched_init(* when we fit new itds into the schedule. */ for (i =0 ; i < urb->number_of_packets; i++) { -struct fotg210_iso_packet *uframe = &iso_sched->packet[i]; -unsigned length; -dma_addr_t buf; -u32 trans; +struct fotg210_iso_packet *uframe = &iso_sched->packet[i]; +unsigned length; +dma_addr_t buf; +u32 trans; length = urb->iso_frame_desc[i].length; buf = dma + urb->iso_frame_desc[i].offset;
@@ -4251,11 +4093,8 @@ itd_sched_init( } } -static void -iso_sched_free ( -struct fotg210_iso_stream *stream, -struct fotg210_iso_sched *iso_sched -) +static void iso_sched_free (struct fotg210_iso_stream *stream, +struct fotg210_iso_sched *iso_sched) {if (!iso_sched)return ;
@@ -4264,20 +4103,15 @@ iso_sched_free(kfree (iso_sched); } -static int -itd_urb_transaction ( -struct fotg210_iso_stream *stream, -struct fotg210_hcd *fotg210, -struct urb *urb, -gfp_t mem_flags -) +static int itd_urb_transaction (struct fotg210_iso_stream *stream, +struct fotg210_hcd *fotg210,struct urb *urb,gfp_t mem_flags) { -struct fotg210_itd *itd; -dma_addr_t itd_dma; -int i; -unsigned num_itds; -struct fotg210_iso_sched *sched; -unsigned long flags; +struct fotg210_itd *itd; +dma_addr_t itd_dma; +int i; +unsigned num_itds; +struct fotg210_iso_sched *sched; +unsigned long flags; sched =iso_sched_alloc (urb->number_of_packets, mem_flags);if (unlikely (sched ==NULL ))
@@ -4306,7 +4140,7 @@ itd_urb_transaction(list_del (&itd->itd_list); itd_dma = itd->itd_dma; }else { - alloc_itd: +alloc_itd:spin_unlock_irqrestore (&fotg210->lock, flags); itd =dma_pool_alloc (fotg210->itd_pool, mem_flags, &itd_dma);
@@ -4330,16 +4164,8 @@ itd_urb_transaction(return 0 ; } -/*-------------------------------------------------------------------------*/ - -static inline int -itd_slot_ok ( -struct fotg210_hcd *fotg210, -u32 mod, -u32 uframe, -u8 usecs, -u32 period -) +static inline int itd_slot_ok (struct fotg210_hcd *fotg210,u32 mod,u32 uframe, +u8 usecs,u32 period) { uframe %= period; do {
@@ -4354,8 +4180,7 @@ itd_slot_ok(return 1 ; } -/* -* This scheduler plans almost as far into the future as it has actual +/* This scheduler plans almost as far into the future as it has actual * periodic schedule slots. (Affected by TUNE_FLS, which defaults to * "as small as possible" to be cache-friendlier.) That limits the size * transfers you can stream reliably; avoid more than 64 msec per urb.
@@ -4365,19 +4190,15 @@ itd_slot_ok(* given FOTG210_TUNE_FLS and the slop). Or, write a smarter scheduler! */ -#define SCHEDULE_SLOP 80/* microframes */ +#define SCHEDULE_SLOP 80/* microframes */ -static int -iso_stream_schedule ( -struct fotg210_hcd *fotg210, -struct urb *urb, -struct fotg210_iso_stream *stream -) +static int iso_stream_schedule (struct fotg210_hcd *fotg210,struct urb *urb, +struct fotg210_iso_stream *stream) { -u32 now, next, start, period, span; -int status; -unsigned mod = fotg210->periodic_size <<3 ; -struct fotg210_iso_sched *sched = urb->hcpriv; +u32 now, next, start, period, span; +int status; +unsigned mod = fotg210->periodic_size <<3 ; +struct fotg210_iso_sched *sched = urb->hcpriv; period = urb->interval; span = sched->span;
@@ -4396,7 +4217,7 @@ iso_stream_schedule(* slot in the schedule, implicitly assuming URB_ISO_ASAP. */ if (likely (!list_empty (&stream->td_list))) { -u32 excess; +u32 excess;/* For high speed devices, allow scheduling within the * isochronous scheduling threshold. For full speed devices
@@ -4435,6 +4256,7 @@ iso_stream_schedule(*/ else {int done =0 ; + start =SCHEDULE_SLOP + (now & ~0x07 );/* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */
@@ -4457,15 +4279,15 @@ iso_stream_schedule(/* no room in the schedule */ if (!done) {fotg210_dbg (fotg210,"iso resched full %p (now %d max %d)\n" , - urb, now, now + mod); + urb, now, now + mod); status = -ENOSPC ; goto fail; } }/* Tried to schedule too far into the future? */ -if (unlikely (start - now + span - period - >= mod -2 *SCHEDULE_SLOP )) { +if (unlikely (start - now + span - period >= + mod -2 *SCHEDULE_SLOP )) {fotg210_dbg (fotg210,"request %p would overflow (%d+%d >= %d)\n" , urb, start - now, span - period, mod -2 *SCHEDULE_SLOP );
@@ -4485,17 +4307,14 @@ iso_stream_schedule( fotg210->next_frame = now >>3 ;return 0 ; - fail: +fail:iso_sched_free (stream, sched); urb->hcpriv =NULL ;return status; } -/*-------------------------------------------------------------------------*/ - -static inline void -itd_init (struct fotg210_hcd *fotg210,struct fotg210_iso_stream *stream, -struct fotg210_itd *itd) +static inline void itd_init (struct fotg210_hcd *fotg210, +struct fotg210_iso_stream *stream,struct fotg210_itd *itd) {int i;
@@ -4511,17 +4330,12 @@ itd_init(struct fotg210_hcd *fotg210, struct fotg210_iso_stream *stream,/* All other fields are filled when scheduling */ } -static inline void -itd_patch ( -struct fotg210_hcd *fotg210, -struct fotg210_itd *itd, -struct fotg210_iso_sched *iso_sched, -unsigned index, -u16 uframe -) +static inline void itd_patch (struct fotg210_hcd *fotg210, +struct fotg210_itd *itd,struct fotg210_iso_sched *iso_sched, +unsigned index,u16 uframe) { -struct fotg210_iso_packet *uf = &iso_sched->packet[index]; -unsigned pg = itd->pg; +struct fotg210_iso_packet *uf = &iso_sched->packet[index]; +unsigned pg = itd->pg; uframe &=0x07 ; itd->index[uframe] = index;
@@ -4533,7 +4347,7 @@ itd_patch(/* iso_frame_desc[].offset must be strictly increasing */ if (unlikely (uf->cross)) { -u64 bufp = uf->bufp +4096 ; +u64 bufp = uf->bufp +4096 ; itd->pg = ++pg; itd->hw_bufp[pg] |=cpu_to_hc32 (fotg210, bufp & ~(u32 )0 );
@@ -4541,13 +4355,13 @@ itd_patch( } } -static inline void -itd_link (struct fotg210_hcd *fotg210,unsigned frame,struct fotg210_itd *itd) +static inline void itd_link (struct fotg210_hcd *fotg210,unsigned frame, +struct fotg210_itd *itd) { -union fotg210_shadow *prev = &fotg210->pshadow[frame]; -__hc32 *hw_p = &fotg210->periodic[frame]; -union fotg210_shadow here = *prev; -__hc32 type =0 ; +union fotg210_shadow *prev = &fotg210->pshadow[frame]; +__hc32 *hw_p = &fotg210->periodic[frame]; +union fotg210_shadow here = *prev; +__hc32 type =0 ;/* skip any iso nodes which might belong to previous microframes */ while (here.ptr) {
@@ -4568,17 +4382,13 @@ itd_link(struct fotg210_hcd *fotg210, unsigned frame, struct fotg210_itd *itd) }/* fit urb's itds into the selected schedule slot; activate as needed */ -static void itd_link_urb ( -struct fotg210_hcd *fotg210, -struct urb *urb, -unsigned mod, -struct fotg210_iso_stream *stream -) -{ -int packet; -unsigned next_uframe, uframe, frame; -struct fotg210_iso_sched *iso_sched = urb->hcpriv; -struct fotg210_itd *itd; +static void itd_link_urb (struct fotg210_hcd *fotg210,struct urb *urb, +unsigned mod,struct fotg210_iso_stream *stream) +{ +int packet; +unsigned next_uframe, uframe, frame; +struct fotg210_iso_sched *iso_sched = urb->hcpriv; +struct fotg210_itd *itd; next_uframe = stream->next_uframe & (mod -1 );
@@ -4621,7 +4431,7 @@ static void itd_link_urb(if (((next_uframe >>3 ) != frame) || packet == urb->number_of_packets) {itd_link (fotg210, frame & (fotg210->periodic_size -1 ), - itd); + itd); itd =NULL ; } }
@@ -4635,8 +4445,8 @@ static void itd_link_urb(enable_periodic (fotg210); } -#define ISO_ERRS (FOTG210_ISOC_BUF_ERR | FOTG210_ISOC_BABBLE |\ - FOTG210_ISOC_XACTERR) +#define ISO_ERRS (FOTG210_ISOC_BUF_ERR | FOTG210_ISOC_BABBLE |\ + FOTG210_ISOC_XACTERR)/* Process and recycle a completed ITD. Return true iff its urb completed, * and hence its completion callback probably added things to the hardware
@@ -4650,14 +4460,14 @@ static void itd_link_urb(*/ static bool itd_complete (struct fotg210_hcd *fotg210,struct fotg210_itd *itd) { -struct urb *urb = itd->urb; -struct usb_iso_packet_descriptor *desc; -u32 t; -unsigned uframe; -int urb_index =-1 ; -struct fotg210_iso_stream *stream = itd->stream; -struct usb_device *dev; -bool retval = false; +struct urb *urb = itd->urb; +struct usb_iso_packet_descriptor *desc; +u32 t; +unsigned uframe; +int urb_index =-1 ; +struct fotg210_iso_stream *stream = itd->stream; +struct usb_device *dev; +bool retval = false;/* for each uframe with a packet */ for (uframe =0 ; uframe <8 ; uframe++) {
@@ -4702,8 +4512,8 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) goto done;/* ASSERT: it's really the last itd for this urb -list_for_each_entry (itd, &stream->td_list, itd_list) -BUG_ON (itd->urb == urb); +* list_for_each_entry (itd, &stream->td_list, itd_list) +* BUG_ON (itd->urb == urb); */ /* give urb back to the driver; completion often (re)submits */
@@ -4740,14 +4550,12 @@ done:return retval; } -/*-------------------------------------------------------------------------*/ -static int itd_submit (struct fotg210_hcd *fotg210,struct urb *urb, -gfp_t mem_flags) +gfp_t mem_flags) { -int status = -EINVAL ; -unsigned long flags; -struct fotg210_iso_stream *stream; +int status = -EINVAL ; +unsigned long flags; +struct fotg210_iso_stream *stream;/* Get iso_stream head */ stream =iso_stream_find (fotg210, urb);
@@ -4756,22 +4564,22 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,return -ENOMEM ; }if (unlikely (urb->interval != stream->interval && -fotg210_port_speed (fotg210,0 ) == -USB_PORT_STAT_HIGH_SPEED )) { -fotg210_dbg (fotg210,"can't change iso interval %d --> %d\n" , +fotg210_port_speed (fotg210,0 ) == +USB_PORT_STAT_HIGH_SPEED )) { +fotg210_dbg (fotg210,"can't change iso interval %d --> %d\n" , stream->interval, urb->interval); - goto done; + goto done; }#ifdef FOTG210_URB_TRACE fotg210_dbg (fotg210, -"%s %s urb %p ep%d%s len %d, %d pkts %d uframes[%p]\n" , - __func__, urb->dev->devpath, urb, -usb_pipeendpoint (urb->pipe), -usb_pipein (urb->pipe) ?"in" :"out" , - urb->transfer_buffer_length, - urb->number_of_packets, urb->interval, - stream); +"%s %s urb %p ep%d%s len %d, %d pkts %d uframes[%p]\n" , + __func__, urb->dev->devpath, urb, +usb_pipeendpoint (urb->pipe), +usb_pipein (urb->pipe) ?"in" :"out" , + urb->transfer_buffer_length, + urb->number_of_packets, urb->interval, + stream);#endif /* allocate ITDs w/o locking anything */
@@ -4795,9 +4603,9 @@ static int itd_submit(struct fotg210_hcd *fotg210, struct urb *urb,itd_link_urb (fotg210, urb, fotg210->periodic_size <<3 , stream); elseusb_hcd_unlink_urb_from_ep (fotg210_to_hcd (fotg210 ),urb ); - done_not_linked: +done_not_linked:spin_unlock_irqrestore (&fotg210->lock, flags); - done: +done:return status; }
@@ -4876,7 +4684,7 @@ restart:break ;default :fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , - type, frame, q.ptr); + type, frame, q.ptr);/* FALL THROUGH */ case Q_TYPE_QH :case Q_TYPE_FSTN :
@@ -4897,16 +4705,14 @@ restart: } fotg210->next_frame = now_frame; } -/*-------------------------------------------------------------------------*/ -/* -* Display / Set uframe_periodic_max + +/* Display / Set uframe_periodic_max */ static ssize_t show_uframe_periodic_max (struct device *dev, -struct device_attribute *attr, -char *buf) +struct device_attribute *attr,char *buf) { -struct fotg210_hcd *fotg210; -int n; +struct fotg210_hcd *fotg210; +int n; fotg210 =hcd_to_fotg210 (bus_to_hcd (dev_get_drvdata (dev))); n =scnprintf (buf,PAGE_SIZE ,"%d\n" , fotg210->uframe_periodic_max);
@@ -4915,15 +4721,14 @@ static ssize_t show_uframe_periodic_max(struct device *dev,static ssize_t store_uframe_periodic_max (struct device *dev, -struct device_attribute *attr, -const char *buf,size_t count) +struct device_attribute *attr,const char *buf,size_t count) { -struct fotg210_hcd *fotg210; -unsigned uframe_periodic_max; -unsigned frame, uframe; -unsigned short allocated_max; -unsigned long flags; -ssize_t ret; +struct fotg210_hcd *fotg210; +unsigned uframe_periodic_max; +unsigned frame, uframe; +unsigned short allocated_max; +unsigned long flags; +ssize_t ret; fotg210 =hcd_to_fotg210 (bus_to_hcd (dev_get_drvdata (dev)));if (kstrtouint (buf,0 , &uframe_periodic_max) <0 )
@@ -4931,7 +4736,7 @@ static ssize_t store_uframe_periodic_max(struct device *dev,if (uframe_periodic_max <100 || uframe_periodic_max >=125 ) {fotg210_info (fotg210,"rejecting invalid request for uframe_periodic_max=%u\n" , - uframe_periodic_max); + uframe_periodic_max);return -EINVAL ; }
@@ -4954,22 +4759,22 @@ static ssize_t store_uframe_periodic_max(struct device *dev,for (frame =0 ; frame < fotg210->periodic_size; ++frame)for (uframe =0 ; uframe <7 ; ++uframe) allocated_max =max (allocated_max, -periodic_usecs (fotg210, frame, uframe)); +periodic_usecs (fotg210, frame, + uframe));if (allocated_max > uframe_periodic_max) {fotg210_info (fotg210, -"cannot decrease uframe_periodic_max because " -"periodic bandwidth is already allocated " -"(%u > %u)\n" , - allocated_max, uframe_periodic_max); +"cannot decrease uframe_periodic_max because periodic bandwidth is already allocated (%u > %u)\n" , + allocated_max, uframe_periodic_max); goto out_unlock; } }/* increasing is always ok */ -fotg210_info (fotg210,"setting max periodic bandwidth to %u%% (== %u usec/uframe)\n" , -100 * uframe_periodic_max/125 , uframe_periodic_max); +fotg210_info (fotg210, +"setting max periodic bandwidth to %u%% (== %u usec/uframe)\n" , +100 * uframe_periodic_max/125 , uframe_periodic_max);if (uframe_periodic_max !=100 )fotg210_warn (fotg210,"max periodic bandwidth set is non-standard\n" );
@@ -4987,8 +4792,8 @@ static DEVICE_ATTR(uframe_periodic_max, 0644, show_uframe_periodic_max,static inline int create_sysfs_files (struct fotg210_hcd *fotg210) { -struct device *controller =fotg210_to_hcd (fotg210)->self.controller; -int i =0 ; +struct device *controller =fotg210_to_hcd (fotg210)->self.controller; +int i =0 ;if (i) goto out;
@@ -5000,12 +4805,10 @@ out:static inline void remove_sysfs_files (struct fotg210_hcd *fotg210) { -struct device *controller =fotg210_to_hcd (fotg210)->self.controller; +struct device *controller =fotg210_to_hcd (fotg210)->self.controller;device_remove_file (controller, &dev_attr_uframe_periodic_max); } -/*-------------------------------------------------------------------------*/ -/* On some systems, leaving remote wakeup enabled prevents system shutdown. * The firmware seems to think that powering off is a wakeup event! * This routine turns off remote wakeup and everything else, on all ports.
@@ -5017,8 +4820,7 @@ static void fotg210_turn_off_all_ports(struct fotg210_hcd *fotg210)fotg210_writel (fotg210,PORT_RWC_BITS , status_reg); } -/* -* Halt HC, turn off all ports, and let the BIOS use the companion controllers. +/* Halt HC, turn off all ports, and let the BIOS use the companion controllers. * Must be called with interrupts enabled and the lock not held. */ static void fotg210_silence_controller (struct fotg210_hcd *fotg210)
@@ -5037,7 +4839,7 @@ static void fotg210_silence_controller(struct fotg210_hcd *fotg210)*/ static void fotg210_shutdown (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd);spin_lock_irq (&fotg210->lock); fotg210->shutdown = true;
@@ -5050,10 +4852,7 @@ static void fotg210_shutdown(struct usb_hcd *hcd)hrtimer_cancel (&fotg210->hrtimer); } -/*-------------------------------------------------------------------------*/ - -/* -* fotg210_work is called from some interrupts, timers, and so on. +/* fotg210_work is called from some interrupts, timers, and so on. * it calls driver completion functions, after dropping fotg210->lock. */ static void fotg210_work (struct fotg210_hcd *fotg210)
@@ -5068,7 +4867,7 @@ static void fotg210_work(struct fotg210_hcd *fotg210) } fotg210->scanning = true; - rescan: +rescan: fotg210->need_rescan = false;if (fotg210->async_count)scan_async (fotg210);
@@ -5087,12 +4886,11 @@ static void fotg210_work(struct fotg210_hcd *fotg210)turn_on_io_watchdog (fotg210); } -/* -* Called when the fotg210_hcd module is removed. +/* Called when the fotg210_hcd module is removed. */ static void fotg210_stop (struct usb_hcd *hcd) { -struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd); +struct fotg210_hcd *fotg210 =hcd_to_fotg210 (hcd);fotg210_dbg (fotg210,"stop\n" );
@@ -5116,26 +4914,26 @@ static void fotg210_stop(struct usb_hcd *hcd)spin_unlock_irq (&fotg210->lock);fotg210_mem_cleanup (fotg210); -#ifdef FOTG210_STATS +#ifdef FOTG210_STATS fotg210_dbg (fotg210,"irq normal %ld err %ld iaa %ld (lost %ld)\n" , - fotg210->stats.normal, fotg210->stats.error, fotg210->stats.iaa, - fotg210->stats.lost_iaa); + fotg210->stats.normal, fotg210->stats.error, + fotg210->stats.iaa, fotg210->stats.lost_iaa);fotg210_dbg (fotg210,"complete %ld unlink %ld\n" , - fotg210->stats.complete, fotg210->stats.unlink); + fotg210->stats.complete, fotg210->stats.unlink);#endif dbg_status (fotg210,"fotg210_stop completed" , -fotg210_readl (fotg210, &fotg210->regs->status)); +fotg210_readl (fotg210, &fotg210->regs->status)); }/* one-time init, only for memory state */ static int hcd_fotg210_init (struct usb_hcd *hcd) {
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.1.0
Part of the diff is not shown here. View the raw message.
PATCH 2/9 usb/host/fotg210: remove KERN_WARNING from pr_warn
In reply to Peter Senna TschudinThis patch remove KERN_WARNING from a call to pr_warn().
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -5700,7 +5700,7 @@ static int __init fotg210_hcd_init(void)set_bit (USB_EHCI_LOADED , &usb_hcds_loaded);if (test_bit (USB_UHCI_LOADED , &usb_hcds_loaded) ||test_bit (USB_OHCI_LOADED , &usb_hcds_loaded)) -pr_warn (KERN_WARNING "Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); +pr_warn ("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n" ); pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd\n", hcd_name, sizeof(struct fotg210_qh),
Signature · 1 line
2.1.0
PATCH 3/9 usb/host/fotg210: Remove useless else statement
In reply to Peter Senna TschudinThis patch remove an else statement after a return to make the code easier to understand.
--- drivers/usb/host/fotg210-hcd.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/usb/host/fotg210-hcd.c +2 -3
@@ -1402,10 +1402,9 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,"Failed to enable port %d on root hub TT\n" , index + 1);return port_status; - }else { -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 ); } +fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , + index +1 );return port_status; }
Signature · 1 line
2.1.0
Re: [PATCH 3/9] usb/host/fotg210: Remove useless else statement
Quoted 2 lines · Peter Senna Tschudin
This patch remove an else statement after a return to make the code easier to understand.
[]
drivers/usb/host/fotg210-hcd.c
Quoted 1 line
drivers/usb/host/fotg210-hcd.c +0
-0
[]
drivers/usb/host/fotg210-hcd.c static int check_reset_complete(struct fotg210_hcd *fotg210, int index, · line 1410
Quoted 13 lines
drivers/usb/host/fotg210-hcd.c +2
-3@@ -1402,10 +1402,9 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,"Failed to enable port %d on root hub TT\n" , index + 1);return port_status; - }else { -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 ); } +fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , + index +1 );return port_status; }
Probably better written as:
/* if reset finished and it's still not enabled -- handoff */ if (!(port_status & PORT_PE)) /* with integrated TT, there's nobody to hand it to! */ fotg210_dbg(fotg210, "failed to enable port %d on root hub TT\n", index + 1); else fotg210_dbg(fotg210, "port %d reset complete, port enabled\n", index + 1); return port_status;
PATCH v2 3/9 usb/host/fotg210: Remove return statement inside if
This patch make changes to an if else statement which simplifies the code allowing to remove a return.
---
Subject was: [PATCH 3/9] usb/host/fotg210: Remove useless else statement
To be applied on top of V1.
Changes from V1:
Instead of just removing the else statement, remove the return inside the if statement so the code is even more readable.
drivers/usb/host/fotg210-hcd.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
drivers/usb/host/fotg210-hcd.c +5 -7
@@ -1396,15 +1396,13 @@ static int check_reset_complete(struct fotg210_hcd *fotg210, int index,return port_status;/* if reset finished and it's still not enabled -- handoff */ -if (!(port_status &PORT_PE )) { +if (!(port_status &PORT_PE ))/* with integrated TT, there's nobody to hand it to! */ -fotg210_dbg (fotg210, -"Failed to enable port %d on root hub TT\n" , +fotg210_dbg (fotg210,"Failed to enable port %d on root hub TT\n" , + index +1 ); +else +fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , index +1 ); -return port_status; - } -fotg210_dbg (fotg210,"port %d reset complete, port enabled\n" , - index +1 );return port_status; }
Signature · 1 line
2.1.0
PATCH 4/9 usb/host/fotg210: Remove NULL checks dma_pool_destroy
In reply to Peter Senna TschudinThis patch remove NULL checks before calls to dma_pool_destroy() as the function now can handle NULL pointers.
--- drivers/usb/host/fotg210-hcd.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/usb/host/fotg210-hcd.c +4 -8
@@ -1915,17 +1915,13 @@ static void fotg210_mem_cleanup(struct fotg210_hcd *fotg210) fotg210->dummy =NULL ;/* DMA consistent memory and pools */ -if (fotg210->qtd_pool) -dma_pool_destroy (fotg210->qtd_pool); +dma_pool_destroy (fotg210->qtd_pool); fotg210->qtd_pool =NULL ; -if (fotg210->qh_pool) { -dma_pool_destroy (fotg210->qh_pool); - fotg210->qh_pool =NULL ; - } +dma_pool_destroy (fotg210->qh_pool); + fotg210->qh_pool =NULL ; -if (fotg210->itd_pool) -dma_pool_destroy (fotg210->itd_pool); +dma_pool_destroy (fotg210->itd_pool); fotg210->itd_pool =NULL ;if (fotg210->periodic)
Signature · 1 line
2.1.0
PATCH 5/9 usb/host/fotg210: change kmalloc by kmalloc_array
In reply to Peter Senna TschudinThis patch replaces:
kmalloc(DBG_SCHED_LIMIT * sizeof(*seen), GFP_ATOMIC)
by:
kmalloc_array(DBG_SCHED_LIMIT, sizeof(*seen), GFP_ATOMIC)
as kmalloc_array() should be used for allocating arrays.
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -500,7 +500,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf)unsigned i;__hc32 tag; - seen =kmalloc (DBG_SCHED_LIMIT *sizeof (*seen),GFP_ATOMIC ); + seen =kmalloc_array (DBG_SCHED_LIMIT ,sizeof (*seen),GFP_ATOMIC );if (!seen)return 0 ;
Signature · 1 line
2.1.0
PATCH 6/9 usb/host/fotg210: replace msleep by usleep_range
In reply to Peter Senna Tschudinmsleep under 20ms can result in sleeping up to 20ms, which may not be intended. Replace msleep(5) by usleep_range(5000, 10000). The range of 5 ms is to reduce the chances of creating an interrupt while reducing the maximum wait time in 50%.
--- drivers/usb/host/fotg210-hcd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/host/fotg210-hcd.c +1 -1
@@ -5085,7 +5085,7 @@ static int fotg210_run(struct usb_hcd *hcd) fotg210->rh_state =FOTG210_RH_RUNNING ;/* unblock posted writes */ fotg210_readl (fotg210, &fotg210->regs->command); -msleep (5 ); +usleep_range (5000 ,10000 );up_write (&ehci_cf_port_reset_rwsem); fotg210->last_periodic_enable =ktime_get_real ();
Signature · 1 line
2.1.0
PATCH 7/9 usb/host/fotg210: convert macro to inline function
In reply to Peter Senna TschudinThis patch convert the macro speed_char in an inline function. The goal of this patch is to make the code easier to read.
--- drivers/usb/host/fotg210-hcd.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/usb/host/fotg210-hcd.c +16 -11
@@ -330,17 +330,22 @@ struct debug_buffer {size_t alloc_size; }; -#define speed_char (info1)({ char tmp; \ - switch (info1 & (3 << 12)) { \ - case QH_FULL_SPEED: \ - tmp = 'f'; break; \ - case QH_LOW_SPEED: \ - tmp = 'l'; break; \ - case QH_HIGH_SPEED: \ - tmp = 'h'; break; \ - default: \ - tmp = '?'; break; \ - } tmp; }) +static inline char speed_char (u32 scratch) +{ +switch (scratch & (3 <<12 )) { +case QH_FULL_SPEED : +return 'f' ; + +case QH_LOW_SPEED : +return 'l' ; + +case QH_HIGH_SPEED : +return 'h' ; + +default : +return '?' ; + } +}static inline char token_mark (struct fotg210_hcd *fotg210,__hc32 token) {
Signature · 1 line
2.1.0
PATCH 8/9 usb/host/fotg210: Add function: output_buf_tds_dir()
In reply to Peter Senna Tschudincheckpatch complains about too many leading tabs because the switch statement starts after 6 tabs.
fill_periodic_buffer() -> for() -> do -> switch() -> if() -> list_for_each_entry() and finally the last switch().
This patch moves the list_for_each_entry() and the last switch() to a new function named output_buf_tds_dir(). This change makes the code easier to read and calm down checkpatch. This patch changes it to:
fill_periodic_buffer() -> for() -> do -> switch() -> if() -> output_buf_tds_dir()
--- drivers/usb/host/fotg210-hcd.c | 62 +++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 31 deletions(-)
drivers/usb/host/fotg210-hcd.c +31 -31
@@ -493,6 +493,34 @@ static ssize_t fill_async_buffer(struct debug_buffer *buf)return strlen (buf->output_buf); } +/* count tds, get ep direction */ +static unsigned output_buf_tds_dir (char *buf,struct fotg210_hcd *fotg210, +struct fotg210_qh_hw *hw,struct fotg210_qh *qh,unsigned size) +{ +u32 scratch =hc32_to_cpup (fotg210, &hw->hw_info1); +struct fotg210_qtd *qtd; +char *type ="" ; +unsigned temp =0 ; + +/* count tds, get ep direction */ +list_for_each_entry (qtd, &qh->qtd_list, qtd_list) { + temp++; +switch ((hc32_to_cpu (fotg210, qtd->hw_token) >>8 ) &0x03 ) { +case 0 : + type ="out" ; +continue ; +case 1 : + type ="in" ; +continue ; + } + } + +return scnprintf (buf, size,"(%c%d ep%d%s [%d/%d] q%d p%d)" , +speed_char (scratch), scratch &0x007f , + (scratch >>8 ) &0x000f , type, qh->usecs, + qh->c_usecs, temp, (scratch >>16 ) &0x7ff ); +} +#define DBG_SCHED_LIMIT 64static ssize_t fill_periodic_buffer (struct debug_buffer *buf) {
@@ -564,37 +592,9 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) }/* show more info the first time around */ if (temp == seen_count) { -u32 scratch =hc32_to_cpup (fotg210, - &hw->hw_info1); -struct fotg210_qtd *qtd; -char *type ="" ; - -/* count tds, get ep direction */ - temp =0 ; -list_for_each_entry (qtd, - &p.qh->qtd_list, - qtd_list) { - temp++; -switch (0x03 & (hc32_to_cpu ( - fotg210, - qtd->hw_token) >>8 )) { -case 0 : - type ="out" ; -continue ; -case 1 : - type ="in" ; -continue ; - } - } - - temp =scnprintf (next, size, -"(%c%d ep%d%s [%d/%d] q%d p%d)" , -speed_char (scratch), - scratch &0x007f , - (scratch >>8 ) &0x000f , type, - p.qh->usecs, p.qh->c_usecs, - temp, -0x7ff & (scratch >>16 )); + temp =output_buf_tds_dir (next, + fotg210, hw, + p.qh, size);if (seen_count <DBG_SCHED_LIMIT ) seen[seen_count++].qh = p.qh;
Signature · 1 line
2.1.0
PATCH 9/9 usb/host/fotg210: Add function scan_frame_queue()
In reply to Peter Senna Tschudincheckpatch complains about too many leading tabs because the if statement starts after 6 tabs:
scan_iosoc() -> for() -> while() -> switch() -> if() -> for() -> if()
There is also a goto statement going backwards in case of failure. This patch creates a new inline function named scan_frame_queue() containing the last 4 nesting levels, and removes the need of backwards goto, making the code easier to read. After the patch it becomes:
scan_iosoc() -> for() -> while() -> scan_frame_queue()
--- drivers/usb/host/fotg210-hcd.c | 143 ++++++++++++++++++++++------------------- 1 file changed, 76 insertions(+), 67 deletions(-)
drivers/usb/host/fotg210-hcd.c +76 -67
@@ -4609,13 +4609,81 @@ done:return status; } -/*-------------------------------------------------------------------------*/ +static inline int scan_frame_queue (struct fotg210_hcd *fotg210,unsigned frame, +unsigned now_frame,bool live) +{ +unsigned uf; +bool modified; +union fotg210_shadow q, *q_p; +__hc32 type, *hw_p; + +/* scan each element in frame's queue for completions */ + q_p = &fotg210->pshadow[frame]; + hw_p = &fotg210->periodic[frame]; + q.ptr = q_p->ptr; + type =Q_NEXT_TYPE (fotg210, *hw_p); + modified = false; + +while (q.ptr) { +switch (hc32_to_cpu (fotg210, type)) { +case Q_TYPE_ITD : +/* If this ITD is still active, leave it for +* later processing ... check the next entry. +* No need to check for activity unless the +* frame is current. +*/ +if (frame == now_frame && live) { +rmb (); +for (uf =0 ; uf <8 ; uf++) { +if (q.itd->hw_transaction[uf] & +ITD_ACTIVE (fotg210)) +break ; + } +if (uf <8 ) { + q_p = &q.itd->itd_next; + hw_p = &q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, + q.itd->hw_next); + q = *q_p; +break ; + } + } + +/* Take finished ITDs out of the schedule +* and process them: recycle, maybe report +* URB completion. HC won't cache the +* pointer for much longer, if at all. +*/ + *q_p = q.itd->itd_next; + *hw_p = q.itd->hw_next; + type =Q_NEXT_TYPE (fotg210, q.itd->hw_next); +wmb (); + modified =itd_complete (fotg210, q.itd); + q = *q_p; +break ; +default : +fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , + type, frame, q.ptr); +/* FALL THROUGH */ +case Q_TYPE_QH : +case Q_TYPE_FSTN : +/* End of the iTDs and siTDs */ + q.ptr =NULL ; +break ; + } + +/* assume completion callbacks modify the queue */ +if (unlikely (modified && fotg210->isoc_count >0 )) +return -EINVAL ; + } +return 0 ; +}static void scan_isoc (struct fotg210_hcd *fotg210) { -unsigned uf, now_frame, frame; -unsigned fmask = fotg210->periodic_size -1 ; -bool modified, live; +unsigned uf, now_frame, frame, ret; +unsigned fmask = fotg210->periodic_size -1 ; +bool live;/* * When running, scan from last scan point up to "now"
@@ -4634,69 +4702,10 @@ static void scan_isoc(struct fotg210_hcd *fotg210) frame = fotg210->next_frame;for (;;) { -union fotg210_shadow q, *q_p; -__hc32 type, *hw_p; - -restart: -/* scan each element in frame's queue for completions */ - q_p = &fotg210->pshadow[frame]; - hw_p = &fotg210->periodic[frame]; - q.ptr = q_p->ptr; - type =Q_NEXT_TYPE (fotg210, *hw_p); - modified = false; - -while (q.ptr !=NULL ) { -switch (hc32_to_cpu (fotg210, type)) { -case Q_TYPE_ITD : -/* If this ITD is still active, leave it for -* later processing ... check the next entry. -* No need to check for activity unless the -* frame is current. -*/ -if (frame == now_frame && live) { -rmb (); -for (uf =0 ; uf <8 ; uf++) { -if (q.itd->hw_transaction[uf] & -ITD_ACTIVE (fotg210)) -break ; - } -if (uf <8 ) { - q_p = &q.itd->itd_next; - hw_p = &q.itd->hw_next; - type =Q_NEXT_TYPE (fotg210, - q.itd->hw_next); - q = *q_p; -break ; - } - } - -/* Take finished ITDs out of the schedule -* and process them: recycle, maybe report -* URB completion. HC won't cache the -* pointer for much longer, if at all. -*/ - *q_p = q.itd->itd_next; - *hw_p = q.itd->hw_next; - type =Q_NEXT_TYPE (fotg210, q.itd->hw_next); -wmb (); - modified =itd_complete (fotg210, q.itd); - q = *q_p; -break ; -default : -fotg210_dbg (fotg210,"corrupt type %d frame %d shadow %p\n" , - type, frame, q.ptr); -/* FALL THROUGH */ -case Q_TYPE_QH : -case Q_TYPE_FSTN : -/* End of the iTDs and siTDs */ - q.ptr =NULL ; -break ; - } - -/* assume completion callbacks modify the queue */ -if (unlikely (modified && fotg210->isoc_count >0 )) - goto restart; - } + ret =1 ; +while (ret !=0 ) + ret =scan_frame_queue (fotg210, frame, + now_frame, live);/* Stop when we have reached the current frame */ if (frame == now_frame)
Signature · 1 line
2.1.0
Quoted 60 lines · Felipe Balbi
Hi,
Quoted 49 lines · Peter Senna Tschudin
Quoted 22 lines · Felipe Balbi
Quoted 21 lines · Peter Senna Tschudin
Quoted 10 lines · Felipe Balbi
Quoted 6 lines · Peter Senna Tschudin
Quoted 2 lines
Quoted 1 line
Should these files be consolidated? And if so how?
if you can find an easy way, that would be a very, very welcome patch.
Is the ideal solution to consolidate both
fusbh200-hcd.candfotg210-hcd.cin a single module? If this is the case, how to detect at run time which version of the hw is present? Both are registered asdoes it matter ? If they work the same way, why does it matter which one's running?
I may be missing something simple, but based on a 2 page product brief, fotg210 has more resources like memory. So even if the .c files are _very_ similar, there are some configuration parameters that differ, for example:
fusbh200.h:
#defineBMCSR_VBUS_OFF(1<<4)
#defineBMCSR_INT_POLARITY(1<<3)Quoted 21 lines
Quoted 3 lines
fotg210.h:
#defineOTGCSR_A_BUS_DROP(1 << 5)
#defineOTGCSR_A_BUS_REQ(1 << 4)Can you detect that in runtime ? If you can, detect it. If you can't use different
platform_device_id.Quoted 14 lines
Quoted 14 lines
Quoted 7 lines
notebook (hp elitebook 840), and on a VM, even if neither has the hw ($ sudo modprobe fusbh200-hcd). The module loads with the warning "
fusbh200_hcdshould always be loaded beforeuhci_hcdandohci_hcd, not after". On another workstation running ubuntu, I could load both modules at the same time, producing the same warning for each module. Should the module load if the device is not present?Quoted 5 lines
Other solution for consolidation would be to create a
common_code.c, keeping bothfusbh200-hcd.candfotg210-hcd.conly with the code that differ. Is this better than what is there now?Other ideas?
just combine them :-p Use
platform_device_idto differentiate.Can you check the f2xx branch at:
[email protected]:petersenna/linux.git
Quoted 7 lines
And tell me if this is the way to go for the consolidation of the two drivers? I started with the newest driver, did code cleanup, and started filling the new driver with parameters from the older FUSBH200. At the moment it compiles for x86 and probably still works for FOTG210 devices. A concrete question I have is if should I keep making many patches for the consolidation or should I do a single big patch with all changes? Comments are welcome.
Quoted 3 lines
it's best to just send patches. Also, you gave me an ssh URL which I can't use because I don't have write access to your tree (and I don't want to have it).
Sorry for that, my goal was not to send more than 10 patches just to illustrate my questions. It looked more efficient to make the patches available for analysis instead of spamming you.
I sent a RFC patch series to the list, it would help me a lot if you can give me some feedback, mainly hints about the questions on the cover letter.
Thank you for the feedback Sergei Shtylyov! I'll include your suggestions in the next series.
Quoted 3 lines
--
balbi
Signature · 1 line
Peter