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

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

?? fdomain.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 4 頁
字號:
      are using ISA boards, but Future Domain provides the MCA ID
      anyway.  We can use this ID to ensure that this is a Future
      Domain TMC-1660/TMC-1680.
    */

   if (inb( port + LSB_ID_Code ) != 0xe9) { /* test for 0x6127 id */
      if (inb( port + LSB_ID_Code ) != 0x27) return 0;
      if (inb( port + MSB_ID_Code ) != 0x61) return 0;
      chip = tmc1800;
   } else {			            /* test for 0xe960 id */
      if (inb( port + MSB_ID_Code ) != 0x60) return 0;
      chip = tmc18c50;
   }

   /* We have a valid MCA ID for a TMC-1660/TMC-1680 Future Domain board.
      Now, check to be sure the bios_base matches these ports.  If someone
      was unlucky enough to have purchased more than one Future Domain
      board, then they will have to modify this code, as we only detect one
      board here.  [The one with the lowest bios_base.]  */

   options = inb( port + Configuration1 );

#if DEBUG_DETECT
   printk( " Options = %x\n", options );
#endif

				/* Check for board with lowest bios_base. */
   if (addresses[ (options & 0xc0) >> 6 ] != bios_base)
	 return 0;
   interrupt_level = ints[ (options & 0x0e) >> 1 ];

   return 1;
}

static int fdomain_test_loopback( void )
{
   int i;
   int result;

   for (i = 0; i < 255; i++) {
      outb( i, port_base + Write_Loopback );
      result = inb( port_base + Read_Loopback );
      if (i != result)
	    return 1;
   }
   return 0;
}

int fdomain_16x0_detect( int hostnum )
{
   int              i, j;
   int              flag = 0;
   struct sigaction sa;
   int              retcode;
#if DO_DETECT
   const int        buflen = 255;
   Scsi_Cmnd        SCinit;
   unsigned char    do_inquiry[] =       { INQUIRY, 0, 0, 0, buflen, 0 };
   unsigned char    do_request_sense[] = { REQUEST_SENSE, 0, 0, 0, buflen, 0 };
   unsigned char    do_read_capacity[] = { READ_CAPACITY,
					   0, 0, 0, 0, 0, 0, 0, 0, 0 };
   unsigned char    buf[buflen];
#endif

#if DEBUG_DETECT
   printk( "fdomain_16x0_detect()," );
#endif

   for (i = 0; !bios_base && i < ADDRESS_COUNT; i++) {
#if DEBUG_DETECT
      printk( " %x(%x),", (unsigned)addresses[i], (unsigned)bios_base );
#endif
      for (j = 0; !bios_base && j < SIGNATURE_COUNT; j++) {
	 if (!memcmp( ((char *)addresses[i] + signatures[j].sig_offset),
		      signatures[j].signature, signatures[j].sig_length )) {
	    bios_major = signatures[j].major_bios_version;
	    bios_minor = signatures[j].minor_bios_version;
	    bios_base = addresses[i];
	 }
      }
   }

   if (!bios_base) {
#if DEBUG_DETECT
      printk( " FAILED: NO BIOS\n" );
#endif
      return 0;
   }

   if (bios_major == 2) {
      /* The TMC-1660/TMC-1680 has a RAM area just after the BIOS ROM.
	 Assuming the ROM is enabled (otherwise we wouldn't have been
	 able to read the ROM signature :-), then the ROM sets up the
	 RAM area with some magic numbers, such as a list of port
	 base addresses and a list of the disk "geometry" reported to
	 DOS (this geometry has nothing to do with physical geometry).
       */

      port_base = *((char *)bios_base + 0x1fcc)
	    + (*((char *)bios_base + 0x1fcd) << 8);
   
#if DEBUG_DETECT
      printk( " %x,", port_base );
#endif

      for (flag = 0, i = 0; !flag && i < PORT_COUNT; i++) {
	 if (port_base == ports[i])
	       ++flag;
      }

      if (flag)
	    flag = fdomain_is_valid_port( port_base );
   }

   if (!flag) {			/* Cannot get port base from BIOS RAM */
      
      /* This is a bad sign.  It usually means that someone patched the
	 BIOS signature list (the signatures variable) to contain a BIOS
	 signature for a board *OTHER THAN* the TMC-1660/TMC-1680.  It
	 also means that we don't have a Version 2.0 BIOS :-)
       */
      
#if DEBUG_DETECT
      if (bios_major != 2) printk( " RAM FAILED, " );
#endif

      /* Anyway, the alternative to finding the address in the RAM is
	 to just search through every possible port address for one
	 that is attached to the Future Domain card.  Don't panic,
	 though, about reading all these random port addresses--there
	 are rumors that the Future Domain BIOS does something very
	 similar.

	 Do not, however, check ports which the kernel knows are being used
         by another driver.
       */

      for (i = 0; !flag && i < PORT_COUNT; i++) {
	 port_base = ports[i];
	 if (check_region( port_base, 0x10 )) {
#if DEBUG_DETECT
	    printf( " (%x inuse),", port_base );
#endif
	    continue;
	 }
#if DEBUG_DETECT
	 printk( " %x,", port_base );
#endif
	 flag = fdomain_is_valid_port( port_base );
      }
   }

   if (!flag) {
#if DEBUG_DETECT
      printk( " FAILED: NO PORT\n" );
#endif
      return 0;		/* Cannot find valid set of ports */
   }

   print_banner();

   SCSI_Mode_Cntl_port   = port_base + SCSI_Mode_Cntl;
   FIFO_Data_Count_port  = port_base + FIFO_Data_Count;
   Interrupt_Cntl_port   = port_base + Interrupt_Cntl;
   Interrupt_Status_port = port_base + Interrupt_Status;
   Read_FIFO_port        = port_base + Read_FIFO;
   Read_SCSI_Data_port   = port_base + Read_SCSI_Data;
   SCSI_Cntl_port        = port_base + SCSI_Cntl;
   SCSI_Data_NoACK_port  = port_base + SCSI_Data_NoACK;
   SCSI_Status_port      = port_base + SCSI_Status;
   TMC_Cntl_port         = port_base + TMC_Cntl;
   TMC_Status_port       = port_base + TMC_Status;
   Write_FIFO_port       = port_base + Write_FIFO;
   Write_SCSI_Data_port  = port_base + Write_SCSI_Data;

   fdomain_16x0_reset( NULL );

   if (fdomain_test_loopback()) {
#if DEBUG_DETECT
      printk( "Future Domain: LOOPBACK TEST FAILED, FAILING DETECT!\n" );
#endif
      return 0;
   }

   this_host = hostnum;

				/* Log IRQ with kernel */
   
   if (!interrupt_level) {
      panic( "Future Domain: *NO* interrupt level selected!\n" );
   } else {
      /* Register the IRQ with the kernel */

      sa.sa_handler  = fdomain_16x0_intr;
      sa.sa_flags    = SA_INTERRUPT;
      sa.sa_mask     = 0;
      sa.sa_restorer = NULL;
      
      retcode = irqaction( interrupt_level, &sa );

      if (retcode < 0) {
	 if (retcode == -EINVAL) {
	    printk( "Future Domain: IRQ %d is bad!\n", interrupt_level );
	    printk( "               This shouldn't happen!\n" );
	    printk( "               Send mail to faith@cs.unc.edu\n" );
	 } else if (retcode == -EBUSY) {
	    printk( "Future Domain: IRQ %d is already in use!\n",
		    interrupt_level );
	    printk( "               Please use another IRQ!\n" );
	 } else {
	    printk( "Future Domain: Error getting IRQ %d\n", interrupt_level );
	    printk( "               This shouldn't happen!\n" );
	    printk( "               Send mail to faith@cs.unc.edu\n" );
	 }
	 panic( "Future Domain: Driver requires interruptions\n" );
      } else {
	 printk( "Future Domain: IRQ %d requested from kernel\n",
		 interrupt_level );
      }
   }

				/* Log I/O ports with kernel */

   snarf_region( port_base, 0x10 );

   if ((bios_major == 3 && bios_minor >= 2) || bios_major < 0) {
      adapter_mask = 0x80;
      scsi_hosts[this_host].this_id = 7;
   }
   
#if DO_DETECT

   /* These routines are here because of the way the SCSI bus behaves after
      a reset.  This appropriate behavior was not handled correctly by the
      higher level SCSI routines when I first wrote this driver.  Now,
      however, correct scan routines are part of scsi.c and these routines
      are no longer needed.  However, this code is still good for
      debugging.  */

   SCinit.request_buffer  = SCinit.buffer = buf;
   SCinit.request_bufflen = SCinit.bufflen = sizeof(buf)-1;
   SCinit.use_sg          = 0;
   SCinit.lun             = 0;

   printk( "Future Domain detection routine scanning for devices:\n" );
   for (i = 0; i < 8; i++) {
      SCinit.target = i;
      if (i == scsi_hosts[this_host].this_id) /* Skip host adapter */
	    continue;
      memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense));
      retcode = fdomain_16x0_command(&SCinit);
      if (!retcode) {
	 memcpy(SCinit.cmnd, do_inquiry, sizeof(do_inquiry));
	 retcode = fdomain_16x0_command(&SCinit);
	 if (!retcode) {
	    printk( "     SCSI ID %d: ", i );
	    for (j = 8; j < (buf[4] < 32 ? buf[4] : 32); j++)
		  printk( "%c", buf[j] >= 20 ? buf[j] : ' ' );
	    memcpy(SCinit.cmnd, do_read_capacity, sizeof(do_read_capacity));
	    retcode = fdomain_16x0_command(&SCinit);
	    if (!retcode) {
	       unsigned long blocks, size, capacity;
	       
	       blocks = (buf[0] << 24) | (buf[1] << 16)
		     | (buf[2] << 8) | buf[3];
	       size = (buf[4] << 24) | (buf[5] << 16) | (buf[6] << 8) | buf[7];
	       capacity = +( +(blocks / 1024L) * +(size * 10L)) / 1024L;
	       
	       printk( "%lu MB (%lu byte blocks)",
		       ((capacity + 5L) / 10L), size );
	    } else {
	       memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense));
	       retcode = fdomain_16x0_command(&SCinit);
	    }
	    printk ("\n" );
	 } else {
	    memcpy(SCinit.cmnd, do_request_sense, sizeof(do_request_sense));
	    retcode = fdomain_16x0_command(&SCinit);
	 }
      }
   }
#endif

   return 1;
}

const char *fdomain_16x0_info(void)
{
   static char buffer[80];
   char        *pt;
   
   strcpy( buffer, "Future Domain: TMC-16x0 SCSI driver, version" );
   if (strchr( VERSION, ':')) { /* Assume VERSION is an RCS Revision string */
      strcat( buffer, strchr( VERSION, ':' ) + 1 );
      pt = strrchr( buffer, '$') - 1;
      if (!pt)  		/* Stripped RCS Revision string? */
	    pt = buffer + strlen( buffer ) - 1;
      if (*pt != ' ')
	    ++pt;
      *pt++ = '\n';
      *pt = '\0';
   } else {			/* Assume VERSION is a number */
      strcat( buffer, " " VERSION "\n" );
   }
      
   return buffer;
}

#if 0
static int fdomain_arbitrate( void )
{
   int           status = 0;
   unsigned long timeout;

#if EVERY_ACCESS
   printk( "fdomain_arbitrate()\n" );
#endif
   
   outb( 0x00, SCSI_Cntl_port );              /* Disable data drivers */
   outb( adapter_mask, port_base + SCSI_Data_NoACK ); /* Set our id bit */
   outb( 0x04 | PARITY_MASK, TMC_Cntl_port ); /* Start arbitration */

   timeout = jiffies + 50;	              /* 500 mS */
   while (jiffies < timeout) {
      status = inb( TMC_Status_port );        /* Read adapter status */
      if (status & 0x02)		      /* Arbitration complete */
	    return 0;	
   }

   /* Make bus idle */
   fdomain_make_bus_idle();

#if EVERY_ACCESS
   printk( "Arbitration failed, status = %x\n", status );
#endif
#if ERRORS_ONLY
   printk( "Future Domain: Arbitration failed, status = %x", status );
#endif
   return 1;
}
#endif

static int fdomain_select( int target )
{
   int           status;
   unsigned long timeout;


   outb( 0x82, SCSI_Cntl_port ); /* Bus Enable + Select */
   outb( adapter_mask | (1 << target), SCSI_Data_NoACK_port );

   /* Stop arbitration and enable parity */
   outb( PARITY_MASK, TMC_Cntl_port ); 

   timeout = jiffies + 25;	        /* 250mS */
   while (jiffies < timeout) {
      status = inb( SCSI_Status_port ); /* Read adapter status */
      if (status & 1) {		        /* Busy asserted */
	 /* Enable SCSI Bus (on error, should make bus idle with 0) */
	 outb( 0x80, SCSI_Cntl_port );
	 return 0;
      }
   }
   /* Make bus idle */
   fdomain_make_bus_idle();
#if EVERY_ACCESS
   if (!target) printk( "Selection failed\n" );
#endif
#if ERRORS_ONLY
   if (!target) printk( "Future Domain: Selection failed" );
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人app在线| 欧美年轻男男videosbes| 在线观看日韩av先锋影音电影院| 日韩一区二区在线观看视频| 国产精品乱子久久久久| 日本在线观看不卡视频| 91在线免费看| 国产嫩草影院久久久久| 久久激情综合网| 欧美日韩成人综合天天影院| 中文字幕在线观看一区| 国产一区二区三区免费观看| 欧美精品丝袜久久久中文字幕| 国产精品国产三级国产aⅴ无密码| 蜜桃av一区二区三区电影| 欧美三级在线播放| 亚洲精品老司机| 91尤物视频在线观看| 国产色婷婷亚洲99精品小说| 久久99精品一区二区三区三区| 欧美日韩精品一区二区在线播放| 最新成人av在线| av在线不卡免费看| 中文字幕av一区二区三区| 国产麻豆日韩欧美久久| 精品va天堂亚洲国产| 美国精品在线观看| 日韩欧美国产综合一区| 蜜臀av一级做a爰片久久| 56国语精品自产拍在线观看| 亚洲图片欧美综合| 欧美欧美午夜aⅴ在线观看| 亚洲午夜激情网页| 欧美一区二区视频网站| 日本视频一区二区三区| 日韩一区二区三区观看| 麻豆精品视频在线观看| 欧美电影免费观看完整版| 男女男精品视频网| 久久久久久久国产精品影院| 国产成人欧美日韩在线电影 | 国内精品自线一区二区三区视频| 日韩一二三区视频| 精品午夜久久福利影院| 久久精品一二三| k8久久久一区二区三区| 一区二区在线免费观看| 9191久久久久久久久久久| 男女激情视频一区| 国产欧美视频在线观看| 一本久久a久久免费精品不卡| 亚洲欧美视频在线观看视频| 欧美日韩日日摸| 久久国产视频网| 国产精品丝袜久久久久久app| 91首页免费视频| 婷婷久久综合九色综合伊人色| 日韩一区二区三区av| 国产成人精品影视| 午夜欧美大尺度福利影院在线看| 日韩免费电影一区| 9色porny自拍视频一区二区| 亚洲国产精品久久不卡毛片| 精品国产一区二区三区久久影院 | 日韩精品免费视频人成| 久久欧美一区二区| 欧美亚洲动漫另类| 国内精品视频一区二区三区八戒| 日韩毛片在线免费观看| 91麻豆精品国产无毒不卡在线观看 | 亚洲成人动漫在线免费观看| 欧美xfplay| 一本到高清视频免费精品| 麻豆久久久久久| 亚洲精品午夜久久久| 2023国产精华国产精品| 欧美影视一区在线| 丰满放荡岳乱妇91ww| 日本sm残虐另类| 亚洲天堂精品视频| 久久这里只有精品视频网| 欧美午夜免费电影| 不卡视频免费播放| 国产综合色精品一区二区三区| 亚洲一区二区av在线| 国产欧美在线观看一区| 91精品免费观看| 色拍拍在线精品视频8848| 国产激情一区二区三区四区| 青草av.久久免费一区| 亚洲欧美乱综合| 国产欧美精品日韩区二区麻豆天美| 欧美性色综合网| av不卡一区二区三区| 国产成人丝袜美腿| 国产综合色产在线精品| 日本美女一区二区| 亚洲电影中文字幕在线观看| 中文字幕一区二区三区四区不卡| 久久久久久麻豆| 欧美xfplay| 精品人在线二区三区| 91精品国产乱码久久蜜臀| 欧洲视频一区二区| 91国偷自产一区二区使用方法| 国产成人精品免费网站| 国产尤物一区二区在线| 精品午夜久久福利影院| 麻豆精品国产91久久久久久| 婷婷国产在线综合| 亚洲第一电影网| 亚洲国产日韩a在线播放性色| 一区二区三区四区五区视频在线观看 | 欧美日韩国产一级二级| 欧洲日韩一区二区三区| 在线免费av一区| 91久久精品一区二区三| 91国模大尺度私拍在线视频| 91极品视觉盛宴| 欧美亚男人的天堂| 欧美另类久久久品| 日韩欧美国产午夜精品| 日韩精品一区二区三区在线播放| 日韩色在线观看| wwwwxxxxx欧美| 国产午夜精品一区二区三区四区| 国产清纯在线一区二区www| 国产精品亲子伦对白| 成人欧美一区二区三区1314 | 久久久美女艺术照精彩视频福利播放 | 综合激情成人伊人| 亚洲第一狼人社区| 久久国产尿小便嘘嘘| 国产91在线观看| 91免费视频网址| 51久久夜色精品国产麻豆| 欧美成人乱码一区二区三区| 久久久99精品久久| 亚洲老妇xxxxxx| 日本成人在线一区| 国产精品综合二区| 91久久一区二区| 日韩欧美亚洲另类制服综合在线| 国产午夜亚洲精品不卡| 亚洲尤物视频在线| 久久精品国产秦先生| 99v久久综合狠狠综合久久| 欧美性色欧美a在线播放| 2020国产精品自拍| 亚洲美女免费在线| 久久99深爱久久99精品| 99久久精品国产观看| 91精品国产色综合久久不卡电影 | 日韩不卡一区二区三区| 国产精品888| 欧美精品日韩综合在线| 国产偷国产偷亚洲高清人白洁 | 国产欧美一区二区精品性| 亚洲国产精品综合小说图片区| 国产一区二区三区蝌蚪| 欧美性欧美巨大黑白大战| 精品欧美黑人一区二区三区| 伊人色综合久久天天| 国产精品1区2区| 91精品国产一区二区三区蜜臀| 国产精品视频看| 蜜臀av一区二区| 欧美日韩你懂的| 亚洲美女视频一区| 国产一区二区主播在线| 欧美日韩三级在线| 亚洲摸摸操操av| 成人免费看的视频| 精品999久久久| 欧美aaa在线| 欧美日韩小视频| 亚洲天堂福利av| 9i看片成人免费高清| 久久精品一区蜜桃臀影院| 老司机精品视频一区二区三区| 欧美视频精品在线观看| 亚洲色图.com| 91在线porny国产在线看| 国产精品乱码久久久久久| 国产精品一区二区在线播放| 日韩三级视频在线观看| 日本最新不卡在线| 在线综合亚洲欧美在线视频| 亚洲国产精品久久不卡毛片| 欧美在线999| 一二三四社区欧美黄| 色94色欧美sute亚洲线路一ni| 亚洲私人黄色宅男| 91网上在线视频| 亚洲老司机在线| 欧美性大战久久| 三级欧美韩日大片在线看| 欧美妇女性影城| 蜜桃传媒麻豆第一区在线观看| 日韩精品自拍偷拍|