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); |