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

嵌入式Linux

开发平台:

Unix_Linux

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