亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dmascc.c

?? linux和2410結(jié)合開發(fā) 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 3 頁
字號:
static int scc_set_mac_address(struct net_device *dev, void *sa) {  memcpy(dev->dev_addr, ((struct sockaddr *)sa)->sa_data, dev->addr_len);  return 0;}static void scc_isr(int irq, void *dev_id, struct pt_regs * regs) {  struct scc_info *info = dev_id;  /* At this point interrupts are enabled, and the interrupt under service     is already acknowledged, but masked off.     Interrupt processing: We loop until we know that the IRQ line is     low. If another positive edge occurs afterwards during the ISR,     another interrupt will be triggered by the interrupt controller     as soon as the IRQ level is enabled again (see asm/irq.h).     Bottom-half handlers will be processed after scc_isr(). This is     important, since we only have small ringbuffers and want new data     to be fetched/delivered immediately. */  if (info->priv[0].type == TYPE_TWIN) {    int is, card_base = info->priv[0].card_base;    while ((is = ~inb(card_base + TWIN_INT_REG)) &	   TWIN_INT_MSK) {      if (is & TWIN_SCC_MSK) {	z8530_isr(info);      } else if (is & TWIN_TMR1_MSK) {	inb(card_base + TWIN_CLR_TMR1);	tm_isr(&info->priv[0]);      } else {	inb(card_base + TWIN_CLR_TMR2);	tm_isr(&info->priv[1]);      }    }  } else z8530_isr(info);}static inline void z8530_isr(struct scc_info *info) {  int is, i = 100;  while ((is = read_scc(&info->priv[0], R3)) && i--) {    if (is & CHARxIP) {      rx_isr(&info->priv[0]);    } else if (is & CHATxIP) {      tx_isr(&info->priv[0]);    } else if (is & CHAEXT) {      es_isr(&info->priv[0]);    } else if (is & CHBRxIP) {      rx_isr(&info->priv[1]);    } else if (is & CHBTxIP) {      tx_isr(&info->priv[1]);    } else {      es_isr(&info->priv[1]);    }    write_scc(&info->priv[0], R0, RES_H_IUS);    i++;  }  if (i < 0) {    printk("dmascc: stuck in ISR with RR3=0x%02x.\n", is);  }  /* Ok, no interrupts pending from this 8530. The INT line should     be inactive now. */}static void rx_isr(struct scc_priv *priv) {  if (priv->param.dma >= 0) {    /* Check special condition and perform error reset. See 2.4.7.5. */    special_condition(priv, read_scc(priv, R1));    write_scc(priv, R0, ERR_RES);  } else {    /* Check special condition for each character. Error reset not necessary.       Same algorithm for SCC and ESCC. See 2.4.7.1 and 2.4.7.4. */    int rc;    while (read_scc(priv, R0) & Rx_CH_AV) {      rc = read_scc(priv, R1);      if (priv->rx_ptr < BUF_SIZE)	priv->rx_buf[priv->rx_head][priv->rx_ptr++] =	  read_scc_data(priv);      else {	priv->rx_over = 2;	read_scc_data(priv);      }      special_condition(priv, rc);    }  }}static void special_condition(struct scc_priv *priv, int rc) {  int cb;  unsigned long flags;  /* See Figure 2-15. Only overrun and EOF need to be checked. */    if (rc & Rx_OVR) {    /* Receiver overrun */    priv->rx_over = 1;    if (priv->param.dma < 0) write_scc(priv, R0, ERR_RES);  } else if (rc & END_FR) {    /* End of frame. Get byte count */    if (priv->param.dma >= 0) {      flags = claim_dma_lock();      cb = BUF_SIZE - get_dma_residue(priv->param.dma) - 2;      release_dma_lock(flags);    } else {      cb = priv->rx_ptr - 2;    }    if (priv->rx_over) {      /* We had an overrun */      priv->stats.rx_errors++;      if (priv->rx_over == 2) priv->stats.rx_length_errors++;      else priv->stats.rx_fifo_errors++;      priv->rx_over = 0;    } else if (rc & CRC_ERR) {      /* Count invalid CRC only if packet length >= minimum */      if (cb >= 15) {	priv->stats.rx_errors++;	priv->stats.rx_crc_errors++;      }    } else {      if (cb >= 15) {	if (priv->rx_count < NUM_RX_BUF - 1) {	  /* Put good frame in FIFO */	  priv->rx_len[priv->rx_head] = cb;	  priv->rx_head = (priv->rx_head + 1) % NUM_RX_BUF;	  priv->rx_count++;	  /* Mark bottom half handler */	  queue_task(&priv->rx_task, &tq_immediate);	  mark_bh(IMMEDIATE_BH);	} else {	  priv->stats.rx_errors++;	  priv->stats.rx_over_errors++;	}      }    }    /* Get ready for new frame */    if (priv->param.dma >= 0) {      flags = claim_dma_lock();      set_dma_addr(priv->param.dma, (int) priv->rx_buf[priv->rx_head]);      set_dma_count(priv->param.dma, BUF_SIZE);      release_dma_lock(flags);    } else {      priv->rx_ptr = 0;    }  }}static void rx_bh(void *arg) {  struct scc_priv *priv = arg;  int i = priv->rx_tail;  int cb;  unsigned long flags;  struct sk_buff *skb;  unsigned char *data;  save_flags(flags);  cli();  while (priv->rx_count) {    restore_flags(flags);    cb = priv->rx_len[i];    /* Allocate buffer */    skb = dev_alloc_skb(cb+1);    if (skb == NULL) {      /* Drop packet */      priv->stats.rx_dropped++;    } else {      /* Fill buffer */      data = skb_put(skb, cb+1);      data[0] = 0;      memcpy(&data[1], priv->rx_buf[i], cb);      skb->dev = priv->dev;      skb->protocol = ntohs(ETH_P_AX25);      skb->mac.raw = skb->data;      netif_rx(skb);      priv->stats.rx_packets++;      priv->stats.rx_bytes += cb;    }    save_flags(flags);    cli();    /* Move tail */    priv->rx_tail = i = (i + 1) % NUM_RX_BUF;    priv->rx_count--;  }  restore_flags(flags);}static void tx_isr(struct scc_priv *priv) {  int i = priv->tx_tail, p = priv->tx_ptr;  /* Suspend TX interrupts if we don't want to send anything.     See Figure 2-22. */  if (p ==  priv->tx_len[i]) {    write_scc(priv, R0, RES_Tx_P);    return;  }  /* Write characters */  while ((read_scc(priv, R0) & Tx_BUF_EMP) && p < priv->tx_len[i]) {    write_scc_data(priv, priv->tx_buf[i][p++], 0);  }  /* Reset EOM latch of Z8530 */  if (!priv->tx_ptr && p && priv->chip == Z8530)    write_scc(priv, R0, RES_EOM_L);  priv->tx_ptr = p;}static void es_isr(struct scc_priv *priv) {  int i, rr0, drr0, res;  unsigned long flags;  /* Read status, reset interrupt bit (open latches) */  rr0 = read_scc(priv, R0);  write_scc(priv, R0, RES_EXT_INT);  drr0 = priv->rr0 ^ rr0;  priv->rr0 = rr0;  /* Transmit underrun (2.4.9.6). We can't check the TxEOM flag, since     it might have already been cleared again by AUTOEOM. */  if (priv->state == TX_DATA) {    /* Get remaining bytes */    i = priv->tx_tail;    if (priv->param.dma >= 0) {      disable_dma(priv->param.dma);      flags = claim_dma_lock();      res = get_dma_residue(priv->param.dma);      release_dma_lock(flags);    } else {      res = priv->tx_len[i] - priv->tx_ptr;      priv->tx_ptr = 0;    }    /* Disable DREQ / TX interrupt */    if (priv->param.dma >= 0 && priv->type == TYPE_TWIN)      outb(0, priv->card_base + TWIN_DMA_CFG);    else      write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);    if (res) {      /* Update packet statistics */      priv->stats.tx_errors++;      priv->stats.tx_fifo_errors++;      /* Other underrun interrupts may already be waiting */      write_scc(priv, R0, RES_EXT_INT);      write_scc(priv, R0, RES_EXT_INT);    } else {      /* Update packet statistics */      priv->stats.tx_packets++;      priv->stats.tx_bytes += priv->tx_len[i];      /* Remove frame from FIFO */      priv->tx_tail = (i + 1) % NUM_TX_BUF;      priv->tx_count--;      /* Inform upper layers */      netif_wake_queue(priv->dev);    }    /* Switch state */    write_scc(priv, R15, 0);    if (priv->tx_count &&	(jiffies - priv->tx_start) < priv->param.txtimeout) {      priv->state = TX_PAUSE;      start_timer(priv, priv->param.txpause, 0);    } else {      priv->state = TX_TAIL;      start_timer(priv, priv->param.txtail, 0);    }  }  /* DCD transition */  if (drr0 & DCD) {    if (rr0 & DCD) {      switch (priv->state) {      case IDLE:      case WAIT:	priv->state = DCD_ON;	write_scc(priv, R15, 0);	start_timer(priv, priv->param.dcdon, 0);      }    } else {      switch (priv->state) {      case RX_ON:	rx_off(priv);	priv->state = DCD_OFF;	write_scc(priv, R15, 0);	start_timer(priv, priv->param.dcdoff, 0);      }    }  }  /* CTS transition */  if ((drr0 & CTS) && (~rr0 & CTS) && priv->type != TYPE_TWIN)    tm_isr(priv);}static void tm_isr(struct scc_priv *priv) {  switch (priv->state) {  case TX_HEAD:  case TX_PAUSE:    tx_on(priv);    priv->state = TX_DATA;    break;  case TX_TAIL:    write_scc(priv, R5, TxCRC_ENAB | Tx8);    priv->state = RTS_OFF;    if (priv->type != TYPE_TWIN) write_scc(priv, R15, 0);    start_timer(priv, priv->param.rtsoff, 0);    break;  case RTS_OFF:    write_scc(priv, R15, DCDIE);    priv->rr0 = read_scc(priv, R0);    if (priv->rr0 & DCD) {      priv->stats.collisions++;      rx_on(priv);      priv->state = RX_ON;    } else {      priv->state = WAIT;      start_timer(priv, priv->param.waittime, DCDIE);    }    break;  case WAIT:    if (priv->tx_count) {      priv->state = TX_HEAD;      priv->tx_start = jiffies;      write_scc(priv, R5, TxCRC_ENAB | RTS | TxENAB | Tx8);      write_scc(priv, R15, 0);      start_timer(priv, priv->param.txdelay, 0);    } else {      priv->state = IDLE;      if (priv->type != TYPE_TWIN) write_scc(priv, R15, DCDIE);    }    break;  case DCD_ON:  case DCD_OFF:    write_scc(priv, R15, DCDIE);    priv->rr0 = read_scc(priv, R0);    if (priv->rr0 & DCD) {      rx_on(priv);      priv->state = RX_ON;    } else {      priv->state = WAIT;      start_timer(priv,		  random()/priv->param.persist*priv->param.slottime,		  DCDIE);    }    break;  }}static inline void tx_on(struct scc_priv *priv) {  int i, n;  unsigned long flags;  if (priv->param.dma >= 0) {    n = (priv->chip == Z85230) ? 3 : 1;    /* Program DMA controller */    flags = claim_dma_lock();    set_dma_mode(priv->param.dma, DMA_MODE_WRITE);    set_dma_addr(priv->param.dma, (int) priv->tx_buf[priv->tx_tail]+n);    set_dma_count(priv->param.dma, priv->tx_len[priv->tx_tail]-n);    release_dma_lock(flags);    /* Enable TX underrun interrupt */    write_scc(priv, R15, TxUIE);    /* Configure DREQ */    if (priv->type == TYPE_TWIN)      outb((priv->param.dma == 1) ? TWIN_DMA_HDX_T1 : TWIN_DMA_HDX_T3,	   priv->card_base + TWIN_DMA_CFG);    else      write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN | WT_RDY_ENAB);    /* Write first byte(s) */    save_flags(flags);    cli();    for (i = 0; i < n; i++)      write_scc_data(priv, priv->tx_buf[priv->tx_tail][i], 1);    enable_dma(priv->param.dma);    restore_flags(flags);  } else {    write_scc(priv, R15, TxUIE);    write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN | TxINT_ENAB);    tx_isr(priv);  }  /* Reset EOM latch if we do not have the AUTOEOM feature */  if (priv->chip == Z8530) write_scc(priv, R0, RES_EOM_L);}static inline void rx_on(struct scc_priv *priv) {  unsigned long flags;  /* Clear RX FIFO */  while (read_scc(priv, R0) & Rx_CH_AV) read_scc_data(priv);  priv->rx_over = 0;  if (priv->param.dma >= 0) {    /* Program DMA controller */    flags = claim_dma_lock();    set_dma_mode(priv->param.dma, DMA_MODE_READ);    set_dma_addr(priv->param.dma, (int) priv->rx_buf[priv->rx_head]);    set_dma_count(priv->param.dma, BUF_SIZE);    release_dma_lock(flags);    enable_dma(priv->param.dma);    /* Configure PackeTwin DMA */    if (priv->type == TYPE_TWIN) {      outb((priv->param.dma == 1) ? TWIN_DMA_HDX_R1 : TWIN_DMA_HDX_R3,	   priv->card_base + TWIN_DMA_CFG);    }    /* Sp. cond. intr. only, ext int enable, RX DMA enable */    write_scc(priv, R1, EXT_INT_ENAB | INT_ERR_Rx |	      WT_RDY_RT | WT_FN_RDYFN | WT_RDY_ENAB);  } else {    /* Reset current frame */    priv->rx_ptr = 0;    /* Intr. on all Rx characters and Sp. cond., ext int enable */    write_scc(priv, R1, EXT_INT_ENAB | INT_ALL_Rx | WT_RDY_RT |	      WT_FN_RDYFN);  }  write_scc(priv, R0, ERR_RES);  write_scc(priv, R3, RxENABLE | Rx8 | RxCRC_ENAB);}static inline void rx_off(struct scc_priv *priv) {  /* Disable receiver */  write_scc(priv, R3, Rx8);  /* Disable DREQ / RX interrupt */  if (priv->param.dma >= 0 && priv->type == TYPE_TWIN)    outb(0, priv->card_base + TWIN_DMA_CFG);  else    write_scc(priv, R1, EXT_INT_ENAB | WT_FN_RDYFN);  /* Disable DMA */  if (priv->param.dma >= 0) disable_dma(priv->param.dma);}static void start_timer(struct scc_priv *priv, int t, int r15) {  unsigned long flags;  outb(priv->tmr_mode, priv->tmr_ctrl);  if (t == 0) {    tm_isr(priv);  } else if (t > 0) {    save_flags(flags);    cli();    outb(t & 0xFF, priv->tmr_cnt);    outb((t >> 8) & 0xFF, priv->tmr_cnt);    if (priv->type != TYPE_TWIN) {      write_scc(priv, R15, r15 | CTSIE);      priv->rr0 |= CTS;    }    restore_flags(flags);  }}static inline unsigned char random(void) {  /* See "Numerical Recipes in C", second edition, p. 284 */  rand = rand * 1664525L + 1013904223L;  return (unsigned char) (rand >> 24);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品国产导航| 91免费小视频| 一色屋精品亚洲香蕉网站| 这里只有精品免费| av亚洲精华国产精华精| 老司机精品视频导航| 日韩毛片一二三区| 久久毛片高清国产| 欧美日韩精品一区视频| 成人激情综合网站| 久久69国产一区二区蜜臀| 亚洲图片自拍偷拍| 亚洲日本电影在线| 久久久午夜精品| 日韩欧美精品在线视频| 欧美自拍偷拍一区| av电影在线观看一区| 国产一区不卡视频| 久久9热精品视频| 亚洲国产成人av网| 亚洲精品久久嫩草网站秘色| 国产精品午夜久久| 久久午夜电影网| 7777精品伊人久久久大香线蕉完整版 | 欧美三级韩国三级日本一级| 99视频在线观看一区三区| 国产成人av福利| 老司机精品视频在线| 日韩精品三区四区| 亚洲chinese男男1069| 亚洲乱码日产精品bd| 中文字幕亚洲不卡| 国产精品国产三级国产aⅴ原创 | 欧美激情一区二区三区全黄| 久久综合久久鬼色中文字| 欧美一区二区三区性视频| 欧美日韩一区二区三区高清| 欧美日韩一区在线观看| 欧美视频日韩视频| 欧美精品视频www在线观看| 欧美色综合影院| 欧美日韩五月天| 欧美欧美欧美欧美首页| 欧美高清dvd| 91精品国产高清一区二区三区 | 国产一区二区h| 国产精品一线二线三线| 国产精品456露脸| 国产福利精品导航| 成人av资源网站| 一本色道综合亚洲| 欧美日本国产一区| 欧美一级高清片| 久久精品一区八戒影视| 中文字幕欧美区| 亚洲免费观看在线视频| 亚洲电影第三页| 久久av资源网| 国产成人精品免费视频网站| 成人黄色一级视频| 欧美亚洲图片小说| 欧美不卡一区二区三区四区| 中文字幕欧美激情| 亚洲资源中文字幕| 免费成人在线视频观看| 国产69精品久久久久毛片| 91一区二区三区在线观看| 欧美日本视频在线| 精品88久久久久88久久久| 国产精品久久久久久久久图文区 | 精品入口麻豆88视频| 国产日韩欧美在线一区| 一区二区三区高清| 美女被吸乳得到大胸91| 不卡av免费在线观看| 欧美人牲a欧美精品| 国产亚洲精品精华液| 亚洲美女少妇撒尿| 久久精品理论片| 99视频一区二区| 日韩女优视频免费观看| 一区在线观看视频| 毛片av一区二区| 99精品一区二区| 日韩一级视频免费观看在线| 中文字幕日本不卡| 激情综合色播激情啊| 日本国产一区二区| 国产欧美一区二区三区沐欲| 亚洲成a人片在线不卡一二三区| 久久99精品国产91久久来源| 色婷婷久久久久swag精品| 精品美女一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 日韩电影在线一区二区三区| 99久久婷婷国产综合精品| 欧美r级在线观看| 亚洲最新视频在线观看| 国产精品一区二区黑丝| 国产网站一区二区| 日韩国产欧美在线播放| 91亚洲国产成人精品一区二三| 欧美一区日韩一区| 亚洲图片另类小说| 国产精品99久久久久| 欧美精品日韩综合在线| 亚洲同性gay激情无套| 国产精品99久久久久久久女警| 制服丝袜一区二区三区| 亚洲综合成人在线视频| 成人国产精品免费观看| 久久久国产午夜精品| 免费黄网站欧美| 欧美美女激情18p| 一区二区三区在线免费| 成人黄色在线视频| 欧美韩国一区二区| 国产精品一区三区| 精品国产网站在线观看| 视频在线观看一区| 欧美日韩一区二区三区视频| 亚洲欧美激情一区二区| www.在线欧美| 亚洲国产精品精华液ab| 国产精品77777| 26uuu另类欧美亚洲曰本| 麻豆久久久久久| 国产精品乱码人人做人人爱| 粉嫩一区二区三区在线看| 久久亚洲一区二区三区明星换脸| 日韩成人av影视| 欧美日韩一区不卡| 亚瑟在线精品视频| 91麻豆精品国产91久久久 | 粗大黑人巨茎大战欧美成人| 久久伊人蜜桃av一区二区| 国产真实乱子伦精品视频| 精品理论电影在线观看 | 粗大黑人巨茎大战欧美成人| 国产女同性恋一区二区| 高清不卡在线观看av| 中文字幕一区二区三区乱码在线| 成人av免费观看| 亚洲三级电影网站| 欧美午夜影院一区| 免费成人在线视频观看| 精品国产一区a| 国产精品原创巨作av| 国产拍揄自揄精品视频麻豆| 国产91在线观看丝袜| 中文字幕中文字幕中文字幕亚洲无线 | 午夜精品久久久久影视| 91精品国产手机| 国内国产精品久久| 中文字幕中文字幕中文字幕亚洲无线 | 国产精品久久一卡二卡| 91麻豆国产福利在线观看| 亚洲超碰精品一区二区| 欧美一区二区精品| 国产69精品久久久久毛片| 亚洲黄色在线视频| 欧美一级片在线观看| 国产成a人无v码亚洲福利| 亚洲精品免费在线观看| 4hu四虎永久在线影院成人| 6080yy午夜一二三区久久| 久久er精品视频| 亚洲欧洲av在线| 91精品国产一区二区三区| 国产精品91一区二区| 亚洲一区二区三区免费视频| 日韩视频免费观看高清完整版| 国产91精品欧美| 亚洲国产日韩一级| 久久九九久久九九| 欧美视频在线不卡| 国产真实乱偷精品视频免| 一区二区三区精品在线| 精品99999| 欧美在线免费播放| 国产精品一区一区三区| 亚洲成av人影院| 欧美激情综合五月色丁香小说| 欧美三级蜜桃2在线观看| 夫妻av一区二区| 日韩福利视频导航| 亚洲人成小说网站色在线 | 欧美一区二区三区日韩视频| 成人听书哪个软件好| 天使萌一区二区三区免费观看| 久久精品亚洲精品国产欧美| 欧美精品日韩一区| 99精品欧美一区| 经典三级一区二区| 午夜精品久久久久影视| 国产精品久久久久毛片软件| 日韩三级视频中文字幕| 欧美色图天堂网| 91麻豆国产福利在线观看| 国产精品一区二区你懂的|