paride.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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/kmod.h>
  19. #include <linux/types.h>
  20. #include <linux/kernel.h>
  21. #include <linux/ioport.h>
  22. #include <linux/string.h>
  23. #include <linux/spinlock.h>
  24. #include <linux/wait.h>
  25. #include <linux/sched.h> /* TASK_* */
  26. #include <linux/parport.h>
  27. #include "paride.h"
  28. MODULE_LICENSE("GPL");
  29. #define MAX_PROTOS 32
  30. static struct pi_protocol *protocols[MAX_PROTOS];
  31. static DEFINE_SPINLOCK(pi_spinlock);
  32. void pi_write_regr(PIA * pi, int cont, int regr, int val)
  33. {
  34. pi->proto->write_regr(pi, cont, regr, val);
  35. }
  36. EXPORT_SYMBOL(pi_write_regr);
  37. int pi_read_regr(PIA * pi, int cont, int regr)
  38. {
  39. return pi->proto->read_regr(pi, cont, regr);
  40. }
  41. EXPORT_SYMBOL(pi_read_regr);
  42. void pi_write_block(PIA * pi, char *buf, int count)
  43. {
  44. pi->proto->write_block(pi, buf, count);
  45. }
  46. EXPORT_SYMBOL(pi_write_block);
  47. void pi_read_block(PIA * pi, char *buf, int count)
  48. {
  49. pi->proto->read_block(pi, buf, count);
  50. }
  51. EXPORT_SYMBOL(pi_read_block);
  52. static void pi_wake_up(void *p)
  53. {
  54. PIA *pi = (PIA *) p;
  55. unsigned long flags;
  56. void (*cont) (void) = NULL;
  57. spin_lock_irqsave(&pi_spinlock, flags);
  58. if (pi->claim_cont && !parport_claim(pi->pardev)) {
  59. cont = pi->claim_cont;
  60. pi->claim_cont = NULL;
  61. pi->claimed = 1;
  62. }
  63. spin_unlock_irqrestore(&pi_spinlock, flags);
  64. wake_up(&(pi->parq));
  65. if (cont)
  66. cont();
  67. }
  68. int pi_schedule_claimed(PIA * pi, void (*cont) (void))
  69. {
  70. unsigned long flags;
  71. spin_lock_irqsave(&pi_spinlock, flags);
  72. if (pi->pardev && parport_claim(pi->pardev)) {
  73. pi->claim_cont = cont;
  74. spin_unlock_irqrestore(&pi_spinlock, flags);
  75. return 0;
  76. }
  77. pi->claimed = 1;
  78. spin_unlock_irqrestore(&pi_spinlock, flags);
  79. return 1;
  80. }
  81. EXPORT_SYMBOL(pi_schedule_claimed);
  82. void pi_do_claimed(PIA * pi, void (*cont) (void))
  83. {
  84. if (pi_schedule_claimed(pi, cont))
  85. cont();
  86. }
  87. EXPORT_SYMBOL(pi_do_claimed);
  88. static void pi_claim(PIA * pi)
  89. {
  90. if (pi->claimed)
  91. return;
  92. pi->claimed = 1;
  93. if (pi->pardev)
  94. wait_event(pi->parq,
  95. !parport_claim((struct pardevice *) pi->pardev));
  96. }
  97. static void pi_unclaim(PIA * pi)
  98. {
  99. pi->claimed = 0;
  100. if (pi->pardev)
  101. parport_release((struct pardevice *) (pi->pardev));
  102. }
  103. void pi_connect(PIA * pi)
  104. {
  105. pi_claim(pi);
  106. pi->proto->connect(pi);
  107. }
  108. EXPORT_SYMBOL(pi_connect);
  109. void pi_disconnect(PIA * pi)
  110. {
  111. pi->proto->disconnect(pi);
  112. pi_unclaim(pi);
  113. }
  114. EXPORT_SYMBOL(pi_disconnect);
  115. static void pi_unregister_parport(PIA * pi)
  116. {
  117. if (pi->pardev) {
  118. parport_unregister_device((struct pardevice *) (pi->pardev));
  119. pi->pardev = NULL;
  120. }
  121. }
  122. void pi_release(PIA * pi)
  123. {
  124. pi_unregister_parport(pi);
  125. if (pi->proto->release_proto)
  126. pi->proto->release_proto(pi);
  127. module_put(pi->proto->owner);
  128. }
  129. EXPORT_SYMBOL(pi_release);
  130. static int default_test_proto(PIA * pi, char *scratch, int verbose)
  131. {
  132. int j, k;
  133. int e[2] = { 0, 0 };
  134. pi->proto->connect(pi);
  135. for (j = 0; j < 2; j++) {
  136. pi_write_regr(pi, 0, 6, 0xa0 + j * 0x10);
  137. for (k = 0; k < 256; k++) {
  138. pi_write_regr(pi, 0, 2, k ^ 0xaa);
  139. pi_write_regr(pi, 0, 3, k ^ 0x55);
  140. if (pi_read_regr(pi, 0, 2) != (k ^ 0xaa))
  141. e[j]++;
  142. }
  143. }
  144. pi->proto->disconnect(pi);
  145. if (verbose)
  146. printk("%s: %s: port 0x%x, mode %d, test=(%d,%d)\n",
  147. pi->device, pi->proto->name, pi->port,
  148. pi->mode, e[0], e[1]);
  149. return (e[0] && e[1]); /* not here if both > 0 */
  150. }
  151. static int pi_test_proto(PIA * pi, char *scratch, int verbose)
  152. {
  153. int res;
  154. pi_claim(pi);
  155. if (pi->proto->test_proto)
  156. res = pi->proto->test_proto(pi, scratch, verbose);
  157. else
  158. res = default_test_proto(pi, scratch, verbose);
  159. pi_unclaim(pi);
  160. return res;
  161. }
  162. int paride_register(PIP * pr)
  163. {
  164. int k;
  165. for (k = 0; k < MAX_PROTOS; k++)
  166. if (protocols[k] && !strcmp(pr->name, protocols[k]->name)) {
  167. printk("paride: %s protocol already registered\n",
  168. pr->name);
  169. return -1;
  170. }
  171. k = 0;
  172. while ((k < MAX_PROTOS) && (protocols[k]))
  173. k++;
  174. if (k == MAX_PROTOS) {
  175. printk("paride: protocol table full\n");
  176. return -1;
  177. }
  178. protocols[k] = pr;
  179. pr->index = k;
  180. printk("paride: %s registered as protocol %d\n", pr->name, k);
  181. return 0;
  182. }
  183. EXPORT_SYMBOL(paride_register);
  184. void paride_unregister(PIP * pr)
  185. {
  186. if (!pr)
  187. return;
  188. if (protocols[pr->index] != pr) {
  189. printk("paride: %s not registered\n", pr->name);
  190. return;
  191. }
  192. protocols[pr->index] = NULL;
  193. }
  194. EXPORT_SYMBOL(paride_unregister);
  195. static int pi_register_parport(PIA * pi, int verbose)
  196. {
  197. struct parport *port;
  198. port = parport_find_base(pi->port);
  199. if (!port)
  200. return 0;
  201. pi->pardev = parport_register_device(port,
  202. pi->device, NULL,
  203. pi_wake_up, NULL, 0, (void *) pi);
  204. parport_put_port(port);
  205. if (!pi->pardev)
  206. return 0;
  207. init_waitqueue_head(&pi->parq);
  208. if (verbose)
  209. printk("%s: 0x%x is %s\n", pi->device, pi->port, port->name);
  210. pi->parname = (char *) port->name;
  211. return 1;
  212. }
  213. static int pi_probe_mode(PIA * pi, int max, char *scratch, int verbose)
  214. {
  215. int best, range;
  216. if (pi->mode != -1) {
  217. if (pi->mode >= max)
  218. return 0;
  219. range = 3;
  220. if (pi->mode >= pi->proto->epp_first)
  221. range = 8;
  222. if ((range == 8) && (pi->port % 8))
  223. return 0;
  224. pi->reserved = range;
  225. return (!pi_test_proto(pi, scratch, verbose));
  226. }
  227. best = -1;
  228. for (pi->mode = 0; pi->mode < max; pi->mode++) {
  229. range = 3;
  230. if (pi->mode >= pi->proto->epp_first)
  231. range = 8;
  232. if ((range == 8) && (pi->port % 8))
  233. break;
  234. pi->reserved = range;
  235. if (!pi_test_proto(pi, scratch, verbose))
  236. best = pi->mode;
  237. }
  238. pi->mode = best;
  239. return (best > -1);
  240. }
  241. static int pi_probe_unit(PIA * pi, int unit, char *scratch, int verbose)
  242. {
  243. int max, s, e;
  244. s = unit;
  245. e = s + 1;
  246. if (s == -1) {
  247. s = 0;
  248. e = pi->proto->max_units;
  249. }
  250. if (!pi_register_parport(pi, verbose))
  251. return 0;
  252. if (pi->proto->test_port) {
  253. pi_claim(pi);
  254. max = pi->proto->test_port(pi);
  255. pi_unclaim(pi);
  256. } else
  257. max = pi->proto->max_mode;
  258. if (pi->proto->probe_unit) {
  259. pi_claim(pi);
  260. for (pi->unit = s; pi->unit < e; pi->unit++)
  261. if (pi->proto->probe_unit(pi)) {
  262. pi_unclaim(pi);
  263. if (pi_probe_mode(pi, max, scratch, verbose))
  264. return 1;
  265. pi_unregister_parport(pi);
  266. return 0;
  267. }
  268. pi_unclaim(pi);
  269. pi_unregister_parport(pi);
  270. return 0;
  271. }
  272. if (!pi_probe_mode(pi, max, scratch, verbose)) {
  273. pi_unregister_parport(pi);
  274. return 0;
  275. }
  276. return 1;
  277. }
  278. int pi_init(PIA * pi, int autoprobe, int port, int mode,
  279. int unit, int protocol, int delay, char *scratch,
  280. int devtype, int verbose, char *device)
  281. {
  282. int p, k, s, e;
  283. int lpts[7] = { 0x3bc, 0x378, 0x278, 0x268, 0x27c, 0x26c, 0 };
  284. s = protocol;
  285. e = s + 1;
  286. if (!protocols[0])
  287. request_module("paride_protocol");
  288. if (autoprobe) {
  289. s = 0;
  290. e = MAX_PROTOS;
  291. } else if ((s < 0) || (s >= MAX_PROTOS) || (port <= 0) ||
  292. (!protocols[s]) || (unit < 0) ||
  293. (unit >= protocols[s]->max_units)) {
  294. printk("%s: Invalid parameters\n", device);
  295. return 0;
  296. }
  297. for (p = s; p < e; p++) {
  298. struct pi_protocol *proto = protocols[p];
  299. if (!proto)
  300. continue;
  301. /* still racy */
  302. if (!try_module_get(proto->owner))
  303. continue;
  304. pi->proto = proto;
  305. pi->private = 0;
  306. if (proto->init_proto && proto->init_proto(pi) < 0) {
  307. pi->proto = NULL;
  308. module_put(proto->owner);
  309. continue;
  310. }
  311. if (delay == -1)
  312. pi->delay = pi->proto->default_delay;
  313. else
  314. pi->delay = delay;
  315. pi->devtype = devtype;
  316. pi->device = device;
  317. pi->parname = NULL;
  318. pi->pardev = NULL;
  319. init_waitqueue_head(&pi->parq);
  320. pi->claimed = 0;
  321. pi->claim_cont = NULL;
  322. pi->mode = mode;
  323. if (port != -1) {
  324. pi->port = port;
  325. if (pi_probe_unit(pi, unit, scratch, verbose))
  326. break;
  327. pi->port = 0;
  328. } else {
  329. k = 0;
  330. while ((pi->port = lpts[k++]))
  331. if (pi_probe_unit
  332. (pi, unit, scratch, verbose))
  333. break;
  334. if (pi->port)
  335. break;
  336. }
  337. if (pi->proto->release_proto)
  338. pi->proto->release_proto(pi);
  339. module_put(proto->owner);
  340. }
  341. if (!pi->port) {
  342. if (autoprobe)
  343. printk("%s: Autoprobe failed\n", device);
  344. else
  345. printk("%s: Adapter not found\n", device);
  346. return 0;
  347. }
  348. if (pi->parname)
  349. printk("%s: Sharing %s at 0x%x\n", pi->device,
  350. pi->parname, pi->port);
  351. pi->proto->log_adapter(pi, scratch, verbose);
  352. return 1;
  353. }
  354. EXPORT_SYMBOL(pi_init);