#include "scimacnal.h"
+ptl_handle_ni_t kscimacnal_ni;
nal_t kscimacnal_api;
kscimacnal_data_t kscimacnal_data;
}
-static void kscimacnal_shutdown(nal_t *nal, int ni)
+static int kscimacnal_shutdown(nal_t *nal, int ni)
{
LASSERT (nal == &kscimacnal_api);
- LASSERT (kscimacnal_data.ksci_init);
-
- if (nal->nal_refct != 0)
- return;
-
- /* Called on last matching PtlNIFini() */
-
- /* FIXME: How should the shutdown procedure really look?
- */
- kscimacnal_data.ksci_shuttingdown=1;
-
- /* Stop handling ioctls */
- libcfs_nal_cmd_unregister(SCIMACNAL);
-
- mac_finish(kscimacnal_data.ksci_machandle);
-
- /* finalise lib after net shuts up */
- lib_fini(&kscimacnal_lib);
-
- kscimacnal_data.ksci_init = 0;
-
- /* Allow unload */
- PORTAL_MODULE_UNUSE;
-
- return;
+ return 0;
}
}
-static int kscimacnal_startup(nal_t *nal, ptl_pid_t requested_pid,
- ptl_ni_limits_t *requested_limits,
- ptl_ni_limits_t *actual_limits)
+static nal_t *kscimacnal_init(int interface, ptl_pt_index_t ptl_size,
+ ptl_ac_index_t ac_size, ptl_pid_t requested_pid)
+{
+ int nnids = 512; /* FIXME: Need ScaMac funktion to get #nodes */
+
+ CDEBUG(D_NET, "calling lib_init with nid "LPX64" nnids %d\n", kscimacnal_data.ksci_nid, nnids);
+ lib_init(&kscimacnal_lib, kscimacnal_data.ksci_nid, 0, nnids,ptl_size, ac_size);
+ return &kscimacnal_api;
+}
+
+
+/* Called by kernel at module unload time */
+static void /*__exit*/
+kscimacnal_finalize(void)
+{
+ /* FIXME: How should the shutdown procedure really look? */
+ kscimacnal_data.ksci_shuttingdown=1;
+
+ PORTAL_SYMBOL_UNREGISTER(kscimacnal_ni);
+
+ PtlNIFini(kscimacnal_ni);
+ lib_fini(&kscimacnal_lib);
+
+ mac_finish(kscimacnal_data.ksci_machandle);
+
+ CDEBUG (D_MALLOC, "done kmem %d\n", atomic_read (&portal_kmemory));
+
+ return;
+}
+
+
+/* Called by kernel at module insertion time */
+static int __init
+kscimacnal_initialize(void)
{
int rc;
- mac_physaddr_t mac_physaddr;
- ptl_process_id_t process_id;
+ unsigned long nid=0;
mac_handle_t *machandle = NULL;
- if (nal->nal_refct != 0) {
- if (actual_limits != NULL)
- *actual_limits = kscimacnal_lib.ni.actual_limits;
- return (PTL_OK);
- }
- /* Called on first PtlNIInit(SCIMACNAL) */
+ CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read (&portal_kmemory));
+
+ kscimacnal_api.forward = kscimacnal_forward;
+ kscimacnal_api.shutdown = kscimacnal_shutdown;
+ kscimacnal_api.yield = kscimacnal_yield;
+ kscimacnal_api.validate = NULL; /* our api validate is a NOOP */
+ kscimacnal_api.lock= kscimacnal_lock;
+ kscimacnal_api.unlock= kscimacnal_unlock;
+ kscimacnal_api.nal_data = &kscimacnal_data;
- LASSERT (nal == kscimacnal_api);
- LASSERT (!kscimacnal_data.ksci_init);
-
kscimacnal_lib.nal_data = &kscimacnal_data;
memset(&kscimacnal_data, 0, sizeof(kscimacnal_data));
if(!machandle) {
CERROR("mac_init() failed\n");
- return PTL_FAIL;
+ return -1;
}
kscimacnal_data.ksci_machandle = machandle;
mac_get_mtusize(machandle), SCIMACNAL_MTU);
CERROR("Consult README.scimacnal for more information\n");
mac_finish(machandle);
- return PTL_FAIL;
+ return -1;
}
/* Get the node ID */
/* mac_get_physaddrlen() is a function instead of define, sigh */
- LASSERT(mac_get_physaddrlen(machandle) <= sizeof(mac_physaddr));
- if(mac_get_physaddr(machandle, &mac_physaddr)) {
+ LASSERT(mac_get_physaddrlen(machandle) <= sizeof(nid));
+ if(mac_get_physaddr(machandle, (mac_physaddr_t *) &nid)) {
CERROR("mac_get_physaddr() failed\n");
mac_finish(machandle);
- return PTL_FAIL;
+ return -1;
}
- kscimacnal_data.ksci_nid = (ptl_nid_t)(ntohl(mac_physaddr));
+ nid = ntohl(nid);
+ kscimacnal_data.ksci_nid = nid;
- process_id.pid = 0;
- process_id.nid = kscimacnal_data.ksci_nid;
- CDEBUG(D_NET, "calling lib_init with nid "LPX64"\n",
- kscimacnal_data.ksci_nid);
-
- rc = lib_init(&kscimacnal_lib, process_id,
- requested_limits, actual_limits);
- if (rc != PTL_OK) {
+ /* Initialize Network Interface */
+ /* FIXME: What do the magic numbers mean? Documentation anyone? */
+ rc = PtlNIInit(kscimacnal_init, 32, 4, 0, &kscimacnal_ni);
+ if (rc) {
CERROR("PtlNIInit failed %d\n", rc);
mac_finish(machandle);
- return (rc);
+ return (-ENOMEM);
}
/* Init command interface */
- rc = libcfs_nal_cmd_register (SCIMACNAL, &kscimacnal_cmd, NULL);
+ rc = kportal_nal_register (SCIMACNAL, &kscimacnal_cmd, NULL);
if (rc != 0) {
CERROR ("Can't initialise command interface (rc = %d)\n", rc);
- lib_fini(&kscimacnal_lib);
+ PtlNIFini(kscimacnal_ni);
mac_finish(machandle);
- return (PTL_FAIL);
+ return (rc);
}
- /* We're done now, it's OK for the RX callback to do stuff */
- kscimacnal_data.ksci_init = 1;
- /* Prevent unload before matching PtlNIFini() */
- PORTAL_MODULE_USE;
-
- return (PTL_OK);
-}
-
-
-/* Called by kernel at module unload time */
-static void /*__exit*/
-kscimacnal_finalize(void)
-{
- LASSERT (!kscimacnal_data.ksci_init);
-
- ptl_unregister_nal(SCIMACNAL);
+ PORTAL_SYMBOL_REGISTER(kscimacnal_ni);
- CDEBUG (D_MALLOC, "done kmem %d\n", atomic_read (&portal_kmemory));
-
- return;
-}
-
-
-/* Called by kernel at module insertion time */
-static int __init
-kscimacnal_initialize(void)
-{
- int rc;
-
- CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read (&portal_kmemory));
-
- kscimacnal_api.startup = kscimacnal_startup;
- kscimacnal_api.forward = kscimacnal_forward;
- kscimacnal_api.shutdown = kscimacnal_shutdown;
- kscimacnal_api.yield = kscimacnal_yield;
- kscimacnal_api.lock= kscimacnal_lock;
- kscimacnal_api.unlock= kscimacnal_unlock;
- kscimacnal_api.nal_data = &kscimacnal_data;
+ /* We're done now, it's OK for the RX callback to do stuff */
+ kscimacnal_data.ksci_init = 1;
- rc = ptl_register_nal(SCIMACNAL, &kscimacnal_api);
- if (rc != PTL_OK) {
- CERROR("Can't register SCIMACNAL: %d\n", rc);
- return (-ENODEV);
- }
-
return 0;
}