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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16
  2.  *
  3.  * linux/drivers/ide/cmd64x.c Version 1.22 June 9, 2000
  4.  *
  5.  * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
  6.  *           Note, this driver is not used at all on other systems because
  7.  *           there the "BIOS" has done all of the following already.
  8.  *           Due to massive hardware bugs, UltraDMA is only supported
  9.  *           on the 646U2 and not on the 646U.
  10.  *
  11.  * Copyright (C) 1998       Eddie C. Dost  (ecd@skynet.be)
  12.  * Copyright (C) 1998       David S. Miller (davem@redhat.com)
  13.  * Copyright (C) 1999-2000  Andre Hedrick <andre@linux-ide.org>
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/types.h>
  17. #include <linux/pci.h>
  18. #include <linux/delay.h>
  19. #include <linux/hdreg.h>
  20. #include <linux/ide.h>
  21. #include <linux/init.h>
  22. #include <asm/io.h>
  23. #include "ide_modes.h"
  24. #ifndef SPLIT_BYTE
  25. #define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
  26. #endif
  27. #define CMD_DEBUG 0
  28. #if CMD_DEBUG
  29. #define cmdprintk(x...) printk(##x)
  30. #else
  31. #define cmdprintk(x...)
  32. #endif
  33. /*
  34.  * CMD64x specific registers definition.
  35.  */
  36. #define CFR 0x50
  37. #define   CFR_INTR_CH0 0x02
  38. #define CNTRL 0x51
  39. #define   CNTRL_DIS_RA0 0x40
  40. #define   CNTRL_DIS_RA1 0x80
  41. #define   CNTRL_ENA_2ND 0x08
  42. #define CMDTIM 0x52
  43. #define ARTTIM0 0x53
  44. #define DRWTIM0 0x54
  45. #define ARTTIM1  0x55
  46. #define DRWTIM1 0x56
  47. #define ARTTIM23 0x57
  48. #define   ARTTIM23_DIS_RA2 0x04
  49. #define   ARTTIM23_DIS_RA3 0x08
  50. #define   ARTTIM23_INTR_CH1 0x10
  51. #define ARTTIM2 0x57
  52. #define ARTTIM3 0x57
  53. #define DRWTIM23 0x58
  54. #define DRWTIM2 0x58
  55. #define BRST 0x59
  56. #define DRWTIM3 0x5b
  57. #define BMIDECR0 0x70
  58. #define MRDMODE 0x71
  59. #define   MRDMODE_INTR_CH0 0x04
  60. #define   MRDMODE_INTR_CH1 0x08
  61. #define   MRDMODE_BLK_CH0 0x10
  62. #define   MRDMODE_BLK_CH1 0x20
  63. #define BMIDESR0 0x72
  64. #define UDIDETCR0 0x73
  65. #define DTPR0 0x74
  66. #define BMIDECR1 0x78
  67. #define BMIDECSR 0x79
  68. #define BMIDESR1 0x7A
  69. #define UDIDETCR1 0x7B
  70. #define DTPR1 0x7C
  71. #define DISPLAY_CMD64X_TIMINGS
  72. #if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS)
  73. #include <linux/stat.h>
  74. #include <linux/proc_fs.h>
  75. static int cmd64x_get_info(char *, char **, off_t, int);
  76. static int cmd680_get_info(char *, char **, off_t, int);
  77. extern int (*cmd64x_display_info)(char *, char **, off_t, int); /* ide-proc.c */
  78. extern char *ide_media_verbose(ide_drive_t *);
  79. static struct pci_dev *bmide_dev;
  80. static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count)
  81. {
  82. char *p = buffer;
  83. u8 reg53 = 0, reg54 = 0, reg55 = 0, reg56 = 0; /* primary */
  84. u8 reg57 = 0, reg58 = 0, reg5b; /* secondary */
  85. u8 reg72 = 0, reg73 = 0; /* primary */
  86. u8 reg7a = 0, reg7b = 0; /* secondary */
  87. u8 reg50 = 0, reg71 = 0; /* extra */
  88. u8 hi_byte = 0, lo_byte = 0;
  89. switch(bmide_dev->device) {
  90. case PCI_DEVICE_ID_CMD_649:
  91. p += sprintf(p, "n                                CMD649 Chipset.n");
  92. break;
  93. case PCI_DEVICE_ID_CMD_648:
  94. p += sprintf(p, "n                                CMD648 Chipset.n");
  95. break;
  96. case PCI_DEVICE_ID_CMD_646:
  97. p += sprintf(p, "n                                CMD646 Chipset.n");
  98. break;
  99. case PCI_DEVICE_ID_CMD_643:
  100. p += sprintf(p, "n                                CMD643 Chipset.n");
  101. break;
  102. default:
  103. p += sprintf(p, "n                                CMD64? Chipse.n");
  104. break;
  105. }
  106. (void) pci_read_config_byte(bmide_dev, CFR,       &reg50);
  107. (void) pci_read_config_byte(bmide_dev, ARTTIM0,   &reg53);
  108. (void) pci_read_config_byte(bmide_dev, DRWTIM0,   &reg54);
  109. (void) pci_read_config_byte(bmide_dev, ARTTIM1,   &reg55);
  110. (void) pci_read_config_byte(bmide_dev, DRWTIM1,   &reg56);
  111. (void) pci_read_config_byte(bmide_dev, ARTTIM2,   &reg57);
  112. (void) pci_read_config_byte(bmide_dev, DRWTIM2,   &reg58);
  113. (void) pci_read_config_byte(bmide_dev, DRWTIM3,   &reg5b);
  114. (void) pci_read_config_byte(bmide_dev, MRDMODE,   &reg71);
  115. (void) pci_read_config_byte(bmide_dev, BMIDESR0,  &reg72);
  116. (void) pci_read_config_byte(bmide_dev, UDIDETCR0, &reg73);
  117. (void) pci_read_config_byte(bmide_dev, BMIDESR1,  &reg7a);
  118. (void) pci_read_config_byte(bmide_dev, UDIDETCR1, &reg7b);
  119. p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------n");
  120. p += sprintf(p, "                %sabled                         %sabledn",
  121. (reg72&0x80)?"dis":" en",(reg7a&0x80)?"dis":" en");
  122. p += sprintf(p, "--------------- drive0 --------- drive1 -------- drive0 ---------- drive1 ------n");
  123. p += sprintf(p, "DMA enabled:    %s              %s             %s               %sn",
  124. (reg72&0x20)?"yes":"no ",(reg72&0x40)?"yes":"no ",(reg7a&0x20)?"yes":"no ",(reg7a&0x40)?"yes":"no ");
  125. p += sprintf(p, "DMA Mode:       %s(%s)          %s(%s)         %s(%s)           %s(%s)n",
  126. (reg72&0x20)?((reg73&0x01)?"UDMA":" DMA"):" PIO",
  127. (reg72&0x20)?(  ((reg73&0x30)==0x30)?(((reg73&0x35)==0x35)?"3":"0"):
  128. ((reg73&0x20)==0x20)?(((reg73&0x25)==0x25)?"3":"1"):
  129. ((reg73&0x10)==0x10)?(((reg73&0x15)==0x15)?"4":"2"):
  130. ((reg73&0x00)==0x00)?(((reg73&0x05)==0x05)?"5":"2"):"X"):"?",
  131. (reg72&0x40)?((reg73&0x02)?"UDMA":" DMA"):" PIO",
  132. (reg72&0x40)?( ((reg73&0xC0)==0xC0)?(((reg73&0xC5)==0xC5)?"3":"0"):
  133. ((reg73&0x80)==0x80)?(((reg73&0x85)==0x85)?"3":"1"):
  134. ((reg73&0x40)==0x40)?(((reg73&0x4A)==0x4A)?"4":"2"):
  135. ((reg73&0x00)==0x00)?(((reg73&0x0A)==0x0A)?"5":"2"):"X"):"?",
  136. (reg7a&0x20)?((reg7b&0x01)?"UDMA":" DMA"):" PIO",
  137. (reg7a&0x20)?( ((reg7b&0x30)==0x30)?(((reg7b&0x35)==0x35)?"3":"0"):
  138. ((reg7b&0x20)==0x20)?(((reg7b&0x25)==0x25)?"3":"1"):
  139. ((reg7b&0x10)==0x10)?(((reg7b&0x15)==0x15)?"4":"2"):
  140. ((reg7b&0x00)==0x00)?(((reg7b&0x05)==0x05)?"5":"2"):"X"):"?",
  141. (reg7a&0x40)?((reg7b&0x02)?"UDMA":" DMA"):" PIO",
  142. (reg7a&0x40)?( ((reg7b&0xC0)==0xC0)?(((reg7b&0xC5)==0xC5)?"3":"0"):
  143. ((reg7b&0x80)==0x80)?(((reg7b&0x85)==0x85)?"3":"1"):
  144. ((reg7b&0x40)==0x40)?(((reg7b&0x4A)==0x4A)?"4":"2"):
  145. ((reg7b&0x00)==0x00)?(((reg7b&0x0A)==0x0A)?"5":"2"):"X"):"?" );
  146. p += sprintf(p, "PIO Mode:       %s                %s               %s                 %sn",
  147. "?", "?", "?", "?");
  148. p += sprintf(p, "                %s                     %sn",
  149. (reg50 & CFR_INTR_CH0) ? "interrupting" : "polling     ",
  150. (reg57 & ARTTIM23_INTR_CH1) ? "interrupting" : "polling");
  151. p += sprintf(p, "                %s                          %sn",
  152. (reg71 & MRDMODE_INTR_CH0) ? "pending" : "clear  ",
  153. (reg71 & MRDMODE_INTR_CH1) ? "pending" : "clear");
  154. p += sprintf(p, "                %s                          %sn",
  155. (reg71 & MRDMODE_BLK_CH0) ? "blocked" : "enabled",
  156. (reg71 & MRDMODE_BLK_CH1) ? "blocked" : "enabled");
  157. SPLIT_BYTE(reg50, hi_byte, lo_byte);
  158. p += sprintf(p, "CFR       = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg50, hi_byte, lo_byte);
  159. SPLIT_BYTE(reg57, hi_byte, lo_byte);
  160. p += sprintf(p, "ARTTIM23  = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg57, hi_byte, lo_byte);
  161. SPLIT_BYTE(reg71, hi_byte, lo_byte);
  162. p += sprintf(p, "MRDMODE   = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg71, hi_byte, lo_byte);
  163. return p-buffer; /* => must be less than 4k! */
  164. }
  165. static int cmd680_get_info (char *buffer, char **addr, off_t offset, int count)
  166. {
  167. char *p = buffer;
  168. p += sprintf(p, "n                                CMD680 Chipset.n");
  169. p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------n");
  170. p += sprintf(p, "--------------- drive0 --------- drive1 -------- drive0 ---------- drive1 ------n");
  171. p += sprintf(p, "PIO Mode:       %s                %s               %s                 %sn",
  172. "?", "?", "?", "?");
  173. return p-buffer; /* => must be less than 4k! */
  174. }
  175. #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */
  176. byte cmd64x_proc = 0;
  177. byte cmd680_proc = 0;
  178. /*
  179.  * Registers and masks for easy access by drive index:
  180.  */
  181. #if 0
  182. static byte prefetch_regs[4]  = {CNTRL, CNTRL, ARTTIM23, ARTTIM23};
  183. static byte prefetch_masks[4] = {CNTRL_DIS_RA0, CNTRL_DIS_RA1, ARTTIM23_DIS_RA2, ARTTIM23_DIS_RA3};
  184. #endif
  185. /*
  186.  * This routine writes the prepared setup/active/recovery counts
  187.  * for a drive into the cmd646 chipset registers to active them.
  188.  */
  189. static void program_drive_counts (ide_drive_t *drive, int setup_count, int active_count, int recovery_count)
  190. {
  191. unsigned long flags;
  192. ide_drive_t *drives = HWIF(drive)->drives;
  193. byte temp_b;
  194. static const byte setup_counts[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0};
  195. static const byte recovery_counts[] =
  196. {15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
  197. static const byte arttim_regs[2][2] = {
  198. { ARTTIM0, ARTTIM1 },
  199. { ARTTIM23, ARTTIM23 }
  200. };
  201. static const byte drwtim_regs[2][2] = {
  202. { DRWTIM0, DRWTIM1 },
  203. { DRWTIM2, DRWTIM3 }
  204. };
  205. int channel = (int) HWIF(drive)->channel;
  206. int slave = (drives != drive);  /* Is this really the best way to determine this?? */
  207. cmdprintk("program_drive_count parameters = s(%d),a(%d),r(%d),p(%d)n", setup_count,
  208. active_count, recovery_count, drive->present);
  209. /*
  210.  * Set up address setup count registers.
  211.  * Primary interface has individual count/timing registers for
  212.  * each drive.  Secondary interface has one common set of registers,
  213.  * for address setup so we merge these timings, using the slowest
  214.  * value.
  215.  */
  216. if (channel) {
  217. drive->drive_data = setup_count;
  218. setup_count = IDE_MAX(drives[0].drive_data, drives[1].drive_data);
  219. cmdprintk("Secondary interface, setup_count = %dn", setup_count);
  220. }
  221. /*
  222.  * Convert values to internal chipset representation
  223.  */
  224. setup_count = (setup_count > 5) ? 0xc0 : (int) setup_counts[setup_count];
  225. active_count &= 0xf; /* Remember, max value is 16 */
  226. recovery_count = (int) recovery_counts[recovery_count];
  227. cmdprintk("Final values = %d,%d,%dn", setup_count, active_count, recovery_count);
  228. /*
  229.  * Now that everything is ready, program the new timings
  230.  */
  231. __save_flags (flags);
  232. __cli();
  233. /*
  234.  * Program the address_setup clocks into ARTTIM reg,
  235.  * and then the active/recovery counts into the DRWTIM reg
  236.  */
  237. (void) pci_read_config_byte(HWIF(drive)->pci_dev, arttim_regs[channel][slave], &temp_b);
  238. (void) pci_write_config_byte(HWIF(drive)->pci_dev, arttim_regs[channel][slave],
  239. ((byte) setup_count) | (temp_b & 0x3f));
  240. (void) pci_write_config_byte(HWIF(drive)->pci_dev, drwtim_regs[channel][slave],
  241. (byte) ((active_count << 4) | recovery_count));
  242. cmdprintk ("Write %x to %xn", ((byte) setup_count) | (temp_b & 0x3f), arttim_regs[channel][slave]);
  243. cmdprintk ("Write %x to %xn", (byte) ((active_count << 4) | recovery_count), drwtim_regs[channel][slave]);
  244. __restore_flags(flags);
  245. }
  246. /*
  247.  * Attempts to set the interface PIO mode.
  248.  * The preferred method of selecting PIO modes (e.g. mode 4) is 
  249.  * "echo 'piomode:4' > /proc/ide/hdx/settings".  Special cases are
  250.  * 8: prefetch off, 9: prefetch on, 255: auto-select best mode.
  251.  * Called with 255 at boot time.
  252.  */
  253. static void cmd64x_tuneproc (ide_drive_t *drive, byte mode_wanted)
  254. {
  255. int setup_time, active_time, recovery_time, clock_time, pio_mode, cycle_time;
  256. byte recovery_count2, cycle_count;
  257. int setup_count, active_count, recovery_count;
  258. int bus_speed = system_bus_clock();
  259. /*byte b;*/
  260. ide_pio_data_t  d;
  261. switch (mode_wanted) {
  262. case 8: /* set prefetch off */
  263. case 9: /* set prefetch on */
  264. mode_wanted &= 1;
  265. /*set_prefetch_mode(index, mode_wanted);*/
  266. cmdprintk("%s: %sabled cmd640 prefetchn", drive->name, mode_wanted ? "en" : "dis");
  267. return;
  268. }
  269. mode_wanted = ide_get_best_pio_mode (drive, mode_wanted, 5, &d);
  270. pio_mode = d.pio_mode;
  271. cycle_time = d.cycle_time;
  272. /*
  273.  * I copied all this complicated stuff from cmd640.c and made a few minor changes.
  274.  * For now I am just going to pray that it is correct.
  275.  */
  276. if (pio_mode > 5)
  277. pio_mode = 5;
  278. setup_time  = ide_pio_timings[pio_mode].setup_time;
  279. active_time = ide_pio_timings[pio_mode].active_time;
  280. recovery_time = cycle_time - (setup_time + active_time);
  281. clock_time = 1000 / bus_speed;
  282. cycle_count = (cycle_time + clock_time - 1) / clock_time;
  283. setup_count = (setup_time + clock_time - 1) / clock_time;
  284. active_count = (active_time + clock_time - 1) / clock_time;
  285. recovery_count = (recovery_time + clock_time - 1) / clock_time;
  286. recovery_count2 = cycle_count - (setup_count + active_count);
  287. if (recovery_count2 > recovery_count)
  288. recovery_count = recovery_count2;
  289. if (recovery_count > 16) {
  290. active_count += recovery_count - 16;
  291. recovery_count = 16;
  292. }
  293. if (active_count > 16)
  294. active_count = 16; /* maximum allowed by cmd646 */
  295. /*
  296.  * In a perfect world, we might set the drive pio mode here
  297.  * (using WIN_SETFEATURE) before continuing.
  298.  *
  299.  * But we do not, because:
  300.  * 1) this is the wrong place to do it (proper is do_special() in ide.c)
  301.  *  2) in practice this is rarely, if ever, necessary
  302.  */
  303. program_drive_counts (drive, setup_count, active_count, recovery_count);
  304. cmdprintk("%s: selected cmd646 PIO mode%d : %d (%dns)%s, clocks=%d/%d/%dn",
  305. drive->name, pio_mode, mode_wanted, cycle_time,
  306. d.overridden ? " (overriding vendor mode)" : "",
  307. setup_count, active_count, recovery_count);
  308. }
  309. static byte cmd680_taskfile_timing (ide_hwif_t *hwif)
  310. {
  311. struct pci_dev *dev = hwif->pci_dev;
  312. byte addr_mask = (hwif->channel) ? 0xB2 : 0xA2;
  313. unsigned short timing;
  314. pci_read_config_word(dev, addr_mask, &timing);
  315. switch (timing) {
  316. case 0x10c1: return 4;
  317. case 0x10c3: return 3;
  318. case 0x1281: return 2;
  319. case 0x2283: return 1;
  320. case 0x328a:
  321. default: return 0;
  322. }
  323. }
  324. static void cmd680_tuneproc (ide_drive_t *drive, byte mode_wanted)
  325. {
  326. ide_hwif_t *hwif = HWIF(drive);
  327. struct pci_dev *dev = hwif->pci_dev;
  328. byte drive_pci;
  329. unsigned short speedt;
  330. switch (drive->dn) {
  331. case 0: drive_pci = 0xA4; break;
  332. case 1: drive_pci = 0xA6; break;
  333. case 2: drive_pci = 0xB4; break;
  334. case 3: drive_pci = 0xB6; break;
  335. default: return;
  336.         }
  337. pci_read_config_word(dev, drive_pci, &speedt);
  338. /* cheat for now and use the docs */
  339. // switch(cmd680_taskfile_timing(hwif)) {
  340. switch(mode_wanted) {
  341. case 4: speedt = 0x10c1; break;
  342. case 3: speedt = 0x10C3; break;
  343. case 2: speedt = 0x1104; break;
  344. case 1: speedt = 0x2283; break;
  345. case 0:
  346. default: speedt = 0x328A; break;
  347. }
  348. pci_write_config_word(dev, drive_pci, speedt);
  349. }
  350. static void config_cmd64x_chipset_for_pio (ide_drive_t *drive, byte set_speed)
  351. {
  352. byte speed = 0x00;
  353. byte set_pio = ide_get_best_pio_mode(drive, 4, 5, NULL);
  354. cmd64x_tuneproc(drive, set_pio);
  355. speed = XFER_PIO_0 + set_pio;
  356. if (set_speed)
  357. (void) ide_config_drive_speed(drive, speed);
  358. }
  359. static void config_cmd680_chipset_for_pio (ide_drive_t *drive, byte set_speed)
  360. {
  361. ide_hwif_t *hwif = HWIF(drive);
  362. struct pci_dev *dev = hwif->pci_dev;
  363. u8 unit = (drive->select.b.unit & 0x01);
  364. u8 addr_mask = (hwif->channel) ? 0x84 : 0x80;
  365. u8 speed = 0x00;
  366. u8 mode_pci = 0x00;
  367. u8 channel_timings = cmd680_taskfile_timing(hwif);
  368. u8 set_pio = ide_get_best_pio_mode(drive, 4, 5, NULL);
  369. pci_read_config_byte(dev, addr_mask, &mode_pci);
  370. mode_pci &= ~((unit) ? 0x30 : 0x03);
  371. /* WARNING PIO timing mess is going to happen b/w devices, argh */
  372. if ((channel_timings != set_pio) && (set_pio > channel_timings))
  373. set_pio = channel_timings;
  374. cmd680_tuneproc(drive, set_pio);
  375. speed = XFER_PIO_0 + set_pio;
  376. if (set_speed) {
  377. (void) ide_config_drive_speed(drive, speed);
  378. drive->current_speed = speed;
  379. }
  380. }
  381. static void config_chipset_for_pio (ide_drive_t *drive, byte set_speed)
  382. {
  383.         if (HWIF(drive)->pci_dev->device == PCI_DEVICE_ID_CMD_680) {
  384. config_cmd680_chipset_for_pio(drive, set_speed);
  385. } else {
  386. config_cmd64x_chipset_for_pio(drive, set_speed);
  387. }
  388. }
  389. static int cmd64x_tune_chipset (ide_drive_t *drive, byte speed)
  390. {
  391. #ifdef CONFIG_BLK_DEV_IDEDMA
  392. ide_hwif_t *hwif = HWIF(drive);
  393. struct pci_dev *dev = hwif->pci_dev;
  394. int err = 0;
  395. u8 unit = (drive->select.b.unit & 0x01);
  396. u8 pciU = (hwif->channel) ? UDIDETCR1 : UDIDETCR0;
  397. u8 pciD = (hwif->channel) ? BMIDESR1 : BMIDESR0;
  398. u8 regU = 0;
  399. u8 regD = 0;
  400. if ((drive->media != ide_disk) && (speed < XFER_SW_DMA_0)) return 1;
  401. (void) pci_read_config_byte(dev, pciD, &regD);
  402. (void) pci_read_config_byte(dev, pciU, &regU);
  403. regD &= ~(unit ? 0x40 : 0x20);
  404. regU &= ~(unit ? 0xCA : 0x35);
  405. (void) pci_write_config_byte(dev, pciD, regD);
  406. (void) pci_write_config_byte(dev, pciU, regU);
  407. (void) pci_read_config_byte(dev, pciD, &regD);
  408. (void) pci_read_config_byte(dev, pciU, &regU);
  409. switch(speed) {
  410. case XFER_UDMA_5: regU |= (unit ? 0x0A : 0x05); break;
  411. case XFER_UDMA_4: regU |= (unit ? 0x4A : 0x15); break;
  412. case XFER_UDMA_3: regU |= (unit ? 0x8A : 0x25); break;
  413. case XFER_UDMA_2: regU |= (unit ? 0x42 : 0x11); break;
  414. case XFER_UDMA_1: regU |= (unit ? 0x82 : 0x21); break;
  415. case XFER_UDMA_0: regU |= (unit ? 0xC2 : 0x31); break;
  416. case XFER_MW_DMA_2: regD |= (unit ? 0x40 : 0x10); break;
  417. case XFER_MW_DMA_1: regD |= (unit ? 0x80 : 0x20); break;
  418. case XFER_MW_DMA_0: regD |= (unit ? 0xC0 : 0x30); break;
  419. case XFER_SW_DMA_2: regD |= (unit ? 0x40 : 0x10); break;
  420. case XFER_SW_DMA_1: regD |= (unit ? 0x80 : 0x20); break;
  421. case XFER_SW_DMA_0: regD |= (unit ? 0xC0 : 0x30); break;
  422. #else
  423. int err = 0;
  424. switch(speed) {
  425. #endif /* CONFIG_BLK_DEV_IDEDMA */
  426. case XFER_PIO_4: cmd64x_tuneproc(drive, 4); break;
  427. case XFER_PIO_3: cmd64x_tuneproc(drive, 3); break;
  428. case XFER_PIO_2: cmd64x_tuneproc(drive, 2); break;
  429. case XFER_PIO_1: cmd64x_tuneproc(drive, 1); break;
  430. case XFER_PIO_0: cmd64x_tuneproc(drive, 0); break;
  431. default:
  432. return 1;
  433. }
  434. #ifdef CONFIG_BLK_DEV_IDEDMA
  435. (void) pci_write_config_byte(dev, pciU, regU);
  436. #endif /* CONFIG_BLK_DEV_IDEDMA */
  437. err = ide_config_drive_speed(drive, speed);
  438. drive->current_speed = speed;
  439. #ifdef CONFIG_BLK_DEV_IDEDMA
  440. regD |= (unit ? 0x40 : 0x20);
  441. (void) pci_write_config_byte(dev, pciD, regD);
  442. #endif /* CONFIG_BLK_DEV_IDEDMA */
  443. return err;
  444. }
  445. static int cmd680_tune_chipset (ide_drive_t *drive, byte speed)
  446. {
  447. ide_hwif_t *hwif = HWIF(drive);
  448. struct pci_dev *dev = hwif->pci_dev;
  449. u8 addr_mask = (hwif->channel) ? 0x84 : 0x80;
  450. u8 unit = (drive->select.b.unit & 0x01);
  451. u8 dma_pci = 0;
  452. u8 udma_pci = 0;
  453. u8 mode_pci = 0;
  454. u8 scsc = 0;
  455. u16 ultra = 0;
  456. u16 multi = 0;
  457. int err = 0;
  458.         pci_read_config_byte(dev, addr_mask, &mode_pci);
  459. pci_read_config_byte(dev, 0x8A, &scsc);
  460.         switch (drive->dn) {
  461. case 0: dma_pci = 0xA8; udma_pci = 0xAC; break;
  462. case 1: dma_pci = 0xAA; udma_pci = 0xAE; break;
  463. case 2: dma_pci = 0xB8; udma_pci = 0xBC; break;
  464. case 3: dma_pci = 0xBA; udma_pci = 0xBE; break;
  465. default: return 1;
  466. }
  467. pci_read_config_byte(dev, addr_mask, &mode_pci);
  468. mode_pci &= ~((unit) ? 0x30 : 0x03);
  469. pci_read_config_word(dev, dma_pci, &multi);
  470. pci_read_config_word(dev, udma_pci, &ultra);
  471. if ((speed == XFER_UDMA_6) && (scsc & 0x30) == 0x00) {
  472. pci_write_config_byte(dev, 0x8A, scsc|0x01);
  473. pci_read_config_byte(dev, 0x8A, &scsc);
  474. }
  475. switch(speed) {
  476. #ifdef CONFIG_BLK_DEV_IDEDMA
  477. case XFER_UDMA_6:
  478. if ((scsc & 0x30) == 0x00)
  479. goto speed_break;
  480. multi = 0x10C1;
  481. ultra &= ~0x3F;
  482. ultra |= 0x01;
  483. break;
  484. speed_break :
  485. speed = XFER_UDMA_5;
  486. case XFER_UDMA_5:
  487. multi = 0x10C1;
  488. ultra &= ~0x3F;
  489. ultra |= (((scsc & 0x30) == 0x00) ? 0x01 : 0x02);
  490. break;
  491. case XFER_UDMA_4:
  492. multi = 0x10C1;
  493. ultra &= ~0x3F;
  494. ultra |= (((scsc & 0x30) == 0x00) ? 0x02 : 0x03);
  495. break;
  496. case XFER_UDMA_3:
  497. multi = 0x10C1;
  498. ultra &= ~0x3F;
  499. ultra |= (((scsc & 0x30) == 0x00) ? 0x04 : 0x05);
  500. break;
  501. case XFER_UDMA_2:
  502. multi = 0x10C1;
  503. ultra &= ~0x3F;
  504. ultra |= (((scsc & 0x30) == 0x00) ? 0x05 : 0x07);
  505. break;
  506. case XFER_UDMA_1:
  507. multi = 0x10C1;
  508. ultra &= ~0x3F;
  509. ultra |= (((scsc & 0x30) == 0x00) ? 0x07 : 0x0B);
  510. break;
  511. case XFER_UDMA_0:
  512. multi = 0x10C1;
  513. ultra &= ~0x3F;
  514. ultra |= (((scsc & 0x30) == 0x00) ? 0x0C : 0x0F);
  515. break;
  516. case XFER_MW_DMA_2:
  517. multi = 0x10C1;
  518. break;
  519. case XFER_MW_DMA_1:
  520. multi = 0x10C2;
  521. break;
  522. case XFER_MW_DMA_0:
  523. multi = 0x2208;
  524. break;
  525. #endif /* CONFIG_BLK_DEV_IDEDMA */
  526. case XFER_PIO_4: cmd680_tuneproc(drive, 4); break;
  527. case XFER_PIO_3: cmd680_tuneproc(drive, 3); break;
  528. case XFER_PIO_2: cmd680_tuneproc(drive, 2); break;
  529. case XFER_PIO_1: cmd680_tuneproc(drive, 1); break;
  530. case XFER_PIO_0: cmd680_tuneproc(drive, 0); break;
  531. default:
  532. return 1;
  533. }
  534. if (speed >= XFER_MW_DMA_0) 
  535. config_cmd680_chipset_for_pio(drive, 0);
  536. if (speed >= XFER_UDMA_0)
  537. mode_pci |= ((unit) ? 0x30 : 0x03);
  538. else if (speed >= XFER_MW_DMA_0)
  539. mode_pci |= ((unit) ? 0x20 : 0x02);
  540. else
  541. mode_pci |= ((unit) ? 0x10 : 0x01);
  542. pci_write_config_byte(dev, addr_mask, mode_pci);
  543. pci_write_config_word(dev, dma_pci, multi);
  544. pci_write_config_word(dev, udma_pci, ultra);
  545. err = ide_config_drive_speed(drive, speed);
  546. drive->current_speed = speed;
  547. return err;
  548. }
  549. #ifdef CONFIG_BLK_DEV_IDEDMA
  550. static int config_cmd64x_chipset_for_dma (ide_drive_t *drive, unsigned int rev, byte ultra_66)
  551. {
  552. struct hd_driveid *id = drive->id;
  553. ide_hwif_t *hwif = HWIF(drive);
  554. struct pci_dev *dev = hwif->pci_dev;
  555. byte speed = 0x00;
  556. byte set_pio = 0x00;
  557. byte udma_33 = ((rev >= 0x05) || (ultra_66)) ? 1 : 0;
  558. byte udma_66 = eighty_ninty_three(drive);
  559. byte udma_100 = 0;
  560. int rval;
  561. switch(dev->device) {
  562. case PCI_DEVICE_ID_CMD_649: udma_100 = 1; break;
  563. case PCI_DEVICE_ID_CMD_648:
  564. case PCI_DEVICE_ID_CMD_646:
  565. case PCI_DEVICE_ID_CMD_643:
  566. default:
  567. break;
  568. }
  569. if (drive->media != ide_disk) {
  570. cmdprintk("CMD64X: drive->media != ide_disk at double check, inital check failed!!n");
  571. return ((int) ide_dma_off);
  572. }
  573. /* UltraDMA only supported on PCI646U and PCI646U2,
  574.  * which correspond to revisions 0x03, 0x05 and 0x07 respectively.
  575.  * Actually, although the CMD tech support people won't
  576.  * tell me the details, the 0x03 revision cannot support
  577.  * UDMA correctly without hardware modifications, and even
  578.  * then it only works with Quantum disks due to some
  579.  * hold time assumptions in the 646U part which are fixed
  580.  * in the 646U2.
  581.  * So we only do UltraDMA on revision 0x05 and 0x07 chipsets.
  582.  */
  583. if ((id->dma_ultra & 0x0020) && (udma_100) && (udma_66) && (udma_33)) {
  584. speed = XFER_UDMA_5;
  585. } else if ((id->dma_ultra & 0x0010) && (udma_66) && (udma_33)) {
  586. speed = XFER_UDMA_4;
  587. } else if ((id->dma_ultra & 0x0008) && (udma_66) && (udma_33)) {
  588. speed = XFER_UDMA_3;
  589. } else if ((id->dma_ultra & 0x0004) && (udma_33)) {
  590. speed = XFER_UDMA_2;
  591. } else if ((id->dma_ultra & 0x0002) && (udma_33)) {
  592. speed = XFER_UDMA_1;
  593. } else if ((id->dma_ultra & 0x0001) && (udma_33)) {
  594. speed = XFER_UDMA_0;
  595. } else if (id->dma_mword & 0x0004) {
  596. speed = XFER_MW_DMA_2;
  597. } else if (id->dma_mword & 0x0002) {
  598. speed = XFER_MW_DMA_1;
  599. } else if (id->dma_mword & 0x0001) {
  600. speed = XFER_MW_DMA_0;
  601. } else if (id->dma_1word & 0x0004) {
  602. speed = XFER_SW_DMA_2;
  603. } else if (id->dma_1word & 0x0002) {
  604. speed = XFER_SW_DMA_1;
  605. } else if (id->dma_1word & 0x0001) {
  606. speed = XFER_SW_DMA_0;
  607. } else {
  608. set_pio = 1;
  609. }
  610. if (!drive->init_speed)
  611. drive->init_speed = speed;
  612. config_chipset_for_pio(drive, set_pio);
  613. if (set_pio)
  614. return ((int) ide_dma_off_quietly);
  615. if (cmd64x_tune_chipset(drive, speed))
  616. return ((int) ide_dma_off);
  617. rval = (int)( ((id->dma_ultra >> 11) & 7) ? ide_dma_on :
  618. ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
  619. ((id->dma_mword >> 8) & 7) ? ide_dma_on :
  620. ((id->dma_1word >> 8) & 7) ? ide_dma_on :
  621.      ide_dma_off_quietly);
  622. return rval;
  623. }
  624. static int config_cmd680_chipset_for_dma (ide_drive_t *drive)
  625. {
  626. struct hd_driveid *id = drive->id;
  627. byte udma_66 = eighty_ninty_three(drive);
  628. byte speed = 0x00;
  629. byte set_pio = 0x00;
  630. int rval;
  631. if ((id->dma_ultra & 0x0040) && (udma_66)) speed = XFER_UDMA_6;
  632. else if ((id->dma_ultra & 0x0020) && (udma_66)) speed = XFER_UDMA_5;
  633. else if ((id->dma_ultra & 0x0010) && (udma_66)) speed = XFER_UDMA_4;
  634. else if ((id->dma_ultra & 0x0008) && (udma_66)) speed = XFER_UDMA_3;
  635. else if (id->dma_ultra & 0x0004) speed = XFER_UDMA_2;
  636. else if (id->dma_ultra & 0x0002) speed = XFER_UDMA_1;
  637. else if (id->dma_ultra & 0x0001) speed = XFER_UDMA_0;
  638. else if (id->dma_mword & 0x0004) speed = XFER_MW_DMA_2;
  639. else if (id->dma_mword & 0x0002) speed = XFER_MW_DMA_1;
  640. else if (id->dma_mword & 0x0001) speed = XFER_MW_DMA_0;
  641. else {
  642. set_pio = 1;
  643. }
  644. if (!drive->init_speed)
  645. drive->init_speed = speed;
  646. config_chipset_for_pio(drive, set_pio);
  647. if (set_pio)
  648. return ((int) ide_dma_off_quietly);
  649. if (cmd680_tune_chipset(drive, speed))
  650. return ((int) ide_dma_off);
  651. rval = (int)( ((id->dma_ultra >> 14) & 3) ? ide_dma_on :
  652. ((id->dma_ultra >> 11) & 7) ? ide_dma_on :
  653. ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
  654. ((id->dma_mword >> 8) & 7) ? ide_dma_on :
  655. ((id->dma_1word >> 8) & 7) ? ide_dma_on :
  656.      ide_dma_off_quietly);
  657. return rval;
  658. }
  659. static int config_chipset_for_dma (ide_drive_t *drive, unsigned int rev, byte ultra_66)
  660. {
  661. if (HWIF(drive)->pci_dev->device == PCI_DEVICE_ID_CMD_680)
  662. return (config_cmd680_chipset_for_dma(drive));
  663. return (config_cmd64x_chipset_for_dma(drive, rev, ultra_66));
  664. }
  665. static int cmd64x_config_drive_for_dma (ide_drive_t *drive)
  666. {
  667. struct hd_driveid *id = drive->id;
  668. ide_hwif_t *hwif = HWIF(drive);
  669. struct pci_dev *dev = hwif->pci_dev;
  670. unsigned int class_rev = 0;
  671. byte can_ultra_33 = 0;
  672. byte can_ultra_66 = 0;
  673. byte can_ultra_100 = 0;
  674. byte can_ultra_133 = 0;
  675. ide_dma_action_t dma_func = ide_dma_on;
  676. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  677. class_rev &= 0xff;
  678. switch(dev->device) {
  679. case PCI_DEVICE_ID_CMD_680:
  680. can_ultra_133 = 1;
  681. case PCI_DEVICE_ID_CMD_649:
  682. can_ultra_100 = 1;
  683. case PCI_DEVICE_ID_CMD_648:
  684. can_ultra_66  = 1;
  685. case PCI_DEVICE_ID_CMD_643:
  686. can_ultra_33  = 1;
  687. break;
  688. case PCI_DEVICE_ID_CMD_646:
  689. can_ultra_33  = (class_rev >= 0x05) ? 1 : 0;
  690. can_ultra_66  = 0;
  691. can_ultra_100 = 0;
  692. break;
  693. default:
  694. return hwif->dmaproc(ide_dma_off, drive);
  695. }
  696. if ((id != NULL) && ((id->capability & 1) != 0) &&
  697.     hwif->autodma && (drive->media == ide_disk)) {
  698. /* Consult the list of known "bad" drives */
  699. if (ide_dmaproc(ide_dma_bad_drive, drive)) {
  700. dma_func = ide_dma_off;
  701. goto fast_ata_pio;
  702. }
  703. dma_func = ide_dma_off_quietly;
  704. if ((id->field_valid & 4) && (can_ultra_33)) {
  705. if (id->dma_ultra & 0x007F) {
  706. /* Force if Capable UltraDMA */
  707. dma_func = config_chipset_for_dma(drive, class_rev, can_ultra_66);
  708. if ((id->field_valid & 2) &&
  709.     (dma_func != ide_dma_on))
  710. goto try_dma_modes;
  711. }
  712. } else if (id->field_valid & 2) {
  713. try_dma_modes:
  714. if ((id->dma_mword & 0x0007) ||
  715.     (id->dma_1word & 0x0007)) {
  716. /* Force if Capable regular DMA modes */
  717. dma_func = config_chipset_for_dma(drive, class_rev, 0);
  718. if (dma_func != ide_dma_on)
  719. goto no_dma_set;
  720. }
  721. } else if (ide_dmaproc(ide_dma_good_drive, drive)) {
  722. if (id->eide_dma_time > 150) {
  723. goto no_dma_set;
  724. }
  725. /* Consult the list of known "good" drives */
  726. dma_func = config_chipset_for_dma(drive, class_rev, 0);
  727. if (dma_func != ide_dma_on)
  728. goto no_dma_set;
  729. } else {
  730. goto fast_ata_pio;
  731. }
  732. } else if ((id->capability & 8) || (id->field_valid & 2)) {
  733. fast_ata_pio:
  734. dma_func = ide_dma_off_quietly;
  735. no_dma_set:
  736. config_chipset_for_pio(drive, 1);
  737. }
  738. return HWIF(drive)->dmaproc(dma_func, drive);
  739. }
  740. static int cmd680_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  741. {
  742. switch (func) {
  743. case ide_dma_check:
  744. return cmd64x_config_drive_for_dma(drive);
  745. default:
  746. break;
  747. }
  748. /* Other cases are done by generic IDE-DMA code. */
  749.         return ide_dmaproc(func, drive);
  750. }
  751. static int cmd64x_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  752. {
  753. byte dma_stat = 0;
  754. byte dma_alt_stat = 0;
  755. byte mask = (HWIF(drive)->channel) ? MRDMODE_INTR_CH1 : MRDMODE_INTR_CH0;
  756. unsigned long dma_base = HWIF(drive)->dma_base;
  757. struct pci_dev *dev = HWIF(drive)->pci_dev;
  758. byte jack_slap = ((dev->device == PCI_DEVICE_ID_CMD_648) || (dev->device == PCI_DEVICE_ID_CMD_649)) ? 1 : 0;
  759. switch (func) {
  760. case ide_dma_check:
  761. return cmd64x_config_drive_for_dma(drive);
  762. case ide_dma_end: /* returns 1 on error, 0 otherwise */
  763. drive->waiting_for_dma = 0;
  764. outb(inb(dma_base)&~1, dma_base); /* stop DMA */
  765. dma_stat = inb(dma_base+2); /* get DMA status */
  766. outb(dma_stat|6, dma_base+2); /* clear the INTR & ERROR bits */
  767. if (jack_slap) {
  768. byte dma_intr = 0;
  769. byte dma_mask = (HWIF(drive)->channel) ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
  770. byte dma_reg = (HWIF(drive)->channel) ? ARTTIM2 : CFR;
  771. (void) pci_read_config_byte(dev, dma_reg, &dma_intr);
  772. /*
  773.  * DAMN BMIDE is not connected to PCI space!
  774.  * Have to manually jack-slap that bitch!
  775.  * To allow the PCI side to read incoming interrupts.
  776.  */
  777. (void) pci_write_config_byte(dev, dma_reg, dma_intr|dma_mask); /* clear the INTR bit */
  778. }
  779. ide_destroy_dmatable(drive); /* purge DMA mappings */
  780. return (dma_stat & 7) != 4; /* verify good DMA status */
  781. case ide_dma_test_irq: /* returns 1 if dma irq issued, 0 otherwise */
  782. dma_stat = inb(dma_base+2);
  783. (void) pci_read_config_byte(dev, MRDMODE, &dma_alt_stat);
  784. #ifdef DEBUG
  785. printk("%s: dma_stat: 0x%02x dma_alt_stat: 0x%02x mask: 0x%02xn", drive->name, dma_stat, dma_alt_stat, mask);
  786. #endif
  787. if (!(dma_alt_stat & mask)) {
  788. return 0;
  789. }
  790. return (dma_stat & 4) == 4; /* return 1 if INTR asserted */
  791. default:
  792. break;
  793. }
  794. /* Other cases are done by generic IDE-DMA code. */
  795. return ide_dmaproc(func, drive);
  796. }
  797. /*
  798.  * ASUS P55T2P4D with CMD646 chipset revision 0x01 requires the old
  799.  * event order for DMA transfers.
  800.  */
  801. static int cmd646_1_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  802. {
  803. ide_hwif_t *hwif = HWIF(drive);
  804. unsigned long dma_base = hwif->dma_base;
  805. byte dma_stat;
  806. switch (func) {
  807. case ide_dma_check:
  808. return cmd64x_config_drive_for_dma(drive);
  809. case ide_dma_end:
  810. drive->waiting_for_dma = 0;
  811. dma_stat = inb(dma_base+2); /* get DMA status */
  812. outb(inb(dma_base)&~1, dma_base); /* stop DMA */
  813. outb(dma_stat|6, dma_base+2); /* clear the INTR & ERROR bits */
  814. ide_destroy_dmatable(drive); /* and free any DMA resources */
  815. return (dma_stat & 7) != 4; /* verify good DMA status */
  816. default:
  817. break;
  818. }
  819. /* Other cases are done by generic IDE-DMA code. */
  820. return ide_dmaproc(func, drive);
  821. }
  822. #endif /* CONFIG_BLK_DEV_IDEDMA */
  823. static int cmd680_busproc (ide_drive_t * drive, int state)
  824. {
  825. #if 0
  826. ide_hwif_t *hwif = HWIF(drive);
  827. u8 addr_mask = (hwif->channel) ? 0xB0 : 0xA0;
  828. u32 stat_config = 0;
  829.         pci_read_config_dword(hwif->pci_dev, addr_mask, &stat_config);
  830. if (!hwif)
  831. return -EINVAL;
  832. switch (state) {
  833. case BUSSTATE_ON:
  834. hwif->drives[0].failures = 0;
  835. hwif->drives[1].failures = 0;
  836. break;
  837. case BUSSTATE_OFF:
  838. hwif->drives[0].failures = hwif->drives[0].max_failures + 1;
  839. hwif->drives[1].failures = hwif->drives[1].max_failures + 1;
  840. break;
  841. case BUSSTATE_TRISTATE:
  842. hwif->drives[0].failures = hwif->drives[0].max_failures + 1;
  843. hwif->drives[1].failures = hwif->drives[1].max_failures + 1;
  844. break;
  845. default:
  846. return 0;
  847. }
  848. hwif->bus_state = state;
  849. #endif
  850. return 0;
  851. }
  852. void cmd680_reset (ide_drive_t *drive)
  853. {
  854. #if 0
  855. ide_hwif_t *hwif = HWIF(drive);
  856. u8 addr_mask = (hwif->channel) ? 0xB0 : 0xA0;
  857. byte reset = 0;
  858. pci_read_config_byte(hwif->pci_dev, addr_mask, &reset);
  859. pci_write_config_byte(hwif->pci_dev, addr_mask, reset|0x03);
  860. #endif
  861. }
  862. unsigned int cmd680_pci_init (struct pci_dev *dev, const char *name)
  863. {
  864. u8 tmpbyte = 0;
  865. pci_write_config_byte(dev, 0x80, 0x00);
  866. pci_write_config_byte(dev, 0x84, 0x00);
  867. pci_read_config_byte(dev, 0x8A, &tmpbyte);
  868. pci_write_config_byte(dev, 0x8A, tmpbyte|0x01);
  869. pci_write_config_word(dev, 0xA2, 0x328A);
  870. pci_write_config_dword(dev, 0xA4, 0x328A);
  871. pci_write_config_dword(dev, 0xA8, 0x4392);
  872. pci_write_config_dword(dev, 0xAC, 0x4009);
  873. pci_write_config_word(dev, 0xB2, 0x328A);
  874. pci_write_config_dword(dev, 0xB4, 0x328A);
  875. pci_write_config_dword(dev, 0xB8, 0x4392);
  876. pci_write_config_dword(dev, 0xBC, 0x4009);
  877. #if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS)
  878. if (!cmd64x_proc) {
  879. cmd64x_proc = 1;
  880. bmide_dev = dev;
  881. cmd64x_display_info = &cmd680_get_info;
  882. }
  883. #endif /* DISPLAY_CMD64X_TIMINGS && CONFIG_PROC_FS */
  884. return 0;
  885. }
  886. unsigned int cmd64x_pci_init (struct pci_dev *dev, const char *name)
  887. {
  888. unsigned char mrdmode;
  889. unsigned int class_rev;
  890. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  891. class_rev &= 0xff;
  892. #ifdef __i386__
  893. if (dev->resource[PCI_ROM_RESOURCE].start) {
  894. pci_write_config_byte(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
  895. printk("%s: ROM enabled at 0x%08lxn", name, dev->resource[PCI_ROM_RESOURCE].start);
  896. }
  897. #endif
  898. switch(dev->device) {
  899. case PCI_DEVICE_ID_CMD_643:
  900. break;
  901. case PCI_DEVICE_ID_CMD_646:
  902. printk("%s: chipset revision 0x%02X, ", name, class_rev);
  903. switch(class_rev) {
  904. case 0x07:
  905. case 0x05:
  906. printk("UltraDMA Capable");
  907. break;
  908. case 0x03:
  909. printk("MultiWord DMA Force Limited");
  910. break;
  911. case 0x01:
  912. default:
  913. printk("MultiWord DMA Limited, IRQ workaround enabled");
  914. break;
  915. }
  916. printk("n");
  917.                         break;
  918. case PCI_DEVICE_ID_CMD_648:
  919. case PCI_DEVICE_ID_CMD_649:
  920. break;
  921. default:
  922. break;
  923. }
  924. /* Set a good latency timer and cache line size value. */
  925. (void) pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
  926. #ifdef __sparc_v9__
  927. (void) pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 0x10);
  928. #endif
  929. /* Setup interrupts. */
  930. (void) pci_read_config_byte(dev, MRDMODE, &mrdmode);
  931. mrdmode &= ~(0x30);
  932. (void) pci_write_config_byte(dev, MRDMODE, mrdmode);
  933. /* Use MEMORY READ LINE for reads.
  934.  * NOTE: Although not mentioned in the PCI0646U specs,
  935.  *       these bits are write only and won't be read
  936.  *       back as set or not.  The PCI0646U2 specs clarify
  937.  *       this point.
  938.  */
  939. (void) pci_write_config_byte(dev, MRDMODE, mrdmode | 0x02);
  940. /* Set reasonable active/recovery/address-setup values. */
  941. (void) pci_write_config_byte(dev, ARTTIM0,  0x40);
  942. (void) pci_write_config_byte(dev, DRWTIM0,  0x3f);
  943. (void) pci_write_config_byte(dev, ARTTIM1,  0x40);
  944. (void) pci_write_config_byte(dev, DRWTIM1,  0x3f);
  945. #ifdef __i386__
  946. (void) pci_write_config_byte(dev, ARTTIM23, 0x1c);
  947. #else
  948. (void) pci_write_config_byte(dev, ARTTIM23, 0x5c);
  949. #endif
  950. (void) pci_write_config_byte(dev, DRWTIM23, 0x3f);
  951. (void) pci_write_config_byte(dev, DRWTIM3,  0x3f);
  952. #ifdef CONFIG_PPC
  953. (void) pci_write_config_byte(dev, UDIDETCR0, 0xf0);
  954. #endif /* CONFIG_PPC */
  955. #if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS)
  956. if (!cmd64x_proc) {
  957. cmd64x_proc = 1;
  958. bmide_dev = dev;
  959. cmd64x_display_info = &cmd64x_get_info;
  960. }
  961. #endif /* DISPLAY_CMD64X_TIMINGS && CONFIG_PROC_FS */
  962. return 0;
  963. }
  964. unsigned int __init pci_init_cmd64x (struct pci_dev *dev, const char *name)
  965. {
  966. if (dev->device == PCI_DEVICE_ID_CMD_680)
  967. return cmd680_pci_init (dev, name);
  968. return cmd64x_pci_init (dev, name);
  969. }
  970. unsigned int cmd680_ata66 (ide_hwif_t *hwif)
  971. {
  972. byte ata66 = 0;
  973. byte addr_mask = (hwif->channel) ? 0xB0 : 0xA0;
  974. pci_read_config_byte(hwif->pci_dev, addr_mask, &ata66);
  975. return (ata66 & 0x01) ? 1 : 0;
  976. }
  977. unsigned int cmd64x_ata66 (ide_hwif_t *hwif)
  978. {
  979. byte ata66 = 0;
  980. byte mask = (hwif->channel) ? 0x02 : 0x01;
  981. pci_read_config_byte(hwif->pci_dev, BMIDECSR, &ata66);
  982. return (ata66 & mask) ? 1 : 0;
  983. }
  984. unsigned int __init ata66_cmd64x (ide_hwif_t *hwif)
  985. {
  986. struct pci_dev *dev = hwif->pci_dev;
  987. if (dev->device == PCI_DEVICE_ID_CMD_680)
  988. return cmd680_ata66(hwif);
  989. return cmd64x_ata66(hwif);
  990. }
  991. void __init ide_init_cmd64x (ide_hwif_t *hwif)
  992. {
  993. struct pci_dev *dev = hwif->pci_dev;
  994. unsigned int class_rev;
  995. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  996. class_rev &= 0xff;
  997. hwif->drives[0].autotune = 1;
  998. hwif->drives[1].autotune = 1;
  999. if (!hwif->dma_base)
  1000. return;
  1001. #ifdef CONFIG_BLK_DEV_IDEDMA
  1002. switch(dev->device) {
  1003. case PCI_DEVICE_ID_CMD_680:
  1004. hwif->busproc = &cmd680_busproc;
  1005. hwif->dmaproc = &cmd680_dmaproc;
  1006. hwif->resetproc = &cmd680_reset;
  1007. hwif->speedproc = &cmd680_tune_chipset;
  1008. hwif->tuneproc = &cmd680_tuneproc;
  1009. break;
  1010. case PCI_DEVICE_ID_CMD_649:
  1011. case PCI_DEVICE_ID_CMD_648:
  1012. case PCI_DEVICE_ID_CMD_643:
  1013. hwif->dmaproc = &cmd64x_dmaproc;
  1014. hwif->tuneproc = &cmd64x_tuneproc;
  1015. hwif->speedproc = &cmd64x_tune_chipset;
  1016. break;
  1017. case PCI_DEVICE_ID_CMD_646:
  1018. hwif->chipset = ide_cmd646;
  1019. if (class_rev == 0x01) {
  1020. hwif->dmaproc = &cmd646_1_dmaproc;
  1021. } else {
  1022. hwif->dmaproc = &cmd64x_dmaproc;
  1023. }
  1024. hwif->tuneproc = &cmd64x_tuneproc;
  1025. hwif->speedproc = &cmd64x_tune_chipset;
  1026. break;
  1027. default:
  1028. break;
  1029. }
  1030. #endif /* CONFIG_BLK_DEV_IDEDMA */
  1031. }