diff options
Diffstat (limited to 'drivers/misc/sgi-xp/xpnet.c')
-rw-r--r-- | drivers/misc/sgi-xp/xpnet.c | 109 |
1 files changed, 36 insertions, 73 deletions
diff --git a/drivers/misc/sgi-xp/xpnet.c b/drivers/misc/sgi-xp/xpnet.c index 38552f37e53d..e41cb93b8c89 100644 --- a/drivers/misc/sgi-xp/xpnet.c +++ b/drivers/misc/sgi-xp/xpnet.c | |||
@@ -6,7 +6,6 @@ | |||
6 | * Copyright (C) 1999-2008 Silicon Graphics, Inc. All rights reserved. | 6 | * Copyright (C) 1999-2008 Silicon Graphics, Inc. All rights reserved. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | |||
10 | /* | 9 | /* |
11 | * Cross Partition Network Interface (XPNET) support | 10 | * Cross Partition Network Interface (XPNET) support |
12 | * | 11 | * |
@@ -21,7 +20,6 @@ | |||
21 | * | 20 | * |
22 | */ | 21 | */ |
23 | 22 | ||
24 | |||
25 | #include <linux/module.h> | 23 | #include <linux/module.h> |
26 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
27 | #include <linux/init.h> | 25 | #include <linux/init.h> |
@@ -40,7 +38,6 @@ | |||
40 | #include <asm/atomic.h> | 38 | #include <asm/atomic.h> |
41 | #include "xp.h" | 39 | #include "xp.h" |
42 | 40 | ||
43 | |||
44 | /* | 41 | /* |
45 | * The message payload transferred by XPC. | 42 | * The message payload transferred by XPC. |
46 | * | 43 | * |
@@ -79,7 +76,6 @@ struct xpnet_message { | |||
79 | #define XPNET_MSG_ALIGNED_SIZE (L1_CACHE_ALIGN(XPNET_MSG_SIZE)) | 76 | #define XPNET_MSG_ALIGNED_SIZE (L1_CACHE_ALIGN(XPNET_MSG_SIZE)) |
80 | #define XPNET_MSG_NENTRIES (PAGE_SIZE / XPNET_MSG_ALIGNED_SIZE) | 77 | #define XPNET_MSG_NENTRIES (PAGE_SIZE / XPNET_MSG_ALIGNED_SIZE) |
81 | 78 | ||
82 | |||
83 | #define XPNET_MAX_KTHREADS (XPNET_MSG_NENTRIES + 1) | 79 | #define XPNET_MAX_KTHREADS (XPNET_MSG_NENTRIES + 1) |
84 | #define XPNET_MAX_IDLE_KTHREADS (XPNET_MSG_NENTRIES + 1) | 80 | #define XPNET_MAX_IDLE_KTHREADS (XPNET_MSG_NENTRIES + 1) |
85 | 81 | ||
@@ -91,9 +87,9 @@ struct xpnet_message { | |||
91 | #define XPNET_VERSION_MAJOR(_v) ((_v) >> 4) | 87 | #define XPNET_VERSION_MAJOR(_v) ((_v) >> 4) |
92 | #define XPNET_VERSION_MINOR(_v) ((_v) & 0xf) | 88 | #define XPNET_VERSION_MINOR(_v) ((_v) & 0xf) |
93 | 89 | ||
94 | #define XPNET_VERSION _XPNET_VERSION(1,0) /* version 1.0 */ | 90 | #define XPNET_VERSION _XPNET_VERSION(1,0) /* version 1.0 */ |
95 | #define XPNET_VERSION_EMBED _XPNET_VERSION(1,1) /* version 1.1 */ | 91 | #define XPNET_VERSION_EMBED _XPNET_VERSION(1,1) /* version 1.1 */ |
96 | #define XPNET_MAGIC 0x88786984 /* "XNET" */ | 92 | #define XPNET_MAGIC 0x88786984 /* "XNET" */ |
97 | 93 | ||
98 | #define XPNET_VALID_MSG(_m) \ | 94 | #define XPNET_VALID_MSG(_m) \ |
99 | ((XPNET_VERSION_MAJOR(_m->version) == XPNET_VERSION_MAJOR(XPNET_VERSION)) \ | 95 | ((XPNET_VERSION_MAJOR(_m->version) == XPNET_VERSION_MAJOR(XPNET_VERSION)) \ |
@@ -101,7 +97,6 @@ struct xpnet_message { | |||
101 | 97 | ||
102 | #define XPNET_DEVICE_NAME "xp0" | 98 | #define XPNET_DEVICE_NAME "xp0" |
103 | 99 | ||
104 | |||
105 | /* | 100 | /* |
106 | * When messages are queued with xpc_send_notify, a kmalloc'd buffer | 101 | * When messages are queued with xpc_send_notify, a kmalloc'd buffer |
107 | * of the following type is passed as a notification cookie. When the | 102 | * of the following type is passed as a notification cookie. When the |
@@ -145,7 +140,6 @@ static DEFINE_SPINLOCK(xpnet_broadcast_lock); | |||
145 | /* 32KB has been determined to be the ideal */ | 140 | /* 32KB has been determined to be the ideal */ |
146 | #define XPNET_DEF_MTU (0x8000UL) | 141 | #define XPNET_DEF_MTU (0x8000UL) |
147 | 142 | ||
148 | |||
149 | /* | 143 | /* |
150 | * The partition id is encapsulated in the MAC address. The following | 144 | * The partition id is encapsulated in the MAC address. The following |
151 | * define locates the octet the partid is in. | 145 | * define locates the octet the partid is in. |
@@ -153,7 +147,6 @@ static DEFINE_SPINLOCK(xpnet_broadcast_lock); | |||
153 | #define XPNET_PARTID_OCTET 1 | 147 | #define XPNET_PARTID_OCTET 1 |
154 | #define XPNET_LICENSE_OCTET 2 | 148 | #define XPNET_LICENSE_OCTET 2 |
155 | 149 | ||
156 | |||
157 | /* | 150 | /* |
158 | * Define the XPNET debug device structure that is to be used with dev_dbg(), | 151 | * Define the XPNET debug device structure that is to be used with dev_dbg(), |
159 | * dev_err(), dev_warn(), and dev_info(). | 152 | * dev_err(), dev_warn(), and dev_info(). |
@@ -163,7 +156,7 @@ struct device_driver xpnet_dbg_name = { | |||
163 | }; | 156 | }; |
164 | 157 | ||
165 | struct device xpnet_dbg_subname = { | 158 | struct device xpnet_dbg_subname = { |
166 | .bus_id = {0}, /* set to "" */ | 159 | .bus_id = {0}, /* set to "" */ |
167 | .driver = &xpnet_dbg_name | 160 | .driver = &xpnet_dbg_name |
168 | }; | 161 | }; |
169 | 162 | ||
@@ -178,14 +171,13 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
178 | struct sk_buff *skb; | 171 | struct sk_buff *skb; |
179 | bte_result_t bret; | 172 | bte_result_t bret; |
180 | struct xpnet_dev_private *priv = | 173 | struct xpnet_dev_private *priv = |
181 | (struct xpnet_dev_private *) xpnet_device->priv; | 174 | (struct xpnet_dev_private *)xpnet_device->priv; |
182 | |||
183 | 175 | ||
184 | if (!XPNET_VALID_MSG(msg)) { | 176 | if (!XPNET_VALID_MSG(msg)) { |
185 | /* | 177 | /* |
186 | * Packet with a different XPC version. Ignore. | 178 | * Packet with a different XPC version. Ignore. |
187 | */ | 179 | */ |
188 | xpc_received(partid, channel, (void *) msg); | 180 | xpc_received(partid, channel, (void *)msg); |
189 | 181 | ||
190 | priv->stats.rx_errors++; | 182 | priv->stats.rx_errors++; |
191 | 183 | ||
@@ -194,14 +186,13 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
194 | dev_dbg(xpnet, "received 0x%lx, %d, %d, %d\n", msg->buf_pa, msg->size, | 186 | dev_dbg(xpnet, "received 0x%lx, %d, %d, %d\n", msg->buf_pa, msg->size, |
195 | msg->leadin_ignore, msg->tailout_ignore); | 187 | msg->leadin_ignore, msg->tailout_ignore); |
196 | 188 | ||
197 | |||
198 | /* reserve an extra cache line */ | 189 | /* reserve an extra cache line */ |
199 | skb = dev_alloc_skb(msg->size + L1_CACHE_BYTES); | 190 | skb = dev_alloc_skb(msg->size + L1_CACHE_BYTES); |
200 | if (!skb) { | 191 | if (!skb) { |
201 | dev_err(xpnet, "failed on dev_alloc_skb(%d)\n", | 192 | dev_err(xpnet, "failed on dev_alloc_skb(%d)\n", |
202 | msg->size + L1_CACHE_BYTES); | 193 | msg->size + L1_CACHE_BYTES); |
203 | 194 | ||
204 | xpc_received(partid, channel, (void *) msg); | 195 | xpc_received(partid, channel, (void *)msg); |
205 | 196 | ||
206 | priv->stats.rx_errors++; | 197 | priv->stats.rx_errors++; |
207 | 198 | ||
@@ -227,12 +218,13 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
227 | * Move the data over from the other side. | 218 | * Move the data over from the other side. |
228 | */ | 219 | */ |
229 | if ((XPNET_VERSION_MINOR(msg->version) == 1) && | 220 | if ((XPNET_VERSION_MINOR(msg->version) == 1) && |
230 | (msg->embedded_bytes != 0)) { | 221 | (msg->embedded_bytes != 0)) { |
231 | dev_dbg(xpnet, "copying embedded message. memcpy(0x%p, 0x%p, " | 222 | dev_dbg(xpnet, "copying embedded message. memcpy(0x%p, 0x%p, " |
232 | "%lu)\n", skb->data, &msg->data, | 223 | "%lu)\n", skb->data, &msg->data, |
233 | (size_t) msg->embedded_bytes); | 224 | (size_t)msg->embedded_bytes); |
234 | 225 | ||
235 | skb_copy_to_linear_data(skb, &msg->data, (size_t)msg->embedded_bytes); | 226 | skb_copy_to_linear_data(skb, &msg->data, |
227 | (size_t)msg->embedded_bytes); | ||
236 | } else { | 228 | } else { |
237 | dev_dbg(xpnet, "transferring buffer to the skb->data area;\n\t" | 229 | dev_dbg(xpnet, "transferring buffer to the skb->data area;\n\t" |
238 | "bte_copy(0x%p, 0x%p, %hu)\n", (void *)msg->buf_pa, | 230 | "bte_copy(0x%p, 0x%p, %hu)\n", (void *)msg->buf_pa, |
@@ -250,10 +242,10 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
250 | dev_err(xpnet, "bte_copy(0x%p, 0x%p, 0x%hx) returned " | 242 | dev_err(xpnet, "bte_copy(0x%p, 0x%p, 0x%hx) returned " |
251 | "error=0x%x\n", (void *)msg->buf_pa, | 243 | "error=0x%x\n", (void *)msg->buf_pa, |
252 | (void *)__pa((u64)skb->data & | 244 | (void *)__pa((u64)skb->data & |
253 | ~(L1_CACHE_BYTES - 1)), | 245 | ~(L1_CACHE_BYTES - 1)), |
254 | msg->size, bret); | 246 | msg->size, bret); |
255 | 247 | ||
256 | xpc_received(partid, channel, (void *) msg); | 248 | xpc_received(partid, channel, (void *)msg); |
257 | 249 | ||
258 | priv->stats.rx_errors++; | 250 | priv->stats.rx_errors++; |
259 | 251 | ||
@@ -262,7 +254,7 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
262 | } | 254 | } |
263 | 255 | ||
264 | dev_dbg(xpnet, "<skb->head=0x%p skb->data=0x%p skb->tail=0x%p " | 256 | dev_dbg(xpnet, "<skb->head=0x%p skb->data=0x%p skb->tail=0x%p " |
265 | "skb->end=0x%p skb->len=%d\n", (void *) skb->head, | 257 | "skb->end=0x%p skb->len=%d\n", (void *)skb->head, |
266 | (void *)skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), | 258 | (void *)skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), |
267 | skb->len); | 259 | skb->len); |
268 | 260 | ||
@@ -275,16 +267,14 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
275 | (void *)skb->head, (void *)skb->data, skb_tail_pointer(skb), | 267 | (void *)skb->head, (void *)skb->data, skb_tail_pointer(skb), |
276 | skb_end_pointer(skb), skb->len); | 268 | skb_end_pointer(skb), skb->len); |
277 | 269 | ||
278 | |||
279 | xpnet_device->last_rx = jiffies; | 270 | xpnet_device->last_rx = jiffies; |
280 | priv->stats.rx_packets++; | 271 | priv->stats.rx_packets++; |
281 | priv->stats.rx_bytes += skb->len + ETH_HLEN; | 272 | priv->stats.rx_bytes += skb->len + ETH_HLEN; |
282 | 273 | ||
283 | netif_rx_ni(skb); | 274 | netif_rx_ni(skb); |
284 | xpc_received(partid, channel, (void *) msg); | 275 | xpc_received(partid, channel, (void *)msg); |
285 | } | 276 | } |
286 | 277 | ||
287 | |||
288 | /* | 278 | /* |
289 | * This is the handler which XPC calls during any sort of change in | 279 | * This is the handler which XPC calls during any sort of change in |
290 | * state or message reception on a connection. | 280 | * state or message reception on a connection. |
@@ -295,20 +285,19 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | |||
295 | { | 285 | { |
296 | long bp; | 286 | long bp; |
297 | 287 | ||
298 | |||
299 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); | 288 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); |
300 | DBUG_ON(channel != XPC_NET_CHANNEL); | 289 | DBUG_ON(channel != XPC_NET_CHANNEL); |
301 | 290 | ||
302 | switch(reason) { | 291 | switch (reason) { |
303 | case xpcMsgReceived: /* message received */ | 292 | case xpcMsgReceived: /* message received */ |
304 | DBUG_ON(data == NULL); | 293 | DBUG_ON(data == NULL); |
305 | 294 | ||
306 | xpnet_receive(partid, channel, (struct xpnet_message *) data); | 295 | xpnet_receive(partid, channel, (struct xpnet_message *)data); |
307 | break; | 296 | break; |
308 | 297 | ||
309 | case xpcConnected: /* connection completed to a partition */ | 298 | case xpcConnected: /* connection completed to a partition */ |
310 | spin_lock_bh(&xpnet_broadcast_lock); | 299 | spin_lock_bh(&xpnet_broadcast_lock); |
311 | xpnet_broadcast_partitions |= 1UL << (partid -1 ); | 300 | xpnet_broadcast_partitions |= 1UL << (partid - 1); |
312 | bp = xpnet_broadcast_partitions; | 301 | bp = xpnet_broadcast_partitions; |
313 | spin_unlock_bh(&xpnet_broadcast_lock); | 302 | spin_unlock_bh(&xpnet_broadcast_lock); |
314 | 303 | ||
@@ -321,7 +310,7 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | |||
321 | 310 | ||
322 | default: | 311 | default: |
323 | spin_lock_bh(&xpnet_broadcast_lock); | 312 | spin_lock_bh(&xpnet_broadcast_lock); |
324 | xpnet_broadcast_partitions &= ~(1UL << (partid -1 )); | 313 | xpnet_broadcast_partitions &= ~(1UL << (partid - 1)); |
325 | bp = xpnet_broadcast_partitions; | 314 | bp = xpnet_broadcast_partitions; |
326 | spin_unlock_bh(&xpnet_broadcast_lock); | 315 | spin_unlock_bh(&xpnet_broadcast_lock); |
327 | 316 | ||
@@ -337,13 +326,11 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | |||
337 | } | 326 | } |
338 | } | 327 | } |
339 | 328 | ||
340 | |||
341 | static int | 329 | static int |
342 | xpnet_dev_open(struct net_device *dev) | 330 | xpnet_dev_open(struct net_device *dev) |
343 | { | 331 | { |
344 | enum xpc_retval ret; | 332 | enum xpc_retval ret; |
345 | 333 | ||
346 | |||
347 | dev_dbg(xpnet, "calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, " | 334 | dev_dbg(xpnet, "calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, " |
348 | "%ld)\n", XPC_NET_CHANNEL, xpnet_connection_activity, | 335 | "%ld)\n", XPC_NET_CHANNEL, xpnet_connection_activity, |
349 | XPNET_MSG_SIZE, XPNET_MSG_NENTRIES, XPNET_MAX_KTHREADS, | 336 | XPNET_MSG_SIZE, XPNET_MSG_NENTRIES, XPNET_MAX_KTHREADS, |
@@ -364,7 +351,6 @@ xpnet_dev_open(struct net_device *dev) | |||
364 | return 0; | 351 | return 0; |
365 | } | 352 | } |
366 | 353 | ||
367 | |||
368 | static int | 354 | static int |
369 | xpnet_dev_stop(struct net_device *dev) | 355 | xpnet_dev_stop(struct net_device *dev) |
370 | { | 356 | { |
@@ -375,7 +361,6 @@ xpnet_dev_stop(struct net_device *dev) | |||
375 | return 0; | 361 | return 0; |
376 | } | 362 | } |
377 | 363 | ||
378 | |||
379 | static int | 364 | static int |
380 | xpnet_dev_change_mtu(struct net_device *dev, int new_mtu) | 365 | xpnet_dev_change_mtu(struct net_device *dev, int new_mtu) |
381 | { | 366 | { |
@@ -392,7 +377,6 @@ xpnet_dev_change_mtu(struct net_device *dev, int new_mtu) | |||
392 | return 0; | 377 | return 0; |
393 | } | 378 | } |
394 | 379 | ||
395 | |||
396 | /* | 380 | /* |
397 | * Required for the net_device structure. | 381 | * Required for the net_device structure. |
398 | */ | 382 | */ |
@@ -402,7 +386,6 @@ xpnet_dev_set_config(struct net_device *dev, struct ifmap *new_map) | |||
402 | return 0; | 386 | return 0; |
403 | } | 387 | } |
404 | 388 | ||
405 | |||
406 | /* | 389 | /* |
407 | * Return statistics to the caller. | 390 | * Return statistics to the caller. |
408 | */ | 391 | */ |
@@ -411,13 +394,11 @@ xpnet_dev_get_stats(struct net_device *dev) | |||
411 | { | 394 | { |
412 | struct xpnet_dev_private *priv; | 395 | struct xpnet_dev_private *priv; |
413 | 396 | ||
414 | 397 | priv = (struct xpnet_dev_private *)dev->priv; | |
415 | priv = (struct xpnet_dev_private *) dev->priv; | ||
416 | 398 | ||
417 | return &priv->stats; | 399 | return &priv->stats; |
418 | } | 400 | } |
419 | 401 | ||
420 | |||
421 | /* | 402 | /* |
422 | * Notification that the other end has received the message and | 403 | * Notification that the other end has received the message and |
423 | * DMA'd the skb information. At this point, they are done with | 404 | * DMA'd the skb information. At this point, they are done with |
@@ -426,11 +407,9 @@ xpnet_dev_get_stats(struct net_device *dev) | |||
426 | */ | 407 | */ |
427 | static void | 408 | static void |
428 | xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel, | 409 | xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel, |
429 | void *__qm) | 410 | void *__qm) |
430 | { | 411 | { |
431 | struct xpnet_pending_msg *queued_msg = | 412 | struct xpnet_pending_msg *queued_msg = (struct xpnet_pending_msg *)__qm; |
432 | (struct xpnet_pending_msg *) __qm; | ||
433 | |||
434 | 413 | ||
435 | DBUG_ON(queued_msg == NULL); | 414 | DBUG_ON(queued_msg == NULL); |
436 | 415 | ||
@@ -439,14 +418,13 @@ xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel, | |||
439 | 418 | ||
440 | if (atomic_dec_return(&queued_msg->use_count) == 0) { | 419 | if (atomic_dec_return(&queued_msg->use_count) == 0) { |
441 | dev_dbg(xpnet, "all acks for skb->head=-x%p\n", | 420 | dev_dbg(xpnet, "all acks for skb->head=-x%p\n", |
442 | (void *) queued_msg->skb->head); | 421 | (void *)queued_msg->skb->head); |
443 | 422 | ||
444 | dev_kfree_skb_any(queued_msg->skb); | 423 | dev_kfree_skb_any(queued_msg->skb); |
445 | kfree(queued_msg); | 424 | kfree(queued_msg); |
446 | } | 425 | } |
447 | } | 426 | } |
448 | 427 | ||
449 | |||
450 | /* | 428 | /* |
451 | * Network layer has formatted a packet (skb) and is ready to place it | 429 | * Network layer has formatted a packet (skb) and is ready to place it |
452 | * "on the wire". Prepare and send an xpnet_message to all partitions | 430 | * "on the wire". Prepare and send an xpnet_message to all partitions |
@@ -469,16 +447,13 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
469 | struct xpnet_dev_private *priv; | 447 | struct xpnet_dev_private *priv; |
470 | u16 embedded_bytes; | 448 | u16 embedded_bytes; |
471 | 449 | ||
472 | 450 | priv = (struct xpnet_dev_private *)dev->priv; | |
473 | priv = (struct xpnet_dev_private *) dev->priv; | ||
474 | |||
475 | 451 | ||
476 | dev_dbg(xpnet, ">skb->head=0x%p skb->data=0x%p skb->tail=0x%p " | 452 | dev_dbg(xpnet, ">skb->head=0x%p skb->data=0x%p skb->tail=0x%p " |
477 | "skb->end=0x%p skb->len=%d\n", (void *) skb->head, | 453 | "skb->end=0x%p skb->len=%d\n", (void *)skb->head, |
478 | (void *)skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), | 454 | (void *)skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), |
479 | skb->len); | 455 | skb->len); |
480 | 456 | ||
481 | |||
482 | /* | 457 | /* |
483 | * The xpnet_pending_msg tracks how many outstanding | 458 | * The xpnet_pending_msg tracks how many outstanding |
484 | * xpc_send_notifies are relying on this skb. When none | 459 | * xpc_send_notifies are relying on this skb. When none |
@@ -487,16 +462,15 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
487 | queued_msg = kmalloc(sizeof(struct xpnet_pending_msg), GFP_ATOMIC); | 462 | queued_msg = kmalloc(sizeof(struct xpnet_pending_msg), GFP_ATOMIC); |
488 | if (queued_msg == NULL) { | 463 | if (queued_msg == NULL) { |
489 | dev_warn(xpnet, "failed to kmalloc %ld bytes; dropping " | 464 | dev_warn(xpnet, "failed to kmalloc %ld bytes; dropping " |
490 | "packet\n", sizeof(struct xpnet_pending_msg)); | 465 | "packet\n", sizeof(struct xpnet_pending_msg)); |
491 | 466 | ||
492 | priv->stats.tx_errors++; | 467 | priv->stats.tx_errors++; |
493 | 468 | ||
494 | return -ENOMEM; | 469 | return -ENOMEM; |
495 | } | 470 | } |
496 | 471 | ||
497 | |||
498 | /* get the beginning of the first cacheline and end of last */ | 472 | /* get the beginning of the first cacheline and end of last */ |
499 | start_addr = ((u64) skb->data & ~(L1_CACHE_BYTES - 1)); | 473 | start_addr = ((u64)skb->data & ~(L1_CACHE_BYTES - 1)); |
500 | end_addr = L1_CACHE_ALIGN((u64)skb_tail_pointer(skb)); | 474 | end_addr = L1_CACHE_ALIGN((u64)skb_tail_pointer(skb)); |
501 | 475 | ||
502 | /* calculate how many bytes to embed in the XPC message */ | 476 | /* calculate how many bytes to embed in the XPC message */ |
@@ -506,7 +480,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
506 | embedded_bytes = skb->len; | 480 | embedded_bytes = skb->len; |
507 | } | 481 | } |
508 | 482 | ||
509 | |||
510 | /* | 483 | /* |
511 | * Since the send occurs asynchronously, we set the count to one | 484 | * Since the send occurs asynchronously, we set the count to one |
512 | * and begin sending. Any sends that happen to complete before | 485 | * and begin sending. Any sends that happen to complete before |
@@ -517,14 +490,13 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
517 | atomic_set(&queued_msg->use_count, 1); | 490 | atomic_set(&queued_msg->use_count, 1); |
518 | queued_msg->skb = skb; | 491 | queued_msg->skb = skb; |
519 | 492 | ||
520 | |||
521 | second_mac_octet = skb->data[XPNET_PARTID_OCTET]; | 493 | second_mac_octet = skb->data[XPNET_PARTID_OCTET]; |
522 | if (second_mac_octet == 0xff) { | 494 | if (second_mac_octet == 0xff) { |
523 | /* we are being asked to broadcast to all partitions */ | 495 | /* we are being asked to broadcast to all partitions */ |
524 | dp = xpnet_broadcast_partitions; | 496 | dp = xpnet_broadcast_partitions; |
525 | } else if (second_mac_octet != 0) { | 497 | } else if (second_mac_octet != 0) { |
526 | dp = xpnet_broadcast_partitions & | 498 | dp = xpnet_broadcast_partitions & |
527 | (1UL << (second_mac_octet - 1)); | 499 | (1UL << (second_mac_octet - 1)); |
528 | } else { | 500 | } else { |
529 | /* 0 is an invalid partid. Ignore */ | 501 | /* 0 is an invalid partid. Ignore */ |
530 | dp = 0; | 502 | dp = 0; |
@@ -543,7 +515,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
543 | for (dest_partid = 1; dp && dest_partid < XP_MAX_PARTITIONS; | 515 | for (dest_partid = 1; dp && dest_partid < XP_MAX_PARTITIONS; |
544 | dest_partid++) { | 516 | dest_partid++) { |
545 | 517 | ||
546 | |||
547 | if (!(dp & (1UL << (dest_partid - 1)))) { | 518 | if (!(dp & (1UL << (dest_partid - 1)))) { |
548 | /* not destined for this partition */ | 519 | /* not destined for this partition */ |
549 | continue; | 520 | continue; |
@@ -552,7 +523,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
552 | /* remove this partition from the destinations mask */ | 523 | /* remove this partition from the destinations mask */ |
553 | dp &= ~(1UL << (dest_partid - 1)); | 524 | dp &= ~(1UL << (dest_partid - 1)); |
554 | 525 | ||
555 | |||
556 | /* found a partition to send to */ | 526 | /* found a partition to send to */ |
557 | 527 | ||
558 | ret = xpc_allocate(dest_partid, XPC_NET_CHANNEL, | 528 | ret = xpc_allocate(dest_partid, XPC_NET_CHANNEL, |
@@ -565,7 +535,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
565 | if (unlikely(embedded_bytes != 0)) { | 535 | if (unlikely(embedded_bytes != 0)) { |
566 | msg->version = XPNET_VERSION_EMBED; | 536 | msg->version = XPNET_VERSION_EMBED; |
567 | dev_dbg(xpnet, "calling memcpy(0x%p, 0x%p, 0x%lx)\n", | 537 | dev_dbg(xpnet, "calling memcpy(0x%p, 0x%p, 0x%lx)\n", |
568 | &msg->data, skb->data, (size_t) embedded_bytes); | 538 | &msg->data, skb->data, (size_t)embedded_bytes); |
569 | skb_copy_from_linear_data(skb, &msg->data, | 539 | skb_copy_from_linear_data(skb, &msg->data, |
570 | (size_t)embedded_bytes); | 540 | (size_t)embedded_bytes); |
571 | } else { | 541 | } else { |
@@ -573,7 +543,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
573 | } | 543 | } |
574 | msg->magic = XPNET_MAGIC; | 544 | msg->magic = XPNET_MAGIC; |
575 | msg->size = end_addr - start_addr; | 545 | msg->size = end_addr - start_addr; |
576 | msg->leadin_ignore = (u64) skb->data - start_addr; | 546 | msg->leadin_ignore = (u64)skb->data - start_addr; |
577 | msg->tailout_ignore = end_addr - (u64)skb_tail_pointer(skb); | 547 | msg->tailout_ignore = end_addr - (u64)skb_tail_pointer(skb); |
578 | msg->buf_pa = __pa(start_addr); | 548 | msg->buf_pa = __pa(start_addr); |
579 | 549 | ||
@@ -583,7 +553,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
583 | dest_partid, XPC_NET_CHANNEL, msg->buf_pa, msg->size, | 553 | dest_partid, XPC_NET_CHANNEL, msg->buf_pa, msg->size, |
584 | msg->leadin_ignore, msg->tailout_ignore); | 554 | msg->leadin_ignore, msg->tailout_ignore); |
585 | 555 | ||
586 | |||
587 | atomic_inc(&queued_msg->use_count); | 556 | atomic_inc(&queued_msg->use_count); |
588 | 557 | ||
589 | ret = xpc_send_notify(dest_partid, XPC_NET_CHANNEL, msg, | 558 | ret = xpc_send_notify(dest_partid, XPC_NET_CHANNEL, msg, |
@@ -599,7 +568,6 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
599 | dev_dbg(xpnet, "no partitions to receive packet destined for " | 568 | dev_dbg(xpnet, "no partitions to receive packet destined for " |
600 | "%d\n", dest_partid); | 569 | "%d\n", dest_partid); |
601 | 570 | ||
602 | |||
603 | dev_kfree_skb(skb); | 571 | dev_kfree_skb(skb); |
604 | kfree(queued_msg); | 572 | kfree(queued_msg); |
605 | } | 573 | } |
@@ -610,23 +578,20 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
610 | return 0; | 578 | return 0; |
611 | } | 579 | } |
612 | 580 | ||
613 | |||
614 | /* | 581 | /* |
615 | * Deal with transmit timeouts coming from the network layer. | 582 | * Deal with transmit timeouts coming from the network layer. |
616 | */ | 583 | */ |
617 | static void | 584 | static void |
618 | xpnet_dev_tx_timeout (struct net_device *dev) | 585 | xpnet_dev_tx_timeout(struct net_device *dev) |
619 | { | 586 | { |
620 | struct xpnet_dev_private *priv; | 587 | struct xpnet_dev_private *priv; |
621 | 588 | ||
622 | 589 | priv = (struct xpnet_dev_private *)dev->priv; | |
623 | priv = (struct xpnet_dev_private *) dev->priv; | ||
624 | 590 | ||
625 | priv->stats.tx_errors++; | 591 | priv->stats.tx_errors++; |
626 | return; | 592 | return; |
627 | } | 593 | } |
628 | 594 | ||
629 | |||
630 | static int __init | 595 | static int __init |
631 | xpnet_init(void) | 596 | xpnet_init(void) |
632 | { | 597 | { |
@@ -634,7 +599,6 @@ xpnet_init(void) | |||
634 | u32 license_num; | 599 | u32 license_num; |
635 | int result = -ENOMEM; | 600 | int result = -ENOMEM; |
636 | 601 | ||
637 | |||
638 | if (!ia64_platform_is("sn2")) { | 602 | if (!ia64_platform_is("sn2")) { |
639 | return -ENODEV; | 603 | return -ENODEV; |
640 | } | 604 | } |
@@ -672,7 +636,7 @@ xpnet_init(void) | |||
672 | license_num = sn_partition_serial_number_val(); | 636 | license_num = sn_partition_serial_number_val(); |
673 | for (i = 3; i >= 0; i--) { | 637 | for (i = 3; i >= 0; i--) { |
674 | xpnet_device->dev_addr[XPNET_LICENSE_OCTET + i] = | 638 | xpnet_device->dev_addr[XPNET_LICENSE_OCTET + i] = |
675 | license_num & 0xff; | 639 | license_num & 0xff; |
676 | license_num = license_num >> 8; | 640 | license_num = license_num >> 8; |
677 | } | 641 | } |
678 | 642 | ||
@@ -696,23 +660,22 @@ xpnet_init(void) | |||
696 | 660 | ||
697 | return result; | 661 | return result; |
698 | } | 662 | } |
699 | module_init(xpnet_init); | ||
700 | 663 | ||
664 | module_init(xpnet_init); | ||
701 | 665 | ||
702 | static void __exit | 666 | static void __exit |
703 | xpnet_exit(void) | 667 | xpnet_exit(void) |
704 | { | 668 | { |
705 | dev_info(xpnet, "unregistering network device %s\n", | 669 | dev_info(xpnet, "unregistering network device %s\n", |
706 | xpnet_device[0].name); | 670 | xpnet_device[0].name); |
707 | 671 | ||
708 | unregister_netdev(xpnet_device); | 672 | unregister_netdev(xpnet_device); |
709 | 673 | ||
710 | free_netdev(xpnet_device); | 674 | free_netdev(xpnet_device); |
711 | } | 675 | } |
712 | module_exit(xpnet_exit); | ||
713 | 676 | ||
677 | module_exit(xpnet_exit); | ||
714 | 678 | ||
715 | MODULE_AUTHOR("Silicon Graphics, Inc."); | 679 | MODULE_AUTHOR("Silicon Graphics, Inc."); |
716 | MODULE_DESCRIPTION("Cross Partition Network adapter (XPNET)"); | 680 | MODULE_DESCRIPTION("Cross Partition Network adapter (XPNET)"); |
717 | MODULE_LICENSE("GPL"); | 681 | MODULE_LICENSE("GPL"); |
718 | |||