static void l1_timer3(struct FsmInst *fi, int event, void *arg) { struct isac *isac = fi->userdata; ph_command(isac, ISAC_CMD_DI); D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); }
static void l1_go_f8_deact_ind(struct FsmInst *fi, int event, void *arg) { struct isac *isac = fi->userdata; FsmChangeState(fi, ST_L1_F8); D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); }
static void l1_go_f3pend_deact_ind(struct FsmInst *fi, int event, void *arg) { struct isac *isac = fi->userdata; FsmChangeState(fi, ST_L1_F3_PEND_DEACT); D_L1L2(isac, PH_DEACTIVATE | INDICATION, NULL); ph_command(isac, ISAC_CMD_DI); }
static void l1_timer3(struct FsmInst *fi, int event, void *arg) { struct st5481_adapter *adapter = fi->userdata; st5481_ph_command(adapter, ST5481_CMD_DR); FsmChangeState(fi, ST_L1_F3); D_L1L2(adapter, PH_DEACTIVATE | INDICATION, NULL); }
static void l1_go_f7_act_ind(struct FsmInst *fi, int event, void *arg) { struct isac *isac = fi->userdata; FsmDelTimer(&isac->timer, 0); FsmChangeState(fi, ST_L1_F7); ph_command(isac, ISAC_CMD_AR8); D_L1L2(isac, PH_ACTIVATE | INDICATION, NULL); }
static void l1_go_f7(struct FsmInst *fi, int event, void *arg) { struct st5481_adapter *adapter = fi->userdata; FsmDelTimer(&adapter->timer, 0); ph_connect(adapter); FsmChangeState(fi, ST_L1_F7); D_L1L2(adapter, PH_ACTIVATE | INDICATION, NULL); }
static void l1_go_f3(struct FsmInst *fi, int event, void *arg) { struct st5481_adapter *adapter = fi->userdata; if (fi->state == ST_L1_F7) ph_disconnect(adapter); FsmChangeState(fi, ST_L1_F3); D_L1L2(adapter, PH_DEACTIVATE | INDICATION, NULL); }
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); isdnhdlc_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 = isdnhdlc_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); }
/* * 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; struct iso_packet_descriptor *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 = isdnhdlc_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 = isdnhdlc_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); } }