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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? layer2.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
字號:
/* * PCBIT-D low-layer interface * * Copyright (C) 1996 Universidade de Lisboa * * Written by Pedro Roque Marques (roque@di.fc.ul.pt) * * This software may be used and distributed according to the terms of * the GNU General Public License, incorporated herein by reference. *//* * 19991203 - Fernando Carvalho - takion@superbofh.org * Hacked to compile with egcs and run with current version of isdn modules*//* *        Based on documentation provided by Inesc: *        - "Interface com bus do PC para o PCBIT e PCBIT-D", Inesc, Jan 93 *//* *        TODO: better handling of errors *              re-write/remove debug printks */#include <linux/sched.h>#include <linux/string.h>#include <linux/kernel.h>#include <linux/types.h>#include <linux/slab.h>#include <linux/interrupt.h>#include <linux/tqueue.h>#include <linux/mm.h>#include <linux/skbuff.h>#include <linux/isdnif.h>#include <asm/system.h>#include <asm/io.h>#include "pcbit.h"#include "layer2.h"#include "edss1.h"#undef DEBUG_FRAG/* *  task queue struct *//* *  Layer 3 packet demultiplexer *  drv.c */extern void pcbit_l3_receive(struct pcbit_dev *dev, ulong msg,			     struct sk_buff *skb,			     ushort hdr_len, ushort refnum);/* *  Prototypes */void pcbit_deliver(void *data);static void pcbit_transmit(struct pcbit_dev *dev);static void pcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack);static void pcbit_l2_error(struct pcbit_dev *dev);static void pcbit_l2_active_conf(struct pcbit_dev *dev, u_char info);static void pcbit_l2_err_recover(unsigned long data);static void pcbit_firmware_bug(struct pcbit_dev *dev);static __inline__ voidpcbit_sched_delivery(struct pcbit_dev *dev){	queue_task(&dev->qdelivery, &tq_immediate);	mark_bh(IMMEDIATE_BH);}/* *  Called from layer3 */intpcbit_l2_write(struct pcbit_dev *dev, ulong msg, ushort refnum,	       struct sk_buff *skb, unsigned short hdr_len){	struct frame_buf *frame,	*ptr;	unsigned long flags;	if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) {		dev_kfree_skb(skb);		return -1;	}	if ((frame = (struct frame_buf *) kmalloc(sizeof(struct frame_buf),						  GFP_ATOMIC)) == NULL) {		printk(KERN_WARNING "pcbit_2_write: kmalloc failed\n");		dev_kfree_skb(skb);		return -1;	}	frame->msg = msg;	frame->refnum = refnum;	frame->copied = 0;	frame->hdr_len = hdr_len;	if (skb)		frame->dt_len = skb->len - hdr_len;	else		frame->dt_len = 0;	frame->skb = skb;	frame->next = NULL;	save_flags(flags);	cli();	if (dev->write_queue == NULL) {		dev->write_queue = frame;		restore_flags(flags);		pcbit_transmit(dev);	} else {		for (ptr = dev->write_queue; ptr->next; ptr = ptr->next);		ptr->next = frame;		restore_flags(flags);	}	return 0;}static __inline__ voidpcbit_tx_update(struct pcbit_dev *dev, ushort len){	u_char info;	dev->send_seq = (dev->send_seq + 1) % 8;	dev->fsize[dev->send_seq] = len;	info = 0;	info |= dev->rcv_seq << 3;	info |= dev->send_seq;	writeb(info, dev->sh_mem + BANK4);}/* * called by interrupt service routine or by write_2 */static voidpcbit_transmit(struct pcbit_dev *dev){	struct frame_buf *frame = NULL;	unsigned char unacked;	int flen;               /* fragment frame length including all headers */	int free;	int count,	 cp_len;	unsigned long flags;	unsigned short tt;	if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING)		return;	unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07;	save_flags(flags);	cli();	if (dev->free > 16 && dev->write_queue && unacked < 7) {		if (!dev->w_busy)			dev->w_busy = 1;		else {			restore_flags(flags);			return;		}		frame = dev->write_queue;		free = dev->free;		restore_flags(flags);		if (frame->copied == 0) {			/* Type 0 frame */			ulong 	msg;			if (frame->skb)				flen = FRAME_HDR_LEN + PREHDR_LEN + frame->skb->len;			else				flen = FRAME_HDR_LEN + PREHDR_LEN;			if (flen > free)				flen = free;			msg = frame->msg;			/*			 *  Board level 2 header			 */			pcbit_writew(dev, flen - FRAME_HDR_LEN);			pcbit_writeb(dev, GET_MSG_CPU(msg));			pcbit_writeb(dev, GET_MSG_PROC(msg));			/* TH */			pcbit_writew(dev, frame->hdr_len + PREHDR_LEN);			/* TD */			pcbit_writew(dev, frame->dt_len);			/*			 *  Board level 3 fixed-header			 */			/* LEN = TH */			pcbit_writew(dev, frame->hdr_len + PREHDR_LEN);			/* XX */			pcbit_writew(dev, 0);			/* C + S */			pcbit_writeb(dev, GET_MSG_CMD(msg));			pcbit_writeb(dev, GET_MSG_SCMD(msg));			/* NUM */			pcbit_writew(dev, frame->refnum);			count = FRAME_HDR_LEN + PREHDR_LEN;		} else {			/* Type 1 frame */			flen = 2 + (frame->skb->len - frame->copied);			if (flen > free)				flen = free;			/* TT */			tt = ((ushort) (flen - 2)) | 0x8000U;	/* Type 1 */			pcbit_writew(dev, tt);			count = 2;		}		if (frame->skb) {			cp_len = frame->skb->len - frame->copied;			if (cp_len > flen - count)				cp_len = flen - count;			memcpy_topcbit(dev, frame->skb->data + frame->copied,				       cp_len);			frame->copied += cp_len;		}		/* bookkeeping */		dev->free -= flen;		pcbit_tx_update(dev, flen);		save_flags(flags);		cli();		if (frame->skb == NULL || frame->copied == frame->skb->len) {			dev->write_queue = frame->next;			if (frame->skb != NULL) {				/* free frame */				dev_kfree_skb(frame->skb);			}			kfree(frame);		}		dev->w_busy = 0;		restore_flags(flags);	} else {		restore_flags(flags);#ifdef DEBUG		printk(KERN_DEBUG "unacked %d free %d write_queue %s\n",		     unacked, dev->free, dev->write_queue ? "not empty" :		       "empty");#endif	}}/* *  deliver a queued frame to the upper layer */voidpcbit_deliver(void *data){	struct frame_buf *frame;	unsigned long flags, msg;	struct pcbit_dev *dev = (struct pcbit_dev *) data;	save_flags(flags);	cli();	while ((frame = dev->read_queue)) {		dev->read_queue = frame->next;		restore_flags(flags);		SET_MSG_CPU(msg, 0);		SET_MSG_PROC(msg, 0);		SET_MSG_CMD(msg, frame->skb->data[2]);		SET_MSG_SCMD(msg, frame->skb->data[3]);		frame->refnum = *((ushort *) frame->skb->data + 4);		frame->msg = *((ulong *) & msg);		skb_pull(frame->skb, 6);		pcbit_l3_receive(dev, frame->msg, frame->skb, frame->hdr_len,				 frame->refnum);		kfree(frame);		save_flags(flags);		cli();	}	restore_flags(flags);}/* * Reads BANK 2 & Reassembles */static voidpcbit_receive(struct pcbit_dev *dev){	unsigned short tt;	u_char cpu,	 proc;	struct frame_buf *frame = NULL;	unsigned long flags;	u_char type1;	if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING)		return;	tt = pcbit_readw(dev);	if ((tt & 0x7fffU) > 511) {		printk(KERN_INFO "pcbit: invalid frame length -> TT=%04x\n",		       tt);		pcbit_l2_error(dev);		return;	}	if (!(tt & 0x8000U)) {  /* Type 0 */		type1 = 0;		if (dev->read_frame) {			printk(KERN_DEBUG "pcbit_receive: Type 0 frame and read_frame != NULL\n");			/* discard previous queued frame */			if (dev->read_frame->skb)				kfree_skb(dev->read_frame->skb);			kfree(dev->read_frame);			dev->read_frame = NULL;		}		frame = kmalloc(sizeof(struct frame_buf), GFP_ATOMIC);		if (frame == NULL) {			printk(KERN_WARNING "kmalloc failed\n");			return;		}		memset(frame, 0, sizeof(struct frame_buf));		cpu = pcbit_readb(dev);		proc = pcbit_readb(dev);		if (cpu != 0x06 && cpu != 0x02) {			printk(KERN_DEBUG "pcbit: invalid cpu value\n");			kfree(frame);			pcbit_l2_error(dev);			return;		}		/*		 * we discard cpu & proc on receiving		 * but we read it to update the pointer		 */		frame->hdr_len = pcbit_readw(dev);		frame->dt_len = pcbit_readw(dev);		/*		   * 0 sized packet		   * I don't know if they are an error or not...		   * But they are very frequent		   * Not documented		 */		if (frame->hdr_len == 0) {			kfree(frame);#ifdef DEBUG			printk(KERN_DEBUG "0 sized frame\n");#endif			pcbit_firmware_bug(dev);			return;		}		/* sanity check the length values */		if (frame->hdr_len > 1024 || frame->dt_len > 2048) {#ifdef DEBUG			printk(KERN_DEBUG "length problem: ");			printk(KERN_DEBUG "TH=%04x TD=%04x\n",			       frame->hdr_len,			       frame->dt_len);#endif			pcbit_l2_error(dev);			kfree(frame);			return;		}		/* minimum frame read */		frame->skb = dev_alloc_skb(frame->hdr_len + frame->dt_len +					   ((frame->hdr_len + 15) & ~15));		if (!frame->skb) {			printk(KERN_DEBUG "pcbit_receive: out of memory\n");			kfree(frame);			return;		}		/* 16 byte alignment for IP */		if (frame->dt_len)			skb_reserve(frame->skb, (frame->hdr_len + 15) & ~15);	} else {		/* Type 1 */		type1 = 1;		tt &= 0x7fffU;		if (!(frame = dev->read_frame)) {			printk("Type 1 frame and no frame queued\n");			/* usually after an error: toss frame */			dev->readptr += tt;			if (dev->readptr > dev->sh_mem + BANK2 + BANKLEN)				dev->readptr -= BANKLEN;			return;		}	}	memcpy_frompcbit(dev, skb_put(frame->skb, tt), tt);	frame->copied += tt;	if (frame->copied == frame->hdr_len + frame->dt_len) {		save_flags(flags);		cli();		if (type1) {			dev->read_frame = NULL;		}		if (dev->read_queue) {			struct frame_buf *ptr;			for (ptr = dev->read_queue; ptr->next; ptr = ptr->next);			ptr->next = frame;		} else			dev->read_queue = frame;		restore_flags(flags);	} else {		save_flags(flags);		cli();		dev->read_frame = frame;		restore_flags(flags);	}}/* *  The board sends 0 sized frames *  They are TDATA_CONFs that get messed up somehow *  gotta send a fake acknowledgment to the upper layer somehow */static __inline__ voidpcbit_fake_conf(struct pcbit_dev *dev, struct pcbit_chan *chan){	isdn_ctrl ictl;	if (chan->queued) {		chan->queued--;		ictl.driver = dev->id;		ictl.command = ISDN_STAT_BSENT;		ictl.arg = chan->id;		dev->dev_if->statcallb(&ictl);	}}static voidpcbit_firmware_bug(struct pcbit_dev *dev){	struct pcbit_chan *chan;	chan = dev->b1;	if (chan->fsm_state == ST_ACTIVE) {		pcbit_fake_conf(dev, chan);	}	chan = dev->b2;	if (chan->fsm_state == ST_ACTIVE) {		pcbit_fake_conf(dev, chan);	}}voidpcbit_irq_handler(int interrupt, void *devptr, struct pt_regs *regs){	struct pcbit_dev *dev;	u_char info,	 ack_seq,	 read_seq;	dev = (struct pcbit_dev *) devptr;	if (!dev) {		printk(KERN_WARNING "pcbit_irq_handler: wrong device\n");		return;	}	if (dev->interrupt) {		printk(KERN_DEBUG "pcbit: reentering interrupt hander\n");		return;	}	dev->interrupt = 1;	info = readb(dev->sh_mem + BANK3);	if (dev->l2_state == L2_STARTING || dev->l2_state == L2_ERROR) {		pcbit_l2_active_conf(dev, info);		dev->interrupt = 0;		return;	}	if (info & 0x40U) {     /* E bit set */#ifdef DEBUG		printk(KERN_DEBUG "pcbit_irq_handler: E bit on\n");#endif		pcbit_l2_error(dev);		dev->interrupt = 0;		return;	}	if (dev->l2_state != L2_RUNNING && dev->l2_state != L2_LOADING) {		dev->interrupt = 0;		return;	}	ack_seq = (info >> 3) & 0x07U;	read_seq = (info & 0x07U);	dev->interrupt = 0;	if (read_seq != dev->rcv_seq) {		while (read_seq != dev->rcv_seq) {			pcbit_receive(dev);			dev->rcv_seq = (dev->rcv_seq + 1) % 8;		}		pcbit_sched_delivery(dev);	}	if (ack_seq != dev->unack_seq) {		pcbit_recv_ack(dev, ack_seq);	}	info = dev->rcv_seq << 3;	info |= dev->send_seq;	writeb(info, dev->sh_mem + BANK4);}static voidpcbit_l2_active_conf(struct pcbit_dev *dev, u_char info){	u_char state;	state = dev->l2_state;#ifdef DEBUG	printk(KERN_DEBUG "layer2_active_confirm\n");#endif	if (info & 0x80U) {		dev->rcv_seq = info & 0x07U;		dev->l2_state = L2_RUNNING;	} else		dev->l2_state = L2_DOWN;	if (state == L2_STARTING)		wake_up_interruptible(&dev->set_running_wq);	if (state == L2_ERROR && dev->l2_state == L2_RUNNING) {		pcbit_transmit(dev);	}}static voidpcbit_l2_err_recover(unsigned long data){	struct pcbit_dev *dev;	struct frame_buf *frame;	dev = (struct pcbit_dev *) data;	del_timer(&dev->error_recover_timer);	if (dev->w_busy || dev->r_busy) {		init_timer(&dev->error_recover_timer);		dev->error_recover_timer.expires = jiffies + ERRTIME;		add_timer(&dev->error_recover_timer);		return;	}	dev->w_busy = dev->r_busy = 1;	if (dev->read_frame) {		if (dev->read_frame->skb)			kfree_skb(dev->read_frame->skb);		kfree(dev->read_frame);		dev->read_frame = NULL;	}	if (dev->write_queue) {		frame = dev->write_queue;#ifdef FREE_ON_ERROR		dev->write_queue = dev->write_queue->next;		if (frame->skb) {			dev_kfree_skb(frame->skb);		}		kfree(frame);#else		frame->copied = 0;#endif	}	dev->rcv_seq = dev->send_seq = dev->unack_seq = 0;	dev->free = 511;	dev->l2_state = L2_ERROR;	/* this is an hack... */	pcbit_firmware_bug(dev);	dev->writeptr = dev->sh_mem;	dev->readptr = dev->sh_mem + BANK2;	writeb((0x80U | ((dev->rcv_seq & 0x07) << 3) | (dev->send_seq & 0x07)),	       dev->sh_mem + BANK4);	dev->w_busy = dev->r_busy = 0;}static voidpcbit_l2_error(struct pcbit_dev *dev){	if (dev->l2_state == L2_RUNNING) {		printk(KERN_INFO "pcbit: layer 2 error\n");#ifdef DEBUG		log_state(dev);#endif		dev->l2_state = L2_DOWN;		init_timer(&dev->error_recover_timer);		dev->error_recover_timer.function = &pcbit_l2_err_recover;		dev->error_recover_timer.data = (ulong) dev;		dev->error_recover_timer.expires = jiffies + ERRTIME;		add_timer(&dev->error_recover_timer);	}}/* * Description: * if board acks frames *   update dev->free *   call pcbit_transmit to write possible queued frames */static voidpcbit_recv_ack(struct pcbit_dev *dev, unsigned char ack){	int i,	 count;	int unacked;	unacked = (dev->send_seq + (8 - dev->unack_seq)) & 0x07;	/* dev->unack_seq < ack <= dev->send_seq; */	if (unacked) {		if (dev->send_seq > dev->unack_seq) {			if (ack <= dev->unack_seq || ack > dev->send_seq) {				printk(KERN_DEBUG				     "layer 2 ack unacceptable - dev %d",				       dev->id);				pcbit_l2_error(dev);			} else if (ack > dev->send_seq && ack <= dev->unack_seq) {				printk(KERN_DEBUG				     "layer 2 ack unacceptable - dev %d",				       dev->id);				pcbit_l2_error(dev);			}		}		/* ack is acceptable */		i = dev->unack_seq;		do {			dev->unack_seq = i = (i + 1) % 8;			dev->free += dev->fsize[i];		} while (i != ack);		count = 0;		while (count < 7 && dev->write_queue) {			u8 lsend_seq = dev->send_seq;			pcbit_transmit(dev);			if (dev->send_seq == lsend_seq)				break;			count++;		}	} else		printk(KERN_DEBUG "recv_ack: unacked = 0\n");}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一级视频免费观看在线| 亚洲成人av一区| 亚洲国产色一区| 国产999精品久久| 日韩午夜精品视频| 亚洲午夜一区二区| 91蜜桃网址入口| 久久久久久久综合| 免费成人在线视频观看| 在线视频国产一区| 18欧美亚洲精品| 国产精品一品视频| 欧美成人精品高清在线播放| 亚洲一区视频在线| 色域天天综合网| 国产精品污网站| 国产91精品免费| 久久亚洲一区二区三区四区| 麻豆成人免费电影| 欧美久久久影院| 亚洲国产视频一区| 欧美日韩国产综合一区二区三区| 亚洲欧美一区二区在线观看| 99久久久久久| 亚洲色图19p| 色婷婷亚洲综合| 一区二区三区四区蜜桃| 色婷婷国产精品| 亚洲精品国产精品乱码不99| 91麻豆国产在线观看| 亚洲人成在线播放网站岛国| 91日韩在线专区| 亚洲免费视频成人| 欧美午夜精品一区二区蜜桃| 亚洲一区二区三区激情| 欧美精品成人一区二区三区四区| 亚洲成av人片在线| 欧美一区二区视频免费观看| 麻豆91精品91久久久的内涵| 欧美精品一区二区在线播放| 国产一区二区三区蝌蚪| 国产日韩高清在线| 色哟哟在线观看一区二区三区| 亚洲视频资源在线| 欧美日韩综合在线| 理论电影国产精品| 国产欧美日本一区视频| 97久久精品人人做人人爽50路| 亚洲精品国产成人久久av盗摄 | 欧美精品久久天天躁| 日韩中文字幕91| 久久这里只精品最新地址| 卡一卡二国产精品| 国产农村妇女毛片精品久久麻豆| 9i在线看片成人免费| 亚洲自拍与偷拍| 欧美成va人片在线观看| 成人激情小说网站| 亚洲小说春色综合另类电影| 日韩精品一区在线观看| 成人三级伦理片| 亚洲成人动漫在线免费观看| www国产成人免费观看视频 深夜成人网| 丁香网亚洲国际| 丝袜亚洲另类欧美综合| wwwwww.欧美系列| 日本高清免费不卡视频| 久久精品国产亚洲5555| 亚洲美腿欧美偷拍| 欧美大胆人体bbbb| 在线欧美一区二区| 国产成人免费在线观看| 午夜精品国产更新| 国产精品国产三级国产普通话三级 | 91毛片在线观看| 蜜臀av一区二区| 综合激情成人伊人| 精品国产一区二区三区av性色| 99国产精品一区| 韩国毛片一区二区三区| 亚洲妇女屁股眼交7| 国产欧美日韩一区二区三区在线观看| 欧美日韩高清一区二区| av在线综合网| 国产黑丝在线一区二区三区| 日韩电影网1区2区| 亚洲一区影音先锋| 成人免费视频在线观看| 久久久久国产精品厨房| 欧美一区二区三区精品| 欧美日韩精品综合在线| 色老汉一区二区三区| www.日本不卡| 国产大陆a不卡| 国内精品嫩模私拍在线| 奇米一区二区三区av| 污片在线观看一区二区| 亚洲卡通动漫在线| 亚洲视频在线观看三级| 国产精品网站在线| 中文字幕av免费专区久久| 2023国产精华国产精品| 欧美变态tickle挠乳网站| 欧美一级日韩免费不卡| 8v天堂国产在线一区二区| 欧美午夜在线观看| 欧美图片一区二区三区| 91精品91久久久中77777| 色综合天天综合网天天看片| 成人黄色片在线观看| 成人一区在线观看| 国产99久久久精品| www.日本不卡| 色综合久久九月婷婷色综合| 日本大香伊一区二区三区| 色综合 综合色| 欧美日韩精品免费观看视频 | 色婷婷综合久久久中文一区二区| 91麻豆免费观看| 91国产免费观看| 欧美三级在线看| 91精品国产福利在线观看 | 中文字幕不卡在线| 国产精品无圣光一区二区| 亚洲色图视频免费播放| 一区二区三区在线视频观看58| 一区二区三区欧美日韩| 一区二区成人在线观看| 五月天一区二区三区| 久久超碰97中文字幕| 国产一区二区精品久久| 成人97人人超碰人人99| 色嗨嗨av一区二区三区| 91精品国产丝袜白色高跟鞋| 国产夜色精品一区二区av| 欧美韩国日本一区| 一区二区三区日韩| 蜜桃91丨九色丨蝌蚪91桃色| 国产98色在线|日韩| 欧美丝袜自拍制服另类| 欧美videossexotv100| 中文字幕日韩一区二区| 亚洲成人激情自拍| 国产精品白丝av| 欧美午夜精品一区二区蜜桃| 欧美精品一区二区三区视频 | 国产日韩欧美一区二区三区综合| 国产精品传媒视频| 天堂蜜桃一区二区三区| 国产+成+人+亚洲欧洲自线| 欧美午夜寂寞影院| 久久美女艺术照精彩视频福利播放| 亚洲日本在线a| 国产资源在线一区| 欧美色爱综合网| 欧美国产欧美综合| 蜜臀91精品一区二区三区| 成人晚上爱看视频| 欧美一级二级三级蜜桃| 亚洲男人的天堂网| 国产高清在线精品| 欧美一区二区在线不卡| 亚洲精品成人在线| 成人免费毛片app| 日韩欧美国产综合| 亚洲综合久久久久| 粉嫩13p一区二区三区| 日韩免费观看2025年上映的电影| 樱桃视频在线观看一区| 国产一区二区三区精品视频| 欧美另类z0zxhd电影| 一区二区中文视频| 国产成人免费xxxxxxxx| 欧美不卡激情三级在线观看| 亚洲成在人线在线播放| 99久久精品免费观看| 日本一区二区久久| 国模少妇一区二区三区| 欧美一区二区三区爱爱| 亚洲观看高清完整版在线观看| 91丝袜国产在线播放| 欧美国产精品劲爆| 国产精品一二一区| 欧美电视剧免费全集观看| 青青草原综合久久大伊人精品 | 91麻豆国产在线观看| 国产精品热久久久久夜色精品三区| 久久电影国产免费久久电影| 日韩一区二区三免费高清| 婷婷国产在线综合| 欧美日韩国产区一| 午夜精品一区二区三区电影天堂 | 国产成人一区在线| 久久免费电影网| 精品一区二区三区av| 久久无码av三级| 国产成人av一区二区| 亚洲国产精品99久久久久久久久| 高清国产一区二区三区| 国产精品久久久久久久久晋中 |