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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/ide/ide-disk.c Version 1.10 June 9, 2000
  3.  *
  4.  *  Copyright (C) 1994-1998  Linus Torvalds & authors (see below)
  5.  */
  6. /*
  7.  *  Mostly written by Mark Lord <mlord@pobox.com>
  8.  *                and Gadi Oxman <gadio@netvision.net.il>
  9.  *                and Andre Hedrick <andre@linux-ide.org>
  10.  *
  11.  * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c.
  12.  *
  13.  * Version 1.00 move disk only code from ide.c to ide-disk.c
  14.  * support optional byte-swapping of all data
  15.  * Version 1.01 fix previous byte-swapping code
  16.  * Version 1.02 remove ", LBA" from drive identification msgs
  17.  * Version 1.03 fix display of id->buf_size for big-endian
  18.  * Version 1.04 add /proc configurable settings and S.M.A.R.T support
  19.  * Version 1.05 add capacity support for ATA3 >= 8GB
  20.  * Version 1.06 get boot-up messages to show full cyl count
  21.  * Version 1.07 disable door-locking if it fails
  22.  * Version 1.08 fixed CHS/LBA translations for ATA4 > 8GB,
  23.  * process of adding new ATA4 compliance.
  24.  * fixed problems in allowing fdisk to see
  25.  * the entire disk.
  26.  * Version 1.09 added increment of rq->sector in ide_multwrite
  27.  * added UDMA 3/4 reporting
  28.  * Version 1.10 request queue changes, Ultra DMA 100
  29.  * Version 1.11 added 48-bit lba
  30.  * Version 1.12 adding taskfile io access method
  31.  * Highmem I/O support, Jens Axboe <axboe@suse.de>
  32.  */
  33. #define IDEDISK_VERSION "1.12"
  34. #undef REALLY_SLOW_IO /* most systems can safely undef this */
  35. #include <linux/config.h>
  36. #include <linux/module.h>
  37. #include <linux/types.h>
  38. #include <linux/string.h>
  39. #include <linux/kernel.h>
  40. #include <linux/timer.h>
  41. #include <linux/mm.h>
  42. #include <linux/interrupt.h>
  43. #include <linux/major.h>
  44. #include <linux/errno.h>
  45. #include <linux/genhd.h>
  46. #include <linux/slab.h>
  47. #include <linux/delay.h>
  48. #include <linux/ide.h>
  49. #include <asm/byteorder.h>
  50. #include <asm/irq.h>
  51. #include <asm/uaccess.h>
  52. #include <asm/io.h>
  53. #ifdef CONFIG_BLK_DEV_PDC4030
  54. #define IS_PDC4030_DRIVE (HWIF(drive)->chipset == ide_pdc4030)
  55. #else
  56. #define IS_PDC4030_DRIVE (0) /* auto-NULLs out pdc4030 code */
  57. #endif
  58. #ifdef CONFIG_IDE_TASKFILE_IO
  59. #  undef __TASKFILE__IO /* define __TASKFILE__IO */
  60. #else /* CONFIG_IDE_TASKFILE_IO */
  61. #  undef __TASKFILE__IO
  62. #endif /* CONFIG_IDE_TASKFILE_IO */
  63. #ifndef __TASKFILE__IO
  64. static void idedisk_bswap_data (void *buffer, int wcount)
  65. {
  66. u16 *p = buffer;
  67. while (wcount--) {
  68. *p = *p << 8 | *p >> 8; p++;
  69. *p = *p << 8 | *p >> 8; p++;
  70. }
  71. }
  72. static inline void idedisk_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
  73. {
  74. ide_input_data(drive, buffer, wcount);
  75. if (drive->bswap)
  76. idedisk_bswap_data(buffer, wcount);
  77. }
  78. static inline void idedisk_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
  79. {
  80. if (drive->bswap) {
  81. idedisk_bswap_data(buffer, wcount);
  82. ide_output_data(drive, buffer, wcount);
  83. idedisk_bswap_data(buffer, wcount);
  84. } else
  85. ide_output_data(drive, buffer, wcount);
  86. }
  87. #endif /* __TASKFILE__IO */
  88. /*
  89.  * lba_capacity_is_ok() performs a sanity check on the claimed "lba_capacity"
  90.  * value for this drive (from its reported identification information).
  91.  *
  92.  * Returns: 1 if lba_capacity looks sensible
  93.  * 0 otherwise
  94.  *
  95.  * It is called only once for each drive.
  96.  */
  97. static int lba_capacity_is_ok (struct hd_driveid *id)
  98. {
  99. unsigned long lba_sects, chs_sects, head, tail;
  100. if ((id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400)) {
  101. printk("48-bit Drive: %llu n", id->lba_capacity_2);
  102. return 1;
  103. }
  104. /*
  105.  * The ATA spec tells large drives to return
  106.  * C/H/S = 16383/16/63 independent of their size.
  107.  * Some drives can be jumpered to use 15 heads instead of 16.
  108.  * Some drives can be jumpered to use 4092 cyls instead of 16383.
  109.  */
  110. if ((id->cyls == 16383
  111.      || (id->cyls == 4092 && id->cur_cyls == 16383)) &&
  112.     id->sectors == 63 &&
  113.     (id->heads == 15 || id->heads == 16) &&
  114.     id->lba_capacity >= 16383*63*id->heads)
  115. return 1;
  116. lba_sects   = id->lba_capacity;
  117. chs_sects   = id->cyls * id->heads * id->sectors;
  118. /* perform a rough sanity check on lba_sects:  within 10% is OK */
  119. if ((lba_sects - chs_sects) < chs_sects/10)
  120. return 1;
  121. /* some drives have the word order reversed */
  122. head = ((lba_sects >> 16) & 0xffff);
  123. tail = (lba_sects & 0xffff);
  124. lba_sects = (head | (tail << 16));
  125. if ((lba_sects - chs_sects) < chs_sects/10) {
  126. id->lba_capacity = lba_sects;
  127. return 1; /* lba_capacity is (now) good */
  128. }
  129. return 0; /* lba_capacity value may be bad */
  130. }
  131. #ifndef __TASKFILE__IO
  132. /*
  133.  * read_intr() is the handler for disk read/multread interrupts
  134.  */
  135. static ide_startstop_t read_intr (ide_drive_t *drive)
  136. {
  137. byte stat;
  138. int i;
  139. unsigned int msect, nsect;
  140. unsigned long flags;
  141. struct request *rq;
  142. char *to;
  143. /* new way for dealing with premature shared PCI interrupts */
  144. if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
  145. if (stat & (ERR_STAT|DRQ_STAT)) {
  146. return ide_error(drive, "read_intr", stat);
  147. }
  148. /* no data yet, so wait for another interrupt */
  149. ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
  150. return ide_started;
  151. }
  152. msect = drive->mult_count;
  153. read_next:
  154. rq = HWGROUP(drive)->rq;
  155. if (msect) {
  156. if ((nsect = rq->current_nr_sectors) > msect)
  157. nsect = msect;
  158. msect -= nsect;
  159. } else
  160. nsect = 1;
  161. to = ide_map_buffer(rq, &flags);
  162. idedisk_input_data(drive, to, nsect * SECTOR_WORDS);
  163. #ifdef DEBUG
  164. printk("%s:  read: sectors(%ld-%ld), buffer=0x%08lx, remaining=%ldn",
  165. drive->name, rq->sector, rq->sector+nsect-1,
  166. (unsigned long) rq->buffer+(nsect<<9), rq->nr_sectors-nsect);
  167. #endif
  168. ide_unmap_buffer(to, &flags);
  169. rq->sector += nsect;
  170. rq->errors = 0;
  171. i = (rq->nr_sectors -= nsect);
  172. if (((long)(rq->current_nr_sectors -= nsect)) <= 0)
  173. ide_end_request(1, HWGROUP(drive));
  174. if (i > 0) {
  175. if (msect)
  176. goto read_next;
  177. ide_set_handler (drive, &read_intr, WAIT_CMD, NULL);
  178.                 return ide_started;
  179. }
  180.         return ide_stopped;
  181. }
  182. /*
  183.  * write_intr() is the handler for disk write interrupts
  184.  */
  185. static ide_startstop_t write_intr (ide_drive_t *drive)
  186. {
  187. byte stat;
  188. int i;
  189. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  190. struct request *rq = hwgroup->rq;
  191. if (!OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
  192. printk("%s: write_intr error1: nr_sectors=%ld, stat=0x%02xn", drive->name, rq->nr_sectors, stat);
  193.         } else {
  194. #ifdef DEBUG
  195. printk("%s: write: sector %ld, buffer=0x%08lx, remaining=%ldn",
  196. drive->name, rq->sector, (unsigned long) rq->buffer,
  197. rq->nr_sectors-1);
  198. #endif
  199. if ((rq->nr_sectors == 1) ^ ((stat & DRQ_STAT) != 0)) {
  200. rq->sector++;
  201. rq->errors = 0;
  202. i = --rq->nr_sectors;
  203. --rq->current_nr_sectors;
  204. if (((long)rq->current_nr_sectors) <= 0)
  205. ide_end_request(1, hwgroup);
  206. if (i > 0) {
  207. unsigned long flags;
  208. char *to = ide_map_buffer(rq, &flags);
  209. idedisk_output_data (drive, to, SECTOR_WORDS);
  210. ide_unmap_buffer(to, &flags);
  211. ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
  212.                                 return ide_started;
  213. }
  214.                         return ide_stopped;
  215. }
  216. return ide_stopped; /* the original code did this here (?) */
  217. }
  218. return ide_error(drive, "write_intr", stat);
  219. }
  220. /*
  221.  * ide_multwrite() transfers a block of up to mcount sectors of data
  222.  * to a drive as part of a disk multiple-sector write operation.
  223.  *
  224.  * Returns 0 on success.
  225.  *
  226.  * Note that we may be called from two contexts - the do_rw_disk context
  227.  * and IRQ context. The IRQ can happen any time after we've output the
  228.  * full "mcount" number of sectors, so we must make sure we update the
  229.  * state _before_ we output the final part of the data!
  230.  */
  231. int ide_multwrite (ide_drive_t *drive, unsigned int mcount)
  232. {
  233.   ide_hwgroup_t *hwgroup= HWGROUP(drive);
  234.   struct request *rq = &hwgroup->wrq;
  235.  
  236.    do {
  237.    char *buffer;
  238.    int nsect = rq->current_nr_sectors;
  239. unsigned long flags;
  240. if (nsect > mcount)
  241. nsect = mcount;
  242. mcount -= nsect;
  243. buffer = ide_map_buffer(rq, &flags);
  244. rq->sector += nsect;
  245. rq->nr_sectors -= nsect;
  246. rq->current_nr_sectors -= nsect;
  247. /* Do we move to the next bh after this? */
  248. if (!rq->current_nr_sectors) {
  249. struct buffer_head *bh = rq->bh->b_reqnext;
  250. /* end early early we ran out of requests */
  251. if (!bh) {
  252. mcount = 0;
  253. } else {
  254. rq->bh = bh;
  255. rq->current_nr_sectors = bh->b_size >> 9;
  256. rq->hard_cur_sectors = rq->current_nr_sectors;
  257. }
  258. }
  259. /*
  260.  * Ok, we're all setup for the interrupt
  261.  * re-entering us on the last transfer.
  262.  */
  263. idedisk_output_data(drive, buffer, nsect<<7);
  264. ide_unmap_buffer(buffer, &flags);
  265. } while (mcount);
  266.         return 0;
  267. }
  268. /*
  269.  * multwrite_intr() is the handler for disk multwrite interrupts
  270.  */
  271. static ide_startstop_t multwrite_intr (ide_drive_t *drive)
  272. {
  273. byte stat;
  274. int i;
  275. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  276. struct request *rq = &hwgroup->wrq;
  277. if (OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
  278. if (stat & DRQ_STAT) {
  279. /*
  280.  * The drive wants data. Remember rq is the copy
  281.  * of the request
  282.  */
  283. if (rq->nr_sectors) {
  284. if (ide_multwrite(drive, drive->mult_count))
  285. return ide_stopped;
  286. ide_set_handler (drive, &multwrite_intr, WAIT_CMD, NULL);
  287. return ide_started;
  288. }
  289. } else {
  290. /*
  291.  * If the copy has all the blocks completed then
  292.  * we can end the original request.
  293.  */
  294. if (!rq->nr_sectors) { /* all done? */
  295. rq = hwgroup->rq;
  296. for (i = rq->nr_sectors; i > 0;){
  297. i -= rq->current_nr_sectors;
  298. ide_end_request(1, hwgroup);
  299. }
  300. return ide_stopped;
  301. }
  302. }
  303. return ide_stopped; /* the original code did this here (?) */
  304. }
  305. return ide_error(drive, "multwrite_intr", stat);
  306. }
  307. #endif /* __TASKFILE__IO */
  308. #ifdef __TASKFILE__IO
  309. static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);
  310. static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);
  311. static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long long block);
  312. /*
  313.  * do_rw_disk() issues READ and WRITE commands to a disk,
  314.  * using LBA if supported, or CHS otherwise, to address sectors.
  315.  * It also takes care of issuing special DRIVE_CMDs.
  316.  */
  317. static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
  318. {
  319. if (rq->cmd == READ)
  320. goto good_command;
  321. if (rq->cmd == WRITE)
  322. goto good_command;
  323. printk(KERN_ERR "%s: bad command: %dn", drive->name, rq->cmd);
  324. ide_end_request(0, HWGROUP(drive));
  325. return ide_stopped;
  326. good_command:
  327. #ifdef CONFIG_BLK_DEV_PDC4030
  328. if (IS_PDC4030_DRIVE) {
  329. extern ide_startstop_t promise_rw_disk(ide_drive_t *, struct request *, unsigned long);
  330. return promise_rw_disk(drive, rq, block);
  331. }
  332. #endif /* CONFIG_BLK_DEV_PDC4030 */
  333. if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) /* 48-bit LBA */
  334. return lba_48_rw_disk(drive, rq, (unsigned long long) block);
  335. if (drive->select.b.lba) /* 28-bit LBA */
  336. return lba_28_rw_disk(drive, rq, (unsigned long) block);
  337. /* 28-bit CHS : DIE DIE DIE piece of legacy crap!!! */
  338. return chs_rw_disk(drive, rq, (unsigned long) block);
  339. }
  340. static task_ioreg_t get_command (ide_drive_t *drive, int cmd)
  341. {
  342. int lba48bit = (drive->id->cfs_enable_2 & 0x0400) ? 1 : 0;
  343. #if 1
  344. lba48bit = drive->addressing;
  345. #endif
  346. if ((cmd == READ) && (drive->using_dma))
  347. return (lba48bit) ? WIN_READDMA_EXT : WIN_READDMA;
  348. else if ((cmd == READ) && (drive->mult_count))
  349. return (lba48bit) ? WIN_MULTREAD_EXT : WIN_MULTREAD;
  350. else if (cmd == READ)
  351. return (lba48bit) ? WIN_READ_EXT : WIN_READ;
  352. else if ((cmd == WRITE) && (drive->using_dma))
  353. return (lba48bit) ? WIN_WRITEDMA_EXT : WIN_WRITEDMA;
  354. else if ((cmd == WRITE) && (drive->mult_count))
  355. return (lba48bit) ? WIN_MULTWRITE_EXT : WIN_MULTWRITE;
  356. else if (cmd == WRITE)
  357. return (lba48bit) ? WIN_WRITE_EXT : WIN_WRITE;
  358. else
  359. return WIN_NOP;
  360. }
  361. static ide_startstop_t chs_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
  362. {
  363. struct hd_drive_task_hdr taskfile;
  364. struct hd_drive_hob_hdr hobfile;
  365. ide_task_t args;
  366. task_ioreg_t command = get_command(drive, rq->cmd);
  367. unsigned int track = (block / drive->sect);
  368. unsigned int sect = (block % drive->sect) + 1;
  369. unsigned int head = (track % drive->head);
  370. unsigned int cyl = (track / drive->head);
  371. memset(&taskfile, 0, sizeof(task_struct_t));
  372. memset(&hobfile, 0, sizeof(hob_struct_t));
  373. taskfile.sector_count = (rq->nr_sectors==256)?0x00:rq->nr_sectors;
  374. taskfile.sector_number = sect;
  375. taskfile.low_cylinder = cyl;
  376. taskfile.high_cylinder = (cyl>>8);
  377. taskfile.device_head = head;
  378. taskfile.device_head |= drive->select.all;
  379. taskfile.command = command;
  380. #ifdef DEBUG
  381. printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
  382. if (lba) printk("LBAsect=%lld, ", block);
  383. else printk("CHS=%d/%d/%d, ", cyl, head, sect);
  384. printk("sectors=%ld, ", rq->nr_sectors);
  385. printk("buffer=0x%08lxn", (unsigned long) rq->buffer);
  386. #endif
  387. memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
  388. memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
  389. args.command_type = ide_cmd_type_parser(&args);
  390. args.prehandler = ide_pre_handler_parser(&taskfile, &hobfile);
  391. args.handler = ide_handler_parser(&taskfile, &hobfile);
  392. args.posthandler = NULL;
  393. args.rq = (struct request *) rq;
  394. args.block = block;
  395. rq->special = NULL;
  396. rq->special = (ide_task_t *)&args;
  397. return do_rw_taskfile(drive, &args);
  398. }
  399. static ide_startstop_t lba_28_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
  400. {
  401. struct hd_drive_task_hdr taskfile;
  402. struct hd_drive_hob_hdr hobfile;
  403. ide_task_t args;
  404. task_ioreg_t command = get_command(drive, rq->cmd);
  405. memset(&taskfile, 0, sizeof(task_struct_t));
  406. memset(&hobfile, 0, sizeof(hob_struct_t));
  407. taskfile.sector_count = (rq->nr_sectors==256)?0x00:rq->nr_sectors;
  408. taskfile.sector_number = block;
  409. taskfile.low_cylinder = (block>>=8);
  410. taskfile.high_cylinder = (block>>=8);
  411. taskfile.device_head = ((block>>8)&0x0f);
  412. taskfile.device_head |= drive->select.all;
  413. taskfile.command = command;
  414. #ifdef DEBUG
  415. printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
  416. if (lba) printk("LBAsect=%lld, ", block);
  417. else printk("CHS=%d/%d/%d, ", cyl, head, sect);
  418. printk("sectors=%ld, ", rq->nr_sectors);
  419. printk("buffer=0x%08lxn", (unsigned long) rq->buffer);
  420. #endif
  421. memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
  422. memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
  423. args.command_type = ide_cmd_type_parser(&args);
  424. args.prehandler = ide_pre_handler_parser(&taskfile, &hobfile);
  425. args.handler = ide_handler_parser(&taskfile, &hobfile);
  426. args.posthandler = NULL;
  427. args.rq = (struct request *) rq;
  428. args.block = block;
  429. rq->special = NULL;
  430. rq->special = (ide_task_t *)&args;
  431. return do_rw_taskfile(drive, &args);
  432. }
  433. /*
  434.  * 268435455  == 137439 MB or 28bit limit
  435.  * 320173056  == 163929 MB or 48bit addressing
  436.  * 1073741822 == 549756 MB or 48bit addressing fake drive
  437.  */
  438. static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long long block)
  439. {
  440. struct hd_drive_task_hdr taskfile;
  441. struct hd_drive_hob_hdr hobfile;
  442. ide_task_t args;
  443. task_ioreg_t command = get_command(drive, rq->cmd);
  444. memset(&taskfile, 0, sizeof(task_struct_t));
  445. memset(&hobfile, 0, sizeof(hob_struct_t));
  446. taskfile.sector_count = rq->nr_sectors;
  447. hobfile.sector_count = (rq->nr_sectors>>8);
  448. if (rq->nr_sectors == 65536) {
  449. taskfile.sector_count = 0x00;
  450. hobfile.sector_count = 0x00;
  451. }
  452. taskfile.sector_number = block; /* low lba */
  453. taskfile.low_cylinder = (block>>=8); /* mid lba */
  454. taskfile.high_cylinder = (block>>=8); /* hi  lba */
  455. hobfile.sector_number = (block>>=8); /* low lba */
  456. hobfile.low_cylinder = (block>>=8); /* mid lba */
  457. hobfile.high_cylinder = (block>>=8); /* hi  lba */
  458. taskfile.device_head = drive->select.all;
  459. hobfile.device_head = taskfile.device_head;
  460. hobfile.control = (drive->ctl|0x80);
  461. taskfile.command = command;
  462. #ifdef DEBUG
  463. printk("%s: %sing: ", drive->name, (rq->cmd==READ) ? "read" : "writ");
  464. if (lba) printk("LBAsect=%lld, ", block);
  465. else printk("CHS=%d/%d/%d, ", cyl, head, sect);
  466. printk("sectors=%ld, ", rq->nr_sectors);
  467. printk("buffer=0x%08lxn", (unsigned long) rq->buffer);
  468. #endif
  469. memcpy(args.tfRegister, &taskfile, sizeof(struct hd_drive_task_hdr));
  470. memcpy(args.hobRegister, &hobfile, sizeof(struct hd_drive_hob_hdr));
  471. args.command_type = ide_cmd_type_parser(&args);
  472. args.prehandler = ide_pre_handler_parser(&taskfile, &hobfile);
  473. args.handler = ide_handler_parser(&taskfile, &hobfile);
  474. args.posthandler = NULL;
  475. args.rq = (struct request *) rq;
  476. args.block = block;
  477. rq->special = NULL;
  478. rq->special = (ide_task_t *)&args;
  479. return do_rw_taskfile(drive, &args);
  480. }
  481. #else /* !__TASKFILE__IO */
  482. /*
  483.  * do_rw_disk() issues READ and WRITE commands to a disk,
  484.  * using LBA if supported, or CHS otherwise, to address sectors.
  485.  * It also takes care of issuing special DRIVE_CMDs.
  486.  */
  487. static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
  488. {
  489. if (IDE_CONTROL_REG)
  490. OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
  491. #ifdef CONFIG_BLK_DEV_PDC4030
  492. if (drive->select.b.lba || IS_PDC4030_DRIVE) {
  493. #else /* !CONFIG_BLK_DEV_PDC4030 */
  494. if (drive->select.b.lba) {
  495. #endif /* CONFIG_BLK_DEV_PDC4030 */
  496. if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
  497. task_ioreg_t tasklets[10];
  498. tasklets[0] = 0;
  499. tasklets[1] = 0;
  500. tasklets[2] = rq->nr_sectors;
  501. tasklets[3] = (rq->nr_sectors>>8);
  502. if (rq->nr_sectors == 65536) {
  503. tasklets[2] = 0x00;
  504. tasklets[3] = 0x00;
  505. }
  506. tasklets[4] = (task_ioreg_t) block;
  507. tasklets[5] = (task_ioreg_t) (block>>8);
  508. tasklets[6] = (task_ioreg_t) (block>>16);
  509. tasklets[7] = (task_ioreg_t) (block>>24);
  510. tasklets[8] = (task_ioreg_t) 0;
  511. tasklets[9] = (task_ioreg_t) 0;
  512. // tasklets[8] = (task_ioreg_t) (block>>32);
  513. // tasklets[9] = (task_ioreg_t) (block>>40);
  514. #ifdef DEBUG
  515. printk("%s: %sing: LBAsect=%lu, sectors=%ld, buffer=0x%08lx, LBAsect=0x%012lxn",
  516. drive->name,
  517. (rq->cmd==READ)?"read":"writ",
  518. block,
  519. rq->nr_sectors,
  520. (unsigned long) rq->buffer,
  521. block);
  522. printk("%s: 0x%02x%02x 0x%02x%02x%02x%02x%02x%02xn",
  523. drive->name, tasklets[3], tasklets[2],
  524. tasklets[9], tasklets[8], tasklets[7],
  525. tasklets[6], tasklets[5], tasklets[4]);
  526. #endif
  527. OUT_BYTE(tasklets[1], IDE_FEATURE_REG);
  528. OUT_BYTE(tasklets[3], IDE_NSECTOR_REG);
  529. OUT_BYTE(tasklets[7], IDE_SECTOR_REG);
  530. OUT_BYTE(tasklets[8], IDE_LCYL_REG);
  531. OUT_BYTE(tasklets[9], IDE_HCYL_REG);
  532. OUT_BYTE(tasklets[0], IDE_FEATURE_REG);
  533. OUT_BYTE(tasklets[2], IDE_NSECTOR_REG);
  534. OUT_BYTE(tasklets[4], IDE_SECTOR_REG);
  535. OUT_BYTE(tasklets[5], IDE_LCYL_REG);
  536. OUT_BYTE(tasklets[6], IDE_HCYL_REG);
  537. OUT_BYTE(0x00|drive->select.all,IDE_SELECT_REG);
  538. } else {
  539. #ifdef DEBUG
  540. printk("%s: %sing: LBAsect=%ld, sectors=%ld, buffer=0x%08lxn",
  541. drive->name, (rq->cmd==READ)?"read":"writ",
  542. block, rq->nr_sectors, (unsigned long) rq->buffer);
  543. #endif
  544. OUT_BYTE(0x00, IDE_FEATURE_REG);
  545. OUT_BYTE((rq->nr_sectors==256)?0x00:rq->nr_sectors,IDE_NSECTOR_REG);
  546. OUT_BYTE(block,IDE_SECTOR_REG);
  547. OUT_BYTE(block>>=8,IDE_LCYL_REG);
  548. OUT_BYTE(block>>=8,IDE_HCYL_REG);
  549. OUT_BYTE(((block>>8)&0x0f)|drive->select.all,IDE_SELECT_REG);
  550. }
  551. } else {
  552. unsigned int sect,head,cyl,track;
  553. track = block / drive->sect;
  554. sect  = block % drive->sect + 1;
  555. OUT_BYTE(sect,IDE_SECTOR_REG);
  556. head  = track % drive->head;
  557. cyl   = track / drive->head;
  558. OUT_BYTE(0x00, IDE_FEATURE_REG);
  559. OUT_BYTE((rq->nr_sectors==256)?0x00:rq->nr_sectors,IDE_NSECTOR_REG);
  560. OUT_BYTE(cyl,IDE_LCYL_REG);
  561. OUT_BYTE(cyl>>8,IDE_HCYL_REG);
  562. OUT_BYTE(head|drive->select.all,IDE_SELECT_REG);
  563. #ifdef DEBUG
  564. printk("%s: %sing: CHS=%d/%d/%d, sectors=%ld, buffer=0x%08lxn",
  565. drive->name, (rq->cmd==READ)?"read":"writ", cyl,
  566. head, sect, rq->nr_sectors, (unsigned long) rq->buffer);
  567. #endif
  568. }
  569. #ifdef CONFIG_BLK_DEV_PDC4030
  570. if (IS_PDC4030_DRIVE) {
  571. extern ide_startstop_t do_pdc4030_io(ide_drive_t *, struct request *);
  572. return do_pdc4030_io (drive, rq);
  573. }
  574. #endif /* CONFIG_BLK_DEV_PDC4030 */
  575. if (rq->cmd == READ) {
  576. #ifdef CONFIG_BLK_DEV_IDEDMA
  577. if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive)))
  578. return ide_started;
  579. #endif /* CONFIG_BLK_DEV_IDEDMA */
  580. ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);
  581. if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
  582. OUT_BYTE(drive->mult_count ? WIN_MULTREAD_EXT : WIN_READ_EXT, IDE_COMMAND_REG);
  583. } else {
  584. OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, IDE_COMMAND_REG);
  585. }
  586. return ide_started;
  587. }
  588. if (rq->cmd == WRITE) {
  589. ide_startstop_t startstop;
  590. #ifdef CONFIG_BLK_DEV_IDEDMA
  591. if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_write, drive)))
  592. return ide_started;
  593. #endif /* CONFIG_BLK_DEV_IDEDMA */
  594. if ((drive->id->cfs_enable_2 & 0x0400) && (drive->addressing)) {
  595. OUT_BYTE(drive->mult_count ? WIN_MULTWRITE_EXT : WIN_WRITE_EXT, IDE_COMMAND_REG);
  596. } else {
  597. OUT_BYTE(drive->mult_count ? WIN_MULTWRITE : WIN_WRITE, IDE_COMMAND_REG);
  598. }
  599. if (ide_wait_stat(&startstop, drive, DATA_READY, drive->bad_wstat, WAIT_DRQ)) {
  600. printk(KERN_ERR "%s: no DRQ after issuing %sn", drive->name,
  601. drive->mult_count ? "MULTWRITE" : "WRITE");
  602. return startstop;
  603. }
  604. if (!drive->unmask)
  605. __cli(); /* local CPU only */
  606. if (drive->mult_count) {
  607. ide_hwgroup_t *hwgroup = HWGROUP(drive);
  608. /*
  609.  * Ugh.. this part looks ugly because we MUST set up
  610.  * the interrupt handler before outputting the first block
  611.  * of data to be written.  If we hit an error (corrupted buffer list)
  612.  * in ide_multwrite(), then we need to remove the handler/timer
  613.  * before returning.  Fortunately, this NEVER happens (right?).
  614.  *
  615.  * Except when you get an error it seems...
  616.  */
  617. hwgroup->wrq = *rq; /* scratchpad */
  618. ide_set_handler(drive, &multwrite_intr, WAIT_CMD, NULL);
  619. if (ide_multwrite(drive, drive->mult_count)) {
  620. unsigned long flags;
  621. spin_lock_irqsave(&io_request_lock, flags);
  622. hwgroup->handler = NULL;
  623. del_timer(&hwgroup->timer);
  624. spin_unlock_irqrestore(&io_request_lock, flags);
  625. return ide_stopped;
  626. }
  627. } else {
  628. unsigned long flags;
  629. char *buffer = ide_map_buffer(rq, &flags);
  630. ide_set_handler (drive, &write_intr, WAIT_CMD, NULL);
  631. idedisk_output_data(drive, buffer, SECTOR_WORDS);
  632. ide_unmap_buffer(buffer, &flags);
  633. }
  634. return ide_started;
  635. }
  636. printk(KERN_ERR "%s: bad command: %dn", drive->name, rq->cmd);
  637. ide_end_request(0, HWGROUP(drive));
  638. return ide_stopped;
  639. }
  640. #endif /* __TASKFILE__IO */
  641. static int idedisk_open (struct inode *inode, struct file *filp, ide_drive_t *drive)
  642. {
  643. MOD_INC_USE_COUNT;
  644. if (drive->removable && drive->usage == 1) {
  645. struct hd_drive_task_hdr taskfile;
  646. struct hd_drive_hob_hdr hobfile;
  647. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  648. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  649. taskfile.command = WIN_DOORLOCK;
  650. check_disk_change(inode->i_rdev);
  651. /*
  652.  * Ignore the return code from door_lock,
  653.  * since the open() has already succeeded,
  654.  * and the door_lock is irrelevant at this point.
  655.  */
  656. if (drive->doorlocking && ide_wait_taskfile(drive, &taskfile, &hobfile, NULL))
  657. drive->doorlocking = 0;
  658. }
  659. return 0;
  660. }
  661. static int do_idedisk_flushcache(ide_drive_t *drive);
  662. static void idedisk_release (struct inode *inode, struct file *filp, ide_drive_t *drive)
  663. {
  664. if (drive->removable && !drive->usage) {
  665. struct hd_drive_task_hdr taskfile;
  666. struct hd_drive_hob_hdr hobfile;
  667. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  668. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  669. taskfile.command = WIN_DOORUNLOCK;
  670. invalidate_bdev(inode->i_bdev, 0);
  671. if (drive->doorlocking && ide_wait_taskfile(drive, &taskfile, &hobfile, NULL))
  672. drive->doorlocking = 0;
  673. }
  674. if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
  675. if (do_idedisk_flushcache(drive))
  676. printk (KERN_INFO "%s: Write Cache FAILED Flushing!n",
  677. drive->name);
  678. MOD_DEC_USE_COUNT;
  679. }
  680. static int idedisk_media_change (ide_drive_t *drive)
  681. {
  682. return drive->removable; /* if removable, always assume it was changed */
  683. }
  684. static void idedisk_revalidate (ide_drive_t *drive)
  685. {
  686. grok_partitions(HWIF(drive)->gd, drive->select.b.unit,
  687. 1<<PARTN_BITS,
  688. current_capacity(drive));
  689. }
  690. /*
  691.  * Queries for true maximum capacity of the drive.
  692.  * Returns maximum LBA address (> 0) of the drive, 0 if failed.
  693.  */
  694. static unsigned long idedisk_read_native_max_address(ide_drive_t *drive)
  695. {
  696. ide_task_t args;
  697. unsigned long addr = 0;
  698. if (!(drive->id->command_set_1 & 0x0400) &&
  699.     !(drive->id->cfs_enable_2 & 0x0100))
  700. return addr;
  701. /* Create IDE/ATA command request structure */
  702. memset(&args, 0, sizeof(ide_task_t));
  703. args.tfRegister[IDE_SELECT_OFFSET] = 0x40;
  704. args.tfRegister[IDE_COMMAND_OFFSET] = WIN_READ_NATIVE_MAX;
  705. args.handler = task_no_data_intr;
  706. /* submit command request */
  707. ide_raw_taskfile(drive, &args, NULL);
  708. /* if OK, compute maximum address value */
  709. if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
  710. addr = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24)
  711.      | ((args.tfRegister[  IDE_HCYL_OFFSET]       ) << 16)
  712.      | ((args.tfRegister[  IDE_LCYL_OFFSET]       ) <<  8)
  713.      | ((args.tfRegister[IDE_SECTOR_OFFSET]       ));
  714. }
  715. addr++; /* since the return value is (maxlba - 1), we add 1 */
  716. return addr;
  717. }
  718. static unsigned long long idedisk_read_native_max_address_ext(ide_drive_t *drive)
  719. {
  720. ide_task_t args;
  721. unsigned long long addr = 0;
  722. /* Create IDE/ATA command request structure */
  723. memset(&args, 0, sizeof(ide_task_t));
  724. args.tfRegister[IDE_SELECT_OFFSET] = 0x40;
  725. args.tfRegister[IDE_COMMAND_OFFSET] = WIN_READ_NATIVE_MAX_EXT;
  726. args.handler = task_no_data_intr;
  727.         /* submit command request */
  728.         ide_raw_taskfile(drive, &args, NULL);
  729. /* if OK, compute maximum address value */
  730. if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
  731. u32 high = ((args.hobRegister[IDE_HCYL_OFFSET_HOB])<<16) |
  732.    ((args.hobRegister[IDE_LCYL_OFFSET_HOB])<<8) |
  733.        (args.hobRegister[IDE_SECTOR_OFFSET_HOB]); 
  734. u32 low  = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) |
  735.    ((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
  736.     (args.tfRegister[IDE_SECTOR_OFFSET]);
  737. addr = ((__u64)high << 24) | low;
  738. }
  739. addr++; /* since the return value is (maxlba - 1), we add 1 */
  740. return addr;
  741. }
  742. #ifdef CONFIG_IDEDISK_STROKE
  743. /*
  744.  * Sets maximum virtual LBA address of the drive.
  745.  * Returns new maximum virtual LBA address (> 0) or 0 on failure.
  746.  */
  747. static unsigned long idedisk_set_max_address(ide_drive_t *drive, unsigned long addr_req)
  748. {
  749. ide_task_t args;
  750. unsigned long addr_set = 0;
  751. addr_req--;
  752. /* Create IDE/ATA command request structure */
  753. memset(&args, 0, sizeof(ide_task_t));
  754. args.tfRegister[IDE_SECTOR_OFFSET] = ((addr_req >>  0) & 0xff);
  755. args.tfRegister[IDE_LCYL_OFFSET] = ((addr_req >>  8) & 0xff);
  756. args.tfRegister[IDE_HCYL_OFFSET] = ((addr_req >> 16) & 0xff);
  757. args.tfRegister[IDE_SELECT_OFFSET] = ((addr_req >> 24) & 0x0f) | 0x40;
  758. args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SET_MAX;
  759. args.handler = task_no_data_intr;
  760. /* submit command request */
  761. ide_raw_taskfile(drive, &args, NULL);
  762. /* if OK, read new maximum address value */
  763. if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
  764. addr_set = ((args.tfRegister[IDE_SELECT_OFFSET] & 0x0f) << 24)
  765.  | ((args.tfRegister[  IDE_HCYL_OFFSET]       ) << 16)
  766.  | ((args.tfRegister[  IDE_LCYL_OFFSET]       ) <<  8)
  767.  | ((args.tfRegister[IDE_SECTOR_OFFSET]       ));
  768. }
  769. addr_set++;
  770. return addr_set;
  771. }
  772. static unsigned long long idedisk_set_max_address_ext(ide_drive_t *drive, unsigned long long addr_req)
  773. {
  774. ide_task_t args;
  775. unsigned long long addr_set = 0;
  776. addr_req--;
  777. /* Create IDE/ATA command request structure */
  778. memset(&args, 0, sizeof(ide_task_t));
  779. args.tfRegister[IDE_SECTOR_OFFSET] = ((addr_req >>  0) & 0xff);
  780. args.tfRegister[IDE_LCYL_OFFSET] = ((addr_req >>= 8) & 0xff);
  781. args.tfRegister[IDE_HCYL_OFFSET] = ((addr_req >>= 8) & 0xff);
  782. args.tfRegister[IDE_SELECT_OFFSET]      = 0x40;
  783. args.tfRegister[IDE_COMMAND_OFFSET] = WIN_SET_MAX_EXT;
  784. args.hobRegister[IDE_SECTOR_OFFSET_HOB] = ((addr_req >>= 8) & 0xff);
  785. args.hobRegister[IDE_LCYL_OFFSET_HOB] = ((addr_req >>= 8) & 0xff);
  786. args.hobRegister[IDE_HCYL_OFFSET_HOB] = ((addr_req >>= 8) & 0xff);
  787. args.hobRegister[IDE_SELECT_OFFSET_HOB] = 0x40;
  788. args.hobRegister[IDE_CONTROL_OFFSET_HOB]= (drive->ctl|0x80);
  789.         args.handler = task_no_data_intr;
  790. /* submit command request */
  791. ide_raw_taskfile(drive, &args, NULL);
  792. /* if OK, compute maximum address value */
  793. if ((args.tfRegister[IDE_STATUS_OFFSET] & 0x01) == 0) {
  794. u32 high = ((args.hobRegister[IDE_HCYL_OFFSET_HOB])<<16) |
  795.    ((args.hobRegister[IDE_LCYL_OFFSET_HOB])<<8) |
  796.     (args.hobRegister[IDE_SECTOR_OFFSET_HOB]);
  797. u32 low  = ((args.tfRegister[IDE_HCYL_OFFSET])<<16) |
  798.    ((args.tfRegister[IDE_LCYL_OFFSET])<<8) |
  799.     (args.tfRegister[IDE_SECTOR_OFFSET]);
  800. addr_set = ((__u64)high << 24) | low;
  801. }
  802. return addr_set;
  803. }
  804. /*
  805.  * Tests if the drive supports Host Protected Area feature.
  806.  * Returns true if supported, false otherwise.
  807.  */
  808. static inline int idedisk_supports_host_protected_area(ide_drive_t *drive)
  809. {
  810. int flag = (drive->id->cfs_enable_1 & 0x0400) ? 1 : 0;
  811. printk("%s: host protected area => %dn", drive->name, flag);
  812. return flag;
  813. }
  814. #endif /* CONFIG_IDEDISK_STROKE */
  815. /*
  816.  * Compute drive->capacity, the full capacity of the drive
  817.  * Called with drive->id != NULL.
  818.  *
  819.  * To compute capacity, this uses either of
  820.  *
  821.  *    1. CHS value set by user       (whatever user sets will be trusted)
  822.  *    2. LBA value from target drive (require new ATA feature)
  823.  *    3. LBA value from system BIOS  (new one is OK, old one may break)
  824.  *    4. CHS value from system BIOS  (traditional style)
  825.  *
  826.  * in above order (i.e., if value of higher priority is available,
  827.  * reset will be ignored).
  828.  */
  829. static void init_idedisk_capacity (ide_drive_t  *drive)
  830. {
  831. struct hd_driveid *id = drive->id;
  832. unsigned long capacity = drive->cyl * drive->head * drive->sect;
  833. unsigned long set_max = idedisk_read_native_max_address(drive);
  834. unsigned long long capacity_2 = capacity;
  835. unsigned long long set_max_ext;
  836. drive->capacity48 = 0;
  837. drive->select.b.lba = 0;
  838. if (id->cfs_enable_2 & 0x0400) {
  839. capacity_2 = id->lba_capacity_2;
  840. drive->head = drive->bios_head = 255;
  841. drive->sect = drive->bios_sect = 63;
  842. drive->cyl = (unsigned int) capacity_2 / (drive->head * drive->sect);
  843. drive->select.b.lba = 1;
  844. set_max_ext = idedisk_read_native_max_address_ext(drive);
  845. if (set_max_ext > capacity_2) {
  846. #ifdef CONFIG_IDEDISK_STROKE
  847. set_max_ext = idedisk_read_native_max_address_ext(drive);
  848. set_max_ext = idedisk_set_max_address_ext(drive, set_max_ext);
  849. if (set_max_ext) {
  850. drive->capacity48 = capacity_2 = set_max_ext;
  851. drive->cyl = (unsigned int) set_max_ext / (drive->head * drive->sect);
  852. drive->select.b.lba = 1;
  853. drive->id->lba_capacity_2 = capacity_2;
  854.                         }
  855. #else /* !CONFIG_IDEDISK_STROKE */
  856. printk("%s: setmax_ext LBA %llu, native  %llun",
  857. drive->name, set_max_ext, capacity_2);
  858. #endif /* CONFIG_IDEDISK_STROKE */
  859. }
  860. drive->bios_cyl = drive->cyl;
  861. drive->capacity48 = capacity_2;
  862. drive->capacity = (unsigned long) capacity_2;
  863. return;
  864. /* Determine capacity, and use LBA if the drive properly supports it */
  865. } else if ((id->capability & 2) && lba_capacity_is_ok(id)) {
  866. capacity = id->lba_capacity;
  867. drive->cyl = capacity / (drive->head * drive->sect);
  868. drive->select.b.lba = 1;
  869. }
  870. if (set_max > capacity) {
  871. #ifdef CONFIG_IDEDISK_STROKE
  872. set_max = idedisk_read_native_max_address(drive);
  873. set_max = idedisk_set_max_address(drive, set_max);
  874. if (set_max) {
  875. drive->capacity = capacity = set_max;
  876. drive->cyl = set_max / (drive->head * drive->sect);
  877. drive->select.b.lba = 1;
  878. drive->id->lba_capacity = capacity;
  879. }
  880. #else /* !CONFIG_IDEDISK_STROKE */
  881. printk("%s: setmax LBA %lu, native  %lun",
  882. drive->name, set_max, capacity);
  883. #endif /* CONFIG_IDEDISK_STROKE */
  884. }
  885. drive->capacity = capacity;
  886. if ((id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400)) {
  887.                 drive->capacity48 = id->lba_capacity_2;
  888. drive->head = 255;
  889. drive->sect = 63;
  890. drive->cyl = (unsigned long)(drive->capacity48) / (drive->head * drive->sect);
  891. }
  892. }
  893. static unsigned long idedisk_capacity (ide_drive_t *drive)
  894. {
  895. if (drive->id->cfs_enable_2 & 0x0400)
  896. return (drive->capacity48 - drive->sect0);
  897. return (drive->capacity - drive->sect0);
  898. }
  899. static ide_startstop_t idedisk_special (ide_drive_t *drive)
  900. {
  901. special_t *s = &drive->special;
  902. if (s->b.set_geometry) {
  903. struct hd_drive_task_hdr taskfile;
  904. struct hd_drive_hob_hdr hobfile;
  905. ide_handler_t *handler = NULL;
  906. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  907. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  908. s->b.set_geometry = 0;
  909. taskfile.sector_number = drive->sect;
  910. taskfile.low_cylinder = drive->cyl;
  911. taskfile.high_cylinder = drive->cyl>>8;
  912. taskfile.device_head = ((drive->head-1)|drive->select.all)&0xBF;
  913. if (!IS_PDC4030_DRIVE) {
  914. taskfile.sector_count = drive->sect;
  915. taskfile.command = WIN_SPECIFY;
  916. handler = ide_handler_parser(&taskfile, &hobfile);
  917. }
  918. do_taskfile(drive, &taskfile, &hobfile, handler);
  919. } else if (s->b.recalibrate) {
  920. s->b.recalibrate = 0;
  921. if (!IS_PDC4030_DRIVE) {
  922. struct hd_drive_task_hdr taskfile;
  923. struct hd_drive_hob_hdr hobfile;
  924. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  925. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  926. taskfile.sector_count = drive->sect;
  927. taskfile.command = WIN_RESTORE;
  928. do_taskfile(drive, &taskfile, &hobfile, ide_handler_parser(&taskfile, &hobfile));
  929. }
  930. } else if (s->b.set_multmode) {
  931. s->b.set_multmode = 0;
  932. if (drive->id && drive->mult_req > drive->id->max_multsect)
  933. drive->mult_req = drive->id->max_multsect;
  934. if (!IS_PDC4030_DRIVE) {
  935. struct hd_drive_task_hdr taskfile;
  936. struct hd_drive_hob_hdr hobfile;
  937. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  938. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  939. taskfile.sector_count = drive->mult_req;
  940. taskfile.command = WIN_SETMULT;
  941. do_taskfile(drive, &taskfile, &hobfile, ide_handler_parser(&taskfile, &hobfile));
  942. }
  943. } else if (s->all) {
  944. int special = s->all;
  945. s->all = 0;
  946. printk(KERN_ERR "%s: bad special flag: 0x%02xn", drive->name, special);
  947. return ide_stopped;
  948. }
  949. return IS_PDC4030_DRIVE ? ide_stopped : ide_started;
  950. }
  951. static void idedisk_pre_reset (ide_drive_t *drive)
  952. {
  953. int legacy = (drive->id->cfs_enable_2 & 0x0400) ? 0 : 1;
  954. drive->special.all = 0;
  955. drive->special.b.set_geometry = legacy;
  956. drive->special.b.recalibrate  = legacy;
  957. if (OK_TO_RESET_CONTROLLER)
  958. drive->mult_count = 0;
  959. if (!drive->keep_settings && !drive->using_dma)
  960. drive->mult_req = 0;
  961. if (drive->mult_req != drive->mult_count)
  962. drive->special.b.set_multmode = 1;
  963. }
  964. #ifdef CONFIG_PROC_FS
  965. static int smart_enable(ide_drive_t *drive)
  966. {
  967. struct hd_drive_task_hdr taskfile;
  968. struct hd_drive_hob_hdr hobfile;
  969. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  970. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  971. taskfile.feature = SMART_ENABLE;
  972. taskfile.low_cylinder = SMART_LCYL_PASS;
  973. taskfile.high_cylinder = SMART_HCYL_PASS;
  974. taskfile.command = WIN_SMART;
  975. return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  976. }
  977. static int get_smart_values(ide_drive_t *drive, byte *buf)
  978. {
  979. struct hd_drive_task_hdr taskfile;
  980. struct hd_drive_hob_hdr hobfile;
  981. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  982. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  983. taskfile.feature = SMART_READ_VALUES;
  984. taskfile.sector_count = 0x01;
  985. taskfile.low_cylinder = SMART_LCYL_PASS;
  986. taskfile.high_cylinder = SMART_HCYL_PASS;
  987. taskfile.command = WIN_SMART;
  988. (void) smart_enable(drive);
  989. return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
  990. }
  991. static int get_smart_thresholds(ide_drive_t *drive, byte *buf)
  992. {
  993. struct hd_drive_task_hdr taskfile;
  994. struct hd_drive_hob_hdr hobfile;
  995. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  996. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  997. taskfile.feature = SMART_READ_THRESHOLDS;
  998. taskfile.sector_count = 0x01;
  999. taskfile.low_cylinder = SMART_LCYL_PASS;
  1000. taskfile.high_cylinder = SMART_HCYL_PASS;
  1001. taskfile.command = WIN_SMART;
  1002. (void) smart_enable(drive);
  1003. return ide_wait_taskfile(drive, &taskfile, &hobfile, buf);
  1004. }
  1005. static int proc_idedisk_read_cache
  1006. (char *page, char **start, off_t off, int count, int *eof, void *data)
  1007. {
  1008. ide_drive_t *drive = (ide_drive_t *) data;
  1009. char *out = page;
  1010. int len;
  1011. if (drive->id)
  1012. len = sprintf(out,"%in", drive->id->buf_size / 2);
  1013. else
  1014. len = sprintf(out,"(none)n");
  1015. PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
  1016. }
  1017. static int proc_idedisk_read_smart_thresholds
  1018. (char *page, char **start, off_t off, int count, int *eof, void *data)
  1019. {
  1020. ide_drive_t *drive = (ide_drive_t *)data;
  1021. int len = 0, i = 0;
  1022. if (!get_smart_thresholds(drive, page)) {
  1023. unsigned short *val = (unsigned short *) page;
  1024. char *out = ((char *)val) + (SECTOR_WORDS * 4);
  1025. page = out;
  1026. do {
  1027. out += sprintf(out, "%04x%c", le16_to_cpu(*val), (++i & 7) ? ' ' : 'n');
  1028. val += 1;
  1029. } while (i < (SECTOR_WORDS * 2));
  1030. len = out - page;
  1031. }
  1032. PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
  1033. }
  1034. static int proc_idedisk_read_smart_values
  1035. (char *page, char **start, off_t off, int count, int *eof, void *data)
  1036. {
  1037. ide_drive_t *drive = (ide_drive_t *)data;
  1038. int len = 0, i = 0;
  1039. if (!get_smart_values(drive, page)) {
  1040. unsigned short *val = (unsigned short *) page;
  1041. char *out = ((char *)val) + (SECTOR_WORDS * 4);
  1042. page = out;
  1043. do {
  1044. out += sprintf(out, "%04x%c", le16_to_cpu(*val), (++i & 7) ? ' ' : 'n');
  1045. val += 1;
  1046. } while (i < (SECTOR_WORDS * 2));
  1047. len = out - page;
  1048. }
  1049. PROC_IDE_READ_RETURN(page,start,off,count,eof,len);
  1050. }
  1051. static ide_proc_entry_t idedisk_proc[] = {
  1052. { "cache", S_IFREG|S_IRUGO, proc_idedisk_read_cache, NULL },
  1053. { "geometry", S_IFREG|S_IRUGO, proc_ide_read_geometry, NULL },
  1054. { "smart_values", S_IFREG|S_IRUSR, proc_idedisk_read_smart_values, NULL },
  1055. { "smart_thresholds", S_IFREG|S_IRUSR, proc_idedisk_read_smart_thresholds, NULL },
  1056. { NULL, 0, NULL, NULL }
  1057. };
  1058. #else
  1059. #define idedisk_proc NULL
  1060. #endif /* CONFIG_PROC_FS */
  1061. static int set_multcount(ide_drive_t *drive, int arg)
  1062. {
  1063. #ifdef __TASKFILE__IO
  1064. struct hd_drive_task_hdr taskfile;
  1065. struct hd_drive_hob_hdr hobfile;
  1066. if (drive->special.b.set_multmode)
  1067. return -EBUSY;
  1068. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  1069. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  1070. taskfile.sector_count = drive->mult_req;
  1071. taskfile.command = WIN_SETMULT;
  1072. drive->mult_req = arg;
  1073. drive->special.b.set_multmode = 1;
  1074. ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  1075. #else /* !__TASKFILE__IO */
  1076. struct request rq;
  1077. if (drive->special.b.set_multmode)
  1078. return -EBUSY;
  1079. ide_init_drive_cmd (&rq);
  1080. rq.cmd = IDE_DRIVE_CMD;
  1081. drive->mult_req = arg;
  1082. drive->special.b.set_multmode = 1;
  1083. (void) ide_do_drive_cmd (drive, &rq, ide_wait);
  1084. #endif /* __TASKFILE__IO */
  1085. return (drive->mult_count == arg) ? 0 : -EIO;
  1086. }
  1087. static int set_nowerr(ide_drive_t *drive, int arg)
  1088. {
  1089. if (ide_spin_wait_hwgroup(drive))
  1090. return -EBUSY;
  1091. drive->nowerr = arg;
  1092. drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
  1093. spin_unlock_irq(&io_request_lock);
  1094. return 0;
  1095. }
  1096. static int write_cache (ide_drive_t *drive, int arg)
  1097. {
  1098. struct hd_drive_task_hdr taskfile;
  1099. struct hd_drive_hob_hdr hobfile;
  1100. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  1101. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  1102. taskfile.feature = (arg) ? SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE;
  1103. taskfile.command = WIN_SETFEATURES;
  1104. if (!(drive->id->cfs_enable_2 & 0x3000))
  1105. return 1;
  1106. (void) ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  1107. drive->wcache = arg;
  1108. return 0;
  1109. }
  1110. static int do_idedisk_standby (ide_drive_t *drive)
  1111. {
  1112. struct hd_drive_task_hdr taskfile;
  1113. struct hd_drive_hob_hdr hobfile;
  1114. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  1115. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  1116. taskfile.command = WIN_STANDBYNOW1;
  1117. return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  1118. }
  1119. static int do_idedisk_flushcache (ide_drive_t *drive)
  1120. {
  1121. struct hd_drive_task_hdr taskfile;
  1122. struct hd_drive_hob_hdr hobfile;
  1123. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  1124. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  1125. if (drive->id->cfs_enable_2 & 0x2400) {
  1126. taskfile.command = WIN_FLUSH_CACHE_EXT;
  1127. } else {
  1128. taskfile.command = WIN_FLUSH_CACHE;
  1129. }
  1130. return ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  1131. }
  1132. static int set_acoustic (ide_drive_t *drive, int arg)
  1133. {
  1134. struct hd_drive_task_hdr taskfile;
  1135. struct hd_drive_hob_hdr hobfile;
  1136. memset(&taskfile, 0, sizeof(struct hd_drive_task_hdr));
  1137. memset(&hobfile, 0, sizeof(struct hd_drive_hob_hdr));
  1138. taskfile.feature = (arg)?SETFEATURES_EN_AAM:SETFEATURES_DIS_AAM;
  1139. taskfile.sector_count = arg;
  1140. taskfile.command = WIN_SETFEATURES;
  1141. (void) ide_wait_taskfile(drive, &taskfile, &hobfile, NULL);
  1142. drive->acoustic = arg;
  1143. return 0;
  1144. }
  1145. static int probe_lba_addressing (ide_drive_t *drive, int arg)
  1146. {
  1147. drive->addressing =  0;
  1148. if (!(drive->id->cfs_enable_2 & 0x0400))
  1149.                 return -EIO;
  1150. drive->addressing = arg;
  1151. return 0;
  1152. }
  1153. static int set_lba_addressing (ide_drive_t *drive, int arg)
  1154. {
  1155. return (probe_lba_addressing(drive, arg));
  1156. }
  1157. static void idedisk_add_settings(ide_drive_t *drive)
  1158. {
  1159. struct hd_driveid *id = drive->id;
  1160. int major = HWIF(drive)->major;
  1161. int minor = drive->select.b.unit << PARTN_BITS;
  1162. ide_add_setting(drive, "bios_cyl", SETTING_RW, -1, -1, TYPE_INT, 0, 65535, 1, 1, &drive->bios_cyl, NULL);
  1163. ide_add_setting(drive, "bios_head", SETTING_RW, -1, -1, TYPE_BYTE, 0, 255, 1, 1, &drive->bios_head, NULL);
  1164. ide_add_setting(drive, "bios_sect", SETTING_RW, -1, -1, TYPE_BYTE, 0, 63, 1, 1, &drive->bios_sect, NULL);
  1165. ide_add_setting(drive, "address", SETTING_RW, HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, TYPE_INTA, 0, 2, 1, 1, &drive->addressing, set_lba_addressing);
  1166. ide_add_setting(drive, "bswap", SETTING_READ, -1, -1, TYPE_BYTE, 0, 1, 1, 1, &drive->bswap, NULL);
  1167. ide_add_setting(drive, "multcount", id ? SETTING_RW : SETTING_READ, HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, TYPE_BYTE, 0, id ? id->max_multsect : 0, 1, 1, &drive->mult_count, set_multcount);
  1168. ide_add_setting(drive, "nowerr", SETTING_RW, HDIO_GET_NOWERR, HDIO_SET_NOWERR, TYPE_BYTE, 0, 1, 1, 1, &drive->nowerr, set_nowerr);
  1169. ide_add_setting(drive, "breada_readahead", SETTING_RW, BLKRAGET, BLKRASET, TYPE_INT, 0, 255, 1, 1, &read_ahead[major], NULL);
  1170. ide_add_setting(drive, "file_readahead", SETTING_RW, BLKFRAGET, BLKFRASET, TYPE_INTA, 0, 4096, PAGE_SIZE, 1024, &max_readahead[major][minor], NULL);
  1171. ide_add_setting(drive, "max_kb_per_request", SETTING_RW, BLKSECTGET, BLKSECTSET, TYPE_INTA, 1, 255, 1, 1, &max_sectors[major][minor], NULL);
  1172. ide_add_setting(drive, "lun", SETTING_RW, -1, -1, TYPE_INT, 0, 7, 1, 1, &drive->lun, NULL);
  1173. ide_add_setting(drive, "wcache", SETTING_RW, HDIO_GET_WCACHE, HDIO_SET_WCACHE, TYPE_BYTE, 0, 1, 1, 1, &drive->wcache, write_cache);
  1174. ide_add_setting(drive, "acoustic", SETTING_RW, HDIO_GET_ACOUSTIC, HDIO_SET_ACOUSTIC, TYPE_BYTE, 0, 254, 1, 1, &drive->acoustic, set_acoustic);
  1175.   ide_add_setting(drive, "failures", SETTING_RW, -1, -1, TYPE_INT, 0, 65535, 1, 1, &drive->failures, NULL);
  1176.   ide_add_setting(drive, "max_failures", SETTING_RW, -1, -1, TYPE_INT, 0, 65535, 1, 1, &drive->max_failures, NULL);
  1177. }
  1178. static void idedisk_setup (ide_drive_t *drive)
  1179. {
  1180. int i;
  1181. struct hd_driveid *id = drive->id;
  1182. unsigned long capacity;
  1183. idedisk_add_settings(drive);
  1184. if (id == NULL)
  1185. return;
  1186. /*
  1187.  * CompactFlash cards and their brethern look just like hard drives
  1188.  * to us, but they are removable and don't have a doorlock mechanism.
  1189.  */
  1190. if (drive->removable && !drive_is_flashcard(drive)) {
  1191. /*
  1192.  * Removable disks (eg. SYQUEST); ignore 'WD' drives 
  1193.  */
  1194. if (id->model[0] != 'W' || id->model[1] != 'D') {
  1195. drive->doorlocking = 1;
  1196. }
  1197. }
  1198. for (i = 0; i < MAX_DRIVES; ++i) {
  1199. ide_hwif_t *hwif = HWIF(drive);
  1200. if (drive != &hwif->drives[i]) continue;
  1201. hwif->gd->de_arr[i] = drive->de;
  1202. if (drive->removable)
  1203. hwif->gd->flags[i] |= GENHD_FL_REMOVABLE;
  1204. break;
  1205. }
  1206. /* Extract geometry if we did not already have one for the drive */
  1207. if (!drive->cyl || !drive->head || !drive->sect) {
  1208. drive->cyl     = drive->bios_cyl  = id->cyls;
  1209. drive->head    = drive->bios_head = id->heads;
  1210. drive->sect    = drive->bios_sect = id->sectors;
  1211. }
  1212. /* Handle logical geometry translation by the drive */
  1213. if ((id->field_valid & 1) && id->cur_cyls &&
  1214.     id->cur_heads && (id->cur_heads <= 16) && id->cur_sectors) {
  1215. drive->cyl  = id->cur_cyls;
  1216. drive->head = id->cur_heads;
  1217. drive->sect = id->cur_sectors;
  1218. }
  1219. /* Use physical geometry if what we have still makes no sense */
  1220. if (drive->head > 16 && id->heads && id->heads <= 16) {
  1221. drive->cyl  = id->cyls;
  1222. drive->head = id->heads;
  1223. drive->sect = id->sectors;
  1224. }
  1225. /* calculate drive capacity, and select LBA if possible */
  1226. init_idedisk_capacity (drive);
  1227. /*
  1228.  * if possible, give fdisk access to more of the drive,
  1229.  * by correcting bios_cyls:
  1230.  */
  1231. capacity = idedisk_capacity (drive);
  1232. if ((capacity >= (drive->bios_cyl * drive->bios_sect * drive->bios_head)) &&
  1233.     (!drive->forced_geom) && drive->bios_sect && drive->bios_head)
  1234. drive->bios_cyl = (capacity / drive->bios_sect) / drive->bios_head;
  1235. printk (KERN_INFO "%s: %ld sectors", drive->name, capacity);
  1236. /* Give size in megabytes (MB), not mebibytes (MiB). */
  1237. /* We compute the exact rounded value, avoiding overflow. */
  1238. printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950);
  1239. /* Only print cache size when it was specified */
  1240. if (id->buf_size)
  1241. printk (" w/%dKiB Cache", id->buf_size/2);
  1242. printk(", CHS=%d/%d/%d", 
  1243.        drive->bios_cyl, drive->bios_head, drive->bios_sect);
  1244. #ifdef CONFIG_BLK_DEV_IDEDMA
  1245. if (drive->using_dma)
  1246. (void) HWIF(drive)->dmaproc(ide_dma_verbose, drive);
  1247. #endif /* CONFIG_BLK_DEV_IDEDMA */
  1248. printk("n");
  1249. drive->mult_count = 0;
  1250. if (id->max_multsect) {
  1251. #ifdef CONFIG_IDEDISK_MULTI_MODE
  1252. id->multsect = ((id->max_multsect/2) > 1) ? id->max_multsect : 0;
  1253. id->multsect_valid = id->multsect ? 1 : 0;
  1254. drive->mult_req = id->multsect_valid ? id->max_multsect : INITIAL_MULT_COUNT;
  1255. drive->special.b.set_multmode = drive->mult_req ? 1 : 0;
  1256. #else /* original, pre IDE-NFG, per request of AC */
  1257. drive->mult_req = INITIAL_MULT_COUNT;
  1258. if (drive->mult_req > id->max_multsect)
  1259. drive->mult_req = id->max_multsect;
  1260. if (drive->mult_req || ((id->multsect_valid & 1) && id->multsect))
  1261. drive->special.b.set_multmode = 1;
  1262. #endif /* CONFIG_IDEDISK_MULTI_MODE */
  1263. }
  1264. drive->no_io_32bit = id->dword_io ? 1 : 0;
  1265. if (drive->id->cfs_enable_2 & 0x3000)
  1266. write_cache(drive, (id->cfs_enable_2 & 0x3000));
  1267. (void) probe_lba_addressing(drive, 1);
  1268. }
  1269. static int idedisk_cleanup (ide_drive_t *drive)
  1270. {
  1271. if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
  1272. if (do_idedisk_flushcache(drive))
  1273. printk (KERN_INFO "%s: Write Cache FAILED Flushing!n",
  1274. drive->name);
  1275. return ide_unregister_subdriver(drive);
  1276. }
  1277. int idedisk_reinit(ide_drive_t *drive);
  1278. /*
  1279.  *      IDE subdriver functions, registered with ide.c
  1280.  */
  1281. static ide_driver_t idedisk_driver = {
  1282. name: "ide-disk",
  1283. version: IDEDISK_VERSION,
  1284. media: ide_disk,
  1285. busy: 0,
  1286. supports_dma: 1,
  1287. supports_dsc_overlap: 0,
  1288. cleanup: idedisk_cleanup,
  1289. standby: do_idedisk_standby,
  1290. flushcache: do_idedisk_flushcache,
  1291. do_request: do_rw_disk,
  1292. end_request: NULL,
  1293. ioctl: NULL,
  1294. open: idedisk_open,
  1295. release: idedisk_release,
  1296. media_change: idedisk_media_change,
  1297. revalidate: idedisk_revalidate,
  1298. pre_reset: idedisk_pre_reset,
  1299. capacity: idedisk_capacity,
  1300. special: idedisk_special,
  1301. proc: idedisk_proc,
  1302. reinit: idedisk_reinit,
  1303. ata_prebuilder: NULL,
  1304. atapi_prebuilder: NULL,
  1305. };
  1306. int idedisk_init (void);
  1307. static ide_module_t idedisk_module = {
  1308. IDE_DRIVER_MODULE,
  1309. idedisk_init,
  1310. &idedisk_driver,
  1311. NULL
  1312. };
  1313. MODULE_DESCRIPTION("ATA DISK Driver");
  1314. int idedisk_reinit (ide_drive_t *drive)
  1315. {
  1316. int failed = 0;
  1317. MOD_INC_USE_COUNT;
  1318. if (ide_register_subdriver (drive, &idedisk_driver, IDE_SUBDRIVER_VERSION)) {
  1319. printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.cn", drive->name);
  1320. return 1;
  1321. }
  1322. DRIVER(drive)->busy++;
  1323. idedisk_setup(drive);
  1324. if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
  1325. printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?n", drive->name, drive->head);
  1326. (void) idedisk_cleanup(drive);
  1327. DRIVER(drive)->busy--;
  1328. return 1;
  1329. }
  1330. DRIVER(drive)->busy--;
  1331. failed--;
  1332. ide_register_module(&idedisk_module);
  1333. MOD_DEC_USE_COUNT;
  1334. return 0;
  1335. }
  1336. static void __exit idedisk_exit (void)
  1337. {
  1338. ide_drive_t *drive;
  1339. int failed = 0;
  1340. while ((drive = ide_scan_devices (ide_disk, idedisk_driver.name, &idedisk_driver, failed)) != NULL) {
  1341. if (idedisk_cleanup (drive)) {
  1342. printk (KERN_ERR "%s: cleanup_module() called while still busyn", drive->name);
  1343. failed++;
  1344. }
  1345. /* We must remove proc entries defined in this module.
  1346.    Otherwise we oops while accessing these entries */
  1347. #ifdef CONFIG_PROC_FS
  1348. if (drive->proc)
  1349. ide_remove_proc_entries(drive->proc, idedisk_proc);
  1350. #endif
  1351. }
  1352. ide_unregister_module(&idedisk_module);
  1353. }
  1354. int idedisk_init (void)
  1355. {
  1356. ide_drive_t *drive;
  1357. int failed = 0;
  1358. MOD_INC_USE_COUNT;
  1359. while ((drive = ide_scan_devices (ide_disk, idedisk_driver.name, NULL, failed++)) != NULL) {
  1360. if (ide_register_subdriver (drive, &idedisk_driver, IDE_SUBDRIVER_VERSION)) {
  1361. printk (KERN_ERR "ide-disk: %s: Failed to register the driver with ide.cn", drive->name);
  1362. continue;
  1363. }
  1364. DRIVER(drive)->busy++;
  1365. idedisk_setup(drive);
  1366. if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
  1367. printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?n", drive->name, drive->head);
  1368. (void) idedisk_cleanup(drive);
  1369. DRIVER(drive)->busy--;
  1370. continue;
  1371. }
  1372. DRIVER(drive)->busy--;
  1373. failed--;
  1374. }
  1375. ide_register_module(&idedisk_module);
  1376. MOD_DEC_USE_COUNT;
  1377. return 0;
  1378. }
  1379. module_init(idedisk_init);
  1380. module_exit(idedisk_exit);
  1381. MODULE_LICENSE("GPL");