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

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

?? csr.c

?? 1394在linux下單獨(dú)的驅(qū)動程序代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/** IEEE 1394 for Linux** CSR implementation, iso/bus manager implementation.** Copyright (C) 1999 Andreas E. Bombe*               2002 Manfred Weihs <weihs@ict.tuwien.ac.at>** This code is licensed under the GPL.  See the file COPYING in the root* directory of the kernel sources for details.*** Contributions:** Manfred Weihs <weihs@ict.tuwien.ac.at>*        configuration ROM manipulation**/#include <linux/string.h>#include <linux/module.h> /* needed for MODULE_PARM */#include <linux/param.h>#include <linux/spinlock.h>#include "ieee1394_types.h"#include "hosts.h"#include "ieee1394.h"#include "highlevel.h"/* Module Parameters *//* this module parameter can be used to disable mapping of the FCP registers */MODULE_PARM(fcp,"i");MODULE_PARM_DESC(fcp, "FCP-registers");static int fcp = 1;static u16 csr_crc16(unsigned *data, int length){	int check=0, i;	int shift, sum, next=0;		for (i = length; i; i--) {		for (next = check, shift = 28; shift >= 0; shift -= 4 ) {			sum = ((next >> 12) ^ (be32_to_cpu(*data) >> shift)) & 0xf;			next = (next << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);		}		check = next & 0xffff;		data++;	}		return check;}static void host_reset(struct hpsb_host *host){	host->csr.state &= 0x300;		host->csr.bus_manager_id = 0x3f;	host->csr.bandwidth_available = 4915;	host->csr.channels_available_hi = 0xfffffffe;	/* pre-alloc ch 31 per 1394a-2000 */	host->csr.channels_available_lo = ~0;	host->csr.broadcast_channel = 0x80000000 | 31;		if (host->is_irm) {		if (host->driver->hw_csr_reg) {			host->driver->hw_csr_reg(host, 2, 0xfffffffe, ~0);		}	}		host->csr.node_ids = host->node_id << 16;		if (!host->is_root) {		/* clear cmstr bit */		host->csr.state &= ~0x100;	}		host->csr.topology_map[1] = 		cpu_to_be32(be32_to_cpu(host->csr.topology_map[1]) + 1);	host->csr.topology_map[2] = cpu_to_be32(host->node_count << 16 		| host->selfid_count);	host->csr.topology_map[0] = 		cpu_to_be32((host->selfid_count + 2) << 16		| csr_crc16(host->csr.topology_map + 1,		host->selfid_count + 2));		host->csr.speed_map[1] = 		cpu_to_be32(be32_to_cpu(host->csr.speed_map[1]) + 1);	host->csr.speed_map[0] = cpu_to_be32(0x3f1 << 16 		| csr_crc16(host->csr.speed_map+1,		0x3f1));}/* * HI == seconds (bits 0:2)* LO == fraction units of 1/8000 of a second, as per 1394 (bits 19:31)** Convert to units and then to HZ, for comparison to jiffies.** By default this will end up being 800 units, or 100ms (125usec per* unit).** NOTE: The spec says 1/8000, but also says we can compute based on 1/8192* like CSR specifies. Should make our math less complex.*/static inline void calculate_expire(struct csr_control *csr){	unsigned long units;		/* Take the seconds, and convert to units */	units = (unsigned long)(csr->split_timeout_hi & 0x07) << 13;		/* Add in the fractional units */	units += (unsigned long)(csr->split_timeout_lo >> 19);		/* Convert to jiffies */	csr->expire = (unsigned long)(units * HZ) >> 13UL;		/* Just to keep from rounding low */	csr->expire++;		HPSB_VERBOSE("CSR: setting expire to %lu, HZ=%d", csr->expire, HZ);}static void add_host(struct hpsb_host *host){	host->csr.lock = SPIN_LOCK_UNLOCKED;		host->csr.rom_size = host->driver->get_rom(host, &host->csr.rom);	host->csr.rom_version           = 0;	host->csr.state                 = 0;	host->csr.node_ids              = 0;	host->csr.split_timeout_hi      = 0;	host->csr.split_timeout_lo      = 800 << 19;	calculate_expire(&host->csr);	host->csr.cycle_time            = 0;	host->csr.bus_time              = 0;	host->csr.bus_manager_id        = 0x3f;	host->csr.bandwidth_available   = 4915;	host->csr.channels_available_hi = 0xfffffffe;	/* pre-alloc ch 31 per 1394a-2000 */	host->csr.channels_available_lo = ~0;	host->csr.broadcast_channel = 0x80000000 | 31;		if (host->is_irm) {		if (host->driver->hw_csr_reg) {			host->driver->hw_csr_reg(host, 2, 0xfffffffe, ~0);		}	}}int hpsb_update_config_rom(struct hpsb_host *host, const quadlet_t *new_rom, 						   size_t size, unsigned char rom_version){	unsigned long flags;	int ret;		spin_lock_irqsave(&host->csr.lock, flags); 	if (rom_version != host->csr.rom_version)		ret = -1;	else if (size > (CSR_CONFIG_ROM_SIZE << 2))		ret = -2;	else {		memcpy(host->csr.rom,new_rom,size);		host->csr.rom_size=size;		host->csr.rom_version++;		ret=0;	}	spin_unlock_irqrestore(&host->csr.lock, flags);	return ret;}int hpsb_get_config_rom(struct hpsb_host *host, quadlet_t *buffer, 						size_t buffersize, size_t *rom_size, unsigned char *rom_version){	unsigned long flags;	int ret;		spin_lock_irqsave(&host->csr.lock, flags); 	*rom_version=host->csr.rom_version;	*rom_size=host->csr.rom_size;	if (buffersize < host->csr.rom_size)		ret = -1;	else {		memcpy(buffer,host->csr.rom,host->csr.rom_size);		ret=0;	}	spin_unlock_irqrestore(&host->csr.lock, flags);	return ret;}/* Read topology / speed maps and configuration ROM */static int read_maps(struct hpsb_host *host, int nodeid, quadlet_t *buffer,                     u64 addr, size_t length, u16 fl){	unsigned long flags;	int csraddr = addr - CSR_REGISTER_BASE;	const char *src;		spin_lock_irqsave(&host->csr.lock, flags); 		if (csraddr < CSR_TOPOLOGY_MAP) {		if (csraddr + length > CSR_CONFIG_ROM + host->csr.rom_size) {			spin_unlock_irqrestore(&host->csr.lock, flags);			return RCODE_ADDRESS_ERROR;		}		src = ((char *)host->csr.rom) + csraddr - CSR_CONFIG_ROM;	} else if (csraddr < CSR_SPEED_MAP) {		src = ((char *)host->csr.topology_map) + csraddr 			- CSR_TOPOLOGY_MAP;	} else {		src = ((char *)host->csr.speed_map) + csraddr - CSR_SPEED_MAP;	}		memcpy(buffer, src, length);	spin_unlock_irqrestore(&host->csr.lock, flags);	return RCODE_COMPLETE;}#define out if (--length == 0) breakstatic int read_regs(struct hpsb_host *host, int nodeid, quadlet_t *buf,                     u64 addr, size_t length, u16 flags){	int csraddr = addr - CSR_REGISTER_BASE;	int oldcycle;	quadlet_t ret;		if ((csraddr | length) & 0x3)		return RCODE_TYPE_ERROR;		length /= 4;		switch (csraddr) {	case CSR_STATE_CLEAR:		*(buf++) = cpu_to_be32(host->csr.state);		out;	case CSR_STATE_SET:		*(buf++) = cpu_to_be32(host->csr.state);		out;	case CSR_NODE_IDS:		*(buf++) = cpu_to_be32(host->csr.node_ids);		out;			case CSR_RESET_START:		return RCODE_TYPE_ERROR;				/* address gap - handled by default below */			case CSR_SPLIT_TIMEOUT_HI:		*(buf++) = cpu_to_be32(host->csr.split_timeout_hi);		out;	case CSR_SPLIT_TIMEOUT_LO:		*(buf++) = cpu_to_be32(host->csr.split_timeout_lo);		out;				/* address gap */		return RCODE_ADDRESS_ERROR;			case CSR_CYCLE_TIME:		oldcycle = host->csr.cycle_time;		host->csr.cycle_time =			host->driver->devctl(host, GET_CYCLE_COUNTER, 0);				if (oldcycle > host->csr.cycle_time) {			/* cycle time wrapped around */			host->csr.bus_time += 1 << 7;		}		*(buf++) = cpu_to_be32(host->csr.cycle_time);		out;	case CSR_BUS_TIME:		oldcycle = host->csr.cycle_time;		host->csr.cycle_time =			host->driver->devctl(host, GET_CYCLE_COUNTER, 0);				if (oldcycle > host->csr.cycle_time) {			/* cycle time wrapped around */			host->csr.bus_time += (1 << 7);		}		*(buf++) = cpu_to_be32(host->csr.bus_time 			| (host->csr.cycle_time >> 25));		out;				/* address gap */		return RCODE_ADDRESS_ERROR;			case CSR_BUSY_TIMEOUT:		/* not yet implemented */		return RCODE_ADDRESS_ERROR;			case CSR_BUS_MANAGER_ID:		if (host->driver->hw_csr_reg)			ret = host->driver->hw_csr_reg(host, 0, 0, 0);		else			ret = host->csr.bus_manager_id;				*(buf++) = cpu_to_be32(ret);		out;	case CSR_BANDWIDTH_AVAILABLE:		if (host->driver->hw_csr_reg)			ret = host->driver->hw_csr_reg(host, 1, 0, 0);		else			ret = host->csr.bandwidth_available;				*(buf++) = cpu_to_be32(ret);		out;	case CSR_CHANNELS_AVAILABLE_HI:		if (host->driver->hw_csr_reg)			ret = host->driver->hw_csr_reg(host, 2, 0, 0);		else			ret = host->csr.channels_available_hi;				*(buf++) = cpu_to_be32(ret);		out;	case CSR_CHANNELS_AVAILABLE_LO:		if (host->driver->hw_csr_reg)			ret = host->driver->hw_csr_reg(host, 3, 0, 0);		else			ret = host->csr.channels_available_lo;				*(buf++) = cpu_to_be32(ret);		out;			case CSR_BROADCAST_CHANNEL:		*(buf++) = cpu_to_be32(host->csr.broadcast_channel);		out;				/* address gap to end - fall through to default */	default:		return RCODE_ADDRESS_ERROR;	}		return RCODE_COMPLETE;}static int write_regs(struct hpsb_host *host, int nodeid, int destid,					  quadlet_t *data, u64 addr, size_t length, u16 flags){	int csraddr = addr - CSR_REGISTER_BASE;		if ((csraddr | length) & 0x3)		return RCODE_TYPE_ERROR;		length /= 4;		switch (csraddr) {	case CSR_STATE_CLEAR:		/* FIXME FIXME FIXME */		printk("doh, someone wants to mess with state clear\n");		out;	case CSR_STATE_SET:		printk("doh, someone wants to mess with state set\n");		out;			case CSR_NODE_IDS:		host->csr.node_ids &= NODE_MASK << 16;		host->csr.node_ids |= be32_to_cpu(*(data++)) & (BUS_MASK << 16);		host->node_id = host->csr.node_ids >> 16;		host->driver->devctl(host, SET_BUS_ID, host->node_id >> 6);		out;			case CSR_RESET_START:		/* FIXME - perform command reset */		out;				/* address gap */		return RCODE_ADDRESS_ERROR;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国内成人自拍视频| 国产精品久久久久久户外露出 | 亚洲欧洲av在线| 成人免费av网站| 国产精品国产精品国产专区不片 | 成人自拍视频在线观看| 亚洲欧美怡红院| 欧洲精品在线观看| 日本成人在线不卡视频| 精品国产一区久久| 99这里只有精品| 亚洲国产你懂的| 久久奇米777| 91同城在线观看| 日韩高清在线不卡| 国产日韩欧美不卡在线| 91看片淫黄大片一级在线观看| 亚洲欧美一区二区三区极速播放 | 91精品国产手机| 久久成人麻豆午夜电影| 国产丝袜美腿一区二区三区| 99久久精品99国产精品| 秋霞午夜av一区二区三区| 精品国产露脸精彩对白| 99久久伊人网影院| 免费成人你懂的| 欧美韩国一区二区| 欧美日本不卡视频| 成人一区在线观看| 亚洲国产精品久久艾草纯爱| 精品av综合导航| 色哟哟一区二区在线观看| 久久成人av少妇免费| 亚洲欧美一区二区久久| 专区另类欧美日韩| 91精品免费在线观看| 国产精品99久久久| 日本不卡一区二区三区| 最新国产成人在线观看| 26uuu国产在线精品一区二区| 91浏览器在线视频| 国产成人自拍在线| 奇米四色…亚洲| 亚洲一区二区欧美| 国产欧美日韩久久| 日韩欧美一级二级| 欧美日韩免费观看一区二区三区| 国产福利电影一区二区三区| 视频一区二区不卡| 亚洲精品写真福利| 亚洲欧洲另类国产综合| 精品剧情v国产在线观看在线| 欧美三级中文字幕在线观看| 成人午夜看片网址| 国产成人av电影在线| 美女诱惑一区二区| 日韩成人免费在线| 亚洲成人黄色影院| 一区二区三区四区视频精品免费| 国产清纯白嫩初高生在线观看91 | 性做久久久久久免费观看| 国产精品第五页| 中文字幕av一区二区三区免费看 | 91精品中文字幕一区二区三区| 91在线观看污| 岛国精品在线观看| 国内精品自线一区二区三区视频| 日韩中文字幕麻豆| 午夜激情一区二区三区| 亚洲午夜日本在线观看| 伊人婷婷欧美激情| 一区二区三区在线视频免费观看| 亚洲欧洲精品一区二区三区不卡| 欧美国产亚洲另类动漫| 国产亚洲欧洲一区高清在线观看| 精品蜜桃在线看| 久久久久国色av免费看影院| 久久久久久久综合日本| 国产日韩三级在线| 国产精品午夜久久| 国产精品女同一区二区三区| 国产精品欧美精品| 亚洲日本在线天堂| 亚洲综合在线视频| 亚洲aaa精品| 亚洲国产一区在线观看| 亚洲制服丝袜一区| 丝袜亚洲精品中文字幕一区| 日韩成人精品在线| 国内偷窥港台综合视频在线播放| 国产成人综合网| 色综合天天视频在线观看| 在线观看91精品国产入口| 欧美日韩亚洲高清一区二区| 日韩三级伦理片妻子的秘密按摩| 国产精品久久久久久久久图文区| 中文字幕精品三区| 亚洲麻豆国产自偷在线| 午夜av区久久| 国内精品久久久久影院薰衣草| 丁香六月久久综合狠狠色| 91浏览器打开| 日韩女优视频免费观看| 国产色婷婷亚洲99精品小说| 国产精品成人免费在线| 夜夜操天天操亚洲| 精品综合免费视频观看| 成人免费av资源| 欧美精品乱人伦久久久久久| 久久久蜜桃精品| 亚洲色图都市小说| 欧美aaaaa成人免费观看视频| 国产伦精品一区二区三区在线观看| 91一区二区三区在线观看| 欧美乱妇15p| 国产精品少妇自拍| 视频在线观看一区| 国产91高潮流白浆在线麻豆 | 国产精品456| 欧美在线视频不卡| 久久影音资源网| 亚洲午夜av在线| 粉嫩蜜臀av国产精品网站| 在线播放日韩导航| 国产精品久久午夜| 久久电影国产免费久久电影| 色呦呦日韩精品| 欧美经典一区二区| 日本在线不卡一区| 色欧美日韩亚洲| 国产欧美日韩在线| 久久精品国产亚洲高清剧情介绍| 日本高清免费不卡视频| 久久久久久久久久美女| 日韩av一区二区在线影视| 色综合视频在线观看| 国产性做久久久久久| 日韩不卡一二三区| 欧美亚洲国产怡红院影院| 国产丝袜美腿一区二区三区| 免费三级欧美电影| 欧美三级视频在线播放| 中文字幕一区二区三区蜜月| 国产一区二区三区四区五区美女| 欧美性高清videossexo| 亚洲人吸女人奶水| av在线这里只有精品| 久久久美女艺术照精彩视频福利播放| 天天av天天翘天天综合网色鬼国产| 91色在线porny| 国产精品免费久久| 国产成人aaa| 国产欧美一区视频| 国产精品中文字幕一区二区三区| 日韩欧美激情一区| 日本中文字幕一区二区有限公司| 欧美视频一二三区| 亚洲一二三四久久| 日本乱人伦一区| 蜜桃久久精品一区二区| 欧美日韩黄色一区二区| 亚洲成人三级小说| 91国模大尺度私拍在线视频| 一区二区三区美女| 欧美在线一区二区三区| 一区二区三区四区激情| 色999日韩国产欧美一区二区| 综合色中文字幕| 色哟哟在线观看一区二区三区| 亚洲图片欧美激情| 色8久久人人97超碰香蕉987| 亚洲综合免费观看高清完整版在线 | 国产在线不卡一区| 久久久噜噜噜久久人人看 | 日韩一区二区视频在线观看| 日韩福利电影在线| 日韩一区二区在线播放| 九九精品一区二区| 国产女同性恋一区二区| 99re免费视频精品全部| 一区二区三区在线看| 欧美日韩久久一区二区| 麻豆精品国产91久久久久久| 精品久久久久久亚洲综合网| 福利电影一区二区| 一级中文字幕一区二区| 欧美一区二区三区喷汁尤物| 国产一区二区在线观看视频| 最新中文字幕一区二区三区| 色天天综合久久久久综合片| 五月天婷婷综合| 久久先锋资源网| 一本色道**综合亚洲精品蜜桃冫| 五月综合激情网| 国产亚洲欧洲一区高清在线观看| 99re这里只有精品6| 日韩不卡在线观看日韩不卡视频| 久久久亚洲午夜电影| 欧美综合视频在线观看| 蜜桃久久av一区|