static void print_rfcomm_hdr(long_frame_head* head, uint8_t *ptr, int len)
{
	address_field addr = head->addr;
	uint8_t ctr = head->control;
	uint16_t ilen = head->length.bits.len;
	uint8_t ctr_type,pf,dlci,fcs;

	dlci     = GET_DLCI(addr);
	pf       = GET_PF(ctr);
	ctr_type = CLR_PF(ctr);
	fcs      = *(ptr + len - 1);

	printf("cr %d dlci %d pf %d ilen %d fcs 0x%x ", addr.cr, dlci, pf, ilen, fcs); 
}
void rfcomm_dump(int level, struct frame *frm)
{
	uint8_t hdr_size, ctr_type;
	short_frame_head *short_head_p = (void *) frm->ptr;
	long_frame_head head;

	if (short_head_p->length.ea == EA) {
		head.addr = short_head_p->addr;
		head.control = short_head_p->control;
		head.length.bits.len = short_head_p->length.len;
		hdr_size = sizeof(short_frame_head);
	} else {
		head = *(long_frame_head *) frm->ptr;
		head.length.val = btohs(head.length.val);
		hdr_size = sizeof(long_frame_head);
	}

	frm->ptr += hdr_size;
	frm->len -= hdr_size;

	ctr_type = CLR_PF(head.control);

	if (ctr_type == UIH) {
		uih_frame(level, frm, &head);
	} else {
		p_indent(level, frm); 
		printf("RFCOMM(s): ");

		switch (ctr_type) {
		case SABM:
			printf("SABM: ");
			break;
		case UA:
			printf("UA: ");
			break;
		case DM:
			printf("DM: ");
			break;
		case DISC:
			printf("DISC: ");
			del_frame(frm->handle, GET_DLCI(head.addr));
			break;
		default:
			printf("ERR: ");
		}
		print_rfcomm_hdr(&head, frm->ptr, frm->len);
		printf("\n");
	}
}
static int ts27010_uart_control_send_loop(struct ts0710_con *ts0710,
	u8 *data, int len)
{
	struct short_frame *pkt = (struct short_frame *)(data + ADDRESS_OFFSET);

	switch (CLR_PF(data[CONTROL_OFFSET])) {
	case SABM:
	case DISC: {/* send UA */
#ifdef TS27010_UART_RETRAN
			u8 frame[TS0710_FRAME_SIZE(0)] = {
				0xf9, 0x03, 0x73, 0x00, 0x01, 0x35, 0xf9,
			};
			ts27010_sequence_number_lock(s_ap_received_sn);
			frame[3] = ts27010_sequence_number_get(
				s_ap_received_sn); /* SN */
			ts27010_sequence_number_unlock(s_ap_received_sn);
			frame[5] = ts0710_uart_crc_data(
				frame + ADDRESS_OFFSET, 4); /* FCS */
#else
			u8 frame[TS0710_FRAME_SIZE(0)] = {
				0xf9, 0x03, 0x73, 0x01, 0x35, 0xf9,
			};
			frame[1] = data[ADDRESS_OFFSET]; /* DLCI */
#endif
			/* simulate a UART IPC rx interrupt */
			ts27010_ldisc_uart_receive(ts27010mux_uart_tty,
				frame, NULL, TS0710_FRAME_SIZE(0));
		}
		break;
	case UIH: {/* echo PN */
			u8 type;
			type = pkt->data[0];
			switch (type >> 2) {
			case PN:
				pkt->h.addr.cr = 0;
				((struct mcc_short_frame *)pkt->data)->h.type.cr
					= 0;
#ifdef TS27010_UART_RETRAN
				ts27010_sequence_number_lock(s_ap_received_sn);
				pkt->h.sn = ts27010_sequence_number_get(
					s_ap_received_sn);/* SN */
				ts27010_sequence_number_unlock(
					s_ap_received_sn);
				data[len - 2] = ts0710_uart_crc_data(
					data + ADDRESS_OFFSET,
					len - FCS_SIZE - FLAG_SIZE);/* FCS */
#endif
				BUG_ON(TS0710_MCC_FRAME_SIZE(
					sizeof(struct pn_msg_data)) != len);
				ts27010_ldisc_uart_receive(
					ts27010mux_uart_tty, data, NULL, len);
				break;
			default:
				break;
			}
		}
		break;
	default:
		break;
	}
	return len;
}