aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/qlnx/qlnxe/qlnx_os.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/qlnx/qlnxe/qlnx_os.c')
-rw-r--r--sys/dev/qlnx/qlnxe/qlnx_os.c96
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;