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

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

?? csr.c

?? IEE1394 火線接口驅動 for linux
?? 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=%lu", 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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产iv一区二区三区| 精品国产凹凸成av人网站| 91麻豆精品国产自产在线| 久久婷婷久久一区二区三区| 亚洲国产中文字幕在线视频综合| 国产精品911| 精品国产一区二区亚洲人成毛片| 亚洲综合视频网| 成人一区二区三区在线观看| 欧美成人bangbros| 日韩和欧美一区二区三区| 99re成人在线| 国产精品丝袜在线| 国产精品一区二区x88av| 欧美一区二区美女| 婷婷中文字幕综合| 欧美唯美清纯偷拍| 亚洲一线二线三线久久久| 不卡一二三区首页| 日本一区二区综合亚洲| 国产麻豆视频精品| 久久久久久免费| 久久激情五月婷婷| 精品福利二区三区| 九九**精品视频免费播放| 91精品国产综合久久香蕉的特点 | 久久机这里只有精品| 欧美精品v日韩精品v韩国精品v| 一区二区三区四区不卡在线| 一本久道中文字幕精品亚洲嫩| 国产精品家庭影院| av电影在线观看完整版一区二区| 欧美韩国日本不卡| 99久久精品免费看国产免费软件| 国产精品女主播av| 99久久精品国产观看| 《视频一区视频二区| 色欲综合视频天天天| 亚洲专区一二三| 欧美日韩精品三区| 裸体在线国模精品偷拍| wwwwxxxxx欧美| 成人一级视频在线观看| 亚洲日穴在线视频| 欧美午夜片在线观看| 首页综合国产亚洲丝袜| 欧美videos中文字幕| 国产一区不卡视频| 专区另类欧美日韩| 欧美日韩国产高清一区| 国产综合色产在线精品| 国产精品久久久久桃色tv| 91成人网在线| 美女视频网站久久| 中文字幕不卡三区| 欧美亚洲一区二区在线| 韩国毛片一区二区三区| 国产精品少妇自拍| 欧美老女人第四色| 国产精品一区二区在线观看不卡| 亚洲色图欧美在线| 91精品国产综合久久久蜜臀粉嫩 | 中文字幕一区日韩精品欧美| 在线一区二区三区| 久久99精品久久久久久久久久久久| 久久影院午夜论| 色老头久久综合| 国内久久婷婷综合| 午夜精品久久久久久久久久| 久久免费电影网| 欧美日韩在线亚洲一区蜜芽| 国产一区二区看久久| 亚洲男人的天堂一区二区| 日韩欧美一区电影| 在线观看成人免费视频| 国产精品中文字幕一区二区三区| 亚洲18影院在线观看| 国产欧美一二三区| 91麻豆精品国产综合久久久久久| 91影院在线观看| 国产精品99久久久久久久vr| 五月开心婷婷久久| 亚洲色图欧美激情| 国产欧美精品一区二区色综合| 欧美精品亚洲一区二区在线播放| aa级大片欧美| 精品一区二区精品| 亚洲第四色夜色| 亚洲欧美日韩系列| 国产精品网站一区| 26uuu另类欧美| 欧美一级精品大片| 欧美日韩国产综合视频在线观看| 成人免费毛片aaaaa**| 国产一区二区剧情av在线| 免费看欧美美女黄的网站| 亚洲国产三级在线| 亚洲最新在线观看| 亚洲色图欧洲色图| 中文字幕亚洲欧美在线不卡| 国产亚洲精久久久久久| 久久综合狠狠综合久久综合88| 日韩免费看网站| 欧美一区国产二区| 在线电影国产精品| 9191成人精品久久| 8x8x8国产精品| 欧美日韩三级一区| 欧美日韩另类国产亚洲欧美一级| 97久久超碰国产精品| 99在线精品视频| 99精品视频中文字幕| 99精品热视频| 99久久精品国产精品久久| 91免费小视频| 91久久香蕉国产日韩欧美9色| av电影在线观看不卡| 色综合色狠狠综合色| 欧美视频在线播放| 欧美精品在线观看播放| 日韩午夜在线观看| 久久久噜噜噜久噜久久综合| 国产亚洲精品久| 亚洲日韩欧美一区二区在线| 一区二区激情视频| 天天综合色天天综合色h| 蜜臀av一区二区| 国产精品一卡二卡| 91免费在线视频观看| 欧美日韩国产成人在线91| 日韩一区和二区| 国产亚洲精品中文字幕| 有码一区二区三区| 免费在线观看一区| 国产69精品一区二区亚洲孕妇| 色婷婷av一区| 日韩一区二区免费在线电影 | 伊人性伊人情综合网| 丝袜亚洲另类丝袜在线| 激情五月婷婷综合| 99久久久国产精品免费蜜臀| 69精品人人人人| 日本一区二区免费在线| 亚洲一区二区在线视频| 激情五月播播久久久精品| 色网综合在线观看| 日韩手机在线导航| 亚洲天堂久久久久久久| 麻豆中文一区二区| eeuss影院一区二区三区| 欧美精品一级二级| 国产精品久久久久四虎| 日本中文字幕一区二区有限公司| 国产精品一区二区黑丝| 欧美日韩一区二区在线观看视频| 久久久亚洲精品石原莉奈| 夜夜亚洲天天久久| 丁香网亚洲国际| 欧美一区二区三区爱爱| 亚洲日本青草视频在线怡红院| 热久久国产精品| av欧美精品.com| 久久综合色天天久久综合图片| 亚洲高清免费观看高清完整版在线观看| 另类综合日韩欧美亚洲| 91久久精品一区二区三| 国产日韩欧美精品综合| 日本不卡一区二区三区高清视频| 国产精品久久久久影院| 视频一区二区三区入口| 丁香亚洲综合激情啪啪综合| 日本乱人伦aⅴ精品| 国产目拍亚洲精品99久久精品| 日韩极品在线观看| 色伊人久久综合中文字幕| 中文字幕高清不卡| 激情欧美一区二区三区在线观看| 日本不卡视频在线观看| 在线免费亚洲电影| 五月天网站亚洲| 日韩欧美高清一区| 国产精品12区| 最好看的中文字幕久久| 在线一区二区观看| 免费观看在线综合色| 国产欧美一区二区三区网站| 不卡电影免费在线播放一区| 亚洲一区二区高清| 欧美一级二级三级乱码| 国产精品系列在线观看| 亚洲精品日产精品乱码不卡| 欧美日韩精品免费观看视频| 久久99九九99精品| 国产欧美精品一区| 欧美亚洲综合另类| 精品亚洲欧美一区| 国产精品色在线| 制服丝袜中文字幕一区| 国产sm精品调教视频网站| 亚洲一区二区三区四区不卡|