Deleted Added
full compact
fwohci.c (169132) fwohci.c (170374)
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 169132 2007-04-30 14:06:30Z simokawa $
34 * $FreeBSD: head/sys/dev/firewire/fwohci.c 170374 2007-06-06 14:31:36Z 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

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

47#include <sys/mbuf.h>
48#include <sys/malloc.h>
49#include <sys/sockio.h>
50#include <sys/sysctl.h>
51#include <sys/bus.h>
52#include <sys/kernel.h>
53#include <sys/conf.h>
54#include <sys/endian.h>
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

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

47#include <sys/mbuf.h>
48#include <sys/malloc.h>
49#include <sys/sockio.h>
50#include <sys/sysctl.h>
51#include <sys/bus.h>
52#include <sys/kernel.h>
53#include <sys/conf.h>
54#include <sys/endian.h>
55#include <sys/kdb.h>
55
56#include <machine/bus.h>
57
58#if defined(__DragonFly__) || __FreeBSD_version < 500000
59#include <machine/clock.h> /* for DELAY() */
60#endif
61
62#ifdef __DragonFly__

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

85static char dbcode[16][0x10]={"OUTM", "OUTL","INPM","INPL",
86 "STOR","LOAD","NOP ","STOP",};
87
88static char dbkey[8][0x10]={"ST0", "ST1","ST2","ST3",
89 "UNDEF","REG","SYS","DEV"};
90static char dbcond[4][0x10]={"NEV","C=1", "C=0", "ALL"};
91char fwohcicode[32][0x20]={
92 "No stat","Undef","long","miss Ack err",
56
57#include <machine/bus.h>
58
59#if defined(__DragonFly__) || __FreeBSD_version < 500000
60#include <machine/clock.h> /* for DELAY() */
61#endif
62
63#ifdef __DragonFly__

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

86static char dbcode[16][0x10]={"OUTM", "OUTL","INPM","INPL",
87 "STOR","LOAD","NOP ","STOP",};
88
89static char dbkey[8][0x10]={"ST0", "ST1","ST2","ST3",
90 "UNDEF","REG","SYS","DEV"};
91static char dbcond[4][0x10]={"NEV","C=1", "C=0", "ALL"};
92char fwohcicode[32][0x20]={
93 "No stat","Undef","long","miss Ack err",
93 "underrun","overrun","desc err", "data read err",
94 "FIFO underrun","FIFO overrun","desc err", "data read err",
94 "data write err","bus reset","timeout","tcode err",
95 "Undef","Undef","unknown event","flushed",
96 "Undef","ack complete","ack pend","Undef",
97 "ack busy_X","ack busy_A","ack busy_B","Undef",
98 "Undef","Undef","Undef","ack tardy",
99 "Undef","ack data_err","ack type_err",""};
100
101#define MAX_SPEED 3
102extern char *linkspeed[];
103uint32_t tagbit[4] = { 1 << 28, 1 << 29, 1 << 30, 1 << 31};
104
105static struct tcode_info tinfo[] = {
95 "data write err","bus reset","timeout","tcode err",
96 "Undef","Undef","unknown event","flushed",
97 "Undef","ack complete","ack pend","Undef",
98 "ack busy_X","ack busy_A","ack busy_B","Undef",
99 "Undef","Undef","Undef","ack tardy",
100 "Undef","ack data_err","ack type_err",""};
101
102#define MAX_SPEED 3
103extern char *linkspeed[];
104uint32_t tagbit[4] = { 1 << 28, 1 << 29, 1 << 30, 1 << 31};
105
106static struct tcode_info tinfo[] = {
106/* hdr_len block flag*/
107/* 0 WREQQ */ {16, FWTI_REQ | FWTI_TLABEL},
108/* 1 WREQB */ {16, FWTI_REQ | FWTI_TLABEL | FWTI_BLOCK_ASY},
109/* 2 WRES */ {12, FWTI_RES},
110/* 3 XXX */ { 0, 0},
111/* 4 RREQQ */ {12, FWTI_REQ | FWTI_TLABEL},
112/* 5 RREQB */ {16, FWTI_REQ | FWTI_TLABEL},
113/* 6 RRESQ */ {16, FWTI_RES},
114/* 7 RRESB */ {16, FWTI_RES | FWTI_BLOCK_ASY},
115/* 8 CYCS */ { 0, 0},
116/* 9 LREQ */ {16, FWTI_REQ | FWTI_TLABEL | FWTI_BLOCK_ASY},
117/* a STREAM */ { 4, FWTI_REQ | FWTI_BLOCK_STR},
118/* b LRES */ {16, FWTI_RES | FWTI_BLOCK_ASY},
119/* c XXX */ { 0, 0},
120/* d XXX */ { 0, 0},
121/* e PHY */ {12, FWTI_REQ},
122/* f XXX */ { 0, 0}
107/* hdr_len block flag valid_response */
108/* 0 WREQQ */ {16, FWTI_REQ | FWTI_TLABEL, FWTCODE_WRES},
109/* 1 WREQB */ {16, FWTI_REQ | FWTI_TLABEL | FWTI_BLOCK_ASY, FWTCODE_WRES},
110/* 2 WRES */ {12, FWTI_RES, 0xff},
111/* 3 XXX */ { 0, 0, 0xff},
112/* 4 RREQQ */ {12, FWTI_REQ | FWTI_TLABEL, FWTCODE_RRESQ},
113/* 5 RREQB */ {16, FWTI_REQ | FWTI_TLABEL, FWTCODE_RRESB},
114/* 6 RRESQ */ {16, FWTI_RES, 0xff},
115/* 7 RRESB */ {16, FWTI_RES | FWTI_BLOCK_ASY, 0xff},
116/* 8 CYCS */ { 0, 0, 0xff},
117/* 9 LREQ */ {16, FWTI_REQ | FWTI_TLABEL | FWTI_BLOCK_ASY, FWTCODE_LRES},
118/* a STREAM */ { 4, FWTI_REQ | FWTI_BLOCK_STR, 0xff},
119/* b LRES */ {16, FWTI_RES | FWTI_BLOCK_ASY, 0xff},
120/* c XXX */ { 0, 0, 0xff},
121/* d XXX */ { 0, 0, 0xff},
122/* e PHY */ {12, FWTI_REQ, 0xff},
123/* f XXX */ { 0, 0, 0xff}
123};
124
125#define OHCI_WRITE_SIGMASK 0xffff0000
126#define OHCI_READ_SIGMASK 0xffff0000
127
128#define OWRITE(sc, r, x) bus_space_write_4((sc)->bst, (sc)->bsh, (r), (x))
129#define OREAD(sc, r) bus_space_read_4((sc)->bst, (sc)->bsh, (r))
130

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

154static int fwohci_add_tx_buf (struct fwohci_dbch *, struct fwohcidb_tr *, int);
155static void dump_db (struct fwohci_softc *, uint32_t);
156static void print_db (struct fwohcidb_tr *, struct fwohcidb *, uint32_t , uint32_t);
157static void dump_dma (struct fwohci_softc *, uint32_t);
158static uint32_t fwohci_cyctimer (struct firewire_comm *);
159static void fwohci_rbuf_update (struct fwohci_softc *, int);
160static void fwohci_tbuf_update (struct fwohci_softc *, int);
161void fwohci_txbufdb (struct fwohci_softc *, int , struct fw_bulkxfer *);
124};
125
126#define OHCI_WRITE_SIGMASK 0xffff0000
127#define OHCI_READ_SIGMASK 0xffff0000
128
129#define OWRITE(sc, r, x) bus_space_write_4((sc)->bst, (sc)->bsh, (r), (x))
130#define OREAD(sc, r) bus_space_read_4((sc)->bst, (sc)->bsh, (r))
131

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

155static int fwohci_add_tx_buf (struct fwohci_dbch *, struct fwohcidb_tr *, int);
156static void dump_db (struct fwohci_softc *, uint32_t);
157static void print_db (struct fwohcidb_tr *, struct fwohcidb *, uint32_t , uint32_t);
158static void dump_dma (struct fwohci_softc *, uint32_t);
159static uint32_t fwohci_cyctimer (struct firewire_comm *);
160static void fwohci_rbuf_update (struct fwohci_softc *, int);
161static void fwohci_tbuf_update (struct fwohci_softc *, int);
162void fwohci_txbufdb (struct fwohci_softc *, int , struct fw_bulkxfer *);
162#if FWOHCI_TASKQUEUE
163static void fwohci_complete(void *, int);
164#endif
163static void fwohci_task_busreset(void *, int);
164static void fwohci_task_sid(void *, int);
165static void fwohci_task_dma(void *, int);
165
166/*
167 * memory allocated for DMA programs
168 */
169#define DMA_PROG_ALLOC (8 * PAGE_SIZE)
170
171#define NDB FWMAXQUEUE
172

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

259#define OHCI_IRCMD(CH) (OHCI_IROFF(CH) + 0xc)
260#define OHCI_IRMATCH(CH) (OHCI_IROFF(CH) + 0x10)
261
262d_ioctl_t fwohci_ioctl;
263
264/*
265 * Communication with PHY device
266 */
166
167/*
168 * memory allocated for DMA programs
169 */
170#define DMA_PROG_ALLOC (8 * PAGE_SIZE)
171
172#define NDB FWMAXQUEUE
173

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

260#define OHCI_IRCMD(CH) (OHCI_IROFF(CH) + 0xc)
261#define OHCI_IRMATCH(CH) (OHCI_IROFF(CH) + 0x10)
262
263d_ioctl_t fwohci_ioctl;
264
265/*
266 * Communication with PHY device
267 */
268/* XXX need lock for phy access */
267static uint32_t
268fwphy_wrdata( struct fwohci_softc *sc, uint32_t addr, uint32_t data)
269{
270 uint32_t fun;
271
272 addr &= 0xf;
273 data &= 0xff;
274

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

584 }
585 for( i = 0, db_tr = sc->atrs.top; i < sc->atrs.ndb ;
586 i ++, db_tr = STAILQ_NEXT(db_tr, link)){
587 db_tr->xfer = NULL;
588 }
589
590
591 /* Enable interrupts */
269static uint32_t
270fwphy_wrdata( struct fwohci_softc *sc, uint32_t addr, uint32_t data)
271{
272 uint32_t fun;
273
274 addr &= 0xf;
275 data &= 0xff;
276

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

586 }
587 for( i = 0, db_tr = sc->atrs.top; i < sc->atrs.ndb ;
588 i ++, db_tr = STAILQ_NEXT(db_tr, link)){
589 db_tr->xfer = NULL;
590 }
591
592
593 /* Enable interrupts */
592 OWRITE(sc, FWOHCI_INTMASK,
593 OHCI_INT_ERR | OHCI_INT_PHY_SID
594 sc->intmask = (OHCI_INT_ERR | OHCI_INT_PHY_SID
594 | OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS
595 | OHCI_INT_DMA_PRRQ | OHCI_INT_DMA_PRRS
596 | OHCI_INT_PHY_BUS_R | OHCI_INT_PW_ERR);
595 | OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS
596 | OHCI_INT_DMA_PRRQ | OHCI_INT_DMA_PRRS
597 | OHCI_INT_PHY_BUS_R | OHCI_INT_PW_ERR);
598 sc->intmask |= OHCI_INT_DMA_IR | OHCI_INT_DMA_IT;
599 sc->intmask |= OHCI_INT_CYC_LOST | OHCI_INT_PHY_INT;
600 OWRITE(sc, FWOHCI_INTMASK, sc->intmask);
597 fwohci_set_intr(&sc->fc, 1);
598
599}
600
601int
602fwohci_init(struct fwohci_softc *sc, device_t dev)
603{
604 int i, mver;
605 uint32_t reg;
606 uint8_t ui[8];
607
601 fwohci_set_intr(&sc->fc, 1);
602
603}
604
605int
606fwohci_init(struct fwohci_softc *sc, device_t dev)
607{
608 int i, mver;
609 uint32_t reg;
610 uint8_t ui[8];
611
608#if FWOHCI_TASKQUEUE
609 TASK_INIT(&sc->fwohci_task_complete, 0, fwohci_complete, sc);
610#endif
611
612/* OHCI version */
613 reg = OREAD(sc, OHCI_VERSION);
614 mver = (reg >> 16) & 0xff;
615 device_printf(dev, "OHCI version %x.%x (ROM=%d)\n",
616 mver, reg & 0xff, (reg>>24) & 1);
617 if (mver < 1 || mver > 9) {
618 device_printf(dev, "invalid OHCI version\n");
619 return (ENXIO);

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

756#endif
757 sc->fc.itx_post = NULL;
758 sc->fc.timeout = fwohci_timeout;
759 sc->fc.poll = fwohci_poll;
760 sc->fc.set_intr = fwohci_set_intr;
761
762 sc->intmask = sc->irstat = sc->itstat = 0;
763
612/* OHCI version */
613 reg = OREAD(sc, OHCI_VERSION);
614 mver = (reg >> 16) & 0xff;
615 device_printf(dev, "OHCI version %x.%x (ROM=%d)\n",
616 mver, reg & 0xff, (reg>>24) & 1);
617 if (mver < 1 || mver > 9) {
618 device_printf(dev, "invalid OHCI version\n");
619 return (ENXIO);

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

756#endif
757 sc->fc.itx_post = NULL;
758 sc->fc.timeout = fwohci_timeout;
759 sc->fc.poll = fwohci_poll;
760 sc->fc.set_intr = fwohci_set_intr;
761
762 sc->intmask = sc->irstat = sc->itstat = 0;
763
764 /* Init task queue */
765 sc->fc.taskqueue = taskqueue_create_fast("fw_taskq", M_WAITOK,
766 taskqueue_thread_enqueue, &sc->fc.taskqueue);
767 taskqueue_start_threads(&sc->fc.taskqueue, 1, PI_NET, "fw%d_taskq",
768 device_get_unit(dev));
769 TASK_INIT(&sc->fwohci_task_busreset, 2, fwohci_task_busreset, sc);
770 TASK_INIT(&sc->fwohci_task_sid, 1, fwohci_task_sid, sc);
771 TASK_INIT(&sc->fwohci_task_dma, 0, fwohci_task_dma, sc);
772
764 fw_init(&sc->fc);
765 fwohci_reset(sc, dev);
766
767 return 0;
768}
769
770void
771fwohci_timeout(void *arg)

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

797
798 fwohci_db_free(&sc->atrq);
799 fwohci_db_free(&sc->atrs);
800
801 for( i = 0 ; i < sc->fc.nisodma ; i ++ ){
802 fwohci_db_free(&sc->it[i]);
803 fwohci_db_free(&sc->ir[i]);
804 }
773 fw_init(&sc->fc);
774 fwohci_reset(sc, dev);
775
776 return 0;
777}
778
779void
780fwohci_timeout(void *arg)

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

806
807 fwohci_db_free(&sc->atrq);
808 fwohci_db_free(&sc->atrs);
809
810 for( i = 0 ; i < sc->fc.nisodma ; i ++ ){
811 fwohci_db_free(&sc->it[i]);
812 fwohci_db_free(&sc->ir[i]);
813 }
814 if (sc->fc.taskqueue != NULL) {
815 taskqueue_drain(sc->fc.taskqueue, &sc->fwohci_task_busreset);
816 taskqueue_drain(sc->fc.taskqueue, &sc->fwohci_task_sid);
817 taskqueue_drain(sc->fc.taskqueue, &sc->fwohci_task_dma);
818 taskqueue_drain(sc->fc.taskqueue, &sc->fc.task_timeout);
819 taskqueue_free(sc->fc.taskqueue);
820 sc->fc.taskqueue = NULL;
821 }
805
806 return 0;
807}
808
809#define LAST_DB(dbtr, db) do { \
810 struct fwohcidb_tr *_dbtr = (dbtr); \
811 int _cnt = _dbtr->dbcnt; \
812 db = &_dbtr->db[ (_cnt > 2) ? (_cnt -1) : 0]; \

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

855 struct fw_pkt *fp;
856 struct fwohci_txpkthdr *ohcifp;
857 struct fwohcidb_tr *db_tr;
858 struct fwohcidb *db;
859 uint32_t *ld;
860 struct tcode_info *info;
861 static int maxdesc=0;
862
822
823 return 0;
824}
825
826#define LAST_DB(dbtr, db) do { \
827 struct fwohcidb_tr *_dbtr = (dbtr); \
828 int _cnt = _dbtr->dbcnt; \
829 db = &_dbtr->db[ (_cnt > 2) ? (_cnt -1) : 0]; \

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

872 struct fw_pkt *fp;
873 struct fwohci_txpkthdr *ohcifp;
874 struct fwohcidb_tr *db_tr;
875 struct fwohcidb *db;
876 uint32_t *ld;
877 struct tcode_info *info;
878 static int maxdesc=0;
879
880 FW_GLOCK_ASSERT(&sc->fc);
881
863 if(&sc->atrq == dbch){
864 off = OHCI_ATQOFF;
865 }else if(&sc->atrs == dbch){
866 off = OHCI_ATSOFF;
867 }else{
868 return;
869 }
870
871 if (dbch->flags & FWOHCI_DBCH_FULL)
872 return;
873
874 s = splfw();
875 db_tr = dbch->top;
876txloop:
877 xfer = STAILQ_FIRST(&dbch->xferq.q);
878 if(xfer == NULL){
879 goto kick;
880 }
882 if(&sc->atrq == dbch){
883 off = OHCI_ATQOFF;
884 }else if(&sc->atrs == dbch){
885 off = OHCI_ATSOFF;
886 }else{
887 return;
888 }
889
890 if (dbch->flags & FWOHCI_DBCH_FULL)
891 return;
892
893 s = splfw();
894 db_tr = dbch->top;
895txloop:
896 xfer = STAILQ_FIRST(&dbch->xferq.q);
897 if(xfer == NULL){
898 goto kick;
899 }
900#if 0
881 if(dbch->xferq.queued == 0 ){
882 device_printf(sc->fc.dev, "TX queue empty\n");
883 }
901 if(dbch->xferq.queued == 0 ){
902 device_printf(sc->fc.dev, "TX queue empty\n");
903 }
904#endif
884 STAILQ_REMOVE_HEAD(&dbch->xferq.q, link);
885 db_tr->xfer = xfer;
905 STAILQ_REMOVE_HEAD(&dbch->xferq.q, link);
906 db_tr->xfer = xfer;
886 xfer->state = FWXF_START;
907 xfer->flag = FWXF_START;
887
888 fp = &xfer->send.hdr;
889 tcode = fp->mode.common.tcode;
890
891 ohcifp = (struct fwohci_txpkthdr *) db_tr->db[1].db.immed;
892 info = &tinfo[tcode];
893 hdr_len = pl_off = info->hdr_len;
894

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

988 STAILQ_NEXT(db_tr, link)->bus_addr);
989
990 if(fsegment == -1 )
991 fsegment = db_tr->dbcnt;
992 if (dbch->pdb_tr != NULL) {
993 LAST_DB(dbch->pdb_tr, db);
994 FWOHCI_DMA_SET(db->db.desc.depend, db_tr->dbcnt);
995 }
908
909 fp = &xfer->send.hdr;
910 tcode = fp->mode.common.tcode;
911
912 ohcifp = (struct fwohci_txpkthdr *) db_tr->db[1].db.immed;
913 info = &tinfo[tcode];
914 hdr_len = pl_off = info->hdr_len;
915

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

1009 STAILQ_NEXT(db_tr, link)->bus_addr);
1010
1011 if(fsegment == -1 )
1012 fsegment = db_tr->dbcnt;
1013 if (dbch->pdb_tr != NULL) {
1014 LAST_DB(dbch->pdb_tr, db);
1015 FWOHCI_DMA_SET(db->db.desc.depend, db_tr->dbcnt);
1016 }
1017 dbch->xferq.queued ++;
996 dbch->pdb_tr = db_tr;
997 db_tr = STAILQ_NEXT(db_tr, link);
998 if(db_tr != dbch->bottom){
999 goto txloop;
1000 } else {
1001 device_printf(sc->fc.dev, "fwohci_start: lack of db_trq\n");
1002 dbch->flags |= FWOHCI_DBCH_FULL;
1003 }

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

1021 splx(s);
1022 return;
1023}
1024
1025static void
1026fwohci_start_atq(struct firewire_comm *fc)
1027{
1028 struct fwohci_softc *sc = (struct fwohci_softc *)fc;
1018 dbch->pdb_tr = db_tr;
1019 db_tr = STAILQ_NEXT(db_tr, link);
1020 if(db_tr != dbch->bottom){
1021 goto txloop;
1022 } else {
1023 device_printf(sc->fc.dev, "fwohci_start: lack of db_trq\n");
1024 dbch->flags |= FWOHCI_DBCH_FULL;
1025 }

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

1043 splx(s);
1044 return;
1045}
1046
1047static void
1048fwohci_start_atq(struct firewire_comm *fc)
1049{
1050 struct fwohci_softc *sc = (struct fwohci_softc *)fc;
1051 FW_GLOCK(&sc->fc);
1029 fwohci_start( sc, &(sc->atrq));
1052 fwohci_start( sc, &(sc->atrq));
1053 FW_GUNLOCK(&sc->fc);
1030 return;
1031}
1032
1033static void
1034fwohci_start_ats(struct firewire_comm *fc)
1035{
1036 struct fwohci_softc *sc = (struct fwohci_softc *)fc;
1054 return;
1055}
1056
1057static void
1058fwohci_start_ats(struct firewire_comm *fc)
1059{
1060 struct fwohci_softc *sc = (struct fwohci_softc *)fc;
1061 FW_GLOCK(&sc->fc);
1037 fwohci_start( sc, &(sc->atrs));
1062 fwohci_start( sc, &(sc->atrs));
1063 FW_GUNLOCK(&sc->fc);
1038 return;
1039}
1040
1041void
1042fwohci_txd(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1043{
1044 int s, ch, err = 0;
1045 struct fwohcidb_tr *tr;

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

1117 default:
1118 device_printf(sc->fc.dev, "txd err=%2x %s\n",
1119 stat, fwohcicode[stat]);
1120 err = EINVAL;
1121 break;
1122 }
1123 if (tr->xfer != NULL) {
1124 xfer = tr->xfer;
1064 return;
1065}
1066
1067void
1068fwohci_txd(struct fwohci_softc *sc, struct fwohci_dbch *dbch)
1069{
1070 int s, ch, err = 0;
1071 struct fwohcidb_tr *tr;

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

1143 default:
1144 device_printf(sc->fc.dev, "txd err=%2x %s\n",
1145 stat, fwohcicode[stat]);
1146 err = EINVAL;
1147 break;
1148 }
1149 if (tr->xfer != NULL) {
1150 xfer = tr->xfer;
1125 if (xfer->state == FWXF_RCVD) {
1151 if (xfer->flag & FWXF_RCVD) {
1126#if 0
1127 if (firewire_debug)
1128 printf("already rcvd\n");
1129#endif
1130 fw_xfer_done(xfer);
1131 } else {
1152#if 0
1153 if (firewire_debug)
1154 printf("already rcvd\n");
1155#endif
1156 fw_xfer_done(xfer);
1157 } else {
1132 xfer->state = FWXF_SENT;
1158 xfer->flag = FWXF_SENT;
1133 if (err == EBUSY && fc->status != FWBUSRESET) {
1159 if (err == EBUSY && fc->status != FWBUSRESET) {
1134 xfer->state = FWXF_BUSY;
1160 xfer->flag = FWXF_BUSY;
1135 xfer->resp = err;
1136 xfer->recv.pay_len = 0;
1137 fw_xfer_done(xfer);
1138 } else if (stat != FWOHCIEV_ACKPEND) {
1139 if (stat != FWOHCIEV_ACKCOMPL)
1161 xfer->resp = err;
1162 xfer->recv.pay_len = 0;
1163 fw_xfer_done(xfer);
1164 } else if (stat != FWOHCIEV_ACKPEND) {
1165 if (stat != FWOHCIEV_ACKCOMPL)
1140 xfer->state = FWXF_SENTERR;
1166 xfer->flag = FWXF_SENTERR;
1141 xfer->resp = err;
1142 xfer->recv.pay_len = 0;
1143 fw_xfer_done(xfer);
1144 }
1145 }
1146 /*
1147 * The watchdog timer takes care of split
1148 * transcation timeout for ACKPEND case.
1149 */
1150 } else {
1151 printf("this shouldn't happen\n");
1152 }
1167 xfer->resp = err;
1168 xfer->recv.pay_len = 0;
1169 fw_xfer_done(xfer);
1170 }
1171 }
1172 /*
1173 * The watchdog timer takes care of split
1174 * transcation timeout for ACKPEND case.
1175 */
1176 } else {
1177 printf("this shouldn't happen\n");
1178 }
1179 FW_GLOCK(fc);
1153 dbch->xferq.queued --;
1180 dbch->xferq.queued --;
1181 FW_GUNLOCK(fc);
1154 tr->xfer = NULL;
1155
1156 packets ++;
1157 tr = STAILQ_NEXT(tr, link);
1158 dbch->bottom = tr;
1159 if (dbch->bottom == dbch->top) {
1160 /* we reaches the end of context program */
1161 if (firewire_debug && dbch->xferq.queued > 0)
1162 printf("queued > 0\n");
1163 break;
1164 }
1165 }
1166out:
1167 if ((dbch->flags & FWOHCI_DBCH_FULL) && packets > 0) {
1168 printf("make free slot\n");
1169 dbch->flags &= ~FWOHCI_DBCH_FULL;
1182 tr->xfer = NULL;
1183
1184 packets ++;
1185 tr = STAILQ_NEXT(tr, link);
1186 dbch->bottom = tr;
1187 if (dbch->bottom == dbch->top) {
1188 /* we reaches the end of context program */
1189 if (firewire_debug && dbch->xferq.queued > 0)
1190 printf("queued > 0\n");
1191 break;
1192 }
1193 }
1194out:
1195 if ((dbch->flags & FWOHCI_DBCH_FULL) && packets > 0) {
1196 printf("make free slot\n");
1197 dbch->flags &= ~FWOHCI_DBCH_FULL;
1198 FW_GLOCK(fc);
1170 fwohci_start(sc, dbch);
1199 fwohci_start(sc, dbch);
1200 FW_GUNLOCK(fc);
1171 }
1172 splx(s);
1173}
1174
1175static void
1176fwohci_db_free(struct fwohci_dbch *dbch)
1177{
1178 struct fwohcidb_tr *db_tr;

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

1216 /*highaddr*/ BUS_SPACE_MAXADDR,
1217 /*filter*/NULL, /*filterarg*/NULL,
1218 /*maxsize*/ dbch->xferq.psize,
1219 /*nsegments*/ dbch->ndesc > 3 ? dbch->ndesc - 2 : 1,
1220 /*maxsegsz*/ MAX_REQCOUNT,
1221 /*flags*/ 0,
1222#if defined(__FreeBSD__) && __FreeBSD_version >= 501102
1223 /*lockfunc*/busdma_lock_mutex,
1201 }
1202 splx(s);
1203}
1204
1205static void
1206fwohci_db_free(struct fwohci_dbch *dbch)
1207{
1208 struct fwohcidb_tr *db_tr;

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

1246 /*highaddr*/ BUS_SPACE_MAXADDR,
1247 /*filter*/NULL, /*filterarg*/NULL,
1248 /*maxsize*/ dbch->xferq.psize,
1249 /*nsegments*/ dbch->ndesc > 3 ? dbch->ndesc - 2 : 1,
1250 /*maxsegsz*/ MAX_REQCOUNT,
1251 /*flags*/ 0,
1252#if defined(__FreeBSD__) && __FreeBSD_version >= 501102
1253 /*lockfunc*/busdma_lock_mutex,
1224 /*lockarg*/&Giant,
1254 /*lockarg*/FW_GMTX(&sc->fc),
1225#endif
1226 &dbch->dmat))
1227 return;
1228
1229 /* allocate DB entries and attach one to each DMA channels */
1230 /* DB entry must start at 16 bytes bounary. */
1231 STAILQ_INIT(&dbch->db_trq);
1232 db_tr = (struct fwohcidb_tr *)

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

1503 tag = (it->flag >> 6) & 3;
1504 ich = it->flag & 0x3f;
1505 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0) {
1506 dbch->ndb = it->bnpacket * it->bnchunk;
1507 dbch->ndesc = 3;
1508 fwohci_db_init(sc, dbch);
1509 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0)
1510 return ENOMEM;
1255#endif
1256 &dbch->dmat))
1257 return;
1258
1259 /* allocate DB entries and attach one to each DMA channels */
1260 /* DB entry must start at 16 bytes bounary. */
1261 STAILQ_INIT(&dbch->db_trq);
1262 db_tr = (struct fwohcidb_tr *)

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

1533 tag = (it->flag >> 6) & 3;
1534 ich = it->flag & 0x3f;
1535 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0) {
1536 dbch->ndb = it->bnpacket * it->bnchunk;
1537 dbch->ndesc = 3;
1538 fwohci_db_init(sc, dbch);
1539 if ((dbch->flags & FWOHCI_DBCH_INIT) == 0)
1540 return ENOMEM;
1541
1511 err = fwohci_tx_enable(sc, dbch);
1512 }
1513 if(err)
1514 return err;
1515
1516 ldesc = dbch->ndesc - 1;
1517 s = splfw();
1542 err = fwohci_tx_enable(sc, dbch);
1543 }
1544 if(err)
1545 return err;
1546
1547 ldesc = dbch->ndesc - 1;
1548 s = splfw();
1549 FW_GLOCK(fc);
1518 prev = STAILQ_LAST(&it->stdma, fw_bulkxfer, link);
1519 while ((chunk = STAILQ_FIRST(&it->stvalid)) != NULL) {
1520 struct fwohcidb *db;
1521
1522 fwdma_sync_multiseg(it->buf, chunk->poffset, it->bnpacket,
1523 BUS_DMASYNC_PREWRITE);
1524 fwohci_txbufdb(sc, dmach, chunk);
1525 if (prev != NULL) {

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

1536 FWOHCI_DMA_SET(db[0].db.desc.depend, dbch->ndesc);
1537 FWOHCI_DMA_SET(db[ldesc].db.desc.depend, dbch->ndesc);
1538#endif
1539 }
1540 STAILQ_REMOVE_HEAD(&it->stvalid, link);
1541 STAILQ_INSERT_TAIL(&it->stdma, chunk, link);
1542 prev = chunk;
1543 }
1550 prev = STAILQ_LAST(&it->stdma, fw_bulkxfer, link);
1551 while ((chunk = STAILQ_FIRST(&it->stvalid)) != NULL) {
1552 struct fwohcidb *db;
1553
1554 fwdma_sync_multiseg(it->buf, chunk->poffset, it->bnpacket,
1555 BUS_DMASYNC_PREWRITE);
1556 fwohci_txbufdb(sc, dmach, chunk);
1557 if (prev != NULL) {

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

1568 FWOHCI_DMA_SET(db[0].db.desc.depend, dbch->ndesc);
1569 FWOHCI_DMA_SET(db[ldesc].db.desc.depend, dbch->ndesc);
1570#endif
1571 }
1572 STAILQ_REMOVE_HEAD(&it->stvalid, link);
1573 STAILQ_INSERT_TAIL(&it->stdma, chunk, link);
1574 prev = chunk;
1575 }
1576 FW_GUNLOCK(fc);
1544 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREWRITE);
1545 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREREAD);
1546 splx(s);
1547 stat = OREAD(sc, OHCI_ITCTL(dmach));
1548 if (firewire_debug && (stat & OHCI_CNTL_CYCMATCH_S))
1549 printf("stat 0x%x\n", stat);
1550
1551 if (stat & (OHCI_CNTL_DMA_ACTIVE | OHCI_CNTL_CYCMATCH_S))

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

1637 first = STAILQ_FIRST(&ir->stfree);
1638 if (first == NULL) {
1639 device_printf(fc->dev, "IR DMA no free chunk\n");
1640 return 0;
1641 }
1642
1643 ldesc = dbch->ndesc - 1;
1644 s = splfw();
1577 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREWRITE);
1578 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREREAD);
1579 splx(s);
1580 stat = OREAD(sc, OHCI_ITCTL(dmach));
1581 if (firewire_debug && (stat & OHCI_CNTL_CYCMATCH_S))
1582 printf("stat 0x%x\n", stat);
1583
1584 if (stat & (OHCI_CNTL_DMA_ACTIVE | OHCI_CNTL_CYCMATCH_S))

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

1670 first = STAILQ_FIRST(&ir->stfree);
1671 if (first == NULL) {
1672 device_printf(fc->dev, "IR DMA no free chunk\n");
1673 return 0;
1674 }
1675
1676 ldesc = dbch->ndesc - 1;
1677 s = splfw();
1678 if ((ir->flag & FWXFERQ_HANDLER) == 0)
1679 FW_GLOCK(fc);
1645 prev = STAILQ_LAST(&ir->stdma, fw_bulkxfer, link);
1646 while ((chunk = STAILQ_FIRST(&ir->stfree)) != NULL) {
1647 struct fwohcidb *db;
1648
1649#if 1 /* XXX for if_fwe */
1650 if (chunk->mbuf != NULL) {
1651 db_tr = (struct fwohcidb_tr *)(chunk->start);
1652 db_tr->dbcnt = 1;

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

1664 if (prev != NULL) {
1665 db = ((struct fwohcidb_tr *)(prev->end))->db;
1666 FWOHCI_DMA_SET(db[ldesc].db.desc.depend, dbch->ndesc);
1667 }
1668 STAILQ_REMOVE_HEAD(&ir->stfree, link);
1669 STAILQ_INSERT_TAIL(&ir->stdma, chunk, link);
1670 prev = chunk;
1671 }
1680 prev = STAILQ_LAST(&ir->stdma, fw_bulkxfer, link);
1681 while ((chunk = STAILQ_FIRST(&ir->stfree)) != NULL) {
1682 struct fwohcidb *db;
1683
1684#if 1 /* XXX for if_fwe */
1685 if (chunk->mbuf != NULL) {
1686 db_tr = (struct fwohcidb_tr *)(chunk->start);
1687 db_tr->dbcnt = 1;

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

1699 if (prev != NULL) {
1700 db = ((struct fwohcidb_tr *)(prev->end))->db;
1701 FWOHCI_DMA_SET(db[ldesc].db.desc.depend, dbch->ndesc);
1702 }
1703 STAILQ_REMOVE_HEAD(&ir->stfree, link);
1704 STAILQ_INSERT_TAIL(&ir->stdma, chunk, link);
1705 prev = chunk;
1706 }
1707 if ((ir->flag & FWXFERQ_HANDLER) == 0)
1708 FW_GUNLOCK(fc);
1672 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREWRITE);
1673 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREREAD);
1674 splx(s);
1675 stat = OREAD(sc, OHCI_IRCTL(dmach));
1676 if (stat & OHCI_CNTL_DMA_ACTIVE)
1677 return 0;
1678 if (stat & OHCI_CNTL_DMA_RUN) {
1679 OWRITE(sc, OHCI_IRCTLCLR(dmach), OHCI_CNTL_DMA_RUN);

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

1709 OWRITE(sc, OHCI_ATQCTLCLR, OHCI_CNTL_DMA_RUN);
1710 OWRITE(sc, OHCI_ATSCTLCLR, OHCI_CNTL_DMA_RUN);
1711
1712 for( i = 0 ; i < sc->fc.nisodma ; i ++ ){
1713 OWRITE(sc, OHCI_IRCTLCLR(i), OHCI_CNTL_DMA_RUN);
1714 OWRITE(sc, OHCI_ITCTLCLR(i), OHCI_CNTL_DMA_RUN);
1715 }
1716
1709 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREWRITE);
1710 fwdma_sync_multiseg_all(dbch->am, BUS_DMASYNC_PREREAD);
1711 splx(s);
1712 stat = OREAD(sc, OHCI_IRCTL(dmach));
1713 if (stat & OHCI_CNTL_DMA_ACTIVE)
1714 return 0;
1715 if (stat & OHCI_CNTL_DMA_RUN) {
1716 OWRITE(sc, OHCI_IRCTLCLR(dmach), OHCI_CNTL_DMA_RUN);

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

1746 OWRITE(sc, OHCI_ATQCTLCLR, OHCI_CNTL_DMA_RUN);
1747 OWRITE(sc, OHCI_ATSCTLCLR, OHCI_CNTL_DMA_RUN);
1748
1749 for( i = 0 ; i < sc->fc.nisodma ; i ++ ){
1750 OWRITE(sc, OHCI_IRCTLCLR(i), OHCI_CNTL_DMA_RUN);
1751 OWRITE(sc, OHCI_ITCTLCLR(i), OHCI_CNTL_DMA_RUN);
1752 }
1753
1717/* FLUSH FIFO and reset Transmitter/Reciever */
1718 OWRITE(sc, OHCI_HCCCTL, OHCI_HCC_RESET);
1754 if (sc->fc.arq !=0 && sc->fc.arq->maxq > 0)
1755 fw_drain_txq(&sc->fc);
1719
1756
1757#if 0 /* Let dcons(4) be accessed */
1720/* Stop interrupt */
1721 OWRITE(sc, FWOHCI_INTMASKCLR,
1722 OHCI_INT_EN | OHCI_INT_ERR | OHCI_INT_PHY_SID
1723 | OHCI_INT_PHY_INT
1724 | OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS
1725 | OHCI_INT_DMA_PRRQ | OHCI_INT_DMA_PRRS
1726 | OHCI_INT_DMA_ARRQ | OHCI_INT_DMA_ARRS
1727 | OHCI_INT_PHY_BUS_R);
1728
1758/* Stop interrupt */
1759 OWRITE(sc, FWOHCI_INTMASKCLR,
1760 OHCI_INT_EN | OHCI_INT_ERR | OHCI_INT_PHY_SID
1761 | OHCI_INT_PHY_INT
1762 | OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS
1763 | OHCI_INT_DMA_PRRQ | OHCI_INT_DMA_PRRS
1764 | OHCI_INT_DMA_ARRQ | OHCI_INT_DMA_ARRS
1765 | OHCI_INT_PHY_BUS_R);
1766
1729 if (sc->fc.arq !=0 && sc->fc.arq->maxq > 0)
1730 fw_drain_txq(&sc->fc);
1767/* FLUSH FIFO and reset Transmitter/Reciever */
1768 OWRITE(sc, OHCI_HCCCTL, OHCI_HCC_RESET);
1769#endif
1731
1732/* XXX Link down? Bus reset? */
1733 return 0;
1734}
1735
1736int
1737fwohci_resume(struct fwohci_softc *sc, device_t dev)
1738{

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

1757 }
1758 }
1759
1760 bus_generic_resume(dev);
1761 sc->fc.ibr(&sc->fc);
1762 return 0;
1763}
1764
1770
1771/* XXX Link down? Bus reset? */
1772 return 0;
1773}
1774
1775int
1776fwohci_resume(struct fwohci_softc *sc, device_t dev)
1777{

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

1796 }
1797 }
1798
1799 bus_generic_resume(dev);
1800 sc->fc.ibr(&sc->fc);
1801 return 0;
1802}
1803
1765#define ACK_ALL
1804#ifdef OHCI_DEBUG
1766static void
1805static void
1767fwohci_intr_body(struct fwohci_softc *sc, uint32_t stat, int count)
1806fwohci_dump_intr(struct fwohci_softc *sc, uint32_t stat)
1768{
1807{
1769 uint32_t irstat, itstat;
1770 u_int i;
1771 struct firewire_comm *fc = (struct firewire_comm *)sc;
1772
1773#ifdef OHCI_DEBUG
1774 if(stat & OREAD(sc, FWOHCI_INTMASK))
1775 device_printf(fc->dev, "INTERRUPT < %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s> 0x%08x, 0x%08x\n",
1776 stat & OHCI_INT_EN ? "DMA_EN ":"",
1777 stat & OHCI_INT_PHY_REG ? "PHY_REG ":"",
1778 stat & OHCI_INT_CYC_LONG ? "CYC_LONG ":"",
1779 stat & OHCI_INT_ERR ? "INT_ERR ":"",
1780 stat & OHCI_INT_CYC_ERR ? "CYC_ERR ":"",
1781 stat & OHCI_INT_CYC_LOST ? "CYC_LOST ":"",

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

1791 stat & OHCI_INT_DMA_PRRS ? "DMA_PRRS " :"",
1792 stat & OHCI_INT_DMA_PRRQ ? "DMA_PRRQ " :"",
1793 stat & OHCI_INT_DMA_ARRS ? "DMA_ARRS " :"",
1794 stat & OHCI_INT_DMA_ARRQ ? "DMA_ARRQ " :"",
1795 stat & OHCI_INT_DMA_ATRS ? "DMA_ATRS " :"",
1796 stat & OHCI_INT_DMA_ATRQ ? "DMA_ATRQ " :"",
1797 stat, OREAD(sc, FWOHCI_INTMASK)
1798 );
1808 if(stat & OREAD(sc, FWOHCI_INTMASK))
1809 device_printf(fc->dev, "INTERRUPT < %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s> 0x%08x, 0x%08x\n",
1810 stat & OHCI_INT_EN ? "DMA_EN ":"",
1811 stat & OHCI_INT_PHY_REG ? "PHY_REG ":"",
1812 stat & OHCI_INT_CYC_LONG ? "CYC_LONG ":"",
1813 stat & OHCI_INT_ERR ? "INT_ERR ":"",
1814 stat & OHCI_INT_CYC_ERR ? "CYC_ERR ":"",
1815 stat & OHCI_INT_CYC_LOST ? "CYC_LOST ":"",

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

1825 stat & OHCI_INT_DMA_PRRS ? "DMA_PRRS " :"",
1826 stat & OHCI_INT_DMA_PRRQ ? "DMA_PRRQ " :"",
1827 stat & OHCI_INT_DMA_ARRS ? "DMA_ARRS " :"",
1828 stat & OHCI_INT_DMA_ARRQ ? "DMA_ARRQ " :"",
1829 stat & OHCI_INT_DMA_ATRS ? "DMA_ATRS " :"",
1830 stat & OHCI_INT_DMA_ATRQ ? "DMA_ATRQ " :"",
1831 stat, OREAD(sc, FWOHCI_INTMASK)
1832 );
1833}
1799#endif
1834#endif
1800/* Bus reset */
1801 if(stat & OHCI_INT_PHY_BUS_R ){
1802 if (fc->status == FWBUSRESET)
1803 goto busresetout;
1835static void
1836fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count)
1837{
1838 struct firewire_comm *fc = (struct firewire_comm *)sc;
1839 uint32_t node_id, plen;
1840
1841 if ((stat & OHCI_INT_PHY_BUS_R) && (fc->status != FWBUSRESET)) {
1842 fc->status = FWBUSRESET;
1804 /* Disable bus reset interrupt until sid recv. */
1805 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_PHY_BUS_R);
1806
1807 device_printf(fc->dev, "BUS reset\n");
1808 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_CYC_LOST);
1809 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCSRC);
1810
1811 OWRITE(sc, OHCI_ATQCTLCLR, OHCI_CNTL_DMA_RUN);
1812 sc->atrq.xferq.flag &= ~FWXFERQ_RUNNING;
1813 OWRITE(sc, OHCI_ATSCTLCLR, OHCI_CNTL_DMA_RUN);
1814 sc->atrs.xferq.flag &= ~FWXFERQ_RUNNING;
1815
1843 /* Disable bus reset interrupt until sid recv. */
1844 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_PHY_BUS_R);
1845
1846 device_printf(fc->dev, "BUS reset\n");
1847 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_CYC_LOST);
1848 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCSRC);
1849
1850 OWRITE(sc, OHCI_ATQCTLCLR, OHCI_CNTL_DMA_RUN);
1851 sc->atrq.xferq.flag &= ~FWXFERQ_RUNNING;
1852 OWRITE(sc, OHCI_ATSCTLCLR, OHCI_CNTL_DMA_RUN);
1853 sc->atrs.xferq.flag &= ~FWXFERQ_RUNNING;
1854
1816#ifndef ACK_ALL
1855 if (!kdb_active)
1856 taskqueue_enqueue(sc->fc.taskqueue, &sc->fwohci_task_busreset);
1857 }
1858 if (stat & OHCI_INT_PHY_SID) {
1859 /* Enable bus reset interrupt */
1817 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PHY_BUS_R);
1860 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PHY_BUS_R);
1818#endif
1819 fw_busreset(fc, FWBUSRESET);
1820 OWRITE(sc, OHCI_CROMHDR, ntohl(sc->fc.config_rom[0]));
1821 OWRITE(sc, OHCI_BUS_OPT, ntohl(sc->fc.config_rom[2]));
1861 OWRITE(sc, FWOHCI_INTMASK, OHCI_INT_PHY_BUS_R);
1862
1863 /* Allow async. request to us */
1864 OWRITE(sc, OHCI_AREQHI, 1 << 31);
1865 /* XXX insecure ?? */
1866 /* allow from all nodes */
1867 OWRITE(sc, OHCI_PREQHI, 0x7fffffff);
1868 OWRITE(sc, OHCI_PREQLO, 0xffffffff);
1869 /* 0 to 4GB regison */
1870 OWRITE(sc, OHCI_PREQUPPER, 0x10000);
1871 /* Set ATRetries register */
1872 OWRITE(sc, OHCI_ATRETRY, 1<<(13+16) | 0xfff);
1873
1874 /*
1875 * Checking whether the node is root or not. If root, turn on
1876 * cycle master.
1877 */
1878 node_id = OREAD(sc, FWOHCI_NODEID);
1879 plen = OREAD(sc, OHCI_SID_CNT);
1880
1881 fc->nodeid = node_id & 0x3f;
1882 device_printf(fc->dev, "node_id=0x%08x, gen=%d, ",
1883 node_id, (plen >> 16) & 0xff);
1884 if (!(node_id & OHCI_NODE_VALID)) {
1885 printf("Bus reset failure\n");
1886 goto sidout;
1887 }
1888
1889 /* cycle timer */
1890 sc->cycle_lost = 0;
1891 OWRITE(sc, FWOHCI_INTMASK, OHCI_INT_CYC_LOST);
1892 if ((node_id & OHCI_NODE_ROOT) && !nocyclemaster) {
1893 printf("CYCLEMASTER mode\n");
1894 OWRITE(sc, OHCI_LNKCTL,
1895 OHCI_CNTL_CYCMTR | OHCI_CNTL_CYCTIMER);
1896 } else {
1897 printf("non CYCLEMASTER mode\n");
1898 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCMTR);
1899 OWRITE(sc, OHCI_LNKCTL, OHCI_CNTL_CYCTIMER);
1900 }
1901
1902 fc->status = FWBUSINIT;
1903
1904 if (!kdb_active)
1905 taskqueue_enqueue(sc->fc.taskqueue, &sc->fwohci_task_sid);
1822 }
1906 }
1823busresetout:
1824 if((stat & OHCI_INT_DMA_IR )){
1825#ifndef ACK_ALL
1826 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_IR);
1827#endif
1828#if defined(__DragonFly__) || __FreeBSD_version < 500000
1829 irstat = sc->irstat;
1830 sc->irstat = 0;
1831#else
1907sidout:
1908 if ((stat & ~(OHCI_INT_PHY_BUS_R | OHCI_INT_PHY_SID)) && (!kdb_active))
1909 taskqueue_enqueue(sc->fc.taskqueue, &sc->fwohci_task_dma);
1910}
1911
1912static void
1913fwohci_intr_dma(struct fwohci_softc *sc, uint32_t stat, int count)
1914{
1915 uint32_t irstat, itstat;
1916 u_int i;
1917 struct firewire_comm *fc = (struct firewire_comm *)sc;
1918
1919 if (stat & OHCI_INT_DMA_IR) {
1832 irstat = atomic_readandclear_int(&sc->irstat);
1920 irstat = atomic_readandclear_int(&sc->irstat);
1833#endif
1834 for(i = 0; i < fc->nisodma ; i++){
1835 struct fwohci_dbch *dbch;
1836
1837 if((irstat & (1 << i)) != 0){
1838 dbch = &sc->ir[i];
1839 if ((dbch->xferq.flag & FWXFERQ_OPEN) == 0) {
1840 device_printf(sc->fc.dev,
1841 "dma(%d) not active\n", i);
1842 continue;
1843 }
1844 fwohci_rbuf_update(sc, i);
1845 }
1846 }
1847 }
1921 for(i = 0; i < fc->nisodma ; i++){
1922 struct fwohci_dbch *dbch;
1923
1924 if((irstat & (1 << i)) != 0){
1925 dbch = &sc->ir[i];
1926 if ((dbch->xferq.flag & FWXFERQ_OPEN) == 0) {
1927 device_printf(sc->fc.dev,
1928 "dma(%d) not active\n", i);
1929 continue;
1930 }
1931 fwohci_rbuf_update(sc, i);
1932 }
1933 }
1934 }
1848 if((stat & OHCI_INT_DMA_IT )){
1849#ifndef ACK_ALL
1850 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_IT);
1851#endif
1852#if defined(__DragonFly__) || __FreeBSD_version < 500000
1853 itstat = sc->itstat;
1854 sc->itstat = 0;
1855#else
1935 if (stat & OHCI_INT_DMA_IT) {
1856 itstat = atomic_readandclear_int(&sc->itstat);
1936 itstat = atomic_readandclear_int(&sc->itstat);
1857#endif
1858 for(i = 0; i < fc->nisodma ; i++){
1859 if((itstat & (1 << i)) != 0){
1860 fwohci_tbuf_update(sc, i);
1861 }
1862 }
1863 }
1937 for(i = 0; i < fc->nisodma ; i++){
1938 if((itstat & (1 << i)) != 0){
1939 fwohci_tbuf_update(sc, i);
1940 }
1941 }
1942 }
1864 if((stat & OHCI_INT_DMA_PRRS )){
1865#ifndef ACK_ALL
1866 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_PRRS);
1867#endif
1943 if (stat & OHCI_INT_DMA_PRRS) {
1868#if 0
1869 dump_dma(sc, ARRS_CH);
1870 dump_db(sc, ARRS_CH);
1871#endif
1872 fwohci_arcv(sc, &sc->arrs, count);
1873 }
1944#if 0
1945 dump_dma(sc, ARRS_CH);
1946 dump_db(sc, ARRS_CH);
1947#endif
1948 fwohci_arcv(sc, &sc->arrs, count);
1949 }
1874 if((stat & OHCI_INT_DMA_PRRQ )){
1875#ifndef ACK_ALL
1876 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_PRRQ);
1877#endif
1950 if (stat & OHCI_INT_DMA_PRRQ) {
1878#if 0
1879 dump_dma(sc, ARRQ_CH);
1880 dump_db(sc, ARRQ_CH);
1881#endif
1882 fwohci_arcv(sc, &sc->arrq, count);
1883 }
1884 if (stat & OHCI_INT_CYC_LOST) {
1885 if (sc->cycle_lost >= 0)
1886 sc->cycle_lost ++;
1887 if (sc->cycle_lost > 10) {
1888 sc->cycle_lost = -1;
1889#if 0
1890 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCTIMER);
1891#endif
1892 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_CYC_LOST);
1893 device_printf(fc->dev, "too many cycle lost, "
1894 "no cycle master presents?\n");
1895 }
1896 }
1951#if 0
1952 dump_dma(sc, ARRQ_CH);
1953 dump_db(sc, ARRQ_CH);
1954#endif
1955 fwohci_arcv(sc, &sc->arrq, count);
1956 }
1957 if (stat & OHCI_INT_CYC_LOST) {
1958 if (sc->cycle_lost >= 0)
1959 sc->cycle_lost ++;
1960 if (sc->cycle_lost > 10) {
1961 sc->cycle_lost = -1;
1962#if 0
1963 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCTIMER);
1964#endif
1965 OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_CYC_LOST);
1966 device_printf(fc->dev, "too many cycle lost, "
1967 "no cycle master presents?\n");
1968 }
1969 }
1897 if(stat & OHCI_INT_PHY_SID){
1898 uint32_t *buf, node_id;
1899 int plen;
1900
1901#ifndef ACK_ALL
1902 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PHY_SID);
1903#endif
1904 /* Enable bus reset interrupt */
1905 OWRITE(sc, FWOHCI_INTMASK, OHCI_INT_PHY_BUS_R);
1906 /* Allow async. request to us */
1907 OWRITE(sc, OHCI_AREQHI, 1 << 31);
1908 /* XXX insecure ?? */
1909 /* allow from all nodes */
1910 OWRITE(sc, OHCI_PREQHI, 0x7fffffff);
1911 OWRITE(sc, OHCI_PREQLO, 0xffffffff);
1912 /* 0 to 4GB regison */
1913 OWRITE(sc, OHCI_PREQUPPER, 0x10000);
1914 /* Set ATRetries register */
1915 OWRITE(sc, OHCI_ATRETRY, 1<<(13+16) | 0xfff);
1916/*
1917** Checking whether the node is root or not. If root, turn on
1918** cycle master.
1919*/
1920 node_id = OREAD(sc, FWOHCI_NODEID);
1921 plen = OREAD(sc, OHCI_SID_CNT);
1922
1923 device_printf(fc->dev, "node_id=0x%08x, gen=%d, ",
1924 node_id, (plen >> 16) & 0xff);
1925 if (!(node_id & OHCI_NODE_VALID)) {
1926 printf("Bus reset failure\n");
1927 goto sidout;
1928 }
1929
1930 /* cycle timer */
1931 sc->cycle_lost = 0;
1932 OWRITE(sc, FWOHCI_INTMASK, OHCI_INT_CYC_LOST);
1933 if ((node_id & OHCI_NODE_ROOT) && !nocyclemaster) {
1934 printf("CYCLEMASTER mode\n");
1935 OWRITE(sc, OHCI_LNKCTL,
1936 OHCI_CNTL_CYCMTR | OHCI_CNTL_CYCTIMER);
1937 } else {
1938 printf("non CYCLEMASTER mode\n");
1939 OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCMTR);
1940 OWRITE(sc, OHCI_LNKCTL, OHCI_CNTL_CYCTIMER);
1941 }
1942
1943 fc->nodeid = node_id & 0x3f;
1944
1945 if (plen & OHCI_SID_ERR) {
1946 device_printf(fc->dev, "SID Error\n");
1947 goto sidout;
1948 }
1949 plen &= OHCI_SID_CNT_MASK;
1950 if (plen < 4 || plen > OHCI_SIDSIZE) {
1951 device_printf(fc->dev, "invalid SID len = %d\n", plen);
1952 goto sidout;
1953 }
1954 plen -= 4; /* chop control info */
1955 buf = (uint32_t *)malloc(OHCI_SIDSIZE, M_FW, M_NOWAIT);
1956 if (buf == NULL) {
1957 device_printf(fc->dev, "malloc failed\n");
1958 goto sidout;
1959 }
1960 for (i = 0; i < plen / 4; i ++)
1961 buf[i] = FWOHCI_DMA_READ(sc->sid_buf[i+1]);
1962#if 1 /* XXX needed?? */
1963 /* pending all pre-bus_reset packets */
1964 fwohci_txd(sc, &sc->atrq);
1965 fwohci_txd(sc, &sc->atrs);
1966 fwohci_arcv(sc, &sc->arrs, -1);
1967 fwohci_arcv(sc, &sc->arrq, -1);
1968 fw_drain_txq(fc);
1969#endif
1970 fw_sidrcv(fc, buf, plen);
1971 free(buf, M_FW);
1972 }
1973sidout:
1974 if((stat & OHCI_INT_DMA_ATRQ )){
1975#ifndef ACK_ALL
1976 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_ATRQ);
1977#endif
1970 if (stat & OHCI_INT_DMA_ATRQ) {
1978 fwohci_txd(sc, &(sc->atrq));
1979 }
1971 fwohci_txd(sc, &(sc->atrq));
1972 }
1980 if((stat & OHCI_INT_DMA_ATRS )){
1981#ifndef ACK_ALL
1982 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_DMA_ATRS);
1983#endif
1973 if (stat & OHCI_INT_DMA_ATRS) {
1984 fwohci_txd(sc, &(sc->atrs));
1985 }
1974 fwohci_txd(sc, &(sc->atrs));
1975 }
1986 if((stat & OHCI_INT_PW_ERR )){
1987#ifndef ACK_ALL
1988 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PW_ERR);
1989#endif
1976 if (stat & OHCI_INT_PW_ERR) {
1990 device_printf(fc->dev, "posted write error\n");
1991 }
1977 device_printf(fc->dev, "posted write error\n");
1978 }
1992 if((stat & OHCI_INT_ERR )){
1993#ifndef ACK_ALL
1994 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_ERR);
1995#endif
1979 if (stat & OHCI_INT_ERR) {
1996 device_printf(fc->dev, "unrecoverable error\n");
1997 }
1980 device_printf(fc->dev, "unrecoverable error\n");
1981 }
1998 if((stat & OHCI_INT_PHY_INT)) {
1999#ifndef ACK_ALL
2000 OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PHY_INT);
2001#endif
1982 if (stat & OHCI_INT_PHY_INT) {
2002 device_printf(fc->dev, "phy int\n");
2003 }
2004
2005 return;
2006}
2007
1983 device_printf(fc->dev, "phy int\n");
1984 }
1985
1986 return;
1987}
1988
2008#if FWOHCI_TASKQUEUE
2009static void
1989static void
2010fwohci_complete(void *arg, int pending)
1990fwohci_task_busreset(void *arg, int pending)
2011{
2012 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
1991{
1992 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
1993
1994 fw_busreset(&sc->fc, FWBUSRESET);
1995 OWRITE(sc, OHCI_CROMHDR, ntohl(sc->fc.config_rom[0]));
1996 OWRITE(sc, OHCI_BUS_OPT, ntohl(sc->fc.config_rom[2]));
1997}
1998
1999static void
2000fwohci_task_sid(void *arg, int pending)
2001{
2002 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
2003 struct firewire_comm *fc = &sc->fc;
2004 uint32_t *buf;
2005 int i, plen;
2006
2007
2008 plen = OREAD(sc, OHCI_SID_CNT);
2009
2010 if (plen & OHCI_SID_ERR) {
2011 device_printf(fc->dev, "SID Error\n");
2012 return;
2013 }
2014 plen &= OHCI_SID_CNT_MASK;
2015 if (plen < 4 || plen > OHCI_SIDSIZE) {
2016 device_printf(fc->dev, "invalid SID len = %d\n", plen);
2017 return;
2018 }
2019 plen -= 4; /* chop control info */
2020 buf = (uint32_t *)malloc(OHCI_SIDSIZE, M_FW, M_NOWAIT);
2021 if (buf == NULL) {
2022 device_printf(fc->dev, "malloc failed\n");
2023 return;
2024 }
2025 for (i = 0; i < plen / 4; i ++)
2026 buf[i] = FWOHCI_DMA_READ(sc->sid_buf[i+1]);
2027#if 1 /* XXX needed?? */
2028 /* pending all pre-bus_reset packets */
2029 fwohci_txd(sc, &sc->atrq);
2030 fwohci_txd(sc, &sc->atrs);
2031 fwohci_arcv(sc, &sc->arrs, -1);
2032 fwohci_arcv(sc, &sc->arrq, -1);
2033 fw_drain_txq(fc);
2034#endif
2035 fw_sidrcv(fc, buf, plen);
2036 free(buf, M_FW);
2037}
2038
2039static void
2040fwohci_task_dma(void *arg, int pending)
2041{
2042 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
2013 uint32_t stat;
2014
2015again:
2016 stat = atomic_readandclear_int(&sc->intstat);
2017 if (stat)
2043 uint32_t stat;
2044
2045again:
2046 stat = atomic_readandclear_int(&sc->intstat);
2047 if (stat)
2018 fwohci_intr_body(sc, stat, -1);
2048 fwohci_intr_dma(sc, stat, -1);
2019 else
2020 return;
2021 goto again;
2022}
2049 else
2050 return;
2051 goto again;
2052}
2023#endif
2024
2053
2025static uint32_t
2026fwochi_check_stat(struct fwohci_softc *sc)
2054static int
2055fwohci_check_stat(struct fwohci_softc *sc)
2027{
2028 uint32_t stat, irstat, itstat;
2029
2030 stat = OREAD(sc, FWOHCI_INTSTAT);
2031 if (stat == 0xffffffff) {
2032 device_printf(sc->fc.dev,
2033 "device physically ejected?\n");
2056{
2057 uint32_t stat, irstat, itstat;
2058
2059 stat = OREAD(sc, FWOHCI_INTSTAT);
2060 if (stat == 0xffffffff) {
2061 device_printf(sc->fc.dev,
2062 "device physically ejected?\n");
2034 return(stat);
2063 return (FILTER_STRAY);
2035 }
2064 }
2036#ifdef ACK_ALL
2037 if (stat)
2065 if (stat)
2038 OWRITE(sc, FWOHCI_INTSTATCLR, stat);
2039#endif
2066 OWRITE(sc, FWOHCI_INTSTATCLR, stat & ~OHCI_INT_PHY_BUS_R);
2067
2068 stat &= sc->intmask;
2069 if (stat == 0)
2070 return (FILTER_STRAY);
2071
2072 atomic_set_int(&sc->intstat, stat);
2040 if (stat & OHCI_INT_DMA_IR) {
2041 irstat = OREAD(sc, OHCI_IR_STAT);
2042 OWRITE(sc, OHCI_IR_STATCLR, irstat);
2043 atomic_set_int(&sc->irstat, irstat);
2044 }
2045 if (stat & OHCI_INT_DMA_IT) {
2046 itstat = OREAD(sc, OHCI_IT_STAT);
2047 OWRITE(sc, OHCI_IT_STATCLR, itstat);
2048 atomic_set_int(&sc->itstat, itstat);
2049 }
2073 if (stat & OHCI_INT_DMA_IR) {
2074 irstat = OREAD(sc, OHCI_IR_STAT);
2075 OWRITE(sc, OHCI_IR_STATCLR, irstat);
2076 atomic_set_int(&sc->irstat, irstat);
2077 }
2078 if (stat & OHCI_INT_DMA_IT) {
2079 itstat = OREAD(sc, OHCI_IT_STAT);
2080 OWRITE(sc, OHCI_IT_STATCLR, itstat);
2081 atomic_set_int(&sc->itstat, itstat);
2082 }
2050 return(stat);
2083
2084 fwohci_intr_core(sc, stat, -1);
2085 return (FILTER_HANDLED);
2051}
2052
2086}
2087
2053void
2054fwohci_intr(void *arg)
2088int
2089fwohci_filt(void *arg)
2055{
2056 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
2090{
2091 struct fwohci_softc *sc = (struct fwohci_softc *)arg;
2057 uint32_t stat;
2058#if !FWOHCI_TASKQUEUE
2059 uint32_t bus_reset = 0;
2060#endif
2061
2062 if (!(sc->intmask & OHCI_INT_EN)) {
2063 /* polling mode */
2092
2093 if (!(sc->intmask & OHCI_INT_EN)) {
2094 /* polling mode */
2064 return;
2095 return (FILTER_STRAY);
2065 }
2096 }
2097 return (fwohci_check_stat(sc));
2098}
2066
2099
2067#if !FWOHCI_TASKQUEUE
2068again:
2069#endif
2070 stat = fwochi_check_stat(sc);
2071 if (stat == 0 || stat == 0xffffffff)
2072 return;
2073#if FWOHCI_TASKQUEUE
2074 atomic_set_int(&sc->intstat, stat);
2075 /* XXX mask bus reset intr. during bus reset phase */
2076 if (stat)
2077 taskqueue_enqueue(taskqueue_swi_giant, &sc->fwohci_task_complete);
2078#else
2079 /* We cannot clear bus reset event during bus reset phase */
2080 if ((stat & ~bus_reset) == 0)
2081 return;
2082 bus_reset = stat & OHCI_INT_PHY_BUS_R;
2083 fwohci_intr_body(sc, stat, -1);
2084 goto again;
2085#endif
2100void
2101fwohci_intr(void *arg)
2102{
2103 fwohci_filt(arg);
2086}
2087
2088void
2089fwohci_poll(struct firewire_comm *fc, int quick, int count)
2090{
2104}
2105
2106void
2107fwohci_poll(struct firewire_comm *fc, int quick, int count)
2108{
2091 int s;
2092 uint32_t stat;
2093 struct fwohci_softc *sc;
2094
2095
2096 sc = (struct fwohci_softc *)fc;
2097 stat = OHCI_INT_DMA_IR | OHCI_INT_DMA_IT |
2098 OHCI_INT_DMA_PRRS | OHCI_INT_DMA_PRRQ |
2099 OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS;
2100#if 0
2101 if (!quick) {
2102#else
2103 if (1) {
2104#endif
2105 stat = fwochi_check_stat(sc);
2106 if (stat == 0 || stat == 0xffffffff)
2107 return;
2108 }
2109 s = splfw();
2110 fwohci_intr_body(sc, stat, count);
2111 splx(s);
2109 struct fwohci_softc *sc = (struct fwohci_softc *)fc;
2110 fwohci_check_stat(sc);
2112}
2113
2114static void
2115fwohci_set_intr(struct firewire_comm *fc, int enable)
2116{
2117 struct fwohci_softc *sc;
2118
2119 sc = (struct fwohci_softc *)fc;

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

2136 struct fw_bulkxfer *chunk;
2137 struct fw_xferq *it;
2138 uint32_t stat, count;
2139 int s, w=0, ldesc;
2140
2141 it = fc->it[dmach];
2142 ldesc = sc->it[dmach].ndesc - 1;
2143 s = splfw(); /* unnecessary ? */
2111}
2112
2113static void
2114fwohci_set_intr(struct firewire_comm *fc, int enable)
2115{
2116 struct fwohci_softc *sc;
2117
2118 sc = (struct fwohci_softc *)fc;

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

2135 struct fw_bulkxfer *chunk;
2136 struct fw_xferq *it;
2137 uint32_t stat, count;
2138 int s, w=0, ldesc;
2139
2140 it = fc->it[dmach];
2141 ldesc = sc->it[dmach].ndesc - 1;
2142 s = splfw(); /* unnecessary ? */
2143 FW_GLOCK(fc);
2144 fwdma_sync_multiseg_all(sc->it[dmach].am, BUS_DMASYNC_POSTREAD);
2145 if (firewire_debug)
2146 dump_db(sc, ITX_CH + dmach);
2147 while ((chunk = STAILQ_FIRST(&it->stdma)) != NULL) {
2148 db = ((struct fwohcidb_tr *)(chunk->end))->db;
2149 stat = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2150 >> OHCI_STATUS_SHIFT;
2151 db = ((struct fwohcidb_tr *)(chunk->start))->db;

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

2164 default:
2165 device_printf(fc->dev,
2166 "Isochronous transmit err %02x(%s)\n",
2167 stat, fwohcicode[stat & 0x1f]);
2168 }
2169 STAILQ_INSERT_TAIL(&it->stfree, chunk, link);
2170 w++;
2171 }
2144 fwdma_sync_multiseg_all(sc->it[dmach].am, BUS_DMASYNC_POSTREAD);
2145 if (firewire_debug)
2146 dump_db(sc, ITX_CH + dmach);
2147 while ((chunk = STAILQ_FIRST(&it->stdma)) != NULL) {
2148 db = ((struct fwohcidb_tr *)(chunk->end))->db;
2149 stat = FWOHCI_DMA_READ(db[ldesc].db.desc.res)
2150 >> OHCI_STATUS_SHIFT;
2151 db = ((struct fwohcidb_tr *)(chunk->start))->db;

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

2164 default:
2165 device_printf(fc->dev,
2166 "Isochronous transmit err %02x(%s)\n",
2167 stat, fwohcicode[stat & 0x1f]);
2168 }
2169 STAILQ_INSERT_TAIL(&it->stfree, chunk, link);
2170 w++;
2171 }
2172 FW_GUNLOCK(fc);
2172 splx(s);
2173 if (w)
2174 wakeup(it);
2175}
2176
2177static void
2178fwohci_rbuf_update(struct fwohci_softc *sc, int dmach)
2179{
2180 struct firewire_comm *fc = &sc->fc;
2181 struct fwohcidb_tr *db_tr;
2182 struct fw_bulkxfer *chunk;
2183 struct fw_xferq *ir;
2184 uint32_t stat;
2173 splx(s);
2174 if (w)
2175 wakeup(it);
2176}
2177
2178static void
2179fwohci_rbuf_update(struct fwohci_softc *sc, int dmach)
2180{
2181 struct firewire_comm *fc = &sc->fc;
2182 struct fwohcidb_tr *db_tr;
2183 struct fw_bulkxfer *chunk;
2184 struct fw_xferq *ir;
2185 uint32_t stat;
2185 int s, w=0, ldesc;
2186 int s, w = 0, ldesc;
2186
2187 ir = fc->ir[dmach];
2188 ldesc = sc->ir[dmach].ndesc - 1;
2187
2188 ir = fc->ir[dmach];
2189 ldesc = sc->ir[dmach].ndesc - 1;
2190
2189#if 0
2190 dump_db(sc, dmach);
2191#endif
2192 s = splfw();
2191#if 0
2192 dump_db(sc, dmach);
2193#endif
2194 s = splfw();
2195 if ((ir->flag & FWXFERQ_HANDLER) == 0)
2196 FW_GLOCK(fc);
2193 fwdma_sync_multiseg_all(sc->ir[dmach].am, BUS_DMASYNC_POSTREAD);
2194 while ((chunk = STAILQ_FIRST(&ir->stdma)) != NULL) {
2195 db_tr = (struct fwohcidb_tr *)chunk->end;
2196 stat = FWOHCI_DMA_READ(db_tr->db[ldesc].db.desc.res)
2197 >> OHCI_STATUS_SHIFT;
2198 if (stat == 0)
2199 break;
2200

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

2219 default:
2220 chunk->resp = EINVAL;
2221 device_printf(fc->dev,
2222 "Isochronous receive err %02x(%s)\n",
2223 stat, fwohcicode[stat & 0x1f]);
2224 }
2225 w++;
2226 }
2197 fwdma_sync_multiseg_all(sc->ir[dmach].am, BUS_DMASYNC_POSTREAD);
2198 while ((chunk = STAILQ_FIRST(&ir->stdma)) != NULL) {
2199 db_tr = (struct fwohcidb_tr *)chunk->end;
2200 stat = FWOHCI_DMA_READ(db_tr->db[ldesc].db.desc.res)
2201 >> OHCI_STATUS_SHIFT;
2202 if (stat == 0)
2203 break;
2204

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

2223 default:
2224 chunk->resp = EINVAL;
2225 device_printf(fc->dev,
2226 "Isochronous receive err %02x(%s)\n",
2227 stat, fwohcicode[stat & 0x1f]);
2228 }
2229 w++;
2230 }
2231 if ((ir->flag & FWXFERQ_HANDLER) == 0)
2232 FW_GUNLOCK(fc);
2227 splx(s);
2233 splx(s);
2228 if (w) {
2229 if (ir->flag & FWXFERQ_HANDLER)
2230 ir->hand(ir);
2231 else
2232 wakeup(ir);
2233 }
2234 if (w == 0)
2235 return;
2236
2237 if (ir->flag & FWXFERQ_HANDLER)
2238 ir->hand(ir);
2239 else
2240 wakeup(ir);
2234}
2235
2236void
2237dump_dma(struct fwohci_softc *sc, uint32_t ch)
2238{
2239 uint32_t off, cntl, stat, cmd, match;
2240
2241 if(ch == 0){

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

2482 struct fwohcidb_tr *db_tr, *fdb_tr;
2483 struct fwohci_dbch *dbch;
2484 struct fwohcidb *db;
2485 struct fw_pkt *fp;
2486 struct fwohci_txpkthdr *ohcifp;
2487 unsigned short chtag;
2488 int idb;
2489
2241}
2242
2243void
2244dump_dma(struct fwohci_softc *sc, uint32_t ch)
2245{
2246 uint32_t off, cntl, stat, cmd, match;
2247
2248 if(ch == 0){

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

2489 struct fwohcidb_tr *db_tr, *fdb_tr;
2490 struct fwohci_dbch *dbch;
2491 struct fwohcidb *db;
2492 struct fw_pkt *fp;
2493 struct fwohci_txpkthdr *ohcifp;
2494 unsigned short chtag;
2495 int idb;
2496
2497 FW_GLOCK_ASSERT(&sc->fc);
2498
2490 dbch = &sc->it[dmach];
2491 chtag = sc->it[dmach].xferq.flag & 0xff;
2492
2493 db_tr = (struct fwohcidb_tr *)(bulkxfer->start);
2494 fdb_tr = (struct fwohcidb_tr *)(bulkxfer->end);
2495/*
2496device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, db_tr->bus_addr, fdb_tr->bus_addr);
2497*/

--- 467 unchanged lines hidden ---
2499 dbch = &sc->it[dmach];
2500 chtag = sc->it[dmach].xferq.flag & 0xff;
2501
2502 db_tr = (struct fwohcidb_tr *)(bulkxfer->start);
2503 fdb_tr = (struct fwohcidb_tr *)(bulkxfer->end);
2504/*
2505device_printf(sc->fc.dev, "DB %08x %08x %08x\n", bulkxfer, db_tr->bus_addr, fdb_tr->bus_addr);
2506*/

--- 467 unchanged lines hidden ---