cardmi.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. /*
  2. **********************************************************************
  3. * sblive_mi.c - MIDI UART input HAL for emu10k1 driver
  4. * Copyright 1999, 2000 Creative Labs, Inc.
  5. *
  6. **********************************************************************
  7. *
  8. * Date Author Summary of changes
  9. * ---- ------ ------------------
  10. * October 20, 1999 Bertrand Lee base code release
  11. * November 2, 1999 Alan Cox clean up
  12. *
  13. **********************************************************************
  14. *
  15. * This program is free software; you can redistribute it and/or
  16. * modify it under the terms of the GNU General Public License as
  17. * published by the Free Software Foundation; either version 2 of
  18. * the License, or (at your option) any later version.
  19. *
  20. * This program is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public
  26. * License along with this program; if not, write to the Free
  27. * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  28. * USA.
  29. *
  30. **********************************************************************
  31. */
  32. #include <linux/slab.h>
  33. #include <linux/jiffies.h>
  34. #include "hwaccess.h"
  35. #include "8010.h"
  36. #include "cardmi.h"
  37. #include "irqmgr.h"
  38. static int emu10k1_mpuin_callback(struct emu10k1_mpuin *card_mpuin, u32 msg, unsigned long data, u32 bytesvalid);
  39. static int sblive_miStateInit(struct emu10k1_mpuin *);
  40. static int sblive_miStateEntry(struct emu10k1_mpuin *, u8);
  41. static int sblive_miStateParse(struct emu10k1_mpuin *, u8);
  42. static int sblive_miState3Byte(struct emu10k1_mpuin *, u8);
  43. static int sblive_miState3ByteKey(struct emu10k1_mpuin *, u8);
  44. static int sblive_miState3ByteVel(struct emu10k1_mpuin *, u8);
  45. static int sblive_miState2Byte(struct emu10k1_mpuin *, u8);
  46. static int sblive_miState2ByteKey(struct emu10k1_mpuin *, u8);
  47. static int sblive_miStateSysCommon2(struct emu10k1_mpuin *, u8);
  48. static int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *, u8);
  49. static int sblive_miStateSysCommon3(struct emu10k1_mpuin *, u8);
  50. static int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *, u8);
  51. static int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *, u8);
  52. static int sblive_miStateSysExNorm(struct emu10k1_mpuin *, u8);
  53. static int sblive_miStateSysReal(struct emu10k1_mpuin *, u8);
  54. static struct {
  55. int (*Fn) (struct emu10k1_mpuin *, u8);
  56. } midistatefn[] = {
  57. {
  58. sblive_miStateParse}, {
  59. sblive_miState3Byte}, /* 0x8n, 0x9n, 0xAn, 0xBn, 0xEn */
  60. {
  61. sblive_miState3ByteKey}, /* Byte 1 */
  62. {
  63. sblive_miState3ByteVel}, /* Byte 2 */
  64. {
  65. sblive_miState2Byte}, /* 0xCn, 0xDn */
  66. {
  67. sblive_miState2ByteKey}, /* Byte 1 */
  68. {
  69. sblive_miStateSysCommon2}, /* 0xF1 , 0xF3 */
  70. {
  71. sblive_miStateSysCommon2Key}, /* 0xF1 , 0xF3, Byte 1 */
  72. {
  73. sblive_miStateSysCommon3}, /* 0xF2 */
  74. {
  75. sblive_miStateSysCommon3Key}, /* 0xF2 , Byte 1 */
  76. {
  77. sblive_miStateSysCommon3Vel}, /* 0xF2 , Byte 2 */
  78. {
  79. sblive_miStateSysExNorm}, /* 0xF0, 0xF7, Normal mode */
  80. {
  81. sblive_miStateSysReal} /* 0xF4 - 0xF6 ,0xF8 - 0xFF */
  82. };
  83. /* Installs the IRQ handler for the MPU in port */
  84. /* and initialize parameters */
  85. int emu10k1_mpuin_open(struct emu10k1_card *card, struct midi_openinfo *openinfo)
  86. {
  87. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  88. DPF(2, "emu10k1_mpuin_open\n");
  89. if (!(card_mpuin->status & FLAGS_AVAILABLE))
  90. return -1;
  91. /* Copy open info and mark channel as in use */
  92. card_mpuin->openinfo = *openinfo;
  93. card_mpuin->status &= ~FLAGS_AVAILABLE; /* clear */
  94. card_mpuin->status |= FLAGS_READY; /* set */
  95. card_mpuin->status &= ~FLAGS_MIDM_STARTED; /* clear */
  96. card_mpuin->firstmidiq = NULL;
  97. card_mpuin->lastmidiq = NULL;
  98. card_mpuin->qhead = 0;
  99. card_mpuin->qtail = 0;
  100. sblive_miStateInit(card_mpuin);
  101. emu10k1_mpu_reset(card);
  102. emu10k1_mpu_acquire(card);
  103. return 0;
  104. }
  105. int emu10k1_mpuin_close(struct emu10k1_card *card)
  106. {
  107. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  108. DPF(2, "emu10k1_mpuin_close()\n");
  109. /* Check if there are pending input SysEx buffers */
  110. if (card_mpuin->firstmidiq != NULL) {
  111. ERROR();
  112. return -1;
  113. }
  114. /* Disable RX interrupt */
  115. emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
  116. emu10k1_mpu_release(card);
  117. card_mpuin->status |= FLAGS_AVAILABLE; /* set */
  118. card_mpuin->status &= ~FLAGS_MIDM_STARTED; /* clear */
  119. return 0;
  120. }
  121. /* Adds MIDI buffer to local queue list */
  122. int emu10k1_mpuin_add_buffer(struct emu10k1_mpuin *card_mpuin, struct midi_hdr *midihdr)
  123. {
  124. struct midi_queue *midiq;
  125. unsigned long flags;
  126. DPF(2, "emu10k1_mpuin_add_buffer()\n");
  127. /* Update MIDI buffer flags */
  128. midihdr->flags |= MIDIBUF_INQUEUE; /* set */
  129. midihdr->flags &= ~MIDIBUF_DONE; /* clear */
  130. if ((midiq = (struct midi_queue *) kmalloc(sizeof(struct midi_queue), GFP_ATOMIC)) == NULL) {
  131. /* Message lost */
  132. return -1;
  133. }
  134. midiq->next = NULL;
  135. midiq->qtype = 1;
  136. midiq->length = midihdr->bufferlength;
  137. midiq->sizeLeft = midihdr->bufferlength;
  138. midiq->midibyte = midihdr->data;
  139. midiq->refdata = (unsigned long) midihdr;
  140. spin_lock_irqsave(&card_mpuin->lock, flags);
  141. if (card_mpuin->firstmidiq == NULL) {
  142. card_mpuin->firstmidiq = midiq;
  143. card_mpuin->lastmidiq = midiq;
  144. } else {
  145. (card_mpuin->lastmidiq)->next = midiq;
  146. card_mpuin->lastmidiq = midiq;
  147. }
  148. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  149. return 0;
  150. }
  151. /* First set the Time Stamp if MIDI IN has not started. */
  152. /* Then enable RX Irq. */
  153. int emu10k1_mpuin_start(struct emu10k1_card *card)
  154. {
  155. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  156. u8 dummy;
  157. DPF(2, "emu10k1_mpuin_start()\n");
  158. /* Set timestamp if not set */
  159. if (card_mpuin->status & FLAGS_MIDM_STARTED) {
  160. DPF(2, "Time Stamp not changed\n");
  161. } else {
  162. while (!emu10k1_mpu_read_data(card, &dummy));
  163. card_mpuin->status |= FLAGS_MIDM_STARTED; /* set */
  164. /* Set new time stamp */
  165. card_mpuin->timestart = (jiffies * 1000) / HZ;
  166. DPD(2, "New Time Stamp = %d\n", card_mpuin->timestart);
  167. card_mpuin->qhead = 0;
  168. card_mpuin->qtail = 0;
  169. emu10k1_irq_enable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
  170. }
  171. return 0;
  172. }
  173. /* Disable the RX Irq. If a partial recorded buffer */
  174. /* exist, send it up to IMIDI level. */
  175. int emu10k1_mpuin_stop(struct emu10k1_card *card)
  176. {
  177. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  178. struct midi_queue *midiq;
  179. unsigned long flags;
  180. DPF(2, "emu10k1_mpuin_stop()\n");
  181. emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
  182. card_mpuin->status &= ~FLAGS_MIDM_STARTED; /* clear */
  183. if (card_mpuin->firstmidiq) {
  184. spin_lock_irqsave(&card_mpuin->lock, flags);
  185. midiq = card_mpuin->firstmidiq;
  186. if (midiq != NULL) {
  187. if (midiq->sizeLeft == midiq->length)
  188. midiq = NULL;
  189. else {
  190. card_mpuin->firstmidiq = midiq->next;
  191. if (card_mpuin->firstmidiq == NULL)
  192. card_mpuin->lastmidiq = NULL;
  193. }
  194. }
  195. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  196. if (midiq) {
  197. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
  198. kfree(midiq);
  199. }
  200. }
  201. return 0;
  202. }
  203. /* Disable the RX Irq. If any buffer */
  204. /* exist, send it up to IMIDI level. */
  205. int emu10k1_mpuin_reset(struct emu10k1_card *card)
  206. {
  207. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  208. struct midi_queue *midiq;
  209. DPF(2, "emu10k1_mpuin_reset()\n");
  210. emu10k1_irq_disable(card, card->is_audigy ? A_INTE_MIDIRXENABLE : INTE_MIDIRXENABLE);
  211. while (card_mpuin->firstmidiq) {
  212. midiq = card_mpuin->firstmidiq;
  213. card_mpuin->firstmidiq = midiq->next;
  214. if (midiq->sizeLeft == midiq->length)
  215. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
  216. else
  217. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
  218. kfree(midiq);
  219. }
  220. card_mpuin->lastmidiq = NULL;
  221. card_mpuin->status &= ~FLAGS_MIDM_STARTED;
  222. return 0;
  223. }
  224. /* Passes the message with the data back to the client */
  225. /* via IRQ & DPC callbacks to Ring 3 */
  226. static int emu10k1_mpuin_callback(struct emu10k1_mpuin *card_mpuin, u32 msg, unsigned long data, u32 bytesvalid)
  227. {
  228. unsigned long timein;
  229. struct midi_queue *midiq;
  230. unsigned long callback_msg[3];
  231. struct midi_hdr *midihdr;
  232. /* Called during ISR. The data & code touched are:
  233. * 1. card_mpuin
  234. * 2. The function to be called
  235. */
  236. timein = card_mpuin->timein;
  237. if (card_mpuin->timestart <= timein)
  238. callback_msg[0] = timein - card_mpuin->timestart;
  239. else
  240. callback_msg[0] = (~0x0L - card_mpuin->timestart) + timein;
  241. if (msg == ICARDMIDI_INDATA || msg == ICARDMIDI_INDATAERROR) {
  242. callback_msg[1] = data;
  243. callback_msg[2] = bytesvalid;
  244. DPD(2, "emu10k1_mpuin_callback: midimsg = %#lx\n", data);
  245. } else {
  246. midiq = (struct midi_queue *) data;
  247. midihdr = (struct midi_hdr *) midiq->refdata;
  248. callback_msg[1] = midiq->length - midiq->sizeLeft;
  249. callback_msg[2] = midiq->refdata;
  250. midihdr->flags &= ~MIDIBUF_INQUEUE;
  251. midihdr->flags |= MIDIBUF_DONE;
  252. midihdr->bytesrecorded = midiq->length - midiq->sizeLeft;
  253. }
  254. /* Notify client that Sysex buffer has been sent */
  255. emu10k1_midi_callback(msg, card_mpuin->openinfo.refdata, callback_msg);
  256. return 0;
  257. }
  258. void emu10k1_mpuin_bh(unsigned long refdata)
  259. {
  260. u8 data;
  261. unsigned idx;
  262. struct emu10k1_mpuin *card_mpuin = (struct emu10k1_mpuin *) refdata;
  263. unsigned long flags;
  264. while (card_mpuin->qhead != card_mpuin->qtail) {
  265. spin_lock_irqsave(&card_mpuin->lock, flags);
  266. idx = card_mpuin->qhead;
  267. data = card_mpuin->midiq[idx].data;
  268. card_mpuin->timein = card_mpuin->midiq[idx].timein;
  269. idx = (idx + 1) % MIDIIN_MAX_BUFFER_SIZE;
  270. card_mpuin->qhead = idx;
  271. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  272. sblive_miStateEntry(card_mpuin, data);
  273. }
  274. return;
  275. }
  276. /* IRQ callback handler routine for the MPU in port */
  277. int emu10k1_mpuin_irqhandler(struct emu10k1_card *card)
  278. {
  279. unsigned idx;
  280. unsigned count;
  281. u8 MPUIvalue;
  282. struct emu10k1_mpuin *card_mpuin = card->mpuin;
  283. /* IRQ service routine. The data and code touched are:
  284. * 1. card_mpuin
  285. */
  286. count = 0;
  287. idx = card_mpuin->qtail;
  288. while (1) {
  289. if (emu10k1_mpu_read_data(card, &MPUIvalue) < 0) {
  290. break;
  291. } else {
  292. ++count;
  293. card_mpuin->midiq[idx].data = MPUIvalue;
  294. card_mpuin->midiq[idx].timein = (jiffies * 1000) / HZ;
  295. idx = (idx + 1) % MIDIIN_MAX_BUFFER_SIZE;
  296. }
  297. }
  298. if (count) {
  299. card_mpuin->qtail = idx;
  300. tasklet_hi_schedule(&card_mpuin->tasklet);
  301. }
  302. return 0;
  303. }
  304. /*****************************************************************************/
  305. /* Supporting functions for Midi-In Interpretation State Machine */
  306. /*****************************************************************************/
  307. /* FIXME: This should be a macro */
  308. static int sblive_miStateInit(struct emu10k1_mpuin *card_mpuin)
  309. {
  310. card_mpuin->status = 0; /* For MIDI running status */
  311. card_mpuin->fstatus = 0; /* For 0xFn status only */
  312. card_mpuin->curstate = STIN_PARSE;
  313. card_mpuin->laststate = STIN_PARSE;
  314. card_mpuin->data = 0;
  315. card_mpuin->timestart = 0;
  316. card_mpuin->timein = 0;
  317. return 0;
  318. }
  319. /* FIXME: This should be a macro */
  320. static int sblive_miStateEntry(struct emu10k1_mpuin *card_mpuin, u8 data)
  321. {
  322. return midistatefn[card_mpuin->curstate].Fn(card_mpuin, data);
  323. }
  324. static int sblive_miStateParse(struct emu10k1_mpuin *card_mpuin, u8 data)
  325. {
  326. switch (data & 0xf0) {
  327. case 0x80:
  328. case 0x90:
  329. case 0xA0:
  330. case 0xB0:
  331. case 0xE0:
  332. card_mpuin->curstate = STIN_3BYTE;
  333. break;
  334. case 0xC0:
  335. case 0xD0:
  336. card_mpuin->curstate = STIN_2BYTE;
  337. break;
  338. case 0xF0:
  339. /* System messages do not affect the previous running status! */
  340. switch (data & 0x0f) {
  341. case 0x0:
  342. card_mpuin->laststate = card_mpuin->curstate;
  343. card_mpuin->curstate = STIN_SYS_EX_NORM;
  344. if (card_mpuin->firstmidiq) {
  345. struct midi_queue *midiq;
  346. midiq = card_mpuin->firstmidiq;
  347. *midiq->midibyte = data;
  348. --midiq->sizeLeft;
  349. ++midiq->midibyte;
  350. }
  351. return CTSTATUS_NEXT_BYTE;
  352. case 0x7:
  353. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, 0xf7, 0);
  354. return -1;
  355. case 0x2:
  356. card_mpuin->laststate = card_mpuin->curstate;
  357. card_mpuin->curstate = STIN_SYS_COMMON_3;
  358. break;
  359. case 0x1:
  360. case 0x3:
  361. card_mpuin->laststate = card_mpuin->curstate;
  362. card_mpuin->curstate = STIN_SYS_COMMON_2;
  363. break;
  364. default:
  365. /* includes 0xF4 - 0xF6, 0xF8 - 0xFF */
  366. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  367. }
  368. break;
  369. default:
  370. DPF(2, "BUG: default case hit\n");
  371. return -1;
  372. }
  373. return midistatefn[card_mpuin->curstate].Fn(card_mpuin, data);
  374. }
  375. static int sblive_miState3Byte(struct emu10k1_mpuin *card_mpuin, u8 data)
  376. {
  377. u8 temp = data & 0xf0;
  378. if (temp < 0x80) {
  379. return midistatefn[STIN_3BYTE_KEY].Fn(card_mpuin, data);
  380. } else if (temp <= 0xe0 && temp != 0xc0 && temp != 0xd0) {
  381. card_mpuin->status = data;
  382. card_mpuin->curstate = STIN_3BYTE_KEY;
  383. return CTSTATUS_NEXT_BYTE;
  384. }
  385. return midistatefn[STIN_PARSE].Fn(card_mpuin, data);
  386. }
  387. static int sblive_miState3ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)
  388. /* byte 1 */
  389. {
  390. unsigned long tmp;
  391. if (data > 0x7f) {
  392. /* Real-time messages check */
  393. if (data > 0xf7)
  394. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  395. /* Invalid data! */
  396. DPF(2, "Invalid data!\n");
  397. card_mpuin->curstate = STIN_PARSE;
  398. tmp = ((unsigned long) data) << 8;
  399. tmp |= (unsigned long) card_mpuin->status;
  400. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  401. return -1;
  402. }
  403. card_mpuin->data = data;
  404. card_mpuin->curstate = STIN_3BYTE_VEL;
  405. return CTSTATUS_NEXT_BYTE;
  406. }
  407. static int sblive_miState3ByteVel(struct emu10k1_mpuin *card_mpuin, u8 data)
  408. /* byte 2 */
  409. {
  410. unsigned long tmp;
  411. if (data > 0x7f) {
  412. /* Real-time messages check */
  413. if (data > 0xf7)
  414. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  415. /* Invalid data! */
  416. DPF(2, "Invalid data!\n");
  417. card_mpuin->curstate = STIN_PARSE;
  418. tmp = ((unsigned long) data) << 8;
  419. tmp |= card_mpuin->data;
  420. tmp = tmp << 8;
  421. tmp |= (unsigned long) card_mpuin->status;
  422. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  423. return -1;
  424. }
  425. card_mpuin->curstate = STIN_3BYTE;
  426. tmp = (unsigned long) data;
  427. tmp = tmp << 8;
  428. tmp |= (unsigned long) card_mpuin->data;
  429. tmp = tmp << 8;
  430. tmp |= (unsigned long) card_mpuin->status;
  431. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3);
  432. return 0;
  433. }
  434. static int sblive_miState2Byte(struct emu10k1_mpuin *card_mpuin, u8 data)
  435. {
  436. u8 temp = data & 0xf0;
  437. if ((temp == 0xc0) || (temp == 0xd0)) {
  438. card_mpuin->status = data;
  439. card_mpuin->curstate = STIN_2BYTE_KEY;
  440. return CTSTATUS_NEXT_BYTE;
  441. }
  442. if (temp < 0x80)
  443. return midistatefn[STIN_2BYTE_KEY].Fn(card_mpuin, data);
  444. return midistatefn[STIN_PARSE].Fn(card_mpuin, data);
  445. }
  446. static int sblive_miState2ByteKey(struct emu10k1_mpuin *card_mpuin, u8 data)
  447. /* byte 1 */
  448. {
  449. unsigned long tmp;
  450. if (data > 0x7f) {
  451. /* Real-time messages check */
  452. if (data > 0xf7)
  453. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  454. /* Invalid data! */
  455. DPF(2, "Invalid data!\n");
  456. card_mpuin->curstate = STIN_PARSE;
  457. tmp = (unsigned long) data;
  458. tmp = tmp << 8;
  459. tmp |= (unsigned long) card_mpuin->status;
  460. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  461. return -1;
  462. }
  463. card_mpuin->curstate = STIN_2BYTE;
  464. tmp = (unsigned long) data;
  465. tmp = tmp << 8;
  466. tmp |= (unsigned long) card_mpuin->status;
  467. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2);
  468. return 0;
  469. }
  470. static int sblive_miStateSysCommon2(struct emu10k1_mpuin *card_mpuin, u8 data)
  471. {
  472. card_mpuin->fstatus = data;
  473. card_mpuin->curstate = STIN_SYS_COMMON_2_KEY;
  474. return CTSTATUS_NEXT_BYTE;
  475. }
  476. static int sblive_miStateSysCommon2Key(struct emu10k1_mpuin *card_mpuin, u8 data)
  477. /* byte 1 */
  478. {
  479. unsigned long tmp;
  480. if (data > 0x7f) {
  481. /* Real-time messages check */
  482. if (data > 0xf7)
  483. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  484. /* Invalid data! */
  485. DPF(2, "Invalid data!\n");
  486. card_mpuin->curstate = card_mpuin->laststate;
  487. tmp = (unsigned long) data;
  488. tmp = tmp << 8;
  489. tmp |= (unsigned long) card_mpuin->fstatus;
  490. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  491. return -1;
  492. }
  493. card_mpuin->curstate = card_mpuin->laststate;
  494. tmp = (unsigned long) data;
  495. tmp = tmp << 8;
  496. tmp |= (unsigned long) card_mpuin->fstatus;
  497. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 2);
  498. return 0;
  499. }
  500. static int sblive_miStateSysCommon3(struct emu10k1_mpuin *card_mpuin, u8 data)
  501. {
  502. card_mpuin->fstatus = data;
  503. card_mpuin->curstate = STIN_SYS_COMMON_3_KEY;
  504. return CTSTATUS_NEXT_BYTE;
  505. }
  506. static int sblive_miStateSysCommon3Key(struct emu10k1_mpuin *card_mpuin, u8 data)
  507. /* byte 1 */
  508. {
  509. unsigned long tmp;
  510. if (data > 0x7f) {
  511. /* Real-time messages check */
  512. if (data > 0xf7)
  513. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  514. /* Invalid data! */
  515. DPF(2, "Invalid data!\n");
  516. card_mpuin->curstate = card_mpuin->laststate;
  517. tmp = (unsigned long) data;
  518. tmp = tmp << 8;
  519. tmp |= (unsigned long) card_mpuin->fstatus;
  520. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  521. return -1;
  522. }
  523. card_mpuin->data = data;
  524. card_mpuin->curstate = STIN_SYS_COMMON_3_VEL;
  525. return CTSTATUS_NEXT_BYTE;
  526. }
  527. static int sblive_miStateSysCommon3Vel(struct emu10k1_mpuin *card_mpuin, u8 data)
  528. /* byte 2 */
  529. {
  530. unsigned long tmp;
  531. if (data > 0x7f) {
  532. /* Real-time messages check */
  533. if (data > 0xf7)
  534. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  535. /* Invalid data! */
  536. DPF(2, "Invalid data!\n");
  537. card_mpuin->curstate = card_mpuin->laststate;
  538. tmp = (unsigned long) data;
  539. tmp = tmp << 8;
  540. tmp |= (unsigned long) card_mpuin->data;
  541. tmp = tmp << 8;
  542. tmp |= (unsigned long) card_mpuin->fstatus;
  543. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATAERROR, tmp, 0);
  544. return -1;
  545. }
  546. card_mpuin->curstate = card_mpuin->laststate;
  547. tmp = (unsigned long) data;
  548. tmp = tmp << 8;
  549. tmp |= (unsigned long) card_mpuin->data;
  550. tmp = tmp << 8;
  551. tmp |= (unsigned long) card_mpuin->fstatus;
  552. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, tmp, 3);
  553. return 0;
  554. }
  555. static int sblive_miStateSysExNorm(struct emu10k1_mpuin *card_mpuin, u8 data)
  556. {
  557. unsigned long flags;
  558. if ((data > 0x7f) && (data != 0xf7)) {
  559. /* Real-time messages check */
  560. if (data > 0xf7)
  561. return midistatefn[STIN_SYS_REAL].Fn(card_mpuin, data);
  562. /* Invalid Data! */
  563. DPF(2, "Invalid data!\n");
  564. card_mpuin->curstate = card_mpuin->laststate;
  565. if (card_mpuin->firstmidiq) {
  566. struct midi_queue *midiq;
  567. midiq = card_mpuin->firstmidiq;
  568. *midiq->midibyte = data;
  569. --midiq->sizeLeft;
  570. ++midiq->midibyte;
  571. spin_lock_irqsave(&card_mpuin->lock, flags);
  572. card_mpuin->firstmidiq = midiq->next;
  573. if (card_mpuin->firstmidiq == NULL)
  574. card_mpuin->lastmidiq = NULL;
  575. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  576. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGERROR, (unsigned long) midiq, 0);
  577. kfree(midiq);
  578. }
  579. return -1;
  580. }
  581. if (card_mpuin->firstmidiq) {
  582. struct midi_queue *midiq;
  583. midiq = card_mpuin->firstmidiq;
  584. *midiq->midibyte = data;
  585. --midiq->sizeLeft;
  586. ++midiq->midibyte;
  587. }
  588. if (data == 0xf7) {
  589. /* End of Sysex buffer */
  590. /* Send down the buffer */
  591. card_mpuin->curstate = card_mpuin->laststate;
  592. if (card_mpuin->firstmidiq) {
  593. struct midi_queue *midiq;
  594. midiq = card_mpuin->firstmidiq;
  595. spin_lock_irqsave(&card_mpuin->lock, flags);
  596. card_mpuin->firstmidiq = midiq->next;
  597. if (card_mpuin->firstmidiq == NULL)
  598. card_mpuin->lastmidiq = NULL;
  599. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  600. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
  601. kfree(midiq);
  602. }
  603. return 0;
  604. }
  605. if (card_mpuin->firstmidiq) {
  606. struct midi_queue *midiq;
  607. midiq = card_mpuin->firstmidiq;
  608. if (midiq->sizeLeft == 0) {
  609. /* Special case */
  610. spin_lock_irqsave(&card_mpuin->lock, flags);
  611. card_mpuin->firstmidiq = midiq->next;
  612. if (card_mpuin->firstmidiq == NULL)
  613. card_mpuin->lastmidiq = NULL;
  614. spin_unlock_irqrestore(&card_mpuin->lock, flags);
  615. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INLONGDATA, (unsigned long) midiq, 0);
  616. kfree(midiq);
  617. return CTSTATUS_NEXT_BYTE;
  618. }
  619. }
  620. return CTSTATUS_NEXT_BYTE;
  621. }
  622. static int sblive_miStateSysReal(struct emu10k1_mpuin *card_mpuin, u8 data)
  623. {
  624. emu10k1_mpuin_callback(card_mpuin, ICARDMIDI_INDATA, data, 1);
  625. return CTSTATUS_NEXT_BYTE;
  626. }