Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 Jun 2007 18:18:55 +0900
From:      "Hidetoshi Shimokawa" <simokawa@FreeBSD.ORG>
To:        "Kobayashi Katsushi" <ikob@ni.aist.go.jp>
Cc:        freebsd-firewire@freebsd.org
Subject:   Re: Patch for async. packet corruption in polling mode.
Message-ID:  <626eb4530706290218n66064fferfe04a6a146fb69f9@mail.gmail.com>
In-Reply-To: <9E3627A8-0036-408A-B604-11A514B0CFD2@ni.aist.go.jp>
References:  <9E3627A8-0036-408A-B604-11A514B0CFD2@ni.aist.go.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
I remember that there is a PR related this problem.
I'll check your patch next week.

Thank you for your patch.

On 6/28/07, Kobayashi Katsushi <ikob@ni.aist.go.jp> wrote:
> Hi,
>
> I met async. packet corruption when using fwip device with
> polling mode. My patch for R6.2 is attached.
>
> Thanks,
>
> --
> Katsushi Kobayashi
>
> Index: sys/dev/firewire/fwohci.c
> ===================================================================
> RCS file: /grid/home/ikob/develop/FreeBSD/sys/dev/firewire/fwohci.c,v
> retrieving revision 1.1.1.1
> retrieving revision 1.1.1.1.6.3
> diff -c -r1.1.1.1 -r1.1.1.1.6.3
> *** sys/dev/firewire/fwohci.c   22 May 2007 06:25:52 -0000      1.1.1.1
> --- sys/dev/firewire/fwohci.c   28 Jun 2007 09:09:11 -0000
> 1.1.1.1.6.3
> ***************
> *** 125,131 ****
>    static void fwohci_ibr (struct firewire_comm *);
>    static void fwohci_db_init (struct fwohci_softc *, struct
> fwohci_dbch *);
>    static void fwohci_db_free (struct fwohci_dbch *);
> ! static void fwohci_arcv (struct fwohci_softc *, struct fwohci_dbch
> *, int);
>    static void fwohci_txd (struct fwohci_softc *, struct fwohci_dbch *);
>    static void fwohci_start_atq (struct firewire_comm *);
>    static void fwohci_start_ats (struct firewire_comm *);
> --- 125,131 ----
>    static void fwohci_ibr (struct firewire_comm *);
>    static void fwohci_db_init (struct fwohci_softc *, struct
> fwohci_dbch *);
>    static void fwohci_db_free (struct fwohci_dbch *);
> ! static int fwohci_arcv (struct fwohci_softc *, struct fwohci_dbch
> *, int);
>    static void fwohci_txd (struct fwohci_softc *, struct fwohci_dbch *);
>    static void fwohci_start_atq (struct firewire_comm *);
>    static void fwohci_start_ats (struct firewire_comm *);
> ***************
> *** 580,585 ****
> --- 580,586 ----
>          }
>
>
> +       sc->pollstat = 0;
>          /* Enable interrupts */
>          OWRITE(sc, FWOHCI_INTMASK,
>                          OHCI_INT_ERR  | OHCI_INT_PHY_SID
> ***************
> *** 671,676 ****
> --- 672,678 ----
>
>          sc->fc.tcode = tinfo;
>          sc->fc.dev = dev;
> +       sc->pollstat = 0;
>
>          sc->fc.config_rom = fwdma_malloc(&sc->fc, CROMSIZE, CROMSIZE,
>                                                  &sc->crom_dma,
> BUS_DMA_WAITOK);
> ***************
> *** 1867,1873 ****
>                  dump_dma(sc, ARRS_CH);
>                  dump_db(sc, ARRS_CH);
>    #endif
> !               fwohci_arcv(sc, &sc->arrs, count);
>          }
>          if((stat & OHCI_INT_DMA_PRRQ )){
>    #ifndef ACK_ALL
> --- 1869,1879 ----
>                  dump_dma(sc, ARRS_CH);
>                  dump_db(sc, ARRS_CH);
>    #endif
> !               if(fwohci_arcv(sc, &sc->arrs, count) == 0) {
> !                       sc->pollstat &= ~OHCI_INT_DMA_PRRS;
> !               }else{
> !                       sc->pollstat |= OHCI_INT_DMA_PRRS;
> !               }
>          }
>          if((stat & OHCI_INT_DMA_PRRQ )){
>    #ifndef ACK_ALL
> ***************
> *** 1877,1883 ****
>                  dump_dma(sc, ARRQ_CH);
>                  dump_db(sc, ARRQ_CH);
>    #endif
> !               fwohci_arcv(sc, &sc->arrq, count);
>          }
>          if(stat & OHCI_INT_PHY_SID){
>                  uint32_t *buf, node_id;
> --- 1883,1893 ----
>                  dump_dma(sc, ARRQ_CH);
>                  dump_db(sc, ARRQ_CH);
>    #endif
> !               if(fwohci_arcv(sc, &sc->arrq, count) == 0){
> !                       sc->pollstat &= ~OHCI_INT_DMA_PRRQ;
> !               }else{
> !                       sc->pollstat |= OHCI_INT_DMA_PRRQ;
> !               }
>          }
>          if(stat & OHCI_INT_PHY_SID){
>                  uint32_t *buf, node_id;
> ***************
> *** 2081,2086 ****
> --- 2091,2097 ----
>          if (1) {
>    #endif
>                  stat = fwochi_check_stat(sc);
> +               stat |= sc->pollstat;
>                  if (stat == 0 || stat == 0xffffffff)
>                          return;
>          }
> ***************
> *** 2601,2607 ****
>          return 0;
>    }
>
> -
>    static int
>    fwohci_arcv_swap(struct fw_pkt *fp, int len)
>    {
> --- 2612,2617 ----
> ***************
> *** 2686,2692 ****
>          dbch->bottom = db_tr;
>    }
>
> ! static void
>    fwohci_arcv(struct fwohci_softc *sc, struct fwohci_dbch *dbch, int
> count)
>    {
>          struct fwohcidb_tr *db_tr;
> --- 2696,2702 ----
>          dbch->bottom = db_tr;
>    }
>
> ! static int
>    fwohci_arcv(struct fwohci_softc *sc, struct fwohci_dbch *dbch, int
> count)
>    {
>          struct fwohcidb_tr *db_tr;
> ***************
> *** 2701,2713 ****
>          int s;
>          caddr_t buf;
>          int resCount;
>
>          if(&sc->arrq == dbch){
>                  off = OHCI_ARQOFF;
>          }else if(&sc->arrs == dbch){
>                  off = OHCI_ARSOFF;
>          }else{
> !               return;
>          }
>
>          s = splfw();
> --- 2711,2724 ----
>          int s;
>          caddr_t buf;
>          int resCount;
> +       int ret = 0;
>
>          if(&sc->arrq == dbch){
>                  off = OHCI_ARQOFF;
>          }else if(&sc->arrs == dbch){
>                  off = OHCI_ARSOFF;
>          }else{
> !               return 0;
>          }
>
>          s = splfw();
> ***************
> *** 2719,2725 ****
>          status = FWOHCI_DMA_READ(db_tr->db[0].db.desc.res) >>
> OHCI_STATUS_SHIFT;
>          resCount = FWOHCI_DMA_READ(db_tr->db[0].db.desc.res) &
> OHCI_COUNT_MASK;
>    #if 0
> !       printf("status 0x%04x, resCount 0x%04x\n", status, resCount);
>    #endif
>          while (status & OHCI_CNTL_DMA_ACTIVE) {
>                  len = dbch->xferq.psize - resCount;
> --- 2730,2736 ----
>          status = FWOHCI_DMA_READ(db_tr->db[0].db.desc.res) >>
> OHCI_STATUS_SHIFT;
>          resCount = FWOHCI_DMA_READ(db_tr->db[0].db.desc.res) &
> OHCI_COUNT_MASK;
>    #if 0
> !       printf("status 0x%04x, resCount 0x%04x count %d\n", status,
> resCount, count);
>    #endif
>          while (status & OHCI_CNTL_DMA_ACTIVE) {
>                  len = dbch->xferq.psize - resCount;
> ***************
> *** 2733,2739 ****
>                                          BUS_DMASYNC_POSTREAD);
>                  while (len > 0 ) {
>                          if (count >= 0 && count-- == 0)
> !                               goto out;
>                          if(dbch->pdb_tr != NULL){
>                                  /* we have a fragment in previous
> buffer */
>                                  int rlen;
> --- 2744,2753 ----
>                                          BUS_DMASYNC_POSTREAD);
>                  while (len > 0 ) {
>                          if (count >= 0 && count-- == 0)
> !                       {
> !                               ret = 1;
> !                               goto pollout;
> !                       }
>                          if(dbch->pdb_tr != NULL){
>                                  /* we have a fragment in previous
> buffer */
>                                  int rlen;
> ***************
> *** 2898,2906 ****
> --- 2912,2922 ----
>                  }
>                  /* XXX make sure DMA is not dead */
>          }
> + pollout:
>    #if 0
>          if (pcnt < 1)
>                  printf("fwohci_arcv: no packets\n");
>    #endif
>          splx(s);
> +       return ret;
>    }
> Index: sys/dev/firewire/fwohcivar.h
> ===================================================================
> RCS file: /grid/home/ikob/develop/FreeBSD/sys/dev/firewire/fwohcivar.h,v
> retrieving revision 1.1.1.1
> retrieving revision 1.1.1.1.6.1
> diff -c -r1.1.1.1 -r1.1.1.1.6.1
> *** sys/dev/firewire/fwohcivar.h        22 May 2007 06:25:52
> -0000      1.1.1.1
> --- sys/dev/firewire/fwohcivar.h        28 Jun 2007 04:17:22
> -0000      1.1.1.1.6.1
> ***************
> *** 81,86 ****
> --- 81,87 ----
>          uint32_t intstat;
>          struct task fwohci_task_complete;
>    #endif
> +       uint32_t pollstat;
>    } fwohci_softc_t;
>
>    void fwohci_intr (void *arg);
>
>
>
>
>
>
> --
> Katsushi Kobayashi
>
>
>
> _______________________________________________
> freebsd-firewire@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-firewire
> To unsubscribe, send any mail to "freebsd-firewire-unsubscribe@freebsd.org"
>


-- 
/\ Hidetoshi Shimokawa
\/  simokawa@FreeBSD.ORG



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?626eb4530706290218n66064fferfe04a6a146fb69f9>