13 #include <linux/module.h>
14 #include <linux/kernel.h>
19 #include <linux/slab.h>
22 #include <linux/netdevice.h>
26 #include <linux/ethtool.h>
28 #define DRV_NAME "rionet"
29 #define DRV_VERSION "0.3"
31 #define DRV_DESC "Ethernet over RapidIO"
37 #define RIONET_DEFAULT_MSGLEVEL \
43 #define RIONET_DOORBELL_JOIN 0x1000
44 #define RIONET_DOORBELL_LEAVE 0x1001
46 #define RIONET_MAILBOX 0
48 #define RIONET_TX_RING_SIZE CONFIG_RIONET_TX_SIZE
49 #define RIONET_RX_RING_SIZE CONFIG_RIONET_RX_SIZE
50 #define RIONET_MAX_NETS 8
80 #define is_rionet_capable(src_ops, dst_ops) \
81 ((src_ops & RIO_SRC_OPS_DATA_MSG) && \
82 (dst_ops & RIO_DST_OPS_DATA_MSG) && \
83 (src_ops & RIO_SRC_OPS_DOORBELL) && \
84 (dst_ops & RIO_DST_OPS_DOORBELL))
85 #define dev_rionet_capable(dev) \
86 is_rionet_capable(dev->src_ops, dev->dst_ops)
88 #define RIONET_MAC_MATCH(x) (!memcmp((x), "\00\01\00\01", 4))
89 #define RIONET_GET_DESTID(x) ((*((u8 *)x + 4) << 8) | *((u8 *)x + 5))
114 ndev->
stats.rx_dropped++;
116 ndev->
stats.rx_packets++;
149 rio_add_outb_message(rnet->
mport, rdev, 0, skb->
data, skb->
len);
152 ndev->
stats.tx_packets++;
156 netif_stop_queue(ndev);
178 if (!spin_trylock(&rnet->
tx_lock)) {
183 if (is_multicast_ether_addr(eth->
h_dest))
184 add_num = nets[rnet->
mport->id].nact;
187 netif_stop_queue(ndev);
194 if (is_multicast_ether_addr(eth->
h_dest)) {
199 if (nets[rnet->
mport->id].active[i]) {
200 rionet_queue_tx_msg(skb, ndev,
201 nets[rnet->
mport->id].active[i]);
208 if (nets[rnet->
mport->id].active[destid])
209 rionet_queue_tx_msg(skb, ndev,
210 nets[rnet->
mport->id].active[destid]);
229 if (!nets[rnet->
mport->id].active[sid]) {
232 if (peer->
rdev->destid == sid) {
235 nets[rnet->
mport->id].nact++;
243 nets[rnet->
mport->id].nact--;
251 static void rionet_inb_msg_event(
struct rio_mport *mport,
void *dev_id,
int mbox,
int slot)
261 spin_lock(&rnet->
lock);
262 if ((n = rionet_rx_clean(ndev)) != rnet->
rx_slot)
263 rionet_rx_fill(ndev, n);
264 spin_unlock(&rnet->
lock);
267 static void rionet_outb_msg_event(
struct rio_mport *mport,
void *dev_id,
int mbox,
int slot)
272 spin_lock(&rnet->
lock);
276 "%s: outbound message event, mbox %d slot %d\n",
289 netif_wake_queue(ndev);
291 spin_unlock(&rnet->
lock);
294 static int rionet_open(
struct net_device *ndev)
307 rionet_dbell_event)) < 0)
314 rionet_inb_msg_event)) < 0)
321 rionet_outb_msg_event)) < 0)
328 rionet_rx_fill(ndev, 0);
335 netif_start_queue(ndev);
356 static int rionet_close(
struct net_device *ndev)
365 netif_stop_queue(ndev);
373 if (nets[rnet->
mport->id].active[peer->
rdev->destid]) {
388 static void rionet_remove(
struct rio_dev *rdev)
390 struct net_device *ndev = rio_get_drvdata(rdev);
391 unsigned char netid = rdev->
net->hport->id;
398 nets[netid].active =
NULL;
408 static void rionet_get_drvinfo(
struct net_device *ndev,
433 static const struct ethtool_ops rionet_ethtool_ops = {
434 .get_drvinfo = rionet_get_drvinfo,
435 .get_msglevel = rionet_get_msglevel,
436 .set_msglevel = rionet_set_msglevel,
441 .ndo_open = rionet_open,
442 .ndo_stop = rionet_close,
443 .ndo_start_xmit = rionet_start_xmit,
454 const size_t rionet_active_bytes =
sizeof(
void *) *
459 if (!nets[mport->
id].active) {
463 memset((
void *)nets[mport->
id].active, 0, rionet_active_bytes);
466 rnet = netdev_priv(ndev);
476 ndev->
dev_addr[5] = device_id & 0xff;
509 u32 lsrc_ops, ldst_ops;
512 unsigned char netid = rdev->
net->hport->id;
531 "%s: local device %s is not network capable\n",
542 nets[netid].ndev =
ndev;
543 rc = rionet_setup_netdev(rdev->
net->hport, ndev);
544 INIT_LIST_HEAD(&nets[netid].
peers);
545 nets[netid].nact = 0;
546 }
else if (nets[netid].ndev ==
NULL)
562 rio_set_drvdata(rdev, nets[netid].ndev);
574 .id_table = rionet_id_table,
575 .probe = rionet_probe,
576 .remove = rionet_remove,
579 static int __init rionet_init(
void)
584 static void __exit rionet_exit(
void)