提交 d59abb93 编写于 作者: G Greg Kroah-Hartman

Merge branch 3.13-rc4 into usb-next

...@@ -2921,6 +2921,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, ...@@ -2921,6 +2921,8 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
if (retval < 0) if (retval < 0)
goto error3; goto error3;
device_wakeup_enable(hcd->self.controller);
dwc2_hcd_dump_state(hsotg); dwc2_hcd_dump_state(hsotg);
dwc2_enable_global_interrupts(hsotg); dwc2_enable_global_interrupts(hsotg);
......
...@@ -3498,6 +3498,7 @@ static int octeon_usb_driver_probe(struct device *dev) ...@@ -3498,6 +3498,7 @@ static int octeon_usb_driver_probe(struct device *dev)
kfree(hcd); kfree(hcd);
return -1; return -1;
} }
device_wakeup_enable(hcd->self.controller);
dev_dbg(dev, "Registered HCD for port %d on irq %d\n", usb_num, irq); dev_dbg(dev, "Registered HCD for port %d on irq %d\n", usb_num, irq);
......
...@@ -2270,6 +2270,8 @@ static int oz_plat_probe(struct platform_device *dev) ...@@ -2270,6 +2270,8 @@ static int oz_plat_probe(struct platform_device *dev)
usb_put_hcd(hcd); usb_put_hcd(hcd);
return -1; return -1;
} }
device_wakeup_enable(hcd->self.controller);
spin_lock_bh(&g_hcdlock); spin_lock_bh(&g_hcdlock);
g_ozhcd = ozhcd; g_ozhcd = ozhcd;
spin_unlock_bh(&g_hcdlock); spin_unlock_bh(&g_hcdlock);
......
...@@ -170,9 +170,9 @@ struct usbatm_control { ...@@ -170,9 +170,9 @@ struct usbatm_control {
static void usbatm_atm_dev_close(struct atm_dev *atm_dev); static void usbatm_atm_dev_close(struct atm_dev *atm_dev);
static int usbatm_atm_open(struct atm_vcc *vcc); static int usbatm_atm_open(struct atm_vcc *vcc);
static void usbatm_atm_close(struct atm_vcc *vcc); static void usbatm_atm_close(struct atm_vcc *vcc);
static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user * arg); static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, void __user *arg);
static int usbatm_atm_send(struct atm_vcc *vcc, struct sk_buff *skb); static int usbatm_atm_send(struct atm_vcc *vcc, struct sk_buff *skb);
static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page); static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t *pos, char *page);
static struct atmdev_ops usbatm_atm_devops = { static struct atmdev_ops usbatm_atm_devops = {
.dev_close = usbatm_atm_dev_close, .dev_close = usbatm_atm_dev_close,
...@@ -739,7 +739,7 @@ static void usbatm_atm_dev_close(struct atm_dev *atm_dev) ...@@ -739,7 +739,7 @@ static void usbatm_atm_dev_close(struct atm_dev *atm_dev)
usbatm_put_instance(instance); /* taken in usbatm_atm_init */ usbatm_put_instance(instance); /* taken in usbatm_atm_init */
} }
static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page) static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t *pos, char *page)
{ {
struct usbatm_data *instance = atm_dev->dev_data; struct usbatm_data *instance = atm_dev->dev_data;
int left = *pos; int left = *pos;
...@@ -895,7 +895,7 @@ static void usbatm_atm_close(struct atm_vcc *vcc) ...@@ -895,7 +895,7 @@ static void usbatm_atm_close(struct atm_vcc *vcc)
} }
static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd, static int usbatm_atm_ioctl(struct atm_dev *atm_dev, unsigned int cmd,
void __user * arg) void __user *arg)
{ {
struct usbatm_data *instance = atm_dev->dev_data; struct usbatm_data *instance = atm_dev->dev_data;
......
...@@ -384,6 +384,8 @@ int c67x00_hcd_probe(struct c67x00_sie *sie) ...@@ -384,6 +384,8 @@ int c67x00_hcd_probe(struct c67x00_sie *sie)
goto err2; goto err2;
} }
device_wakeup_enable(hcd->self.controller);
spin_lock_irqsave(&sie->lock, flags); spin_lock_irqsave(&sie->lock, flags);
sie->private_data = c67x00; sie->private_data = c67x00;
sie->irq = c67x00_hcd_irq; sie->irq = c67x00_hcd_irq;
......
...@@ -17,5 +17,5 @@ ifneq ($(CONFIG_PCI),) ...@@ -17,5 +17,5 @@ ifneq ($(CONFIG_PCI),)
endif endif
ifneq ($(CONFIG_OF),) ifneq ($(CONFIG_OF),)
obj-$(CONFIG_USB_CHIPIDEA) += ci_hdrc_imx.o usbmisc_imx.o obj-$(CONFIG_USB_CHIPIDEA) += usbmisc_imx.o ci_hdrc_imx.o
endif endif
...@@ -112,7 +112,7 @@ static void ci_hdrc_pci_remove(struct pci_dev *pdev) ...@@ -112,7 +112,7 @@ static void ci_hdrc_pci_remove(struct pci_dev *pdev)
* *
* Check "pci.h" for details * Check "pci.h" for details
*/ */
static DEFINE_PCI_DEVICE_TABLE(ci_hdrc_pci_id_table) = { static const struct pci_device_id ci_hdrc_pci_id_table[] = {
{ {
PCI_DEVICE(0x153F, 0x1004), PCI_DEVICE(0x153F, 0x1004),
.driver_data = (kernel_ulong_t)&pci_platdata, .driver_data = (kernel_ulong_t)&pci_platdata,
......
...@@ -208,7 +208,8 @@ static int hw_device_init(struct ci_hdrc *ci, void __iomem *base) ...@@ -208,7 +208,8 @@ static int hw_device_init(struct ci_hdrc *ci, void __iomem *base)
reg = hw_read(ci, CAP_HCCPARAMS, HCCPARAMS_LEN) >> reg = hw_read(ci, CAP_HCCPARAMS, HCCPARAMS_LEN) >>
__ffs(HCCPARAMS_LEN); __ffs(HCCPARAMS_LEN);
ci->hw_bank.lpm = reg; ci->hw_bank.lpm = reg;
hw_alloc_regmap(ci, !!reg); if (reg)
hw_alloc_regmap(ci, !!reg);
ci->hw_bank.size = ci->hw_bank.op - ci->hw_bank.abs; ci->hw_bank.size = ci->hw_bank.op - ci->hw_bank.abs;
ci->hw_bank.size += OP_LAST; ci->hw_bank.size += OP_LAST;
ci->hw_bank.size /= sizeof(u32); ci->hw_bank.size /= sizeof(u32);
......
...@@ -88,7 +88,8 @@ static int host_start(struct ci_hdrc *ci) ...@@ -88,7 +88,8 @@ static int host_start(struct ci_hdrc *ci)
return ret; return ret;
disable_reg: disable_reg:
regulator_disable(ci->platdata->reg_vbus); if (ci->platdata->reg_vbus)
regulator_disable(ci->platdata->reg_vbus);
put_hcd: put_hcd:
usb_put_hcd(hcd); usb_put_hcd(hcd);
......
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
#define MX25_USB_PHY_CTRL_OFFSET 0x08 #define MX25_USB_PHY_CTRL_OFFSET 0x08
#define MX25_BM_EXTERNAL_VBUS_DIVIDER BIT(23) #define MX25_BM_EXTERNAL_VBUS_DIVIDER BIT(23)
#define MX27_H1_PM_BIT BIT(8)
#define MX27_H2_PM_BIT BIT(16)
#define MX27_OTG_PM_BIT BIT(24)
#define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08 #define MX53_USB_OTG_PHY_CTRL_0_OFFSET 0x08
#define MX53_USB_UH2_CTRL_OFFSET 0x14 #define MX53_USB_UH2_CTRL_OFFSET 0x14
#define MX53_USB_UH3_CTRL_OFFSET 0x18 #define MX53_USB_UH3_CTRL_OFFSET 0x18
...@@ -68,6 +72,36 @@ static int usbmisc_imx25_post(struct imx_usbmisc_data *data) ...@@ -68,6 +72,36 @@ static int usbmisc_imx25_post(struct imx_usbmisc_data *data)
return 0; return 0;
} }
static int usbmisc_imx27_init(struct imx_usbmisc_data *data)
{
unsigned long flags;
u32 val;
switch (data->index) {
case 0:
val = MX27_OTG_PM_BIT;
break;
case 1:
val = MX27_H1_PM_BIT;
break;
case 2:
val = MX27_H2_PM_BIT;
break;
default:
return -EINVAL;
};
spin_lock_irqsave(&usbmisc->lock, flags);
if (data->disable_oc)
val = readl(usbmisc->base) | val;
else
val = readl(usbmisc->base) & ~val;
writel(val, usbmisc->base);
spin_unlock_irqrestore(&usbmisc->lock, flags);
return 0;
}
static int usbmisc_imx53_init(struct imx_usbmisc_data *data) static int usbmisc_imx53_init(struct imx_usbmisc_data *data)
{ {
void __iomem *reg = NULL; void __iomem *reg = NULL;
...@@ -128,6 +162,10 @@ static const struct usbmisc_ops imx25_usbmisc_ops = { ...@@ -128,6 +162,10 @@ static const struct usbmisc_ops imx25_usbmisc_ops = {
.post = usbmisc_imx25_post, .post = usbmisc_imx25_post,
}; };
static const struct usbmisc_ops imx27_usbmisc_ops = {
.init = usbmisc_imx27_init,
};
static const struct usbmisc_ops imx53_usbmisc_ops = { static const struct usbmisc_ops imx53_usbmisc_ops = {
.init = usbmisc_imx53_init, .init = usbmisc_imx53_init,
}; };
...@@ -161,6 +199,14 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = { ...@@ -161,6 +199,14 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = {
.compatible = "fsl,imx25-usbmisc", .compatible = "fsl,imx25-usbmisc",
.data = &imx25_usbmisc_ops, .data = &imx25_usbmisc_ops,
}, },
{
.compatible = "fsl,imx27-usbmisc",
.data = &imx27_usbmisc_ops,
},
{
.compatible = "fsl,imx51-usbmisc",
.data = &imx53_usbmisc_ops,
},
{ {
.compatible = "fsl,imx53-usbmisc", .compatible = "fsl,imx53-usbmisc",
.data = &imx53_usbmisc_ops, .data = &imx53_usbmisc_ops,
......
...@@ -262,6 +262,7 @@ static void acm_ctrl_irq(struct urb *urb) ...@@ -262,6 +262,7 @@ static void acm_ctrl_irq(struct urb *urb)
struct usb_cdc_notification *dr = urb->transfer_buffer; struct usb_cdc_notification *dr = urb->transfer_buffer;
unsigned char *data; unsigned char *data;
int newctrl; int newctrl;
int difference;
int retval; int retval;
int status = urb->status; int status = urb->status;
...@@ -302,20 +303,31 @@ static void acm_ctrl_irq(struct urb *urb) ...@@ -302,20 +303,31 @@ static void acm_ctrl_irq(struct urb *urb)
tty_port_tty_hangup(&acm->port, false); tty_port_tty_hangup(&acm->port, false);
} }
difference = acm->ctrlin ^ newctrl;
spin_lock(&acm->read_lock);
acm->ctrlin = newctrl; acm->ctrlin = newctrl;
acm->oldcount = acm->iocount;
if (difference & ACM_CTRL_DSR)
acm->iocount.dsr++;
if (difference & ACM_CTRL_BRK)
acm->iocount.brk++;
if (difference & ACM_CTRL_RI)
acm->iocount.rng++;
if (difference & ACM_CTRL_DCD)
acm->iocount.dcd++;
if (difference & ACM_CTRL_FRAMING)
acm->iocount.frame++;
if (difference & ACM_CTRL_PARITY)
acm->iocount.parity++;
if (difference & ACM_CTRL_OVERRUN)
acm->iocount.overrun++;
spin_unlock(&acm->read_lock);
if (difference)
wake_up_all(&acm->wioctl);
dev_dbg(&acm->control->dev, break;
"%s - input control lines: dcd%c dsr%c break%c "
"ring%c framing%c parity%c overrun%c\n",
__func__,
acm->ctrlin & ACM_CTRL_DCD ? '+' : '-',
acm->ctrlin & ACM_CTRL_DSR ? '+' : '-',
acm->ctrlin & ACM_CTRL_BRK ? '+' : '-',
acm->ctrlin & ACM_CTRL_RI ? '+' : '-',
acm->ctrlin & ACM_CTRL_FRAMING ? '+' : '-',
acm->ctrlin & ACM_CTRL_PARITY ? '+' : '-',
acm->ctrlin & ACM_CTRL_OVERRUN ? '+' : '-');
break;
default: default:
dev_dbg(&acm->control->dev, dev_dbg(&acm->control->dev,
...@@ -796,6 +808,72 @@ static int set_serial_info(struct acm *acm, ...@@ -796,6 +808,72 @@ static int set_serial_info(struct acm *acm,
return retval; return retval;
} }
static int wait_serial_change(struct acm *acm, unsigned long arg)
{
int rv = 0;
DECLARE_WAITQUEUE(wait, current);
struct async_icount old, new;
if (arg & (TIOCM_DSR | TIOCM_RI | TIOCM_CD ))
return -EINVAL;
do {
spin_lock_irq(&acm->read_lock);
old = acm->oldcount;
new = acm->iocount;
acm->oldcount = new;
spin_unlock_irq(&acm->read_lock);
if ((arg & TIOCM_DSR) &&
old.dsr != new.dsr)
break;
if ((arg & TIOCM_CD) &&
old.dcd != new.dcd)
break;
if ((arg & TIOCM_RI) &&
old.rng != new.rng)
break;
add_wait_queue(&acm->wioctl, &wait);
set_current_state(TASK_INTERRUPTIBLE);
schedule();
remove_wait_queue(&acm->wioctl, &wait);
if (acm->disconnected) {
if (arg & TIOCM_CD)
break;
else
rv = -ENODEV;
} else {
if (signal_pending(current))
rv = -ERESTARTSYS;
}
} while (!rv);
return rv;
}
static int get_serial_usage(struct acm *acm,
struct serial_icounter_struct __user *count)
{
struct serial_icounter_struct icount;
int rv = 0;
memset(&icount, 0, sizeof(icount));
icount.dsr = acm->iocount.dsr;
icount.rng = acm->iocount.rng;
icount.dcd = acm->iocount.dcd;
icount.frame = acm->iocount.frame;
icount.overrun = acm->iocount.overrun;
icount.parity = acm->iocount.parity;
icount.brk = acm->iocount.brk;
if (copy_to_user(count, &icount, sizeof(icount)) > 0)
rv = -EFAULT;
return rv;
}
static int acm_tty_ioctl(struct tty_struct *tty, static int acm_tty_ioctl(struct tty_struct *tty,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
...@@ -809,6 +887,18 @@ static int acm_tty_ioctl(struct tty_struct *tty, ...@@ -809,6 +887,18 @@ static int acm_tty_ioctl(struct tty_struct *tty,
case TIOCSSERIAL: case TIOCSSERIAL:
rv = set_serial_info(acm, (struct serial_struct __user *) arg); rv = set_serial_info(acm, (struct serial_struct __user *) arg);
break; break;
case TIOCMIWAIT:
rv = usb_autopm_get_interface(acm->control);
if (rv < 0) {
rv = -EIO;
break;
}
rv = wait_serial_change(acm, arg);
usb_autopm_put_interface(acm->control);
break;
case TIOCGICOUNT:
rv = get_serial_usage(acm, (struct serial_icounter_struct __user *) arg);
break;
} }
return rv; return rv;
...@@ -1167,6 +1257,7 @@ static int acm_probe(struct usb_interface *intf, ...@@ -1167,6 +1257,7 @@ static int acm_probe(struct usb_interface *intf,
acm->readsize = readsize; acm->readsize = readsize;
acm->rx_buflimit = num_rx_buf; acm->rx_buflimit = num_rx_buf;
INIT_WORK(&acm->work, acm_softint); INIT_WORK(&acm->work, acm_softint);
init_waitqueue_head(&acm->wioctl);
spin_lock_init(&acm->write_lock); spin_lock_init(&acm->write_lock);
spin_lock_init(&acm->read_lock); spin_lock_init(&acm->read_lock);
mutex_init(&acm->mutex); mutex_init(&acm->mutex);
...@@ -1383,6 +1474,7 @@ static void acm_disconnect(struct usb_interface *intf) ...@@ -1383,6 +1474,7 @@ static void acm_disconnect(struct usb_interface *intf)
device_remove_file(&acm->control->dev, device_remove_file(&acm->control->dev,
&dev_attr_iCountryCodeRelDate); &dev_attr_iCountryCodeRelDate);
} }
wake_up_all(&acm->wioctl);
device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
usb_set_intfdata(acm->control, NULL); usb_set_intfdata(acm->control, NULL);
usb_set_intfdata(acm->data, NULL); usb_set_intfdata(acm->data, NULL);
......
...@@ -106,6 +106,9 @@ struct acm { ...@@ -106,6 +106,9 @@ struct acm {
struct work_struct work; /* work queue entry for line discipline waking up */ struct work_struct work; /* work queue entry for line discipline waking up */
unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */ unsigned int ctrlin; /* input control lines (DCD, DSR, RI, break, overruns) */
unsigned int ctrlout; /* output control lines (DTR, RTS) */ unsigned int ctrlout; /* output control lines (DTR, RTS) */
struct async_icount iocount; /* counters for control line changes */
struct async_icount oldcount; /* for comparison of counter */
wait_queue_head_t wioctl; /* for ioctl */
unsigned int writesize; /* max packet size for the output bulk endpoint */ unsigned int writesize; /* max packet size for the output bulk endpoint */
unsigned int readsize,ctrlsize; /* buffer sizes for freeing */ unsigned int readsize,ctrlsize; /* buffer sizes for freeing */
unsigned int minor; /* acm minor number */ unsigned int minor; /* acm minor number */
......
...@@ -651,10 +651,6 @@ void usb_destroy_configuration(struct usb_device *dev) ...@@ -651,10 +651,6 @@ void usb_destroy_configuration(struct usb_device *dev)
* *
* hub-only!! ... and only in reset path, or usb_new_device() * hub-only!! ... and only in reset path, or usb_new_device()
* (used by real hubs and virtual root hubs) * (used by real hubs and virtual root hubs)
*
* NOTE: if this is a WUSB device and is not authorized, we skip the
* whole thing. A non-authorized USB device has no
* configurations.
*/ */
int usb_get_configuration(struct usb_device *dev) int usb_get_configuration(struct usb_device *dev)
{ {
...@@ -666,8 +662,6 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -666,8 +662,6 @@ int usb_get_configuration(struct usb_device *dev)
struct usb_config_descriptor *desc; struct usb_config_descriptor *desc;
cfgno = 0; cfgno = 0;
if (dev->authorized == 0) /* Not really an error */
goto out_not_authorized;
result = -ENOMEM; result = -ENOMEM;
if (ncfg > USB_MAXCONFIG) { if (ncfg > USB_MAXCONFIG) {
dev_warn(ddev, "too many configurations: %d, " dev_warn(ddev, "too many configurations: %d, "
...@@ -751,7 +745,6 @@ int usb_get_configuration(struct usb_device *dev) ...@@ -751,7 +745,6 @@ int usb_get_configuration(struct usb_device *dev)
err: err:
kfree(desc); kfree(desc);
out_not_authorized:
dev->descriptor.bNumConfigurations = cfgno; dev->descriptor.bNumConfigurations = cfgno;
err2: err2:
if (result == -ENOMEM) if (result == -ENOMEM)
......
...@@ -839,7 +839,7 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver, ...@@ -839,7 +839,7 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver,
return -ENODEV; return -ENODEV;
new_udriver->drvwrap.for_devices = 1; new_udriver->drvwrap.for_devices = 1;
new_udriver->drvwrap.driver.name = (char *) new_udriver->name; new_udriver->drvwrap.driver.name = new_udriver->name;
new_udriver->drvwrap.driver.bus = &usb_bus_type; new_udriver->drvwrap.driver.bus = &usb_bus_type;
new_udriver->drvwrap.driver.probe = usb_probe_device; new_udriver->drvwrap.driver.probe = usb_probe_device;
new_udriver->drvwrap.driver.remove = usb_unbind_device; new_udriver->drvwrap.driver.remove = usb_unbind_device;
...@@ -900,7 +900,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner, ...@@ -900,7 +900,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
return -ENODEV; return -ENODEV;
new_driver->drvwrap.for_devices = 0; new_driver->drvwrap.for_devices = 0;
new_driver->drvwrap.driver.name = (char *) new_driver->name; new_driver->drvwrap.driver.name = new_driver->name;
new_driver->drvwrap.driver.bus = &usb_bus_type; new_driver->drvwrap.driver.bus = &usb_bus_type;
new_driver->drvwrap.driver.probe = usb_probe_interface; new_driver->drvwrap.driver.probe = usb_probe_interface;
new_driver->drvwrap.driver.remove = usb_unbind_interface; new_driver->drvwrap.driver.remove = usb_unbind_interface;
......
...@@ -282,6 +282,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -282,6 +282,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (retval != 0) if (retval != 0)
goto unmap_registers; goto unmap_registers;
device_wakeup_enable(hcd->self.controller);
if (pci_dev_run_wake(dev)) if (pci_dev_run_wake(dev))
pm_runtime_put_noidle(&dev->dev); pm_runtime_put_noidle(&dev->dev);
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include <linux/usb.h> #include <linux/usb.h>
#include <linux/usb/hcd.h> #include <linux/usb/hcd.h>
#include <linux/usb/phy.h>
#include "usb.h" #include "usb.h"
...@@ -2588,6 +2589,24 @@ int usb_add_hcd(struct usb_hcd *hcd, ...@@ -2588,6 +2589,24 @@ int usb_add_hcd(struct usb_hcd *hcd,
int retval; int retval;
struct usb_device *rhdev; struct usb_device *rhdev;
if (IS_ENABLED(CONFIG_USB_PHY) && !hcd->phy) {
struct usb_phy *phy = usb_get_phy_dev(hcd->self.controller, 0);
if (IS_ERR(phy)) {
retval = PTR_ERR(phy);
if (retval == -EPROBE_DEFER)
return retval;
} else {
retval = usb_phy_init(phy);
if (retval) {
usb_put_phy(phy);
return retval;
}
hcd->phy = phy;
hcd->remove_phy = 1;
}
}
dev_info(hcd->self.controller, "%s\n", hcd->product_desc); dev_info(hcd->self.controller, "%s\n", hcd->product_desc);
/* Keep old behaviour if authorized_default is not in [0, 1]. */ /* Keep old behaviour if authorized_default is not in [0, 1]. */
...@@ -2603,7 +2622,7 @@ int usb_add_hcd(struct usb_hcd *hcd, ...@@ -2603,7 +2622,7 @@ int usb_add_hcd(struct usb_hcd *hcd,
*/ */
if ((retval = hcd_buffer_create(hcd)) != 0) { if ((retval = hcd_buffer_create(hcd)) != 0) {
dev_dbg(hcd->self.controller, "pool alloc failed\n"); dev_dbg(hcd->self.controller, "pool alloc failed\n");
return retval; goto err_remove_phy;
} }
if ((retval = usb_register_bus(&hcd->self)) < 0) if ((retval = usb_register_bus(&hcd->self)) < 0)
...@@ -2693,12 +2712,6 @@ int usb_add_hcd(struct usb_hcd *hcd, ...@@ -2693,12 +2712,6 @@ int usb_add_hcd(struct usb_hcd *hcd,
if (hcd->uses_new_polling && HCD_POLL_RH(hcd)) if (hcd->uses_new_polling && HCD_POLL_RH(hcd))
usb_hcd_poll_rh_status(hcd); usb_hcd_poll_rh_status(hcd);
/*
* Host controllers don't generate their own wakeup requests;
* they only forward requests from the root hub. Therefore
* controllers should always be enabled for remote wakeup.
*/
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
error_create_attr_group: error_create_attr_group:
...@@ -2734,6 +2747,12 @@ int usb_add_hcd(struct usb_hcd *hcd, ...@@ -2734,6 +2747,12 @@ int usb_add_hcd(struct usb_hcd *hcd,
usb_deregister_bus(&hcd->self); usb_deregister_bus(&hcd->self);
err_register_bus: err_register_bus:
hcd_buffer_destroy(hcd); hcd_buffer_destroy(hcd);
err_remove_phy:
if (hcd->remove_phy && hcd->phy) {
usb_phy_shutdown(hcd->phy);
usb_put_phy(hcd->phy);
hcd->phy = NULL;
}
return retval; return retval;
} }
EXPORT_SYMBOL_GPL(usb_add_hcd); EXPORT_SYMBOL_GPL(usb_add_hcd);
...@@ -2806,6 +2825,11 @@ void usb_remove_hcd(struct usb_hcd *hcd) ...@@ -2806,6 +2825,11 @@ void usb_remove_hcd(struct usb_hcd *hcd)
usb_put_dev(hcd->self.root_hub); usb_put_dev(hcd->self.root_hub);
usb_deregister_bus(&hcd->self); usb_deregister_bus(&hcd->self);
hcd_buffer_destroy(hcd); hcd_buffer_destroy(hcd);
if (hcd->remove_phy && hcd->phy) {
usb_phy_shutdown(hcd->phy);
usb_put_phy(hcd->phy);
hcd->phy = NULL;
}
} }
EXPORT_SYMBOL_GPL(usb_remove_hcd); EXPORT_SYMBOL_GPL(usb_remove_hcd);
......
...@@ -2235,17 +2235,13 @@ static int usb_enumerate_device(struct usb_device *udev) ...@@ -2235,17 +2235,13 @@ static int usb_enumerate_device(struct usb_device *udev)
return err; return err;
} }
} }
if (udev->wusb == 1 && udev->authorized == 0) {
udev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL); /* read the standard strings and cache them if present */
udev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL); udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
udev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL); udev->manufacturer = usb_cache_string(udev,
} else { udev->descriptor.iManufacturer);
/* read the standard strings and cache them if present */ udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
udev->product = usb_cache_string(udev, udev->descriptor.iProduct);
udev->manufacturer = usb_cache_string(udev,
udev->descriptor.iManufacturer);
udev->serial = usb_cache_string(udev, udev->descriptor.iSerialNumber);
}
err = usb_enumerate_device_otg(udev); err = usb_enumerate_device_otg(udev);
if (err < 0) if (err < 0)
return err; return err;
...@@ -2427,16 +2423,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev) ...@@ -2427,16 +2423,6 @@ int usb_deauthorize_device(struct usb_device *usb_dev)
usb_dev->authorized = 0; usb_dev->authorized = 0;
usb_set_configuration(usb_dev, -1); usb_set_configuration(usb_dev, -1);
kfree(usb_dev->product);
usb_dev->product = kstrdup("n/a (unauthorized)", GFP_KERNEL);
kfree(usb_dev->manufacturer);
usb_dev->manufacturer = kstrdup("n/a (unauthorized)", GFP_KERNEL);
kfree(usb_dev->serial);
usb_dev->serial = kstrdup("n/a (unauthorized)", GFP_KERNEL);
usb_destroy_configuration(usb_dev);
usb_dev->descriptor.bNumConfigurations = 0;
out_unauthorized: out_unauthorized:
usb_unlock_device(usb_dev); usb_unlock_device(usb_dev);
return 0; return 0;
...@@ -2464,17 +2450,7 @@ int usb_authorize_device(struct usb_device *usb_dev) ...@@ -2464,17 +2450,7 @@ int usb_authorize_device(struct usb_device *usb_dev)
goto error_device_descriptor; goto error_device_descriptor;
} }
kfree(usb_dev->product);
usb_dev->product = NULL;
kfree(usb_dev->manufacturer);
usb_dev->manufacturer = NULL;
kfree(usb_dev->serial);
usb_dev->serial = NULL;
usb_dev->authorized = 1; usb_dev->authorized = 1;
result = usb_enumerate_device(usb_dev);
if (result < 0)
goto error_enumerate;
/* Choose and set the configuration. This registers the interfaces /* Choose and set the configuration. This registers the interfaces
* with the driver core and lets interface drivers bind to them. * with the driver core and lets interface drivers bind to them.
*/ */
...@@ -2490,7 +2466,6 @@ int usb_authorize_device(struct usb_device *usb_dev) ...@@ -2490,7 +2466,6 @@ int usb_authorize_device(struct usb_device *usb_dev)
} }
dev_info(&usb_dev->dev, "authorized to connect\n"); dev_info(&usb_dev->dev, "authorized to connect\n");
error_enumerate:
error_device_descriptor: error_device_descriptor:
usb_autosuspend_device(usb_dev); usb_autosuspend_device(usb_dev);
error_autoresume: error_autoresume:
...@@ -2523,6 +2498,21 @@ static unsigned hub_is_wusb(struct usb_hub *hub) ...@@ -2523,6 +2498,21 @@ static unsigned hub_is_wusb(struct usb_hub *hub)
#define HUB_LONG_RESET_TIME 200 #define HUB_LONG_RESET_TIME 200
#define HUB_RESET_TIMEOUT 800 #define HUB_RESET_TIMEOUT 800
/*
* "New scheme" enumeration causes an extra state transition to be
* exposed to an xhci host and causes USB3 devices to receive control
* commands in the default state. This has been seen to cause
* enumeration failures, so disable this enumeration scheme for USB3
* devices.
*/
static bool use_new_scheme(struct usb_device *udev, int retry)
{
if (udev->speed == USB_SPEED_SUPER)
return false;
return USE_NEW_SCHEME(retry);
}
static int hub_port_reset(struct usb_hub *hub, int port1, static int hub_port_reset(struct usb_hub *hub, int port1,
struct usb_device *udev, unsigned int delay, bool warm); struct usb_device *udev, unsigned int delay, bool warm);
...@@ -3981,6 +3971,20 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) ...@@ -3981,6 +3971,20 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev)
} }
} }
static int hub_enable_device(struct usb_device *udev)
{
struct usb_hcd *hcd = bus_to_hcd(udev->bus);
if (!hcd->driver->enable_device)
return 0;
if (udev->state == USB_STATE_ADDRESS)
return 0;
if (udev->state != USB_STATE_DEFAULT)
return -EINVAL;
return hcd->driver->enable_device(hcd, udev);
}
/* Reset device, (re)assign address, get device descriptor. /* Reset device, (re)assign address, get device descriptor.
* Device connection must be stable, no more debouncing needed. * Device connection must be stable, no more debouncing needed.
* Returns device in USB_STATE_ADDRESS, except on error. * Returns device in USB_STATE_ADDRESS, except on error.
...@@ -4093,7 +4097,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ...@@ -4093,7 +4097,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
* this area, and this is how Linux has done it for ages. * this area, and this is how Linux has done it for ages.
* Change it cautiously. * Change it cautiously.
* *
* NOTE: If USE_NEW_SCHEME() is true we will start by issuing * NOTE: If use_new_scheme() is true we will start by issuing
* a 64-byte GET_DESCRIPTOR request. This is what Windows does, * a 64-byte GET_DESCRIPTOR request. This is what Windows does,
* so it may help with some non-standards-compliant devices. * so it may help with some non-standards-compliant devices.
* Otherwise we start with SET_ADDRESS and then try to read the * Otherwise we start with SET_ADDRESS and then try to read the
...@@ -4101,10 +4105,17 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ...@@ -4101,10 +4105,17 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
* value. * value.
*/ */
for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) { for (i = 0; i < GET_DESCRIPTOR_TRIES; (++i, msleep(100))) {
if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) { bool did_new_scheme = false;
if (use_new_scheme(udev, retry_counter)) {
struct usb_device_descriptor *buf; struct usb_device_descriptor *buf;
int r = 0; int r = 0;
did_new_scheme = true;
retval = hub_enable_device(udev);
if (retval < 0)
goto fail;
#define GET_DESCRIPTOR_BUFSIZE 64 #define GET_DESCRIPTOR_BUFSIZE 64
buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO); buf = kmalloc(GET_DESCRIPTOR_BUFSIZE, GFP_NOIO);
if (!buf) { if (!buf) {
...@@ -4193,7 +4204,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, ...@@ -4193,7 +4204,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
* - read ep0 maxpacket even for high and low speed, * - read ep0 maxpacket even for high and low speed,
*/ */
msleep(10); msleep(10);
if (USE_NEW_SCHEME(retry_counter) && !(hcd->driver->flags & HCD_USB3)) /* use_new_scheme() checks the speed which may have
* changed since the initial look so we cache the result
* in did_new_scheme
*/
if (did_new_scheme)
break; break;
} }
......
...@@ -98,9 +98,6 @@ static const struct usb_device_id usb_quirk_list[] = { ...@@ -98,9 +98,6 @@ static const struct usb_device_id usb_quirk_list[] = {
/* Alcor Micro Corp. Hub */ /* Alcor Micro Corp. Hub */
{ USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x058f, 0x9254), .driver_info = USB_QUIRK_RESET_RESUME },
/* MicroTouch Systems touchscreen */
{ USB_DEVICE(0x0596, 0x051e), .driver_info = USB_QUIRK_RESET_RESUME },
/* appletouch */ /* appletouch */
{ USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME }, { USB_DEVICE(0x05ac, 0x021a), .driver_info = USB_QUIRK_RESET_RESUME },
......
...@@ -492,9 +492,9 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) ...@@ -492,9 +492,9 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
/* too small? */ /* too small? */
switch (dev->speed) { switch (dev->speed) {
case USB_SPEED_WIRELESS: case USB_SPEED_WIRELESS:
if (urb->interval < 6) if ((urb->interval < 6)
&& (xfertype == USB_ENDPOINT_XFER_INT))
return -EINVAL; return -EINVAL;
break;
default: default:
if (urb->interval <= 0) if (urb->interval <= 0)
return -EINVAL; return -EINVAL;
......
...@@ -182,7 +182,7 @@ static void dwc3_pci_remove(struct pci_dev *pci) ...@@ -182,7 +182,7 @@ static void dwc3_pci_remove(struct pci_dev *pci)
pci_disable_device(pci); pci_disable_device(pci);
} }
static DEFINE_PCI_DEVICE_TABLE(dwc3_pci_id_table) = { static const struct pci_device_id dwc3_pci_id_table[] = {
{ {
PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS,
PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3),
......
...@@ -3338,7 +3338,7 @@ static int udc_remote_wakeup(struct udc *dev) ...@@ -3338,7 +3338,7 @@ static int udc_remote_wakeup(struct udc *dev)
} }
/* PCI device parameters */ /* PCI device parameters */
static DEFINE_PCI_DEVICE_TABLE(pci_id) = { static const struct pci_device_id pci_id[] = {
{ {
PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096), PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
......
...@@ -2717,7 +2717,7 @@ MODULE_DEVICE_TABLE(of, qe_udc_match); ...@@ -2717,7 +2717,7 @@ MODULE_DEVICE_TABLE(of, qe_udc_match);
static struct platform_driver udc_driver = { static struct platform_driver udc_driver = {
.driver = { .driver = {
.name = (char *)driver_name, .name = driver_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.of_match_table = qe_udc_match, .of_match_table = qe_udc_match,
}, },
......
...@@ -2666,7 +2666,7 @@ static struct platform_driver udc_driver = { ...@@ -2666,7 +2666,7 @@ static struct platform_driver udc_driver = {
.suspend = fsl_udc_suspend, .suspend = fsl_udc_suspend,
.resume = fsl_udc_resume, .resume = fsl_udc_resume,
.driver = { .driver = {
.name = (char *)driver_name, .name = driver_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
/* udc suspend/resume called from OTG driver */ /* udc suspend/resume called from OTG driver */
.suspend = fsl_udc_otg_suspend, .suspend = fsl_udc_otg_suspend,
......
...@@ -3210,7 +3210,7 @@ static int pch_udc_probe(struct pci_dev *pdev, ...@@ -3210,7 +3210,7 @@ static int pch_udc_probe(struct pci_dev *pdev,
return retval; return retval;
} }
static DEFINE_PCI_DEVICE_TABLE(pch_udc_pcidev_id) = { static const struct pci_device_id pch_udc_pcidev_id[] = {
{ {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC), PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe,
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
# Makefile for USB Host Controller Drivers # Makefile for USB Host Controller Drivers
# #
ccflags-$(CONFIG_USB_DEBUG) := -DDEBUG
# tell define_trace.h where to find the xhci trace header # tell define_trace.h where to find the xhci trace header
CFLAGS_xhci-trace.o := -I$(src) CFLAGS_xhci-trace.o := -I$(src)
......
...@@ -153,6 +153,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev) ...@@ -153,6 +153,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)
retval = usb_add_hcd(hcd, irq, IRQF_SHARED); retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (retval) if (retval)
goto fail_add_hcd; goto fail_add_hcd;
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
/* this file is part of ehci-hcd.c */ /* this file is part of ehci-hcd.c */
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
/* check the values in the HCSPARAMS register /* check the values in the HCSPARAMS register
* (host controller _Structural_ parameters) * (host controller _Structural_ parameters)
...@@ -62,7 +62,7 @@ static inline void dbg_hcs_params (struct ehci_hcd *ehci, char *label) {} ...@@ -62,7 +62,7 @@ static inline void dbg_hcs_params (struct ehci_hcd *ehci, char *label) {}
#endif #endif
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
/* check the values in the HCCPARAMS register /* check the values in the HCCPARAMS register
* (host controller _Capability_ parameters) * (host controller _Capability_ parameters)
...@@ -101,7 +101,7 @@ static inline void dbg_hcc_params (struct ehci_hcd *ehci, char *label) {} ...@@ -101,7 +101,7 @@ static inline void dbg_hcc_params (struct ehci_hcd *ehci, char *label) {}
#endif #endif
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
static void __maybe_unused static void __maybe_unused
dbg_qtd (const char *label, struct ehci_hcd *ehci, struct ehci_qtd *qtd) dbg_qtd (const char *label, struct ehci_hcd *ehci, struct ehci_qtd *qtd)
...@@ -301,7 +301,7 @@ static inline int __maybe_unused ...@@ -301,7 +301,7 @@ static inline int __maybe_unused
dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status)
{ return 0; } { return 0; }
#endif /* DEBUG || CONFIG_DYNAMIC_DEBUG */ #endif /* CONFIG_DYNAMIC_DEBUG */
/* functions have the "wrong" filename when they're output... */ /* functions have the "wrong" filename when they're output... */
#define dbg_status(ehci, label, status) { \ #define dbg_status(ehci, label, status) { \
...@@ -818,7 +818,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) ...@@ -818,7 +818,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
/* EHCI 0.96 and later may have "extended capabilities" */ /* EHCI 0.96 and later may have "extended capabilities" */
if (hcd->self.controller->bus == &pci_bus_type) { if (dev_is_pci(hcd->self.controller)) {
struct pci_dev *pdev; struct pci_dev *pdev;
u32 offset, cap, cap2; u32 offset, cap, cap2;
unsigned count = 256/4; unsigned count = 256/4;
......
...@@ -166,6 +166,7 @@ static int exynos_ehci_probe(struct platform_device *pdev) ...@@ -166,6 +166,7 @@ static int exynos_ehci_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add USB HCD\n"); dev_err(&pdev->dev, "Failed to add USB HCD\n");
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
......
...@@ -138,6 +138,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, ...@@ -138,6 +138,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver,
retval = usb_add_hcd(hcd, irq, IRQF_SHARED); retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (retval != 0) if (retval != 0)
goto err4; goto err4;
device_wakeup_enable(hcd->self.controller);
#ifdef CONFIG_USB_OTG #ifdef CONFIG_USB_OTG
if (pdata->operating_mode == FSL_USB2_DR_OTG) { if (pdata->operating_mode == FSL_USB2_DR_OTG) {
...@@ -413,7 +414,7 @@ static int ehci_fsl_mpc512x_drv_suspend(struct device *dev) ...@@ -413,7 +414,7 @@ static int ehci_fsl_mpc512x_drv_suspend(struct device *dev)
struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev); struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev);
u32 tmp; u32 tmp;
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE); u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE);
mode &= USBMODE_CM_MASK; mode &= USBMODE_CM_MASK;
tmp = ehci_readl(ehci, hcd->regs + 0x140); /* usbcmd */ tmp = ehci_readl(ehci, hcd->regs + 0x140); /* usbcmd */
......
...@@ -140,6 +140,7 @@ static int ehci_hcd_grlib_probe(struct platform_device *op) ...@@ -140,6 +140,7 @@ static int ehci_hcd_grlib_probe(struct platform_device *op)
if (rv) if (rv)
goto err_ioremap; goto err_ioremap;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_ioremap: err_ioremap:
......
...@@ -71,7 +71,6 @@ ...@@ -71,7 +71,6 @@
static const char hcd_name [] = "ehci_hcd"; static const char hcd_name [] = "ehci_hcd";
#undef VERBOSE_DEBUG
#undef EHCI_URB_TRACE #undef EHCI_URB_TRACE
/* magic numbers that can affect system performance */ /* magic numbers that can affect system performance */
...@@ -714,13 +713,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) ...@@ -714,13 +713,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
cmd = ehci_readl(ehci, &ehci->regs->command); cmd = ehci_readl(ehci, &ehci->regs->command);
bh = 0; bh = 0;
#ifdef VERBOSE_DEBUG
/* unrequested/ignored: Frame List Rollover */
dbg_status (ehci, "irq", status);
#endif
/* INT, ERR, and IAA interrupt rates can be throttled */
/* normal [4.15.1.2] or error [4.15.1.1] completion */ /* normal [4.15.1.2] or error [4.15.1.1] completion */
if (likely ((status & (STS_INT|STS_ERR)) != 0)) { if (likely ((status & (STS_INT|STS_ERR)) != 0)) {
if (likely ((status & STS_ERR) == 0)) if (likely ((status & STS_ERR) == 0))
...@@ -1320,7 +1312,7 @@ static int __init ehci_hcd_init(void) ...@@ -1320,7 +1312,7 @@ static int __init ehci_hcd_init(void)
sizeof(struct ehci_qh), sizeof(struct ehci_qtd), sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
sizeof(struct ehci_itd), sizeof(struct ehci_sitd)); sizeof(struct ehci_itd), sizeof(struct ehci_sitd));
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root); ehci_debug_root = debugfs_create_dir("ehci", usb_debug_root);
if (!ehci_debug_root) { if (!ehci_debug_root) {
retval = -ENOENT; retval = -ENOENT;
...@@ -1369,7 +1361,7 @@ static int __init ehci_hcd_init(void) ...@@ -1369,7 +1361,7 @@ static int __init ehci_hcd_init(void)
platform_driver_unregister(&PLATFORM_DRIVER); platform_driver_unregister(&PLATFORM_DRIVER);
clean0: clean0:
#endif #endif
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
debugfs_remove(ehci_debug_root); debugfs_remove(ehci_debug_root);
ehci_debug_root = NULL; ehci_debug_root = NULL;
err_debug: err_debug:
...@@ -1393,7 +1385,7 @@ static void __exit ehci_hcd_cleanup(void) ...@@ -1393,7 +1385,7 @@ static void __exit ehci_hcd_cleanup(void)
#ifdef PS3_SYSTEM_BUS_DRIVER #ifdef PS3_SYSTEM_BUS_DRIVER
ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); ps3_ehci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
#endif #endif
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
debugfs_remove(ehci_debug_root); debugfs_remove(ehci_debug_root);
#endif #endif
clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
......
...@@ -1114,10 +1114,8 @@ static int ehci_hub_control ( ...@@ -1114,10 +1114,8 @@ static int ehci_hub_control (
if (test_bit(wIndex, &ehci->port_c_suspend)) if (test_bit(wIndex, &ehci->port_c_suspend))
status |= USB_PORT_STAT_C_SUSPEND << 16; status |= USB_PORT_STAT_C_SUSPEND << 16;
#ifndef VERBOSE_DEBUG if (status & ~0xffff) /* only if wPortChange is interesting */
if (status & ~0xffff) /* only if wPortChange is interesting */ dbg_port(ehci, "GetStatus", wIndex + 1, temp);
#endif
dbg_port (ehci, "GetStatus", wIndex + 1, temp);
put_unaligned_le32(status, buf); put_unaligned_le32(status, buf);
break; break;
case SetHubFeature: case SetHubFeature:
......
...@@ -178,7 +178,7 @@ static int mv_ehci_probe(struct platform_device *pdev) ...@@ -178,7 +178,7 @@ static int mv_ehci_probe(struct platform_device *pdev)
ehci_mv->phy_regs = devm_ioremap(&pdev->dev, r->start, ehci_mv->phy_regs = devm_ioremap(&pdev->dev, r->start,
resource_size(r)); resource_size(r));
if (ehci_mv->phy_regs == 0) { if (!ehci_mv->phy_regs) {
dev_err(&pdev->dev, "failed to map phy I/O memory\n"); dev_err(&pdev->dev, "failed to map phy I/O memory\n");
retval = -EFAULT; retval = -EFAULT;
goto err_put_hcd; goto err_put_hcd;
...@@ -257,6 +257,7 @@ static int mv_ehci_probe(struct platform_device *pdev) ...@@ -257,6 +257,7 @@ static int mv_ehci_probe(struct platform_device *pdev)
"failed to add hcd with err %d\n", retval); "failed to add hcd with err %d\n", retval);
goto err_set_vbus; goto err_set_vbus;
} }
device_wakeup_enable(hcd->self.controller);
} }
if (pdata->private_init) if (pdata->private_init)
......
...@@ -155,6 +155,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev) ...@@ -155,6 +155,7 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_add; goto err_add;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_add: err_add:
......
...@@ -158,6 +158,7 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev) ...@@ -158,6 +158,7 @@ static int ehci_octeon_drv_probe(struct platform_device *pdev)
dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret); dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret);
goto err3; goto err3;
} }
device_wakeup_enable(hcd->self.controller);
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
......
...@@ -215,6 +215,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) ...@@ -215,6 +215,7 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
dev_err(dev, "failed to add hcd with err %d\n", ret); dev_err(dev, "failed to add hcd with err %d\n", ret);
goto err_pm_runtime; goto err_pm_runtime;
} }
device_wakeup_enable(hcd->self.controller);
/* /*
* Bring PHYs out of reset for non PHY modes. * Bring PHYs out of reset for non PHY modes.
......
...@@ -252,6 +252,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev) ...@@ -252,6 +252,7 @@ static int ehci_orion_drv_probe(struct platform_device *pdev)
if (err) if (err)
goto err4; goto err4;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err4: err4:
......
...@@ -132,6 +132,7 @@ static int ehci_platform_probe(struct platform_device *dev) ...@@ -132,6 +132,7 @@ static int ehci_platform_probe(struct platform_device *dev)
if (err) if (err)
goto err_put_hcd; goto err_put_hcd;
device_wakeup_enable(hcd->self.controller);
platform_set_drvdata(dev, hcd); platform_set_drvdata(dev, hcd);
return err; return err;
......
...@@ -210,8 +210,10 @@ int usb_hcd_msp_probe(const struct hc_driver *driver, ...@@ -210,8 +210,10 @@ int usb_hcd_msp_probe(const struct hc_driver *driver,
retval = usb_add_hcd(hcd, res->start, IRQF_SHARED); retval = usb_add_hcd(hcd, res->start, IRQF_SHARED);
if (retval == 0) if (retval == 0) {
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
}
usb_remove_hcd(hcd); usb_remove_hcd(hcd);
err3: err3:
......
...@@ -169,6 +169,7 @@ static int ehci_hcd_ppc_of_probe(struct platform_device *op) ...@@ -169,6 +169,7 @@ static int ehci_hcd_ppc_of_probe(struct platform_device *op)
if (rv) if (rv)
goto err_ioremap; goto err_ioremap;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_ioremap: err_ioremap:
......
...@@ -189,6 +189,7 @@ static int ps3_ehci_probe(struct ps3_system_bus_device *dev) ...@@ -189,6 +189,7 @@ static int ps3_ehci_probe(struct ps3_system_bus_device *dev)
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return result; return result;
fail_add_hcd: fail_add_hcd:
......
...@@ -168,13 +168,13 @@ static void ehci_clear_tt_buffer(struct ehci_hcd *ehci, struct ehci_qh *qh, ...@@ -168,13 +168,13 @@ static void ehci_clear_tt_buffer(struct ehci_hcd *ehci, struct ehci_qh *qh,
* Note: this routine is never called for Isochronous transfers. * Note: this routine is never called for Isochronous transfers.
*/ */
if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) {
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
struct usb_device *tt = urb->dev->tt->hub; struct usb_device *tt = urb->dev->tt->hub;
dev_dbg(&tt->dev, dev_dbg(&tt->dev,
"clear tt buffer port %d, a%d ep%d t%08x\n", "clear tt buffer port %d, a%d ep%d t%08x\n",
urb->dev->ttport, urb->dev->devnum, urb->dev->ttport, urb->dev->devnum,
usb_pipeendpoint(urb->pipe), token); usb_pipeendpoint(urb->pipe), token);
#endif /* DEBUG || CONFIG_DYNAMIC_DEBUG */ #endif /* CONFIG_DYNAMIC_DEBUG */
if (!ehci_is_TDI(ehci) if (!ehci_is_TDI(ehci)
|| urb->dev->tt->hub != || urb->dev->tt->hub !=
ehci_to_hcd(ehci)->self.root_hub) { ehci_to_hcd(ehci)->self.root_hub) {
......
...@@ -126,6 +126,7 @@ static int ehci_hcd_sead3_drv_probe(struct platform_device *pdev) ...@@ -126,6 +126,7 @@ static int ehci_hcd_sead3_drv_probe(struct platform_device *pdev)
IRQF_SHARED); IRQF_SHARED);
if (ret == 0) { if (ret == 0) {
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
device_wakeup_enable(hcd->self.controller);
return ret; return ret;
} }
......
...@@ -151,6 +151,7 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev) ...@@ -151,6 +151,7 @@ static int ehci_hcd_sh_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add hcd"); dev_err(&pdev->dev, "Failed to add hcd");
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
priv->hcd = hcd; priv->hcd = hcd;
platform_set_drvdata(pdev, priv); platform_set_drvdata(pdev, priv);
......
...@@ -130,6 +130,7 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev) ...@@ -130,6 +130,7 @@ static int spear_ehci_hcd_drv_probe(struct platform_device *pdev)
if (retval) if (retval)
goto err_stop_ehci; goto err_stop_ehci;
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
err_stop_ehci: err_stop_ehci:
......
...@@ -455,6 +455,7 @@ static int tegra_ehci_probe(struct platform_device *pdev) ...@@ -455,6 +455,7 @@ static int tegra_ehci_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add USB HCD\n"); dev_err(&pdev->dev, "Failed to add USB HCD\n");
goto cleanup_otg_set_host; goto cleanup_otg_set_host;
} }
device_wakeup_enable(hcd->self.controller);
return err; return err;
......
...@@ -170,6 +170,7 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -170,6 +170,7 @@ static int ehci_hcd_tilegx_drv_probe(struct platform_device *pdev)
ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED); ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED);
if (ret == 0) { if (ret == 0) {
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
device_wakeup_enable(hcd->self.controller);
return ret; return ret;
} }
......
...@@ -94,6 +94,7 @@ static int usb_w90x900_probe(const struct hc_driver *driver, ...@@ -94,6 +94,7 @@ static int usb_w90x900_probe(const struct hc_driver *driver,
if (retval != 0) if (retval != 0)
goto err4; goto err4;
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
err4: err4:
iounmap(hcd->regs); iounmap(hcd->regs);
......
...@@ -191,8 +191,10 @@ static int ehci_hcd_xilinx_of_probe(struct platform_device *op) ...@@ -191,8 +191,10 @@ static int ehci_hcd_xilinx_of_probe(struct platform_device *op)
ehci->caps = hcd->regs + 0x100; ehci->caps = hcd->regs + 0x100;
rv = usb_add_hcd(hcd, irq, 0); rv = usb_add_hcd(hcd, irq, 0);
if (rv == 0) if (rv == 0) {
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
}
err_irq: err_irq:
usb_put_hcd(hcd); usb_put_hcd(hcd);
......
...@@ -38,7 +38,7 @@ typedef __u16 __bitwise __hc16; ...@@ -38,7 +38,7 @@ typedef __u16 __bitwise __hc16;
#endif #endif
/* statistics can be kept for tuning/monitoring */ /* statistics can be kept for tuning/monitoring */
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
#define EHCI_STATS #define EHCI_STATS
#endif #endif
...@@ -248,7 +248,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -248,7 +248,7 @@ struct ehci_hcd { /* one per controller */
#endif #endif
/* debug files */ /* debug files */
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG) #ifdef CONFIG_DYNAMIC_DEBUG
struct dentry *debug_dir; struct dentry *debug_dir;
#endif #endif
...@@ -832,9 +832,9 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x) ...@@ -832,9 +832,9 @@ static inline u32 hc32_to_cpup (const struct ehci_hcd *ehci, const __hc32 *x)
dev_warn(ehci_to_hcd(ehci)->self.controller , fmt , ## args) dev_warn(ehci_to_hcd(ehci)->self.controller , fmt , ## args)
#if !defined(DEBUG) && !defined(CONFIG_DYNAMIC_DEBUG) #ifndef CONFIG_DYNAMIC_DEBUG
#define STUB_DEBUG_FILES #define STUB_DEBUG_FILES
#endif /* !DEBUG && !CONFIG_DYNAMIC_DEBUG */ #endif
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -754,6 +754,8 @@ static int of_fhci_probe(struct platform_device *ofdev) ...@@ -754,6 +754,8 @@ static int of_fhci_probe(struct platform_device *ofdev)
if (ret < 0) if (ret < 0)
goto err_add_hcd; goto err_add_hcd;
device_wakeup_enable(hcd->self.controller);
fhci_dfs_create(fhci); fhci_dfs_create(fhci);
return 0; return 0;
......
...@@ -56,12 +56,9 @@ ...@@ -56,12 +56,9 @@
static const char hcd_name[] = "fotg210_hcd"; static const char hcd_name[] = "fotg210_hcd";
#undef VERBOSE_DEBUG
#undef FOTG210_URB_TRACE #undef FOTG210_URB_TRACE
#ifdef DEBUG
#define FOTG210_STATS #define FOTG210_STATS
#endif
/* magic numbers that can affect system performance */ /* magic numbers that can affect system performance */
#define FOTG210_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ #define FOTG210_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
...@@ -107,14 +104,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us"); ...@@ -107,14 +104,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us");
#define fotg210_warn(fotg210, 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)
#ifdef VERBOSE_DEBUG
# define fotg210_vdbg fotg210_dbg
#else
static inline void fotg210_vdbg(struct fotg210_hcd *fotg210, ...) {}
#endif
#ifdef DEBUG
/* check the values in the HCSPARAMS register /* check the values in the HCSPARAMS register
* (host controller _Structural_ parameters) * (host controller _Structural_ parameters)
* see EHCI spec, Table 2-4 for each value * see EHCI spec, Table 2-4 for each value
...@@ -129,13 +118,6 @@ static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) ...@@ -129,13 +118,6 @@ static void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label)
HCS_N_PORTS(params) HCS_N_PORTS(params)
); );
} }
#else
static inline void dbg_hcs_params(struct fotg210_hcd *fotg210, char *label) {}
#endif
#ifdef DEBUG
/* check the values in the HCCPARAMS register /* check the values in the HCCPARAMS register
* (host controller _Capability_ parameters) * (host controller _Capability_ parameters)
...@@ -152,13 +134,6 @@ static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) ...@@ -152,13 +134,6 @@ static void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label)
HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024", HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024",
HCC_CANPARK(params) ? " park" : ""); HCC_CANPARK(params) ? " park" : "");
} }
#else
static inline void dbg_hcc_params(struct fotg210_hcd *fotg210, char *label) {}
#endif
#ifdef DEBUG
static void __maybe_unused static void __maybe_unused
dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd) dbg_qtd(const char *label, struct fotg210_hcd *fotg210, struct fotg210_qtd *qtd)
...@@ -272,8 +247,8 @@ dbg_command_buf(char *buf, unsigned len, const char *label, u32 command) ...@@ -272,8 +247,8 @@ dbg_command_buf(char *buf, unsigned len, const char *label, u32 command)
); );
} }
static int static char
dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) *dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
{ {
char *sig; char *sig;
...@@ -293,7 +268,7 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) ...@@ -293,7 +268,7 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
break; break;
} }
return scnprintf(buf, len, scnprintf(buf, len,
"%s%sport:%d status %06x %d " "%s%sport:%d status %06x %d "
"sig=%s%s%s%s%s%s%s%s", "sig=%s%s%s%s%s%s%s%s",
label, label[0] ? " " : "", port, status, label, label[0] ? " " : "", port, status,
...@@ -306,31 +281,9 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) ...@@ -306,31 +281,9 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
(status & PORT_PE) ? " PE" : "", (status & PORT_PE) ? " PE" : "",
(status & PORT_CSC) ? " CSC" : "", (status & PORT_CSC) ? " CSC" : "",
(status & PORT_CONNECT) ? " CONNECT" : ""); (status & PORT_CONNECT) ? " CONNECT" : "");
return buf;
} }
#else
static inline void __maybe_unused
dbg_qh(char *label, struct fotg210_hcd *fotg210, struct fotg210_qh *qh)
{}
static inline int __maybe_unused
dbg_status_buf(char *buf, unsigned len, const char *label, u32 status)
{ return 0; }
static inline int __maybe_unused
dbg_command_buf(char *buf, unsigned len, const char *label, u32 command)
{ return 0; }
static inline int __maybe_unused
dbg_intr_buf(char *buf, unsigned len, const char *label, u32 enable)
{ return 0; }
static inline int __maybe_unused
dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
{ return 0; }
#endif /* DEBUG */
/* functions have the "wrong" filename when they're output... */ /* functions have the "wrong" filename when they're output... */
#define dbg_status(fotg210, label, status) { \ #define dbg_status(fotg210, label, status) { \
char _buf[80]; \ char _buf[80]; \
...@@ -346,19 +299,11 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status) ...@@ -346,19 +299,11 @@ dbg_port_buf(char *buf, unsigned len, const char *label, int port, u32 status)
#define dbg_port(fotg210, label, port, status) { \ #define dbg_port(fotg210, label, port, status) { \
char _buf[80]; \ char _buf[80]; \
dbg_port_buf(_buf, sizeof(_buf), label, port, status); \ fotg210_dbg(fotg210, "%s\n", dbg_port_buf(_buf, sizeof(_buf), label, port, status) ); \
fotg210_dbg(fotg210, "%s\n", _buf); \
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifdef STUB_DEBUG_FILES
static inline void create_debug_files(struct fotg210_hcd *bus) { }
static inline void remove_debug_files(struct fotg210_hcd *bus) { }
#else
/* troubleshooting help: expose state in debugfs */ /* troubleshooting help: expose state in debugfs */
static int debug_async_open(struct inode *, struct file *); static int debug_async_open(struct inode *, struct file *);
...@@ -954,7 +899,6 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210) ...@@ -954,7 +899,6 @@ static inline void remove_debug_files(struct fotg210_hcd *fotg210)
debugfs_remove_recursive(fotg210->debug_dir); debugfs_remove_recursive(fotg210->debug_dir);
} }
#endif /* STUB_DEBUG_FILES */
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
...@@ -1398,7 +1342,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210) ...@@ -1398,7 +1342,7 @@ static void fotg210_iaa_watchdog(struct fotg210_hcd *fotg210)
&fotg210->regs->status); &fotg210->regs->status);
} }
fotg210_vdbg(fotg210, "IAA watchdog: status %x cmd %x\n", fotg210_dbg(fotg210, "IAA watchdog: status %x cmd %x\n",
status, cmd); status, cmd);
end_unlink_async(fotg210); end_unlink_async(fotg210);
} }
...@@ -1810,10 +1754,8 @@ static int fotg210_hub_control( ...@@ -1810,10 +1754,8 @@ static int fotg210_hub_control(
if (test_bit(wIndex, &fotg210->port_c_suspend)) if (test_bit(wIndex, &fotg210->port_c_suspend))
status |= USB_PORT_STAT_C_SUSPEND << 16; status |= USB_PORT_STAT_C_SUSPEND << 16;
#ifndef VERBOSE_DEBUG if (status & ~0xffff) /* only if wPortChange is interesting */
if (status & ~0xffff) /* only if wPortChange is interesting */ dbg_port(fotg210, "GetStatus", wIndex + 1, temp);
#endif
dbg_port(fotg210, "GetStatus", wIndex + 1, temp);
put_unaligned_le32(status, buf); put_unaligned_le32(status, buf);
break; break;
case SetHubFeature: case SetHubFeature:
...@@ -1856,7 +1798,7 @@ static int fotg210_hub_control( ...@@ -1856,7 +1798,7 @@ static int fotg210_hub_control(
* which can be fine if this root hub has a * which can be fine if this root hub has a
* transaction translator built in. * transaction translator built in.
*/ */
fotg210_vdbg(fotg210, "port %d reset\n", wIndex + 1); fotg210_dbg(fotg210, "port %d reset\n", wIndex + 1);
temp |= PORT_RESET; temp |= PORT_RESET;
temp &= ~PORT_PE; temp &= ~PORT_PE;
...@@ -2274,13 +2216,12 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210, ...@@ -2274,13 +2216,12 @@ static void fotg210_clear_tt_buffer(struct fotg210_hcd *fotg210,
* Note: this routine is never called for Isochronous transfers. * Note: this routine is never called for Isochronous transfers.
*/ */
if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) {
#ifdef DEBUG
struct usb_device *tt = urb->dev->tt->hub; struct usb_device *tt = urb->dev->tt->hub;
dev_dbg(&tt->dev, dev_dbg(&tt->dev,
"clear tt buffer port %d, a%d ep%d t%08x\n", "clear tt buffer port %d, a%d ep%d t%08x\n",
urb->dev->ttport, urb->dev->devnum, urb->dev->ttport, urb->dev->devnum,
usb_pipeendpoint(urb->pipe), token); usb_pipeendpoint(urb->pipe), token);
#endif /* DEBUG */
if (urb->dev->tt->hub != 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) if (usb_hub_clear_tt_buffer(urb) == 0)
...@@ -2341,7 +2282,7 @@ static int qtd_copy_status( ...@@ -2341,7 +2282,7 @@ static int qtd_copy_status(
status = -EPROTO; status = -EPROTO;
} }
fotg210_vdbg(fotg210, fotg210_dbg(fotg210,
"dev%d ep%d%s qtd token %08x --> status %d\n", "dev%d ep%d%s qtd token %08x --> status %d\n",
usb_pipedevice(urb->pipe), usb_pipedevice(urb->pipe),
usb_pipeendpoint(urb->pipe), usb_pipeendpoint(urb->pipe),
...@@ -3583,11 +3524,9 @@ periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe) ...@@ -3583,11 +3524,9 @@ periodic_usecs(struct fotg210_hcd *fotg210, unsigned frame, unsigned uframe)
break; break;
} }
} }
#ifdef DEBUG
if (usecs > fotg210->uframe_periodic_max) if (usecs > fotg210->uframe_periodic_max)
fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n", fotg210_err(fotg210, "uframe %d sched overrun: %d usecs\n",
frame * 8 + uframe, usecs); frame * 8 + uframe, usecs);
#endif
return usecs; return usecs;
} }
...@@ -4646,7 +4585,7 @@ static void itd_link_urb( ...@@ -4646,7 +4585,7 @@ static void itd_link_urb(
if (unlikely(list_empty(&stream->td_list))) { if (unlikely(list_empty(&stream->td_list))) {
fotg210_to_hcd(fotg210)->self.bandwidth_allocated fotg210_to_hcd(fotg210)->self.bandwidth_allocated
+= stream->bandwidth; += stream->bandwidth;
fotg210_vdbg(fotg210, fotg210_dbg(fotg210,
"schedule devp %s ep%d%s-iso period %d start %d.%d\n", "schedule devp %s ep%d%s-iso period %d start %d.%d\n",
urb->dev->devpath, stream->bEndpointAddress & 0x0f, urb->dev->devpath, stream->bEndpointAddress & 0x0f,
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out", (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
...@@ -4779,7 +4718,7 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd) ...@@ -4779,7 +4718,7 @@ static bool itd_complete(struct fotg210_hcd *fotg210, struct fotg210_itd *itd)
if (unlikely(list_is_singular(&stream->td_list))) { if (unlikely(list_is_singular(&stream->td_list))) {
fotg210_to_hcd(fotg210)->self.bandwidth_allocated fotg210_to_hcd(fotg210)->self.bandwidth_allocated
-= stream->bandwidth; -= stream->bandwidth;
fotg210_vdbg(fotg210, fotg210_dbg(fotg210,
"deschedule devp %s ep%d%s-iso\n", "deschedule devp %s ep%d%s-iso\n",
dev->devpath, stream->bEndpointAddress & 0x0f, dev->devpath, stream->bEndpointAddress & 0x0f,
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
...@@ -5444,10 +5383,8 @@ static irqreturn_t fotg210_irq(struct usb_hcd *hcd) ...@@ -5444,10 +5383,8 @@ static irqreturn_t fotg210_irq(struct usb_hcd *hcd)
cmd = fotg210_readl(fotg210, &fotg210->regs->command); cmd = fotg210_readl(fotg210, &fotg210->regs->command);
bh = 0; bh = 0;
#ifdef VERBOSE_DEBUG
/* unrequested/ignored: Frame List Rollover */ /* unrequested/ignored: Frame List Rollover */
dbg_status(fotg210, "irq", status); dbg_status(fotg210, "irq", status);
#endif
/* INT, ERR, and IAA interrupt rates can be throttled */ /* INT, ERR, and IAA interrupt rates can be throttled */
...@@ -5952,6 +5889,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev) ...@@ -5952,6 +5889,7 @@ static int fotg210_hcd_probe(struct platform_device *pdev)
dev_err(dev, "failed to add hcd with err %d\n", retval); dev_err(dev, "failed to add hcd with err %d\n", retval);
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
...@@ -6013,13 +5951,11 @@ static int __init fotg210_hcd_init(void) ...@@ -6013,13 +5951,11 @@ static int __init fotg210_hcd_init(void)
sizeof(struct fotg210_qh), sizeof(struct fotg210_qtd), sizeof(struct fotg210_qh), sizeof(struct fotg210_qtd),
sizeof(struct fotg210_itd)); sizeof(struct fotg210_itd));
#ifdef DEBUG
fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root); fotg210_debug_root = debugfs_create_dir("fotg210", usb_debug_root);
if (!fotg210_debug_root) { if (!fotg210_debug_root) {
retval = -ENOENT; retval = -ENOENT;
goto err_debug; goto err_debug;
} }
#endif
retval = platform_driver_register(&fotg210_hcd_driver); retval = platform_driver_register(&fotg210_hcd_driver);
if (retval < 0) if (retval < 0)
...@@ -6028,11 +5964,9 @@ static int __init fotg210_hcd_init(void) ...@@ -6028,11 +5964,9 @@ static int __init fotg210_hcd_init(void)
platform_driver_unregister(&fotg210_hcd_driver); platform_driver_unregister(&fotg210_hcd_driver);
clean: clean:
#ifdef DEBUG
debugfs_remove(fotg210_debug_root); debugfs_remove(fotg210_debug_root);
fotg210_debug_root = NULL; fotg210_debug_root = NULL;
err_debug: err_debug:
#endif
clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
return retval; return retval;
} }
...@@ -6041,9 +5975,7 @@ module_init(fotg210_hcd_init); ...@@ -6041,9 +5975,7 @@ module_init(fotg210_hcd_init);
static void __exit fotg210_hcd_cleanup(void) static void __exit fotg210_hcd_cleanup(void)
{ {
platform_driver_unregister(&fotg210_hcd_driver); platform_driver_unregister(&fotg210_hcd_driver);
#ifdef DEBUG
debugfs_remove(fotg210_debug_root); debugfs_remove(fotg210_debug_root);
#endif
clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
} }
module_exit(fotg210_hcd_cleanup); module_exit(fotg210_hcd_cleanup);
...@@ -174,9 +174,7 @@ struct fotg210_hcd { /* one per controller */ ...@@ -174,9 +174,7 @@ struct fotg210_hcd { /* one per controller */
#endif #endif
/* debug files */ /* debug files */
#ifdef DEBUG
struct dentry *debug_dir; struct dentry *debug_dir;
#endif
}; };
/* convert between an HCD pointer and the corresponding FOTG210_HCD */ /* convert between an HCD pointer and the corresponding FOTG210_HCD */
...@@ -741,10 +739,4 @@ static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210) ...@@ -741,10 +739,4 @@ static inline unsigned fotg210_read_frame_index(struct fotg210_hcd *fotg210)
}) })
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifndef DEBUG
#define STUB_DEBUG_FILES
#endif /* DEBUG */
/*-------------------------------------------------------------------------*/
#endif /* __LINUX_FOTG210_H */ #endif /* __LINUX_FOTG210_H */
...@@ -57,13 +57,8 @@ ...@@ -57,13 +57,8 @@
static const char hcd_name [] = "fusbh200_hcd"; static const char hcd_name [] = "fusbh200_hcd";
#undef VERBOSE_DEBUG
#undef FUSBH200_URB_TRACE #undef FUSBH200_URB_TRACE
#ifdef DEBUG
#define FUSBH200_STATS
#endif
/* magic numbers that can affect system performance */ /* magic numbers that can affect system performance */
#define FUSBH200_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */ #define FUSBH200_TUNE_CERR 3 /* 0-3 qtd retries; 0 == don't stop */
#define FUSBH200_TUNE_RL_HS 4 /* nak throttle; see 4.9 */ #define FUSBH200_TUNE_RL_HS 4 /* nak throttle; see 4.9 */
...@@ -108,14 +103,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us"); ...@@ -108,14 +103,6 @@ MODULE_PARM_DESC(hird, "host initiated resume duration, +1 for each 75us");
#define fusbh200_warn(fusbh200, fmt, args...) \ #define fusbh200_warn(fusbh200, fmt, args...) \
dev_warn (fusbh200_to_hcd(fusbh200)->self.controller , fmt , ## args ) dev_warn (fusbh200_to_hcd(fusbh200)->self.controller , fmt , ## args )
#ifdef VERBOSE_DEBUG
# define fusbh200_vdbg fusbh200_dbg
#else
static inline void fusbh200_vdbg(struct fusbh200_hcd *fusbh200, ...) {}
#endif
#ifdef DEBUG
/* check the values in the HCSPARAMS register /* check the values in the HCSPARAMS register
* (host controller _Structural_ parameters) * (host controller _Structural_ parameters)
* see EHCI spec, Table 2-4 for each value * see EHCI spec, Table 2-4 for each value
...@@ -130,13 +117,6 @@ static void dbg_hcs_params (struct fusbh200_hcd *fusbh200, char *label) ...@@ -130,13 +117,6 @@ static void dbg_hcs_params (struct fusbh200_hcd *fusbh200, char *label)
HCS_N_PORTS (params) HCS_N_PORTS (params)
); );
} }
#else
static inline void dbg_hcs_params (struct fusbh200_hcd *fusbh200, char *label) {}
#endif
#ifdef DEBUG
/* check the values in the HCCPARAMS register /* check the values in the HCCPARAMS register
* (host controller _Capability_ parameters) * (host controller _Capability_ parameters)
...@@ -153,13 +133,6 @@ static void dbg_hcc_params (struct fusbh200_hcd *fusbh200, char *label) ...@@ -153,13 +133,6 @@ static void dbg_hcc_params (struct fusbh200_hcd *fusbh200, char *label)
HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024", HCC_PGM_FRAMELISTLEN(params) ? "256/512/1024" : "1024",
HCC_CANPARK(params) ? " park" : ""); HCC_CANPARK(params) ? " park" : "");
} }
#else
static inline void dbg_hcc_params (struct fusbh200_hcd *fusbh200, char *label) {}
#endif
#ifdef DEBUG
static void __maybe_unused static void __maybe_unused
dbg_qtd (const char *label, struct fusbh200_hcd *fusbh200, struct fusbh200_qtd *qtd) dbg_qtd (const char *label, struct fusbh200_hcd *fusbh200, struct fusbh200_qtd *qtd)
...@@ -302,29 +275,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) ...@@ -302,29 +275,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status)
(status & PORT_CONNECT) ? " CONNECT" : ""); (status & PORT_CONNECT) ? " CONNECT" : "");
} }
#else
static inline void __maybe_unused
dbg_qh (char *label, struct fusbh200_hcd *fusbh200, struct fusbh200_qh *qh)
{}
static inline int __maybe_unused
dbg_status_buf (char *buf, unsigned len, const char *label, u32 status)
{ return 0; }
static inline int __maybe_unused
dbg_command_buf (char *buf, unsigned len, const char *label, u32 command)
{ return 0; }
static inline int __maybe_unused
dbg_intr_buf (char *buf, unsigned len, const char *label, u32 enable)
{ return 0; }
static inline int __maybe_unused
dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status)
{ return 0; }
#endif /* DEBUG */
/* functions have the "wrong" filename when they're output... */ /* functions have the "wrong" filename when they're output... */
#define dbg_status(fusbh200, label, status) { \ #define dbg_status(fusbh200, label, status) { \
char _buf [80]; \ char _buf [80]; \
...@@ -346,13 +296,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status) ...@@ -346,13 +296,6 @@ dbg_port_buf (char *buf, unsigned len, const char *label, int port, u32 status)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifdef STUB_DEBUG_FILES
static inline void create_debug_files (struct fusbh200_hcd *bus) { }
static inline void remove_debug_files (struct fusbh200_hcd *bus) { }
#else
/* troubleshooting help: expose state in debugfs */ /* troubleshooting help: expose state in debugfs */
static int debug_async_open(struct inode *, struct file *); static int debug_async_open(struct inode *, struct file *);
...@@ -775,7 +718,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) ...@@ -775,7 +718,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
next += temp; next += temp;
} }
#ifdef FUSBH200_STATS
temp = scnprintf (next, size, temp = scnprintf (next, size,
"irq normal %ld err %ld iaa %ld (lost %ld)\n", "irq normal %ld err %ld iaa %ld (lost %ld)\n",
fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa, fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa,
...@@ -787,7 +729,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) ...@@ -787,7 +729,6 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf)
fusbh200->stats.complete, fusbh200->stats.unlink); fusbh200->stats.complete, fusbh200->stats.unlink);
size -= temp; size -= temp;
next += temp; next += temp;
#endif
done: done:
spin_unlock_irqrestore (&fusbh200->lock, flags); spin_unlock_irqrestore (&fusbh200->lock, flags);
...@@ -928,7 +869,6 @@ static inline void remove_debug_files (struct fusbh200_hcd *fusbh200) ...@@ -928,7 +869,6 @@ static inline void remove_debug_files (struct fusbh200_hcd *fusbh200)
debugfs_remove_recursive(fusbh200->debug_dir); debugfs_remove_recursive(fusbh200->debug_dir);
} }
#endif /* STUB_DEBUG_FILES */
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
...@@ -1362,7 +1302,7 @@ static void fusbh200_iaa_watchdog(struct fusbh200_hcd *fusbh200) ...@@ -1362,7 +1302,7 @@ static void fusbh200_iaa_watchdog(struct fusbh200_hcd *fusbh200)
fusbh200_writel(fusbh200, STS_IAA, &fusbh200->regs->status); fusbh200_writel(fusbh200, STS_IAA, &fusbh200->regs->status);
} }
fusbh200_vdbg(fusbh200, "IAA watchdog: status %x cmd %x\n", fusbh200_dbg(fusbh200, "IAA watchdog: status %x cmd %x\n",
status, cmd); status, cmd);
end_unlink_async(fusbh200); end_unlink_async(fusbh200);
} }
...@@ -1769,10 +1709,8 @@ static int fusbh200_hub_control ( ...@@ -1769,10 +1709,8 @@ static int fusbh200_hub_control (
if (test_bit(wIndex, &fusbh200->port_c_suspend)) if (test_bit(wIndex, &fusbh200->port_c_suspend))
status |= USB_PORT_STAT_C_SUSPEND << 16; status |= USB_PORT_STAT_C_SUSPEND << 16;
#ifndef VERBOSE_DEBUG if (status & ~0xffff) /* only if wPortChange is interesting */
if (status & ~0xffff) /* only if wPortChange is interesting */ dbg_port(fusbh200, "GetStatus", wIndex + 1, temp);
#endif
dbg_port (fusbh200, "GetStatus", wIndex + 1, temp);
put_unaligned_le32(status, buf); put_unaligned_le32(status, buf);
break; break;
case SetHubFeature: case SetHubFeature:
...@@ -1814,7 +1752,7 @@ static int fusbh200_hub_control ( ...@@ -1814,7 +1752,7 @@ static int fusbh200_hub_control (
* which can be fine if this root hub has a * which can be fine if this root hub has a
* transaction translator built in. * transaction translator built in.
*/ */
fusbh200_vdbg (fusbh200, "port %d reset\n", wIndex + 1); fusbh200_dbg(fusbh200, "port %d reset\n", wIndex + 1);
temp |= PORT_RESET; temp |= PORT_RESET;
temp &= ~PORT_PE; temp &= ~PORT_PE;
...@@ -2230,13 +2168,13 @@ static void fusbh200_clear_tt_buffer(struct fusbh200_hcd *fusbh200, struct fusbh ...@@ -2230,13 +2168,13 @@ static void fusbh200_clear_tt_buffer(struct fusbh200_hcd *fusbh200, struct fusbh
* Note: this routine is never called for Isochronous transfers. * Note: this routine is never called for Isochronous transfers.
*/ */
if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) { if (urb->dev->tt && !usb_pipeint(urb->pipe) && !qh->clearing_tt) {
#ifdef DEBUG
struct usb_device *tt = urb->dev->tt->hub; struct usb_device *tt = urb->dev->tt->hub;
dev_dbg(&tt->dev, dev_dbg(&tt->dev,
"clear tt buffer port %d, a%d ep%d t%08x\n", "clear tt buffer port %d, a%d ep%d t%08x\n",
urb->dev->ttport, urb->dev->devnum, urb->dev->ttport, urb->dev->devnum,
usb_pipeendpoint(urb->pipe), token); usb_pipeendpoint(urb->pipe), token);
#endif /* DEBUG */
if (urb->dev->tt->hub != if (urb->dev->tt->hub !=
fusbh200_to_hcd(fusbh200)->self.root_hub) { fusbh200_to_hcd(fusbh200)->self.root_hub) {
if (usb_hub_clear_tt_buffer(urb) == 0) if (usb_hub_clear_tt_buffer(urb) == 0)
...@@ -2297,7 +2235,7 @@ static int qtd_copy_status ( ...@@ -2297,7 +2235,7 @@ static int qtd_copy_status (
status = -EPROTO; status = -EPROTO;
} }
fusbh200_vdbg (fusbh200, fusbh200_dbg(fusbh200,
"dev%d ep%d%s qtd token %08x --> status %d\n", "dev%d ep%d%s qtd token %08x --> status %d\n",
usb_pipedevice (urb->pipe), usb_pipedevice (urb->pipe),
usb_pipeendpoint (urb->pipe), usb_pipeendpoint (urb->pipe),
...@@ -3529,11 +3467,9 @@ periodic_usecs (struct fusbh200_hcd *fusbh200, unsigned frame, unsigned uframe) ...@@ -3529,11 +3467,9 @@ periodic_usecs (struct fusbh200_hcd *fusbh200, unsigned frame, unsigned uframe)
break; break;
} }
} }
#ifdef DEBUG
if (usecs > fusbh200->uframe_periodic_max) if (usecs > fusbh200->uframe_periodic_max)
fusbh200_err (fusbh200, "uframe %d sched overrun: %d usecs\n", fusbh200_err (fusbh200, "uframe %d sched overrun: %d usecs\n",
frame * 8 + uframe, usecs); frame * 8 + uframe, usecs);
#endif
return usecs; return usecs;
} }
...@@ -4586,7 +4522,7 @@ static void itd_link_urb( ...@@ -4586,7 +4522,7 @@ static void itd_link_urb(
if (unlikely (list_empty(&stream->td_list))) { if (unlikely (list_empty(&stream->td_list))) {
fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated
+= stream->bandwidth; += stream->bandwidth;
fusbh200_vdbg (fusbh200, fusbh200_dbg(fusbh200,
"schedule devp %s ep%d%s-iso period %d start %d.%d\n", "schedule devp %s ep%d%s-iso period %d start %d.%d\n",
urb->dev->devpath, stream->bEndpointAddress & 0x0f, urb->dev->devpath, stream->bEndpointAddress & 0x0f,
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out", (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out",
...@@ -4717,7 +4653,7 @@ static bool itd_complete(struct fusbh200_hcd *fusbh200, struct fusbh200_itd *itd ...@@ -4717,7 +4653,7 @@ static bool itd_complete(struct fusbh200_hcd *fusbh200, struct fusbh200_itd *itd
if (unlikely(list_is_singular(&stream->td_list))) { if (unlikely(list_is_singular(&stream->td_list))) {
fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated fusbh200_to_hcd(fusbh200)->self.bandwidth_allocated
-= stream->bandwidth; -= stream->bandwidth;
fusbh200_vdbg (fusbh200, fusbh200_dbg(fusbh200,
"deschedule devp %s ep%d%s-iso\n", "deschedule devp %s ep%d%s-iso\n",
dev->devpath, stream->bEndpointAddress & 0x0f, dev->devpath, stream->bEndpointAddress & 0x0f,
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out"); (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
...@@ -5115,13 +5051,11 @@ static void fusbh200_stop (struct usb_hcd *hcd) ...@@ -5115,13 +5051,11 @@ static void fusbh200_stop (struct usb_hcd *hcd)
spin_unlock_irq (&fusbh200->lock); spin_unlock_irq (&fusbh200->lock);
fusbh200_mem_cleanup (fusbh200); fusbh200_mem_cleanup (fusbh200);
#ifdef FUSBH200_STATS
fusbh200_dbg(fusbh200, "irq normal %ld err %ld iaa %ld (lost %ld)\n", fusbh200_dbg(fusbh200, "irq normal %ld err %ld iaa %ld (lost %ld)\n",
fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa, fusbh200->stats.normal, fusbh200->stats.error, fusbh200->stats.iaa,
fusbh200->stats.lost_iaa); fusbh200->stats.lost_iaa);
fusbh200_dbg (fusbh200, "complete %ld unlink %ld\n", fusbh200_dbg (fusbh200, "complete %ld unlink %ld\n",
fusbh200->stats.complete, fusbh200->stats.unlink); fusbh200->stats.complete, fusbh200->stats.unlink);
#endif
dbg_status (fusbh200, "fusbh200_stop completed", dbg_status (fusbh200, "fusbh200_stop completed",
fusbh200_readl(fusbh200, &fusbh200->regs->status)); fusbh200_readl(fusbh200, &fusbh200->regs->status));
...@@ -5365,13 +5299,6 @@ static irqreturn_t fusbh200_irq (struct usb_hcd *hcd) ...@@ -5365,13 +5299,6 @@ static irqreturn_t fusbh200_irq (struct usb_hcd *hcd)
cmd = fusbh200_readl(fusbh200, &fusbh200->regs->command); cmd = fusbh200_readl(fusbh200, &fusbh200->regs->command);
bh = 0; bh = 0;
#ifdef VERBOSE_DEBUG
/* unrequested/ignored: Frame List Rollover */
dbg_status (fusbh200, "irq", status);
#endif
/* INT, ERR, and IAA interrupt rates can be throttled */
/* normal [4.15.1.2] or error [4.15.1.1] completion */ /* normal [4.15.1.2] or error [4.15.1.1] completion */
if (likely ((status & (STS_INT|STS_ERR)) != 0)) { if (likely ((status & (STS_INT|STS_ERR)) != 0)) {
if (likely ((status & STS_ERR) == 0)) if (likely ((status & STS_ERR) == 0))
...@@ -5871,6 +5798,7 @@ static int fusbh200_hcd_probe(struct platform_device *pdev) ...@@ -5871,6 +5798,7 @@ static int fusbh200_hcd_probe(struct platform_device *pdev)
dev_err(dev, "failed to add hcd with err %d\n", retval); dev_err(dev, "failed to add hcd with err %d\n", retval);
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
...@@ -5936,13 +5864,11 @@ static int __init fusbh200_hcd_init(void) ...@@ -5936,13 +5864,11 @@ static int __init fusbh200_hcd_init(void)
sizeof(struct fusbh200_qh), sizeof(struct fusbh200_qtd), sizeof(struct fusbh200_qh), sizeof(struct fusbh200_qtd),
sizeof(struct fusbh200_itd)); sizeof(struct fusbh200_itd));
#ifdef DEBUG
fusbh200_debug_root = debugfs_create_dir("fusbh200", usb_debug_root); fusbh200_debug_root = debugfs_create_dir("fusbh200", usb_debug_root);
if (!fusbh200_debug_root) { if (!fusbh200_debug_root) {
retval = -ENOENT; retval = -ENOENT;
goto err_debug; goto err_debug;
} }
#endif
retval = platform_driver_register(&fusbh200_hcd_fusbh200_driver); retval = platform_driver_register(&fusbh200_hcd_fusbh200_driver);
if (retval < 0) if (retval < 0)
...@@ -5951,11 +5877,9 @@ static int __init fusbh200_hcd_init(void) ...@@ -5951,11 +5877,9 @@ static int __init fusbh200_hcd_init(void)
platform_driver_unregister(&fusbh200_hcd_fusbh200_driver); platform_driver_unregister(&fusbh200_hcd_fusbh200_driver);
clean: clean:
#ifdef DEBUG
debugfs_remove(fusbh200_debug_root); debugfs_remove(fusbh200_debug_root);
fusbh200_debug_root = NULL; fusbh200_debug_root = NULL;
err_debug: err_debug:
#endif
clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
return retval; return retval;
} }
...@@ -5964,9 +5888,7 @@ module_init(fusbh200_hcd_init); ...@@ -5964,9 +5888,7 @@ module_init(fusbh200_hcd_init);
static void __exit fusbh200_hcd_cleanup(void) static void __exit fusbh200_hcd_cleanup(void)
{ {
platform_driver_unregister(&fusbh200_hcd_fusbh200_driver); platform_driver_unregister(&fusbh200_hcd_fusbh200_driver);
#ifdef DEBUG
debugfs_remove(fusbh200_debug_root); debugfs_remove(fusbh200_debug_root);
#endif
clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
} }
module_exit(fusbh200_hcd_cleanup); module_exit(fusbh200_hcd_cleanup);
...@@ -165,17 +165,11 @@ struct fusbh200_hcd { /* one per controller */ ...@@ -165,17 +165,11 @@ struct fusbh200_hcd { /* one per controller */
u8 sbrn; /* packed release number */ u8 sbrn; /* packed release number */
/* irq statistics */ /* irq statistics */
#ifdef FUSBH200_STATS
struct fusbh200_stats stats; struct fusbh200_stats stats;
# define COUNT(x) do { (x)++; } while (0) # define COUNT(x) do { (x)++; } while (0)
#else
# define COUNT(x) do {} while (0)
#endif
/* debug files */ /* debug files */
#ifdef DEBUG
struct dentry *debug_dir; struct dentry *debug_dir;
#endif
}; };
/* convert between an HCD pointer and the corresponding FUSBH200_HCD */ /* convert between an HCD pointer and the corresponding FUSBH200_HCD */
...@@ -734,10 +728,4 @@ static inline unsigned fusbh200_read_frame_index(struct fusbh200_hcd *fusbh200) ...@@ -734,10 +728,4 @@ static inline unsigned fusbh200_read_frame_index(struct fusbh200_hcd *fusbh200)
}) })
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifndef DEBUG
#define STUB_DEBUG_FILES
#endif /* DEBUG */
/*-------------------------------------------------------------------------*/
#endif /* __LINUX_FUSBH200_H */ #endif /* __LINUX_FUSBH200_H */
...@@ -86,7 +86,7 @@ static int __hwahc_set_cluster_id(struct hwahc *hwahc, u8 cluster_id) ...@@ -86,7 +86,7 @@ static int __hwahc_set_cluster_id(struct hwahc *hwahc, u8 cluster_id)
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
cluster_id, cluster_id,
wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
if (result < 0) if (result < 0)
dev_err(dev, "Cannot set WUSB Cluster ID to 0x%02x: %d\n", dev_err(dev, "Cannot set WUSB Cluster ID to 0x%02x: %d\n",
cluster_id, result); cluster_id, result);
...@@ -106,7 +106,7 @@ static int __hwahc_op_set_num_dnts(struct wusbhc *wusbhc, u8 interval, u8 slots) ...@@ -106,7 +106,7 @@ static int __hwahc_op_set_num_dnts(struct wusbhc *wusbhc, u8 interval, u8 slots)
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
interval << 8 | slots, interval << 8 | slots,
wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
} }
/* /*
...@@ -224,7 +224,7 @@ static int hwahc_op_urb_dequeue(struct usb_hcd *usb_hcd, struct urb *urb, ...@@ -224,7 +224,7 @@ static int hwahc_op_urb_dequeue(struct usb_hcd *usb_hcd, struct urb *urb,
struct wusbhc *wusbhc = usb_hcd_to_wusbhc(usb_hcd); struct wusbhc *wusbhc = usb_hcd_to_wusbhc(usb_hcd);
struct hwahc *hwahc = container_of(wusbhc, struct hwahc, wusbhc); struct hwahc *hwahc = container_of(wusbhc, struct hwahc, wusbhc);
return wa_urb_dequeue(&hwahc->wa, urb); return wa_urb_dequeue(&hwahc->wa, urb, status);
} }
/* /*
...@@ -281,7 +281,7 @@ static void __hwahc_op_wusbhc_stop(struct wusbhc *wusbhc, int delay) ...@@ -281,7 +281,7 @@ static void __hwahc_op_wusbhc_stop(struct wusbhc *wusbhc, int delay)
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
delay * 1000, delay * 1000,
iface_no, iface_no,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
if (ret == 0) if (ret == 0)
msleep(delay); msleep(delay);
...@@ -310,7 +310,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, ...@@ -310,7 +310,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
stream_index, stream_index,
wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
if (result < 0) { if (result < 0) {
dev_err(dev, "Cannot set WUSB stream index: %d\n", result); dev_err(dev, "Cannot set WUSB stream index: %d\n", result);
goto out; goto out;
...@@ -321,7 +321,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index, ...@@ -321,7 +321,7 @@ static int __hwahc_op_bwa_set(struct wusbhc *wusbhc, s8 stream_index,
WUSB_REQ_SET_WUSB_MAS, WUSB_REQ_SET_WUSB_MAS,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber, 0, wa->usb_iface->cur_altsetting->desc.bInterfaceNumber,
mas_le, 32, 1000 /* FIXME: arbitrary */); mas_le, 32, USB_CTRL_SET_TIMEOUT);
if (result < 0) if (result < 0)
dev_err(dev, "Cannot set WUSB MAS allocation: %d\n", result); dev_err(dev, "Cannot set WUSB MAS allocation: %d\n", result);
out: out:
...@@ -355,7 +355,7 @@ static int __hwahc_op_mmcie_add(struct wusbhc *wusbhc, u8 interval, ...@@ -355,7 +355,7 @@ static int __hwahc_op_mmcie_add(struct wusbhc *wusbhc, u8 interval,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
interval << 8 | repeat_cnt, interval << 8 | repeat_cnt,
handle << 8 | iface_no, handle << 8 | iface_no,
wuie, wuie->bLength, 1000 /* FIXME: arbitrary */); wuie, wuie->bLength, USB_CTRL_SET_TIMEOUT);
} }
/* /*
...@@ -372,7 +372,7 @@ static int __hwahc_op_mmcie_rm(struct wusbhc *wusbhc, u8 handle) ...@@ -372,7 +372,7 @@ static int __hwahc_op_mmcie_rm(struct wusbhc *wusbhc, u8 handle)
WUSB_REQ_REMOVE_MMC_IE, WUSB_REQ_REMOVE_MMC_IE,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
0, handle << 8 | iface_no, 0, handle << 8 | iface_no,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
} }
/* /*
...@@ -415,7 +415,7 @@ static int __hwahc_op_dev_info_set(struct wusbhc *wusbhc, ...@@ -415,7 +415,7 @@ static int __hwahc_op_dev_info_set(struct wusbhc *wusbhc,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
0, wusb_dev->port_idx << 8 | iface_no, 0, wusb_dev->port_idx << 8 | iface_no,
dev_info, sizeof(struct hwa_dev_info), dev_info, sizeof(struct hwa_dev_info),
1000 /* FIXME: arbitrary */); USB_CTRL_SET_TIMEOUT);
kfree(dev_info); kfree(dev_info);
return ret; return ret;
} }
...@@ -455,7 +455,7 @@ static int __hwahc_dev_set_key(struct wusbhc *wusbhc, u8 port_idx, u32 tkid, ...@@ -455,7 +455,7 @@ static int __hwahc_dev_set_key(struct wusbhc *wusbhc, u8 port_idx, u32 tkid,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
USB_DT_KEY << 8 | key_idx, USB_DT_KEY << 8 | key_idx,
port_idx << 8 | iface_no, port_idx << 8 | iface_no,
keyd, keyd_len, 1000 /* FIXME: arbitrary */); keyd, keyd_len, USB_CTRL_SET_TIMEOUT);
kzfree(keyd); /* clear keys etc. */ kzfree(keyd); /* clear keys etc. */
return result; return result;
...@@ -497,7 +497,7 @@ static int __hwahc_op_set_ptk(struct wusbhc *wusbhc, u8 port_idx, u32 tkid, ...@@ -497,7 +497,7 @@ static int __hwahc_op_set_ptk(struct wusbhc *wusbhc, u8 port_idx, u32 tkid,
USB_REQ_SET_ENCRYPTION, USB_REQ_SET_ENCRYPTION,
USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
encryption_value, port_idx << 8 | iface_no, encryption_value, port_idx << 8 | iface_no,
NULL, 0, 1000 /* FIXME: arbitrary */); NULL, 0, USB_CTRL_SET_TIMEOUT);
if (result < 0) if (result < 0)
dev_err(wusbhc->dev, "Can't set host's WUSB encryption for " dev_err(wusbhc->dev, "Can't set host's WUSB encryption for "
"port index %u to %s (value %d): %d\n", port_idx, "port index %u to %s (value %d): %d\n", port_idx,
...@@ -791,6 +791,7 @@ static int hwahc_probe(struct usb_interface *usb_iface, ...@@ -791,6 +791,7 @@ static int hwahc_probe(struct usb_interface *usb_iface,
dev_err(dev, "Cannot add HCD: %d\n", result); dev_err(dev, "Cannot add HCD: %d\n", result);
goto error_add_hcd; goto error_add_hcd;
} }
device_wakeup_enable(usb_hcd->self.controller);
result = wusbhc_b_create(&hwahc->wusbhc); result = wusbhc_b_create(&hwahc->wusbhc);
if (result < 0) { if (result < 0) {
dev_err(dev, "Cannot setup phase B of WUSBHC: %d\n", result); dev_err(dev, "Cannot setup phase B of WUSBHC: %d\n", result);
......
...@@ -18,6 +18,10 @@ ...@@ -18,6 +18,10 @@
/* this file is part of imx21-hcd.c */ /* this file is part of imx21-hcd.c */
#ifdef CONFIG_DYNAMIC_DEBUG
#define DEBUG
#endif
#ifndef DEBUG #ifndef DEBUG
static inline void create_debug_files(struct imx21 *imx21) { } static inline void create_debug_files(struct imx21 *imx21) { }
......
...@@ -62,6 +62,10 @@ ...@@ -62,6 +62,10 @@
#include "imx21-hcd.h" #include "imx21-hcd.h"
#ifdef CONFIG_DYNAMIC_DEBUG
#define DEBUG
#endif
#ifdef DEBUG #ifdef DEBUG
#define DEBUG_LOG_FRAME(imx21, etd, event) \ #define DEBUG_LOG_FRAME(imx21, etd, event) \
(etd)->event##_frame = readl((imx21)->regs + USBH_FRMNUB) (etd)->event##_frame = readl((imx21)->regs + USBH_FRMNUB)
...@@ -1906,6 +1910,7 @@ static int imx21_probe(struct platform_device *pdev) ...@@ -1906,6 +1910,7 @@ static int imx21_probe(struct platform_device *pdev)
dev_err(imx21->dev, "usb_add_hcd() returned %d\n", ret); dev_err(imx21->dev, "usb_add_hcd() returned %d\n", ret);
goto failed_add_hcd; goto failed_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
...@@ -1926,7 +1931,7 @@ static int imx21_probe(struct platform_device *pdev) ...@@ -1926,7 +1931,7 @@ static int imx21_probe(struct platform_device *pdev)
static struct platform_driver imx21_hcd_driver = { static struct platform_driver imx21_hcd_driver = {
.driver = { .driver = {
.name = (char *)hcd_name, .name = hcd_name,
}, },
.probe = imx21_probe, .probe = imx21_probe,
.remove = imx21_remove, .remove = imx21_remove,
......
...@@ -24,6 +24,10 @@ ...@@ -24,6 +24,10 @@
#ifndef __LINUX_IMX21_HCD_H__ #ifndef __LINUX_IMX21_HCD_H__
#define __LINUX_IMX21_HCD_H__ #define __LINUX_IMX21_HCD_H__
#ifdef CONFIG_DYNAMIC_DEBUG
#define DEBUG
#endif
#include <linux/platform_data/usb-mx2.h> #include <linux/platform_data/usb-mx2.h>
#define NUM_ISO_ETDS 2 #define NUM_ISO_ETDS 2
......
...@@ -1645,6 +1645,8 @@ static int isp116x_probe(struct platform_device *pdev) ...@@ -1645,6 +1645,8 @@ static int isp116x_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err6; goto err6;
device_wakeup_enable(hcd->self.controller);
ret = create_debug_file(isp116x); ret = create_debug_file(isp116x);
if (ret) { if (ret) {
ERR("Couldn't create debugfs entry\n"); ERR("Couldn't create debugfs entry\n");
...@@ -1705,7 +1707,7 @@ static struct platform_driver isp116x_driver = { ...@@ -1705,7 +1707,7 @@ static struct platform_driver isp116x_driver = {
.suspend = isp116x_suspend, .suspend = isp116x_suspend,
.resume = isp116x_resume, .resume = isp116x_resume,
.driver = { .driver = {
.name = (char *)hcd_name, .name = hcd_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
}; };
......
...@@ -2746,6 +2746,8 @@ static int isp1362_probe(struct platform_device *pdev) ...@@ -2746,6 +2746,8 @@ static int isp1362_probe(struct platform_device *pdev)
retval = usb_add_hcd(hcd, irq, irq_flags | IRQF_SHARED); retval = usb_add_hcd(hcd, irq, irq_flags | IRQF_SHARED);
if (retval != 0) if (retval != 0)
goto err6; goto err6;
device_wakeup_enable(hcd->self.controller);
pr_info("%s, irq %d\n", hcd->product_desc, irq); pr_info("%s, irq %d\n", hcd->product_desc, irq);
create_debug_file(isp1362_hcd); create_debug_file(isp1362_hcd);
...@@ -2829,7 +2831,7 @@ static struct platform_driver isp1362_driver = { ...@@ -2829,7 +2831,7 @@ static struct platform_driver isp1362_driver = {
.suspend = isp1362_suspend, .suspend = isp1362_suspend,
.resume = isp1362_resume, .resume = isp1362_resume,
.driver = { .driver = {
.name = (char *)hcd_name, .name = hcd_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
}; };
......
...@@ -2250,6 +2250,7 @@ struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len, ...@@ -2250,6 +2250,7 @@ struct usb_hcd *isp1760_register(phys_addr_t res_start, resource_size_t res_len,
ret = usb_add_hcd(hcd, irq, irqflags); ret = usb_add_hcd(hcd, irq, irqflags);
if (ret) if (ret)
goto err_unmap; goto err_unmap;
device_wakeup_enable(hcd->self.controller);
return hcd; return hcd;
......
...@@ -200,8 +200,10 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, ...@@ -200,8 +200,10 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
at91_start_hc(pdev); at91_start_hc(pdev);
retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_SHARED); retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_SHARED);
if (retval == 0) if (retval == 0) {
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
}
/* Error handling */ /* Error handling */
at91_stop_hc(pdev); at91_stop_hc(pdev);
...@@ -635,10 +637,17 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) ...@@ -635,10 +637,17 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg)
{ {
struct usb_hcd *hcd = platform_get_drvdata(pdev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct ohci_hcd *ohci = hcd_to_ohci(hcd);
bool do_wakeup = device_may_wakeup(&pdev->dev);
int ret;
if (device_may_wakeup(&pdev->dev)) if (do_wakeup)
enable_irq_wake(hcd->irq); enable_irq_wake(hcd->irq);
ret = ohci_suspend(hcd, do_wakeup);
if (ret) {
disable_irq_wake(hcd->irq);
return ret;
}
/* /*
* The integrated transceivers seem unable to notice disconnect, * The integrated transceivers seem unable to notice disconnect,
* reconnect, or wakeup without the 48 MHz clock active. so for * reconnect, or wakeup without the 48 MHz clock active. so for
...@@ -657,7 +666,7 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg) ...@@ -657,7 +666,7 @@ ohci_hcd_at91_drv_suspend(struct platform_device *pdev, pm_message_t mesg)
at91_stop_clock(); at91_stop_clock();
} }
return 0; return ret;
} }
static int ohci_hcd_at91_drv_resume(struct platform_device *pdev) static int ohci_hcd_at91_drv_resume(struct platform_device *pdev)
......
...@@ -348,6 +348,8 @@ static int usb_hcd_da8xx_probe(const struct hc_driver *driver, ...@@ -348,6 +348,8 @@ static int usb_hcd_da8xx_probe(const struct hc_driver *driver,
if (error) if (error)
goto err4; goto err4;
device_wakeup_enable(hcd->self.controller);
if (hub->ocic_notify) { if (hub->ocic_notify) {
error = hub->ocic_notify(ohci_da8xx_ocic_handler); error = hub->ocic_notify(ohci_da8xx_ocic_handler);
if (!error) if (!error)
...@@ -406,19 +408,27 @@ static int ohci_hcd_da8xx_drv_remove(struct platform_device *dev) ...@@ -406,19 +408,27 @@ static int ohci_hcd_da8xx_drv_remove(struct platform_device *dev)
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int ohci_da8xx_suspend(struct platform_device *dev, pm_message_t message) static int ohci_da8xx_suspend(struct platform_device *pdev,
pm_message_t message)
{ {
struct usb_hcd *hcd = platform_get_drvdata(dev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct ohci_hcd *ohci = hcd_to_ohci(hcd);
bool do_wakeup = device_may_wakeup(&pdev->dev);
int ret;
if (time_before(jiffies, ohci->next_statechange)) if (time_before(jiffies, ohci->next_statechange))
msleep(5); msleep(5);
ohci->next_statechange = jiffies; ohci->next_statechange = jiffies;
ret = ohci_suspend(hcd, do_wakeup);
if (ret)
return ret;
ohci_da8xx_clock(0); ohci_da8xx_clock(0);
hcd->state = HC_STATE_SUSPENDED; hcd->state = HC_STATE_SUSPENDED;
dev->dev.power.power_state = PMSG_SUSPEND;
return 0; return ret;
} }
static int ohci_da8xx_resume(struct platform_device *dev) static int ohci_da8xx_resume(struct platform_device *dev)
......
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifdef DEBUG
#define edstring(ed_type) ({ char *temp; \ #define edstring(ed_type) ({ char *temp; \
switch (ed_type) { \ switch (ed_type) { \
case PIPE_CONTROL: temp = "ctrl"; break; \ case PIPE_CONTROL: temp = "ctrl"; break; \
...@@ -20,57 +18,6 @@ ...@@ -20,57 +18,6 @@
} temp;}) } temp;})
#define pipestring(pipe) edstring(usb_pipetype(pipe)) #define pipestring(pipe) edstring(usb_pipetype(pipe))
/* debug| print the main components of an URB
* small: 0) header + data packets 1) just header
*/
static void __maybe_unused
urb_print(struct urb * urb, char * str, int small, int status)
{
unsigned int pipe= urb->pipe;
if (!urb->dev || !urb->dev->bus) {
printk(KERN_DEBUG "%s URB: no dev\n", str);
return;
}
#ifndef OHCI_VERBOSE_DEBUG
if (status != 0)
#endif
printk(KERN_DEBUG "%s %p dev=%d ep=%d%s-%s flags=%x len=%d/%d stat=%d\n",
str,
urb,
usb_pipedevice (pipe),
usb_pipeendpoint (pipe),
usb_pipeout (pipe)? "out" : "in",
pipestring (pipe),
urb->transfer_flags,
urb->actual_length,
urb->transfer_buffer_length,
status);
#ifdef OHCI_VERBOSE_DEBUG
if (!small) {
int i, len;
if (usb_pipecontrol (pipe)) {
printk (KERN_DEBUG "%s: setup(8):", __FILE__);
for (i = 0; i < 8 ; i++)
printk (" %02x", ((__u8 *) urb->setup_packet) [i]);
printk ("\n");
}
if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {
printk (KERN_DEBUG "%s: data(%d/%d):", __FILE__,
urb->actual_length,
urb->transfer_buffer_length);
len = usb_pipeout (pipe)?
urb->transfer_buffer_length: urb->actual_length;
for (i = 0; i < 16 && i < len; i++)
printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);
printk ("%s stat:%d\n", i < len? "...": "", status);
}
}
#endif
}
#define ohci_dbg_sw(ohci, next, size, format, arg...) \ #define ohci_dbg_sw(ohci, next, size, format, arg...) \
do { \ do { \
...@@ -407,22 +354,8 @@ ohci_dump_ed (const struct ohci_hcd *ohci, const char *label, ...@@ -407,22 +354,8 @@ ohci_dump_ed (const struct ohci_hcd *ohci, const char *label,
} }
} }
#else
static inline void ohci_dump (struct ohci_hcd *controller, int verbose) {}
#undef OHCI_VERBOSE_DEBUG
#endif /* DEBUG */
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifdef STUB_DEBUG_FILES
static inline void create_debug_files (struct ohci_hcd *bus) { }
static inline void remove_debug_files (struct ohci_hcd *bus) { }
#else
static int debug_async_open(struct inode *, struct file *); static int debug_async_open(struct inode *, struct file *);
static int debug_periodic_open(struct inode *, struct file *); static int debug_periodic_open(struct inode *, struct file *);
static int debug_registers_open(struct inode *, struct file *); static int debug_registers_open(struct inode *, struct file *);
...@@ -871,7 +804,5 @@ static inline void remove_debug_files (struct ohci_hcd *ohci) ...@@ -871,7 +804,5 @@ static inline void remove_debug_files (struct ohci_hcd *ohci)
debugfs_remove(ohci->debug_dir); debugfs_remove(ohci->debug_dir);
} }
#endif
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -146,6 +146,7 @@ static int exynos_ohci_probe(struct platform_device *pdev) ...@@ -146,6 +146,7 @@ static int exynos_ohci_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add USB HCD\n"); dev_err(&pdev->dev, "Failed to add USB HCD\n");
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
fail_add_hcd: fail_add_hcd:
...@@ -191,23 +192,14 @@ static int exynos_ohci_suspend(struct device *dev) ...@@ -191,23 +192,14 @@ static int exynos_ohci_suspend(struct device *dev)
struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd); struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd);
struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct ohci_hcd *ohci = hcd_to_ohci(hcd);
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
bool do_wakeup = device_may_wakeup(dev);
unsigned long flags; unsigned long flags;
int rc = 0; int rc = ohci_suspend(hcd, do_wakeup);
/* if (rc)
* Root hub was already suspended. Disable irq emission and return rc;
* mark HW unaccessible, bail out if RH has been resumed. Use
* the spinlock to properly synchronize with possible pending
* RH suspend or resume activity.
*/
spin_lock_irqsave(&ohci->lock, flags);
if (ohci->rh_state != OHCI_RH_SUSPENDED &&
ohci->rh_state != OHCI_RH_HALTED) {
rc = -EINVAL;
goto fail;
}
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); spin_lock_irqsave(&ohci->lock, flags);
if (exynos_ohci->otg) if (exynos_ohci->otg)
exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self); exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self);
...@@ -216,10 +208,9 @@ static int exynos_ohci_suspend(struct device *dev) ...@@ -216,10 +208,9 @@ static int exynos_ohci_suspend(struct device *dev)
clk_disable_unprepare(exynos_ohci->clk); clk_disable_unprepare(exynos_ohci->clk);
fail:
spin_unlock_irqrestore(&ohci->lock, flags); spin_unlock_irqrestore(&ohci->lock, flags);
return rc; return 0;
} }
static int exynos_ohci_resume(struct device *dev) static int exynos_ohci_resume(struct device *dev)
......
...@@ -51,8 +51,6 @@ ...@@ -51,8 +51,6 @@
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#undef OHCI_VERBOSE_DEBUG /* not always helpful */
/* For initializing controller (mask in an HCFS mode too) */ /* For initializing controller (mask in an HCFS mode too) */
#define OHCI_CONTROL_INIT OHCI_CTRL_CBSR #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
#define OHCI_INTR_INIT \ #define OHCI_INTR_INIT \
...@@ -127,10 +125,6 @@ static int ohci_urb_enqueue ( ...@@ -127,10 +125,6 @@ static int ohci_urb_enqueue (
unsigned long flags; unsigned long flags;
int retval = 0; int retval = 0;
#ifdef OHCI_VERBOSE_DEBUG
urb_print(urb, "SUB", usb_pipein(pipe), -EINPROGRESS);
#endif
/* every endpoint has a ed, locate and maybe (re)initialize it */ /* every endpoint has a ed, locate and maybe (re)initialize it */
if (! (ed = ed_get (ohci, urb->ep, urb->dev, pipe, urb->interval))) if (! (ed = ed_get (ohci, urb->ep, urb->dev, pipe, urb->interval)))
return -ENOMEM; return -ENOMEM;
...@@ -284,10 +278,6 @@ static int ohci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) ...@@ -284,10 +278,6 @@ static int ohci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
unsigned long flags; unsigned long flags;
int rc; int rc;
#ifdef OHCI_VERBOSE_DEBUG
urb_print(urb, "UNLINK", 1, status);
#endif
spin_lock_irqsave (&ohci->lock, flags); spin_lock_irqsave (&ohci->lock, flags);
rc = usb_hcd_check_unlink_urb(hcd, urb, status); rc = usb_hcd_check_unlink_urb(hcd, urb, status);
if (rc) { if (rc) {
...@@ -840,7 +830,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) ...@@ -840,7 +830,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd)
} }
if (ints & OHCI_INTR_RHSC) { if (ints & OHCI_INTR_RHSC) {
ohci_vdbg(ohci, "rhsc\n"); ohci_dbg(ohci, "rhsc\n");
ohci->next_statechange = jiffies + STATECHANGE_DELAY; ohci->next_statechange = jiffies + STATECHANGE_DELAY;
ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC,
&regs->intrstatus); &regs->intrstatus);
...@@ -862,7 +852,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) ...@@ -862,7 +852,7 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd)
* this might not happen. * this might not happen.
*/ */
else if (ints & OHCI_INTR_RD) { else if (ints & OHCI_INTR_RD) {
ohci_vdbg(ohci, "resume detect\n"); ohci_dbg(ohci, "resume detect\n");
ohci_writel(ohci, OHCI_INTR_RD, &regs->intrstatus); ohci_writel(ohci, OHCI_INTR_RD, &regs->intrstatus);
set_bit(HCD_FLAG_POLL_RH, &hcd->flags); set_bit(HCD_FLAG_POLL_RH, &hcd->flags);
if (ohci->autostop) { if (ohci->autostop) {
...@@ -1036,6 +1026,7 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup) ...@@ -1036,6 +1026,7 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
{ {
struct ohci_hcd *ohci = hcd_to_ohci (hcd); struct ohci_hcd *ohci = hcd_to_ohci (hcd);
unsigned long flags; unsigned long flags;
int rc = 0;
/* Disable irq emission and mark HW unaccessible. Use /* Disable irq emission and mark HW unaccessible. Use
* the spinlock to properly synchronize with possible pending * the spinlock to properly synchronize with possible pending
...@@ -1048,7 +1039,13 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup) ...@@ -1048,7 +1039,13 @@ int ohci_suspend(struct usb_hcd *hcd, bool do_wakeup)
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
spin_unlock_irqrestore (&ohci->lock, flags); spin_unlock_irqrestore (&ohci->lock, flags);
return 0; synchronize_irq(hcd->irq);
if (do_wakeup && HCD_WAKEUP_PENDING(hcd)) {
ohci_resume(hcd, false);
rc = -EBUSY;
}
return rc;
} }
EXPORT_SYMBOL_GPL(ohci_suspend); EXPORT_SYMBOL_GPL(ohci_suspend);
...@@ -1233,13 +1230,11 @@ static int __init ohci_hcd_mod_init(void) ...@@ -1233,13 +1230,11 @@ static int __init ohci_hcd_mod_init(void)
sizeof (struct ed), sizeof (struct td)); sizeof (struct ed), sizeof (struct td));
set_bit(USB_OHCI_LOADED, &usb_hcds_loaded); set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
#ifdef DEBUG
ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root); ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root);
if (!ohci_debug_root) { if (!ohci_debug_root) {
retval = -ENOENT; retval = -ENOENT;
goto error_debug; goto error_debug;
} }
#endif
#ifdef PS3_SYSTEM_BUS_DRIVER #ifdef PS3_SYSTEM_BUS_DRIVER
retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER); retval = ps3_ohci_driver_register(&PS3_SYSTEM_BUS_DRIVER);
...@@ -1314,11 +1309,9 @@ static int __init ohci_hcd_mod_init(void) ...@@ -1314,11 +1309,9 @@ static int __init ohci_hcd_mod_init(void)
ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
error_ps3: error_ps3:
#endif #endif
#ifdef DEBUG
debugfs_remove(ohci_debug_root); debugfs_remove(ohci_debug_root);
ohci_debug_root = NULL; ohci_debug_root = NULL;
error_debug: error_debug:
#endif
clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
return retval; return retval;
...@@ -1348,9 +1341,7 @@ static void __exit ohci_hcd_mod_exit(void) ...@@ -1348,9 +1341,7 @@ static void __exit ohci_hcd_mod_exit(void)
#ifdef PS3_SYSTEM_BUS_DRIVER #ifdef PS3_SYSTEM_BUS_DRIVER
ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER); ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
#endif #endif
#ifdef DEBUG
debugfs_remove(ohci_debug_root); debugfs_remove(ohci_debug_root);
#endif
clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
} }
module_exit(ohci_hcd_mod_exit); module_exit(ohci_hcd_mod_exit);
......
...@@ -725,10 +725,8 @@ static int ohci_hub_control ( ...@@ -725,10 +725,8 @@ static int ohci_hub_control (
temp = roothub_portstatus (ohci, wIndex); temp = roothub_portstatus (ohci, wIndex);
put_unaligned_le32(temp, buf); put_unaligned_le32(temp, buf);
#ifndef OHCI_VERBOSE_DEBUG if (*(u16*)(buf+2)) /* only if wPortChange is interesting */
if (*(u16*)(buf+2)) /* only if wPortChange is interesting */ dbg_port(ohci, "GetStatus", wIndex, temp);
#endif
dbg_port (ohci, "GetStatus", wIndex, temp);
break; break;
case SetHubFeature: case SetHubFeature:
switch (wValue) { switch (wValue) {
......
...@@ -217,6 +217,7 @@ static int jz4740_ohci_probe(struct platform_device *pdev) ...@@ -217,6 +217,7 @@ static int jz4740_ohci_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add hcd: %d\n", ret); dev_err(&pdev->dev, "Failed to add hcd: %d\n", ret);
goto err_disable; goto err_disable;
} }
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
......
...@@ -274,8 +274,10 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev) ...@@ -274,8 +274,10 @@ static int ohci_hcd_nxp_probe(struct platform_device *pdev)
dev_info(&pdev->dev, "at 0x%p, irq %d\n", hcd->regs, hcd->irq); dev_info(&pdev->dev, "at 0x%p, irq %d\n", hcd->regs, hcd->irq);
ret = usb_add_hcd(hcd, irq, 0); ret = usb_add_hcd(hcd, irq, 0);
if (ret == 0) if (ret == 0) {
device_wakeup_enable(hcd->self.controller);
return ret; return ret;
}
ohci_nxp_stop_hc(); ohci_nxp_stop_hc();
fail_resource: fail_resource:
......
...@@ -171,6 +171,8 @@ static int ohci_octeon_drv_probe(struct platform_device *pdev) ...@@ -171,6 +171,8 @@ static int ohci_octeon_drv_probe(struct platform_device *pdev)
goto err3; goto err3;
} }
device_wakeup_enable(hcd->self.controller);
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
return 0; return 0;
......
...@@ -367,6 +367,7 @@ static int usb_hcd_omap_probe (const struct hc_driver *driver, ...@@ -367,6 +367,7 @@ static int usb_hcd_omap_probe (const struct hc_driver *driver,
if (retval) if (retval)
goto err3; goto err3;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err3: err3:
iounmap(hcd->regs); iounmap(hcd->regs);
......
...@@ -130,6 +130,7 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev) ...@@ -130,6 +130,7 @@ static int ohci_hcd_omap3_probe(struct platform_device *pdev)
dev_dbg(dev, "failed to add hcd with err %d\n", ret); dev_dbg(dev, "failed to add hcd with err %d\n", ret);
goto err_add_hcd; goto err_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
......
...@@ -108,6 +108,8 @@ static int ohci_platform_probe(struct platform_device *dev) ...@@ -108,6 +108,8 @@ static int ohci_platform_probe(struct platform_device *dev)
if (err) if (err)
goto err_put_hcd; goto err_put_hcd;
device_wakeup_enable(hcd->self.controller);
platform_set_drvdata(dev, hcd); platform_set_drvdata(dev, hcd);
return err; return err;
......
...@@ -147,8 +147,10 @@ static int ohci_hcd_ppc_of_probe(struct platform_device *op) ...@@ -147,8 +147,10 @@ static int ohci_hcd_ppc_of_probe(struct platform_device *op)
ohci_hcd_init(ohci); ohci_hcd_init(ohci);
rv = usb_add_hcd(hcd, irq, 0); rv = usb_add_hcd(hcd, irq, 0);
if (rv == 0) if (rv == 0) {
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
}
/* by now, 440epx is known to show usb_23 erratum */ /* by now, 440epx is known to show usb_23 erratum */
np = of_find_compatible_node(NULL, NULL, "ibm,usb-ehci-440epx"); np = of_find_compatible_node(NULL, NULL, "ibm,usb-ehci-440epx");
......
...@@ -173,6 +173,7 @@ static int ps3_ohci_probe(struct ps3_system_bus_device *dev) ...@@ -173,6 +173,7 @@ static int ps3_ohci_probe(struct ps3_system_bus_device *dev)
goto fail_add_hcd; goto fail_add_hcd;
} }
device_wakeup_enable(hcd->self.controller);
return result; return result;
fail_add_hcd: fail_add_hcd:
......
...@@ -443,8 +443,10 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device ...@@ -443,8 +443,10 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device
ohci->num_ports = 3; ohci->num_ports = 3;
retval = usb_add_hcd(hcd, irq, 0); retval = usb_add_hcd(hcd, irq, 0);
if (retval == 0) if (retval == 0) {
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
}
pxa27x_stop_hc(pxa_ohci, &pdev->dev); pxa27x_stop_hc(pxa_ohci, &pdev->dev);
err3: err3:
......
...@@ -68,10 +68,6 @@ __acquires(ohci->lock) ...@@ -68,10 +68,6 @@ __acquires(ohci->lock)
break; break;
} }
#ifdef OHCI_VERBOSE_DEBUG
urb_print(urb, "RET", usb_pipeout (urb->pipe), status);
#endif
/* urb->complete() can reenter this HCD */ /* urb->complete() can reenter this HCD */
usb_hcd_unlink_urb_from_ep(ohci_to_hcd(ohci), urb); usb_hcd_unlink_urb_from_ep(ohci_to_hcd(ohci), urb);
spin_unlock (&ohci->lock); spin_unlock (&ohci->lock);
...@@ -147,7 +143,7 @@ static void periodic_link (struct ohci_hcd *ohci, struct ed *ed) ...@@ -147,7 +143,7 @@ static void periodic_link (struct ohci_hcd *ohci, struct ed *ed)
{ {
unsigned i; unsigned i;
ohci_vdbg (ohci, "link %sed %p branch %d [%dus.], interval %d\n", ohci_dbg(ohci, "link %sed %p branch %d [%dus.], interval %d\n",
(ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "",
ed, ed->branch, ed->load, ed->interval); ed, ed->branch, ed->load, ed->interval);
...@@ -294,7 +290,7 @@ static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed) ...@@ -294,7 +290,7 @@ static void periodic_unlink (struct ohci_hcd *ohci, struct ed *ed)
} }
ohci_to_hcd(ohci)->self.bandwidth_allocated -= ed->load / ed->interval; ohci_to_hcd(ohci)->self.bandwidth_allocated -= ed->load / ed->interval;
ohci_vdbg (ohci, "unlink %sed %p branch %d [%dus.], interval %d\n", ohci_dbg(ohci, "unlink %sed %p branch %d [%dus.], interval %d\n",
(ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "", (ed->hwINFO & cpu_to_hc32 (ohci, ED_ISO)) ? "iso " : "",
ed, ed->branch, ed->load, ed->interval); ed, ed->branch, ed->load, ed->interval);
} }
...@@ -765,7 +761,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td) ...@@ -765,7 +761,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td)
urb->iso_frame_desc [td->index].status = cc_to_error [cc]; urb->iso_frame_desc [td->index].status = cc_to_error [cc];
if (cc != TD_CC_NOERROR) if (cc != TD_CC_NOERROR)
ohci_vdbg (ohci, ohci_dbg(ohci,
"urb %p iso td %p (%d) len %d cc %d\n", "urb %p iso td %p (%d) len %d cc %d\n",
urb, td, 1 + td->index, dlen, cc); urb, td, 1 + td->index, dlen, cc);
...@@ -797,7 +793,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td) ...@@ -797,7 +793,7 @@ static int td_done(struct ohci_hcd *ohci, struct urb *urb, struct td *td)
} }
if (cc != TD_CC_NOERROR && cc < 0x0E) if (cc != TD_CC_NOERROR && cc < 0x0E)
ohci_vdbg (ohci, ohci_dbg(ohci,
"urb %p td %p (%d) cc %d, len=%d/%d\n", "urb %p td %p (%d) cc %d, len=%d/%d\n",
urb, td, 1 + td->index, cc, urb, td, 1 + td->index, cc,
urb->actual_length, urb->actual_length,
......
...@@ -395,6 +395,7 @@ static int usb_hcd_s3c2410_probe(const struct hc_driver *driver, ...@@ -395,6 +395,7 @@ static int usb_hcd_s3c2410_probe(const struct hc_driver *driver,
if (retval != 0) if (retval != 0)
goto err_ioremap; goto err_ioremap;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_ioremap: err_ioremap:
...@@ -426,28 +427,15 @@ static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev) ...@@ -426,28 +427,15 @@ static int ohci_hcd_s3c2410_drv_remove(struct platform_device *pdev)
static int ohci_hcd_s3c2410_drv_suspend(struct device *dev) static int ohci_hcd_s3c2410_drv_suspend(struct device *dev)
{ {
struct usb_hcd *hcd = dev_get_drvdata(dev); struct usb_hcd *hcd = dev_get_drvdata(dev);
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
unsigned long flags; bool do_wakeup = device_may_wakeup(dev);
int rc = 0; int rc = 0;
/* rc = ohci_suspend(hcd, do_wakeup);
* Root hub was already suspended. Disable irq emission and if (rc)
* mark HW unaccessible, bail out if RH has been resumed. Use return rc;
* the spinlock to properly synchronize with possible pending
* RH suspend or resume activity.
*/
spin_lock_irqsave(&ohci->lock, flags);
if (ohci->rh_state != OHCI_RH_SUSPENDED) {
rc = -EINVAL;
goto bail;
}
clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
s3c2410_stop_hc(pdev); s3c2410_stop_hc(pdev);
bail:
spin_unlock_irqrestore(&ohci->lock, flags);
return rc; return rc;
} }
......
...@@ -211,8 +211,10 @@ static int ohci_hcd_sa1111_probe(struct sa1111_dev *dev) ...@@ -211,8 +211,10 @@ static int ohci_hcd_sa1111_probe(struct sa1111_dev *dev)
goto err2; goto err2;
ret = usb_add_hcd(hcd, dev->irq[1], 0); ret = usb_add_hcd(hcd, dev->irq[1], 0);
if (ret == 0) if (ret == 0) {
device_wakeup_enable(hcd->self.controller);
return ret; return ret;
}
sa1111_stop_hc(dev); sa1111_stop_hc(dev);
err2: err2:
......
...@@ -168,6 +168,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev) ...@@ -168,6 +168,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev)
retval = usb_add_hcd(hcd, irq, IRQF_SHARED); retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (retval) if (retval)
goto err5; goto err5;
device_wakeup_enable(hcd->self.controller);
/* enable power and unmask interrupts */ /* enable power and unmask interrupts */
......
...@@ -103,8 +103,10 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev) ...@@ -103,8 +103,10 @@ static int spear_ohci_hcd_drv_probe(struct platform_device *pdev)
ohci = hcd_to_ohci(hcd); ohci = hcd_to_ohci(hcd);
retval = usb_add_hcd(hcd, platform_get_irq(pdev, 0), 0); retval = usb_add_hcd(hcd, platform_get_irq(pdev, 0), 0);
if (retval == 0) if (retval == 0) {
device_wakeup_enable(hcd->self.controller);
return retval; return retval;
}
clk_disable_unprepare(sohci_p->clk); clk_disable_unprepare(sohci_p->clk);
err_put_hcd: err_put_hcd:
...@@ -129,20 +131,26 @@ static int spear_ohci_hcd_drv_remove(struct platform_device *pdev) ...@@ -129,20 +131,26 @@ static int spear_ohci_hcd_drv_remove(struct platform_device *pdev)
} }
#if defined(CONFIG_PM) #if defined(CONFIG_PM)
static int spear_ohci_hcd_drv_suspend(struct platform_device *dev, static int spear_ohci_hcd_drv_suspend(struct platform_device *pdev,
pm_message_t message) pm_message_t message)
{ {
struct usb_hcd *hcd = platform_get_drvdata(dev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_hcd *ohci = hcd_to_ohci(hcd); struct ohci_hcd *ohci = hcd_to_ohci(hcd);
struct spear_ohci *sohci_p = to_spear_ohci(hcd); struct spear_ohci *sohci_p = to_spear_ohci(hcd);
bool do_wakeup = device_may_wakeup(&pdev->dev);
int ret;
if (time_before(jiffies, ohci->next_statechange)) if (time_before(jiffies, ohci->next_statechange))
msleep(5); msleep(5);
ohci->next_statechange = jiffies; ohci->next_statechange = jiffies;
ret = ohci_suspend(hcd, do_wakeup);
if (ret)
return ret;
clk_disable_unprepare(sohci_p->clk); clk_disable_unprepare(sohci_p->clk);
return 0; return ret;
} }
static int spear_ohci_hcd_drv_resume(struct platform_device *dev) static int spear_ohci_hcd_drv_resume(struct platform_device *dev)
......
...@@ -159,6 +159,7 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev) ...@@ -159,6 +159,7 @@ static int ohci_hcd_tilegx_drv_probe(struct platform_device *pdev)
ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED); ret = usb_add_hcd(hcd, pdata->irq, IRQF_SHARED);
if (ret == 0) { if (ret == 0) {
platform_set_drvdata(pdev, hcd); platform_set_drvdata(pdev, hcd);
device_wakeup_enable(hcd->self.controller);
return ret; return ret;
} }
......
...@@ -250,6 +250,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev) ...@@ -250,6 +250,7 @@ static int ohci_hcd_tmio_drv_probe(struct platform_device *dev)
if (ret) if (ret)
goto err_add_hcd; goto err_add_hcd;
device_wakeup_enable(hcd->self.controller);
if (ret == 0) if (ret == 0)
return ret; return ret;
......
...@@ -415,12 +415,11 @@ struct ohci_hcd { ...@@ -415,12 +415,11 @@ struct ohci_hcd {
struct ed *ed_to_check; struct ed *ed_to_check;
unsigned zf_delay; unsigned zf_delay;
#ifdef DEBUG
struct dentry *debug_dir; struct dentry *debug_dir;
struct dentry *debug_async; struct dentry *debug_async;
struct dentry *debug_periodic; struct dentry *debug_periodic;
struct dentry *debug_registers; struct dentry *debug_registers;
#endif
/* platform-specific data -- must come last */ /* platform-specific data -- must come last */
unsigned long priv[0] __aligned(sizeof(s64)); unsigned long priv[0] __aligned(sizeof(s64));
...@@ -474,10 +473,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci) ...@@ -474,10 +473,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
#ifndef DEBUG
#define STUB_DEBUG_FILES
#endif /* DEBUG */
#define ohci_dbg(ohci, fmt, args...) \ #define ohci_dbg(ohci, fmt, args...) \
dev_dbg (ohci_to_hcd(ohci)->self.controller , fmt , ## args ) dev_dbg (ohci_to_hcd(ohci)->self.controller , fmt , ## args )
#define ohci_err(ohci, fmt, args...) \ #define ohci_err(ohci, fmt, args...) \
...@@ -487,12 +482,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci) ...@@ -487,12 +482,6 @@ static inline struct usb_hcd *ohci_to_hcd (const struct ohci_hcd *ohci)
#define ohci_warn(ohci, fmt, args...) \ #define ohci_warn(ohci, fmt, args...) \
dev_warn (ohci_to_hcd(ohci)->self.controller , fmt , ## args ) dev_warn (ohci_to_hcd(ohci)->self.controller , fmt , ## args )
#ifdef OHCI_VERBOSE_DEBUG
# define ohci_vdbg ohci_dbg
#else
# define ohci_vdbg(ohci, fmt, args...) do { } while (0)
#endif
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* /*
......
...@@ -60,6 +60,10 @@ ...@@ -60,6 +60,10 @@
#define oxu_info(oxu, fmt, args...) \ #define oxu_info(oxu, fmt, args...) \
dev_info(oxu_to_hcd(oxu)->self.controller , fmt , ## args) dev_info(oxu_to_hcd(oxu)->self.controller , fmt , ## args)
#ifdef CONFIG_DYNAMIC_DEBUG
#define DEBUG
#endif
static inline struct usb_hcd *oxu_to_hcd(struct oxu_hcd *oxu) static inline struct usb_hcd *oxu_to_hcd(struct oxu_hcd *oxu)
{ {
return container_of((void *) oxu, struct usb_hcd, hcd_priv); return container_of((void *) oxu, struct usb_hcd, hcd_priv);
...@@ -3747,6 +3751,7 @@ static struct usb_hcd *oxu_create(struct platform_device *pdev, ...@@ -3747,6 +3751,7 @@ static struct usb_hcd *oxu_create(struct platform_device *pdev,
if (ret < 0) if (ret < 0)
return ERR_PTR(ret); return ERR_PTR(ret);
device_wakeup_enable(hcd->self.controller);
return hcd; return hcd;
} }
......
...@@ -2514,6 +2514,7 @@ static int r8a66597_probe(struct platform_device *pdev) ...@@ -2514,6 +2514,7 @@ static int r8a66597_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "Failed to add hcd\n"); dev_err(&pdev->dev, "Failed to add hcd\n");
goto clean_up3; goto clean_up3;
} }
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
...@@ -2534,7 +2535,7 @@ static struct platform_driver r8a66597_driver = { ...@@ -2534,7 +2535,7 @@ static struct platform_driver r8a66597_driver = {
.probe = r8a66597_probe, .probe = r8a66597_probe,
.remove = r8a66597_remove, .remove = r8a66597_remove,
.driver = { .driver = {
.name = (char *) hcd_name, .name = hcd_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = R8A66597_DEV_PM_OPS, .pm = R8A66597_DEV_PM_OPS,
}, },
......
...@@ -1732,6 +1732,8 @@ sl811h_probe(struct platform_device *dev) ...@@ -1732,6 +1732,8 @@ sl811h_probe(struct platform_device *dev)
if (retval != 0) if (retval != 0)
goto err6; goto err6;
device_wakeup_enable(hcd->self.controller);
create_debug_file(sl811); create_debug_file(sl811);
return retval; return retval;
......
...@@ -3133,6 +3133,7 @@ static int u132_probe(struct platform_device *pdev) ...@@ -3133,6 +3133,7 @@ static int u132_probe(struct platform_device *pdev)
u132_u132_put_kref(u132); u132_u132_put_kref(u132);
return retval; return retval;
} else { } else {
device_wakeup_enable(hcd->self.controller);
u132_monitor_queue_work(u132, 100); u132_monitor_queue_work(u132, 100);
return 0; return 0;
} }
...@@ -3217,7 +3218,7 @@ static struct platform_driver u132_platform_driver = { ...@@ -3217,7 +3218,7 @@ static struct platform_driver u132_platform_driver = {
.suspend = u132_suspend, .suspend = u132_suspend,
.resume = u132_resume, .resume = u132_resume,
.driver = { .driver = {
.name = (char *)hcd_name, .name = hcd_name,
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
}; };
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
static struct dentry *uhci_debugfs_root; static struct dentry *uhci_debugfs_root;
#ifdef DEBUG #ifdef CONFIG_DYNAMIC_DEBUG
/* Handle REALLY large printks so we don't overflow buffers */ /* Handle REALLY large printks so we don't overflow buffers */
static void lprintk(char *buf) static void lprintk(char *buf)
...@@ -635,7 +635,7 @@ static const struct file_operations uhci_debug_operations = { ...@@ -635,7 +635,7 @@ static const struct file_operations uhci_debug_operations = {
#endif /* CONFIG_DEBUG_FS */ #endif /* CONFIG_DEBUG_FS */
#else /* DEBUG */ #else /* CONFIG_DYNAMIC_DEBUG*/
static inline void lprintk(char *buf) static inline void lprintk(char *buf)
{} {}
......
...@@ -141,6 +141,7 @@ static int uhci_hcd_grlib_probe(struct platform_device *op) ...@@ -141,6 +141,7 @@ static int uhci_hcd_grlib_probe(struct platform_device *op)
if (rv) if (rv)
goto err_uhci; goto err_uhci;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_uhci: err_uhci:
......
...@@ -69,18 +69,21 @@ MODULE_PARM_DESC(ignore_oc, "ignore hardware overcurrent indications"); ...@@ -69,18 +69,21 @@ MODULE_PARM_DESC(ignore_oc, "ignore hardware overcurrent indications");
* show all queues in /sys/kernel/debug/uhci/[pci_addr] * show all queues in /sys/kernel/debug/uhci/[pci_addr]
* debug = 3, show all TDs in URBs when dumping * debug = 3, show all TDs in URBs when dumping
*/ */
#ifdef DEBUG #ifdef CONFIG_DYNAMIC_DEBUG
#define DEBUG_CONFIGURED 1
static int debug = 1; static int debug = 1;
module_param(debug, int, S_IRUGO | S_IWUSR); module_param(debug, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug, "Debug level"); MODULE_PARM_DESC(debug, "Debug level");
static char *errbuf;
#else #else
#define DEBUG_CONFIGURED 0
#define debug 0 #define debug 0
#define errbuf NULL
#endif #endif
static char *errbuf;
#define ERRBUF_LEN (32 * 1024) #define ERRBUF_LEN (32 * 1024)
static struct kmem_cache *uhci_up_cachep; /* urb_priv */ static struct kmem_cache *uhci_up_cachep; /* urb_priv */
...@@ -516,13 +519,12 @@ static void release_uhci(struct uhci_hcd *uhci) ...@@ -516,13 +519,12 @@ static void release_uhci(struct uhci_hcd *uhci)
{ {
int i; int i;
if (DEBUG_CONFIGURED) {
spin_lock_irq(&uhci->lock);
uhci->is_initialized = 0;
spin_unlock_irq(&uhci->lock);
debugfs_remove(uhci->dentry); spin_lock_irq(&uhci->lock);
} uhci->is_initialized = 0;
spin_unlock_irq(&uhci->lock);
debugfs_remove(uhci->dentry);
for (i = 0; i < UHCI_NUM_SKELQH; i++) for (i = 0; i < UHCI_NUM_SKELQH; i++)
uhci_free_qh(uhci, uhci->skelqh[i]); uhci_free_qh(uhci, uhci->skelqh[i]);
...@@ -868,14 +870,14 @@ static int __init uhci_hcd_init(void) ...@@ -868,14 +870,14 @@ static int __init uhci_hcd_init(void)
ignore_oc ? ", overcurrent ignored" : ""); ignore_oc ? ", overcurrent ignored" : "");
set_bit(USB_UHCI_LOADED, &usb_hcds_loaded); set_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
if (DEBUG_CONFIGURED) { #ifdef CONFIG_DYNAMIC_DEBUG
errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL); errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);
if (!errbuf) if (!errbuf)
goto errbuf_failed; goto errbuf_failed;
uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root); uhci_debugfs_root = debugfs_create_dir("uhci", usb_debug_root);
if (!uhci_debugfs_root) if (!uhci_debugfs_root)
goto debug_failed; goto debug_failed;
} #endif
uhci_up_cachep = kmem_cache_create("uhci_urb_priv", uhci_up_cachep = kmem_cache_create("uhci_urb_priv",
sizeof(struct urb_priv), 0, 0, NULL); sizeof(struct urb_priv), 0, 0, NULL);
...@@ -906,12 +908,14 @@ static int __init uhci_hcd_init(void) ...@@ -906,12 +908,14 @@ static int __init uhci_hcd_init(void)
kmem_cache_destroy(uhci_up_cachep); kmem_cache_destroy(uhci_up_cachep);
up_failed: up_failed:
#if defined(DEBUG) || defined(CONFIG_DYNAMIC_DEBUG)
debugfs_remove(uhci_debugfs_root); debugfs_remove(uhci_debugfs_root);
debug_failed: debug_failed:
kfree(errbuf); kfree(errbuf);
errbuf_failed: errbuf_failed:
#endif
clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
return retval; return retval;
...@@ -927,7 +931,9 @@ static void __exit uhci_hcd_cleanup(void) ...@@ -927,7 +931,9 @@ static void __exit uhci_hcd_cleanup(void)
#endif #endif
kmem_cache_destroy(uhci_up_cachep); kmem_cache_destroy(uhci_up_cachep);
debugfs_remove(uhci_debugfs_root); debugfs_remove(uhci_debugfs_root);
#ifdef CONFIG_DYNAMIC_DEBUG
kfree(errbuf); kfree(errbuf);
#endif
clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded); clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
} }
......
...@@ -279,7 +279,7 @@ static const struct hc_driver uhci_driver = { ...@@ -279,7 +279,7 @@ static const struct hc_driver uhci_driver = {
.hub_control = uhci_hub_control, .hub_control = uhci_hub_control,
}; };
static DEFINE_PCI_DEVICE_TABLE(uhci_pci_ids) = { { static const struct pci_device_id uhci_pci_ids[] = { {
/* handle any USB UHCI controller */ /* handle any USB UHCI controller */
PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0), PCI_DEVICE_CLASS(PCI_CLASS_SERIAL_USB_UHCI, ~0),
.driver_data = (unsigned long) &uhci_driver, .driver_data = (unsigned long) &uhci_driver,
......
...@@ -108,6 +108,7 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev) ...@@ -108,6 +108,7 @@ static int uhci_hcd_platform_probe(struct platform_device *pdev)
if (ret) if (ret)
goto err_uhci; goto err_uhci;
device_wakeup_enable(hcd->self.controller);
return 0; return 0;
err_uhci: err_uhci:
......
...@@ -293,6 +293,7 @@ static int whc_probe(struct umc_dev *umc) ...@@ -293,6 +293,7 @@ static int whc_probe(struct umc_dev *umc)
dev_err(dev, "cannot add HCD: %d\n", ret); dev_err(dev, "cannot add HCD: %d\n", ret);
goto error_usb_add_hcd; goto error_usb_add_hcd;
} }
device_wakeup_enable(usb_hcd->self.controller);
ret = wusbhc_b_create(wusbhc); ret = wusbhc_b_create(wusbhc);
if (ret) { if (ret) {
......
...@@ -32,7 +32,7 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) ...@@ -32,7 +32,7 @@ void xhci_dbg_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, "// xHCI capability registers at %p:\n", xhci_dbg(xhci, "// xHCI capability registers at %p:\n",
xhci->cap_regs); xhci->cap_regs);
temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); temp = readl(&xhci->cap_regs->hc_capbase);
xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n", xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n",
&xhci->cap_regs->hc_capbase, temp); &xhci->cap_regs->hc_capbase, temp);
xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n", xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n",
...@@ -44,13 +44,13 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) ...@@ -44,13 +44,13 @@ void xhci_dbg_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs); xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs);
temp = xhci_readl(xhci, &xhci->cap_regs->run_regs_off); temp = readl(&xhci->cap_regs->run_regs_off);
xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n", xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n",
&xhci->cap_regs->run_regs_off, &xhci->cap_regs->run_regs_off,
(unsigned int) temp & RTSOFF_MASK); (unsigned int) temp & RTSOFF_MASK);
xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs); xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs);
temp = xhci_readl(xhci, &xhci->cap_regs->db_off); temp = readl(&xhci->cap_regs->db_off);
xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp);
xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba); xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba);
} }
...@@ -61,7 +61,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) ...@@ -61,7 +61,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs); xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs);
temp = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); temp = readl(&xhci->cap_regs->hc_capbase);
xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n", xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n",
(unsigned int) temp); (unsigned int) temp);
xhci_dbg(xhci, "CAPLENGTH: 0x%x\n", xhci_dbg(xhci, "CAPLENGTH: 0x%x\n",
...@@ -69,7 +69,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) ...@@ -69,7 +69,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, "HCIVERSION: 0x%x\n", xhci_dbg(xhci, "HCIVERSION: 0x%x\n",
(unsigned int) HC_VERSION(temp)); (unsigned int) HC_VERSION(temp));
temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params1); temp = readl(&xhci->cap_regs->hcs_params1);
xhci_dbg(xhci, "HCSPARAMS 1: 0x%x\n", xhci_dbg(xhci, "HCSPARAMS 1: 0x%x\n",
(unsigned int) temp); (unsigned int) temp);
xhci_dbg(xhci, " Max device slots: %u\n", xhci_dbg(xhci, " Max device slots: %u\n",
...@@ -79,7 +79,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) ...@@ -79,7 +79,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, " Max ports: %u\n", xhci_dbg(xhci, " Max ports: %u\n",
(unsigned int) HCS_MAX_PORTS(temp)); (unsigned int) HCS_MAX_PORTS(temp));
temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params2); temp = readl(&xhci->cap_regs->hcs_params2);
xhci_dbg(xhci, "HCSPARAMS 2: 0x%x\n", xhci_dbg(xhci, "HCSPARAMS 2: 0x%x\n",
(unsigned int) temp); (unsigned int) temp);
xhci_dbg(xhci, " Isoc scheduling threshold: %u\n", xhci_dbg(xhci, " Isoc scheduling threshold: %u\n",
...@@ -87,7 +87,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) ...@@ -87,7 +87,7 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, " Maximum allowed segments in event ring: %u\n", xhci_dbg(xhci, " Maximum allowed segments in event ring: %u\n",
(unsigned int) HCS_ERST_MAX(temp)); (unsigned int) HCS_ERST_MAX(temp));
temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); temp = readl(&xhci->cap_regs->hcs_params3);
xhci_dbg(xhci, "HCSPARAMS 3 0x%x:\n", xhci_dbg(xhci, "HCSPARAMS 3 0x%x:\n",
(unsigned int) temp); (unsigned int) temp);
xhci_dbg(xhci, " Worst case U1 device exit latency: %u\n", xhci_dbg(xhci, " Worst case U1 device exit latency: %u\n",
...@@ -95,14 +95,14 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci) ...@@ -95,14 +95,14 @@ static void xhci_print_cap_regs(struct xhci_hcd *xhci)
xhci_dbg(xhci, " Worst case U2 device exit latency: %u\n", xhci_dbg(xhci, " Worst case U2 device exit latency: %u\n",
(unsigned int) HCS_U2_LATENCY(temp)); (unsigned int) HCS_U2_LATENCY(temp));
temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params); temp = readl(&xhci->cap_regs->hcc_params);
xhci_dbg(xhci, "HCC PARAMS 0x%x:\n", (unsigned int) temp); xhci_dbg(xhci, "HCC PARAMS 0x%x:\n", (unsigned int) temp);
xhci_dbg(xhci, " HC generates %s bit addresses\n", xhci_dbg(xhci, " HC generates %s bit addresses\n",
HCC_64BIT_ADDR(temp) ? "64" : "32"); HCC_64BIT_ADDR(temp) ? "64" : "32");
/* FIXME */ /* FIXME */
xhci_dbg(xhci, " FIXME: more HCCPARAMS debugging\n"); xhci_dbg(xhci, " FIXME: more HCCPARAMS debugging\n");
temp = xhci_readl(xhci, &xhci->cap_regs->run_regs_off); temp = readl(&xhci->cap_regs->run_regs_off);
xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK); xhci_dbg(xhci, "RTSOFF 0x%x:\n", temp & RTSOFF_MASK);
} }
...@@ -110,7 +110,7 @@ static void xhci_print_command_reg(struct xhci_hcd *xhci) ...@@ -110,7 +110,7 @@ static void xhci_print_command_reg(struct xhci_hcd *xhci)
{ {
u32 temp; u32 temp;
temp = xhci_readl(xhci, &xhci->op_regs->command); temp = readl(&xhci->op_regs->command);
xhci_dbg(xhci, "USBCMD 0x%x:\n", temp); xhci_dbg(xhci, "USBCMD 0x%x:\n", temp);
xhci_dbg(xhci, " HC is %s\n", xhci_dbg(xhci, " HC is %s\n",
(temp & CMD_RUN) ? "running" : "being stopped"); (temp & CMD_RUN) ? "running" : "being stopped");
...@@ -128,7 +128,7 @@ static void xhci_print_status(struct xhci_hcd *xhci) ...@@ -128,7 +128,7 @@ static void xhci_print_status(struct xhci_hcd *xhci)
{ {
u32 temp; u32 temp;
temp = xhci_readl(xhci, &xhci->op_regs->status); temp = readl(&xhci->op_regs->status);
xhci_dbg(xhci, "USBSTS 0x%x:\n", temp); xhci_dbg(xhci, "USBSTS 0x%x:\n", temp);
xhci_dbg(xhci, " Event ring is %sempty\n", xhci_dbg(xhci, " Event ring is %sempty\n",
(temp & STS_EINT) ? "not " : ""); (temp & STS_EINT) ? "not " : "");
...@@ -163,7 +163,7 @@ static void xhci_print_ports(struct xhci_hcd *xhci) ...@@ -163,7 +163,7 @@ static void xhci_print_ports(struct xhci_hcd *xhci)
for (j = 0; j < NUM_PORT_REGS; ++j) { for (j = 0; j < NUM_PORT_REGS; ++j) {
xhci_dbg(xhci, "%p port %s reg = 0x%x\n", xhci_dbg(xhci, "%p port %s reg = 0x%x\n",
addr, names[j], addr, names[j],
(unsigned int) xhci_readl(xhci, addr)); (unsigned int) readl(addr));
addr++; addr++;
} }
} }
...@@ -177,7 +177,7 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) ...@@ -177,7 +177,7 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num)
u64 temp_64; u64 temp_64;
addr = &ir_set->irq_pending; addr = &ir_set->irq_pending;
temp = xhci_readl(xhci, addr); temp = readl(addr);
if (temp == XHCI_INIT_VALUE) if (temp == XHCI_INIT_VALUE)
return; return;
...@@ -187,28 +187,28 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) ...@@ -187,28 +187,28 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num)
(unsigned int)temp); (unsigned int)temp);
addr = &ir_set->irq_control; addr = &ir_set->irq_control;
temp = xhci_readl(xhci, addr); temp = readl(addr);
xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr, xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr,
(unsigned int)temp); (unsigned int)temp);
addr = &ir_set->erst_size; addr = &ir_set->erst_size;
temp = xhci_readl(xhci, addr); temp = readl(addr);
xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr, xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr,
(unsigned int)temp); (unsigned int)temp);
addr = &ir_set->rsvd; addr = &ir_set->rsvd;
temp = xhci_readl(xhci, addr); temp = readl(addr);
if (temp != XHCI_INIT_VALUE) if (temp != XHCI_INIT_VALUE)
xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n", xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n",
addr, (unsigned int)temp); addr, (unsigned int)temp);
addr = &ir_set->erst_base; addr = &ir_set->erst_base;
temp_64 = xhci_read_64(xhci, addr); temp_64 = readq(addr);
xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n", xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n",
addr, temp_64); addr, temp_64);
addr = &ir_set->erst_dequeue; addr = &ir_set->erst_dequeue;
temp_64 = xhci_read_64(xhci, addr); temp_64 = readq(addr);
xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n", xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n",
addr, temp_64); addr, temp_64);
} }
...@@ -219,12 +219,12 @@ void xhci_print_run_regs(struct xhci_hcd *xhci) ...@@ -219,12 +219,12 @@ void xhci_print_run_regs(struct xhci_hcd *xhci)
int i; int i;
xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs); xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs);
temp = xhci_readl(xhci, &xhci->run_regs->microframe_index); temp = readl(&xhci->run_regs->microframe_index);
xhci_dbg(xhci, " %p: Microframe index = 0x%x\n", xhci_dbg(xhci, " %p: Microframe index = 0x%x\n",
&xhci->run_regs->microframe_index, &xhci->run_regs->microframe_index,
(unsigned int) temp); (unsigned int) temp);
for (i = 0; i < 7; ++i) { for (i = 0; i < 7; ++i) {
temp = xhci_readl(xhci, &xhci->run_regs->rsvd[i]); temp = readl(&xhci->run_regs->rsvd[i]);
if (temp != XHCI_INIT_VALUE) if (temp != XHCI_INIT_VALUE)
xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n", xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n",
&xhci->run_regs->rsvd[i], &xhci->run_regs->rsvd[i],
...@@ -412,7 +412,7 @@ void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci) ...@@ -412,7 +412,7 @@ void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci)
{ {
u64 val; u64 val;
val = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); val = readq(&xhci->op_regs->cmd_ring);
xhci_dbg(xhci, "// xHC command ring deq ptr low bits + flags = @%08x\n", xhci_dbg(xhci, "// xHC command ring deq ptr low bits + flags = @%08x\n",
lower_32_bits(val)); lower_32_bits(val));
xhci_dbg(xhci, "// xHC command ring deq ptr high bits = @%08x\n", xhci_dbg(xhci, "// xHC command ring deq ptr high bits = @%08x\n",
......
...@@ -94,7 +94,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, ...@@ -94,7 +94,7 @@ static void xhci_usb2_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
*/ */
memset(port_removable, 0, sizeof(port_removable)); memset(port_removable, 0, sizeof(port_removable));
for (i = 0; i < ports; i++) { for (i = 0; i < ports; i++) {
portsc = xhci_readl(xhci, xhci->usb2_ports[i]); portsc = readl(xhci->usb2_ports[i]);
/* If a device is removable, PORTSC reports a 0, same as in the /* If a device is removable, PORTSC reports a 0, same as in the
* hub descriptor DeviceRemovable bits. * hub descriptor DeviceRemovable bits.
*/ */
...@@ -148,7 +148,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci, ...@@ -148,7 +148,7 @@ static void xhci_usb3_hub_descriptor(struct usb_hcd *hcd, struct xhci_hcd *xhci,
port_removable = 0; port_removable = 0;
/* bit 0 is reserved, bit 1 is for port 1, etc. */ /* bit 0 is reserved, bit 1 is for port 1, etc. */
for (i = 0; i < ports; i++) { for (i = 0; i < ports; i++) {
portsc = xhci_readl(xhci, xhci->usb3_ports[i]); portsc = readl(xhci->usb3_ports[i]);
if (portsc & PORT_DEV_REMOVE) if (portsc & PORT_DEV_REMOVE)
port_removable |= 1 << (i + 1); port_removable |= 1 << (i + 1);
} }
...@@ -342,8 +342,8 @@ static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci, ...@@ -342,8 +342,8 @@ static void xhci_disable_port(struct usb_hcd *hcd, struct xhci_hcd *xhci,
} }
/* Write 1 to disable the port */ /* Write 1 to disable the port */
xhci_writel(xhci, port_status | PORT_PE, addr); writel(port_status | PORT_PE, addr);
port_status = xhci_readl(xhci, addr); port_status = readl(addr);
xhci_dbg(xhci, "disable port, actual port %d status = 0x%x\n", xhci_dbg(xhci, "disable port, actual port %d status = 0x%x\n",
wIndex, port_status); wIndex, port_status);
} }
...@@ -388,8 +388,8 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue, ...@@ -388,8 +388,8 @@ static void xhci_clear_port_change_bit(struct xhci_hcd *xhci, u16 wValue,
return; return;
} }
/* Change bits are all write 1 to clear */ /* Change bits are all write 1 to clear */
xhci_writel(xhci, port_status | status, addr); writel(port_status | status, addr);
port_status = xhci_readl(xhci, addr); port_status = readl(addr);
xhci_dbg(xhci, "clear port %s change, actual port %d status = 0x%x\n", xhci_dbg(xhci, "clear port %s change, actual port %d status = 0x%x\n",
port_change_bit, wIndex, port_status); port_change_bit, wIndex, port_status);
} }
...@@ -415,11 +415,11 @@ void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array, ...@@ -415,11 +415,11 @@ void xhci_set_link_state(struct xhci_hcd *xhci, __le32 __iomem **port_array,
{ {
u32 temp; u32 temp;
temp = xhci_readl(xhci, port_array[port_id]); temp = readl(port_array[port_id]);
temp = xhci_port_state_to_neutral(temp); temp = xhci_port_state_to_neutral(temp);
temp &= ~PORT_PLS_MASK; temp &= ~PORT_PLS_MASK;
temp |= PORT_LINK_STROBE | link_state; temp |= PORT_LINK_STROBE | link_state;
xhci_writel(xhci, temp, port_array[port_id]); writel(temp, port_array[port_id]);
} }
static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
...@@ -427,7 +427,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, ...@@ -427,7 +427,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
{ {
u32 temp; u32 temp;
temp = xhci_readl(xhci, port_array[port_id]); temp = readl(port_array[port_id]);
temp = xhci_port_state_to_neutral(temp); temp = xhci_port_state_to_neutral(temp);
if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT) if (wake_mask & USB_PORT_FEAT_REMOTE_WAKE_CONNECT)
...@@ -445,7 +445,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci, ...@@ -445,7 +445,7 @@ static void xhci_set_remote_wake_mask(struct xhci_hcd *xhci,
else else
temp &= ~PORT_WKOC_E; temp &= ~PORT_WKOC_E;
xhci_writel(xhci, temp, port_array[port_id]); writel(temp, port_array[port_id]);
} }
/* Test and clear port RWC bit */ /* Test and clear port RWC bit */
...@@ -454,11 +454,11 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array, ...@@ -454,11 +454,11 @@ void xhci_test_and_clear_bit(struct xhci_hcd *xhci, __le32 __iomem **port_array,
{ {
u32 temp; u32 temp;
temp = xhci_readl(xhci, port_array[port_id]); temp = readl(port_array[port_id]);
if (temp & port_bit) { if (temp & port_bit) {
temp = xhci_port_state_to_neutral(temp); temp = xhci_port_state_to_neutral(temp);
temp |= port_bit; temp |= port_bit;
xhci_writel(xhci, temp, port_array[port_id]); writel(temp, port_array[port_id]);
} }
} }
...@@ -623,8 +623,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, ...@@ -623,8 +623,7 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
} }
xhci_ring_device(xhci, slot_id); xhci_ring_device(xhci, slot_id);
} else { } else {
int port_status = xhci_readl(xhci, int port_status = readl(port_array[wIndex]);
port_array[wIndex]);
xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n", xhci_warn(xhci, "Port resume took longer than %i msec, port status = 0x%x\n",
XHCI_MAX_REXIT_TIMEOUT, XHCI_MAX_REXIT_TIMEOUT,
port_status); port_status);
...@@ -733,12 +732,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -733,12 +732,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
/* Set the U1 and U2 exit latencies. */ /* Set the U1 and U2 exit latencies. */
memcpy(buf, &usb_bos_descriptor, memcpy(buf, &usb_bos_descriptor,
USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE); USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE);
temp = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); temp = readl(&xhci->cap_regs->hcs_params3);
buf[12] = HCS_U1_LATENCY(temp); buf[12] = HCS_U1_LATENCY(temp);
put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]); put_unaligned_le16(HCS_U2_LATENCY(temp), &buf[13]);
/* Indicate whether the host has LTM support. */ /* Indicate whether the host has LTM support. */
temp = xhci_readl(xhci, &xhci->cap_regs->hcc_params); temp = readl(&xhci->cap_regs->hcc_params);
if (HCC_LTC(temp)) if (HCC_LTC(temp))
buf[8] |= USB_LTM_SUPPORT; buf[8] |= USB_LTM_SUPPORT;
...@@ -748,7 +747,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -748,7 +747,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
if (!wIndex || wIndex > max_ports) if (!wIndex || wIndex > max_ports)
goto error; goto error;
wIndex--; wIndex--;
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if (temp == 0xffffffff) { if (temp == 0xffffffff) {
retval = -ENODEV; retval = -ENODEV;
break; break;
...@@ -775,7 +774,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -775,7 +774,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
if (!wIndex || wIndex > max_ports) if (!wIndex || wIndex > max_ports)
goto error; goto error;
wIndex--; wIndex--;
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if (temp == 0xffffffff) { if (temp == 0xffffffff) {
retval = -ENODEV; retval = -ENODEV;
break; break;
...@@ -784,7 +783,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -784,7 +783,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
/* FIXME: What new port features do we need to support? */ /* FIXME: What new port features do we need to support? */
switch (wValue) { switch (wValue) {
case USB_PORT_FEAT_SUSPEND: case USB_PORT_FEAT_SUSPEND:
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if ((temp & PORT_PLS_MASK) != XDEV_U0) { if ((temp & PORT_PLS_MASK) != XDEV_U0) {
/* Resume the port to U0 first */ /* Resume the port to U0 first */
xhci_set_link_state(xhci, port_array, wIndex, xhci_set_link_state(xhci, port_array, wIndex,
...@@ -797,7 +796,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -797,7 +796,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
* a port unless the port reports that it is in the * a port unless the port reports that it is in the
* enabled (PED = ‘1’,PLS < ‘3’) state. * enabled (PED = ‘1’,PLS < ‘3’) state.
*/ */
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if ((temp & PORT_PE) == 0 || (temp & PORT_RESET) if ((temp & PORT_PE) == 0 || (temp & PORT_RESET)
|| (temp & PORT_PLS_MASK) >= XDEV_U3) { || (temp & PORT_PLS_MASK) >= XDEV_U3) {
xhci_warn(xhci, "USB core suspending device " xhci_warn(xhci, "USB core suspending device "
...@@ -822,11 +821,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -822,11 +821,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
msleep(10); /* wait device to enter */ msleep(10); /* wait device to enter */
spin_lock_irqsave(&xhci->lock, flags); spin_lock_irqsave(&xhci->lock, flags);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
bus_state->suspended_ports |= 1 << wIndex; bus_state->suspended_ports |= 1 << wIndex;
break; break;
case USB_PORT_FEAT_LINK_STATE: case USB_PORT_FEAT_LINK_STATE:
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
/* Disable port */ /* Disable port */
if (link_state == USB_SS_PORT_LS_SS_DISABLED) { if (link_state == USB_SS_PORT_LS_SS_DISABLED) {
...@@ -839,9 +838,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -839,9 +838,8 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
temp |= PORT_CSC | PORT_PEC | PORT_WRC | temp |= PORT_CSC | PORT_PEC | PORT_WRC |
PORT_OCC | PORT_RC | PORT_PLC | PORT_OCC | PORT_RC | PORT_PLC |
PORT_CEC; PORT_CEC;
xhci_writel(xhci, temp | PORT_PE, writel(temp | PORT_PE, port_array[wIndex]);
port_array[wIndex]); temp = readl(port_array[wIndex]);
temp = xhci_readl(xhci, port_array[wIndex]);
break; break;
} }
...@@ -850,7 +848,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -850,7 +848,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
xhci_dbg(xhci, "Enable port %d\n", wIndex); xhci_dbg(xhci, "Enable port %d\n", wIndex);
xhci_set_link_state(xhci, port_array, wIndex, xhci_set_link_state(xhci, port_array, wIndex,
link_state); link_state);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
break; break;
} }
...@@ -884,7 +882,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -884,7 +882,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
msleep(20); /* wait device to enter */ msleep(20); /* wait device to enter */
spin_lock_irqsave(&xhci->lock, flags); spin_lock_irqsave(&xhci->lock, flags);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if (link_state == USB_SS_PORT_LS_U3) if (link_state == USB_SS_PORT_LS_U3)
bus_state->suspended_ports |= 1 << wIndex; bus_state->suspended_ports |= 1 << wIndex;
break; break;
...@@ -895,10 +893,9 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -895,10 +893,9 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
* However, khubd will ignore the roothub events until * However, khubd will ignore the roothub events until
* the roothub is registered. * the roothub is registered.
*/ */
xhci_writel(xhci, temp | PORT_POWER, writel(temp | PORT_POWER, port_array[wIndex]);
port_array[wIndex]);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
xhci_dbg(xhci, "set port power, actual port %d status = 0x%x\n", wIndex, temp); xhci_dbg(xhci, "set port power, actual port %d status = 0x%x\n", wIndex, temp);
spin_unlock_irqrestore(&xhci->lock, flags); spin_unlock_irqrestore(&xhci->lock, flags);
...@@ -911,52 +908,52 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -911,52 +908,52 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
break; break;
case USB_PORT_FEAT_RESET: case USB_PORT_FEAT_RESET:
temp = (temp | PORT_RESET); temp = (temp | PORT_RESET);
xhci_writel(xhci, temp, port_array[wIndex]); writel(temp, port_array[wIndex]);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp); xhci_dbg(xhci, "set port reset, actual port %d status = 0x%x\n", wIndex, temp);
break; break;
case USB_PORT_FEAT_REMOTE_WAKE_MASK: case USB_PORT_FEAT_REMOTE_WAKE_MASK:
xhci_set_remote_wake_mask(xhci, port_array, xhci_set_remote_wake_mask(xhci, port_array,
wIndex, wake_mask); wIndex, wake_mask);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
xhci_dbg(xhci, "set port remote wake mask, " xhci_dbg(xhci, "set port remote wake mask, "
"actual port %d status = 0x%x\n", "actual port %d status = 0x%x\n",
wIndex, temp); wIndex, temp);
break; break;
case USB_PORT_FEAT_BH_PORT_RESET: case USB_PORT_FEAT_BH_PORT_RESET:
temp |= PORT_WR; temp |= PORT_WR;
xhci_writel(xhci, temp, port_array[wIndex]); writel(temp, port_array[wIndex]);
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
break; break;
case USB_PORT_FEAT_U1_TIMEOUT: case USB_PORT_FEAT_U1_TIMEOUT:
if (hcd->speed != HCD_USB3) if (hcd->speed != HCD_USB3)
goto error; goto error;
temp = xhci_readl(xhci, port_array[wIndex] + PORTPMSC); temp = readl(port_array[wIndex] + PORTPMSC);
temp &= ~PORT_U1_TIMEOUT_MASK; temp &= ~PORT_U1_TIMEOUT_MASK;
temp |= PORT_U1_TIMEOUT(timeout); temp |= PORT_U1_TIMEOUT(timeout);
xhci_writel(xhci, temp, port_array[wIndex] + PORTPMSC); writel(temp, port_array[wIndex] + PORTPMSC);
break; break;
case USB_PORT_FEAT_U2_TIMEOUT: case USB_PORT_FEAT_U2_TIMEOUT:
if (hcd->speed != HCD_USB3) if (hcd->speed != HCD_USB3)
goto error; goto error;
temp = xhci_readl(xhci, port_array[wIndex] + PORTPMSC); temp = readl(port_array[wIndex] + PORTPMSC);
temp &= ~PORT_U2_TIMEOUT_MASK; temp &= ~PORT_U2_TIMEOUT_MASK;
temp |= PORT_U2_TIMEOUT(timeout); temp |= PORT_U2_TIMEOUT(timeout);
xhci_writel(xhci, temp, port_array[wIndex] + PORTPMSC); writel(temp, port_array[wIndex] + PORTPMSC);
break; break;
default: default:
goto error; goto error;
} }
/* unblock any posted writes */ /* unblock any posted writes */
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
break; break;
case ClearPortFeature: case ClearPortFeature:
if (!wIndex || wIndex > max_ports) if (!wIndex || wIndex > max_ports)
goto error; goto error;
wIndex--; wIndex--;
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
if (temp == 0xffffffff) { if (temp == 0xffffffff) {
retval = -ENODEV; retval = -ENODEV;
break; break;
...@@ -965,7 +962,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -965,7 +962,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
temp = xhci_port_state_to_neutral(temp); temp = xhci_port_state_to_neutral(temp);
switch (wValue) { switch (wValue) {
case USB_PORT_FEAT_SUSPEND: case USB_PORT_FEAT_SUSPEND:
temp = xhci_readl(xhci, port_array[wIndex]); temp = readl(port_array[wIndex]);
xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n"); xhci_dbg(xhci, "clear USB_PORT_FEAT_SUSPEND\n");
xhci_dbg(xhci, "PORTSC %04x\n", temp); xhci_dbg(xhci, "PORTSC %04x\n", temp);
if (temp & PORT_RESET) if (temp & PORT_RESET)
...@@ -1008,8 +1005,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, ...@@ -1008,8 +1005,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
port_array[wIndex], temp); port_array[wIndex], temp);
break; break;
case USB_PORT_FEAT_POWER: case USB_PORT_FEAT_POWER:
xhci_writel(xhci, temp & ~PORT_POWER, writel(temp & ~PORT_POWER, port_array[wIndex]);
port_array[wIndex]);
spin_unlock_irqrestore(&xhci->lock, flags); spin_unlock_irqrestore(&xhci->lock, flags);
temp = usb_acpi_power_manageable(hcd->self.root_hub, temp = usb_acpi_power_manageable(hcd->self.root_hub,
...@@ -1070,7 +1066,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf) ...@@ -1070,7 +1066,7 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char *buf)
spin_lock_irqsave(&xhci->lock, flags); spin_lock_irqsave(&xhci->lock, flags);
/* For each port, did anything change? If so, set that bit in buf. */ /* For each port, did anything change? If so, set that bit in buf. */
for (i = 0; i < max_ports; i++) { for (i = 0; i < max_ports; i++) {
temp = xhci_readl(xhci, port_array[i]); temp = readl(port_array[i]);
if (temp == 0xffffffff) { if (temp == 0xffffffff) {
retval = -ENODEV; retval = -ENODEV;
break; break;
...@@ -1124,7 +1120,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) ...@@ -1124,7 +1120,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
u32 t1, t2; u32 t1, t2;
int slot_id; int slot_id;
t1 = xhci_readl(xhci, port_array[port_index]); t1 = readl(port_array[port_index]);
t2 = xhci_port_state_to_neutral(t1); t2 = xhci_port_state_to_neutral(t1);
if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) { if ((t1 & PORT_PE) && !(t1 & PORT_PLS_MASK)) {
...@@ -1157,7 +1153,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd) ...@@ -1157,7 +1153,7 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
t1 = xhci_port_state_to_neutral(t1); t1 = xhci_port_state_to_neutral(t1);
if (t1 != t2) if (t1 != t2)
xhci_writel(xhci, t2, port_array[port_index]); writel(t2, port_array[port_index]);
} }
hcd->state = HC_STATE_SUSPENDED; hcd->state = HC_STATE_SUSPENDED;
bus_state->next_statechange = jiffies + msecs_to_jiffies(10); bus_state->next_statechange = jiffies + msecs_to_jiffies(10);
...@@ -1187,9 +1183,9 @@ int xhci_bus_resume(struct usb_hcd *hcd) ...@@ -1187,9 +1183,9 @@ int xhci_bus_resume(struct usb_hcd *hcd)
} }
/* delay the irqs */ /* delay the irqs */
temp = xhci_readl(xhci, &xhci->op_regs->command); temp = readl(&xhci->op_regs->command);
temp &= ~CMD_EIE; temp &= ~CMD_EIE;
xhci_writel(xhci, temp, &xhci->op_regs->command); writel(temp, &xhci->op_regs->command);
port_index = max_ports; port_index = max_ports;
while (port_index--) { while (port_index--) {
...@@ -1198,7 +1194,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) ...@@ -1198,7 +1194,7 @@ int xhci_bus_resume(struct usb_hcd *hcd)
u32 temp; u32 temp;
int slot_id; int slot_id;
temp = xhci_readl(xhci, port_array[port_index]); temp = readl(port_array[port_index]);
if (DEV_SUPERSPEED(temp)) if (DEV_SUPERSPEED(temp))
temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS); temp &= ~(PORT_RWC_BITS | PORT_CEC | PORT_WAKE_BITS);
else else
...@@ -1235,17 +1231,17 @@ int xhci_bus_resume(struct usb_hcd *hcd) ...@@ -1235,17 +1231,17 @@ int xhci_bus_resume(struct usb_hcd *hcd)
if (slot_id) if (slot_id)
xhci_ring_device(xhci, slot_id); xhci_ring_device(xhci, slot_id);
} else } else
xhci_writel(xhci, temp, port_array[port_index]); writel(temp, port_array[port_index]);
} }
(void) xhci_readl(xhci, &xhci->op_regs->command); (void) readl(&xhci->op_regs->command);
bus_state->next_statechange = jiffies + msecs_to_jiffies(5); bus_state->next_statechange = jiffies + msecs_to_jiffies(5);
/* re-enable irqs */ /* re-enable irqs */
temp = xhci_readl(xhci, &xhci->op_regs->command); temp = readl(&xhci->op_regs->command);
temp |= CMD_EIE; temp |= CMD_EIE;
xhci_writel(xhci, temp, &xhci->op_regs->command); writel(temp, &xhci->op_regs->command);
temp = xhci_readl(xhci, &xhci->op_regs->command); temp = readl(&xhci->op_regs->command);
spin_unlock_irqrestore(&xhci->lock, flags); spin_unlock_irqrestore(&xhci->lock, flags);
return 0; return 0;
......
...@@ -57,7 +57,7 @@ static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci, ...@@ -57,7 +57,7 @@ static struct xhci_segment *xhci_segment_alloc(struct xhci_hcd *xhci,
/* If the cycle state is 0, set the cycle bit to 1 for all the TRBs */ /* If the cycle state is 0, set the cycle bit to 1 for all the TRBs */
if (cycle_state == 0) { if (cycle_state == 0) {
for (i = 0; i < TRBS_PER_SEGMENT; i++) for (i = 0; i < TRBS_PER_SEGMENT; i++)
seg->trbs[i].link.control |= TRB_CYCLE; seg->trbs[i].link.control |= cpu_to_le32(TRB_CYCLE);
} }
seg->dma = dma; seg->dma = dma;
seg->next = NULL; seg->next = NULL;
...@@ -308,7 +308,8 @@ static void xhci_reinit_cached_ring(struct xhci_hcd *xhci, ...@@ -308,7 +308,8 @@ static void xhci_reinit_cached_ring(struct xhci_hcd *xhci,
sizeof(union xhci_trb)*TRBS_PER_SEGMENT); sizeof(union xhci_trb)*TRBS_PER_SEGMENT);
if (cycle_state == 0) { if (cycle_state == 0) {
for (i = 0; i < TRBS_PER_SEGMENT; i++) for (i = 0; i < TRBS_PER_SEGMENT; i++)
seg->trbs[i].link.control |= TRB_CYCLE; seg->trbs[i].link.control |=
cpu_to_le32(TRB_CYCLE);
} }
/* All endpoint rings have link TRBs */ /* All endpoint rings have link TRBs */
xhci_link_segments(xhci, seg, seg->next, type); xhci_link_segments(xhci, seg, seg->next, type);
...@@ -432,10 +433,10 @@ static void xhci_free_stream_ctx(struct xhci_hcd *xhci, ...@@ -432,10 +433,10 @@ static void xhci_free_stream_ctx(struct xhci_hcd *xhci,
unsigned int num_stream_ctxs, unsigned int num_stream_ctxs,
struct xhci_stream_ctx *stream_ctx, dma_addr_t dma) struct xhci_stream_ctx *stream_ctx, dma_addr_t dma)
{ {
struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); struct device *dev = xhci_to_hcd(xhci)->self.controller;
if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE) if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE)
dma_free_coherent(&pdev->dev, dma_free_coherent(dev,
sizeof(struct xhci_stream_ctx)*num_stream_ctxs, sizeof(struct xhci_stream_ctx)*num_stream_ctxs,
stream_ctx, dma); stream_ctx, dma);
else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE) else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE)
...@@ -460,10 +461,10 @@ static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci, ...@@ -460,10 +461,10 @@ static struct xhci_stream_ctx *xhci_alloc_stream_ctx(struct xhci_hcd *xhci,
unsigned int num_stream_ctxs, dma_addr_t *dma, unsigned int num_stream_ctxs, dma_addr_t *dma,
gfp_t mem_flags) gfp_t mem_flags)
{ {
struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); struct device *dev = xhci_to_hcd(xhci)->self.controller;
if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE) if (num_stream_ctxs > MEDIUM_STREAM_ARRAY_SIZE)
return dma_alloc_coherent(&pdev->dev, return dma_alloc_coherent(dev,
sizeof(struct xhci_stream_ctx)*num_stream_ctxs, sizeof(struct xhci_stream_ctx)*num_stream_ctxs,
dma, mem_flags); dma, mem_flags);
else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE) else if (num_stream_ctxs <= SMALL_STREAM_ARRAY_SIZE)
...@@ -721,8 +722,7 @@ void xhci_free_stream_info(struct xhci_hcd *xhci, ...@@ -721,8 +722,7 @@ void xhci_free_stream_info(struct xhci_hcd *xhci,
stream_info->stream_ctx_array, stream_info->stream_ctx_array,
stream_info->ctx_array_dma); stream_info->ctx_array_dma);
if (stream_info) kfree(stream_info->stream_rings);
kfree(stream_info->stream_rings);
kfree(stream_info); kfree(stream_info);
} }
...@@ -1616,7 +1616,7 @@ static void scratchpad_free(struct xhci_hcd *xhci) ...@@ -1616,7 +1616,7 @@ static void scratchpad_free(struct xhci_hcd *xhci)
{ {
int num_sp; int num_sp;
int i; int i;
struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); struct device *dev = xhci_to_hcd(xhci)->self.controller;
if (!xhci->scratchpad) if (!xhci->scratchpad)
return; return;
...@@ -1624,13 +1624,13 @@ static void scratchpad_free(struct xhci_hcd *xhci) ...@@ -1624,13 +1624,13 @@ static void scratchpad_free(struct xhci_hcd *xhci)
num_sp = HCS_MAX_SCRATCHPAD(xhci->hcs_params2); num_sp = HCS_MAX_SCRATCHPAD(xhci->hcs_params2);
for (i = 0; i < num_sp; i++) { for (i = 0; i < num_sp; i++) {
dma_free_coherent(&pdev->dev, xhci->page_size, dma_free_coherent(dev, xhci->page_size,
xhci->scratchpad->sp_buffers[i], xhci->scratchpad->sp_buffers[i],
xhci->scratchpad->sp_dma_buffers[i]); xhci->scratchpad->sp_dma_buffers[i]);
} }
kfree(xhci->scratchpad->sp_dma_buffers); kfree(xhci->scratchpad->sp_dma_buffers);
kfree(xhci->scratchpad->sp_buffers); kfree(xhci->scratchpad->sp_buffers);
dma_free_coherent(&pdev->dev, num_sp * sizeof(u64), dma_free_coherent(dev, num_sp * sizeof(u64),
xhci->scratchpad->sp_array, xhci->scratchpad->sp_array,
xhci->scratchpad->sp_dma); xhci->scratchpad->sp_dma);
kfree(xhci->scratchpad); kfree(xhci->scratchpad);
...@@ -1692,7 +1692,7 @@ void xhci_free_command(struct xhci_hcd *xhci, ...@@ -1692,7 +1692,7 @@ void xhci_free_command(struct xhci_hcd *xhci,
void xhci_mem_cleanup(struct xhci_hcd *xhci) void xhci_mem_cleanup(struct xhci_hcd *xhci)
{ {
struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); struct device *dev = xhci_to_hcd(xhci)->self.controller;
struct xhci_cd *cur_cd, *next_cd; struct xhci_cd *cur_cd, *next_cd;
int size; int size;
int i, j, num_ports; int i, j, num_ports;
...@@ -1700,7 +1700,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) ...@@ -1700,7 +1700,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
/* Free the Event Ring Segment Table and the actual Event Ring */ /* Free the Event Ring Segment Table and the actual Event Ring */
size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries);
if (xhci->erst.entries) if (xhci->erst.entries)
dma_free_coherent(&pdev->dev, size, dma_free_coherent(dev, size,
xhci->erst.entries, xhci->erst.erst_dma_addr); xhci->erst.entries, xhci->erst.erst_dma_addr);
xhci->erst.entries = NULL; xhci->erst.entries = NULL;
xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed ERST"); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed ERST");
...@@ -1748,7 +1748,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) ...@@ -1748,7 +1748,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci)
"Freed medium stream array pool"); "Freed medium stream array pool");
if (xhci->dcbaa) if (xhci->dcbaa)
dma_free_coherent(&pdev->dev, sizeof(*xhci->dcbaa), dma_free_coherent(dev, sizeof(*xhci->dcbaa),
xhci->dcbaa, xhci->dcbaa->dma); xhci->dcbaa, xhci->dcbaa->dma);
xhci->dcbaa = NULL; xhci->dcbaa = NULL;
...@@ -1958,7 +1958,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) ...@@ -1958,7 +1958,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci)
xhci_warn(xhci, "WARN something wrong with SW event ring " xhci_warn(xhci, "WARN something wrong with SW event ring "
"dequeue ptr.\n"); "dequeue ptr.\n");
/* Update HC event ring dequeue pointer */ /* Update HC event ring dequeue pointer */
temp = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); temp = readq(&xhci->ir_set->erst_dequeue);
temp &= ERST_PTR_MASK; temp &= ERST_PTR_MASK;
/* Don't clear the EHB bit (which is RW1C) because /* Don't clear the EHB bit (which is RW1C) because
* there might be more events to service. * there might be more events to service.
...@@ -1967,7 +1967,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) ...@@ -1967,7 +1967,7 @@ static void xhci_set_hc_event_deq(struct xhci_hcd *xhci)
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Write event ring dequeue pointer, " "// Write event ring dequeue pointer, "
"preserving EHB bit"); "preserving EHB bit");
xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | temp, writeq(((u64) deq & (u64) ~ERST_PTR_MASK) | temp,
&xhci->ir_set->erst_dequeue); &xhci->ir_set->erst_dequeue);
} }
...@@ -1986,7 +1986,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, ...@@ -1986,7 +1986,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports,
} }
/* Port offset and count in the third dword, see section 7.2 */ /* Port offset and count in the third dword, see section 7.2 */
temp = xhci_readl(xhci, addr + 2); temp = readl(addr + 2);
port_offset = XHCI_EXT_PORT_OFF(temp); port_offset = XHCI_EXT_PORT_OFF(temp);
port_count = XHCI_EXT_PORT_COUNT(temp); port_count = XHCI_EXT_PORT_COUNT(temp);
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
...@@ -2069,7 +2069,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2069,7 +2069,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
int cap_count = 0; int cap_count = 0;
addr = &xhci->cap_regs->hcc_params; addr = &xhci->cap_regs->hcc_params;
offset = XHCI_HCC_EXT_CAPS(xhci_readl(xhci, addr)); offset = XHCI_HCC_EXT_CAPS(readl(addr));
if (offset == 0) { if (offset == 0) {
xhci_err(xhci, "No Extended Capability registers, " xhci_err(xhci, "No Extended Capability registers, "
"unable to set up roothub.\n"); "unable to set up roothub.\n");
...@@ -2106,7 +2106,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2106,7 +2106,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
/* count extended protocol capability entries for later caching */ /* count extended protocol capability entries for later caching */
do { do {
u32 cap_id; u32 cap_id;
cap_id = xhci_readl(xhci, tmp_addr); cap_id = readl(tmp_addr);
if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL) if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL)
cap_count++; cap_count++;
tmp_offset = XHCI_EXT_CAPS_NEXT(cap_id); tmp_offset = XHCI_EXT_CAPS_NEXT(cap_id);
...@@ -2120,7 +2120,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2120,7 +2120,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags)
while (1) { while (1) {
u32 cap_id; u32 cap_id;
cap_id = xhci_readl(xhci, addr); cap_id = readl(addr);
if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL) if (XHCI_EXT_CAPS_ID(cap_id) == XHCI_EXT_CAPS_PROTOCOL)
xhci_add_in_port(xhci, num_ports, addr, xhci_add_in_port(xhci, num_ports, addr,
(u8) XHCI_EXT_PORT_MAJOR(cap_id), (u8) XHCI_EXT_PORT_MAJOR(cap_id),
...@@ -2224,7 +2224,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2224,7 +2224,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
INIT_LIST_HEAD(&xhci->cancel_cmd_list); INIT_LIST_HEAD(&xhci->cancel_cmd_list);
page_size = xhci_readl(xhci, &xhci->op_regs->page_size); page_size = readl(&xhci->op_regs->page_size);
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"Supported page size register = 0x%x", page_size); "Supported page size register = 0x%x", page_size);
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
...@@ -2247,14 +2247,14 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2247,14 +2247,14 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
* Program the Number of Device Slots Enabled field in the CONFIG * Program the Number of Device Slots Enabled field in the CONFIG
* register with the max value of slots the HC can handle. * register with the max value of slots the HC can handle.
*/ */
val = HCS_MAX_SLOTS(xhci_readl(xhci, &xhci->cap_regs->hcs_params1)); val = HCS_MAX_SLOTS(readl(&xhci->cap_regs->hcs_params1));
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// xHC can handle at most %d device slots.", val); "// xHC can handle at most %d device slots.", val);
val2 = xhci_readl(xhci, &xhci->op_regs->config_reg); val2 = readl(&xhci->op_regs->config_reg);
val |= (val2 & ~HCS_SLOTS_MASK); val |= (val2 & ~HCS_SLOTS_MASK);
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Setting Max device slots reg = 0x%x.", val); "// Setting Max device slots reg = 0x%x.", val);
xhci_writel(xhci, val, &xhci->op_regs->config_reg); writel(val, &xhci->op_regs->config_reg);
/* /*
* Section 5.4.8 - doorbell array must be * Section 5.4.8 - doorbell array must be
...@@ -2269,7 +2269,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2269,7 +2269,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Device context base array address = 0x%llx (DMA), %p (virt)", "// Device context base array address = 0x%llx (DMA), %p (virt)",
(unsigned long long)xhci->dcbaa->dma, xhci->dcbaa); (unsigned long long)xhci->dcbaa->dma, xhci->dcbaa);
xhci_write_64(xhci, dma, &xhci->op_regs->dcbaa_ptr); writeq(dma, &xhci->op_regs->dcbaa_ptr);
/* /*
* Initialize the ring segment pool. The ring must be a contiguous * Initialize the ring segment pool. The ring must be a contiguous
...@@ -2312,13 +2312,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2312,13 +2312,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
(unsigned long long)xhci->cmd_ring->first_seg->dma); (unsigned long long)xhci->cmd_ring->first_seg->dma);
/* Set the address in the Command Ring Control register */ /* Set the address in the Command Ring Control register */
val_64 = xhci_read_64(xhci, &xhci->op_regs->cmd_ring); val_64 = readq(&xhci->op_regs->cmd_ring);
val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) | val_64 = (val_64 & (u64) CMD_RING_RSVD_BITS) |
(xhci->cmd_ring->first_seg->dma & (u64) ~CMD_RING_RSVD_BITS) | (xhci->cmd_ring->first_seg->dma & (u64) ~CMD_RING_RSVD_BITS) |
xhci->cmd_ring->cycle_state; xhci->cmd_ring->cycle_state;
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Setting command ring address to 0x%x", val); "// Setting command ring address to 0x%x", val);
xhci_write_64(xhci, val_64, &xhci->op_regs->cmd_ring); writeq(val_64, &xhci->op_regs->cmd_ring);
xhci_dbg_cmd_ptrs(xhci); xhci_dbg_cmd_ptrs(xhci);
xhci->lpm_command = xhci_alloc_command(xhci, true, true, flags); xhci->lpm_command = xhci_alloc_command(xhci, true, true, flags);
...@@ -2331,7 +2331,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2331,7 +2331,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
*/ */
xhci->cmd_ring_reserved_trbs++; xhci->cmd_ring_reserved_trbs++;
val = xhci_readl(xhci, &xhci->cap_regs->db_off); val = readl(&xhci->cap_regs->db_off);
val &= DBOFF_MASK; val &= DBOFF_MASK;
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Doorbell array is located at offset 0x%x" "// Doorbell array is located at offset 0x%x"
...@@ -2382,13 +2382,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2382,13 +2382,13 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
} }
/* set ERST count with the number of entries in the segment table */ /* set ERST count with the number of entries in the segment table */
val = xhci_readl(xhci, &xhci->ir_set->erst_size); val = readl(&xhci->ir_set->erst_size);
val &= ERST_SIZE_MASK; val &= ERST_SIZE_MASK;
val |= ERST_NUM_SEGS; val |= ERST_NUM_SEGS;
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Write ERST size = %i to ir_set 0 (some bits preserved)", "// Write ERST size = %i to ir_set 0 (some bits preserved)",
val); val);
xhci_writel(xhci, val, &xhci->ir_set->erst_size); writel(val, &xhci->ir_set->erst_size);
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Set ERST entries to point to event ring."); "// Set ERST entries to point to event ring.");
...@@ -2396,10 +2396,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2396,10 +2396,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
xhci_dbg_trace(xhci, trace_xhci_dbg_init, xhci_dbg_trace(xhci, trace_xhci_dbg_init,
"// Set ERST base address for ir_set 0 = 0x%llx", "// Set ERST base address for ir_set 0 = 0x%llx",
(unsigned long long)xhci->erst.erst_dma_addr); (unsigned long long)xhci->erst.erst_dma_addr);
val_64 = xhci_read_64(xhci, &xhci->ir_set->erst_base); val_64 = readq(&xhci->ir_set->erst_base);
val_64 &= ERST_PTR_MASK; val_64 &= ERST_PTR_MASK;
val_64 |= (xhci->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK); val_64 |= (xhci->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK);
xhci_write_64(xhci, val_64, &xhci->ir_set->erst_base); writeq(val_64, &xhci->ir_set->erst_base);
/* Set the event ring dequeue address */ /* Set the event ring dequeue address */
xhci_set_hc_event_deq(xhci); xhci_set_hc_event_deq(xhci);
...@@ -2431,10 +2431,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) ...@@ -2431,10 +2431,10 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags)
* is necessary for allowing USB 3.0 devices to do remote wakeup from * is necessary for allowing USB 3.0 devices to do remote wakeup from
* U3 (device suspend). * U3 (device suspend).
*/ */
temp = xhci_readl(xhci, &xhci->op_regs->dev_notification); temp = readl(&xhci->op_regs->dev_notification);
temp &= ~DEV_NOTE_MASK; temp &= ~DEV_NOTE_MASK;
temp |= DEV_NOTE_FWAKE; temp |= DEV_NOTE_FWAKE;
xhci_writel(xhci, temp, &xhci->op_regs->dev_notification); writel(temp, &xhci->op_regs->dev_notification);
return 0; return 0;
......
...@@ -331,6 +331,7 @@ static const struct hc_driver xhci_pci_hc_driver = { ...@@ -331,6 +331,7 @@ static const struct hc_driver xhci_pci_hc_driver = {
.check_bandwidth = xhci_check_bandwidth, .check_bandwidth = xhci_check_bandwidth,
.reset_bandwidth = xhci_reset_bandwidth, .reset_bandwidth = xhci_reset_bandwidth,
.address_device = xhci_address_device, .address_device = xhci_address_device,
.enable_device = xhci_enable_device,
.update_hub_device = xhci_update_hub_device, .update_hub_device = xhci_update_hub_device,
.reset_device = xhci_discover_or_reset_device, .reset_device = xhci_discover_or_reset_device,
......
...@@ -69,6 +69,7 @@ static const struct hc_driver xhci_plat_xhci_driver = { ...@@ -69,6 +69,7 @@ static const struct hc_driver xhci_plat_xhci_driver = {
.check_bandwidth = xhci_check_bandwidth, .check_bandwidth = xhci_check_bandwidth,
.reset_bandwidth = xhci_reset_bandwidth, .reset_bandwidth = xhci_reset_bandwidth,
.address_device = xhci_address_device, .address_device = xhci_address_device,
.enable_device = xhci_enable_device,
.update_hub_device = xhci_update_hub_device, .update_hub_device = xhci_update_hub_device,
.reset_device = xhci_discover_or_reset_device, .reset_device = xhci_discover_or_reset_device,
...@@ -139,6 +140,7 @@ static int xhci_plat_probe(struct platform_device *pdev) ...@@ -139,6 +140,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
ret = usb_add_hcd(hcd, irq, IRQF_SHARED); ret = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (ret) if (ret)
goto unmap_registers; goto unmap_registers;
device_wakeup_enable(hcd->self.controller);
/* USB 2.0 roothub is stored in the platform_device now. */ /* USB 2.0 roothub is stored in the platform_device now. */
hcd = platform_get_drvdata(pdev); hcd = platform_get_drvdata(pdev);
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册