Deleted Added
full compact
fwohci.c (109890) fwohci.c (109892)
1/*
2 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
3 * 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

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

25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
1/*
2 * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
3 * 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

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

25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 * $FreeBSD: head/sys/dev/firewire/fwohci.c 109890 2003-01-26 15:39:04Z simokawa $
33 * $FreeBSD: head/sys/dev/firewire/fwohci.c 109892 2003-01-26 18:38:06Z simokawa $
34 *
35 */
36
37#define ATRQ_CH 0
38#define ATRS_CH 1
39#define ARRQ_CH 2
40#define ARRS_CH 3
41#define ITX_CH 4

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

823 ohcifp->mode.common.spd = 0;
824 ohcifp->mode.common.tcode = FWOHCITCODE_PHY;
825 } else {
826 ohcifp->mode.asycomm.dst = ntohs(fp->mode.hdr.dst);
827 ohcifp->mode.asycomm.srcbus = OHCI_ASYSRCBUS;
828 ohcifp->mode.asycomm.tlrt |= FWRETRY_X;
829 }
830 db = &db_tr->db[0];
34 *
35 */
36
37#define ATRQ_CH 0
38#define ATRS_CH 1
39#define ARRQ_CH 2
40#define ARRS_CH 3
41#define ITX_CH 4

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

823 ohcifp->mode.common.spd = 0;
824 ohcifp->mode.common.tcode = FWOHCITCODE_PHY;
825 } else {
826 ohcifp->mode.asycomm.dst = ntohs(fp->mode.hdr.dst);
827 ohcifp->mode.asycomm.srcbus = OHCI_ASYSRCBUS;
828 ohcifp->mode.asycomm.tlrt |= FWRETRY_X;
829 }
830 db = &db_tr->db[0];
831 db->db.desc.cmd = OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | hdr_len;
831 db->db.desc.control = OHCI_OUTPUT_MORE | OHCI_KEY_ST2;
832 db->db.desc.reqcount = hdr_len;
832 db->db.desc.status = 0;
833/* Specify bound timer of asy. responce */
834 if(&sc->atrs == dbch){
835 db->db.desc.count
836 = (OREAD(sc, OHCI_CYCLETIMER) >> 12) + (1 << 13);
837 }
838
839 db_tr->dbcnt = 2;
840 db = &db_tr->db[db_tr->dbcnt];
841 if(len > hdr_off){
842 if (xfer->mbuf == NULL) {
843 db->db.desc.addr
844 = vtophys(xfer->send.buf + xfer->send.off) + hdr_off;
833 db->db.desc.status = 0;
834/* Specify bound timer of asy. responce */
835 if(&sc->atrs == dbch){
836 db->db.desc.count
837 = (OREAD(sc, OHCI_CYCLETIMER) >> 12) + (1 << 13);
838 }
839
840 db_tr->dbcnt = 2;
841 db = &db_tr->db[db_tr->dbcnt];
842 if(len > hdr_off){
843 if (xfer->mbuf == NULL) {
844 db->db.desc.addr
845 = vtophys(xfer->send.buf + xfer->send.off) + hdr_off;
845 db->db.desc.cmd
846 = OHCI_OUTPUT_MORE | ((len - hdr_off) & 0xffff);
846 db->db.desc.control = OHCI_OUTPUT_MORE;
847 db->db.desc.reqcount = len - hdr_off;
847 db->db.desc.status = 0;
848
849 db_tr->dbcnt++;
850 } else {
851 int mchain=0;
852 /* XXX we assume mbuf chain is shorter than ndesc */
853 for (m = xfer->mbuf; m != NULL; m = m->m_next) {
854 if (m->m_len == 0)
855 /* unrecoverable error could occur. */
856 continue;
857 mchain++;
858 if (db_tr->dbcnt >= dbch->ndesc)
859 continue;
860 db->db.desc.addr
861 = vtophys(mtod(m, caddr_t));
848 db->db.desc.status = 0;
849
850 db_tr->dbcnt++;
851 } else {
852 int mchain=0;
853 /* XXX we assume mbuf chain is shorter than ndesc */
854 for (m = xfer->mbuf; m != NULL; m = m->m_next) {
855 if (m->m_len == 0)
856 /* unrecoverable error could occur. */
857 continue;
858 mchain++;
859 if (db_tr->dbcnt >= dbch->ndesc)
860 continue;
861 db->db.desc.addr
862 = vtophys(mtod(m, caddr_t));
862 db->db.desc.cmd = OHCI_OUTPUT_MORE | m->m_len;
863 db->db.desc.control = OHCI_OUTPUT_MORE;
864 db->db.desc.reqcount = m->m_len;
863 db->db.desc.status = 0;
864 db++;
865 db_tr->dbcnt++;
866 }
867 if (mchain > dbch->ndesc - 2)
868 device_printf(sc->fc.dev,
869 "dbch->ndesc(%d) is too small for"
870 " mbuf chain(%d), trancated.\n",
871 dbch->ndesc, mchain);
872 }
873 }
874 if (maxdesc < db_tr->dbcnt) {
875 maxdesc = db_tr->dbcnt;
876 if (bootverbose)
877 device_printf(sc->fc.dev, "maxdesc: %d\n", maxdesc);
878 }
879 /* last db */
880 LAST_DB(db_tr, db);
865 db->db.desc.status = 0;
866 db++;
867 db_tr->dbcnt++;
868 }
869 if (mchain > dbch->ndesc - 2)
870 device_printf(sc->fc.dev,
871 "dbch->ndesc(%d) is too small for"
872 " mbuf chain(%d), trancated.\n",
873 dbch->ndesc, mchain);
874 }
875 }
876 if (maxdesc < db_tr->dbcnt) {
877 maxdesc = db_tr->dbcnt;
878 if (bootverbose)
879 device_printf(sc->fc.dev, "maxdesc: %d\n", maxdesc);
880 }
881 /* last db */
882 LAST_DB(db_tr, db);
881 db->db.desc.cmd |= OHCI_OUTPUT_LAST
883 db->db.desc.control |= OHCI_OUTPUT_LAST
882 | OHCI_INTERRUPT_ALWAYS
883 | OHCI_BRANCH_ALWAYS;
884 db->db.desc.depend = vtophys(STAILQ_NEXT(db_tr, link)->db);
885
886 if(fsegment == -1 )
887 fsegment = db_tr->dbcnt;
888 if (dbch->pdb_tr != NULL) {
889 LAST_DB(dbch->pdb_tr, db);

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

1293
1294static int
1295fwohci_tx_enable(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1296{
1297 int err = 0;
1298 int idb, z, i, dmach = 0;
1299 u_int32_t off = NULL;
1300 struct fwohcidb_tr *db_tr;
884 | OHCI_INTERRUPT_ALWAYS
885 | OHCI_BRANCH_ALWAYS;
886 db->db.desc.depend = vtophys(STAILQ_NEXT(db_tr, link)->db);
887
888 if(fsegment == -1 )
889 fsegment = db_tr->dbcnt;
890 if (dbch->pdb_tr != NULL) {
891 LAST_DB(dbch->pdb_tr, db);

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

1295
1296static int
1297fwohci_tx_enable(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1298{
1299 int err = 0;
1300 int idb, z, i, dmach = 0;
1301 u_int32_t off = NULL;
1302 struct fwohcidb_tr *db_tr;
1303 volatile struct fwohcidb *db;
1301
1302 if(!(dbch->xferq.flag & FWXFERQ_EXTBUF)){
1303 err = EINVAL;
1304 return err;
1305 }
1306 z = dbch->ndesc;
1307 for(dmach = 0 ; dmach < sc->fc.nisodma ; dmach++){
1308 if( &sc->it[dmach] == dbch){

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

1323 db_tr = dbch->top;
1324 for( idb = 0 ; idb < dbch->ndb ; idb ++){
1325 fwohci_add_tx_buf(db_tr,
1326 dbch->xferq.psize, dbch->xferq.flag,
1327 dbch->xferq.buf + dbch->xferq.psize * idb);
1328 if(STAILQ_NEXT(db_tr, link) == NULL){
1329 break;
1330 }
1304
1305 if(!(dbch->xferq.flag & FWXFERQ_EXTBUF)){
1306 err = EINVAL;
1307 return err;
1308 }
1309 z = dbch->ndesc;
1310 for(dmach = 0 ; dmach < sc->fc.nisodma ; dmach++){
1311 if( &sc->it[dmach] == dbch){

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

1326 db_tr = dbch->top;
1327 for( idb = 0 ; idb < dbch->ndb ; idb ++){
1328 fwohci_add_tx_buf(db_tr,
1329 dbch->xferq.psize, dbch->xferq.flag,
1330 dbch->xferq.buf + dbch->xferq.psize * idb);
1331 if(STAILQ_NEXT(db_tr, link) == NULL){
1332 break;
1333 }
1331 db_tr->db[0].db.desc.depend
1334 db = db_tr->db;
1335 db[0].db.desc.depend = db[db_tr->dbcnt - 1].db.desc.depend
1332 = vtophys(STAILQ_NEXT(db_tr, link)->db) | z;
1336 = vtophys(STAILQ_NEXT(db_tr, link)->db) | z;
1333 db_tr->db[db_tr->dbcnt - 1].db.desc.depend
1334 = vtophys(STAILQ_NEXT(db_tr, link)->db) | z;
1335 if(dbch->xferq.flag & FWXFERQ_EXTBUF){
1336 if(((idb + 1 ) % dbch->xferq.bnpacket) == 0){
1337 if(dbch->xferq.flag & FWXFERQ_EXTBUF){
1338 if(((idb + 1 ) % dbch->xferq.bnpacket) == 0){
1337 db_tr->db[db_tr->dbcnt - 1].db.desc.cmd
1339 db[db_tr->dbcnt - 1].db.desc.control
1338 |= OHCI_INTERRUPT_ALWAYS;
1340 |= OHCI_INTERRUPT_ALWAYS;
1339 db_tr->db[0].db.desc.depend &= ~0xf;
1340 db_tr->db[db_tr->dbcnt - 1].db.desc.depend &=
1341 ~0xf;
1342 /* OHCI 1.1 and above */
1341 /* OHCI 1.1 and above */
1343 db_tr->db[0].db.desc.cmd
1344 |= OHCI_INTERRUPT_ALWAYS;
1342 db[0].db.desc.control |= OHCI_INTERRUPT_ALWAYS;
1343#if 0
1344 db[0].db.desc.depend &= ~0xf;
1345 db[db_tr->dbcnt - 1].db.desc.depend &= ~0xf;
1346#endif
1345 }
1346 }
1347 db_tr = STAILQ_NEXT(db_tr, link);
1348 }
1349 dbch->bottom->db[db_tr->dbcnt - 1].db.desc.depend &= 0xfffffff0;
1350 return err;
1351}
1352
1353static int
1354fwohci_rx_enable(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1355{
1356 int err = 0;
1347 }
1348 }
1349 db_tr = STAILQ_NEXT(db_tr, link);
1350 }
1351 dbch->bottom->db[db_tr->dbcnt - 1].db.desc.depend &= 0xfffffff0;
1352 return err;
1353}
1354
1355static int
1356fwohci_rx_enable(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1357{
1358 int err = 0;
1357 int idb, z, i, dmach = 0;
1359 int idb, z, i, dmach = 0, ldesc;
1358 u_int32_t off = NULL;
1359 struct fwohcidb_tr *db_tr;
1360 u_int32_t off = NULL;
1361 struct fwohcidb_tr *db_tr;
1362 volatile struct fwohcidb *db;
1360
1361 z = dbch->ndesc;
1362 if(&sc->arrq == dbch){
1363 off = OHCI_ARQOFF;
1364 }else if(&sc->arrs == dbch){
1365 off = OHCI_ARSOFF;
1366 }else{
1367 for(dmach = 0 ; dmach < sc->fc.nisodma ; dmach++){

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

1398 fwohci_add_rx_buf(db_tr,
1399 dbch->xferq.psize, dbch->xferq.flag,
1400 dbch->xferq.buf + dbch->xferq.psize * idb,
1401 dbch->dummy + sizeof(u_int32_t) * idb);
1402 }
1403 if(STAILQ_NEXT(db_tr, link) == NULL){
1404 break;
1405 }
1363
1364 z = dbch->ndesc;
1365 if(&sc->arrq == dbch){
1366 off = OHCI_ARQOFF;
1367 }else if(&sc->arrs == dbch){
1368 off = OHCI_ARSOFF;
1369 }else{
1370 for(dmach = 0 ; dmach < sc->fc.nisodma ; dmach++){

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

1401 fwohci_add_rx_buf(db_tr,
1402 dbch->xferq.psize, dbch->xferq.flag,
1403 dbch->xferq.buf + dbch->xferq.psize * idb,
1404 dbch->dummy + sizeof(u_int32_t) * idb);
1405 }
1406 if(STAILQ_NEXT(db_tr, link) == NULL){
1407 break;
1408 }
1406 db_tr->db[db_tr->dbcnt - 1].db.desc.depend
1409 db = db_tr->db;
1410 ldesc = db_tr->dbcnt - 1;
1411 db[ldesc].db.desc.depend
1407 = vtophys(STAILQ_NEXT(db_tr, link)->db) | z;
1408 if(dbch->xferq.flag & FWXFERQ_EXTBUF){
1409 if(((idb + 1 ) % dbch->xferq.bnpacket) == 0){
1412 = vtophys(STAILQ_NEXT(db_tr, link)->db) | z;
1413 if(dbch->xferq.flag & FWXFERQ_EXTBUF){
1414 if(((idb + 1 ) % dbch->xferq.bnpacket) == 0){
1410 db_tr->db[db_tr->dbcnt - 1].db.desc.cmd
1415 db[ldesc].db.desc.control
1411 |= OHCI_INTERRUPT_ALWAYS;
1416 |= OHCI_INTERRUPT_ALWAYS;
1412 db_tr->db[db_tr->dbcnt - 1].db.desc.depend &=
1413 ~0xf;
1417 db[ldesc].db.desc.depend &= ~0xf;
1414 }
1415 }
1416 db_tr = STAILQ_NEXT(db_tr, link);
1417 }
1418 dbch->bottom->db[db_tr->dbcnt - 1].db.desc.depend &= 0xfffffff0;
1419 dbch->buf_offset = 0;
1420 if(dbch->xferq.flag & FWXFERQ_STREAM){
1421 return err;

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

1476 fwohci_db_init(dbch);
1477 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0)
1478 return ENOMEM;
1479 err = fwohci_tx_enable(sc, dbch);
1480 }
1481 if(err)
1482 return err;
1483
1418 }
1419 }
1420 db_tr = STAILQ_NEXT(db_tr, link);
1421 }
1422 dbch->bottom->db[db_tr->dbcnt - 1].db.desc.depend &= 0xfffffff0;
1423 dbch->buf_offset = 0;
1424 if(dbch->xferq.flag & FWXFERQ_STREAM){
1425 return err;

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

1480 fwohci_db_init(dbch);
1481 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0)
1482 return ENOMEM;
1483 err = fwohci_tx_enable(sc, dbch);
1484 }
1485 if(err)
1486 return err;
1487
1488 ldesc = dbch->ndesc - 1;
1484 s = splfw();
1485 prev = STAILQ_LAST(&it->stdma, fw_bulkxfer, link);
1486 while ((chunk = STAILQ_FIRST(&it->stvalid)) != NULL) {
1487 volatile struct fwohcidb *db;
1488
1489 fwohci_txbufdb(sc, dmach, chunk);
1489 s = splfw();
1490 prev = STAILQ_LAST(&it->stdma, fw_bulkxfer, link);
1491 while ((chunk = STAILQ_FIRST(&it->stvalid)) != NULL) {
1492 volatile struct fwohcidb *db;
1493
1494 fwohci_txbufdb(sc, dmach, chunk);
1490 ldesc = dbch->ndesc - 1;
1495#if 0
1491 db = ((struct fwohcidb_tr *)(chunk->end))->db;
1492 db[ldesc].db.desc.status = db[0].db.desc.status = 0;
1493 db[ldesc].db.desc.count = db[0].db.desc.count = 0;
1494 db[ldesc].db.desc.depend &= ~0xf;
1495 db[0].db.desc.depend &= ~0xf;
1496 db = ((struct fwohcidb_tr *)(chunk->end))->db;
1497 db[ldesc].db.desc.status = db[0].db.desc.status = 0;
1498 db[ldesc].db.desc.count = db[0].db.desc.count = 0;
1499 db[ldesc].db.desc.depend &= ~0xf;
1500 db[0].db.desc.depend &= ~0xf;
1501#endif
1496 if (prev != NULL) {
1497 db = ((struct fwohcidb_tr *)(prev->end))->db;
1502 if (prev != NULL) {
1503 db = ((struct fwohcidb_tr *)(prev->end))->db;
1498 db[ldesc].db.desc.cmd |= OHCI_BRANCH_ALWAYS;
1504 db[ldesc].db.desc.control |= OHCI_BRANCH_ALWAYS;
1505#if 0 /* if bulkxfer->npacket changes */
1499 db[ldesc].db.desc.depend = db[0].db.desc.depend =
1500 vtophys(((struct fwohcidb_tr *)
1501 (chunk->start))->db) | dbch->ndesc;
1506 db[ldesc].db.desc.depend = db[0].db.desc.depend =
1507 vtophys(((struct fwohcidb_tr *)
1508 (chunk->start))->db) | dbch->ndesc;
1509#else
1510 db[0].db.desc.depend |= dbch->ndesc;
1511 db[ldesc].db.desc.depend |= dbch->ndesc;
1512#endif
1502 }
1503 STAILQ_REMOVE_HEAD(&it->stvalid, link);
1504 STAILQ_INSERT_TAIL(&it->stdma, chunk, link);
1505 prev = chunk;
1506 }
1507 splx(s);
1508 stat = OREAD(sc, OHCI_ITCTL(dmach));
1509 if (stat & (OHCI_CNTL_DMA_ACTIVE | OHCI_CNTL_CYCMATCH_S))

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

1610 while ((chunk = STAILQ_FIRST(&ir->stfree)) != NULL) {
1611 volatile struct fwohcidb *db;
1612
1613 db = ((struct fwohcidb_tr *)(chunk->end))->db;
1614 db[ldesc].db.desc.status = db[ldesc].db.desc.count = 0;
1615 db[ldesc].db.desc.depend &= ~0xf;
1616 if (prev != NULL) {
1617 db = ((struct fwohcidb_tr *)(prev->end))->db;
1513 }
1514 STAILQ_REMOVE_HEAD(&it->stvalid, link);
1515 STAILQ_INSERT_TAIL(&it->stdma, chunk, link);
1516 prev = chunk;
1517 }
1518 splx(s);
1519 stat = OREAD(sc, OHCI_ITCTL(dmach));
1520 if (stat & (OHCI_CNTL_DMA_ACTIVE | OHCI_CNTL_CYCMATCH_S))

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

1621 while ((chunk = STAILQ_FIRST(&ir->stfree)) != NULL) {
1622 volatile struct fwohcidb *db;
1623
1624 db = ((struct fwohcidb_tr *)(chunk->end))->db;
1625 db[ldesc].db.desc.status = db[ldesc].db.desc.count = 0;
1626 db[ldesc].db.desc.depend &= ~0xf;
1627 if (prev != NULL) {
1628 db = ((struct fwohcidb_tr *)(prev->end))->db;
1629#if 0
1618 db[ldesc].db.desc.depend =
1619 vtophys(((struct fwohcidb_tr *)
1620 (chunk->start))->db) | dbch->ndesc;
1630 db[ldesc].db.desc.depend =
1631 vtophys(((struct fwohcidb_tr *)
1632 (chunk->start))->db) | dbch->ndesc;
1633#else
1634 db[ldesc].db.desc.depend |= dbch->ndesc;
1635#endif
1621 }
1622 STAILQ_REMOVE_HEAD(&ir->stfree, link);
1623 STAILQ_INSERT_TAIL(&ir->stdma, chunk, link);
1624 prev = chunk;
1625 }
1626 splx(s);
1627 stat = OREAD(sc, OHCI_IRCTL(dmach));
1628 if (stat & OHCI_CNTL_DMA_ACTIVE)

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

2204 "INT",
2205 "BR ",
2206 "len",
2207 "Addr",
2208 "Depend",
2209 "Stat",
2210 "Cnt");
2211 for( i = 0 ; i <= max ; i ++){
1636 }
1637 STAILQ_REMOVE_HEAD(&ir->stfree, link);
1638 STAILQ_INSERT_TAIL(&ir->stdma, chunk, link);
1639 prev = chunk;
1640 }
1641 splx(s);
1642 stat = OREAD(sc, OHCI_IRCTL(dmach));
1643 if (stat & OHCI_CNTL_DMA_ACTIVE)

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

2219 "INT",
2220 "BR ",
2221 "len",
2222 "Addr",
2223 "Depend",
2224 "Stat",
2225 "Cnt");
2226 for( i = 0 ; i <= max ; i ++){
2212 key = db[i].db.desc.cmd & OHCI_KEY_MASK;
2227 key = db[i].db.desc.control & OHCI_KEY_MASK;
2213#if __FreeBSD_version >= 500000
2214 printf("%08tx %s %s %s %s %5d %08x %08x %04x:%04x",
2215#else
2216 printf("%08x %s %s %s %s %5d %08x %08x %04x:%04x",
2217#endif
2218 vtophys(&db[i]),
2228#if __FreeBSD_version >= 500000
2229 printf("%08tx %s %s %s %s %5d %08x %08x %04x:%04x",
2230#else
2231 printf("%08x %s %s %s %s %5d %08x %08x %04x:%04x",
2232#endif
2233 vtophys(&db[i]),
2219 dbcode[(db[i].db.desc.cmd >> 28) & 0xf],
2220 dbkey[(db[i].db.desc.cmd >> 24) & 0x7],
2221 dbcond[(db[i].db.desc.cmd >> 20) & 0x3],
2222 dbcond[(db[i].db.desc.cmd >> 18) & 0x3],
2223 db[i].db.desc.cmd & 0xffff,
2234 dbcode[(db[i].db.desc.control >> 12) & 0xf],
2235 dbkey[(db[i].db.desc.control >> 8) & 0x7],
2236 dbcond[(db[i].db.desc.control >> 4) & 0x3],
2237 dbcond[(db[i].db.desc.control >> 2) & 0x3],
2238 db[i].db.desc.reqcount,
2224 db[i].db.desc.addr,
2225 db[i].db.desc.depend,
2226 db[i].db.desc.status,
2227 db[i].db.desc.count);
2228 stat = db[i].db.desc.status;
2229 if(stat & 0xff00){
2230 printf(" %s%s%s%s%s%s %s(%x)\n",
2231 stat & OHCI_CNTL_DMA_RUN ? "RUN," : "",

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

2245 db[i+1].db.immed[0],
2246 db[i+1].db.immed[1],
2247 db[i+1].db.immed[2],
2248 db[i+1].db.immed[3]);
2249 }
2250 if(key == OHCI_KEY_DEVICE){
2251 return;
2252 }
2239 db[i].db.desc.addr,
2240 db[i].db.desc.depend,
2241 db[i].db.desc.status,
2242 db[i].db.desc.count);
2243 stat = db[i].db.desc.status;
2244 if(stat & 0xff00){
2245 printf(" %s%s%s%s%s%s %s(%x)\n",
2246 stat & OHCI_CNTL_DMA_RUN ? "RUN," : "",

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

2260 db[i+1].db.immed[0],
2261 db[i+1].db.immed[1],
2262 db[i+1].db.immed[2],
2263 db[i+1].db.immed[3]);
2264 }
2265 if(key == OHCI_KEY_DEVICE){
2266 return;
2267 }
2253 if((db[i].db.desc.cmd & OHCI_BRANCH_MASK)
2268 if((db[i].db.desc.control & OHCI_BRANCH_MASK)
2254 == OHCI_BRANCH_ALWAYS){
2255 return;
2256 }
2269 == OHCI_BRANCH_ALWAYS){
2270 return;
2271 }
2257 if((db[i].db.desc.cmd & OHCI_CMD_MASK)
2272 if((db[i].db.desc.control & OHCI_CMD_MASK)
2258 == OHCI_OUTPUT_LAST){
2259 return;
2260 }
2273 == OHCI_OUTPUT_LAST){
2274 return;
2275 }
2261 if((db[i].db.desc.cmd & OHCI_CMD_MASK)
2276 if((db[i].db.desc.control & OHCI_CMD_MASK)
2262 == OHCI_INPUT_LAST){
2263 return;
2264 }
2265 if(key == OHCI_KEY_ST2 ){
2266 i++;
2267 }
2268 }
2269 return;

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

2292#endif
2293}
2294
2295void
2296fwohci_txbufdb(struct fwohci_softc *sc, int dmach, struct fw_bulkxfer *bulkxfer)
2297{
2298 struct fwohcidb_tr *db_tr, *fdb_tr;
2299 struct fwohci_dbch *dbch;
2277 == OHCI_INPUT_LAST){
2278 return;
2279 }
2280 if(key == OHCI_KEY_ST2 ){
2281 i++;
2282 }
2283 }
2284 return;

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

2307#endif
2308}
2309
2310void
2311fwohci_txbufdb(struct fwohci_softc *sc, int dmach, struct fw_bulkxfer *bulkxfer)
2312{
2313 struct fwohcidb_tr *db_tr, *fdb_tr;
2314 struct fwohci_dbch *dbch;
2315 volatile struct fwohcidb *db;
2300 struct fw_pkt *fp;
2301 volatile struct fwohci_txpkthdr *ohcifp;
2302 unsigned short chtag;
2303 int idb;
2304
2305 dbch = &sc->it[dmach];
2306 chtag = sc->it[dmach].xferq.flag & 0xff;
2307
2308 db_tr = (struct fwohcidb_tr *)(bulkxfer->start);
2309 fdb_tr = (struct fwohcidb_tr *)(bulkxfer->end);
2310/*
2311device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, vtophys(db_tr->db), vtophys(fdb_tr->db));
2312*/
2313 for( idb = 0 ; idb < bulkxfer->npacket ; idb ++){
2316 struct fw_pkt *fp;
2317 volatile struct fwohci_txpkthdr *ohcifp;
2318 unsigned short chtag;
2319 int idb;
2320
2321 dbch = &sc->it[dmach];
2322 chtag = sc->it[dmach].xferq.flag & 0xff;
2323
2324 db_tr = (struct fwohcidb_tr *)(bulkxfer->start);
2325 fdb_tr = (struct fwohcidb_tr *)(bulkxfer->end);
2326/*
2327device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, vtophys(db_tr->db), vtophys(fdb_tr->db));
2328*/
2329 for( idb = 0 ; idb < bulkxfer->npacket ; idb ++){
2314 db_tr->db[0].db.desc.cmd
2315 = OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | 8;
2330 db = db_tr->db;
2331#if 0
2332 db[0].db.desc.control
2333 = OHCI_OUTPUT_MORE | OHCI_KEY_ST2;
2334 db[0].db.desc.reqcount = 8;
2335#endif
2316 fp = (struct fw_pkt *)db_tr->buf;
2336 fp = (struct fw_pkt *)db_tr->buf;
2317 ohcifp = (volatile struct fwohci_txpkthdr *)
2318 db_tr->db[1].db.immed;
2337 ohcifp = (volatile struct fwohci_txpkthdr *) db[1].db.immed;
2319 ohcifp->mode.ld[0] = ntohl(fp->mode.ld[0]);
2320 ohcifp->mode.stream.len = ntohs(fp->mode.stream.len);
2321 ohcifp->mode.stream.chtag = chtag;
2322 ohcifp->mode.stream.tcode = 0xa;
2323 ohcifp->mode.stream.spd = 0;
2324
2338 ohcifp->mode.ld[0] = ntohl(fp->mode.ld[0]);
2339 ohcifp->mode.stream.len = ntohs(fp->mode.stream.len);
2340 ohcifp->mode.stream.chtag = chtag;
2341 ohcifp->mode.stream.tcode = 0xa;
2342 ohcifp->mode.stream.spd = 0;
2343
2325 db_tr->db[2].db.desc.cmd
2326 = OHCI_OUTPUT_LAST
2344 db[2].db.desc.reqcount = ntohs(fp->mode.stream.len);
2345 db[2].db.desc.status = 0;
2346 db[2].db.desc.count = 0;
2347#if 0 /* if bulkxfer->npackets changes */
2348 db[2].db.desc.control = OHCI_OUTPUT_LAST
2327 | OHCI_UPDATE
2349 | OHCI_UPDATE
2328 | OHCI_BRANCH_ALWAYS
2329 | ((ntohs(fp->mode.stream.len) ) & 0xffff);
2330 db_tr->db[2].db.desc.status = 0;
2331 db_tr->db[2].db.desc.count = 0;
2332 db_tr->db[0].db.desc.depend
2350 | OHCI_BRANCH_ALWAYS;
2351 db[0].db.desc.depend =
2352 = db[dbch->ndesc - 1].db.desc.depend
2333 = vtophys(STAILQ_NEXT(db_tr, link)->db) | dbch->ndesc;
2353 = vtophys(STAILQ_NEXT(db_tr, link)->db) | dbch->ndesc;
2334 db_tr->db[dbch->ndesc - 1].db.desc.depend
2335 = vtophys(STAILQ_NEXT(db_tr, link)->db) | dbch->ndesc;
2354#else
2355 db[0].db.desc.depend |= dbch->ndesc;
2356 db[dbch->ndesc - 1].db.desc.depend |= dbch->ndesc;
2357#endif
2336 bulkxfer->end = (caddr_t)db_tr;
2337 db_tr = STAILQ_NEXT(db_tr, link);
2338 }
2358 bulkxfer->end = (caddr_t)db_tr;
2359 db_tr = STAILQ_NEXT(db_tr, link);
2360 }
2339 db_tr = (struct fwohcidb_tr *)bulkxfer->end;
2340 db_tr->db[0].db.desc.depend &= ~0xf;
2341 db_tr->db[dbch->ndesc - 1].db.desc.depend &= ~0xf;
2342 db_tr->db[dbch->ndesc - 1].db.desc.cmd |= OHCI_INTERRUPT_ALWAYS;
2361 db = ((struct fwohcidb_tr *)bulkxfer->end)->db;
2362 db[0].db.desc.depend &= ~0xf;
2363 db[dbch->ndesc - 1].db.desc.depend &= ~0xf;
2364#if 0 /* if bulkxfer->npackets changes */
2365 db[dbch->ndesc - 1].db.desc.control |= OHCI_INTERRUPT_ALWAYS;
2343 /* OHCI 1.1 and above */
2366 /* OHCI 1.1 and above */
2344 db_tr->db[0].db.desc.cmd |= OHCI_INTERRUPT_ALWAYS;
2345
2367 db[0].db.desc.control |= OHCI_INTERRUPT_ALWAYS;
2368#endif
2369/*
2346 db_tr = (struct fwohcidb_tr *)bulkxfer->start;
2347 fdb_tr = (struct fwohcidb_tr *)bulkxfer->end;
2370 db_tr = (struct fwohcidb_tr *)bulkxfer->start;
2371 fdb_tr = (struct fwohcidb_tr *)bulkxfer->end;
2348/*
2349device_printf(sc->fc.dev, "DB %08x %3d %08x %08x\n", bulkxfer, bulkxfer->npacket, vtophys(db_tr->db), vtophys(fdb_tr->db));
2350*/
2351 return;
2352}
2353
2354static int
2355fwohci_add_tx_buf(struct fwohcidb_tr *db_tr, unsigned short size,
2356 int mode, void *buf)
2357{
2358 volatile struct fwohcidb *db = db_tr->db;
2359 int err = 0;
2360 if(buf == 0){
2361 err = EINVAL;
2362 return err;
2363 }
2364 db_tr->buf = buf;
2365 db_tr->dbcnt = 3;
2366 db_tr->dummy = NULL;
2367
2372device_printf(sc->fc.dev, "DB %08x %3d %08x %08x\n", bulkxfer, bulkxfer->npacket, vtophys(db_tr->db), vtophys(fdb_tr->db));
2373*/
2374 return;
2375}
2376
2377static int
2378fwohci_add_tx_buf(struct fwohcidb_tr *db_tr, unsigned short size,
2379 int mode, void *buf)
2380{
2381 volatile struct fwohcidb *db = db_tr->db;
2382 int err = 0;
2383 if(buf == 0){
2384 err = EINVAL;
2385 return err;
2386 }
2387 db_tr->buf = buf;
2388 db_tr->dbcnt = 3;
2389 db_tr->dummy = NULL;
2390
2368 db[0].db.desc.cmd = OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | 8;
2369
2370 db[2].db.desc.depend = 0;
2391 db[0].db.desc.control = OHCI_OUTPUT_MORE | OHCI_KEY_ST2;
2392 db[0].db.desc.reqcount = 8;
2371 db[2].db.desc.addr = vtophys(buf) + sizeof(u_int32_t);
2393 db[2].db.desc.addr = vtophys(buf) + sizeof(u_int32_t);
2372 db[2].db.desc.cmd = OHCI_OUTPUT_MORE;
2373
2394 db[2].db.desc.control =
2395 OHCI_OUTPUT_LAST | OHCI_UPDATE | OHCI_BRANCH_ALWAYS;
2396#if 1
2374 db[0].db.desc.status = 0;
2375 db[0].db.desc.count = 0;
2397 db[0].db.desc.status = 0;
2398 db[0].db.desc.count = 0;
2376
2377 db[2].db.desc.status = 0;
2378 db[2].db.desc.count = 0;
2399 db[2].db.desc.status = 0;
2400 db[2].db.desc.count = 0;
2401#endif
2379 if( mode & FWXFERQ_STREAM ){
2402 if( mode & FWXFERQ_STREAM ){
2380 db[2].db.desc.cmd |= OHCI_OUTPUT_LAST;
2381 if(mode & FWXFERQ_PACKET ){
2403 if(mode & FWXFERQ_PACKET ){
2382 db[2].db.desc.cmd
2383 |= OHCI_INTERRUPT_ALWAYS;
2404 db[2].db.desc.control |= OHCI_INTERRUPT_ALWAYS;
2384 }
2405 }
2406 } else {
2407 printf("fwohci_add_tx_buf: who calls me?");
2385 }
2408 }
2386 db[2].db.desc.cmd |= OHCI_BRANCH_ALWAYS;
2387 return 1;
2388}
2389
2390int
2391fwohci_add_rx_buf(struct fwohcidb_tr *db_tr, unsigned short size, int mode,
2392 void *buf, void *dummy)
2393{
2394 volatile struct fwohcidb *db = db_tr->db;

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

2416 db_tr->dummy = dummy;
2417 dsiz[0] = sizeof(u_int32_t);
2418 dsiz[1] = size;
2419 dbuf[0] = dummy;
2420 dbuf[1] = buf;
2421 }
2422 for(i = 0 ; i < db_tr->dbcnt ; i++){
2423 db[i].db.desc.addr = vtophys(dbuf[i]) ;
2409 return 1;
2410}
2411
2412int
2413fwohci_add_rx_buf(struct fwohcidb_tr *db_tr, unsigned short size, int mode,
2414 void *buf, void *dummy)
2415{
2416 volatile struct fwohcidb *db = db_tr->db;

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

2438 db_tr->dummy = dummy;
2439 dsiz[0] = sizeof(u_int32_t);
2440 dsiz[1] = size;
2441 dbuf[0] = dummy;
2442 dbuf[1] = buf;
2443 }
2444 for(i = 0 ; i < db_tr->dbcnt ; i++){
2445 db[i].db.desc.addr = vtophys(dbuf[i]) ;
2424 db[i].db.desc.cmd = OHCI_INPUT_MORE | dsiz[i];
2446 db[i].db.desc.control = OHCI_INPUT_MORE;
2447 db[i].db.desc.reqcount = dsiz[i];
2425 if( mode & FWXFERQ_STREAM ){
2448 if( mode & FWXFERQ_STREAM ){
2426 db[i].db.desc.cmd |= OHCI_UPDATE;
2449 db[i].db.desc.control |= OHCI_UPDATE;
2427 }
2428 db[i].db.desc.status = 0;
2429 db[i].db.desc.count = dsiz[i];
2430 }
2431 if( mode & FWXFERQ_STREAM ){
2450 }
2451 db[i].db.desc.status = 0;
2452 db[i].db.desc.count = dsiz[i];
2453 }
2454 if( mode & FWXFERQ_STREAM ){
2432 db[db_tr->dbcnt - 1].db.desc.cmd |= OHCI_INPUT_LAST;
2455 db[db_tr->dbcnt - 1].db.desc.control |= OHCI_INPUT_LAST;
2433 if(mode & FWXFERQ_PACKET ){
2456 if(mode & FWXFERQ_PACKET ){
2434 db[db_tr->dbcnt - 1].db.desc.cmd
2457 db[db_tr->dbcnt - 1].db.desc.control
2435 |= OHCI_INTERRUPT_ALWAYS;
2436 }
2437 }
2458 |= OHCI_INTERRUPT_ALWAYS;
2459 }
2460 }
2438 db[db_tr->dbcnt - 1].db.desc.cmd |= OHCI_BRANCH_ALWAYS;
2461 db[db_tr->dbcnt - 1].db.desc.control |= OHCI_BRANCH_ALWAYS;
2439 return 1;
2440}
2441
2442static void
2443fwohci_ircv(struct fwohci_softc *sc, struct fwohci_dbch *dbch, int count)
2444{
2445 struct fwohcidb_tr *db_tr = dbch->top, *odb_tr;
2446 struct firewire_comm *fc = (struct firewire_comm *)sc;

--- 319 unchanged lines hidden ---
2462 return 1;
2463}
2464
2465static void
2466fwohci_ircv(struct fwohci_softc *sc, struct fwohci_dbch *dbch, int count)
2467{
2468 struct fwohcidb_tr *db_tr = dbch->top, *odb_tr;
2469 struct firewire_comm *fc = (struct firewire_comm *)sc;

--- 319 unchanged lines hidden ---