@@ -1214,6 +1214,7 @@ static int _ehci_submit_control_msg(struct usb_device *dev, unsigned long pipe,
12141214
12151215struct int_queue {
12161216 int elementsize ;
1217+ unsigned long pipe ;
12171218 struct QH * first ;
12181219 struct QH * current ;
12191220 struct QH * last ;
@@ -1269,7 +1270,7 @@ static struct int_queue *_ehci_create_int_queue(struct usb_device *dev,
12691270{
12701271 struct ehci_ctrl * ctrl = ehci_get_ctrl (dev );
12711272 struct int_queue * result = NULL ;
1272- int i ;
1273+ uint32_t i , toggle ;
12731274
12741275 /*
12751276 * Interrupt transfers requiring several transactions are not supported
@@ -1309,6 +1310,7 @@ static struct int_queue *_ehci_create_int_queue(struct usb_device *dev,
13091310 goto fail1 ;
13101311 }
13111312 result -> elementsize = elementsize ;
1313+ result -> pipe = pipe ;
13121314 result -> first = memalign (USB_DMA_MINALIGN ,
13131315 sizeof (struct QH ) * queuesize );
13141316 if (!result -> first ) {
@@ -1326,6 +1328,8 @@ static struct int_queue *_ehci_create_int_queue(struct usb_device *dev,
13261328 memset (result -> first , 0 , sizeof (struct QH ) * queuesize );
13271329 memset (result -> tds , 0 , sizeof (struct qTD ) * queuesize );
13281330
1331+ toggle = usb_gettoggle (dev , usb_pipeendpoint (pipe ), usb_pipeout (pipe ));
1332+
13291333 for (i = 0 ; i < queuesize ; i ++ ) {
13301334 struct QH * qh = result -> first + i ;
13311335 struct qTD * td = result -> tds + i ;
@@ -1357,7 +1361,9 @@ static struct int_queue *_ehci_create_int_queue(struct usb_device *dev,
13571361 td -> qt_altnext = cpu_to_hc32 (QT_NEXT_TERMINATE );
13581362 debug ("communication direction is '%s'\n" ,
13591363 usb_pipein (pipe ) ? "in" : "out" );
1360- td -> qt_token = cpu_to_hc32 ((elementsize << 16 ) |
1364+ td -> qt_token = cpu_to_hc32 (
1365+ QT_TOKEN_DT (toggle ) |
1366+ (elementsize << 16 ) |
13611367 ((usb_pipein (pipe ) ? 1 : 0 ) << 8 ) | /* IN/OUT token */
13621368 0x80 ); /* active */
13631369 td -> qt_buffer [0 ] =
@@ -1372,6 +1378,7 @@ static struct int_queue *_ehci_create_int_queue(struct usb_device *dev,
13721378 cpu_to_hc32 ((td -> qt_buffer [0 ] + 0x4000 ) & ~0xfff );
13731379
13741380 * buf = buffer + i * elementsize ;
1381+ toggle ^= 1 ;
13751382 }
13761383
13771384 flush_dcache_range ((unsigned long )buffer ,
@@ -1426,6 +1433,8 @@ static void *_ehci_poll_int_queue(struct usb_device *dev,
14261433{
14271434 struct QH * cur = queue -> current ;
14281435 struct qTD * cur_td ;
1436+ uint32_t token , toggle ;
1437+ unsigned long pipe = queue -> pipe ;
14291438
14301439 /* depleted queue */
14311440 if (cur == NULL ) {
@@ -1436,12 +1445,15 @@ static void *_ehci_poll_int_queue(struct usb_device *dev,
14361445 cur_td = & queue -> tds [queue -> current - queue -> first ];
14371446 invalidate_dcache_range ((unsigned long )cur_td ,
14381447 ALIGN_END_ADDR (struct qTD , cur_td , 1 ));
1439- if (QT_TOKEN_GET_STATUS (hc32_to_cpu (cur_td -> qt_token )) &
1440- QT_TOKEN_STATUS_ACTIVE ) {
1441- debug ("Exit poll_int_queue with no completed intr transfer. token is %x\n" ,
1442- hc32_to_cpu (cur_td -> qt_token ));
1448+ token = hc32_to_cpu (cur_td -> qt_token );
1449+ if (QT_TOKEN_GET_STATUS (token ) & QT_TOKEN_STATUS_ACTIVE ) {
1450+ debug ("Exit poll_int_queue with no completed intr transfer. token is %x\n" , token );
14431451 return NULL ;
14441452 }
1453+
1454+ toggle = QT_TOKEN_GET_DT (token );
1455+ usb_settoggle (dev , usb_pipeendpoint (pipe ), usb_pipeout (pipe ), toggle );
1456+
14451457 if (!(cur -> qh_link & QH_LINK_TERMINATE ))
14461458 queue -> current ++ ;
14471459 else
@@ -1452,7 +1464,7 @@ static void *_ehci_poll_int_queue(struct usb_device *dev,
14521464 queue -> elementsize ));
14531465
14541466 debug ("Exit poll_int_queue with completed intr transfer. token is %x at %p (first at %p)\n" ,
1455- hc32_to_cpu ( cur_td -> qt_token ) , cur , queue -> first );
1467+ token , cur , queue -> first );
14561468 return cur -> buffer ;
14571469}
14581470
0 commit comments