PERFORCE change 126751 for review
Hans Petter Selasky
hselasky at FreeBSD.org
Sun Sep 23 10:17:53 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126751
Change 126751 by hselasky at hselasky_laptop001 on 2007/09/23 17:17:26
FYI; The comments follow the P4 diff from top to bottom.
- shorten enum length of "USBD_ZERO_FRAMES_IN_ISOC_MODE"
- in general updated prototypes and added enums
- "struct usbd_port" has been stripped down significantly
- "struct usbd_page_info" has been removed.
- "struct usbd_page_cache" has been stripped down
- new structure "struct usbd_setup_params"; Is used when
setting up USB transfers of any kind. Saves stack by not
passing this information to the actual functions like
parameters.
- the "root_port" is gone
- new default mutexes has been added to "struct usbd_device"
- the "langid" should be 16-bit unsigned
- "s/hub/HUB"
- new "struct usbd_xfer_flags" that contains all allowed USB
device driver transfer flags.
- new "struct usbd_xfer_flags_int" that contains all internal
USB transfer flags. These are only touchable by the USB
kernel !
- "struct usbd_config";
- "frames" is now 32-bit unsigned
- "interval" is now 16-bit unsigned
- removed unused "USBD_TRANSFER_IN_PROGRESS" macro
- "struct usbd_xfer";
- "frlengths" is now a pointer to 32-bit unsigned
- removed unused macros "USBD_TYPE_ANY", "USBD_SUBTYPE_ANY"
- POINTER_TO_UNSIGNED can now take a constant-data pointer.
- added USBD_ADD_BYTES, USBD_MS_TO_TICKS
- removed "USB_CDEV_FLAG_FWD_SHORT" flag and refactor the
remaining USB_CDEV flags.
Affected files ...
.. //depot/projects/usb/src/sys/dev/usb/usb_subr.h#44 edit
Differences ...
==== //depot/projects/usb/src/sys/dev/usb/usb_subr.h#44 (text+ko) ====
@@ -54,7 +54,8 @@
m(USBD_IN_USE,)\
m(USBD_NO_ADDR,)\
m(USBD_NO_PIPE,)\
-m(USBD_ZERO_FRAMES_IN_ISOC_MODE,)\
+m(USBD_ZERO_NFRAMES,)\
+m(USBD_ZERO_MAXP,)\
m(USBD_SET_ADDR_FAILED,)\
m(USBD_NO_POWER,)\
m(USBD_TOO_DEEP,)\
@@ -77,12 +78,13 @@
struct usbd_device;
struct usbd_interface;
struct usbd_memory_info;
+struct usbd_std_root_transfer;
+struct usbd_setup_params;
struct usbd_ifqueue;
struct __callout;
struct module;
struct malloc_type;
struct proc;
-struct usb_hid_descriptor;
struct usb_device; /* Linux compat */
struct cdev;
@@ -90,10 +92,22 @@
typedef void (usbd_callback_t)(struct usbd_xfer *);
+typedef void (usbd_std_root_transfer_func_t)(struct usbd_xfer *, struct usbd_std_root_transfer *);
+
+/* Standard root transfer function state argument values */
+
+enum {
+ USBD_STD_ROOT_TR_SETUP,
+ USBD_STD_ROOT_TR_STATUS,
+ USBD_STD_ROOT_TR_PRE_DATA,
+ USBD_STD_ROOT_TR_POST_DATA,
+ USBD_STD_ROOT_TR_PRE_CALLBACK,
+};
+
struct usbd_bus_methods {
void (*pipe_init)(struct usbd_device *udev, usb_endpoint_descriptor_t *edesc, struct usbd_pipe *pipe);
void (*do_poll)(struct usbd_bus *);
- usbd_status (*xfer_setup)(struct usbd_device *udev, uint8_t iface_index, struct usbd_xfer **pxfer, const struct usbd_config *setup_start, const struct usbd_config *setup_end);
+ void (*xfer_setup)(struct usbd_setup_params *parm);
};
struct usbd_pipe_methods {
@@ -101,19 +115,13 @@
void (*close)(struct usbd_xfer *xfer);
void (*enter)(struct usbd_xfer *xfer);
void (*start)(struct usbd_xfer *xfer);
- void (*copy_in)(struct usbd_xfer *xfer);
- void (*copy_out)(struct usbd_xfer *xfer);
};
struct usbd_port {
- struct usbd_device *device; /* connected device */
- struct usbd_device *parent; /* the ports hub */
- uint16_t power; /* mA of current on port */
usb_port_status_t status;
- uint8_t portno;
uint8_t restartcnt;
+ uint8_t device_addr; /* zero means unused */
#define USBD_RESTART_MAX 5
- uint8_t last_refcount;
};
struct usbd_fs_isoc_schedule {
@@ -122,12 +130,23 @@
uint8_t frame_slot;
};
+struct usbd_std_root_transfer {
+ usb_device_request_t req;
+ struct usbd_xfer *xfer;
+ uint8_t *ptr;
+ uint16_t len;
+ uint8_t state;
+ usbd_status err;
+};
+
struct usbd_hub {
struct usbd_fs_isoc_schedule fs_isoc_schedule[USB_ISOC_TIME_MAX];
usb_hub_descriptor_t hubdesc;
- usbd_status (*explore)(struct usbd_device *hub);
- void *hubsoftc;
+ struct usbd_device *hubudev; /* the HUB device */
+ usbd_status (*explore)(struct usbd_device *hub);
+ void *hubsoftc;
uint32_t uframe_usage[USB_HS_MICRO_FRAMES_MAX];
+ uint16_t portpower; /* mA per USB port */
uint8_t isoc_last_time;
struct usbd_port ports[0];
};
@@ -160,24 +179,36 @@
uint32_t length;
};
-struct usbd_page_info {
- struct usbd_page *page;
- void *buffer;
- bus_size_t physaddr;
-};
-
struct usbd_page_cache {
struct usbd_page *page_start;
- struct usbd_page *page_end;
- struct usbd_page *page_cur;
uint32_t page_offset_buf;
- uint32_t page_offset_cur;
+ uint32_t page_offset_end;
+};
+
+struct usbd_setup_params {
+ struct usbd_page_cache pc;
+
+ struct usbd_page *page_ptr;
+ struct usbd_device *udev;
+ struct usbd_xfer *curr_xfer;
+ const struct usbd_config *curr_setup;
+ const struct usbd_pipe_methods *methods;
+ void *buf;
+
+ uint32_t size[3];
+ uint32_t total_size[3];
+ uint32_t bufsize;
+ uint32_t hc_max_frame_size;
+
+ uint16_t hc_max_packet_size;
+ uint8_t hc_max_packet_count;
+ uint8_t speed;
+ usbd_status err;
};
struct usbd_bus {
struct usb_device_stats stats;
struct mtx mtx;
- struct usbd_port root_port; /* dummy port for root hub */
device_t bdev; /* filled by HC driver */
bus_dma_tag_t dma_tag; /* filled by HC driver */
@@ -231,6 +262,9 @@
};
struct usbd_device {
+ struct sx default_sx[1];
+ struct mtx default_mtx[1];
+
struct usbd_interface ifaces[USB_MAX_ENDPOINTS];
struct usbd_interface ifaces_end[0];
@@ -243,28 +277,31 @@
#endif
struct usbd_bus *bus; /* our controller */
- struct usbd_port *powersrc; /* upstream hub port, or 0 */
- struct usbd_port *myhsport; /* closest high speed port */
- struct usbd_device *myhub; /* upstream hub */
+ struct usbd_device *parent_hub;
const struct usbd_quirks *quirks; /* device quirks, always set */
usb_config_descriptor_t *cdesc; /* full config descr */
struct usbd_hub *hub; /* only if this is a hub */
device_t subdevs[USB_MAX_ENDPOINTS];
device_t subdevs_end[0];
struct usb_device *linux_dev;
+ struct usbd_xfer *default_xfer[1];
uint16_t refcount;
#define USB_DEV_REFCOUNT_MAX 0xffff
uint16_t power; /* mA the device uses */
- int16_t langid; /* language for strings */
-#define USBD_NOLANG (-1)
+ uint16_t langid; /* language for strings */
uint8_t address; /* device addess */
uint8_t config; /* current configuration # */
- uint8_t depth; /* distance from root hub */
+ uint8_t depth; /* distance from root HUB */
uint8_t speed; /* low/full/high speed */
uint8_t self_powered; /* flag for self powered */
+ uint8_t port_index; /* parent HUB port index */
+ uint8_t port_no; /* parent HUB port number */
+ uint8_t hs_hub_addr; /* high-speed HUB address */
+ uint8_t hs_port_no; /* high-speed HUB port number */
+ uint8_t driver_added_refcount;
usb_endpoint_descriptor_t default_ep_desc; /* for pipe 0 */
usb_device_descriptor_t ddesc; /* device descriptor */
@@ -283,66 +320,59 @@
#define USBD_PROBED_IFACE_AND_FOUND 2
#define USBD_PROBED_GENERIC_AND_FOUND 3
- uint8_t serial[32]; /* serial number */
+ uint8_t serial[64]; /* serial number */
+ uint8_t manufacturer[64]; /* manufacturer string */
+ uint8_t product[64]; /* product string */
+ uint8_t scratch[128];
uint8_t detaching;
+ uint8_t no_strings; /* flag for no strings */
};
+struct usbd_xfer_flags {
+ uint8_t force_short_xfer : 1; /* force a short transfer last */
+ uint8_t short_xfer_ok : 1; /* allow short transfers */
+ uint8_t short_frames_ok : 1; /* allow short frames */
+ uint8_t pipe_bof : 1; /* block pipe on failure */
+ uint8_t use_polling : 1; /* poll until transfer is finished */
+ 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 */
+};
+
+struct usbd_xfer_flags_int {
+ uint16_t control_rem; /* remainder in bytes */
+
+ uint8_t open : 1;
+ uint8_t recursed_1 : 1;
+ uint8_t recursed_2 : 1;
+ uint8_t transferring : 1;
+ uint8_t bandwidth_reclaimed : 1;
+ uint8_t control_xfr : 1; /* set if control transfer */
+ uint8_t control_hdr : 1; /* set if control header should be sent */
+ uint8_t control_act : 1; /* set if control transfer is active */
+
+ uint8_t short_frames_ok : 1; /* filtered version */
+ uint8_t short_xfer_ok : 1; /* filtered version */
+};
+
struct usbd_config {
- usbd_callback_t *callback;
+ usbd_callback_t *callback; /* transfer callback */
+ uint32_t bufsize; /* total pipe buffer size in bytes */
+ uint32_t frames; /* maximum number of USB frames */
+ uint16_t interval; /* interval in milliseconds */
- uint32_t flags; /* flags */
-#define USBD_UNUSED_0 0x0001
-#define USBD_FORCE_SHORT_XFER 0x0002 /* force a short packet last */
-#if (USBD_SHORT_XFER_OK != 0x0004)
-#define USBD_SHORT_XFER_OK 0x0004 /* allow short reads
- * NOTE: existing software
- * expects USBD_SHORT_XFER_OK
- * to have a value of 0x4. This
- * flag is also exported by usb.h
- */
-#endif
-#define USBD_PIPE_BOF 0x0008 /* block pipe on failure */
-#define USBD_DEV_OPEN 0x0010
-#define USBD_DEV_RECURSED_1 0x0020
-#define USBD_DEV_RECURSED_2 0x0040
-#define USBD_DEV_TRANSFERRING 0x0080
-#define USBD_BANDWIDTH_RECLAIMED 0x0100
-#define USBD_USE_POLLING 0x0200 /* used to make synchronous transfers
- * use polling instead of sleep/wakeup
- */
-#define USBD_DEV_CONTROL_HEADER 0x0400
-#define USBD_USE_DMA 0x0800
-#define USBD_UNUSED_4 0x1000
-#define USBD_UNUSED_5 0x2000
-#define USBD_UNUSED_6 0x4000
-#define USBD_UNUSED_7 0x8000
+#define USBD_DEFAULT_INTERVAL 0
- uint32_t bufsize; /* total pipe buffer size in bytes */
+ uint16_t timeout; /* transfer timeout in milliseconds */
- uint16_t timeout; /* milliseconds */
+ struct usbd_xfer_flags flags; /* transfer flags */
- uint16_t frames; /* number of frames
- * used in isochronous
- * mode
- */
uint8_t type; /* pipe type */
uint8_t endpoint; /* pipe number */
-
uint8_t direction; /* pipe direction */
- uint8_t interval; /* interrupt interval in milliseconds;
- * used by interrupt pipes
- */
-#define USBD_DEFAULT_INTERVAL 0
-
- uint8_t index; /* pipe index to use, if more
- * than one descriptor matches
- * type, address, direction ...
- */
+ uint8_t index; /* pipe index match to use */
};
-#define USBD_TRANSFER_IN_PROGRESS(xfer) \
- ((xfer)->flags & USBD_DEV_TRANSFERRING)
-
struct usbd_xfer {
struct __callout timeout_handle;
struct usbd_page_cache buf_data; /* buffer page cache */
@@ -364,36 +394,38 @@
void *td_transfer_cache; /* used by HC driver */
void *priv_sc;
void *priv_fifo;
- void *buffer;
- uint16_t *frlengths;
- uint16_t *frlengths_old;
+ uint32_t *frlengths;
+ struct usbd_page_cache *frbuffers;
usbd_callback_t *callback;
- uint32_t length; /* bytes */
- uint32_t actlen; /* bytes */
- uint32_t flags;
+ uint32_t max_usb_frame_size;
+ uint32_t max_data_length;
+ uint32_t sumlen; /* sum of all lengths in bytes */
+ uint32_t actlen; /* actual length in bytes */
uint32_t timeout; /* milliseconds */
#define USBD_NO_TIMEOUT 0
#define USBD_DEFAULT_TIMEOUT 5000 /* 5000 ms = 5 seconds */
- uint32_t nframes; /* for isochronous transfers */
+ uint32_t nframes; /* number of USB frames to transfer */
+ uint32_t aframes; /* actual number of USB frames transferred */
uint16_t max_packet_size;
uint16_t max_frame_size;
uint16_t qh_pos;
uint16_t isoc_time_complete; /* in ms */
- uint16_t control_remainder;
+ uint16_t interval; /* milliseconds */
uint8_t address;
uint8_t endpoint;
- uint8_t interval; /* milliseconds */
uint8_t max_packet_count;
- uint8_t control_isread;
uint8_t usb_smask;
uint8_t usb_cmask;
uint8_t usb_uframe;
usbd_status error;
+
+ struct usbd_xfer_flags flags;
+ struct usbd_xfer_flags_int flags_int;
};
struct usbd_memory_info {
@@ -415,7 +447,8 @@
struct usbd_mbuf *usbd_next;
uint32_t cur_data_len;
- uint32_t max_data_len;
+ uint32_t max_data_len : 31;
+ uint32_t last_packet : 1;
};
struct usbd_ifqueue {
@@ -463,6 +496,7 @@
#define USBD_MBUF_RESET(m) do { \
(m)->cur_data_ptr = (m)->min_data_ptr; \
(m)->cur_data_len = (m)->max_data_len; \
+ (m)->last_packet = 0; \
} while (0)
/*---------------------------------------------------------------------------*
@@ -551,9 +585,6 @@
/* prototypes from usb_subr.c */
-#define USBD_TYPE_ANY (-1)
-#define USBD_SUBTYPE_ANY (-1)
-
#ifdef __FreeBSD__
#if (__FreeBSD_version >= 700020)
#define device_get_dma_tag(dev) bus_get_dma_tag(dev)
@@ -562,27 +593,28 @@
#endif
#endif
-void usbd_devinfo(struct usbd_device *udev, int32_t showclass, char *dst_ptr, uint16_t dst_len);
+void usbd_devinfo(struct usbd_device *udev, char *dst_ptr, uint16_t dst_len);
const char * usbd_errstr(usbd_status err);
void usb_delay_ms(struct usbd_bus *bus, uint32_t ms);
void usbd_delay_ms(struct usbd_device *udev, uint32_t ms);
+void usbd_pause_mtx(struct mtx *mtx, uint32_t ms);
usb_descriptor_t *usbd_desc_foreach(usb_config_descriptor_t *cd, usb_descriptor_t *desc);
-struct usb_hid_descriptor *usbd_get_hdesc(usb_config_descriptor_t *cd, usb_interface_descriptor_t *id);
-usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index);
-usb_endpoint_descriptor_t *usbd_find_edesc(usb_config_descriptor_t *cd, uint16_t iface_index, uint16_t alt_index, uint16_t endptidx);
-void * usbd_find_descriptor(struct usbd_device *udev, void *id, uint16_t iface_index, int16_t type, int16_t subtype);
+usb_interface_descriptor_t *usbd_find_idesc(usb_config_descriptor_t *cd, uint8_t iface_index, uint8_t alt_index);
+usb_endpoint_descriptor_t *usbd_find_edesc(usb_config_descriptor_t *cd, uint8_t iface_index, uint8_t alt_index, uint8_t ep_index);
+void * usbd_find_descriptor(struct usbd_device *udev, void *id, uint8_t iface_index, uint8_t type, uint8_t type_mask, uint8_t subtype, uint8_t subtype_mask);
uint16_t usbd_get_no_alts(usb_config_descriptor_t *cd, uint8_t ifaceno);
uint8_t usbd_intr_schedule_adjust(struct usbd_device *udev, int16_t len, uint8_t slot);
void usbd_fs_isoc_schedule_init_all(struct usbd_fs_isoc_schedule *fss);
uint16_t usbd_fs_isoc_schedule_isoc_time_expand(struct usbd_device *udev, struct usbd_fs_isoc_schedule **pp_start, struct usbd_fs_isoc_schedule **pp_end, uint16_t isoc_time);
uint8_t usbd_fs_isoc_schedule_alloc(struct usbd_fs_isoc_schedule *fss, uint16_t len);
-usbd_status usbd_search_and_set_config(struct usbd_device *udev, int32_t no, int32_t msg);
-usbd_status usbd_set_config_index(struct usbd_device *udev, int32_t index, int32_t msg);
-int usbd_fill_deviceinfo(struct usbd_device *udev, struct usb_device_info *di, int32_t usedev);
-usbd_status usbd_fill_iface_data(struct usbd_device *udev, int32_t iface_index, int32_t alt_index);
-usbd_status usbd_probe_and_attach(device_t parent, int32_t port, struct usbd_port *up);
-usbd_status usbd_new_device(device_t parent, struct usbd_bus *bus, int32_t depth, int32_t speed, int32_t port, struct usbd_port *up);
-void usbd_free_device(struct usbd_port *up, uint8_t free_subdev);
+usbd_status usbd_set_config_no(struct usbd_device *udev, uint8_t no, uint8_t msg);
+usbd_status usbd_set_config_index(struct usbd_device *udev, uint8_t index, uint8_t msg);
+usbd_status usbd_set_alt_interface_index(struct usbd_device *udev, uint8_t iface_index, uint8_t alt_index);
+int usbd_fill_deviceinfo(struct usbd_device *udev, struct usb_device_info *di);
+usbd_status usbd_fill_iface_data(struct usbd_device *udev, uint8_t iface_index, uint8_t alt_index);
+usbd_status usbd_probe_and_attach(device_t parent, struct usbd_device *udev);
+usbd_status usbd_new_device(device_t parent, struct usbd_bus *bus, struct usbd_device *parent_hub, uint8_t depth, uint8_t speed, uint8_t port_index, uint8_t port_no);
+void usbd_free_device(struct usbd_device *udev, uint8_t free_subdev);
struct usbd_device *usbd_ref_device(struct usbd_bus *bus, uint8_t addr);
void usbd_unref_device(struct usbd_device *udev);
struct usbd_interface *usbd_get_iface(struct usbd_device *udev, uint8_t iface_index);
@@ -591,13 +623,13 @@
void usbd_get_page(struct usbd_page_cache *cache, uint32_t offset, struct usbd_page_search *res);
void usbd_copy_in(struct usbd_page_cache *cache, uint32_t offset, const void *ptr, uint32_t len);
void usbd_m_copy_in(struct usbd_page_cache *cache, uint32_t dst_offset, struct mbuf *m, uint32_t src_offset, uint32_t src_len);
+int usbd_uiomove(struct usbd_page_cache *pc, struct uio *uio, uint32_t pc_offset, uint32_t len);
void usbd_copy_out(struct usbd_page_cache *cache, uint32_t offset, void *ptr, uint32_t len);
void usbd_bzero(struct usbd_page_cache *cache, uint32_t offset, uint32_t len);
uint8_t usbd_page_alloc(bus_dma_tag_t tag, struct usbd_page *page, uint32_t npages);
void usbd_page_free(struct usbd_page *page, uint32_t npages);
-void usbd_page_get_info(struct usbd_page *page, uint32_t size, struct usbd_page_info *info);
-void usbd_page_set_start(struct usbd_page_cache *pc, struct usbd_page *page_ptr, uint32_t size);
-void usbd_page_set_end(struct usbd_page_cache *pc, struct usbd_page *page_ptr,uint32_t size);
+void usbd_page_cache_init(struct usbd_page_cache *pc, struct usbd_page *page_ptr, uint32_t offset, uint32_t size);
+void usbd_page_cache_offset(struct usbd_page_cache *pc_src, struct usbd_page_cache *pc_dst, uint32_t offset);
uint32_t usbd_page_fit_obj(uint32_t size, uint32_t obj_len);
void * usbd_mem_alloc(bus_dma_tag_t parent, struct usbd_page *page, uint32_t size, uint8_t align_power);
void usbd_mem_free(struct usbd_page *page);
@@ -607,7 +639,6 @@
void usbd_mem_free_sub(struct usbd_page *page);
void usbd_page_dma_exit(struct usbd_page *page);
void usbd_page_dma_enter(struct usbd_page *page);
-void usbd_std_transfer_setup(struct usbd_device *udev, struct usbd_xfer *xfer, const struct usbd_config *setup, uint16_t max_packet_size, uint16_t max_frame_size, uint8_t max_packet_count);
uint8_t usbd_make_str_desc(void *ptr, uint16_t max_len, const char *s);
uint32_t mtx_drop_recurse(struct mtx *mtx);
void mtx_pickup_recurse(struct mtx *mtx, uint32_t recurse_level);
@@ -619,10 +650,6 @@
uint8_t usbd_config_td_sleep(struct usbd_config_td *ctd, uint32_t timeout);
struct mbuf * usbd_ether_get_mbuf(void);
int32_t device_delete_all_children(device_t dev);
-uint16_t usbd_get_max_packet_size(usb_endpoint_descriptor_t *edesc);
-uint16_t usbd_get_max_packet_count(usb_endpoint_descriptor_t *edesc);
-uint16_t usbd_get_max_frame_size(usb_endpoint_descriptor_t *edesc);
-void usbd_set_max_packet_size_count(usb_endpoint_descriptor_t *edesc, uint16_t size, uint16_t count);
uint16_t usbd_isoc_time_expand(struct usbd_bus *bus, uint16_t isoc_time_curr);
/* prototypes from usb.c */
@@ -652,27 +679,20 @@
uint32_t usb_get_devid(device_t dev);
struct usbd_pipe *usbd_get_pipe(struct usbd_device *udev, uint8_t iface_index, const struct usbd_config *setup);
usbd_status usbd_interface_count(struct usbd_device *udev, uint8_t *count);
+void usbd_transfer_setup_sub(struct usbd_setup_params *parm);
usbd_status usbd_transfer_setup(struct usbd_device *udev, uint8_t iface_index, struct usbd_xfer **pxfer, const struct usbd_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *priv_mtx);
void usbd_transfer_unsetup(struct usbd_xfer **pxfer, uint16_t n_setup);
-void usbd_std_isoc_copy_in(struct usbd_xfer *xfer);
-void usbd_std_isoc_copy_out(struct usbd_xfer *xfer);
-void usbd_std_bulk_intr_copy_in(struct usbd_xfer *xfer);
-void usbd_std_bulk_intr_copy_out(struct usbd_xfer *xfer);
-void usbd_std_ctrl_copy_in(struct usbd_xfer *xfer);
-void usbd_std_ctrl_copy_out(struct usbd_xfer *xfer);
-uint8_t usbd_std_ctrl_enter(struct usbd_xfer *xfer);
+uint8_t usbd_std_root_transfer(struct usbd_std_root_transfer *std, struct thread *ctd, usbd_std_root_transfer_func_t *func);
void usbd_start_hardware(struct usbd_xfer *xfer);
void usbd_transfer_start(struct usbd_xfer *xfer);
void usbd_transfer_stop(struct usbd_xfer *xfer);
void __usbd_callback(struct usbd_xfer *xfer);
void usbd_do_callback(struct usbd_xfer **pp_xfer, struct thread *td);
-void usbd_transfer_done(struct usbd_xfer *xfer, usbd_status error);
void usbd_transfer_enqueue(struct usbd_xfer *xfer);
-void usbd_transfer_dequeue(struct usbd_xfer *xfer);
-usbd_status usbd_do_request(struct usbd_device *udev, usb_device_request_t *req, void *data);
-usbd_status usbd_do_request_flags(struct usbd_device *udev, usb_device_request_t *req, void *data, uint32_t flags, int32_t *actlen, uint32_t timeout);
-usbd_status usbd_do_request_mtx(struct usbd_device *udev, struct mtx *mtx, usb_device_request_t *req, void *data);
-usbd_status usbd_do_request_flags_mtx(struct usbd_device *udev, struct mtx *mtx, usb_device_request_t *req, void *data, uint32_t flags, int32_t *actlen, uint32_t timeout);
+void usbd_transfer_dequeue(struct usbd_xfer *xfer, usbd_status error);
+void usbd_do_request_callback(struct usbd_xfer *xfer);
+usbd_status usbd_do_request(struct usbd_device *udev, struct mtx *mtx, usb_device_request_t *req, void *data);
+usbd_status usbd_do_request_flags(struct usbd_device *udev, struct mtx *mtx, usb_device_request_t *req, void *data, uint32_t flags, uint16_t *actlen, uint32_t timeout);
void usbd_fill_get_report(usb_device_request_t *req, uint8_t iface_no, uint8_t type, uint8_t id, uint16_t size);
void usbd_fill_set_report(usb_device_request_t *req, uint8_t iface_no, uint8_t type, uint8_t id, uint16_t size);
void usbd_clear_data_toggle(struct usbd_device *udev, struct usbd_pipe *pipe);
@@ -684,32 +704,31 @@
/* prototypes from usb_requests.c */
-usbd_status usbreq_reset_port(struct usbd_device *udev, int32_t port, usb_port_status_t *ps);
-usbd_status usbreq_get_desc(struct usbd_device *udev, uint8_t type, uint8_t index, uint16_t len, void *desc, uint32_t timeout);
-usbd_status usbreq_get_string_any(struct usbd_device *udev, uint8_t si, char *buf, uint16_t len);
-usbd_status usbreq_get_string_desc(struct usbd_device *udev, uint8_t sindex, uint16_t langid, usb_string_descriptor_t *sdesc, uint8_t *plen);
-usbd_status usbreq_get_config_desc(struct usbd_device *udev, uint8_t confidx, usb_config_descriptor_t *d);
-usbd_status usbreq_get_config_desc_full(struct usbd_device *udev, uint8_t conf, void *d, uint16_t size);
-usbd_status usbreq_get_device_desc(struct usbd_device *udev, usb_device_descriptor_t *d);
-usbd_status usbreq_get_interface(struct usbd_device *udev, uint8_t iface_index, uint8_t *aiface);
-usbd_status usbreq_set_interface(struct usbd_device *udev, uint8_t iface_index, uint8_t altno);
-usbd_status usbreq_get_device_status(struct usbd_device *udev, usb_status_t *st);
-usbd_status usbreq_get_hub_descriptor(struct usbd_device *udev, usb_hub_descriptor_t *hd);
-usbd_status usbreq_get_hub_status(struct usbd_device *udev, usb_hub_status_t *st);
-usbd_status usbreq_set_address(struct usbd_device *udev, int32_t addr);
-usbd_status usbreq_get_port_status(struct usbd_device *udev, int32_t port, usb_port_status_t *ps);
-usbd_status usbreq_clear_hub_feature(struct usbd_device *udev, int32_t sel);
-usbd_status usbreq_set_hub_feature(struct usbd_device *udev, int32_t sel);
-usbd_status usbreq_clear_port_feature(struct usbd_device *udev, int32_t port, int32_t sel);
-usbd_status usbreq_set_port_feature(struct usbd_device *udev, int32_t port, int32_t sel);
-usbd_status usbreq_set_protocol(struct usbd_device *udev, uint8_t iface_index, uint16_t report);
-usbd_status usbreq_set_report(struct usbd_device *udev, uint8_t iface_index, uint8_t type, uint8_t id, void *data, int32_t len);
-usbd_status usbreq_get_report(struct usbd_device *udev, uint8_t iface_index, uint8_t type, uint8_t id, void *data, int32_t len);
-usbd_status usbreq_set_idle(struct usbd_device *udev, uint8_t iface_index, int32_t duration, int32_t id);
-usbd_status usbreq_get_report_descriptor(struct usbd_device *udev, int32_t ifcno, int32_t size, void *d);
-usbd_status usbreq_read_report_desc(struct usbd_device *udev, uint8_t iface_index, void **descp, int32_t *sizep, usb_malloc_type mem);
-usbd_status usbreq_set_config(struct usbd_device *udev, int32_t conf);
-usbd_status usbreq_get_config(struct usbd_device *udev, uint8_t *conf);
+usbd_status usbreq_reset_port(struct usbd_device *udev, struct mtx *mtx, usb_port_status_t *ps, uint8_t port);
+usbd_status usbreq_get_desc(struct usbd_device *udev, struct mtx *mtx, void *desc, uint16_t min_len, uint16_t max_len, uint16_t id, uint8_t type, uint8_t index, uint8_t retries);
+usbd_status usbreq_get_string_any(struct usbd_device *udev, struct mtx *mtx, char *buf, uint16_t len, uint8_t string_index);
+usbd_status usbreq_get_string_desc(struct usbd_device *udev, struct mtx *mtx, void *sdesc, uint16_t max_len, uint16_t lang_id, uint8_t string_index);
+usbd_status usbreq_get_config_desc(struct usbd_device *udev, struct mtx *mtx, usb_config_descriptor_t *d, uint8_t conf_index);
+usbd_status usbreq_get_config_desc_full(struct usbd_device *udev, struct mtx *mtx, void *d, uint16_t size, uint8_t conf_index);
+usbd_status usbreq_get_device_desc(struct usbd_device *udev, struct mtx *mtx, usb_device_descriptor_t *d);
+usbd_status usbreq_get_alt_interface_no(struct usbd_device *udev, struct mtx *mtx, uint8_t *alt_iface_no, uint8_t iface_index);
+usbd_status usbreq_set_alt_interface_no(struct usbd_device *udev, struct mtx *mtx, uint8_t iface_index, uint8_t alt_no);
+usbd_status usbreq_get_device_status(struct usbd_device *udev, struct mtx *mtx, usb_status_t *st);
+usbd_status usbreq_get_hub_descriptor(struct usbd_device *udev, struct mtx *mtx, usb_hub_descriptor_t *hd);
+usbd_status usbreq_get_hub_status(struct usbd_device *udev, struct mtx *mtx, usb_hub_status_t *st);
+usbd_status usbreq_set_address(struct usbd_device *udev, struct mtx *mtx, uint16_t addr);
+usbd_status usbreq_get_port_status(struct usbd_device *udev, struct mtx *mtx, usb_port_status_t *ps, uint8_t port);
+usbd_status usbreq_clear_hub_feature(struct usbd_device *udev, struct mtx *mtx, uint16_t sel);
+usbd_status usbreq_set_hub_feature(struct usbd_device *udev, struct mtx *mtx, uint16_t sel);
+usbd_status usbreq_clear_port_feature(struct usbd_device *udev, struct mtx *mtx, uint8_t port, uint16_t sel);
+usbd_status usbreq_set_port_feature(struct usbd_device *udev, struct mtx *mtx, uint8_t port, uint16_t sel);
+usbd_status usbreq_set_protocol(struct usbd_device *udev, struct mtx *mtx, uint8_t iface_index, uint16_t report);
+usbd_status usbreq_set_report(struct usbd_device *udev, struct mtx *mtx, void *data, uint16_t len, uint8_t iface_index, uint8_t type, uint8_t id);
+usbd_status usbreq_get_report(struct usbd_device *udev, struct mtx *mtx, void *data, uint16_t len, uint8_t iface_index, uint8_t type, uint8_t id);
+usbd_status usbreq_set_idle(struct usbd_device *udev, struct mtx *mtx, uint8_t iface_index, uint8_t duration, uint8_t id);
+usbd_status usbreq_get_report_descriptor(struct usbd_device *udev, struct mtx *mtx, void *d, uint16_t size, uint8_t iface_index);
+usbd_status usbreq_set_config(struct usbd_device *udev, struct mtx *mtx, uint8_t conf);
+usbd_status usbreq_get_config(struct usbd_device *udev, struct mtx *mtx, uint8_t *pconf);
/**/
#define usbd_get_device_descriptor(udev) (&(udev)->ddesc)
@@ -718,12 +737,18 @@
#define usbd_get_interface_altindex(iface) ((iface)->alt_index)
#define usbd_get_quirks(udev) ((udev)->quirks)
#define usbd_get_speed(udev) ((udev)->speed)
-#define usbd_get_hid_descriptor usbd_get_hdesc
-#define usbd_set_config_no usbd_search_and_set_config
+#define usbd_do_request(u,m,r,d) \
+ usbd_do_request_flags(u,m,r,d,0,NULL,USBD_DEFAULT_TIMEOUT)
/* helper for computing offsets */
#define POINTER_TO_UNSIGNED(ptr) \
- (((uint8_t *)(ptr)) - ((uint8_t *)0))
+ (((const uint8_t *)(ptr)) - ((const uint8_t *)0))
+
+#define USBD_ADD_BYTES(ptr,size) \
+ ((void *)(POINTER_TO_UNSIGNED(ptr) + (size)))
+
+#define USBD_MS_TO_TICKS(ms) \
+ (((uint32_t)((((uint32_t)(ms)) * ((uint32_t)(hz))) + 1023)) / 1024)
/* prototypes from "usb_cdev.c" */
@@ -737,9 +762,12 @@
int32_t usb_cdev_lock(struct usb_cdev *sc, int32_t fflags, int32_t error);
int32_t usb_cdev_attach(struct usb_cdev *sc, void *priv_sc, struct mtx *priv_mtx, const char **pp_dev, uid_t _uid, gid_t _gid, int32_t _perms, uint32_t rd_size, uint16_t rd_packets, uint32_t wr_size, uint16_t wr_packets);
void usb_cdev_detach(struct usb_cdev *sc);
-void usb_cdev_put_data(struct usb_cdev *sc, uint8_t *buf, uint32_t len, uint8_t what);
+uint32_t usb_cdev_put_bytes_max(struct usb_cdev *sc);
+void usb_cdev_put_data(struct usb_cdev *sc, struct usbd_page_cache *pc, uint32_t offset, uint32_t len, uint8_t what);
+void usb_cdev_put_data_linear(struct usb_cdev *sc, void *ptr, uint32_t len, uint8_t what);
void usb_cdev_put_data_error(struct usb_cdev *sc);
-uint8_t usb_cdev_get_data(struct usb_cdev *sc, uint8_t *buf, uint32_t len, uint32_t *actlen, uint8_t what);
+uint8_t usb_cdev_get_data(struct usb_cdev *sc, struct usbd_page_cache *pc, uint32_t offset, uint32_t len, uint32_t *actlen, uint8_t what);
+uint8_t usb_cdev_get_data_linear(struct usb_cdev *sc, void *ptr, uint32_t len, uint32_t *actlen, uint8_t what);
void usb_cdev_get_data_error(struct usb_cdev *sc);
uint8_t usb_cdev_opened(struct usb_cdev *sc);
@@ -811,11 +839,10 @@
/* other flags */
-#define USB_CDEV_FLAG_FWD_SHORT 0x00040000 /* can be set to forward short transfers */
-#define USB_CDEV_FLAG_READ_ONLY 0x00080000 /* device is read only */
-#define USB_CDEV_FLAG_WRITE_ONLY 0x00100000 /* device is write only */
-#define USB_CDEV_FLAG_WAKEUP_RD_IMMED 0x00200000 /* wakeup read thread immediately */
-#define USB_CDEV_FLAG_WAKEUP_WR_IMMED 0x00400000 /* wakeup write thread immediately */
+#define USB_CDEV_FLAG_READ_ONLY 0x00040000 /* device is read only */
+#define USB_CDEV_FLAG_WRITE_ONLY 0x00080000 /* device is write only */
+#define USB_CDEV_FLAG_WAKEUP_RD_IMMED 0x00100000 /* wakeup read thread immediately */
+#define USB_CDEV_FLAG_WAKEUP_WR_IMMED 0x00200000 /* wakeup write thread immediately */
uint8_t sc_wakeup_read; /* dummy */
uint8_t sc_wakeup_write; /* dummy */
More information about the p4-projects
mailing list