patch-2.4.19 linux-2.4.19/drivers/ieee1394/hosts.h
Next file: linux-2.4.19/drivers/ieee1394/ieee1394.h
Previous file: linux-2.4.19/drivers/ieee1394/hosts.c
Back to the patch index
Back to the overall index
- Lines: 184
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/ieee1394/hosts.h
- Orig date:
Mon Oct 1 21:24:24 2001
diff -urN linux-2.4.18/drivers/ieee1394/hosts.h linux-2.4.19/drivers/ieee1394/hosts.h
@@ -13,11 +13,15 @@
struct hpsb_packet;
struct hpsb_host {
-/* private fields (hosts, do not use them) */
- struct list_head list;
+ struct list_head host_list;
+
+ struct hpsb_host_operations *ops;
+ void *hostdata;
atomic_t generation;
+ int refcount;
+
struct list_head pending_packets;
spinlock_t pending_pkt_lock;
struct tq_struct timeout_tq;
@@ -27,27 +31,21 @@
u32 tlabel_pool[2];
struct semaphore tlabel_count;
spinlock_t tlabel_lock;
-
- int reset_retries;
- quadlet_t *topology_map;
- u8 *speed_map;
- struct csr_control csr;
+ u32 tlabel_current;
unsigned char iso_listen_count[64];
-/* readonly fields for hosts */
- struct hpsb_host_template *template;
-
int node_count; /* number of identified nodes on this bus */
int selfid_count; /* total number of SelfIDs received */
+ int nodes_active; /* number of nodes that are actually active */
nodeid_t node_id; /* node ID of this host */
nodeid_t irm_id; /* ID of this bus' isochronous resource manager */
nodeid_t busmgr_id; /* ID of this bus' bus manager */
- unsigned initialized:1; /* initialized and usable */
- unsigned in_bus_reset:1; /* in bus reset / SelfID stage */
- unsigned attempt_root:1; /* attempt to become root during next reset */
+ /* this nodes state */
+ unsigned in_bus_reset:1;
+ unsigned is_shutdown:1;
/* this nodes' duties on the bus */
unsigned is_root:1;
@@ -55,11 +53,15 @@
unsigned is_irm:1;
unsigned is_busmgr:1;
-/* fields readable and writeable by the hosts */
+ int reset_retries;
+ quadlet_t *topology_map;
+ u8 *speed_map;
+ struct csr_control csr;
+
+ struct hpsb_host_driver *driver;
+ struct list_head driver_list;
- void *hostdata;
struct pci_dev *pdev;
- int embedded_hostdata[0];
};
@@ -88,8 +90,10 @@
* Return void. */
CANCEL_REQUESTS,
- /* Decrease module usage count if arg == 0, increase otherwise. Return
- * void. */
+ /* Decrease host usage count if arg == 0, increase otherwise. Return
+ * 1 for success, 0 for failure. Increase usage may fail if the driver
+ * is in the process of shutting itself down. Decrease usage can not
+ * fail. */
MODIFY_USAGE,
/* Start or stop receiving isochronous channel in arg. Return void.
@@ -109,37 +113,7 @@
SHORT_RESET
};
-struct hpsb_host_template {
- struct list_head list;
-
- struct list_head hosts;
- int number_of_hosts;
-
- /* fields above will be ignored and overwritten after registering */
-
- /* This should be the name of the driver (single word) and must not be
- * NULL. */
- const char *name;
-
- /* This function shall detect all available adapters of this type and
- * call hpsb_get_host for each one. The initialize_host function will
- * be called to actually set up these adapters. The number of detected
- * adapters or zero if there are none must be returned.
- */
- int (*detect_hosts) (struct hpsb_host_template *template);
-
- /* After detecting and registering hosts, this function will be called
- * for every registered host. It shall set up the host to be fully
- * functional for bus operations and return 0 for failure.
- */
- int (*initialize_host) (struct hpsb_host *host);
-
- /* To unload modules, this function is provided. It shall free all
- * resources this host is using (if host is not NULL) or free all
- * resources globally allocated by the driver (if host is NULL).
- */
- void (*release_host) (struct hpsb_host *host);
-
+struct hpsb_host_operations {
/* This function must store a pointer to the configuration ROM into the
* location referenced to by pointer and return the size of the ROM. It
* may not fail. If any allocation is required, it must be done
@@ -175,34 +149,43 @@
quadlet_t data, quadlet_t compare);
};
+struct hpsb_host_driver {
+ struct list_head list;
+ struct list_head hosts;
-/* mid level internal use */
+ int number_of_hosts;
+ const char *name;
+
+ struct hpsb_host_operations *ops;
+};
+
+
+/* core internal use */
void register_builtin_lowlevels(void);
/* high level internal use */
struct hpsb_highlevel;
-void hl_all_hosts(struct hpsb_highlevel *hl, int init);
+void hl_all_hosts(void (*function)(struct hpsb_host*));
-/*
- * These functions are for lowlevel (host) driver use.
- */
-int hpsb_register_lowlevel(struct hpsb_host_template *tmpl);
-void hpsb_unregister_lowlevel(struct hpsb_host_template *tmpl);
/*
- * Get a initialized host structure with hostdata_size bytes allocated in
- * embedded_hostdata for free usage. Returns NULL for failure.
+ * In order to prevent hosts from unloading, use hpsb_ref_host(). This prevents
+ * the host from going away (e.g. makes module unloading of the driver
+ * impossible), but still can not guarantee it (e.g. PC-Card being pulled by the
+ * user). hpsb_ref_host() returns false if host could not be locked. If it is
+ * successful, host is valid as a pointer until hpsb_unref_host() (not just
+ * until after remove_host).
*/
-struct hpsb_host *hpsb_get_host(struct hpsb_host_template *tmpl,
- size_t hostdata_size);
+int hpsb_ref_host(struct hpsb_host *host);
+void hpsb_unref_host(struct hpsb_host *host);
-/*
- * Increase / decrease host usage counter. Increase function will return true
- * only if successful (host still existed). Decrease function expects host to
- * exist.
- */
-int hpsb_inc_host_usage(struct hpsb_host *host);
-void hpsb_dec_host_usage(struct hpsb_host *host);
+struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra);
+void hpsb_add_host(struct hpsb_host *host);
+void hpsb_remove_host(struct hpsb_host *h);
+
+struct hpsb_host_driver *hpsb_register_lowlevel(struct hpsb_host_operations *op,
+ const char *name);
+void hpsb_unregister_lowlevel(struct hpsb_host_driver *drv);
#endif /* _IEEE1394_HOSTS_H */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)