On Tue, May 23, 2017 at 01:04:58PM +0200, Martin Pieuchot wrote:
> On 19/05/17(Fri) 15:28, Bryan Steele wrote:
> > Still noticing this, kind of disappears when X is running.. *hand wavey*
> > 
> > May 19th amd64 snap
> 
> Could you try the diff below?
> 
> Index: ohci.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/ohci.c,v
> retrieving revision 1.150
> diff -u -p -r1.150 ohci.c
> --- ohci.c    15 May 2017 10:52:08 -0000      1.150
> +++ ohci.c    23 May 2017 11:00:55 -0000
> @@ -3,12 +3,14 @@
>  /*   $FreeBSD: src/sys/dev/usb/ohci.c,v 1.22 1999/11/17 22:33:40 n_hibma Exp 
> $       */
>  
>  /*
> - * Copyright (c) 1998 The NetBSD Foundation, Inc.
> + * Copyright (c) 1998, 2005 The NetBSD Foundation, Inc.
>   * All rights reserved.
>   *
>   * This code is derived from software contributed to The NetBSD Foundation
>   * by Lennart Augustsson ([email protected]) at
>   * Carlstedt Research & Technology.
> + * This code is derived from software contributed to The NetBSD Foundation
> + * by Charles M. Hannum.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -90,7 +92,6 @@ usbd_status ohci_open(struct usbd_pipe *
>  int          ohci_setaddr(struct usbd_device *, int);
>  void         ohci_poll(struct usbd_bus *);
>  void         ohci_softintr(void *);
> -void         ohci_add_done(struct ohci_softc *, ohci_physaddr_t);
>  void         ohci_rhsc(struct ohci_softc *, struct usbd_xfer *);
>  
>  usbd_status  ohci_device_request(struct usbd_xfer *xfer);
> @@ -149,7 +150,6 @@ usbd_status       ohci_device_setintr(struct o
>  
>  void         ohci_timeout(void *);
>  void         ohci_timeout_task(void *);
> -void         ohci_rhsc_able(struct ohci_softc *, int);
>  void         ohci_rhsc_enable(void *);
>  
>  void         ohci_close_pipe(struct usbd_pipe *, struct ohci_soft_ed *);
> @@ -1016,7 +1016,6 @@ int
>  ohci_intr1(struct ohci_softc *sc)
>  {
>       u_int32_t intrs, eintrs;
> -     ohci_physaddr_t done;
>  
>       DPRINTFN(14,("ohci_intr1: enter\n"));
>  
> @@ -1028,28 +1027,11 @@ ohci_intr1(struct ohci_softc *sc)
>               return (0);
>       }
>  
> -        intrs = 0;
> -     done = letoh32(sc->sc_hcca->hcca_done_head);
> -     if (done != 0) {
> -             if (done & ~OHCI_DONE_INTRS)
> -                     intrs = OHCI_WDH;
> -             if (done & OHCI_DONE_INTRS)
> -                     intrs |= OREAD4(sc, OHCI_INTERRUPT_STATUS);
> -             sc->sc_hcca->hcca_done_head = 0;
> -     } else {
> -             intrs = OREAD4(sc, OHCI_INTERRUPT_STATUS);
> -             /* If we've flushed out a WDH then reread */
> -             if (intrs & OHCI_WDH) {
> -                     done = letoh32(sc->sc_hcca->hcca_done_head);
> -                     sc->sc_hcca->hcca_done_head = 0;
> -             }
> -     }
> -
> +     intrs = OREAD4(sc, OHCI_INTERRUPT_STATUS);
>       if (intrs == 0xffffffff) {
>               sc->sc_bus.dying = 1;
>               return (0);
>       }
> -
>       if (!intrs)
>               return (0);
>  
> @@ -1059,11 +1041,7 @@ ohci_intr1(struct ohci_softc *sc)
>       if (!eintrs)
>               return (0);
>  
> -     sc->sc_bus.intr_context++;
>       sc->sc_bus.no_intrs++;
> -     DPRINTFN(7, ("ohci_intr: sc=%p intrs=0x%x(0x%x) eintrs=0x%x\n",
> -                  sc, (u_int)intrs, OREAD4(sc, OHCI_INTERRUPT_STATUS),
> -                  (u_int)eintrs));
>  
>       if (eintrs & OHCI_SO) {
>               sc->sc_overrun_cnt++;
> @@ -1076,7 +1054,6 @@ ohci_intr1(struct ohci_softc *sc)
>               eintrs &= ~OHCI_SO;
>       }
>       if (eintrs & OHCI_WDH) {
> -             ohci_add_done(sc, done &~ OHCI_DONE_INTRS);
>               usb_schedsoftintr(&sc->sc_bus);
>               eintrs &= ~OHCI_WDH;
>       }
> @@ -1091,47 +1068,24 @@ ohci_intr1(struct ohci_softc *sc)
>               /* XXX what else */
>       }
>       if (eintrs & OHCI_RHSC) {
> -             ohci_rhsc(sc, sc->sc_intrxfer);
> -             /*
> -              * Disable RHSC interrupt for now, because it will be
> -              * on until the port has been reset.
> -              */
> -             ohci_rhsc_able(sc, 0);
> -             DPRINTFN(2, ("%s: rhsc interrupt disabled\n",
> -                          sc->sc_bus.bdev.dv_xname));
> -
> +             atomic_setbits_int(&sc->sc_flags, OHCIF_RHSC_INTR);
> +             usb_schedsoftintr(&sc->sc_bus);
>               /* Do not allow RHSC interrupts > 1 per second */
>                  timeout_add_sec(&sc->sc_tmo_rhsc, 1);
> -             eintrs &= ~OHCI_RHSC;
>       }
>  
> -     sc->sc_bus.intr_context--;
> -
>       if (eintrs != 0) {
> -             /* Block unprocessed interrupts. XXX */
> +             /* Block unprocessed interrupts. */
>               OWRITE4(sc, OHCI_INTERRUPT_DISABLE, eintrs);
>               sc->sc_eintrs &= ~eintrs;
> -             printf("%s: blocking intrs 0x%x\n",
> -                    sc->sc_bus.bdev.dv_xname, eintrs);
> +             DPRINTFN(1, ("%s: blocking intrs 0x%x\n",
> +                 sc->sc_bus.bdev.dv_xname, eintrs));
>       }
>  
>       return (1);
>  }
>  
>  void
> -ohci_rhsc_able(struct ohci_softc *sc, int on)
> -{
> -     DPRINTFN(4, ("ohci_rhsc_able: on=%d\n", on));
> -     if (on) {
> -             sc->sc_eintrs |= OHCI_RHSC;
> -             OWRITE4(sc, OHCI_INTERRUPT_ENABLE, OHCI_RHSC);
> -     } else {
> -             sc->sc_eintrs &= ~OHCI_RHSC;
> -             OWRITE4(sc, OHCI_INTERRUPT_DISABLE, OHCI_RHSC);
> -     }
> -}
> -
> -void
>  ohci_rhsc_enable(void *v_sc)
>  {
>       struct ohci_softc *sc = v_sc;
> @@ -1141,11 +1095,8 @@ ohci_rhsc_enable(void *v_sc)
>               return;
>  
>       s = splhardusb();
> -     ohci_rhsc(sc, sc->sc_intrxfer);
> -     DPRINTFN(2, ("%s: rhsc interrupt enabled\n",
> -                  sc->sc_bus.bdev.dv_xname));
> -
> -     ohci_rhsc_able(sc, 1);
> +     sc->sc_eintrs |= OHCI_RHSC;
> +     OWRITE4(sc, OHCI_INTERRUPT_ENABLE, OHCI_RHSC);
>       splx(s);
>  }
>  
> @@ -1171,10 +1122,39 @@ char *ohci_cc_strs[] = {
>  #endif
>  
>  void
> -ohci_add_done(struct ohci_softc *sc, ohci_physaddr_t done)
> +ohci_softintr(void *v)
>  {
> -     struct ohci_soft_itd *sitd, *sidone, **ip;
> -     struct ohci_soft_td *std, *sdone, **p;
> +     struct ohci_softc *sc = v;
> +     struct ohci_soft_itd *sitd, *sidone, *sitdnext;
> +     struct ohci_soft_td *std, *sdone, *stdnext;
> +     struct usbd_xfer *xfer;
> +     struct ohci_pipe *opipe;
> +     int len, cc, s;
> +     int i, j, actlen, iframes, uedir;
> +     ohci_physaddr_t done = 0;
> +
> +     DPRINTFN(10,("ohci_softintr: enter\n"));
> +
> +     if (sc->sc_bus.dying)
> +             return;
> +
> +     sc->sc_bus.intr_context++;
> +
> +     if (sc->sc_flags & OHCIF_RHSC_INTR) {
> +             atomic_clearbits_int(&sc->sc_flags, OHCIF_RHSC_INTR);
> +             ohci_rhsc(sc, sc->sc_intrxfer);
> +     }
> +
> +     s = splhardusb();
> +     usb_syncmem(&sc->sc_hccadma, offsetof(struct ohci_hcca, hcca_done_head),
> +         sizeof(sc->sc_hcca->hcca_done_head),
> +         BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTREAD);
> +     done = le32toh(sc->sc_hcca->hcca_done_head) & ~OHCI_DONE_INTRS;
> +     sc->sc_hcca->hcca_done_head = 0;
> +     usb_syncmem(&sc->sc_hccadma, offsetof(struct ohci_hcca, hcca_done_head),
> +         sizeof(sc->sc_hcca->hcca_done_head),
> +         BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
> +     splx(s);
>  
>       /* Reverse the done list. */
>       for (sdone = NULL, sidone = NULL; done != 0; ) {
> @@ -1194,44 +1174,9 @@ ohci_add_done(struct ohci_softc *sc, ohc
>                       DPRINTFN(5,("add ITD %p\n", sitd));
>                       continue;
>               }
> -             panic("ohci_add_done: addr 0x%08lx not found", (u_long)done);
> +             panic("addr 0x%08lx not found", (u_long)done);
>       }
>  
> -     /* sdone & sidone now hold the done lists. */
> -     /* Put them on the already processed lists. */
> -     for (p = &sc->sc_sdone; *p != NULL; p = &(*p)->dnext)
> -             ;
> -     *p = sdone;
> -     for (ip = &sc->sc_sidone; *ip != NULL; ip = &(*ip)->dnext)
> -             ;
> -     *ip = sidone;
> -}
> -
> -void
> -ohci_softintr(void *v)
> -{
> -     struct ohci_softc *sc = v;
> -     struct ohci_soft_itd *sitd, *sidone, *sitdnext;
> -     struct ohci_soft_td *std, *sdone, *stdnext;
> -     struct usbd_xfer *xfer;
> -     struct ohci_pipe *opipe;
> -     int len, cc, s;
> -     int i, j, actlen, iframes, uedir;
> -
> -     DPRINTFN(10,("ohci_softintr: enter\n"));
> -
> -     if (sc->sc_bus.dying)
> -             return;
> -
> -     sc->sc_bus.intr_context++;
> -
> -     s = splhardusb();
> -     sdone = sc->sc_sdone;
> -     sc->sc_sdone = NULL;
> -     sidone = sc->sc_sidone;
> -     sc->sc_sidone = NULL;
> -     splx(s);
> -
>       DPRINTFN(10,("ohci_softintr: sdone=%p sidone=%p\n", sdone, sidone));
>  
>  #ifdef OHCI_DEBUG
> @@ -2435,7 +2380,7 @@ ohci_root_ctrl_start(struct usbd_xfer *x
>               case UHF_C_PORT_RESET:
>                       /* Enable RHSC interrupt if condition is cleared. */
>                       if ((OREAD4(sc, port) >> 16) == 0)
> -                             ohci_rhsc_able(sc, 1);
> +                             ohci_rhsc_enable(sc);
>                       break;
>               default:
>                       break;
> Index: ohcivar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/usb/ohcivar.h,v
> retrieving revision 1.37
> diff -u -p -r1.37 ohcivar.h
> --- ohcivar.h 16 May 2014 18:17:03 -0000      1.37
> +++ ohcivar.h 23 May 2017 10:31:49 -0000
> @@ -82,6 +82,8 @@ struct ohci_softc {
>       bus_space_tag_t iot;
>       bus_space_handle_t ioh;
>       bus_size_t sc_size;
> +     int sc_flags;                   /* misc flags */
> +#define OHCIF_RHSC_INTR                      0x01
>  
>       struct usb_dma sc_hccadma;
>       struct ohci_hcca *sc_hcca;
> @@ -106,9 +108,6 @@ struct ohci_softc {
>       struct ohci_soft_itd *sc_freeitds;
>  
>       struct usbd_xfer *sc_intrxfer;
> -
> -     struct ohci_soft_itd *sc_sidone;
> -     struct ohci_soft_td *sc_sdone;
>  
>       char sc_vendor[16];
>       int sc_id_vendor;
> 

Missing header?

/src/sys/dev/usb/ohci.c: In function
'ohci_intr1':
/src/sys/dev/usb/ohci.c:1071: warning:
implicit declaration of function 'atomic_setbits_int'
/src/sys/dev/usb/ohci.c: In function
'ohci_softintr':
/src/sys/dev/usb/ohci.c:1144: warning:
implicit declaration of function 'atomic_clearbits_int'
*** Error 1 in target 'ohci.o'

Reply via email to