@@ -487,138 +487,157 @@ static const struct packet_info packet_info[] = {
487
487
};
488
488
489
489
static int
490
- handle_packet (uint32_t * data , size_t length )
490
+ handle_request_packet (uint32_t * data , size_t length )
491
491
{
492
- if (length == 0 ) {
493
- printf ("bus reset\r\n" );
494
- clear_pending_transaction_list ();
495
- } else if (length > sizeof (struct phy_packet )) {
496
- struct link_packet * p = (struct link_packet * ) data ;
497
- struct subaction * sa , * prev ;
498
- struct link_transaction * t ;
492
+ struct link_packet * p = (struct link_packet * ) data ;
493
+ struct subaction * sa , * prev ;
494
+ struct link_transaction * t ;
499
495
500
- switch (packet_info [p -> common .tcode ].type ) {
501
- case PACKET_REQUEST :
502
- t = link_transaction_lookup (p -> common .source , p -> common .destination ,
503
- p -> common .tlabel );
504
- sa = subaction_create (data , length );
505
- t -> request = sa ;
506
-
507
- if (!list_empty (& t -> request_list )) {
508
- prev = list_tail (& t -> request_list ,
509
- struct subaction , link );
510
-
511
- if (!ACK_BUSY (prev -> ack )) {
512
- /*
513
- * error, we should only see ack_busy_* before the
514
- * ack_pending/ack_complete -- this is an ack_pending
515
- * instead (ack_complete would have finished the
516
- * transaction).
517
- */
518
- }
496
+ t = link_transaction_lookup (p -> common .source , p -> common .destination ,
497
+ p -> common .tlabel );
498
+ sa = subaction_create (data , length );
499
+ t -> request = sa ;
500
+
501
+ if (!list_empty (& t -> request_list )) {
502
+ prev = list_tail (& t -> request_list ,
503
+ struct subaction , link );
504
+
505
+ if (!ACK_BUSY (prev -> ack )) {
506
+ /*
507
+ * error, we should only see ack_busy_* before the
508
+ * ack_pending/ack_complete -- this is an ack_pending
509
+ * instead (ack_complete would have finished the
510
+ * transaction).
511
+ */
512
+ }
519
513
520
- if (prev -> packet .common .tcode != sa -> packet .common .tcode ||
521
- prev -> packet .common .tlabel != sa -> packet .common .tlabel ) {
522
- /* memcmp() ? */
523
- /* error, these should match for retries. */
524
- }
525
- }
514
+ if (prev -> packet .common .tcode != sa -> packet .common .tcode ||
515
+ prev -> packet .common .tlabel != sa -> packet .common .tlabel ) {
516
+ /* memcmp() ? */
517
+ /* error, these should match for retries. */
518
+ }
519
+ }
526
520
527
- list_append (& t -> request_list , & sa -> link );
521
+ list_append (& t -> request_list , & sa -> link );
528
522
529
- switch (sa -> ack ) {
530
- case ACK_COMPLETE :
531
- if (p -> common .tcode != TCODE_WRITE_QUADLET &&
532
- p -> common .tcode != TCODE_WRITE_BLOCK )
533
- /* error, unified transactions only allowed for write */ ;
534
- list_remove (& t -> link );
535
- handle_transaction (t );
536
- break ;
523
+ switch (sa -> ack ) {
524
+ case ACK_COMPLETE :
525
+ if (p -> common .tcode != TCODE_WRITE_QUADLET &&
526
+ p -> common .tcode != TCODE_WRITE_BLOCK )
527
+ /* error, unified transactions only allowed for write */ ;
528
+ list_remove (& t -> link );
529
+ handle_transaction (t );
530
+ break ;
537
531
538
- case ACK_NO_ACK :
539
- case ACK_DATA_ERROR :
540
- case ACK_TYPE_ERROR :
541
- list_remove (& t -> link );
542
- handle_transaction (t );
543
- break ;
532
+ case ACK_NO_ACK :
533
+ case ACK_DATA_ERROR :
534
+ case ACK_TYPE_ERROR :
535
+ list_remove (& t -> link );
536
+ handle_transaction (t );
537
+ break ;
538
+
539
+ case ACK_PENDING :
540
+ /* request subaction phase over, wait for response. */
541
+ break ;
542
+
543
+ case ACK_BUSY_X :
544
+ case ACK_BUSY_A :
545
+ case ACK_BUSY_B :
546
+ /* ok, wait for retry. */
547
+ /* check that retry protocol is respected. */
548
+ break ;
549
+ }
544
550
545
- case ACK_PENDING :
546
- /* request subaction phase over, wait for response. */
547
- break ;
551
+ return 1 ;
552
+ }
548
553
549
- case ACK_BUSY_X :
550
- case ACK_BUSY_A :
551
- case ACK_BUSY_B :
552
- /* ok, wait for retry. */
553
- /* check that retry protocol is respected. */
554
- break ;
555
- }
556
- break ;
554
+ static int
555
+ handle_response_packet (uint32_t * data , size_t length )
556
+ {
557
+ struct link_packet * p = (struct link_packet * ) data ;
558
+ struct subaction * sa , * prev ;
559
+ struct link_transaction * t ;
557
560
558
- case PACKET_RESPONSE :
559
- t = link_transaction_lookup (p -> common .destination , p -> common .source ,
560
- p -> common .tlabel );
561
- if (list_empty (& t -> request_list )) {
562
- /* unsolicited response */
563
- }
561
+ t = link_transaction_lookup (p -> common .destination , p -> common .source ,
562
+ p -> common .tlabel );
563
+ if (list_empty (& t -> request_list )) {
564
+ /* unsolicited response */
565
+ }
564
566
565
- sa = subaction_create (data , length );
566
- t -> response = sa ;
567
+ sa = subaction_create (data , length );
568
+ t -> response = sa ;
567
569
568
- if (!list_empty (& t -> response_list )) {
569
- prev = list_tail (& t -> response_list , struct subaction , link );
570
+ if (!list_empty (& t -> response_list )) {
571
+ prev = list_tail (& t -> response_list , struct subaction , link );
570
572
571
- if (!ACK_BUSY (prev -> ack )) {
572
- /*
573
- * error, we should only see ack_busy_* before the
574
- * ack_pending/ack_complete
575
- */
576
- }
573
+ if (!ACK_BUSY (prev -> ack )) {
574
+ /*
575
+ * error, we should only see ack_busy_* before the
576
+ * ack_pending/ack_complete
577
+ */
578
+ }
577
579
578
- if (prev -> packet .common .tcode != sa -> packet .common .tcode ||
579
- prev -> packet .common .tlabel != sa -> packet .common .tlabel ) {
580
- /* use memcmp() instead? */
581
- /* error, these should match for retries. */
582
- }
583
- } else {
584
- prev = list_tail (& t -> request_list , struct subaction , link );
585
- if (prev -> ack != ACK_PENDING ) {
586
- /*
587
- * error, should not get response unless last request got
588
- * ack_pending.
589
- */
590
- }
580
+ if (prev -> packet .common .tcode != sa -> packet .common .tcode ||
581
+ prev -> packet .common .tlabel != sa -> packet .common .tlabel ) {
582
+ /* use memcmp() instead? */
583
+ /* error, these should match for retries. */
584
+ }
585
+ } else {
586
+ prev = list_tail (& t -> request_list , struct subaction , link );
587
+ if (prev -> ack != ACK_PENDING ) {
588
+ /*
589
+ * error, should not get response unless last request got
590
+ * ack_pending.
591
+ */
592
+ }
591
593
592
- if (packet_info [prev -> packet .common .tcode ].response_tcode !=
593
- sa -> packet .common .tcode ) {
594
- /* error, tcode mismatch */
595
- }
596
- }
594
+ if (packet_info [prev -> packet .common .tcode ].response_tcode !=
595
+ sa -> packet .common .tcode ) {
596
+ /* error, tcode mismatch */
597
+ }
598
+ }
597
599
598
- list_append (& t -> response_list , & sa -> link );
600
+ list_append (& t -> response_list , & sa -> link );
599
601
600
- switch (sa -> ack ) {
601
- case ACK_COMPLETE :
602
- case ACK_NO_ACK :
603
- case ACK_DATA_ERROR :
604
- case ACK_TYPE_ERROR :
605
- list_remove (& t -> link );
606
- handle_transaction (t );
607
- /* transaction complete, remove t from pending list. */
608
- break ;
602
+ switch (sa -> ack ) {
603
+ case ACK_COMPLETE :
604
+ case ACK_NO_ACK :
605
+ case ACK_DATA_ERROR :
606
+ case ACK_TYPE_ERROR :
607
+ list_remove (& t -> link );
608
+ handle_transaction (t );
609
+ /* transaction complete, remove t from pending list. */
610
+ break ;
611
+
612
+ case ACK_PENDING :
613
+ /* error for responses. */
614
+ break ;
615
+
616
+ case ACK_BUSY_X :
617
+ case ACK_BUSY_A :
618
+ case ACK_BUSY_B :
619
+ /* no problem, wait for next retry */
620
+ break ;
621
+ }
609
622
610
- case ACK_PENDING :
611
- /* error for responses. */
612
- break ;
623
+ return 1 ;
624
+ }
613
625
614
- case ACK_BUSY_X :
615
- case ACK_BUSY_A :
616
- case ACK_BUSY_B :
617
- /* no problem, wait for next retry */
618
- break ;
619
- }
626
+ static int
627
+ handle_packet (uint32_t * data , size_t length )
628
+ {
629
+ if (length == 0 ) {
630
+ printf ("bus reset\r\n" );
631
+ clear_pending_transaction_list ();
632
+ } else if (length > sizeof (struct phy_packet )) {
633
+ struct link_packet * p = (struct link_packet * ) data ;
620
634
621
- break ;
635
+ switch (packet_info [p -> common .tcode ].type ) {
636
+ case PACKET_REQUEST :
637
+ return handle_request_packet (data , length );
638
+
639
+ case PACKET_RESPONSE :
640
+ return handle_response_packet (data , length );
622
641
623
642
case PACKET_OTHER :
624
643
case PACKET_RESERVED :
0 commit comments