Exemplo n.º 1
0
static void dout_start_xmit(struct FsmInst *fsm, int event, void *arg)
{
	// FIXME unify?
	struct st5481_adapter *adapter = fsm->userdata;
	struct st5481_d_out *d_out = &adapter->d_out;
	struct urb *urb;
	int len, bytes_sent;
	struct sk_buff *skb;
	int buf_nr = 0;

	skb = d_out->tx_skb;

	DBG(2,"len=%d",skb->len);

	hdlc_out_init(&d_out->hdlc_state, 1, 0);

	if (test_and_set_bit(buf_nr, &d_out->busy)) {
		WARN("ep %d urb %d busy %#lx", EP_D_OUT, buf_nr, d_out->busy);
		return;
	}
	urb = d_out->urb[buf_nr];

	DBG_SKB(0x10, skb);
	len = hdlc_encode(&d_out->hdlc_state, 
			  skb->data, skb->len, &bytes_sent,
			  urb->transfer_buffer, 16);
	skb_pull(skb, bytes_sent);

	if(len < 16)
		FsmChangeState(&d_out->fsm, ST_DOUT_SHORT_INIT);
	else
		FsmChangeState(&d_out->fsm, ST_DOUT_LONG_INIT);

	if (skb->len == 0) {
		d_out->tx_skb = NULL;
		D_L1L2(adapter, PH_DATA | CONFIRM, NULL);
		dev_kfree_skb_any(skb);
	}

// Prepare the URB
	urb->transfer_buffer_length = len;

	urb->iso_frame_desc[0].offset = 0;
	urb->iso_frame_desc[0].length = len;
	urb->number_of_packets = 1;

	// Prepare the URB
	urb->dev = adapter->usb_dev;
	urb->transfer_flags = USB_ISO_ASAP;

	DBG_ISO_PACKET(0x20,urb);
	SUBMIT_URB(urb);
}
Exemplo n.º 2
0
Arquivo: run.c Projeto: cupidljh/test
int main(int argc, char *argv[])
{
	hdlc_enc hdlc_enc[10];
	hdlc_dec hdlc_dec;

	if (argc == 1) {
		fputs("[error] no file \n", stderr);
		exit(1);
	}

	hdlc_init(hdlc_enc, &hdlc_dec); // hdlc encode, decode 구조체 초기화
	hdlc_encode(argv[1], hdlc_enc); // file data encode

	hdlc_decode(hdlc_enc, &hdlc_dec);//hdlc_decode(hdlc_enc, hdlc_dec);// file data decode

	return 0;
}
Exemplo n.º 3
0
/*
 * Encode and transmit next frame.
 */
static void usb_b_out(struct st5481_bcs *bcs,int buf_nr)
{
    struct st5481_b_out *b_out = &bcs->b_out;
    struct st5481_adapter *adapter = bcs->adapter;
    struct urb *urb;
    unsigned int packet_size,offset;
    int len,buf_size,bytes_sent;
    int i;
    struct sk_buff *skb;

    if (test_and_set_bit(buf_nr, &b_out->busy)) {
        DBG(4,"ep %d urb %d busy",(bcs->channel+1)*2,buf_nr);
        return;
    }
    urb = b_out->urb[buf_nr];

    // Adjust isoc buffer size according to flow state
    if(b_out->flow_event & (OUT_DOWN | OUT_UNDERRUN)) {
        buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST;
        packet_size = SIZE_ISO_PACKETS_B_OUT + B_FLOW_ADJUST;
        DBG(4,"B%d,adjust flow,add %d bytes",bcs->channel+1,B_FLOW_ADJUST);
    } else if(b_out->flow_event & OUT_UP) {
        buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT - B_FLOW_ADJUST;
        packet_size = SIZE_ISO_PACKETS_B_OUT - B_FLOW_ADJUST;
        DBG(4,"B%d,adjust flow,remove %d bytes",bcs->channel+1,B_FLOW_ADJUST);
    } else {
        buf_size = NUM_ISO_PACKETS_B*SIZE_ISO_PACKETS_B_OUT;
        packet_size = 8;
    }
    b_out->flow_event = 0;

    len = 0;
    while (len < buf_size) {
        if ((skb = b_out->tx_skb)) {
            DBG_SKB(0x100, skb);
            DBG(4,"B%d,len=%d",bcs->channel+1,skb->len);

            if (bcs->mode == L1_MODE_TRANS) {
                bytes_sent = buf_size - len;
                if (skb->len < bytes_sent)
                    bytes_sent = skb->len;

                memcpy(urb->transfer_buffer+len, skb->data, bytes_sent);

                len += bytes_sent;
            } else {
                len += hdlc_encode(&b_out->hdlc_state,
                                   skb->data, skb->len, &bytes_sent,
                                   urb->transfer_buffer+len, buf_size-len);
            }

            skb_pull(skb, bytes_sent);

            if (!skb->len) {
                // Frame sent
                b_out->tx_skb = NULL;
                B_L1L2(bcs, PH_DATA | CONFIRM, (void *) skb->truesize);
                dev_kfree_skb_any(skb);

                /* 				if (!(bcs->tx_skb = skb_dequeue(&bcs->sq))) { */
                /* 					st5481B_sched_event(bcs, B_XMTBUFREADY); */
                /* 				} */
            }
        } else {
            if (bcs->mode == L1_MODE_TRANS) {
                memset(urb->transfer_buffer+len, 0xff, buf_size-len);
                len = buf_size;
            } else {
                // Send flags
                len += hdlc_encode(&b_out->hdlc_state,
                                   NULL, 0, &bytes_sent,
                                   urb->transfer_buffer+len, buf_size-len);
            }
        }
    }

    // Prepare the URB
    for (i = 0, offset = 0; offset < len; i++) {
        urb->iso_frame_desc[i].offset = offset;
        urb->iso_frame_desc[i].length = packet_size;
        offset += packet_size;
        packet_size = SIZE_ISO_PACKETS_B_OUT;
    }
    urb->transfer_buffer_length = len;
    urb->number_of_packets = i;
    urb->dev = adapter->usb_dev;

    DBG_ISO_PACKET(0x200,urb);

    SUBMIT_URB(urb);
}
Exemplo n.º 4
0
/*
 * Start the transfer of a D channel frame.
 */
static void usb_d_out(struct st5481_adapter *adapter, int buf_nr)
{
	struct st5481_d_out *d_out = &adapter->d_out;
	struct urb *urb;
	unsigned int num_packets, packet_offset;
	int len, buf_size, bytes_sent;
	struct sk_buff *skb;
	iso_packet_descriptor_t *desc;

	if (d_out->fsm.state != ST_DOUT_NORMAL)
		return;

	if (test_and_set_bit(buf_nr, &d_out->busy)) {
		DBG(2, "ep %d urb %d busy %#lx", EP_D_OUT, buf_nr, d_out->busy);
		return;
	}
	urb = d_out->urb[buf_nr];

	skb = d_out->tx_skb;

	buf_size = NUM_ISO_PACKETS_D * SIZE_ISO_PACKETS_D_OUT;
	
	if (skb) {
		len = hdlc_encode(&d_out->hdlc_state, 
				  skb->data, skb->len, &bytes_sent,
				  urb->transfer_buffer, buf_size);
		skb_pull(skb,bytes_sent);
	} else {
		// Send flags or idle
		len = hdlc_encode(&d_out->hdlc_state, 
				  NULL, 0, &bytes_sent,
				  urb->transfer_buffer, buf_size);
	}
	
	if (len < buf_size) {
		FsmChangeState(&d_out->fsm, ST_DOUT_WAIT_FOR_UNDERRUN);
	}
	if (skb && !skb->len) {
		d_out->tx_skb = NULL;
		D_L1L2(adapter, PH_DATA | CONFIRM, NULL);
		dev_kfree_skb_any(skb);
	}

	// Prepare the URB
	urb->transfer_buffer_length = len;
	num_packets = 0;
	packet_offset = 0;
	while (packet_offset < len) {
		desc = &urb->iso_frame_desc[num_packets];
		desc->offset = packet_offset;
		desc->length = SIZE_ISO_PACKETS_D_OUT;
		if (len - packet_offset < desc->length)
			desc->length = len - packet_offset;
		num_packets++;
		packet_offset += desc->length;
	}
	urb->number_of_packets = num_packets;

	// Prepare the URB
	urb->dev = adapter->usb_dev;
	// Need to transmit the next buffer 2ms after the DEN_EVENT
	urb->transfer_flags = 0;
	urb->start_frame = usb_get_current_frame_number(adapter->usb_dev)+2;

	DBG_ISO_PACKET(0x20,urb);

	if (usb_submit_urb(urb) < 0) {
		// There is another URB queued up
		urb->transfer_flags = USB_ISO_ASAP;
		SUBMIT_URB(urb);
	}	
}