⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sym53c8xx_comm.h

📁 Linux Kernel 2.6.9 for OMAP1710
💻 H
📖 第 1 页 / 共 2 页
字号:
	vbpp = &mp->vtob[hc];	while (*vbpp && (*vbpp)->vaddr != m)		vbpp = &(*vbpp)->next;	if (*vbpp) {		vbp = *vbpp;		*vbpp = (*vbpp)->next;		dma_free_coherent(mp->bush, PAGE_SIZE<<MEMO_PAGE_ORDER,				  (void *)vbp->vaddr, (dma_addr_t)vbp->baddr);		__m_free(&mp0, vbp, sizeof(*vbp), "VTOB");		--mp->nump;	}}static inline m_pool_s *___get_dma_pool(m_bush_t bush){	m_pool_s *mp;	for (mp = mp0.next; mp && mp->bush != bush; mp = mp->next);	return mp;}static m_pool_s *___cre_dma_pool(m_bush_t bush){	m_pool_s *mp;	mp = __m_calloc(&mp0, sizeof(*mp), "MPOOL");	if (mp) {		bzero(mp, sizeof(*mp));		mp->bush = bush;		mp->getp = ___dma_getp;		mp->freep = ___dma_freep;		mp->next = mp0.next;		mp0.next = mp;	}	return mp;}static void ___del_dma_pool(m_pool_s *p){	struct m_pool **pp = &mp0.next;	while (*pp && *pp != p)		pp = &(*pp)->next;	if (*pp) {		*pp = (*pp)->next;		__m_free(&mp0, p, sizeof(*p), "MPOOL");	}}static void *__m_calloc_dma(m_bush_t bush, int size, char *name){	u_long flags;	struct m_pool *mp;	void *m = NULL;	NCR_LOCK_DRIVER(flags);	mp = ___get_dma_pool(bush);	if (!mp)		mp = ___cre_dma_pool(bush);	if (mp)		m = __m_calloc(mp, size, name);	if (mp && !mp->nump)		___del_dma_pool(mp);	NCR_UNLOCK_DRIVER(flags);	return m;}static void __m_free_dma(m_bush_t bush, void *m, int size, char *name){	u_long flags;	struct m_pool *mp;	NCR_LOCK_DRIVER(flags);	mp = ___get_dma_pool(bush);	if (mp)		__m_free(mp, m, size, name);	if (mp && !mp->nump)		___del_dma_pool(mp);	NCR_UNLOCK_DRIVER(flags);}static m_addr_t __vtobus(m_bush_t bush, void *m){	u_long flags;	m_pool_s *mp;	int hc = VTOB_HASH_CODE(m);	m_vtob_s *vp = NULL;	m_addr_t a = ((m_addr_t) m) & ~MEMO_CLUSTER_MASK;	NCR_LOCK_DRIVER(flags);	mp = ___get_dma_pool(bush);	if (mp) {		vp = mp->vtob[hc];		while (vp && (m_addr_t) vp->vaddr != a)			vp = vp->next;	}	NCR_UNLOCK_DRIVER(flags);	return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;}#define _m_calloc_dma(np, s, n)		__m_calloc_dma(np->dev, s, n)#define _m_free_dma(np, p, s, n)	__m_free_dma(np->dev, p, s, n)#define m_calloc_dma(s, n)		_m_calloc_dma(np, s, n)#define m_free_dma(p, s, n)		_m_free_dma(np, p, s, n)#define _vtobus(np, p)			__vtobus(np->dev, p)#define vtobus(p)			_vtobus(np, p)/* *  Deal with DMA mapping/unmapping. *//* To keep track of the dma mapping (sg/single) that has been set */#define __data_mapped	SCp.phase#define __data_mapping	SCp.have_data_instatic void __unmap_scsi_data(struct device *dev, Scsi_Cmnd *cmd){	enum dma_data_direction dma_dir = 		(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);	switch(cmd->__data_mapped) {	case 2:		dma_unmap_sg(dev, cmd->buffer, cmd->use_sg, dma_dir);		break;	case 1:		dma_unmap_single(dev, cmd->__data_mapping,				 cmd->request_bufflen, dma_dir);		break;	}	cmd->__data_mapped = 0;}static u_long __map_scsi_single_data(struct device *dev, Scsi_Cmnd *cmd){	dma_addr_t mapping;	enum dma_data_direction dma_dir = 		(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);	if (cmd->request_bufflen == 0)		return 0;	mapping = dma_map_single(dev, cmd->request_buffer,				 cmd->request_bufflen, dma_dir);	cmd->__data_mapped = 1;	cmd->__data_mapping = mapping;	return mapping;}static int __map_scsi_sg_data(struct device *dev, Scsi_Cmnd *cmd){	int use_sg;	enum dma_data_direction dma_dir = 		(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);	if (cmd->use_sg == 0)		return 0;	use_sg = dma_map_sg(dev, cmd->buffer, cmd->use_sg, dma_dir);	cmd->__data_mapped = 2;	cmd->__data_mapping = use_sg;	return use_sg;}static void __sync_scsi_data_for_cpu(struct device *dev, Scsi_Cmnd *cmd){	enum dma_data_direction dma_dir = 		(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);	switch(cmd->__data_mapped) {	case 2:		dma_sync_sg_for_cpu(dev, cmd->buffer, cmd->use_sg, dma_dir);		break;	case 1:		dma_sync_single_for_cpu(dev, cmd->__data_mapping,					cmd->request_bufflen, dma_dir);		break;	}}static void __sync_scsi_data_for_device(struct device *dev, Scsi_Cmnd *cmd){	enum dma_data_direction dma_dir =		(enum dma_data_direction)scsi_to_pci_dma_dir(cmd->sc_data_direction);	switch(cmd->__data_mapped) {	case 2:		dma_sync_sg_for_device(dev, cmd->buffer, cmd->use_sg, dma_dir);		break;	case 1:		dma_sync_single_for_device(dev, cmd->__data_mapping,					   cmd->request_bufflen, dma_dir);		break;	}}#define scsi_sg_dma_address(sc)		sg_dma_address(sc)#define scsi_sg_dma_len(sc)		sg_dma_len(sc)#define unmap_scsi_data(np, cmd)	__unmap_scsi_data(np->dev, cmd)#define map_scsi_single_data(np, cmd)	__map_scsi_single_data(np->dev, cmd)#define map_scsi_sg_data(np, cmd)	__map_scsi_sg_data(np->dev, cmd)#define sync_scsi_data_for_cpu(np, cmd)	__sync_scsi_data_for_cpu(np->dev, cmd)#define sync_scsi_data_for_device(np, cmd) __sync_scsi_data_for_device(np->dev, cmd)#define scsi_data_direction(cmd)	(cmd->sc_data_direction)/*==========================================================****	Driver setup.****	This structure is initialized from linux config **	options. It can be overridden at boot-up by the boot **	command line.****==========================================================*/static struct ncr_driver_setup	driver_setup			= SCSI_NCR_DRIVER_SETUP;#ifdef	SCSI_NCR_BOOT_COMMAND_LINE_SUPPORTstatic struct ncr_driver_setup	driver_safe_setup __initdata	= SCSI_NCR_DRIVER_SAFE_SETUP;#endif#define initverbose (driver_setup.verbose)#define bootverbose (np->verbose)/*===================================================================****	Utility routines that protperly return data through /proc FS.****===================================================================*/#ifdef SCSI_NCR_USER_INFO_SUPPORTstruct info_str{	char *buffer;	int length;	int offset;	int pos;};static void copy_mem_info(struct info_str *info, char *data, int len){	if (info->pos + len > info->length)		len = info->length - info->pos;	if (info->pos + len < info->offset) {		info->pos += len;		return;	}	if (info->pos < info->offset) {		data += (info->offset - info->pos);		len  -= (info->offset - info->pos);	}	if (len > 0) {		memcpy(info->buffer + info->pos, data, len);		info->pos += len;	}}static int copy_info(struct info_str *info, char *fmt, ...){	va_list args;	char buf[81];	int len;	va_start(args, fmt);	len = vsprintf(buf, fmt, args);	va_end(args);	copy_mem_info(info, buf, len);	return len;}#endif/*===================================================================****	Driver setup from the boot command line****===================================================================*/#ifdef MODULE#define	ARG_SEP	' '#else#define	ARG_SEP	','#endif#define OPT_TAGS		1#define OPT_MASTER_PARITY	2#define OPT_SCSI_PARITY		3#define OPT_DISCONNECTION	4#define OPT_SPECIAL_FEATURES	5#define OPT_UNUSED_1		6#define OPT_FORCE_SYNC_NEGO	7#define OPT_REVERSE_PROBE	8#define OPT_DEFAULT_SYNC	9#define OPT_VERBOSE		10#define OPT_DEBUG		11#define OPT_BURST_MAX		12#define OPT_LED_PIN		13#define OPT_MAX_WIDE		14#define OPT_SETTLE_DELAY	15#define OPT_DIFF_SUPPORT	16#define OPT_IRQM		17#define OPT_PCI_FIX_UP		18#define OPT_BUS_CHECK		19#define OPT_OPTIMIZE		20#define OPT_RECOVERY		21#define OPT_SAFE_SETUP		22#define OPT_USE_NVRAM		23#define OPT_EXCLUDE		24#define OPT_HOST_ID		25#ifdef SCSI_NCR_IARB_SUPPORT#define OPT_IARB		26#endifstatic char setup_token[] __initdata = 	"tags:"   "mpar:"	"spar:"   "disc:"	"specf:"  "ultra:"	"fsn:"    "revprob:"	"sync:"   "verb:"	"debug:"  "burst:"	"led:"    "wide:"	"settle:" "diff:"	"irqm:"   "pcifix:"	"buschk:" "optim:"	"recovery:"	"safe:"   "nvram:"	"excl:"   "hostid:"#ifdef SCSI_NCR_IARB_SUPPORT	"iarb:"#endif	;	/* DONNOT REMOVE THIS ';' */#ifdef MODULE#define	ARG_SEP	' '#else#define	ARG_SEP	','#endifstatic int __init get_setup_token(char *p){	char *cur = setup_token;	char *pc;	int i = 0;	while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {		++pc;		++i;		if (!strncmp(p, cur, pc - cur))			return i;		cur = pc;	}	return 0;}static int __init sym53c8xx__setup(char *str){#ifdef SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT	char *cur = str;	char *pc, *pv;	int i, val, c;	int xi = 0;	while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {		char *pe;		val = 0;		pv = pc;		c = *++pv;		if	(c == 'n')			val = 0;		else if	(c == 'y')			val = 1;		else			val = (int) simple_strtoul(pv, &pe, 0);		switch (get_setup_token(cur)) {		case OPT_TAGS:			driver_setup.default_tags = val;			if (pe && *pe == '/') {				i = 0;				while (*pe && *pe != ARG_SEP && 					i < sizeof(driver_setup.tag_ctrl)-1) {					driver_setup.tag_ctrl[i++] = *pe++;				}				driver_setup.tag_ctrl[i] = '\0';			}			break;		case OPT_MASTER_PARITY:			driver_setup.master_parity = val;			break;		case OPT_SCSI_PARITY:			driver_setup.scsi_parity = val;			break;		case OPT_DISCONNECTION:			driver_setup.disconnection = val;			break;		case OPT_SPECIAL_FEATURES:			driver_setup.special_features = val;			break;		case OPT_FORCE_SYNC_NEGO:			driver_setup.force_sync_nego = val;			break;		case OPT_REVERSE_PROBE:			driver_setup.reverse_probe = val;			break;		case OPT_DEFAULT_SYNC:			driver_setup.default_sync = val;			break;		case OPT_VERBOSE:			driver_setup.verbose = val;			break;		case OPT_DEBUG:			driver_setup.debug = val;			break;		case OPT_BURST_MAX:			driver_setup.burst_max = val;			break;		case OPT_LED_PIN:			driver_setup.led_pin = val;			break;		case OPT_MAX_WIDE:			driver_setup.max_wide = val? 1:0;			break;		case OPT_SETTLE_DELAY:			driver_setup.settle_delay = val;			break;		case OPT_DIFF_SUPPORT:			driver_setup.diff_support = val;			break;		case OPT_IRQM:			driver_setup.irqm = val;			break;		case OPT_PCI_FIX_UP:			driver_setup.pci_fix_up	= val;			break;		case OPT_BUS_CHECK:			driver_setup.bus_check = val;			break;		case OPT_OPTIMIZE:			driver_setup.optimize = val;			break;		case OPT_RECOVERY:			driver_setup.recovery = val;			break;		case OPT_USE_NVRAM:			driver_setup.use_nvram = val;			break;		case OPT_SAFE_SETUP:			memcpy(&driver_setup, &driver_safe_setup,				sizeof(driver_setup));			break;		case OPT_EXCLUDE:			if (xi < SCSI_NCR_MAX_EXCLUDES)				driver_setup.excludes[xi++] = val;			break;		case OPT_HOST_ID:			driver_setup.host_id = val;			break;#ifdef SCSI_NCR_IARB_SUPPORT		case OPT_IARB:			driver_setup.iarb = val;			break;#endif		default:			printk("sym53c8xx_setup: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);			break;		}		if ((cur = strchr(cur, ARG_SEP)) != NULL)			++cur;	}#endif /* SCSI_NCR_BOOT_COMMAND_LINE_SUPPORT */	return 1;}/*===================================================================****	Get device queue depth from boot command line.****===================================================================*/#define DEF_DEPTH	(driver_setup.default_tags)#define ALL_TARGETS	-2#define NO_TARGET	-1#define ALL_LUNS	-2#define NO_LUN		-1static int device_queue_depth(int unit, int target, int lun){	int c, h, t, u, v;	char *p = driver_setup.tag_ctrl;	char *ep;	h = -1;	t = NO_TARGET;	u = NO_LUN;	while ((c = *p++) != 0) {		v = simple_strtoul(p, &ep, 0);		switch(c) {		case '/':			++h;			t = ALL_TARGETS;			u = ALL_LUNS;			break;		case 't':			if (t != target)				t = (target == v) ? v : NO_TARGET;			u = ALL_LUNS;			break;		case 'u':			if (u != lun)				u = (lun == v) ? v : NO_LUN;			break;		case 'q':			if (h == unit &&				(t == ALL_TARGETS || t == target) &&				(u == ALL_LUNS    || u == lun))				return v;			break;		case '-':			t = ALL_TARGETS;			u = ALL_LUNS;			break;		default:			break;		}		p = ep;	}	return DEF_DEPTH;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -