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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* 
  2.         paride.c  (c) 1997-8  Grant R. Guenther <grant@torque.net>
  3.                               Under the terms of the GNU General Public License.
  4. This is the base module for the family of device drivers
  5.         that support parallel port IDE devices.  
  6. */
  7. /* Changes:
  8. 1.01 GRG 1998.05.03 Use spinlocks
  9. 1.02 GRG 1998.05.05  init_proto, release_proto, ktti
  10. 1.03 GRG 1998.08.15  eliminate compiler warning
  11. 1.04    GRG 1998.11.28  added support for FRIQ 
  12. 1.05    TMW 2000.06.06  use parport_find_number instead of
  13. parport_enumerate
  14. 1.06    TMW 2001.03.26  more sane parport-or-not resource management
  15. */
  16. #define PI_VERSION      "1.06"
  17. #include <linux/module.h>
  18. #include <linux/config.h>
  19. #include <linux/kmod.h>
  20. #include <linux/types.h>
  21. #include <linux/kernel.h>
  22. #include <linux/ioport.h>
  23. #include <linux/string.h>
  24. #include <linux/spinlock.h>
  25. #include <linux/wait.h>
  26. #ifdef CONFIG_PARPORT_MODULE
  27. #define CONFIG_PARPORT
  28. #endif
  29. #ifdef CONFIG_PARPORT
  30. #include <linux/parport.h>
  31. #endif
  32. #include "paride.h"
  33. #define MAX_PROTOS 32
  34. static struct pi_protocol *protocols[MAX_PROTOS];
  35. static spinlock_t pi_spinlock = SPIN_LOCK_UNLOCKED;
  36. void pi_write_regr( PIA *pi, int cont, int regr, int val)
  37. { pi->proto->write_regr(pi,cont,regr,val);
  38. }
  39. int pi_read_regr( PIA *pi, int cont, int regr)
  40. { return pi->proto->read_regr(pi,cont,regr);
  41. }
  42. void pi_write_block( PIA *pi, char * buf, int count)
  43. { pi->proto->write_block(pi,buf,count);
  44. }
  45. void pi_read_block( PIA *pi, char * buf, int count)
  46. {       pi->proto->read_block(pi,buf,count);
  47. }
  48. #ifdef CONFIG_PARPORT
  49. static void pi_wake_up( void *p)
  50. {       PIA  *pi = (PIA *) p;
  51. unsigned long flags;
  52. void (*cont)(void) = NULL;
  53. spin_lock_irqsave(&pi_spinlock,flags);
  54. if (pi->claim_cont && !parport_claim(pi->pardev)) {
  55. cont = pi->claim_cont;
  56. pi->claim_cont = NULL;
  57. pi->claimed = 1;
  58. }
  59. spin_unlock_irqrestore(&pi_spinlock,flags);
  60. wake_up(&(pi->parq));
  61. if (cont) cont();
  62. }
  63. #endif
  64. void pi_do_claimed( PIA *pi, void(*cont)(void))
  65. #ifdef CONFIG_PARPORT
  66. { unsigned long flags;
  67. spin_lock_irqsave(&pi_spinlock,flags); 
  68. if (!pi->pardev || !parport_claim(pi->pardev)) {
  69. pi->claimed = 1;
  70. spin_unlock_irqrestore(&pi_spinlock,flags);
  71. cont();
  72. } else {
  73. pi->claim_cont = cont;
  74. spin_unlock_irqrestore(&pi_spinlock,flags);
  75. }
  76. }
  77. #else
  78. { cont();
  79. }
  80. #endif
  81. static void pi_claim( PIA *pi)
  82. { if (pi->claimed) return;
  83. pi->claimed = 1;
  84. #ifdef CONFIG_PARPORT
  85.         if (pi->pardev)
  86. wait_event (pi->parq,
  87.     !parport_claim ((struct pardevice *)pi->pardev));
  88. #endif
  89. }
  90. static void pi_unclaim( PIA *pi)
  91. { pi->claimed = 0;
  92. #ifdef CONFIG_PARPORT
  93.         if (pi->pardev) parport_release((struct pardevice *)(pi->pardev));
  94. #endif 
  95. }
  96. void pi_connect( PIA *pi)
  97. { pi_claim(pi);
  98. pi->proto->connect(pi);
  99. }
  100. void pi_disconnect( PIA *pi)
  101. { pi->proto->disconnect(pi);
  102. pi_unclaim(pi);
  103. }
  104. static void pi_unregister_parport( PIA *pi)
  105. {
  106. #ifdef CONFIG_PARPORT
  107.         if (pi->pardev) {
  108.            parport_unregister_device((struct pardevice *)(pi->pardev));
  109.    pi->pardev = NULL;
  110. }
  111. #endif
  112. }
  113. void pi_release( PIA *pi)
  114. { pi_unregister_parport(pi);
  115. #ifndef CONFIG_PARPORT
  116. if (pi->reserved)
  117. release_region(pi->port,pi->reserved);
  118. #endif /* !CONFIG_PARPORT */
  119. pi->proto->release_proto(pi);
  120. }
  121. #define WR(r,v)         pi_write_regr(pi,0,r,v)
  122. #define RR(r)           (pi_read_regr(pi,0,r))
  123. static int pi_test_proto( PIA *pi, char * scratch, int verbose )
  124. {       int     j, k;
  125.         int     e[2] = {0,0};
  126. if (pi->proto->test_proto) {
  127. pi_claim(pi);
  128. j = pi->proto->test_proto(pi,scratch,verbose);
  129. pi_unclaim(pi);
  130. return j;
  131. }
  132.         pi_connect(pi);
  133.         for (j=0;j<2;j++) {
  134.                 WR(6,0xa0+j*0x10);
  135.                 for (k=0;k<256;k++) {
  136.                         WR(2,k^0xaa);
  137.                         WR(3,k^0x55);
  138.                         if (RR(2) != (k^0xaa)) e[j]++;
  139.                         }
  140.                 }
  141.         pi_disconnect(pi);
  142.         if (verbose)
  143.                 printk("%s: %s: port 0x%x, mode  %d, test=(%d,%d)n",
  144.                         pi->device,pi->proto->name,pi->port,
  145. pi->mode,e[0],e[1]);
  146.         return (e[0] && e[1]);  /* not here if both > 0 */
  147. }
  148. int  pi_register( PIP *pr)
  149. { int k;
  150. for (k=0;k<MAX_PROTOS;k++) 
  151.    if (protocols[k] && !strcmp(pr->name,protocols[k]->name)) {
  152. printk("paride: %s protocol already registeredn",pr->name);
  153. return 0;
  154.    }
  155. k = 0;
  156. while((k<MAX_PROTOS) && (protocols[k])) k++;
  157. if (k == MAX_PROTOS) {
  158. printk("paride: protocol table fulln");
  159. return 0;
  160. }
  161. MOD_INC_USE_COUNT;
  162. protocols[k] = pr;
  163. pr->index = k;
  164. printk("paride: %s registered as protocol %dn",pr->name,k);
  165. return 1;
  166. }
  167. void pi_unregister( PIP *pr)
  168. { if (!pr) return;
  169. if (protocols[pr->index] != pr) {
  170. printk("paride: %s not registeredn",pr->name);
  171. return;
  172. protocols[pr->index] = 0;
  173. MOD_DEC_USE_COUNT;
  174. }
  175. static int pi_register_parport( PIA *pi, int verbose)
  176. {
  177. #ifdef CONFIG_PARPORT
  178. struct parport *port;
  179. port = parport_find_base (pi->port);
  180. if (!port)
  181.   return 0;
  182. pi->pardev = parport_register_device(port,
  183.      pi->device,NULL,
  184.      pi_wake_up,NULL,
  185.      0,(void *)pi);
  186. parport_put_port (port);
  187. if (!pi->pardev)
  188.   return 0;
  189. init_waitqueue_head(&pi->parq);
  190. if (verbose) printk("%s: 0x%x is %sn",pi->device,pi->port,
  191.     port->name);
  192. pi->parname = (char *)port->name;
  193. #endif
  194. return 1;
  195. }
  196. static int pi_probe_mode( PIA *pi, int max, char * scratch, int verbose)
  197. { int best, range;
  198. if (pi->mode != -1) {
  199. if (pi->mode >= max) return 0;
  200. range = 3;
  201. if (pi->mode >= pi->proto->epp_first) range = 8;
  202. if ((range == 8) && (pi->port % 8)) return 0;
  203. pi->reserved = range;
  204. return (!pi_test_proto(pi,scratch,verbose));
  205. }
  206. best = -1;
  207. for(pi->mode=0;pi->mode<max;pi->mode++) {
  208. range = 3;
  209. if (pi->mode >= pi->proto->epp_first) range = 8;
  210. if ((range == 8) && (pi->port % 8)) break;
  211. pi->reserved = range;
  212. if (!pi_test_proto(pi,scratch,verbose)) best = pi->mode;
  213. }
  214. pi->mode = best;
  215. return (best > -1);
  216. }
  217. static int pi_probe_unit( PIA *pi, int unit, char * scratch, int verbose)
  218. { int max,s,e;
  219. s = unit; e = s+1;
  220. if (s == -1) { 
  221. s = 0; 
  222. e = pi->proto->max_units; 
  223. }
  224. if (!pi_register_parport(pi,verbose))
  225.   return 0;
  226. if (pi->proto->test_port) {
  227. pi_claim(pi);
  228. max = pi->proto->test_port(pi);
  229. pi_unclaim(pi);
  230. }
  231. else max = pi->proto->max_mode;
  232. if (pi->proto->probe_unit) {
  233.    pi_claim(pi);
  234.    for (pi->unit=s;pi->unit<e;pi->unit++)
  235.       if (pi->proto->probe_unit(pi)) {
  236.  pi_unclaim(pi);
  237.  if (pi_probe_mode(pi,max,scratch,verbose)) return 1;
  238.          pi_unregister_parport(pi); 
  239.  return 0;
  240.          }
  241.    pi_unclaim(pi);
  242.    pi_unregister_parport(pi); 
  243.    return 0;
  244.    }
  245. if (!pi_probe_mode(pi,max,scratch,verbose)) {
  246.    pi_unregister_parport(pi); 
  247.    return 0;
  248. }
  249. return 1;
  250. }
  251. int pi_init(PIA *pi, int autoprobe, int port, int mode, 
  252.     int unit, int protocol, int delay, char * scratch, 
  253.     int devtype, int verbose, char *device )
  254. { int p,k,s,e;
  255. int lpts[7] = {0x3bc,0x378,0x278,0x268,0x27c,0x26c,0};
  256. s = protocol; e = s+1;
  257. if (!protocols[0])
  258. request_module ("paride_protocol");
  259. if (autoprobe) {
  260. s = 0; 
  261. e = MAX_PROTOS;
  262. } else if ((s < 0) || (s >= MAX_PROTOS) || (port <= 0) ||
  263.     (!protocols[s]) || (unit < 0) || 
  264.     (unit >= protocols[s]->max_units)) {
  265. printk("%s: Invalid parametersn",device);
  266. return 0;
  267.         }
  268. for (p=s;p<e;p++) {
  269.   if (protocols[p]) {
  270. pi->proto = protocols[p];
  271. pi->private = 0;
  272. pi->proto->init_proto(pi);
  273. if (delay == -1) pi->delay = pi->proto->default_delay;
  274.   else pi->delay = delay;
  275. pi->devtype = devtype;
  276. pi->device = device;
  277. pi->parname = NULL;
  278. pi->pardev = NULL;
  279. init_waitqueue_head(&pi->parq);
  280. pi->claimed = 0;
  281. pi->claim_cont = NULL;
  282.         
  283. pi->mode = mode;
  284. if (port != -1) {
  285. pi->port = port;
  286. if (pi_probe_unit(pi,unit,scratch,verbose)) break;
  287. pi->port = 0;
  288. } else { 
  289. k = 0;
  290. while ((pi->port = lpts[k++]))
  291.    if (pi_probe_unit(pi,unit,scratch,verbose)) break;
  292.        if (pi->port) break;
  293. }
  294. pi->proto->release_proto(pi);
  295.   }
  296. }
  297. if (!pi->port) {
  298. if (autoprobe) printk("%s: Autoprobe failedn",device);
  299. else printk("%s: Adapter not foundn",device);
  300. return 0;
  301. }
  302. #ifndef CONFIG_PARPORT
  303. if (!request_region(pi->port,pi->reserved,pi->device))
  304. {
  305. printk(KERN_WARNING"paride: Unable to request region 0x%xn", pi->port);
  306. return 0;
  307. }
  308. #endif /* !CONFIG_PARPORT */
  309. if (pi->parname)
  310.    printk("%s: Sharing %s at 0x%xn",pi->device,
  311. pi->parname,pi->port);
  312. pi->proto->log_adapter(pi,scratch,verbose);
  313. return 1;
  314. }
  315. #ifdef MODULE
  316. int init_module(void)
  317. {
  318. int k;
  319. const char *indicate_pp = "";
  320. #ifdef CONFIG_PARPORT
  321. indicate_pp = " (parport)";
  322. #endif
  323. for (k=0;k<MAX_PROTOS;k++) protocols[k] = 0;
  324. printk("paride: version %s installed%sn",PI_VERSION,indicate_pp);
  325. return 0;
  326. }
  327. void cleanup_module(void)
  328. {
  329. }
  330. #else
  331. void paride_init( void )
  332. {
  333. #ifdef CONFIG_PARIDE_ATEN
  334. { extern struct pi_protocol aten;
  335.   pi_register(&aten);
  336. };
  337. #endif
  338. #ifdef CONFIG_PARIDE_BPCK
  339.         { extern struct pi_protocol bpck;
  340.           pi_register(&bpck);
  341.         };
  342. #endif
  343. #ifdef CONFIG_PARIDE_COMM
  344.         { extern struct pi_protocol comm;
  345.           pi_register(&comm);
  346.         };
  347. #endif
  348. #ifdef CONFIG_PARIDE_DSTR
  349.         { extern struct pi_protocol dstr;
  350.           pi_register(&dstr);
  351.         };
  352. #endif
  353. #ifdef CONFIG_PARIDE_EPAT
  354.         { extern struct pi_protocol epat;
  355.           pi_register(&epat);
  356.         };
  357. #endif
  358. #ifdef CONFIG_PARIDE_EPIA
  359.         { extern struct pi_protocol epia;
  360.           pi_register(&epia);
  361.         };
  362. #endif
  363. #ifdef CONFIG_PARIDE_FRPW
  364.         { extern struct pi_protocol frpw;
  365.           pi_register(&frpw);
  366.         };
  367. #endif
  368. #ifdef CONFIG_PARIDE_FRIQ
  369.         { extern struct pi_protocol friq;
  370.           pi_register(&friq);
  371.         };
  372. #endif 
  373. #ifdef CONFIG_PARIDE_FIT2
  374.         { extern struct pi_protocol fit2;
  375.           pi_register(&fit2);
  376.         };
  377. #endif
  378. #ifdef CONFIG_PARIDE_FIT3
  379.         { extern struct pi_protocol fit3;
  380.           pi_register(&fit3);
  381.         };
  382. #endif
  383. #ifdef CONFIG_PARIDE_KBIC
  384.         { extern struct pi_protocol k951;
  385.           extern struct pi_protocol k971;
  386.           pi_register(&k951);
  387.           pi_register(&k971);
  388.         };
  389. #endif
  390. #ifdef CONFIG_PARIDE_KTTI
  391.         { extern struct pi_protocol ktti;
  392.           pi_register(&ktti);
  393.         };
  394. #endif
  395. #ifdef CONFIG_PARIDE_ON20
  396.         { extern struct pi_protocol on20;
  397.           pi_register(&on20);
  398.         };
  399. #endif
  400. #ifdef CONFIG_PARIDE_ON26
  401.         { extern struct pi_protocol on26;
  402.           pi_register(&on26);
  403.         };
  404. #endif
  405. #ifdef CONFIG_PARIDE_PD
  406. { extern int pd_init(void);
  407.   pd_init();
  408. };
  409. #endif
  410. #ifdef CONFIG_PARIDE_PCD
  411.         { extern int pcd_init(void);
  412.           pcd_init();
  413.         };
  414. #endif
  415. #ifdef CONFIG_PARIDE_PF
  416.         { extern int pf_init(void);
  417.           pf_init();
  418.         };
  419. #endif
  420. #ifdef CONFIG_PARIDE_PT
  421.         { extern int pt_init(void);
  422.           pt_init();
  423.         };
  424. #endif
  425. #ifdef CONFIG_PARIDE_PG
  426.         { extern int pg_init(void);
  427.           pg_init();
  428.         };
  429. #endif
  430. }
  431. #endif
  432. /* end of paride.c */
  433. MODULE_LICENSE("GPL");