- Make struct usb_xfer opaque so that drivers can not access the internals
- Reduce the number of headers needed for a usb driver, the common case is just usb.h and usbdi.h
This commit is contained in:
parent
8c8fff3177
commit
ed6d949afd
@ -40,10 +40,8 @@
|
||||
#include "libusb20_int.h"
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_revision.h>
|
||||
|
||||
static libusb20_init_backend_t ugen20_init_backend;
|
||||
static libusb20_open_device_t ugen20_open_device;
|
||||
|
@ -66,7 +66,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <net80211/ieee80211_ioctl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <compat/ndis/pe_var.h>
|
||||
#include <compat/ndis/cfg_var.h>
|
||||
|
@ -96,7 +96,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <compat/ndis/pe_var.h>
|
||||
#include <compat/ndis/cfg_var.h>
|
||||
|
@ -42,6 +42,8 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/mbuf.h>
|
||||
@ -57,13 +59,10 @@ __FBSDID("$FreeBSD$");
|
||||
#include <net80211/ieee80211_ioctl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_defs.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
|
||||
#include <compat/ndis/pe_var.h>
|
||||
@ -616,7 +615,7 @@ usbd_setup_endpoint_one(ip, ifidx, ne, epconf)
|
||||
return (status);
|
||||
}
|
||||
xfer = ne->ne_xfer[0];
|
||||
xfer->priv_fifo = ne;
|
||||
usbd_xfer_set_priv(xfer, ne);
|
||||
|
||||
return (status);
|
||||
}
|
||||
@ -688,14 +687,14 @@ usbd_setup_endpoint(ip, ifidx, ep)
|
||||
return (status);
|
||||
}
|
||||
xfer = ne->ne_xfer[0];
|
||||
xfer->priv_fifo = ne;
|
||||
usbd_xfer_set_priv(xfer, ne);
|
||||
if (UE_GET_DIR(ep->bEndpointAddress) == UE_DIR_IN)
|
||||
xfer->timeout = NDISUSB_NO_TIMEOUT;
|
||||
usbd_xfer_set_timeout(xfer, NDISUSB_NO_TIMEOUT);
|
||||
else {
|
||||
if (UE_GET_XFERTYPE(ep->bmAttributes) == UE_BULK)
|
||||
xfer->timeout = NDISUSB_TX_TIMEOUT;
|
||||
usbd_xfer_set_timeout(xfer, NDISUSB_TX_TIMEOUT);
|
||||
else
|
||||
xfer->timeout = NDISUSB_INTR_TIMEOUT;
|
||||
usbd_xfer_set_timeout(xfer, NDISUSB_INTR_TIMEOUT);
|
||||
}
|
||||
|
||||
return (status);
|
||||
@ -853,34 +852,38 @@ usbd_aq_getfirst(struct ndis_softc *sc, struct ndisusb_ep *ne)
|
||||
}
|
||||
|
||||
static void
|
||||
usbd_non_isoc_callback(struct usb_xfer *xfer)
|
||||
usbd_non_isoc_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
irp *ip;
|
||||
struct ndis_softc *sc = xfer->priv_sc;
|
||||
struct ndisusb_ep *ne = xfer->priv_fifo;
|
||||
struct ndis_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ndisusb_ep *ne = usbd_xfer_get_priv(xfer);
|
||||
struct ndisusb_xfer *nx;
|
||||
struct usbd_urb_bulk_or_intr_transfer *ubi;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t irql;
|
||||
uint32_t len;
|
||||
union usbd_urb *urb;
|
||||
usb_endpoint_descriptor_t *ep;
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
nx = usbd_aq_getfirst(sc, ne);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (nx == NULL)
|
||||
return;
|
||||
|
||||
/* copy in data with regard to the URB */
|
||||
if (ne->ne_dirin != 0)
|
||||
usbd_copy_out(xfer->frbuffers, 0, nx->nx_urbbuf,
|
||||
xfer->frlengths[0]);
|
||||
nx->nx_urbbuf += xfer->frlengths[0];
|
||||
nx->nx_urbactlen += xfer->frlengths[0];
|
||||
nx->nx_urblen -= xfer->frlengths[0];
|
||||
usbd_copy_out(pc, 0, nx->nx_urbbuf, actlen);
|
||||
nx->nx_urbbuf += actlen;
|
||||
nx->nx_urbactlen += actlen;
|
||||
nx->nx_urblen -= actlen;
|
||||
|
||||
/* check for short transfer */
|
||||
if (xfer->actlen < xfer->sumlen)
|
||||
if (actlen < sumlen)
|
||||
nx->nx_urblen = 0;
|
||||
else {
|
||||
/* check remainder */
|
||||
@ -897,7 +900,7 @@ usbd_non_isoc_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
}
|
||||
usbd_xfer_complete(sc, ne, nx,
|
||||
((xfer->actlen < xfer->sumlen) && (nx->nx_shortxfer == 0)) ?
|
||||
((actlen < sumlen) && (nx->nx_shortxfer == 0)) ?
|
||||
USB_ERR_SHORT_XFER : USB_ERR_NORMAL_COMPLETION);
|
||||
|
||||
/* fall through */
|
||||
@ -927,41 +930,44 @@ usbd_non_isoc_callback(struct usb_xfer *xfer)
|
||||
nx->nx_shortxfer = (ubi->ubi_trans_flags &
|
||||
USBD_SHORT_TRANSFER_OK) ? 1 : 0;
|
||||
extra:
|
||||
len = MIN(xfer->max_data_length, nx->nx_urblen);
|
||||
len = MIN(usbd_xfer_max_len(xfer), nx->nx_urblen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (UE_GET_DIR(ep->bEndpointAddress) == UE_DIR_OUT)
|
||||
usbd_copy_in(xfer->frbuffers, 0, nx->nx_urbbuf, len);
|
||||
xfer->frlengths[0] = len;
|
||||
xfer->nframes = 1;
|
||||
usbd_copy_in(pc, 0, nx->nx_urbbuf, len);
|
||||
usbd_xfer_set_frame_len(xfer, 0, len);
|
||||
usbd_xfer_set_frames(xfer, 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
default:
|
||||
nx = usbd_aq_getfirst(sc, ne);
|
||||
if (nx == NULL)
|
||||
return;
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
xfer->flags.stall_pipe = 1;
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
usbd_xfer_set_stall(xfer);
|
||||
device_printf(sc->ndis_dev, "usb xfer warning (%s)\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
}
|
||||
usbd_xfer_complete(sc, ne, nx, xfer->error);
|
||||
if (xfer->error != USB_ERR_CANCELLED)
|
||||
usbd_xfer_complete(sc, ne, nx, error);
|
||||
if (error != USB_ERR_CANCELLED)
|
||||
goto next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
usbd_ctrl_callback(struct usb_xfer *xfer)
|
||||
usbd_ctrl_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
irp *ip;
|
||||
struct ndis_softc *sc = xfer->priv_sc;
|
||||
struct ndisusb_ep *ne = xfer->priv_fifo;
|
||||
struct ndis_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ndisusb_ep *ne = usbd_xfer_get_priv(xfer);
|
||||
struct ndisusb_xfer *nx;
|
||||
uint8_t irql;
|
||||
union usbd_urb *urb;
|
||||
struct usbd_urb_vendor_or_class_request *vcreq;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t type = 0;
|
||||
struct usb_device_request req;
|
||||
int len;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -974,9 +980,10 @@ usbd_ctrl_callback(struct usb_xfer *xfer)
|
||||
vcreq = &urb->uu_vcreq;
|
||||
|
||||
if (vcreq->uvc_trans_flags & USBD_TRANSFER_DIRECTION_IN) {
|
||||
usbd_copy_out(xfer->frbuffers + 1, 0,
|
||||
vcreq->uvc_trans_buf, xfer->frlengths[1]);
|
||||
nx->nx_urbactlen += xfer->frlengths[1];
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
len = usbd_xfer_get_framelen(xfer, 1);
|
||||
usbd_copy_out(pc, 0, vcreq->uvc_trans_buf, len);
|
||||
nx->nx_urbactlen += len;
|
||||
}
|
||||
|
||||
usbd_xfer_complete(sc, ne, nx, USB_ERR_NORMAL_COMPLETION);
|
||||
@ -1044,17 +1051,19 @@ usbd_ctrl_callback(struct usb_xfer *xfer)
|
||||
nx->nx_urblen = vcreq->uvc_trans_buflen;
|
||||
nx->nx_urbactlen = 0;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->nframes = 1;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frames(xfer, 1);
|
||||
if (vcreq->uvc_trans_flags & USBD_TRANSFER_DIRECTION_IN) {
|
||||
if (vcreq->uvc_trans_buflen >= USBD_CTRL_READ_BUFFER_SP)
|
||||
device_printf(sc->ndis_dev,
|
||||
"warning: not enough buffer space (%d).\n",
|
||||
vcreq->uvc_trans_buflen);
|
||||
xfer->frlengths[1] = MIN(xfer->max_data_length,
|
||||
vcreq->uvc_trans_buflen);
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 1,
|
||||
MIN(usbd_xfer_max_len(xfer),
|
||||
vcreq->uvc_trans_buflen));
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
} else {
|
||||
if (nx->nx_urblen > 0)
|
||||
device_printf(sc->ndis_dev,
|
||||
@ -1066,10 +1075,11 @@ usbd_ctrl_callback(struct usb_xfer *xfer)
|
||||
* the future if it needs to be.
|
||||
*/
|
||||
if (nx->nx_urblen > 0) {
|
||||
usbd_copy_in(xfer->frbuffers + 1 , 0,
|
||||
nx->nx_urbbuf, nx->nx_urblen);
|
||||
xfer->frlengths[1] = nx->nx_urblen;
|
||||
xfer->nframes = 2;
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_in(pc, 0, nx->nx_urbbuf,
|
||||
nx->nx_urblen);
|
||||
usbd_xfer_set_frame_len(xfer, 1, nx->nx_urblen);
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
}
|
||||
}
|
||||
usbd_transfer_submit(xfer);
|
||||
@ -1078,13 +1088,13 @@ usbd_ctrl_callback(struct usb_xfer *xfer)
|
||||
nx = usbd_aq_getfirst(sc, ne);
|
||||
if (nx == NULL)
|
||||
return;
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
xfer->flags.stall_pipe = 1;
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
usbd_xfer_set_stall(xfer);
|
||||
device_printf(sc->ndis_dev, "usb xfer warning (%s)\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
}
|
||||
usbd_xfer_complete(sc, ne, nx, xfer->error);
|
||||
if (xfer->error != USB_ERR_CANCELLED)
|
||||
usbd_xfer_complete(sc, ne, nx, error);
|
||||
if (error != USB_ERR_CANCELLED)
|
||||
goto next;
|
||||
break;
|
||||
}
|
||||
|
@ -30,18 +30,30 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <machine/bus.h>
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <sys/ata.h>
|
||||
#include <sys/bio.h>
|
||||
@ -145,7 +157,8 @@ static usb_callback_t atausb2_tr_error;
|
||||
|
||||
static void atausb2_cancel_request(struct atausb2_softc *sc);
|
||||
static void atausb2_transfer_start(struct atausb2_softc *sc, uint8_t xfer_no);
|
||||
static void atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer, uint8_t next_xfer, uint8_t stall_xfer);
|
||||
static void atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error);
|
||||
static int ata_usbchannel_begin_transaction(struct ata_request *request);
|
||||
static int ata_usbchannel_end_transaction(struct ata_request *request);
|
||||
|
||||
@ -467,10 +480,11 @@ atausb2_transfer_start(struct atausb2_softc *sc, uint8_t xfer_no)
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_reset1_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_reset1_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -485,40 +499,40 @@ atausb2_t_bbb_reset1_callback(struct usb_xfer *xfer)
|
||||
req.wIndex[1] = 0;
|
||||
USETW(req.wLength, 0);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->nframes = 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frames(xfer, 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
atausb2_tr_error(xfer);
|
||||
atausb2_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_reset2_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_reset2_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_RESET3,
|
||||
ATAUSB_T_BBB_DATA_READ);
|
||||
ATAUSB_T_BBB_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_reset3_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_reset3_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_COMMAND,
|
||||
ATAUSB_T_BBB_DATA_WRITE);
|
||||
ATAUSB_T_BBB_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
uint8_t next_xfer,
|
||||
uint8_t stall_xfer)
|
||||
uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -533,18 +547,19 @@ atausb2_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
atausb2_tr_error(xfer);
|
||||
atausb2_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ata_request *request = sc->ata_request;
|
||||
struct ata_channel *ch;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t tag;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -575,37 +590,42 @@ atausb2_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
bzero(sc->cbw.cdb, 16);
|
||||
bcopy(request->u.atapi.ccb, sc->cbw.cdb, 12); /* XXX SOS */
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &sc->cbw, sizeof(sc->cbw));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &sc->cbw, sizeof(sc->cbw));
|
||||
|
||||
xfer->frlengths[0] = sizeof(sc->cbw);
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(sc->cbw));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
atausb2_tr_error(xfer);
|
||||
atausb2_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0,
|
||||
sc->ata_data, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, sc->ata_data, actlen);
|
||||
|
||||
sc->ata_bytecount -= xfer->actlen;
|
||||
sc->ata_data += xfer->actlen;
|
||||
sc->ata_donecount += xfer->actlen;
|
||||
sc->ata_bytecount -= actlen;
|
||||
sc->ata_data += actlen;
|
||||
sc->ata_donecount += actlen;
|
||||
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
/* short transfer */
|
||||
sc->ata_bytecount = 0;
|
||||
}
|
||||
@ -622,15 +642,15 @@ atausb2_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->ata_bytecount) {
|
||||
max_bulk = sc->ata_bytecount;
|
||||
}
|
||||
xfer->timeout = sc->timeout;
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_xfer_set_timeout(xfer, sc->timeout);
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
atausb2_tr_error(xfer);
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
atausb2_tr_error(xfer, error);
|
||||
} else {
|
||||
atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_RD_CS);
|
||||
}
|
||||
@ -640,24 +660,28 @@ atausb2_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_data_rd_cs_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_data_rd_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_STATUS,
|
||||
ATAUSB_T_BBB_DATA_READ);
|
||||
ATAUSB_T_BBB_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
sc->ata_bytecount -= xfer->actlen;
|
||||
sc->ata_data += xfer->actlen;
|
||||
sc->ata_donecount += xfer->actlen;
|
||||
sc->ata_bytecount -= actlen;
|
||||
sc->ata_data += actlen;
|
||||
sc->ata_donecount += actlen;
|
||||
|
||||
case USB_ST_SETUP:
|
||||
|
||||
@ -672,18 +696,18 @@ atausb2_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->ata_bytecount) {
|
||||
max_bulk = sc->ata_bytecount;
|
||||
}
|
||||
xfer->timeout = sc->timeout;
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0,
|
||||
sc->ata_data, max_bulk);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, sc->ata_data, max_bulk);
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
usbd_xfer_set_timeout(xfer, sc->timeout);
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
atausb2_tr_error(xfer);
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
atausb2_tr_error(xfer, error);
|
||||
} else {
|
||||
atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_WR_CS);
|
||||
}
|
||||
@ -693,26 +717,31 @@ atausb2_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_data_wr_cs_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_data_wr_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
atausb2_t_bbb_data_clear_stall_callback(xfer, ATAUSB_T_BBB_STATUS,
|
||||
ATAUSB_T_BBB_DATA_WRITE);
|
||||
ATAUSB_T_BBB_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
atausb2_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ata_request *request = sc->ata_request;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t residue;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < sizeof(sc->csw)) {
|
||||
if (actlen < sizeof(sc->csw)) {
|
||||
bzero(&sc->csw, sizeof(sc->csw));
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &sc->csw, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &sc->csw, actlen);
|
||||
|
||||
if (request->flags & (ATA_R_READ | ATA_R_WRITE)) {
|
||||
request->donecount = sc->ata_donecount;
|
||||
@ -779,15 +808,14 @@ atausb2_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
|
||||
case USB_ST_SETUP:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default:
|
||||
tr_error:
|
||||
if ((xfer->error == USB_ERR_CANCELLED) ||
|
||||
(sc->status_try)) {
|
||||
atausb2_tr_error(xfer);
|
||||
if (error == USB_ERR_CANCELLED || sc->status_try) {
|
||||
atausb2_tr_error(xfer, error);
|
||||
} else {
|
||||
sc->status_try = 1;
|
||||
atausb2_transfer_start(sc, ATAUSB_T_BBB_DATA_RD_CS);
|
||||
@ -820,15 +848,15 @@ atausb2_cancel_request(struct atausb2_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
atausb2_tr_error(struct usb_xfer *xfer)
|
||||
atausb2_tr_error(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct atausb2_softc *sc = xfer->priv_sc;
|
||||
struct atausb2_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
|
||||
if (atausbdebug) {
|
||||
device_printf(sc->dev, "transfer failed, %s, in state %d "
|
||||
"-> BULK reset\n", usbd_errstr(xfer->error),
|
||||
"-> BULK reset\n", usbd_errstr(error),
|
||||
sc->last_xfer_no);
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +74,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <compat/ndis/pe_var.h>
|
||||
#include <compat/ndis/cfg_var.h>
|
||||
|
@ -52,7 +52,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/rman.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <net80211/ieee80211_var.h>
|
||||
|
||||
|
@ -55,7 +55,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <compat/ndis/pe_var.h>
|
||||
#include <compat/ndis/cfg_var.h>
|
||||
|
@ -53,7 +53,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/bus.h>
|
||||
#include <machine/bus.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <net80211/ieee80211_var.h>
|
||||
|
||||
|
@ -45,23 +45,33 @@
|
||||
* $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR uaudio_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
|
||||
#include <dev/usb/quirk/usb_quirk.h>
|
||||
|
||||
@ -946,8 +956,6 @@ uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
|
||||
bChannels = UAUDIO_MAX_CHAN(asf1d->bNrChannels);
|
||||
bBitResolution = asf1d->bBitResolution;
|
||||
|
||||
DPRINTFN(9, "bChannels=%u\n", bChannels);
|
||||
|
||||
if (asf1d->bSamFreqType == 0) {
|
||||
DPRINTFN(16, "Sample rate: %d-%dHz\n",
|
||||
UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d));
|
||||
@ -1106,14 +1114,17 @@ uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev)
|
||||
}
|
||||
|
||||
static void
|
||||
uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uaudio_chan *ch = xfer->priv_sc;
|
||||
uint32_t *p_len = xfer->frlengths;
|
||||
struct uaudio_chan *ch = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t total;
|
||||
uint32_t blockcount;
|
||||
uint32_t n;
|
||||
uint32_t offset;
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
/* allow dynamic sizing of play buffer */
|
||||
total = ch->intr_size;
|
||||
@ -1129,8 +1140,8 @@ uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
blockcount = UAUDIO_MINFRAMES;
|
||||
}
|
||||
/* range check - max */
|
||||
if (blockcount > xfer->max_frame_count) {
|
||||
blockcount = xfer->max_frame_count;
|
||||
if (blockcount > usbd_xfer_max_frames(xfer)) {
|
||||
blockcount = usbd_xfer_max_frames(xfer);
|
||||
}
|
||||
/* compute the total length */
|
||||
total = blockcount * ch->bytes_per_frame;
|
||||
@ -1138,25 +1149,24 @@ uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_transferred:
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
DPRINTF("short transfer, "
|
||||
"%d of %d bytes\n", xfer->actlen, total);
|
||||
"%d of %d bytes\n", actlen, total);
|
||||
}
|
||||
chn_intr(ch->pcm_ch);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
if (ch->bytes_per_frame > xfer->max_frame_size) {
|
||||
if (ch->bytes_per_frame > usbd_xfer_max_framelen(xfer)) {
|
||||
DPRINTF("bytes per transfer, %d, "
|
||||
"exceeds maximum, %d!\n",
|
||||
ch->bytes_per_frame,
|
||||
xfer->max_frame_size);
|
||||
usbd_xfer_max_framelen(xfer));
|
||||
break;
|
||||
}
|
||||
/* setup frame length */
|
||||
xfer->nframes = blockcount;
|
||||
for (n = 0; n != blockcount; n++) {
|
||||
p_len[n] = ch->bytes_per_frame;
|
||||
}
|
||||
usbd_xfer_set_frames(xfer, blockcount);
|
||||
for (n = 0; n != blockcount; n++)
|
||||
usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame);
|
||||
|
||||
if (ch->end == ch->start) {
|
||||
DPRINTF("no buffer!\n");
|
||||
@ -1166,13 +1176,14 @@ uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
|
||||
offset = 0;
|
||||
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
while (total > 0) {
|
||||
|
||||
n = (ch->end - ch->cur);
|
||||
if (n > total) {
|
||||
n = total;
|
||||
}
|
||||
usbd_copy_in(xfer->frbuffers, offset, ch->cur, n);
|
||||
usbd_copy_in(pc, offset, ch->cur, n);
|
||||
|
||||
total -= n;
|
||||
ch->cur += n;
|
||||
@ -1187,7 +1198,7 @@ uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
goto tr_transferred;
|
||||
@ -1195,16 +1206,20 @@ uaudio_chan_play_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uaudio_chan_record_callback(struct usb_xfer *xfer)
|
||||
uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uaudio_chan *ch = xfer->priv_sc;
|
||||
uint32_t *p_len = xfer->frlengths;
|
||||
struct uaudio_chan *ch = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t n;
|
||||
uint32_t m;
|
||||
uint32_t total;
|
||||
uint32_t blockcount;
|
||||
uint32_t offset0;
|
||||
uint32_t offset1;
|
||||
int len;
|
||||
int actlen, nframes;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
|
||||
|
||||
/* allow dynamic sizing of play buffer */
|
||||
total = ch->intr_size;
|
||||
@ -1220,8 +1235,8 @@ uaudio_chan_record_callback(struct usb_xfer *xfer)
|
||||
blockcount = UAUDIO_MINFRAMES;
|
||||
}
|
||||
/* range check - max */
|
||||
if (blockcount > xfer->max_frame_count) {
|
||||
blockcount = xfer->max_frame_count;
|
||||
if (blockcount > usbd_xfer_max_frames(xfer)) {
|
||||
blockcount = usbd_xfer_max_frames(xfer);
|
||||
}
|
||||
/* compute the total length */
|
||||
total = blockcount * ch->bytes_per_frame;
|
||||
@ -1229,29 +1244,31 @@ uaudio_chan_record_callback(struct usb_xfer *xfer)
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_transferred:
|
||||
if (xfer->actlen < total) {
|
||||
if (actlen < total) {
|
||||
DPRINTF("short transfer, "
|
||||
"%d of %d bytes\n", xfer->actlen, total);
|
||||
"%d of %d bytes\n", actlen, total);
|
||||
} else {
|
||||
DPRINTFN(6, "transferred %d bytes\n", xfer->actlen);
|
||||
DPRINTFN(6, "transferred %d bytes\n", actlen);
|
||||
}
|
||||
|
||||
offset0 = 0;
|
||||
|
||||
for (n = 0; n != xfer->nframes; n++) {
|
||||
for (n = 0; n != nframes; n++) {
|
||||
|
||||
offset1 = offset0;
|
||||
pc = usbd_xfer_get_frame(xfer, n);
|
||||
len = usbd_xfer_get_framelen(xfer, n);
|
||||
|
||||
while (p_len[n] > 0) {
|
||||
while (len > 0) {
|
||||
|
||||
m = (ch->end - ch->cur);
|
||||
|
||||
if (m > p_len[n]) {
|
||||
m = p_len[n];
|
||||
if (m > len) {
|
||||
m = len;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, offset1, ch->cur, m);
|
||||
usbd_copy_out(pc, offset1, ch->cur, m);
|
||||
|
||||
p_len[n] -= m;
|
||||
len -= m;
|
||||
offset1 += m;
|
||||
ch->cur += m;
|
||||
|
||||
@ -1266,16 +1283,16 @@ uaudio_chan_record_callback(struct usb_xfer *xfer)
|
||||
chn_intr(ch->pcm_ch);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
if (ch->bytes_per_frame > xfer->max_frame_size) {
|
||||
if (ch->bytes_per_frame > usbd_xfer_max_framelen(xfer)) {
|
||||
DPRINTF("bytes per transfer, %d, "
|
||||
"exceeds maximum, %d!\n",
|
||||
ch->bytes_per_frame,
|
||||
xfer->max_frame_size);
|
||||
usbd_xfer_max_framelen(xfer));
|
||||
return;
|
||||
}
|
||||
xfer->nframes = blockcount;
|
||||
for (n = 0; n != xfer->nframes; n++) {
|
||||
p_len[n] = ch->bytes_per_frame;
|
||||
usbd_xfer_set_frames(xfer, blockcount);
|
||||
for (n = 0; n < blockcount; n++) {
|
||||
usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame);
|
||||
}
|
||||
|
||||
if (ch->end == ch->start) {
|
||||
@ -1286,7 +1303,7 @@ uaudio_chan_record_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
return;
|
||||
}
|
||||
goto tr_transferred;
|
||||
@ -2958,11 +2975,12 @@ uaudio_mixer_get(struct usb_device *udev, uint8_t what,
|
||||
}
|
||||
|
||||
static void
|
||||
uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer)
|
||||
uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_device_request req;
|
||||
struct uaudio_softc *sc = xfer->priv_sc;
|
||||
struct uaudio_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
|
||||
struct usb_page_cache *pc;
|
||||
uint16_t len;
|
||||
uint8_t repeat = 1;
|
||||
uint8_t update;
|
||||
@ -3011,12 +3029,14 @@ uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer)
|
||||
if (len > 1) {
|
||||
buf[1] = (mc->wData[chan] >> 8) & 0xFF;
|
||||
}
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0, buf, len);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_in(pc, 0, buf, len);
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = len;
|
||||
xfer->nframes = xfer->frlengths[1] ? 2 : 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, len);
|
||||
usbd_xfer_set_frames(xfer, len ? 2 : 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
}
|
||||
@ -3033,8 +3053,8 @@ uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error=%s\n", usbd_errstr(xfer->error));
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
DPRINTF("error=%s\n", usbd_errstr(error));
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
/* do nothing - we are detaching */
|
||||
break;
|
||||
}
|
||||
@ -3237,9 +3257,9 @@ uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src)
|
||||
*========================================================================*/
|
||||
|
||||
static void
|
||||
umidi_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
umidi_read_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umidi_chan *chan = xfer->priv_sc;
|
||||
struct umidi_chan *chan = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = chan->xfer[1];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
@ -3250,42 +3270,47 @@ umidi_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umidi_bulk_read_callback(struct usb_xfer *xfer)
|
||||
umidi_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umidi_chan *chan = xfer->priv_sc;
|
||||
struct umidi_chan *chan = usbd_xfer_softc(xfer);
|
||||
struct umidi_sub_chan *sub;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[1];
|
||||
uint8_t cmd_len;
|
||||
uint8_t cn;
|
||||
uint16_t pos;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("actlen=%d bytes\n", xfer->actlen);
|
||||
DPRINTF("actlen=%d bytes\n", actlen);
|
||||
|
||||
if (xfer->actlen == 0) {
|
||||
if (actlen == 0) {
|
||||
/* should not happen */
|
||||
goto tr_error;
|
||||
}
|
||||
pos = 0;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
while (xfer->actlen >= 4) {
|
||||
while (actlen >= 4) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, pos, buf, 1);
|
||||
usbd_copy_out(pc, pos, buf, 1);
|
||||
|
||||
cmd_len = umidi_cmd_to_len[buf[0] & 0xF]; /* command length */
|
||||
cn = buf[0] >> 4; /* cable number */
|
||||
sub = &chan->sub[cn];
|
||||
|
||||
if (cmd_len && (cn < chan->max_cable) && sub->read_open) {
|
||||
usb_fifo_put_data(sub->fifo.fp[USB_FIFO_RX], xfer->frbuffers,
|
||||
usb_fifo_put_data(sub->fifo.fp[USB_FIFO_RX], pc,
|
||||
pos + 1, cmd_len, 1);
|
||||
} else {
|
||||
/* ignore the command */
|
||||
}
|
||||
|
||||
xfer->actlen -= 4;
|
||||
actlen -= 4;
|
||||
pos += 4;
|
||||
}
|
||||
|
||||
@ -3296,16 +3321,16 @@ umidi_bulk_read_callback(struct usb_xfer *xfer)
|
||||
usbd_transfer_start(chan->xfer[3]);
|
||||
return;
|
||||
}
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default:
|
||||
tr_error:
|
||||
|
||||
DPRINTF("error=%s\n", usbd_errstr(xfer->error));
|
||||
DPRINTF("error=%s\n", usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
chan->flags |= UMIDI_FLAG_READ_STALL;
|
||||
usbd_transfer_start(chan->xfer[3]);
|
||||
@ -3316,9 +3341,9 @@ umidi_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umidi_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
umidi_write_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umidi_chan *chan = xfer->priv_sc;
|
||||
struct umidi_chan *chan = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = chan->xfer[0];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
@ -3462,19 +3487,23 @@ umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b)
|
||||
}
|
||||
|
||||
static void
|
||||
umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umidi_chan *chan = xfer->priv_sc;
|
||||
struct umidi_chan *chan = usbd_xfer_softc(xfer);
|
||||
struct umidi_sub_chan *sub;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
uint16_t total_length;
|
||||
uint8_t buf;
|
||||
uint8_t start_cable;
|
||||
uint8_t tr_any;
|
||||
int len;
|
||||
|
||||
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTF("actlen=%d bytes\n", xfer->actlen);
|
||||
DPRINTF("actlen=%d bytes\n", len);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
|
||||
@ -3485,10 +3514,9 @@ umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
}
|
||||
total_length = 0; /* reset */
|
||||
|
||||
start_cable = chan->curr_cable;
|
||||
|
||||
tr_any = 0;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
while (1) {
|
||||
|
||||
@ -3498,14 +3526,13 @@ umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
if (sub->write_open) {
|
||||
usb_fifo_get_data(sub->fifo.fp[USB_FIFO_TX],
|
||||
xfer->frbuffers, total_length,
|
||||
1, &actlen, 0);
|
||||
pc, total_length, 1, &actlen, 0);
|
||||
} else {
|
||||
actlen = 0;
|
||||
}
|
||||
|
||||
if (actlen) {
|
||||
usbd_copy_out(xfer->frbuffers, total_length, &buf, 1);
|
||||
usbd_copy_out(pc, total_length, &buf, 1);
|
||||
|
||||
tr_any = 1;
|
||||
|
||||
@ -3517,7 +3544,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
sub->temp_cmd[0], sub->temp_cmd[1],
|
||||
sub->temp_cmd[2], sub->temp_cmd[3]);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, total_length,
|
||||
usbd_copy_in(pc, total_length,
|
||||
sub->temp_cmd, 4);
|
||||
|
||||
total_length += 4;
|
||||
@ -3542,16 +3569,16 @@ umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
if (total_length) {
|
||||
xfer->frlengths[0] = total_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, total_length);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
|
||||
DPRINTF("error=%s\n", usbd_errstr(xfer->error));
|
||||
DPRINTF("error=%s\n", usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
chan->flags |= UMIDI_FLAG_WRITE_STALL;
|
||||
usbd_transfer_start(chan->xfer[2]);
|
||||
@ -3564,7 +3591,7 @@ umidi_bulk_write_callback(struct usb_xfer *xfer)
|
||||
static struct umidi_sub_chan *
|
||||
umidi_sub_by_fifo(struct usb_fifo *fifo)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
struct umidi_sub_chan *sub;
|
||||
uint32_t n;
|
||||
|
||||
@ -3585,7 +3612,7 @@ umidi_sub_by_fifo(struct usb_fifo *fifo)
|
||||
static void
|
||||
umidi_start_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(chan->xfer[1]);
|
||||
}
|
||||
@ -3593,7 +3620,7 @@ umidi_start_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
umidi_stop_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
|
||||
|
||||
DPRINTF("\n");
|
||||
@ -3612,7 +3639,7 @@ umidi_stop_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
umidi_start_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(chan->xfer[0]);
|
||||
}
|
||||
@ -3620,7 +3647,7 @@ umidi_start_write(struct usb_fifo *fifo)
|
||||
static void
|
||||
umidi_stop_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
|
||||
|
||||
DPRINTF("\n");
|
||||
@ -3637,31 +3664,31 @@ umidi_stop_write(struct usb_fifo *fifo)
|
||||
static int
|
||||
umidi_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct umidi_chan *chan = fifo->priv_sc0;
|
||||
struct umidi_chan *chan = usb_fifo_softc(fifo);
|
||||
struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
|
||||
|
||||
if (fflags & FREAD) {
|
||||
if (usb_fifo_alloc_buffer(fifo, 4, (1024 / 4))) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
mtx_lock(fifo->priv_mtx);
|
||||
mtx_lock(&Giant);
|
||||
chan->read_open_refcount++;
|
||||
sub->read_open = 1;
|
||||
mtx_unlock(fifo->priv_mtx);
|
||||
mtx_unlock(&Giant);
|
||||
}
|
||||
if (fflags & FWRITE) {
|
||||
if (usb_fifo_alloc_buffer(fifo, 32, (1024 / 32))) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
/* clear stall first */
|
||||
mtx_lock(fifo->priv_mtx);
|
||||
mtx_lock(&Giant);
|
||||
chan->flags |= UMIDI_FLAG_WRITE_STALL;
|
||||
chan->write_open_refcount++;
|
||||
sub->write_open = 1;
|
||||
|
||||
/* reset */
|
||||
sub->state = UMIDI_ST_UNKNOWN;
|
||||
mtx_unlock(fifo->priv_mtx);
|
||||
mtx_unlock(&Giant);
|
||||
}
|
||||
return (0); /* success */
|
||||
}
|
||||
|
@ -44,9 +44,28 @@ __FBSDID("$FreeBSD$");
|
||||
* endpoints, Function-address and more.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR at91dcidebug
|
||||
|
||||
@ -70,7 +89,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define AT9100_DCI_PC2SC(pc) \
|
||||
AT9100_DCI_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int at91dcidebug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, at91dci, CTLFLAG_RW, 0, "USB at91dci");
|
||||
|
@ -26,9 +26,28 @@ __FBSDID("$FreeBSD$");
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -36,9 +36,28 @@ __FBSDID("$FreeBSD$");
|
||||
* endpoints, Function-address and more.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR atmegadci_debug
|
||||
|
||||
@ -62,7 +81,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define ATMEGA_PC2SC(pc) \
|
||||
ATMEGA_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int atmegadci_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, atmegadci, CTLFLAG_RW, 0, "USB ATMEGA DCI");
|
||||
|
@ -26,7 +26,28 @@ __FBSDID("$FreeBSD$");
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -36,9 +36,28 @@ __FBSDID("$FreeBSD$");
|
||||
* endpoints, Function-address and more.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR avr32dci_debug
|
||||
|
||||
@ -62,7 +81,7 @@ __FBSDID("$FreeBSD$");
|
||||
#define AVR32_PC2SC(pc) \
|
||||
AVR32_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int avr32dci_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, avr32dci, CTLFLAG_RW, 0, "USB AVR32 DCI");
|
||||
|
@ -46,9 +46,28 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR ehcidebug
|
||||
|
||||
@ -1133,7 +1152,7 @@ ehci_non_isoc_done_sub(struct usb_xfer *xfer)
|
||||
td_alt_next = td->alt_next;
|
||||
|
||||
if (xfer->aframes != xfer->nframes) {
|
||||
xfer->frlengths[xfer->aframes] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, xfer->aframes, 0);
|
||||
}
|
||||
while (1) {
|
||||
|
||||
|
@ -31,8 +31,28 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_bus.h"
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -38,8 +38,28 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include "opt_bus.h"
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -52,8 +52,28 @@ __FBSDID("$FreeBSD$");
|
||||
* sharing of code between *BSD's
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -36,9 +36,28 @@
|
||||
* NOTE: The current implementation only supports Device Side Mode!
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR musbotgdebug
|
||||
|
||||
@ -64,7 +83,7 @@
|
||||
#define MUSBOTG_PC2SC(pc) \
|
||||
MUSBOTG_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int musbotgdebug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, musbotg, CTLFLAG_RW, 0, "USB musbotg");
|
||||
|
@ -24,8 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -35,9 +35,28 @@ __FBSDID("$FreeBSD$");
|
||||
* USB spec: http://www.usb.org/developers/docs/usbspec.zip
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR ohcidebug
|
||||
|
||||
@ -58,7 +77,7 @@ __FBSDID("$FreeBSD$");
|
||||
((ohci_softc_t *)(((uint8_t *)(bus)) - \
|
||||
((uint8_t *)&(((ohci_softc_t *)0)->sc_bus))))
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int ohcidebug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, ohci, CTLFLAG_RW, 0, "USB ohci");
|
||||
@ -205,7 +224,7 @@ ohci_controller_init(ohci_softc_t *sc)
|
||||
device_printf(sc->sc_bus.bdev, "reset timeout\n");
|
||||
return (USB_ERR_IOERROR);
|
||||
}
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 15) {
|
||||
ohci_dumpregs(sc);
|
||||
}
|
||||
@ -264,7 +283,7 @@ ohci_controller_init(ohci_softc_t *sc)
|
||||
sc->sc_noport = OHCI_GET_NDP(OREAD4(sc, OHCI_RH_DESCRIPTOR_A));
|
||||
}
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 5) {
|
||||
ohci_dumpregs(sc);
|
||||
}
|
||||
@ -380,7 +399,7 @@ ohci_init(ohci_softc_t *sc)
|
||||
|
||||
usb_callout_init_mtx(&sc->sc_tmo_rhsc, &sc->sc_bus.bus_mtx, 0);
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 15) {
|
||||
for (i = 0; i != OHCI_NO_EDS; i++) {
|
||||
printf("ed#%d ", i);
|
||||
@ -433,7 +452,7 @@ ohci_suspend(ohci_softc_t *sc)
|
||||
|
||||
USB_BUS_LOCK(&sc->sc_bus);
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
DPRINTF("\n");
|
||||
if (ohcidebug > 2) {
|
||||
ohci_dumpregs(sc);
|
||||
@ -463,7 +482,7 @@ ohci_resume(ohci_softc_t *sc)
|
||||
{
|
||||
uint32_t ctl;
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
DPRINTF("\n");
|
||||
if (ohcidebug > 2) {
|
||||
ohci_dumpregs(sc);
|
||||
@ -497,7 +516,7 @@ ohci_resume(ohci_softc_t *sc)
|
||||
ohci_do_poll(&sc->sc_bus);
|
||||
}
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static void
|
||||
ohci_dumpregs(ohci_softc_t *sc)
|
||||
{
|
||||
@ -744,7 +763,7 @@ ohci_isoc_done(struct usb_xfer *xfer)
|
||||
panic("%s:%d: out of TD's\n",
|
||||
__FUNCTION__, __LINE__);
|
||||
}
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 5) {
|
||||
DPRINTF("isoc TD\n");
|
||||
ohci_dump_itd(td);
|
||||
@ -785,7 +804,7 @@ ohci_isoc_done(struct usb_xfer *xfer)
|
||||
ohci_device_done(xfer, USB_ERR_NORMAL_COMPLETION);
|
||||
}
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static const char *const
|
||||
ohci_cc_strs[] =
|
||||
{
|
||||
@ -828,7 +847,7 @@ ohci_non_isoc_done_sub(struct usb_xfer *xfer)
|
||||
td_flags = 0;
|
||||
|
||||
if (xfer->aframes != xfer->nframes) {
|
||||
xfer->frlengths[xfer->aframes] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, xfer->aframes, 0);
|
||||
}
|
||||
while (1) {
|
||||
|
||||
@ -913,7 +932,7 @@ ohci_non_isoc_done(struct usb_xfer *xfer)
|
||||
DPRINTFN(13, "xfer=%p endpoint=%p transfer done\n",
|
||||
xfer, xfer->endpoint);
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 10) {
|
||||
ohci_dump_tds(xfer->td_transfer_first);
|
||||
}
|
||||
@ -1138,7 +1157,7 @@ ohci_interrupt(ohci_softc_t *sc)
|
||||
|
||||
DPRINTFN(16, "real interrupt\n");
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 15) {
|
||||
ohci_dumpregs(sc);
|
||||
}
|
||||
@ -1564,7 +1583,7 @@ ohci_setup_standard_chain(struct usb_xfer *xfer, ohci_ed_t **ed_last)
|
||||
|
||||
xfer->td_transfer_last = td;
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 8) {
|
||||
DPRINTF("nexttog=%d; data before transfer:\n",
|
||||
xfer->endpoint->toggle_next);
|
||||
@ -1995,7 +2014,7 @@ ohci_device_isoc_enter(struct usb_xfer *xfer)
|
||||
|
||||
xfer->td_transfer_last = td_last;
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (ohcidebug > 8) {
|
||||
DPRINTF("data before transfer:\n");
|
||||
ohci_dump_itds(xfer->td_transfer_first);
|
||||
|
@ -25,8 +25,28 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -49,9 +49,28 @@ __FBSDID("$FreeBSD$");
|
||||
* sharing of code between *BSD's
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -38,9 +38,28 @@ __FBSDID("$FreeBSD$");
|
||||
* ftp://download.intel.com/design/intarch/datashts/29056201.pdf
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR uhcidebug
|
||||
|
||||
@ -1103,7 +1122,7 @@ uhci_non_isoc_done_sub(struct usb_xfer *xfer)
|
||||
td_alt_next = td->alt_next;
|
||||
|
||||
if (xfer->aframes != xfer->nframes) {
|
||||
xfer->frlengths[xfer->aframes] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, xfer->aframes, 0);
|
||||
}
|
||||
while (1) {
|
||||
|
||||
|
@ -48,8 +48,28 @@ __FBSDID("$FreeBSD$");
|
||||
* sharing of code between *BSD's
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
@ -339,7 +359,7 @@ uhci_pci_attach(device_t self)
|
||||
* that the BIOS won't touch the keyboard anymore if it is connected
|
||||
* to the ports of the root hub?
|
||||
*/
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
if (pci_read_config(self, PCI_LEGSUP, 2) != PCI_LEGSUP_USBPIRQDEN) {
|
||||
device_printf(self, "LegSup = 0x%04x\n",
|
||||
pci_read_config(self, PCI_LEGSUP, 2));
|
||||
|
@ -24,9 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_ctrl_debug
|
||||
|
||||
@ -52,7 +71,7 @@ static void usb_post_init(void *);
|
||||
|
||||
/* static variables */
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int usb_ctrl_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, ctrl, CTLFLAG_RW, 0, "USB controller");
|
||||
|
@ -32,10 +32,28 @@
|
||||
* NOTE: The datasheet does not document everything.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_revision.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR uss820dcidebug
|
||||
|
||||
|
@ -27,8 +27,28 @@ __FBSDID("$FreeBSD$");
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
@ -48,29 +48,39 @@ __FBSDID("$FreeBSD$");
|
||||
* HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
|
||||
#define USB_DEBUG_VAR uhid_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_hid.h>
|
||||
|
||||
#include <dev/usb/input/usb_rdesc.h>
|
||||
|
||||
#include <dev/usb/quirk/usb_quirk.h>
|
||||
|
||||
#if USB_DEBUG
|
||||
@ -150,38 +160,40 @@ static struct usb_fifo_methods uhid_fifo_methods = {
|
||||
};
|
||||
|
||||
static void
|
||||
uhid_intr_callback(struct usb_xfer *xfer)
|
||||
uhid_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uhid_softc *sc = xfer->priv_sc;
|
||||
struct uhid_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTF("transferred!\n");
|
||||
|
||||
if (xfer->actlen >= sc->sc_isize) {
|
||||
usb_fifo_put_data(
|
||||
sc->sc_fifo.fp[USB_FIFO_RX],
|
||||
xfer->frbuffers,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (actlen >= sc->sc_isize) {
|
||||
usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc,
|
||||
0, sc->sc_isize, 1);
|
||||
} else {
|
||||
/* ignore it */
|
||||
DPRINTF("ignored short transfer, "
|
||||
"%d bytes\n", xfer->actlen);
|
||||
DPRINTF("ignored short transfer, %d bytes\n", actlen);
|
||||
}
|
||||
|
||||
case USB_ST_SETUP:
|
||||
re_submit:
|
||||
if (usb_fifo_put_bytes_max(
|
||||
sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
|
||||
xfer->frlengths[0] = sc->sc_isize;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sc->sc_isize);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto re_submit;
|
||||
}
|
||||
return;
|
||||
@ -213,10 +225,11 @@ uhid_fill_get_report(struct usb_device_request *req, uint8_t iface_no,
|
||||
}
|
||||
|
||||
static void
|
||||
uhid_write_callback(struct usb_xfer *xfer)
|
||||
uhid_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uhid_softc *sc = xfer->priv_sc;
|
||||
struct uhid_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t size = sc->sc_osize;
|
||||
uint32_t actlen;
|
||||
uint8_t id;
|
||||
@ -226,15 +239,13 @@ uhid_write_callback(struct usb_xfer *xfer)
|
||||
case USB_ST_SETUP:
|
||||
/* try to extract the ID byte */
|
||||
if (sc->sc_oid) {
|
||||
|
||||
if (usb_fifo_get_data(
|
||||
sc->sc_fifo.fp[USB_FIFO_TX],
|
||||
xfer->frbuffers,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc,
|
||||
0, 1, &actlen, 0)) {
|
||||
if (actlen != 1) {
|
||||
goto tr_error;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &id, 1);
|
||||
usbd_copy_out(pc, 0, &id, 1);
|
||||
|
||||
} else {
|
||||
return;
|
||||
@ -246,9 +257,8 @@ uhid_write_callback(struct usb_xfer *xfer)
|
||||
id = 0;
|
||||
}
|
||||
|
||||
if (usb_fifo_get_data(
|
||||
sc->sc_fifo.fp[USB_FIFO_TX],
|
||||
xfer->frbuffers + 1,
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc,
|
||||
0, UHID_BSIZE, &actlen, 1)) {
|
||||
if (actlen != size) {
|
||||
goto tr_error;
|
||||
@ -257,11 +267,12 @@ uhid_write_callback(struct usb_xfer *xfer)
|
||||
(&req, sc->sc_iface_no,
|
||||
UHID_OUTPUT_REPORT, id, size);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = size;
|
||||
xfer->nframes = xfer->frlengths[1] ? 2 : 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, size);
|
||||
usbd_xfer_set_frames(xfer, size ? 2 : 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
@ -275,15 +286,18 @@ uhid_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uhid_read_callback(struct usb_xfer *xfer)
|
||||
uhid_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uhid_softc *sc = xfer->priv_sc;
|
||||
struct uhid_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], xfer->frbuffers,
|
||||
sizeof(req), sc->sc_isize, 1);
|
||||
usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc, sizeof(req),
|
||||
sc->sc_isize, 1);
|
||||
return;
|
||||
|
||||
case USB_ST_SETUP:
|
||||
@ -294,11 +308,11 @@ uhid_read_callback(struct usb_xfer *xfer)
|
||||
(&req, sc->sc_iface_no, UHID_INPUT_REPORT,
|
||||
sc->sc_iid, sc->sc_isize);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = sc->sc_isize;
|
||||
xfer->nframes = xfer->frlengths[1] ? 2 : 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, sc->sc_isize);
|
||||
usbd_xfer_set_frames(xfer, sc->sc_isize ? 2 : 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
@ -343,7 +357,7 @@ static const struct usb_config uhid_config[UHID_N_TRANSFER] = {
|
||||
static void
|
||||
uhid_start_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
if (sc->sc_flags & UHID_FLAG_IMMED) {
|
||||
usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_RD]);
|
||||
@ -355,7 +369,7 @@ uhid_start_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
uhid_stop_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_RD]);
|
||||
usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_RD]);
|
||||
@ -364,7 +378,7 @@ uhid_stop_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
uhid_start_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]);
|
||||
}
|
||||
@ -372,7 +386,7 @@ uhid_start_write(struct usb_fifo *fifo)
|
||||
static void
|
||||
uhid_stop_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]);
|
||||
}
|
||||
@ -449,7 +463,7 @@ uhid_set_report(struct uhid_softc *sc, uint8_t type,
|
||||
static int
|
||||
uhid_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
/*
|
||||
* The buffers are one byte larger than maximum so that one
|
||||
@ -485,7 +499,7 @@ static int
|
||||
uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
|
||||
int fflags)
|
||||
{
|
||||
struct uhid_softc *sc = fifo->priv_sc0;
|
||||
struct uhid_softc *sc = usb_fifo_softc(fifo);
|
||||
struct usb_gen_descriptor *ugd;
|
||||
uint32_t size;
|
||||
int error = 0;
|
||||
@ -656,7 +670,7 @@ uhid_attach(device_t dev)
|
||||
if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) {
|
||||
|
||||
sc->sc_repdesc_size = sizeof(uhid_graphire_report_descr);
|
||||
sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire_report_descr, 0);
|
||||
sc->sc_repdesc_ptr = &uhid_graphire_report_descr;
|
||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||
|
||||
} else if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE3_4X5) {
|
||||
@ -677,7 +691,7 @@ uhid_attach(device_t dev)
|
||||
usbd_errstr(error));
|
||||
}
|
||||
sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr);
|
||||
sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_graphire3_4x5_report_descr, 0);
|
||||
sc->sc_repdesc_ptr = &uhid_graphire3_4x5_report_descr;
|
||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||
}
|
||||
} else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) &&
|
||||
@ -686,7 +700,7 @@ uhid_attach(device_t dev)
|
||||
|
||||
/* the Xbox 360 gamepad has no report descriptor */
|
||||
sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr);
|
||||
sc->sc_repdesc_ptr = USB_ADD_BYTES(uhid_xb360gp_report_descr, 0);
|
||||
sc->sc_repdesc_ptr = &uhid_xb360gp_report_descr;
|
||||
sc->sc_flags |= UHID_FLAG_STATIC_DESC;
|
||||
}
|
||||
if (sc->sc_repdesc_ptr == NULL) {
|
||||
|
@ -48,22 +48,33 @@ __FBSDID("$FreeBSD$");
|
||||
#include "opt_kbd.h"
|
||||
#include "opt_ukbd.h"
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
|
||||
#define USB_DEBUG_VAR ukbd_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_hid.h>
|
||||
|
||||
#include <dev/usb/quirk/usb_quirk.h>
|
||||
|
||||
@ -304,7 +315,7 @@ ukbd_get_key(struct ukbd_softc *sc, uint8_t wait)
|
||||
|
||||
while (sc->sc_inputs == 0) {
|
||||
|
||||
usbd_do_poll(sc->sc_xfer, UKBD_N_TRANSFER);
|
||||
usbd_transfer_poll(sc->sc_xfer, UKBD_N_TRANSFER);
|
||||
|
||||
DELAY(1000); /* delay 1 ms */
|
||||
|
||||
@ -480,15 +491,19 @@ ukbd_apple_swap(uint8_t keycode) {
|
||||
}
|
||||
|
||||
static void
|
||||
ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
ukbd_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ukbd_softc *sc = xfer->priv_sc;
|
||||
uint16_t len = xfer->actlen;
|
||||
struct ukbd_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t i;
|
||||
uint8_t offset;
|
||||
uint8_t id;
|
||||
uint8_t apple_fn;
|
||||
uint8_t apple_eject;
|
||||
int len;
|
||||
|
||||
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -501,7 +516,7 @@ ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
if (sc->sc_kbd_id != 0) {
|
||||
/* check and remove HID ID byte */
|
||||
usbd_copy_out(xfer->frbuffers, 0, &id, 1);
|
||||
usbd_copy_out(pc, 0, &id, 1);
|
||||
if (id != sc->sc_kbd_id) {
|
||||
DPRINTF("wrong HID ID\n");
|
||||
goto tr_setup;
|
||||
@ -518,8 +533,7 @@ ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
if (len) {
|
||||
memset(&sc->sc_ndata, 0, sizeof(sc->sc_ndata));
|
||||
usbd_copy_out(xfer->frbuffers, offset,
|
||||
&sc->sc_ndata, len);
|
||||
usbd_copy_out(pc, offset, &sc->sc_ndata, len);
|
||||
|
||||
if ((sc->sc_flags & UKBD_FLAG_APPLE_EJECT) &&
|
||||
hid_get_data((uint8_t *)&sc->sc_ndata,
|
||||
@ -567,7 +581,7 @@ ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (sc->sc_inputs < UKBD_IN_BUF_FULL) {
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
} else {
|
||||
DPRINTF("input queue is full!\n");
|
||||
@ -575,11 +589,11 @@ ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error=%s\n", usbd_errstr(xfer->error));
|
||||
DPRINTF("error=%s\n", usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -587,11 +601,12 @@ ukbd_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ukbd_set_leds_callback(struct usb_xfer *xfer)
|
||||
ukbd_set_leds_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
struct ukbd_softc *sc = xfer->priv_sc;
|
||||
struct ukbd_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -617,18 +632,20 @@ ukbd_set_leds_callback(struct usb_xfer *xfer)
|
||||
buf[1] = 0;
|
||||
}
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0, buf, sizeof(buf));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_in(pc, 0, buf, sizeof(buf));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = req.wLength[0];
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, req.wLength[0]);
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(0, "error=%s\n", usbd_errstr(xfer->error));
|
||||
DPRINTFN(0, "error=%s\n", usbd_errstr(error));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -42,25 +42,36 @@ __FBSDID("$FreeBSD$");
|
||||
* HID spec: http://www.usb.org/developers/devclass_docs/HID1_11.pdf
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR ums_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_hid.h>
|
||||
|
||||
#include <dev/usb/quirk/usb_quirk.h>
|
||||
|
||||
@ -170,12 +181,12 @@ ums_put_queue_timeout(void *__sc)
|
||||
}
|
||||
|
||||
static void
|
||||
ums_intr_callback(struct usb_xfer *xfer)
|
||||
ums_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ums_softc *sc = xfer->priv_sc;
|
||||
struct ums_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ums_info *info = &sc->sc_info[0];
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t *buf = sc->sc_temp;
|
||||
uint16_t len = xfer->actlen;
|
||||
int32_t buttons = 0;
|
||||
int32_t dw = 0;
|
||||
int32_t dx = 0;
|
||||
@ -184,6 +195,9 @@ ums_intr_callback(struct usb_xfer *xfer)
|
||||
int32_t dt = 0;
|
||||
uint8_t i;
|
||||
uint8_t id;
|
||||
int len;
|
||||
|
||||
usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -197,7 +211,8 @@ ums_intr_callback(struct usb_xfer *xfer)
|
||||
if (len == 0)
|
||||
goto tr_setup;
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, len);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, len);
|
||||
|
||||
DPRINTFN(6, "data = %02x %02x %02x %02x "
|
||||
"%02x %02x %02x %02x\n",
|
||||
@ -301,15 +316,15 @@ ums_intr_callback(struct usb_xfer *xfer)
|
||||
/* check if we can put more data into the FIFO */
|
||||
if (usb_fifo_put_bytes_max(
|
||||
sc->sc_fifo.fp[USB_FIFO_RX]) != 0) {
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -547,10 +562,10 @@ ums_attach(device_t dev)
|
||||
/* Some wheels need the Z axis reversed. */
|
||||
info->sc_flags |= UMS_FLAG_REVZ;
|
||||
}
|
||||
if (isize > sc->sc_xfer[UMS_INTR_DT]->max_frame_size) {
|
||||
if (isize > usbd_xfer_max_framelen(sc->sc_xfer[UMS_INTR_DT])) {
|
||||
DPRINTF("WARNING: report size, %d bytes, is larger "
|
||||
"than interrupt size, %d bytes!\n",
|
||||
isize, sc->sc_xfer[UMS_INTR_DT]->max_frame_size);
|
||||
"than interrupt size, %d bytes!\n", isize,
|
||||
usbd_xfer_max_framelen(sc->sc_xfer[UMS_INTR_DT]));
|
||||
}
|
||||
free(d_ptr, M_TEMP);
|
||||
d_ptr = NULL;
|
||||
@ -637,7 +652,7 @@ ums_detach(device_t self)
|
||||
static void
|
||||
ums_start_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ums_softc *sc = fifo->priv_sc0;
|
||||
struct ums_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[UMS_INTR_DT]);
|
||||
}
|
||||
@ -645,7 +660,7 @@ ums_start_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
ums_stop_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ums_softc *sc = fifo->priv_sc0;
|
||||
struct ums_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[UMS_INTR_DT]);
|
||||
usb_callout_stop(&sc->sc_callout);
|
||||
@ -712,7 +727,7 @@ ums_reset_buf(struct ums_softc *sc)
|
||||
static int
|
||||
ums_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct ums_softc *sc = fifo->priv_sc0;
|
||||
struct ums_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
DPRINTFN(2, "\n");
|
||||
|
||||
@ -747,7 +762,7 @@ ums_close(struct usb_fifo *fifo, int fflags)
|
||||
static int
|
||||
ums_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags)
|
||||
{
|
||||
struct ums_softc *sc = fifo->priv_sc0;
|
||||
struct ums_softc *sc = usb_fifo_softc(fifo);
|
||||
mousemode_t mode;
|
||||
int error = 0;
|
||||
|
||||
|
@ -57,19 +57,33 @@ __FBSDID("$FreeBSD$");
|
||||
*
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR udbp_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <sys/mbuf.h>
|
||||
|
||||
@ -395,10 +409,14 @@ udbp_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
udbp_bulk_read_callback(struct usb_xfer *xfer)
|
||||
udbp_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udbp_softc *sc = xfer->priv_sc;
|
||||
struct udbp_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -416,14 +434,14 @@ udbp_bulk_read_callback(struct usb_xfer *xfer)
|
||||
m_freem(m);
|
||||
goto tr_setup;
|
||||
}
|
||||
m->m_pkthdr.len = m->m_len = xfer->actlen;
|
||||
m->m_pkthdr.len = m->m_len = actlen;
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, m->m_data, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, m->m_data, actlen);
|
||||
|
||||
sc->sc_bulk_in_buffer = m;
|
||||
|
||||
DPRINTF("received package %d "
|
||||
"bytes\n", xfer->actlen);
|
||||
DPRINTF("received package %d bytes\n", actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
@ -435,12 +453,12 @@ udbp_bulk_read_callback(struct usb_xfer *xfer)
|
||||
usbd_transfer_start(sc->sc_xfer[UDBP_T_RD_CS]);
|
||||
return;
|
||||
}
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
sc->sc_flags |= UDBP_FLAG_READ_STALL;
|
||||
usbd_transfer_start(sc->sc_xfer[UDBP_T_RD_CS]);
|
||||
@ -451,9 +469,9 @@ udbp_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
udbp_bulk_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
udbp_bulk_read_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udbp_softc *sc = xfer->priv_sc;
|
||||
struct udbp_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = sc->sc_xfer[UDBP_T_RD];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
@ -504,9 +522,10 @@ udbp_bulk_read_complete(node_p node, hook_p hook, void *arg1, int arg2)
|
||||
}
|
||||
|
||||
static void
|
||||
udbp_bulk_write_callback(struct usb_xfer *xfer)
|
||||
udbp_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udbp_softc *sc = xfer->priv_sc;
|
||||
struct udbp_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -535,20 +554,20 @@ udbp_bulk_write_callback(struct usb_xfer *xfer)
|
||||
MCLBYTES);
|
||||
m->m_pkthdr.len = MCLBYTES;
|
||||
}
|
||||
usbd_m_copy_in(xfer->frbuffers, 0, m, 0, m->m_pkthdr.len);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
|
||||
|
||||
xfer->frlengths[0] = m->m_pkthdr.len;
|
||||
usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len);
|
||||
|
||||
DPRINTF("packet out: %d bytes\n", m->m_pkthdr.len);
|
||||
|
||||
m_freem(m);
|
||||
|
||||
DPRINTF("packet out: %d bytes\n",
|
||||
xfer->frlengths[0]);
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
sc->sc_flags |= UDBP_FLAG_WRITE_STALL;
|
||||
usbd_transfer_start(sc->sc_xfer[UDBP_T_WR_CS]);
|
||||
@ -559,9 +578,9 @@ udbp_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
udbp_bulk_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
udbp_bulk_write_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udbp_softc *sc = xfer->priv_sc;
|
||||
struct udbp_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = sc->sc_xfer[UDBP_T_WR];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
|
@ -32,23 +32,36 @@
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/ufm_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
|
||||
#include <dev/usb/ufm_ioctl.h>
|
||||
|
||||
#define UFM_CMD0 0x00
|
||||
#define UFM_CMD_SET_FREQ 0x01
|
||||
@ -299,7 +312,7 @@ static int
|
||||
ufm_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr,
|
||||
int fflags)
|
||||
{
|
||||
struct ufm_softc *sc = fifo->priv_sc0;
|
||||
struct ufm_softc *sc = usb_fifo_softc(fifo);
|
||||
int error = 0;
|
||||
|
||||
switch (cmd) {
|
||||
|
@ -68,20 +68,34 @@ __FBSDID("$FreeBSD$");
|
||||
* transfers are done using usbd_transfer() and friends.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR aue_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_auereg.h>
|
||||
@ -711,19 +725,24 @@ aue_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
aue_intr_callback(struct usb_xfer *xfer)
|
||||
aue_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct aue_softc *sc = xfer->priv_sc;
|
||||
struct aue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct aue_intrpkt pkt;
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) &&
|
||||
xfer->actlen >= sizeof(pkt)) {
|
||||
actlen >= sizeof(pkt)) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, &pkt, sizeof(pkt));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &pkt, sizeof(pkt));
|
||||
|
||||
if (pkt.aue_txstat0)
|
||||
ifp->if_oerrors++;
|
||||
@ -734,14 +753,14 @@ aue_intr_callback(struct usb_xfer *xfer)
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -749,31 +768,36 @@ aue_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
aue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
aue_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct aue_softc *sc = xfer->priv_sc;
|
||||
struct aue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct aue_rxpkt stat;
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTFN(11, "received %d bytes\n", xfer->actlen);
|
||||
DPRINTFN(11, "received %d bytes\n", actlen);
|
||||
|
||||
if (sc->sc_flags & AUE_FLAG_VER_2) {
|
||||
|
||||
if (xfer->actlen == 0) {
|
||||
if (actlen == 0) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
} else {
|
||||
|
||||
if (xfer->actlen <= (sizeof(stat) + ETHER_CRC_LEN)) {
|
||||
if (actlen <= sizeof(stat) + ETHER_CRC_LEN) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers,
|
||||
xfer->actlen - sizeof(stat), &stat, sizeof(stat));
|
||||
usbd_copy_out(pc, actlen - sizeof(stat), &stat,
|
||||
sizeof(stat));
|
||||
|
||||
/*
|
||||
* turn off all the non-error bits in the rx status
|
||||
@ -785,25 +809,25 @@ aue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
goto tr_setup;
|
||||
}
|
||||
/* No errors; receive the packet. */
|
||||
xfer->actlen -= (sizeof(stat) + ETHER_CRC_LEN);
|
||||
actlen -= (sizeof(stat) + ETHER_CRC_LEN);
|
||||
}
|
||||
uether_rxbuf(ue, xfer->frbuffers, 0, xfer->actlen);
|
||||
uether_rxbuf(ue, pc, 0, actlen);
|
||||
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -811,16 +835,21 @@ aue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
aue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
aue_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct aue_softc *sc = xfer->priv_sc;
|
||||
struct aue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
uint8_t buf[2];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTFN(11, "transfer of %d bytes complete\n", xfer->actlen);
|
||||
DPRINTFN(11, "transfer of %d bytes complete\n", actlen);
|
||||
ifp->if_opackets++;
|
||||
|
||||
/* FALLTHROUGH */
|
||||
@ -840,14 +869,13 @@ aue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
m->m_pkthdr.len = MCLBYTES;
|
||||
if (sc->sc_flags & AUE_FLAG_VER_2) {
|
||||
|
||||
xfer->frlengths[0] = m->m_pkthdr.len;
|
||||
usbd_xfer_set_frame_len(xfer, 0, m->m_pkthdr.len);
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 0,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
|
||||
|
||||
} else {
|
||||
|
||||
xfer->frlengths[0] = (m->m_pkthdr.len + 2);
|
||||
usbd_xfer_set_frame_len(xfer, 0, (m->m_pkthdr.len + 2));
|
||||
|
||||
/*
|
||||
* The ADMtek documentation says that the
|
||||
@ -860,10 +888,8 @@ aue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
buf[0] = (uint8_t)(m->m_pkthdr.len);
|
||||
buf[1] = (uint8_t)(m->m_pkthdr.len >> 8);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 2);
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 2,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
usbd_copy_in(pc, 0, buf, 2);
|
||||
usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -879,13 +905,13 @@ aue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -951,7 +977,7 @@ aue_init(struct usb_ether *ue)
|
||||
AUE_SETBIT(sc, AUE_CTL0, AUE_CTL0_TX_ENB);
|
||||
AUE_SETBIT(sc, AUE_CTL2, AUE_CTL2_EP3_CLR);
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[AUE_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[AUE_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
aue_start(ue);
|
||||
|
@ -76,20 +76,34 @@ __FBSDID("$FreeBSD$");
|
||||
* http://www.asix.com.tw/FrootAttach/datasheet/AX88772_datasheet_Rev10.pdf
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR axe_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_axereg.h>
|
||||
@ -731,20 +745,20 @@ axe_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
axe_intr_callback(struct usb_xfer *xfer)
|
||||
axe_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -756,56 +770,61 @@ axe_intr_callback(struct usb_xfer *xfer)
|
||||
#endif
|
||||
|
||||
static void
|
||||
axe_bulk_read_callback(struct usb_xfer *xfer)
|
||||
axe_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct axe_softc *sc = xfer->priv_sc;
|
||||
struct axe_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct axe_sframe_hdr hdr;
|
||||
int error, pos, len, adjust;
|
||||
struct usb_page_cache *pc;
|
||||
int err, pos, len, adjust;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
pos = 0;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
while (1) {
|
||||
if (sc->sc_flags & (AXE_FLAG_772 | AXE_FLAG_178)) {
|
||||
if (xfer->actlen < sizeof(hdr)) {
|
||||
if (actlen < sizeof(hdr)) {
|
||||
/* too little data */
|
||||
break;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, pos, &hdr, sizeof(hdr));
|
||||
usbd_copy_out(pc, pos, &hdr, sizeof(hdr));
|
||||
|
||||
if ((hdr.len ^ hdr.ilen) != 0xFFFF) {
|
||||
/* we lost sync */
|
||||
break;
|
||||
}
|
||||
xfer->actlen -= sizeof(hdr);
|
||||
actlen -= sizeof(hdr);
|
||||
pos += sizeof(hdr);
|
||||
|
||||
len = le16toh(hdr.len);
|
||||
if (len > xfer->actlen) {
|
||||
if (len > actlen) {
|
||||
/* invalid length */
|
||||
break;
|
||||
}
|
||||
adjust = (len & 1);
|
||||
|
||||
} else {
|
||||
len = xfer->actlen;
|
||||
len = actlen;
|
||||
adjust = 0;
|
||||
}
|
||||
error = uether_rxbuf(ue, xfer->frbuffers, pos, len);
|
||||
if (error)
|
||||
err = uether_rxbuf(ue, pc, pos, len);
|
||||
if (err)
|
||||
break;
|
||||
|
||||
pos += len;
|
||||
xfer->actlen -= len;
|
||||
actlen -= len;
|
||||
|
||||
if (xfer->actlen <= adjust) {
|
||||
if (actlen <= adjust) {
|
||||
/* we are finished */
|
||||
goto tr_setup;
|
||||
}
|
||||
pos += adjust;
|
||||
xfer->actlen -= adjust;
|
||||
actlen -= adjust;
|
||||
}
|
||||
|
||||
/* count an error */
|
||||
@ -814,18 +833,17 @@ axe_bulk_read_callback(struct usb_xfer *xfer)
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
DPRINTF("bulk read error, %s\n", usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -838,11 +856,12 @@ axe_bulk_read_callback(struct usb_xfer *xfer)
|
||||
#endif
|
||||
|
||||
static void
|
||||
axe_bulk_write_callback(struct usb_xfer *xfer)
|
||||
axe_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct axe_softc *sc = xfer->priv_sc;
|
||||
struct axe_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct axe_sframe_hdr hdr;
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
int pos;
|
||||
|
||||
@ -860,6 +879,7 @@ axe_bulk_write_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
}
|
||||
pos = 0;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
while (1) {
|
||||
|
||||
@ -878,7 +898,7 @@ axe_bulk_write_callback(struct usb_xfer *xfer)
|
||||
hdr.len = htole16(m->m_pkthdr.len);
|
||||
hdr.ilen = ~hdr.len;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, pos, &hdr, sizeof(hdr));
|
||||
usbd_copy_in(pc, pos, &hdr, sizeof(hdr));
|
||||
|
||||
pos += sizeof(hdr);
|
||||
|
||||
@ -890,9 +910,7 @@ axe_bulk_write_callback(struct usb_xfer *xfer)
|
||||
* USB_FORCE_SHORT_XFER flag instead.
|
||||
*/
|
||||
}
|
||||
usbd_m_copy_in(xfer->frbuffers, pos,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
|
||||
usbd_m_copy_in(pc, pos, m, 0, m->m_pkthdr.len);
|
||||
pos += m->m_pkthdr.len;
|
||||
|
||||
/*
|
||||
@ -914,19 +932,19 @@ axe_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = pos;
|
||||
usbd_xfer_set_frame_len(xfer, 0, pos);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -1010,7 +1028,7 @@ axe_init(struct usb_ether *ue)
|
||||
/* Load the multicast filter. */
|
||||
axe_setmulti(ue);
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[AXE_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[AXE_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
axe_start(ue);
|
||||
|
@ -43,23 +43,36 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR cdce_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include "usb_if.h"
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_cdcereg.h>
|
||||
@ -426,22 +439,24 @@ cdce_free_queue(struct mbuf **ppm, uint8_t n)
|
||||
}
|
||||
|
||||
static void
|
||||
cdce_bulk_write_callback(struct usb_xfer *xfer)
|
||||
cdce_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct cdce_softc *sc = xfer->priv_sc;
|
||||
struct cdce_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct mbuf *m;
|
||||
struct mbuf *mt;
|
||||
uint32_t crc;
|
||||
uint8_t x;
|
||||
int actlen, aframes;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, &aframes, NULL);
|
||||
|
||||
DPRINTFN(1, "\n");
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTFN(11, "transfer complete: "
|
||||
"%u bytes in %u frames\n", xfer->actlen,
|
||||
xfer->aframes);
|
||||
DPRINTFN(11, "transfer complete: %u bytes in %u frames\n",
|
||||
actlen, aframes);
|
||||
|
||||
ifp->if_opackets++;
|
||||
|
||||
@ -486,8 +501,7 @@ cdce_bulk_write_callback(struct usb_xfer *xfer)
|
||||
m->m_pkthdr.len = MCLBYTES;
|
||||
}
|
||||
sc->sc_tx_buf[x] = m;
|
||||
xfer->frlengths[x] = m->m_len;
|
||||
usbd_set_frame_data(xfer, m->m_data, x);
|
||||
usbd_xfer_set_frame_data(xfer, x, m->m_data, m->m_len);
|
||||
|
||||
/*
|
||||
* If there's a BPF listener, bounce a copy of
|
||||
@ -496,14 +510,15 @@ cdce_bulk_write_callback(struct usb_xfer *xfer)
|
||||
BPF_MTAP(ifp, m);
|
||||
}
|
||||
if (x != 0) {
|
||||
xfer->nframes = x;
|
||||
usbd_xfer_set_frames(xfer, x);
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
/* free all previous TX buffers */
|
||||
cdce_free_queue(sc->sc_tx_buf, CDCE_FRAMES_MAX);
|
||||
@ -511,9 +526,9 @@ cdce_bulk_write_callback(struct usb_xfer *xfer)
|
||||
/* count output errors */
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -554,7 +569,7 @@ cdce_init(struct usb_ether *ue)
|
||||
usbd_transfer_start(sc->sc_xfer[CDCE_INTR_TX]);
|
||||
|
||||
/* stall data write direction, which depends on USB mode */
|
||||
usbd_transfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[CDCE_BULK_TX]);
|
||||
|
||||
/* start data transfers */
|
||||
cdce_start(ue);
|
||||
@ -608,34 +623,36 @@ cdce_resume(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
cdce_bulk_read_callback(struct usb_xfer *xfer)
|
||||
cdce_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct cdce_softc *sc = xfer->priv_sc;
|
||||
struct cdce_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct mbuf *m;
|
||||
uint8_t x;
|
||||
int actlen, aframes, len;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, &aframes, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("received %u bytes in %u frames\n",
|
||||
xfer->actlen, xfer->aframes);
|
||||
DPRINTF("received %u bytes in %u frames\n", actlen, aframes);
|
||||
|
||||
for (x = 0; x != xfer->aframes; x++) {
|
||||
for (x = 0; x != aframes; x++) {
|
||||
|
||||
m = sc->sc_rx_buf[x];
|
||||
sc->sc_rx_buf[x] = NULL;
|
||||
len = usbd_xfer_get_frame_len(xfer, x);
|
||||
|
||||
/* Strip off CRC added by Zaurus, if any */
|
||||
if ((sc->sc_flags & CDCE_FLAG_ZAURUS) &&
|
||||
(xfer->frlengths[x] >= 14))
|
||||
xfer->frlengths[x] -= 4;
|
||||
if ((sc->sc_flags & CDCE_FLAG_ZAURUS) && len >= 14)
|
||||
len -= 4;
|
||||
|
||||
if (xfer->frlengths[x] < sizeof(struct ether_header)) {
|
||||
if (len < sizeof(struct ether_header)) {
|
||||
m_freem(m);
|
||||
continue;
|
||||
}
|
||||
/* queue up mbuf */
|
||||
uether_rxmbuf(&sc->sc_ue, m, xfer->frlengths[x]);
|
||||
uether_rxmbuf(&sc->sc_ue, m, len);
|
||||
}
|
||||
|
||||
/* FALLTHROUGH */
|
||||
@ -654,11 +671,10 @@ cdce_bulk_read_callback(struct usb_xfer *xfer)
|
||||
m = sc->sc_rx_buf[x];
|
||||
}
|
||||
|
||||
usbd_set_frame_data(xfer, m->m_data, x);
|
||||
xfer->frlengths[x] = m->m_len;
|
||||
usbd_xfer_set_frame_data(xfer, x, m->m_data, m->m_len);
|
||||
}
|
||||
/* set number of frames and start hardware */
|
||||
xfer->nframes = x;
|
||||
usbd_xfer_set_frames(xfer, x);
|
||||
usbd_transfer_submit(xfer);
|
||||
/* flush any received frames */
|
||||
uether_rxflush(&sc->sc_ue);
|
||||
@ -666,13 +682,13 @@ cdce_bulk_read_callback(struct usb_xfer *xfer)
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error = %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
tr_stall:
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
xfer->nframes = 0;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
usbd_xfer_set_frames(xfer, 0);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
}
|
||||
@ -684,28 +700,30 @@ cdce_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
cdce_intr_read_callback(struct usb_xfer *xfer)
|
||||
cdce_intr_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
; /* style fix */
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("Received %d bytes\n",
|
||||
xfer->actlen);
|
||||
DPRINTF("Received %d bytes\n", actlen);
|
||||
|
||||
/* TODO: decode some indications */
|
||||
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* start clear stall */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -713,27 +731,30 @@ cdce_intr_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
cdce_intr_write_callback(struct usb_xfer *xfer)
|
||||
cdce_intr_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
; /* style fix */
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("Transferred %d bytes\n", xfer->actlen);
|
||||
DPRINTF("Transferred %d bytes\n", actlen);
|
||||
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
#if 0
|
||||
xfer->frlengths[0] = XXX;
|
||||
usbd_xfer_set_frame_len(xfer, 0, XXX);
|
||||
usbd_transfer_submit(xfer);
|
||||
#endif
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* start clear stall */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
|
@ -51,20 +51,34 @@ __FBSDID("$FreeBSD$");
|
||||
* transaction, which helps performance a great deal.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR cue_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_cuereg.h>
|
||||
@ -426,42 +440,47 @@ cue_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
cue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
cue_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct cue_softc *sc = xfer->priv_sc;
|
||||
struct cue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
int len;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen <= (2 + sizeof(struct ether_header))) {
|
||||
if (actlen <= (2 + sizeof(struct ether_header))) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 2);
|
||||
xfer->actlen -= 2;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, 2);
|
||||
actlen -= 2;
|
||||
len = buf[0] | (buf[1] << 8);
|
||||
len = min(xfer->actlen, len);
|
||||
len = min(actlen, len);
|
||||
|
||||
uether_rxbuf(ue, xfer->frbuffers, 2, len);
|
||||
uether_rxbuf(ue, pc, 2, len);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -470,10 +489,11 @@ cue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
cue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
cue_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct cue_softc *sc = xfer->priv_sc;
|
||||
struct cue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
uint8_t buf[2];
|
||||
|
||||
@ -491,17 +511,16 @@ cue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
if (m->m_pkthdr.len > MCLBYTES)
|
||||
m->m_pkthdr.len = MCLBYTES;
|
||||
xfer->frlengths[0] = (m->m_pkthdr.len + 2);
|
||||
usbd_xfer_set_frame_len(xfer, 0, (m->m_pkthdr.len + 2));
|
||||
|
||||
/* the first two bytes are the frame length */
|
||||
|
||||
buf[0] = (uint8_t)(m->m_pkthdr.len);
|
||||
buf[1] = (uint8_t)(m->m_pkthdr.len >> 8);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 2);
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 2,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, buf, 2);
|
||||
usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len);
|
||||
|
||||
/*
|
||||
* If there's a BPF listener, bounce a copy of this frame
|
||||
@ -517,13 +536,13 @@ cue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -598,7 +617,7 @@ cue_init(struct usb_ether *ue)
|
||||
/* Program the LED operation. */
|
||||
cue_csr_write_1(sc, CUE_LEDCTL, CUE_LEDCTL_FOLLOW_LINK);
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[CUE_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[CUE_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
cue_start(ue);
|
||||
|
@ -65,20 +65,34 @@ __FBSDID("$FreeBSD$");
|
||||
* the development of this driver.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR kue_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_kuereg.h>
|
||||
@ -514,42 +528,47 @@ kue_detach(device_t dev)
|
||||
* the higher level protocols.
|
||||
*/
|
||||
static void
|
||||
kue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
kue_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct kue_softc *sc = xfer->priv_sc;
|
||||
struct kue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
int len;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen <= (2 + sizeof(struct ether_header))) {
|
||||
if (actlen <= (2 + sizeof(struct ether_header))) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 2);
|
||||
xfer->actlen -= 2;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, 2);
|
||||
actlen -= 2;
|
||||
len = buf[0] | (buf[1] << 8);
|
||||
len = min(xfer->actlen, len);
|
||||
len = min(actlen, len);
|
||||
|
||||
uether_rxbuf(ue, xfer->frbuffers, 2, len);
|
||||
uether_rxbuf(ue, pc, 2, len);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -558,10 +577,11 @@ kue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
kue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
kue_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct kue_softc *sc = xfer->priv_sc;
|
||||
struct kue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
int total_len;
|
||||
int temp_len;
|
||||
@ -589,15 +609,12 @@ kue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
buf[0] = (uint8_t)(m->m_pkthdr.len);
|
||||
buf[1] = (uint8_t)(m->m_pkthdr.len >> 8);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 2);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, buf, 2);
|
||||
usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len);
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 2,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
|
||||
usbd_frame_zero(xfer->frbuffers, temp_len,
|
||||
total_len - temp_len);
|
||||
|
||||
xfer->frlengths[0] = total_len;
|
||||
usbd_frame_zero(pc, temp_len, total_len - temp_len);
|
||||
usbd_xfer_set_frame_len(xfer, 0, total_len);
|
||||
|
||||
/*
|
||||
* if there's a BPF listener, bounce a copy
|
||||
@ -613,13 +630,13 @@ kue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -664,7 +681,7 @@ kue_init(struct usb_ether *ue)
|
||||
/* load the multicast filter */
|
||||
kue_setpromisc(ue);
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[KUE_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[KUE_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
kue_start(ue);
|
||||
|
@ -65,20 +65,34 @@ __FBSDID("$FreeBSD$");
|
||||
* ftp://ftp.realtek.com.tw/lancard/data_sheet/8150/.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR rue_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_ruereg.h>
|
||||
@ -613,19 +627,24 @@ rue_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
rue_intr_callback(struct usb_xfer *xfer)
|
||||
rue_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct rue_softc *sc = xfer->priv_sc;
|
||||
struct rue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct rue_intrpkt pkt;
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (ifp && (ifp->if_drv_flags & IFF_DRV_RUNNING) &&
|
||||
(xfer->actlen >= sizeof(pkt))) {
|
||||
actlen >= sizeof(pkt)) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, &pkt, sizeof(pkt));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &pkt, sizeof(pkt));
|
||||
|
||||
ifp->if_ierrors += pkt.rue_rxlost_cnt;
|
||||
ifp->if_ierrors += pkt.rue_crcerr_cnt;
|
||||
@ -634,14 +653,14 @@ rue_intr_callback(struct usb_xfer *xfer)
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -649,23 +668,27 @@ rue_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
rue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
rue_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct rue_softc *sc = xfer->priv_sc;
|
||||
struct rue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct usb_page_cache *pc;
|
||||
uint16_t status;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < 4) {
|
||||
if (actlen < 4) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, xfer->actlen - 4,
|
||||
&status, sizeof(status));
|
||||
xfer->actlen -= 4;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, actlen - 4, &status, sizeof(status));
|
||||
actlen -= 4;
|
||||
|
||||
/* check recieve packet was valid or not */
|
||||
status = le16toh(status);
|
||||
@ -673,22 +696,22 @@ rue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
uether_rxbuf(ue, xfer->frbuffers, 0, xfer->actlen);
|
||||
uether_rxbuf(ue, pc, 0, actlen);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -696,10 +719,11 @@ rue_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
rue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
rue_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct rue_softc *sc = xfer->priv_sc;
|
||||
struct rue_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
int temp_len;
|
||||
|
||||
@ -725,8 +749,8 @@ rue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
m->m_pkthdr.len = MCLBYTES;
|
||||
temp_len = m->m_pkthdr.len;
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 0,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_m_copy_in(pc, 0, m, 0, m->m_pkthdr.len);
|
||||
|
||||
/*
|
||||
* This is an undocumented behavior.
|
||||
@ -734,11 +758,11 @@ rue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
* RUE_MIN_FRAMELEN (60) byte packet.
|
||||
*/
|
||||
if (temp_len < RUE_MIN_FRAMELEN) {
|
||||
usbd_frame_zero(xfer->frbuffers, temp_len,
|
||||
usbd_frame_zero(pc, temp_len,
|
||||
RUE_MIN_FRAMELEN - temp_len);
|
||||
temp_len = RUE_MIN_FRAMELEN;
|
||||
}
|
||||
xfer->frlengths[0] = temp_len;
|
||||
usbd_xfer_set_frame_len(xfer, 0, temp_len);
|
||||
|
||||
/*
|
||||
* if there's a BPF listener, bounce a copy
|
||||
@ -754,13 +778,13 @@ rue_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -829,7 +853,7 @@ rue_init(struct usb_ether *ue)
|
||||
/* Enable RX and TX */
|
||||
rue_csr_write_1(sc, RUE_CR, (RUE_CR_TE | RUE_CR_RE | RUE_CR_EP3CLREN));
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[RUE_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[RUE_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
rue_start(ue);
|
||||
|
@ -46,20 +46,34 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR udav_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
#include <dev/usb/net/if_udavreg.h>
|
||||
@ -420,7 +434,7 @@ udav_init(struct usb_ether *ue)
|
||||
UDAV_SETBIT(sc, UDAV_GPCR, UDAV_GPCR_GEP_CNTL0);
|
||||
UDAV_CLRBIT(sc, UDAV_GPR, UDAV_GPR_GEPIO0);
|
||||
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UDAV_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UDAV_BULK_DT_WR]);
|
||||
|
||||
ifp->if_drv_flags |= IFF_DRV_RUNNING;
|
||||
udav_start(ue);
|
||||
@ -531,10 +545,11 @@ udav_start(struct usb_ether *ue)
|
||||
}
|
||||
|
||||
static void
|
||||
udav_bulk_write_callback(struct usb_xfer *xfer)
|
||||
udav_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udav_softc *sc = xfer->priv_sc;
|
||||
struct udav_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct ifnet *ifp = uether_getifp(&sc->sc_ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct mbuf *m;
|
||||
int extra_len;
|
||||
int temp_len;
|
||||
@ -577,15 +592,12 @@ udav_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
temp_len += 2;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 2);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, buf, 2);
|
||||
usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len);
|
||||
|
||||
usbd_m_copy_in(xfer->frbuffers, 2,
|
||||
m, 0, m->m_pkthdr.len);
|
||||
|
||||
if (extra_len) {
|
||||
usbd_frame_zero(xfer->frbuffers, temp_len - extra_len,
|
||||
extra_len);
|
||||
}
|
||||
if (extra_len)
|
||||
usbd_frame_zero(pc, temp_len - extra_len, extra_len);
|
||||
/*
|
||||
* if there's a BPF listener, bounce a copy
|
||||
* of this frame to him:
|
||||
@ -594,19 +606,19 @@ udav_bulk_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
m_freem(m);
|
||||
|
||||
xfer->frlengths[0] = temp_len;
|
||||
usbd_xfer_set_frame_len(xfer, 0, temp_len);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTFN(11, "transfer error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
ifp->if_oerrors++;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -614,24 +626,29 @@ udav_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
udav_bulk_read_callback(struct usb_xfer *xfer)
|
||||
udav_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct udav_softc *sc = xfer->priv_sc;
|
||||
struct udav_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_ether *ue = &sc->sc_ue;
|
||||
struct ifnet *ifp = uether_getifp(ue);
|
||||
struct usb_page_cache *pc;
|
||||
struct udav_rxpkt stat;
|
||||
int len;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < sizeof(stat) + ETHER_CRC_LEN) {
|
||||
if (actlen < sizeof(stat) + ETHER_CRC_LEN) {
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &stat, sizeof(stat));
|
||||
xfer->actlen -= sizeof(stat);
|
||||
len = min(xfer->actlen, le16toh(stat.pktlen));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &stat, sizeof(stat));
|
||||
actlen -= sizeof(stat);
|
||||
len = min(actlen, le16toh(stat.pktlen));
|
||||
len -= ETHER_CRC_LEN;
|
||||
|
||||
if (stat.rxstat & UDAV_RSR_LCS) {
|
||||
@ -642,22 +659,22 @@ udav_bulk_read_callback(struct usb_xfer *xfer)
|
||||
ifp->if_ierrors++;
|
||||
goto tr_setup;
|
||||
}
|
||||
uether_rxbuf(ue, xfer->frbuffers, sizeof(stat), len);
|
||||
uether_rxbuf(ue, pc, sizeof(stat), len);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
uether_rxflush(ue);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("bulk read error, %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -665,20 +682,20 @@ udav_bulk_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
udav_intr_callback(struct usb_xfer *xfer)
|
||||
udav_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -24,17 +24,30 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_endian.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
|
||||
#include <dev/usb/net/usb_ethernet.h>
|
||||
|
||||
SYSCTL_NODE(_net, OID_AUTO, ue, CTLFLAG_RD, 0, "USB Ethernet parameters");
|
||||
|
@ -26,15 +26,32 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
|
||||
|
@ -56,4 +56,6 @@ enum { /* keep in sync with usb_quirk_str table */
|
||||
USB_QUIRK_MAX
|
||||
};
|
||||
|
||||
uint8_t usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk);
|
||||
|
||||
#endif /* _USB_QUIRK_H_ */
|
||||
|
@ -30,22 +30,37 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR u3g_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_msctest.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_msctest.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
@ -501,8 +516,8 @@ u3g_attach(device_t dev)
|
||||
|
||||
/* set stall by default */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[nports][U3G_BULK_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[nports][U3G_BULK_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[nports][U3G_BULK_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[nports][U3G_BULK_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
nports++; /* found one port */
|
||||
@ -588,26 +603,27 @@ u3g_stop_write(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
u3g_write_callback(struct usb_xfer *xfer)
|
||||
u3g_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ucom_softc *ucom = xfer->priv_sc;
|
||||
struct ucom_softc *ucom = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (ucom_get_data(ucom, xfer->frbuffers, 0,
|
||||
U3G_BSIZE, &actlen)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(ucom, pc, 0, U3G_BSIZE, &actlen)) {
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* do a builtin clear-stall */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -616,24 +632,29 @@ u3g_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
u3g_read_callback(struct usb_xfer *xfer)
|
||||
u3g_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ucom_softc *ucom = xfer->priv_sc;
|
||||
struct ucom_softc *ucom = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* do a builtin clear-stall */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
|
@ -23,20 +23,36 @@
|
||||
* be called from within the config thread function !
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -198,8 +214,8 @@ uark_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UARK_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UARK_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UARK_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -228,26 +244,28 @@ uark_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
uark_bulk_write_callback(struct usb_xfer *xfer)
|
||||
uark_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uark_softc *sc = xfer->priv_sc;
|
||||
struct uark_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UARK_BUF_SIZE, &actlen)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -256,25 +274,29 @@ uark_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uark_bulk_read_callback(struct usb_xfer *xfer)
|
||||
uark_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uark_softc *sc = xfer->priv_sc;
|
||||
struct uark_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -62,21 +62,34 @@ __FBSDID("$FreeBSD$");
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR ubsa_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -305,8 +318,8 @@ ubsa_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UBSA_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -537,27 +550,29 @@ ubsa_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
|
||||
}
|
||||
|
||||
static void
|
||||
ubsa_write_callback(struct usb_xfer *xfer)
|
||||
ubsa_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ubsa_softc *sc = xfer->priv_sc;
|
||||
struct ubsa_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UBSA_BSIZE, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -566,24 +581,29 @@ ubsa_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ubsa_read_callback(struct usb_xfer *xfer)
|
||||
ubsa_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ubsa_softc *sc = xfer->priv_sc;
|
||||
struct ubsa_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -592,17 +612,21 @@ ubsa_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ubsa_intr_callback(struct usb_xfer *xfer)
|
||||
ubsa_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ubsa_softc *sc = xfer->priv_sc;
|
||||
struct ubsa_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[4];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen >= sizeof(buf)) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
|
||||
if (actlen >= sizeof(buf)) {
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, sizeof(buf));
|
||||
|
||||
/*
|
||||
* incidentally, Belkin adapter status bits match
|
||||
@ -616,20 +640,19 @@ ubsa_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
ucom_status_change(&sc->sc_ucom);
|
||||
} else {
|
||||
DPRINTF("ignoring short packet, %d bytes\n",
|
||||
xfer->actlen);
|
||||
DPRINTF("ignoring short packet, %d bytes\n", actlen);
|
||||
}
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -76,20 +76,34 @@ __FBSDID("$FreeBSD$");
|
||||
* BWCT serial adapter driver
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR ubser_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
@ -263,7 +277,7 @@ ubser_attach(device_t dev)
|
||||
if (error) {
|
||||
goto detach;
|
||||
}
|
||||
sc->sc_tx_size = sc->sc_xfer[UBSER_BULK_DT_WR]->max_data_length;
|
||||
sc->sc_tx_size = usbd_xfer_max_len(sc->sc_xfer[UBSER_BULK_DT_WR]);
|
||||
|
||||
if (sc->sc_tx_size == 0) {
|
||||
DPRINTFN(0, "invalid tx_size!\n");
|
||||
@ -282,8 +296,8 @@ ubser_attach(device_t dev)
|
||||
}
|
||||
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UBSER_BULK_DT_RD]);
|
||||
usbd_transfer_start(sc->sc_xfer[UBSER_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
@ -367,9 +381,10 @@ ubser_inc_tx_unit(struct ubser_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
ubser_write_callback(struct usb_xfer *xfer)
|
||||
ubser_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ubser_softc *sc = xfer->priv_sc;
|
||||
struct ubser_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[1];
|
||||
uint8_t first_unit = sc->sc_curr_tx_unit;
|
||||
uint32_t actlen;
|
||||
@ -378,16 +393,17 @@ ubser_write_callback(struct usb_xfer *xfer)
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
do {
|
||||
if (ucom_get_data(sc->sc_ucom + sc->sc_curr_tx_unit,
|
||||
xfer->frbuffers, 1, sc->sc_tx_size - 1,
|
||||
pc, 1, sc->sc_tx_size - 1,
|
||||
&actlen)) {
|
||||
|
||||
buf[0] = sc->sc_curr_tx_unit;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 1);
|
||||
usbd_copy_in(pc, 0, buf, 1);
|
||||
|
||||
xfer->frlengths[0] = actlen + 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen + 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
|
||||
ubser_inc_tx_unit(sc); /* round robin */
|
||||
@ -401,9 +417,9 @@ ubser_write_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -412,36 +428,40 @@ ubser_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ubser_read_callback(struct usb_xfer *xfer)
|
||||
ubser_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ubser_softc *sc = xfer->priv_sc;
|
||||
struct ubser_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[1];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (xfer->actlen < 1) {
|
||||
if (actlen < 1) {
|
||||
DPRINTF("invalid actlen=0!\n");
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 1);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, 1);
|
||||
|
||||
if (buf[0] >= sc->sc_numser) {
|
||||
DPRINTF("invalid serial number!\n");
|
||||
goto tr_setup;
|
||||
}
|
||||
ucom_put_data(sc->sc_ucom + buf[0],
|
||||
xfer->frbuffers, 1, xfer->actlen - 1);
|
||||
ucom_put_data(sc->sc_ucom + buf[0], pc, 1, actlen - 1);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -69,22 +69,34 @@ __FBSDID("$FreeBSD$");
|
||||
* driver for WinChipHead CH341/340, the worst USB-serial chip in the world.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uchcom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -341,8 +353,8 @@ uchcom_attach(device_t dev)
|
||||
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UCHCOM_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -772,19 +784,23 @@ uchcom_stop_write(struct ucom_softc *ucom)
|
||||
* callback when the modem status is changed.
|
||||
*/
|
||||
static void
|
||||
uchcom_intr_callback(struct usb_xfer *xfer)
|
||||
uchcom_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uchcom_softc *sc = xfer->priv_sc;
|
||||
struct uchcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[UCHCOM_INTR_LEAST];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("actlen = %u\n", xfer->actlen);
|
||||
DPRINTF("actlen = %u\n", actlen);
|
||||
|
||||
if (xfer->actlen >= UCHCOM_INTR_LEAST) {
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf,
|
||||
UCHCOM_INTR_LEAST);
|
||||
if (actlen >= UCHCOM_INTR_LEAST) {
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, UCHCOM_INTR_LEAST);
|
||||
|
||||
DPRINTF("data = 0x%02X 0x%02X 0x%02X 0x%02X\n",
|
||||
(unsigned)buf[0], (unsigned)buf[1],
|
||||
@ -795,14 +811,14 @@ uchcom_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -810,29 +826,31 @@ uchcom_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uchcom_write_callback(struct usb_xfer *xfer)
|
||||
uchcom_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uchcom_softc *sc = xfer->priv_sc;
|
||||
struct uchcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UCHCOM_BULK_BUF_SIZE, &actlen)) {
|
||||
|
||||
DPRINTF("actlen = %d\n", actlen);
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -841,24 +859,29 @@ uchcom_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uchcom_read_callback(struct usb_xfer *xfer)
|
||||
uchcom_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uchcom_softc *sc = xfer->priv_sc;
|
||||
struct uchcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -34,24 +34,35 @@ __FBSDID("$FreeBSD$");
|
||||
* RS232 bridges.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_hid.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -329,14 +340,18 @@ ucycom_stop_write(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
ucycom_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
ucycom_ctrl_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ucycom_softc *sc = xfer->priv_sc;
|
||||
struct ucycom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc0, *pc1;
|
||||
uint8_t data[2];
|
||||
uint8_t offset;
|
||||
uint32_t actlen;
|
||||
|
||||
pc0 = usbd_xfer_get_frame(xfer, 0);
|
||||
pc1 = usbd_xfer_get_frame(xfer, 1);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_transferred:
|
||||
@ -354,7 +369,7 @@ ucycom_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers + 1, offset,
|
||||
if (ucom_get_data(&sc->sc_ucom, pc1, offset,
|
||||
sc->sc_olen - offset, &actlen)) {
|
||||
|
||||
req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
|
||||
@ -376,22 +391,22 @@ ucycom_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
}
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0, data, offset);
|
||||
usbd_copy_in(pc0, 0, &req, sizeof(req));
|
||||
usbd_copy_in(pc1, 0, data, offset);
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = sc->sc_olen;
|
||||
xfer->nframes = xfer->frlengths[1] ? 2 : 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, sc->sc_olen);
|
||||
usbd_xfer_set_frames(xfer, sc->sc_olen ? 2 : 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
return;
|
||||
}
|
||||
DPRINTF("error=%s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
goto tr_transferred;
|
||||
}
|
||||
}
|
||||
@ -494,42 +509,45 @@ ucycom_cfg_param(struct ucom_softc *ucom, struct termios *t)
|
||||
}
|
||||
|
||||
static void
|
||||
ucycom_intr_read_callback(struct usb_xfer *xfer)
|
||||
ucycom_intr_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ucycom_softc *sc = xfer->priv_sc;
|
||||
struct ucycom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
uint32_t offset;
|
||||
uint32_t len;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
switch (sc->sc_model) {
|
||||
case MODEL_CY7C63743:
|
||||
if (xfer->actlen < 1) {
|
||||
if (actlen < 1) {
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 1);
|
||||
usbd_copy_out(pc, 0, buf, 1);
|
||||
|
||||
sc->sc_ist = buf[0] & ~0x07;
|
||||
len = buf[0] & 0x07;
|
||||
|
||||
(xfer->actlen)--;
|
||||
|
||||
actlen--;
|
||||
offset = 1;
|
||||
|
||||
break;
|
||||
|
||||
case MODEL_CY7C64013:
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 2);
|
||||
usbd_copy_out(pc, 0, buf, 2);
|
||||
|
||||
sc->sc_ist = buf[0] & ~0x07;
|
||||
len = buf[1];
|
||||
|
||||
(xfer->actlen) -= 2;
|
||||
|
||||
actlen -= 2;
|
||||
offset = 2;
|
||||
|
||||
break;
|
||||
@ -539,23 +557,21 @@ ucycom_intr_read_callback(struct usb_xfer *xfer)
|
||||
goto tr_setup;
|
||||
}
|
||||
|
||||
if (len > xfer->actlen) {
|
||||
len = xfer->actlen;
|
||||
}
|
||||
if (len) {
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers,
|
||||
offset, len);
|
||||
}
|
||||
if (len > actlen)
|
||||
len = actlen;
|
||||
if (len)
|
||||
ucom_put_data(&sc->sc_ucom, pc, offset, len);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = sc->sc_ilen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sc->sc_ilen);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -82,26 +82,38 @@ __FBSDID("$FreeBSD$");
|
||||
* be called from within the config thread function !
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/sbuf.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sbuf.h>
|
||||
|
||||
typedef struct ufoma_mobile_acm_descriptor {
|
||||
uint8_t bFunctionLength;
|
||||
@ -426,8 +438,8 @@ ufoma_attach(device_t dev)
|
||||
|
||||
/* clear stall at first run, if any */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE]);
|
||||
usbd_transfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ]);
|
||||
usbd_xfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_WRITE]);
|
||||
usbd_xfer_set_stall(sc->sc_bulk_xfer[UFOMA_BULK_ENDPT_READ]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -544,21 +556,25 @@ ufoma_cfg_activate_state(struct ufoma_softc *sc, uint16_t state)
|
||||
}
|
||||
|
||||
static void
|
||||
ufoma_ctrl_read_callback(struct usb_xfer *xfer)
|
||||
ufoma_ctrl_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ufoma_softc *sc = xfer->priv_sc;
|
||||
struct ufoma_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc0, *pc1;
|
||||
int len, aframes, nframes;
|
||||
|
||||
usbd_xfer_status(xfer, NULL, NULL, &aframes, &nframes);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_transferred:
|
||||
if (xfer->aframes != xfer->nframes) {
|
||||
if (aframes != nframes)
|
||||
goto tr_setup;
|
||||
}
|
||||
if (xfer->frlengths[1] > 0) {
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers + 1,
|
||||
0, xfer->frlengths[1]);
|
||||
}
|
||||
pc1 = usbd_xfer_get_frame(xfer, 1);
|
||||
len = usbd_xfer_get_frame_len(xfer, 1);
|
||||
if (len > 0)
|
||||
ucom_put_data(&sc->sc_ucom, pc1, 0, len);
|
||||
/* FALLTHROUGH */
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (sc->sc_num_msg) {
|
||||
@ -570,20 +586,21 @@ ufoma_ctrl_read_callback(struct usb_xfer *xfer)
|
||||
USETW(req.wValue, 0);
|
||||
USETW(req.wLength, UFOMA_CMD_BUF_SIZE);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc0 = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc0, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = UFOMA_CMD_BUF_SIZE;
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, UFOMA_CMD_BUF_SIZE);
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error = %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
usbd_errstr(error));
|
||||
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
return;
|
||||
} else {
|
||||
goto tr_setup;
|
||||
@ -594,10 +611,11 @@ ufoma_ctrl_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ufoma_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
ufoma_ctrl_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ufoma_softc *sc = xfer->priv_sc;
|
||||
struct ufoma_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -605,8 +623,8 @@ ufoma_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
tr_transferred:
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers + 1,
|
||||
0, 1, &actlen)) {
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0, 1, &actlen)) {
|
||||
|
||||
req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
|
||||
req.bRequest = UCDC_SEND_ENCAPSULATED_COMMAND;
|
||||
@ -614,21 +632,21 @@ ufoma_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
USETW(req.wValue, 0);
|
||||
USETW(req.wLength, 1);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = 1;
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, 1);
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error = %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
DPRINTF("error = %s\n", usbd_errstr(error));
|
||||
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
return;
|
||||
} else {
|
||||
goto tr_setup;
|
||||
@ -639,31 +657,36 @@ ufoma_ctrl_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ufoma_intr_callback(struct usb_xfer *xfer)
|
||||
ufoma_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ufoma_softc *sc = xfer->priv_sc;
|
||||
struct ufoma_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_cdc_notification pkt;
|
||||
struct usb_page_cache *pc;
|
||||
uint16_t wLen;
|
||||
uint16_t temp;
|
||||
uint8_t mstatus;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (xfer->actlen < 8) {
|
||||
if (actlen < 8) {
|
||||
DPRINTF("too short message\n");
|
||||
goto tr_setup;
|
||||
}
|
||||
if (xfer->actlen > sizeof(pkt)) {
|
||||
if (actlen > sizeof(pkt)) {
|
||||
DPRINTF("truncating message\n");
|
||||
xfer->actlen = sizeof(pkt);
|
||||
actlen = sizeof(pkt);
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &pkt, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &pkt, actlen);
|
||||
|
||||
xfer->actlen -= 8;
|
||||
actlen -= 8;
|
||||
|
||||
wLen = UGETW(pkt.wLength);
|
||||
if (xfer->actlen > wLen) {
|
||||
xfer->actlen = wLen;
|
||||
if (actlen > wLen) {
|
||||
actlen = wLen;
|
||||
}
|
||||
if ((pkt.bmRequestType == UT_READ_VENDOR_INTERFACE) &&
|
||||
(pkt.bNotification == UMCPC_REQUEST_ACKNOWLEDGE)) {
|
||||
@ -698,9 +721,9 @@ ufoma_intr_callback(struct usb_xfer *xfer)
|
||||
* Set the serial state in ucom driver based on
|
||||
* the bits from the notify message
|
||||
*/
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
DPRINTF("invalid notification "
|
||||
"length, %d bytes!\n", xfer->actlen);
|
||||
"length, %d bytes!\n", actlen);
|
||||
break;
|
||||
}
|
||||
DPRINTF("notify bytes = 0x%02x, 0x%02x\n",
|
||||
@ -730,14 +753,14 @@ ufoma_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -745,26 +768,28 @@ ufoma_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ufoma_bulk_write_callback(struct usb_xfer *xfer)
|
||||
ufoma_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ufoma_softc *sc = xfer->priv_sc;
|
||||
struct ufoma_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UFOMA_BULK_BUF_SIZE, &actlen)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -772,25 +797,29 @@ ufoma_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ufoma_bulk_read_callback(struct usb_xfer *xfer)
|
||||
ufoma_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ufoma_softc *sc = xfer->priv_sc;
|
||||
struct ufoma_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -48,21 +48,34 @@ __FBSDID("$FreeBSD$");
|
||||
* FTDI FT8U100AX serial adapter driver
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uftdi_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
#include <dev/usb/serial/uftdi_reg.h>
|
||||
@ -296,8 +309,8 @@ uftdi_attach(device_t dev)
|
||||
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UFTDI_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
/* set a valid "lcr" value */
|
||||
@ -368,9 +381,10 @@ uftdi_cfg_open(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
uftdi_write_callback(struct usb_xfer *xfer)
|
||||
uftdi_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uftdi_softc *sc = xfer->priv_sc;
|
||||
struct uftdi_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
uint8_t buf[1];
|
||||
|
||||
@ -378,24 +392,25 @@ uftdi_write_callback(struct usb_xfer *xfer)
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc,
|
||||
sc->sc_hdrlen, UFTDI_OBUFSIZE - sc->sc_hdrlen,
|
||||
&actlen)) {
|
||||
|
||||
if (sc->sc_hdrlen > 0) {
|
||||
buf[0] =
|
||||
FTDI_OUT_TAG(actlen, sc->sc_ucom.sc_portno);
|
||||
usbd_copy_in(xfer->frbuffers, 0, buf, 1);
|
||||
usbd_copy_in(pc, 0, buf, 1);
|
||||
}
|
||||
xfer->frlengths[0] = actlen + sc->sc_hdrlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen + sc->sc_hdrlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -403,21 +418,26 @@ uftdi_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uftdi_read_callback(struct usb_xfer *xfer)
|
||||
uftdi_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uftdi_softc *sc = xfer->priv_sc;
|
||||
struct uftdi_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
uint8_t ftdi_msr;
|
||||
uint8_t msr;
|
||||
uint8_t lsr;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, 2);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, 2);
|
||||
|
||||
ftdi_msr = FTDI_GET_MSR(buf);
|
||||
lsr = FTDI_GET_LSR(buf);
|
||||
@ -443,22 +463,21 @@ uftdi_read_callback(struct usb_xfer *xfer)
|
||||
|
||||
ucom_status_change(&sc->sc_ucom);
|
||||
}
|
||||
xfer->actlen -= 2;
|
||||
actlen -= 2;
|
||||
|
||||
if (xfer->actlen > 0) {
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 2,
|
||||
xfer->actlen);
|
||||
if (actlen > 0) {
|
||||
ucom_put_data(&sc->sc_ucom, pc, 2, actlen);
|
||||
}
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -42,21 +42,33 @@
|
||||
* be called from within the config thread function !
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -221,8 +233,8 @@ ugensa_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(ssc->sc_xfer[UGENSA_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(ssc->sc_xfer[UGENSA_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(ssc->sc_xfer[UGENSA_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(ssc->sc_xfer[UGENSA_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
/* initialize port number */
|
||||
@ -264,26 +276,28 @@ ugensa_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
ugensa_bulk_write_callback(struct usb_xfer *xfer)
|
||||
ugensa_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ugensa_sub_softc *ssc = xfer->priv_sc;
|
||||
struct ugensa_sub_softc *ssc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(ssc->sc_ucom_ptr, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(ssc->sc_ucom_ptr, pc, 0,
|
||||
UGENSA_BUF_SIZE, &actlen)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -291,25 +305,29 @@ ugensa_bulk_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugensa_bulk_read_callback(struct usb_xfer *xfer)
|
||||
ugensa_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ugensa_sub_softc *ssc = xfer->priv_sc;
|
||||
struct ugensa_sub_softc *ssc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(ssc->sc_ucom_ptr, xfer->frbuffers, 0,
|
||||
xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(ssc->sc_ucom_ptr, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -51,21 +51,35 @@
|
||||
#include <sys/cdefs.h>
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -1136,8 +1150,8 @@ uipaq_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UIPAQ_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -1267,26 +1281,28 @@ uipaq_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
|
||||
}
|
||||
|
||||
static void
|
||||
uipaq_write_callback(struct usb_xfer *xfer)
|
||||
uipaq_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uipaq_softc *sc = xfer->priv_sc;
|
||||
struct uipaq_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UIPAQ_BUF_SIZE, &actlen)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -1294,25 +1310,29 @@ uipaq_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uipaq_read_callback(struct usb_xfer *xfer)
|
||||
uipaq_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uipaq_softc *sc = xfer->priv_sc;
|
||||
struct uipaq_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -45,25 +45,39 @@ __FBSDID("$FreeBSD$");
|
||||
* Printer Class spec: http://www.usb.org/developers/devclass_docs/usbprint11.pdf
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/selinfo.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR ulpt_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
|
||||
#include <sys/syslog.h>
|
||||
|
||||
#if USB_DEBUG
|
||||
static int ulpt_debug = 0;
|
||||
@ -189,35 +203,38 @@ ulpt_reset(struct ulpt_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
ulpt_write_callback(struct usb_xfer *xfer)
|
||||
ulpt_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ulpt_softc *sc = xfer->priv_sc;
|
||||
struct ulpt_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_fifo *f = sc->sc_fifo_open[USB_FIFO_TX];
|
||||
uint32_t actlen;
|
||||
struct usb_page_cache *pc;
|
||||
int actlen, max;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
if (f == NULL) {
|
||||
/* should not happen */
|
||||
DPRINTF("no FIFO\n");
|
||||
return;
|
||||
}
|
||||
DPRINTF("state=0x%x actlen=%u\n",
|
||||
USB_GET_STATE(xfer), xfer->actlen);
|
||||
DPRINTF("state=0x%x actlen=%d\n", USB_GET_STATE(xfer), actlen);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (usb_fifo_get_data(f, xfer->frbuffers,
|
||||
0, xfer->max_data_length, &actlen, 0)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
max = usbd_xfer_max_len(xfer);
|
||||
if (usb_fifo_get_data(f, pc, 0, max, &actlen, 0)) {
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -225,10 +242,14 @@ ulpt_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ulpt_read_callback(struct usb_xfer *xfer)
|
||||
ulpt_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ulpt_softc *sc = xfer->priv_sc;
|
||||
struct ulpt_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_fifo *f = sc->sc_fifo_open[USB_FIFO_RX];
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
if (f == NULL) {
|
||||
/* should not happen */
|
||||
@ -240,40 +261,40 @@ ulpt_read_callback(struct usb_xfer *xfer)
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen == 0) {
|
||||
if (actlen == 0) {
|
||||
|
||||
if (sc->sc_zlps == 4) {
|
||||
/* enable BULK throttle */
|
||||
xfer->interval = 500; /* ms */
|
||||
usbd_xfer_set_interval(xfer, 500); /* ms */
|
||||
} else {
|
||||
sc->sc_zlps++;
|
||||
}
|
||||
} else {
|
||||
/* disable BULK throttle */
|
||||
|
||||
xfer->interval = 0;
|
||||
usbd_xfer_set_interval(xfer, 0);
|
||||
sc->sc_zlps = 0;
|
||||
}
|
||||
|
||||
usb_fifo_put_data(f, xfer->frbuffers,
|
||||
0, xfer->actlen, 1);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usb_fifo_put_data(f, pc, 0, actlen, 1);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
if (usb_fifo_put_bytes_max(f) != 0) {
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
/* disable BULK throttle */
|
||||
xfer->interval = 0;
|
||||
usbd_xfer_set_interval(xfer, 0);
|
||||
sc->sc_zlps = 0;
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
break;
|
||||
@ -281,17 +302,19 @@ ulpt_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ulpt_status_callback(struct usb_xfer *xfer)
|
||||
ulpt_status_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ulpt_softc *sc = xfer->priv_sc;
|
||||
struct ulpt_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t cur_status;
|
||||
uint8_t new_status;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
usbd_copy_out(xfer->frbuffers + 1, 0, &cur_status, 1);
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_out(pc, 0, &cur_status, 1);
|
||||
|
||||
cur_status = (cur_status ^ LPS_INVERT) & LPS_MASK;
|
||||
new_status = cur_status & ~sc->sc_last_status;
|
||||
@ -316,17 +339,18 @@ ulpt_status_callback(struct usb_xfer *xfer)
|
||||
req.wIndex[1] = 0;
|
||||
USETW(req.wLength, 1);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = 1;
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, 1);
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error=%s\n", usbd_errstr(xfer->error));
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
DPRINTF("error=%s\n", usbd_errstr(error));
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* wait for next watchdog timeout */
|
||||
}
|
||||
break;
|
||||
@ -365,7 +389,7 @@ static const struct usb_config ulpt_config[ULPT_N_TRANSFER] = {
|
||||
static void
|
||||
ulpt_start_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[ULPT_BULK_DT_RD]);
|
||||
}
|
||||
@ -373,7 +397,7 @@ ulpt_start_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
ulpt_stop_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[ULPT_BULK_DT_RD]);
|
||||
}
|
||||
@ -381,7 +405,7 @@ ulpt_stop_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
ulpt_start_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[ULPT_BULK_DT_WR]);
|
||||
}
|
||||
@ -389,7 +413,7 @@ ulpt_start_write(struct usb_fifo *fifo)
|
||||
static void
|
||||
ulpt_stop_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[ULPT_BULK_DT_WR]);
|
||||
}
|
||||
@ -397,7 +421,7 @@ ulpt_stop_write(struct usb_fifo *fifo)
|
||||
static int
|
||||
ulpt_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
/* we assume that open is a serial process */
|
||||
|
||||
@ -410,7 +434,7 @@ ulpt_open(struct usb_fifo *fifo, int fflags)
|
||||
static int
|
||||
unlpt_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
if (sc->sc_fflags & fflags) {
|
||||
return (EBUSY);
|
||||
@ -418,10 +442,10 @@ unlpt_open(struct usb_fifo *fifo, int fflags)
|
||||
if (fflags & FREAD) {
|
||||
/* clear stall first */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
if (usb_fifo_alloc_buffer(fifo,
|
||||
sc->sc_xfer[ULPT_BULK_DT_RD]->max_data_length,
|
||||
usbd_xfer_max_len(sc->sc_xfer[ULPT_BULK_DT_RD]),
|
||||
ULPT_IFQ_MAXLEN)) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
@ -431,10 +455,10 @@ unlpt_open(struct usb_fifo *fifo, int fflags)
|
||||
if (fflags & FWRITE) {
|
||||
/* clear stall first */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_WR]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
if (usb_fifo_alloc_buffer(fifo,
|
||||
sc->sc_xfer[ULPT_BULK_DT_WR]->max_data_length,
|
||||
usbd_xfer_max_len(sc->sc_xfer[ULPT_BULK_DT_WR]),
|
||||
ULPT_IFQ_MAXLEN)) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
@ -448,7 +472,7 @@ unlpt_open(struct usb_fifo *fifo, int fflags)
|
||||
static void
|
||||
ulpt_close(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct ulpt_softc *sc = fifo->priv_sc0;
|
||||
struct ulpt_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
sc->sc_fflags &= ~(fflags & (FREAD | FWRITE));
|
||||
|
||||
|
@ -44,22 +44,34 @@ __FBSDID("$FreeBSD$");
|
||||
* be called from within the config thread function !
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -226,7 +238,7 @@ umct_attach(device_t dev)
|
||||
struct usb_attach_arg *uaa = device_get_ivars(dev);
|
||||
struct umct_softc *sc = device_get_softc(dev);
|
||||
int32_t error;
|
||||
uint16_t maxp;
|
||||
//uint16_t maxp;
|
||||
uint8_t iface_index;
|
||||
|
||||
sc->sc_udev = uaa->device;
|
||||
@ -254,6 +266,7 @@ umct_attach(device_t dev)
|
||||
* The only way to differentiate it from the real interrupt
|
||||
* endpoint is to look at the wMaxPacketSize field.
|
||||
*/
|
||||
#ifdef XXX
|
||||
maxp = UGETW(sc->sc_xfer[UMCT_BULK_DT_RD]->endpoint->edesc->wMaxPacketSize);
|
||||
if (maxp == 0x2) {
|
||||
|
||||
@ -267,7 +280,8 @@ umct_attach(device_t dev)
|
||||
sc->sc_xfer[UMCT_BULK_DT_RD]->callback = &umct_read_callback;
|
||||
sc->sc_xfer[UMCT_INTR_DT_RD]->callback = &umct_intr_callback;
|
||||
}
|
||||
sc->sc_obufsize = sc->sc_xfer[UMCT_BULK_DT_WR]->max_data_length;
|
||||
#endif
|
||||
sc->sc_obufsize = usbd_xfer_max_len(sc->sc_xfer[UMCT_BULK_DT_WR]);
|
||||
|
||||
if (uaa->info.idProduct == USB_PRODUCT_MCT_SITECOM_USB232) {
|
||||
if (sc->sc_obufsize > 16) {
|
||||
@ -326,18 +340,23 @@ umct_cfg_do_request(struct umct_softc *sc, uint8_t request,
|
||||
}
|
||||
|
||||
static void
|
||||
umct_intr_callback(struct usb_xfer *xfer)
|
||||
umct_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umct_softc *sc = xfer->priv_sc;
|
||||
struct umct_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
DPRINTF("too short message\n");
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, sizeof(buf));
|
||||
|
||||
sc->sc_msr = buf[0];
|
||||
sc->sc_lsr = buf[1];
|
||||
@ -346,14 +365,14 @@ umct_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -526,27 +545,29 @@ umct_stop_write(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
umct_write_callback(struct usb_xfer *xfer)
|
||||
umct_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umct_softc *sc = xfer->priv_sc;
|
||||
struct umct_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
sc->sc_obufsize, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -554,25 +575,29 @@ umct_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umct_read_callback(struct usb_xfer *xfer)
|
||||
umct_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umct_softc *sc = xfer->priv_sc;
|
||||
struct umct_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers,
|
||||
0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -80,23 +80,38 @@ __FBSDID("$FreeBSD$");
|
||||
*
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
|
||||
#define USB_DEBUG_VAR umodem_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -353,8 +368,8 @@ umodem_attach(device_t dev)
|
||||
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UMODEM_BULK_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UMODEM_BULK_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UMODEM_BULK_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -600,31 +615,36 @@ umodem_cfg_set_break(struct ucom_softc *ucom, uint8_t onoff)
|
||||
}
|
||||
|
||||
static void
|
||||
umodem_intr_callback(struct usb_xfer *xfer)
|
||||
umodem_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_cdc_notification pkt;
|
||||
struct umodem_softc *sc = xfer->priv_sc;
|
||||
struct umodem_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint16_t wLen;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < 8) {
|
||||
if (actlen < 8) {
|
||||
DPRINTF("received short packet, "
|
||||
"%d bytes\n", xfer->actlen);
|
||||
"%d bytes\n", actlen);
|
||||
goto tr_setup;
|
||||
}
|
||||
if (xfer->actlen > sizeof(pkt)) {
|
||||
if (actlen > sizeof(pkt)) {
|
||||
DPRINTF("truncating message\n");
|
||||
xfer->actlen = sizeof(pkt);
|
||||
actlen = sizeof(pkt);
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &pkt, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &pkt, actlen);
|
||||
|
||||
xfer->actlen -= 8;
|
||||
actlen -= 8;
|
||||
|
||||
wLen = UGETW(pkt.wLength);
|
||||
if (xfer->actlen > wLen) {
|
||||
xfer->actlen = wLen;
|
||||
if (actlen > wLen) {
|
||||
actlen = wLen;
|
||||
}
|
||||
if (pkt.bmRequestType != UCDC_NOTIFICATION) {
|
||||
DPRINTF("unknown message type, "
|
||||
@ -638,9 +658,9 @@ umodem_intr_callback(struct usb_xfer *xfer)
|
||||
* Set the serial state in ucom driver based on
|
||||
* the bits from the notify message
|
||||
*/
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
DPRINTF("invalid notification "
|
||||
"length, %d bytes!\n", xfer->actlen);
|
||||
"length, %d bytes!\n", actlen);
|
||||
break;
|
||||
}
|
||||
DPRINTF("notify bytes = %02x%02x\n",
|
||||
@ -671,14 +691,14 @@ umodem_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -687,27 +707,29 @@ umodem_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umodem_write_callback(struct usb_xfer *xfer)
|
||||
umodem_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umodem_softc *sc = xfer->priv_sc;
|
||||
struct umodem_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UMODEM_BUF_SIZE, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -715,28 +737,32 @@ umodem_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umodem_read_callback(struct usb_xfer *xfer)
|
||||
umodem_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umodem_softc *sc = xfer->priv_sc;
|
||||
struct umodem_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("actlen=%d\n", xfer->actlen);
|
||||
DPRINTF("actlen=%d\n", actlen);
|
||||
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -17,21 +17,34 @@
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR umoscom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -313,8 +326,8 @@ umoscom_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UMOSCOM_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UMOSCOM_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UMOSCOM_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UMOSCOM_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -583,9 +596,10 @@ umoscom_stop_write(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
umoscom_write_callback(struct usb_xfer *xfer)
|
||||
umoscom_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umoscom_softc *sc = xfer->priv_sc;
|
||||
struct umoscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -594,19 +608,20 @@ umoscom_write_callback(struct usb_xfer *xfer)
|
||||
tr_setup:
|
||||
DPRINTF("\n");
|
||||
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UMOSCOM_BUFSIZE, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
DPRINTFN(0, "transfer failed\n");
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -614,28 +629,33 @@ umoscom_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umoscom_read_callback(struct usb_xfer *xfer)
|
||||
umoscom_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umoscom_softc *sc = xfer->priv_sc;
|
||||
struct umoscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
DPRINTF("got %d bytes\n", xfer->actlen);
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
DPRINTF("got %d bytes\n", actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
DPRINTF("\n");
|
||||
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
DPRINTFN(0, "transfer failed\n");
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -643,13 +663,16 @@ umoscom_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umoscom_intr_callback(struct usb_xfer *xfer)
|
||||
umoscom_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umoscom_softc *sc = xfer->priv_sc;
|
||||
struct umoscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (xfer->actlen < 2) {
|
||||
if (actlen < 2) {
|
||||
DPRINTF("too short message\n");
|
||||
goto tr_setup;
|
||||
}
|
||||
@ -657,15 +680,15 @@ umoscom_intr_callback(struct usb_xfer *xfer)
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
DPRINTFN(0, "transfer failed\n");
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -84,21 +84,35 @@ __FBSDID("$FreeBSD$");
|
||||
* documented in the datasheet.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uplcom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -389,8 +403,8 @@ uplcom_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UPLCOM_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UPLCOM_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UPLCOM_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UPLCOM_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -736,19 +750,24 @@ uplcom_cfg_get_status(struct ucom_softc *ucom, uint8_t *lsr, uint8_t *msr)
|
||||
}
|
||||
|
||||
static void
|
||||
uplcom_intr_callback(struct usb_xfer *xfer)
|
||||
uplcom_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uplcom_softc *sc = xfer->priv_sc;
|
||||
struct uplcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[9];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
DPRINTF("actlen = %u\n", xfer->actlen);
|
||||
DPRINTF("actlen = %u\n", actlen);
|
||||
|
||||
if (xfer->actlen >= 9) {
|
||||
if (actlen >= 9) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, sizeof(buf));
|
||||
|
||||
DPRINTF("status = 0x%02x\n", buf[8]);
|
||||
|
||||
@ -768,14 +787,14 @@ uplcom_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -783,29 +802,31 @@ uplcom_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uplcom_write_callback(struct usb_xfer *xfer)
|
||||
uplcom_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uplcom_softc *sc = xfer->priv_sc;
|
||||
struct uplcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UPLCOM_BULK_BUF_SIZE, &actlen)) {
|
||||
|
||||
DPRINTF("actlen = %d\n", actlen);
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -813,24 +834,29 @@ uplcom_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uplcom_read_callback(struct usb_xfer *xfer)
|
||||
uplcom_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uplcom_softc *sc = xfer->priv_sc;
|
||||
struct uplcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -67,20 +67,34 @@ __FBSDID("$FreeBSD$");
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR ucom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
|
@ -19,20 +19,34 @@ __FBSDID("$FreeBSD$");
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uslcom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -242,8 +256,8 @@ uslcom_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[USLCOM_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[USLCOM_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[USLCOM_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[USLCOM_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -454,29 +468,31 @@ uslcom_set_break(struct ucom_softc *ucom, uint8_t onoff)
|
||||
}
|
||||
|
||||
static void
|
||||
uslcom_write_callback(struct usb_xfer *xfer)
|
||||
uslcom_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uslcom_softc *sc = xfer->priv_sc;
|
||||
struct uslcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
USLCOM_BULK_BUF_SIZE, &actlen)) {
|
||||
|
||||
DPRINTF("actlen = %d\n", actlen);
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -484,24 +500,29 @@ uslcom_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uslcom_read_callback(struct usb_xfer *xfer)
|
||||
uslcom_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uslcom_softc *sc = xfer->priv_sc;
|
||||
struct uslcom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -54,22 +54,34 @@
|
||||
* Handspring Visor (Palmpilot compatible PDA) driver
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uvisor_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -324,8 +336,8 @@ uvisor_attach(device_t dev)
|
||||
}
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UVISOR_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UVISOR_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UVISOR_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UVISOR_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -562,27 +574,29 @@ uvisor_stop_write(struct ucom_softc *ucom)
|
||||
}
|
||||
|
||||
static void
|
||||
uvisor_write_callback(struct usb_xfer *xfer)
|
||||
uvisor_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uvisor_softc *sc = xfer->priv_sc;
|
||||
struct uvisor_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UVISOR_BUFSIZE, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -590,24 +604,29 @@ uvisor_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uvisor_read_callback(struct usb_xfer *xfer)
|
||||
uvisor_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uvisor_softc *sc = xfer->priv_sc;
|
||||
struct uvisor_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -37,21 +37,34 @@ __FBSDID("$FreeBSD$");
|
||||
* P-in m@ater and various data communication card adapters.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#define USB_DEBUG_VAR uvscom_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
|
||||
#include <dev/usb/serial/usb_serial.h>
|
||||
|
||||
@ -297,8 +310,8 @@ uvscom_attach(device_t dev)
|
||||
|
||||
/* clear stall at first run */
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
|
||||
usbd_transfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_WR]);
|
||||
usbd_xfer_set_stall(sc->sc_xfer[UVSCOM_BULK_DT_RD]);
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
error = ucom_attach(&sc->sc_super_ucom, &sc->sc_ucom, 1, sc,
|
||||
@ -338,27 +351,29 @@ uvscom_detach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
uvscom_write_callback(struct usb_xfer *xfer)
|
||||
uvscom_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uvscom_softc *sc = xfer->priv_sc;
|
||||
struct uvscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_SETUP:
|
||||
case USB_ST_TRANSFERRED:
|
||||
tr_setup:
|
||||
if (ucom_get_data(&sc->sc_ucom, xfer->frbuffers, 0,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (ucom_get_data(&sc->sc_ucom, pc, 0,
|
||||
UVSCOM_BULK_BUF_SIZE, &actlen)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -366,24 +381,29 @@ uvscom_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uvscom_read_callback(struct usb_xfer *xfer)
|
||||
uvscom_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uvscom_softc *sc = xfer->priv_sc;
|
||||
struct uvscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
ucom_put_data(&sc->sc_ucom, xfer->frbuffers, 0, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
ucom_put_data(&sc->sc_ucom, pc, 0, actlen);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
@ -391,16 +411,21 @@ uvscom_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
uvscom_intr_callback(struct usb_xfer *xfer)
|
||||
uvscom_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uvscom_softc *sc = xfer->priv_sc;
|
||||
struct uvscom_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[2];
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (xfer->actlen >= 2) {
|
||||
if (actlen >= 2) {
|
||||
|
||||
usbd_copy_out(xfer->frbuffers, 0, buf, sizeof(buf));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, buf, sizeof(buf));
|
||||
|
||||
sc->sc_lsr = 0;
|
||||
sc->sc_msr = 0;
|
||||
@ -429,14 +454,14 @@ uvscom_intr_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
goto tr_setup;
|
||||
}
|
||||
return;
|
||||
|
@ -102,18 +102,29 @@ __FBSDID("$FreeBSD$");
|
||||
* umass_cam_cb again to complete the CAM command.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <cam/cam.h>
|
||||
#include <cam/cam_ccb.h>
|
||||
@ -124,7 +135,8 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <cam/cam_periph.h>
|
||||
|
||||
#if 1
|
||||
#define UMASS_EXT_BUFFER
|
||||
#ifdef UMASS_EXT_BUFFER
|
||||
/* this enables loading of virtual buffers into DMA */
|
||||
#define UMASS_USB_FLAGS .ext_buffer=1,
|
||||
#else
|
||||
@ -1041,13 +1053,13 @@ static void umass_cancel_ccb(struct umass_softc *);
|
||||
static void umass_init_shuttle(struct umass_softc *);
|
||||
static void umass_reset(struct umass_softc *);
|
||||
static void umass_t_bbb_data_clear_stall_callback(struct usb_xfer *,
|
||||
uint8_t, uint8_t);
|
||||
uint8_t, uint8_t, usb_error_t);
|
||||
static void umass_command_start(struct umass_softc *, uint8_t, void *,
|
||||
uint32_t, uint32_t, umass_callback_t *, union ccb *);
|
||||
static uint8_t umass_bbb_get_max_lun(struct umass_softc *);
|
||||
static void umass_cbi_start_status(struct umass_softc *);
|
||||
static void umass_t_cbi_data_clear_stall_callback(struct usb_xfer *,
|
||||
uint8_t, uint8_t);
|
||||
uint8_t, uint8_t, usb_error_t);
|
||||
static int umass_cam_attach_sim(struct umass_softc *);
|
||||
static void umass_cam_rescan_callback(struct cam_periph *, union ccb *);
|
||||
static void umass_cam_rescan(struct umass_softc *);
|
||||
@ -1712,14 +1724,14 @@ umass_cancel_ccb(struct umass_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_tr_error(struct usb_xfer *xfer)
|
||||
umass_tr_error(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
|
||||
DPRINTF(sc, UDMASS_GEN, "transfer error, %s -> "
|
||||
"reset\n", usbd_errstr(xfer->error));
|
||||
"reset\n", usbd_errstr(error));
|
||||
}
|
||||
umass_cancel_ccb(sc);
|
||||
}
|
||||
@ -1729,10 +1741,11 @@ umass_tr_error(struct usb_xfer *xfer)
|
||||
*/
|
||||
|
||||
static void
|
||||
umass_t_bbb_reset1_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_reset1_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -1763,40 +1776,40 @@ umass_t_bbb_reset1_callback(struct usb_xfer *xfer)
|
||||
req.wIndex[1] = 0;
|
||||
USETW(req.wLength, 0);
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->nframes = 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frames(xfer, 1);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_reset2_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_reset2_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_bbb_data_clear_stall_callback(xfer, UMASS_T_BBB_RESET3,
|
||||
UMASS_T_BBB_DATA_READ);
|
||||
UMASS_T_BBB_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_reset3_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_reset3_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_bbb_data_clear_stall_callback(xfer, UMASS_T_BBB_COMMAND,
|
||||
UMASS_T_BBB_DATA_WRITE);
|
||||
UMASS_T_BBB_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
uint8_t next_xfer,
|
||||
uint8_t stall_xfer)
|
||||
uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -1811,17 +1824,18 @@ umass_t_bbb_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
union ccb *ccb = sc->sc_transfer.ccb;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t tag;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -1885,37 +1899,44 @@ umass_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
|
||||
DIF(UDMASS_BBB, umass_bbb_dump_cbw(sc, &sc->cbw));
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &sc->cbw, sizeof(sc->cbw));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &sc->cbw, sizeof(sc->cbw));
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(sc->cbw));
|
||||
|
||||
xfer->frlengths[0] = sizeof(sc->cbw);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
struct usb_page_cache *pc;
|
||||
#endif
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (!xfer->flags.ext_buffer) {
|
||||
usbd_copy_out(xfer->frbuffers, 0,
|
||||
sc->sc_transfer.data_ptr, xfer->actlen);
|
||||
}
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.actlen += xfer->actlen;
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, sc->sc_transfer.data_ptr, actlen);
|
||||
#endif
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.actlen += actlen;
|
||||
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
/* short transfer */
|
||||
sc->sc_transfer.data_rem = 0;
|
||||
}
|
||||
@ -1930,18 +1951,20 @@ umass_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->sc_transfer.data_rem) {
|
||||
max_bulk = sc->sc_transfer.data_rem;
|
||||
}
|
||||
xfer->timeout = sc->sc_transfer.data_timeout;
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout);
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
}
|
||||
#ifdef UMASS_EXT_BUFFER
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
#else
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
#endif
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
umass_tr_error(xfer);
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
umass_tr_error(xfer, error);
|
||||
} else {
|
||||
umass_transfer_start(sc, UMASS_T_BBB_DATA_RD_CS);
|
||||
}
|
||||
@ -1951,25 +1974,31 @@ umass_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_data_rd_cs_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_data_rd_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_bbb_data_clear_stall_callback(xfer, UMASS_T_BBB_STATUS,
|
||||
UMASS_T_BBB_DATA_READ);
|
||||
UMASS_T_BBB_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
struct usb_page_cache *pc;
|
||||
#endif
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.actlen += xfer->actlen;
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.actlen += actlen;
|
||||
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
/* short transfer */
|
||||
sc->sc_transfer.data_rem = 0;
|
||||
}
|
||||
@ -1984,22 +2013,23 @@ umass_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->sc_transfer.data_rem) {
|
||||
max_bulk = sc->sc_transfer.data_rem;
|
||||
}
|
||||
xfer->timeout = sc->sc_transfer.data_timeout;
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout);
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
} else {
|
||||
usbd_copy_in(xfer->frbuffers, 0,
|
||||
sc->sc_transfer.data_ptr, max_bulk);
|
||||
}
|
||||
#ifdef UMASS_EXT_BUFFER
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
#else
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, sc->sc_transfer.data_ptr, max_bulk);
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
#endif
|
||||
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
umass_tr_error(xfer);
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
umass_tr_error(xfer, error);
|
||||
} else {
|
||||
umass_transfer_start(sc, UMASS_T_BBB_DATA_WR_CS);
|
||||
}
|
||||
@ -2009,18 +2039,22 @@ umass_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_data_wr_cs_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_data_wr_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_bbb_data_clear_stall_callback(xfer, UMASS_T_BBB_STATUS,
|
||||
UMASS_T_BBB_DATA_WRITE);
|
||||
UMASS_T_BBB_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
umass_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
union ccb *ccb = sc->sc_transfer.ccb;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t residue;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -2032,10 +2066,11 @@ umass_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
|
||||
/* Zero missing parts of the CSW: */
|
||||
|
||||
if (xfer->actlen < sizeof(sc->csw)) {
|
||||
if (actlen < sizeof(sc->csw)) {
|
||||
bzero(&sc->csw, sizeof(sc->csw));
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &sc->csw, xfer->actlen);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &sc->csw, actlen);
|
||||
|
||||
DIF(UDMASS_BBB, umass_bbb_dump_csw(sc, &sc->csw));
|
||||
|
||||
@ -2108,18 +2143,18 @@ umass_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
|
||||
case USB_ST_SETUP:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default:
|
||||
tr_error:
|
||||
DPRINTF(sc, UDMASS_BBB, "Failed to read CSW: %s, try %d\n",
|
||||
usbd_errstr(xfer->error), sc->sc_status_try);
|
||||
usbd_errstr(error), sc->sc_status_try);
|
||||
|
||||
if ((xfer->error == USB_ERR_CANCELLED) ||
|
||||
if ((error == USB_ERR_CANCELLED) ||
|
||||
(sc->sc_status_try)) {
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
} else {
|
||||
sc->sc_status_try = 1;
|
||||
umass_transfer_start(sc, UMASS_T_BBB_DATA_RD_CS);
|
||||
@ -2210,10 +2245,11 @@ umass_cbi_start_status(struct umass_softc *sc)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_reset1_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_reset1_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
uint8_t buf[UMASS_CBI_DIAGNOSTIC_CMDLEN];
|
||||
|
||||
uint8_t i;
|
||||
@ -2259,54 +2295,55 @@ umass_t_cbi_reset1_callback(struct usb_xfer *xfer)
|
||||
buf[i] = 0xff;
|
||||
}
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0, buf, sizeof(buf));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_in(pc, 0, buf, sizeof(buf));
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = sizeof(buf);
|
||||
xfer->nframes = 2;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, sizeof(buf));
|
||||
usbd_xfer_set_frames(xfer, 2);
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_reset2_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_reset2_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_cbi_data_clear_stall_callback(xfer, UMASS_T_CBI_RESET3,
|
||||
UMASS_T_CBI_DATA_READ);
|
||||
UMASS_T_CBI_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_reset3_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_reset3_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
umass_t_cbi_data_clear_stall_callback
|
||||
(xfer, (sc->sc_xfer[UMASS_T_CBI_RESET4] &&
|
||||
sc->sc_xfer[UMASS_T_CBI_STATUS]) ?
|
||||
UMASS_T_CBI_RESET4 : UMASS_T_CBI_COMMAND,
|
||||
UMASS_T_CBI_DATA_WRITE);
|
||||
UMASS_T_CBI_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_reset4_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_reset4_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_cbi_data_clear_stall_callback(xfer, UMASS_T_CBI_COMMAND,
|
||||
UMASS_T_CBI_STATUS);
|
||||
UMASS_T_CBI_STATUS, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
uint8_t next_xfer,
|
||||
uint8_t stall_xfer)
|
||||
uint8_t next_xfer, uint8_t stall_xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -2325,18 +2362,19 @@ umass_t_cbi_data_clear_stall_callback(struct usb_xfer *xfer,
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_command_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_command_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
union ccb *ccb = sc->sc_transfer.ccb;
|
||||
struct usb_device_request req;
|
||||
struct usb_page_cache *pc;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -2369,13 +2407,16 @@ umass_t_cbi_command_callback(struct usb_xfer *xfer)
|
||||
req.wLength[0] = sc->sc_transfer.cmd_len;
|
||||
req.wLength[1] = 0;
|
||||
|
||||
usbd_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0, sc->sc_transfer.cmd_data,
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, &req, sizeof(req));
|
||||
pc = usbd_xfer_get_frame(xfer, 1);
|
||||
usbd_copy_in(pc, 0, sc->sc_transfer.cmd_data,
|
||||
sc->sc_transfer.cmd_len);
|
||||
|
||||
xfer->frlengths[0] = sizeof(req);
|
||||
xfer->frlengths[1] = sc->sc_transfer.cmd_len;
|
||||
xfer->nframes = xfer->frlengths[1] ? 2 : 1;
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
|
||||
usbd_xfer_set_frame_len(xfer, 1, sc->sc_transfer.cmd_len);
|
||||
usbd_xfer_set_frames(xfer,
|
||||
sc->sc_transfer.cmd_len ? 2 : 1);
|
||||
|
||||
DIF(UDMASS_CBI,
|
||||
umass_cbi_dump_cmd(sc,
|
||||
@ -2387,29 +2428,35 @@ umass_t_cbi_command_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_data_read_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
struct usb_page_cache *pc;
|
||||
#endif
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
if (!xfer->flags.ext_buffer) {
|
||||
usbd_copy_out(xfer->frbuffers, 0,
|
||||
sc->sc_transfer.data_ptr, xfer->actlen);
|
||||
}
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.actlen += xfer->actlen;
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, sc->sc_transfer.data_ptr, actlen);
|
||||
#endif
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.actlen += actlen;
|
||||
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
/* short transfer */
|
||||
sc->sc_transfer.data_rem = 0;
|
||||
}
|
||||
@ -2424,19 +2471,21 @@ umass_t_cbi_data_read_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->sc_transfer.data_rem) {
|
||||
max_bulk = sc->sc_transfer.data_rem;
|
||||
}
|
||||
xfer->timeout = sc->sc_transfer.data_timeout;
|
||||
usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout);
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
}
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
#ifdef UMASS_EXT_BUFFER
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
#else
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
#endif
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if ((xfer->error == USB_ERR_CANCELLED) ||
|
||||
if ((error == USB_ERR_CANCELLED) ||
|
||||
(sc->sc_transfer.callback != &umass_cam_cb)) {
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
} else {
|
||||
umass_transfer_start(sc, UMASS_T_CBI_DATA_RD_CS);
|
||||
}
|
||||
@ -2446,25 +2495,31 @@ umass_t_cbi_data_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_data_rd_cs_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_data_rd_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_cbi_data_clear_stall_callback(xfer, UMASS_T_CBI_STATUS,
|
||||
UMASS_T_CBI_DATA_READ);
|
||||
UMASS_T_CBI_DATA_READ, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_data_write_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
#ifndef UMASS_EXT_BUFFER
|
||||
struct usb_page_cache *pc;
|
||||
#endif
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.actlen += xfer->actlen;
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.actlen += actlen;
|
||||
|
||||
if (xfer->actlen < xfer->sumlen) {
|
||||
if (actlen < sumlen) {
|
||||
/* short transfer */
|
||||
sc->sc_transfer.data_rem = 0;
|
||||
}
|
||||
@ -2479,23 +2534,24 @@ umass_t_cbi_data_write_callback(struct usb_xfer *xfer)
|
||||
if (max_bulk > sc->sc_transfer.data_rem) {
|
||||
max_bulk = sc->sc_transfer.data_rem;
|
||||
}
|
||||
xfer->timeout = sc->sc_transfer.data_timeout;
|
||||
usbd_xfer_set_timeout(xfer, sc->sc_transfer.data_timeout);
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
} else {
|
||||
usbd_copy_in(xfer->frbuffers, 0,
|
||||
sc->sc_transfer.data_ptr, max_bulk);
|
||||
}
|
||||
#ifdef UMASS_EXT_BUFFER
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
#else
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_in(pc, 0, sc->sc_transfer.data_ptr, max_bulk);
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
#endif
|
||||
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if ((xfer->error == USB_ERR_CANCELLED) ||
|
||||
if ((error == USB_ERR_CANCELLED) ||
|
||||
(sc->sc_transfer.callback != &umass_cam_cb)) {
|
||||
umass_tr_error(xfer);
|
||||
umass_tr_error(xfer, error);
|
||||
} else {
|
||||
umass_transfer_start(sc, UMASS_T_CBI_DATA_WR_CS);
|
||||
}
|
||||
@ -2505,27 +2561,32 @@ umass_t_cbi_data_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_data_wr_cs_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_data_wr_cs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
umass_t_cbi_data_clear_stall_callback(xfer, UMASS_T_CBI_STATUS,
|
||||
UMASS_T_CBI_DATA_WRITE);
|
||||
UMASS_T_CBI_DATA_WRITE, error);
|
||||
}
|
||||
|
||||
static void
|
||||
umass_t_cbi_status_callback(struct usb_xfer *xfer)
|
||||
umass_t_cbi_status_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct umass_softc *sc = xfer->priv_sc;
|
||||
struct umass_softc *sc = usbd_xfer_softc(xfer);
|
||||
union ccb *ccb = sc->sc_transfer.ccb;
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t residue;
|
||||
uint8_t status;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
|
||||
if (xfer->actlen < sizeof(sc->sbl)) {
|
||||
if (actlen < sizeof(sc->sbl)) {
|
||||
goto tr_setup;
|
||||
}
|
||||
usbd_copy_out(xfer->frbuffers, 0, &sc->sbl, sizeof(sc->sbl));
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usbd_copy_out(pc, 0, &sc->sbl, sizeof(sc->sbl));
|
||||
|
||||
residue = (sc->sc_transfer.data_len -
|
||||
sc->sc_transfer.actlen);
|
||||
@ -2588,14 +2649,14 @@ umass_t_cbi_status_callback(struct usb_xfer *xfer)
|
||||
|
||||
case USB_ST_SETUP:
|
||||
tr_setup:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF(sc, UDMASS_CBI, "Failed to read CSW: %s\n",
|
||||
usbd_errstr(xfer->error));
|
||||
umass_tr_error(xfer);
|
||||
usbd_errstr(error));
|
||||
umass_tr_error(xfer, error);
|
||||
return;
|
||||
|
||||
}
|
||||
@ -3085,7 +3146,7 @@ umass_cam_poll(struct cam_sim *sim)
|
||||
|
||||
DPRINTF(sc, UDMASS_SCSI, "CAM poll\n");
|
||||
|
||||
usbd_do_poll(sc->sc_xfer, UMASS_T_MAX);
|
||||
usbd_transfer_poll(sc->sc_xfer, UMASS_T_MAX);
|
||||
}
|
||||
|
||||
|
||||
|
@ -44,25 +44,39 @@ __FBSDID("$FreeBSD$");
|
||||
* 2000/2/24 first version.
|
||||
*/
|
||||
|
||||
#include "usbdevs.h"
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/storage/rio500_usb.h>
|
||||
#include <dev/usb/usb_generic.h>
|
||||
|
||||
#define USB_DEBUG_VAR urio_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_generic.h>
|
||||
|
||||
#include <dev/usb/storage/rio500_usb.h>
|
||||
|
||||
#if USB_DEBUG
|
||||
static int urio_debug = 0;
|
||||
@ -242,10 +256,11 @@ urio_attach(device_t dev)
|
||||
}
|
||||
|
||||
static void
|
||||
urio_write_callback(struct usb_xfer *xfer)
|
||||
urio_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct urio_softc *sc = xfer->priv_sc;
|
||||
struct urio_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_fifo *f = sc->sc_fifo.fp[USB_FIFO_TX];
|
||||
struct usb_page_cache *pc;
|
||||
uint32_t actlen;
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
@ -255,16 +270,17 @@ urio_write_callback(struct usb_xfer *xfer)
|
||||
usbd_transfer_start(sc->sc_xfer[URIO_T_WR_CS]);
|
||||
return;
|
||||
}
|
||||
if (usb_fifo_get_data(f, xfer->frbuffers, 0,
|
||||
xfer->max_data_length, &actlen, 0)) {
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
if (usb_fifo_get_data(f, pc, 0,
|
||||
usbd_xfer_max_len(xfer), &actlen, 0)) {
|
||||
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
sc->sc_flags |= URIO_FLAG_WRITE_STALL;
|
||||
usbd_transfer_start(sc->sc_xfer[URIO_T_WR_CS]);
|
||||
@ -274,9 +290,9 @@ urio_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
urio_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
urio_write_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct urio_softc *sc = xfer->priv_sc;
|
||||
struct urio_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = sc->sc_xfer[URIO_T_WR];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
@ -287,15 +303,19 @@ urio_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
urio_read_callback(struct usb_xfer *xfer)
|
||||
urio_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct urio_softc *sc = xfer->priv_sc;
|
||||
struct urio_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_fifo *f = sc->sc_fifo.fp[USB_FIFO_RX];
|
||||
struct usb_page_cache *pc;
|
||||
int actlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
usb_fifo_put_data(f, xfer->frbuffers, 0,
|
||||
xfer->actlen, 1);
|
||||
pc = usbd_xfer_get_frame(xfer, 0);
|
||||
usb_fifo_put_data(f, pc, 0, actlen, 1);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
if (sc->sc_flags & URIO_FLAG_READ_STALL) {
|
||||
@ -303,13 +323,13 @@ urio_read_callback(struct usb_xfer *xfer)
|
||||
return;
|
||||
}
|
||||
if (usb_fifo_put_bytes_max(f) != 0) {
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
return;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error != USB_ERR_CANCELLED) {
|
||||
if (error != USB_ERR_CANCELLED) {
|
||||
/* try to clear stall first */
|
||||
sc->sc_flags |= URIO_FLAG_READ_STALL;
|
||||
usbd_transfer_start(sc->sc_xfer[URIO_T_RD_CS]);
|
||||
@ -319,9 +339,9 @@ urio_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
urio_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
urio_read_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct urio_softc *sc = xfer->priv_sc;
|
||||
struct urio_softc *sc = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = sc->sc_xfer[URIO_T_RD];
|
||||
|
||||
if (usbd_clear_stall_callback(xfer, xfer_other)) {
|
||||
@ -334,7 +354,7 @@ urio_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
static void
|
||||
urio_start_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct urio_softc *sc = fifo->priv_sc0;
|
||||
struct urio_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[URIO_T_RD]);
|
||||
}
|
||||
@ -342,7 +362,7 @@ urio_start_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
urio_stop_read(struct usb_fifo *fifo)
|
||||
{
|
||||
struct urio_softc *sc = fifo->priv_sc0;
|
||||
struct urio_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[URIO_T_RD_CS]);
|
||||
usbd_transfer_stop(sc->sc_xfer[URIO_T_RD]);
|
||||
@ -351,7 +371,7 @@ urio_stop_read(struct usb_fifo *fifo)
|
||||
static void
|
||||
urio_start_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct urio_softc *sc = fifo->priv_sc0;
|
||||
struct urio_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_start(sc->sc_xfer[URIO_T_WR]);
|
||||
}
|
||||
@ -359,7 +379,7 @@ urio_start_write(struct usb_fifo *fifo)
|
||||
static void
|
||||
urio_stop_write(struct usb_fifo *fifo)
|
||||
{
|
||||
struct urio_softc *sc = fifo->priv_sc0;
|
||||
struct urio_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
usbd_transfer_stop(sc->sc_xfer[URIO_T_WR_CS]);
|
||||
usbd_transfer_stop(sc->sc_xfer[URIO_T_WR]);
|
||||
@ -368,7 +388,7 @@ urio_stop_write(struct usb_fifo *fifo)
|
||||
static int
|
||||
urio_open(struct usb_fifo *fifo, int fflags)
|
||||
{
|
||||
struct urio_softc *sc = fifo->priv_sc0;
|
||||
struct urio_softc *sc = usb_fifo_softc(fifo);
|
||||
|
||||
if ((fflags & (FWRITE | FREAD)) != (FWRITE | FREAD)) {
|
||||
return (EACCES);
|
||||
@ -380,7 +400,7 @@ urio_open(struct usb_fifo *fifo, int fflags)
|
||||
mtx_unlock(&sc->sc_mtx);
|
||||
|
||||
if (usb_fifo_alloc_buffer(fifo,
|
||||
sc->sc_xfer[URIO_T_RD]->max_data_length,
|
||||
usbd_xfer_max_len(sc->sc_xfer[URIO_T_RD]),
|
||||
URIO_IFQ_MAXLEN)) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
@ -390,7 +410,7 @@ urio_open(struct usb_fifo *fifo, int fflags)
|
||||
sc->sc_flags |= URIO_FLAG_WRITE_STALL;
|
||||
|
||||
if (usb_fifo_alloc_buffer(fifo,
|
||||
sc->sc_xfer[URIO_T_WR]->max_data_length,
|
||||
usbd_xfer_max_len(sc->sc_xfer[URIO_T_WR]),
|
||||
URIO_IFQ_MAXLEN)) {
|
||||
return (ENOMEM);
|
||||
}
|
||||
|
@ -35,19 +35,34 @@
|
||||
* NOTE: Much of the SCSI statemachine handling code derives from the
|
||||
* Linux USB gadget stack.
|
||||
*/
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usbdevs.h"
|
||||
#include "usb_if.h"
|
||||
|
||||
#define USB_DEBUG_VAR ustorage_fs_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
|
||||
#if USB_DEBUG
|
||||
static int ustorage_fs_debug = 0;
|
||||
@ -491,11 +506,11 @@ ustorage_fs_handle_request(device_t dev,
|
||||
}
|
||||
|
||||
static void
|
||||
ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ustorage_fs_softc *sc = xfer->priv_sc;
|
||||
struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t tag;
|
||||
uint8_t error = 0;
|
||||
uint8_t err = 0;
|
||||
|
||||
DPRINTF("\n");
|
||||
|
||||
@ -547,8 +562,8 @@ ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
break;
|
||||
}
|
||||
|
||||
error = ustorage_fs_do_cmd(sc);
|
||||
if (error) {
|
||||
err = ustorage_fs_do_cmd(sc);
|
||||
if (err) {
|
||||
/* got an error */
|
||||
DPRINTF("command failed\n");
|
||||
break;
|
||||
@ -556,7 +571,7 @@ ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
if ((sc->sc_transfer.data_rem > 0) &&
|
||||
(sc->sc_transfer.cbw_dir != sc->sc_transfer.cmd_dir)) {
|
||||
/* contradicting data transfer direction */
|
||||
error = 1;
|
||||
err = 1;
|
||||
DPRINTF("data direction mismatch\n");
|
||||
break;
|
||||
}
|
||||
@ -578,30 +593,28 @@ ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
tr_setup:
|
||||
if (sc->sc_transfer.data_error) {
|
||||
sc->sc_transfer.data_error = 0;
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
DPRINTF("stall pipe\n");
|
||||
} else {
|
||||
xfer->flags.stall_pipe = 0;
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = sizeof(sc->sc_cbw);
|
||||
usbd_set_frame_data(xfer, &sc->sc_cbw, 0);
|
||||
usbd_xfer_set_frame_data(xfer, 0, &sc->sc_cbw,
|
||||
sizeof(sc->sc_cbw));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
DPRINTF("error\n");
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
/* If the pipe is already stalled, don't do another stall */
|
||||
if (!xfer->endpoint->is_stalled) {
|
||||
if (!usbd_xfer_is_stalled(xfer))
|
||||
sc->sc_transfer.data_error = 1;
|
||||
}
|
||||
|
||||
/* try again */
|
||||
goto tr_setup;
|
||||
}
|
||||
if (error) {
|
||||
if (err) {
|
||||
if (sc->sc_csw.bCSWStatus == 0) {
|
||||
/* set some default error code */
|
||||
sc->sc_csw.bCSWStatus = CSWSTATUS_FAILED;
|
||||
@ -621,20 +634,22 @@ ustorage_fs_t_bbb_command_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ustorage_fs_t_bbb_data_dump_callback(struct usb_xfer *xfer)
|
||||
ustorage_fs_t_bbb_data_dump_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ustorage_fs_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
DPRINTF("\n");
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.offset += xfer->actlen;
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.offset += actlen;
|
||||
|
||||
if ((xfer->actlen != xfer->sumlen) ||
|
||||
(sc->sc_transfer.data_rem == 0)) {
|
||||
if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
|
||||
/* short transfer or end of data */
|
||||
ustorage_fs_transfer_start(sc,
|
||||
USTORAGE_FS_T_BBB_STATUS);
|
||||
@ -649,45 +664,45 @@ ustorage_fs_t_bbb_data_dump_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
if (sc->sc_transfer.data_error) {
|
||||
sc->sc_transfer.data_error = 0;
|
||||
xfer->flags.stall_pipe = 1;
|
||||
} else {
|
||||
xfer->flags.stall_pipe = 0;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
}
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_xfer_set_frame_len(xfer, 0, max_bulk);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* If the pipe is already stalled, don't do another stall:
|
||||
*/
|
||||
if (!xfer->endpoint->is_stalled) {
|
||||
if (!usbd_xfer_is_stalled(xfer))
|
||||
sc->sc_transfer.data_error = 1;
|
||||
}
|
||||
|
||||
/* try again */
|
||||
goto tr_setup;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ustorage_fs_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
ustorage_fs_t_bbb_data_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ustorage_fs_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
DPRINTF("\n");
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.offset += xfer->actlen;
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.offset += actlen;
|
||||
|
||||
if ((xfer->actlen != xfer->sumlen) ||
|
||||
(sc->sc_transfer.data_rem == 0)) {
|
||||
if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
|
||||
/* short transfer or end of data */
|
||||
ustorage_fs_transfer_start(sc,
|
||||
USTORAGE_FS_T_BBB_STATUS);
|
||||
@ -702,45 +717,45 @@ ustorage_fs_t_bbb_data_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
if (sc->sc_transfer.data_error) {
|
||||
sc->sc_transfer.data_error = 0;
|
||||
xfer->flags.stall_pipe = 1;
|
||||
} else {
|
||||
xfer->flags.stall_pipe = 0;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
/* If the pipe is already stalled, don't do another stall */
|
||||
if (!xfer->endpoint->is_stalled) {
|
||||
if (!usbd_xfer_is_stalled(xfer))
|
||||
sc->sc_transfer.data_error = 1;
|
||||
}
|
||||
|
||||
/* try again */
|
||||
goto tr_setup;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ustorage_fs_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
ustorage_fs_t_bbb_data_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ustorage_fs_softc *sc = xfer->priv_sc;
|
||||
uint32_t max_bulk = xfer->max_data_length;
|
||||
struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
|
||||
uint32_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
int actlen, sumlen;
|
||||
|
||||
usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
|
||||
|
||||
DPRINTF("\n");
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
sc->sc_transfer.data_rem -= xfer->actlen;
|
||||
sc->sc_transfer.data_ptr += xfer->actlen;
|
||||
sc->sc_transfer.offset += xfer->actlen;
|
||||
sc->sc_transfer.data_rem -= actlen;
|
||||
sc->sc_transfer.data_ptr += actlen;
|
||||
sc->sc_transfer.offset += actlen;
|
||||
|
||||
if ((xfer->actlen != xfer->sumlen) ||
|
||||
(sc->sc_transfer.data_rem == 0)) {
|
||||
if (actlen != sumlen || sc->sc_transfer.data_rem == 0) {
|
||||
/* short transfer or end of data */
|
||||
ustorage_fs_transfer_start(sc,
|
||||
USTORAGE_FS_T_BBB_STATUS);
|
||||
@ -750,47 +765,43 @@ ustorage_fs_t_bbb_data_write_callback(struct usb_xfer *xfer)
|
||||
tr_setup:
|
||||
if (max_bulk >= sc->sc_transfer.data_rem) {
|
||||
max_bulk = sc->sc_transfer.data_rem;
|
||||
if (sc->sc_transfer.data_short) {
|
||||
xfer->flags.force_short_xfer = 1;
|
||||
} else {
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
}
|
||||
} else {
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
}
|
||||
if (sc->sc_transfer.data_short)
|
||||
usbd_xfer_set_flag(xfer, USB_FORCE_SHORT_XFER);
|
||||
else
|
||||
usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
|
||||
} else
|
||||
usbd_xfer_clr_flag(xfer, USB_FORCE_SHORT_XFER);
|
||||
|
||||
if (sc->sc_transfer.data_error) {
|
||||
sc->sc_transfer.data_error = 0;
|
||||
xfer->flags.stall_pipe = 1;
|
||||
} else {
|
||||
xfer->flags.stall_pipe = 0;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = max_bulk;
|
||||
usbd_set_frame_data(xfer, sc->sc_transfer.data_ptr, 0);
|
||||
usbd_xfer_set_frame_data(xfer, 0, sc->sc_transfer.data_ptr,
|
||||
max_bulk);
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default: /* Error */
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
/*
|
||||
* If the pipe is already stalled, don't do another
|
||||
* stall
|
||||
*/
|
||||
if (!xfer->endpoint->is_stalled) {
|
||||
if (!usbd_xfer_is_stalled(xfer))
|
||||
sc->sc_transfer.data_error = 1;
|
||||
}
|
||||
|
||||
/* try again */
|
||||
goto tr_setup;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
ustorage_fs_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
ustorage_fs_t_bbb_status_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct ustorage_fs_softc *sc = xfer->priv_sc;
|
||||
struct ustorage_fs_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
DPRINTF("\n");
|
||||
|
||||
@ -806,24 +817,22 @@ ustorage_fs_t_bbb_status_callback(struct usb_xfer *xfer)
|
||||
|
||||
if (sc->sc_transfer.data_error) {
|
||||
sc->sc_transfer.data_error = 0;
|
||||
xfer->flags.stall_pipe = 1;
|
||||
} else {
|
||||
xfer->flags.stall_pipe = 0;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = sizeof(sc->sc_csw);
|
||||
usbd_set_frame_data(xfer, &sc->sc_csw, 0);
|
||||
usbd_xfer_set_frame_data(xfer, 0, &sc->sc_csw,
|
||||
sizeof(sc->sc_csw));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
default:
|
||||
if (xfer->error == USB_ERR_CANCELLED) {
|
||||
if (error == USB_ERR_CANCELLED) {
|
||||
break;
|
||||
}
|
||||
/* If the pipe is already stalled, don't do another stall */
|
||||
if (!xfer->endpoint->is_stalled) {
|
||||
if (!usbd_xfer_is_stalled(xfer))
|
||||
sc->sc_transfer.data_error = 1;
|
||||
}
|
||||
|
||||
/* try again */
|
||||
goto tr_setup;
|
||||
}
|
||||
|
@ -29,24 +29,43 @@
|
||||
* USB templates.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
#include <dev/usb/usb_debug.h>
|
||||
|
||||
#include <dev/usb/usb_controller.h>
|
||||
#include <dev/usb/usb_bus.h>
|
||||
|
||||
#include <dev/usb/template/usb_template.h>
|
||||
|
||||
MODULE_DEPEND(usb_template, usb, 1, 1, 1);
|
||||
|
@ -31,11 +31,29 @@ __FBSDID("$FreeBSD$");
|
||||
* This file contains the USB templates for a CDC USB ethernet device.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usb_cdc.h>
|
||||
|
||||
#include <dev/usb/template/usb_template.h>
|
||||
|
||||
|
@ -31,10 +31,28 @@ __FBSDID("$FreeBSD$");
|
||||
* This file contains the USB templates for an USB Mass Storage Device.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/template/usb_template.h>
|
||||
|
||||
|
@ -38,11 +38,28 @@ __FBSDID("$FreeBSD$");
|
||||
* operating system the VID and PID of your device.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/template/usb_template.h>
|
||||
|
||||
#define MTP_BREQUEST 0x08
|
||||
|
@ -39,7 +39,45 @@
|
||||
#ifndef _USB_STANDARD_H_
|
||||
#define _USB_STANDARD_H_
|
||||
|
||||
#if defined(_KERNEL)
|
||||
#include "opt_usb.h"
|
||||
|
||||
/* Declare parent SYSCTL USB node. */
|
||||
#ifdef SYSCTL_DECL
|
||||
SYSCTL_DECL(_hw_usb);
|
||||
#endif
|
||||
|
||||
#include <sys/malloc.h>
|
||||
|
||||
MALLOC_DECLARE(M_USB);
|
||||
MALLOC_DECLARE(M_USBDEV);
|
||||
MALLOC_DECLARE(M_USBHC);
|
||||
#endif /* _KERNEL */
|
||||
|
||||
#include <dev/usb/usb_endian.h>
|
||||
#include <dev/usb/usb_freebsd.h>
|
||||
|
||||
#define USB_STACK_VERSION 2000 /* 2.0 */
|
||||
|
||||
/* Definition of some hardcoded USB constants. */
|
||||
|
||||
#define USB_MAX_IPACKET 8 /* initial USB packet size */
|
||||
#define USB_EP_MAX (2*16) /* hardcoded */
|
||||
#define USB_ROOT_HUB_ADDR 1 /* index */
|
||||
#define USB_MIN_DEVICES 2 /* unused + root HUB */
|
||||
#define USB_UNCONFIG_INDEX 0xFF /* internal use only */
|
||||
#define USB_IFACE_INDEX_ANY 0xFF /* internal use only */
|
||||
#define USB_START_ADDR 0 /* default USB device BUS address
|
||||
* after USB bus reset */
|
||||
#define USB_CONTROL_ENDPOINT 0 /* default control endpoint */
|
||||
|
||||
#define USB_FRAMES_PER_SECOND_FS 1000 /* full speed */
|
||||
#define USB_FRAMES_PER_SECOND_HS 8000 /* high speed */
|
||||
|
||||
#define USB_FS_BYTES_PER_HS_UFRAME 188 /* bytes */
|
||||
#define USB_HS_MICRO_FRAMES_MAX 8 /* units */
|
||||
|
||||
#define USB_ISOC_TIME_MAX 128 /* ms */
|
||||
|
||||
/*
|
||||
* Minimum time a device needs to be powered down to go through a
|
||||
@ -642,4 +680,51 @@ struct usb_port_status {
|
||||
} __packed;
|
||||
typedef struct usb_port_status usb_port_status_t;
|
||||
|
||||
/*
|
||||
* The "USB_SPEED" macros defines all the supported USB speeds.
|
||||
*/
|
||||
enum usb_dev_speed {
|
||||
USB_SPEED_VARIABLE,
|
||||
USB_SPEED_LOW,
|
||||
USB_SPEED_FULL,
|
||||
USB_SPEED_HIGH,
|
||||
USB_SPEED_SUPER,
|
||||
};
|
||||
#define USB_SPEED_MAX (USB_SPEED_SUPER+1)
|
||||
|
||||
/*
|
||||
* The "USB_REV" macros defines all the supported USB revisions.
|
||||
*/
|
||||
enum usb_revision {
|
||||
USB_REV_UNKNOWN,
|
||||
USB_REV_PRE_1_0,
|
||||
USB_REV_1_0,
|
||||
USB_REV_1_1,
|
||||
USB_REV_2_0,
|
||||
USB_REV_2_5,
|
||||
USB_REV_3_0
|
||||
};
|
||||
#define USB_REV_MAX (USB_REV_3_0+1)
|
||||
|
||||
/*
|
||||
* Supported host contoller modes.
|
||||
*/
|
||||
enum usb_hc_mode {
|
||||
USB_MODE_HOST, /* initiates transfers */
|
||||
USB_MODE_DEVICE, /* bus transfer target */
|
||||
USB_MODE_DUAL /* can be host or device */
|
||||
};
|
||||
#define USB_MODE_MAX (USB_MODE_DUAL+1)
|
||||
|
||||
/*
|
||||
* The "USB_MODE" macros defines all the supported device states.
|
||||
*/
|
||||
enum usb_dev_state {
|
||||
USB_STATE_DETACHED,
|
||||
USB_STATE_ATTACHED,
|
||||
USB_STATE_POWERED,
|
||||
USB_STATE_ADDRESSED,
|
||||
USB_STATE_CONFIGURED,
|
||||
};
|
||||
#define USB_STATE_MAX (USB_STATE_CONFIGURED+1)
|
||||
#endif /* _USB_STANDARD_H_ */
|
||||
|
@ -24,9 +24,29 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
@ -419,7 +439,7 @@ usb_pc_common_mem_cb(void *arg, bus_dma_segment_t *segs,
|
||||
pc->page_offset_buf = rem;
|
||||
pc->page_offset_end += rem;
|
||||
nseg--;
|
||||
#if (USB_DEBUG != 0)
|
||||
#ifdef USB_DEBUG
|
||||
if (rem != (USB_P2U(pc->buffer) & (USB_PAGE_SIZE - 1))) {
|
||||
/*
|
||||
* This check verifies that the physical address is correct:
|
||||
|
@ -149,24 +149,10 @@ void usb_bdma_done_event(struct usb_dma_parent_tag *udpt);
|
||||
void usb_bdma_post_sync(struct usb_xfer *xfer);
|
||||
void usb_bdma_pre_sync(struct usb_xfer *xfer);
|
||||
void usb_bdma_work_loop(struct usb_xfer_queue *pq);
|
||||
void usbd_frame_zero(struct usb_page_cache *cache, usb_frlength_t offset,
|
||||
usb_frlength_t len);
|
||||
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset,
|
||||
const void *ptr, usb_frlength_t len);
|
||||
int usbd_copy_in_user(struct usb_page_cache *cache, usb_frlength_t offset,
|
||||
const void *ptr, usb_frlength_t len);
|
||||
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset,
|
||||
void *ptr, usb_frlength_t len);
|
||||
int usbd_copy_out_user(struct usb_page_cache *cache, usb_frlength_t offset,
|
||||
void *ptr, usb_frlength_t len);
|
||||
void usb_dma_tag_setup(struct usb_dma_parent_tag *udpt,
|
||||
struct usb_dma_tag *udt, bus_dma_tag_t dmat, struct mtx *mtx,
|
||||
usb_dma_callback_t *func, uint8_t ndmabits, uint8_t nudt);
|
||||
void usb_dma_tag_unsetup(struct usb_dma_parent_tag *udpt);
|
||||
void usbd_get_page(struct usb_page_cache *pc, usb_frlength_t offset,
|
||||
struct usb_page_search *res);
|
||||
void usbd_m_copy_in(struct usb_page_cache *cache, usb_frlength_t dst_offset,
|
||||
struct mbuf *m, usb_size_t src_offset, usb_frlength_t src_len);
|
||||
void usb_pc_cpu_flush(struct usb_page_cache *pc);
|
||||
void usb_pc_cpu_invalidate(struct usb_page_cache *pc);
|
||||
void usb_pc_dmamap_destroy(struct usb_page_cache *pc);
|
||||
|
@ -25,10 +25,30 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
@ -39,7 +59,6 @@
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_hub.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
@ -1265,8 +1284,8 @@ usb_linux_complete(struct usb_xfer *xfer)
|
||||
{
|
||||
struct urb *urb;
|
||||
|
||||
urb = xfer->priv_fifo;
|
||||
xfer->priv_fifo = NULL;
|
||||
urb = usbd_xfer_get_priv(xfer);
|
||||
usbd_xfer_set_priv(xfer, NULL);
|
||||
if (urb->complete) {
|
||||
(urb->complete) (urb);
|
||||
}
|
||||
@ -1281,13 +1300,13 @@ usb_linux_complete(struct usb_xfer *xfer)
|
||||
* used.
|
||||
*------------------------------------------------------------------------*/
|
||||
static void
|
||||
usb_linux_isoc_callback(struct usb_xfer *xfer)
|
||||
usb_linux_isoc_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
usb_frlength_t max_frame = xfer->max_frame_size;
|
||||
usb_frlength_t offset;
|
||||
usb_frcount_t x;
|
||||
struct urb *urb = xfer->priv_fifo;
|
||||
struct usb_host_endpoint *uhe = xfer->priv_sc;
|
||||
struct urb *urb = usbd_xfer_get_priv(xfer);
|
||||
struct usb_host_endpoint *uhe = usbd_xfer_softc(xfer);
|
||||
struct usb_iso_packet_descriptor *uipd;
|
||||
|
||||
DPRINTF("\n");
|
||||
@ -1362,11 +1381,15 @@ usb_linux_isoc_callback(struct usb_xfer *xfer)
|
||||
DPRINTF("Already got a transfer\n");
|
||||
|
||||
/* already got a transfer (should not happen) */
|
||||
urb = xfer->priv_fifo;
|
||||
urb = usbd_xfer_get_priv(xfer);
|
||||
}
|
||||
|
||||
urb->bsd_isread = (uhe->desc.bEndpointAddress & UE_DIR_IN) ? 1 : 0;
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
/* set virtual address to load */
|
||||
usbd_xfer_set_frame_data(xfer, 0, urb->transfer_buffer, 0);
|
||||
}
|
||||
if (!(urb->bsd_isread)) {
|
||||
|
||||
/* copy out data with regard to the URB */
|
||||
@ -1375,7 +1398,7 @@ usb_linux_isoc_callback(struct usb_xfer *xfer)
|
||||
|
||||
for (x = 0; x < urb->number_of_packets; x++) {
|
||||
uipd = urb->iso_frame_desc + x;
|
||||
xfer->frlengths[x] = uipd->length;
|
||||
usbd_xfer_set_frame_len(xfer, x, uipd->length);
|
||||
if (!xfer->flags.ext_buffer) {
|
||||
usbd_copy_in(xfer->frbuffers, offset,
|
||||
USB_ADD_BYTES(urb->transfer_buffer,
|
||||
@ -1396,16 +1419,10 @@ usb_linux_isoc_callback(struct usb_xfer *xfer)
|
||||
|
||||
for (x = 0; x < urb->number_of_packets; x++) {
|
||||
uipd = urb->iso_frame_desc + x;
|
||||
xfer->frlengths[x] = max_frame;
|
||||
usbd_xfer_set_frame_len(xfer, x, max_frame);
|
||||
}
|
||||
}
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
/* set virtual address to load */
|
||||
usbd_set_frame_data(xfer,
|
||||
urb->transfer_buffer, 0);
|
||||
}
|
||||
xfer->priv_fifo = urb;
|
||||
usbd_xfer_set_priv(xfer, urb);
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
xfer->timeout = urb->timeout;
|
||||
xfer->nframes = urb->number_of_packets;
|
||||
@ -1449,15 +1466,15 @@ usb_linux_isoc_callback(struct usb_xfer *xfer)
|
||||
* callback is called.
|
||||
*------------------------------------------------------------------------*/
|
||||
static void
|
||||
usb_linux_non_isoc_callback(struct usb_xfer *xfer)
|
||||
usb_linux_non_isoc_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
enum {
|
||||
REQ_SIZE = sizeof(struct usb_device_request)
|
||||
};
|
||||
struct urb *urb = xfer->priv_fifo;
|
||||
struct usb_host_endpoint *uhe = xfer->priv_sc;
|
||||
struct urb *urb = usbd_xfer_get_priv(xfer);
|
||||
struct usb_host_endpoint *uhe = usbd_xfer_softc(xfer);
|
||||
uint8_t *ptr;
|
||||
usb_frlength_t max_bulk = xfer->max_data_length;
|
||||
usb_frlength_t max_bulk = usbd_xfer_max_len(xfer);
|
||||
uint8_t data_frame = xfer->flags_int.control_xfr ? 1 : 0;
|
||||
|
||||
DPRINTF("\n");
|
||||
@ -1469,7 +1486,7 @@ usb_linux_non_isoc_callback(struct usb_xfer *xfer)
|
||||
|
||||
/* don't transfer the setup packet again: */
|
||||
|
||||
xfer->frlengths[0] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, 0, 0);
|
||||
}
|
||||
if (urb->bsd_isread && (!xfer->flags.ext_buffer)) {
|
||||
/* copy in data with regard to the URB */
|
||||
@ -1513,7 +1530,7 @@ usb_linux_non_isoc_callback(struct usb_xfer *xfer)
|
||||
TAILQ_REMOVE(&uhe->bsd_urb_list, urb, bsd_urb_list);
|
||||
urb->bsd_urb_list.tqe_prev = NULL;
|
||||
|
||||
xfer->priv_fifo = urb;
|
||||
usbd_xfer_set_priv(xfer, urb);
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
xfer->timeout = urb->timeout;
|
||||
|
||||
@ -1526,14 +1543,13 @@ usb_linux_non_isoc_callback(struct usb_xfer *xfer)
|
||||
if (!xfer->flags.ext_buffer) {
|
||||
usbd_copy_in(xfer->frbuffers, 0,
|
||||
urb->setup_packet, REQ_SIZE);
|
||||
usbd_xfer_set_frame_len(xfer, 0, REQ_SIZE);
|
||||
} else {
|
||||
/* set virtual address to load */
|
||||
usbd_set_frame_data(xfer,
|
||||
urb->setup_packet, 0);
|
||||
usbd_xfer_set_frame_data(xfer, 0,
|
||||
urb->setup_packet, REQ_SIZE);
|
||||
}
|
||||
|
||||
xfer->frlengths[0] = REQ_SIZE;
|
||||
|
||||
ptr = urb->setup_packet;
|
||||
|
||||
/* setup data transfer direction and length */
|
||||
@ -1567,14 +1583,14 @@ usb_linux_non_isoc_callback(struct usb_xfer *xfer)
|
||||
|
||||
if (xfer->flags.ext_buffer) {
|
||||
/* set virtual address to load */
|
||||
usbd_set_frame_data(xfer, urb->bsd_data_ptr,
|
||||
data_frame);
|
||||
usbd_xfer_set_frame_data(xfer, data_frame,
|
||||
urb->bsd_data_ptr, max_bulk);
|
||||
} else if (!urb->bsd_isread) {
|
||||
/* copy out data with regard to the URB */
|
||||
usbd_copy_in(xfer->frbuffers + data_frame, 0,
|
||||
urb->bsd_data_ptr, max_bulk);
|
||||
usbd_xfer_set_frame_len(xfer, data_frame, max_bulk);
|
||||
}
|
||||
xfer->frlengths[data_frame] = max_bulk;
|
||||
if (xfer->flags_int.control_xfr) {
|
||||
if (max_bulk > 0) {
|
||||
xfer->nframes = 2;
|
||||
|
@ -39,46 +39,6 @@ typedef void (usb_complete_t)(struct urb *);
|
||||
#define USB_MAX_FULL_SPEED_ISOC_FRAMES (60 * 1)
|
||||
#define USB_MAX_HIGH_SPEED_ISOC_FRAMES (60 * 8)
|
||||
|
||||
/*
|
||||
* Linux compatible USB device drivers put their device information
|
||||
* into the "usb_device_id" structure using the "USB_DEVICE()" macro.
|
||||
* The "MODULE_DEVICE_TABLE()" macro can be used to export this
|
||||
* information to userland.
|
||||
*/
|
||||
struct usb_device_id {
|
||||
/* which fields to match against */
|
||||
uint16_t match_flags;
|
||||
#define USB_DEVICE_ID_MATCH_VENDOR 0x0001
|
||||
#define USB_DEVICE_ID_MATCH_PRODUCT 0x0002
|
||||
#define USB_DEVICE_ID_MATCH_DEV_LO 0x0004
|
||||
#define USB_DEVICE_ID_MATCH_DEV_HI 0x0008
|
||||
#define USB_DEVICE_ID_MATCH_DEV_CLASS 0x0010
|
||||
#define USB_DEVICE_ID_MATCH_DEV_SUBCLASS 0x0020
|
||||
#define USB_DEVICE_ID_MATCH_DEV_PROTOCOL 0x0040
|
||||
#define USB_DEVICE_ID_MATCH_INT_CLASS 0x0080
|
||||
#define USB_DEVICE_ID_MATCH_INT_SUBCLASS 0x0100
|
||||
#define USB_DEVICE_ID_MATCH_INT_PROTOCOL 0x0200
|
||||
|
||||
/* Used for product specific matches; the BCD range is inclusive */
|
||||
uint16_t idVendor;
|
||||
uint16_t idProduct;
|
||||
uint16_t bcdDevice_lo;
|
||||
uint16_t bcdDevice_hi;
|
||||
|
||||
/* Used for device class matches */
|
||||
uint8_t bDeviceClass;
|
||||
uint8_t bDeviceSubClass;
|
||||
uint8_t bDeviceProtocol;
|
||||
|
||||
/* Used for interface class matches */
|
||||
uint8_t bInterfaceClass;
|
||||
uint8_t bInterfaceSubClass;
|
||||
uint8_t bInterfaceProtocol;
|
||||
|
||||
/* Hook for driver specific information */
|
||||
unsigned long driver_info;
|
||||
};
|
||||
|
||||
#define USB_DEVICE_ID_MATCH_DEVICE \
|
||||
(USB_DEVICE_ID_MATCH_VENDOR | USB_DEVICE_ID_MATCH_PRODUCT)
|
||||
|
||||
|
@ -109,11 +109,11 @@ struct usb_pipe_methods {
|
||||
|
||||
/* Mandatory USB Device and Host mode callbacks: */
|
||||
|
||||
usb_callback_t *open;
|
||||
usb_callback_t *close;
|
||||
void (*open)(struct usb_xfer *);
|
||||
void (*close)(struct usb_xfer *);
|
||||
|
||||
usb_callback_t *enter;
|
||||
usb_callback_t *start;
|
||||
void (*enter)(struct usb_xfer *);
|
||||
void (*start)(struct usb_xfer *);
|
||||
|
||||
/* Optional */
|
||||
|
||||
|
@ -30,8 +30,28 @@
|
||||
* http://www.usb.org/developers/devclass_docs/
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
MALLOC_DEFINE(M_USB, "USB", "USB");
|
||||
MALLOC_DEFINE(M_USBDEV, "USBdev", "USB device");
|
||||
|
@ -31,193 +31,6 @@
|
||||
#ifndef _USB_CORE_H_
|
||||
#define _USB_CORE_H_
|
||||
|
||||
#define USB_STACK_VERSION 2000 /* 2.0 */
|
||||
|
||||
/* Allow defines in "opt_usb.h" to override configuration */
|
||||
|
||||
#include "opt_usb.h"
|
||||
#include "opt_bus.h"
|
||||
|
||||
/* Default USB configuration */
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall support
|
||||
* /dev/usb/x.y.z.
|
||||
*/
|
||||
#ifndef USB_HAVE_UGEN
|
||||
#define USB_HAVE_UGEN 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall support BUS-DMA.
|
||||
*/
|
||||
#ifndef USB_HAVE_BUSDMA
|
||||
#define USB_HAVE_BUSDMA 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall support the Linux
|
||||
* compatibility layer.
|
||||
*/
|
||||
#ifndef USB_HAVE_COMPAT_LINUX
|
||||
#define USB_HAVE_COMPAT_LINUX 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall support
|
||||
* userland data transfer via copyin() and copyout()
|
||||
*/
|
||||
#ifndef USB_HAVE_USER_IO
|
||||
#define USB_HAVE_USER_IO 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall support copy in via
|
||||
* bsd-mbufs to USB.
|
||||
*/
|
||||
#ifndef USB_HAVE_MBUF
|
||||
#define USB_HAVE_MBUF 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the code shall compile a table
|
||||
* describing USB vendor and product IDs.
|
||||
*/
|
||||
#ifndef USB_VERBOSE
|
||||
#define USB_VERBOSE 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if USB debugging support shall be
|
||||
* compiled for the USB core and all drivers.
|
||||
*/
|
||||
#ifndef USB_DEBUG
|
||||
#define USB_DEBUG 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if USB transaction translator support
|
||||
* shall be supported for the USB HUB and USB controller drivers.
|
||||
*/
|
||||
#ifndef USB_HAVE_TT_SUPPORT
|
||||
#define USB_HAVE_TT_SUPPORT 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the USB power daemon shall
|
||||
* be supported in the USB core.
|
||||
*/
|
||||
#ifndef USB_HAVE_POWERD
|
||||
#define USB_HAVE_POWERD 1
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The following macro defines if the USB autoinstall detection shall
|
||||
* be supported in the USB core.
|
||||
*/
|
||||
#ifndef USB_HAVE_MSCTEST
|
||||
#define USB_HAVE_MSCTEST 1
|
||||
#endif
|
||||
|
||||
#ifndef USB_TD_GET_PROC
|
||||
#define USB_TD_GET_PROC(td) (td)->td_proc
|
||||
#endif
|
||||
|
||||
#ifndef USB_PROC_GET_GID
|
||||
#define USB_PROC_GET_GID(td) (td)->p_pgid
|
||||
#endif
|
||||
|
||||
/* Include files */
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_defs.h>
|
||||
#include <dev/usb/usb_revision.h>
|
||||
|
||||
#include "usb_if.h"
|
||||
|
||||
#ifndef USB_HOST_ALIGN
|
||||
#define USB_HOST_ALIGN 8 /* bytes, must be power of two */
|
||||
#endif
|
||||
|
||||
#ifndef USB_FS_ISOC_UFRAME_MAX
|
||||
#define USB_FS_ISOC_UFRAME_MAX 4 /* exclusive unit */
|
||||
#endif
|
||||
|
||||
#if (USB_FS_ISOC_UFRAME_MAX > 6)
|
||||
#error "USB_FS_ISOC_UFRAME_MAX cannot be set higher than 6"
|
||||
#endif
|
||||
|
||||
#ifndef USB_BUS_MAX
|
||||
#define USB_BUS_MAX 256 /* units */
|
||||
#endif
|
||||
|
||||
#ifndef USB_MAX_DEVICES
|
||||
#define USB_MAX_DEVICES 128 /* units */
|
||||
#endif
|
||||
|
||||
#if (USB_MAX_DEVICES < USB_MIN_DEVICES)
|
||||
#error "Minimum number of devices is greater than maximum number of devices."
|
||||
#endif
|
||||
|
||||
#ifndef USB_IFACE_MAX
|
||||
#define USB_IFACE_MAX 32 /* units */
|
||||
#endif
|
||||
|
||||
#ifndef USB_FIFO_MAX
|
||||
#define USB_FIFO_MAX 128 /* units */
|
||||
#endif
|
||||
|
||||
#if (USB_FIFO_MAX & 1)
|
||||
#error "Number of FIFOs must be odd."
|
||||
#endif
|
||||
|
||||
#define USB_MAX_FS_ISOC_FRAMES_PER_XFER (120) /* units */
|
||||
#define USB_MAX_HS_ISOC_FRAMES_PER_XFER (8*120) /* units */
|
||||
|
||||
#ifndef USB_HUB_MAX_DEPTH
|
||||
#define USB_HUB_MAX_DEPTH 5
|
||||
#endif
|
||||
|
||||
#ifndef USB_EP0_BUFSIZE
|
||||
#define USB_EP0_BUFSIZE 1024 /* bytes */
|
||||
#endif
|
||||
|
||||
/* USB transfer states */
|
||||
|
||||
#define USB_ST_SETUP 0
|
||||
#define USB_ST_TRANSFERRED 1
|
||||
#define USB_ST_ERROR 2
|
||||
|
||||
/* USB handle request states */
|
||||
#define USB_HR_NOT_COMPLETE 0
|
||||
#define USB_HR_COMPLETE_OK 1
|
||||
#define USB_HR_COMPLETE_ERR 2
|
||||
|
||||
/*
|
||||
* The following macro will return the current state of an USB
|
||||
* transfer like defined by the "USB_ST_XXX" enums.
|
||||
*/
|
||||
#define USB_GET_STATE(xfer) ((xfer)->usb_state)
|
||||
|
||||
/*
|
||||
* The following macro will tell if an USB transfer is currently
|
||||
* receiving or transferring data.
|
||||
@ -226,30 +39,26 @@
|
||||
USB_MODE_DEVICE ? (((xfer)->endpointno & UE_DIR_IN) ? 0 : 1) : \
|
||||
(((xfer)->endpointno & UE_DIR_IN) ? 1 : 0))
|
||||
|
||||
/*
|
||||
* The following macros are used used to convert milliseconds into
|
||||
* HZ. We use 1024 instead of 1000 milliseconds per second to save a
|
||||
* full division.
|
||||
*/
|
||||
#define USB_MS_HZ 1024
|
||||
|
||||
#define USB_MS_TO_TICKS(ms) \
|
||||
(((uint32_t)((((uint32_t)(ms)) * ((uint32_t)(hz))) + USB_MS_HZ - 1)) / USB_MS_HZ)
|
||||
|
||||
/* macros */
|
||||
|
||||
#define usb_callout_init_mtx(c,m,f) callout_init_mtx(&(c)->co,m,f)
|
||||
#define usb_callout_reset(c,t,f,d) callout_reset(&(c)->co,t,f,d)
|
||||
#define usb_callout_stop(c) callout_stop(&(c)->co)
|
||||
#define usb_callout_drain(c) callout_drain(&(c)->co)
|
||||
#define usb_callout_pending(c) callout_pending(&(c)->co)
|
||||
|
||||
#define USB_BUS_LOCK(_b) mtx_lock(&(_b)->bus_mtx)
|
||||
#define USB_BUS_UNLOCK(_b) mtx_unlock(&(_b)->bus_mtx)
|
||||
#define USB_BUS_LOCK_ASSERT(_b, _t) mtx_assert(&(_b)->bus_mtx, _t)
|
||||
#define USB_XFER_LOCK(_x) mtx_lock((_x)->xroot->xfer_mtx)
|
||||
#define USB_XFER_UNLOCK(_x) mtx_unlock((_x)->xroot->xfer_mtx)
|
||||
#define USB_XFER_LOCK_ASSERT(_x, _t) mtx_assert((_x)->xroot->xfer_mtx, _t)
|
||||
|
||||
/* helper for converting pointers to integers */
|
||||
#define USB_P2U(ptr) \
|
||||
(((const uint8_t *)(ptr)) - ((const uint8_t *)0))
|
||||
|
||||
/* helper for computing offsets */
|
||||
#define USB_ADD_BYTES(ptr,size) \
|
||||
((void *)(USB_P2U(ptr) + (size)))
|
||||
|
||||
/* debug macro */
|
||||
#define USB_ASSERT KASSERT
|
||||
|
||||
/* structure prototypes */
|
||||
|
||||
struct file;
|
||||
@ -263,81 +72,8 @@ struct usb_xfer_root;
|
||||
|
||||
/* typedefs */
|
||||
|
||||
typedef void (usb_callback_t)(struct usb_xfer *);
|
||||
|
||||
#ifndef USB_HAVE_USB_ERROR_T
|
||||
typedef uint8_t usb_error_t; /* see "USB_ERR_XXX" */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_TIMEOUT_T
|
||||
typedef uint32_t usb_timeout_t; /* milliseconds */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_FRLENGTH_T
|
||||
typedef uint32_t usb_frlength_t; /* bytes */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_FRCOUNT_T
|
||||
typedef uint32_t usb_frcount_t; /* units */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_SIZE_T
|
||||
typedef uint32_t usb_size_t; /* bytes */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_TICKS_T
|
||||
typedef uint32_t usb_ticks_t; /* system defined */
|
||||
#endif
|
||||
|
||||
#ifndef USB_HAVE_POWER_MASK_T
|
||||
typedef uint16_t usb_power_mask_t; /* see "USB_HW_POWER_XXX" */
|
||||
#endif
|
||||
|
||||
typedef usb_error_t (usb_handle_req_t)(struct usb_device *,
|
||||
struct usb_device_request *, const void **, uint16_t *);
|
||||
|
||||
/* structures */
|
||||
|
||||
/*
|
||||
* Common queue structure for USB transfers.
|
||||
*/
|
||||
struct usb_xfer_queue {
|
||||
TAILQ_HEAD(, usb_xfer) head;
|
||||
struct usb_xfer *curr; /* current USB transfer processed */
|
||||
void (*command) (struct usb_xfer_queue *pq);
|
||||
uint8_t recurse_1:1;
|
||||
uint8_t recurse_2:1;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following is a wrapper for the callout structure to ease
|
||||
* porting the code to other platforms.
|
||||
*/
|
||||
struct usb_callout {
|
||||
struct callout co;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines a set of USB transfer flags.
|
||||
*/
|
||||
struct usb_xfer_flags {
|
||||
uint8_t force_short_xfer:1; /* force a short transmit transfer
|
||||
* last */
|
||||
uint8_t short_xfer_ok:1; /* allow short receive transfers */
|
||||
uint8_t short_frames_ok:1; /* allow short frames */
|
||||
uint8_t pipe_bof:1; /* block pipe on failure */
|
||||
uint8_t proxy_buffer:1; /* makes buffer size a factor of
|
||||
* "max_frame_size" */
|
||||
uint8_t ext_buffer:1; /* uses external DMA buffer */
|
||||
uint8_t manual_status:1; /* non automatic status stage on
|
||||
* control transfers */
|
||||
uint8_t no_pipe_ok:1; /* set if "USB_ERR_NO_PIPE" error can
|
||||
* be ignored */
|
||||
uint8_t stall_pipe:1; /* set if the endpoint belonging to
|
||||
* this USB transfer should be stalled
|
||||
* before starting this transfer! */
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines a set of internal USB transfer
|
||||
* flags.
|
||||
@ -378,26 +114,6 @@ struct usb_xfer_flags_int {
|
||||
* cancelled immediately */
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure define an USB configuration, that basically
|
||||
* is used when setting up an USB transfer.
|
||||
*/
|
||||
struct usb_config {
|
||||
usb_callback_t *callback; /* USB transfer callback */
|
||||
usb_frlength_t bufsize; /* total pipe buffer size in bytes */
|
||||
usb_frcount_t frames; /* maximum number of USB frames */
|
||||
usb_timeout_t interval; /* interval in milliseconds */
|
||||
#define USB_DEFAULT_INTERVAL 0
|
||||
usb_timeout_t timeout; /* transfer timeout in milliseconds */
|
||||
struct usb_xfer_flags flags; /* transfer flags */
|
||||
enum usb_hc_mode usb_mode; /* host or device mode */
|
||||
uint8_t type; /* pipe type */
|
||||
uint8_t endpoint; /* pipe number */
|
||||
uint8_t direction; /* pipe direction */
|
||||
uint8_t ep_index; /* pipe index match to use */
|
||||
uint8_t if_index; /* "ifaces" index to use */
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines an USB transfer.
|
||||
*/
|
||||
@ -428,8 +144,6 @@ struct usb_xfer {
|
||||
usb_frlength_t sumlen; /* sum of all lengths in bytes */
|
||||
usb_frlength_t actlen; /* actual length in bytes */
|
||||
usb_timeout_t timeout; /* milliseconds */
|
||||
#define USB_NO_TIMEOUT 0
|
||||
#define USB_DEFAULT_TIMEOUT 5000 /* 5000 ms = 5 seconds */
|
||||
|
||||
usb_frcount_t max_frame_count; /* initial value of "nframes" after
|
||||
* setup */
|
||||
@ -457,89 +171,14 @@ struct usb_xfer {
|
||||
struct usb_xfer_flags_int flags_int;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure keeps information that is used to match
|
||||
* against an array of "usb_device_id" elements.
|
||||
*/
|
||||
struct usbd_lookup_info {
|
||||
uint16_t idVendor;
|
||||
uint16_t idProduct;
|
||||
uint16_t bcdDevice;
|
||||
uint8_t bDeviceClass;
|
||||
uint8_t bDeviceSubClass;
|
||||
uint8_t bDeviceProtocol;
|
||||
uint8_t bInterfaceClass;
|
||||
uint8_t bInterfaceSubClass;
|
||||
uint8_t bInterfaceProtocol;
|
||||
uint8_t bIfaceIndex;
|
||||
uint8_t bIfaceNum;
|
||||
uint8_t bConfigIndex;
|
||||
uint8_t bConfigNum;
|
||||
};
|
||||
|
||||
/* Structure used by probe and attach */
|
||||
|
||||
struct usb_attach_arg {
|
||||
struct usbd_lookup_info info;
|
||||
device_t temp_dev; /* for internal use */
|
||||
unsigned long driver_info; /* for internal use */
|
||||
void *driver_ivar;
|
||||
struct usb_device *device; /* current device */
|
||||
struct usb_interface *iface; /* current interface */
|
||||
enum usb_hc_mode usb_mode; /* host or device mode */
|
||||
uint8_t port;
|
||||
uint8_t use_generic; /* hint for generic drivers */
|
||||
};
|
||||
|
||||
/* external variables */
|
||||
|
||||
MALLOC_DECLARE(M_USB);
|
||||
MALLOC_DECLARE(M_USBDEV);
|
||||
MALLOC_DECLARE(M_USBHC);
|
||||
|
||||
extern struct mtx usb_ref_lock;
|
||||
|
||||
/* typedefs */
|
||||
|
||||
typedef struct malloc_type *usb_malloc_type;
|
||||
|
||||
/* prototypes */
|
||||
|
||||
const char *usbd_errstr(usb_error_t error);
|
||||
const char *usb_statestr(enum usb_dev_state state);
|
||||
struct usb_config_descriptor *usbd_get_config_descriptor(
|
||||
struct usb_device *udev);
|
||||
struct usb_device_descriptor *usbd_get_device_descriptor(
|
||||
struct usb_device *udev);
|
||||
struct usb_interface *usbd_get_iface(struct usb_device *udev,
|
||||
uint8_t iface_index);
|
||||
struct usb_interface_descriptor *usbd_get_interface_descriptor(
|
||||
struct usb_interface *iface);
|
||||
uint8_t usbd_clear_stall_callback(struct usb_xfer *xfer1,
|
||||
struct usb_xfer *xfer2);
|
||||
uint8_t usbd_get_interface_altindex(struct usb_interface *iface);
|
||||
usb_error_t usbd_set_alt_interface_index(struct usb_device *udev,
|
||||
uint8_t iface_index, uint8_t alt_index);
|
||||
enum usb_hc_mode usbd_get_mode(struct usb_device *udev);
|
||||
enum usb_dev_speed usbd_get_speed(struct usb_device *udev);
|
||||
uint32_t usbd_get_isoc_fps(struct usb_device *udev);
|
||||
usb_error_t usbd_transfer_setup(struct usb_device *udev,
|
||||
const uint8_t *ifaces, struct usb_xfer **pxfer,
|
||||
const struct usb_config *setup_start, uint16_t n_setup,
|
||||
void *priv_sc, struct mtx *priv_mtx);
|
||||
void usbd_set_frame_data(struct usb_xfer *xfer, void *ptr,
|
||||
usb_frcount_t frindex);
|
||||
void usbd_set_frame_offset(struct usb_xfer *xfer, usb_frlength_t offset,
|
||||
usb_frcount_t frindex);
|
||||
void usbd_transfer_submit(struct usb_xfer *xfer);
|
||||
void usbd_transfer_clear_stall(struct usb_xfer *xfer);
|
||||
void usbd_transfer_drain(struct usb_xfer *xfer);
|
||||
void usbd_transfer_set_stall(struct usb_xfer *xfer);
|
||||
uint8_t usbd_transfer_pending(struct usb_xfer *xfer);
|
||||
void usbd_transfer_start(struct usb_xfer *xfer);
|
||||
void usbd_transfer_stop(struct usb_xfer *xfer);
|
||||
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup);
|
||||
void usbd_set_parent_iface(struct usb_device *udev, uint8_t iface_index,
|
||||
uint8_t parent_index);
|
||||
uint8_t usbd_get_bus_index(struct usb_device *udev);
|
||||
uint8_t usbd_get_device_index(struct usb_device *udev);
|
||||
void usbd_set_power_mode(struct usb_device *udev, uint8_t power_mode);
|
||||
uint8_t usbd_device_attached(struct usb_device *udev);
|
||||
|
||||
#endif /* _USB_CORE_H_ */
|
||||
|
@ -24,7 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
@ -33,6 +54,9 @@
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
|
||||
#include <ddb/ddb.h>
|
||||
#include <ddb/db_sym.h>
|
||||
|
||||
/*
|
||||
* Define this unconditionally in case a kernel module is loaded that
|
||||
* has been compiled with debugging options.
|
||||
|
@ -29,9 +29,6 @@
|
||||
#ifndef _USB_DEBUG_H_
|
||||
#define _USB_DEBUG_H_
|
||||
|
||||
/* Declare parent SYSCTL USB node. */
|
||||
SYSCTL_DECL(_hw_usb);
|
||||
|
||||
/* Declare global USB debug variable. */
|
||||
extern int usb_debug;
|
||||
|
||||
|
@ -27,16 +27,39 @@
|
||||
* usb_dev.c - An abstraction layer for creating devices under /dev/...
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_fifo_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
@ -56,7 +79,7 @@
|
||||
|
||||
#if USB_HAVE_UGEN
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int usb_fifo_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, dev, CTLFLAG_RW, 0, "USB device");
|
||||
@ -2196,4 +2219,10 @@ usb_fifo_set_close_zlp(struct usb_fifo *f, uint8_t onoff)
|
||||
/* send a Zero Length Packet, ZLP, before close */
|
||||
f->flag_short = onoff;
|
||||
}
|
||||
|
||||
void *
|
||||
usb_fifo_softc(struct usb_fifo *f)
|
||||
{
|
||||
return (f->priv_sc0);
|
||||
}
|
||||
#endif /* USB_HAVE_UGEN */
|
||||
|
@ -28,25 +28,14 @@
|
||||
#define _USB_DEV_H_
|
||||
|
||||
#include <sys/file.h>
|
||||
#include <sys/vnode.h>
|
||||
#include <sys/selinfo.h>
|
||||
#include <sys/poll.h>
|
||||
#include <sys/signalvar.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/proc.h>
|
||||
|
||||
#define USB_FIFO_TX 0
|
||||
#define USB_FIFO_RX 1
|
||||
|
||||
struct usb_fifo;
|
||||
struct usb_mbuf;
|
||||
|
||||
typedef int (usb_fifo_open_t)(struct usb_fifo *fifo, int fflags);
|
||||
typedef void (usb_fifo_close_t)(struct usb_fifo *fifo, int fflags);
|
||||
typedef int (usb_fifo_ioctl_t)(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags);
|
||||
typedef void (usb_fifo_cmd_t)(struct usb_fifo *fifo);
|
||||
typedef void (usb_fifo_filter_t)(struct usb_fifo *fifo, struct usb_mbuf *m);
|
||||
|
||||
struct usb_symlink {
|
||||
TAILQ_ENTRY(usb_symlink) sym_entry;
|
||||
char src_path[32]; /* Source path - including terminating
|
||||
@ -57,30 +46,6 @@ struct usb_symlink {
|
||||
uint8_t dst_len; /* String length */
|
||||
};
|
||||
|
||||
/*
|
||||
* Locking note for the following functions. All the
|
||||
* "usb_fifo_cmd_t" and "usb_fifo_filter_t" functions are called
|
||||
* locked. The others are called unlocked.
|
||||
*/
|
||||
struct usb_fifo_methods {
|
||||
usb_fifo_open_t *f_open;
|
||||
usb_fifo_close_t *f_close;
|
||||
usb_fifo_ioctl_t *f_ioctl;
|
||||
/*
|
||||
* NOTE: The post-ioctl callback is called after the USB reference
|
||||
* gets locked in the IOCTL handler:
|
||||
*/
|
||||
usb_fifo_ioctl_t *f_ioctl_post;
|
||||
usb_fifo_cmd_t *f_start_read;
|
||||
usb_fifo_cmd_t *f_stop_read;
|
||||
usb_fifo_cmd_t *f_start_write;
|
||||
usb_fifo_cmd_t *f_stop_write;
|
||||
usb_fifo_filter_t *f_filter_read;
|
||||
usb_fifo_filter_t *f_filter_write;
|
||||
const char *basename[4];
|
||||
const char *postfix[4];
|
||||
};
|
||||
|
||||
/*
|
||||
* Private per-device information.
|
||||
*/
|
||||
@ -95,6 +60,18 @@ struct usb_cdev_privdata {
|
||||
uint8_t fifo_index; /* FIFO index */
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines a minimum re-implementation of the
|
||||
* ifqueue structure in the kernel.
|
||||
*/
|
||||
struct usb_ifqueue {
|
||||
struct usb_mbuf *ifq_head;
|
||||
struct usb_mbuf *ifq_tail;
|
||||
|
||||
usb_size_t ifq_len;
|
||||
usb_size_t ifq_maxlen;
|
||||
};
|
||||
|
||||
/*
|
||||
* Private per-device and per-thread reference information
|
||||
*/
|
||||
@ -162,42 +139,12 @@ struct usb_fifo {
|
||||
#define USB_FIFO_REF_MAX 0xFF
|
||||
};
|
||||
|
||||
struct usb_fifo_sc {
|
||||
struct usb_fifo *fp[2];
|
||||
struct cdev* dev;
|
||||
};
|
||||
|
||||
extern struct cdevsw usb_devsw;
|
||||
|
||||
int usb_fifo_wait(struct usb_fifo *fifo);
|
||||
void usb_fifo_signal(struct usb_fifo *fifo);
|
||||
int usb_fifo_alloc_buffer(struct usb_fifo *f, uint32_t bufsize,
|
||||
uint16_t nbuf);
|
||||
void usb_fifo_free_buffer(struct usb_fifo *f);
|
||||
int usb_fifo_attach(struct usb_device *udev, void *priv_sc,
|
||||
struct mtx *priv_mtx, struct usb_fifo_methods *pm,
|
||||
struct usb_fifo_sc *f_sc, uint16_t unit, uint16_t subunit,
|
||||
uint8_t iface_index, uid_t uid, gid_t gid, int mode);
|
||||
void usb_fifo_detach(struct usb_fifo_sc *f_sc);
|
||||
uint32_t usb_fifo_put_bytes_max(struct usb_fifo *fifo);
|
||||
void usb_fifo_put_data(struct usb_fifo *fifo, struct usb_page_cache *pc,
|
||||
usb_frlength_t offset, usb_frlength_t len, uint8_t what);
|
||||
void usb_fifo_put_data_linear(struct usb_fifo *fifo, void *ptr,
|
||||
usb_size_t len, uint8_t what);
|
||||
uint8_t usb_fifo_put_data_buffer(struct usb_fifo *f, void *ptr, usb_size_t len);
|
||||
void usb_fifo_put_data_error(struct usb_fifo *fifo);
|
||||
uint8_t usb_fifo_get_data(struct usb_fifo *fifo, struct usb_page_cache *pc,
|
||||
usb_frlength_t offset, usb_frlength_t len, usb_frlength_t *actlen,
|
||||
uint8_t what);
|
||||
uint8_t usb_fifo_get_data_linear(struct usb_fifo *fifo, void *ptr,
|
||||
usb_size_t len, usb_size_t *actlen, uint8_t what);
|
||||
uint8_t usb_fifo_get_data_buffer(struct usb_fifo *f, void **pptr,
|
||||
usb_size_t *plen);
|
||||
void usb_fifo_get_data_error(struct usb_fifo *fifo);
|
||||
uint8_t usb_fifo_opened(struct usb_fifo *fifo);
|
||||
void usb_fifo_free(struct usb_fifo *f);
|
||||
void usb_fifo_reset(struct usb_fifo *f);
|
||||
void usb_fifo_wakeup(struct usb_fifo *f);
|
||||
struct usb_symlink *usb_alloc_symlink(const char *target);
|
||||
void usb_free_symlink(struct usb_symlink *ps);
|
||||
int usb_read_symlink(uint8_t *user_ptr, uint32_t startentry,
|
||||
|
@ -24,9 +24,31 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include "usbdevs.h"
|
||||
|
||||
@ -38,12 +60,10 @@
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_busdma.h>
|
||||
#include <dev/usb/usb_transfer.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_dynamic.h>
|
||||
#include <dev/usb/usb_hub.h>
|
||||
#include <dev/usb/usb_util.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_msctest.h>
|
||||
#if USB_HAVE_UGEN
|
||||
#include <dev/usb/usb_dev.h>
|
||||
@ -277,7 +297,7 @@ usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index,
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* usb_interface_count
|
||||
* usbd_interface_count
|
||||
*
|
||||
* This function stores the number of USB interfaces excluding
|
||||
* alternate settings, which the USB config descriptor reports into
|
||||
@ -288,7 +308,7 @@ usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index,
|
||||
* Else: Failure
|
||||
*------------------------------------------------------------------------*/
|
||||
usb_error_t
|
||||
usb_interface_count(struct usb_device *udev, uint8_t *count)
|
||||
usbd_interface_count(struct usb_device *udev, uint8_t *count)
|
||||
{
|
||||
if (udev->cdesc == NULL) {
|
||||
*count = 0;
|
||||
@ -2105,7 +2125,7 @@ usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len)
|
||||
}
|
||||
}
|
||||
|
||||
#if USB_VERBOSE
|
||||
#ifdef USB_VERBOSE
|
||||
/*
|
||||
* Descriptions of of known vendors and devices ("products").
|
||||
*/
|
||||
@ -2127,7 +2147,7 @@ static void
|
||||
usbd_set_device_strings(struct usb_device *udev)
|
||||
{
|
||||
struct usb_device_descriptor *udd = &udev->ddesc;
|
||||
#if USB_VERBOSE
|
||||
#ifdef USB_VERBOSE
|
||||
const struct usb_knowndev *kdp;
|
||||
#endif
|
||||
char temp[64];
|
||||
@ -2159,7 +2179,7 @@ usbd_set_device_strings(struct usb_device *udev)
|
||||
if (temp[0] != '\0')
|
||||
udev->product = strdup(temp, M_USB);
|
||||
|
||||
#if USB_VERBOSE
|
||||
#ifdef USB_VERBOSE
|
||||
if (udev->manufacturer == NULL || udev->product == NULL) {
|
||||
for (kdp = usb_knowndevs; kdp->vendorname != NULL; kdp++) {
|
||||
if (kdp->vendor == vendor_id &&
|
||||
|
@ -76,44 +76,6 @@ struct usb_host_interface {
|
||||
uint8_t bsd_iface_index;
|
||||
} __aligned(USB_HOST_ALIGN);
|
||||
|
||||
/*
|
||||
* The following structure defines an USB endpoint
|
||||
* USB endpoint.
|
||||
*/
|
||||
struct usb_endpoint {
|
||||
struct usb_xfer_queue endpoint_q; /* queue of USB transfers */
|
||||
|
||||
struct usb_endpoint_descriptor *edesc;
|
||||
struct usb_pipe_methods *methods; /* set by HC driver */
|
||||
|
||||
uint16_t isoc_next;
|
||||
uint16_t refcount;
|
||||
|
||||
uint8_t toggle_next:1; /* next data toggle value */
|
||||
uint8_t is_stalled:1; /* set if endpoint is stalled */
|
||||
uint8_t is_synced:1; /* set if we a synchronised */
|
||||
uint8_t unused:5;
|
||||
uint8_t iface_index; /* not used by "default endpoint" */
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines an USB interface.
|
||||
*/
|
||||
struct usb_interface {
|
||||
struct usb_interface_descriptor *idesc;
|
||||
device_t subdev;
|
||||
uint8_t alt_index;
|
||||
uint8_t parent_iface_index;
|
||||
|
||||
/* Linux compat */
|
||||
struct usb_host_interface *altsetting;
|
||||
struct usb_host_interface *cur_altsetting;
|
||||
struct usb_device *linux_udev;
|
||||
void *bsd_priv_sc; /* device specific information */
|
||||
uint8_t num_altsetting; /* number of alternate settings */
|
||||
uint8_t bsd_iface_index;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines the USB device flags.
|
||||
*/
|
||||
@ -228,14 +190,11 @@ extern int usb_template;
|
||||
|
||||
/* function prototypes */
|
||||
|
||||
const char *usb_statestr(enum usb_dev_state state);
|
||||
struct usb_device *usb_alloc_device(device_t parent_dev, struct usb_bus *bus,
|
||||
struct usb_device *parent_hub, uint8_t depth,
|
||||
uint8_t port_index, uint8_t port_no,
|
||||
enum usb_dev_speed speed, enum usb_hc_mode mode);
|
||||
struct usb_endpoint *usbd_get_endpoint(struct usb_device *udev, uint8_t iface_index,
|
||||
const struct usb_config *setup);
|
||||
struct usb_endpoint *usbd_get_ep_by_addr(struct usb_device *udev, uint8_t ea_val);
|
||||
usb_error_t usb_interface_count(struct usb_device *udev, uint8_t *count);
|
||||
usb_error_t usb_probe_and_attach(struct usb_device *udev,
|
||||
uint8_t iface_index);
|
||||
usb_error_t usb_reset_iface_endpoints(struct usb_device *udev,
|
||||
@ -247,9 +206,6 @@ usb_error_t usb_suspend_resume(struct usb_device *udev,
|
||||
uint8_t do_suspend);
|
||||
void usb_devinfo(struct usb_device *udev, char *dst_ptr, uint16_t dst_len);
|
||||
void usb_free_device(struct usb_device *, uint8_t);
|
||||
void *usbd_find_descriptor(struct usb_device *udev, void *id,
|
||||
uint8_t iface_index, uint8_t type, uint8_t type_mask,
|
||||
uint8_t subtype, uint8_t subtype_mask);
|
||||
void usb_linux_free_device(struct usb_device *dev);
|
||||
uint8_t usb_peer_can_wakeup(struct usb_device *udev);
|
||||
struct usb_endpoint *usb_endpoint_foreach(struct usb_device *udev, struct usb_endpoint *ep);
|
||||
|
@ -24,9 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
@ -86,7 +105,7 @@ usb_temp_unsetup_w(struct usb_device *udev)
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t
|
||||
static usb_error_t
|
||||
usb_test_huawei_autoinst_w(struct usb_device *udev,
|
||||
struct usb_attach_arg *uaa)
|
||||
{
|
||||
|
@ -62,6 +62,4 @@ void usb_temp_unload(void *);
|
||||
void usb_quirk_unload(void *);
|
||||
void usb_bus_unload(void *);
|
||||
|
||||
uint8_t usb_test_quirk(const struct usb_attach_arg *uaa, uint16_t quirk);
|
||||
|
||||
#endif /* _USB_DYNAMIC_H_ */
|
||||
|
@ -24,10 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
static const char* usb_errstr_table[USB_ERR_MAX] = {
|
||||
[USB_ERR_NORMAL_COMPLETION] = "USB_ERR_NORMAL_COMPLETION",
|
||||
|
@ -1,63 +0,0 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_ERROR_H_
|
||||
#define _USB_ERROR_H_
|
||||
|
||||
enum { /* keep in sync with usb_errstr_table */
|
||||
USB_ERR_NORMAL_COMPLETION = 0,
|
||||
USB_ERR_PENDING_REQUESTS, /* 1 */
|
||||
USB_ERR_NOT_STARTED, /* 2 */
|
||||
USB_ERR_INVAL, /* 3 */
|
||||
USB_ERR_NOMEM, /* 4 */
|
||||
USB_ERR_CANCELLED, /* 5 */
|
||||
USB_ERR_BAD_ADDRESS, /* 6 */
|
||||
USB_ERR_BAD_BUFSIZE, /* 7 */
|
||||
USB_ERR_BAD_FLAG, /* 8 */
|
||||
USB_ERR_NO_CALLBACK, /* 9 */
|
||||
USB_ERR_IN_USE, /* 10 */
|
||||
USB_ERR_NO_ADDR, /* 11 */
|
||||
USB_ERR_NO_PIPE, /* 12 */
|
||||
USB_ERR_ZERO_NFRAMES, /* 13 */
|
||||
USB_ERR_ZERO_MAXP, /* 14 */
|
||||
USB_ERR_SET_ADDR_FAILED, /* 15 */
|
||||
USB_ERR_NO_POWER, /* 16 */
|
||||
USB_ERR_TOO_DEEP, /* 17 */
|
||||
USB_ERR_IOERROR, /* 18 */
|
||||
USB_ERR_NOT_CONFIGURED, /* 19 */
|
||||
USB_ERR_TIMEOUT, /* 20 */
|
||||
USB_ERR_SHORT_XFER, /* 21 */
|
||||
USB_ERR_STALLED, /* 22 */
|
||||
USB_ERR_INTERRUPTED, /* 23 */
|
||||
USB_ERR_DMA_LOAD_FAILED, /* 24 */
|
||||
USB_ERR_BAD_CONTEXT, /* 25 */
|
||||
USB_ERR_NO_ROOT_HUB, /* 26 */
|
||||
USB_ERR_NO_INTR_THREAD, /* 27 */
|
||||
USB_ERR_NOT_LOCKED, /* 28 */
|
||||
USB_ERR_MAX
|
||||
};
|
||||
|
||||
#endif /* _USB_ERROR_H_ */
|
@ -24,38 +24,48 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_DEFS_H_
|
||||
#define _USB_DEFS_H_
|
||||
/*
|
||||
* Including this file is mandatory for all USB related c-files in the kernel.
|
||||
*/
|
||||
|
||||
/* Definition of some hardcoded USB constants. */
|
||||
#ifndef _USB_FREEBSD_H_
|
||||
#define _USB_FREEBSD_H_
|
||||
|
||||
#define USB_MAX_IPACKET 8 /* initial USB packet size */
|
||||
/* Default USB configuration */
|
||||
#define USB_HAVE_UGEN 1
|
||||
#define USB_HAVE_BUSDMA 1
|
||||
#define USB_HAVE_COMPAT_LINUX 1
|
||||
#define USB_HAVE_USER_IO 1
|
||||
#define USB_HAVE_MBUF 1
|
||||
#define USB_HAVE_TT_SUPPORT 1
|
||||
#define USB_HAVE_POWERD 1
|
||||
#define USB_HAVE_MSCTEST 1
|
||||
|
||||
#define USB_EP_MAX (2*16) /* hardcoded */
|
||||
#define USB_TD_GET_PROC(td) (td)->td_proc
|
||||
#define USB_PROC_GET_GID(td) (td)->p_pgid
|
||||
|
||||
#define USB_ROOT_HUB_ADDR 1 /* index */
|
||||
#define USB_HOST_ALIGN 8 /* bytes, must be power of two */
|
||||
#define USB_FS_ISOC_UFRAME_MAX 4 /* exclusive unit */
|
||||
#define USB_BUS_MAX 256 /* units */
|
||||
#define USB_MAX_DEVICES 128 /* units */
|
||||
#define USB_IFACE_MAX 32 /* units */
|
||||
#define USB_FIFO_MAX 128 /* units */
|
||||
|
||||
#define USB_MIN_DEVICES 2 /* unused + root HUB */
|
||||
#define USB_MAX_FS_ISOC_FRAMES_PER_XFER (120) /* units */
|
||||
#define USB_MAX_HS_ISOC_FRAMES_PER_XFER (8*120) /* units */
|
||||
|
||||
#define USB_UNCONFIG_INDEX 0xFF /* internal use only */
|
||||
#define USB_IFACE_INDEX_ANY 0xFF /* internal use only */
|
||||
#define USB_HUB_MAX_DEPTH 5
|
||||
#define USB_EP0_BUFSIZE 1024 /* bytes */
|
||||
|
||||
#define USB_START_ADDR 0 /* default USB device BUS address
|
||||
* after USB bus reset */
|
||||
|
||||
#define USB_CONTROL_ENDPOINT 0 /* default control endpoint */
|
||||
|
||||
#define USB_FRAMES_PER_SECOND_FS 1000 /* full speed */
|
||||
#define USB_FRAMES_PER_SECOND_HS 8000 /* high speed */
|
||||
|
||||
#define USB_FS_BYTES_PER_HS_UFRAME 188 /* bytes */
|
||||
#define USB_HS_MICRO_FRAMES_MAX 8 /* units */
|
||||
|
||||
#define USB_ISOC_TIME_MAX 128 /* ms */
|
||||
|
||||
/* sanity checks */
|
||||
|
||||
#if (USB_ROOT_HUB_ADDR >= USB_MIN_DEVICES)
|
||||
#error "The root hub address must be less than USB_MIN_DEVICES."
|
||||
#ifndef USB_DEBUG
|
||||
#define USB_DEBUG 1
|
||||
#endif
|
||||
#endif /* _USB_DEFS_H_ */
|
||||
|
||||
typedef uint32_t usb_timeout_t; /* milliseconds */
|
||||
typedef uint32_t usb_frlength_t; /* bytes */
|
||||
typedef uint32_t usb_frcount_t; /* units */
|
||||
typedef uint32_t usb_size_t; /* bytes */
|
||||
typedef uint32_t usb_ticks_t; /* system defined */
|
||||
typedef uint16_t usb_power_mask_t; /* see "USB_HW_POWER_XXX" */
|
||||
|
||||
#endif /* _USB_FREEBSD_H_ */
|
@ -24,16 +24,38 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/fcntl.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
|
||||
#define USB_DEBUG_VAR ugen_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
@ -102,7 +124,7 @@ struct usb_fifo_methods usb_ugen_methods = {
|
||||
.f_stop_write = &ugen_stop_io,
|
||||
};
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int ugen_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, ugen, CTLFLAG_RW, 0, "USB generic");
|
||||
@ -117,7 +139,7 @@ static int
|
||||
ugen_transfer_setup(struct usb_fifo *f,
|
||||
const struct usb_config *setup, uint8_t n_setup)
|
||||
{
|
||||
struct usb_endpoint *ep = f->priv_sc0;
|
||||
struct usb_endpoint *ep = usb_fifo_softc(f);
|
||||
struct usb_device *udev = f->udev;
|
||||
uint8_t iface_index = ep->iface_index;
|
||||
int error;
|
||||
@ -152,7 +174,7 @@ ugen_transfer_setup(struct usb_fifo *f,
|
||||
static int
|
||||
ugen_open(struct usb_fifo *f, int fflags)
|
||||
{
|
||||
struct usb_endpoint *ep = f->priv_sc0;
|
||||
struct usb_endpoint *ep = usb_fifo_softc(f);
|
||||
struct usb_endpoint_descriptor *ed = ep->edesc;
|
||||
uint8_t type;
|
||||
|
||||
@ -208,7 +230,7 @@ static int
|
||||
ugen_open_pipe_write(struct usb_fifo *f)
|
||||
{
|
||||
struct usb_config usb_config[2];
|
||||
struct usb_endpoint *ep = f->priv_sc0;
|
||||
struct usb_endpoint *ep = usb_fifo_softc(f);
|
||||
struct usb_endpoint_descriptor *ed = ep->edesc;
|
||||
|
||||
mtx_assert(f->priv_mtx, MA_OWNED);
|
||||
@ -276,7 +298,7 @@ static int
|
||||
ugen_open_pipe_read(struct usb_fifo *f)
|
||||
{
|
||||
struct usb_config usb_config[2];
|
||||
struct usb_endpoint *ep = f->priv_sc0;
|
||||
struct usb_endpoint *ep = usb_fifo_softc(f);
|
||||
struct usb_endpoint_descriptor *ed = ep->edesc;
|
||||
|
||||
mtx_assert(f->priv_mtx, MA_OWNED);
|
||||
@ -377,9 +399,9 @@ ugen_stop_io(struct usb_fifo *f)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_default_read_callback(struct usb_xfer *xfer)
|
||||
ugen_default_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
struct usb_mbuf *m;
|
||||
|
||||
DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
|
||||
@ -411,7 +433,7 @@ ugen_default_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
USB_IF_POLL(&f->free_q, m);
|
||||
if (m) {
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
@ -429,9 +451,9 @@ ugen_default_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_default_write_callback(struct usb_xfer *xfer)
|
||||
ugen_default_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
usb_frlength_t actlen;
|
||||
|
||||
DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
|
||||
@ -452,7 +474,7 @@ ugen_default_write_callback(struct usb_xfer *xfer)
|
||||
*/
|
||||
if (usb_fifo_get_data(f, xfer->frbuffers, 0,
|
||||
xfer->max_data_length, &actlen, 0)) {
|
||||
xfer->frlengths[0] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, 0, actlen);
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
@ -467,9 +489,9 @@ ugen_default_write_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
ugen_read_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = f->xfer[0];
|
||||
|
||||
if (f->flag_stall == 0) {
|
||||
@ -484,9 +506,9 @@ ugen_read_clear_stall_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
ugen_write_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
struct usb_xfer *xfer_other = f->xfer[0];
|
||||
|
||||
if (f->flag_stall == 0) {
|
||||
@ -501,9 +523,9 @@ ugen_write_clear_stall_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_isoc_read_callback(struct usb_xfer *xfer)
|
||||
ugen_isoc_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
usb_frlength_t offset;
|
||||
usb_frcount_t n;
|
||||
|
||||
@ -526,7 +548,7 @@ ugen_isoc_read_callback(struct usb_xfer *xfer)
|
||||
tr_setup:
|
||||
for (n = 0; n != xfer->nframes; n++) {
|
||||
/* setup size for next transfer */
|
||||
xfer->frlengths[n] = xfer->max_frame_size;
|
||||
usbd_xfer_set_frame_len(xfer, n, xfer->max_frame_size);
|
||||
}
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
@ -540,9 +562,9 @@ ugen_isoc_read_callback(struct usb_xfer *xfer)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_isoc_write_callback(struct usb_xfer *xfer)
|
||||
ugen_isoc_write_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct usb_fifo *f = xfer->priv_sc;
|
||||
struct usb_fifo *f = usbd_xfer_softc(xfer);
|
||||
usb_frlength_t actlen;
|
||||
usb_frlength_t offset;
|
||||
usb_frcount_t n;
|
||||
@ -557,7 +579,7 @@ ugen_isoc_write_callback(struct usb_xfer *xfer)
|
||||
for (n = 0; n != xfer->nframes; n++) {
|
||||
if (usb_fifo_get_data(f, xfer->frbuffers, offset,
|
||||
xfer->max_frame_size, &actlen, 1)) {
|
||||
xfer->frlengths[n] = actlen;
|
||||
usbd_xfer_set_frame_len(xfer, n, actlen);
|
||||
offset += actlen;
|
||||
} else {
|
||||
break;
|
||||
@ -566,7 +588,7 @@ ugen_isoc_write_callback(struct usb_xfer *xfer)
|
||||
|
||||
for (; n != xfer->nframes; n++) {
|
||||
/* fill in zero frames */
|
||||
xfer->frlengths[n] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, n, 0);
|
||||
}
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
@ -1059,7 +1081,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
return (error);
|
||||
}
|
||||
/* reset first frame */
|
||||
usbd_set_frame_offset(xfer, 0, 0);
|
||||
usbd_xfer_set_frame_offset(xfer, 0, 0);
|
||||
|
||||
if (xfer->flags_int.control_xfr) {
|
||||
|
||||
@ -1084,7 +1106,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
xfer->error = USB_ERR_INVAL;
|
||||
goto complete;
|
||||
}
|
||||
xfer->frlengths[0] = length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, length);
|
||||
|
||||
/* Host mode only ! */
|
||||
if ((req->bmRequestType &
|
||||
@ -1107,7 +1129,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
rem = xfer->max_data_length;
|
||||
rem = usbd_xfer_max_len(xfer);
|
||||
xfer->nframes = fs_ep.nFrames;
|
||||
xfer->timeout = fs_ep.timeout;
|
||||
if (xfer->timeout > 65535) {
|
||||
@ -1129,7 +1151,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
|
||||
if (fs_ep.flags & USB_FS_FLAG_CLEAR_STALL)
|
||||
xfer->flags.stall_pipe = 1;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
else
|
||||
xfer->flags.stall_pipe = 0;
|
||||
|
||||
@ -1140,7 +1162,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
if (error) {
|
||||
break;
|
||||
}
|
||||
xfer->frlengths[n] = length;
|
||||
usbd_xfer_set_frame_len(xfer, n, length);
|
||||
|
||||
if (length > rem) {
|
||||
xfer->error = USB_ERR_INVAL;
|
||||
@ -1162,7 +1184,7 @@ ugen_fs_copy_in(struct usb_fifo *f, uint8_t ep_index)
|
||||
kaddr = USB_ADD_BYTES(kaddr, offset);
|
||||
} else {
|
||||
/* set current frame offset */
|
||||
usbd_set_frame_offset(xfer, offset, n);
|
||||
usbd_xfer_set_frame_offset(xfer, offset, n);
|
||||
|
||||
/* get kernel buffer address */
|
||||
kaddr = xfer->frbuffers[n].buffer;
|
||||
@ -1252,7 +1274,7 @@ ugen_fs_copy_out(struct usb_fifo *f, uint8_t ep_index)
|
||||
|
||||
/* Update lengths and copy out data */
|
||||
|
||||
rem = xfer->max_data_length;
|
||||
rem = usbd_xfer_max_len(xfer);
|
||||
offset = 0;
|
||||
|
||||
for (; n != xfer->nframes; n++) {
|
||||
@ -1660,7 +1682,7 @@ ugen_get_endpoint_desc(struct usb_fifo *f,
|
||||
{
|
||||
struct usb_endpoint *ep;
|
||||
|
||||
ep = f->priv_sc0;
|
||||
ep = usb_fifo_softc(f);
|
||||
|
||||
if (ep && ep->edesc) {
|
||||
*ed = *ep->edesc;
|
||||
@ -2162,7 +2184,7 @@ ugen_ioctl_post(struct usb_fifo *f, u_long cmd, void *addr, int fflags)
|
||||
}
|
||||
|
||||
static void
|
||||
ugen_default_fs_callback(struct usb_xfer *xfer)
|
||||
ugen_default_fs_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
; /* workaround for a bug in "indent" */
|
||||
|
||||
|
@ -24,9 +24,29 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include "usb_if.h"
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
@ -61,7 +81,7 @@ static usb_error_t usb_handle_iface_request(struct usb_xfer *, void **,
|
||||
* transfers.
|
||||
*------------------------------------------------------------------------*/
|
||||
void
|
||||
usb_handle_request_callback(struct usb_xfer *xfer)
|
||||
usb_handle_request_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
usb_error_t err;
|
||||
|
||||
@ -105,11 +125,11 @@ usb_handle_request_callback(struct usb_xfer *xfer)
|
||||
* If a control transfer is active, stall it, and wait for the
|
||||
* next control transfer.
|
||||
*/
|
||||
xfer->frlengths[0] = sizeof(struct usb_device_request);
|
||||
usbd_xfer_set_frame_len(xfer, 0, sizeof(struct usb_device_request));
|
||||
xfer->nframes = 1;
|
||||
xfer->flags.manual_status = 1;
|
||||
xfer->flags.force_short_xfer = 0;
|
||||
xfer->flags.stall_pipe = 1; /* cancel previous transfer, if any */
|
||||
usbd_xfer_set_stall(xfer); /* cancel previous transfer, if any */
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
|
||||
@ -458,10 +478,10 @@ usb_handle_request(struct usb_xfer *xfer)
|
||||
|
||||
/* reset frame stuff */
|
||||
|
||||
xfer->frlengths[0] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, 0, 0);
|
||||
|
||||
usbd_set_frame_offset(xfer, 0, 0);
|
||||
usbd_set_frame_offset(xfer, sizeof(req), 1);
|
||||
usbd_xfer_set_frame_offset(xfer, 0, 0);
|
||||
usbd_xfer_set_frame_offset(xfer, sizeof(req), 1);
|
||||
|
||||
/* get the current request, if any */
|
||||
|
||||
@ -702,7 +722,7 @@ usb_handle_request(struct usb_xfer *xfer)
|
||||
/* Compute the real maximum data length */
|
||||
|
||||
if (max_len > xfer->max_data_length) {
|
||||
max_len = xfer->max_data_length;
|
||||
max_len = usbd_xfer_max_len(xfer);
|
||||
}
|
||||
if (max_len > rem) {
|
||||
max_len = rem;
|
||||
@ -713,7 +733,7 @@ usb_handle_request(struct usb_xfer *xfer)
|
||||
* comparison below:
|
||||
*/
|
||||
if (rem > xfer->max_data_length) {
|
||||
rem = xfer->max_data_length;
|
||||
rem = usbd_xfer_max_len(xfer);
|
||||
}
|
||||
if (rem != max_len) {
|
||||
/*
|
||||
@ -734,15 +754,15 @@ usb_handle_request(struct usb_xfer *xfer)
|
||||
src_mcopy = USB_ADD_BYTES(src_mcopy, off);
|
||||
usbd_copy_in(xfer->frbuffers + 1, 0,
|
||||
src_mcopy, max_len);
|
||||
usbd_xfer_set_frame_len(xfer, 1, max_len);
|
||||
} else {
|
||||
usbd_set_frame_data(xfer,
|
||||
USB_ADD_BYTES(src_zcopy, off), 1);
|
||||
usbd_xfer_set_frame_data(xfer, 1,
|
||||
USB_ADD_BYTES(src_zcopy, off), max_len);
|
||||
}
|
||||
xfer->frlengths[1] = max_len;
|
||||
} else {
|
||||
/* the end is reached, send status */
|
||||
xfer->flags.manual_status = 0;
|
||||
xfer->frlengths[1] = 0;
|
||||
usbd_xfer_set_frame_len(xfer, 1, 0);
|
||||
}
|
||||
DPRINTF("success\n");
|
||||
return (0); /* success */
|
||||
|
@ -1,30 +0,0 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_HANDLE_REQUEST_H_
|
||||
#define _USB_HANDLE_REQUEST_H_
|
||||
|
||||
#endif /* _USB_HANDLE_REQUEST_H_ */
|
@ -40,20 +40,38 @@ __FBSDID("$FreeBSD$");
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usbdi_util.h>
|
||||
#include <dev/usb/usbhid.h>
|
||||
|
||||
#define USB_DEBUG_VAR usb_debug
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_debug.h>
|
||||
#include <dev/usb/usb_parse.h>
|
||||
#include <dev/usb/usb_process.h>
|
||||
#include <dev/usb/usb_device.h>
|
||||
#include <dev/usb/usb_request.h>
|
||||
#include <dev/usb/usb_hid.h>
|
||||
|
||||
static void hid_clear_local(struct hid_item *);
|
||||
static uint8_t hid_get_byte(struct hid_data *s, const uint16_t wSize);
|
||||
|
@ -1,95 +0,0 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
|
||||
* Copyright (c) 1998 The NetBSD Foundation, Inc. All rights reserved.
|
||||
* Copyright (c) 1998 Lennart Augustsson. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_CORE_HID_H_
|
||||
#define _USB_CORE_HID_H_
|
||||
|
||||
struct usb_hid_descriptor;
|
||||
struct usb_config_descriptor;
|
||||
|
||||
enum hid_kind {
|
||||
hid_input, hid_output, hid_feature, hid_collection, hid_endcollection
|
||||
};
|
||||
|
||||
struct hid_location {
|
||||
uint32_t size;
|
||||
uint32_t count;
|
||||
uint32_t pos;
|
||||
};
|
||||
|
||||
struct hid_item {
|
||||
/* Global */
|
||||
int32_t _usage_page;
|
||||
int32_t logical_minimum;
|
||||
int32_t logical_maximum;
|
||||
int32_t physical_minimum;
|
||||
int32_t physical_maximum;
|
||||
int32_t unit_exponent;
|
||||
int32_t unit;
|
||||
int32_t report_ID;
|
||||
/* Local */
|
||||
int32_t usage;
|
||||
int32_t usage_minimum;
|
||||
int32_t usage_maximum;
|
||||
int32_t designator_index;
|
||||
int32_t designator_minimum;
|
||||
int32_t designator_maximum;
|
||||
int32_t string_index;
|
||||
int32_t string_minimum;
|
||||
int32_t string_maximum;
|
||||
int32_t set_delimiter;
|
||||
/* Misc */
|
||||
int32_t collection;
|
||||
int collevel;
|
||||
enum hid_kind kind;
|
||||
uint32_t flags;
|
||||
/* Location */
|
||||
struct hid_location loc;
|
||||
};
|
||||
|
||||
/* prototypes from "usb_hid.c" */
|
||||
|
||||
struct hid_data *hid_start_parse(const void *d, usb_size_t len, int kindset);
|
||||
void hid_end_parse(struct hid_data *s);
|
||||
int hid_get_item(struct hid_data *s, struct hid_item *h);
|
||||
int hid_report_size(const void *buf, usb_size_t len, enum hid_kind k,
|
||||
uint8_t *id);
|
||||
int hid_locate(const void *desc, usb_size_t size, uint32_t usage,
|
||||
enum hid_kind kind, uint8_t index, struct hid_location *loc,
|
||||
uint32_t *flags, uint8_t *id);
|
||||
uint32_t hid_get_data(const uint8_t *buf, usb_size_t len,
|
||||
struct hid_location *loc);
|
||||
int hid_is_collection(const void *desc, usb_size_t size, uint32_t usage);
|
||||
struct usb_hid_descriptor *hid_get_descriptor_from_usb(
|
||||
struct usb_config_descriptor *cd,
|
||||
struct usb_interface_descriptor *id);
|
||||
usb_error_t usbd_req_get_hid_desc(struct usb_device *udev, struct mtx *mtx,
|
||||
void **descp, uint16_t *sizep, struct malloc_type *mem,
|
||||
uint8_t iface_index);
|
||||
|
||||
#endif /* _USB_CORE_HID_H_ */
|
@ -30,10 +30,29 @@
|
||||
* USB spec: http://www.usb.org/developers/docs/usbspec.zip
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_mfunc.h>
|
||||
#include <dev/usb/usb_error.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usb_ioctl.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
#define USB_DEBUG_VAR uhub_debug
|
||||
|
||||
@ -54,7 +73,7 @@
|
||||
#define UHUB_INTR_INTERVAL 250 /* ms */
|
||||
#define UHUB_N_TRANSFER 1
|
||||
|
||||
#if USB_DEBUG
|
||||
#ifdef USB_DEBUG
|
||||
static int uhub_debug = 0;
|
||||
|
||||
SYSCTL_NODE(_hw_usb, OID_AUTO, uhub, CTLFLAG_RW, 0, "USB HUB");
|
||||
@ -149,9 +168,9 @@ DRIVER_MODULE(uhub, usbus, uhub_driver, uhub_devclass, 0, 0);
|
||||
DRIVER_MODULE(uhub, uhub, uhub_driver, uhub_devclass, NULL, 0);
|
||||
|
||||
static void
|
||||
uhub_intr_callback(struct usb_xfer *xfer)
|
||||
uhub_intr_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
{
|
||||
struct uhub_softc *sc = xfer->priv_sc;
|
||||
struct uhub_softc *sc = usbd_xfer_softc(xfer);
|
||||
|
||||
switch (USB_GET_STATE(xfer)) {
|
||||
case USB_ST_TRANSFERRED:
|
||||
@ -165,7 +184,7 @@ uhub_intr_callback(struct usb_xfer *xfer)
|
||||
usb_needs_explore(sc->sc_udev->bus, 0);
|
||||
|
||||
case USB_ST_SETUP:
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
break;
|
||||
|
||||
@ -176,8 +195,8 @@ uhub_intr_callback(struct usb_xfer *xfer)
|
||||
* will get cleared before next callback by
|
||||
* the USB stack.
|
||||
*/
|
||||
xfer->flags.stall_pipe = 1;
|
||||
xfer->frlengths[0] = xfer->max_data_length;
|
||||
usbd_xfer_set_stall(xfer);
|
||||
usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
|
||||
usbd_transfer_submit(xfer);
|
||||
}
|
||||
break;
|
||||
|
@ -49,9 +49,6 @@ struct usb_read_dir {
|
||||
struct usb_ctl_request {
|
||||
void *ucr_data;
|
||||
uint16_t ucr_flags;
|
||||
#define USB_SHORT_XFER_OK 0x0004 /* allow short reads */
|
||||
#define USB_DELAY_STATUS_STAGE 0x0010 /* insert delay before STATUS stage */
|
||||
#define USB_USER_DATA_PTR 0x0020 /* internal flag */
|
||||
uint16_t ucr_actlen; /* actual length transferred */
|
||||
uint8_t ucr_addr; /* zero - currently not used */
|
||||
struct usb_device_request ucr_request;
|
||||
@ -148,7 +145,7 @@ struct usb_fs_endpoint {
|
||||
uint16_t isoc_time_complete;
|
||||
/* timeout value for no timeout */
|
||||
#define USB_FS_TIMEOUT_NONE 0
|
||||
uint8_t status; /* see USB_ERR_XXX */
|
||||
int status; /* see USB_ERR_XXX */
|
||||
};
|
||||
|
||||
struct usb_fs_init {
|
||||
|
@ -24,8 +24,28 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <dev/usb/usb_lookup.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
* usbd_lookup_id_by_info
|
||||
|
@ -1,122 +0,0 @@
|
||||
/* $FreeBSD$ */
|
||||
/*-
|
||||
* Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef _USB_LOOKUP_H_
|
||||
#define _USB_LOOKUP_H_
|
||||
|
||||
struct usb_attach_arg;
|
||||
|
||||
/*
|
||||
* The following structure is used when looking up an USB driver for
|
||||
* an USB device. It is inspired by the Linux structure called
|
||||
* "usb_device_id".
|
||||
*/
|
||||
struct usb_device_id {
|
||||
|
||||
/* Hook for driver specific information */
|
||||
unsigned long driver_info;
|
||||
|
||||
/* Used for product specific matches; the BCD range is inclusive */
|
||||
uint16_t idVendor;
|
||||
uint16_t idProduct;
|
||||
uint16_t bcdDevice_lo;
|
||||
uint16_t bcdDevice_hi;
|
||||
|
||||
/* Used for device class matches */
|
||||
uint8_t bDeviceClass;
|
||||
uint8_t bDeviceSubClass;
|
||||
uint8_t bDeviceProtocol;
|
||||
|
||||
/* Used for interface class matches */
|
||||
uint8_t bInterfaceClass;
|
||||
uint8_t bInterfaceSubClass;
|
||||
uint8_t bInterfaceProtocol;
|
||||
|
||||
/* Select which fields to match against */
|
||||
uint8_t match_flag_vendor:1;
|
||||
uint8_t match_flag_product:1;
|
||||
uint8_t match_flag_dev_lo:1;
|
||||
uint8_t match_flag_dev_hi:1;
|
||||
uint8_t match_flag_dev_class:1;
|
||||
uint8_t match_flag_dev_subclass:1;
|
||||
uint8_t match_flag_dev_protocol:1;
|
||||
uint8_t match_flag_int_class:1;
|
||||
uint8_t match_flag_int_subclass:1;
|
||||
uint8_t match_flag_int_protocol:1;
|
||||
};
|
||||
|
||||
#define USB_VENDOR(vend) \
|
||||
.match_flag_vendor = 1, .idVendor = (vend)
|
||||
|
||||
#define USB_PRODUCT(prod) \
|
||||
.match_flag_product = 1, .idProduct = (prod)
|
||||
|
||||
#define USB_VP(vend,prod) \
|
||||
USB_VENDOR(vend), USB_PRODUCT(prod)
|
||||
|
||||
#define USB_VPI(vend,prod,info) \
|
||||
USB_VENDOR(vend), USB_PRODUCT(prod), USB_DRIVER_INFO(info)
|
||||
|
||||
#define USB_DEV_BCD_GTEQ(lo) /* greater than or equal */ \
|
||||
.match_flag_dev_lo = 1, .bcdDevice_lo = (lo)
|
||||
|
||||
#define USB_DEV_BCD_LTEQ(hi) /* less than or equal */ \
|
||||
.match_flag_dev_hi = 1, .bcdDevice_hi = (hi)
|
||||
|
||||
#define USB_DEV_CLASS(dc) \
|
||||
.match_flag_dev_class = 1, .bDeviceClass = (dc)
|
||||
|
||||
#define USB_DEV_SUBCLASS(dsc) \
|
||||
.match_flag_dev_subclass = 1, .bDeviceSubClass = (dsc)
|
||||
|
||||
#define USB_DEV_PROTOCOL(dp) \
|
||||
.match_flag_dev_protocol = 1, .bDeviceProtocol = (dp)
|
||||
|
||||
#define USB_IFACE_CLASS(ic) \
|
||||
.match_flag_int_class = 1, .bInterfaceClass = (ic)
|
||||
|
||||
#define USB_IFACE_SUBCLASS(isc) \
|
||||
.match_flag_int_subclass = 1, .bInterfaceSubClass = (isc)
|
||||
|
||||
#define USB_IFACE_PROTOCOL(ip) \
|
||||
.match_flag_int_protocol = 1, .bInterfaceProtocol = (ip)
|
||||
|
||||
#define USB_IF_CSI(class,subclass,info) \
|
||||
USB_IFACE_CLASS(class), USB_IFACE_SUBCLASS(subclass), USB_DRIVER_INFO(info)
|
||||
|
||||
#define USB_DRIVER_INFO(n) \
|
||||
.driver_info = (n)
|
||||
|
||||
#define USB_GET_DRIVER_INFO(did) \
|
||||
(did)->driver_info
|
||||
|
||||
const struct usb_device_id *usbd_lookup_id_by_info(
|
||||
const struct usb_device_id *id, usb_size_t sizeof_id,
|
||||
const struct usbd_lookup_info *info);
|
||||
int usbd_lookup_id_by_uaa(const struct usb_device_id *id,
|
||||
usb_size_t sizeof_id, struct usb_attach_arg *uaa);
|
||||
|
||||
#endif /* _USB_LOOKUP_H_ */
|
@ -24,7 +24,29 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <dev/usb/usb_core.h>
|
||||
#include <sys/stdint.h>
|
||||
#include <sys/stddef.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/queue.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/bus.h>
|
||||
#include <sys/linker_set.h>
|
||||
#include <sys/module.h>
|
||||
#include <sys/lock.h>
|
||||
#include <sys/mutex.h>
|
||||
#include <sys/condvar.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/sx.h>
|
||||
#include <sys/unistd.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/priv.h>
|
||||
|
||||
#include <dev/usb/usb.h>
|
||||
#include <dev/usb/usbdi.h>
|
||||
#include <dev/usb/usb_dev.h>
|
||||
#include <dev/usb/usb_mbuf.h>
|
||||
|
||||
/*------------------------------------------------------------------------*
|
||||
|
@ -43,18 +43,6 @@ struct usb_mbuf {
|
||||
uint8_t unused:7;
|
||||
};
|
||||
|
||||
/*
|
||||
* The following structure defines a minimum re-implementation of the
|
||||
* ifqueue structure in the kernel.
|
||||
*/
|
||||
struct usb_ifqueue {
|
||||
struct usb_mbuf *ifq_head;
|
||||
struct usb_mbuf *ifq_tail;
|
||||
|
||||
usb_size_t ifq_len;
|
||||
usb_size_t ifq_maxlen;
|
||||
};
|
||||
|
||||
#define USB_IF_ENQUEUE(ifq, m) do { \
|
||||
(m)->usb_nextpkt = NULL; \
|
||||
if ((ifq)->ifq_tail == NULL) \
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user