patch-2.4.21 linux-2.4.21/drivers/ieee1394/ieee1394_core.c
Next file: linux-2.4.21/drivers/ieee1394/ieee1394_core.h
Previous file: linux-2.4.21/drivers/ieee1394/ieee1394.h
Back to the patch index
Back to the overall index
- Lines: 737
- Date:
2003-06-13 07:51:34.000000000 -0700
- Orig file:
linux-2.4.20/drivers/ieee1394/ieee1394_core.c
- Orig date:
2002-11-28 15:53:13.000000000 -0800
diff -urN linux-2.4.20/drivers/ieee1394/ieee1394_core.c linux-2.4.21/drivers/ieee1394/ieee1394_core.c
@@ -5,9 +5,19 @@
* highlevel or lowlevel code
*
* Copyright (C) 1999, 2000 Andreas E. Bombe
+ * 2002 Manfred Weihs <weihs@ict.tuwien.ac.at>
*
* This code is licensed under the GPL. See the file COPYING in the root
* directory of the kernel sources for details.
+ *
+ *
+ * Contributions:
+ *
+ * Manfred Weihs <weihs@ict.tuwien.ac.at>
+ * loopback functionality in hpsb_send_packet
+ * allow highlevel drivers to disable automatic response generation
+ * and to generate responses themselves (deferred)
+ *
*/
#include <linux/config.h>
@@ -19,8 +29,7 @@
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
-#include <linux/tqueue.h>
-#include <asm/bitops.h>
+#include <linux/bitops.h>
#include <asm/byteorder.h>
#include <asm/semaphore.h>
@@ -33,6 +42,8 @@
#include "csr.h"
#include "nodemgr.h"
#include "ieee1394_hotplug.h"
+#include "dma.h"
+#include "iso.h"
/*
* Disable the nodemgr detection and config rom reading functionality.
@@ -41,17 +52,14 @@
MODULE_PARM_DESC(disable_nodemgr, "Disable nodemgr functionality.");
static int disable_nodemgr = 0;
-MODULE_PARM(disable_hotplug, "i");
-MODULE_PARM_DESC(disable_hotplug, "Disable hotplug for detected nodes.");
-static int disable_hotplug = 0;
-
/* We are GPL, so treat us special */
MODULE_LICENSE("GPL");
static kmem_cache_t *hpsb_packet_cache;
/* Some globals used */
-const char *hpsb_speedto_str[] = { "S100", "S200", "S400" };
+const char *hpsb_speedto_str[] = { "S100", "S200", "S400", "S800", "S1600", "S3200" };
+const u8 hpsb_speedto_maxrec[] = { 0x7, 0x8, 0x9, 0x10, 0x11, 0x12 };
static void dump_packet(const char *text, quadlet_t *data, int size)
{
@@ -67,27 +75,31 @@
printk("\n");
}
-static void process_complete_tasks(struct hpsb_packet *packet)
+static void run_packet_complete(struct hpsb_packet *packet)
{
- struct list_head *lh, *next;
-
- list_for_each_safe(lh, next, &packet->complete_tq) {
- struct tq_struct *tq = list_entry(lh, struct tq_struct, list);
- list_del(&tq->list);
- schedule_task(tq);
+ if (packet->complete_routine != NULL) {
+ packet->complete_routine(packet->complete_data);
+ packet->complete_routine = NULL;
+ packet->complete_data = NULL;
}
-
return;
}
/**
- * hpsb_add_packet_complete_task - add a new task for when a packet completes
+ * hpsb_set_packet_complete_task - set the task that runs when a packet
+ * completes. You cannot call this more than once on a single packet
+ * before it is sent.
+ *
* @packet: the packet whose completion we want the task added to
- * @tq: the tq_struct describing the task to add
+ * @routine: function to call
+ * @data: data (if any) to pass to the above function
*/
-void hpsb_add_packet_complete_task(struct hpsb_packet *packet, struct tq_struct *tq)
+void hpsb_set_packet_complete_task(struct hpsb_packet *packet,
+ void (*routine)(void *), void *data)
{
- list_add_tail(&tq->list, &packet->complete_tq);
+ BUG_ON(packet->complete_routine != NULL);
+ packet->complete_routine = routine;
+ packet->complete_data = data;
return;
}
@@ -115,9 +127,8 @@
{
struct hpsb_packet *packet = NULL;
void *data = NULL;
- int kmflags = in_interrupt() ? GFP_ATOMIC : GFP_KERNEL;
- packet = kmem_cache_alloc(hpsb_packet_cache, kmflags);
+ packet = kmem_cache_alloc(hpsb_packet_cache, GFP_ATOMIC);
if (packet == NULL)
return NULL;
@@ -125,7 +136,7 @@
packet->header = packet->embedded_header;
if (data_size) {
- data = kmalloc(data_size + 8, kmflags);
+ data = kmalloc(data_size + 8, GFP_ATOMIC);
if (data == NULL) {
kmem_cache_free(hpsb_packet_cache, packet);
return NULL;
@@ -135,9 +146,10 @@
packet->data_size = data_size;
}
- INIT_LIST_HEAD(&packet->complete_tq);
INIT_LIST_HEAD(&packet->list);
sema_init(&packet->state_change, 0);
+ packet->complete_routine = NULL;
+ packet->complete_data = NULL;
packet->state = hpsb_unused;
packet->generation = -1;
packet->data_be = 1;
@@ -273,7 +285,7 @@
for (i = 0; i < (nodecount * 64); i += 64) {
for (j = 0; j < nodecount; j++) {
- map[i+j] = SPEED_400;
+ map[i+j] = SPEED_MAX;
}
}
@@ -345,7 +357,7 @@
host->topology_map[host->selfid_count++] = sid;
} else {
HPSB_NOTICE("Spurious SelfID packet (0x%08x) received from bus %d",
- sid, (host->node_id & BUS_MASK) >> 6);
+ sid, NODEID_TO_BUS(host->node_id));
}
}
@@ -362,6 +374,7 @@
/* selfid stage did not complete without error */
HPSB_NOTICE("Error in SelfID stage, resetting");
host->in_bus_reset = 0;
+ /* this should work from ohci1394 now... */
hpsb_reset_bus(host, LONG_RESET);
return;
} else {
@@ -372,15 +385,18 @@
build_speed_map(host, host->node_count);
}
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+ HPSB_INFO("selfid_complete called with successful SelfID stage "
+ "... irm_id: 0x%X node_id: 0x%X",host->irm_id,host->node_id);
+#endif
/* irm_id is kept up to date by check_selfids() */
if (host->irm_id == host->node_id) {
host->is_irm = 1;
- host->is_busmgr = 1;
- host->busmgr_id = host->node_id;
- host->csr.bus_manager_id = host->node_id;
+ } else {
+ host->is_busmgr = 0;
+ host->is_irm = 0;
}
- host->reset_retries = 0;
if (isroot) {
host->driver->devctl(host, ACT_CYCLE_MASTER, 1);
host->is_cycmst = 1;
@@ -408,7 +424,7 @@
packet->state = hpsb_complete;
up(&packet->state_change);
up(&packet->state_change);
- process_complete_tasks(packet);
+ run_packet_complete(packet);
return;
}
@@ -424,6 +440,63 @@
}
/**
+ * hpsb_send_phy_config - transmit a PHY configuration packet on the bus
+ * @host: host that PHY config packet gets sent through
+ * @rootid: root whose force_root bit should get set (-1 = don't set force_root)
+ * @gapcnt: gap count value to set (-1 = don't set gap count)
+ *
+ * This function sends a PHY config packet on the bus through the specified host.
+ *
+ * Return value: 0 for success or error number otherwise.
+ */
+int hpsb_send_phy_config(struct hpsb_host *host, int rootid, int gapcnt)
+{
+ struct hpsb_packet *packet;
+ int retval = 0;
+
+ if(rootid >= ALL_NODES || rootid < -1 || gapcnt > 0x3f || gapcnt < -1 ||
+ (rootid == -1 && gapcnt == -1)) {
+ HPSB_DEBUG("Invalid Parameter: rootid = %d gapcnt = %d",
+ rootid, gapcnt);
+ return -EINVAL;
+ }
+
+ packet = alloc_hpsb_packet(0);
+ if (!packet)
+ return -ENOMEM;
+
+ packet->host = host;
+ packet->header_size = 16;
+ packet->data_size = 0;
+ packet->expect_response = 0;
+ packet->no_waiter = 0;
+ packet->type = hpsb_raw;
+ packet->header[0] = 0;
+ if(rootid != -1)
+ packet->header[0] |= rootid << 24 | 1 << 23;
+ if(gapcnt != -1)
+ packet->header[0] |= gapcnt << 16 | 1 << 22;
+
+ packet->header[1] = ~packet->header[0];
+
+ packet->generation = get_hpsb_generation(host);
+
+ HPSB_DEBUG("Sending PHY configuration packet (I hope)...");
+ if (!hpsb_send_packet(packet)) {
+ retval = -EINVAL;
+ goto fail;
+ }
+
+ down(&packet->state_change);
+ down(&packet->state_change);
+
+fail:
+ free_hpsb_packet(packet);
+
+ return retval;
+}
+
+/**
* hpsb_send_packet - transmit a packet on the bus
* @packet: packet to send
*
@@ -448,10 +521,48 @@
packet->state = hpsb_queued;
+ if (packet->node_id == host->node_id)
+ { /* it is a local request, so handle it locally */
+ quadlet_t *data;
+ size_t size=packet->data_size+packet->header_size;
+
+ data = kmalloc(packet->header_size + packet->data_size, GFP_ATOMIC);
+ if (!data) {
+ HPSB_ERR("unable to allocate memory for concatenating header and data");
+ return 0;
+ }
+
+ memcpy(data, packet->header, packet->header_size);
+
+ if (packet->data_size)
+ {
+ if (packet->data_be) {
+ memcpy(((u8*)data)+packet->header_size, packet->data, packet->data_size);
+ } else {
+ int i;
+ quadlet_t *my_data=(quadlet_t*) ((u8*) data + packet->data_size);
+ for (i=0; i < packet->data_size/4; i++) {
+ my_data[i] = cpu_to_be32(packet->data[i]);
+ }
+ }
+ }
+
+#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
+ dump_packet("send packet local:", packet->header,
+ packet->header_size);
+#endif
+ hpsb_packet_sent(host, packet, packet->expect_response?ACK_PENDING:ACK_COMPLETE);
+ hpsb_packet_received(host, data, size, 0);
+
+ kfree(data);
+
+ return 1;
+ }
+
if (packet->type == hpsb_async && packet->node_id != ALL_NODES) {
packet->speed_code =
- host->speed_map[(host->node_id & NODE_MASK) * 64
- + (packet->node_id & NODE_MASK)];
+ host->speed_map[NODEID_TO_NODE(host->node_id) * 64
+ + NODEID_TO_NODE(packet->node_id)];
}
#ifdef CONFIG_IEEE1394_VERBOSEDEBUG
@@ -558,7 +669,7 @@
packet->state = hpsb_complete;
up(&packet->state_change);
- process_complete_tasks(packet);
+ run_packet_complete(packet);
}
@@ -591,6 +702,54 @@
return p;
}
+#define PREP_ASYNC_HEAD_RCODE(tc) \
+ packet->tcode = tc; \
+ packet->header[0] = (packet->node_id << 16) | (packet->tlabel << 10) \
+ | (1 << 8) | (tc << 4); \
+ packet->header[1] = (packet->host->node_id << 16) | (rcode << 12); \
+ packet->header[2] = 0
+
+static void fill_async_readquad_resp(struct hpsb_packet *packet, int rcode,
+ quadlet_t data)
+{
+ PREP_ASYNC_HEAD_RCODE(TCODE_READQ_RESPONSE);
+ packet->header[3] = data;
+ packet->header_size = 16;
+ packet->data_size = 0;
+}
+
+static void fill_async_readblock_resp(struct hpsb_packet *packet, int rcode,
+ int length)
+{
+ if (rcode != RCODE_COMPLETE)
+ length = 0;
+
+ PREP_ASYNC_HEAD_RCODE(TCODE_READB_RESPONSE);
+ packet->header[3] = length << 16;
+ packet->header_size = 16;
+ packet->data_size = length + (length % 4 ? 4 - (length % 4) : 0);
+}
+
+static void fill_async_write_resp(struct hpsb_packet *packet, int rcode)
+{
+ PREP_ASYNC_HEAD_RCODE(TCODE_WRITE_RESPONSE);
+ packet->header[2] = 0;
+ packet->header_size = 12;
+ packet->data_size = 0;
+}
+
+static void fill_async_lock_resp(struct hpsb_packet *packet, int rcode, int extcode,
+ int length)
+{
+ if (rcode != RCODE_COMPLETE)
+ length = 0;
+
+ PREP_ASYNC_HEAD_RCODE(TCODE_LOCK_RESPONSE);
+ packet->header[3] = (length << 16) | extcode;
+ packet->header_size = 16;
+ packet->data_size = length;
+}
+
#define PREP_REPLY_PACKET(length) \
packet = create_reply_packet(host, data, length); \
if (packet == NULL) break
@@ -600,8 +759,10 @@
{
struct hpsb_packet *packet;
int length, rcode, extcode;
+ quadlet_t buffer;
nodeid_t source = data[1] >> 16;
- nodeid_t dest = data[0] >> 16;
+ nodeid_t dest = data[0] >> 16;
+ u16 flags = (u16) data[0];
u64 addr;
/* big FIXME - no error checking is done for an out of bounds length */
@@ -610,10 +771,11 @@
case TCODE_WRITEQ:
addr = (((u64)(data[1] & 0xffff)) << 32) | data[2];
rcode = highlevel_write(host, source, dest, data+3,
- addr, 4);
+ addr, 4, flags);
if (!write_acked
- && ((data[0] >> 16) & NODE_MASK) != NODE_MASK) {
+ && (NODEID_TO_NODE(data[0] >> 16) != NODE_MASK)
+ && (rcode >= 0)) {
/* not a broadcast write, reply */
PREP_REPLY_PACKET(0);
fill_async_write_resp(packet, rcode);
@@ -624,10 +786,11 @@
case TCODE_WRITEB:
addr = (((u64)(data[1] & 0xffff)) << 32) | data[2];
rcode = highlevel_write(host, source, dest, data+4,
- addr, data[3]>>16);
+ addr, data[3]>>16, flags);
if (!write_acked
- && ((data[0] >> 16) & NODE_MASK) != NODE_MASK) {
+ && (NODEID_TO_NODE(data[0] >> 16) != NODE_MASK)
+ && (rcode >= 0)) {
/* not a broadcast write, reply */
PREP_REPLY_PACKET(0);
fill_async_write_resp(packet, rcode);
@@ -636,12 +799,14 @@
break;
case TCODE_READQ:
- PREP_REPLY_PACKET(0);
-
addr = (((u64)(data[1] & 0xffff)) << 32) | data[2];
- rcode = highlevel_read(host, source, data, addr, 4);
- fill_async_readquad_resp(packet, rcode, *data);
- send_packet_nocare(packet);
+ rcode = highlevel_read(host, source, &buffer, addr, 4, flags);
+
+ if (rcode >= 0) {
+ PREP_REPLY_PACKET(0);
+ fill_async_readquad_resp(packet, rcode, buffer);
+ send_packet_nocare(packet);
+ }
break;
case TCODE_READB:
@@ -650,9 +815,12 @@
addr = (((u64)(data[1] & 0xffff)) << 32) | data[2];
rcode = highlevel_read(host, source, packet->data, addr,
- length);
- fill_async_readblock_resp(packet, rcode, length);
- send_packet_nocare(packet);
+ length, flags);
+
+ if (rcode >= 0) {
+ fill_async_readblock_resp(packet, rcode, length);
+ send_packet_nocare(packet);
+ }
break;
case TCODE_LOCK_REQUEST:
@@ -670,7 +838,7 @@
switch (length) {
case 4:
rcode = highlevel_lock(host, source, packet->data, addr,
- data[4], 0, extcode);
+ data[4], 0, extcode,flags);
fill_async_lock_resp(packet, rcode, extcode, 4);
break;
case 8:
@@ -679,13 +847,13 @@
rcode = highlevel_lock(host, source,
packet->data, addr,
data[5], data[4],
- extcode);
+ extcode, flags);
fill_async_lock_resp(packet, rcode, extcode, 4);
} else {
rcode = highlevel_lock64(host, source,
(octlet_t *)packet->data, addr,
*(octlet_t *)(data + 4), 0ULL,
- extcode);
+ extcode, flags);
fill_async_lock_resp(packet, rcode, extcode, 8);
}
break;
@@ -694,15 +862,20 @@
(octlet_t *)packet->data, addr,
*(octlet_t *)(data + 6),
*(octlet_t *)(data + 4),
- extcode);
+ extcode, flags);
fill_async_lock_resp(packet, rcode, extcode, 8);
break;
default:
- fill_async_lock_resp(packet, RCODE_TYPE_ERROR,
+ rcode = RCODE_TYPE_ERROR;
+ fill_async_lock_resp(packet, rcode,
extcode, 0);
}
- send_packet_nocare(packet);
+ if (rcode >= 0) {
+ send_packet_nocare(packet);
+ } else {
+ free_hpsb_packet(packet);
+ }
break;
}
@@ -778,7 +951,7 @@
packet->state = hpsb_complete;
packet->ack_code = ACKX_ABORTED;
up(&packet->state_change);
- process_complete_tasks(packet);
+ run_packet_complete(packet);
}
}
@@ -820,7 +993,7 @@
packet->state = hpsb_complete;
packet->ack_code = ACKX_TIMEOUT;
up(&packet->state_change);
- process_complete_tasks(packet);
+ run_packet_complete(packet);
}
}
@@ -853,7 +1026,7 @@
struct file_operations *file_ops)
{
int retval;
-
+
if( (blocknum < 0) || (blocknum > 15) )
return -EINVAL;
@@ -869,7 +1042,7 @@
/* block already taken */
retval = -EBUSY;
}
-
+
write_unlock(&ieee1394_chardevs_lock);
return retval;
@@ -880,14 +1053,14 @@
{
if( (blocknum < 0) || (blocknum > 15) )
return;
-
+
write_lock(&ieee1394_chardevs_lock);
-
+
if(ieee1394_chardevs[blocknum].file_ops) {
ieee1394_chardevs[blocknum].file_ops = NULL;
ieee1394_chardevs[blocknum].module = NULL;
}
-
+
write_unlock(&ieee1394_chardevs_lock);
}
@@ -908,7 +1081,7 @@
{
int ret = 0;
- if( (blocknum < 0) || (blocknum > 15) )
+ if ((blocknum < 0) || (blocknum > 15))
return ret;
read_lock(&ieee1394_chardevs_lock);
@@ -916,7 +1089,7 @@
*module = ieee1394_chardevs[blocknum].module;
*file_ops = ieee1394_chardevs[blocknum].file_ops;
- if(*file_ops == NULL)
+ if (*file_ops == NULL)
goto out;
/* don't need try_inc_mod_count if the driver is non-modular */
@@ -925,7 +1098,7 @@
/* success! */
ret = 1;
-
+
out:
read_unlock(&ieee1394_chardevs_lock);
return ret;
@@ -955,12 +1128,12 @@
reference count of whatever module file->f_op->owner points
to, immediately after this function returns.
*/
-
+
/* shift away lower four bits of the minor
to get the index of the ieee1394_driver
we want */
-
- blocknum = (minor(inode->i_rdev) >> 4) & 0xF;
+
+ blocknum = (MINOR(inode->i_rdev) >> 4) & 0xF;
/* look up the driver */
@@ -1046,7 +1219,7 @@
init_hpsb_highlevel();
init_csr();
if (!disable_nodemgr)
- init_ieee1394_nodemgr(disable_hotplug);
+ init_ieee1394_nodemgr();
else
HPSB_INFO("nodemgr functionality disabled");
@@ -1073,16 +1246,21 @@
module_exit(ieee1394_cleanup);
/* Exported symbols */
+
+/** hosts.c **/
EXPORT_SYMBOL(hpsb_alloc_host);
EXPORT_SYMBOL(hpsb_add_host);
EXPORT_SYMBOL(hpsb_remove_host);
EXPORT_SYMBOL(hpsb_ref_host);
EXPORT_SYMBOL(hpsb_unref_host);
-EXPORT_SYMBOL(hpsb_speedto_str);
-EXPORT_SYMBOL(hpsb_add_packet_complete_task);
+/** ieee1394_core.c **/
+EXPORT_SYMBOL(hpsb_speedto_str);
+EXPORT_SYMBOL(hpsb_speedto_maxrec);
+EXPORT_SYMBOL(hpsb_set_packet_complete_task);
EXPORT_SYMBOL(alloc_hpsb_packet);
EXPORT_SYMBOL(free_hpsb_packet);
+EXPORT_SYMBOL(hpsb_send_phy_config);
EXPORT_SYMBOL(hpsb_send_packet);
EXPORT_SYMBOL(hpsb_reset_bus);
EXPORT_SYMBOL(hpsb_bus_reset);
@@ -1090,37 +1268,41 @@
EXPORT_SYMBOL(hpsb_selfid_complete);
EXPORT_SYMBOL(hpsb_packet_sent);
EXPORT_SYMBOL(hpsb_packet_received);
+EXPORT_SYMBOL(ieee1394_register_chardev);
+EXPORT_SYMBOL(ieee1394_unregister_chardev);
+EXPORT_SYMBOL(ieee1394_devfs_handle);
+EXPORT_SYMBOL(ieee1394_procfs_entry);
-EXPORT_SYMBOL(get_tlabel);
-EXPORT_SYMBOL(free_tlabel);
-EXPORT_SYMBOL(fill_async_readquad);
-EXPORT_SYMBOL(fill_async_readquad_resp);
-EXPORT_SYMBOL(fill_async_readblock);
-EXPORT_SYMBOL(fill_async_readblock_resp);
-EXPORT_SYMBOL(fill_async_writequad);
-EXPORT_SYMBOL(fill_async_writeblock);
-EXPORT_SYMBOL(fill_async_write_resp);
-EXPORT_SYMBOL(fill_async_lock);
-EXPORT_SYMBOL(fill_async_lock_resp);
-EXPORT_SYMBOL(fill_iso_packet);
-EXPORT_SYMBOL(fill_phy_packet);
-EXPORT_SYMBOL(hpsb_make_readqpacket);
-EXPORT_SYMBOL(hpsb_make_readbpacket);
-EXPORT_SYMBOL(hpsb_make_writeqpacket);
-EXPORT_SYMBOL(hpsb_make_writebpacket);
+/** ieee1394_transactions.c **/
+EXPORT_SYMBOL(hpsb_get_tlabel);
+EXPORT_SYMBOL(hpsb_free_tlabel);
+EXPORT_SYMBOL(hpsb_make_readpacket);
+EXPORT_SYMBOL(hpsb_make_writepacket);
EXPORT_SYMBOL(hpsb_make_lockpacket);
+EXPORT_SYMBOL(hpsb_make_lock64packet);
EXPORT_SYMBOL(hpsb_make_phypacket);
-EXPORT_SYMBOL(hpsb_packet_success);
-EXPORT_SYMBOL(hpsb_make_packet);
+EXPORT_SYMBOL(hpsb_make_isopacket);
EXPORT_SYMBOL(hpsb_read);
EXPORT_SYMBOL(hpsb_write);
EXPORT_SYMBOL(hpsb_lock);
+EXPORT_SYMBOL(hpsb_lock64);
+EXPORT_SYMBOL(hpsb_send_gasp);
+EXPORT_SYMBOL(hpsb_packet_success);
+/** highlevel.c **/
EXPORT_SYMBOL(hpsb_register_highlevel);
EXPORT_SYMBOL(hpsb_unregister_highlevel);
EXPORT_SYMBOL(hpsb_register_addrspace);
+EXPORT_SYMBOL(hpsb_unregister_addrspace);
EXPORT_SYMBOL(hpsb_listen_channel);
EXPORT_SYMBOL(hpsb_unlisten_channel);
+EXPORT_SYMBOL(hpsb_get_hostinfo);
+EXPORT_SYMBOL(hpsb_create_hostinfo);
+EXPORT_SYMBOL(hpsb_destroy_hostinfo);
+EXPORT_SYMBOL(hpsb_set_hostinfo_key);
+EXPORT_SYMBOL(hpsb_get_hostinfo_key);
+EXPORT_SYMBOL(hpsb_get_hostinfo_bykey);
+EXPORT_SYMBOL(hpsb_set_hostinfo);
EXPORT_SYMBOL(highlevel_read);
EXPORT_SYMBOL(highlevel_write);
EXPORT_SYMBOL(highlevel_lock);
@@ -1129,6 +1311,7 @@
EXPORT_SYMBOL(highlevel_remove_host);
EXPORT_SYMBOL(highlevel_host_reset);
+/** nodemgr.c **/
EXPORT_SYMBOL(hpsb_guid_get_entry);
EXPORT_SYMBOL(hpsb_nodeid_get_entry);
EXPORT_SYMBOL(hpsb_node_fill_packet);
@@ -1139,8 +1322,35 @@
EXPORT_SYMBOL(hpsb_unregister_protocol);
EXPORT_SYMBOL(hpsb_release_unit_directory);
-EXPORT_SYMBOL(ieee1394_register_chardev);
-EXPORT_SYMBOL(ieee1394_unregister_chardev);
-EXPORT_SYMBOL(ieee1394_devfs_handle);
-
-EXPORT_SYMBOL(ieee1394_procfs_entry);
+/** csr.c **/
+EXPORT_SYMBOL(hpsb_update_config_rom);
+EXPORT_SYMBOL(hpsb_get_config_rom);
+
+/** dma.c **/
+EXPORT_SYMBOL(dma_prog_region_init);
+EXPORT_SYMBOL(dma_prog_region_alloc);
+EXPORT_SYMBOL(dma_prog_region_free);
+EXPORT_SYMBOL(dma_region_init);
+EXPORT_SYMBOL(dma_region_alloc);
+EXPORT_SYMBOL(dma_region_free);
+EXPORT_SYMBOL(dma_region_sync);
+EXPORT_SYMBOL(dma_region_mmap);
+EXPORT_SYMBOL(dma_region_offset_to_bus);
+
+/** iso.c **/
+EXPORT_SYMBOL(hpsb_iso_xmit_init);
+EXPORT_SYMBOL(hpsb_iso_recv_init);
+EXPORT_SYMBOL(hpsb_iso_xmit_start);
+EXPORT_SYMBOL(hpsb_iso_recv_start);
+EXPORT_SYMBOL(hpsb_iso_recv_listen_channel);
+EXPORT_SYMBOL(hpsb_iso_recv_unlisten_channel);
+EXPORT_SYMBOL(hpsb_iso_recv_set_channel_mask);
+EXPORT_SYMBOL(hpsb_iso_stop);
+EXPORT_SYMBOL(hpsb_iso_shutdown);
+EXPORT_SYMBOL(hpsb_iso_xmit_queue_packet);
+EXPORT_SYMBOL(hpsb_iso_xmit_sync);
+EXPORT_SYMBOL(hpsb_iso_recv_release_packets);
+EXPORT_SYMBOL(hpsb_iso_n_ready);
+EXPORT_SYMBOL(hpsb_iso_packet_sent);
+EXPORT_SYMBOL(hpsb_iso_packet_received);
+EXPORT_SYMBOL(hpsb_iso_wake);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)