Skip to content

Commit 269fe10

Browse files
author
Stefan Richter
committed
tools/firewire: nosy-dump: break up a deeply nested function
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
1 parent 468066f commit 269fe10

File tree

1 file changed

+132
-113
lines changed

1 file changed

+132
-113
lines changed

tools/firewire/nosy-dump.c

Lines changed: 132 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -487,138 +487,157 @@ static const struct packet_info packet_info[] = {
487487
};
488488

489489
static int
490-
handle_packet(uint32_t *data, size_t length)
490+
handle_request_packet(uint32_t *data, size_t length)
491491
{
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;
499495

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+
}
519513

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+
}
526520

527-
list_append(&t->request_list, &sa->link);
521+
list_append(&t->request_list, &sa->link);
528522

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;
537531

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+
}
544550

545-
case ACK_PENDING:
546-
/* request subaction phase over, wait for response. */
547-
break;
551+
return 1;
552+
}
548553

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;
557560

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+
}
564566

565-
sa = subaction_create(data, length);
566-
t->response = sa;
567+
sa = subaction_create(data, length);
568+
t->response = sa;
567569

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);
570572

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+
}
577579

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+
}
591593

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+
}
597599

598-
list_append(&t->response_list, &sa->link);
600+
list_append(&t->response_list, &sa->link);
599601

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+
}
609622

610-
case ACK_PENDING:
611-
/* error for responses. */
612-
break;
623+
return 1;
624+
}
613625

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;
620634

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);
622641

623642
case PACKET_OTHER:
624643
case PACKET_RESERVED:

0 commit comments

Comments
 (0)