aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2005-11-29 12:08:15 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-04 16:51:40 -0500
commit3cf0a22e8b1b3f44288db773d315e72e89d51c4c (patch)
treeb2b9e6d717b317a6439d9e5c1cf2333148759af0
parenta21d4fed4b00eaf7e7c3b2e2b25de24f540bfa66 (diff)
[PATCH] USB Gadget: dummy_hcd: updates to hcd->state
This patch (as613) moves the updates to hcd->state in the dummy_hcd driver to where they now belong. It also uses the new HC_FLAG_HW_ACCESSIBLE flag in a way that simulates a real PCI controller, and it adds checks for attempts to resume the bus while the controller is suspended or to suspend the controller while the bus is active. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/usb/gadget/dummy_hcd.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c
index 4932b07b316d..ce0d4b412dfe 100644
--- a/drivers/usb/gadget/dummy_hcd.c
+++ b/drivers/usb/gadget/dummy_hcd.c
@@ -1576,7 +1576,7 @@ static int dummy_hub_status (struct usb_hcd *hcd, char *buf)
1576 dum = hcd_to_dummy (hcd); 1576 dum = hcd_to_dummy (hcd);
1577 1577
1578 spin_lock_irqsave (&dum->lock, flags); 1578 spin_lock_irqsave (&dum->lock, flags);
1579 if (hcd->state != HC_STATE_RUNNING) 1579 if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
1580 goto done; 1580 goto done;
1581 1581
1582 if (dum->resuming && time_after_eq (jiffies, dum->re_timeout)) { 1582 if (dum->resuming && time_after_eq (jiffies, dum->re_timeout)) {
@@ -1623,7 +1623,7 @@ static int dummy_hub_control (
1623 int retval = 0; 1623 int retval = 0;
1624 unsigned long flags; 1624 unsigned long flags;
1625 1625
1626 if (hcd->state != HC_STATE_RUNNING) 1626 if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags))
1627 return -ETIMEDOUT; 1627 return -ETIMEDOUT;
1628 1628
1629 dum = hcd_to_dummy (hcd); 1629 dum = hcd_to_dummy (hcd);
@@ -1756,9 +1756,12 @@ static int dummy_bus_suspend (struct usb_hcd *hcd)
1756{ 1756{
1757 struct dummy *dum = hcd_to_dummy (hcd); 1757 struct dummy *dum = hcd_to_dummy (hcd);
1758 1758
1759 dev_dbg (&hcd->self.root_hub->dev, "%s\n", __FUNCTION__);
1760
1759 spin_lock_irq (&dum->lock); 1761 spin_lock_irq (&dum->lock);
1760 dum->rh_state = DUMMY_RH_SUSPENDED; 1762 dum->rh_state = DUMMY_RH_SUSPENDED;
1761 set_link_state (dum); 1763 set_link_state (dum);
1764 hcd->state = HC_STATE_SUSPENDED;
1762 spin_unlock_irq (&dum->lock); 1765 spin_unlock_irq (&dum->lock);
1763 return 0; 1766 return 0;
1764} 1767}
@@ -1766,14 +1769,23 @@ static int dummy_bus_suspend (struct usb_hcd *hcd)
1766static int dummy_bus_resume (struct usb_hcd *hcd) 1769static int dummy_bus_resume (struct usb_hcd *hcd)
1767{ 1770{
1768 struct dummy *dum = hcd_to_dummy (hcd); 1771 struct dummy *dum = hcd_to_dummy (hcd);
1772 int rc = 0;
1773
1774 dev_dbg (&hcd->self.root_hub->dev, "%s\n", __FUNCTION__);
1769 1775
1770 spin_lock_irq (&dum->lock); 1776 spin_lock_irq (&dum->lock);
1771 dum->rh_state = DUMMY_RH_RUNNING; 1777 if (!test_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags)) {
1772 set_link_state (dum); 1778 dev_warn (&hcd->self.root_hub->dev, "HC isn't running!\n");
1773 if (!list_empty(&dum->urbp_list)) 1779 rc = -ENODEV;
1774 mod_timer (&dum->timer, jiffies); 1780 } else {
1781 dum->rh_state = DUMMY_RH_RUNNING;
1782 set_link_state (dum);
1783 if (!list_empty(&dum->urbp_list))
1784 mod_timer (&dum->timer, jiffies);
1785 hcd->state = HC_STATE_RUNNING;
1786 }
1775 spin_unlock_irq (&dum->lock); 1787 spin_unlock_irq (&dum->lock);
1776 return 0; 1788 return rc;
1777} 1789}
1778 1790
1779/*-------------------------------------------------------------------------*/ 1791/*-------------------------------------------------------------------------*/
@@ -1933,12 +1945,19 @@ static int dummy_hcd_remove (struct platform_device *pdev)
1933static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state) 1945static int dummy_hcd_suspend (struct platform_device *pdev, pm_message_t state)
1934{ 1946{
1935 struct usb_hcd *hcd; 1947 struct usb_hcd *hcd;
1948 struct dummy *dum;
1949 int rc = 0;
1936 1950
1937 dev_dbg (&pdev->dev, "%s\n", __FUNCTION__); 1951 dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
1938 hcd = platform_get_drvdata (pdev);
1939 1952
1940 hcd->state = HC_STATE_SUSPENDED; 1953 hcd = platform_get_drvdata (pdev);
1941 return 0; 1954 dum = hcd_to_dummy (hcd);
1955 if (dum->rh_state == DUMMY_RH_RUNNING) {
1956 dev_warn(&pdev->dev, "Root hub isn't suspended!\n");
1957 rc = -EBUSY;
1958 } else
1959 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1960 return rc;
1942} 1961}
1943 1962
1944static int dummy_hcd_resume (struct platform_device *pdev) 1963static int dummy_hcd_resume (struct platform_device *pdev)
@@ -1946,9 +1965,9 @@ static int dummy_hcd_resume (struct platform_device *pdev)
1946 struct usb_hcd *hcd; 1965 struct usb_hcd *hcd;
1947 1966
1948 dev_dbg (&pdev->dev, "%s\n", __FUNCTION__); 1967 dev_dbg (&pdev->dev, "%s\n", __FUNCTION__);
1949 hcd = platform_get_drvdata (pdev);
1950 hcd->state = HC_STATE_RUNNING;
1951 1968
1969 hcd = platform_get_drvdata (pdev);
1970 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
1952 usb_hcd_poll_rh_status (hcd); 1971 usb_hcd_poll_rh_status (hcd);
1953 return 0; 1972 return 0;
1954} 1973}