gio_sbmt.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:3k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. /*
  10.  *  ======== gio_sbmt.c ========
  11.  *
  12.  */
  13. #include <std.h>
  14. #include <que.h>
  15. #include <gio.h>
  16. #include <iom.h>
  17. #include <_gio.h>
  18. /*
  19.  *  ======== GIO_submit ========
  20.  */
  21. Int GIO_submit(GIO_Handle gioChan, Uns cmd, Ptr bufp, 
  22.          Uns *psize, GIO_AppCallback *appCallback)
  23. {
  24.     Int         status;
  25.     Bool        semStat;
  26.     IOM_Packet  *packet;
  27.     if (appCallback == NULL) {
  28.         /* synchronous operation, use dedicated packet */
  29.         packet = &gioChan->syncPacket;
  30.     }
  31.     else {
  32.         /* asynchronous operation, get packet from freelist */
  33.         packet = QUE_get(&gioChan->freeList);
  34.         if (packet == (IOM_Packet *)(&gioChan->freeList)) {
  35.             return (IOM_ENOPACKETS);
  36.         }
  37.     }
  38.     /* initialize size variable if psize == NULL */
  39.     if (psize == NULL) {
  40.         packet->size = 0;
  41.         psize = &packet->size;
  42.     }
  43.     packet->cmd = cmd;
  44.     packet->addr = bufp;
  45.     packet->size = *psize;
  46.     packet->status = IOM_COMPLETED;
  47.     /* 
  48.      * 'appCallback' will be NULL for synchronous calls. 
  49.      * 'packet->misc' is used in callback function to call callback (async)
  50.      * or post semaphore (sync).
  51.      */
  52.     packet->misc = (Arg)appCallback;
  53.     /* call down into mini-driver */
  54.     status = gioChan->fxns->mdSubmitChan(gioChan->mdChan, packet);
  55.     if (status == IOM_COMPLETED) {
  56.         *psize = packet->size;
  57.         status = packet->status;
  58.         /* If async then place packet back on free list */    
  59.         if (appCallback != NULL) {
  60.             
  61.             QUE_put(&gioChan->freeList, packet);
  62.         }
  63.         return (status);
  64.     }
  65.     /*
  66.      * Call SEMPEND Fxn only if synchronous i/o and no error returned
  67.      *   from mdSubmitChan().
  68.      */
  69.     if (appCallback == NULL) {
  70.         if (status < 0) {    /* error occured */
  71.             *psize = 0;
  72.             return (status);
  73.         }
  74.         /* synchronous I/O -- call global blocking function */
  75.         semStat = GIO->SEMPEND(gioChan->syncObj, gioChan->timeout);
  76.         if (semStat) {
  77.             *psize = packet->size;
  78.             status = packet->status;
  79.         }
  80.         else {    /* timeout occurred */
  81.             *psize = 0;
  82.             
  83.             /* 
  84.              * NOTE: A channel timeout needs special handling. Timeouts are
  85.              * usually due to some serious underlying device or system state
  86.              * and may require the channel, or possibly the device,to be reset.
  87.              * Because the mini-driver may still own the IOM_Packet here
  88.              * driver's will need to perform timeout processing. We will call
  89.              * the mini-driver's control fxn with the IOM_CHAN_TIMEDOUT command
  90.              * code.
  91.              */
  92.              if ((status = gioChan->fxns->mdControlChan(gioChan->mdChan,
  93.                      IOM_CHAN_TIMEDOUT, NULL)) != IOM_COMPLETED) { 
  94.                  
  95.                  return (IOM_ETIMEOUTUNREC); /* Fatal: may have lost IOP */
  96.              }
  97.              
  98.              return (IOM_ETIMEOUT);
  99.         }
  100.     }
  101.     return (status);
  102. }