From owner-p4-projects@FreeBSD.ORG Sun Sep 23 17:17:52 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 903EC16A420; Sun, 23 Sep 2007 17:17:52 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 331D116A419 for ; Sun, 23 Sep 2007 17:17:52 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 095FE13C47E for ; Sun, 23 Sep 2007 17:17:52 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l8NHHpJc010492 for ; Sun, 23 Sep 2007 17:17:51 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l8NHHpJW010489 for perforce@freebsd.org; Sun, 23 Sep 2007 17:17:51 GMT (envelope-from hselasky@FreeBSD.org) Date: Sun, 23 Sep 2007 17:17:51 GMT Message-Id: <200709231717.l8NHHpJW010489@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 126751 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 23 Sep 2007 17:17:53 -0000 http://perforce.freebsd.org/chv.cgi?CH=126751 Change 126751 by hselasky@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 */