PERFORCE change 166011 for review
Sylvestre Gallon
syl at FreeBSD.org
Mon Jul 13 15:12:44 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=166011
Change 166011 by syl at syl_pablo on 2009/07/13 15:11:43
Implement xfer_setup.
Add s3c24dci_tc in s3c24xxdci.h.
Affected files ...
.. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.c#7 edit
.. //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.h#5 edit
Differences ...
==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.c#7 (text+ko) ====
@@ -96,7 +96,6 @@
.max_in_frame_size = 64,
.max_out_frame_size = 64,
.is_simplex = 1,
- .support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
.support_in = 1,
@@ -106,7 +105,6 @@
.max_in_frame_size = 64,
.max_out_frame_size = 64,
.is_simplex = 1,
- .support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
.support_in = 1,
@@ -116,7 +114,6 @@
.max_in_frame_size = 64,
.max_out_frame_size = 64,
.is_simplex = 1,
- .support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
.support_in = 1,
@@ -126,7 +123,6 @@
.max_in_frame_size = 64,
.max_out_frame_size = 64,
.is_simplex = 1,
- .support_multi_buffer = 1,
.support_bulk = 1,
.support_interrupt = 1,
.support_in = 1,
@@ -444,7 +440,80 @@
static void
s3c24dci_xfer_setup(struct usb_setup_params *parm)
{
- return ;
+ const struct usb_hw_ep_profile *pf;
+ struct s3c24dci_softc *sc;
+ struct usb_xfer *xfer;
+ void *last_obj;
+ uint32_t ntd;
+ uint32_t n;
+ uint8_t ep_no;
+
+ sc = S3C24_DCI_BUS2SC(parm->udev->bus);
+ xfer = parm->curr_xfer;
+
+ /*
+ * NOTE: This driver does not use any of the parameters that
+ * are computed from the following values. Just set some
+ * reasonable dummies:
+ */
+ parm->hc_max_packet_size = 0x500;
+ parm->hc_max_packet_count = 1;
+ parm->hc_max_frame_size = 0x500;
+
+ usbd_transfer_setup_sub(parm);
+
+ if (parm->methods == &s3c24dci_device_ctrl_methods) {
+ ntd = xfer->nframes + 1 /* STATUS */ + 1 /* SYNC 1 */
+ + 1 /* SYNC 2 */;
+ } else if (parm->methods == &s3c24dci_device_bulk_methods) {
+ ntd = xfer->nframes + 1 /* SYNC */;
+ } else if (parm->methods == &s3c24dci_device_intr_methods) {
+ ntd = xfer->nframes + 1 /* SYNC */;
+ } else {
+ ntd = 0;
+ }
+
+ /*
+ * check if "usbd_transfer_setup_sub" set an error
+ */
+ if (parm->err) {
+ return ;
+ }
+
+ if (ntd) {
+ ep_no = xfer->endpointno & UE_ADDR;
+ s3c24dci_get_hw_ep_profile(parm->udev, &pf, ep_no);
+
+ if (pf == NULL) {
+ parm->err = USB_ERR_INVAL;
+ return ;
+ }
+ } else {
+ ep_no = 0;
+ pf = NULL;
+ }
+
+ parm->size[0] += ((-parm->size[0]) & (USB_HOST_ALIGN - 1));
+
+ for (n = 0 ; n != ntd ; n++) {
+ struct s3c24dci_td *td;
+
+ if (parm->buf) {
+ td = USB_ADD_BYTES(parm->buf, parm->size[0]);
+
+ /* init TD */
+ td->io_tag = sc->sc_io_tag;
+ td->io_hdl = sc->sc_io_hdl;
+ td->max_packet_size = xfer->max_packet_size;
+ td->ep_no = ep_no;
+ td->obj_next = last_obj;
+
+ last_obj = td;
+ }
+ parm->size[0] += sizeof(*td);
+ }
+
+ xfer->td_start[0] = last_obj;
}
static void
==== //depot/projects/soc2009/syl_usb/src/sys/dev/usb/controller/s3c24xxdci.h#5 (text+ko) ====
@@ -175,6 +175,26 @@
#define S3C24XX_DCI_WRITE_4(sc, reg, (sc)->sc_io_hdl, reg, data) \
bus_space_write_4((sc)->sc_io_tag, (sc)->sc_io_hdl, reg, data)
+struct s3cdci_td;
+
+typedef uint8_t (s3c24dci_cmd_t)(struct s3c24dci_td *td);
+
+struct uint8_t s3c24dci_td {
+ bus_space_tag_t io_tag;
+ bus_space_handle_t io_hdl;
+ struct s3c24dci_td *obj_next;
+ s3c24dci_cmd_t *func;
+ struct usb_page_cache *pc;
+ uint32_t offset;
+ uint32_t remainder;
+ uint16_t max_packet_size;
+ uint8_t ep_no;
+ uint8_t error:1;
+ uint8_t alt_next:1;
+ uint8_t short_pkt:1;
+ uint8_t did_stall:1;
+};
+
struct s3c24dci_softc {
struct usb_bus sc_bus;
More information about the p4-projects
mailing list