PERFORCE change 126690 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sat Sep 22 05:34:37 PDT 2007


http://perforce.freebsd.org/chv.cgi?CH=126690

Change 126690 by hselasky at hselasky_laptop001 on 2007/09/22 12:33:43

	- convert kernel USB flags into a bitmap (scripted)
	
	- "xfer->frlengths" now has the type "uint32_t *"
	
	- "xfer->actlen < xfer->sumlen" is the new way to check if a
	  USB transfer is short.
	
	- new check for mismatch between "wMaxPacketSize" and the
	  configured data transfer rate. See "ch->bytes_per_frame >
	  xfer->max_frame_size". Observe that high-speed isochronous
	  transfers can have multiple "wMaxPacketSize" packets per
	  125us. Therefore we compare against "max_frame_size" and not
	  "max_packet_size".
	
	- use ("xfer->frbuffers + 0" or "&xfer->buf_data") and
	  ("usbd_copy_in()" or "usbd_copy_out()") to transfer
	  Isochronous USB data, hence "xfer->buffer" is now gone!
	
	- "usbreq_set_interface()" has been renamed
	  "usbd_set_alt_interface_index()" to clearly show that this
	  function does more than just an USB control request.
	
	- passing a mutex to "usbd_do_request_flags()" and all
	  "usbreq_xxx()" functions is now mandatory.
	
	- transform "xfer->length" into "xfer->frlengths[]". This is
	  the new way to set the transfer length.
	
	  Additional notes: Control transfers get "xfer->nframes = 2"
	  when "frames" is zero in the USB config structure. Else
	  "xfer->nframes" defaults to 1 for BULK and INTERRUPT.  For
	  ISOCHRONOUS a non zero value must be specified.

Affected files ...

.. //depot/projects/usb/src/sys/dev/sound/usb/uaudio.c#15 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/sound/usb/uaudio.c#15 (text+ko) ====

@@ -459,7 +459,7 @@
       .direction = UE_DIR_IN,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = UAUDIO_NFRAMES,
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_record_callback,
     },
 
@@ -469,7 +469,7 @@
       .direction = UE_DIR_IN,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = UAUDIO_NFRAMES,
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_record_callback,
     },
 };
@@ -482,7 +482,7 @@
       .direction = UE_DIR_IN,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = (UAUDIO_NFRAMES * 8),
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_record_callback,
     },
 
@@ -492,7 +492,7 @@
       .direction = UE_DIR_IN,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = (UAUDIO_NFRAMES * 8),
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_record_callback,
     },
 };
@@ -505,7 +505,7 @@
       .direction = UE_DIR_OUT,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = UAUDIO_NFRAMES,
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_play_callback,
     },
 
@@ -515,7 +515,7 @@
       .direction = UE_DIR_OUT,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = UAUDIO_NFRAMES,
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_play_callback,
     },
 };
@@ -528,7 +528,7 @@
       .direction = UE_DIR_OUT,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = (UAUDIO_NFRAMES * 8),
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_play_callback,
     },
 
@@ -538,7 +538,7 @@
       .direction = UE_DIR_OUT,
       .bufsize   = 0, /* use "wMaxPacketSize * frames" */
       .frames    = (UAUDIO_NFRAMES * 8),
-      .flags     = USBD_SHORT_XFER_OK,
+      .flags     = { .short_xfer_ok = 1, },
       .callback  = &uaudio_chan_play_callback,
     },
 };
@@ -582,7 +582,7 @@
       .endpoint  = UE_ADDR_ANY,
       .direction = UE_DIR_OUT,
       .bufsize   = UMIDI_BULK_SIZE,
-      .flags     = (USBD_PIPE_BOF|USBD_USE_DMA|USBD_SHORT_XFER_OK),
+      .flags     = { .pipe_bof = 1, .short_xfer_ok = 1, },
       .callback  = &umidi_bulk_write_callback,
     },
 
@@ -591,7 +591,7 @@
       .endpoint  = UE_ADDR_ANY,
       .direction = UE_DIR_IN,
       .bufsize   = UMIDI_BULK_SIZE,
-      .flags     = (USBD_PIPE_BOF|USBD_USE_DMA|USBD_SHORT_XFER_OK),
+      .flags     = { .pipe_bof = 1, .short_xfer_ok = 1, },
       .callback  = &umidi_bulk_read_callback,
     },
 
@@ -600,7 +600,7 @@
       .endpoint  = 0x00, /* Control pipe */
       .direction = UE_DIR_ANY,
       .bufsize   = sizeof(usb_device_request_t),
-      .flags     = USBD_USE_DMA,
+      .flags     = { },
       .callback  = &umidi_write_clear_stall_callback,
       .timeout   = 1000, /* 1 second */
       .interval  = 50, /* 50ms */
@@ -611,7 +611,7 @@
       .endpoint  = 0x00, /* Control pipe */
       .direction = UE_DIR_ANY,
       .bufsize   = sizeof(usb_device_request_t),
-      .flags     = USBD_USE_DMA,
+      .flags     = { },
       .callback  = &umidi_read_clear_stall_callback,
       .timeout   = 1000, /* 1 second */
       .interval  = 50, /* 50ms */
@@ -1221,10 +1221,10 @@
 uaudio_chan_play_callback(struct usbd_xfer *xfer)
 {
 	struct uaudio_chan *ch = xfer->priv_sc;
-	u_int16_t * p_len = xfer->frlengths;
-	u_int8_t * buf = xfer->buffer;
+	uint32_t * p_len = xfer->frlengths;
 	u_int32_t n;
 	u_int32_t total = (ch->bytes_per_frame * xfer->nframes);
+	uint32_t offset;
 
 	USBD_CHECK_STATUS(xfer);
 
@@ -1234,7 +1234,7 @@
 	}
 
  tr_transferred:
-	if (xfer->actlen < total) {
+	if (xfer->actlen < xfer->sumlen) {
 	    DPRINTF(0, "short transfer, "
 		    "%d of %d bytes\n", xfer->actlen, total);
 	}
@@ -1242,17 +1242,18 @@
 	chn_intr(ch->pcm_ch);
 
  tr_setup:
-	for (n = 0; n < xfer->nframes; n++) {
-	    p_len[n] = ch->bytes_per_frame;
-	}
-
-	if (total > xfer->length) {
+	if (ch->bytes_per_frame > xfer->max_frame_size) {
 	    DPRINTF(0, "bytes per transfer, %d, "
 		    "exceeds maximum, %d!\n", 
-		    total, xfer->length);
+		    ch->bytes_per_frame,
+		    xfer->max_frame_size);
 	    return;
 	}
 
+	for (n = 0; n < xfer->nframes; n++) {
+	    p_len[n] = ch->bytes_per_frame;
+	}
+
 	if (ch->end == ch->start) {
 	    DPRINTF(0, "no buffer!\n");
 	    return;
@@ -1260,6 +1261,8 @@
 
 	DPRINTF(5, "transfer %d bytes\n", total);
 
+	offset = 0;
+
 	while (total > 0) {
 
 	    n = (ch->end - ch->cur);
@@ -1267,11 +1270,11 @@
 	        n = total;
 	    }
 
-	    bcopy(ch->cur, buf, n);
+	    usbd_copy_in(xfer->frbuffers + 0, offset, ch->cur, n);
 
 	    total -= n;
 	    ch->cur += n;
-	    buf += n;
+	    offset += n;
 
 	    if (ch->cur >= ch->end) {
 	        ch->cur = ch->start;
@@ -1286,12 +1289,12 @@
 uaudio_chan_record_callback(struct usbd_xfer *xfer)
 {
 	struct uaudio_chan *ch = xfer->priv_sc;
-	u_int8_t * buf1 = xfer->buffer;
-	u_int8_t * buf2 = xfer->buffer;
-	u_int16_t * p_len = xfer->frlengths;
+	uint32_t * p_len = xfer->frlengths;
 	u_int32_t n;
 	u_int32_t m;
 	u_int32_t total = (xfer->nframes * ch->bytes_per_frame);
+	uint32_t offset0;
+	uint32_t offset1;
 
 	USBD_CHECK_STATUS(xfer);
 
@@ -1308,8 +1311,12 @@
 	    DPRINTF(5, "transferred %d bytes\n", xfer->actlen);
 	}
 
+	offset0 = 0;
+
 	for (n = 0; n < xfer->nframes; n++) {
 
+	    offset1 = offset0;
+
 	    while (p_len[n] > 0) {
 
 	        m = (ch->end - ch->cur);
@@ -1318,10 +1325,10 @@
 		    m = p_len[n];
 		}
 
-		bcopy(buf1, ch->cur, m);
+		usbd_copy_out(xfer->frbuffers + 0, offset1, ch->cur, m);
 
 		p_len[n] -= m;
-		buf1 += m;
+		offset1 += m;
 		ch->cur += m;
 
 		if (ch->cur >= ch->end) {
@@ -1329,24 +1336,24 @@
 		}
 	    }
 
-	    buf2 += ch->bytes_per_frame;
-	    buf1 = buf2;
+	    offset0 += ch->bytes_per_frame;
 	}
 
 	chn_intr(ch->pcm_ch);
 
  tr_setup:
-	for (n = 0; n < xfer->nframes; n++) {
-	    p_len[n] = ch->bytes_per_frame;
-	}
-
-	if (total > xfer->length) {
+	if (ch->bytes_per_frame > xfer->max_frame_size) {
 	    DPRINTF(0, "bytes per transfer, %d, "
 		    "exceeds maximum, %d!\n", 
-		    total, xfer->length);
+		    ch->bytes_per_frame,
+		    xfer->max_frame_size);
 	    return;
 	}
 
+	for (n = 0; n < xfer->nframes; n++) {
+	    p_len[n] = ch->bytes_per_frame;
+	}
+
 	if (ch->end == ch->start) {
 	    DPRINTF(0, "no buffer!\n");
 	    return;
@@ -1417,7 +1424,7 @@
 	DPRINTF(0, "endpoint=0x%02x, speed=%d, iface=%d alt=%d\n",
 		endpoint, ch->sample_rate, iface_index, alt_index);
 
-	err = usbreq_set_interface(sc->sc_udev, iface_index, alt_index);
+	err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, alt_index);
 	if (err) {
 	    DPRINTF(0, "setting of alternate index failed: %s!\n",
 		    usbd_errstr(err));
@@ -3016,7 +3023,7 @@
 	USETW(req.wIndex, mc->wIndex);
 	USETW(req.wLength, len);
 
-	err = usbd_do_request(udev, &req, data);
+	err = usbd_do_request(udev, &Giant, &req, data);
 	if (err) {
 	    DPRINTF(0, "err=%s\n", usbd_errstr(err));
 	    return 0;
@@ -3038,13 +3045,14 @@
 static void
 uaudio_mixer_write_cfg_callback(struct usbd_xfer *xfer)
 {
-	usb_device_request_t *req = xfer->buffer;
+	usb_device_request_t req;
 	struct uaudio_softc *sc = xfer->priv_sc;
 	struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
 	u_int16_t len;
 	u_int8_t repeat = 1;
 	u_int8_t update;
 	u_int8_t chan;
+	uint8_t buf[2];
 
 	USBD_CHECK_STATUS(xfer);
 
@@ -3077,20 +3085,24 @@
 
 		if (update) {
 
-		    req->bmRequestType = UT_WRITE_CLASS_INTERFACE;
-		    req->bRequest = SET_CUR;
-		    USETW(req->wValue, mc->wValue[chan]);
-		    USETW(req->wIndex, mc->wIndex);
-		    USETW(req->wLength, len);
+		    req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
+		    req.bRequest = SET_CUR;
+		    USETW(req.wValue, mc->wValue[chan]);
+		    USETW(req.wIndex, mc->wIndex);
+		    USETW(req.wLength, len);
 
 		    if (len > 0) {
-		        req->bData[0] = (mc->wData[chan] & 0xFF);
+		        buf[0] = (mc->wData[chan] & 0xFF);
 		    }
 		    if (len > 1) {
-		        req->bData[1] = (mc->wData[chan] >> 8) & 0xFF;
+		        buf[1] = (mc->wData[chan] >> 8) & 0xFF;
 		    }
 
-		    xfer->length = (sizeof(*req)+len);
+		    usbd_copy_in(xfer->frbuffers + 0, 0, &req, sizeof(req));
+		    usbd_copy_in(xfer->frbuffers + 1, 0, buf, len);
+
+		    xfer->frlengths[0] = sizeof(req);
+		    xfer->frlengths[1] = len;
 		    usbd_start_hardware(xfer);
 		    return;
 		}
@@ -3124,7 +3136,7 @@
 	data[1] = speed >> 8;
 	data[2] = speed >> 16;
 
-	return usbd_do_request(udev, &req, data);
+	return usbd_do_request(udev, &Giant, &req, data);
 }
 
 static int
@@ -3310,7 +3322,7 @@
 {
 	struct umidi_chan *chan = xfer->priv_sc;
 	struct umidi_sub_chan *sub;
-	u_int8_t buf[4];
+	u_int8_t buf[1];
 	u_int8_t cmd_len;
 	u_int8_t cn;
 	u_int16_t pos;
@@ -3341,14 +3353,15 @@
 
 	while (xfer->actlen >= 4) {
 
-	    usbd_copy_out(&(xfer->buf_data), pos, buf, 4);
+	    usbd_copy_out(&(xfer->buf_data), 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_cdev_put_data(&(sub->cdev), buf+1, cmd_len, 1);
+	        usb_cdev_put_data(&(sub->cdev), &(xfer->buf_data),
+				  pos+1, cmd_len, 1);
 	    } else {
 	        /* ignore the command */
 	    }
@@ -3364,6 +3377,7 @@
             usbd_transfer_start(chan->xfer[3]);
             return;
         }
+	xfer->frlengths[0] = xfer->max_data_length;
 	usbd_start_hardware(xfer);
 	return;
 }
@@ -3564,12 +3578,15 @@
 	    sub = &(chan->sub[chan->curr_cable]);
 
 	    if (sub->write_open) {
-	        usb_cdev_get_data(&(sub->cdev), &buf, 1, &actlen, 0);
+	        usb_cdev_get_data(&(sub->cdev), &(xfer->buf_data),
+				  total_length, 1, &actlen, 0);
 	    } else {
 	        actlen = 0;
 	    }
 
 	    if (actlen) {
+		usbd_copy_out(&(xfer->buf_data), total_length, &buf, 1);
+
 	        tr_any = 1;
 
 		DPRINTF(0, "byte=0x%02x\n", buf);
@@ -3607,7 +3624,7 @@
 	}
 
 	if (total_length) {
-	    xfer->length = total_length;
+	    xfer->frlengths[0] = total_length;
 	    usbd_start_hardware(xfer);
 	}
 	return;
@@ -3741,7 +3758,7 @@
 	u_int32_t n;
 	u_int8_t buf[32];
 
-	if (usbreq_set_interface(sc->sc_udev, chan->iface_index, 
+	if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index, 
 				 chan->iface_alt_index)) {
 	    DPRINTF(0, "setting of alternate index failed!\n");
 	    goto detach;


More information about the p4-projects mailing list