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.6"
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
));
81 /* Currently, only link status event is supported */
83 netif_carrier_on(ndev
);
85 netif_carrier_off(ndev
);
88 static void ntb_netdev_rx_handler(struct ntb_transport_qp
*qp
, void *qp_data
,
91 struct net_device
*ndev
= qp_data
;
99 netdev_dbg(ndev
, "%s: %d byte payload received\n", __func__
, len
);
102 skb
->protocol
= eth_type_trans(skb
, ndev
);
103 skb
->ip_summed
= CHECKSUM_NONE
;
105 if (netif_rx(skb
) == NET_RX_DROP
) {
106 ndev
->stats
.rx_errors
++;
107 ndev
->stats
.rx_dropped
++;
109 ndev
->stats
.rx_packets
++;
110 ndev
->stats
.rx_bytes
+= len
;
113 skb
= netdev_alloc_skb(ndev
, ndev
->mtu
+ ETH_HLEN
);
115 ndev
->stats
.rx_errors
++;
116 ndev
->stats
.rx_frame_errors
++;
120 rc
= ntb_transport_rx_enqueue(qp
, skb
, skb
->data
, ndev
->mtu
+ ETH_HLEN
);
122 ndev
->stats
.rx_errors
++;
123 ndev
->stats
.rx_fifo_errors
++;
127 static void ntb_netdev_tx_handler(struct ntb_transport_qp
*qp
, void *qp_data
,
130 struct net_device
*ndev
= qp_data
;
138 ndev
->stats
.tx_packets
++;
139 ndev
->stats
.tx_bytes
+= skb
->len
;
141 ndev
->stats
.tx_errors
++;
142 ndev
->stats
.tx_aborted_errors
++;
147 if (netif_queue_stopped(ndev
))
148 netif_wake_queue(ndev
);
151 static netdev_tx_t
ntb_netdev_start_xmit(struct sk_buff
*skb
,
152 struct net_device
*ndev
)
154 struct ntb_netdev
*dev
= netdev_priv(ndev
);
157 netdev_dbg(ndev
, "ntb_transport_tx_enqueue\n");
159 rc
= ntb_transport_tx_enqueue(dev
->qp
, skb
, skb
->data
, skb
->len
);
166 ndev
->stats
.tx_dropped
++;
167 ndev
->stats
.tx_errors
++;
168 netif_stop_queue(ndev
);
169 return NETDEV_TX_BUSY
;
172 static int ntb_netdev_open(struct net_device
*ndev
)
174 struct ntb_netdev
*dev
= netdev_priv(ndev
);
178 /* Add some empty rx bufs */
179 for (i
= 0; i
< NTB_RXQ_SIZE
; i
++) {
180 skb
= netdev_alloc_skb(ndev
, ndev
->mtu
+ ETH_HLEN
);
186 rc
= ntb_transport_rx_enqueue(dev
->qp
, skb
, skb
->data
,
187 ndev
->mtu
+ ETH_HLEN
);
192 netif_carrier_off(ndev
);
193 ntb_transport_link_up(dev
->qp
);
198 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
203 static int ntb_netdev_close(struct net_device
*ndev
)
205 struct ntb_netdev
*dev
= netdev_priv(ndev
);
209 ntb_transport_link_down(dev
->qp
);
211 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
217 static int ntb_netdev_change_mtu(struct net_device
*ndev
, int new_mtu
)
219 struct ntb_netdev
*dev
= netdev_priv(ndev
);
223 if (new_mtu
> ntb_transport_max_size(dev
->qp
) - ETH_HLEN
)
226 if (!netif_running(ndev
)) {
231 /* Bring down the link and dispose of posted rx entries */
232 ntb_transport_link_down(dev
->qp
);
234 if (ndev
->mtu
< new_mtu
) {
237 for (i
= 0; (skb
= ntb_transport_rx_remove(dev
->qp
, &len
)); i
++)
241 skb
= netdev_alloc_skb(ndev
, new_mtu
+ ETH_HLEN
);
247 rc
= ntb_transport_rx_enqueue(dev
->qp
, skb
, skb
->data
,
258 ntb_transport_link_up(dev
->qp
);
263 ntb_transport_link_down(dev
->qp
);
265 while ((skb
= ntb_transport_rx_remove(dev
->qp
, &len
)))
268 netdev_err(ndev
, "Error changing MTU, device inoperable\n");
272 static void ntb_netdev_tx_timeout(struct net_device
*ndev
)
274 if (netif_running(ndev
))
275 netif_wake_queue(ndev
);
278 static const struct net_device_ops ntb_netdev_ops
= {
279 .ndo_open
= ntb_netdev_open
,
280 .ndo_stop
= ntb_netdev_close
,
281 .ndo_start_xmit
= ntb_netdev_start_xmit
,
282 .ndo_change_mtu
= ntb_netdev_change_mtu
,
283 .ndo_tx_timeout
= ntb_netdev_tx_timeout
,
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 cmd
->speed
= SPEED_UNKNOWN
;
302 ethtool_cmd_speed_set(cmd
, SPEED_UNKNOWN
);
303 cmd
->duplex
= DUPLEX_FULL
;
304 cmd
->port
= PORT_OTHER
;
305 cmd
->phy_address
= 0;
306 cmd
->transceiver
= XCVR_DUMMY1
;
307 cmd
->autoneg
= AUTONEG_ENABLE
;
314 static const struct ethtool_ops ntb_ethtool_ops
= {
315 .get_drvinfo
= ntb_get_drvinfo
,
316 .get_link
= ethtool_op_get_link
,
317 .get_settings
= ntb_get_settings
,
320 static const struct ntb_queue_handlers ntb_netdev_handlers
= {
321 .tx_handler
= ntb_netdev_tx_handler
,
322 .rx_handler
= ntb_netdev_rx_handler
,
323 .event_handler
= ntb_netdev_event_handler
,
326 static int ntb_netdev_probe(struct pci_dev
*pdev
)
328 struct net_device
*ndev
;
329 struct ntb_netdev
*dev
;
332 ndev
= alloc_etherdev(sizeof(struct ntb_netdev
));
336 dev
= netdev_priv(ndev
);
340 ndev
->features
= NETIF_F_HIGHDMA
;
342 ndev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
;
344 ndev
->hw_features
= ndev
->features
;
345 ndev
->watchdog_timeo
= msecs_to_jiffies(NTB_TX_TIMEOUT_MS
);
347 random_ether_addr(ndev
->perm_addr
);
348 memcpy(ndev
->dev_addr
, ndev
->perm_addr
, ndev
->addr_len
);
350 ndev
->netdev_ops
= &ntb_netdev_ops
;
351 SET_ETHTOOL_OPS(ndev
, &ntb_ethtool_ops
);
353 dev
->qp
= ntb_transport_create_queue(ndev
, pdev
, &ntb_netdev_handlers
);
359 ndev
->mtu
= ntb_transport_max_size(dev
->qp
) - ETH_HLEN
;
361 rc
= register_netdev(ndev
);
365 list_add(&dev
->list
, &dev_list
);
366 pr_info("%s: %s created\n", KBUILD_MODNAME
, ndev
->name
);
370 ntb_transport_free_queue(dev
->qp
);
376 static void __exit
ntb_netdev_remove(struct pci_dev
*pdev
)
378 struct net_device
*ndev
;
379 struct ntb_netdev
*dev
;
381 list_for_each_entry(dev
, &dev_list
, list
) {
382 if (dev
->pdev
== pdev
)
390 unregister_netdev(ndev
);
391 ntb_transport_free_queue(dev
->qp
);
395 static struct ntb_client ntb_netdev_client
= {
396 .driver
.name
= KBUILD_MODNAME
,
397 .driver
.owner
= THIS_MODULE
,
398 .probe
= ntb_netdev_probe
,
399 .remove
= ntb_netdev_remove
,
402 static int __init
ntb_netdev_init_module(void)
406 rc
= ntb_register_client_dev(KBUILD_MODNAME
);
409 return ntb_register_client(&ntb_netdev_client
);
411 module_init(ntb_netdev_init_module
);
413 static void __exit
ntb_netdev_exit_module(void)
415 ntb_unregister_client(&ntb_netdev_client
);
416 ntb_unregister_client_dev(KBUILD_MODNAME
);
417 pr_info("%s: Driver removed\n", KBUILD_MODNAME
);
419 module_exit(ntb_netdev_exit_module
);