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 --- |