From owner-p4-projects@FreeBSD.ORG Tue Aug 11 19:08:28 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 72C501065673; Tue, 11 Aug 2009 19:08:28 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F0F341065672 for ; Tue, 11 Aug 2009 19:08:27 +0000 (UTC) (envelope-from syl@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id DF5398FC43 for ; Tue, 11 Aug 2009 19:08:27 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n7BJ8RW5066207 for ; Tue, 11 Aug 2009 19:08:27 GMT (envelope-from syl@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n7BJ8Rku066204 for perforce@freebsd.org; Tue, 11 Aug 2009 19:08:27 GMT (envelope-from syl@FreeBSD.org) Date: Tue, 11 Aug 2009 19:08:27 GMT Message-Id: <200908111908.n7BJ8Rku066204@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to syl@FreeBSD.org using -f From: Sylvestre Gallon To: Perforce Change Reviews Cc: Subject: PERFORCE change 167221 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 11 Aug 2009 19:08:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=167221 Change 167221 by syl@syl_atuin on 2009/08/11 19:08:11 Add support for clock pull{up|down}... Implement generic_set_port_feature. Implement generic_get_port_status. The old roothub_exec code is commented in at91dci.c until I have finish the new implmentation. Affected files ... .. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/at91dci.c#11 edit .. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/usb_controller.h#9 edit .. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/usb_roothub_exec.c#6 edit Differences ... ==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/at91dci.c#11 (text+ko) ==== @@ -1673,15 +1673,18 @@ struct usb_device_request *req, const void **pptr, uint16_t *plength) { struct at91dci_softc *sc = AT9100_DCI_BUS2SC(udev->bus); - const void *ptr; - uint16_t len; - uint16_t value; - uint16_t index; - usb_error_t err; + struct usb_roothub_fops fops; - USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); + bzero(&fops, sizeof(struct usb_roothub_fops)); + fops.handle_clocks_on = (usb_clocks_fops_t)&at91dci_clocks_on; + fops.handle_clocks_off = (usb_clocks_fops_t)&at91dci_clocks_off; + fops.handle_pull_up = (usb_clocks_fops_t)&at91dci_pull_up; + fops.handle_pull_down = (usb_clocks_fops_t)&at91dci_pull_down; + fops.handle_wakeup_peer = (usb_clocks_fops_t)&at91dci_wakeup_peer; + return generic_roothub_exec((struct usb_generic_softc *)sc, &fops, req, + pptr, plength); +/* USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED); - /* buffer reset */ ptr = (const void *)&sc->sc_hub_temp; len = 0; err = 0; @@ -1689,7 +1692,6 @@ value = UGETW(req->wValue); index = UGETW(req->wIndex); - /* demultiplex the control request */ switch (req->bmRequestType) { case UT_READ_DEVICE: @@ -1712,9 +1714,9 @@ case UR_SET_CONFIG: goto tr_handle_set_config; case UR_CLEAR_FEATURE: - goto tr_valid; /* nop */ + goto tr_valid; case UR_SET_DESCRIPTOR: - goto tr_valid; /* nop */ + goto tr_valid; case UR_SET_FEATURE: default: goto tr_stalled; @@ -1744,7 +1746,7 @@ } break; case UR_SYNCH_FRAME: - goto tr_valid; /* nop */ + goto tr_valid; default: goto tr_stalled; } @@ -1764,7 +1766,7 @@ case UR_SET_INTERFACE: goto tr_handle_set_interface; case UR_CLEAR_FEATURE: - goto tr_valid; /* nop */ + goto tr_valid; case UR_SET_FEATURE: default: goto tr_stalled; @@ -1784,12 +1786,10 @@ case UT_WRITE_CLASS_INTERFACE: case UT_WRITE_VENDOR_INTERFACE: - /* XXX forward */ break; case UT_READ_CLASS_INTERFACE: case UT_READ_VENDOR_INTERFACE: - /* XXX forward */ break; case UT_WRITE_CLASS_DEVICE: @@ -1865,17 +1865,17 @@ goto tr_valid; case UDESC_STRING: switch (value & 0xff) { - case 0: /* Language table */ + case 0: len = sizeof(at91dci_langtab); ptr = (const void *)&at91dci_langtab; goto tr_valid; - case 1: /* Vendor */ + case 1: len = sizeof(at91dci_vendor); ptr = (const void *)&at91dci_vendor; goto tr_valid; - case 2: /* Product */ + case 2: len = sizeof(at91dci_product); ptr = (const void *)&at91dci_product; goto tr_valid; @@ -1952,7 +1952,6 @@ case UHF_C_PORT_ENABLE: case UHF_C_PORT_OVER_CURRENT: case UHF_C_PORT_RESET: - /* nops */ break; case UHF_PORT_POWER: sc->sc_flags.port_powered = 0; @@ -1985,7 +1984,6 @@ case UHF_PORT_RESET: case UHF_PORT_TEST: case UHF_PORT_INDICATOR: - /* nops */ break; case UHF_PORT_POWER: sc->sc_flags.port_powered = 1; @@ -2011,8 +2009,6 @@ at91dci_clocks_off(sc); } - /* Select FULL-speed and Device Side Mode */ - value = UPS_PORT_MODE_DEVICE; if (sc->sc_flags.port_powered) { @@ -2037,7 +2033,6 @@ if (sc->sc_flags.status_vbus && sc->sc_flags.status_bus_reset) { - /* reset endpoint flags */ bzero(sc->sc_ep_flags, sizeof(sc->sc_ep_flags)); } } @@ -2062,7 +2057,7 @@ done: *plength = len; *pptr = ptr; - return (err); + return (err);*/ } static void ==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/usb_controller.h#9 (text+ko) ==== @@ -38,6 +38,7 @@ struct usb_endpoint; struct usb_page_cache; struct usb_setup_params; +struct usb_roothub_fops; struct usb_hw_ep_profile; struct usb_generic_softc; struct usb_fs_isoc_schedule; @@ -208,7 +209,8 @@ struct usb_port_status ps; }; -typedef usb_error_t (*usb_roothub_fops_t)(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index); +typedef usb_error_t (*usb_roothub_fops_t)(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index); +typedef usb_error_t (*usb_clocks_fops_t)(struct usb_generic_softc *sc); struct usb_roothub_fops { usb_roothub_fops_t handle_get_descriptor; @@ -230,6 +232,11 @@ usb_roothub_fops_t handle_get_port_status; usb_roothub_fops_t handle_get_class_descriptor; usb_roothub_fops_t handle_get_class_status; + usb_clocks_fops_t handle_clocks_on; + usb_clocks_fops_t handle_clocks_off; + usb_clocks_fops_t handle_pull_up; + usb_clocks_fops_t handle_pull_down; + usb_clocks_fops_t handle_wakeup_peer; }; /* prototypes */ ==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/usb_roothub_exec.c#6 (text+ko) ==== @@ -70,10 +70,16 @@ struct usb_generic_flags sc_flags; }; +#define SAFE_OPS(fops, field, err) \ + if (fops->field == NULL) \ + err = generic_roothub_fops.field(sc, fops, &len, &value, &index); \ + else \ + err = fops->field(sc, fops, &len, &value, &index) + static struct usb_roothub_fops generic_roothub_fops; static usb_error_t -generic_get_descriptor(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_descriptor(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { switch ((*value) >> 8) { case UDESC_DEVICE: @@ -109,7 +115,7 @@ } static usb_error_t -generic_get_config(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_config(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 1; sc->sc_hub_temp.wValue[0] = sc->sc_conf; @@ -117,7 +123,7 @@ } static usb_error_t -generic_get_status(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_status(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 2; USETW(sc->sc_hub_temp.wValue, UDS_SELF_POWERED); @@ -125,7 +131,7 @@ } static usb_error_t -generic_set_address(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_address(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { if ((*value) & 0xff00) { return (USB_ERR_STALLED); @@ -135,7 +141,7 @@ } static usb_error_t -generic_set_config(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_config(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { if ((*value) >= 2) { return (USB_ERR_STALLED); @@ -145,31 +151,31 @@ } static usb_error_t -generic_clear_halt(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_clear_halt(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { return (0); } static usb_error_t -generic_clear_wakeup(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_clear_wakeup(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { return (0); } static usb_error_t -generic_set_halt(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_halt(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { return (0); } static usb_error_t -generic_set_wakeup(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_wakeup(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { return (0); } static usb_error_t -generic_get_ep_status(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_ep_status(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 2; USETW(sc->sc_hub_temp.wValue, 0); @@ -177,13 +183,13 @@ } static usb_error_t -generic_set_interface(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_interface(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { return (0); } static usb_error_t -generic_get_interface(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_interface(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 1; sc->sc_hub_temp.wValue[0] = 0; @@ -191,7 +197,7 @@ } static usb_error_t -generic_get_iface_status(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_iface_status(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 2; USETW(sc->sc_hub_temp.wValue, 0); @@ -199,7 +205,7 @@ } static usb_error_t -generic_clear_port_feature(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_clear_port_feature(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { if ((*index) != 1) { return (USB_ERR_STALLED); @@ -208,7 +214,8 @@ switch (*value) { case UHF_PORT_SUSPEND: - /* XXX xxxdci_wakeup_peer */ + if (fops->handle_wakeup_peer) + fops->handle_wakeup_peer(sc); break; case UHF_PORT_ENABLE: @@ -223,7 +230,10 @@ break; case UHF_PORT_POWER: sc->sc_flags.port_powered = 0; - /* XXX Pull down clock off */ + if (fops->handle_pull_down) + fops->handle_pull_down(sc); + if (fops->handle_clocks_off) + fops->handle_clocks_off(sc); break; case UHF_C_PORT_CONNECTION: sc->sc_flags.change_connect = 0; @@ -238,27 +248,95 @@ } static usb_error_t -generic_set_port_feature(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_set_port_feature(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { + if ((*index) != 1) { + return (USB_ERR_IOERROR); + } + DPRINTFN(9, "UR_SET_PORT_FEATURE"); + + switch (*value) { + case UHF_PORT_ENABLE: + sc->sc_flags.port_enabled = 1; + break; + case UHF_PORT_SUSPEND: + case UHF_PORT_RESET: + case UHF_PORT_TEST: + case UHF_PORT_INDICATOR: + break; + case UHF_PORT_POWER: + sc->sc_flags.port_powered = 1; + break; + default: + return (USB_ERR_IOERROR); + } return (0); } static usb_error_t -generic_get_tt_state(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_tt_state(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 2; USETW(sc->sc_hub_temp.wValue, 0); return (0); } +/* XXX at91 Need another func*/ static usb_error_t -generic_get_port_status(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_port_status(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { + DPRINTFN(9, "UR_GET_PORT_STATUS"); + + if (*index != 1) { + return (USB_ERR_STALLED); + } + if (sc->sc_flags.status_vbus) { + if (fops->handle_clocks_on) + fops->handle_clocks_on(sc); + if (fops->handle_pull_up) + fops->handle_pull_up(sc); + } else { + if (fops->handle_clocks_off) + fops->handle_clocks_off(sc); + if (fops->handle_pull_down) + fops->handle_pull_down(sc); + } + + /* Select Full-Speend and Device Side Mode */ + + *value = UPS_PORT_MODE_DEVICE; + + if (sc->sc_flags.port_powered) { + *value |= UPS_PORT_POWER; + } + if (sc->sc_flags.port_enabled) { + *value |= UPS_PORT_ENABLED; + } + if (sc->sc_flags.status_vbus && + sc->sc_flags.status_bus_reset) { + *value |= UPS_CURRENT_CONNECT_STATUS; + } + if (sc->sc_flags.status_suspend) { + *value |= UPS_SUSPEND; + } + USETW(sc->sc_hub_temp.ps.wPortStatus, *value); + + *value = 0; + + if (sc->sc_flags.change_connect) { + *value |= UPS_C_CONNECT_STATUS; + } + if (sc->sc_flags.change_suspend) { + *value |= UPS_C_SUSPEND; + } + USETW(sc->sc_hub_temp.ps.wPortChange, *value); + *len = sizeof(sc->sc_hub_temp.ps); + return (0); } static usb_error_t -generic_get_class_descriptor(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_class_descriptor(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { if ((*value) & 0xff) { return (USB_ERR_STALLED); @@ -268,19 +346,13 @@ } static usb_error_t -generic_get_class_status(struct usb_generic_softc *sc, uint16_t *len, uint16_t *value, uint16_t *index) +generic_get_class_status(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, uint16_t *len, uint16_t *value, uint16_t *index) { *len = 2; USETW(sc->sc_hub_temp.wValue, 0); return (0); } -#define SAFE_OPS(fops, field, err) \ - if (fops->field == NULL) \ - err = generic_roothub_fops.field(sc, &len, &value, &index); \ - else \ - err = fops->field(sc, &len, &value, &index) - usb_error_t generic_roothub_exec(struct usb_generic_softc *sc, struct usb_roothub_fops *fops, struct usb_device_request *req, const void **pptr, uint16_t *plength) @@ -514,5 +586,10 @@ &generic_get_port_status, &generic_get_class_descriptor, &generic_get_class_status, + NULL, + NULL, + NULL, + NULL, + NULL, };