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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _IEEE1394_CORE_H
  2. #define _IEEE1394_CORE_H
  3. #include <linux/tqueue.h>
  4. #include <linux/slab.h>
  5. #include <asm/semaphore.h>
  6. #include "hosts.h"
  7. struct hpsb_packet {
  8.         /* This struct is basically read-only for hosts with the exception of
  9.          * the data buffer contents and xnext - see below. */
  10.         struct list_head list;
  11.         /* This can be used for host driver internal linking. */
  12.         struct hpsb_packet *xnext;
  13.         nodeid_t node_id;
  14.         /* Async and Iso types should be clear, raw means send-as-is, do not
  15.          * CRC!  Byte swapping shall still be done in this case. */
  16.         enum { hpsb_async, hpsb_iso, hpsb_raw } __attribute__((packed)) type;
  17.         /* Okay, this is core internal and a no care for hosts.
  18.          * queued   = queued for sending
  19.          * pending  = sent, waiting for response
  20.          * complete = processing completed, successful or not
  21.          * incoming = incoming packet
  22.          */
  23.         enum { 
  24.                 hpsb_unused, hpsb_queued, hpsb_pending, hpsb_complete, hpsb_incoming 
  25.         } __attribute__((packed)) state;
  26.         /* These are core internal. */
  27.         char tlabel;
  28.         char ack_code;
  29.         char tcode;
  30.         unsigned expect_response:1;
  31.         unsigned no_waiter:1;
  32.         /* Data big endianness flag - may vary from request to request.  The
  33.          * header is always in machine byte order.
  34.          * Not really used currently.  */
  35.         unsigned data_be:1;
  36.         /* Speed to transmit with: 0 = 100Mbps, 1 = 200Mbps, 2 = 400Mbps */
  37.         unsigned speed_code:2;
  38.         /*
  39.          * *header and *data are guaranteed to be 32-bit DMAable and may be
  40.          * overwritten to allow in-place byte swapping.  Neither of these is
  41.          * CRCed (the sizes also don't include CRC), but contain space for at
  42.          * least one additional quadlet to allow in-place CRCing.  The memory is
  43.          * also guaranteed to be DMA mappable.
  44.          */
  45.         quadlet_t *header;
  46.         quadlet_t *data;
  47.         size_t header_size;
  48.         size_t data_size;
  49.         struct hpsb_host *host;
  50.         unsigned int generation;
  51.         /* Very core internal, don't care. */
  52.         struct semaphore state_change;
  53.         task_queue complete_tq;
  54.         /* Store jiffies for implementing bus timeouts. */
  55.         unsigned long sendtime;
  56.         quadlet_t embedded_header[5];
  57. };
  58. void abort_timedouts(struct hpsb_host *host);
  59. void abort_requests(struct hpsb_host *host);
  60. struct hpsb_packet *alloc_hpsb_packet(size_t data_size);
  61. void free_hpsb_packet(struct hpsb_packet *packet);
  62. /*
  63.  * Generation counter for the complete 1394 subsystem.  Generation gets
  64.  * incremented on every change in the subsystem (e.g. bus reset).
  65.  *
  66.  * Use the functions, not the variable.
  67.  */
  68. #include <asm/atomic.h>
  69. static inline unsigned int get_hpsb_generation(struct hpsb_host *host)
  70. {
  71.         return atomic_read(&host->generation);
  72. }
  73. /*
  74.  * Queue packet for transmitting, return 0 for failure.
  75.  */
  76. int hpsb_send_packet(struct hpsb_packet *packet);
  77. /* Initiate bus reset on the given host.  Returns 1 if bus reset already in
  78.  * progress, 0 otherwise. */
  79. int hpsb_reset_bus(struct hpsb_host *host, int type);
  80. /*
  81.  * The following functions are exported for host driver module usage.  All of
  82.  * them are safe to use in interrupt contexts, although some are quite
  83.  * complicated so you may want to run them in bottom halves instead of calling
  84.  * them directly.
  85.  */
  86. /* Notify a bus reset to the core.  Returns 1 if bus reset already in progress,
  87.  * 0 otherwise. */
  88. int hpsb_bus_reset(struct hpsb_host *host);
  89. /*
  90.  * Hand over received selfid packet to the core.  Complement check (second
  91.  * quadlet is complement of first) is expected to be done and succesful.
  92.  */
  93. void hpsb_selfid_received(struct hpsb_host *host, quadlet_t sid);
  94. /* 
  95.  * Notify completion of SelfID stage to the core and report new physical ID
  96.  * and whether host is root now.
  97.  */
  98. void hpsb_selfid_complete(struct hpsb_host *host, int phyid, int isroot);
  99. /*
  100.  * Notify core of sending a packet.  Ackcode is the ack code returned for async
  101.  * transmits or ACKX_SEND_ERROR if the transmission failed completely; ACKX_NONE
  102.  * for other cases (internal errors that don't justify a panic).  Safe to call
  103.  * from within a transmit packet routine.
  104.  */
  105. void hpsb_packet_sent(struct hpsb_host *host, struct hpsb_packet *packet,
  106.                       int ackcode);
  107. /*
  108.  * Hand over received packet to the core.  The contents of data are expected to
  109.  * be the full packet but with the CRCs left out (data block follows header
  110.  * immediately), with the header (i.e. the first four quadlets) in machine byte
  111.  * order and the data block in big endian.  *data can be safely overwritten
  112.  * after this call.
  113.  *
  114.  * If the packet is a write request, write_acked is to be set to true if it was
  115.  * ack_complete'd already, false otherwise.  This arg is ignored for any other
  116.  * packet type.
  117.  */
  118. void hpsb_packet_received(struct hpsb_host *host, quadlet_t *data, size_t size,
  119.                           int write_acked);
  120. #endif /* _IEEE1394_CORE_H */