USB_QUIRK(4)

NAME
usb_quirk - USB quirks module

SYNOPSIS
To compile this module into the kernel, place the following line in your kernel configuration file:

device usb

Alternatively, to load the module at boot time, place the following line in loader.conf(5):

    usb_quirk_load="YES"

DESCRIPTION
The usb_quirk module provides support for dynamically adding and removing quirks for USB devices with usbconfig(8).

General quirks:

UQ_AUDIO_SWAP_LR
    swap left and right channels

UQ_AU_INP_ASYNC
    input is async despite claim of adaptive

UQ_AU_NO_FRAC
    do not adjust for fractional samples

UQ_AU_NO_XU
    audio device has broken extension unit

UQ_AU_VENDOR_CLASS
    audio device uses vendor class to identify itself

UQ_AU_SET_SPDIF_CM6206
    audio device needs special programming to enable S/PDIF audio output

UQ_BAD_ADC
    bad audio spec version number

UQ_BAD_AUDIO
    device claims audio class, but is not

UQ_BROKEN_BIDIR
    printer has broken bidir mode

UQ_BUS_POWERED
    device is bus powered, despite claim

UQ_HID_IGNORE
    device should be ignored by hid class

UQ_KBD_IGNORE
    device should be ignored by kbd class

UQ_KBD_BOOTPROTO
    device should set the boot protocol

UQ_UMS_IGNORE
    device should be ignored by ums class

UQ_MS_BAD_CLASS
    does not identify properly

UQ_MS_LEADING_BYTE
    mouse sends an unknown leading byte

UQ_MS_REVZ
    mouse has Z-axis reversed

UQ_NO_STRINGS
    string descriptors are broken

UQ_POWER_CLAIM
    hub lies about power status

UQ_SPUR_BUT_UP
    spurious mouse button up events

UQ_SWAP_UNICODE
    has some Unicode strings swapped

UQ_CFG_INDEX_1
    select configuration index 1 by default

UQ_CFG_INDEX_2
    select configuration index 2 by default

UQ_CFG_INDEX_3
    select configuration index 3 by default

UQ_CFG_INDEX_4
    select configuration index 4 by default

UQ_CFG_INDEX_0
    select configuration index 0 by default

UQ_ASSUME_CM_OVER_DATA
    assume cm over data feature

UQ_WMT_IGNORE
    device should be ignored by wmt driver

USB Mass Storage quirks:

UQ_MSC_NO_TEST_UNIT_READY
    send start/stop instead of TUR

UQ_MSC_NO_RS_CLEAR_UA
    does not reset Unit Att.

UQ_MSC_NO_START_STOP
    does not support start/stop

UQ_MSC_NO_GETMAXLUN
    does not support get max LUN

UQ_MSC_NO_INQUIRY
    fake generic inq response

UQ_MSC_NO_INQUIRY_EVPD
    does not support inq EVPD

UQ_MSC_NO_SYNC_CACHE
    does not support sync cache

UQ_MSC_SHUTTLE_INIT
    requires Shuttle init sequence

UQ_MSC_ALT_IFACE_1
    switch to alternate interface 1

UQ_MSC_FLOPPY_SPEED
    does floppy speeds (20kb/s)

UQ_MSC_IGNORE_RESIDUE
    gets residue wrong

UQ_MSC_WRONG_CSWSIG
    uses wrong CSW signature

UQ_MSC_RBC_PAD_TO_12
    pad RBC requests to 12 bytes

UQ_MSC_READ_CAP_OFFBY1
    reports sector count, not max sec.

UQ_MSC_FORCE_SHORT_INQ
    does not support full inq.

UQ_MSC_FORCE_WIRE_BBB
    force BBB wire protocol

UQ_MSC_FORCE_WIRE_CBI
    force CBI wire protocol

UQ_MSC_FORCE_WIRE_CBI_I
    force CBI with int. wire protocol

UQ_MSC_FORCE_PROTO_SCSI
    force SCSI command protocol

UQ_MSC_FORCE_PROTO_ATAPI
    force ATAPI command protocol

UQ_MSC_FORCE_PROTO_UFI
    force UFI command protocol

UQ_MSC_FORCE_PROTO_RBC
    force RBC command protocol

3G Datacard (u3g) quirks:

UQ_MSC_EJECT_HUAWEI
    ejects after Huawei USB command

UQ_MSC_EJECT_SIERRA
    ejects after Sierra USB command

UQ_MSC_EJECT_SCSIEJECT
    ejects after SCSI eject command 0x1b0000000200

UQ_MSC_EJECT_REZERO
    ejects after SCSI rezero command 0x010000000000

UQ_MSC_EJECT_ZTESTOR
    ejects after ZTE SCSI command 0x850101011801010101010000

UQ_MSC_EJECT_CMOTECH
    ejects after C-motech SCSI command 0xff52444556434847

UQ_MSC_EJECT_WAIT
    wait for the device to eject

UQ_MSC_EJECT_SAEL_M460
    ejects after Sael USB commands

UQ_MSC_EJECT_HUAWEISCSI
    ejects after Huawei SCSI command 0x11060000000000000000000000000000

UQ_MSC_EJECT_TCT
    ejects after TCT SCSI command 0x06f504025270

UQ_MSC_DYMO_EJECT
    ejects after HID command 0x1b5a01

See /sys/dev/usb/quirk/usb_quirk.h or run "usbconfig dump_quirk_names" for the complete list of supported quirks.

LOADER TUNABLE
The following tunable can be set at the loader(8) prompt before booting the kernel, or stored in loader.conf(5).

hw.usb.quirk.%d
    The value is a string whose format is:

        "VendorId ProductId LowRevision HighRevision UQ_QUIRK,..."

    Installs the quirks UQ_QUIRK,... for all USB devices matching VendorId and ProductId which have a hardware revision between and including LowRevision and HighRevision.

    VendorId, ProductId, LowRevision and HighRevision are all 16 bits numbers which can be decimal or hexadecimal based.

    A maximum of 100 variables hw.usb.quirk.0, .1, ..., .99 can be defined.

    If a matching entry is found in the kernel's internal quirks table, it is replaced by the new definition.

    Else a new entry is created given that the quirk table is not full.

    The kernel iterates over the hw.usb.quirk.N variables starting at N = 0 and stops at N = 99 or the first non-existing one.

EXAMPLES
After attaching a u3g device which appears as a USB device on ugen0.3:

    usbconfig -d ugen0.3 add_quirk UQ_MSC_EJECT_WAIT

Enable a Holtec/Keep Out F85 gaming keyboard on ugen1.4:

    usbconfig -d ugen1.4 add_quirk UQ_KBD_BOOTPROTO

To install a quirk at boot time, place one or several lines like the following in loader.conf(5):

    hw.usb.quirk.0="0x04d9 0xfa50 0 0xffff UQ_KBD_IGNORE"

SEE ALSO
usbconfig(8)

HISTORY
The usb_quirk module appeared in FreeBSD 8.0, and was written by Hans Petter Selasky <hselasky@FreeBSD.org>. This manual page was written by Nick Hibma <n_hibma@FreeBSD.org>.