diff options
Diffstat (limited to 'sys/dev/qlnx/qlnxe/qlnx_os.c')
-rw-r--r-- | sys/dev/qlnx/qlnxe/qlnx_os.c | 96 |
1 files changed, 52 insertions, 44 deletions
diff --git a/sys/dev/qlnx/qlnxe/qlnx_os.c b/sys/dev/qlnx/qlnxe/qlnx_os.c index 0ef3c93580b6..05ec69a70dfe 100644 --- a/sys/dev/qlnx/qlnxe/qlnx_os.c +++ b/sys/dev/qlnx/qlnxe/qlnx_os.c @@ -90,8 +90,8 @@ static void qlnx_init_ifnet(device_t dev, qlnx_host_t *ha); static void qlnx_init(void *arg); static void qlnx_init_locked(qlnx_host_t *ha); static int qlnx_set_multi(qlnx_host_t *ha, uint32_t add_multi); -static int qlnx_set_promisc(qlnx_host_t *ha); -static int qlnx_set_allmulti(qlnx_host_t *ha); +static int qlnx_set_promisc(qlnx_host_t *ha, int enabled); +static int qlnx_set_allmulti(qlnx_host_t *ha, int enabled); static int qlnx_ioctl(if_t ifp, u_long cmd, caddr_t data); static int qlnx_media_change(if_t ifp); static void qlnx_media_status(if_t ifp, struct ifmediareq *ifmr); @@ -227,7 +227,6 @@ MODULE_DEPEND(if_qlnxev, ether, 1, 1, 1); MALLOC_DEFINE(M_QLNXBUF, "qlnxbuf", "Buffers for qlnx driver"); -char qlnx_dev_str[128]; char qlnx_ver_str[VER_SIZE]; char qlnx_name_str[NAME_SIZE]; @@ -374,60 +373,48 @@ qlnx_pci_probe(device_t dev) #ifndef QLNX_VF case QLOGIC_PCI_DEVICE_ID_1644: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic 100GbE PCI CNA Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; case QLOGIC_PCI_DEVICE_ID_1634: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic 40GbE PCI CNA Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; case QLOGIC_PCI_DEVICE_ID_1656: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic 25GbE PCI CNA Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; case QLOGIC_PCI_DEVICE_ID_1654: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic 50GbE PCI CNA Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; case QLOGIC_PCI_DEVICE_ID_8070: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic 10GbE/25GbE/40GbE PCI CNA (AH)" " Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; #else case QLOGIC_PCI_DEVICE_ID_8090: - snprintf(qlnx_dev_str, sizeof(qlnx_dev_str), "%s v%d.%d.%d", + device_set_descf(dev, "%s v%d.%d.%d", "Qlogic SRIOV PCI CNA (AH) " "Adapter-Ethernet Function", QLNX_VERSION_MAJOR, QLNX_VERSION_MINOR, QLNX_VERSION_BUILD); - device_set_desc_copy(dev, qlnx_dev_str); - break; #endif /* #ifndef QLNX_VF */ @@ -763,7 +750,7 @@ qlnx_pci_attach(device_t dev) ha->pci_dev = dev; - mtx_init(&ha->hw_lock, "qlnx_hw_lock", MTX_NETWORK_LOCK, MTX_DEF); + sx_init(&ha->hw_lock, "qlnx_hw_lock"); ha->flags.lock_init = 1; @@ -1207,6 +1194,7 @@ qlnx_init_hw(qlnx_host_t *ha) int rval = 0; struct ecore_hw_prepare_params params; + ha->cdev.ha = ha; ecore_init_struct(&ha->cdev); /* ha->dp_module = ECORE_MSG_PROBE | @@ -1351,7 +1339,7 @@ qlnx_release(qlnx_host_t *ha) pci_release_msi(dev); if (ha->flags.lock_init) { - mtx_destroy(&ha->hw_lock); + sx_destroy(&ha->hw_lock); } if (ha->pci_reg) @@ -2304,10 +2292,6 @@ qlnx_init_ifnet(device_t dev, qlnx_host_t *ha) if_t ifp; ifp = ha->ifp = if_alloc(IFT_ETHER); - - if (ifp == NULL) - panic("%s: cannot if_alloc()\n", device_get_nameunit(dev)); - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); device_id = pci_get_device(ha->pci_dev); @@ -2355,9 +2339,6 @@ qlnx_init_ifnet(device_t dev, qlnx_host_t *ha) ha->primary_mac[5] = (rnd >> 16) & 0xFF; } - ether_ifattach(ifp, ha->primary_mac); - bcopy(if_getlladdr(ha->ifp), ha->primary_mac, ETHER_ADDR_LEN); - if_setcapabilities(ifp, IFCAP_HWCSUM); if_setcapabilitiesbit(ifp, IFCAP_JUMBO_MTU, 0); @@ -2412,6 +2393,9 @@ qlnx_init_ifnet(device_t dev, qlnx_host_t *ha) ifmedia_set(&ha->media, (IFM_ETHER | IFM_AUTO)); + ether_ifattach(ifp, ha->primary_mac); + bcopy(if_getlladdr(ha->ifp), ha->primary_mac, ETHER_ADDR_LEN); + QL_DPRINT2(ha, "exit\n"); return; @@ -2595,7 +2579,7 @@ qlnx_set_multi(qlnx_host_t *ha, uint32_t add_multi) } static int -qlnx_set_promisc(qlnx_host_t *ha) +qlnx_set_promisc(qlnx_host_t *ha, int enabled) { int rc = 0; uint8_t filter; @@ -2604,15 +2588,20 @@ qlnx_set_promisc(qlnx_host_t *ha) return (0); filter = ha->filter; - filter |= ECORE_ACCEPT_MCAST_UNMATCHED; - filter |= ECORE_ACCEPT_UCAST_UNMATCHED; + if (enabled) { + filter |= ECORE_ACCEPT_MCAST_UNMATCHED; + filter |= ECORE_ACCEPT_UCAST_UNMATCHED; + } else { + filter &= ~ECORE_ACCEPT_MCAST_UNMATCHED; + filter &= ~ECORE_ACCEPT_UCAST_UNMATCHED; + } rc = qlnx_set_rx_accept_filter(ha, filter); return (rc); } static int -qlnx_set_allmulti(qlnx_host_t *ha) +qlnx_set_allmulti(qlnx_host_t *ha, int enabled) { int rc = 0; uint8_t filter; @@ -2621,7 +2610,11 @@ qlnx_set_allmulti(qlnx_host_t *ha) return (0); filter = ha->filter; - filter |= ECORE_ACCEPT_MCAST_UNMATCHED; + if (enabled) { + filter |= ECORE_ACCEPT_MCAST_UNMATCHED; + } else { + filter &= ~ECORE_ACCEPT_MCAST_UNMATCHED; + } rc = qlnx_set_rx_accept_filter(ha, filter); return (rc); @@ -2631,6 +2624,7 @@ static int qlnx_ioctl(if_t ifp, u_long cmd, caddr_t data) { int ret = 0, mask; + int flags; struct ifreq *ifr = (struct ifreq *)data; #ifdef INET struct ifaddr *ifa = (struct ifaddr *)data; @@ -2684,15 +2678,16 @@ qlnx_ioctl(if_t ifp, u_long cmd, caddr_t data) QL_DPRINT4(ha, "SIOCSIFFLAGS (0x%lx)\n", cmd); QLNX_LOCK(ha); + flags = if_getflags(ifp); - if (if_getflags(ifp) & IFF_UP) { + if (flags & IFF_UP) { if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) { - if ((if_getflags(ifp) ^ ha->if_flags) & + if ((flags ^ ha->if_flags) & IFF_PROMISC) { - ret = qlnx_set_promisc(ha); + ret = qlnx_set_promisc(ha, flags & IFF_PROMISC); } else if ((if_getflags(ifp) ^ ha->if_flags) & IFF_ALLMULTI) { - ret = qlnx_set_allmulti(ha); + ret = qlnx_set_allmulti(ha, flags & IFF_ALLMULTI); } } else { ha->max_frame_size = if_getmtu(ifp) + @@ -2702,9 +2697,9 @@ qlnx_ioctl(if_t ifp, u_long cmd, caddr_t data) } else { if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) qlnx_stop(ha); - ha->if_flags = if_getflags(ifp); } + ha->if_flags = if_getflags(ifp); QLNX_UNLOCK(ha); break; @@ -5387,11 +5382,11 @@ qlnx_zalloc(uint32_t size) } void -qlnx_barrier(void *p_hwfn) +qlnx_barrier(void *p_dev) { qlnx_host_t *ha; - ha = (qlnx_host_t *)((struct ecore_hwfn *)p_hwfn)->p_dev; + ha = ((struct ecore_dev *) p_dev)->ha; bus_barrier(ha->pci_reg, 0, 0, BUS_SPACE_BARRIER_WRITE); } @@ -7062,8 +7057,19 @@ qlnx_set_rx_mode(qlnx_host_t *ha) { int rc = 0; uint8_t filter; + const if_t ifp = ha->ifp; + const struct ifaddr *ifa; + struct sockaddr_dl *sdl; + + ifa = if_getifaddr(ifp); + if (if_gettype(ifp) == IFT_ETHER && ifa != NULL && + ifa->ifa_addr != NULL) { + sdl = (struct sockaddr_dl *) ifa->ifa_addr; - rc = qlnx_set_ucast_rx_mac(ha, ECORE_FILTER_REPLACE, ha->primary_mac); + rc = qlnx_set_ucast_rx_mac(ha, ECORE_FILTER_REPLACE, LLADDR(sdl)); + } else { + rc = qlnx_set_ucast_rx_mac(ha, ECORE_FILTER_REPLACE, ha->primary_mac); + } if (rc) return rc; @@ -7075,9 +7081,11 @@ qlnx_set_rx_mode(qlnx_host_t *ha) ECORE_ACCEPT_MCAST_MATCHED | ECORE_ACCEPT_BCAST; - if (qlnx_vf_device(ha) == 0) { + if (qlnx_vf_device(ha) == 0 || (if_getflags(ha->ifp) & IFF_PROMISC)) { filter |= ECORE_ACCEPT_UCAST_UNMATCHED; filter |= ECORE_ACCEPT_MCAST_UNMATCHED; + } else if (if_getflags(ha->ifp) & IFF_ALLMULTI) { + filter |= ECORE_ACCEPT_MCAST_UNMATCHED; } ha->filter = filter; |