On Tue, May 23, 2017 at 07:53:45AM -0400, Bryan Steele wrote:
> 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 (lenn...@augustsson.net) 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'

Adding <sys/atomic.h> to ohci.c fixes the build, and the splasserts, but
sadly not the occasional mouse flapping.

wsmouse0 detached
ums0 detached
uhidev0 detached
uhidev0 at uhub2 port 2 configuration 1 interface 0 "PixArt USB Optical
Mouse" rev 1.10/1.00 addr 2
uhidev0: iclass 3/1
ums0 at uhidev0: 3 buttons, Z dir
wsmouse0 at ums0 mux 0
wsmouse0 detached
ums0 detached
uhidev0 detached
uhidev0 at uhub2 port 2 configuration 1 interface 0 "PixArt USB Optical
Mouse" rev 1.10/1.00 addr 2
uhidev0: iclass 3/1
ums0 at uhidev0: 3 buttons, Z dir
wsmouse0 at ums0 mux


Bus 002 Device 001: ID 1002:0000  
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 Unused
  bDeviceProtocol         0 Full speed (or root) hub
  bMaxPacketSize0        64
  idVendor           0x1002 
  idProduct          0x0000 
  bcdDevice            1.00
  iManufacturer           1 ATI
  iProduct                2 OHCI root hub
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           25
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x40
      (Missing must-be-set bit!)
      Self Powered
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 Unused
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval             255
Hub Descriptor:
  bLength              10
  bDescriptorType      41
  nNbrPorts             3
  wHubCharacteristic 0x0002
    No power switching (usb 1.0)
    Ganged overcurrent protection
  bPwrOn2PwrGood        2 * 2 milli seconds
  bHubContrCurrent      0 milli Ampere
  DeviceRemovable    0x00
  PortPwrCtrlMask    0x00
 Hub Port Status:
   Port 1: 0000.0100 power
   Port 2: 0000.0303 lowspeed power enable connect
   Port 3: 0000.0100 power
Device Status:     0x0001
  Self Powered

Bus 002 Device 002: ID 093a:2510 Pixart Imaging, Inc. Optical Mouse
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x093a Pixart Imaging, Inc.
  idProduct          0x2510 Optical Mouse
  bcdDevice            1.00
  iManufacturer           1 PixArt
  iProduct                2 USB Optical Mouse
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           34
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      2 Mouse
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      52
          Report Descriptor: (length is 52)
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x02 ] 2
                            Mouse
            Item(Main  ): Collection, data= [ 0x01 ] 1
                            Application
            Item(Local ): Usage, data= [ 0x01 ] 1
                            Pointer
            Item(Main  ): Collection, data= [ 0x00 ] 0
                            Physical
            Item(Global): Usage Page, data= [ 0x09 ] 9
                            Buttons
            Item(Local ): Usage Minimum, data= [ 0x01 ] 1
                            Button 1 (Primary)
            Item(Local ): Usage Maximum, data= [ 0x03 ] 3
                            Button 3 (Tertiary)
            Item(Global): Logical Minimum, data= [ 0x00 ] 0
            Item(Global): Logical Maximum, data= [ 0x01 ] 1
            Item(Global): Report Size, data= [ 0x01 ] 1
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Input, data= [ 0x02 ] 2
                            Data Variable Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile 
Bitfield
            Item(Global): Report Size, data= [ 0x05 ] 5
            Item(Global): Report Count, data= [ 0x01 ] 1
            Item(Main  ): Input, data= [ 0x01 ] 1
                            Constant Array Absolute No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile 
Bitfield
            Item(Global): Usage Page, data= [ 0x01 ] 1
                            Generic Desktop Controls
            Item(Local ): Usage, data= [ 0x30 ] 48
                            Direction-X
            Item(Local ): Usage, data= [ 0x31 ] 49
                            Direction-Y
            Item(Local ): Usage, data= [ 0x38 ] 56
                            Wheel
            Item(Global): Logical Minimum, data= [ 0x81 ] 129
            Item(Global): Logical Maximum, data= [ 0x7f ] 127
            Item(Global): Report Size, data= [ 0x08 ] 8
            Item(Global): Report Count, data= [ 0x03 ] 3
            Item(Main  ): Input, data= [ 0x06 ] 6
                            Data Variable Relative No_Wrap Linear
                            Preferred_State No_Null_Position Non_Volatile 
Bitfield
            Item(Main  ): End Collection, data=none
            Item(Main  ): End Collection, data=none
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              10
Device Status:     0x0000
  (Bus Powered)

Reply via email to