2 * This file is provided under a dual BSD/GPLv2 license. When using or
3 * redistributing this file, you may do so under either license.
7 * Copyright(c) 2012 Intel Corporation. All rights reserved.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of version 2 of the GNU General Public License as
11 * published by the Free Software Foundation.
15 * Copyright(c) 2012 Intel Corporation. All rights reserved.
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
21 * * Redistributions of source code must retain the above copyright
22 * notice, this list of conditions and the following disclaimer.
23 * * Redistributions in binary form must reproduce the above copy
24 * notice, this list of conditions and the following disclaimer in
25 * the documentation and/or other materials provided with the
27 * * Neither the name of Intel Corporation nor the names of its
28 * contributors may be used to endorse or promote products derived
29 * from this software without specific prior written permission.
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
41 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43 * Intel PCIe NTB Network Linux driver
45 * Contact Information:
46 * Jon Mason <jon.mason@intel.com>
48 #include <linux/etherdevice.h>
49 #include <linux/ethtool.h>
50 #include <linux/module.h>
51 #include <linux/pci.h>
52 #include <linux/ntb.h>
54 #define NTB_NETDEV_VER "0.7"
56 MODULE_DESCRIPTION(KBUILD_MODNAME
);
57 MODULE_VERSION(NTB_NETDEV_VER
);
58 MODULE_LICENSE("Dual BSD/GPL");
59 MODULE_AUTHOR("Intel Corporation");
62 struct list_head list
;
64 struct net_device
*ndev
;
65 struct ntb_transport_qp
*qp
;
68 #define NTB_TX_TIMEOUT_MS 1000
69 #define NTB_RXQ_SIZE 100
71 static LIST_HEAD(dev_list
);
73 static void ntb_netdev_event_handler(void *data
, int status
)
75 struct net_device
*ndev
= data
;
76 struct ntb_netdev
*dev
= netdev_priv(ndev
);
78 netdev_dbg(ndev
, "Event %x, Link %x\n", status
,
79 ntb_transport_link_query(dev
->qp
));
83 netif_carrier_off(ndev
);
86 if (!ntb_transport_link_query(dev
->qp
))
89 netif_carrier_on(ndev
);
92 netdev_warn(ndev
, "Unsupported event type %d\n", status
);
96 static void ntb_netdev_rx_handler(struct ntb_transport_qp
*qp
, void *qp_data
,
99 struct net_device
*ndev
= qp_data
;
107 netdev_dbg(ndev
, "%s: %d byte payload received\n", __func__
, len
);
110 skb
->protocol
= eth_type_trans(skb
, ndev
);
111 skb
->ip_summed
= CHECKSUM_NONE
;
113 if (netif_rx(skb
) == NET_RX_DROP
) {
114 ndev
->stats
.rx_errors
++;
115 ndev
->stats
.rx_dropped
++;
117 ndev
->stats
.rx_packets
++;
118 ndev
->stats
.rx_bytes
+= len
;
121 skb
= netdev_alloc_skb(ndev
, ndev
->mtu
+ ETH_HLEN
);
123 ndev
->stats
.rx_errors
++;
124 ndev
->stats
.rx_frame_errors
++;
128 rc
= ntb_transport_rx_enqueue(qp
, skb
, skb
->data
, ndev
->mtu
+ ETH_HLEN
);
131 ndev
->stats
.rx_errors
++;
132 ndev
->stats
.rx_fifo_errors
++;
136 static void ntb_netdev_tx_handler(struct ntb_transport_qp
*qp
, void *qp_data
,
139 struct net_device
*ndev
= qp_data
;
147 ndev
->stats
.tx_packets
++;
148 ndev
->stats
.tx_bytes
+= skb
->len
;
150 ndev
->stats
.tx_errors
++;
151 ndev
->stats
.tx_aborted_errors
++;
157 static netdev_tx_t
ntb_netdev_start_xmit(struct sk_buff
*skb
,
158 struct net_device
*ndev
)
160 struct ntb_netdev
*dev
= netdev_priv(ndev
);
163 netdev_dbg(ndev
, "%s: skb len %d\n", __func__
, skb
->len
);
165 rc
= ntb_transport_tx_enqueue(dev
->qp
, skb
, skb
->data
, skb
->len
);
172 ndev
->stats
.tx_dropped
++;
173 ndev
->stats
.tx_errors
++;
174 return NETDEV_TX_BUSY
;
177 static int ntb_netdev_open(struct net_device
*ndev
)
179 struct ntb_netdev
*dev
= netdev_priv(ndev
);
183 /* Add some empty rx bufs */
184 for (i
= 0; i
< NTB_RXQ_SIZE
; i
++) {
185 skb
= netdev_alloc_skb(ndev
, ndev
->mtu
+ ETH_HLEN
);
191 rc
= ntb_transport_rx_enqueue(dev
->qp
, skb
, skb
->data
,
192 ndev
->mtu
+ ETH_HLEN
);
199 netif_carrier_off(ndev
);
200 ntb_transport_link_up(dev
->qp
);
205 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
210 static int ntb_netdev_close(struct net_device
*ndev
)
212 struct ntb_netdev
*dev
= netdev_priv(ndev
);
216 ntb_transport_link_down(dev
->qp
);
218 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
224 static int ntb_netdev_change_mtu(struct net_device
*ndev
, int new_mtu
)
226 struct ntb_netdev
*dev
= netdev_priv(ndev
);
230 if (new_mtu
> ntb_transport_max_size(dev
->qp
) - ETH_HLEN
)
233 if (!netif_running(ndev
)) {
238 /* Bring down the link and dispose of posted rx entries */
239 ntb_transport_link_down(dev
->qp
);
241 if (ndev
->mtu
< new_mtu
) {
244 for (i
= 0; (skb
= ntb_transport_rx_remove(dev
->qp
, &len
)); i
++)
248 skb
= netdev_alloc_skb(ndev
, new_mtu
+ ETH_HLEN
);
254 rc
= ntb_transport_rx_enqueue(dev
->qp
, skb
, skb
->data
,
265 ntb_transport_link_up(dev
->qp
);
270 ntb_transport_link_down(dev
->qp
);
272 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
275 netdev_err(ndev
, "Error changing MTU, device inoperable\n");
279 static const struct net_device_ops ntb_netdev_ops
= {
280 .ndo_open
= ntb_netdev_open
,
281 .ndo_stop
= ntb_netdev_close
,
282 .ndo_start_xmit
= ntb_netdev_start_xmit
,
283 .ndo_change_mtu
= ntb_netdev_change_mtu
,
284 .ndo_set_mac_address
= eth_mac_addr
,
287 static void ntb_get_drvinfo(struct net_device
*ndev
,
288 struct ethtool_drvinfo
*info
)
290 struct ntb_netdev
*dev
= netdev_priv(ndev
);
292 strlcpy(info
->driver
, KBUILD_MODNAME
, sizeof(info
->driver
));
293 strlcpy(info
->version
, NTB_NETDEV_VER
, sizeof(info
->version
));
294 strlcpy(info
->bus_info
, pci_name(dev
->pdev
), sizeof(info
->bus_info
));
297 static int ntb_get_settings(struct net_device
*dev
, struct ethtool_cmd
*cmd
)
299 cmd
->supported
= SUPPORTED_Backplane
;
300 cmd
->advertising
= ADVERTISED_Backplane
;
301 ethtool_cmd_speed_set(cmd
, SPEED_UNKNOWN
);
302 cmd
->duplex
= DUPLEX_FULL
;
303 cmd
->port
= PORT_OTHER
;
304 cmd
->phy_address
= 0;
305 cmd
->transceiver
= XCVR_DUMMY1
;
306 cmd
->autoneg
= AUTONEG_ENABLE
;
313 static const struct ethtool_ops ntb_ethtool_ops
= {
314 .get_drvinfo
= ntb_get_drvinfo
,
315 .get_link
= ethtool_op_get_link
,
316 .get_settings
= ntb_get_settings
,
319 static const struct ntb_queue_handlers ntb_netdev_handlers
= {
320 .tx_handler
= ntb_netdev_tx_handler
,
321 .rx_handler
= ntb_netdev_rx_handler
,
322 .event_handler
= ntb_netdev_event_handler
,
325 static int ntb_netdev_probe(struct pci_dev
*pdev
)
327 struct net_device
*ndev
;
328 struct ntb_netdev
*dev
;
331 ndev
= alloc_etherdev(sizeof(struct ntb_netdev
));
335 dev
= netdev_priv(ndev
);
339 ndev
->features
= NETIF_F_HIGHDMA
;
341 ndev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
343 ndev
->hw_features
= ndev
->features
;
344 ndev
->watchdog_timeo
= msecs_to_jiffies(NTB_TX_TIMEOUT_MS
);
346 random_ether_addr(ndev
->perm_addr
);
347 memcpy(ndev
->dev_addr
, ndev
->perm_addr
, ndev
->addr_len
);
349 ndev
->netdev_ops
= &ntb_netdev_ops
;
350 ndev
->ethtool_ops
= &ntb_ethtool_ops
;
352 dev
->qp
= ntb_transport_create_queue(ndev
, pdev
, &ntb_netdev_handlers
);
358 ndev
->mtu
= ntb_transport_max_size(dev
->qp
) - ETH_HLEN
;
360 rc
= register_netdev(ndev
);
364 list_add(&dev
->list
, &dev_list
);
365 dev_info(&pdev
->dev
, "%s created\n", ndev
->name
);
369 ntb_transport_free_queue(dev
->qp
);
375 static void ntb_netdev_remove(struct pci_dev
*pdev
)
377 struct net_device
*ndev
;
378 struct ntb_netdev
*dev
;
381 list_for_each_entry(dev
, &dev_list
, list
) {
382 if (dev
->pdev
== pdev
) {
390 list_del(&dev
->list
);
394 unregister_netdev(ndev
);
395 ntb_transport_free_queue(dev
->qp
);
399 static struct ntb_client ntb_netdev_client
= {
400 .driver
.name
= KBUILD_MODNAME
,
401 .driver
.owner
= THIS_MODULE
,
402 .probe
= ntb_netdev_probe
,
403 .remove
= ntb_netdev_remove
,
406 static int __init
ntb_netdev_init_module(void)
410 rc
= ntb_register_client_dev(KBUILD_MODNAME
);
413 return ntb_register_client(&ntb_netdev_client
);
415 module_init(ntb_netdev_init_module
);
417 static void __exit
ntb_netdev_exit_module(void)
419 ntb_unregister_client(&ntb_netdev_client
);
420 ntb_unregister_client_dev(KBUILD_MODNAME
);
422 module_exit(ntb_netdev_exit_module
);