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

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

?? mesh.c

?? 講述linux的初始化過程
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * SCSI low-level driver for the MESH (Macintosh Enhanced SCSI Hardware) * bus adaptor found on Power Macintosh computers. * We assume the MESH is connected to a DBDMA (descriptor-based DMA) * controller. * * Paul Mackerras, August 1996. * Copyright (C) 1996 Paul Mackerras. */#include <linux/config.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/types.h>#include <linux/string.h>#include <linux/malloc.h>#include <linux/blk.h>#include <linux/proc_fs.h>#include <linux/stat.h>#include <linux/tqueue.h>#include <linux/interrupt.h>#include <linux/reboot.h>#include <linux/spinlock.h>#include <asm/dbdma.h>#include <asm/io.h>#include <asm/pgtable.h>#include <asm/prom.h>#include <asm/system.h>#include <asm/irq.h>#include <asm/hydra.h>#include <asm/processor.h>#include <asm/feature.h>#include "scsi.h"#include "hosts.h"#include "mesh.h"/* * To do: * - handle aborts correctly * - retry arbitration if lost (unless higher levels do this for us) */#define MESH_NEW_STYLE_EH#if 1#undef KERN_DEBUG#define KERN_DEBUG KERN_WARNING#endif#if CONFIG_SCSI_MESH_SYNC_RATE == 0int mesh_sync_period = 100;int mesh_sync_offset = 0;#elseint mesh_sync_period = 1000 / CONFIG_SCSI_MESH_SYNC_RATE;	/* ns */int mesh_sync_offset = 15;#endifint mesh_sync_targets = 0xff;	/* targets to set synchronous (bitmap) */int mesh_resel_targets = 0xff;	/* targets that we let disconnect (bitmap) */int mesh_debug_targets = 0;	/* print debug for these targets */unsigned char use_active_neg = 0;  /* bit mask for SEQ_ACTIVE_NEG if used */#define ALLOW_SYNC(tgt)		((mesh_sync_targets >> (tgt)) & 1)#define ALLOW_RESEL(tgt)	((mesh_resel_targets >> (tgt)) & 1)#define ALLOW_DEBUG(tgt)	((mesh_debug_targets >> (tgt)) & 1)#define DEBUG_TARGET(cmd)	((cmd) && ALLOW_DEBUG((cmd)->target))#undef MESH_DBG#define N_DBG_LOG	50#define N_DBG_SLOG	20#define NUM_DBG_EVENTS	13#undef	DBG_USE_TB		/* bombs on 601 */struct dbglog {	char	*fmt;	u32	tb;	u8	phase;	u8	bs0;	u8	bs1;	u8	tgt;	int	d;};enum mesh_phase {	idle,	arbitrating,	selecting,	commanding,	dataing,	statusing,	busfreeing,	disconnecting,	reselecting};enum msg_phase {	msg_none,	msg_out,	msg_out_xxx,	msg_out_last,	msg_in,	msg_in_bad,};enum sdtr_phase {	do_sdtr,	sdtr_sent,	sdtr_done};struct mesh_target {	enum sdtr_phase sdtr_state;	int	sync_params;	int	data_goes_out;		/* guess as to data direction */	Scsi_Cmnd *current_req;	u32	saved_ptr;	int	want_abort;#ifdef MESH_DBG	int	log_ix;	int	n_log;	struct dbglog log[N_DBG_LOG];#endif};struct mesh_state {	volatile struct	mesh_regs *mesh;	int	meshintr;	volatile struct	dbdma_regs *dma;	int	dmaintr;	struct	Scsi_Host *host;	struct	mesh_state *next;	Scsi_Cmnd *request_q;	Scsi_Cmnd *request_qtail;	enum mesh_phase phase;		/* what we're currently trying to do */	enum msg_phase msgphase;	int	conn_tgt;		/* target we're connected to */	Scsi_Cmnd *current_req;		/* req we're currently working on */	int	data_ptr;	int	dma_started;	int	dma_count;	int	stat;	int	aborting;	int	expect_reply;	int	n_msgin;	u8	msgin[16];	int	n_msgout;	int	last_n_msgout;	u8	msgout[16];	struct dbdma_cmd *dma_cmds;	/* space for dbdma commands, aligned */	int	clk_freq;	struct mesh_target tgts[8];	void	*dma_cmd_space;	struct device_node *ofnode;#ifndef MESH_NEW_STYLE_EH	Scsi_Cmnd *completed_q;	Scsi_Cmnd *completed_qtail;	struct tq_struct tqueue;#endif#ifdef MESH_DBG	int	log_ix;	int	n_log;	struct dbglog log[N_DBG_SLOG];#endif};#ifdef MESH_DBGstatic void dlog(struct mesh_state *ms, char *fmt, int a);static void dumplog(struct mesh_state *ms, int tgt);static void dumpslog(struct mesh_state *ms);#elsestatic inline void dlog(struct mesh_state *ms, char *fmt, int a){}static inline void dumplog(struct mesh_state *ms, int tgt){}static inline void dumpslog(struct mesh_state *ms){}#endif /* MESH_DBG */#define MKWORD(a, b, c, d)	(((a) << 24) + ((b) << 16) + ((c) << 8) + (d))static struct mesh_state *all_meshes;static void mesh_init(struct mesh_state *);static int mesh_notify_reboot(struct notifier_block *, unsigned long, void *);static void mesh_dump_regs(struct mesh_state *);static void mesh_start(struct mesh_state *);static void mesh_start_cmd(struct mesh_state *, Scsi_Cmnd *);#ifndef MESH_NEW_STYLE_EHstatic void finish_cmds(void *);#endifstatic void add_sdtr_msg(struct mesh_state *);static void set_sdtr(struct mesh_state *, int, int);static void start_phase(struct mesh_state *);static void get_msgin(struct mesh_state *);static int msgin_length(struct mesh_state *);static void cmd_complete(struct mesh_state *);static void phase_mismatch(struct mesh_state *);static void reselected(struct mesh_state *);static void handle_reset(struct mesh_state *);static void handle_error(struct mesh_state *);static void handle_exception(struct mesh_state *);static void mesh_interrupt(int, void *, struct pt_regs *);static void do_mesh_interrupt(int, void *, struct pt_regs *);static void handle_msgin(struct mesh_state *);static void mesh_done(struct mesh_state *, int);static void mesh_completed(struct mesh_state *, Scsi_Cmnd *);static void set_dma_cmds(struct mesh_state *, Scsi_Cmnd *);static void halt_dma(struct mesh_state *);static int data_goes_out(Scsi_Cmnd *);static void do_abort(struct mesh_state *ms);static struct notifier_block mesh_notifier = {	mesh_notify_reboot,	NULL,	0};intmesh_detect(Scsi_Host_Template *tp){	struct device_node *mesh;	int nmeshes, tgt, *cfp, minper;	struct mesh_state *ms, **prev_statep;	struct Scsi_Host *mesh_host;	void *dma_cmd_space;	if (_machine == _MACH_Pmac) {	    use_active_neg = (find_devices("mac-io") ? 0 : SEQ_ACTIVE_NEG);	} else {	    /* CHRP mac-io */	    use_active_neg = SEQ_ACTIVE_NEG;	}	nmeshes = 0;	prev_statep = &all_meshes;	/*	 * On powermacs, the MESH node has device_type "mesh".	 * On chrp machines, its device_type is "scsi" with	 * "chrp,mesh0" as its `compatible' property.	 */	mesh = find_devices("mesh");	if (mesh == 0)		mesh = find_compatible_devices("scsi", "chrp,mesh0");	for (; mesh != 0; mesh = mesh->next) {		if (mesh->n_addrs != 2 || mesh->n_intrs != 2) {			printk(KERN_ERR "mesh: expected 2 addrs and 2 intrs"			       " (got %d,%d)", mesh->n_addrs, mesh->n_intrs);			continue;		}		mesh_host = scsi_register(tp, sizeof(struct mesh_state));		if (mesh_host == 0) {			printk(KERN_ERR "mesh: couldn't register host");			continue;		}		mesh_host->unique_id = nmeshes;#if !defined(MODULE)		note_scsi_host(mesh, mesh_host);#endif		ms = (struct mesh_state *) mesh_host->hostdata;		if (ms == 0)			panic("no mesh state");		memset(ms, 0, sizeof(*ms));		ms->host = mesh_host;		ms->ofnode = mesh;		ms->mesh = (volatile struct mesh_regs *)			ioremap(mesh->addrs[0].address, 0x1000);		ms->dma = (volatile struct dbdma_regs *)			ioremap(mesh->addrs[1].address, 0x1000);		ms->meshintr = mesh->intrs[0].line;		ms->dmaintr = mesh->intrs[1].line;		/* Space for dma command list: +1 for stop command,		   +1 to allow for aligning. */		dma_cmd_space = kmalloc((mesh_host->sg_tablesize + 2) *					sizeof(struct dbdma_cmd), GFP_KERNEL);		if (dma_cmd_space == 0)			panic("mesh: couldn't allocate dma command space");		ms->dma_cmds = (struct dbdma_cmd *) DBDMA_ALIGN(dma_cmd_space);		memset(ms->dma_cmds, 0, (mesh_host->sg_tablesize + 1)		       * sizeof(struct dbdma_cmd));		ms->dma_cmd_space = dma_cmd_space;		ms->current_req = 0;		for (tgt = 0; tgt < 8; ++tgt) {			ms->tgts[tgt].sdtr_state = do_sdtr;			ms->tgts[tgt].sync_params = ASYNC_PARAMS;			ms->tgts[tgt].current_req = 0;		}#ifndef MESH_NEW_STYLE_EH		ms->tqueue.routine = finish_cmds;		ms->tqueue.data = ms;#endif		*prev_statep = ms;		prev_statep = &ms->next;		if ((cfp = (int *) get_property(mesh, "clock-frequency",						NULL))) {			ms->clk_freq = *cfp;		} else {			printk(KERN_INFO "mesh: assuming 50MHz clock frequency\n");			ms->clk_freq = 50000000;		}		/* The maximum sync rate is clock / 5; increase		   mesh_sync_period if necessary. */		minper = 1000000000 / (ms->clk_freq / 5);	/* ns */		if (mesh_sync_period < minper)			mesh_sync_period = minper;		feature_set(mesh, FEATURE_MESH_enable);		mdelay(200);		mesh_init(ms);		if (request_irq(ms->meshintr, do_mesh_interrupt, 0, "MESH", ms)) {			printk(KERN_ERR "MESH: can't get irq %d\n", ms->meshintr);		}		++nmeshes;	}	if ((_machine == _MACH_Pmac) && (nmeshes > 0))		register_reboot_notifier(&mesh_notifier);	return nmeshes;}intmesh_release(struct Scsi_Host *host){	struct mesh_state *ms = (struct mesh_state *) host->hostdata;	if (ms == 0)		return 0;	if (ms->mesh)		iounmap((void *) ms->mesh);	if (ms->dma)		iounmap((void *) ms->dma);	kfree(ms->dma_cmd_space);	free_irq(ms->meshintr, ms);	feature_clear(ms->ofnode, FEATURE_MESH_enable);	return 0;}intmesh_queue(Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)){	unsigned long flags;	struct mesh_state *ms;	cmd->scsi_done = done;	cmd->host_scribble = NULL;	ms = (struct mesh_state *) cmd->host->hostdata;	save_flags(flags);	cli();	if (ms->request_q == NULL)		ms->request_q = cmd;	else		ms->request_qtail->host_scribble = (void *) cmd;	ms->request_qtail = cmd;	if (ms->phase == idle)		mesh_start(ms);	restore_flags(flags);	return 0;}intmesh_abort(Scsi_Cmnd *cmd){	struct mesh_state *ms = (struct mesh_state *) cmd->host->hostdata;	printk(KERN_DEBUG "mesh_abort(%p)\n", cmd);	mesh_dump_regs(ms);	dumplog(ms, cmd->target);	dumpslog(ms);	return SCSI_ABORT_SNOOZE;}static voidmesh_dump_regs(struct mesh_state *ms){	volatile struct mesh_regs *mr = ms->mesh;	volatile struct dbdma_regs *md = ms->dma;	int t;	struct mesh_target *tp;	printk(KERN_DEBUG "mesh: state at %p, regs at %p, dma at %p\n",	       ms, mr, md);	printk(KERN_DEBUG "    ct=%4x seq=%2x bs=%4x fc=%2x "	       "exc=%2x err=%2x im=%2x int=%2x sp=%2x\n",	       (mr->count_hi << 8) + mr->count_lo, mr->sequence,	       (mr->bus_status1 << 8) + mr->bus_status0, mr->fifo_count,	       mr->exception, mr->error, mr->intr_mask, mr->interrupt,	       mr->sync_params);	while(in_8(&mr->fifo_count))		printk(KERN_DEBUG " fifo data=%.2x\n",in_8(&mr->fifo));	printk(KERN_DEBUG "    dma stat=%x cmdptr=%x\n",	       in_le32(&md->status), in_le32(&md->cmdptr));	printk(KERN_DEBUG "    phase=%d msgphase=%d conn_tgt=%d data_ptr=%d\n",	       ms->phase, ms->msgphase, ms->conn_tgt, ms->data_ptr);	printk(KERN_DEBUG "    dma_st=%d dma_ct=%d n_msgout=%d\n",	       ms->dma_started, ms->dma_count, ms->n_msgout);	for (t = 0; t < 8; ++t) {		tp = &ms->tgts[t];		if (tp->current_req == NULL)			continue;		printk(KERN_DEBUG "    target %d: req=%p goes_out=%d saved_ptr=%d\n",		       t, tp->current_req, tp->data_goes_out, tp->saved_ptr);	}}intmesh_reset(Scsi_Cmnd *cmd, unsigned how){	struct mesh_state *ms = (struct mesh_state *) cmd->host->hostdata;	volatile struct mesh_regs *mr = ms->mesh;	volatile struct dbdma_regs *md = ms->dma;	unsigned long flags;	int ret;	printk(KERN_DEBUG "mesh_reset %x\n", how);	ret = SCSI_RESET_BUS_RESET;	save_flags(flags);	cli();	out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);	/* stop dma */	out_8(&mr->exception, 0xff);	/* clear all exception bits */	out_8(&mr->error, 0xff);	/* clear all error bits */	if (how & SCSI_RESET_SUGGEST_HOST_RESET) {		out_8(&mr->sequence, SEQ_RESETMESH);		ret |= SCSI_RESET_HOST_RESET;		udelay(1);		out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);		out_8(&mr->source_id, ms->host->this_id);		out_8(&mr->sel_timeout, 25);	/* 250ms */		out_8(&mr->sync_params, ASYNC_PARAMS);	}	out_8(&mr->bus_status1, BS1_RST);	/* assert RST */	udelay(30);			/* leave it on for >= 25us */	out_8(&mr->bus_status1, 0);	/* negate RST */#ifdef DO_ASYNC_RESET	if (how & SCSI_RESET_ASYNCHRONOUS) {		restore_flags(flags);		ret |= SCSI_RESET_PENDING;	} else#endif	{		handle_reset(ms);		restore_flags(flags);#ifndef MESH_NEW_STYLE_EH		finish_cmds(ms);#endif		ret |= SCSI_RESET_SUCCESS;	}	return ret;}/* * If we leave drives set for synchronous transfers (especially * CDROMs), and reboot to MacOS, it gets confused, poor thing. * So, on reboot we reset the SCSI bus. */static intmesh_notify_reboot(struct notifier_block *this, unsigned long code, void *x){	struct mesh_state *ms;	volatile struct mesh_regs *mr;	if (code == SYS_DOWN) {		printk(KERN_INFO "resetting MESH scsi bus(es)\n");		for (ms = all_meshes; ms != 0; ms = ms->next) {			mr = ms->mesh;			out_8(&mr->intr_mask, 0);			out_8(&mr->interrupt,			      INT_ERROR | INT_EXCEPTION | INT_CMDDONE);			out_8(&mr->bus_status1, BS1_RST);			udelay(30);			out_8(&mr->bus_status1, 0);		}	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美一卡二卡| 成人午夜看片网址| 另类小说综合欧美亚洲| 精品一二三四区| 成人午夜短视频| 欧洲av一区二区嗯嗯嗯啊| 欧美高清一级片在线| 久久婷婷国产综合国色天香| 日韩欧美在线1卡| 亚洲四区在线观看| 亚洲成人av资源| 精品一区二区三区影院在线午夜| 丁香啪啪综合成人亚洲小说| 色综合久久久网| 日韩一区二区在线看| 欧美国产禁国产网站cc| 日韩和欧美的一区| 亚洲国产精品精华液2区45| 亚洲日本va午夜在线影院| 亚洲bt欧美bt精品777| 国产成人免费网站| 在线欧美日韩精品| 久久综合精品国产一区二区三区| 亚洲视频在线观看三级| 日本不卡视频一二三区| 成人av资源站| 日韩欧美一二区| 亚洲欧美乱综合| 国产毛片精品国产一区二区三区| 欧美日韩中文国产| 中文字幕乱码亚洲精品一区| 日日夜夜精品视频天天综合网| 国产91精品精华液一区二区三区| 欧美日韩精品系列| 国产精品传媒在线| 蜜桃精品视频在线观看| 色综合久久88色综合天天| 精品不卡在线视频| 亚洲图片欧美一区| 成人免费观看av| 精品国产乱码久久久久久1区2区| 亚洲一区自拍偷拍| 成人免费观看av| 精品第一国产综合精品aⅴ| 亚洲福利视频三区| 成人综合激情网| 精品对白一区国产伦| 日本最新不卡在线| 在线视频你懂得一区二区三区| 欧美极品少妇xxxxⅹ高跟鞋| 麻豆精品久久精品色综合| 欧美日韩一区 二区 三区 久久精品| 亚洲国产精品ⅴa在线观看| 久久精品免费看| 欧美二区在线观看| 亚洲精品视频在线观看网站| 成人在线视频首页| 久久综合精品国产一区二区三区 | 国产一区日韩二区欧美三区| 欧美三级电影在线观看| 亚洲欧美日本韩国| 白白色 亚洲乱淫| 久久久久国产精品人| 久久丁香综合五月国产三级网站 | 激情五月播播久久久精品| 欧美四级电影在线观看| 亚洲精品一二三区| 色综合久久久久综合| 亚洲欧洲日产国码二区| 不卡视频在线看| 国产精品视频第一区| 91精品国产aⅴ一区二区| 亚洲六月丁香色婷婷综合久久| 91一区一区三区| 亚洲免费观看视频| 一本一道久久a久久精品综合蜜臀| 中文字幕在线观看一区| av在线一区二区三区| 成人免费视频在线观看| 99这里只有精品| 亚洲精品视频在线| 欧美色图天堂网| 午夜av一区二区三区| 欧美一级片在线看| 美女任你摸久久| 26uuu国产电影一区二区| 黄色日韩网站视频| 久久久www免费人成精品| 国产一区二区在线观看免费| 久久色中文字幕| 成年人网站91| 亚洲男人天堂一区| 在线精品视频免费播放| 亚洲成a人片综合在线| 3d动漫精品啪啪1区2区免费| 美国一区二区三区在线播放| 久久麻豆一区二区| 99久久99精品久久久久久| 一区二区理论电影在线观看| 在线成人免费观看| 精品无码三级在线观看视频| 亚洲国产成人在线| 91在线无精精品入口| 亚洲一区二区在线播放相泽| 欧美一个色资源| 国产一区二区在线观看免费| 成人免费在线视频| 欧美综合欧美视频| 奇米色777欧美一区二区| 国产视频亚洲色图| 91亚洲永久精品| 日韩激情一区二区| 国产女同互慰高潮91漫画| 99re6这里只有精品视频在线观看| 亚洲一二三级电影| 精品区一区二区| 99精品偷自拍| 免费在线视频一区| 国产欧美一区二区三区沐欲 | 这里只有精品视频在线观看| 麻豆传媒一区二区三区| 欧美激情资源网| 欧美性受极品xxxx喷水| 激情av综合网| 亚洲欧美自拍偷拍| 欧美疯狂做受xxxx富婆| 国产精品亚洲一区二区三区在线| 亚洲男同性恋视频| 精品对白一区国产伦| 欧洲人成人精品| 国产成人精品影视| 丝袜国产日韩另类美女| 国产精品国产三级国产aⅴ原创| 6080国产精品一区二区| 成人性生交大片免费看视频在线 | 欧美tickling网站挠脚心| 成人免费视频网站在线观看| 日产国产欧美视频一区精品| 亚洲特级片在线| 久久免费精品国产久精品久久久久| 欧美中文字幕不卡| 国产91精品在线观看| 日本一区中文字幕| 自拍偷自拍亚洲精品播放| 欧美v国产在线一区二区三区| 在线免费精品视频| 国产99久久久国产精品潘金 | 久久久久久久久久久久电影| 欧美日韩色综合| 99久久婷婷国产综合精品电影 | 欧美国产精品中文字幕| 正在播放亚洲一区| 在线国产亚洲欧美| 成人永久aaa| 国产一区二区女| 男女男精品视频| 亚洲综合久久av| **性色生活片久久毛片| 久久无码av三级| 精品国产精品一区二区夜夜嗨| 欧美日韩一区二区三区在线看| 99视频精品免费视频| 国产精品羞羞答答xxdd| 久久精品国产精品亚洲精品| 91一区二区在线观看| 岛国一区二区在线观看| 国产麻豆精品久久一二三| 精品在线一区二区三区| 日本午夜一本久久久综合| 亚洲高清一区二区三区| 一区二区三区精品| ㊣最新国产の精品bt伙计久久| 国产日韩精品一区二区三区在线| 精品国产乱码久久久久久闺蜜| 日韩午夜激情av| 日韩一区二区在线观看视频| 91精品国产综合久久香蕉的特点| 欧美色图天堂网| 欧美日韩一区成人| 欧美午夜精品一区二区三区| 欧美色综合网站| 欧美日韩黄色影视| 欧美精品99久久久**| 欧美一区二区三区视频| 91精品婷婷国产综合久久竹菊| 欧美日韩免费不卡视频一区二区三区| 精品视频在线看| 欧美日本国产一区| 欧美一区二区三区免费在线看 | 国产麻豆精品视频| 国内精品视频一区二区三区八戒| 蜜臂av日日欢夜夜爽一区| 久久福利视频一区二区| 国产乱人伦精品一区二区在线观看| 国产一区二区三区国产| 国产精品99久久久| 国产99久久精品| 91麻豆文化传媒在线观看| 色欧美88888久久久久久影院| 在线国产电影不卡|