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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* IEEE-1284 operations for parport.
  2.  *
  3.  * This file is for generic IEEE 1284 operations.  The idea is that
  4.  * they are used by the low-level drivers.  If they have a special way
  5.  * of doing something, they can provide their own routines (and put
  6.  * the function pointers in port->ops); if not, they can just use these
  7.  * as a fallback.
  8.  *
  9.  * Note: Make no assumptions about hardware or architecture in this file!
  10.  *
  11.  * Author: Tim Waugh <tim@cyberelk.demon.co.uk>
  12.  * Fixed AUTOFD polarity in ecp_forward_to_reverse().  Fred Barnes, 1999
  13.  * Software emulated EPP fixes, Fred Barnes, 04/2001.
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/parport.h>
  17. #include <linux/delay.h>
  18. #include <asm/uaccess.h>
  19. #undef DEBUG /* undef me for production */
  20. #ifdef CONFIG_LP_CONSOLE
  21. #undef DEBUG /* Don't want a garbled console */
  22. #endif
  23. #ifdef DEBUG
  24. #define DPRINTK(stuff...) printk (stuff)
  25. #else
  26. #define DPRINTK(stuff...)
  27. #endif
  28. /***                                *
  29.  * One-way data transfer functions. *
  30.  *                                ***/
  31. /* Compatibility mode. */
  32. size_t parport_ieee1284_write_compat (struct parport *port,
  33.       const void *buffer, size_t len,
  34.       int flags)
  35. {
  36. int no_irq = 1;
  37. ssize_t count = 0;
  38. const unsigned char *addr = buffer;
  39. unsigned char byte;
  40. struct pardevice *dev = port->physport->cad;
  41. unsigned char ctl = (PARPORT_CONTROL_SELECT
  42.      | PARPORT_CONTROL_INIT);
  43. if (port->irq != PARPORT_IRQ_NONE) {
  44. parport_enable_irq (port);
  45. no_irq = 0;
  46. }
  47. port->physport->ieee1284.phase = IEEE1284_PH_FWD_DATA;
  48. parport_write_control (port, ctl);
  49. parport_data_forward (port);
  50. while (count < len) {
  51. long expire = jiffies + dev->timeout;
  52. long wait = (HZ + 99) / 100;
  53. unsigned char mask = (PARPORT_STATUS_ERROR
  54.       | PARPORT_STATUS_BUSY);
  55. unsigned char val = (PARPORT_STATUS_ERROR
  56.      | PARPORT_STATUS_BUSY);
  57. /* Wait until the peripheral's ready */
  58. do {
  59. /* Is the peripheral ready yet? */
  60. if (!parport_wait_peripheral (port, mask, val))
  61. /* Skip the loop */
  62. goto ready;
  63. /* Is the peripheral upset? */
  64. if ((parport_read_status (port) &
  65.      (PARPORT_STATUS_PAPEROUT |
  66.       PARPORT_STATUS_SELECT |
  67.       PARPORT_STATUS_ERROR))
  68.     != (PARPORT_STATUS_SELECT |
  69. PARPORT_STATUS_ERROR))
  70. /* If nFault is asserted (i.e. no
  71.  * error) and PAPEROUT and SELECT are
  72.  * just red herrings, give the driver
  73.  * a chance to check it's happy with
  74.  * that before continuing. */
  75. goto stop;
  76. /* Have we run out of time? */
  77. if (!time_before (jiffies, expire))
  78. break;
  79. /* Yield the port for a while.  If this is the
  80.                            first time around the loop, don't let go of
  81.                            the port.  This way, we find out if we have
  82.                            our interrupt handler called. */
  83. if (count && no_irq) {
  84. parport_release (dev);
  85. __set_current_state (TASK_INTERRUPTIBLE);
  86. schedule_timeout (wait);
  87. parport_claim_or_block (dev);
  88. }
  89. else
  90. /* We must have the device claimed here */
  91. parport_wait_event (port, wait);
  92. /* Is there a signal pending? */
  93. if (signal_pending (current))
  94. break;
  95. /* Wait longer next time. */
  96. wait *= 2;
  97. } while (time_before (jiffies, expire));
  98. if (signal_pending (current))
  99. break;
  100. DPRINTK (KERN_DEBUG "%s: Timed outn", port->name);
  101. break;
  102. ready:
  103. /* Write the character to the data lines. */
  104. byte = *addr++;
  105. parport_write_data (port, byte);
  106. udelay (1);
  107. /* Pulse strobe. */
  108. parport_write_control (port, ctl | PARPORT_CONTROL_STROBE);
  109. udelay (1); /* strobe */
  110. parport_write_control (port, ctl);
  111. udelay (1); /* hold */
  112. /* Assume the peripheral received it. */
  113. count++;
  114.                 /* Let another process run if it needs to. */
  115. if (time_before (jiffies, expire))
  116. if (!parport_yield_blocking (dev)
  117.     && current->need_resched)
  118. schedule ();
  119. }
  120.  stop:
  121. port->physport->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
  122. return count;
  123. }
  124. /* Nibble mode. */
  125. size_t parport_ieee1284_read_nibble (struct parport *port, 
  126.      void *buffer, size_t len,
  127.      int flags)
  128. {
  129. #ifndef CONFIG_PARPORT_1284
  130. return 0;
  131. #else
  132. unsigned char *buf = buffer;
  133. int i;
  134. unsigned char byte = 0;
  135. len *= 2; /* in nibbles */
  136. for (i=0; i < len; i++) {
  137. unsigned char nibble;
  138. /* Does the error line indicate end of data? */
  139. if (((i & 1) == 0) &&
  140.     (parport_read_status(port) & PARPORT_STATUS_ERROR)) {
  141. port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
  142. DPRINTK (KERN_DEBUG
  143. "%s: No more nibble data (%d bytes)n",
  144. port->name, i/2);
  145. /* Go to reverse idle phase. */
  146. parport_frob_control (port,
  147.       PARPORT_CONTROL_AUTOFD,
  148.       PARPORT_CONTROL_AUTOFD);
  149. port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
  150. break;
  151. }
  152. /* Event 7: Set nAutoFd low. */
  153. parport_frob_control (port,
  154.       PARPORT_CONTROL_AUTOFD,
  155.       PARPORT_CONTROL_AUTOFD);
  156. /* Event 9: nAck goes low. */
  157. port->ieee1284.phase = IEEE1284_PH_REV_DATA;
  158. if (parport_wait_peripheral (port,
  159.      PARPORT_STATUS_ACK, 0)) {
  160. /* Timeout -- no more data? */
  161. DPRINTK (KERN_DEBUG
  162.  "%s: Nibble timeout at event 9 (%d bytes)n",
  163.  port->name, i/2);
  164. parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
  165. break;
  166. }
  167. /* Read a nibble. */
  168. nibble = parport_read_status (port) >> 3;
  169. nibble &= ~8;
  170. if ((nibble & 0x10) == 0)
  171. nibble |= 8;
  172. nibble &= 0xf;
  173. /* Event 10: Set nAutoFd high. */
  174. parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
  175. /* Event 11: nAck goes high. */
  176. if (parport_wait_peripheral (port,
  177.      PARPORT_STATUS_ACK,
  178.      PARPORT_STATUS_ACK)) {
  179. /* Timeout -- no more data? */
  180. DPRINTK (KERN_DEBUG
  181.  "%s: Nibble timeout at event 11n",
  182.  port->name);
  183. break;
  184. }
  185. if (i & 1) {
  186. /* Second nibble */
  187. byte |= nibble << 4;
  188. *buf++ = byte;
  189. } else 
  190. byte = nibble;
  191. }
  192. i /= 2; /* i is now in bytes */
  193. if (i == len) {
  194. /* Read the last nibble without checking data avail. */
  195. port = port->physport;
  196. if (parport_read_status (port) & PARPORT_STATUS_ERROR)
  197. port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
  198. else
  199. port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
  200. }
  201. return i;
  202. #endif /* IEEE1284 support */
  203. }
  204. /* Byte mode. */
  205. size_t parport_ieee1284_read_byte (struct parport *port,
  206.    void *buffer, size_t len,
  207.    int flags)
  208. {
  209. #ifndef CONFIG_PARPORT_1284
  210. return 0;
  211. #else
  212. unsigned char *buf = buffer;
  213. ssize_t count = 0;
  214. for (count = 0; count < len; count++) {
  215. unsigned char byte;
  216. /* Data available? */
  217. if (parport_read_status (port) & PARPORT_STATUS_ERROR) {
  218. port->physport->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
  219. DPRINTK (KERN_DEBUG
  220.  "%s: No more byte data (%Zd bytes)n",
  221.  port->name, count);
  222. /* Go to reverse idle phase. */
  223. parport_frob_control (port,
  224.       PARPORT_CONTROL_AUTOFD,
  225.       PARPORT_CONTROL_AUTOFD);
  226. port->physport->ieee1284.phase = IEEE1284_PH_REV_IDLE;
  227. break;
  228. }
  229. /* Event 14: Place data bus in high impedance state. */
  230. parport_data_reverse (port);
  231. /* Event 7: Set nAutoFd low. */
  232. parport_frob_control (port,
  233.       PARPORT_CONTROL_AUTOFD,
  234.       PARPORT_CONTROL_AUTOFD);
  235. /* Event 9: nAck goes low. */
  236. port->physport->ieee1284.phase = IEEE1284_PH_REV_DATA;
  237. if (parport_wait_peripheral (port,
  238.      PARPORT_STATUS_ACK,
  239.      0)) {
  240. /* Timeout -- no more data? */
  241. parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
  242.  0);
  243. DPRINTK (KERN_DEBUG "%s: Byte timeout at event 9n",
  244.  port->name);
  245. break;
  246. }
  247. byte = parport_read_data (port);
  248. *buf++ = byte;
  249. /* Event 10: Set nAutoFd high */
  250. parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
  251. /* Event 11: nAck goes high. */
  252. if (parport_wait_peripheral (port,
  253.      PARPORT_STATUS_ACK,
  254.      PARPORT_STATUS_ACK)) {
  255. /* Timeout -- no more data? */
  256. DPRINTK (KERN_DEBUG "%s: Byte timeout at event 11n",
  257.  port->name);
  258. break;
  259. }
  260. /* Event 16: Set nStrobe low. */
  261. parport_frob_control (port,
  262.       PARPORT_CONTROL_STROBE,
  263.       PARPORT_CONTROL_STROBE);
  264. udelay (5);
  265. /* Event 17: Set nStrobe high. */
  266. parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
  267. }
  268. if (count == len) {
  269. /* Read the last byte without checking data avail. */
  270. port = port->physport;
  271. if (parport_read_status (port) & PARPORT_STATUS_ERROR)
  272. port->ieee1284.phase = IEEE1284_PH_HBUSY_DNA;
  273. else
  274. port->ieee1284.phase = IEEE1284_PH_HBUSY_DAVAIL;
  275. }
  276. return count;
  277. #endif /* IEEE1284 support */
  278. }
  279. /***              *
  280.  * ECP Functions. *
  281.  *              ***/
  282. #ifdef CONFIG_PARPORT_1284
  283. static inline
  284. int ecp_forward_to_reverse (struct parport *port)
  285. {
  286. int retval;
  287. /* Event 38: Set nAutoFd low */
  288. parport_frob_control (port,
  289.       PARPORT_CONTROL_AUTOFD,
  290.       PARPORT_CONTROL_AUTOFD);
  291. parport_data_reverse (port);
  292. udelay (5);
  293. /* Event 39: Set nInit low to initiate bus reversal */
  294. parport_frob_control (port,
  295.       PARPORT_CONTROL_INIT,
  296.       0);
  297. /* Event 40: PError goes low */
  298. retval = parport_wait_peripheral (port,
  299.   PARPORT_STATUS_PAPEROUT, 0);
  300. if (!retval) {
  301. DPRINTK (KERN_DEBUG "%s: ECP direction: reversen",
  302.  port->name);
  303. port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
  304. } else {
  305. DPRINTK (KERN_DEBUG "%s: ECP direction: failed to reversen",
  306.  port->name);
  307. port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
  308. }
  309. return retval;
  310. }
  311. static inline
  312. int ecp_reverse_to_forward (struct parport *port)
  313. {
  314. int retval;
  315. /* Event 47: Set nInit high */
  316. parport_frob_control (port,
  317.       PARPORT_CONTROL_INIT
  318.       | PARPORT_CONTROL_AUTOFD,
  319.       PARPORT_CONTROL_INIT
  320.       | PARPORT_CONTROL_AUTOFD);
  321. /* Event 49: PError goes high */
  322. retval = parport_wait_peripheral (port,
  323.   PARPORT_STATUS_PAPEROUT,
  324.   PARPORT_STATUS_PAPEROUT);
  325. if (!retval) {
  326. parport_data_forward (port);
  327. DPRINTK (KERN_DEBUG "%s: ECP direction: forwardn",
  328.  port->name);
  329. port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
  330. } else {
  331. DPRINTK (KERN_DEBUG
  332.  "%s: ECP direction: failed to switch forwardn",
  333.  port->name);
  334. port->ieee1284.phase = IEEE1284_PH_ECP_DIR_UNKNOWN;
  335. }
  336. return retval;
  337. }
  338. #endif /* IEEE1284 support */
  339. /* ECP mode, forward channel, data. */
  340. size_t parport_ieee1284_ecp_write_data (struct parport *port,
  341. const void *buffer, size_t len,
  342. int flags)
  343. {
  344. #ifndef CONFIG_PARPORT_1284
  345. return 0;
  346. #else
  347. const unsigned char *buf = buffer;
  348. size_t written;
  349. int retry;
  350. port = port->physport;
  351. if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
  352. if (ecp_reverse_to_forward (port))
  353. return 0;
  354. port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
  355. /* HostAck high (data, not command) */
  356. parport_frob_control (port,
  357.       PARPORT_CONTROL_AUTOFD
  358.       | PARPORT_CONTROL_STROBE
  359.       | PARPORT_CONTROL_INIT,
  360.       PARPORT_CONTROL_INIT);
  361. for (written = 0; written < len; written++, buf++) {
  362. long expire = jiffies + port->cad->timeout;
  363. unsigned char byte;
  364. byte = *buf;
  365. try_again:
  366. parport_write_data (port, byte);
  367. parport_frob_control (port, PARPORT_CONTROL_STROBE,
  368.       PARPORT_CONTROL_STROBE);
  369. udelay (5);
  370. for (retry = 0; retry < 100; retry++) {
  371. if (!parport_wait_peripheral (port,
  372.       PARPORT_STATUS_BUSY, 0))
  373. goto success;
  374. if (signal_pending (current)) {
  375. parport_frob_control (port,
  376.       PARPORT_CONTROL_STROBE,
  377.       0);
  378. break;
  379. }
  380. }
  381. /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
  382. DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!n", port->name);
  383. parport_frob_control (port, PARPORT_CONTROL_INIT,
  384.       PARPORT_CONTROL_INIT);
  385. udelay (50);
  386. if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
  387. /* It's buggered. */
  388. parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
  389. break;
  390. }
  391. parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
  392. udelay (50);
  393. if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
  394. break;
  395. DPRINTK (KERN_DEBUG "%s: Host transfer recoveredn",
  396.  port->name);
  397. if (time_after_eq (jiffies, expire)) break;
  398. goto try_again;
  399. success:
  400. parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
  401. udelay (5);
  402. if (parport_wait_peripheral (port,
  403.      PARPORT_STATUS_BUSY,
  404.      PARPORT_STATUS_BUSY))
  405. /* Peripheral hasn't accepted the data. */
  406. break;
  407. }
  408. port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
  409. return written;
  410. #endif /* IEEE1284 support */
  411. }
  412. /* ECP mode, reverse channel, data. */
  413. size_t parport_ieee1284_ecp_read_data (struct parport *port,
  414.        void *buffer, size_t len, int flags)
  415. {
  416. #ifndef CONFIG_PARPORT_1284
  417. return 0;
  418. #else
  419. struct pardevice *dev = port->cad;
  420. unsigned char *buf = buffer;
  421. int rle_count = 0; /* shut gcc up */
  422. unsigned char ctl;
  423. int rle = 0;
  424. ssize_t count = 0;
  425. port = port->physport;
  426. if (port->ieee1284.phase != IEEE1284_PH_REV_IDLE)
  427. if (ecp_forward_to_reverse (port))
  428. return 0;
  429. port->ieee1284.phase = IEEE1284_PH_REV_DATA;
  430. /* Set HostAck low to start accepting data. */
  431. ctl = parport_read_control (port);
  432. ctl &= ~(PARPORT_CONTROL_STROBE | PARPORT_CONTROL_INIT |
  433.  PARPORT_CONTROL_AUTOFD);
  434. parport_write_control (port,
  435.        ctl | PARPORT_CONTROL_AUTOFD);
  436. while (count < len) {
  437. long expire = jiffies + dev->timeout;
  438. unsigned char byte;
  439. int command;
  440. /* Event 43: Peripheral sets nAck low. It can take as
  441.                    long as it wants. */
  442. while (parport_wait_peripheral (port, PARPORT_STATUS_ACK, 0)) {
  443. /* The peripheral hasn't given us data in
  444.    35ms.  If we have data to give back to the
  445.    caller, do it now. */
  446. if (count)
  447. goto out;
  448. /* If we've used up all the time we were allowed,
  449.    give up altogether. */
  450. if (!time_before (jiffies, expire))
  451. goto out;
  452. /* Yield the port for a while. */
  453. if (count && dev->port->irq != PARPORT_IRQ_NONE) {
  454. parport_release (dev);
  455. __set_current_state (TASK_INTERRUPTIBLE);
  456. schedule_timeout ((HZ + 24) / 25);
  457. parport_claim_or_block (dev);
  458. }
  459. else
  460. /* We must have the device claimed here. */
  461. parport_wait_event (port, (HZ + 24) / 25);
  462. /* Is there a signal pending? */
  463. if (signal_pending (current))
  464. goto out;
  465. }
  466. /* Is this a command? */
  467. if (rle)
  468. /* The last byte was a run-length count, so
  469.                            this can't be as well. */
  470. command = 0;
  471. else
  472. command = (parport_read_status (port) &
  473.    PARPORT_STATUS_BUSY) ? 1 : 0;
  474. /* Read the data. */
  475. byte = parport_read_data (port);
  476. /* If this is a channel command, rather than an RLE
  477.                    command or a normal data byte, don't accept it. */
  478. if (command) {
  479. if (byte & 0x80) {
  480. DPRINTK (KERN_DEBUG "%s: stopping short at "
  481.  "channel command (%02x)n",
  482.  port->name, byte);
  483. goto out;
  484. }
  485. else if (port->ieee1284.mode != IEEE1284_MODE_ECPRLE)
  486. DPRINTK (KERN_DEBUG "%s: device illegally "
  487.  "using RLE; accepting anywayn",
  488.  port->name);
  489. rle_count = byte + 1;
  490. /* Are we allowed to read that many bytes? */
  491. if (rle_count > (len - count)) {
  492. DPRINTK (KERN_DEBUG "%s: leaving %d RLE bytes "
  493.  "for next timen", port->name,
  494.  rle_count);
  495. break;
  496. }
  497. rle = 1;
  498. }
  499. /* Event 44: Set HostAck high, acknowledging handshake. */
  500. parport_write_control (port, ctl);
  501. /* Event 45: The peripheral has 35ms to set nAck high. */
  502. if (parport_wait_peripheral (port, PARPORT_STATUS_ACK,
  503.      PARPORT_STATUS_ACK)) {
  504. /* It's gone wrong.  Return what data we have
  505.                            to the caller. */
  506. DPRINTK (KERN_DEBUG "ECP read timed out at 45n");
  507. if (command)
  508. printk (KERN_WARNING
  509. "%s: command ignored (%02x)n",
  510. port->name, byte);
  511. break;
  512. }
  513. /* Event 46: Set HostAck low and accept the data. */
  514. parport_write_control (port,
  515.        ctl | PARPORT_CONTROL_AUTOFD);
  516. /* If we just read a run-length count, fetch the data. */
  517. if (command)
  518. continue;
  519. /* If this is the byte after a run-length count, decompress. */
  520. if (rle) {
  521. rle = 0;
  522. memset (buf, byte, rle_count);
  523. buf += rle_count;
  524. count += rle_count;
  525. DPRINTK (KERN_DEBUG "%s: decompressed to %d bytesn",
  526.  port->name, rle_count);
  527. } else {
  528. /* Normal data byte. */
  529. *buf = byte;
  530. buf++, count++;
  531. }
  532. }
  533.  out:
  534. port->ieee1284.phase = IEEE1284_PH_REV_IDLE;
  535. return count;
  536. #endif /* IEEE1284 support */
  537. }
  538. /* ECP mode, forward channel, commands. */
  539. size_t parport_ieee1284_ecp_write_addr (struct parport *port,
  540. const void *buffer, size_t len,
  541. int flags)
  542. {
  543. #ifndef CONFIG_PARPORT_1284
  544. return 0;
  545. #else
  546. const unsigned char *buf = buffer;
  547. size_t written;
  548. int retry;
  549. port = port->physport;
  550. if (port->ieee1284.phase != IEEE1284_PH_FWD_IDLE)
  551. if (ecp_reverse_to_forward (port))
  552. return 0;
  553. port->ieee1284.phase = IEEE1284_PH_FWD_DATA;
  554. /* HostAck low (command, not data) */
  555. parport_frob_control (port,
  556.       PARPORT_CONTROL_AUTOFD
  557.       | PARPORT_CONTROL_STROBE
  558.       | PARPORT_CONTROL_INIT,
  559.       PARPORT_CONTROL_AUTOFD
  560.       | PARPORT_CONTROL_INIT);
  561. for (written = 0; written < len; written++, buf++) {
  562. long expire = jiffies + port->cad->timeout;
  563. unsigned char byte;
  564. byte = *buf;
  565. try_again:
  566. parport_write_data (port, byte);
  567. parport_frob_control (port, PARPORT_CONTROL_STROBE,
  568.       PARPORT_CONTROL_STROBE);
  569. udelay (5);
  570. for (retry = 0; retry < 100; retry++) {
  571. if (!parport_wait_peripheral (port,
  572.       PARPORT_STATUS_BUSY, 0))
  573. goto success;
  574. if (signal_pending (current)) {
  575. parport_frob_control (port,
  576.       PARPORT_CONTROL_STROBE,
  577.       0);
  578. break;
  579. }
  580. }
  581. /* Time for Host Transfer Recovery (page 41 of IEEE1284) */
  582. DPRINTK (KERN_DEBUG "%s: ECP transfer stalled!n", port->name);
  583. parport_frob_control (port, PARPORT_CONTROL_INIT,
  584.       PARPORT_CONTROL_INIT);
  585. udelay (50);
  586. if (parport_read_status (port) & PARPORT_STATUS_PAPEROUT) {
  587. /* It's buggered. */
  588. parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
  589. break;
  590. }
  591. parport_frob_control (port, PARPORT_CONTROL_INIT, 0);
  592. udelay (50);
  593. if (!(parport_read_status (port) & PARPORT_STATUS_PAPEROUT))
  594. break;
  595. DPRINTK (KERN_DEBUG "%s: Host transfer recoveredn",
  596.  port->name);
  597. if (time_after_eq (jiffies, expire)) break;
  598. goto try_again;
  599. success:
  600. parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
  601. udelay (5);
  602. if (parport_wait_peripheral (port,
  603.      PARPORT_STATUS_BUSY,
  604.      PARPORT_STATUS_BUSY))
  605. /* Peripheral hasn't accepted the data. */
  606. break;
  607. }
  608. port->ieee1284.phase = IEEE1284_PH_FWD_IDLE;
  609. return written;
  610. #endif /* IEEE1284 support */
  611. }
  612. /***              *
  613.  * EPP functions. *
  614.  *              ***/
  615. /* EPP mode, forward channel, data. */
  616. size_t parport_ieee1284_epp_write_data (struct parport *port,
  617. const void *buffer, size_t len,
  618. int flags)
  619. {
  620. unsigned char *bp = (unsigned char *) buffer;
  621. size_t ret = 0;
  622. /* set EPP idle state (just to make sure) with strobe low */
  623. parport_frob_control (port,
  624.       PARPORT_CONTROL_STROBE |
  625.       PARPORT_CONTROL_AUTOFD |
  626.       PARPORT_CONTROL_SELECT |
  627.       PARPORT_CONTROL_INIT,
  628.       PARPORT_CONTROL_STROBE |
  629.       PARPORT_CONTROL_INIT);
  630. port->ops->data_forward (port);
  631. for (; len > 0; len--, bp++) {
  632. /* Event 62: Write data and set autofd low */
  633. parport_write_data (port, *bp);
  634. parport_frob_control (port, PARPORT_CONTROL_AUTOFD,
  635.       PARPORT_CONTROL_AUTOFD);
  636. /* Event 58: wait for busy (nWait) to go high */
  637. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
  638. break;
  639. /* Event 63: set nAutoFd (nDStrb) high */
  640. parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
  641. /* Event 60: wait for busy (nWait) to go low */
  642. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
  643.      PARPORT_STATUS_BUSY, 5))
  644. break;
  645. ret++;
  646. }
  647. /* Event 61: set strobe (nWrite) high */
  648. parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
  649. return ret;
  650. }
  651. /* EPP mode, reverse channel, data. */
  652. size_t parport_ieee1284_epp_read_data (struct parport *port,
  653.        void *buffer, size_t len,
  654.        int flags)
  655. {
  656. unsigned char *bp = (unsigned char *) buffer;
  657. unsigned ret = 0;
  658. /* set EPP idle state (just to make sure) with strobe high */
  659. parport_frob_control (port,
  660.       PARPORT_CONTROL_STROBE |
  661.       PARPORT_CONTROL_AUTOFD |
  662.       PARPORT_CONTROL_SELECT |
  663.       PARPORT_CONTROL_INIT,
  664.       PARPORT_CONTROL_INIT);
  665. port->ops->data_reverse (port);
  666. for (; len > 0; len--, bp++) {
  667. /* Event 67: set nAutoFd (nDStrb) low */
  668. parport_frob_control (port,
  669.       PARPORT_CONTROL_AUTOFD,
  670.       PARPORT_CONTROL_AUTOFD);
  671. /* Event 58: wait for Busy to go high */
  672. if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
  673. break;
  674. }
  675. *bp = parport_read_data (port);
  676. /* Event 63: set nAutoFd (nDStrb) high */
  677. parport_frob_control (port, PARPORT_CONTROL_AUTOFD, 0);
  678. /* Event 60: wait for Busy to go low */
  679. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
  680.      PARPORT_STATUS_BUSY, 5)) {
  681. break;
  682. }
  683. ret++;
  684. }
  685. port->ops->data_forward (port);
  686. return ret;
  687. }
  688. /* EPP mode, forward channel, addresses. */
  689. size_t parport_ieee1284_epp_write_addr (struct parport *port,
  690. const void *buffer, size_t len,
  691. int flags)
  692. {
  693. unsigned char *bp = (unsigned char *) buffer;
  694. size_t ret = 0;
  695. /* set EPP idle state (just to make sure) with strobe low */
  696. parport_frob_control (port,
  697.       PARPORT_CONTROL_STROBE |
  698.       PARPORT_CONTROL_AUTOFD |
  699.       PARPORT_CONTROL_SELECT |
  700.       PARPORT_CONTROL_INIT,
  701.       PARPORT_CONTROL_STROBE |
  702.       PARPORT_CONTROL_INIT);
  703. port->ops->data_forward (port);
  704. for (; len > 0; len--, bp++) {
  705. /* Event 56: Write data and set nAStrb low. */
  706. parport_write_data (port, *bp);
  707. parport_frob_control (port, PARPORT_CONTROL_SELECT,
  708.       PARPORT_CONTROL_SELECT);
  709. /* Event 58: wait for busy (nWait) to go high */
  710. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 0, 10))
  711. break;
  712. /* Event 59: set nAStrb high */
  713. parport_frob_control (port, PARPORT_CONTROL_SELECT, 0);
  714. /* Event 60: wait for busy (nWait) to go low */
  715. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY,
  716.      PARPORT_STATUS_BUSY, 5))
  717. break;
  718. ret++;
  719. }
  720. /* Event 61: set strobe (nWrite) high */
  721. parport_frob_control (port, PARPORT_CONTROL_STROBE, 0);
  722. return ret;
  723. }
  724. /* EPP mode, reverse channel, addresses. */
  725. size_t parport_ieee1284_epp_read_addr (struct parport *port,
  726.        void *buffer, size_t len,
  727.        int flags)
  728. {
  729. unsigned char *bp = (unsigned char *) buffer;
  730. unsigned ret = 0;
  731. /* Set EPP idle state (just to make sure) with strobe high */
  732. parport_frob_control (port,
  733.       PARPORT_CONTROL_STROBE |
  734.       PARPORT_CONTROL_AUTOFD |
  735.       PARPORT_CONTROL_SELECT |
  736.       PARPORT_CONTROL_INIT,
  737.       PARPORT_CONTROL_INIT);
  738. port->ops->data_reverse (port);
  739. for (; len > 0; len--, bp++) {
  740. /* Event 64: set nSelectIn (nAStrb) low */
  741. parport_frob_control (port, PARPORT_CONTROL_SELECT,
  742.       PARPORT_CONTROL_SELECT);
  743. /* Event 58: wait for Busy to go high */
  744. if (parport_wait_peripheral (port, PARPORT_STATUS_BUSY, 0)) {
  745. break;
  746. }
  747. *bp = parport_read_data (port);
  748. /* Event 59: set nSelectIn (nAStrb) high */
  749. parport_frob_control (port, PARPORT_CONTROL_SELECT,
  750.       PARPORT_CONTROL_SELECT);
  751. /* Event 60: wait for Busy to go low */
  752. if (parport_poll_peripheral (port, PARPORT_STATUS_BUSY, 
  753.      PARPORT_STATUS_BUSY, 5))
  754. break;
  755. ret++;
  756. }
  757. port->ops->data_forward (port);
  758. return ret;
  759. }