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

嵌入式Linux

开发平台:

Unix_Linux

  1. #ifndef _IEEE1394_HOSTS_H
  2. #define _IEEE1394_HOSTS_H
  3. #include <linux/wait.h>
  4. #include <linux/tqueue.h>
  5. #include <linux/list.h>
  6. #include <asm/semaphore.h>
  7. #include "ieee1394_types.h"
  8. #include "csr.h"
  9. struct hpsb_packet;
  10. struct hpsb_host {
  11. /* private fields (hosts, do not use them) */
  12. struct list_head list;
  13.         atomic_t generation;
  14.         struct list_head pending_packets;
  15.         spinlock_t pending_pkt_lock;
  16.         struct tq_struct timeout_tq;
  17.         /* A bitmask where a set bit means that this tlabel is in use.
  18.          * FIXME - should be handled per node instead of per bus. */
  19.         u32 tlabel_pool[2];
  20.         struct semaphore tlabel_count;
  21.         spinlock_t tlabel_lock;
  22.         int reset_retries;
  23.         quadlet_t *topology_map;
  24.         u8 *speed_map;
  25.         struct csr_control csr;
  26.         unsigned char iso_listen_count[64];
  27. /* readonly fields for hosts */
  28.         struct hpsb_host_template *template;
  29.         int node_count; /* number of identified nodes on this bus */
  30.         int selfid_count; /* total number of SelfIDs received */
  31.         nodeid_t node_id; /* node ID of this host */
  32.         nodeid_t irm_id; /* ID of this bus' isochronous resource manager */
  33.         nodeid_t busmgr_id; /* ID of this bus' bus manager */
  34.         unsigned initialized:1; /* initialized and usable */
  35.         unsigned in_bus_reset:1; /* in bus reset / SelfID stage */
  36.         unsigned attempt_root:1; /* attempt to become root during next reset */
  37.         /* this nodes' duties on the bus */
  38.         unsigned is_root:1;
  39.         unsigned is_cycmst:1;
  40.         unsigned is_irm:1;
  41.         unsigned is_busmgr:1;
  42. /* fields readable and writeable by the hosts */
  43.         void *hostdata;
  44. struct pci_dev *pdev;
  45.         int embedded_hostdata[0];
  46. };
  47. enum devctl_cmd {
  48.         /* Host is requested to reset its bus and cancel all outstanding async
  49.          * requests.  If arg == 1, it shall also attempt to become root on the
  50.          * bus.  Return void. */
  51.         RESET_BUS,
  52.         /* Arg is void, return value is the hardware cycle counter value. */
  53.         GET_CYCLE_COUNTER,
  54.         /* Set the hardware cycle counter to the value in arg, return void.
  55.          * FIXME - setting is probably not required. */
  56.         SET_CYCLE_COUNTER,
  57.         /* Configure hardware for new bus ID in arg, return void. */
  58.         SET_BUS_ID,
  59.         /* If arg true, start sending cycle start packets, stop if arg == 0.
  60.          * Return void. */
  61.         ACT_CYCLE_MASTER,
  62.         /* Cancel all outstanding async requests without resetting the bus.
  63.          * Return void. */
  64.         CANCEL_REQUESTS,
  65.         /* Decrease module usage count if arg == 0, increase otherwise.  Return
  66.          * void. */
  67.         MODIFY_USAGE,
  68.         /* Start or stop receiving isochronous channel in arg.  Return void.
  69.          * This acts as an optimization hint, hosts are not required not to
  70.          * listen on unrequested channels. */
  71.         ISO_LISTEN_CHANNEL,
  72.         ISO_UNLISTEN_CHANNEL
  73. };
  74. enum reset_types {
  75.         /* 166 microsecond reset -- only type of reset available on
  76.            non-1394a capable IEEE 1394 controllers */
  77.         LONG_RESET,
  78.         /* Short (arbitrated) reset -- only available on 1394a capable
  79.            IEEE 1394 capable controllers */
  80.         SHORT_RESET
  81. };
  82. struct hpsb_host_template {
  83. struct list_head list;
  84.         struct list_head hosts;
  85.         int number_of_hosts;
  86.         /* fields above will be ignored and overwritten after registering */
  87.         /* This should be the name of the driver (single word) and must not be
  88.          * NULL. */
  89.         const char *name;
  90.         /* This function shall detect all available adapters of this type and
  91.          * call hpsb_get_host for each one.  The initialize_host function will
  92.          * be called to actually set up these adapters.  The number of detected
  93.          * adapters or zero if there are none must be returned.
  94.          */
  95.         int (*detect_hosts) (struct hpsb_host_template *template);
  96.         /* After detecting and registering hosts, this function will be called
  97.          * for every registered host.  It shall set up the host to be fully
  98.          * functional for bus operations and return 0 for failure.
  99.          */
  100.         int (*initialize_host) (struct hpsb_host *host);
  101.         /* To unload modules, this function is provided.  It shall free all
  102.          * resources this host is using (if host is not NULL) or free all
  103.          * resources globally allocated by the driver (if host is NULL).
  104.          */
  105.         void (*release_host) (struct hpsb_host *host); 
  106.         /* This function must store a pointer to the configuration ROM into the
  107.          * location referenced to by pointer and return the size of the ROM. It
  108.          * may not fail.  If any allocation is required, it must be done
  109.          * earlier.
  110.          */
  111.         size_t (*get_rom) (struct hpsb_host *host, const quadlet_t **pointer);
  112.         /* This function shall implement packet transmission based on
  113.          * packet->type.  It shall CRC both parts of the packet (unless
  114.          * packet->type == raw) and do byte-swapping as necessary or instruct
  115.          * the hardware to do so.  It can return immediately after the packet
  116.          * was queued for sending.  After sending, hpsb_sent_packet() has to be
  117.          * called.  Return 0 for failure.
  118.          * NOTE: The function must be callable in interrupt context.
  119.          */
  120.         int (*transmit_packet) (struct hpsb_host *host, 
  121.                                 struct hpsb_packet *packet);
  122.         /* This function requests miscellanous services from the driver, see
  123.          * above for command codes and expected actions.  Return -1 for unknown
  124.          * command, though that should never happen.
  125.          */
  126.         int (*devctl) (struct hpsb_host *host, enum devctl_cmd command, int arg);
  127.         /* This function is mainly to redirect local CSR reads/locks to the iso
  128.          * management registers (bus manager id, bandwidth available, channels
  129.          * available) to the hardware registers in OHCI.  reg is 0,1,2,3 for bus
  130.          * mgr, bwdth avail, ch avail hi, ch avail lo respectively (the same ids
  131.          * as OHCI uses).  data and compare are the new data and expected data
  132.          * respectively, return value is the old value.
  133.          */
  134.         quadlet_t (*hw_csr_reg) (struct hpsb_host *host, int reg,
  135.                                  quadlet_t data, quadlet_t compare);
  136. };
  137. /* mid level internal use */
  138. void register_builtin_lowlevels(void);
  139. /* high level internal use */
  140. struct hpsb_highlevel;
  141. void hl_all_hosts(struct hpsb_highlevel *hl, int init);
  142. /* 
  143.  * These functions are for lowlevel (host) driver use.
  144.  */
  145. int hpsb_register_lowlevel(struct hpsb_host_template *tmpl);
  146. void hpsb_unregister_lowlevel(struct hpsb_host_template *tmpl);
  147. /*
  148.  * Get a initialized host structure with hostdata_size bytes allocated in
  149.  * embedded_hostdata for free usage.  Returns NULL for failure.  
  150.  */
  151. struct hpsb_host *hpsb_get_host(struct hpsb_host_template *tmpl, 
  152.                                 size_t hostdata_size);
  153. /*
  154.  * Increase / decrease host usage counter.  Increase function will return true
  155.  * only if successful (host still existed).  Decrease function expects host to
  156.  * exist.
  157.  */
  158. int hpsb_inc_host_usage(struct hpsb_host *host);
  159. void hpsb_dec_host_usage(struct hpsb_host *host);
  160. #endif /* _IEEE1394_HOSTS_H */