pdc4030.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:17k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*  -*- linux-c -*-
  2.  *  linux/drivers/ide/pdc4030.c Version 0.90  May 27, 1999
  3.  *
  4.  *  Copyright (C) 1995-1999  Linus Torvalds & authors (see below)
  5.  */
  6. /*
  7.  *  Principal Author/Maintainer:  peterd@pnd-pc.demon.co.uk
  8.  *
  9.  *  This file provides support for the second port and cache of Promise
  10.  *  IDE interfaces, e.g. DC4030VL, DC4030VL-1 and DC4030VL-2.
  11.  *
  12.  *  Thanks are due to Mark Lord for advice and patiently answering stupid
  13.  *  questions, and all those mugs^H^H^H^Hbrave souls who've tested this,
  14.  *  especially Andre Hedrick.
  15.  *
  16.  *  Version 0.01 Initial version, #include'd in ide.c rather than
  17.  *                      compiled separately.
  18.  *                      Reads use Promise commands, writes as before. Drives
  19.  *                      on second channel are read-only.
  20.  *  Version 0.02        Writes working on second channel, reads on both
  21.  *                      channels. Writes fail under high load. Suspect
  22.  * transfers of >127 sectors don't work.
  23.  *  Version 0.03        Brought into line with ide.c version 5.27.
  24.  *                      Other minor changes.
  25.  *  Version 0.04        Updated for ide.c version 5.30
  26.  *                      Changed initialization strategy
  27.  *  Version 0.05 Kernel integration.  -ml
  28.  *  Version 0.06 Ooops. Add hwgroup to direct call of ide_intr() -ml
  29.  *  Version 0.07 Added support for DC4030 variants
  30.  * Secondary interface autodetection
  31.  *  Version 0.08 Renamed to pdc4030.c
  32.  *  Version 0.09 Obsolete - never released - did manual write request
  33.  * splitting before max_sectors[major][minor] available.
  34.  *  Version 0.10 Updated for 2.1 series of kernels
  35.  *  Version 0.11 Updated for 2.3 series of kernels
  36.  * Autodetection code added.
  37.  *
  38.  *  Version 0.90 Transition to BETA code. No lost/unexpected interrupts
  39.  */
  40. /*
  41.  * Once you've compiled it in, you'll have to also enable the interface
  42.  * setup routine from the kernel command line, as in 
  43.  *
  44.  * 'linux ide0=dc4030' or 'linux ide1=dc4030'
  45.  *
  46.  * It should now work as a second controller also ('ide1=dc4030') but only
  47.  * if you DON'T have BIOS V4.44, which has a bug. If you have this version
  48.  * and EPROM programming facilities, you need to fix 4 bytes:
  49.  *  2496: 81 81
  50.  * 2497: 3E 3E
  51.  * 2498: 22 98 *
  52.  * 2499: 06 05 *
  53.  * 249A: F0 F0
  54.  * 249B: 01 01
  55.  * ...
  56.  * 24A7: 81 81
  57.  * 24A8: 3E 3E
  58.  * 24A9: 22 98 *
  59.  * 24AA: 06 05 *
  60.  * 24AB: 70 70
  61.  * 24AC: 01 01
  62.  *
  63.  * As of January 1999, Promise Technology Inc. have finally supplied me with
  64.  * some technical information which has shed a glimmer of light on some of the
  65.  * problems I was having, especially with writes. 
  66.  *
  67.  * There are still problems with the robustness and efficiency of this driver
  68.  * because I still don't understand what the card is doing with interrupts.
  69.  */
  70. #define DEBUG_READ
  71. #define DEBUG_WRITE
  72. #include <linux/types.h>
  73. #include <linux/kernel.h>
  74. #include <linux/delay.h>
  75. #include <linux/timer.h>
  76. #include <linux/mm.h>
  77. #include <linux/ioport.h>
  78. #include <linux/blkdev.h>
  79. #include <linux/hdreg.h>
  80. #include <linux/ide.h>
  81. #include <linux/init.h>
  82. #include <asm/io.h>
  83. #include <asm/irq.h>
  84. #include "pdc4030.h"
  85. #ifdef CONFIG_IDE_TASKFILE_IO
  86. #  define __TASKFILE__IO
  87. #else /* CONFIG_IDE_TASKFILE_IO */
  88. #  undef __TASKFILE__IO
  89. #endif /* CONFIG_IDE_TASKFILE_IO */
  90. /*
  91.  * promise_selectproc() is invoked by ide.c
  92.  * in preparation for access to the specified drive.
  93.  */
  94. static void promise_selectproc (ide_drive_t *drive)
  95. {
  96. unsigned int number;
  97. number = (HWIF(drive)->channel << 1) + drive->select.b.unit;
  98. OUT_BYTE(number,IDE_FEATURE_REG);
  99. }
  100. /*
  101.  * pdc4030_cmd handles the set of vendor specific commands that are initiated
  102.  * by command F0. They all have the same success/failure notification -
  103.  * 'P' (=0x50) on success, 'p' (=0x70) on failure.
  104.  */
  105. int pdc4030_cmd(ide_drive_t *drive, byte cmd)
  106. {
  107. unsigned long timeout, timer;
  108. byte status_val;
  109. promise_selectproc(drive); /* redundant? */
  110. OUT_BYTE(0xF3,IDE_SECTOR_REG);
  111. OUT_BYTE(cmd,IDE_SELECT_REG);
  112. OUT_BYTE(PROMISE_EXTENDED_COMMAND,IDE_COMMAND_REG);
  113. timeout = HZ * 10;
  114. timeout += jiffies;
  115. do {
  116. if(time_after(jiffies, timeout)) {
  117. return 2; /* device timed out */
  118. }
  119. /* This is out of delay_10ms() */
  120. /* Delays at least 10ms to give interface a chance */
  121. timer = jiffies + (HZ + 99)/100 + 1;
  122. while (time_after(timer, jiffies));
  123. status_val = IN_BYTE(IDE_SECTOR_REG);
  124. } while (status_val != 0x50 && status_val != 0x70);
  125. if(status_val == 0x50)
  126. return 0; /* device returned success */
  127. else
  128. return 1; /* device returned failure */
  129. }
  130. /*
  131.  * pdc4030_identify sends a vendor-specific IDENTIFY command to the drive
  132.  */
  133. int pdc4030_identify(ide_drive_t *drive)
  134. {
  135. return pdc4030_cmd(drive, PROMISE_IDENTIFY);
  136. }
  137. int enable_promise_support = 0;
  138. void __init init_pdc4030 (void)
  139. {
  140. enable_promise_support = 1;
  141. }
  142. /*
  143.  * setup_pdc4030()
  144.  * Completes the setup of a Promise DC4030 controller card, once found.
  145.  */
  146. int __init setup_pdc4030 (ide_hwif_t *hwif)
  147. {
  148.         ide_drive_t *drive;
  149. ide_hwif_t *hwif2;
  150. struct dc_ident ident;
  151. int i;
  152. ide_startstop_t startstop;
  153. if (!hwif) return 0;
  154. drive = &hwif->drives[0];
  155. hwif2 = &ide_hwifs[hwif->index+1];
  156. if (hwif->chipset == ide_pdc4030) /* we've already been found ! */
  157. return 1;
  158. if (IN_BYTE(IDE_NSECTOR_REG) == 0xFF || IN_BYTE(IDE_SECTOR_REG) == 0xFF) {
  159. return 0;
  160. }
  161. if (IDE_CONTROL_REG)
  162. OUT_BYTE(0x08,IDE_CONTROL_REG);
  163. if (pdc4030_cmd(drive,PROMISE_GET_CONFIG)) {
  164. return 0;
  165. }
  166. if (ide_wait_stat(&startstop, drive,DATA_READY,BAD_W_STAT,WAIT_DRQ)) {
  167. printk(KERN_INFO
  168. "%s: Failed Promise read config!n",hwif->name);
  169. return 0;
  170. }
  171. ide_input_data(drive,&ident,SECTOR_WORDS);
  172. if (ident.id[1] != 'P' || ident.id[0] != 'T') {
  173. return 0;
  174. }
  175. printk(KERN_INFO "%s: Promise caching controller, ",hwif->name);
  176. switch(ident.type) {
  177. case 0x43: printk("DC4030VL-2, "); break;
  178. case 0x41: printk("DC4030VL-1, "); break;
  179. case 0x40: printk("DC4030VL, "); break;
  180. default:
  181. printk("unknown - type 0x%02x - please report!n"
  182.        ,ident.type);
  183. printk("Please e-mail the following data to "
  184.        "promise@pnd-pc.demon.co.uk along withn"
  185.        "a description of your card and drives:n");
  186. for (i=0; i < 0x90; i++) {
  187. printk("%02x ", ((unsigned char *)&ident)[i]);
  188. if ((i & 0x0f) == 0x0f) printk("n");
  189. }
  190. return 0;
  191. }
  192. printk("%dKB cache, ",(int)ident.cache_mem);
  193. switch(ident.irq) {
  194.             case 0x00: hwif->irq = 14; break;
  195.             case 0x01: hwif->irq = 12; break;
  196.             default:   hwif->irq = 15; break;
  197. }
  198. printk("on IRQ %dn",hwif->irq);
  199. /*
  200.  * Once found and identified, we set up the next hwif in the array
  201.  * (hwif2 = ide_hwifs[hwif->index+1]) with the same io ports, irq
  202.  * and other settings as the main hwif. This gives us two "mated"
  203.  * hwifs pointing to the Promise card.
  204.  *
  205.  * We also have to shift the default values for the remaining
  206.  * interfaces "up by one" to make room for the second interface on the
  207.  * same set of values.
  208.  */
  209. hwif->chipset = hwif2->chipset = ide_pdc4030;
  210. hwif->mate = hwif2;
  211. hwif2->mate = hwif;
  212. hwif2->channel = 1;
  213. hwif->selectproc = hwif2->selectproc = &promise_selectproc;
  214. hwif->serialized = hwif2->serialized = 1;
  215. /* Shift the remaining interfaces down by one */
  216. for (i=MAX_HWIFS-1 ; i > hwif->index+1 ; i--) {
  217. ide_hwif_t *h = &ide_hwifs[i];
  218. #ifdef DEBUG
  219. printk(KERN_DEBUG "Shifting i/f %d values to i/f %dn",i-1,i);
  220. #endif
  221. ide_init_hwif_ports(&h->hw, (h-1)->io_ports[IDE_DATA_OFFSET], 0, NULL);
  222. memcpy(h->io_ports, h->hw.io_ports, sizeof(h->io_ports));
  223. h->noprobe = (h-1)->noprobe;
  224. }
  225. ide_init_hwif_ports(&hwif2->hw, hwif->io_ports[IDE_DATA_OFFSET], 0, NULL);
  226. memcpy(hwif2->io_ports, hwif->hw.io_ports, sizeof(hwif2->io_ports));
  227. hwif2->irq = hwif->irq;
  228. hwif2->hw.irq = hwif->hw.irq = hwif->irq;
  229. for (i=0; i<2 ; i++) {
  230. hwif->drives[i].io_32bit = 3;
  231. hwif2->drives[i].io_32bit = 3;
  232. hwif->drives[i].keep_settings = 1;
  233. hwif2->drives[i].keep_settings = 1;
  234. if (!ident.current_tm[i].cyl)
  235. hwif->drives[i].noprobe = 1;
  236. if (!ident.current_tm[i+2].cyl)
  237. hwif2->drives[i].noprobe = 1;
  238. }
  239.         return 1;
  240. }
  241. /*
  242.  * detect_pdc4030()
  243.  * Tests for the presence of a DC4030 Promise card on this interface
  244.  * Returns: 1 if found, 0 if not found
  245.  */
  246. int __init detect_pdc4030(ide_hwif_t *hwif)
  247. {
  248. ide_drive_t *drive = &hwif->drives[0];
  249. if (IDE_DATA_REG == 0) { /* Skip test for non-existent interface */
  250. return 0;
  251. }
  252. OUT_BYTE(0xF3, IDE_SECTOR_REG);
  253. OUT_BYTE(0x14, IDE_SELECT_REG);
  254. OUT_BYTE(PROMISE_EXTENDED_COMMAND, IDE_COMMAND_REG);
  255. ide_delay_50ms();
  256. if (IN_BYTE(IDE_ERROR_REG) == 'P' &&
  257.     IN_BYTE(IDE_NSECTOR_REG) == 'T' &&
  258.     IN_BYTE(IDE_SECTOR_REG) == 'I') {
  259. return 1;
  260. } else {
  261. return 0;
  262. }
  263. }
  264. void __init ide_probe_for_pdc4030(void)
  265. {
  266. unsigned int index;
  267. ide_hwif_t *hwif;
  268. if (enable_promise_support == 0)
  269. return;
  270. for (index = 0; index < MAX_HWIFS; index++) {
  271. hwif = &ide_hwifs[index];
  272. if (hwif->chipset == ide_unknown && detect_pdc4030(hwif)) {
  273. setup_pdc4030(hwif);
  274. }
  275. }
  276. }
  277. /*
  278.  * promise_read_intr() is the handler for disk read/multread interrupts
  279.  */
  280. static ide_startstop_t promise_read_intr (ide_drive_t *drive)
  281. {
  282. byte stat;
  283. int total_remaining;
  284. unsigned int sectors_left, sectors_avail, nsect;
  285. struct request *rq;
  286. if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
  287. return ide_error(drive, "promise_read_intr", stat);
  288. }
  289. read_again:
  290. do {
  291. sectors_left = IN_BYTE(IDE_NSECTOR_REG);
  292. IN_BYTE(IDE_SECTOR_REG);
  293. } while (IN_BYTE(IDE_NSECTOR_REG) != sectors_left);
  294. rq = HWGROUP(drive)->rq;
  295. sectors_avail = rq->nr_sectors - sectors_left;
  296. if (!sectors_avail)
  297. goto read_again;
  298. read_next:
  299. rq = HWGROUP(drive)->rq;
  300. nsect = rq->current_nr_sectors;
  301. if (nsect > sectors_avail)
  302. nsect = sectors_avail;
  303. sectors_avail -= nsect;
  304. ide_input_data(drive, rq->buffer, nsect * SECTOR_WORDS);
  305. #ifdef DEBUG_READ
  306. printk(KERN_DEBUG "%s:  promise_read: sectors(%ld-%ld), "
  307.        "buf=0x%08lx, rem=%ldn", drive->name, rq->sector,
  308.        rq->sector+nsect-1, (unsigned long) rq->buffer,
  309.        rq->nr_sectors-nsect);
  310. #endif
  311. rq->sector += nsect;
  312. rq->buffer += nsect<<9;
  313. rq->errors = 0;
  314. rq->nr_sectors -= nsect;
  315. total_remaining = rq->nr_sectors;
  316. if ((rq->current_nr_sectors -= nsect) <= 0) {
  317. ide_end_request(1, HWGROUP(drive));
  318. }
  319. /*
  320.  * Now the data has been read in, do the following:
  321.  * 
  322.  * if there are still sectors left in the request, 
  323.  *   if we know there are still sectors available from the interface,
  324.  *     go back and read the next bit of the request.
  325.  *   else if DRQ is asserted, there are more sectors available, so
  326.  *     go back and find out how many, then read them in.
  327.  *   else if BUSY is asserted, we are going to get an interrupt, so
  328.  *     set the handler for the interrupt and just return
  329.  */
  330. if (total_remaining > 0) {
  331. if (sectors_avail)
  332. goto read_next;
  333. stat = GET_STAT();
  334. if (stat & DRQ_STAT)
  335. goto read_again;
  336. if (stat & BUSY_STAT) {
  337. ide_set_handler (drive, &promise_read_intr, WAIT_CMD, NULL);
  338. #ifdef DEBUG_READ
  339. printk(KERN_DEBUG "%s: promise_read: waiting for"
  340.        "interruptn", drive->name);
  341. #endif
  342. return ide_started;
  343. }
  344. printk(KERN_ERR "%s: Eeek! promise_read_intr: sectors left "
  345.        "!DRQ !BUSYn", drive->name);
  346. return ide_error(drive, "promise read intr", stat);
  347. }
  348. return ide_stopped;
  349. }
  350. /*
  351.  * promise_complete_pollfunc()
  352.  * This is the polling function for waiting (nicely!) until drive stops
  353.  * being busy. It is invoked at the end of a write, after the previous poll
  354.  * has finished.
  355.  *
  356.  * Once not busy, the end request is called.
  357.  */
  358. static ide_startstop_t promise_complete_pollfunc(ide_drive_t *drive)
  359. {
  360. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  361. struct request *rq = hwgroup->rq;
  362. int i;
  363. if (GET_STAT() & BUSY_STAT) {
  364. if (time_before(jiffies, hwgroup->poll_timeout)) {
  365. ide_set_handler(drive, &promise_complete_pollfunc, HZ/100, NULL);
  366. return ide_started; /* continue polling... */
  367. }
  368. hwgroup->poll_timeout = 0;
  369. printk(KERN_ERR "%s: completion timeout - still busy!n",
  370.        drive->name);
  371. return ide_error(drive, "busy timeout", GET_STAT());
  372. }
  373. hwgroup->poll_timeout = 0;
  374. #ifdef DEBUG_WRITE
  375. printk(KERN_DEBUG "%s: Write complete - end_requestn", drive->name);
  376. #endif
  377. for (i = rq->nr_sectors; i > 0; ) {
  378. i -= rq->current_nr_sectors;
  379. ide_end_request(1, hwgroup);
  380. }
  381. return ide_stopped;
  382. }
  383. /*
  384.  * promise_write_pollfunc() is the handler for disk write completion polling.
  385.  */
  386. static ide_startstop_t promise_write_pollfunc (ide_drive_t *drive)
  387. {
  388. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  389. if (IN_BYTE(IDE_NSECTOR_REG) != 0) {
  390. if (time_before(jiffies, hwgroup->poll_timeout)) {
  391. ide_set_handler (drive, &promise_write_pollfunc, HZ/100, NULL);
  392. return ide_started; /* continue polling... */
  393. }
  394. hwgroup->poll_timeout = 0;
  395. printk(KERN_ERR "%s: write timed-out!n",drive->name);
  396. return ide_error (drive, "write timeout", GET_STAT());
  397. }
  398. /*
  399.  * Now write out last 4 sectors and poll for not BUSY
  400.  */
  401. ide_multwrite(drive, 4);
  402. hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
  403. ide_set_handler(drive, &promise_complete_pollfunc, HZ/100, NULL);
  404. #ifdef DEBUG_WRITE
  405. printk(KERN_DEBUG "%s: Done last 4 sectors - status = %02xn",
  406. drive->name, GET_STAT());
  407. #endif
  408. return ide_started;
  409. }
  410. /*
  411.  * promise_write() transfers a block of one or more sectors of data to a
  412.  * drive as part of a disk write operation. All but 4 sectors are transferred
  413.  * in the first attempt, then the interface is polled (nicely!) for completion
  414.  * before the final 4 sectors are transferred. There is no interrupt generated
  415.  * on writes (at least on the DC4030VL-2), we just have to poll for NOT BUSY.
  416.  */
  417. static ide_startstop_t promise_write (ide_drive_t *drive)
  418. {
  419. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  420. struct request *rq = &hwgroup->wrq;
  421. #ifdef DEBUG_WRITE
  422. printk(KERN_DEBUG "%s: promise_write: sectors(%ld-%ld), "
  423.        "buffer=%pn", drive->name, rq->sector,
  424.        rq->sector + rq->nr_sectors - 1, rq->buffer);
  425. #endif
  426. /*
  427.  * If there are more than 4 sectors to transfer, do n-4 then go into
  428.  * the polling strategy as defined above.
  429.  */
  430. if (rq->nr_sectors > 4) {
  431. if (ide_multwrite(drive, rq->nr_sectors - 4))
  432. return ide_stopped;
  433. hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
  434. ide_set_handler (drive, &promise_write_pollfunc, HZ/100, NULL);
  435. return ide_started;
  436. } else {
  437. /*
  438.  * There are 4 or fewer sectors to transfer, do them all in one go
  439.  * and wait for NOT BUSY.
  440.  */
  441. if (ide_multwrite(drive, rq->nr_sectors))
  442. return ide_stopped;
  443. hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
  444. ide_set_handler(drive, &promise_complete_pollfunc, HZ/100, NULL);
  445. #ifdef DEBUG_WRITE
  446. printk(KERN_DEBUG "%s: promise_write: <= 4 sectors, "
  447. "status = %02xn", drive->name, GET_STAT());
  448. #endif
  449. return ide_started;
  450. }
  451. }
  452. /*
  453.  * do_pdc4030_io() is called from do_rw_disk, having had the block number
  454.  * already set up. It issues a READ or WRITE command to the Promise
  455.  * controller, assuming LBA has been used to set up the block number.
  456.  */
  457. ide_startstop_t do_pdc4030_io (ide_drive_t *drive, struct request *rq)
  458. {
  459. ide_startstop_t startstop;
  460. unsigned long timeout;
  461. byte stat;
  462. switch(rq->cmd) {
  463. case READ:
  464. #ifndef __TASKFILE__IO
  465. OUT_BYTE(PROMISE_READ, IDE_COMMAND_REG);
  466. #endif
  467. /*
  468.  * The card's behaviour is odd at this point. If the data is
  469.  * available, DRQ will be true, and no interrupt will be
  470.  * generated by the card. If this is the case, we need to call the 
  471.  * "interrupt" handler (promise_read_intr) directly. Otherwise, if
  472.  * an interrupt is going to occur, bit0 of the SELECT register will
  473.  * be high, so we can set the handler the just return and be interrupted.
  474.  * If neither of these is the case, we wait for up to 50ms (badly I'm
  475.  * afraid!) until one of them is.
  476.  */
  477. timeout = jiffies + HZ/20; /* 50ms wait */
  478. do {
  479. stat=GET_STAT();
  480. if (stat & DRQ_STAT) {
  481. udelay(1);
  482. return promise_read_intr(drive);
  483. }
  484. if (IN_BYTE(IDE_SELECT_REG) & 0x01) {
  485. #ifdef DEBUG_READ
  486. printk(KERN_DEBUG "%s: read: waiting for interruptn", drive->name);
  487. #endif
  488. ide_set_handler(drive, &promise_read_intr, WAIT_CMD, NULL);
  489. return ide_started;
  490. }
  491. udelay(1);
  492. } while (time_before(jiffies, timeout));
  493. printk(KERN_ERR "%s: reading: No DRQ and not waiting - Odd!n", drive->name);
  494. return ide_stopped;
  495. case WRITE:
  496. #ifndef __TASKFILE__IO
  497. OUT_BYTE(PROMISE_WRITE, IDE_COMMAND_REG);
  498. #endif
  499. if (ide_wait_stat(&startstop, drive, DATA_READY, drive->bad_wstat, WAIT_DRQ)) {
  500. printk(KERN_ERR "%s: no DRQ after issuing PROMISE_WRITEn", drive->name);
  501. return startstop;
  502.      }
  503. if (!drive->unmask)
  504. __cli(); /* local CPU only */
  505. HWGROUP(drive)->wrq = *rq; /* scratchpad */
  506. return promise_write(drive);
  507. default:
  508. printk("KERN_WARNING %s: bad command: %dn", drive->name, rq->cmd);
  509. ide_end_request(0, HWGROUP(drive));
  510. return ide_stopped;
  511. }
  512. }
  513. #ifdef __TASKFILE__IO
  514. ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
  515. {
  516. struct hd_drive_task_hdr taskfile;
  517. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  518. taskfile.sector_count = rq->nr_sectors;
  519. taskfile.sector_number = block;
  520. taskfile.low_cylinder = (block>>=8);
  521. taskfile.high_cylinder = (block>>=8);
  522. taskfile.device_head = ((block>>8)&0x0f)|drive->select.all;
  523. taskfile.command = (rq->cmd==READ)?PROMISE_READ:PROMISE_WRITE;
  524. do_taskfile(drive, &taskfile, NULL, NULL);
  525. return do_pdc4030_io(drive, rq);
  526. }
  527. #endif