6 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
8 #include <linux/module.h>
9 #include <linux/kernel.h>
10 #include <linux/types.h>
11 #include <linux/slab.h>
14 #include <linux/netdevice.h>
15 #include <linux/ethtool.h>
24 #define DRV_MODULE_NAME "sunvnet"
25 #define DRV_MODULE_VERSION "1.0"
26 #define DRV_MODULE_RELDATE "June 25, 2007"
37 { .major = 1, .minor = 0 },
49 pr_err(
"Received unknown msg [%02x:%02x:%04x:%08x]\n",
51 pr_err(
"Resetting connection\n");
65 memset(&pkt, 0,
sizeof(pkt));
73 for (i = 0; i < 6; i++)
77 viodbg(HS,
"SEND NET ATTR xmode[0x%x] atype[0x%x] addr[%llx] "
78 "ackfreq[%u] mtu[%llu]\n",
79 pkt.xfer_mode, pkt.addr_type,
80 (
unsigned long long) pkt.addr,
82 (
unsigned long long) pkt.mtu);
90 viodbg(HS,
"GOT NET ATTR INFO xmode[0x%x] atype[0x%x] addr[%llx] "
91 "ackfreq[%u] mtu[%llu]\n",
93 (
unsigned long long) pkt->
addr,
95 (
unsigned long long) pkt->
mtu);
102 viodbg(HS,
"SEND NET ATTR NACK\n");
110 viodbg(HS,
"SEND NET ATTR ACK\n");
122 viodbg(HS,
"GOT NET ATTR ACK\n");
130 viodbg(HS,
"GOT NET ATTR NACK\n");
139 switch (pkt->
tag.stype) {
141 return handle_attr_info(vio, pkt);
144 return handle_attr_ack(vio, pkt);
147 return handle_attr_nack(vio, pkt);
184 unsigned long addr, off;
190 off = ((addr + 7
UL) & ~7
UL) - addr;
192 skb_reserve(skb, off);
197 static int vnet_rx_one(
struct vnet_port *port,
unsigned int len,
201 unsigned int copy_len;
207 dev->
stats.rx_length_errors++;
211 skb = alloc_and_align_skb(dev, len);
214 dev->
stats.rx_missed_errors++;
221 skb->
data, copy_len, 0,
224 dev->
stats.rx_frame_errors++;
232 dev->
stats.rx_packets++;
243 dev->
stats.rx_dropped++;
257 .dring_ident = dr->
ident,
260 .state = vio_dring_state,
273 if ((delay <<= 1) > 128)
280 static u32 next_idx(
u32 idx,
struct vio_dring_state *dr)
287 static u32 prev_idx(
u32 idx,
struct vio_dring_state *dr)
298 struct vio_dring_state *dr,
304 err = ldc_get_dring_entry(port->
vio.lp, desc, dr->
entry_size,
313 static int put_rx_desc(
struct vnet_port *port,
314 struct vio_dring_state *dr,
320 err = ldc_put_dring_entry(port->
vio.lp, desc, dr->
entry_size,
329 static int vnet_walk_rx_one(
struct vnet_port *port,
330 struct vio_dring_state *dr,
331 u32 index,
int *needs_ack)
333 struct vio_net_desc *desc = get_rx_desc(port, dr, index);
338 return PTR_ERR(desc);
340 viodbg(
DATA,
"vio_walk_rx_one desc[%02x:%02x:%08x:%08x:%llx:%llx]\n",
341 desc->
hdr.state, desc->
hdr.ack,
352 err = put_rx_desc(port, dr, desc, index);
355 *needs_ack = desc->
hdr.ack;
359 static int vnet_walk_rx(
struct vnet_port *port,
struct vio_dring_state *dr,
363 int ack_start = -1, ack_end = -1;
365 end = (end == (
u32) -1) ? prev_idx(start, dr) : next_idx(end, dr);
367 viodbg(
DATA,
"vnet_walk_rx start[%08x] end[%08x]\n", start, end);
369 while (start != end) {
370 int ack = 0, err = vnet_walk_rx_one(port, dr, start, &ack);
378 start = next_idx(start, dr);
379 if (ack && start != end) {
380 err = vnet_send_ack(port, dr, ack_start, ack_end,
388 ack_start = ack_end = prev_idx(start, dr);
398 viodbg(
DATA,
"vnet_rx stype_env[%04x] seq[%016llx] rcv_nxt[%016llx]\n",
404 pr_err(
"RX out of sequence seq[0x%llx] rcv_nxt[0x%llx]\n",
416 static int idx_is_pending(
struct vio_dring_state *dr,
u32 end)
421 while (idx != dr->
prod) {
426 idx = next_idx(idx, dr);
431 static int vnet_ack(
struct vnet_port *port,
void *msgbuf)
443 if (
unlikely(!idx_is_pending(dr, end)))
446 dr->
cons = next_idx(end, dr);
450 if (
unlikely(netif_queue_stopped(dev) &&
457 static int vnet_nack(
struct vnet_port *port,
void *msgbuf)
463 static int handle_mcast(
struct vnet_port *port,
void *msgbuf)
468 pr_err(
"%s: Got unexpected MCAST reply [%02x:%02x:%04x:%08x]\n",
478 static void maybe_tx_wakeup(
struct vnet *vp)
483 if (
likely(netif_queue_stopped(dev))) {
488 struct vio_dring_state *dr;
491 if (vnet_tx_dring_avail(dr) <
498 netif_wake_queue(dev);
500 netif_tx_unlock(dev);
503 static void vnet_event(
void *arg,
int event)
515 spin_unlock_irqrestore(&vio->
lock, flags);
523 pr_warning(
"Unexpected LDC event %d\n", event);
524 spin_unlock_irqrestore(&vio->
lock, flags);
535 err =
ldc_read(vio->
lp, &msgbuf,
sizeof(msgbuf));
546 msgbuf.tag.stype_env,
554 err = vnet_rx(port, &msgbuf);
556 err = vnet_ack(port, &msgbuf);
560 err = vnet_nack(port, &msgbuf);
564 err = handle_mcast(port, &msgbuf);
570 err = vnet_handle_unknown(port, &msgbuf);
575 spin_unlock(&vio->
lock);
577 maybe_tx_wakeup(port->
vp);
581 static int __vnet_tx_trigger(
struct vnet_port *port)
591 .dring_ident = dr->
ident,
592 .start_idx = dr->
prod,
606 if ((delay <<= 1) > 128)
615 unsigned int hash = vnet_hashfn(skb->
data);
621 if (ether_addr_equal(port->
raddr, skb->
data))
638 spin_unlock_irqrestore(&vp->
lock, flags);
645 struct vnet *vp = netdev_priv(dev);
647 struct vio_dring_state *dr;
660 if (
unlikely(vnet_tx_dring_avail(dr) < 2)) {
661 if (!netif_queue_stopped(dev)) {
662 netif_stop_queue(dev);
665 netdev_err(dev,
"BUG! Tx Ring full when queue awake!\n");
666 dev->
stats.tx_errors++;
668 spin_unlock_irqrestore(&port->
vio.lock, flags);
672 d = vio_dring_cur(dr);
696 err = __vnet_tx_trigger(port);
698 netdev_info(dev,
"TX trigger error %d\n", err);
700 dev->
stats.tx_carrier_errors++;
701 goto out_dropped_unlock;
704 dev->
stats.tx_packets++;
708 if (
unlikely(vnet_tx_dring_avail(dr) < 2)) {
709 netif_stop_queue(dev);
711 netif_wake_queue(dev);
714 spin_unlock_irqrestore(&port->
vio.lock, flags);
721 spin_unlock_irqrestore(&port->
vio.lock, flags);
725 dev->
stats.tx_dropped++;
729 static void vnet_tx_timeout(
struct net_device *dev)
737 netif_start_queue(dev);
744 netif_stop_queue(dev);
761 static void __update_mc_list(
struct vnet *vp,
struct net_device *dev)
768 m = __vnet_mc_find(vp, ha->
addr);
787 static void __send_mc_list(
struct vnet *vp,
struct vnet_port *port)
809 info.count = n_addrs;
817 info.count = n_addrs;
825 while ((m = *pp) !=
NULL) {
835 info.count = n_addrs;
845 info.count = n_addrs;
850 static void vnet_set_rx_mode(
struct net_device *dev)
852 struct vnet *vp = netdev_priv(dev);
861 __update_mc_list(vp, dev);
862 __send_mc_list(vp, port);
865 spin_unlock_irqrestore(&vp->
lock, flags);
868 static int vnet_change_mtu(
struct net_device *dev,
int new_mtu)
877 static int vnet_set_mac_addr(
struct net_device *dev,
void *
p)
882 static void vnet_get_drvinfo(
struct net_device *dev,
891 struct vnet *vp = netdev_priv(dev);
897 struct vnet *vp = netdev_priv(dev);
901 static const struct ethtool_ops vnet_ethtool_ops = {
902 .get_drvinfo = vnet_get_drvinfo,
903 .get_msglevel = vnet_get_msglevel,
904 .set_msglevel = vnet_set_msglevel,
908 static void vnet_port_free_tx_bufs(
struct vnet_port *port)
910 struct vio_dring_state *dr;
942 struct vio_dring_state *dr;
949 int map_len = (ETH_FRAME_LEN + 7) & ~7;
956 if ((
unsigned long)buf & (8
UL - 1)) {
957 pr_err(
"TX buffer misaligned\n");
977 len = (VNET_TX_RING_SIZE *
988 err = PTR_ERR(dring);
1003 vnet_port_free_tx_bufs(port);
1012 .ndo_open = vnet_open,
1013 .ndo_stop = vnet_close,
1014 .ndo_set_rx_mode = vnet_set_rx_mode,
1015 .ndo_set_mac_address = vnet_set_mac_addr,
1017 .ndo_tx_timeout = vnet_tx_timeout,
1018 .ndo_change_mtu = vnet_change_mtu,
1019 .ndo_start_xmit = vnet_start_xmit,
1028 dev = alloc_etherdev(
sizeof(*vp));
1033 dev->
dev_addr[i] = (*local_mac >> (5 - i) * 8) & 0xff;
1037 vp = netdev_priv(dev);
1045 INIT_LIST_HEAD(&vp->
list);
1054 pr_err(
"Cannot register net device, aborting\n");
1055 goto err_out_free_dev;
1058 netdev_info(dev,
"Sun LDOM vnet %pM\n", dev->
dev_addr);
1060 list_add(&vp->
list, &vnet_list);
1067 return ERR_PTR(err);
1072 struct vnet *iter, *vp;
1083 vp = vnet_new(local_mac);
1089 static const char *local_mac_prop =
"local-mac-address";
1102 if (!name ||
strcmp(name,
"network"))
1106 local_mac_prop,
NULL);
1113 return vnet_find_or_create(local_mac);
1117 .event = vnet_event,
1123 .send_attr = vnet_send_attr,
1124 .handle_attr = vnet_handle_attr,
1125 .handshake_complete = vnet_handshake_complete,
1128 static void __devinit print_version(
void)
1140 unsigned long flags;
1143 int len,
i,
err, switch_port;
1149 vp = vnet_find_parent(hp, vdev->
mp);
1151 pr_err(
"Cannot find port parent vnet\n");
1153 goto err_out_put_mdesc;
1159 pr_err(
"Port lacks %s property\n", remote_macaddr_prop);
1160 goto err_out_put_mdesc;
1166 goto err_out_put_mdesc;
1169 port->
raddr[i] = (*rmac >> (5 - i) * 8) & 0xff;
1175 &vnet_vio_ops, vp->
dev->name);
1177 goto err_out_free_port;
1181 goto err_out_free_port;
1183 err = vnet_port_alloc_tx_bufs(port);
1185 goto err_out_free_ldc;
1187 INIT_HLIST_NODE(&port->
hash);
1188 INIT_LIST_HEAD(&port->
list);
1201 spin_unlock_irqrestore(&vp->
lock, flags);
1205 pr_info(
"%s: PORT ( remote-mac %pM%s )\n",
1206 vp->
dev->name, port->
raddr, switch_port ?
" switch-port" :
"");
1225 static int vnet_port_remove(
struct vio_dev *vdev)
1230 struct vnet *vp = port->
vp;
1231 unsigned long flags;
1237 hlist_del(&port->
hash);
1238 spin_unlock_irqrestore(&vp->
lock, flags);
1240 vnet_port_free_tx_bufs(port);
1252 .type =
"vnet-port",
1258 static struct vio_driver vnet_port_driver = {
1259 .id_table = vnet_port_match,
1260 .probe = vnet_port_probe,
1261 .remove = vnet_port_remove,
1262 .name =
"vnet_port",
1265 static int __init vnet_init(
void)
1270 static void __exit vnet_exit(
void)