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

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

?? drivers.c

?? linux 內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	}	return 0;}/** * alloc_tree_node - returns a device entry in the iotree * @parent: the parent node in the tree * @id: the element of the module path for this entry * * Checks all the children of @parent for a matching @id.  If none * found, it allocates a new device and returns it. */static struct parisc_device * alloc_tree_node(struct device *parent, char id){	struct match_id_data d = {		.id = id,	};	if (device_for_each_child(parent, &d, match_by_id))		return d.dev;	else		return create_tree_node(id, parent);}static struct parisc_device *create_parisc_device(struct hardware_path *modpath){	int i;	struct device *parent = &root;	for (i = 0; i < 6; i++) {		if (modpath->bc[i] == -1)			continue;		parent = &alloc_tree_node(parent, modpath->bc[i])->dev;	}	return alloc_tree_node(parent, modpath->mod);}struct parisc_device *alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path){	int status;	unsigned long bytecnt;	u8 iodc_data[32];	struct parisc_device *dev;	const char *name;	/* Check to make sure this device has not already been added - Ryan */	if (find_device_by_addr(hpa) != NULL)		return NULL;	status = pdc_iodc_read(&bytecnt, hpa, 0, &iodc_data, 32);	if (status != PDC_OK)		return NULL;	dev = create_parisc_device(mod_path);	if (dev->id.hw_type != HPHW_FAULTY) {		printk(KERN_ERR "Two devices have hardware path [%s].  "				"IODC data for second device: "				"%02x%02x%02x%02x%02x%02x\n"				"Rearranging GSC cards sometimes helps\n",			parisc_pathname(dev), iodc_data[0], iodc_data[1],			iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]);		return NULL;	}	dev->id.hw_type = iodc_data[3] & 0x1f;	dev->id.hversion = (iodc_data[0] << 4) | ((iodc_data[1] & 0xf0) >> 4);	dev->id.hversion_rev = iodc_data[1] & 0x0f;	dev->id.sversion = ((iodc_data[4] & 0x0f) << 16) |			(iodc_data[5] << 8) | iodc_data[6];	dev->hpa.name = parisc_pathname(dev);	dev->hpa.start = hpa;	/* This is awkward.  The STI spec says that gfx devices may occupy	 * 32MB or 64MB.  Unfortunately, we don't know how to tell whether	 * it's the former or the latter.  Assumptions either way can hurt us.	 */	if (hpa == 0xf4000000 || hpa == 0xf8000000) {		dev->hpa.end = hpa + 0x03ffffff;	} else if (hpa == 0xf6000000 || hpa == 0xfa000000) {		dev->hpa.end = hpa + 0x01ffffff;	} else {		dev->hpa.end = hpa + 0xfff;	}	dev->hpa.flags = IORESOURCE_MEM;	name = parisc_hardware_description(&dev->id);	if (name) {		strlcpy(dev->name, name, sizeof(dev->name));	}	/* Silently fail things like mouse ports which are subsumed within	 * the keyboard controller	 */	if ((hpa & 0xfff) == 0 && insert_resource(&iomem_resource, &dev->hpa))		printk("Unable to claim HPA %lx for device %s\n",				hpa, name);	return dev;}static int parisc_generic_match(struct device *dev, struct device_driver *drv){	return match_device(to_parisc_driver(drv), to_parisc_device(dev));}#define pa_dev_attr(name, field, format_string)				\static ssize_t name##_show(struct device *dev, struct device_attribute *attr, char *buf)		\{									\	struct parisc_device *padev = to_parisc_device(dev);		\	return sprintf(buf, format_string, padev->field);		\}#define pa_dev_attr_id(field, format) pa_dev_attr(field, id.field, format)pa_dev_attr(irq, irq, "%u\n");pa_dev_attr_id(hw_type, "0x%02x\n");pa_dev_attr(rev, id.hversion_rev, "0x%x\n");pa_dev_attr_id(hversion, "0x%03x\n");pa_dev_attr_id(sversion, "0x%05x\n");static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf){	struct parisc_device *padev = to_parisc_device(dev);	struct parisc_device_id *id = &padev->id;	return sprintf(buf, "parisc:t%02Xhv%04Xrev%02Xsv%08X\n",		(u8)id->hw_type, (u16)id->hversion, (u8)id->hversion_rev,		(u32)id->sversion);}static struct device_attribute parisc_device_attrs[] = {	__ATTR_RO(irq),	__ATTR_RO(hw_type),	__ATTR_RO(rev),	__ATTR_RO(hversion),	__ATTR_RO(sversion),	__ATTR_RO(modalias),	__ATTR_NULL,};struct bus_type parisc_bus_type = {	.name = "parisc",	.match = parisc_generic_match,	.dev_attrs = parisc_device_attrs,	.probe = parisc_driver_probe,	.remove = parisc_driver_remove,};/** * register_parisc_device - Locate a driver to manage this device. * @dev: The parisc device. * * Search the driver list for a driver that is willing to manage * this device. */int register_parisc_device(struct parisc_device *dev){	if (!dev)		return 0;	if (dev->driver)		return 1;	return 0;}/** * match_pci_device - Matches a pci device against a given hardware path * entry. * @dev: the generic device (known to be contained by a pci_dev). * @index: the current BC index * @modpath: the hardware path. * @return: true if the device matches the hardware path. */static int match_pci_device(struct device *dev, int index,		struct hardware_path *modpath){	struct pci_dev *pdev = to_pci_dev(dev);	int id;	if (index == 5) {		/* we are at the end of the path, and on the actual device */		unsigned int devfn = pdev->devfn;		return ((modpath->bc[5] == PCI_SLOT(devfn)) &&					(modpath->mod == PCI_FUNC(devfn)));	}	id = PCI_SLOT(pdev->devfn) | (PCI_FUNC(pdev->devfn) << 5);	return (modpath->bc[index] == id);}/** * match_parisc_device - Matches a parisc device against a given hardware * path entry. * @dev: the generic device (known to be contained by a parisc_device). * @index: the current BC index * @modpath: the hardware path. * @return: true if the device matches the hardware path. */static int match_parisc_device(struct device *dev, int index,		struct hardware_path *modpath){	struct parisc_device *curr = to_parisc_device(dev);	char id = (index == 6) ? modpath->mod : modpath->bc[index];	return (curr->hw_path == id);}struct parse_tree_data {	int index;	struct hardware_path * modpath;	struct device * dev;};static int check_parent(struct device * dev, void * data){	struct parse_tree_data * d = data;	if (check_dev(dev)) {		if (dev->bus == &parisc_bus_type) {			if (match_parisc_device(dev, d->index, d->modpath))				d->dev = dev;		} else if (is_pci_dev(dev)) {			if (match_pci_device(dev, d->index, d->modpath))				d->dev = dev;		} else if (dev->bus == NULL) {			/* we are on a bus bridge */			struct device *new = parse_tree_node(dev, d->index, d->modpath);			if (new)				d->dev = new;		}	}	return d->dev != NULL;}/** * parse_tree_node - returns a device entry in the iotree * @parent: the parent node in the tree * @index: the current BC index * @modpath: the hardware_path struct to match a device against * @return: The corresponding device if found, NULL otherwise. * * Checks all the children of @parent for a matching @id.  If none * found, it returns NULL. */static struct device *parse_tree_node(struct device *parent, int index, struct hardware_path *modpath){	struct parse_tree_data d = {		.index          = index,		.modpath        = modpath,	};	struct recurse_struct recurse_data = {		.obj	= &d,		.fn	= check_parent,	};	if (device_for_each_child(parent, &recurse_data, descend_children))		/* nothing */;	return d.dev;}/** * hwpath_to_device - Finds the generic device corresponding to a given hardware path. * @modpath: the hardware path. * @return: The target device, NULL if not found. */struct device *hwpath_to_device(struct hardware_path *modpath){	int i;	struct device *parent = &root;	for (i = 0; i < 6; i++) {		if (modpath->bc[i] == -1)			continue;		parent = parse_tree_node(parent, i, modpath);		if (!parent)			return NULL;	}	if (is_pci_dev(parent)) /* pci devices already parse MOD */		return parent;	else		return parse_tree_node(parent, 6, modpath);}EXPORT_SYMBOL(hwpath_to_device);/** * device_to_hwpath - Populates the hwpath corresponding to the given device. * @param dev the target device * @param path pointer to a previously allocated hwpath struct to be filled in */void device_to_hwpath(struct device *dev, struct hardware_path *path){	struct parisc_device *padev;	if (dev->bus == &parisc_bus_type) {		padev = to_parisc_device(dev);		get_node_path(dev->parent, path);		path->mod = padev->hw_path;	} else if (is_pci_dev(dev)) {		get_node_path(dev, path);	}}EXPORT_SYMBOL(device_to_hwpath);#define BC_PORT_MASK 0x8#define BC_LOWER_PORT 0x8#define BUS_CONVERTER(dev) \        ((dev->id.hw_type == HPHW_IOA) || (dev->id.hw_type == HPHW_BCPORT))#define IS_LOWER_PORT(dev) \        ((gsc_readl(dev->hpa.start + offsetof(struct bc_module, io_status)) \                & BC_PORT_MASK) == BC_LOWER_PORT)#define MAX_NATIVE_DEVICES 64#define NATIVE_DEVICE_OFFSET 0x1000#define FLEX_MASK 	F_EXTEND(0xfffc0000)#define IO_IO_LOW	offsetof(struct bc_module, io_io_low)#define IO_IO_HIGH	offsetof(struct bc_module, io_io_high)#define READ_IO_IO_LOW(dev)  (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_LOW)#define READ_IO_IO_HIGH(dev) (unsigned long)(signed int)gsc_readl(dev->hpa.start + IO_IO_HIGH)static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,                            struct device *parent);void walk_lower_bus(struct parisc_device *dev){	unsigned long io_io_low, io_io_high;	if (!BUS_CONVERTER(dev) || IS_LOWER_PORT(dev))		return;	if (dev->id.hw_type == HPHW_IOA) {		io_io_low = (unsigned long)(signed int)(READ_IO_IO_LOW(dev) << 16);		io_io_high = io_io_low + MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET;	} else {		io_io_low = (READ_IO_IO_LOW(dev) + ~FLEX_MASK) & FLEX_MASK;		io_io_high = (READ_IO_IO_HIGH(dev)+ ~FLEX_MASK) & FLEX_MASK;	}	walk_native_bus(io_io_low, io_io_high, &dev->dev);}/** * walk_native_bus -- Probe a bus for devices * @io_io_low: Base address of this bus. * @io_io_high: Last address of this bus. * @parent: The parent bus device. *  * A native bus (eg Runway or GSC) may have up to 64 devices on it, * spaced at intervals of 0x1000 bytes.  PDC may not inform us of these * devices, so we have to probe for them.  Unfortunately, we may find * devices which are not physically connected (such as extra serial & * keyboard ports).  This problem is not yet solved. */static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,                            struct device *parent){	int i, devices_found = 0;	unsigned long hpa = io_io_low;	struct hardware_path path;	get_node_path(parent, &path);	do {		for(i = 0; i < MAX_NATIVE_DEVICES; i++, hpa += NATIVE_DEVICE_OFFSET) {			struct parisc_device *dev;			/* Was the device already added by Firmware? */			dev = find_device_by_addr(hpa);			if (!dev) {				path.mod = i;				dev = alloc_pa_dev(hpa, &path);				if (!dev)					continue;				register_parisc_device(dev);				devices_found++;			}			walk_lower_bus(dev);		}	} while(!devices_found && hpa < io_io_high);}#define CENTRAL_BUS_ADDR F_EXTEND(0xfff80000)/** * walk_central_bus - Find devices attached to the central bus * * PDC doesn't tell us about all devices in the system.  This routine * finds devices connected to the central bus. */void walk_central_bus(void){	walk_native_bus(CENTRAL_BUS_ADDR,			CENTRAL_BUS_ADDR + (MAX_NATIVE_DEVICES * NATIVE_DEVICE_OFFSET),			&root);}static void print_parisc_device(struct parisc_device *dev){	char hw_path[64];	static int count;	print_pa_hwpath(dev, hw_path);	printk(KERN_INFO "%d. %s at 0x%p [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",		++count, dev->name, (void*) dev->hpa.start, hw_path, dev->id.hw_type,		dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);	if (dev->num_addrs) {		int k;		printk(", additional addresses: ");		for (k = 0; k < dev->num_addrs; k++)			printk("0x%lx ", dev->addr[k]);	}	printk("\n");}/** * init_parisc_bus - Some preparation to be done before inventory */void init_parisc_bus(void){	if (bus_register(&parisc_bus_type))		panic("Could not register PA-RISC bus type\n");	if (device_register(&root))		panic("Could not register PA-RISC root device\n");	get_device(&root);}static int print_one_device(struct device * dev, void * data){	struct parisc_device * pdev = to_parisc_device(dev);	if (check_dev(dev))		print_parisc_device(pdev);	return 0;}/** * print_parisc_devices - Print out a list of devices found in this system */void print_parisc_devices(void){	for_each_padev(print_one_device, NULL);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产成人在线影院| 亚洲日本一区二区三区| 99r精品视频| 97se亚洲国产综合自在线| 国产日韩视频一区二区三区| 日韩欧美国产高清| 国产日产欧美一区| 成人亚洲一区二区一| 欧美在线免费播放| 2022国产精品视频| 亚洲妇熟xx妇色黄| 美女视频黄频大全不卡视频在线播放| 精品制服美女丁香| 成人av在线资源网| 精品久久久久99| 日韩经典一区二区| 成人午夜电影小说| 日韩avvvv在线播放| 不卡av在线网| 久久99久久99| 国产精品成人在线观看| 国精产品一区一区三区mba桃花 | 国产在线不卡一区| aaa亚洲精品一二三区| 国产日韩欧美不卡在线| 欧美久久一二区| 亚洲欧洲精品一区二区精品久久久| 精品一区免费av| 日本在线播放一区二区三区| 精品久久人人做人人爽| 777精品伊人久久久久大香线蕉| 国产亚洲一区二区三区| av不卡一区二区三区| 国产精品系列在线观看| 久久久五月婷婷| 99久久精品免费看国产| 欧美精品v国产精品v日韩精品| 亚洲无人区一区| 亚洲电影在线播放| 91香蕉视频黄| 精品在线一区二区| 经典三级视频一区| 国产一区二区在线视频| 国产91丝袜在线播放九色| 久久先锋影音av| 中文字幕亚洲电影| 尤物av一区二区| 欧美高清视频一二三区| 精品免费国产一区二区三区四区| 欧美一二三四在线| 成人sese在线| 欧美高清视频一二三区 | 欧美另类z0zxhd电影| 欧美一级夜夜爽| 91麻豆福利精品推荐| 欧美日韩美少妇| 欧美在线观看视频一区二区| 日韩亚洲欧美成人一区| 欧美tk丨vk视频| 亚洲精品国产成人久久av盗摄| 美国十次了思思久久精品导航| 国产黄色精品视频| 亚洲成人免费视频| 亚洲午夜精品在线| 精品一区二区三区视频在线观看| 色欧美片视频在线观看 | 狠狠色丁香久久婷婷综合_中| 成人va在线观看| 国产亚洲一区二区三区在线观看| 一区二区三区四区乱视频| 国产亲近乱来精品视频| 性久久久久久久久久久久| 色网站国产精品| 国产精品剧情在线亚洲| 国产一区中文字幕| 欧美高清精品3d| 一二三四社区欧美黄| 91一区在线观看| 亚洲欧洲三级电影| 国产91丝袜在线播放| 久久精品水蜜桃av综合天堂| 婷婷夜色潮精品综合在线| 亚洲国产成人tv| 欧美日韩另类一区| 奇米在线7777在线精品 | 亚洲日本免费电影| 成人黄色777网| 亚洲欧洲成人精品av97| 在线观看亚洲精品视频| 一区二区在线免费| 欧美区一区二区三区| 国产麻豆视频一区二区| 久久久久久久久久久久久夜| 91在线一区二区三区| 亚洲一区二区美女| 国产精品一区二区久久精品爱涩| 中文av一区二区| 五月激情综合网| 欧美国产一区二区在线观看| 亚洲综合在线五月| 欧美大白屁股肥臀xxxxxx| 国产成人av电影在线| 五月天久久比比资源色| 国产精品久久久久久久久图文区| 色呦呦网站一区| 久久se这里有精品| 日韩一区二区三区三四区视频在线观看| 国产综合一区二区| 丝瓜av网站精品一区二区| 欧美高清在线视频| 日韩女优制服丝袜电影| 91福利区一区二区三区| 亚洲国产欧美在线| 最新久久zyz资源站| 亚洲精品在线免费观看视频| 7777精品伊人久久久大香线蕉经典版下载| 精品一区二区在线播放| 亚洲一级二级在线| 亚洲免费观看高清完整版在线观看熊| 色婷婷av一区二区三区gif| 成a人片国产精品| 9i看片成人免费高清| 99r国产精品| 欧洲亚洲国产日韩| 欧美日韩电影在线播放| 在线视频一区二区三区| 欧美人成免费网站| 日韩亚洲国产中文字幕欧美| 91麻豆精品国产无毒不卡在线观看| 欧美日韩国产精品成人| 欧美一区二区三区四区视频 | 欧美日韩国产在线观看| 91色乱码一区二区三区| 欧美视频第二页| 成人综合在线网站| 成人国产精品视频| 欧美日韩一区二区电影| 成人97人人超碰人人99| 欧美综合色免费| 日韩欧美一卡二卡| 国产精品久久久久久久久晋中 | 国产一区在线观看视频| 麻豆精品新av中文字幕| 久久精品国产久精国产爱| 成人免费看黄yyy456| 欧美日韩一区二区电影| 中文字幕国产一区| 日韩高清在线一区| 国产成人免费9x9x人网站视频| 欧美视频在线观看一区二区| 国产午夜精品美女毛片视频| 日韩av一级电影| 欧美三级在线播放| 日本一区二区三区四区| 免费成人av资源网| 欧美午夜精品免费| 国产精品国产三级国产aⅴ原创| 日韩高清在线电影| 欧美吻胸吃奶大尺度电影| 最新热久久免费视频| 成人av资源网站| 欧美精品一区二| 国产一区二区免费视频| 欧美精品一区二区三区蜜桃| 免费精品视频在线| 欧美精品 国产精品| 一区二区三区四区亚洲| 亚洲欧洲一区二区在线播放| 天堂资源在线中文精品| 欧美日韩中文精品| 亚洲午夜久久久久久久久电影院 | 中文字幕一区在线观看视频| 国产毛片精品视频| 亚洲久本草在线中文字幕| 91久久久免费一区二区| 男男视频亚洲欧美| 国产欧美日韩另类一区| 色婷婷av一区二区| 九九精品一区二区| 亚洲色图清纯唯美| 欧美日韩亚洲综合一区二区三区| 亚洲成国产人片在线观看| 日韩一区二区不卡| 国产精品亚洲午夜一区二区三区| 亚洲人成网站影音先锋播放| 欧美一区二区三区在线观看视频| 久久精品99久久久| 夜夜精品视频一区二区 | www.亚洲在线| 日本美女视频一区二区| 亚洲婷婷综合色高清在线| 欧美一级黄色片| 欧美亚一区二区| 不卡视频一二三四| 国产宾馆实践打屁股91| 久久激五月天综合精品| 亚洲成a人片在线不卡一二三区| 久久美女艺术照精彩视频福利播放| 91亚洲精品乱码久久久久久蜜桃| 国产一区二区视频在线|