@@ -992,12 +992,33 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
992
992
int i ;
993
993
994
994
for_each_sg (sg , s , req -> num_pending_sgs , i ) {
995
+ unsigned int length = req -> request .length ;
996
+ unsigned int maxp = usb_endpoint_maxp (dep -> endpoint .desc );
997
+ unsigned int rem = length % maxp ;
995
998
unsigned chain = true;
996
999
997
1000
if (sg_is_last (s ))
998
1001
chain = false;
999
1002
1000
- dwc3_prepare_one_trb (dep , req , chain , i );
1003
+ if (rem && usb_endpoint_dir_out (dep -> endpoint .desc ) && !chain ) {
1004
+ struct dwc3 * dwc = dep -> dwc ;
1005
+ struct dwc3_trb * trb ;
1006
+
1007
+ req -> unaligned = true;
1008
+
1009
+ /* prepare normal TRB */
1010
+ dwc3_prepare_one_trb (dep , req , true, i );
1011
+
1012
+ /* Now prepare one extra TRB to align transfer size */
1013
+ trb = & dep -> trb_pool [dep -> trb_enqueue ];
1014
+ __dwc3_prepare_one_trb (dep , trb , dwc -> bounce_addr ,
1015
+ maxp - rem , false, 0 ,
1016
+ req -> request .stream_id ,
1017
+ req -> request .short_not_ok ,
1018
+ req -> request .no_interrupt );
1019
+ } else {
1020
+ dwc3_prepare_one_trb (dep , req , chain , i );
1021
+ }
1001
1022
1002
1023
if (!dwc3_calc_trbs_left (dep ))
1003
1024
break ;
@@ -1007,7 +1028,28 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep,
1007
1028
static void dwc3_prepare_one_trb_linear (struct dwc3_ep * dep ,
1008
1029
struct dwc3_request * req )
1009
1030
{
1010
- dwc3_prepare_one_trb (dep , req , false, 0 );
1031
+ unsigned int length = req -> request .length ;
1032
+ unsigned int maxp = usb_endpoint_maxp (dep -> endpoint .desc );
1033
+ unsigned int rem = length % maxp ;
1034
+
1035
+ if (rem && usb_endpoint_dir_out (dep -> endpoint .desc )) {
1036
+ struct dwc3 * dwc = dep -> dwc ;
1037
+ struct dwc3_trb * trb ;
1038
+
1039
+ req -> unaligned = true;
1040
+
1041
+ /* prepare normal TRB */
1042
+ dwc3_prepare_one_trb (dep , req , true, 0 );
1043
+
1044
+ /* Now prepare one extra TRB to align transfer size */
1045
+ trb = & dep -> trb_pool [dep -> trb_enqueue ];
1046
+ __dwc3_prepare_one_trb (dep , trb , dwc -> bounce_addr , maxp - rem ,
1047
+ false, 0 , req -> request .stream_id ,
1048
+ req -> request .short_not_ok ,
1049
+ req -> request .no_interrupt );
1050
+ } else {
1051
+ dwc3_prepare_one_trb (dep , req , false, 0 );
1052
+ }
1011
1053
}
1012
1054
1013
1055
/*
@@ -2031,6 +2073,16 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep,
2031
2073
if (chain && (trb -> ctrl & DWC3_TRB_CTRL_HWO ))
2032
2074
trb -> ctrl &= ~DWC3_TRB_CTRL_HWO ;
2033
2075
2076
+ /*
2077
+ * If we're dealing with unaligned size OUT transfer, we will be left
2078
+ * with one TRB pending in the ring. We need to manually clear HWO bit
2079
+ * from that TRB.
2080
+ */
2081
+ if (req -> unaligned && (trb -> ctrl & DWC3_TRB_CTRL_HWO )) {
2082
+ trb -> ctrl &= ~DWC3_TRB_CTRL_HWO ;
2083
+ return 1 ;
2084
+ }
2085
+
2034
2086
if ((trb -> ctrl & DWC3_TRB_CTRL_HWO ) && status != - ESHUTDOWN )
2035
2087
return 1 ;
2036
2088
@@ -2120,6 +2172,13 @@ static int dwc3_cleanup_done_reqs(struct dwc3 *dwc, struct dwc3_ep *dep,
2120
2172
event , status , chain );
2121
2173
}
2122
2174
2175
+ if (req -> unaligned ) {
2176
+ trb = & dep -> trb_pool [dep -> trb_dequeue ];
2177
+ ret = __dwc3_cleanup_done_trbs (dwc , dep , req , trb ,
2178
+ event , status , false);
2179
+ req -> unaligned = false;
2180
+ }
2181
+
2123
2182
req -> request .actual = length - req -> remaining ;
2124
2183
2125
2184
if ((req -> request .actual < length ) && req -> num_pending_sgs )
@@ -3058,12 +3117,6 @@ int dwc3_gadget_init(struct dwc3 *dwc)
3058
3117
3059
3118
dwc -> gadget .max_speed = dwc -> maximum_speed ;
3060
3119
3061
- /*
3062
- * Per databook, DWC3 needs buffer size to be aligned to MaxPacketSize
3063
- * on ep out.
3064
- */
3065
- dwc -> gadget .quirk_ep_out_aligned_size = true;
3066
-
3067
3120
/*
3068
3121
* REVISIT: Here we should clear all pending IRQs to be
3069
3122
* sure we're starting from a well known location.
0 commit comments