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