Diff for /src/sys/dev/usbmisc/ugen/ugen.c between versions 1.12 and 1.13

version 1.12, 2004/05/13 23:49:21 version 1.13, 2004/05/19 22:52:51
Line 129  struct ugen_endpoint { Line 129  struct ugen_endpoint {
 struct ugen_softc {  struct ugen_softc {
         USBBASEDEVICE sc_dev;           /* base device */          USBBASEDEVICE sc_dev;           /* base device */
         usbd_device_handle sc_udev;          usbd_device_handle sc_udev;
 #if defined(__FreeBSD__) || defined(__DragonFly__)  
         dev_t dev;  
 #endif  
   
         char sc_is_open[USB_MAX_ENDPOINTS];          char sc_is_open[USB_MAX_ENDPOINTS];
         struct ugen_endpoint sc_endpoints[USB_MAX_ENDPOINTS][2];          struct ugen_endpoint sc_endpoints[USB_MAX_ENDPOINTS][2];
Line 192  Static usb_config_descriptor_t *ugen_get Line 189  Static usb_config_descriptor_t *ugen_get
 Static usbd_status ugen_set_interface(struct ugen_softc *, int, int);  Static usbd_status ugen_set_interface(struct ugen_softc *, int, int);
 Static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx);  Static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx);
   
#define UGENUNIT(n) ((minor(n) >> 4) & 0xf)#define UGENUNIT(n) ((lminor(n) >> 4) & 0xff)
 #define UGENENDPOINT(n) (minor(n) & 0xf)  #define UGENENDPOINT(n) (minor(n) & 0xf)
#define UGENMINOR(u, e) (((u) << 4) | (e))#define UGENMINOR(u, e) (((u & 0xf) << 4) | ((u & 0xf0) << 12) | (e))
 #define UGENUNITMASK    0xffff00f0
   
 USB_DECLARE_DRIVER(ugen);  USB_DECLARE_DRIVER(ugen);
   
Line 249  USB_ATTACH(ugen) Line 247  USB_ATTACH(ugen)
   
 #if defined(__FreeBSD__) || defined(__DragonFly__)  #if defined(__FreeBSD__) || defined(__DragonFly__)
         /* the main device, ctrl endpoint */          /* the main device, ctrl endpoint */
        sc->dev = make_dev(&ugen_cdevsw, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0),        cdevsw_add(&ugen_cdevsw, 
                     UGENUNITMASK, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0));
         make_dev(&ugen_cdevsw, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0),
                 UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev));                  UID_ROOT, GID_OPERATOR, 0644, "%s", USBDEVNAME(sc->sc_dev));
 #endif  #endif
   
Line 279  ugen_make_devnodes(struct ugen_softc *sc Line 279  ugen_make_devnodes(struct ugen_softc *sc
                                 UID_ROOT, GID_OPERATOR, 0644,                                  UID_ROOT, GID_OPERATOR, 0644,
                                 "%s.%d",                                  "%s.%d",
                                 USBDEVNAME(sc->sc_dev), endptno);                                  USBDEVNAME(sc->sc_dev), endptno);
                        if (sc->sc_endpoints[endptno][IN].sc != NULL)                        if (sc->sc_endpoints[endptno][IN].sc != NULL) {
                                 printf("X1");
                                 reference_dev(dev);
                                 if (sc->sc_endpoints[endptno][IN].dev)
                                         release_dev(sc->sc_endpoints[endptno][IN].dev);
                                 sc->sc_endpoints[endptno][IN].dev = dev;                                  sc->sc_endpoints[endptno][IN].dev = dev;
                        if (sc->sc_endpoints[endptno][OUT].sc != NULL)                        }
                         if (sc->sc_endpoints[endptno][OUT].sc != NULL) {
                                 printf("X2");
                                 reference_dev(dev);
                                 if (sc->sc_endpoints[endptno][OUT].dev)
                                         release_dev(sc->sc_endpoints[endptno][OUT].dev);
                                 sc->sc_endpoints[endptno][OUT].dev = dev;                                  sc->sc_endpoints[endptno][OUT].dev = dev;
                           }
                 }                  }
         }          }
 }  }
Line 305  ugen_destroy_devnodes(struct ugen_softc Line 315  ugen_destroy_devnodes(struct ugen_softc
                          * In the if clause above we check whether one                           * In the if clause above we check whether one
                          * of the structs is populated.                           * of the structs is populated.
                          */                           */
                        if (sc->sc_endpoints[endptno][IN].sc != NULL)                        dev = sc->sc_endpoints[endptno][IN].dev;
                                dev = sc->sc_endpoints[endptno][IN].dev;                        if (dev != NULL) {
                        else                                printf("X3");
                                dev = sc->sc_endpoints[endptno][OUT].dev;                                destroy_dev(dev);
                        destroy_dev(dev);                                sc->sc_endpoints[endptno][IN].dev = NULL;
                         }
                         dev = sc->sc_endpoints[endptno][OUT].dev;
                         if (dev != NULL) {
                                 printf("X4");
                                 destroy_dev(dev);
                                 sc->sc_endpoints[endptno][OUT].dev = NULL;
                         }
                 }                  }
         }          }
 }  }
Line 337  ugen_set_config(struct ugen_softc *sc, i Line 354  ugen_set_config(struct ugen_softc *sc, i
         /* We start at 1, not 0, because we don't care whether the          /* We start at 1, not 0, because we don't care whether the
          * control endpoint is open or not. It is always present.           * control endpoint is open or not. It is always present.
          */           */
        for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++)        for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++) {
                 if (sc->sc_is_open[endptno]) {                  if (sc->sc_is_open[endptno]) {
                         DPRINTFN(1,                          DPRINTFN(1,
                              ("ugen_set_config: %s - endpoint %d is open\n",                               ("ugen_set_config: %s - endpoint %d is open\n",
                               USBDEVNAME(sc->sc_dev), endptno));                                USBDEVNAME(sc->sc_dev), endptno));
                         return (USBD_IN_USE);                          return (USBD_IN_USE);
                 }                  }
           }
   
         /* Avoid setting the current value. */          /* Avoid setting the current value. */
         if (usbd_get_config_descriptor(dev)->bConfigurationValue != configno) {          if (usbd_get_config_descriptor(dev)->bConfigurationValue != configno) {
Line 891  USB_DETACH(ugen) Line 909  USB_DETACH(ugen)
                                 usbd_abort_pipe(sce->pipeh);                                  usbd_abort_pipe(sce->pipeh);
                 }                  }
         }          }
   
         s = splusb();          s = splusb();
         if (--sc->sc_refcnt >= 0) {          if (--sc->sc_refcnt >= 0) {
                 /* Wake everyone */                  /* Wake everyone */
Line 913  USB_DETACH(ugen) Line 930  USB_DETACH(ugen)
         vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);          vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);
 #elif defined(__FreeBSD__) || defined(__DragonFly__)  #elif defined(__FreeBSD__) || defined(__DragonFly__)
         /* destroy the device for the control endpoint */          /* destroy the device for the control endpoint */
         destroy_dev(sc->dev);  
         ugen_destroy_devnodes(sc);          ugen_destroy_devnodes(sc);
           cdevsw_remove(&ugen_cdevsw, 
                       UGENUNITMASK, UGENMINOR(USBDEVUNIT(sc->sc_dev), 0));
 #endif  #endif
   
         return (0);          return (0);
 }  }
   

Removed from v.1.12  
changed lines
  Added in v.1.13