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

📄 g_ncr5380.c

📁 GNU Mach 微内核源代码, 基于美国卡内基美隆大学的 Mach 研究项目
💻 C
📖 第 1 页 / 共 2 页
字号:
		printk("53C400r: blocks still == %d\n", blocks);	    else		printk("53C400r: Exiting loop\n");#endif	    break;	}#if 1	if (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_GATED_53C80_IRQ) {	    printk("53C400r: Got 53C80_IRQ start=%d, blocks=%d\n", start, blocks);	    return -1;	}#endif#if (NDEBUG & NDEBUG_C400_PREAD)	printk("53C400r: Waiting for buffer, bl=%d\n", bl);#endif	while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)	    ;#if (NDEBUG & NDEBUG_C400_PREAD)	printk("53C400r: Transferring 128 bytes\n");#endif#ifdef CONFIG_SCSI_G_NCR5380_PORT	for (i=0; i<128; i++)	    dst[start+i] = NCR5380_read(C400_HOST_BUFFER);#else	/* implies CONFIG_SCSI_G_NCR5380_MEM */	memmove(dst+start,NCR53C400_host_buffer+NCR5380_map_name,128);#endif	start+=128;	blocks--;    }    if (blocks) {#if (NDEBUG & NDEBUG_C400_PREAD)	printk("53C400r: EXTRA: Waiting for buffer\n");#endif	while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)	    ;#if (NDEBUG & NDEBUG_C400_PREAD)	printk("53C400r: Transferring EXTRA 128 bytes\n");#endif#ifdef CONFIG_SCSI_G_NCR5380_PORT	for (i=0; i<128; i++)	    dst[start+i] = NCR5380_read(C400_HOST_BUFFER);#else	/* implies CONFIG_SCSI_G_NCR5380_MEM */	memmove(dst+start,NCR53C400_host_buffer+NCR5380_map_name,128);#endif	start+=128;	blocks--;    }#if (NDEBUG & NDEBUG_C400_PREAD)    else	printk("53C400r: No EXTRA required\n");#endif#if (NDEBUG & NDEBUG_C400_PREAD)    printk("53C400r: Final values: blocks=%d   start=%d\n", blocks, start);#endif    if (!(NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_GATED_53C80_IRQ))	printk("53C400r: no 53C80 gated irq after transfer");#if (NDEBUG & NDEBUG_C400_PREAD)    else	printk("53C400r: Got 53C80 interrupt and tried to clear it\n");#endif/* DON'T DO THIS - THEY NEVER ARRIVE!    printk("53C400r: Waiting for 53C80 registers\n");    while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_53C80_REG)	;*/    if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_END_DMA_TRANSFER))	printk("53C400r: no end dma signal\n");#if (NDEBUG & NDEBUG_C400_PREAD)    else	printk("53C400r: end dma as expected\n");#endif    NCR5380_write(MODE_REG, MR_BASE);    NCR5380_read(RESET_PARITY_INTERRUPT_REG);    return 0;}		static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src,    int len){    int blocks = len / 128;    int start = 0;    int i;    int bl;    NCR5380_local_declare();    NCR5380_setup(instance);#if (NDEBUG & NDEBUG_C400_PWRITE)    printk("53C400w: About to write %d blocks for %d bytes\n", blocks, len);#endif    NCR5380_write(C400_CONTROL_STATUS_REG, CSR_BASE);    NCR5380_write(C400_BLOCK_COUNTER_REG, blocks);    while (1) {	if (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_GATED_53C80_IRQ) {	    printk("53C400w: Got 53C80_IRQ start=%d, blocks=%d\n", start, blocks);	    return -1;	}	if ((bl=NCR5380_read(C400_BLOCK_COUNTER_REG)) == 0) {#if (NDEBUG & NDEBUG_C400_PWRITE)	    if (blocks)		printk("53C400w: exiting loop, blocks still == %d\n", blocks);	    else		printk("53C400w: exiting loop\n");#endif	    break;	}#if (NDEBUG & NDEBUG_C400_PWRITE)	printk("53C400w: %d blocks left\n", blocks);	printk("53C400w: waiting for buffer, bl=%d\n", bl);#endif	while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)	    ;#if (NDEBUG & NDEBUG_C400_PWRITE)	printk("53C400w: transferring 128 bytes\n");#endif#ifdef CONFIG_SCSI_G_NCR5380_PORT	for (i=0; i<128; i++)	    NCR5380_write(C400_HOST_BUFFER, src[start+i]);#else	/* implies CONFIG_SCSI_G_NCR5380_MEM */	memmove(NCR53C400_host_buffer+NCR5380_map_name,src+start,128);#endif	start+=128;	blocks--;    }    if (blocks) {#if (NDEBUG & NDEBUG_C400_PWRITE)	printk("53C400w: EXTRA waiting for buffer\n");#endif	while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_HOST_BUF_NOT_RDY)	    ;#if (NDEBUG & NDEBUG_C400_PWRITE)	printk("53C400w: transferring EXTRA 128 bytes\n");#endif#ifdef CONFIG_SCSI_G_NCR5380_PORT	for (i=0; i<128; i++)	    NCR5380_write(C400_HOST_BUFFER, src[start+i]);#else	/* implies CONFIG_SCSI_G_NCR5380_MEM */	memmove(NCR53C400_host_buffer+NCR5380_map_name,src+start,128);#endif	start+=128;	blocks--;    }#if (NDEBUG & NDEBUG_C400_PWRITE)    else	printk("53C400w: No EXTRA required\n");#endif    #if (NDEBUG & NDEBUG_C400_PWRITE)    printk("53C400w: Final values: blocks=%d   start=%d\n", blocks, start);#endif#if 0    printk("53C400w: waiting for registers to be available\n");    THEY NEVER DO!    while (NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_53C80_REG)	;    printk("53C400w: Got em\n");#endif    /* Let's wait for this instead - could be ugly */    /* All documentation says to check for this. Maybe my hardware is too     * fast. Waiting for it seems to work fine! KLL     */    while (!(i = NCR5380_read(C400_CONTROL_STATUS_REG) & CSR_GATED_53C80_IRQ))	;    /*     * I know. i is certainly != 0 here but the loop is new. See previous     * comment.     */    if (i) {#if (NDEBUG & NDEBUG_C400_PWRITE)	printk("53C400w: got 53C80 gated irq (last block)\n");#endif	if (!((i=NCR5380_read(BUS_AND_STATUS_REG)) & BASR_END_DMA_TRANSFER))	    printk("53C400w: No END OF DMA bit - WHOOPS! BASR=%0x\n",i);#if (NDEBUG & NDEBUG_C400_PWRITE)	else	    printk("53C400w: Got END OF DMA\n");#endif    }    else	printk("53C400w: no 53C80 gated irq after transfer (last block)\n");#if 0    if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_END_DMA_TRANSFER)) {	printk("53C400w: no end dma signal\n");    }#endif#if (NDEBUG & NDEBUG_C400_PWRITE)    printk("53C400w: waiting for last byte...\n");#endif    while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT))    	;#if (NDEBUG & NDEBUG_C400_PWRITE)    printk("53C400w:     got last byte.\n");    printk("53C400w: pwrite exiting with status 0, whoopee!\n");#endif    return 0;}#endif /* PSEUDO_DMA */#include "NCR5380.c"#define PRINTP(x) len += sprintf(buffer+len, x)#define ANDP ,static int sprint_opcode(char* buffer, int len, int opcode) {    int start = len;    PRINTP("0x%02x " ANDP opcode);    return len-start;}static int sprint_command (char* buffer, int len, unsigned char *command) {    int i,s,start=len;    len += sprint_opcode(buffer, len, command[0]);    for ( i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)	PRINTP("%02x " ANDP command[i]);    PRINTP("\n");    return len-start;}static int sprint_Scsi_Cmnd (char* buffer, int len, Scsi_Cmnd *cmd) {    int start = len;    PRINTP("host number %d destination target %d, lun %d\n" ANDP       cmd->host->host_no ANDP       cmd->target ANDP       cmd->lun);    PRINTP("        command = ");    len += sprint_command (buffer, len, cmd->cmnd);    return len-start;}int generic_NCR5380_proc_info(char* buffer, char** start, off_t offset, int length, int hostno, int inout){    int len = 0;    NCR5380_local_declare();    unsigned char status;    int i;    struct Scsi_Host *scsi_ptr;    Scsi_Cmnd *ptr;    Scsi_Device *dev;    struct NCR5380_hostdata *hostdata;    cli();    for (scsi_ptr = first_instance; scsi_ptr; scsi_ptr=scsi_ptr->next)	if (scsi_ptr->host_no == hostno)	    break;    NCR5380_setup(scsi_ptr);    hostdata = (struct NCR5380_hostdata *)scsi_ptr->hostdata;    PRINTP("SCSI host number %d : %s\n" ANDP scsi_ptr->host_no ANDP scsi_ptr->hostt->name);    PRINTP("Generic NCR5380 driver version %d\n" ANDP GENERIC_NCR5380_PUBLIC_RELEASE);    PRINTP("NCR5380 core version %d\n" ANDP NCR5380_PUBLIC_RELEASE);#ifdef NCR53C400    PRINTP("NCR53C400 extension version %d\n" ANDP NCR53C400_PUBLIC_RELEASE);    PRINTP("NCR53C400 card%s detected\n" ANDP  (((struct NCR5380_hostdata *)scsi_ptr->hostdata)->flags & FLAG_NCR53C400)?"":" not");# if NCR53C400_PSEUDO_DMA    PRINTP("NCR53C400 pseudo DMA used\n");# endif#else    PRINTP("NO NCR53C400 driver extensions\n");#endif    PRINTP("Using %s mapping at %s 0x%x, " ANDP STRVAL(NCR5380_map_config) ANDP STRVAL(NCR5380_map_name) ANDP scsi_ptr->NCR5380_instance_name);    if (scsi_ptr->irq == IRQ_NONE)	PRINTP("no interrupt\n");    else	PRINTP("on interrupt %d\n" ANDP scsi_ptr->irq);#ifdef NCR5380_STATS    if (hostdata->connected || hostdata->issue_queue || hostdata->disconnected_queue)	PRINTP("There are commands pending, transfer rates may be crud\n");    if (hostdata->pendingr)	PRINTP("  %d pending reads" ANDP hostdata->pendingr);    if (hostdata->pendingw)	PRINTP("  %d pending writes" ANDP hostdata->pendingw);    if (hostdata->pendingr || hostdata->pendingw)	PRINTP("\n");    for (dev = scsi_devices; dev; dev=dev->next) {	if (dev->host == scsi_ptr) {	    unsigned long br = hostdata->bytes_read[dev->id];	    unsigned long bw = hostdata->bytes_write[dev->id];	    long tr = hostdata->time_read[dev->id] / HZ;	    long tw = hostdata->time_write[dev->id] / HZ;	    PRINTP("  T:%d %s " ANDP dev->id ANDP (dev->type < MAX_SCSI_DEVICE_CODE) ? scsi_device_types[(int)dev->type] : "Unknown");	    for (i=0; i<8; i++)		if (dev->vendor[i] >= 0x20)		    *(buffer+(len++)) = dev->vendor[i];	    *(buffer+(len++)) = ' ';	    for (i=0; i<16; i++)		if (dev->model[i] >= 0x20)		    *(buffer+(len++)) = dev->model[i];	    *(buffer+(len++)) = ' ';	    for (i=0; i<4; i++)		if (dev->rev[i] >= 0x20)		    *(buffer+(len++)) = dev->rev[i];	    *(buffer+(len++)) = ' ';				    	    PRINTP("\n%10ld kb read    in %5ld secs" ANDP br/1024 ANDP tr);	    if (tr)		PRINTP(" @ %5ld bps" ANDP br / tr); 	    PRINTP("\n%10ld kb written in %5ld secs" ANDP bw/1024 ANDP tw);	    if (tw)		PRINTP(" @ %5ld bps" ANDP bw / tw); 	    PRINTP("\n");	}    }#endif	    status = NCR5380_read(STATUS_REG);    if (!(status & SR_REQ))	PRINTP("REQ not asserted, phase unknown.\n");    else {	for (i = 0; (phases[i].value != PHASE_UNKNOWN) &&		    (phases[i].value != (status & PHASE_MASK)); ++i)	    ;	PRINTP("Phase %s\n" ANDP phases[i].name);    }    if (!hostdata->connected) {	PRINTP("No currently connected command\n");    } else {	len += sprint_Scsi_Cmnd (buffer, len, (Scsi_Cmnd *) hostdata->connected);    }    PRINTP("issue_queue\n");    for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr;		ptr = (Scsi_Cmnd *) ptr->host_scribble)	len += sprint_Scsi_Cmnd (buffer, len, ptr);    PRINTP("disconnected_queue\n");    for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;		ptr = (Scsi_Cmnd *) ptr->host_scribble)	len += sprint_Scsi_Cmnd (buffer, len, ptr);	    *start = buffer + offset;    len -= offset;    if (len > length)	    len = length;    sti();    return len;}#undef PRINTP#undef ANDP#ifdef MODULE/* Eventually this will go into an include file, but this will be later */Scsi_Host_Template driver_template = GENERIC_NCR5380;#include <linux/module.h>#include "scsi_module.c"#endif

⌨️ 快捷键说明

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