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