Deleted Added
full compact
sfxge.c (257176) sfxge.c (272325)
1/*-
2 * Copyright (c) 2010-2011 Solarflare Communications, Inc.
3 * All rights reserved.
4 *
5 * This software was developed in part by Philip Paeps under contract for
6 * Solarflare Communications, Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2010-2011 Solarflare Communications, Inc.
3 * All rights reserved.
4 *
5 * This software was developed in part by Philip Paeps under contract for
6 * Solarflare Communications, Inc.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 14 unchanged lines hidden (view full) ---

23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/sfxge/sfxge.c 257176 2013-10-26 17:58:36Z glebius $");
31__FBSDID("$FreeBSD: head/sys/dev/sfxge/sfxge.c 272325 2014-09-30 20:18:10Z gnn $");
32
33#include <sys/param.h>
34#include <sys/kernel.h>
35#include <sys/bus.h>
36#include <sys/rman.h>
37#include <sys/lock.h>
38#include <sys/module.h>
39#include <sys/mutex.h>

--- 12 unchanged lines hidden (view full) ---

52#include <net/if_media.h>
53#include <net/if_types.h>
54
55#include "common/efx.h"
56
57#include "sfxge.h"
58#include "sfxge_rx.h"
59
32
33#include <sys/param.h>
34#include <sys/kernel.h>
35#include <sys/bus.h>
36#include <sys/rman.h>
37#include <sys/lock.h>
38#include <sys/module.h>
39#include <sys/mutex.h>

--- 12 unchanged lines hidden (view full) ---

52#include <net/if_media.h>
53#include <net/if_types.h>
54
55#include "common/efx.h"
56
57#include "sfxge.h"
58#include "sfxge_rx.h"
59
60#define SFXGE_CAP (IFCAP_VLAN_MTU | \
60#define SFXGE_CAP (IFCAP_VLAN_MTU | \
61 IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO | \
62 IFCAP_JUMBO_MTU | IFCAP_LRO | \
63 IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE)
61 IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | IFCAP_TSO | \
62 IFCAP_JUMBO_MTU | IFCAP_LRO | \
63 IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE)
64#define SFXGE_CAP_ENABLE SFXGE_CAP
65#define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | \
64#define SFXGE_CAP_ENABLE SFXGE_CAP
65#define SFXGE_CAP_FIXED (IFCAP_VLAN_MTU | IFCAP_HWCSUM | IFCAP_VLAN_HWCSUM | \
66 IFCAP_JUMBO_MTU | IFCAP_LINKSTATE)
67
68MALLOC_DEFINE(M_SFXGE, "sfxge", "Solarflare 10GigE driver");
69
70static void
71sfxge_reset(void *arg, int npending);
72
73static int
74sfxge_start(struct sfxge_softc *sc)
75{
76 int rc;
77
78 sx_assert(&sc->softc_lock, LA_XLOCKED);
79
80 if (sc->init_state == SFXGE_STARTED)
66 IFCAP_JUMBO_MTU | IFCAP_LINKSTATE)
67
68MALLOC_DEFINE(M_SFXGE, "sfxge", "Solarflare 10GigE driver");
69
70static void
71sfxge_reset(void *arg, int npending);
72
73static int
74sfxge_start(struct sfxge_softc *sc)
75{
76 int rc;
77
78 sx_assert(&sc->softc_lock, LA_XLOCKED);
79
80 if (sc->init_state == SFXGE_STARTED)
81 return 0;
81 return (0);
82
83 if (sc->init_state != SFXGE_REGISTERED) {
84 rc = EINVAL;
85 goto fail;
86 }
87
88 if ((rc = efx_nic_init(sc->enp)) != 0)
89 goto fail;

--- 128 unchanged lines hidden (view full) ---

218 error = 0;
219 } else {
220 /* Restart required */
221 sx_xlock(&sc->softc_lock);
222 sfxge_stop(sc);
223 ifp->if_mtu = ifr->ifr_mtu;
224 error = sfxge_start(sc);
225 sx_xunlock(&sc->softc_lock);
82
83 if (sc->init_state != SFXGE_REGISTERED) {
84 rc = EINVAL;
85 goto fail;
86 }
87
88 if ((rc = efx_nic_init(sc->enp)) != 0)
89 goto fail;

--- 128 unchanged lines hidden (view full) ---

218 error = 0;
219 } else {
220 /* Restart required */
221 sx_xlock(&sc->softc_lock);
222 sfxge_stop(sc);
223 ifp->if_mtu = ifr->ifr_mtu;
224 error = sfxge_start(sc);
225 sx_xunlock(&sc->softc_lock);
226 if (error) {
226 if (error != 0) {
227 ifp->if_flags &= ~IFF_UP;
228 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
229 if_down(ifp);
230 }
231 }
232 break;
233 case SIOCADDMULTI:
234 case SIOCDELMULTI:

--- 47 unchanged lines hidden (view full) ---

282 sfxge_stop(sc);
283 sx_xunlock(&sc->softc_lock);
284
285 ifmedia_removeall(&sc->media);
286 ether_ifdetach(ifp);
287 if_free(ifp);
288}
289
227 ifp->if_flags &= ~IFF_UP;
228 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
229 if_down(ifp);
230 }
231 }
232 break;
233 case SIOCADDMULTI:
234 case SIOCDELMULTI:

--- 47 unchanged lines hidden (view full) ---

282 sfxge_stop(sc);
283 sx_xunlock(&sc->softc_lock);
284
285 ifmedia_removeall(&sc->media);
286 ether_ifdetach(ifp);
287 if_free(ifp);
288}
289
290static int
290static int
291sfxge_ifnet_init(struct ifnet *ifp, struct sfxge_softc *sc)
292{
293 const efx_nic_cfg_t *encp = efx_nic_cfg_get(sc->enp);
294 device_t dev;
295 int rc;
296
297 dev = sc->dev;
298 sc->ifnet = ifp;

--- 20 unchanged lines hidden (view full) ---

319 IFQ_SET_READY(&ifp->if_snd);
320
321 mtx_init(&sc->tx_lock, "txq", NULL, MTX_DEF);
322#endif
323
324 if ((rc = sfxge_port_ifmedia_init(sc)) != 0)
325 goto fail;
326
291sfxge_ifnet_init(struct ifnet *ifp, struct sfxge_softc *sc)
292{
293 const efx_nic_cfg_t *encp = efx_nic_cfg_get(sc->enp);
294 device_t dev;
295 int rc;
296
297 dev = sc->dev;
298 sc->ifnet = ifp;

--- 20 unchanged lines hidden (view full) ---

319 IFQ_SET_READY(&ifp->if_snd);
320
321 mtx_init(&sc->tx_lock, "txq", NULL, MTX_DEF);
322#endif
323
324 if ((rc = sfxge_port_ifmedia_init(sc)) != 0)
325 goto fail;
326
327 return 0;
327 return (0);
328
329fail:
330 ether_ifdetach(sc->ifnet);
328
329fail:
330 ether_ifdetach(sc->ifnet);
331 return rc;
331 return (rc);
332}
333
334void
335sfxge_sram_buf_tbl_alloc(struct sfxge_softc *sc, size_t n, uint32_t *idp)
336{
337 KASSERT(sc->buffer_table_next + n <=
338 efx_nic_cfg_get(sc->enp)->enc_buftbl_limit,
339 ("buffer table full"));
340
341 *idp = sc->buffer_table_next;
342 sc->buffer_table_next += n;
343}
344
345static int
346sfxge_bar_init(struct sfxge_softc *sc)
347{
348 efsys_bar_t *esbp = &sc->bar;
349
332}
333
334void
335sfxge_sram_buf_tbl_alloc(struct sfxge_softc *sc, size_t n, uint32_t *idp)
336{
337 KASSERT(sc->buffer_table_next + n <=
338 efx_nic_cfg_get(sc->enp)->enc_buftbl_limit,
339 ("buffer table full"));
340
341 *idp = sc->buffer_table_next;
342 sc->buffer_table_next += n;
343}
344
345static int
346sfxge_bar_init(struct sfxge_softc *sc)
347{
348 efsys_bar_t *esbp = &sc->bar;
349
350 esbp->esb_rid = PCIR_BAR(EFX_MEM_BAR);
350 esbp->esb_rid = PCIR_BAR(EFX_MEM_BAR);
351 if ((esbp->esb_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
352 &esbp->esb_rid, RF_ACTIVE)) == NULL) {
353 device_printf(sc->dev, "Cannot allocate BAR region %d\n",
354 EFX_MEM_BAR);
355 return (ENXIO);
356 }
357 esbp->esb_tag = rman_get_bustag(esbp->esb_res);
358 esbp->esb_handle = rman_get_bushandle(esbp->esb_res);

--- 22 unchanged lines hidden (view full) ---

381 dev = sc->dev;
382
383 sx_init(&sc->softc_lock, "sfxge_softc");
384
385 sc->stats_node = SYSCTL_ADD_NODE(
386 device_get_sysctl_ctx(dev),
387 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
388 OID_AUTO, "stats", CTLFLAG_RD, NULL, "Statistics");
351 if ((esbp->esb_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
352 &esbp->esb_rid, RF_ACTIVE)) == NULL) {
353 device_printf(sc->dev, "Cannot allocate BAR region %d\n",
354 EFX_MEM_BAR);
355 return (ENXIO);
356 }
357 esbp->esb_tag = rman_get_bustag(esbp->esb_res);
358 esbp->esb_handle = rman_get_bushandle(esbp->esb_res);

--- 22 unchanged lines hidden (view full) ---

381 dev = sc->dev;
382
383 sx_init(&sc->softc_lock, "sfxge_softc");
384
385 sc->stats_node = SYSCTL_ADD_NODE(
386 device_get_sysctl_ctx(dev),
387 SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
388 OID_AUTO, "stats", CTLFLAG_RD, NULL, "Statistics");
389 if (!sc->stats_node) {
389 if (sc->stats_node == NULL) {
390 error = ENOMEM;
391 goto fail;
392 }
393
394 TASK_INIT(&sc->task_reset, 0, sfxge_reset, sc);
395
396 (void) pci_enable_busmaster(dev);
397

--- 151 unchanged lines hidden (view full) ---

549}
550
551static int
552sfxge_vpd_handler(SYSCTL_HANDLER_ARGS)
553{
554 struct sfxge_softc *sc = arg1;
555 efx_vpd_value_t value;
556 int rc;
390 error = ENOMEM;
391 goto fail;
392 }
393
394 TASK_INIT(&sc->task_reset, 0, sfxge_reset, sc);
395
396 (void) pci_enable_busmaster(dev);
397

--- 151 unchanged lines hidden (view full) ---

549}
550
551static int
552sfxge_vpd_handler(SYSCTL_HANDLER_ARGS)
553{
554 struct sfxge_softc *sc = arg1;
555 efx_vpd_value_t value;
556 int rc;
557
557
558 value.evv_tag = arg2 >> 16;
559 value.evv_keyword = arg2 & 0xffff;
560 if ((rc = efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value))
561 != 0)
558 value.evv_tag = arg2 >> 16;
559 value.evv_keyword = arg2 & 0xffff;
560 if ((rc = efx_vpd_get(sc->enp, sc->vpd_data, sc->vpd_size, &value))
561 != 0)
562 return rc;
562 return (rc);
563
563
564 return SYSCTL_OUT(req, value.evv_value, value.evv_length);
564 return (SYSCTL_OUT(req, value.evv_value, value.evv_length));
565}
566
567static void
568sfxge_vpd_try_add(struct sfxge_softc *sc, struct sysctl_oid_list *list,
569 efx_vpd_tag_t tag, const char *keyword)
570{
571 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
572 efx_vpd_value_t value;

--- 45 unchanged lines hidden (view full) ---

618 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "SN");
619 keyword[0] = 'V';
620 keyword[2] = 0;
621 for (keyword[1] = '0'; keyword[1] <= '9'; keyword[1]++)
622 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, keyword);
623 for (keyword[1] = 'A'; keyword[1] <= 'Z'; keyword[1]++)
624 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, keyword);
625
565}
566
567static void
568sfxge_vpd_try_add(struct sfxge_softc *sc, struct sysctl_oid_list *list,
569 efx_vpd_tag_t tag, const char *keyword)
570{
571 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
572 efx_vpd_value_t value;

--- 45 unchanged lines hidden (view full) ---

618 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, "SN");
619 keyword[0] = 'V';
620 keyword[2] = 0;
621 for (keyword[1] = '0'; keyword[1] <= '9'; keyword[1]++)
622 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, keyword);
623 for (keyword[1] = 'A'; keyword[1] <= 'Z'; keyword[1]++)
624 sfxge_vpd_try_add(sc, vpd_list, EFX_VPD_RO, keyword);
625
626 return 0;
627
626 return (0);
627
628fail2:
629 free(sc->vpd_data, M_SFXGE);
630fail:
628fail2:
629 free(sc->vpd_data, M_SFXGE);
630fail:
631 return rc;
631 return (rc);
632}
633
634static void
635sfxge_vpd_fini(struct sfxge_softc *sc)
636{
637 free(sc->vpd_data, M_SFXGE);
638}
639

--- 100 unchanged lines hidden (view full) ---

740 uint16_t pci_device_id;
741 efx_family_t family;
742 int rc;
743
744 pci_vendor_id = pci_get_vendor(dev);
745 pci_device_id = pci_get_device(dev);
746
747 rc = efx_family(pci_vendor_id, pci_device_id, &family);
632}
633
634static void
635sfxge_vpd_fini(struct sfxge_softc *sc)
636{
637 free(sc->vpd_data, M_SFXGE);
638}
639

--- 100 unchanged lines hidden (view full) ---

740 uint16_t pci_device_id;
741 efx_family_t family;
742 int rc;
743
744 pci_vendor_id = pci_get_vendor(dev);
745 pci_device_id = pci_get_device(dev);
746
747 rc = efx_family(pci_vendor_id, pci_device_id, &family);
748 if (rc)
749 return ENXIO;
748 if (rc != 0)
749 return (ENXIO);
750
751 KASSERT(family == EFX_FAMILY_SIENA, ("impossible controller family"));
752 device_set_desc(dev, "Solarflare SFC9000 family");
750
751 KASSERT(family == EFX_FAMILY_SIENA, ("impossible controller family"));
752 device_set_desc(dev, "Solarflare SFC9000 family");
753 return 0;
753 return (0);
754}
755
756static device_method_t sfxge_methods[] = {
757 DEVMETHOD(device_probe, sfxge_probe),
758 DEVMETHOD(device_attach, sfxge_attach),
759 DEVMETHOD(device_detach, sfxge_detach),
760
761 DEVMETHOD_END
762};
763
764static devclass_t sfxge_devclass;
765
766static driver_t sfxge_driver = {
767 "sfxge",
768 sfxge_methods,
769 sizeof(struct sfxge_softc)
770};
771
772DRIVER_MODULE(sfxge, pci, sfxge_driver, sfxge_devclass, 0, 0);
754}
755
756static device_method_t sfxge_methods[] = {
757 DEVMETHOD(device_probe, sfxge_probe),
758 DEVMETHOD(device_attach, sfxge_attach),
759 DEVMETHOD(device_detach, sfxge_detach),
760
761 DEVMETHOD_END
762};
763
764static devclass_t sfxge_devclass;
765
766static driver_t sfxge_driver = {
767 "sfxge",
768 sfxge_methods,
769 sizeof(struct sfxge_softc)
770};
771
772DRIVER_MODULE(sfxge, pci, sfxge_driver, sfxge_devclass, 0, 0);