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

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

286static void
287at91dci_rem_wakeup_set(struct usb2_device *udev, uint8_t is_on)
288{
289 struct at91dci_softc *sc;
290 uint32_t temp;
291
292 DPRINTFN(5, "is_on=%u\n", is_on);
293
3
4/*-
5 * Copyright (c) 2007-2008 Hans Petter Selasky. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright

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

286static void
287at91dci_rem_wakeup_set(struct usb2_device *udev, uint8_t is_on)
288{
289 struct at91dci_softc *sc;
290 uint32_t temp;
291
292 DPRINTFN(5, "is_on=%u\n", is_on);
293
294 mtx_assert(&udev->bus->mtx, MA_OWNED);
294 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
295
296 sc = AT9100_DCI_BUS2SC(udev->bus);
297
298 temp = AT91_UDP_READ_4(sc, AT91_UDP_GSTATE);
299
300 if (is_on) {
301 temp |= AT91_UDP_GSTATE_ESR;
302 } else {

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

761
762static void
763at91dci_vbus_interrupt(struct usb2_bus *bus, uint8_t is_on)
764{
765 struct at91dci_softc *sc = AT9100_DCI_BUS2SC(bus);
766
767 DPRINTFN(5, "vbus = %u\n", is_on);
768
295
296 sc = AT9100_DCI_BUS2SC(udev->bus);
297
298 temp = AT91_UDP_READ_4(sc, AT91_UDP_GSTATE);
299
300 if (is_on) {
301 temp |= AT91_UDP_GSTATE_ESR;
302 } else {

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

761
762static void
763at91dci_vbus_interrupt(struct usb2_bus *bus, uint8_t is_on)
764{
765 struct at91dci_softc *sc = AT9100_DCI_BUS2SC(bus);
766
767 DPRINTFN(5, "vbus = %u\n", is_on);
768
769 mtx_lock(&sc->sc_bus.mtx);
769 USB_BUS_LOCK(&sc->sc_bus);
770 if (is_on) {
771 if (!sc->sc_flags.status_vbus) {
772 sc->sc_flags.status_vbus = 1;
773
774 /* complete root HUB interrupt endpoint */
775
776 usb2_sw_transfer(&sc->sc_root_intr,
777 &at91dci_root_intr_done);

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

786
787 /* complete root HUB interrupt endpoint */
788
789 usb2_sw_transfer(&sc->sc_root_intr,
790 &at91dci_root_intr_done);
791 }
792 }
793
770 if (is_on) {
771 if (!sc->sc_flags.status_vbus) {
772 sc->sc_flags.status_vbus = 1;
773
774 /* complete root HUB interrupt endpoint */
775
776 usb2_sw_transfer(&sc->sc_root_intr,
777 &at91dci_root_intr_done);

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

786
787 /* complete root HUB interrupt endpoint */
788
789 usb2_sw_transfer(&sc->sc_root_intr,
790 &at91dci_root_intr_done);
791 }
792 }
793
794 mtx_unlock(&sc->sc_bus.mtx);
794 USB_BUS_UNLOCK(&sc->sc_bus);
795
796 return;
797}
798
799void
800at91dci_interrupt(struct at91dci_softc *sc)
801{
802 uint32_t status;
803
795
796 return;
797}
798
799void
800at91dci_interrupt(struct at91dci_softc *sc)
801{
802 uint32_t status;
803
804 mtx_lock(&sc->sc_bus.mtx);
804 USB_BUS_LOCK(&sc->sc_bus);
805
806 status = AT91_UDP_READ_4(sc, AT91_UDP_ISR);
807 status &= AT91_UDP_INT_DEFAULT;
808
809 if (!status) {
805
806 status = AT91_UDP_READ_4(sc, AT91_UDP_ISR);
807 status &= AT91_UDP_INT_DEFAULT;
808
809 if (!status) {
810 mtx_unlock(&sc->sc_bus.mtx);
810 USB_BUS_UNLOCK(&sc->sc_bus);
811 return;
812 }
813 /* acknowledge interrupts */
814
815 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, status);
816
817 /* check for any bus state change interrupts */
818

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

874 /* check for any endpoint interrupts */
875
876 if (status & AT91_UDP_INT_EPS) {
877
878 DPRINTFN(5, "real endpoint interrupt 0x%08x\n", status);
879
880 at91dci_interrupt_poll(sc);
881 }
811 return;
812 }
813 /* acknowledge interrupts */
814
815 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, status);
816
817 /* check for any bus state change interrupts */
818

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

874 /* check for any endpoint interrupts */
875
876 if (status & AT91_UDP_INT_EPS) {
877
878 DPRINTFN(5, "real endpoint interrupt 0x%08x\n", status);
879
880 at91dci_interrupt_poll(sc);
881 }
882 mtx_unlock(&sc->sc_bus.mtx);
882 USB_BUS_UNLOCK(&sc->sc_bus);
883
884 return;
885}
886
887static void
888at91dci_setup_standard_chain_sub(struct at91dci_std_temp *temp)
889{
890 struct at91dci_td *td;

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

1060static void
1061at91dci_timeout(void *arg)
1062{
1063 struct usb2_xfer *xfer = arg;
1064 struct at91dci_softc *sc = xfer->usb2_sc;
1065
1066 DPRINTF("xfer=%p\n", xfer);
1067
883
884 return;
885}
886
887static void
888at91dci_setup_standard_chain_sub(struct at91dci_std_temp *temp)
889{
890 struct at91dci_td *td;

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

1060static void
1061at91dci_timeout(void *arg)
1062{
1063 struct usb2_xfer *xfer = arg;
1064 struct at91dci_softc *sc = xfer->usb2_sc;
1065
1066 DPRINTF("xfer=%p\n", xfer);
1067
1068 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1068 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1069
1070 /* transfer is transferred */
1071 at91dci_device_done(xfer, USB_ERR_TIMEOUT);
1072
1069
1070 /* transfer is transferred */
1071 at91dci_device_done(xfer, USB_ERR_TIMEOUT);
1072
1073 mtx_unlock(&sc->sc_bus.mtx);
1073 USB_BUS_UNLOCK(&sc->sc_bus);
1074
1075 return;
1076}
1077
1078static void
1079at91dci_start_standard_chain(struct usb2_xfer *xfer)
1080{
1081 DPRINTFN(9, "\n");

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

1110static void
1111at91dci_root_intr_done(struct usb2_xfer *xfer,
1112 struct usb2_sw_transfer *std)
1113{
1114 struct at91dci_softc *sc = xfer->usb2_sc;
1115
1116 DPRINTFN(9, "\n");
1117
1074
1075 return;
1076}
1077
1078static void
1079at91dci_start_standard_chain(struct usb2_xfer *xfer)
1080{
1081 DPRINTFN(9, "\n");

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

1110static void
1111at91dci_root_intr_done(struct usb2_xfer *xfer,
1112 struct usb2_sw_transfer *std)
1113{
1114 struct at91dci_softc *sc = xfer->usb2_sc;
1115
1116 DPRINTFN(9, "\n");
1117
1118 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1118 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1119
1120 if (std->state != USB_SW_TR_PRE_DATA) {
1121 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1122 /* transfer transferred */
1123 at91dci_device_done(xfer, std->err);
1124 }
1125 goto done;
1126 }

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

1250 * same USB transfer!
1251 *------------------------------------------------------------------------*/
1252static void
1253at91dci_device_done(struct usb2_xfer *xfer, usb2_error_t error)
1254{
1255 struct at91dci_softc *sc = xfer->usb2_sc;
1256 uint8_t ep_no;
1257
1119
1120 if (std->state != USB_SW_TR_PRE_DATA) {
1121 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1122 /* transfer transferred */
1123 at91dci_device_done(xfer, std->err);
1124 }
1125 goto done;
1126 }

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

1250 * same USB transfer!
1251 *------------------------------------------------------------------------*/
1252static void
1253at91dci_device_done(struct usb2_xfer *xfer, usb2_error_t error)
1254{
1255 struct at91dci_softc *sc = xfer->usb2_sc;
1256 uint8_t ep_no;
1257
1258 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1258 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1259
1260 DPRINTFN(2, "xfer=%p, pipe=%p, error=%d\n",
1261 xfer, xfer->pipe, error);
1262
1263 if (xfer->flags_int.usb2_mode == USB_MODE_DEVICE) {
1264 ep_no = (xfer->endpoint & UE_ADDR);
1265
1266 /* disable endpoint interrupt */

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

1276static void
1277at91dci_set_stall(struct usb2_device *udev, struct usb2_xfer *xfer,
1278 struct usb2_pipe *pipe)
1279{
1280 struct at91dci_softc *sc;
1281 uint32_t csr_val;
1282 uint8_t csr_reg;
1283
1259
1260 DPRINTFN(2, "xfer=%p, pipe=%p, error=%d\n",
1261 xfer, xfer->pipe, error);
1262
1263 if (xfer->flags_int.usb2_mode == USB_MODE_DEVICE) {
1264 ep_no = (xfer->endpoint & UE_ADDR);
1265
1266 /* disable endpoint interrupt */

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

1276static void
1277at91dci_set_stall(struct usb2_device *udev, struct usb2_xfer *xfer,
1278 struct usb2_pipe *pipe)
1279{
1280 struct at91dci_softc *sc;
1281 uint32_t csr_val;
1282 uint8_t csr_reg;
1283
1284 mtx_assert(&udev->bus->mtx, MA_OWNED);
1284 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1285
1286 DPRINTFN(5, "pipe=%p\n", pipe);
1287
1288 if (xfer) {
1289 /* cancel any ongoing transfers */
1290 at91dci_device_done(xfer, USB_ERR_STALLED);
1291 }
1292 /* set FORCESTALL */

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

1400static void
1401at91dci_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1402{
1403 struct at91dci_softc *sc;
1404 struct usb2_endpoint_descriptor *ed;
1405
1406 DPRINTFN(5, "pipe=%p\n", pipe);
1407
1285
1286 DPRINTFN(5, "pipe=%p\n", pipe);
1287
1288 if (xfer) {
1289 /* cancel any ongoing transfers */
1290 at91dci_device_done(xfer, USB_ERR_STALLED);
1291 }
1292 /* set FORCESTALL */

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

1400static void
1401at91dci_clear_stall(struct usb2_device *udev, struct usb2_pipe *pipe)
1402{
1403 struct at91dci_softc *sc;
1404 struct usb2_endpoint_descriptor *ed;
1405
1406 DPRINTFN(5, "pipe=%p\n", pipe);
1407
1408 mtx_assert(&udev->bus->mtx, MA_OWNED);
1408 USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
1409
1410 /* check mode */
1411 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1412 /* not supported */
1413 return;
1414 }
1415 /* get softc */
1416 sc = AT9100_DCI_BUS2SC(udev->bus);

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

1433 uint8_t n;
1434
1435 DPRINTF("start\n");
1436
1437 /* set up the bus structure */
1438 sc->sc_bus.usbrev = USB_REV_1_1;
1439 sc->sc_bus.methods = &at91dci_bus_methods;
1440
1409
1410 /* check mode */
1411 if (udev->flags.usb2_mode != USB_MODE_DEVICE) {
1412 /* not supported */
1413 return;
1414 }
1415 /* get softc */
1416 sc = AT9100_DCI_BUS2SC(udev->bus);

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

1433 uint8_t n;
1434
1435 DPRINTF("start\n");
1436
1437 /* set up the bus structure */
1438 sc->sc_bus.usbrev = USB_REV_1_1;
1439 sc->sc_bus.methods = &at91dci_bus_methods;
1440
1441 mtx_lock(&sc->sc_bus.mtx);
1441 USB_BUS_LOCK(&sc->sc_bus);
1442
1443 /* turn on clocks */
1444
1445 if (sc->sc_clocks_on) {
1446 (sc->sc_clocks_on) (sc->sc_clocks_arg);
1447 }
1448 /* wait a little for things to stabilise */
1442
1443 /* turn on clocks */
1444
1445 if (sc->sc_clocks_on) {
1446 (sc->sc_clocks_on) (sc->sc_clocks_arg);
1447 }
1448 /* wait a little for things to stabilise */
1449 usb2_pause_mtx(&sc->sc_bus.mtx, 1);
1449 usb2_pause_mtx(&sc->sc_bus.bus_mtx, 1);
1450
1451 /* disable and clear all interrupts */
1452
1453 AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
1454 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
1455
1456 /* compute default CSR value */
1457

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

1478 /* enable the interrupts we want */
1479
1480 AT91_UDP_WRITE_4(sc, AT91_UDP_IER, AT91_UDP_INT_BUS);
1481
1482 /* turn off clocks */
1483
1484 at91dci_clocks_off(sc);
1485
1450
1451 /* disable and clear all interrupts */
1452
1453 AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
1454 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
1455
1456 /* compute default CSR value */
1457

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

1478 /* enable the interrupts we want */
1479
1480 AT91_UDP_WRITE_4(sc, AT91_UDP_IER, AT91_UDP_INT_BUS);
1481
1482 /* turn off clocks */
1483
1484 at91dci_clocks_off(sc);
1485
1486 mtx_unlock(&sc->sc_bus.mtx);
1486 USB_BUS_UNLOCK(&sc->sc_bus);
1487
1488 /* catch any lost interrupts */
1489
1490 at91dci_do_poll(&sc->sc_bus);
1491
1492 return (0); /* success */
1493}
1494
1495void
1496at91dci_uninit(struct at91dci_softc *sc)
1497{
1487
1488 /* catch any lost interrupts */
1489
1490 at91dci_do_poll(&sc->sc_bus);
1491
1492 return (0); /* success */
1493}
1494
1495void
1496at91dci_uninit(struct at91dci_softc *sc)
1497{
1498 mtx_lock(&sc->sc_bus.mtx);
1498 USB_BUS_LOCK(&sc->sc_bus);
1499
1500 /* disable and clear all interrupts */
1501 AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
1502 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
1503
1504 sc->sc_flags.port_powered = 0;
1505 sc->sc_flags.status_vbus = 0;
1506 sc->sc_flags.status_bus_reset = 0;
1507 sc->sc_flags.status_suspend = 0;
1508 sc->sc_flags.change_suspend = 0;
1509 sc->sc_flags.change_connect = 1;
1510
1511 at91dci_pull_down(sc);
1512 at91dci_clocks_off(sc);
1499
1500 /* disable and clear all interrupts */
1501 AT91_UDP_WRITE_4(sc, AT91_UDP_IDR, 0xFFFFFFFF);
1502 AT91_UDP_WRITE_4(sc, AT91_UDP_ICR, 0xFFFFFFFF);
1503
1504 sc->sc_flags.port_powered = 0;
1505 sc->sc_flags.status_vbus = 0;
1506 sc->sc_flags.status_bus_reset = 0;
1507 sc->sc_flags.status_suspend = 0;
1508 sc->sc_flags.change_suspend = 0;
1509 sc->sc_flags.change_connect = 1;
1510
1511 at91dci_pull_down(sc);
1512 at91dci_clocks_off(sc);
1513 mtx_unlock(&sc->sc_bus.mtx);
1513 USB_BUS_UNLOCK(&sc->sc_bus);
1514
1515 return;
1516}
1517
1518void
1519at91dci_suspend(struct at91dci_softc *sc)
1520{
1521 return;

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

1527 return;
1528}
1529
1530static void
1531at91dci_do_poll(struct usb2_bus *bus)
1532{
1533 struct at91dci_softc *sc = AT9100_DCI_BUS2SC(bus);
1534
1514
1515 return;
1516}
1517
1518void
1519at91dci_suspend(struct at91dci_softc *sc)
1520{
1521 return;

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

1527 return;
1528}
1529
1530static void
1531at91dci_do_poll(struct usb2_bus *bus)
1532{
1533 struct at91dci_softc *sc = AT9100_DCI_BUS2SC(bus);
1534
1535 mtx_lock(&sc->sc_bus.mtx);
1535 USB_BUS_LOCK(&sc->sc_bus);
1536 at91dci_interrupt_poll(sc);
1537 at91dci_root_ctrl_poll(sc);
1536 at91dci_interrupt_poll(sc);
1537 at91dci_root_ctrl_poll(sc);
1538 mtx_unlock(&sc->sc_bus.mtx);
1538 USB_BUS_UNLOCK(&sc->sc_bus);
1539 return;
1540}
1541
1542/*------------------------------------------------------------------------*
1543 * at91dci bulk support
1544 *------------------------------------------------------------------------*/
1545static void
1546at91dci_device_bulk_open(struct usb2_xfer *xfer)

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

1892at91dci_root_ctrl_done(struct usb2_xfer *xfer,
1893 struct usb2_sw_transfer *std)
1894{
1895 struct at91dci_softc *sc = xfer->usb2_sc;
1896 uint16_t value;
1897 uint16_t index;
1898 uint8_t use_polling;
1899
1539 return;
1540}
1541
1542/*------------------------------------------------------------------------*
1543 * at91dci bulk support
1544 *------------------------------------------------------------------------*/
1545static void
1546at91dci_device_bulk_open(struct usb2_xfer *xfer)

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

1892at91dci_root_ctrl_done(struct usb2_xfer *xfer,
1893 struct usb2_sw_transfer *std)
1894{
1895 struct at91dci_softc *sc = xfer->usb2_sc;
1896 uint16_t value;
1897 uint16_t index;
1898 uint8_t use_polling;
1899
1900 mtx_assert(&sc->sc_bus.mtx, MA_OWNED);
1900 USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
1901
1902 if (std->state != USB_SW_TR_SETUP) {
1903 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1904 /* transfer transferred */
1905 at91dci_device_done(xfer, std->err);
1906 }
1907 goto done;
1908 }
1909 /* buffer reset */
1910 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
1911 std->len = 0;
1912
1913 value = UGETW(std->req.wValue);
1914 index = UGETW(std->req.wIndex);
1915
1901
1902 if (std->state != USB_SW_TR_SETUP) {
1903 if (std->state == USB_SW_TR_PRE_CALLBACK) {
1904 /* transfer transferred */
1905 at91dci_device_done(xfer, std->err);
1906 }
1907 goto done;
1908 }
1909 /* buffer reset */
1910 std->ptr = USB_ADD_BYTES(&sc->sc_hub_temp, 0);
1911 std->len = 0;
1912
1913 value = UGETW(std->req.wValue);
1914 index = UGETW(std->req.wIndex);
1915
1916 use_polling = mtx_owned(xfer->priv_mtx) ? 1 : 0;
1916 use_polling = mtx_owned(xfer->xfer_mtx) ? 1 : 0;
1917
1918 /* demultiplex the control request */
1919
1920 switch (std->req.bmRequestType) {
1921 case UT_READ_DEVICE:
1922 switch (std->req.bRequest) {
1923 case UR_GET_DESCRIPTOR:
1924 goto tr_handle_get_descriptor;

--- 623 unchanged lines hidden ---
1917
1918 /* demultiplex the control request */
1919
1920 switch (std->req.bmRequestType) {
1921 case UT_READ_DEVICE:
1922 switch (std->req.bRequest) {
1923 case UR_GET_DESCRIPTOR:
1924 goto tr_handle_get_descriptor;

--- 623 unchanged lines hidden ---