icside.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:20k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/drivers/ide/icside.c
  3.  *
  4.  * Copyright (c) 1996,1997 Russell King.
  5.  *
  6.  * Changelog:
  7.  *  08-Jun-1996 RMK Created
  8.  *  12-Sep-1997 RMK Added interrupt enable/disable
  9.  *  17-Apr-1999 RMK Added support for V6 EASI
  10.  *  22-May-1999 RMK Added support for V6 DMA
  11.  */
  12. #include <linux/config.h>
  13. #include <linux/string.h>
  14. #include <linux/module.h>
  15. #include <linux/ioport.h>
  16. #include <linux/slab.h>
  17. #include <linux/blkdev.h>
  18. #include <linux/errno.h>
  19. #include <linux/hdreg.h>
  20. #include <linux/ide.h>
  21. #include <linux/pci.h>
  22. #include <linux/init.h>
  23. #include <asm/dma.h>
  24. #include <asm/ecard.h>
  25. #include <asm/io.h>
  26. extern char *ide_xfer_verbose (byte xfer_rate);
  27. extern char *ide_dmafunc_verbose(ide_dma_action_t dmafunc);
  28. /*
  29.  * Maximum number of interfaces per card
  30.  */
  31. #define MAX_IFS 2
  32. #define ICS_IDENT_OFFSET 0x8a0
  33. #define ICS_ARCIN_V5_INTRSTAT 0x000
  34. #define ICS_ARCIN_V5_INTROFFSET 0x001
  35. #define ICS_ARCIN_V5_IDEOFFSET 0xa00
  36. #define ICS_ARCIN_V5_IDEALTOFFSET 0xae0
  37. #define ICS_ARCIN_V5_IDESTEPPING 4
  38. #define ICS_ARCIN_V6_IDEOFFSET_1 0x800
  39. #define ICS_ARCIN_V6_INTROFFSET_1 0x880
  40. #define ICS_ARCIN_V6_INTRSTAT_1 0x8a4
  41. #define ICS_ARCIN_V6_IDEALTOFFSET_1 0x8e0
  42. #define ICS_ARCIN_V6_IDEOFFSET_2 0xc00
  43. #define ICS_ARCIN_V6_INTROFFSET_2 0xc80
  44. #define ICS_ARCIN_V6_INTRSTAT_2 0xca4
  45. #define ICS_ARCIN_V6_IDEALTOFFSET_2 0xce0
  46. #define ICS_ARCIN_V6_IDESTEPPING 4
  47. struct cardinfo {
  48. unsigned int dataoffset;
  49. unsigned int ctrloffset;
  50. unsigned int stepping;
  51. };
  52. static struct cardinfo icside_cardinfo_v5 = {
  53. ICS_ARCIN_V5_IDEOFFSET,
  54. ICS_ARCIN_V5_IDEALTOFFSET,
  55. ICS_ARCIN_V5_IDESTEPPING
  56. };
  57. static struct cardinfo icside_cardinfo_v6_1 = {
  58. ICS_ARCIN_V6_IDEOFFSET_1,
  59. ICS_ARCIN_V6_IDEALTOFFSET_1,
  60. ICS_ARCIN_V6_IDESTEPPING
  61. };
  62. static struct cardinfo icside_cardinfo_v6_2 = {
  63. ICS_ARCIN_V6_IDEOFFSET_2,
  64. ICS_ARCIN_V6_IDEALTOFFSET_2,
  65. ICS_ARCIN_V6_IDESTEPPING
  66. };
  67. struct icside_state {
  68. unsigned int channel;
  69. unsigned int enabled;
  70. unsigned int irq_port;
  71. };
  72. static const card_ids icside_cids[] = {
  73. { MANU_ICS,  PROD_ICS_IDE  },
  74. { MANU_ICS2, PROD_ICS2_IDE },
  75. { 0xffff, 0xffff }
  76. };
  77. typedef enum {
  78. ics_if_unknown,
  79. ics_if_arcin_v5,
  80. ics_if_arcin_v6
  81. } iftype_t;
  82. /* ---------------- Version 5 PCB Support Functions --------------------- */
  83. /* Prototype: icside_irqenable_arcin_v5 (struct expansion_card *ec, int irqnr)
  84.  * Purpose  : enable interrupts from card
  85.  */
  86. static void icside_irqenable_arcin_v5 (struct expansion_card *ec, int irqnr)
  87. {
  88. unsigned int memc_port = (unsigned int)ec->irq_data;
  89. outb (0, memc_port + ICS_ARCIN_V5_INTROFFSET);
  90. }
  91. /* Prototype: icside_irqdisable_arcin_v5 (struct expansion_card *ec, int irqnr)
  92.  * Purpose  : disable interrupts from card
  93.  */
  94. static void icside_irqdisable_arcin_v5 (struct expansion_card *ec, int irqnr)
  95. {
  96. unsigned int memc_port = (unsigned int)ec->irq_data;
  97. inb (memc_port + ICS_ARCIN_V5_INTROFFSET);
  98. }
  99. static const expansioncard_ops_t icside_ops_arcin_v5 = {
  100. icside_irqenable_arcin_v5,
  101. icside_irqdisable_arcin_v5,
  102. NULL,
  103. NULL,
  104. NULL,
  105. NULL
  106. };
  107. /* ---------------- Version 6 PCB Support Functions --------------------- */
  108. /* Prototype: icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr)
  109.  * Purpose  : enable interrupts from card
  110.  */
  111. static void icside_irqenable_arcin_v6 (struct expansion_card *ec, int irqnr)
  112. {
  113. struct icside_state *state = ec->irq_data;
  114. unsigned int base = state->irq_port;
  115. state->enabled = 1;
  116. switch (state->channel) {
  117. case 0:
  118. outb(0, base + ICS_ARCIN_V6_INTROFFSET_1);
  119. inb(base + ICS_ARCIN_V6_INTROFFSET_2);
  120. break;
  121. case 1:
  122. outb(0, base + ICS_ARCIN_V6_INTROFFSET_2);
  123. inb(base + ICS_ARCIN_V6_INTROFFSET_1);
  124. break;
  125. }
  126. }
  127. /* Prototype: icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
  128.  * Purpose  : disable interrupts from card
  129.  */
  130. static void icside_irqdisable_arcin_v6 (struct expansion_card *ec, int irqnr)
  131. {
  132. struct icside_state *state = ec->irq_data;
  133. state->enabled = 0;
  134. inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_1);
  135. inb (state->irq_port + ICS_ARCIN_V6_INTROFFSET_2);
  136. }
  137. /* Prototype: icside_irqprobe(struct expansion_card *ec)
  138.  * Purpose  : detect an active interrupt from card
  139.  */
  140. static int icside_irqpending_arcin_v6(struct expansion_card *ec)
  141. {
  142. struct icside_state *state = ec->irq_data;
  143. return inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_1) & 1 ||
  144.        inb(state->irq_port + ICS_ARCIN_V6_INTRSTAT_2) & 1;
  145. }
  146. static const expansioncard_ops_t icside_ops_arcin_v6 = {
  147. icside_irqenable_arcin_v6,
  148. icside_irqdisable_arcin_v6,
  149. icside_irqpending_arcin_v6,
  150. NULL,
  151. NULL,
  152. NULL
  153. };
  154. /* Prototype: icside_identifyif (struct expansion_card *ec)
  155.  * Purpose  : identify IDE interface type
  156.  * Notes    : checks the description string
  157.  */
  158. static iftype_t __init icside_identifyif (struct expansion_card *ec)
  159. {
  160. unsigned int addr;
  161. iftype_t iftype;
  162. int id = 0;
  163. iftype = ics_if_unknown;
  164. addr = ecard_address (ec, ECARD_IOC, ECARD_FAST) + ICS_IDENT_OFFSET;
  165. id = inb (addr) & 1;
  166. id |= (inb (addr + 1) & 1) << 1;
  167. id |= (inb (addr + 2) & 1) << 2;
  168. id |= (inb (addr + 3) & 1) << 3;
  169. switch (id) {
  170. case 0: /* A3IN */
  171. printk("icside: A3IN unsupportedn");
  172. break;
  173. case 1: /* A3USER */
  174. printk("icside: A3USER unsupportedn");
  175. break;
  176. case 3: /* ARCIN V6 */
  177. printk(KERN_DEBUG "icside: detected ARCIN V6 in slot %dn", ec->slot_no);
  178. iftype = ics_if_arcin_v6;
  179. break;
  180. case 15:/* ARCIN V5 (no id) */
  181. printk(KERN_DEBUG "icside: detected ARCIN V5 in slot %dn", ec->slot_no);
  182. iftype = ics_if_arcin_v5;
  183. break;
  184. default:/* we don't know - complain very loudly */
  185. printk("icside: ***********************************n");
  186. printk("icside: *** UNKNOWN ICS INTERFACE id=%d ***n", id);
  187. printk("icside: ***********************************n");
  188. printk("icside: please report this to linux@arm.linux.org.ukn");
  189. printk("icside: defaulting to ARCIN V5n");
  190. iftype = ics_if_arcin_v5;
  191. break;
  192. }
  193. return iftype;
  194. }
  195. /*
  196.  * Handle routing of interrupts.  This is called before
  197.  * we write a command to the drive.
  198.  */
  199. static void icside_maskproc(ide_drive_t *drive, int mask)
  200. {
  201. ide_hwif_t *hwif = HWIF(drive);
  202. struct icside_state *state = hwif->hw.priv;
  203. unsigned long flags;
  204. local_irq_save(flags);
  205. state->channel = hwif->channel;
  206. if (state->enabled && !mask) {
  207. switch (hwif->channel) {
  208. case 0:
  209. outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_1);
  210. inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2);
  211. break;
  212. case 1:
  213. outb(0, state->irq_port + ICS_ARCIN_V6_INTROFFSET_2);
  214. inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1);
  215. break;
  216. }
  217. } else {
  218. inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_2);
  219. inb(state->irq_port + ICS_ARCIN_V6_INTROFFSET_1);
  220. }
  221. local_irq_restore(flags);
  222. }
  223. #ifdef CONFIG_BLK_DEV_IDEDMA_ICS
  224. static int icside_dmaproc(ide_dma_action_t func, ide_drive_t *drive);
  225. /*
  226.  * SG-DMA support.
  227.  *
  228.  * Similar to the BM-DMA, but we use the RiscPCs IOMD DMA controllers.
  229.  * There is only one DMA controller per card, which means that only
  230.  * one drive can be accessed at one time.  NOTE! We do not enforce that
  231.  * here, but we rely on the main IDE driver spotting that both
  232.  * interfaces use the same IRQ, which should guarantee this.
  233.  */
  234. #define NR_ENTRIES 256
  235. #define TABLE_SIZE (NR_ENTRIES * 8)
  236. static int icside_build_dmatable(ide_drive_t *drive, int dma_mode)
  237. {
  238. ide_hwif_t *hwif = HWIF(drive);
  239. struct request *rq = HWGROUP(drive)->rq;
  240. struct buffer_head *bh;
  241. struct scatterlist *sg = hwif->sg_table;
  242. int nents = 0;
  243. bh = rq->bh;
  244. do {
  245. char *virt_addr;
  246. memset(sg, 0, sizeof(*sg));
  247. sg->address = virt_addr = bh->b_data;
  248. do {
  249. virt_addr += bh->b_size;
  250. bh = bh->b_reqnext;
  251. if (bh == NULL)
  252. break;
  253. } while (virt_addr == bh->b_data);
  254. sg->length = virt_addr - (char *)sg->address;
  255. sg++;
  256. nents++;
  257. } while (bh != NULL);
  258. if (dma_mode == DMA_MODE_READ)
  259. hwif->sg_dma_direction = PCI_DMA_FROMDEVICE;
  260. else
  261. hwif->sg_dma_direction = PCI_DMA_TODEVICE;
  262. hwif->sg_nents = pci_map_sg(NULL, hwif->sg_table, nents,
  263.     hwif->sg_dma_direction);
  264. return hwif->sg_nents;
  265. }
  266. /* Teardown mappings after DMA has completed.  */
  267. static inline void icside_destroy_dmatable(ide_hwif_t *hwif)
  268. {
  269. pci_unmap_sg(NULL, hwif->sg_table, hwif->sg_nents,
  270.      hwif->sg_dma_direction);
  271. }
  272. /*
  273.  * Configure the IOMD to give the appropriate timings for the transfer
  274.  * mode being requested.  We take the advice of the ATA standards, and
  275.  * calculate the cycle time based on the transfer mode, and the EIDE
  276.  * MW DMA specs that the drive provides in the IDENTIFY command.
  277.  *
  278.  * We have the following IOMD DMA modes to choose from:
  279.  *
  280.  * Type Active Recovery Cycle
  281.  * A 250 (250) 312 (550) 562 (800)
  282.  * B 187 250 437
  283.  * C 125 (125) 125 (375) 250 (500)
  284.  * D 62 125 187
  285.  *
  286.  * (figures in brackets are actual measured timings)
  287.  *
  288.  * However, we also need to take care of the read/write active and
  289.  * recovery timings:
  290.  *
  291.  * Read Write
  292.  *   Mode Active -- Recovery -- Cycle IOMD type
  293.  * MW0 215 50 215 480 A
  294.  * MW1 80 50 50 150 C
  295.  * MW2 70 25 25 120 C
  296.  */
  297. static int icside_speedproc(ide_drive_t *drive, byte xfer_mode)
  298. {
  299. int func = ide_dma_off;
  300. int cycle_time = 0, use_dma_info = 0;
  301. /*
  302.  * Limit the transfer speed to MW_DMA_2.
  303.  */
  304. if (xfer_mode > XFER_MW_DMA_2)
  305. xfer_mode = XFER_MW_DMA_2;
  306. switch (xfer_mode) {
  307. case XFER_MW_DMA_2:
  308. cycle_time = 250;
  309. use_dma_info = 1;
  310. break;
  311. case XFER_MW_DMA_1:
  312. cycle_time = 250;
  313. use_dma_info = 1;
  314. break;
  315. case XFER_MW_DMA_0:
  316. cycle_time = 480;
  317. break;
  318. case XFER_SW_DMA_2:
  319. case XFER_SW_DMA_1:
  320. case XFER_SW_DMA_0:
  321. cycle_time = 480;
  322. break;
  323. default:
  324. func = ide_dma_off;
  325. break;
  326. }
  327. /*
  328.  * If we're going to be doing MW_DMA_1 or MW_DMA_2, we should
  329.  * take care to note the values in the ID...
  330.  */
  331. if (use_dma_info && drive->id->eide_dma_time > cycle_time)
  332. cycle_time = drive->id->eide_dma_time;
  333. drive->drive_data = cycle_time;
  334. if (cycle_time && ide_config_drive_speed(drive, xfer_mode) == 0)
  335. func = ide_dma_on;
  336. else
  337. drive->drive_data = 480;
  338. if (!drive->init_speed)
  339. drive->init_speed = xfer_mode;
  340. else if (cycle_time)
  341. printk("%s: %s selected (peak %dMB/s)n", drive->name,
  342. ide_xfer_verbose(xfer_mode), 2000 / drive->drive_data);
  343. drive->current_speed = xfer_mode;
  344. return func;
  345. }
  346. /*
  347.  * dma_intr() is the handler for disk read/write DMA interrupts
  348.  */
  349. static ide_startstop_t icside_dmaintr(ide_drive_t *drive)
  350. {
  351. byte stat, dma_stat;
  352. dma_stat = icside_dmaproc(ide_dma_end, drive);
  353. /*
  354.  * Verify the drive status
  355.  */
  356. stat = GET_STAT();
  357. if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
  358. if (!dma_stat) {
  359. struct request *rq = HWGROUP(drive)->rq;
  360. int i;
  361. for (i = rq->nr_sectors; i > 0;) {
  362. i -= rq->current_nr_sectors;
  363. ide_end_request(1, HWGROUP(drive));
  364. }
  365. return ide_stopped;
  366. }
  367. printk("%s: dma_intr: bad DMA status (dma_stat=%x)n", 
  368.        drive->name, dma_stat);
  369. }
  370. return ide_error(drive, "dma_intr", stat);
  371. }
  372. /*
  373.  * The following is a sick duplication from ide-dma.c ;(
  374.  *
  375.  * This should be defined in one place only.
  376.  */
  377. struct drive_list_entry {
  378. char * id_model;
  379. char * id_firmware;
  380. };
  381. static struct drive_list_entry drive_whitelist [] = {
  382. { "Micropolis 2112A", "ALL" },
  383. { "CONNER CTMA 4000", "ALL" },
  384. { "CONNER CTT8000-A", "ALL" },
  385. { "ST34342A", "ALL" },
  386. { NULL, 0 }
  387. };
  388. static struct drive_list_entry drive_blacklist [] = {
  389. { "WDC AC11000H", "ALL" },
  390. { "WDC AC22100H", "ALL" },
  391. { "WDC AC32500H", "ALL" },
  392. { "WDC AC33100H", "ALL" },
  393. { "WDC AC31600H", "ALL" },
  394. { "WDC AC32100H", "24.09P07" },
  395. { "WDC AC23200L", "21.10N21" },
  396. { "Compaq CRD-8241B", "ALL" },
  397. { "CRD-8400B", "ALL" },
  398. { "CRD-8480B", "ALL" },
  399. { "CRD-8480C", "ALL" },
  400. { "CRD-8482B", "ALL" },
  401.   { "CRD-84", "ALL" },
  402. { "SanDisk SDP3B", "ALL" },
  403. { "SanDisk SDP3B-64", "ALL" },
  404. { "SANYO CD-ROM CRD", "ALL" },
  405. { "HITACHI CDR-8", "ALL" },
  406. { "HITACHI CDR-8335", "ALL" },
  407. { "HITACHI CDR-8435", "ALL" },
  408. { "Toshiba CD-ROM XM-6202B", "ALL" },
  409. { "CD-532E-A", "ALL" },
  410. { "E-IDE CD-ROM CR-840", "ALL" },
  411. { "CD-ROM Drive/F5A", "ALL" },
  412. { "RICOH CD-R/RW MP7083A", "ALL" },
  413. { "WPI CDD-820", "ALL" },
  414. { "SAMSUNG CD-ROM SC-148C", "ALL" },
  415. { "SAMSUNG CD-ROM SC-148F", "ALL" },
  416. { "SAMSUNG CD-ROM SC", "ALL" },
  417. { "SanDisk SDP3B-64", "ALL" },
  418. { "SAMSUNG CD-ROM SN-124", "ALL" },
  419. { "PLEXTOR CD-R PX-W8432T", "ALL" },
  420. { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" },
  421. { "_NEC DV5800A", "ALL" },
  422. { NULL, 0 }
  423. };
  424. static int
  425. in_drive_list(struct hd_driveid *id, struct drive_list_entry *drive_table)
  426. {
  427. for ( ; drive_table->id_model ; drive_table++)
  428. if ((!strcmp(drive_table->id_model, id->model)) &&
  429.     ((!strstr(drive_table->id_firmware, id->fw_rev)) ||
  430.      (!strcmp(drive_table->id_firmware, "ALL"))))
  431. return 1;
  432. return 0;
  433. }
  434. static int icside_check_drive_lists(ide_drive_t *drive, ide_dma_action_t func)
  435. {
  436. struct hd_driveid *id = drive->id;
  437. int found;
  438. if (func == ide_dma_good_drive) {
  439. found = in_drive_list(id, drive_whitelist);
  440. } else {
  441. found = in_drive_list(id, drive_blacklist);
  442. if (found)
  443. printk("%s: Disabling DMA for %s (blacklisted)n",
  444. drive->name, id->model);
  445. }
  446. return found;
  447. }
  448. static int icside_dma_check(ide_drive_t *drive)
  449. {
  450. struct hd_driveid *id = drive->id;
  451. ide_hwif_t *hwif = HWIF(drive);
  452. int autodma = hwif->autodma;
  453. int xfer_mode = XFER_PIO_2;
  454. int func = ide_dma_off_quietly;
  455. if (!id || !(id->capability & 1) || !autodma)
  456. goto out;
  457. /*
  458.  * Consult the list of known "bad" drives
  459.  */
  460. if (icside_check_drive_lists(drive, ide_dma_bad_drive))
  461. goto out;
  462. /*
  463.  * Enable DMA on any drive that has multiword DMA
  464.  */
  465. if (id->field_valid & 2) {
  466. if (id->dma_mword & 4) {
  467. xfer_mode = XFER_MW_DMA_2;
  468. func = ide_dma_on;
  469. } else if (id->dma_mword & 2) {
  470. xfer_mode = XFER_MW_DMA_1;
  471. func = ide_dma_on;
  472. } else if (id->dma_mword & 1) {
  473. xfer_mode = XFER_MW_DMA_0;
  474. func = ide_dma_on;
  475. }
  476. goto out;
  477. }
  478. /*
  479.  * Consult the list of known "good" drives
  480.  */
  481. if (icside_check_drive_lists(drive, ide_dma_good_drive)) {
  482. if (id->eide_dma_time > 150)
  483. goto out;
  484. xfer_mode = XFER_MW_DMA_1;
  485. func = ide_dma_on;
  486. }
  487. out:
  488. func = icside_speedproc(drive, xfer_mode);
  489. return icside_dmaproc(func, drive);
  490. }
  491. static int icside_dma_verbose(ide_drive_t *drive)
  492. {
  493. printk(", %s (peak %dMB/s)",
  494. ide_xfer_verbose(drive->current_speed),
  495. 2000 / drive->drive_data);
  496. return 1;
  497. }
  498. static int icside_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
  499. {
  500. ide_hwif_t *hwif = HWIF(drive);
  501. struct icside_state *state = hwif->hw.priv;
  502. int count, dma_mode = DMA_MODE_READ;
  503. switch (func) {
  504. case ide_dma_off:
  505. printk("%s: DMA disabledn", drive->name);
  506. /*FALLTHROUGH*/
  507. case ide_dma_off_quietly:
  508. case ide_dma_on:
  509. drive->using_dma = (func == ide_dma_on);
  510. return 0;
  511. case ide_dma_check:
  512. return icside_dma_check(drive);
  513. case ide_dma_write:
  514. dma_mode = DMA_MODE_WRITE;
  515. case ide_dma_read:
  516. count = icside_build_dmatable(drive, dma_mode);
  517. if (!count)
  518. return 1;
  519. disable_dma(hwif->hw.dma);
  520. /*
  521.  * Ensure that we have the right interrupt routed.
  522.  */
  523. icside_maskproc(drive, 0);
  524. /*
  525.  * Route the DMA signals to to the correct interface.
  526.  */
  527. outb(hwif->select_data, hwif->config_data);
  528. /*
  529.  * Select the correct timing for this drive.
  530.  */
  531. set_dma_speed(hwif->hw.dma, drive->drive_data);
  532. set_dma_sg(hwif->hw.dma, HWIF(drive)->sg_table, count);
  533. set_dma_mode(hwif->hw.dma, dma_mode);
  534. drive->waiting_for_dma = 1;
  535. if (drive->media != ide_disk)
  536. return 0;
  537. ide_set_handler(drive, &icside_dmaintr, WAIT_CMD, NULL);
  538. OUT_BYTE(dma_mode == DMA_MODE_READ ?
  539.  WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);
  540. /*FALLTHROUGH*/
  541. case ide_dma_begin:
  542. enable_dma(hwif->hw.dma);
  543. return 0;
  544. case ide_dma_end:
  545. drive->waiting_for_dma = 0;
  546. disable_dma(hwif->hw.dma);
  547. icside_destroy_dmatable(hwif);
  548. return get_dma_residue(hwif->hw.dma) != 0;
  549. case ide_dma_test_irq:
  550. return inb(state->irq_port +
  551. (hwif->channel ?
  552. ICS_ARCIN_V6_INTRSTAT_2 :
  553. ICS_ARCIN_V6_INTRSTAT_1)) & 1;
  554. case ide_dma_bad_drive:
  555. case ide_dma_good_drive:
  556. return icside_check_drive_lists(drive, func);
  557. case ide_dma_verbose:
  558. return icside_dma_verbose(drive);
  559. case ide_dma_lostirq:
  560. case ide_dma_timeout:
  561. default:
  562. printk("icside_dmaproc: unsupported %s func: %dn",
  563. ide_dmafunc_verbose(func), func);
  564. }
  565. return 1;
  566. }
  567. static int icside_setup_dma(ide_hwif_t *hwif, int autodma)
  568. {
  569. hwif->sg_table = kmalloc(sizeof(struct scatterlist) * NR_ENTRIES,
  570.  GFP_KERNEL);
  571. if (!hwif->sg_table)
  572. goto failed;
  573. hwif->dmatable_cpu = NULL;
  574. hwif->dmatable_dma = 0;
  575. hwif->speedproc    = icside_speedproc;
  576. hwif->dmaproc      = icside_dmaproc;
  577. hwif->autodma      = autodma;
  578. return 1;
  579. failed:
  580. printk(" -- ERROR, unable to allocate DMA tablen");
  581. return 0;
  582. }
  583. int ide_release_dma(ide_hwif_t *hwif)
  584. {
  585. if (hwif->sg_table) {
  586. kfree(hwif->sg_table);
  587. hwif->sg_table = NULL;
  588. }
  589. return 1;
  590. }
  591. #endif
  592. static ide_hwif_t *icside_find_hwif(unsigned long dataport)
  593. {
  594. ide_hwif_t *hwif;
  595. int index;
  596. for (index = 0; index < MAX_HWIFS; ++index) {
  597. hwif = &ide_hwifs[index];
  598. if (hwif->io_ports[IDE_DATA_OFFSET] == (ide_ioreg_t)dataport)
  599. goto found;
  600. }
  601. for (index = 0; index < MAX_HWIFS; ++index) {
  602. hwif = &ide_hwifs[index];
  603. if (!hwif->io_ports[IDE_DATA_OFFSET])
  604. goto found;
  605. }
  606. hwif = NULL;
  607. found:
  608. return hwif;
  609. }
  610. static ide_hwif_t *
  611. icside_setup(unsigned long base, struct cardinfo *info, int irq)
  612. {
  613. unsigned long port = base + info->dataoffset;
  614. ide_hwif_t *hwif;
  615. hwif = icside_find_hwif(base);
  616. if (hwif) {
  617. int i;
  618. memset(&hwif->hw, 0, sizeof(hw_regs_t));
  619. for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
  620. hwif->hw.io_ports[i] = (ide_ioreg_t)port;
  621. hwif->io_ports[i] = (ide_ioreg_t)port;
  622. port += 1 << info->stepping;
  623. }
  624. hwif->hw.io_ports[IDE_CONTROL_OFFSET] = base + info->ctrloffset;
  625. hwif->io_ports[IDE_CONTROL_OFFSET] = base + info->ctrloffset;
  626. hwif->hw.irq  = irq;
  627. hwif->irq  = irq;
  628. hwif->hw.dma  = NO_DMA;
  629. hwif->noprobe  = 0;
  630. hwif->chipset  = ide_acorn;
  631. }
  632. return hwif;
  633. }
  634. static int __init icside_register_v5(struct expansion_card *ec, int autodma)
  635. {
  636. unsigned long slot_port;
  637. ide_hwif_t *hwif;
  638. slot_port = ecard_address(ec, ECARD_MEMC, 0);
  639. ec->irqaddr  = (unsigned char *)ioaddr(slot_port + ICS_ARCIN_V5_INTRSTAT);
  640. ec->irqmask  = 1;
  641. ec->irq_data = (void *)slot_port;
  642. ec->ops      = (expansioncard_ops_t *)&icside_ops_arcin_v5;
  643. /*
  644.  * Be on the safe side - disable interrupts
  645.  */
  646. inb(slot_port + ICS_ARCIN_V5_INTROFFSET);
  647. hwif = icside_setup(slot_port, &icside_cardinfo_v5, ec->irq);
  648. return hwif ? 0 : -ENODEV;
  649. }
  650. static int __init icside_register_v6(struct expansion_card *ec, int autodma)
  651. {
  652. unsigned long slot_port, port;
  653. struct icside_state *state;
  654. ide_hwif_t *hwif, *mate;
  655. unsigned int sel = 0;
  656. slot_port = ecard_address(ec, ECARD_IOC, ECARD_FAST);
  657. port      = ecard_address(ec, ECARD_EASI, ECARD_FAST);
  658. if (port == 0)
  659. port = slot_port;
  660. else
  661. sel = 1 << 5;
  662. outb(sel, slot_port);
  663. /*
  664.  * Be on the safe side - disable interrupts
  665.  */
  666. inb(port + ICS_ARCIN_V6_INTROFFSET_1);
  667. inb(port + ICS_ARCIN_V6_INTROFFSET_2);
  668. /*
  669.  * Find and register the interfaces.
  670.  */
  671. hwif = icside_setup(port, &icside_cardinfo_v6_1, ec->irq);
  672. mate = icside_setup(port, &icside_cardinfo_v6_2, ec->irq);
  673. if (!hwif || !mate)
  674. return -ENODEV;
  675. state = kmalloc(sizeof(struct icside_state), GFP_KERNEL);
  676. if (!state)
  677. return -ENOMEM;
  678. state->channel    = 0;
  679. state->enabled    = 0;
  680. state->irq_port   = port;
  681. ec->irq_data      = state;
  682. ec->ops           = (expansioncard_ops_t *)&icside_ops_arcin_v6;
  683. hwif->maskproc    = icside_maskproc;
  684. hwif->channel     = 0;
  685. hwif->hw.priv     = state;
  686. hwif->mate        = mate;
  687. hwif->serialized  = 1;
  688. hwif->config_data = slot_port;
  689. hwif->select_data = sel;
  690. hwif->hw.dma      = ec->dma;
  691. mate->maskproc    = icside_maskproc;
  692. mate->channel     = 1;
  693. mate->hw.priv     = state;
  694. mate->mate        = hwif;
  695. mate->serialized  = 1;
  696. mate->config_data = slot_port;
  697. mate->select_data = sel | 1;
  698. mate->hw.dma      = ec->dma;
  699. #ifdef CONFIG_BLK_DEV_IDEDMA_ICS
  700. if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
  701. icside_setup_dma(hwif, autodma);
  702. icside_setup_dma(mate, autodma);
  703. }
  704. #endif
  705. return 0;
  706. }
  707. int __init icside_init(void)
  708. {
  709. int autodma = 0;
  710. #ifdef CONFIG_IDEDMA_ICS_AUTO
  711. autodma = 1;
  712. #endif
  713. ecard_startfind ();
  714. do {
  715. struct expansion_card *ec;
  716. int result;
  717. ec = ecard_find(0, icside_cids);
  718. if (ec == NULL)
  719. break;
  720. ecard_claim(ec);
  721. switch (icside_identifyif(ec)) {
  722. case ics_if_arcin_v5:
  723. result = icside_register_v5(ec, autodma);
  724. break;
  725. case ics_if_arcin_v6:
  726. result = icside_register_v6(ec, autodma);
  727. break;
  728. default:
  729. result = -1;
  730. break;
  731. }
  732. if (result)
  733. ecard_release(ec);
  734. } while (1);
  735. return 0;
  736. }