/* allocs urbs and start isoc transfer with two pending urbs to avoid gaps in the transfer chain */ static int start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb, usb_complete_t complete, int packet_size) { int i, k, errcode; printk(KERN_INFO "HFC-S USB: starting ISO-chain for Fifo %i\n", fifo->fifonum); /* allocate Memory for Iso out Urbs */ for (i = 0; i < 2; i++) { if (!(fifo->iso[i].purb)) { fifo->iso[i].purb = usb_alloc_urb(num_packets_per_urb, GFP_KERNEL); if (!(fifo->iso[i].purb)) { printk(KERN_INFO "alloc urb for fifo %i failed!!!", fifo->fifonum); } fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo; /* Init the first iso */ if (ISO_BUFFER_SIZE >= (fifo->usb_packet_maxlen * num_packets_per_urb)) { fill_isoc_urb(fifo->iso[i].purb, fifo->hfc->dev, fifo->pipe, fifo->iso[i].buffer, num_packets_per_urb, fifo->usb_packet_maxlen, fifo->intervall, complete, &fifo->iso[i]); memset(fifo->iso[i].buffer, 0, sizeof(fifo->iso[i].buffer)); /* defining packet delimeters in fifo->buffer */ for (k = 0; k < num_packets_per_urb; k++) { fifo->iso[i].purb-> iso_frame_desc[k].offset = k * packet_size; fifo->iso[i].purb-> iso_frame_desc[k].length = packet_size; } } else { printk(KERN_INFO "HFC-S USB: ISO Buffer size to small!\n"); } } fifo->bit_line = BITLINE_INF; errcode = usb_submit_urb(fifo->iso[i].purb, GFP_KERNEL); fifo->active = (errcode >= 0) ? 1 : 0; if (errcode < 0) { printk(KERN_INFO "HFC-S USB: %s URB nr:%d\n", symbolic(urb_errlist, errcode), i); }; } return (fifo->active); }
static int start_isoc_chain(usb_fifo * fifo, int num_packets_per_urb, usb_complete_t complete, int packet_size) { int i, k, errcode; DBG(HFCUSB_DBG_INIT, "HFC-S USB: starting ISO-URBs for fifo:%d\n", fifo->fifonum); for (i = 0; i < 2; i++) { if (!(fifo->iso[i].purb)) { fifo->iso[i].purb = usb_alloc_urb(num_packets_per_urb, GFP_KERNEL); if (!(fifo->iso[i].purb)) { printk(KERN_INFO "alloc urb for fifo %i failed!!!", fifo->fifonum); } fifo->iso[i].owner_fifo = (struct usb_fifo *) fifo; if (ISO_BUFFER_SIZE >= (fifo->usb_packet_maxlen * num_packets_per_urb)) { fill_isoc_urb(fifo->iso[i].purb, fifo->hfc->dev, fifo->pipe, fifo->iso[i].buffer, num_packets_per_urb, fifo->usb_packet_maxlen, fifo->intervall, complete, &fifo->iso[i]); memset(fifo->iso[i].buffer, 0, sizeof(fifo->iso[i].buffer)); for (k = 0; k < num_packets_per_urb; k++) { fifo->iso[i].purb-> iso_frame_desc[k].offset = k * packet_size; fifo->iso[i].purb-> iso_frame_desc[k].length = packet_size; } } else { printk(KERN_INFO "HFC-S USB: ISO Buffer size to small!\n"); } } fifo->bit_line = BITLINE_INF; errcode = usb_submit_urb(fifo->iso[i].purb, GFP_KERNEL); fifo->active = (errcode >= 0) ? 1 : 0; if (errcode < 0) printk(KERN_INFO "HFC-S USB: usb_submit_urb URB nr:%d, error(%i): '%s'\n", i, errcode, symbolic(urb_errlist, errcode)); } return (fifo->active); }
static Range genhead_symbol(GenHead * genhead) { Range range; range.start = genhead->index; if (symbolic_start(genhead_get(genhead))) { do { genhead_next(genhead); } while (symbolic(genhead_get(genhead))); } range.end = genhead->index; return range; }
static void tx_iso_complete(struct urb *urb) { iso_urb_struct *context_iso_urb = (iso_urb_struct *) urb->context; usb_fifo *fifo = context_iso_urb->owner_fifo; hfcusb_data *hfc = fifo->hfc; int k, tx_offset, num_isoc_packets, sink, len, current_len, errcode; int frame_complete, transp_mode, fifon, status; __u8 threshbit; fifon = fifo->fifonum; status = urb->status; tx_offset = 0; /* ISO transfer only partially completed, look at individual frame status for details */ if (status == -EXDEV) { DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete with -EXDEV" ", urb->status %d, fifonum %d\n", status, fifon); for (k = 0; k < iso_packets[fifon]; ++k) { errcode = urb->iso_frame_desc[k].status; if (errcode) DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete " "packet %i, status: %i\n", k, errcode); } // clear status, so go on with ISO transfers status = 0; } if (fifo->active && !status) { transp_mode = 0; if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS) transp_mode = 1; /* is FifoFull-threshold set for our channel? */ threshbit = (hfc->threshold_mask & (1 << fifon)); num_isoc_packets = iso_packets[fifon]; /* predict dataflow to avoid fifo overflow */ if (fifon >= HFCUSB_D_TX) { sink = (threshbit) ? SINK_DMIN : SINK_DMAX; } else { sink = (threshbit) ? SINK_MIN : SINK_MAX; } fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe, context_iso_urb->buffer, num_isoc_packets, fifo->usb_packet_maxlen, fifo->intervall, tx_iso_complete, urb->context); memset(context_iso_urb->buffer, 0, sizeof(context_iso_urb->buffer)); frame_complete = 0; /* Generate next ISO Packets */ for (k = 0; k < num_isoc_packets; ++k) { if (fifo->skbuff) { len = fifo->skbuff->len; /* we lower data margin every msec */ fifo->bit_line -= sink; current_len = (0 - fifo->bit_line) / 8; /* maximum 15 byte for every ISO packet makes our life easier */ if (current_len > 14) current_len = 14; current_len = (len <= current_len) ? len : current_len; /* how much bit do we put on the line? */ fifo->bit_line += current_len * 8; context_iso_urb->buffer[tx_offset] = 0; if (current_len == len) { if (!transp_mode) { /* here frame completion */ context_iso_urb-> buffer[tx_offset] = 1; /* add 2 byte flags and 16bit CRC at end of ISDN frame */ fifo->bit_line += 32; } frame_complete = 1; } memcpy(context_iso_urb->buffer + tx_offset + 1, fifo->skbuff->data, current_len); skb_pull(fifo->skbuff, current_len); /* define packet delimeters within the URB buffer */ urb->iso_frame_desc[k].offset = tx_offset; urb->iso_frame_desc[k].length = current_len + 1; tx_offset += (current_len + 1); } else { urb->iso_frame_desc[k].offset = tx_offset++; urb->iso_frame_desc[k].length = 1; fifo->bit_line -= sink; /* we lower data margin every msec */ if (fifo->bit_line < BITLINE_INF) { fifo->bit_line = BITLINE_INF; } } if (frame_complete) { fifo->delete_flg = 1; fifo->hif->l1l2(fifo->hif, PH_DATA | CONFIRM, (void *) (unsigned long) fifo->skbuff-> truesize); if (fifo->skbuff && fifo->delete_flg) { dev_kfree_skb_any(fifo->skbuff); fifo->skbuff = NULL; fifo->delete_flg = 0; } frame_complete = 0; } } errcode = usb_submit_urb(urb, GFP_ATOMIC); if (errcode < 0) { printk(KERN_INFO "HFC-S USB: error submitting ISO URB: %d\n", errcode); } } else { if (status && !hfc->disc_flag) { printk(KERN_INFO "HFC-S USB: tx_iso_complete: error(%i): '%s', fifonum=%d\n", status, symbolic(urb_errlist, status), fifon); } } }
static void tx_iso_complete(struct urb *urb) { iso_urb_struct *context_iso_urb = (iso_urb_struct *) urb->context; usb_fifo *fifo = context_iso_urb->owner_fifo; hfcusb_data *hfc = fifo->hfc; int k, tx_offset, num_isoc_packets, sink, len, current_len, errcode; int frame_complete, transp_mode, fifon, status; __u8 threshbit; fifon = fifo->fifonum; status = urb->status; tx_offset = 0; if (status == -EXDEV) { DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete with -EXDEV" ", urb->status %d, fifonum %d\n", status, fifon); for (k = 0; k < iso_packets[fifon]; ++k) { errcode = urb->iso_frame_desc[k].status; if (errcode) DBG(HFCUSB_DBG_VERBOSE_USB, "HFC-S USB: tx_iso_complete " "packet %i, status: %i\n", k, errcode); } status = 0; } if (fifo->active && !status) { transp_mode = 0; if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS) transp_mode = 1; threshbit = (hfc->threshold_mask & (1 << fifon)); num_isoc_packets = iso_packets[fifon]; if (fifon >= HFCUSB_D_TX) { sink = (threshbit) ? SINK_DMIN : SINK_DMAX; } else { sink = (threshbit) ? SINK_MIN : SINK_MAX; } fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe, context_iso_urb->buffer, num_isoc_packets, fifo->usb_packet_maxlen, fifo->intervall, tx_iso_complete, urb->context); memset(context_iso_urb->buffer, 0, sizeof(context_iso_urb->buffer)); frame_complete = 0; for (k = 0; k < num_isoc_packets; ++k) { if (fifo->skbuff) { len = fifo->skbuff->len; fifo->bit_line -= sink; current_len = (0 - fifo->bit_line) / 8; if (current_len > 14) current_len = 14; current_len = (len <= current_len) ? len : current_len; fifo->bit_line += current_len * 8; context_iso_urb->buffer[tx_offset] = 0; if (current_len == len) { if (!transp_mode) { context_iso_urb-> buffer[tx_offset] = 1; fifo->bit_line += 32; } frame_complete = 1; } memcpy(context_iso_urb->buffer + tx_offset + 1, fifo->skbuff->data, current_len); skb_pull(fifo->skbuff, current_len); urb->iso_frame_desc[k].offset = tx_offset; urb->iso_frame_desc[k].length = current_len + 1; tx_offset += (current_len + 1); } else { urb->iso_frame_desc[k].offset = tx_offset++; urb->iso_frame_desc[k].length = 1; fifo->bit_line -= sink; if (fifo->bit_line < BITLINE_INF) { fifo->bit_line = BITLINE_INF; } } if (frame_complete) { fifo->delete_flg = 1; fifo->hif->l1l2(fifo->hif, PH_DATA | CONFIRM, (void *) (unsigned long) fifo->skbuff-> truesize); if (fifo->skbuff && fifo->delete_flg) { dev_kfree_skb_any(fifo->skbuff); fifo->skbuff = NULL; fifo->delete_flg = 0; } frame_complete = 0; } } errcode = usb_submit_urb(urb, GFP_ATOMIC); if (errcode < 0) { printk(KERN_INFO "HFC-S USB: error submitting ISO URB: %d\n", errcode); } } else { if (status && !hfc->disc_flag) { printk(KERN_INFO "HFC-S USB: tx_iso_complete: error(%i): '%s', fifonum=%d\n", status, symbolic(urb_errlist, status), fifon); } } }
static void comwork(FILE *fd, Lextok *now, int m) { Lextok *v; int i, j; if (!now) { fprintf(fd, "0"); return; } switch (now->ntyp) { case CONST: sr_mesg(fd, now->val, now->ismtyp); break; case '!': Cat3("!(", now->lft, ")"); break; case UMIN: Cat3("-(", now->lft, ")"); break; case '~': Cat3("~(", now->lft, ")"); break; case '/': Cat1("/"); break; case '*': Cat1("*"); break; case '-': Cat1("-"); break; case '+': Cat1("+"); break; case '%': Cat1("%%"); break; case '&': Cat1("&"); break; case '^': Cat1("^"); break; case '|': Cat1("|"); break; case LE: Cat1("<="); break; case GE: Cat1(">="); break; case GT: Cat1(">"); break; case LT: Cat1("<"); break; case NE: Cat1("!="); break; case EQ: if (ltl_mode && now->lft->ntyp == 'p' && now->rgt->ntyp == 'q') /* remote ref */ { Lextok *p = now->lft->lft; fprintf(fd, "("); fprintf(fd, "%s", p->sym->name); if (p->lft) { fprintf(fd, "["); putstmnt(fd, p->lft, 0); /* pid */ fprintf(fd, "]"); } fprintf(fd, "@"); fprintf(fd, "%s", now->rgt->sym->name); fprintf(fd, ")"); break; } Cat1("=="); break; case OR: Cat1("||"); break; case AND: Cat1("&&"); break; case LSHIFT: Cat1("<<"); break; case RSHIFT: Cat1(">>"); break; case RUN: fprintf(fd, "run %s(", now->sym->name); for (v = now->lft; v; v = v->rgt) if (v == now->lft) { comwork(fd, v->lft, m); } else { Cat2(",", v->lft); } fprintf(fd, ")"); break; case LEN: putname(fd, "len(", now->lft, m, ")"); break; case FULL: putname(fd, "full(", now->lft, m, ")"); break; case EMPTY: putname(fd, "empty(", now->lft, m, ")"); break; case NFULL: putname(fd, "nfull(", now->lft, m, ")"); break; case NEMPTY: putname(fd, "nempty(", now->lft, m, ")"); break; case 's': putname(fd, "", now->lft, m, now->val?"!!":"!"); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } break; case 'r': putname(fd, "", now->lft, m, "?"); switch (now->val) { case 0: break; case 1: fprintf(fd, "?"); break; case 2: fprintf(fd, "<"); break; case 3: fprintf(fd, "?<"); break; } for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } if (now->val >= 2) fprintf(fd, ">"); break; case 'R': putname(fd, "", now->lft, m, now->val?"??[":"?["); for (v = now->rgt, i=0; v; v = v->rgt, i++) { if (v != now->rgt) fprintf(fd,","); if (!symbolic(fd, v->lft)) comwork(fd,v->lft,m); } fprintf(fd, "]"); break; case ENABLED: Cat3("enabled(", now->lft, ")"); break; case EVAL: Cat3("eval(", now->lft, ")"); break; case NONPROGRESS: fprintf(fd, "np_"); break; case PC_VAL: Cat3("pc_value(", now->lft, ")"); break; case 'c': Cat3("(", now->lft, ")"); break; case '?': if (now->lft) { Cat3("( (", now->lft, ") -> "); } if (now->rgt) { Cat3("(", now->rgt->lft, ") : "); Cat3("(", now->rgt->rgt, ") )"); } break; case ASGN: comwork(fd,now->lft,m); fprintf(fd," = "); comwork(fd,now->rgt,m); break; case PRINT: { char c, buf[512]; strncpy(buf, now->sym->name, 510); for (i = j = 0; i < 510; i++, j++) { c = now->sym->name[i]; buf[j] = c; if (c == '\\') buf[++j] = c; if (c == '\"') buf[j] = '\''; if (c == '\0') break; } if (now->ntyp == PRINT) fprintf(fd, "printf"); else fprintf(fd, "annotate"); fprintf(fd, "(%s", buf); } for (v = now->lft; v; v = v->rgt) { Cat2(",", v->lft); } fprintf(fd, ")"); break; case PRINTM: fprintf(fd, "printm("); comwork(fd, now->lft, m); fprintf(fd, ")"); break; case NAME: putname(fd, "", now, m, ""); break; case 'p': if (ltl_mode) { fprintf(fd, "%s", now->lft->sym->name); /* proctype */ if (now->lft->lft) { fprintf(fd, "["); putstmnt(fd, now->lft->lft, 0); /* pid */ fprintf(fd, "]"); } fprintf(fd, ":"); /* remote varref */ fprintf(fd, "%s", now->sym->name); /* varname */ break; } putremote(fd, now, m); break; case 'q': fprintf(fd, "%s", now->sym->name); break; case C_EXPR: case C_CODE: fprintf(fd, "{%s}", now->sym->name); break; case ASSERT: Cat3("assert(", now->lft, ")"); break; case '.': fprintf(fd, ".(goto)"); break; case GOTO: fprintf(fd, "goto %s", now->sym->name); break; case BREAK: fprintf(fd, "break"); break; case ELSE: fprintf(fd, "else"); break; case '@': fprintf(fd, "-end-"); break; case D_STEP: fprintf(fd, "D_STEP"); break; case ATOMIC: fprintf(fd, "ATOMIC"); break; case NON_ATOMIC: fprintf(fd, "sub-sequence"); break; case IF: fprintf(fd, "IF"); break; case DO: fprintf(fd, "DO"); break; case UNLESS: fprintf(fd, "unless"); break; case TIMEOUT: fprintf(fd, "timeout"); break; default: if (isprint(now->ntyp)) fprintf(fd, "'%c'", now->ntyp); else fprintf(fd, "%d", now->ntyp); break; } }
static void tx_iso_complete(struct urb *urb, struct pt_regs *regs) { iso_urb_struct *context_iso_urb = (iso_urb_struct *) urb->context; usb_fifo *fifo = context_iso_urb->owner_fifo; hfcusb_data *hfc = fifo->hfc; int k, tx_offset, num_isoc_packets, sink, len, current_len, errcode; int frame_complete, transp_mode, fifon, status; __u8 threshbit; __u8 threshtable[8] = { 1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80 }; fifon = fifo->fifonum; status = urb->status; tx_offset = 0; if (fifo->active && !status) { transp_mode = 0; if (fifon < 4 && hfc->b_mode[fifon / 2] == L1_MODE_TRANS) transp_mode = TRUE; /* is FifoFull-threshold set for our channel? */ threshbit = threshtable[fifon] & hfc->threshold_mask; num_isoc_packets = iso_packets[fifon]; /* predict dataflow to avoid fifo overflow */ if (fifon >= HFCUSB_D_TX) { sink = (threshbit) ? SINK_DMIN : SINK_DMAX; } else { sink = (threshbit) ? SINK_MIN : SINK_MAX; } fill_isoc_urb(urb, fifo->hfc->dev, fifo->pipe, context_iso_urb->buffer, num_isoc_packets, fifo->usb_packet_maxlen, fifo->intervall, tx_iso_complete, urb->context); memset(context_iso_urb->buffer, 0, sizeof(context_iso_urb->buffer)); frame_complete = FALSE; /* Generate next Iso Packets */ for (k = 0; k < num_isoc_packets; ++k) { if (fifo->skbuff) { len = fifo->skbuff->len; /* we lower data margin every msec */ fifo->bit_line -= sink; current_len = (0 - fifo->bit_line) / 8; /* maximum 15 byte for every ISO packet makes our life easier */ if (current_len > 14) current_len = 14; current_len = (len <= current_len) ? len : current_len; /* how much bit do we put on the line? */ fifo->bit_line += current_len * 8; context_iso_urb->buffer[tx_offset] = 0; if (current_len == len) { if (!transp_mode) { /* here frame completion */ context_iso_urb-> buffer[tx_offset] = 1; /* add 2 byte flags and 16bit CRC at end of ISDN frame */ fifo->bit_line += 32; } frame_complete = TRUE; } memcpy(context_iso_urb->buffer + tx_offset + 1, fifo->skbuff->data, current_len); skb_pull(fifo->skbuff, current_len); /* define packet delimeters within the URB buffer */ urb->iso_frame_desc[k].offset = tx_offset; urb->iso_frame_desc[k].length = current_len + 1; tx_offset += (current_len + 1); } else { urb->iso_frame_desc[k].offset = tx_offset++; urb->iso_frame_desc[k].length = 1; fifo->bit_line -= sink; /* we lower data margin every msec */ if (fifo->bit_line < BITLINE_INF) { fifo->bit_line = BITLINE_INF; } } if (frame_complete) { fifo->delete_flg = TRUE; fifo->hif->l1l2(fifo->hif, PH_DATA | CONFIRM, (void *) fifo->skbuff-> truesize); if (fifo->skbuff && fifo->delete_flg) { dev_kfree_skb_any(fifo->skbuff); fifo->skbuff = NULL; fifo->delete_flg = FALSE; } frame_complete = FALSE; } } errcode = usb_submit_urb(urb, GFP_ATOMIC); if (errcode < 0) { printk(KERN_INFO "HFC-S USB: error submitting ISO URB: %d \n", errcode); } } else { if (status && !hfc->disc_flag) { printk(KERN_INFO "HFC-S USB: tx_iso_complete : urb->status %s (%i), fifonum=%d\n", symbolic(urb_errlist, status), status, fifon); } } } /* tx_iso_complete */