这篇教程C++ tty_wakeup函数代码示例写得很实用,希望能帮到您。
本文整理汇总了C++中tty_wakeup函数的典型用法代码示例。如果您正苦于以下问题:C++ tty_wakeup函数的具体用法?C++ tty_wakeup怎么用?C++ tty_wakeup使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。 在下文中一共展示了tty_wakeup函数的26个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。 示例1: vcons_writestatic intvcons_write(NkPort* port, const u_char* buf, int count){ int res; unsigned long flags; spin_lock_irqsave(&port->lock, flags); res = os_ctx->cops.write(port->id, buf, count); if (vcons_write_room(port) > 0) { if (port->tty) tty_wakeup(port->tty); } spin_unlock_irqrestore(&port->lock, flags); return res;}
开发者ID:tailormoon,项目名称:android_kernel_samsung_logan2g,代码行数:18,
示例2: pty_writestatic int pty_write(struct tty_struct *tty, const unsigned char *buf, int c){ struct tty_struct *to = tty->link; if (tty->stopped) return 0; if (c > 0) { /* Stuff the data into the input queue of the other end */ c = tty_insert_flip_string(to, buf, c); /* And shovel */ if (c) { tty_flip_buffer_push(to); tty_wakeup(tty); } } return c;}
开发者ID:791254467,项目名称:u8500_kernel,代码行数:18,
示例3: gs_start_io/** * gs_start_io - start USB I/O streams * @dev: encapsulates endpoints to use * Context: holding port_lock; port_tty and port_usb are non-null * * We only start I/O when something is connected to both sides of * this port. If nothing is listening on the host side, we may * be pointlessly filling up our TX buffers and FIFO. */static int gs_start_io(struct gs_port *port){ struct list_head *head = &port->read_pool; struct usb_ep *ep = port->port_usb->out; int status; unsigned started; /* Allocate RX and TX I/O buffers. We can't easily do this much * earlier (with GFP_KERNEL) because the requests are coupled to * endpoints, as are the packet sizes we'll be using. Different * configurations may use different endpoints with a given port; * and high speed vs full speed changes packet sizes too. */ status = gs_alloc_requests(ep, head, RX_QUEUE_SIZE, RX_BUF_SIZE, gs_read_complete, &port->read_allocated); if (status) return status; status = gs_alloc_requests(port->port_usb->in, &port->write_pool, TX_QUEUE_SIZE, TX_BUF_SIZE, gs_write_complete, &port->write_allocated); if (status) { gs_free_requests(ep, head, &port->read_allocated); return status; } /* queue read requests */ port->n_read = 0; started = gs_start_rx(port); if (!port->port_usb) return -EIO; /* unblock any pending writes into our circular buffer */ if (started) { if(port->port_tty) tty_wakeup(port->port_tty); } else { gs_free_requests(ep, head, &port->read_allocated); gs_free_requests(port->port_usb->in, &port->write_pool, &port->write_allocated); status = -EIO; } return status;}
开发者ID:nsingh94,项目名称:msm7x30-caf,代码行数:53,
示例4: smd_tty_readstatic void smd_tty_read(unsigned long param){ unsigned char *ptr; int avail; struct smd_tty_info *info = (struct smd_tty_info *)param; struct tty_struct *tty = info->tty; if (!tty) return; for (;;) { if (is_in_reset(info)) { tty_insert_flip_char(tty, 0x00, TTY_BREAK); tty_flip_buffer_push(tty); break; } if (test_bit(TTY_THROTTLED, &tty->flags)) break; avail = smd_read_avail(info->ch); if (avail == 0) break; if (avail > MAX_TTY_BUF_SIZE) avail = MAX_TTY_BUF_SIZE; avail = tty_prepare_flip_string(tty, &ptr, avail); if (avail <= 0) { mod_timer(&info->buf_req_timer, jiffies + msecs_to_jiffies(30)); return; } if (smd_read(info->ch, ptr, avail) != avail) { printk(KERN_ERR "OOPS - smd_tty_buffer mismatch?!"); } wake_lock_timeout(&info->wake_lock, HZ / 2); tty_flip_buffer_push(tty); } tty_wakeup(tty);}
开发者ID:JmzTaylor,项目名称:Evita-Jellybean,代码行数:44,
示例5: gs_flush_buffervoid gs_flush_buffer(struct tty_struct *tty){ struct gs_port *port; unsigned long flags; func_enter (); port = tty->driver_data; if (!port) return; /* XXX Would the write semaphore do? */ spin_lock_irqsave (&port->driver_lock, flags); port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; spin_unlock_irqrestore (&port->driver_lock, flags); tty_wakeup(tty); func_exit ();}
开发者ID:12019,项目名称:kernel_zte_u880,代码行数:19,
示例6: hvsi_write_worker/* hvsi_write_worker will keep rescheduling itself until outbuf is empty */static void hvsi_write_worker(struct work_struct *work){ struct hvsi_struct *hp = container_of(work, struct hvsi_struct, writer.work); unsigned long flags;#ifdef DEBUG static long start_j = 0; if (start_j == 0) start_j = jiffies;#endif /* DEBUG */ spin_lock_irqsave(&hp->lock, flags); pr_debug("%s: %i chars in buffer/n", __func__, hp->n_outbuf); if (!is_open(hp)) { /* * We could have a non-open connection if the service processor died * while we were busily scheduling ourselves. In that case, it could * be minutes before the service processor comes back, so only try * again once a second. */ schedule_delayed_work(&hp->writer, HZ); goto out; } hvsi_push(hp); if (hp->n_outbuf > 0) schedule_delayed_work(&hp->writer, 10); else {#ifdef DEBUG pr_debug("%s: outbuf emptied after %li jiffies/n", __func__, jiffies - start_j); start_j = 0;#endif /* DEBUG */ wake_up_all(&hp->emptyq); tty_wakeup(hp->tty); }out: spin_unlock_irqrestore(&hp->lock, flags);}
开发者ID:119-org,项目名称:hi3518-osdrv,代码行数:44,
示例7: gs_do_softintvoid gs_do_softint(void *private_){ struct gs_port *port = private_; struct tty_struct *tty; func_enter (); if (!port) return; tty = port->tty; if (!tty) return; if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) { tty_wakeup(tty); wake_up_interruptible(&tty->write_wait); } func_exit ();}
开发者ID:souravzzz,项目名称:cse5433,代码行数:19,
示例8: change_pinsstatic void change_pins(struct nullmodem_end *end, unsigned int set, unsigned int clear){ int is_end_b = (end == &end->pair->b); int old_pins = end->pair->control_lines; if (is_end_b) old_pins = switch_pin_view(old_pins); int new_pins = (old_pins & ~clear) | set; int change = old_pins ^ new_pins; if (is_end_b) new_pins = switch_pin_view(new_pins); end->pair->control_lines = new_pins; if (change & TIOCM_RTS) { end->other->icount.cts++; } if (change & TIOCM_DTR) { end->other->icount.dsr++; end->other->icount.dcd++; } if (end->other->tty && (end->other->tty->termios.c_cflag & CRTSCTS) && (change&TIOCM_RTS)) { if (!(new_pins&TIOCM_RTS)) end->other->tty->hw_stopped = 1; else { end->other->tty->hw_stopped = 0; tty_wakeup(end->other->tty); } } if (change) wake_up_interruptible(&end->pair->control_lines_wait);}
开发者ID:dugoh,项目名称:nullmodem,代码行数:41,
示例9: scc_tx_intstatic irqreturn_t scc_tx_int(int irq, void *data){ struct scc_port *port = data; SCC_ACCESS_INIT(port); if (!port->gs.port.tty) { printk(KERN_WARNING "scc_tx_int with NULL tty!/n"); SCCmod (INT_AND_DMA_REG, ~IDR_TX_INT_ENAB, 0); SCCwrite(COMMAND_REG, CR_TX_PENDING_RESET); SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET); return IRQ_HANDLED; } while ((SCCread_NB(STATUS_REG) & SR_TX_BUF_EMPTY)) { if (port->x_char) { SCCwrite(TX_DATA_REG, port->x_char); port->x_char = 0; } else if ((port->gs.xmit_cnt <= 0) || port->gs.port.tty->stopped || port->gs.port.tty->hw_stopped) break; else { SCCwrite(TX_DATA_REG, port->gs.xmit_buf[port->gs.xmit_tail++]); port->gs.xmit_tail = port->gs.xmit_tail & (SERIAL_XMIT_SIZE-1); if (--port->gs.xmit_cnt <= 0) break; } } if ((port->gs.xmit_cnt <= 0) || port->gs.port.tty->stopped || port->gs.port.tty->hw_stopped) { /* disable tx interrupts */ SCCmod (INT_AND_DMA_REG, ~IDR_TX_INT_ENAB, 0); SCCwrite(COMMAND_REG, CR_TX_PENDING_RESET); /* disable tx_int on next tx underrun? */ port->gs.port.flags &= ~GS_TX_INTEN; } if (port->gs.port.tty && port->gs.xmit_cnt <= port->gs.wakeup_chars) tty_wakeup(port->gs.port.tty); SCCwrite_NB(COMMAND_REG, CR_HIGHEST_IUS_RESET); return IRQ_HANDLED;}
开发者ID:Medvedroid,项目名称:OT_903D-kernel-2.6.35.7,代码行数:41,
示例10: qt_write_bulk_callbackstatic void qt_write_bulk_callback(struct urb *urb){ struct tty_struct *tty; int status; struct quatech_port *quatech_port; status = urb->status; if (status) { dev_dbg(&urb->dev->dev, "nonzero write bulk status received:%d/n", status); return; } quatech_port = urb->context; tty = tty_port_tty_get(&quatech_port->port->port); if (tty) tty_wakeup(tty); tty_kref_put(tty);}
开发者ID:AiWinters,项目名称:linux,代码行数:22,
示例11: gs_flush_buffervoid gs_flush_buffer(struct tty_struct *tty){ struct gs_port *port; unsigned long flags; func_enter (); if (!tty) return; port = tty->driver_data; if (!port) return; /* XXX Would the write semaphore do? */ save_flags(flags); cli(); port->xmit_cnt = port->xmit_head = port->xmit_tail = 0; restore_flags(flags); wake_up_interruptible(&tty->write_wait); tty_wakeup(tty); func_exit ();}
开发者ID:Antonio-Zhou,项目名称:Linux-2.6.11,代码行数:22,
示例12: transmit_charsstatic void transmit_chars(struct serial_state *info){ custom.intreq = IF_TBE; mb(); if (info->x_char) { custom.serdat = info->x_char | 0x100; mb(); info->icount.tx++; info->x_char = 0; return; } if (info->xmit.head == info->xmit.tail || info->tport.tty->stopped || info->tport.tty->hw_stopped) { info->IER &= ~UART_IER_THRI; custom.intena = IF_TBE; mb(); return; } custom.serdat = info->xmit.buf[info->xmit.tail++] | 0x100; mb(); info->xmit.tail = info->xmit.tail & (SERIAL_XMIT_SIZE-1); info->icount.tx++; if (CIRC_CNT(info->xmit.head, info->xmit.tail, SERIAL_XMIT_SIZE) < WAKEUP_CHARS) tty_wakeup(info->tport.tty);#ifdef SERIAL_DEBUG_INTR printk("THRE...");#endif if (info->xmit.head == info->xmit.tail) { custom.intena = IF_TBE; mb(); info->IER &= ~UART_IER_THRI; }}
开发者ID:kprog,项目名称:linux,代码行数:39,
示例13: cons_timeoutstatic voidcons_timeout (unsigned long data){ struct tty_struct* tty = (struct tty_struct*)data; NkPort* port = NKPORT(tty); unsigned long flags; if (port->count == 0) { return; } cons_flush_input(port); spin_lock_irqsave(&port->lock, flags); if (port->sz) { cons_flush_chars(port); tty_wakeup(port->tty); } spin_unlock_irqrestore(&port->lock, flags); port->timer.expires = jiffies + SERIAL_NK_TIMEOUT; add_timer(&(port->timer));}
开发者ID:tailormoon,项目名称:android_kernel_samsung_logan2g,代码行数:23,
示例14: raw3215_tasklet/* * The bottom half handler routine for 3215 devices. It tries to start * the next IO and wakes up processes waiting on the tty. */static voidraw3215_tasklet(void *data){ struct raw3215_info *raw; struct tty_struct *tty; unsigned long flags; raw = (struct raw3215_info *) data; spin_lock_irqsave(raw->lock, flags); raw3215_mk_write_req(raw); raw3215_try_io(raw); spin_unlock_irqrestore(raw->lock, flags); /* Check for pending message from raw3215_irq */ if (raw->message != NULL) { printk(raw->message, raw->msg_dstat, raw->msg_cstat); raw->message = NULL; } tty = raw->tty; if (tty != NULL && RAW3215_BUFFER_SIZE - raw->count >= RAW3215_MIN_SPACE) { tty_wakeup(tty); }}
开发者ID:BackupTheBerlios,项目名称:tuxap,代码行数:27,
示例15: smd_tty_readstatic void smd_tty_read(unsigned long param){ unsigned char *ptr; int avail; struct smd_tty_info *info = (struct smd_tty_info *)param; struct tty_struct *tty = info->tty; if (!tty) return; for (;;) { if (test_bit(TTY_THROTTLED, &tty->flags)) break; avail = smd_read_avail(info->ch); if (avail == 0) break; if (avail > MAX_TTY_BUF_SIZE) avail = MAX_TTY_BUF_SIZE; avail = tty_prepare_flip_string(tty, &ptr, avail); if (smd_read(info->ch, ptr, avail) != avail) { /* shouldn't be possible since we're in interrupt ** context here and nobody else could 'steal' our ** characters. */ printk(KERN_ERR "OOPS - smd_tty_buffer mismatch?!"); } wake_lock_timeout(&info->wake_lock, HZ / 2); tty_flip_buffer_push(tty); } /* XXX only when writable and necessary */ tty_wakeup(tty);}
开发者ID:kerneldevs,项目名称:franco.Kernel,代码行数:36,
示例16: isicom_txstatic void isicom_tx(unsigned long _data){ unsigned long flags, base; unsigned int retries; short count = (BOARD_COUNT-1), card; short txcount, wrd, residue, word_count, cnt; struct isi_port *port; struct tty_struct *tty; /* find next active board */ card = (prev_card + 1) & 0x0003; while(count-- > 0) { if (isi_card[card].status & BOARD_ACTIVE) break; card = (card + 1) & 0x0003; } if (!(isi_card[card].status & BOARD_ACTIVE)) goto sched_again; prev_card = card; count = isi_card[card].port_count; port = isi_card[card].ports; base = isi_card[card].base; spin_lock_irqsave(&isi_card[card].card_lock, flags); for (retries = 0; retries < 100; retries++) { if (inw(base + 0xe) & 0x1) break; udelay(2); } if (retries >= 100) goto unlock; for (;count > 0;count--, port++) { /* port not active or tx disabled to force flow control */ if (!(port->flags & ASYNC_INITIALIZED) || !(port->status & ISI_TXOK)) continue; tty = port->tty; if (tty == NULL) continue; txcount = min_t(short, TX_SIZE, port->xmit_cnt); if (txcount <= 0 || tty->stopped || tty->hw_stopped) continue; if (!(inw(base + 0x02) & (1 << port->channel))) continue; pr_dbg("txing %d bytes, port%d./n", txcount, port->channel + 1); outw((port->channel << isi_card[card].shift_count) | txcount, base); residue = NO; wrd = 0; while (1) { cnt = min_t(int, txcount, (SERIAL_XMIT_SIZE - port->xmit_tail)); if (residue == YES) { residue = NO; if (cnt > 0) { wrd |= (port->xmit_buf[port->xmit_tail] << 8); port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt--; txcount--; cnt--; outw(wrd, base); } else { outw(wrd, base); break; } } if (cnt <= 0) break; word_count = cnt >> 1; outsw(base, port->xmit_buf+port->xmit_tail,word_count); port->xmit_tail = (port->xmit_tail + (word_count << 1)) & (SERIAL_XMIT_SIZE - 1); txcount -= (word_count << 1); port->xmit_cnt -= (word_count << 1); if (cnt & 0x0001) { residue = YES; wrd = port->xmit_buf[port->xmit_tail]; port->xmit_tail = (port->xmit_tail + 1) & (SERIAL_XMIT_SIZE - 1); port->xmit_cnt--; txcount--; } } InterruptTheCard(base); if (port->xmit_cnt <= 0) port->status &= ~ISI_TXOK; if (port->xmit_cnt <= WAKEUP_CHARS) tty_wakeup(tty); }//.........这里部分代码省略.........
开发者ID:Tigrouzen,项目名称:k1099,代码行数:101,
示例17: gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int gs_start_tx(struct gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool = &port->write_pool; struct usb_ep *in = port->port_usb->in; int status = 0; bool do_tty_wake = false; while (!list_empty(pool)) { struct usb_request *req; int len; req = list_entry(pool->next, struct usb_request, list); len = gs_send_packet(port, req->buf, in->maxpacket);#if ACM_ZLP if (len == 0) { //printk("[%s] len == 0 ;/n", __func__); if (s3c_need_zlp == 0) { req->zero = 0; wake_up_interruptible(&port->drain_wait); break; } else { //printk("[%s] zlp: => req.zero = true ;/n", __func__); req->zero = 1; s3c_need_zlp = 0; s3c_multiple = 0; } }#else if (len == 0) { wake_up_interruptible(&port->drain_wait); break; }#endif do_tty_wake = true; req->length = len; list_del(&req->list); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } /* abort immediately after disconnect */ if (!port->port_usb) break; } if (do_tty_wake && port->port_tty) tty_wakeup(port->port_tty); return status;}
开发者ID:Silvist,项目名称:kernel-R910,代码行数:85,
示例18: check_modem_statusstatic void check_modem_status(struct serial_state *info){ struct tty_port *port = &info->tport; unsigned char status = ciab.pra & (SER_DCD | SER_CTS | SER_DSR); unsigned char dstatus; struct async_icount *icount; /* Determine bits that have changed */ dstatus = status ^ current_ctl_bits; current_ctl_bits = status; if (dstatus) { icount = &info->icount; /* update input line counters */ if (dstatus & SER_DSR) icount->dsr++; if (dstatus & SER_DCD) { icount->dcd++;#ifdef CONFIG_HARD_PPS if ((port->flags & ASYNC_HARDPPS_CD) && !(status & SER_DCD)) hardpps();#endif } if (dstatus & SER_CTS) icount->cts++; wake_up_interruptible(&port->delta_msr_wait); } if ((port->flags & ASYNC_CHECK_CD) && (dstatus & SER_DCD)) {#if (defined(SERIAL_DEBUG_OPEN) || defined(SERIAL_DEBUG_INTR)) printk("ttyS%d CD now %s...", info->line, (!(status & SER_DCD)) ? "on" : "off");#endif if (!(status & SER_DCD)) wake_up_interruptible(&port->open_wait); else {#ifdef SERIAL_DEBUG_OPEN printk("doing serial hangup...");#endif if (port->tty) tty_hangup(port->tty); } } if (port->flags & ASYNC_CTS_FLOW) { if (port->tty->hw_stopped) { if (!(status & SER_CTS)) {#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW)) printk("CTS tx start...");#endif port->tty->hw_stopped = 0; info->IER |= UART_IER_THRI; custom.intena = IF_SETCLR | IF_TBE; mb(); /* set a pending Tx Interrupt, transmitter should restart now */ custom.intreq = IF_SETCLR | IF_TBE; mb(); tty_wakeup(port->tty); return; } } else { if ((status & SER_CTS)) {#if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW)) printk("CTS tx stop...");#endif port->tty->hw_stopped = 1; info->IER &= ~UART_IER_THRI; /* disable Tx interrupt and remove any pending interrupts */ custom.intena = IF_TBE; mb(); custom.intreq = IF_TBE; mb(); } } }}
开发者ID:kprog,项目名称:linux,代码行数:76,
示例19: a2232_vbl_interstatic irqreturn_t a2232_vbl_inter(int irq, void *data){#if A2232_IOBUFLEN != 256#error "Re-Implement a2232_vbl_inter()!"#endifstruct a2232_port *port;volatile struct a2232memory *mem;volatile struct a2232status *status;unsigned char newhead;unsigned char bufpos; /* Must be unsigned char. We need the modulo-256 arithmetics */unsigned char ncd, ocd, ccd; /* names consistent with the NetBSD driver */volatile u_char *ibuf, *cbuf, *obuf;int ch, err, n, p; for (n = 0; n < nr_a2232; n++){ /* for every completely initialized A2232 board */ mem = a2232mem(n); for (p = 0; p < NUMLINES; p++){ /* for every port on this board */ err = 0; port = &a2232_ports[n*NUMLINES+p]; if ( port->gs.port.flags & GS_ACTIVE ){ /* if the port is used */ status = a2232stat(n,p); if (!port->disable_rx && !port->throttle_input){ /* If input is not disabled */ newhead = status->InHead; /* 65EC02 write pointer */ bufpos = status->InTail; /* check for input for this port */ if (newhead != bufpos) { /* buffer for input chars/events */ ibuf = mem->InBuf[p]; /* data types of bytes in ibuf */ cbuf = mem->InCtl[p]; /* do for all chars */ while (bufpos != newhead) { /* which type of input data? */ switch (cbuf[bufpos]) { /* switch on input event (CD, BREAK, etc.) */ case A2232INCTL_EVENT: switch (ibuf[bufpos++]) { case A2232EVENT_Break: /* TODO: Handle BREAK signal */ break; /* A2232EVENT_CarrierOn and A2232EVENT_CarrierOff are handled in a separate queue and should not occur here. */ case A2232EVENT_Sync: printk("A2232: 65EC02 software sent SYNC event, don't know what to do. Ignoring."); break; default: printk("A2232: 65EC02 software broken, unknown event type %d occurred./n",ibuf[bufpos-1]); } /* event type switch */ break; case A2232INCTL_CHAR: /* Receive incoming char */ a2232_receive_char(port, ibuf[bufpos], err); bufpos++; break; default: printk("A2232: 65EC02 software broken, unknown data type %d occurred./n",cbuf[bufpos]); bufpos++; } /* switch on input data type */ } /* while there's something in the buffer */ status->InTail = bufpos; /* tell 65EC02 what we've read */ } /* if there was something in the buffer */ } /* If input is not disabled */ /* Now check if there's something to output */ obuf = mem->OutBuf[p]; bufpos = status->OutHead; while ( (port->gs.xmit_cnt > 0) && (!port->gs.port.tty->stopped) && (!port->gs.port.tty->hw_stopped) ){ /* While there are chars to transmit */ if (((bufpos+1) & A2232_IOBUFLENMASK) != status->OutTail) { /* If the A2232 buffer is not full */ ch = port->gs.xmit_buf[port->gs.xmit_tail]; /* get the next char to transmit */ port->gs.xmit_tail = (port->gs.xmit_tail+1) & (SERIAL_XMIT_SIZE-1); /* modulo-addition for the gs.xmit_buf ring-buffer */ obuf[bufpos++] = ch; /* put it into the A2232 buffer */ port->gs.xmit_cnt--; } else{ /* If A2232 the buffer is full */ break; /* simply stop filling it. */ } } status->OutHead = bufpos; /* WakeUp if output buffer runs low */ if ((port->gs.xmit_cnt <= port->gs.wakeup_chars) && port->gs.port.tty) { tty_wakeup(port->gs.port.tty); } } // if the port is used } // for every port on the board /* Now check the CD message queue */ newhead = mem->Common.CDHead; bufpos = mem->Common.CDTail; if (newhead != bufpos){ /* There are CD events in queue */ ocd = mem->Common.CDStatus; /* get old status bits *///.........这里部分代码省略.........
开发者ID:patrick-ken,项目名称:kernel_808l,代码行数:101,
示例20: gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int gs_start_tx(struct gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool = &port->write_pool; //struct usb_ep *in = port->port_usb->in; struct usb_ep *in; int status = 0; bool do_tty_wake = false; if (!port->port_usb) /* abort immediately after disconnect */ return -EINVAL; in = port->port_usb->in; while (!list_empty(pool)) { struct usb_request *req; int len; if (port->write_started >= QUEUE_SIZE) break; req = list_entry(pool->next, struct usb_request, list); len = gs_send_packet(port, req->buf, in->maxpacket); if (len == 0) { wake_up_interruptible(&port->drain_wait); break; } do_tty_wake = true; req->length = len; list_del(&req->list); req->zero = (gs_buf_data_avail(&port->port_write_buf) == 0); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); USB_LOGGER(GS_START_TX, GS_START_TX, port->port_num, len); #define OUTPUT_BTYE_NUM 5 { int i,j = 0; char* prefix[] = {"p1","p2","p3","p4","p5"}; char* suffix[] = {"s1","s2","s3","s4","s5"}; for (i = 0; i < req->actual && i < OUTPUT_BTYE_NUM; i++) USB_LOGGER(HEX_NUM, GS_START_TX, prefix[i], *((u8 *)req->buf+i)); if (req->actual >= OUTPUT_BTYE_NUM*2) { for(i = req->actual-1, j = 1; i >= (req->actual - OUTPUT_BTYE_NUM) / && i >= OUTPUT_BTYE_NUM; i--,j++) { USB_LOGGER(HEX_NUM, GS_START_TX, suffix[OUTPUT_BTYE_NUM-j], / *((u8 *)req->buf+i)); } } } /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } port->write_started++; /* abort immediately after disconnect */ if (!port->port_usb) break; } if (do_tty_wake && port->port_tty) tty_wakeup(port->port_tty); return status;}
开发者ID:Ryruk,项目名称:kernel_mtk6577,代码行数:98,
示例21: pxa910_gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int pxa910_gs_start_tx(struct pxa910_gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool; struct usb_ep *in; int status = 0; bool do_tty_wake = false; if (NULL == port) return 0; pool = &port->write_pool; in = port->port_usb->in; while (!list_empty(pool)) { struct usb_request *req; int len; if (port->write_started >= QUEUE_SIZE) break; req = list_entry(pool->next, struct usb_request, list); len = pxa910_gs_send_packet(port, req->buf, in->maxpacket); if (len == 0) { wake_up_interruptible(&port->drain_wait); break; } do_tty_wake = true; req->length = len; list_del(&req->list); req->zero = (pxa910_gs_buf_data_avail(&port->port_write_buf) == 0); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } port->write_started++; /* abort immediately after disconnect */ if (!port->port_usb) break; } if (do_tty_wake && port->port_usb) wake_up_interruptible(&port->port_usb->port_send); if (do_tty_wake && port->port_tty) tty_wakeup(port->port_tty); return status;}
开发者ID:AlexGreg,项目名称:android_kernel_samsung_lt02,代码行数:84,
示例22: gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int gs_start_tx(struct gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool = &port->write_pool; struct usb_ep *in = port->port_usb->in; int status = 0; bool do_tty_wake = false; static unsigned int skip = 0; static DEFINE_RATELIMIT_STATE(ratelimit, 1 * HZ, 10); while (!list_empty(pool)) { struct usb_request *req; int len; if (port->write_started >= QUEUE_SIZE) break; req = list_entry(pool->next, struct usb_request, list); len = gs_send_packet(port, req->buf, REQ_BUF_SIZE); if (len == 0) { wake_up_interruptible(&port->drain_wait); break; } do_tty_wake = true; req->length = len; list_del(&req->list); req->zero = (gs_buf_data_avail(&port->port_write_buf) == 0); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); if (__ratelimit(&ratelimit)) { printk( ACM_LOG / "%s: ttyGS%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", / __func__, port->port_num, len, *((u8 *)req->buf), / *((u8 *)req->buf+1), *((u8 *)req->buf+2)); if (skip > 0) { printk( ACM_LOG "%s Too many data, skipped %d bytes", __func__, skip); skip = 0; } } else skip += req->actual; /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } port->write_started++; /* abort immediately after disconnect */ if (!port->port_usb) break; } if (do_tty_wake && port->port.tty) tty_wakeup(port->port.tty); return status;}
开发者ID:AudioGod,项目名称:MediaTek-HelioX10-Kernel,代码行数:88,
示例23: gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int gs_start_tx(struct gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool = &port->write_pool; struct usb_ep *in = port->port_usb->in; int status = 0; static long prev_len; bool do_tty_wake = false; while (!list_empty(pool)) { struct usb_request *req; int len; if (port->write_started >= TX_QUEUE_SIZE) break; req = list_entry(pool->next, struct usb_request, list); len = gs_send_packet(port, req->buf, TX_BUF_SIZE); if (len == 0) { /* Queue zero length packet explicitly to make it * work with UDCs which don't support req->zero flag */ if (prev_len && (prev_len % in->maxpacket == 0)) { req->length = 0; list_del(&req->list); spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (!port->port_usb) { gs_free_req(in, req); break; } if (status) { printk(KERN_ERR "%s: %s err %d/n", __func__, "queue", status); list_add(&req->list, pool); } prev_len = 0; } wake_up_interruptible(&port->drain_wait); break; } do_tty_wake = true; req->length = len; list_del(&req->list); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); /* * If port_usb is NULL, gserial disconnect is called * while the spinlock is dropped and all requests are * freed. Free the current request here. */ if (!port->port_usb) { do_tty_wake = false; gs_free_req(in, req); break; } if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } prev_len = req->length; port->nbytes_from_tty += req->length; port->write_started++; } if (do_tty_wake && port->port_tty) tty_wakeup(port->port_tty);//.........这里部分代码省略.........
开发者ID:laperry1,项目名称:cm_kernel_oneplus_msm8974,代码行数:101,
示例24: atcmd_write_toatdint atcmd_write_toatd(struct gdata_port *port, struct sk_buff *skb){ struct tty_struct *tty; unsigned char *ptr; int avail; char *cmd; int i; pr_debug("%s/n", __func__); tty = port->tty; if (!tty) return -ENODEV; avail = skb->len; if (avail == 0) return -EINVAL; ptr = skb->data + avail - 1; if (strncasecmp(skb->data, "AT", 2) || !(*ptr == '/r' || *ptr == '/n' || *ptr == '/0')) { return -EINVAL; } cmd = kstrdup(skb->data + 2, GFP_ATOMIC); if (!cmd) { pr_debug("%s: ENOMEM/n", __func__); return -ENOMEM; } if ((ptr = strchr(cmd, '=')) || (ptr = strchr(cmd, '?')) || (ptr = strchr(cmd, '/r')) ) { *ptr = '/0'; } if (*cmd != '/0') { for (i = 0; at_table[i] != NULL; i++) { if (!strcasecmp(cmd, at_table[i])) { kfree(cmd); if (!test_bit(CH_OPENED, &port->bridge_sts)) { /* signal TTY clients using TTY_BREAK */ tty_insert_flip_char(tty, 0x00, TTY_BREAK); tty_flip_buffer_push(tty); break; } else { avail = tty_prepare_flip_string(tty, &ptr, avail); if (avail <= 0) { return -EBUSY; }#ifdef VERBOSE_DEBUG print_hex_dump(KERN_DEBUG, "toatd:", DUMP_PREFIX_OFFSET, 16, 1, skb->data, skb->len, 1);#endif memcpy(ptr, skb->data, avail); dev_kfree_skb_any(skb); tty_flip_buffer_push(tty); } /* XXX only when writable and necessary */ tty_wakeup(tty); return 0; } } } kfree(cmd); return -ENOENT;}
开发者ID:Loller79,项目名称:Solid_Kernel-STOCK-KK-CAF,代码行数:72,
示例25: pty_unthrottle/* * The unthrottle routine is called by the line discipline to signal * that it can receive more characters. For PTY's, the TTY_THROTTLED * flag is always set, to force the line discipline to always call the * unthrottle routine when there are fewer than TTY_THRESHOLD_UNTHROTTLE * characters in the queue. This is necessary since each time this * happens, we need to wake up any sleeping processes that could be * (1) trying to send data to the pty, or (2) waiting in wait_until_sent() * for the pty buffer to be drained. */static void pty_unthrottle(struct tty_struct *tty){ tty_wakeup(tty->link); set_bit(TTY_THROTTLED, &tty->flags);}
开发者ID:Jlsmily,项目名称:android_kernel_meilan2,代码行数:15,
示例26: gs_start_tx/* * gs_start_tx * * This function finds available write requests, calls * gs_send_packet to fill these packets with data, and * continues until either there are no more write requests * available or no more data to send. This function is * run whenever data arrives or write requests are available. * * Context: caller owns port_lock; port_usb is non-null. */static int gs_start_tx(struct gs_port *port)/*__releases(&port->port_lock)__acquires(&port->port_lock)*/{ struct list_head *pool = &port->write_pool; struct usb_ep *in; int status = 0; static long prev_len; bool do_tty_wake = false; if ( port->port_usb ) in = port->port_usb->in; else return status; //nikantonelli 20110615: Assumes it is set to zero in declaration above while (!list_empty(pool)) { struct usb_request *req; int len; req = list_entry(pool->next, struct usb_request, list); len = gs_send_packet(port, req->buf, in->maxpacket); if (len == 0) { /* Queue zero length packet */ if (prev_len == in->maxpacket) { req->length = 0; list_del(&req->list); spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { printk(KERN_ERR "%s: %s err %d/n", __func__, "queue", status); list_add(&req->list, pool); } prev_len = 0; } wake_up_interruptible(&port->drain_wait); break; } do_tty_wake = true; req->length = len; list_del(&req->list); pr_vdebug(PREFIX "%d: tx len=%d, 0x%02x 0x%02x 0x%02x .../n", port->port_num, len, *((u8 *)req->buf), *((u8 *)req->buf+1), *((u8 *)req->buf+2)); /* Drop lock while we call out of driver; completions * could be issued while we do so. Disconnection may * happen too; maybe immediately before we queue this! * * NOTE that we may keep sending data for a while after * the TTY closed (dev->ioport->port_tty is NULL). */ spin_unlock(&port->port_lock); status = usb_ep_queue(in, req, GFP_ATOMIC); spin_lock(&port->port_lock); if (status) { pr_debug("%s: %s %s err %d/n", __func__, "queue", in->name, status); list_add(&req->list, pool); break; } prev_len = req->length; /* abort immediately after disconnect */ if (!port->port_usb) break; } if (do_tty_wake && port->port_tty) tty_wakeup(port->port_tty); return status;}
开发者ID:morristech,项目名称:Dorimanx-HD2-2.6.32.X,代码行数:90,
注:本文中的tty_wakeup函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 C++ tty_write函数代码示例 C++ tty_unregister_driver函数代码示例 |