📄 sym53c8xx_comm.h
字号:
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 + -