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

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

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

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

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

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

834 int tcode, hdr_len, pl_off, pl_len;
835 int fsegment = -1;
836 u_int32_t off;
837 struct fw_xfer *xfer;
838 struct fw_pkt *fp;
839 volatile struct fwohci_txpkthdr *ohcifp;
840 struct fwohcidb_tr *db_tr;
841 volatile struct fwohcidb *db;
35 *
36 */
37
38#define ATRQ_CH 0
39#define ATRS_CH 1
40#define ARRQ_CH 2
41#define ARRS_CH 3
42#define ITX_CH 4

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

834 int tcode, hdr_len, pl_off, pl_len;
835 int fsegment = -1;
836 u_int32_t off;
837 struct fw_xfer *xfer;
838 struct fw_pkt *fp;
839 volatile struct fwohci_txpkthdr *ohcifp;
840 struct fwohcidb_tr *db_tr;
841 volatile struct fwohcidb *db;
842 volatile u_int32_t *ld;
842 struct tcode_info *info;
843 static int maxdesc=0;
844
845 if(&sc->atrq == dbch){
846 off = OHCI_ATQOFF;
847 }else if(&sc->atrs == dbch){
848 off = OHCI_ATSOFF;
849 }else{

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

868 xfer->state = FWXF_START;
869
870 fp = (struct fw_pkt *)xfer->send.buf;
871 tcode = fp->mode.common.tcode;
872
873 ohcifp = (volatile struct fwohci_txpkthdr *) db_tr->db[1].db.immed;
874 info = &tinfo[tcode];
875 hdr_len = pl_off = info->hdr_len;
843 struct tcode_info *info;
844 static int maxdesc=0;
845
846 if(&sc->atrq == dbch){
847 off = OHCI_ATQOFF;
848 }else if(&sc->atrs == dbch){
849 off = OHCI_ATSOFF;
850 }else{

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

869 xfer->state = FWXF_START;
870
871 fp = (struct fw_pkt *)xfer->send.buf;
872 tcode = fp->mode.common.tcode;
873
874 ohcifp = (volatile struct fwohci_txpkthdr *) db_tr->db[1].db.immed;
875 info = &tinfo[tcode];
876 hdr_len = pl_off = info->hdr_len;
876 for( i = 0 ; i < pl_off ; i+= 4){
877 ohcifp->mode.ld[i/4] = fp->mode.ld[i/4];
878 }
879 ohcifp->mode.common.spd = xfer->spd;
877
878 ld = &ohcifp->mode.ld[0];
879 ld[0] = ld[1] = ld[2] = ld[3] = 0;
880 for( i = 0 ; i < pl_off ; i+= 4)
881 ld[i/4] = fp->mode.ld[i/4];
882
883 ohcifp->mode.common.spd = xfer->spd & 0x7;
880 if (tcode == FWTCODE_STREAM ){
881 hdr_len = 8;
882 ohcifp->mode.stream.len = fp->mode.stream.len;
883 } else if (tcode == FWTCODE_PHY) {
884 hdr_len = 12;
884 if (tcode == FWTCODE_STREAM ){
885 hdr_len = 8;
886 ohcifp->mode.stream.len = fp->mode.stream.len;
887 } else if (tcode == FWTCODE_PHY) {
888 hdr_len = 12;
885 ohcifp->mode.ld[1] = fp->mode.ld[1];
886 ohcifp->mode.ld[2] = fp->mode.ld[2];
889 ld[1] = fp->mode.ld[1];
890 ld[2] = fp->mode.ld[2];
887 ohcifp->mode.common.spd = 0;
888 ohcifp->mode.common.tcode = FWOHCITCODE_PHY;
889 } else {
890 ohcifp->mode.asycomm.dst = fp->mode.hdr.dst;
891 ohcifp->mode.asycomm.srcbus = OHCI_ASYSRCBUS;
892 ohcifp->mode.asycomm.tlrt |= FWRETRY_X;
893 }
894 db = &db_tr->db[0];
895 FWOHCI_DMA_WRITE(db->db.desc.cmd,
896 OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | hdr_len);
891 ohcifp->mode.common.spd = 0;
892 ohcifp->mode.common.tcode = FWOHCITCODE_PHY;
893 } else {
894 ohcifp->mode.asycomm.dst = fp->mode.hdr.dst;
895 ohcifp->mode.asycomm.srcbus = OHCI_ASYSRCBUS;
896 ohcifp->mode.asycomm.tlrt |= FWRETRY_X;
897 }
898 db = &db_tr->db[0];
899 FWOHCI_DMA_WRITE(db->db.desc.cmd,
900 OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | hdr_len);
901 FWOHCI_DMA_WRITE(db->db.desc.addr, 0);
897 FWOHCI_DMA_WRITE(db->db.desc.res, 0);
898/* Specify bound timer of asy. responce */
899 if(&sc->atrs == dbch){
900 FWOHCI_DMA_WRITE(db->db.desc.res,
901 (OREAD(sc, OHCI_CYCLETIMER) >> 12) + (1 << 13));
902 }
903#if BYTE_ORDER == BIG_ENDIAN
904 if (tcode == FWTCODE_WREQQ || tcode == FWTCODE_RRESQ)
905 hdr_len = 12;
906 for (i = 0; i < hdr_len/4; i ++)
902 FWOHCI_DMA_WRITE(db->db.desc.res, 0);
903/* Specify bound timer of asy. responce */
904 if(&sc->atrs == dbch){
905 FWOHCI_DMA_WRITE(db->db.desc.res,
906 (OREAD(sc, OHCI_CYCLETIMER) >> 12) + (1 << 13));
907 }
908#if BYTE_ORDER == BIG_ENDIAN
909 if (tcode == FWTCODE_WREQQ || tcode == FWTCODE_RRESQ)
910 hdr_len = 12;
911 for (i = 0; i < hdr_len/4; i ++)
907 FWOHCI_DMA_WRITE(ohcifp->mode.ld[i], ohcifp->mode.ld[i]);
912 FWOHCI_DMA_WRITE(ld[i], ld[i]);
908#endif
909
910again:
911 db_tr->dbcnt = 2;
912 db = &db_tr->db[db_tr->dbcnt];
913 pl_len = xfer->send.len - pl_off;
914 if (pl_len > 0) {
915 int err;

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

1052 if(!(status & OHCI_CNTL_DMA_ACTIVE)){
1053 if (fc->status != FWBUSRESET)
1054 /* maybe out of order?? */
1055 goto out;
1056 }
1057 bus_dmamap_sync(dbch->dmat, tr->dma_map,
1058 BUS_DMASYNC_POSTWRITE);
1059 bus_dmamap_unload(dbch->dmat, tr->dma_map);
913#endif
914
915again:
916 db_tr->dbcnt = 2;
917 db = &db_tr->db[db_tr->dbcnt];
918 pl_len = xfer->send.len - pl_off;
919 if (pl_len > 0) {
920 int err;

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

1057 if(!(status & OHCI_CNTL_DMA_ACTIVE)){
1058 if (fc->status != FWBUSRESET)
1059 /* maybe out of order?? */
1060 goto out;
1061 }
1062 bus_dmamap_sync(dbch->dmat, tr->dma_map,
1063 BUS_DMASYNC_POSTWRITE);
1064 bus_dmamap_unload(dbch->dmat, tr->dma_map);
1060#if 0
1061 dump_db(sc, ch);
1065#if 1
1066 if (firewire_debug)
1067 dump_db(sc, ch);
1062#endif
1063 if(status & OHCI_CNTL_DMA_DEAD) {
1064 /* Stop DMA */
1065 OWRITE(sc, OHCI_DMACTLCLR(off), OHCI_CNTL_DMA_RUN);
1066 device_printf(sc->fc.dev, "force reset AT FIFO\n");
1067 OWRITE(sc, OHCI_HCCCTLCLR, OHCI_HCC_LINKEN);
1068 OWRITE(sc, OHCI_HCCCTL, OHCI_HCC_LPS | OHCI_HCC_LINKEN);
1069 OWRITE(sc, OHCI_DMACTLCLR(off), OHCI_CNTL_DMA_RUN);

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

2101 struct fw_xferq *it;
2102 u_int32_t stat, count;
2103 int s, w=0, ldesc;
2104
2105 it = fc->it[dmach];
2106 ldesc = sc->it[dmach].ndesc - 1;
2107 s = splfw(); /* unnecessary ? */
2108 fwdma_sync_multiseg_all(sc->it[dmach].am, BUS_DMASYNC_POSTREAD);
1068#endif
1069 if(status & OHCI_CNTL_DMA_DEAD) {
1070 /* Stop DMA */
1071 OWRITE(sc, OHCI_DMACTLCLR(off), OHCI_CNTL_DMA_RUN);
1072 device_printf(sc->fc.dev, "force reset AT FIFO\n");
1073 OWRITE(sc, OHCI_HCCCTLCLR, OHCI_HCC_LINKEN);
1074 OWRITE(sc, OHCI_HCCCTL, OHCI_HCC_LPS | OHCI_HCC_LINKEN);
1075 OWRITE(sc, OHCI_DMACTLCLR(off), OHCI_CNTL_DMA_RUN);

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

2107 struct fw_xferq *it;
2108 u_int32_t stat, count;
2109 int s, w=0, ldesc;
2110
2111 it = fc->it[dmach];
2112 ldesc = sc->it[dmach].ndesc - 1;
2113 s = splfw(); /* unnecessary ? */
2114 fwdma_sync_multiseg_all(sc->it[dmach].am, BUS_DMASYNC_POSTREAD);
2115 if (firewire_debug)
2116 dump_db(sc, ITX_CH + dmach);
2109 while ((chunk = STAILQ_FIRST(&it->stdma)) != NULL) {
2110 db = ((struct fwohcidb_tr *)(chunk->end))->db;
2111 stat = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2112 >> OHCI_STATUS_SHIFT;
2113 db = ((struct fwohcidb_tr *)(chunk->start))->db;
2117 while ((chunk = STAILQ_FIRST(&it->stdma)) != NULL) {
2118 db = ((struct fwohcidb_tr *)(chunk->end))->db;
2119 stat = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2120 >> OHCI_STATUS_SHIFT;
2121 db = ((struct fwohcidb_tr *)(chunk->start))->db;
2122 /* timestamp */
2114 count = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2115 & OHCI_COUNT_MASK;
2116 if (stat == 0)
2117 break;
2118 STAILQ_REMOVE_HEAD(&it->stdma, link);
2119 switch (stat & FWOHCIEV_MASK){
2120 case FWOHCIEV_ACKCOMPL:
2121#if 0

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

2449/*
2450device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, db_tr->bus_addr, fdb_tr->bus_addr);
2451*/
2452 for (idb = 0; idb < dbch->xferq.bnpacket; idb ++) {
2453 db = db_tr->db;
2454 fp = (struct fw_pkt *)db_tr->buf;
2455 ohcifp = (volatile struct fwohci_txpkthdr *) db[1].db.immed;
2456 ohcifp->mode.ld[0] = fp->mode.ld[0];
2123 count = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2124 & OHCI_COUNT_MASK;
2125 if (stat == 0)
2126 break;
2127 STAILQ_REMOVE_HEAD(&it->stdma, link);
2128 switch (stat & FWOHCIEV_MASK){
2129 case FWOHCIEV_ACKCOMPL:
2130#if 0

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

2458/*
2459device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, db_tr->bus_addr, fdb_tr->bus_addr);
2460*/
2461 for (idb = 0; idb < dbch->xferq.bnpacket; idb ++) {
2462 db = db_tr->db;
2463 fp = (struct fw_pkt *)db_tr->buf;
2464 ohcifp = (volatile struct fwohci_txpkthdr *) db[1].db.immed;
2465 ohcifp->mode.ld[0] = fp->mode.ld[0];
2466 ohcifp->mode.common.spd = 0 & 0x7;
2457 ohcifp->mode.stream.len = fp->mode.stream.len;
2458 ohcifp->mode.stream.chtag = chtag;
2459 ohcifp->mode.stream.tcode = 0xa;
2467 ohcifp->mode.stream.len = fp->mode.stream.len;
2468 ohcifp->mode.stream.chtag = chtag;
2469 ohcifp->mode.stream.tcode = 0xa;
2460 ohcifp->mode.stream.spd = 0;
2461#if BYTE_ORDER == BIG_ENDIAN
2462 FWOHCI_DMA_WRITE(db[1].db.immed[0], db[1].db.immed[0]);
2463 FWOHCI_DMA_WRITE(db[1].db.immed[1], db[1].db.immed[1]);
2464#endif
2465
2466 FWOHCI_DMA_CLEAR(db[2].db.desc.cmd, OHCI_COUNT_MASK);
2467 FWOHCI_DMA_SET(db[2].db.desc.cmd, fp->mode.stream.len);
2468 FWOHCI_DMA_WRITE(db[2].db.desc.res, 0);

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

2509 err = EINVAL;
2510 return err;
2511 }
2512 db_tr->buf = fwdma_v_addr(it->buf, poffset);
2513 db_tr->dbcnt = 3;
2514
2515 FWOHCI_DMA_WRITE(db[0].db.desc.cmd,
2516 OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | 8);
2470#if BYTE_ORDER == BIG_ENDIAN
2471 FWOHCI_DMA_WRITE(db[1].db.immed[0], db[1].db.immed[0]);
2472 FWOHCI_DMA_WRITE(db[1].db.immed[1], db[1].db.immed[1]);
2473#endif
2474
2475 FWOHCI_DMA_CLEAR(db[2].db.desc.cmd, OHCI_COUNT_MASK);
2476 FWOHCI_DMA_SET(db[2].db.desc.cmd, fp->mode.stream.len);
2477 FWOHCI_DMA_WRITE(db[2].db.desc.res, 0);

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

2518 err = EINVAL;
2519 return err;
2520 }
2521 db_tr->buf = fwdma_v_addr(it->buf, poffset);
2522 db_tr->dbcnt = 3;
2523
2524 FWOHCI_DMA_WRITE(db[0].db.desc.cmd,
2525 OHCI_OUTPUT_MORE | OHCI_KEY_ST2 | 8);
2526 FWOHCI_DMA_WRITE(db[0].db.desc.addr, 0);
2527 bzero((void *)(uintptr_t)(volatile void *)
2528 &db[1].db.immed[0], sizeof(db[1].db.immed));
2517 FWOHCI_DMA_WRITE(db[2].db.desc.addr,
2518 fwdma_bus_addr(it->buf, poffset) + sizeof(u_int32_t));
2519
2520 FWOHCI_DMA_WRITE(db[2].db.desc.cmd,
2521 OHCI_OUTPUT_LAST | OHCI_UPDATE | OHCI_BRANCH_ALWAYS);
2522#if 1
2523 FWOHCI_DMA_WRITE(db[0].db.desc.res, 0);
2524 FWOHCI_DMA_WRITE(db[2].db.desc.res, 0);

--- 368 unchanged lines hidden ---
2529 FWOHCI_DMA_WRITE(db[2].db.desc.addr,
2530 fwdma_bus_addr(it->buf, poffset) + sizeof(u_int32_t));
2531
2532 FWOHCI_DMA_WRITE(db[2].db.desc.cmd,
2533 OHCI_OUTPUT_LAST | OHCI_UPDATE | OHCI_BRANCH_ALWAYS);
2534#if 1
2535 FWOHCI_DMA_WRITE(db[0].db.desc.res, 0);
2536 FWOHCI_DMA_WRITE(db[2].db.desc.res, 0);

--- 368 unchanged lines hidden ---