Deleted Added
full compact
musb_otg.c (184610) musb_otg.c (184824)
1/* $FreeBSD: head/sys/dev/usb2/controller/musb2_otg.c 184610 2008-11-04 02:31:03Z alfred $ */
1/* $FreeBSD: head/sys/dev/usb2/controller/musb2_otg.c 184824 2008-11-10 20:54:31Z thompsa $ */
2/*-
3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 206 unchanged lines hidden (view full) ---

216{
217 struct musbotg_softc *sc = xfer->usb2_sc;
218 uint8_t temp;
219 uint8_t use_polling;
220
221 if (!(sc->sc_flags.status_suspend)) {
222 return;
223 }
2/*-
3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.

--- 206 unchanged lines hidden (view full) ---

216{
217 struct musbotg_softc *sc = xfer->usb2_sc;
218 uint8_t temp;
219 uint8_t use_polling;
220
221 if (!(sc->sc_flags.status_suspend)) {
222 return;
223 }
224 use_polling = mtx_owned(xfer->priv_mtx) ? 1 : 0;
224 use_polling = mtx_owned(xfer->xfer_mtx) ? 1 : 0;
225
226 temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
227 temp |= MUSB2_MASK_RESUME;
228 MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
229
230 /* wait 8 milliseconds */
231 if (use_polling) {
232 /* polling */
233 DELAY(8000);
234 } else {
235 /* Wait for reset to complete. */
225
226 temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
227 temp |= MUSB2_MASK_RESUME;
228 MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
229
230 /* wait 8 milliseconds */
231 if (use_polling) {
232 /* polling */
233 DELAY(8000);
234 } else {
235 /* Wait for reset to complete. */
236 usb2_pause_mtx(&sc->sc_bus.mtx, 8);
236 usb2_pause_mtx(&sc->sc_bus.bus_mtx, 8);
237 }
238
239 temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
240 temp &= ~MUSB2_MASK_RESUME;
241 MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
242 return;
243}
244

--- 732 unchanged lines hidden (view full) ---

977
978static void
979musbotg_vbus_interrupt(struct usb2_bus *bus, uint8_t is_on)
980{
981 struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
982
983 DPRINTFN(4, "vbus = %u\n", is_on);
984
237 }
238
239 temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
240 temp &= ~MUSB2_MASK_RESUME;
241 MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
242 return;
243}
244

--- 732 unchanged lines hidden (view full) ---

977
978static void
979musbotg_vbus_interrupt(struct usb2_bus *bus, uint8_t is_on)
980{
981 struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
982
983 DPRINTFN(4, "vbus = %u\n", is_on);
984
985 mtx_lock(&sc->sc_bus.mtx);
985 USB_BUS_LOCK(&sc->sc_bus);
986 if (is_on) {
987 if (!sc->sc_flags.status_vbus) {
988 sc->sc_flags.status_vbus = 1;
989
990 /* complete root HUB interrupt endpoint */
991
992 usb2_sw_transfer(&sc->sc_root_intr,
993 &musbotg_root_intr_done);

--- 8 unchanged lines hidden (view full) ---

1002
1003 /* complete root HUB interrupt endpoint */
1004
1005 usb2_sw_transfer(&sc->sc_root_intr,
1006 &musbotg_root_intr_done);
1007 }
1008 }
1009
986 if (is_on) {
987 if (!sc->sc_flags.status_vbus) {
988 sc->sc_flags.status_vbus = 1;
989
990 /* complete root HUB interrupt endpoint */
991
992 usb2_sw_transfer(&sc->sc_root_intr,
993 &musbotg_root_intr_done);

--- 8 unchanged lines hidden (view full) ---

1002
1003 /* complete root HUB interrupt endpoint */
1004
1005 usb2_sw_transfer(&sc->sc_root_intr,
1006 &musbotg_root_intr_done);
1007 }
1008 }
1009
1010 mtx_unlock(&sc->sc_bus.mtx);
1010 USB_BUS_UNLOCK(&sc->sc_bus);
1011
1012 return;
1013}
1014
1015void
1016musbotg_interrupt(struct musbotg_softc *sc)
1017{
1018 uint16_t rx_status;
1019 uint16_t tx_status;
1020 uint8_t usb_status;
1021 uint8_t temp;
1022 uint8_t to = 2;
1023
1011
1012 return;
1013}
1014
1015void
1016musbotg_interrupt(struct musbotg_softc *sc)
1017{
1018 uint16_t rx_status;
1019 uint16_t tx_status;
1020 uint8_t usb_status;
1021 uint8_t temp;
1022 uint8_t to = 2;
1023
1024 mtx_lock(&sc->sc_bus.mtx);
1024 USB_BUS_LOCK(&sc->sc_bus);
1025
1026repeat:
1027
1028 /* read all interrupt registers */
1029 usb_status = MUSB2_READ_1(sc, MUSB2_REG_INTUSB);
1030
1031 /* read all FIFO interrupts */
1032 rx_status = MUSB2_READ_2(sc, MUSB2_REG_INTRX);

--- 78 unchanged lines hidden (view full) ---

1111 }
1112 /* poll one time regardless of FIFO status */
1113
1114 musbotg_interrupt_poll(sc);
1115
1116 if (--to)
1117 goto repeat;
1118
1025
1026repeat:
1027
1028 /* read all interrupt registers */
1029 usb_status = MUSB2_READ_1(sc, MUSB2_REG_INTUSB);
1030
1031 /* read all FIFO interrupts */
1032 rx_status = MUSB2_READ_2(sc, MUSB2_REG_INTRX);

--- 78 unchanged lines hidden (view full) ---

1111 }
1112 /* poll one time regardless of FIFO status */
1113
1114 musbotg_interrupt_poll(sc);
1115
1116 if (--to)
1117 goto repeat;
1118
1119 mtx_unlock(&sc->sc_bus.mtx);
1119 USB_BUS_UNLOCK(&sc->sc_bus);
1120
1121 return;
1122}
1123
1124static void
1125musbotg_setup_standard_chain_sub(struct musbotg_std_temp *temp)
1126{
1127 struct musbotg_td *td;

--- 140 unchanged lines hidden (view full) ---

1268static void
1269musbotg_timeout(void *arg)
1270{
1271 struct usb2_xfer *xfer = arg;
1272 struct musbotg_softc *sc = xfer->usb2_sc;
1273
1274 DPRINTFN(1, "xfer=%p\n", xfer);
1275
1120
1121 return;
1122}
1123
1124static void
1125musbotg_setup_standard_chain_sub(struct musbotg_std_temp *temp)
1126{
1127 struct musbotg_td *td;

--- 140 unchanged lines hidden (view full) ---

1268static void
1269musbotg_timeout(void *arg)
1270{
1271 struct usb2_xfer *xfer = arg;
1272 struct musbotg_softc *sc = xfer->usb2_sc;
1273
1274 DPRINTFN(1, "xfer=%p\n", xfer);
1275
1276 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1276 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1277
1278 /* transfer is transferred */
1279 musbotg_device_done(xfer, USB_ERR_TIMEOUT);
1280
1277
1278 /* transfer is transferred */
1279 musbotg_device_done(xfer, USB_ERR_TIMEOUT);
1280
1281 mtx_unlock(&sc->sc_bus.mtx);
1281 USB_BUS_UNLOCK(&sc->sc_bus);
1282
1283 return;
1284}
1285
1286static void
1287musbotg_ep_int_set(struct usb2_xfer *xfer, uint8_t on)
1288{
1289 struct musbotg_softc *sc = xfer->usb2_sc;

--- 61 unchanged lines hidden (view full) ---

1351static void
1352musbotg_root_intr_done(struct usb2_xfer *xfer,
1353 struct usb2_sw_transfer *std)
1354{
1355 struct musbotg_softc *sc = xfer->usb2_sc;
1356
1357 DPRINTFN(8, "\n");
1358
1282
1283 return;
1284}
1285
1286static void
1287musbotg_ep_int_set(struct usb2_xfer *xfer, uint8_t on)
1288{
1289 struct musbotg_softc *sc = xfer->usb2_sc;

--- 61 unchanged lines hidden (view full) ---

1351static void
1352musbotg_root_intr_done(struct usb2_xfer *xfer,
1353 struct usb2_sw_transfer *std)
1354{
1355 struct musbotg_softc *sc = xfer->usb2_sc;
1356
1357 DPRINTFN(8, "\n");
1358
1359 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1359 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1360
1361 if (std->state != USB_SW_TR_PRE_DATA) {
1362 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1363 /* transfer transferred */
1364 musbotg_device_done(xfer, std->err);
1365 }
1366 goto done;
1367 }

--- 143 unchanged lines hidden (view full) ---

1511
1512static void
1513musbotg_set_stall(struct usb2_device *udev, struct usb2_xfer *xfer,
1514 struct usb2_pipe *pipe)
1515{
1516 struct musbotg_softc *sc;
1517 uint8_t ep_no;
1518
1360
1361 if (std->state != USB_SW_TR_PRE_DATA) {
1362 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1363 /* transfer transferred */
1364 musbotg_device_done(xfer, std->err);
1365 }
1366 goto done;
1367 }

--- 143 unchanged lines hidden (view full) ---

1511
1512static void
1513musbotg_set_stall(struct usb2_device *udev, struct usb2_xfer *xfer,
1514 struct usb2_pipe *pipe)
1515{
1516 struct musbotg_softc *sc;
1517 uint8_t ep_no;
1518
1519 mtx_assert(&udev->bus->mtx, MA_OWNED);
1519 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1520
1521 DPRINTFN(4, "pipe=%p\n", pipe);
1522
1523 if (xfer) {
1524 /* cancel any ongoing transfers */
1525 musbotg_device_done(xfer, USB_ERR_STALLED);
1526 }
1527 /* set FORCESTALL */

--- 169 unchanged lines hidden (view full) ---

1697static void
1698musbotg_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1699{
1700 struct musbotg_softc *sc;
1701 struct usb2_endpoint_descriptor *ed;
1702
1703 DPRINTFN(4, "pipe=%p\n", pipe);
1704
1520
1521 DPRINTFN(4, "pipe=%p\n", pipe);
1522
1523 if (xfer) {
1524 /* cancel any ongoing transfers */
1525 musbotg_device_done(xfer, USB_ERR_STALLED);
1526 }
1527 /* set FORCESTALL */

--- 169 unchanged lines hidden (view full) ---

1697static void
1698musbotg_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1699{
1700 struct musbotg_softc *sc;
1701 struct usb2_endpoint_descriptor *ed;
1702
1703 DPRINTFN(4, "pipe=%p\n", pipe);
1704
1705 mtx_assert(&udev->bus->mtx, MA_OWNED);
1705 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1706
1707 /* check mode */
1708 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1709 /* not supported */
1710 return;
1711 }
1712 /* get softc */
1713 sc = MUSBOTG_BUS2SC(udev->bus);

--- 22 unchanged lines hidden (view full) ---

1736 uint8_t ftx;
1737
1738 DPRINTFN(1, "start\n");
1739
1740 /* set up the bus structure */
1741 sc->sc_bus.usbrev = USB_REV_2_0;
1742 sc->sc_bus.methods = &musbotg_bus_methods;
1743
1706
1707 /* check mode */
1708 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1709 /* not supported */
1710 return;
1711 }
1712 /* get softc */
1713 sc = MUSBOTG_BUS2SC(udev->bus);

--- 22 unchanged lines hidden (view full) ---

1736 uint8_t ftx;
1737
1738 DPRINTFN(1, "start\n");
1739
1740 /* set up the bus structure */
1741 sc->sc_bus.usbrev = USB_REV_2_0;
1742 sc->sc_bus.methods = &musbotg_bus_methods;
1743
1744 mtx_lock(&sc->sc_bus.mtx);
1744 USB_BUS_LOCK(&sc->sc_bus);
1745
1746 /* turn on clocks */
1747
1748 if (sc->sc_clocks_on) {
1749 (sc->sc_clocks_on) (sc->sc_clocks_arg);
1750 }
1751 /* wait a little for things to stabilise */
1745
1746 /* turn on clocks */
1747
1748 if (sc->sc_clocks_on) {
1749 (sc->sc_clocks_on) (sc->sc_clocks_arg);
1750 }
1751 /* wait a little for things to stabilise */
1752 usb2_pause_mtx(&sc->sc_bus.mtx, 1);
1752 usb2_pause_mtx(&sc->sc_bus.bus_mtx, 1);
1753
1754 /* disable all interrupts */
1755
1756 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
1757 MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
1758 MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
1759
1760 /* disable pullup */
1761
1762 musbotg_pull_common(sc, 0);
1763
1764 /* wait a little bit (10ms) */
1753
1754 /* disable all interrupts */
1755
1756 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
1757 MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
1758 MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
1759
1760 /* disable pullup */
1761
1762 musbotg_pull_common(sc, 0);
1763
1764 /* wait a little bit (10ms) */
1765 usb2_pause_mtx(&sc->sc_bus.mtx, 10);
1765 usb2_pause_mtx(&sc->sc_bus.bus_mtx, 10);
1766
1767 /* disable double packet buffering */
1768 MUSB2_WRITE_2(sc, MUSB2_REG_RXDBDIS, 0xFFFF);
1769 MUSB2_WRITE_2(sc, MUSB2_REG_TXDBDIS, 0xFFFF);
1770
1771 /* enable HighSpeed and ISO Update flags */
1772
1773 MUSB2_WRITE_1(sc, MUSB2_REG_POWER,

--- 92 unchanged lines hidden (view full) ---

1866
1867 /* turn on default interrupts */
1868
1869 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE,
1870 MUSB2_MASK_IRESET);
1871
1872 musbotg_clocks_off(sc);
1873
1766
1767 /* disable double packet buffering */
1768 MUSB2_WRITE_2(sc, MUSB2_REG_RXDBDIS, 0xFFFF);
1769 MUSB2_WRITE_2(sc, MUSB2_REG_TXDBDIS, 0xFFFF);
1770
1771 /* enable HighSpeed and ISO Update flags */
1772
1773 MUSB2_WRITE_1(sc, MUSB2_REG_POWER,

--- 92 unchanged lines hidden (view full) ---

1866
1867 /* turn on default interrupts */
1868
1869 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE,
1870 MUSB2_MASK_IRESET);
1871
1872 musbotg_clocks_off(sc);
1873
1874 mtx_unlock(&sc->sc_bus.mtx);
1874 USB_BUS_UNLOCK(&sc->sc_bus);
1875
1876 /* catch any lost interrupts */
1877
1878 musbotg_do_poll(&sc->sc_bus);
1879
1880 return (0); /* success */
1881}
1882
1883void
1884musbotg_uninit(struct musbotg_softc *sc)
1885{
1875
1876 /* catch any lost interrupts */
1877
1878 musbotg_do_poll(&sc->sc_bus);
1879
1880 return (0); /* success */
1881}
1882
1883void
1884musbotg_uninit(struct musbotg_softc *sc)
1885{
1886 mtx_lock(&sc->sc_bus.mtx);
1886 USB_BUS_LOCK(&sc->sc_bus);
1887
1888 /* disable all interrupts */
1889 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
1890 MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
1891 MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
1892
1893 sc->sc_flags.port_powered = 0;
1894 sc->sc_flags.status_vbus = 0;
1895 sc->sc_flags.status_bus_reset = 0;
1896 sc->sc_flags.status_suspend = 0;
1897 sc->sc_flags.change_suspend = 0;
1898 sc->sc_flags.change_connect = 1;
1899
1900 musbotg_pull_down(sc);
1901 musbotg_clocks_off(sc);
1887
1888 /* disable all interrupts */
1889 MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
1890 MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
1891 MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
1892
1893 sc->sc_flags.port_powered = 0;
1894 sc->sc_flags.status_vbus = 0;
1895 sc->sc_flags.status_bus_reset = 0;
1896 sc->sc_flags.status_suspend = 0;
1897 sc->sc_flags.change_suspend = 0;
1898 sc->sc_flags.change_connect = 1;
1899
1900 musbotg_pull_down(sc);
1901 musbotg_clocks_off(sc);
1902 mtx_unlock(&sc->sc_bus.mtx);
1902 USB_BUS_UNLOCK(&sc->sc_bus);
1903
1904 return;
1905}
1906
1907void
1908musbotg_suspend(struct musbotg_softc *sc)
1909{
1910 return;

--- 5 unchanged lines hidden (view full) ---

1916 return;
1917}
1918
1919static void
1920musbotg_do_poll(struct usb2_bus *bus)
1921{
1922 struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
1923
1903
1904 return;
1905}
1906
1907void
1908musbotg_suspend(struct musbotg_softc *sc)
1909{
1910 return;

--- 5 unchanged lines hidden (view full) ---

1916 return;
1917}
1918
1919static void
1920musbotg_do_poll(struct usb2_bus *bus)
1921{
1922 struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
1923
1924 mtx_lock(&sc->sc_bus.mtx);
1924 USB_BUS_LOCK(&sc->sc_bus);
1925 musbotg_interrupt_poll(sc);
1926 musbotg_root_ctrl_poll(sc);
1925 musbotg_interrupt_poll(sc);
1926 musbotg_root_ctrl_poll(sc);
1927 mtx_unlock(&sc->sc_bus.mtx);
1927 USB_BUS_UNLOCK(&sc->sc_bus);
1928 return;
1929}
1930
1931/*------------------------------------------------------------------------*
1932 * musbotg bulk support
1933 *------------------------------------------------------------------------*/
1934static void
1935musbotg_device_bulk_open(struct usb2_xfer *xfer)

--- 352 unchanged lines hidden (view full) ---

2288musbotg_root_ctrl_done(struct usb2_xfer *xfer,
2289 struct usb2_sw_transfer *std)
2290{
2291 struct musbotg_softc *sc = xfer->usb2_sc;
2292 uint16_t value;
2293 uint16_t index;
2294 uint8_t use_polling;
2295
1928 return;
1929}
1930
1931/*------------------------------------------------------------------------*
1932 * musbotg bulk support
1933 *------------------------------------------------------------------------*/
1934static void
1935musbotg_device_bulk_open(struct usb2_xfer *xfer)

--- 352 unchanged lines hidden (view full) ---

2288musbotg_root_ctrl_done(struct usb2_xfer *xfer,
2289 struct usb2_sw_transfer *std)
2290{
2291 struct musbotg_softc *sc = xfer->usb2_sc;
2292 uint16_t value;
2293 uint16_t index;
2294 uint8_t use_polling;
2295
2296 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
2296 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
2297
2298 if (std->state != USB_SW_TR_SETUP) {
2299 if (std->state == USB_SW_TR_PRE_CALLBACK) {
2300 /* transfer transferred */
2301 musbotg_device_done(xfer, std->err);
2302 }
2303 goto done;
2304 }
2305 /* buffer reset */
2306 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
2307 std->len = 0;
2308
2309 value = UGETW(std->req.wValue);
2310 index = UGETW(std->req.wIndex);
2311
2297
2298 if (std->state != USB_SW_TR_SETUP) {
2299 if (std->state == USB_SW_TR_PRE_CALLBACK) {
2300 /* transfer transferred */
2301 musbotg_device_done(xfer, std->err);
2302 }
2303 goto done;
2304 }
2305 /* buffer reset */
2306 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
2307 std->len = 0;
2308
2309 value = UGETW(std->req.wValue);
2310 index = UGETW(std->req.wIndex);
2311
2312 use_polling = mtx_owned(xfer->priv_mtx) ? 1 : 0;
2312 use_polling = mtx_owned(xfer->xfer_mtx) ? 1 : 0;
2313
2314 /* demultiplex the control request */
2315
2316 switch (std->req.bmRequestType) {
2317 case UT_READ_DEVICE:
2318 switch (std->req.bRequest) {
2319 case UR_GET_DESCRIPTOR:
2320 goto tr_handle_get_descriptor;

--- 625 unchanged lines hidden ---
2313
2314 /* demultiplex the control request */
2315
2316 switch (std->req.bmRequestType) {
2317 case UT_READ_DEVICE:
2318 switch (std->req.bRequest) {
2319 case UR_GET_DESCRIPTOR:
2320 goto tr_handle_get_descriptor;

--- 625 unchanged lines hidden ---