[PATCH v3 01/10] usb: gadget: add anonymous definition in struct usb_gadget

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Some UDC trace event will save usb gadget information, but it use one int
size buffer to save one bit information of usb gadget, so 19 int buffers
needed to save 19 bit fields which is not good.

Add one anonymous union which have one u32 member 'dw1' to struct
'usb_gadget', it inlclude all 19 bits and can be used by trace event
during fast assign stage to save more entries with same trace ring buffer
size.

Also move all original 19 bit fields into one anonymous struct which
inside struct 'usb_gadget'.

In order to allow trace event output stage access the bit from saved u32
'dw1', add following macro,
define USB_GADGET_BITFIELD(n, name) \
	({\
	union {\
		struct {\
			u32	sg_supported:1;\
			u32	is_otg:1;\
			u32	is_a_peripheral:1;\
			u32	b_hnp_enable:1;\
			u32	a_hnp_support:1;\
			u32	a_alt_hnp_support:1;\
			u32	hnp_polling_support:1;\
			u32	host_request_flag:1;\
			u32	quirk_ep_out_aligned_size:1;\
			u32	quirk_altset_not_supp:1;\
			u32	quirk_stall_not_supp:1;\
			u32	quirk_zlp_not_supp:1;\
			u32	quirk_avoids_skb_reserve:1;\
			u32	is_selfpowered:1;\
			u32	deactivated:1;\
			u32	connected:1;\
			u32	lpm_capable:1;\
			u32	wakeup_capable:1;\
			u32	wakeup_armed:1;\
		} __packed;\
		u32		dw1;\
	} __aligned(4) __g_u_##name;\
	u32 __g_##name; \
	BUILD_BUG_ON(sizeof(__g_u_##name) != 4);\
	__g_u_##name.dw1 = (n); __g_##name = __g_u_##name.name;\
	__g_##name; })

define USB_GADGET_SG_SUPPORTED(n) USB_GADGET_BITFIELD((n), sg_supported)
...
change to use this kind of macro for all related trace files later.

Signed-off-by: Linyu Yuan <quic_linyyuan@xxxxxxxxxxx>
---
v2: no change
v3: change method to extract bit field

 include/linux/usb/gadget.h | 96 ++++++++++++++++++++++++++++++--------
 1 file changed, 77 insertions(+), 19 deletions(-)

diff --git a/include/linux/usb/gadget.h b/include/linux/usb/gadget.h
index 75bda0783395..f02e1bd20924 100644
--- a/include/linux/usb/gadget.h
+++ b/include/linux/usb/gadget.h
@@ -357,6 +357,7 @@ struct usb_gadget_ops {
  * @in_epnum: last used in ep number
  * @mA: last set mA value
  * @otg_caps: OTG capabilities of this gadget.
+ * @dw1: trace event purpose
  * @sg_supported: true if we can handle scatter-gather
  * @is_otg: True if the USB device port uses a Mini-AB jack, so that the
  *	gadget driver must provide a USB OTG descriptor.
@@ -432,30 +433,87 @@ struct usb_gadget {
 	unsigned			mA;
 	struct usb_otg_caps		*otg_caps;
 
-	unsigned			sg_supported:1;
-	unsigned			is_otg:1;
-	unsigned			is_a_peripheral:1;
-	unsigned			b_hnp_enable:1;
-	unsigned			a_hnp_support:1;
-	unsigned			a_alt_hnp_support:1;
-	unsigned			hnp_polling_support:1;
-	unsigned			host_request_flag:1;
-	unsigned			quirk_ep_out_aligned_size:1;
-	unsigned			quirk_altset_not_supp:1;
-	unsigned			quirk_stall_not_supp:1;
-	unsigned			quirk_zlp_not_supp:1;
-	unsigned			quirk_avoids_skb_reserve:1;
-	unsigned			is_selfpowered:1;
-	unsigned			deactivated:1;
-	unsigned			connected:1;
-	unsigned			lpm_capable:1;
-	unsigned			wakeup_capable:1;
-	unsigned			wakeup_armed:1;
+	union {
+		struct {
+			unsigned	sg_supported:1;
+			unsigned	is_otg:1;
+			unsigned	is_a_peripheral:1;
+			unsigned	b_hnp_enable:1;
+			unsigned	a_hnp_support:1;
+			unsigned	a_alt_hnp_support:1;
+			unsigned	hnp_polling_support:1;
+			unsigned	host_request_flag:1;
+			unsigned	quirk_ep_out_aligned_size:1;
+			unsigned	quirk_altset_not_supp:1;
+			unsigned	quirk_stall_not_supp:1;
+			unsigned	quirk_zlp_not_supp:1;
+			unsigned	quirk_avoids_skb_reserve:1;
+			unsigned	is_selfpowered:1;
+			unsigned	deactivated:1;
+			unsigned	connected:1;
+			unsigned	lpm_capable:1;
+			unsigned	wakeup_capable:1;
+			unsigned	wakeup_armed:1;
+		} __packed;
+
+		u32			dw1;
+	} __aligned(4);
 	int				irq;
 	int				id_number;
 };
 #define work_to_gadget(w)	(container_of((w), struct usb_gadget, work))
 
+#define USB_GADGET_BITFIELD(n, name) \
+	({\
+	union {\
+		struct {\
+			u32	sg_supported:1;\
+			u32	is_otg:1;\
+			u32	is_a_peripheral:1;\
+			u32	b_hnp_enable:1;\
+			u32	a_hnp_support:1;\
+			u32	a_alt_hnp_support:1;\
+			u32	hnp_polling_support:1;\
+			u32	host_request_flag:1;\
+			u32	quirk_ep_out_aligned_size:1;\
+			u32	quirk_altset_not_supp:1;\
+			u32	quirk_stall_not_supp:1;\
+			u32	quirk_zlp_not_supp:1;\
+			u32	quirk_avoids_skb_reserve:1;\
+			u32	is_selfpowered:1;\
+			u32	deactivated:1;\
+			u32	connected:1;\
+			u32	lpm_capable:1;\
+			u32	wakeup_capable:1;\
+			u32	wakeup_armed:1;\
+		} __packed;\
+		u32		dw1;\
+	} __aligned(4) __g_u_##name;\
+	u32 __g_##name; \
+	BUILD_BUG_ON(sizeof(__g_u_##name) != 4);\
+	__g_u_##name.dw1 = (n); __g_##name = __g_u_##name.name;\
+	__g_##name; })
+
+#define USB_GADGET_SG_SUPPORTED(n) USB_GADGET_BITFIELD((n), sg_supported)
+#define USB_GADGET_IS_OTG(n) USB_GADGET_BITFIELD((n), is_otg)
+#define USB_GADGET_IS_A_PERIPHERAL(n) USB_GADGET_BITFIELD((n), is_a_peripheral)
+#define USB_GADGET_B_HNP_ENABLE(n) USB_GADGET_BITFIELD((n), b_hnp_enable)
+#define USB_GADGET_A_HNP_SUPPORT(n) USB_GADGET_BITFIELD((n), a_hnp_support)
+#define USB_GADGET_A_ALT_HNP_SUPPORT(n) USB_GADGET_BITFIELD((n), a_alt_hnp_support)
+#define USB_GADGET_HNP_POLLING_SUPPORT(n) USB_GADGET_BITFIELD((n), hnp_polling_support)
+#define USB_GADGET_HOST_REQUEST_FLAG(n) USB_GADGET_BITFIELD((n), host_request_flag)
+#define USB_GADGET_QUIRK_EP_OUT_ALIGNED_SIZE(n) USB_GADGET_BITFIELD((n), quirk_ep_out_aligned_size)
+#define USB_GADGET_QUIRK_ALTSET_NOT_SUPP(n) USB_GADGET_BITFIELD((n), quirk_altset_not_supp)
+#define USB_GADGET_QUIRK_STALL_NOT_SUPP(n) USB_GADGET_BITFIELD((n), quirk_stall_not_supp)
+#define USB_GADGET_QUIRK_ZLP_NOT_SUPP(n) USB_GADGET_BITFIELD((n), quirk_zlp_not_supp)
+#define USB_GADGET_QUIRK_AVOIDS_SKB_RESERVE(n) USB_GADGET_BITFIELD((n), quirk_avoids_skb_reserve)
+#define USB_GADGET_IS_SELFPOWERED(n) USB_GADGET_BITFIELD((n), is_selfpowered)
+#define USB_GADGET_DEACTIVATED(n) USB_GADGET_BITFIELD((n), deactivated)
+#define USB_GADGET_CONNECTED(n) USB_GADGET_BITFIELD((n), connected)
+#define USB_GADGET_LPM_CAPABLE(n) USB_GADGET_BITFIELD((n), lpm_capable)
+#define USB_GADGET_WAKEUP_CAPABLE(n) USB_GADGET_BITFIELD((n), wakeup_capable)
+#define USB_GADGET_WAKEUP_ARMED(n) USB_GADGET_BITFIELD((n), wakeup_armed)
+
 /* Interface to the device model */
 static inline void set_gadget_data(struct usb_gadget *gadget, void *data)
 	{ dev_set_drvdata(&gadget->dev, data); }
-- 
2.17.1




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux