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

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

230static void
231uss820dci_rem_wakeup_set(struct usb2_device *udev, uint8_t is_on)
232{
233 struct uss820dci_softc *sc;
234 uint8_t temp;
235
236 DPRINTFN(5, "is_on=%u\n", is_on);
237
2/*-
3 * Copyright (c) 2008 Hans Petter Selasky <hselasky@freebsd.org>
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright

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

230static void
231uss820dci_rem_wakeup_set(struct usb2_device *udev, uint8_t is_on)
232{
233 struct uss820dci_softc *sc;
234 uint8_t temp;
235
236 DPRINTFN(5, "is_on=%u\n", is_on);
237
238 mtx_assert(&udev->bus->mtx, MA_OWNED);
238 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
239
240 sc = USS820_DCI_BUS2SC(udev->bus);
241
242 temp = USS820_READ_1(sc, USS820_SCR);
243
244 if (is_on) {
245 temp |= USS820_SCR_RWUPE;
246 } else {

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

750}
751
752void
753uss820dci_interrupt(struct uss820dci_softc *sc)
754{
755 uint8_t ssr;
756 uint8_t event;
757
239
240 sc = USS820_DCI_BUS2SC(udev->bus);
241
242 temp = USS820_READ_1(sc, USS820_SCR);
243
244 if (is_on) {
245 temp |= USS820_SCR_RWUPE;
246 } else {

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

750}
751
752void
753uss820dci_interrupt(struct uss820dci_softc *sc)
754{
755 uint8_t ssr;
756 uint8_t event;
757
758 mtx_lock(&sc->sc_bus.mtx);
758 USB_BUS_LOCK(&sc->sc_bus);
759
760 ssr = USS820_READ_1(sc, USS820_SSR);
761
762 ssr &= (USS820_SSR_SUSPEND |
763 USS820_SSR_RESUME |
764 USS820_SSR_RESET);
765
766 /* acknowledge all interrupts */

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

821 uss820dci_update_shared_1(sc, USS820_SBI, 0, 0);
822
823 /* acknowledge all SBI1 interrupts */
824 uss820dci_update_shared_1(sc, USS820_SBI1, 0, 0);
825
826 /* poll all active transfers */
827 uss820dci_interrupt_poll(sc);
828
759
760 ssr = USS820_READ_1(sc, USS820_SSR);
761
762 ssr &= (USS820_SSR_SUSPEND |
763 USS820_SSR_RESUME |
764 USS820_SSR_RESET);
765
766 /* acknowledge all interrupts */

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

821 uss820dci_update_shared_1(sc, USS820_SBI, 0, 0);
822
823 /* acknowledge all SBI1 interrupts */
824 uss820dci_update_shared_1(sc, USS820_SBI1, 0, 0);
825
826 /* poll all active transfers */
827 uss820dci_interrupt_poll(sc);
828
829 mtx_unlock(&sc->sc_bus.mtx);
829 USB_BUS_UNLOCK(&sc->sc_bus);
830
831 return;
832}
833
834static void
835uss820dci_setup_standard_chain_sub(struct uss820_std_temp *temp)
836{
837 struct uss820dci_td *td;

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

988static void
989uss820dci_timeout(void *arg)
990{
991 struct usb2_xfer *xfer = arg;
992 struct uss820dci_softc *sc = xfer->usb2_sc;
993
994 DPRINTF("xfer=%p\n", xfer);
995
830
831 return;
832}
833
834static void
835uss820dci_setup_standard_chain_sub(struct uss820_std_temp *temp)
836{
837 struct uss820dci_td *td;

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

988static void
989uss820dci_timeout(void *arg)
990{
991 struct usb2_xfer *xfer = arg;
992 struct uss820dci_softc *sc = xfer->usb2_sc;
993
994 DPRINTF("xfer=%p\n", xfer);
995
996 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
996 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
997
998 /* transfer is transferred */
999 uss820dci_device_done(xfer, USB_ERR_TIMEOUT);
1000
997
998 /* transfer is transferred */
999 uss820dci_device_done(xfer, USB_ERR_TIMEOUT);
1000
1001 mtx_unlock(&sc->sc_bus.mtx);
1001 USB_BUS_UNLOCK(&sc->sc_bus);
1002
1003 return;
1004}
1005
1006static void
1007uss820dci_intr_set(struct usb2_xfer *xfer, uint8_t set)
1008{
1009 struct uss820dci_softc *sc = xfer->usb2_sc;

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

1073static void
1074uss820dci_root_intr_done(struct usb2_xfer *xfer,
1075 struct usb2_sw_transfer *std)
1076{
1077 struct uss820dci_softc *sc = xfer->usb2_sc;
1078
1079 DPRINTFN(9, "\n");
1080
1002
1003 return;
1004}
1005
1006static void
1007uss820dci_intr_set(struct usb2_xfer *xfer, uint8_t set)
1008{
1009 struct uss820dci_softc *sc = xfer->usb2_sc;

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

1073static void
1074uss820dci_root_intr_done(struct usb2_xfer *xfer,
1075 struct usb2_sw_transfer *std)
1076{
1077 struct uss820dci_softc *sc = xfer->usb2_sc;
1078
1079 DPRINTFN(9, "\n");
1080
1081 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1081 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1082
1083 if (std->state != USB_SW_TR_PRE_DATA) {
1084 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1085 /* transfer transferred */
1086 uss820dci_device_done(xfer, std->err);
1087 }
1088 goto done;
1089 }

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

1210 * uss820dci_device_done
1211 *
1212 * NOTE: this function can be called more than one time on the
1213 * same USB transfer!
1214 *------------------------------------------------------------------------*/
1215static void
1216uss820dci_device_done(struct usb2_xfer *xfer, usb2_error_t error)
1217{
1082
1083 if (std->state != USB_SW_TR_PRE_DATA) {
1084 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1085 /* transfer transferred */
1086 uss820dci_device_done(xfer, std->err);
1087 }
1088 goto done;
1089 }

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

1210 * uss820dci_device_done
1211 *
1212 * NOTE: this function can be called more than one time on the
1213 * same USB transfer!
1214 *------------------------------------------------------------------------*/
1215static void
1216uss820dci_device_done(struct usb2_xfer *xfer, usb2_error_t error)
1217{
1218 mtx_assert(xfer->usb2_mtx, MA_OWNED);
1218 USB_BUS_LOCK_ASSERT(xfer->udev->bus, MA_OWNED);
1219
1220 DPRINTFN(2, "xfer=%p, pipe=%p, error=%d\n",
1221 xfer, xfer->pipe, error);
1222
1223 if (xfer->flags_int.usb2_mode == USB_MODE_DEVICE) {
1224 uss820dci_intr_set(xfer, 0);
1225 }
1226 /* dequeue transfer and start next transfer */

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

1233 struct usb2_pipe *pipe)
1234{
1235 struct uss820dci_softc *sc;
1236 uint8_t ep_no;
1237 uint8_t ep_type;
1238 uint8_t ep_dir;
1239 uint8_t temp;
1240
1219
1220 DPRINTFN(2, "xfer=%p, pipe=%p, error=%d\n",
1221 xfer, xfer->pipe, error);
1222
1223 if (xfer->flags_int.usb2_mode == USB_MODE_DEVICE) {
1224 uss820dci_intr_set(xfer, 0);
1225 }
1226 /* dequeue transfer and start next transfer */

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

1233 struct usb2_pipe *pipe)
1234{
1235 struct uss820dci_softc *sc;
1236 uint8_t ep_no;
1237 uint8_t ep_type;
1238 uint8_t ep_dir;
1239 uint8_t temp;
1240
1241 mtx_assert(&udev->bus->mtx, MA_OWNED);
1241 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1242
1243 DPRINTFN(5, "pipe=%p\n", pipe);
1244
1245 if (xfer) {
1246 /* cancel any ongoing transfers */
1247 uss820dci_device_done(xfer, USB_ERR_STALLED);
1248 }
1249 /* set FORCESTALL */

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

1319}
1320
1321static void
1322uss820dci_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1323{
1324 struct uss820dci_softc *sc;
1325 struct usb2_endpoint_descriptor *ed;
1326
1242
1243 DPRINTFN(5, "pipe=%p\n", pipe);
1244
1245 if (xfer) {
1246 /* cancel any ongoing transfers */
1247 uss820dci_device_done(xfer, USB_ERR_STALLED);
1248 }
1249 /* set FORCESTALL */

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

1319}
1320
1321static void
1322uss820dci_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1323{
1324 struct uss820dci_softc *sc;
1325 struct usb2_endpoint_descriptor *ed;
1326
1327 mtx_assert(&udev->bus->mtx, MA_OWNED);
1327 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1328
1329 DPRINTFN(5, "pipe=%p\n", pipe);
1330
1331 /* check mode */
1332 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1333 /* not supported */
1334 return;
1335 }

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

1356 uint8_t temp;
1357
1358 DPRINTF("start\n");
1359
1360 /* set up the bus structure */
1361 sc->sc_bus.usbrev = USB_REV_1_1;
1362 sc->sc_bus.methods = &uss820dci_bus_methods;
1363
1328
1329 DPRINTFN(5, "pipe=%p\n", pipe);
1330
1331 /* check mode */
1332 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1333 /* not supported */
1334 return;
1335 }

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

1356 uint8_t temp;
1357
1358 DPRINTF("start\n");
1359
1360 /* set up the bus structure */
1361 sc->sc_bus.usbrev = USB_REV_1_1;
1362 sc->sc_bus.methods = &uss820dci_bus_methods;
1363
1364 mtx_lock(&sc->sc_bus.mtx);
1364 USB_BUS_LOCK(&sc->sc_bus);
1365
1366 /* we always have VBUS */
1367 sc->sc_flags.status_vbus = 1;
1368
1369 /* reset the chip */
1370 USS820_WRITE_1(sc, USS820_SCR, USS820_SCR_SRESET);
1371 DELAY(100);
1372 USS820_WRITE_1(sc, USS820_SCR, 0);
1373
1374 /* wait for reset to complete */
1375 for (n = 0;; n++) {
1376
1377 temp = USS820_READ_1(sc, USS820_MCSR);
1378
1379 if (temp & USS820_MCSR_INIT) {
1380 break;
1381 }
1382 if (n == 100) {
1365
1366 /* we always have VBUS */
1367 sc->sc_flags.status_vbus = 1;
1368
1369 /* reset the chip */
1370 USS820_WRITE_1(sc, USS820_SCR, USS820_SCR_SRESET);
1371 DELAY(100);
1372 USS820_WRITE_1(sc, USS820_SCR, 0);
1373
1374 /* wait for reset to complete */
1375 for (n = 0;; n++) {
1376
1377 temp = USS820_READ_1(sc, USS820_MCSR);
1378
1379 if (temp & USS820_MCSR_INIT) {
1380 break;
1381 }
1382 if (n == 100) {
1383 mtx_unlock(&sc->sc_bus.mtx);
1383 USB_BUS_UNLOCK(&sc->sc_bus);
1384 return (USB_ERR_INVAL);
1385 }
1386 /* wait a little for things to stabilise */
1387 DELAY(100);
1388 }
1389
1390 /* do a pulldown */
1391 uss820dci_pull_down(sc);
1392
1393 /* wait 10ms for pulldown to stabilise */
1384 return (USB_ERR_INVAL);
1385 }
1386 /* wait a little for things to stabilise */
1387 DELAY(100);
1388 }
1389
1390 /* do a pulldown */
1391 uss820dci_pull_down(sc);
1392
1393 /* wait 10ms for pulldown to stabilise */
1394 usb2_pause_mtx(&sc->sc_bus.mtx, 10);
1394 usb2_pause_mtx(&sc->sc_bus.bus_mtx, 10);
1395
1396 /* check hardware revision */
1397 temp = USS820_READ_1(sc, USS820_REV);
1398
1399 if (temp < 0x13) {
1395
1396 /* check hardware revision */
1397 temp = USS820_READ_1(sc, USS820_REV);
1398
1399 if (temp < 0x13) {
1400 mtx_unlock(&sc->sc_bus.mtx);
1400 USB_BUS_UNLOCK(&sc->sc_bus);
1401 return (USB_ERR_INVAL);
1402 }
1403 /* enable interrupts */
1404 USS820_WRITE_1(sc, USS820_SCR,
1405 USS820_SCR_T_IRQ |
1406 USS820_SCR_IE_RESET |
1407 USS820_SCR_IE_SUSP |
1408 USS820_SCR_IRQPOL);

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

1498 USS820_EPCON_TXEPEN;
1499 } else {
1500 temp = USS820_EPCON_RXEPEN | USS820_EPCON_TXEPEN;
1501 }
1502
1503 uss820dci_update_shared_1(sc, USS820_EPCON, 0xFF, temp);
1504 }
1505
1401 return (USB_ERR_INVAL);
1402 }
1403 /* enable interrupts */
1404 USS820_WRITE_1(sc, USS820_SCR,
1405 USS820_SCR_T_IRQ |
1406 USS820_SCR_IE_RESET |
1407 USS820_SCR_IE_SUSP |
1408 USS820_SCR_IRQPOL);

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

1498 USS820_EPCON_TXEPEN;
1499 } else {
1500 temp = USS820_EPCON_RXEPEN | USS820_EPCON_TXEPEN;
1501 }
1502
1503 uss820dci_update_shared_1(sc, USS820_EPCON, 0xFF, temp);
1504 }
1505
1506 mtx_unlock(&sc->sc_bus.mtx);
1506 USB_BUS_UNLOCK(&sc->sc_bus);
1507
1508 /* catch any lost interrupts */
1509
1510 uss820dci_do_poll(&sc->sc_bus);
1511
1512 return (0); /* success */
1513}
1514
1515void
1516uss820dci_uninit(struct uss820dci_softc *sc)
1517{
1518 uint8_t temp;
1519
1507
1508 /* catch any lost interrupts */
1509
1510 uss820dci_do_poll(&sc->sc_bus);
1511
1512 return (0); /* success */
1513}
1514
1515void
1516uss820dci_uninit(struct uss820dci_softc *sc)
1517{
1518 uint8_t temp;
1519
1520 mtx_lock(&sc->sc_bus.mtx);
1520 USB_BUS_LOCK(&sc->sc_bus);
1521
1522 /* disable all interrupts */
1523 temp = USS820_READ_1(sc, USS820_SCR);
1524 temp &= ~USS820_SCR_T_IRQ;
1525 USS820_WRITE_1(sc, USS820_SCR, temp);
1526
1527 sc->sc_flags.port_powered = 0;
1528 sc->sc_flags.status_vbus = 0;
1529 sc->sc_flags.status_bus_reset = 0;
1530 sc->sc_flags.status_suspend = 0;
1531 sc->sc_flags.change_suspend = 0;
1532 sc->sc_flags.change_connect = 1;
1533
1534 uss820dci_pull_down(sc);
1521
1522 /* disable all interrupts */
1523 temp = USS820_READ_1(sc, USS820_SCR);
1524 temp &= ~USS820_SCR_T_IRQ;
1525 USS820_WRITE_1(sc, USS820_SCR, temp);
1526
1527 sc->sc_flags.port_powered = 0;
1528 sc->sc_flags.status_vbus = 0;
1529 sc->sc_flags.status_bus_reset = 0;
1530 sc->sc_flags.status_suspend = 0;
1531 sc->sc_flags.change_suspend = 0;
1532 sc->sc_flags.change_connect = 1;
1533
1534 uss820dci_pull_down(sc);
1535 mtx_unlock(&sc->sc_bus.mtx);
1535 USB_BUS_UNLOCK(&sc->sc_bus);
1536
1537 return;
1538}
1539
1540void
1541uss820dci_suspend(struct uss820dci_softc *sc)
1542{
1543 return;

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

1549 return;
1550}
1551
1552static void
1553uss820dci_do_poll(struct usb2_bus *bus)
1554{
1555 struct uss820dci_softc *sc = USS820_DCI_BUS2SC(bus);
1556
1536
1537 return;
1538}
1539
1540void
1541uss820dci_suspend(struct uss820dci_softc *sc)
1542{
1543 return;

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

1549 return;
1550}
1551
1552static void
1553uss820dci_do_poll(struct usb2_bus *bus)
1554{
1555 struct uss820dci_softc *sc = USS820_DCI_BUS2SC(bus);
1556
1557 mtx_lock(&sc->sc_bus.mtx);
1557 USB_BUS_LOCK(&sc->sc_bus);
1558 uss820dci_interrupt_poll(sc);
1559 uss820dci_root_ctrl_poll(sc);
1558 uss820dci_interrupt_poll(sc);
1559 uss820dci_root_ctrl_poll(sc);
1560 mtx_unlock(&sc->sc_bus.mtx);
1560 USB_BUS_UNLOCK(&sc->sc_bus);
1561 return;
1562}
1563
1564/*------------------------------------------------------------------------*
1565 * at91dci bulk support
1566 *------------------------------------------------------------------------*/
1567static void
1568uss820dci_device_bulk_open(struct usb2_xfer *xfer)

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

1914uss820dci_root_ctrl_done(struct usb2_xfer *xfer,
1915 struct usb2_sw_transfer *std)
1916{
1917 struct uss820dci_softc *sc = xfer->usb2_sc;
1918 uint16_t value;
1919 uint16_t index;
1920 uint8_t use_polling;
1921
1561 return;
1562}
1563
1564/*------------------------------------------------------------------------*
1565 * at91dci bulk support
1566 *------------------------------------------------------------------------*/
1567static void
1568uss820dci_device_bulk_open(struct usb2_xfer *xfer)

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

1914uss820dci_root_ctrl_done(struct usb2_xfer *xfer,
1915 struct usb2_sw_transfer *std)
1916{
1917 struct uss820dci_softc *sc = xfer->usb2_sc;
1918 uint16_t value;
1919 uint16_t index;
1920 uint8_t use_polling;
1921
1922 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1922 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1923
1924 if (std->state != USB_SW_TR_SETUP) {
1925 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1926 /* transfer transferred */
1927 uss820dci_device_done(xfer, std->err);
1928 }
1929 goto done;
1930 }
1931 /* buffer reset */
1932 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
1933 std->len = 0;
1934
1935 value = UGETW(std->req.wValue);
1936 index = UGETW(std->req.wIndex);
1937
1923
1924 if (std->state != USB_SW_TR_SETUP) {
1925 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1926 /* transfer transferred */
1927 uss820dci_device_done(xfer, std->err);
1928 }
1929 goto done;
1930 }
1931 /* buffer reset */
1932 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
1933 std->len = 0;
1934
1935 value = UGETW(std->req.wValue);
1936 index = UGETW(std->req.wIndex);
1937
1938 use_polling = mtx_owned(xfer->priv_mtx) ? 1 : 0;
1938 use_polling = mtx_owned(xfer->xfer_mtx) ? 1 : 0;
1939
1940 /* demultiplex the control request */
1941
1942 switch (std->req.bmRequestType) {
1943 case UT_READ_DEVICE:
1944 switch (std->req.bRequest) {
1945 case UR_GET_DESCRIPTOR:
1946 goto tr_handle_get_descriptor;

--- 626 unchanged lines hidden ---
1939
1940 /* demultiplex the control request */
1941
1942 switch (std->req.bmRequestType) {
1943 case UT_READ_DEVICE:
1944 switch (std->req.bRequest) {
1945 case UR_GET_DESCRIPTOR:
1946 goto tr_handle_get_descriptor;

--- 626 unchanged lines hidden ---