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

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

?? usbatm.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
/***************  encode  ***************/static unsigned int usbatm_write_cells(struct usbatm_data *instance,				       struct sk_buff *skb,				       u8 *target, unsigned int avail_space){	struct usbatm_control *ctrl = UDSL_SKB(skb);	struct atm_vcc *vcc = ctrl->atm.vcc;	unsigned int num_written;	unsigned int stride = instance->tx_channel.stride;	vdbg("%s: skb->len=%d, avail_space=%u", __func__, skb->len, avail_space);	UDSL_ASSERT(!(avail_space % stride));	for (num_written = 0; num_written < avail_space && ctrl->len;	     num_written += stride, target += stride) {		unsigned int data_len = min_t(unsigned int, skb->len, ATM_CELL_PAYLOAD);		unsigned int left = ATM_CELL_PAYLOAD - data_len;		u8 *ptr = target;		ptr[0] = vcc->vpi >> 4;		ptr[1] = (vcc->vpi << 4) | (vcc->vci >> 12);		ptr[2] = vcc->vci >> 4;		ptr[3] = vcc->vci << 4;		ptr[4] = 0xec;		ptr += ATM_CELL_HEADER;		memcpy(ptr, skb->data, data_len);		ptr += data_len;		__skb_pull(skb, data_len);		if(!left)			continue;		memset(ptr, 0, left);		if (left >= ATM_AAL5_TRAILER) {	/* trailer will go in this cell */			u8 *trailer = target + ATM_CELL_SIZE - ATM_AAL5_TRAILER;			/* trailer[0] = 0;		UU = 0 */			/* trailer[1] = 0;		CPI = 0 */			trailer[2] = ctrl->len >> 8;			trailer[3] = ctrl->len;			ctrl->crc = ~ crc32_be(ctrl->crc, ptr, left - 4);			trailer[4] = ctrl->crc >> 24;			trailer[5] = ctrl->crc >> 16;			trailer[6] = ctrl->crc >> 8;			trailer[7] = ctrl->crc;			target[3] |= 0x2;	/* adjust PTI */			ctrl->len = 0;		/* tag this skb finished */		}		else			ctrl->crc = crc32_be(ctrl->crc, ptr, left);	}	return num_written;}/****************  receive  ****************/static void usbatm_rx_process(unsigned long data){	struct usbatm_data *instance = (struct usbatm_data *)data;	struct urb *urb;	while ((urb = usbatm_pop_urb(&instance->rx_channel))) {		vdbg("%s: processing urb 0x%p", __func__, urb);		if (usb_pipeisoc(urb->pipe)) {			int i;			for (i = 0; i < urb->number_of_packets; i++)				if (!urb->iso_frame_desc[i].status)					usbatm_extract_cells(instance,							     (u8 *)urb->transfer_buffer + urb->iso_frame_desc[i].offset,							     urb->iso_frame_desc[i].actual_length);		}		else			if (!urb->status)				usbatm_extract_cells(instance, urb->transfer_buffer, urb->actual_length);		if (usbatm_submit_urb(urb))			return;	}}/*************  send  *************/static void usbatm_tx_process(unsigned long data){	struct usbatm_data *instance = (struct usbatm_data *)data;	struct sk_buff *skb = instance->current_skb;	struct urb *urb = NULL;	const unsigned int buf_size = instance->tx_channel.buf_size;	unsigned int num_written = 0;	u8 *buffer = NULL;	if (!skb)		skb = skb_dequeue(&instance->sndqueue);	while (skb) {		if (!urb) {			urb = usbatm_pop_urb(&instance->tx_channel);			if (!urb)				break;		/* no more senders */			buffer = urb->transfer_buffer;			num_written = (urb->status == -EAGAIN) ?				urb->transfer_buffer_length : 0;		}		num_written += usbatm_write_cells(instance, skb,						  buffer + num_written,						  buf_size - num_written);		vdbg("%s: wrote %u bytes from skb 0x%p to urb 0x%p",		     __func__, num_written, skb, urb);		if (!UDSL_SKB(skb)->len) {			struct atm_vcc *vcc = UDSL_SKB(skb)->atm.vcc;			usbatm_pop(vcc, skb);			atomic_inc(&vcc->stats->tx);			skb = skb_dequeue(&instance->sndqueue);		}		if (num_written == buf_size || (!skb && num_written)) {			urb->transfer_buffer_length = num_written;			if (usbatm_submit_urb(urb))				break;			urb = NULL;		}	}	instance->current_skb = skb;}static void usbatm_cancel_send(struct usbatm_data *instance,			       struct atm_vcc *vcc){	struct sk_buff *skb, *n;	atm_dbg(instance, "%s entered\n", __func__);	spin_lock_irq(&instance->sndqueue.lock);	for (skb = instance->sndqueue.next, n = skb->next;	     skb != (struct sk_buff *)&instance->sndqueue;	     skb = n, n = skb->next)		if (UDSL_SKB(skb)->atm.vcc == vcc) {			atm_dbg(instance, "%s: popping skb 0x%p\n", __func__, skb);			__skb_unlink(skb, &instance->sndqueue);			usbatm_pop(vcc, skb);		}	spin_unlock_irq(&instance->sndqueue.lock);	tasklet_disable(&instance->tx_channel.tasklet);	if ((skb = instance->current_skb) && (UDSL_SKB(skb)->atm.vcc == vcc)) {		atm_dbg(instance, "%s: popping current skb (0x%p)\n", __func__, skb);		instance->current_skb = NULL;		usbatm_pop(vcc, skb);	}	tasklet_enable(&instance->tx_channel.tasklet);	atm_dbg(instance, "%s done\n", __func__);}static int usbatm_atm_send(struct atm_vcc *vcc, struct sk_buff *skb){	struct usbatm_data *instance = vcc->dev->dev_data;	struct usbatm_control *ctrl = UDSL_SKB(skb);	int err;	vdbg("%s called (skb 0x%p, len %u)", __func__, skb, skb->len);	if (!instance) {		dbg("%s: NULL data!", __func__);		err = -ENODEV;		goto fail;	}	if (vcc->qos.aal != ATM_AAL5) {		atm_dbg(instance, "%s: unsupported ATM type %d!\n", __func__, vcc->qos.aal);		err = -EINVAL;		goto fail;	}	if (skb->len > ATM_MAX_AAL5_PDU) {		atm_dbg(instance, "%s: packet too long (%d vs %d)!\n",				__func__, skb->len, ATM_MAX_AAL5_PDU);		err = -EINVAL;		goto fail;	}	PACKETDEBUG(skb->data, skb->len);	/* initialize the control block */	ctrl->atm.vcc = vcc;	ctrl->len = skb->len;	ctrl->crc = crc32_be(~0, skb->data, skb->len);	skb_queue_tail(&instance->sndqueue, skb);	tasklet_schedule(&instance->tx_channel.tasklet);	return 0; fail:	usbatm_pop(vcc, skb);	return err;}/**********************  bean counting  **********************/static void usbatm_destroy_instance(struct kref *kref){	struct usbatm_data *instance = container_of(kref, struct usbatm_data, refcount);	dbg("%s", __func__);	tasklet_kill(&instance->rx_channel.tasklet);	tasklet_kill(&instance->tx_channel.tasklet);	usb_put_dev(instance->usb_dev);	kfree(instance);}void usbatm_get_instance(struct usbatm_data *instance){	dbg("%s", __func__);	kref_get(&instance->refcount);}void usbatm_put_instance(struct usbatm_data *instance){	dbg("%s", __func__);	kref_put(&instance->refcount, usbatm_destroy_instance);}/************  ATM  ************/static void usbatm_atm_dev_close(struct atm_dev *dev){	struct usbatm_data *instance = dev->dev_data;	dbg("%s", __func__);	if (!instance)		return;	dev->dev_data = NULL;	usbatm_put_instance(instance);	/* taken in usbatm_atm_init */}static int usbatm_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page){	struct usbatm_data *instance = atm_dev->dev_data;	int left = *pos;	if (!instance) {		dbg("%s: NULL instance!", __func__);		return -ENODEV;	}	if (!left--)		return sprintf(page, "%s\n", instance->description);	if (!left--)		return sprintf(page, "MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",			       atm_dev->esi[0], atm_dev->esi[1],			       atm_dev->esi[2], atm_dev->esi[3],			       atm_dev->esi[4], atm_dev->esi[5]);	if (!left--)		return sprintf(page,			       "AAL5: tx %d ( %d err ), rx %d ( %d err, %d drop )\n",			       atomic_read(&atm_dev->stats.aal5.tx),			       atomic_read(&atm_dev->stats.aal5.tx_err),			       atomic_read(&atm_dev->stats.aal5.rx),			       atomic_read(&atm_dev->stats.aal5.rx_err),			       atomic_read(&atm_dev->stats.aal5.rx_drop));	if (!left--)		switch (atm_dev->signal) {		case ATM_PHY_SIG_FOUND:			return sprintf(page, "Line up\n");		case ATM_PHY_SIG_LOST:			return sprintf(page, "Line down\n");		default:			return sprintf(page, "Line state unknown\n");		}	return 0;}static int usbatm_atm_open(struct atm_vcc *vcc){	struct usbatm_data *instance = vcc->dev->dev_data;	struct usbatm_vcc_data *new = NULL;	int ret;	int vci = vcc->vci;	short vpi = vcc->vpi;	if (!instance) {		dbg("%s: NULL data!", __func__);		return -ENODEV;	}	atm_dbg(instance, "%s: vpi %hd, vci %d\n", __func__, vpi, vci);	/* only support AAL5 */	if ((vcc->qos.aal != ATM_AAL5) || (vcc->qos.rxtp.max_sdu < 0)	    || (vcc->qos.rxtp.max_sdu > ATM_MAX_AAL5_PDU)) {		atm_dbg(instance, "%s: unsupported ATM type %d!\n", __func__, vcc->qos.aal);		return -EINVAL;	}	down(&instance->serialize);	/* vs self, usbatm_atm_close */	if (usbatm_find_vcc(instance, vpi, vci)) {		atm_dbg(instance, "%s: %hd/%d already in use!\n", __func__, vpi, vci);		ret = -EADDRINUSE;		goto fail;	}	if (!(new = kmalloc(sizeof(struct usbatm_vcc_data), GFP_KERNEL))) {		atm_dbg(instance, "%s: no memory for vcc_data!\n", __func__);		ret = -ENOMEM;		goto fail;	}	memset(new, 0, sizeof(struct usbatm_vcc_data));	new->vcc = vcc;	new->vpi = vpi;	new->vci = vci;	new->sarb = alloc_skb(usbatm_pdu_length(vcc->qos.rxtp.max_sdu), GFP_KERNEL);	if (!new->sarb) {		atm_dbg(instance, "%s: no memory for SAR buffer!\n", __func__);		ret = -ENOMEM;		goto fail;	}	vcc->dev_data = new;	tasklet_disable(&instance->rx_channel.tasklet);	list_add(&new->list, &instance->vcc_list);	tasklet_enable(&instance->rx_channel.tasklet);	set_bit(ATM_VF_ADDR, &vcc->flags);	set_bit(ATM_VF_PARTIAL, &vcc->flags);	set_bit(ATM_VF_READY, &vcc->flags);	up(&instance->serialize);	atm_dbg(instance, "%s: allocated vcc data 0x%p\n", __func__, new);	return 0;fail:	kfree(new);	up(&instance->serialize);	return ret;}static void usbatm_atm_close(struct atm_vcc *vcc){	struct usbatm_data *instance = vcc->dev->dev_data;	struct usbatm_vcc_data *vcc_data = vcc->dev_data;	if (!instance || !vcc_data) {		dbg("%s: NULL data!", __func__);		return;	}	atm_dbg(instance, "%s entered\n", __func__);	atm_dbg(instance, "%s: deallocating vcc 0x%p with vpi %d vci %d\n",		__func__, vcc_data, vcc_data->vpi, vcc_data->vci);	usbatm_cancel_send(instance, vcc);	down(&instance->serialize);	/* vs self, usbatm_atm_open */	tasklet_disable(&instance->rx_channel.tasklet);	list_del(&vcc_data->list);	tasklet_enable(&instance->rx_channel.tasklet);	kfree_skb(vcc_data->sarb);	vcc_data->sarb = NULL;	kfree(vcc_data);	vcc->dev_data = NULL;	vcc->vpi = ATM_VPI_UNSPEC;	vcc->vci = ATM_VCI_UNSPEC;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品伊人色| 五月婷婷色综合| 色综合久久六月婷婷中文字幕| 久久麻豆一区二区| 国产mv日韩mv欧美| 国产精品网站在线| 91视频国产资源| 亚洲午夜久久久久| 精品国产一区二区亚洲人成毛片 | 国产精品人成在线观看免费 | 午夜精品123| 欧美一二三四区在线| 国产一区二区影院| 中文字幕av不卡| 看电视剧不卡顿的网站| 91精品国产一区二区三区香蕉| 麻豆91在线播放| 日韩伦理免费电影| 欧美一二三四区在线| gogo大胆日本视频一区| 亚洲综合激情小说| 国产日产欧美一区二区视频| 欧美在线一二三四区| 狠狠色丁香久久婷婷综| 一区二区三区 在线观看视频| 欧美电影免费观看高清完整版在线| 99热99精品| 精品一区二区三区蜜桃| 亚洲在线成人精品| 国产精品热久久久久夜色精品三区| 欧美人牲a欧美精品| 91婷婷韩国欧美一区二区| 免费看日韩精品| 亚洲观看高清完整版在线观看| 国产欧美日韩另类视频免费观看| 日韩欧美一卡二卡| 欧美日韩亚洲高清一区二区| a在线欧美一区| 国产iv一区二区三区| 激情综合色播激情啊| 偷拍日韩校园综合在线| 亚洲精品亚洲人成人网在线播放| 久久精品欧美一区二区三区不卡 | 亚洲成人av电影| 夜夜揉揉日日人人青青一国产精品| 国产三级久久久| 久久久久久久久久看片| 精品国产乱码久久久久久浪潮 | 精品国产一区二区三区不卡| 欧美色爱综合网| 欧美老肥妇做.爰bbww视频| 在线视频中文字幕一区二区| 欧美日韩电影在线播放| 成人黄色电影在线| 波多野结衣欧美| 91理论电影在线观看| 色天使久久综合网天天| 91麻豆精东视频| 欧美在线视频全部完| 欧美另类videos死尸| 3atv在线一区二区三区| 免费精品视频在线| 午夜精品免费在线观看| 亚洲国产综合在线| 久久成人精品无人区| 国产成人在线视频网站| 白白色 亚洲乱淫| 欧美色图片你懂的| 日韩精品专区在线影院重磅| 26uuu精品一区二区在线观看| 国产日韩欧美一区二区三区乱码| 一本大道久久a久久精二百 | 一本色道久久加勒比精品| 在线观看一区日韩| 国产大片一区二区| 久久国产生活片100| 91浏览器在线视频| 天堂在线一区二区| 日韩一卡二卡三卡四卡| 精品国产亚洲在线| 99久免费精品视频在线观看| 婷婷亚洲久悠悠色悠在线播放 | 欧美日韩精品福利| 国产成人精品一区二区三区四区 | 日韩av中文在线观看| 亚洲欧洲一区二区三区| 成人午夜大片免费观看| 亚洲成av人片观看| av电影在线观看一区| 欧洲日韩一区二区三区| 久久嫩草精品久久久久| 一级特黄大欧美久久久| 国产91富婆露脸刺激对白| 欧美色图一区二区三区| 国产精品色呦呦| 久久成人免费电影| 这里只有精品电影| 一区二区三区国产豹纹内裤在线| 高清在线成人网| 欧美精品一区二区精品网| 日日夜夜精品视频免费| 欧美亚洲自拍偷拍| 一区二区三区波多野结衣在线观看| 国产一区欧美二区| 日韩欧美一区二区视频| 日韩和欧美的一区| 欧美日本一区二区三区四区| 亚洲精品欧美综合四区| 成人小视频免费在线观看| 久久精品视频网| 成人看片黄a免费看在线| 久久久久一区二区三区四区| 精品亚洲免费视频| 久久综合九色综合欧美98| 91麻豆成人久久精品二区三区| 欧美一区二区视频在线观看2020| 亚洲国产日韩一级| 欧美精品v国产精品v日韩精品 | 久久精品日韩一区二区三区| 久久99久久久久| 久久一夜天堂av一区二区三区| 久久av中文字幕片| 久久精品一二三| av在线播放不卡| 亚洲精品视频在线看| 欧美在线高清视频| 男人的天堂亚洲一区| 精品三级在线观看| 国产福利一区在线观看| 国产精品久久国产精麻豆99网站 | 午夜久久久久久| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲成人综合视频| 欧美电影免费观看高清完整版在线观看| 国产精品一级片在线观看| 国产精品久久久久精k8 | 成人国产精品免费观看视频| 自拍偷拍欧美精品| 日韩一区二区中文字幕| 国产91精品精华液一区二区三区| 日韩理论片中文av| 日韩精品一区二区三区中文不卡 | 欧美高清视频www夜色资源网| 国内精品久久久久影院薰衣草| 国产欧美一区二区三区网站 | 性久久久久久久| 久久久久久久综合色一本| 97久久超碰精品国产| 美日韩一级片在线观看| 亚洲欧美另类久久久精品| 欧美哺乳videos| 欧美乱熟臀69xxxxxx| kk眼镜猥琐国模调教系列一区二区| 日韩高清在线电影| 亚洲色图视频网| 国产精品系列在线| 日韩欧美www| 7777精品伊人久久久大香线蕉经典版下载 | 26uuu亚洲| 欧美第一区第二区| 欧美人动与zoxxxx乱| 欧美写真视频网站| 色哟哟国产精品免费观看| 国产成人亚洲综合a∨婷婷图片| 免费在线观看精品| 日本va欧美va欧美va精品| 午夜免费久久看| 亚洲不卡在线观看| 午夜精品视频一区| 日韩高清一区二区| 另类调教123区| 捆绑调教一区二区三区| 经典三级视频一区| 国产一本一道久久香蕉| 国产精品一区二区免费不卡| 韩国v欧美v亚洲v日本v| 精品亚洲国内自在自线福利| 国产一区二区三区综合| 国产成人精品亚洲日本在线桃色| 国产丶欧美丶日本不卡视频| 国产.欧美.日韩| 91猫先生在线| 正在播放亚洲一区| 久久精品视频免费观看| 中文字幕在线观看一区二区| 日韩美女视频19| 亚洲v中文字幕| 国模一区二区三区白浆| 国产成+人+日韩+欧美+亚洲| 成人一区二区三区| 在线观看不卡视频| 日韩免费高清av| 久久久综合九色合综国产精品| 久久精品欧美一区二区三区麻豆| 日韩一区欧美一区| 蜜臀av一区二区在线免费观看 | 欧美色爱综合网| 久久久综合视频| 午夜精品久久久久久| 国模套图日韩精品一区二区|