1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-14 14:55:41 +00:00

Latest round of usb cleanups:

o Consistently use device_foo_t and bus_foo_t for functions implementing
  device_foo and bus_foo respectively.  Adjust those routines that were wrong
  (we should do this throughout the tree).
o make all the modules depend on usb.  Otherwise these modules won't
  load.
o ucycom doesn't need usb_port.h
o Minor unifdefing
o uhub, umass, ums, urio, uscanner conversion complete.
o ukbd: Remove the NO_SET_PROTO quirk (fixes a PR 77940).  NetBSD removed
  their check and setting the proto a long time ago.
o umodem panic fixed.  UQ_ASSUME_CM_OVER_DATA quirk removed because I've never
  seen a umodem that needed this rejection for proection (this gets rid of
  ~20% of the quirks).

Approved by: re@ (kensmith)
PR: 77940
This commit is contained in:
Warner Losh 2007-06-21 14:42:34 +00:00
parent cb198db63b
commit bbc84740c1
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=170969
22 changed files with 202 additions and 321 deletions

View File

@ -153,11 +153,11 @@ extern int ehcidebug;
#define DPRINTF(x)
#endif
static int ehci_pci_attach(device_t self);
static int ehci_pci_detach(device_t self);
static int ehci_pci_shutdown(device_t self);
static int ehci_pci_suspend(device_t self);
static int ehci_pci_resume(device_t self);
static device_attach_t ehci_pci_attach;
static device_detach_t ehci_pci_detach;
static device_shutdown_t ehci_pci_shutdown;
static device_suspend_t ehci_pci_suspend;
static device_resume_t ehci_pci_resume;
static void ehci_pci_givecontroller(device_t self);
static void ehci_pci_takecontroller(device_t self);

View File

@ -123,6 +123,7 @@ static const struct usb_devno rum_devs[] = {
MODULE_DEPEND(rum, wlan, 1, 1, 1);
MODULE_DEPEND(rum, wlan_amrr, 1, 1, 1);
MODULE_DEPEND(rum, usb, 1, 1, 1);
static int rum_alloc_tx_list(struct rum_softc *);
static void rum_free_tx_list(struct rum_softc *);

View File

@ -112,6 +112,7 @@ static const struct usb_devno ural_devs[] = {
MODULE_DEPEND(ural, wlan, 1, 1, 1);
MODULE_DEPEND(ural, wlan_amrr, 1, 1, 1);
MODULE_DEPEND(ural, usb, 1, 1, 1);
static int ural_alloc_tx_list(struct ural_softc *);
static void ural_free_tx_list(struct ural_softc *);

View File

@ -128,10 +128,10 @@ static const char *ohci_device_generic = "OHCI (generic) USB controller";
#define PCI_OHCI_BASE_REG 0x10
static int ohci_pci_attach(device_t self);
static int ohci_pci_detach(device_t self);
static int ohci_pci_suspend(device_t self);
static int ohci_pci_resume(device_t self);
static device_attach_t ohci_pci_attach;
static device_detach_t ohci_pci_detach;
static device_suspend_t ohci_pci_suspend;
static device_resume_t ohci_pci_resume;
static int
ohci_pci_suspend(device_t self)

View File

@ -885,5 +885,5 @@ ubsermodem(struct tty *tp, int sigon, int sigoff)
return (SER_DTR | SER_RTS | SER_DCD);
}
MODULE_DEPEND(ubser, usb, 1, 1, 1);
DRIVER_MODULE(ubser, uhub, ubser_driver, ubser_devclass, usbd_driver_load, 0);

View File

@ -52,7 +52,6 @@ __FBSDID("$FreeBSD$");
#include "usbdevs.h"
#include <dev/usb/usb.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include <dev/usb/usbhid.h>
@ -103,9 +102,9 @@ struct ucycom_softc {
char sc_dying;
};
static int ucycom_probe(device_t);
static int ucycom_attach(device_t);
static int ucycom_detach(device_t);
static device_probe_t ucycom_probe;
static device_attach_t ucycom_attach;
static device_detach_t ucycom_detach;
static t_open_t ucycom_open;
static t_close_t ucycom_close;
static void ucycom_start(struct tty *);

View File

@ -623,6 +623,7 @@ udbp_out_transfer_cb(usbd_xfer_handle xfer, usbd_private_handle priv,
DRIVER_MODULE(udbp, uhub, udbp_driver, udbp_devclass, usbd_driver_load, 0);
MODULE_DEPEND(udbp, netgraph, NG_ABI_VERSION, NG_ABI_VERSION, NG_ABI_VERSION);
MODULE_DEPEND(udbp, usb, 1, 1, 1);
/***********************************************************************

View File

@ -372,4 +372,5 @@ ufm_detach(device_t self)
return 0;
}
MODULE_DEPEND(ufm, usb, 1, 1, 1);
DRIVER_MODULE(ufm, uhub, ufm_driver, ufm_devclass, usbd_driver_load, 0);

View File

@ -184,9 +184,9 @@ struct ufoma_softc{
};
static usbd_status
ufoma_set_line_coding(struct ufoma_softc *sc, usb_cdc_line_state_t *state);
static int ufoma_match(device_t);
static int ufoma_attach(device_t);
static int ufoma_detach(device_t);
static device_probe_t ufoma_match;
static device_attach_t ufoma_attach;
static device_detach_t ufoma_detach;
static void *ufoma_get_intconf(usb_config_descriptor_t *cd, usb_interface_descriptor_t *id,int type, int subtype);
static void ufoma_notify(void * ,int count);
static void ufoma_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);

View File

@ -58,13 +58,11 @@ __FBSDID("$FreeBSD$");
#include <sys/mutex.h>
#include <sys/bus.h>
#include <sys/queue.h>
#if defined(__FreeBSD__)
#include <sys/bus.h>
#include <machine/bus.h>
#include <machine/resource.h>
#include <sys/rman.h>
#endif
#include <dev/pci/pcivar.h>
#include <dev/pci/pcireg.h>
@ -155,11 +153,10 @@ static const char *uhci_device_generic = "UHCI (generic) USB controller";
#define PCI_UHCI_BASE_REG 0x20
static int uhci_pci_attach(device_t self);
static int uhci_pci_detach(device_t self);
static int uhci_pci_suspend(device_t self);
static int uhci_pci_resume(device_t self);
static device_attach_t uhci_pci_attach;
static device_detach_t uhci_pci_detach;
static device_suspend_t uhci_pci_suspend;
static device_resume_t uhci_pci_resume;
static int
uhci_pci_suspend(device_t self)

View File

@ -169,7 +169,6 @@ static int uhid_do_ioctl(struct uhid_softc *, u_long, caddr_t, int,
struct thread *);
MODULE_DEPEND(uhid, usb, 1, 1, 1);
MODULE_DEPEND(uhid, ether, 1, 1, 1);
static device_probe_t uhid_match;
static device_attach_t uhid_attach;

View File

@ -56,7 +56,6 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
@ -94,40 +93,58 @@ struct uhub_softc {
static usbd_status uhub_explore(usbd_device_handle hub);
static void uhub_intr(usbd_xfer_handle, usbd_private_handle,usbd_status);
static bus_child_location_str_t uhub_child_location_str;
static bus_child_pnpinfo_str_t uhub_child_pnpinfo_str;
/*
* We need two attachment points:
* hub to usb and hub to hub
* Every other driver only connects to hubs
*/
/* XXX driver_added needs special care */
USB_DECLARE_DRIVER_INIT(uhub,
static device_probe_t uhub_match;
static device_attach_t uhub_attach;
static device_detach_t uhub_detach;
static bus_child_location_str_t uhub_child_location_str;
static bus_child_pnpinfo_str_t uhub_child_pnpinfo_str;
static device_method_t uhub_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, uhub_match),
DEVMETHOD(device_attach, uhub_attach),
DEVMETHOD(device_detach, uhub_detach),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(bus_child_pnpinfo_str, uhub_child_pnpinfo_str),
DEVMETHOD(bus_child_location_str, uhub_child_location_str),
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
DEVMETHOD(device_shutdown, bus_generic_shutdown)
);
/* XXX driver_added needs special care */
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
{ 0, 0 }
};
static driver_t uhub_driver = {
"uhub",
uhub_methods,
sizeof(struct uhub_softc)
};
static devclass_t uhub_devclass;
/* Create the driver instance for the hub connected to usb case. */
devclass_t uhubroot_devclass;
/* XXX driver_added needs special care */
static device_method_t uhubroot_methods[] = {
DEVMETHOD(device_probe, uhub_match),
DEVMETHOD(device_attach, uhub_attach),
DEVMETHOD(device_detach, uhub_detach),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
DEVMETHOD(bus_child_location_str, uhub_child_location_str),
DEVMETHOD(bus_child_pnpinfo_str, uhub_child_pnpinfo_str),
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
/* XXX driver_added needs special care */
DEVMETHOD(bus_driver_added, bus_generic_driver_added),
DEVMETHOD(device_probe, uhub_match),
DEVMETHOD(device_attach, uhub_attach),
DEVMETHOD(device_detach, uhub_detach),
DEVMETHOD(device_suspend, bus_generic_suspend),
DEVMETHOD(device_resume, bus_generic_resume),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
{0,0}
};
@ -539,7 +556,7 @@ uhub_explore(usbd_device_handle dev)
static int
uhub_detach(device_t self)
{
USB_DETACH_START(uhub, sc);
struct uhub_softc *sc = device_get_softc(self);
struct usbd_hub *hub = sc->sc_hub->hub;
struct usbd_port *rup;
int port, nports;
@ -680,5 +697,6 @@ uhub_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
usb_needs_explore(sc->sc_hub);
}
MODULE_DEPEND(uhub, usb, 1, 1, 1);
DRIVER_MODULE(uhub, usb, uhubroot_driver, uhubroot_devclass, 0, 0);
DRIVER_MODULE(uhub, uhub, uhub_driver, uhub_devclass, usbd_driver_load, 0);

View File

@ -356,4 +356,4 @@ static driver_t uipaq_driver = {
DRIVER_MODULE(uipaq, uhub, uipaq_driver, ucom_devclass, usbd_driver_load, 0);
MODULE_DEPEND(uipaq, usb, 1, 1, 1);
MODULE_DEPEND(uipaq, ucom,UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);
MODULE_DEPEND(uipaq, ucom, UCOM_MINVER, UCOM_PREFVER, UCOM_MAXVER);

View File

@ -144,6 +144,7 @@ static driver_t ukbd_driver = {
static devclass_t ukbd_devclass;
MODULE_DEPEND(ukbd, usb, 1, 1, 1);
DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, usbd_driver_load, 0);
static int
@ -1413,7 +1414,6 @@ static int
init_keyboard(ukbd_state_t *state, int *type, int flags)
{
usb_endpoint_descriptor_t *ed;
usbd_status err;
*type = KB_OTHER;
@ -1439,14 +1439,6 @@ bLength=%d bDescriptorType=%d bEndpointAddress=%d-%s bmAttributes=%d wMaxPacketS
return EINVAL;
}
if ((usbd_get_quirks(state->ks_uaa->device)->uq_flags & UQ_NO_SET_PROTO) == 0) {
err = usbd_set_protocol(state->ks_iface, 0);
DPRINTFN(5, ("ukbd:init_keyboard: protocol set\n"));
if (err) {
printf("ukbd: set protocol failed\n");
return EIO;
}
}
/* Ignore if SETIDLE fails since it is not crucial. */
usbd_set_idle(state->ks_iface, 0, 0);

View File

@ -187,6 +187,7 @@ static driver_t ulpt_driver = {
static devclass_t ulpt_devclass;
MODULE_DEPEND(umass, usb, 1, 1, 1);
DRIVER_MODULE(ulpt, uhub, ulpt_driver, ulpt_devclass, usbd_driver_load, 0);
static int

View File

@ -115,7 +115,6 @@
#include <sys/bus.h>
#include <sys/sysctl.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
@ -645,7 +644,7 @@ struct umass_softc {
unsigned char cam_scsi_command2[CAM_MAX_CDBLEN];
struct scsi_sense cam_scsi_sense;
struct scsi_sense cam_scsi_test_unit_ready;
usb_callout_t cam_scsi_rescan_ch;
struct callout cam_scsi_rescan_ch;
int timeout; /* in msecs */
@ -685,7 +684,27 @@ static uint8_t fake_inq_data[SHORT_INQUIRY_LENGTH] = {
};
/* USB device probe/attach/detach functions */
USB_DECLARE_DRIVER(umass);
static device_probe_t umass_match;
static device_attach_t umass_attach;
static device_detach_t umass_detach;
static device_method_t umass_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, umass_match),
DEVMETHOD(device_attach, umass_attach),
DEVMETHOD(device_detach, umass_detach),
{ 0, 0 }
};
static driver_t umass_driver = {
"umass",
umass_methods,
sizeof(struct umass_softc)
};
static devclass_t umass_devclass;
static int umass_match_proto (struct umass_softc *sc,
usbd_interface_handle iface,
usbd_device_handle udev);
@ -784,7 +803,8 @@ static void umass_dump_buffer (struct umass_softc *sc, u_int8_t *buffer,
int buflen, int printlen);
#endif
MODULE_DEPEND(umass, cam, 1,1,1);
MODULE_DEPEND(umass, cam, 1, 1, 1);
MODULE_DEPEND(umass, usb, 1, 1, 1);
/*
* USB device probe/attach/detach
@ -924,7 +944,8 @@ umass_match(device_t self)
static int
umass_attach(device_t self)
{
USB_ATTACH_START(umass, sc, uaa);
struct umass_softc *sc = device_get_softc(self);
struct usb_attach_arg *uaa = device_get_ivars(self);
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
int i;
@ -937,7 +958,7 @@ umass_attach(device_t self)
sc->sc_dev = self;
sc->iface = uaa->iface;
sc->ifaceno = uaa->ifaceno;
usb_callout_init(sc->cam_scsi_rescan_ch);
callout_init(&sc->cam_scsi_rescan_ch, 0);
/* initialise the proto and drive values in the umass_softc (again) */
(void) umass_match_proto(sc, sc->iface, uaa->device);
@ -1179,7 +1200,7 @@ umass_attach(device_t self)
static int
umass_detach(device_t self)
{
USB_DETACH_START(umass, sc);
struct umass_softc *sc = device_get_softc(self);
int err = 0;
int i;
@ -1196,7 +1217,7 @@ umass_detach(device_t self)
if (sc->intrin_pipe)
usbd_abort_pipe(sc->intrin_pipe);
usb_uncallout_drain(sc->cam_scsi_rescan_ch, umass_cam_rescan, sc);
callout_drain(&sc->cam_scsi_rescan_ch);
if ((sc->proto & UMASS_PROTO_SCSI) ||
(sc->proto & UMASS_PROTO_ATAPI) ||
(sc->proto & UMASS_PROTO_UFI) ||
@ -2339,7 +2360,7 @@ umass_cam_attach(struct umass_softc *sc)
* completed, when interrupts have been enabled.
*/
usb_callout(sc->cam_scsi_rescan_ch, MS_TO_TICKS(200),
callout_reset(&sc->cam_scsi_rescan_ch, MS_TO_TICKS(200),
umass_cam_rescan, sc);
}

View File

@ -284,9 +284,6 @@ umodem_attach(device_t self)
int i;
struct ucom_softc *ucom;
id = usbd_get_interface_descriptor(sc->sc_ctl_iface);
device_printf(self, "iclass %d/%d", id->bInterfaceClass,
id->bInterfaceSubClass);
ucom = &sc->sc_ucom;
ucom->sc_dev = self;
sc->sc_dev = self;
@ -296,6 +293,9 @@ umodem_attach(device_t self)
sc->sc_udev = dev;
sc->sc_ctl_iface = uaa->iface;
sc->sc_ctl_iface_no = id->bInterfaceNumber;
id = usbd_get_interface_descriptor(sc->sc_ctl_iface);
device_printf(self, "iclass %d/%d", id->bInterfaceClass,
id->bInterfaceSubClass);
umodem_get_caps(dev, &sc->sc_cm_cap, &sc->sc_acm_cap);
@ -360,16 +360,11 @@ umodem_attach(device_t self)
goto bad;
}
if (usbd_get_quirks(sc->sc_udev)->uq_flags & UQ_ASSUME_CM_OVER_DATA) {
DPRINTF(("Quirk says to assume CM over data\n"));
if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) {
if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE)
umodem_set_comm_feature(sc, UCDC_ABSTRACT_STATE,
UCDC_DATA_MULTIPLEXED);
sc->sc_cm_over_data = 1;
} else {
if (sc->sc_cm_cap & USB_CDC_CM_OVER_DATA) {
if (sc->sc_acm_cap & USB_CDC_ACM_HAS_FEATURE)
umodem_set_comm_feature(sc,
UCDC_ABSTRACT_STATE, UCDC_DATA_MULTIPLEXED);
sc->sc_cm_over_data = 1;
}
}
/*

View File

@ -58,7 +58,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/uio.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbhid.h>
@ -100,7 +99,7 @@ struct ums_softc {
struct hid_location sc_loc_x, sc_loc_y, sc_loc_z, sc_loc_t;
struct hid_location *sc_loc_btn;
usb_callout_t callout_handle; /* for spurious button ups */
struct callout callout_handle; /* for spurious button ups */
int sc_enabled;
int sc_disconnected; /* device is gone */
@ -158,7 +157,26 @@ static struct cdevsw ums_cdevsw = {
.d_name = "ums",
};
USB_DECLARE_DRIVER(ums);
static device_probe_t ums_match;
static device_attach_t ums_attach;
static device_detach_t ums_detach;
static device_method_t ums_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, ums_match),
DEVMETHOD(device_attach, ums_attach),
DEVMETHOD(device_detach, ums_detach),
{ 0, 0 }
};
static driver_t ums_driver = {
"ums",
ums_methods,
sizeof(struct ums_softc)
};
static devclass_t ums_devclass;
static int
ums_match(device_t self)
@ -192,7 +210,8 @@ ums_match(device_t self)
static int
ums_attach(device_t self)
{
USB_ATTACH_START(ums, sc, uaa);
struct ums_softc *sc = device_get_softc(self);
struct usb_attach_arg *uaa = device_get_ivars(self);
usbd_interface_handle iface = uaa->iface;
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
@ -355,7 +374,7 @@ ums_attach(device_t self)
UID_ROOT, GID_OPERATOR,
0644, "ums%d", device_get_unit(self));
usb_callout_init(sc->callout_handle);
callout_init(&sc->callout_handle, 0);
if (usbd_get_quirks(uaa->device)->uq_flags & UQ_SPUR_BUT_UP) {
DPRINTF(("%s: Spurious button up events\n",
device_get_nameunit(sc->sc_dev)));
@ -402,10 +421,7 @@ ums_detach(device_t self)
}
void
ums_intr(xfer, addr, status)
usbd_xfer_handle xfer;
usbd_private_handle addr;
usbd_status status;
ums_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
{
struct ums_softc *sc = addr;
u_char *ibuf;
@ -494,11 +510,10 @@ ums_intr(xfer, addr, status)
*/
if (sc->flags & UMS_SPUR_BUT_UP &&
dx == 0 && dy == 0 && dz == 0 && dt == 0 && buttons == 0) {
usb_callout(sc->callout_handle, MS_TO_TICKS(50 /*msecs*/),
ums_add_to_queue_timeout, (void *) sc);
callout_reset(&sc->callout_handle, MS_TO_TICKS(50),
ums_add_to_queue_timeout, (void *) sc);
} else {
usb_uncallout(sc->callout_handle,
ums_add_to_queue_timeout, (void *) sc);
callout_stop(&sc->callout_handle);
ums_add_to_queue(sc, dx, dy, dz, dt, buttons);
}
}
@ -603,7 +618,7 @@ ums_disable(priv)
{
struct ums_softc *sc = priv;
usb_uncallout(sc->callout_handle, ums_add_to_queue_timeout, sc);
callout_stop(&sc->callout_handle);
/* Disable interrupts. */
usbd_abort_pipe(sc->sc_intrpipe);
@ -620,7 +635,9 @@ ums_open(struct cdev *dev, int flag, int fmt, struct thread *p)
{
struct ums_softc *sc;
USB_GET_SC_OPEN(ums, UMSUNIT(dev), sc);
sc = devclass_get_softc(ums_devclass, UMSUNIT(dev));
if (sc == NULL)
return (ENXIO);
return ums_enable(sc);
}
@ -630,8 +647,7 @@ ums_close(struct cdev *dev, int flag, int fmt, struct thread *p)
{
struct ums_softc *sc;
USB_GET_SC(ums, UMSUNIT(dev), sc);
sc = devclass_get_softc(ums_devclass, UMSUNIT(dev));
if (!sc)
return 0;
@ -650,8 +666,7 @@ ums_read(struct cdev *dev, struct uio *uio, int flag)
int l = 0;
int error;
USB_GET_SC(ums, UMSUNIT(dev), sc);
sc = devclass_get_softc(ums_devclass, UMSUNIT(dev));
s = splusb();
if (!sc) {
splx(s);
@ -718,8 +733,7 @@ ums_poll(struct cdev *dev, int events, struct thread *p)
int revents = 0;
int s;
USB_GET_SC(ums, UMSUNIT(dev), sc);
sc = devclass_get_softc(ums_devclass, UMSUNIT(dev));
if (!sc)
return 0;
@ -745,8 +759,7 @@ ums_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *p
int s;
mousemode_t mode;
USB_GET_SC(ums, UMSUNIT(dev), sc);
sc = devclass_get_softc(ums_devclass, UMSUNIT(dev));
if (!sc)
return EIO;
@ -853,4 +866,5 @@ ums_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *p
return error;
}
MODULE_DEPEND(ums, usb, 1, 1, 1);
DRIVER_MODULE(ums, uhub, ums_driver, ums_devclass, usbd_driver_load, 0);

View File

@ -62,7 +62,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/uio.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
@ -124,16 +123,33 @@ struct urio_softc {
int sc_refcnt;
struct cdev *sc_dev_t;
#if defined(__NetBSD__) || defined(__OpenBSD__)
u_char sc_dying;
#endif
};
#define URIOUNIT(n) (minor(n))
#define RIO_RW_TIMEOUT 4000 /* ms */
USB_DECLARE_DRIVER(urio);
static device_probe_t urio_match;
static device_attach_t urio_attach;
static device_detach_t urio_detach;
static device_method_t urio_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, urio_match),
DEVMETHOD(device_attach, urio_attach),
DEVMETHOD(device_detach, urio_detach),
{ 0, 0 }
};
static driver_t urio_driver = {
"urio",
urio_methods,
sizeof(struct urio_softc)
};
static devclass_t urio_devclass;
static int
urio_match(device_t self)
@ -161,13 +177,11 @@ urio_match(device_t self)
static int
urio_attach(device_t self)
{
USB_ATTACH_START(urio, sc, uaa);
struct urio_softc *sc = device_get_softc(self);
struct usb_attach_arg *uaa = device_get_ivars(self);
usbd_device_handle udev;
usbd_interface_handle iface;
u_int8_t epcount;
#if defined(__NetBSD__) || defined(__OpenBSD__)
u_int8_t niface;
#endif
usbd_status r;
char * ermsg = "<none>";
int i;
@ -176,29 +190,11 @@ urio_attach(device_t self)
sc->sc_dev = self;
sc->sc_udev = udev = uaa->device;
#if defined(__FreeBSD__)
if ((!uaa->device) || (!uaa->iface)) {
ermsg = "device or iface";
goto nobulk;
}
sc->sc_iface = iface = uaa->iface;
#elif defined(__NetBSD__) || defined(__OpenBSD__)
if (!udev) {
ermsg = "device";
goto nobulk;
}
r = usbd_interface_count(udev, &niface);
if (r) {
ermsg = "iface";
goto nobulk;
}
r = usbd_device2interface_handle(udev, 0, &iface);
if (r) {
ermsg = "iface";
goto nobulk;
}
sc->sc_iface = iface;
#endif
sc->sc_opened = 0;
sc->sc_pipeh_in = 0;
sc->sc_pipeh_out = 0;
@ -233,15 +229,9 @@ urio_attach(device_t self)
goto nobulk;
}
#if defined(__FreeBSD__)
/* XXX no error trapping, no storing of struct cdev **/
sc->sc_dev_t = make_dev(&urio_cdevsw, device_get_unit(self),
UID_ROOT, GID_OPERATOR,
0644, "urio%d", device_get_unit(self));
#elif defined(__NetBSD__) || defined(__OpenBSD__)
usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev);
#endif
DPRINTFN(10, ("urio_attach: %p\n", sc->sc_udev));
return 0;
@ -255,11 +245,11 @@ urio_attach(device_t self)
int
urioopen(struct cdev *dev, int flag, int mode, struct thread *p)
{
#if (USBDI >= 1)
struct urio_softc * sc;
#endif
int unit = URIOUNIT(dev);
USB_GET_SC_OPEN(urio, unit, sc);
sc = devclass_get_softc(urio_devclass, unit);
if (sc == NULL)
return (ENXIO);
DPRINTFN(5, ("urioopen: flag=%d, mode=%d, unit=%d\n",
flag, mode, unit));
@ -295,11 +285,9 @@ urioopen(struct cdev *dev, int flag, int mode, struct thread *p)
int
urioclose(struct cdev *dev, int flag, int mode, struct thread *p)
{
#if (USBDI >= 1)
struct urio_softc * sc;
#endif
int unit = URIOUNIT(dev);
USB_GET_SC(urio, unit, sc);
sc = devclass_get_softc(urio_devclass, unit);
DPRINTFN(5, ("urioclose: flag=%d, mode=%d, unit=%d\n", flag, mode, unit));
if (sc->sc_pipeh_in)
@ -318,49 +306,29 @@ urioclose(struct cdev *dev, int flag, int mode, struct thread *p)
int
urioread(struct cdev *dev, struct uio *uio, int flag)
{
#if (USBDI >= 1)
struct urio_softc * sc;
usbd_xfer_handle reqh;
#else
usbd_request_handle reqh;
usbd_private_handle r_priv;
void *r_buff;
usbd_status r_status;
#endif
int unit = URIOUNIT(dev);
usbd_status r;
char buf[URIO_BBSIZE];
u_int32_t n, tn;
int error = 0;
USB_GET_SC(urio, unit, sc);
sc = devclass_get_softc(urio_devclass, unit);
DPRINTFN(5, ("urioread: %d\n", unit));
if (!sc->sc_opened)
return EIO;
#if (USBDI >= 1)
sc->sc_refcnt++;
reqh = usbd_alloc_xfer(sc->sc_udev);
#else
reqh = usbd_alloc_request();
#endif
if (reqh == 0)
return ENOMEM;
while ((n = min(URIO_BBSIZE, uio->uio_resid)) != 0) {
DPRINTFN(1, ("urioread: start transfer %d bytes\n", n));
tn = n;
#if (USBDI >= 1)
usbd_setup_xfer(reqh, sc->sc_pipeh_in, 0, buf, tn,
0, RIO_RW_TIMEOUT, 0);
#else
r = usbd_setup_request(reqh, sc->sc_pipeh_in, 0, buf, tn,
0, RIO_RW_TIMEOUT, 0);
if (r != USBD_NORMAL_COMPLETION) {
error = EIO;
break;
}
#endif
r = usbd_sync_transfer(reqh);
if (r != USBD_NORMAL_COMPLETION) {
DPRINTFN(1, ("urioread: error=%d\n", r));
@ -369,53 +337,35 @@ urioread(struct cdev *dev, struct uio *uio, int flag)
error = EIO;
break;
}
#if (USBDI >= 1)
usbd_get_xfer_status(reqh, 0, 0, &tn, 0);
#else
usbd_get_request_status(reqh, &r_priv, &r_buff, &tn, &r_status);
#endif
DPRINTFN(1, ("urioread: got %d bytes\n", tn));
error = uiomove(buf, tn, uio);
if (error || tn < n)
break;
}
#if (USBDI >= 1)
usbd_free_xfer(reqh);
#else
usbd_free_request(reqh);
#endif
return error;
}
int
uriowrite(struct cdev *dev, struct uio *uio, int flag)
{
#if (USBDI >= 1)
struct urio_softc * sc;
usbd_xfer_handle reqh;
#else
usbd_request_handle reqh;
#endif
int unit = URIOUNIT(dev);
usbd_status r;
char buf[URIO_BBSIZE];
u_int32_t n;
int error = 0;
USB_GET_SC(urio, unit, sc);
sc = devclass_get_softc(urio_devclass, unit);
DPRINTFN(5, ("uriowrite: %d\n", unit));
if (!sc->sc_opened)
return EIO;
#if (USBDI >= 1)
sc->sc_refcnt++;
reqh = usbd_alloc_xfer(sc->sc_udev);
#else
reqh = usbd_alloc_request();
#endif
if (reqh == 0)
return EIO;
while ((n = min(URIO_BBSIZE, uio->uio_resid)) != 0) {
@ -423,17 +373,8 @@ uriowrite(struct cdev *dev, struct uio *uio, int flag)
if (error)
break;
DPRINTFN(1, ("uriowrite: transfer %d bytes\n", n));
#if (USBDI >= 1)
usbd_setup_xfer(reqh, sc->sc_pipeh_out, 0, buf, n,
0, RIO_RW_TIMEOUT, 0);
#else
r = usbd_setup_request(reqh, sc->sc_pipeh_out, 0, buf, n,
0, RIO_RW_TIMEOUT, 0);
if (r != USBD_NORMAL_COMPLETION) {
error = EIO;
break;
}
#endif
r = usbd_sync_transfer(reqh);
if (r != USBD_NORMAL_COMPLETION) {
DPRINTFN(1, ("uriowrite: error=%d\n", r));
@ -441,17 +382,10 @@ uriowrite(struct cdev *dev, struct uio *uio, int flag)
error = EIO;
break;
}
#if (USBDI >= 1)
usbd_get_xfer_status(reqh, 0, 0, 0, 0);
#endif
}
#if (USBDI >= 1)
usbd_free_xfer(reqh);
#else
usbd_free_request(reqh);
#endif
return error;
}
@ -459,9 +393,7 @@ uriowrite(struct cdev *dev, struct uio *uio, int flag)
int
urioioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *p)
{
#if (USBDI >= 1)
struct urio_softc * sc;
#endif
int unit = URIOUNIT(dev);
struct RioCommand *rio_cmd;
int requesttype, len;
@ -473,8 +405,7 @@ urioioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *p
int error = 0;
usbd_status r;
USB_GET_SC(urio, unit, sc);
sc = devclass_get_softc(urio_devclass, unit);
switch (cmd) {
case RIO_RECV_COMMAND:
if (!(flag & FWRITE))
@ -556,61 +487,14 @@ urioioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *p
return error;
}
#if defined(__NetBSD__) || defined(__OpenBSD__)
int
urio_activate(device_t self, enum devact act)
{
struct urio_softc *sc = (struct urio_softc *)self;
switch (act) {
case DVACT_ACTIVATE:
return (EOPNOTSUPP);
break;
case DVACT_DEACTIVATE:
sc->sc_dying = 1;
break;
}
return (0);
}
static int
urio_detach(device_t self)
{
USB_DETACH_START(urio, sc);
struct urio_endpoint *sce;
int i, dir;
struct urio_softc *sc = device_get_softc(self);
int s;
#if defined(__NetBSD__) || defined(__OpenBSD__)
int maj, mn;
DPRINTF(("urio_detach: sc=%p flags=%d\n", sc, flags));
#elif defined(__FreeBSD__)
DPRINTF(("urio_detach: sc=%p\n", sc));
#endif
sc->sc_dying = 1;
/* Abort all pipes. Causes processes waiting for transfer to wake. */
#if 0
for (i = 0; i < USB_MAX_ENDPOINTS; i++) {
for (dir = OUT; dir <= IN; dir++) {
sce = &sc->sc_endpoints[i][dir];
if (sce && sce->pipeh)
usbd_abort_pipe(sce->pipeh);
}
}
s = splusb();
if (--sc->sc_refcnt >= 0) {
/* Wake everyone */
for (i = 0; i < USB_MAX_ENDPOINTS; i++)
wakeup(&sc->sc_endpoints[i][IN]);
/* Wait for processes to go away. */
usb_detach_wait(sc->sc_dev);
}
splx(s);
#else
if (sc->sc_pipeh_in)
usbd_abort_pipe(sc->sc_pipeh_in);
@ -623,37 +507,12 @@ urio_detach(device_t self)
usb_detach_wait(sc->sc_dev);
}
splx(s);
#endif
#if defined(__NetBSD__) || defined(__OpenBSD__)
/* locate the major number */
for (maj = 0; maj < nchrdev; maj++)
if (cdevsw[maj].d_open == urioopen)
break;
/* Nuke the vnodes for any open instances (calls close). */
mn = self->dv_unit * USB_MAX_ENDPOINTS;
vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);
#endif
usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
return (0);
}
#endif /* defined(__NetBSD__) || defined(__OpenBSD__) */
#if defined(__FreeBSD__)
static int
urio_detach(device_t self)
{
struct urio_softc *sc = device_get_softc(self);
DPRINTF(("%s: disconnected\n", device_get_nameunit(self)));
destroy_dev(sc->sc_dev_t);
/* XXX not implemented yet */
device_set_desc(self, NULL);
return 0;
}
MODULE_DEPEND(uscanner, usb, 1, 1, 1);
DRIVER_MODULE(urio, uhub, urio_driver, urio_devclass, usbd_driver_load, 0);
#endif

View File

@ -60,7 +60,6 @@ static const struct usbd_quirk_entry {
u_int16_t bcdDevice;
struct usbd_quirks quirks;
} usb_quirks[] = {
{ USB_VENDOR_KYE, USB_PRODUCT_KYE_NICHE, 0x100, { UQ_NO_SET_PROTO}},
{ USB_VENDOR_INSIDEOUT, USB_PRODUCT_INSIDEOUT_EDGEPORT4,
0x094, { UQ_SWAP_UNICODE}},
{ USB_VENDOR_DALLAS, USB_PRODUCT_DALLAS_J6502, 0x0a2, { UQ_BAD_ADC }},
@ -71,27 +70,11 @@ static const struct usbd_quirk_entry {
{ USB_VENDOR_ALCOR2, USB_PRODUCT_ALCOR2_KBD_HUB, 0x001, { UQ_SPUR_BUT_UP }},
{ USB_VENDOR_MCT, USB_PRODUCT_MCT_HUB0100, 0x102, { UQ_BUS_POWERED }},
{ USB_VENDOR_MCT, USB_PRODUCT_MCT_USB232, 0x102, { UQ_BUS_POWERED }},
{ USB_VENDOR_METRICOM, USB_PRODUCT_METRICOM_RICOCHET_GS,
0x100, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_SANYO, USB_PRODUCT_SANYO_SCP4900,
0x000, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_TI, USB_PRODUCT_TI_UTUSB41, 0x110, { UQ_POWER_CLAIM }},
{ USB_VENDOR_TELEX, USB_PRODUCT_TELEX_MIC1, 0x009, { UQ_AU_NO_FRAC }},
{ USB_VENDOR_SILICONPORTALS, USB_PRODUCT_SILICONPORTALS_YAPPHONE,
0x100, { UQ_AU_INP_ASYNC }},
{ USB_VENDOR_LOGITECH, USB_PRODUCT_LOGITECH_UN53B, ANY, { UQ_NO_STRINGS }},
{ USB_VENDOR_CMOTECH, USB_PRODUCT_CMOTECH_CNU510,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_CMOTECH, USB_PRODUCT_CMOTECH_CNU550,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_HX550C,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_CURITEL, USB_PRODUCT_CURITEL_HX57XB,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_UBIQUAM, USB_PRODUCT_UBIQUAM_UALL,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_QUALCOMM, USB_PRODUCT_QUALCOMM_RWT_FCT,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
/* XXX These should have a revision number, but I don't know what they are. */
{ USB_VENDOR_HP, USB_PRODUCT_HP_895C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_880C, ANY, { UQ_BROKEN_BIDIR }},
@ -100,23 +83,6 @@ static const struct usbd_quirk_entry {
{ USB_VENDOR_HP, USB_PRODUCT_HP_830C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_HP, USB_PRODUCT_HP_1220C, ANY, { UQ_BROKEN_BIDIR }},
{ USB_VENDOR_XEROX, USB_PRODUCT_XEROX_WCM15, ANY, { UQ_BROKEN_BIDIR }},
/* YAMAHA router's ucdDevice is the version of farmware and often changes. */
{ USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_RTA54I,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_RTA55I,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_RTW65B,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_YAMAHA, USB_PRODUCT_YAMAHA_RTW65I,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_QUALCOMM, USB_PRODUCT_QUALCOMM_CDMA_MSM,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_QUALCOMM2, USB_PRODUCT_QUALCOMM2_CDMA_MSM,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_SUNTAC, USB_PRODUCT_SUNTAC_AS64LX,
0x100, { UQ_ASSUME_CM_OVER_DATA }},
{ USB_VENDOR_MOTOROLA2, USB_PRODUCT_MOTOROLA2_A41XV32X,
ANY, { UQ_ASSUME_CM_OVER_DATA }},
/* Devices which should be ignored by uhid */
{ USB_VENDOR_APC, USB_PRODUCT_APC_UPS,
ANY, { UQ_HID_IGNORE }},
@ -130,6 +96,7 @@ static const struct usbd_quirk_entry {
ANY, { UQ_HID_IGNORE }},
{ USB_VENDOR_MGE, USB_PRODUCT_MGE_UPS2,
ANY, { UQ_HID_IGNORE }},
/* Devices which should be ignored by both ukbd and uhid */
{ USB_VENDOR_CYPRESS, USB_PRODUCT_CYPRESS_WISPY,
ANY, { UQ_KBD_IGNORE }},

View File

@ -40,7 +40,6 @@
struct usbd_quirks {
u_int32_t uq_flags; /* Device problems: */
#define UQ_NO_SET_PROTO 0x0001 /* cannot handle SET PROTOCOL. */
#define UQ_SWAP_UNICODE 0x0002 /* has some Unicode strings swapped. */
#define UQ_MS_REVZ 0x0004 /* mouse has Z-axis reversed */
#define UQ_NO_STRINGS 0x0008 /* string descriptors are broken. */
@ -52,12 +51,10 @@ struct usbd_quirks {
#define UQ_POWER_CLAIM 0x0200 /* hub lies about power status */
#define UQ_AU_NO_FRAC 0x0400 /* don't adjust for fractional samples */
#define UQ_AU_INP_ASYNC 0x0800 /* input is async despite claim of adaptive */
#define UQ_ASSUME_CM_OVER_DATA 0x1000 /* modem device breaks on cm over data */
#define UQ_BROKEN_BIDIR 0x2000 /* printer has broken bidir mode */
#define UQ_OPEN_CLEARSTALL 0x4000 /* device needs clear endpoint stall */
#define UQ_HID_IGNORE 0x8000 /* device should be ignored by hid class */
#define UQ_KBD_IGNORE 0x18000 /* device should be ignored by both kbd and hid class */
};
extern const struct usbd_quirks usbd_no_quirk;

View File

@ -64,7 +64,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sysctl.h>
#include <sys/uio.h>
#include <dev/usb/usb_port.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
@ -289,7 +288,26 @@ static void uscanner_do_close(struct uscanner_softc *);
#define USCANNERUNIT(n) (minor(n))
USB_DECLARE_DRIVER(uscanner);
static device_probe_t uscanner_match;
static device_attach_t uscanner_attach;
static device_detach_t uscanner_detach;
static device_method_t uscanner_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, uscanner_match),
DEVMETHOD(device_attach, uscanner_attach),
DEVMETHOD(device_detach, uscanner_detach),
{ 0, 0 }
};
static driver_t uscanner_driver = {
"uscanner",
uscanner_methods,
sizeof(struct uscanner_softc)
};
static devclass_t uscanner_devclass;
static int
uscanner_match(device_t self)
@ -306,7 +324,8 @@ uscanner_match(device_t self)
static int
uscanner_attach(device_t self)
{
USB_ATTACH_START(uscanner, sc, uaa);
struct uscanner_softc *sc = device_get_softc(self);
struct usb_attach_arg *uaa = device_get_ivars(self);
usb_interface_descriptor_t *id = 0;
usb_endpoint_descriptor_t *ed, *ed_bulkin = NULL, *ed_bulkout = NULL;
int i;
@ -379,7 +398,9 @@ uscanneropen(struct cdev *dev, int flag, int mode, struct thread *p)
int unit = USCANNERUNIT(dev);
usbd_status err;
USB_GET_SC_OPEN(uscanner, unit, sc);
sc = devclass_get_softc(uscanner_devclass, unit);
if (sc == NULL)
return (ENXIO);
DPRINTFN(5, ("uscanneropen: flag=%d, mode=%d, unit=%d\n",
flag, mode, unit));
@ -440,8 +461,7 @@ uscannerclose(struct cdev *dev, int flag, int mode, struct thread *p)
{
struct uscanner_softc *sc;
USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);
sc = devclass_get_softc(uscanner_devclass, USCANNERUNIT(dev));
DPRINTFN(5, ("uscannerclose: flag=%d, mode=%d, unit=%d\n",
flag, mode, USCANNERUNIT(dev)));
@ -539,8 +559,7 @@ uscannerread(struct cdev *dev, struct uio *uio, int flag)
struct uscanner_softc *sc;
int error;
USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);
sc = devclass_get_softc(uscanner_devclass, USCANNERUNIT(dev));
sc->sc_refcnt++;
error = uscanner_do_read(sc, uio, flag);
if (--sc->sc_refcnt < 0)
@ -589,8 +608,7 @@ uscannerwrite(struct cdev *dev, struct uio *uio, int flag)
struct uscanner_softc *sc;
int error;
USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);
sc = devclass_get_softc(uscanner_devclass, USCANNERUNIT(dev));
sc->sc_refcnt++;
error = uscanner_do_write(sc, uio, flag);
if (--sc->sc_refcnt < 0)
@ -601,7 +619,7 @@ uscannerwrite(struct cdev *dev, struct uio *uio, int flag)
static int
uscanner_detach(device_t self)
{
USB_DETACH_START(uscanner, sc);
struct uscanner_softc *sc = device_get_softc(self);
int s;
DPRINTF(("uscanner_detach: sc=%p\n", sc));
@ -635,8 +653,7 @@ uscannerpoll(struct cdev *dev, int events, struct thread *p)
struct uscanner_softc *sc;
int revents = 0;
USB_GET_SC(uscanner, USCANNERUNIT(dev), sc);
sc = devclass_get_softc(uscanner_devclass, USCANNERUNIT(dev));
if (sc->sc_dying)
return (EIO);
@ -651,4 +668,5 @@ uscannerpoll(struct cdev *dev, int events, struct thread *p)
return (revents);
}
MODULE_DEPEND(uscanner, usb, 1, 1, 1);
DRIVER_MODULE(uscanner, uhub, uscanner_driver, uscanner_devclass, usbd_driver_load, 0);