提交 d47e59b8 编写于 作者: H Hans de Goede 提交者: Gerd Hoffmann

usb: Make port wakeup and complete ops take a USBPort instead of a Device

This makes them consistent with the attach and detach ops, and in general
it makes sense to make portops take a port as argument. This also makes
adding support for a companion controller easier / cleaner.

[ kraxel: fix usb-musb.c build ]
Signed-off-by: NHans de Goede <hdegoede@redhat.com>
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 ae60fea9
...@@ -1111,7 +1111,7 @@ static int ehci_buffer_rw(EHCIQueue *q, int bytes, int rw) ...@@ -1111,7 +1111,7 @@ static int ehci_buffer_rw(EHCIQueue *q, int bytes, int rw)
return 0; return 0;
} }
static void ehci_async_complete_packet(USBDevice *dev, USBPacket *packet) static void ehci_async_complete_packet(USBPort *port, USBPacket *packet)
{ {
EHCIQueue *q = container_of(packet, EHCIQueue, packet); EHCIQueue *q = container_of(packet, EHCIQueue, packet);
......
...@@ -246,10 +246,10 @@ static void usb_hub_detach(USBPort *port1) ...@@ -246,10 +246,10 @@ static void usb_hub_detach(USBPort *port1)
} }
} }
static void usb_hub_wakeup(USBDevice *dev) static void usb_hub_wakeup(USBPort *port1)
{ {
USBHubState *s = dev->port->opaque; USBHubState *s = port1->opaque;
USBHubPort *port = &s->ports[dev->port->index]; USBHubPort *port = &s->ports[port1->index];
if (port->wPortStatus & PORT_STAT_SUSPEND) { if (port->wPortStatus & PORT_STAT_SUSPEND) {
port->wPortChange |= PORT_STAT_C_SUSPEND; port->wPortChange |= PORT_STAT_C_SUSPEND;
...@@ -257,9 +257,9 @@ static void usb_hub_wakeup(USBDevice *dev) ...@@ -257,9 +257,9 @@ static void usb_hub_wakeup(USBDevice *dev)
} }
} }
static void usb_hub_complete(USBDevice *dev, USBPacket *packet) static void usb_hub_complete(USBPort *port, USBPacket *packet)
{ {
USBHubState *s = dev->port->opaque; USBHubState *s = port->opaque;
/* /*
* Just pass it along upstream for now. * Just pass it along upstream for now.
......
...@@ -261,7 +261,7 @@ ...@@ -261,7 +261,7 @@
static void musb_attach(USBPort *port); static void musb_attach(USBPort *port);
static void musb_detach(USBPort *port); static void musb_detach(USBPort *port);
static void musb_schedule_cb(USBDevice *dev, USBPacket *p); static void musb_schedule_cb(USBPort *port, USBPacket *p);
static void musb_device_destroy(USBBus *bus, USBDevice *dev); static void musb_device_destroy(USBBus *bus, USBDevice *dev);
static USBPortOps musb_port_ops = { static USBPortOps musb_port_ops = {
...@@ -517,7 +517,7 @@ static void musb_cb_tick1(void *opaque) ...@@ -517,7 +517,7 @@ static void musb_cb_tick1(void *opaque)
#define musb_cb_tick (dir ? musb_cb_tick1 : musb_cb_tick0) #define musb_cb_tick (dir ? musb_cb_tick1 : musb_cb_tick0)
static void musb_schedule_cb(USBDevice *dev, USBPacket *packey) static void musb_schedule_cb(USBPort *port, USBPacket *packey)
{ {
MUSBPacket *p = container_of(packey, MUSBPacket, p); MUSBPacket *p = container_of(packey, MUSBPacket, p);
MUSBEndPoint *ep = p->ep; MUSBEndPoint *ep = p->ep;
...@@ -615,7 +615,7 @@ static void musb_packet(MUSBState *s, MUSBEndPoint *ep, ...@@ -615,7 +615,7 @@ static void musb_packet(MUSBState *s, MUSBEndPoint *ep,
} }
ep->status[dir] = ret; ep->status[dir] = ret;
musb_schedule_cb(s->port.dev, &ep->packey[dir].p); musb_schedule_cb(&s->port, &ep->packey[dir].p);
} }
static void musb_tx_packet_complete(USBPacket *packey, void *opaque) static void musb_tx_packet_complete(USBPacket *packey, void *opaque)
......
...@@ -367,15 +367,13 @@ static void ohci_detach(USBPort *port1) ...@@ -367,15 +367,13 @@ static void ohci_detach(USBPort *port1)
ohci_set_interrupt(s, OHCI_INTR_RHSC); ohci_set_interrupt(s, OHCI_INTR_RHSC);
} }
static void ohci_wakeup(USBDevice *dev) static void ohci_wakeup(USBPort *port1)
{ {
USBBus *bus = usb_bus_from_device(dev); OHCIState *s = port1->opaque;
OHCIState *s = container_of(bus, OHCIState, bus); OHCIPort *port = &s->rhport[port1->index];
int portnum = dev->port->index;
OHCIPort *port = &s->rhport[portnum];
uint32_t intr = 0; uint32_t intr = 0;
if (port->ctrl & OHCI_PORT_PSS) { if (port->ctrl & OHCI_PORT_PSS) {
DPRINTF("usb-ohci: port %d: wakeup\n", portnum); DPRINTF("usb-ohci: port %d: wakeup\n", port1->index);
port->ctrl |= OHCI_PORT_PSSC; port->ctrl |= OHCI_PORT_PSSC;
port->ctrl &= ~OHCI_PORT_PSS; port->ctrl &= ~OHCI_PORT_PSS;
intr = OHCI_INTR_RHSC; intr = OHCI_INTR_RHSC;
...@@ -602,7 +600,7 @@ static void ohci_copy_iso_td(OHCIState *ohci, ...@@ -602,7 +600,7 @@ static void ohci_copy_iso_td(OHCIState *ohci,
static void ohci_process_lists(OHCIState *ohci, int completion); static void ohci_process_lists(OHCIState *ohci, int completion);
static void ohci_async_complete_packet(USBDevice *dev, USBPacket *packet) static void ohci_async_complete_packet(USBPort *port, USBPacket *packet)
{ {
OHCIState *ohci = container_of(packet, OHCIState, usb_packet); OHCIState *ohci = container_of(packet, OHCIState, usb_packet);
#ifdef DEBUG_PACKET #ifdef DEBUG_PACKET
......
...@@ -620,11 +620,10 @@ static void uhci_detach(USBPort *port1) ...@@ -620,11 +620,10 @@ static void uhci_detach(USBPort *port1)
uhci_resume(s); uhci_resume(s);
} }
static void uhci_wakeup(USBDevice *dev) static void uhci_wakeup(USBPort *port1)
{ {
USBBus *bus = usb_bus_from_device(dev); UHCIState *s = port1->opaque;
UHCIState *s = container_of(bus, UHCIState, bus); UHCIPort *port = &s->ports[port1->index];
UHCIPort *port = s->ports + dev->port->index;
if (port->ctrl & UHCI_PORT_SUSPEND && !(port->ctrl & UHCI_PORT_RD)) { if (port->ctrl & UHCI_PORT_SUSPEND && !(port->ctrl & UHCI_PORT_RD)) {
port->ctrl |= UHCI_PORT_RD; port->ctrl |= UHCI_PORT_RD;
...@@ -657,7 +656,7 @@ static int uhci_broadcast_packet(UHCIState *s, USBPacket *p) ...@@ -657,7 +656,7 @@ static int uhci_broadcast_packet(UHCIState *s, USBPacket *p)
return ret; return ret;
} }
static void uhci_async_complete(USBDevice *dev, USBPacket *packet); static void uhci_async_complete(USBPort *port, USBPacket *packet);
static void uhci_process_frame(UHCIState *s); static void uhci_process_frame(UHCIState *s);
/* return -1 if fatal error (frame must be stopped) /* return -1 if fatal error (frame must be stopped)
...@@ -849,7 +848,7 @@ done: ...@@ -849,7 +848,7 @@ done:
return len; return len;
} }
static void uhci_async_complete(USBDevice *dev, USBPacket *packet) static void uhci_async_complete(USBPort *port, USBPacket *packet)
{ {
UHCIAsync *async = container_of(packet, UHCIAsync, packet); UHCIAsync *async = container_of(packet, UHCIAsync, packet);
UHCIState *s = async->uhci; UHCIState *s = async->uhci;
......
...@@ -52,7 +52,7 @@ void usb_attach(USBPort *port, USBDevice *dev) ...@@ -52,7 +52,7 @@ void usb_attach(USBPort *port, USBDevice *dev)
void usb_wakeup(USBDevice *dev) void usb_wakeup(USBDevice *dev)
{ {
if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) { if (dev->remote_wakeup && dev->port && dev->port->ops->wakeup) {
dev->port->ops->wakeup(dev); dev->port->ops->wakeup(dev->port);
} }
} }
...@@ -335,7 +335,7 @@ void usb_packet_complete(USBDevice *dev, USBPacket *p) ...@@ -335,7 +335,7 @@ void usb_packet_complete(USBDevice *dev, USBPacket *p)
{ {
/* Note: p->owner != dev is possible in case dev is a hub */ /* Note: p->owner != dev is possible in case dev is a hub */
assert(p->owner != NULL); assert(p->owner != NULL);
dev->port->ops->complete(dev, p); dev->port->ops->complete(dev->port, p);
p->owner = NULL; p->owner = NULL;
} }
......
...@@ -252,8 +252,13 @@ struct USBDeviceInfo { ...@@ -252,8 +252,13 @@ struct USBDeviceInfo {
typedef struct USBPortOps { typedef struct USBPortOps {
void (*attach)(USBPort *port); void (*attach)(USBPort *port);
void (*detach)(USBPort *port); void (*detach)(USBPort *port);
void (*wakeup)(USBDevice *dev); void (*wakeup)(USBPort *port);
void (*complete)(USBDevice *dev, USBPacket *p); /*
* Note that port->dev will be different then the device from which
* the packet originated when a hub is involved, if you want the orginating
* device use p->owner
*/
void (*complete)(USBPort *port, USBPacket *p);
} USBPortOps; } USBPortOps;
/* USB port on which a device can be connected */ /* USB port on which a device can be connected */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册