tnt4882_write.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /***************************************************************************
  2. tnt4882_write.c - description
  3. -------------------
  4. copyright : (C) 2003 by Frank Mori Hess
  5. email : fmhess@users.sourceforge.net
  6. ***************************************************************************/
  7. /***************************************************************************
  8. * *
  9. * This program is free software; you can redistribute it and/or modify *
  10. * it under the terms of the GNU General Public License as published by *
  11. * the Free Software Foundation; either version 2 of the License, or *
  12. * (at your option) any later version. *
  13. * *
  14. ***************************************************************************/
  15. #include "tnt4882.h"
  16. #include <linux/delay.h>
  17. static int fifo_space_available( tnt4882_private_t *tnt_priv )
  18. {
  19. int status2;
  20. int retval;
  21. status2 = tnt_readb( tnt_priv, STS2 );
  22. retval = ( status2 & AFFN ) && ( status2 & BFFN );
  23. return retval;
  24. }
  25. static int fifo_xfer_done( tnt4882_private_t *tnt_priv )
  26. {
  27. int status1;
  28. int retval;
  29. status1 = tnt_readb( tnt_priv, STS1 );
  30. retval = status1 & ( S_DONE | S_HALT );
  31. return retval;
  32. }
  33. static unsigned tnt_transfer_count(tnt4882_private_t *tnt_priv)
  34. {
  35. unsigned count = 0;
  36. count |= tnt_readb(tnt_priv, CNT0) & 0xff;
  37. count |= (tnt_readb(tnt_priv, CNT1) << 8) & 0xff00;
  38. count |= (tnt_readb(tnt_priv, CNT2) << 16) & 0xff0000;
  39. count |= (tnt_readb(tnt_priv, CNT3) << 24) & 0xff000000;
  40. // return two's complement
  41. return -count;
  42. };
  43. static int write_wait( gpib_board_t *board, tnt4882_private_t *tnt_priv,
  44. int wait_for_done )
  45. {
  46. nec7210_private_t *nec_priv = &tnt_priv->nec7210_priv;
  47. if( wait_event_interruptible( board->wait,
  48. ( !wait_for_done && fifo_space_available( tnt_priv ) ) ||
  49. fifo_xfer_done( tnt_priv ) ||
  50. test_bit( BUS_ERROR_BN, &nec_priv->state ) ||
  51. test_bit( DEV_CLEAR_BN, &nec_priv->state ) ||
  52. test_bit( TIMO_NUM, &board->status ) ) )
  53. {
  54. GPIB_DPRINTK( "gpib write interrupted\n" );
  55. return -ERESTARTSYS;
  56. }
  57. if( test_bit( TIMO_NUM, &board->status ) )
  58. {
  59. printk("tnt4882: write timed out\n");
  60. return -ETIMEDOUT;
  61. }
  62. if( test_and_clear_bit( BUS_ERROR_BN, &nec_priv->state ) )
  63. {
  64. printk("tnt4882: write bus error\n");
  65. return -EIO;
  66. }
  67. if( test_bit( DEV_CLEAR_BN, &nec_priv->state ) )
  68. {
  69. printk("tnt4882: device clear interrupted write\n" );
  70. return -EINTR;
  71. }
  72. return 0;
  73. }
  74. static int generic_write( gpib_board_t *board, uint8_t *buffer, size_t length,
  75. int send_eoi, int send_commands, size_t *bytes_written)
  76. {
  77. size_t count = 0;
  78. ssize_t retval = 0;
  79. tnt4882_private_t *tnt_priv = board->private_data;
  80. nec7210_private_t *nec_priv = &tnt_priv->nec7210_priv;
  81. unsigned int bits, imr0_bits, imr1_bits, imr2_bits;
  82. int32_t hw_count;
  83. unsigned long flags;
  84. *bytes_written = 0;
  85. // FIXME: really, DEV_CLEAR_BN should happen elsewhere to prevent race
  86. clear_bit(DEV_CLEAR_BN, &nec_priv->state);
  87. imr1_bits = nec_priv->reg_bits[ IMR1 ];
  88. imr2_bits = nec_priv->reg_bits[ IMR2 ];
  89. nec7210_set_reg_bits( nec_priv, IMR1, 0xff, HR_ERRIE | HR_DECIE );
  90. if( nec_priv->type != TNT4882 )
  91. nec7210_set_reg_bits( nec_priv, IMR2, 0xff, HR_DMAO );
  92. else
  93. nec7210_set_reg_bits( nec_priv, IMR2, 0xff, 0 );
  94. imr0_bits = tnt_priv->imr0_bits;
  95. tnt_priv->imr0_bits &= ~TNT_ATNI_BIT;
  96. tnt_writeb(tnt_priv, tnt_priv->imr0_bits, IMR0);
  97. tnt_writeb( tnt_priv, RESET_FIFO, CMDR );
  98. udelay(1);
  99. bits = TNT_TLCHE | TNT_B_16BIT;
  100. if( send_eoi )
  101. {
  102. bits |= TNT_CCEN;
  103. if(nec_priv->type != TNT4882 )
  104. tnt_writeb( tnt_priv, AUX_SEOI, CCR );
  105. }
  106. if( send_commands )
  107. bits |= TNT_COMMAND;
  108. tnt_writeb( tnt_priv, bits, CFG );
  109. // load 2's complement of count into hardware counters
  110. hw_count = -length;
  111. tnt_writeb( tnt_priv, hw_count & 0xff, CNT0 );
  112. tnt_writeb( tnt_priv, ( hw_count >> 8 ) & 0xff, CNT1 );
  113. tnt_writeb( tnt_priv, ( hw_count >> 16 ) & 0xff, CNT2 );
  114. tnt_writeb( tnt_priv, ( hw_count >> 24 ) & 0xff, CNT3 );
  115. tnt_writeb( tnt_priv, GO, CMDR );
  116. udelay(1);
  117. spin_lock_irqsave( &board->spinlock, flags );
  118. tnt_priv->imr3_bits |= HR_DONE;
  119. tnt_writeb( tnt_priv, tnt_priv->imr3_bits, IMR3 );
  120. spin_unlock_irqrestore( &board->spinlock, flags );
  121. while( count < length )
  122. {
  123. // wait until byte is ready to be sent
  124. retval = write_wait( board, tnt_priv, 0 );
  125. if( retval < 0 ) break;
  126. if( fifo_xfer_done( tnt_priv ) ) break;
  127. spin_lock_irqsave( &board->spinlock, flags );
  128. while( fifo_space_available( tnt_priv ) && count < length )
  129. {
  130. uint16_t word;
  131. word = buffer[ count++ ] & 0xff;
  132. if( count < length )
  133. word |= ( buffer[ count++ ] << 8 ) & 0xff00;
  134. tnt_priv->io_writew( word, nec_priv->iobase + FIFOB );
  135. }
  136. tnt_priv->imr3_bits |= HR_NFF;
  137. tnt_writeb( tnt_priv, tnt_priv->imr3_bits, IMR3 );
  138. spin_unlock_irqrestore( &board->spinlock, flags );
  139. if(need_resched())
  140. schedule();
  141. }
  142. // wait last byte has been sent
  143. if(retval == 0)
  144. retval = write_wait(board, tnt_priv, 1);
  145. tnt_writeb( tnt_priv, STOP, CMDR );
  146. udelay(1);
  147. nec7210_set_reg_bits( nec_priv, IMR1, 0xff, imr1_bits );
  148. nec7210_set_reg_bits( nec_priv, IMR2, 0xff, imr2_bits );
  149. tnt_priv->imr0_bits = imr0_bits;
  150. tnt_writeb(tnt_priv, tnt_priv->imr0_bits, IMR0);
  151. /* force handling of any interrupts that happened
  152. * while they were masked (this appears to be needed)*/
  153. tnt4882_internal_interrupt(board);
  154. *bytes_written = length - tnt_transfer_count(tnt_priv);
  155. return retval;
  156. }
  157. int tnt4882_accel_write(gpib_board_t *board, uint8_t *buffer, size_t length, int send_eoi, size_t *bytes_written)
  158. {
  159. return generic_write( board, buffer, length, send_eoi, 0, bytes_written);
  160. }
  161. ssize_t tnt4882_command(gpib_board_t *board, uint8_t *buffer, size_t length)
  162. {
  163. int retval;
  164. size_t bytes_written;
  165. retval = generic_write( board, buffer, length, 0, 1, &bytes_written);
  166. if(retval < 0) return retval;
  167. return bytes_written;
  168. }