Whamcloud - gitweb
smash the HEAD with the contents of b_cmd. HEAD_PRE_CMD_SMASH and
[fs/lustre-release.git] / lnet / klnds / scimaclnd / scimacnal.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:cindent:
3  *
4  * Copyright (C) 2003 High Performance Computing Center North (HPC2N)
5  *   Author: Niklas Edmundsson <nikke@hpc2n.umu.se>
6
7  * Based on gmnal, which is based on ksocknal and qswnal
8  *
9  * This file is part of Portals, http://www.sf.net/projects/lustre/
10  *
11  * Portals is free software; you can redistribute it and/or
12  * modify it under the terms of version 2 of the GNU General Public
13  * License as published by the Free Software Foundation.
14  *
15  * Portals is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Portals; if not, write to the Free Software
22  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  *
24  */
25
26
27 #include "scimacnal.h"
28
29 ptl_handle_ni_t kscimacnal_ni;
30 nal_t  kscimacnal_api;
31
32 kscimacnal_data_t kscimacnal_data;
33
34 kpr_nal_interface_t kscimacnal_router_interface = {
35         kprni_nalid:    SCIMACNAL,
36         kprni_arg:      NULL,
37         kprni_fwd:      kscimacnal_fwd_packet,
38 };
39
40
41 int kscimacnal_cmd (struct portal_ioctl_data *data, void *private)
42 {
43         LASSERT (data != NULL);
44
45         switch (data->ioc_nal_cmd) {
46                 case NAL_CMD_REGISTER_MYNID:
47                         if(kscimacnal_lib.ni.nid == data->ioc_nid) {
48                                 break;
49                         }
50                         CDEBUG (D_IOCTL, "Can't change NID from "LPX64" to "LPX64")\n", kscimacnal_lib.ni.nid, data->ioc_nid);
51                         return(-EINVAL);
52                 default:
53                         return(-EINVAL);
54         }
55
56         return(0);
57 }
58
59 static int kscimacnal_forward(nal_t   *nal,
60                           int     id,
61                           void    *args,  size_t args_len,
62                           void    *ret,   size_t ret_len)
63 {
64         kscimacnal_data_t *ksci = nal->nal_data;
65         nal_cb_t      *nal_cb = ksci->ksci_cb;
66
67         LASSERT (nal == &kscimacnal_api);
68         LASSERT (ksci == &kscimacnal_data);
69         LASSERT (nal_cb == &kscimacnal_lib);
70
71         lib_dispatch(nal_cb, ksci, id, args, ret); /* nal needs ksci */
72         return PTL_OK;
73 }
74
75
76 static void kscimacnal_lock(nal_t *nal, unsigned long *flags)
77 {
78         kscimacnal_data_t *ksci = nal->nal_data;
79         nal_cb_t      *nal_cb = ksci->ksci_cb;
80
81
82         LASSERT (nal == &kscimacnal_api);
83         LASSERT (ksci == &kscimacnal_data);
84         LASSERT (nal_cb == &kscimacnal_lib);
85
86         nal_cb->cb_cli(nal_cb,flags);
87 }
88
89
90 static void kscimacnal_unlock(nal_t *nal, unsigned long *flags)
91 {
92         kscimacnal_data_t *ksci = nal->nal_data;
93         nal_cb_t      *nal_cb = ksci->ksci_cb;
94
95
96         LASSERT (nal == &kscimacnal_api);
97         LASSERT (ksci == &kscimacnal_data);
98         LASSERT (nal_cb == &kscimacnal_lib);
99
100         nal_cb->cb_sti(nal_cb,flags);
101 }
102
103
104 static int kscimacnal_shutdown(nal_t *nal, int ni)
105 {
106         LASSERT (nal == &kscimacnal_api);
107         return 0;
108 }
109
110
111 static void kscimacnal_yield( nal_t *nal, unsigned long *flags, int milliseconds )
112 {
113         LASSERT (nal == &kscimacnal_api);
114
115         if (milliseconds != 0) {
116                 CERROR ("Blocking yield not implemented yet\n");
117                 LBUG();
118         }
119
120         if (current->need_resched) 
121                 schedule();
122         return;
123 }
124
125
126 static nal_t *kscimacnal_init(int interface, ptl_pt_index_t  ptl_size,
127                 ptl_ac_index_t  ac_size, ptl_pid_t requested_pid)
128 {
129         int     nnids = 512; /* FIXME: Need ScaMac funktion to get #nodes */
130
131         CDEBUG(D_NET, "calling lib_init with nid "LPX64" nnids %d\n", kscimacnal_data.ksci_nid, nnids);
132         lib_init(&kscimacnal_lib, kscimacnal_data.ksci_nid, 0, nnids,ptl_size, ac_size); 
133         return &kscimacnal_api;
134 }
135
136
137 /* Called by kernel at module unload time */
138 static void /*__exit*/ 
139 kscimacnal_finalize(void)
140 {
141         /* FIXME: How should the shutdown procedure really look? */
142         kscimacnal_data.ksci_shuttingdown=1;
143
144         PORTAL_SYMBOL_UNREGISTER(kscimacnal_ni);
145
146         PtlNIFini(kscimacnal_ni);
147         lib_fini(&kscimacnal_lib);
148
149         mac_finish(kscimacnal_data.ksci_machandle);
150
151         CDEBUG (D_MALLOC, "done kmem %d\n", atomic_read (&portal_kmemory));
152
153         return;
154 }
155
156
157 /* Called by kernel at module insertion time */
158 static int __init
159 kscimacnal_initialize(void)
160 {
161         int rc;
162         unsigned long     nid=0;
163         mac_handle_t    *machandle = NULL;
164
165
166         CDEBUG (D_MALLOC, "start kmem %d\n", atomic_read (&portal_kmemory));
167
168         kscimacnal_api.forward = kscimacnal_forward;
169         kscimacnal_api.shutdown = kscimacnal_shutdown;
170         kscimacnal_api.yield = kscimacnal_yield;
171         kscimacnal_api.validate = NULL;         /* our api validate is a NOOP */
172         kscimacnal_api.lock= kscimacnal_lock;
173         kscimacnal_api.unlock= kscimacnal_unlock;
174         kscimacnal_api.nal_data = &kscimacnal_data;
175
176         kscimacnal_lib.nal_data = &kscimacnal_data;
177
178         memset(&kscimacnal_data, 0, sizeof(kscimacnal_data));
179
180         kscimacnal_data.ksci_cb = &kscimacnal_lib;
181
182         /* We're not using this, but cli/sti callbacks does... ??? */
183         spin_lock_init(&kscimacnal_data.ksci_dispatch_lock);
184
185         /* FIXME: We only support one adapter for now */
186         machandle = mac_init(0, MAC_SAPID_LUSTRE, kscimacnal_rx,
187                         &kscimacnal_data);
188
189         if(!machandle) {
190                 CERROR("mac_init() failed\n");
191                 return -1;
192         }
193
194         kscimacnal_data.ksci_machandle = machandle;
195
196         /* Make sure the scimac MTU is tuned */
197         if(mac_get_mtusize(machandle) < SCIMACNAL_MTU) {
198                 CERROR("scimac mtu of %ld smaller than SCIMACNAL MTU of %d\n",
199                                 mac_get_mtusize(machandle), SCIMACNAL_MTU);
200                 CERROR("Consult README.scimacnal for more information\n");
201                 mac_finish(machandle);
202                 return -1;
203         }
204
205         /* Get the node ID */
206         /* mac_get_physaddrlen() is a function instead of define, sigh */
207         LASSERT(mac_get_physaddrlen(machandle) <= sizeof(nid));
208         if(mac_get_physaddr(machandle, (mac_physaddr_t *) &nid)) {
209                 CERROR("mac_get_physaddr() failed\n");
210                 mac_finish(machandle);
211                 return -1;
212         }
213         nid = ntohl(nid);
214         kscimacnal_data.ksci_nid = nid;
215
216
217         /* Initialize Network Interface */
218         /* FIXME: What do the magic numbers mean? Documentation anyone? */
219         rc = PtlNIInit(kscimacnal_init, 32, 4, 0, &kscimacnal_ni);
220         if (rc) {
221                 CERROR("PtlNIInit failed %d\n", rc);
222                 mac_finish(machandle);
223                 return (-ENOMEM);
224         }
225
226         /* Init command interface */
227         rc = kportal_nal_register (SCIMACNAL, &kscimacnal_cmd, NULL);
228         if (rc != 0) {
229                 CERROR ("Can't initialise command interface (rc = %d)\n", rc);
230                 PtlNIFini(kscimacnal_ni);
231                 mac_finish(machandle);
232                 return (rc);
233         }
234
235
236         PORTAL_SYMBOL_REGISTER(kscimacnal_ni);
237
238         /* We're done now, it's OK for the RX callback to do stuff */
239         kscimacnal_data.ksci_init = 1;
240
241         return 0;
242 }
243
244
245 MODULE_AUTHOR("Niklas Edmundsson <nikke@hpc2n.umu.se>");
246 MODULE_DESCRIPTION("Kernel Scali ScaMAC SCI NAL v0.1");
247 MODULE_LICENSE("GPL");
248
249 module_init (kscimacnal_initialize);
250 module_exit (kscimacnal_finalize);
251
252 EXPORT_SYMBOL(kscimacnal_ni);