23 #include <linux/slab.h>
24 #include <linux/module.h>
25 #include <linux/netdevice.h>
61 #define XPNET_MSG_SIZE XPC_MSG_PAYLOAD_MAX_SIZE
62 #define XPNET_MSG_DATA_MAX \
63 (XPNET_MSG_SIZE - offsetof(struct xpnet_message, data))
64 #define XPNET_MSG_NENTRIES (PAGE_SIZE / XPC_MSG_MAX_SIZE)
66 #define XPNET_MAX_KTHREADS (XPNET_MSG_NENTRIES + 1)
67 #define XPNET_MAX_IDLE_KTHREADS (XPNET_MSG_NENTRIES + 1)
73 #define _XPNET_VERSION(_major, _minor) (((_major) << 4) | (_minor))
74 #define XPNET_VERSION_MAJOR(_v) ((_v) >> 4)
75 #define XPNET_VERSION_MINOR(_v) ((_v) & 0xf)
77 #define XPNET_VERSION _XPNET_VERSION(1, 0)
78 #define XPNET_VERSION_EMBED _XPNET_VERSION(1, 1)
79 #define XPNET_MAGIC 0x88786984
81 #define XPNET_VALID_MSG(_m) \
82 ((XPNET_VERSION_MAJOR(_m->version) == XPNET_VERSION_MAJOR(XPNET_VERSION)) \
83 && (msg->magic == XPNET_MAGIC))
85 #define XPNET_DEVICE_NAME "xp0"
105 static unsigned long *xpnet_broadcast_partitions;
120 #define XPNET_MAX_MTU (0x800000UL - L1_CACHE_BYTES)
122 #define XPNET_DEF_MTU (0x8000UL)
128 #define XPNET_PARTID_OCTET 2
138 .driver = &xpnet_dbg_name
157 xpc_received(partid, channel, (
void *)msg);
159 xpnet_device->
stats.rx_errors++;
169 dev_err(xpnet,
"failed on dev_alloc_skb(%d)\n",
172 xpc_received(partid, channel, (
void *)msg);
174 xpnet_device->
stats.rx_errors++;
199 dev_dbg(xpnet,
"copying embedded message. memcpy(0x%p, 0x%p, "
203 skb_copy_to_linear_data(skb, &msg->
data,
207 dev_dbg(xpnet,
"transferring buffer to the skb->data area;\n\t"
208 "xp_remote_memcpy(0x%p, 0x%p, %hu)\n", dst,
218 dev_err(xpnet,
"xp_remote_memcpy(0x%p, 0x%p, 0x%hx) "
219 "returned error=0x%x\n", dst,
222 xpc_received(partid, channel, (
void *)msg);
224 xpnet_device->
stats.rx_errors++;
230 dev_dbg(xpnet,
"<skb->head=0x%p skb->data=0x%p skb->tail=0x%p "
231 "skb->end=0x%p skb->len=%d\n", (
void *)skb->
head,
232 (
void *)skb->
data, skb_tail_pointer(skb), skb_end_pointer(skb),
238 dev_dbg(xpnet,
"passing skb to network layer\n"
239 "\tskb->head=0x%p skb->data=0x%p skb->tail=0x%p "
240 "skb->end=0x%p skb->len=%d\n",
241 (
void *)skb->
head, (
void *)skb->
data, skb_tail_pointer(skb),
242 skb_end_pointer(skb), skb->
len);
244 xpnet_device->
stats.rx_packets++;
248 xpc_received(partid, channel, (
void *)msg);
266 xpnet_receive(partid, channel, (
struct xpnet_message *)data);
270 spin_lock_bh(&xpnet_broadcast_lock);
271 __set_bit(partid, xpnet_broadcast_partitions);
272 spin_unlock_bh(&xpnet_broadcast_lock);
276 dev_dbg(xpnet,
"%s connected to partition %d\n",
277 xpnet_device->
name, partid);
281 spin_lock_bh(&xpnet_broadcast_lock);
283 spin_unlock_bh(&xpnet_broadcast_lock);
285 if (bitmap_empty((
unsigned long *)xpnet_broadcast_partitions,
290 dev_dbg(xpnet,
"%s disconnected from partition %d\n",
291 xpnet_device->
name, partid);
301 dev_dbg(xpnet,
"calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, "
309 XPNET_MSG_SIZE, XPNET_MSG_NENTRIES,
312 dev_err(xpnet,
"ifconfig up of %s failed on XPC connect, "
313 "ret=%d\n", dev->
name, ret);
318 dev_dbg(xpnet,
"ifconfig up of %s; XPC connected\n", dev->
name);
328 dev_dbg(xpnet,
"ifconfig down of %s; XPC disconnected\n", dev->
name);
334 xpnet_dev_change_mtu(
struct net_device *dev,
int new_mtu)
338 dev_err(xpnet,
"ifconfig %s mtu %d failed; value must be "
339 "between 68 and %ld\n", dev->
name, new_mtu,
345 dev_dbg(xpnet,
"ifconfig %s mtu set to %d\n", dev->
name, new_mtu);
356 xpnet_send_completed(
enum xp_retval reason,
short partid,
int channel,
363 dev_dbg(xpnet,
"message to %d notified with reason %d\n",
367 dev_dbg(xpnet,
"all acks for skb->head=-x%p\n",
368 (
void *)queued_msg->
skb->head);
385 if (
unlikely(embedded_bytes != 0)) {
387 dev_dbg(xpnet,
"calling memcpy(0x%p, 0x%p, 0x%lx)\n",
388 &msg->
data, skb->
data, (
size_t)embedded_bytes);
389 skb_copy_from_linear_data(skb, &msg->
data,
390 (
size_t)embedded_bytes);
391 msg_size += embedded_bytes - 1;
401 dev_dbg(xpnet,
"sending XPC message to %d:%d\n"
402 "msg->buf_pa=0x%lx, msg->size=%u, "
403 "msg->leadin_ignore=%u, msg->tailout_ignore=%u\n",
410 msg_size, xpnet_send_completed, queued_msg);
430 u16 embedded_bytes = 0;
432 dev_dbg(xpnet,
">skb->head=0x%p skb->data=0x%p skb->tail=0x%p "
433 "skb->end=0x%p skb->len=%d\n", (
void *)skb->
head,
434 (
void *)skb->
data, skb_tail_pointer(skb), skb_end_pointer(skb),
437 if (skb->
data[0] == 0x33) {
448 if (queued_msg ==
NULL) {
449 dev_warn(xpnet,
"failed to kmalloc %ld bytes; dropping "
452 dev->
stats.tx_errors++;
464 embedded_bytes = skb->
len;
477 if (skb->
data[0] == 0xff) {
482 xpnet_send(skb, queued_msg, start_addr, end_addr,
483 embedded_bytes, dest_partid);
489 if (dest_partid >= 0 &&
491 test_bit(dest_partid, xpnet_broadcast_partitions) != 0) {
493 xpnet_send(skb, queued_msg, start_addr, end_addr,
494 embedded_bytes, dest_partid);
498 dev->
stats.tx_packets++;
515 dev->
stats.tx_errors++;
519 .ndo_open = xpnet_dev_open,
520 .ndo_stop = xpnet_dev_stop,
521 .ndo_start_xmit = xpnet_dev_hard_start_xmit,
522 .ndo_change_mtu = xpnet_dev_change_mtu,
523 .ndo_tx_timeout = xpnet_dev_tx_timeout,
540 if (xpnet_broadcast_partitions ==
NULL)
548 if (xpnet_device ==
NULL) {
549 kfree(xpnet_broadcast_partitions);
584 kfree(xpnet_broadcast_partitions);
595 dev_info(xpnet,
"unregistering network device %s\n",
596 xpnet_device[0].
name);
600 kfree(xpnet_broadcast_partitions);