Exemple #1
0
static void
dumpsym (const rpc_sym *s)
{
  switch (s->type) {
  case rpc_sym::CONST:
    aout << "enum { " << s->sconst->id
	 << " = " << s->sconst->val << " };\n";
    break;
  case rpc_sym::STRUCT:
    dumpstruct (s);
    break;
  case rpc_sym::UNION:
    dumpunion (s);
    break;
  case rpc_sym::ENUM:
    dumpenum (s);
    break;
  case rpc_sym::TYPEDEF:
    dumptypedef (s);
    break;
  case rpc_sym::PROGRAM:
    dumpprog (s->sprogram);
    break;
  case rpc_sym::NAMESPACE:
    dumpnamespace (s);
    break;
  case rpc_sym::LITERAL:
    aout << *s->sliteral << "\n";
    break;
  default:
    break;
  }
}
Exemple #2
0
int spec_i2c_init(struct fmc_device *fmc)
{
	struct spec_dev *spec = fmc->carrier_data;
	void *buf;
	int i, found;

	found = mi2c_scan(fmc);
	if (!found) {
		fmc->flags |= FMC_DEVICE_NO_MEZZANINE;
		return 0;
	}

	buf = kmalloc(SPEC_I2C_EEPROM_SIZE, GFP_KERNEL);
	if (!buf)
		return -ENOMEM;

	i = spec_eeprom_read(fmc, SPEC_I2C_EEPROM_ADDR, 0, buf,
			     SPEC_I2C_EEPROM_SIZE);
	if (i != SPEC_I2C_EEPROM_SIZE) {
		dev_err(&spec->pdev->dev, "EEPROM read error: retval is %i\n",
			i);
		kfree(buf);
		return -EIO;
	}
	fmc->eeprom = buf;
	fmc->eeprom_len = SPEC_I2C_EEPROM_SIZE;

	if (spec_i2c_dump)
		dumpstruct("eeprom", buf, SPEC_I2C_EEPROM_SIZE);

	return 0;
}
/* TLV dumper, not yet white-rabbit aware */
static int dump_tlv(char *prefix, struct ptp_tlv *tlv, int totallen)
{
	/* the field includes 6 bytes of the header, ecludes 4 of them. Bah! */
	int explen = ntohs(tlv->len) + 4;

	printf("%sTLV: type %04x len %i oui %02x:%02x:%02x "
	       "sub %02x:%02x:%02x\n", prefix, ntohs(tlv->type), explen,
	       tlv->oui[0], tlv->oui[1], tlv->oui[2],
	       tlv->subtype[0], tlv->subtype[1], tlv->subtype[2]);
	if (explen > totallen) {
		printf("%sTLV: too short (expected %i, total %i)\n", prefix,
		       explen, totallen);
		return totallen;
	}

	/* later:  if (memcmp(tlv->oui, "\x08\x00\x30", 3)) ... */

	/* Now dump non-wr tlv in binary, count only payload */
	dumpstruct(prefix, "TLV: ", "tlv-content", tlv->data,
		   explen - sizeof(*tlv));
	return explen;
}
/* A big function to dump the ptp information */
static void dump_payload(char *prefix, void *pl, int len)
{
	struct ptp_header *h = pl;
	void *msg_specific = (void *)(h + 1);
	int donelen = 34; /* packet length before tlv */
	int version = h->versionPTP_and_reserved & 0xf;
	int messageType = h->type_and_transport_specific & 0xf;

	if (version != 2) {
		printf("%sVERSION: unsupported (%i)\n", prefix, version);
		return;
	}
	printf("%sVERSION: %i (type %i, len %i, domain %i)\n", prefix,
	       version, messageType,
	       ntohs(h->messageLength), h->domainNumber);
	printf("%sFLAGS: 0x%04x (correction %08lu)\n", prefix, h->flagField,
	       (unsigned long)h->correctionField);
	dump_1port(prefix, "PORT: ", h->sourcePortIdentity);
	printf("%sREST: seq %i, ctrl %i, log-interval %i\n", prefix,
	       ntohs(h->sequenceId), h->controlField, h->logMessageInterval);
#define CASE(t, x) case PPM_ ##x: printf("%sMESSAGE: (" #t ") " #x "\n", prefix)
	switch(messageType) {
		CASE(E, SYNC);
		dump_msg_sync_etc(prefix, "MSG-SYNC: ", msg_specific);
		donelen = 44;
		break;

		CASE(E, DELAY_REQ);
		dump_msg_sync_etc(prefix, "MSG-DELAY_REQ: ", msg_specific);
		donelen = 44;
		break;

		CASE(G, FOLLOW_UP);
		dump_msg_sync_etc(prefix, "MSG-FOLLOW_UP: ", msg_specific);
		donelen = 44;
		break;

		CASE(G, DELAY_RESP);
		dump_msg_resp_etc(prefix, "MSG-DELAY_RESP: ", msg_specific);
		donelen = 54;
		break;

		CASE(G, ANNOUNCE);
		dump_msg_announce(prefix, msg_specific);
		donelen = 64;
		break;

		CASE(G, SIGNALING);
		dump_1port(prefix, "MSG-SIGNALING: target-port ", msg_specific);
		donelen = 44;
		break;

#if __STDC_HOSTED__ /* Avoid pdelay dump withing ppsi, we don't use it */
		CASE(E, PDELAY_REQ);
		dump_msg_sync_etc(prefix, "MSG-PDELAY_REQ: ", msg_specific);
		donelen = 54;
		break;

		CASE(E, PDELAY_RESP);
		dump_msg_resp_etc(prefix, "MSG-PDELAY_RESP: ", msg_specific);
		donelen = 54;
		break;

		CASE(G, PDELAY_RESP_FOLLOW_UP);
		dump_msg_resp_etc(prefix, "MSG-PDELAY_RESP_FOLLOWUP: ",
				  msg_specific);
		donelen = 54;
		break;

		CASE(G, MANAGEMENT);
		/* FIXME */
		break;
#endif
	}

	/*
	 * Dump any trailing TLV, but ignore a trailing 2-long data hunk.
	 * The trailing zeroes appear with less-than-minimum Eth messages.
	 */
	while (donelen < len && len - donelen > 2) {
		int n = len - donelen;
		if (n < sizeof(struct ptp_tlv)) {
			printf("%sTLV: too short (%i - %i = %i)\n", prefix,
			       len, donelen, n);
			break;
		}
		donelen += dump_tlv(prefix, pl + donelen, n);
	}

	/* Finally, binary dump of it all */
	dumpstruct(prefix, "DUMP: ", "payload", pl, len);
}