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