svn commit: r209501 - user/jmallett/octeon/sys/mips/cavium/octe
Juli Mallett
jmallett at FreeBSD.org
Thu Jun 24 08:35:02 UTC 2010
Author: jmallett
Date: Thu Jun 24 08:35:02 2010
New Revision: 209501
URL: http://svn.freebsd.org/changeset/base/209501
Log:
Handle MAC setting and promiscuous/allmulti more gracefully.
Modified:
user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c
user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h
user/jmallett/octeon/sys/mips/cavium/octe/octe.c
Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Thu Jun 24 08:08:43 2010 (r209500)
+++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c Thu Jun 24 08:35:02 2010 (r209501)
@@ -139,10 +139,9 @@ void cvm_oct_common_set_multicast_list(s
* Set the hardware MAC address for a device
*
* @param dev Device to change the MAC address for
- * @param addr Address structure to change it too. MAC address is addr + 2.
- * @return Zero on success
+ * @param addr Address structure to change it too.
*/
-static int cvm_oct_common_set_mac_address(struct ifnet *ifp, void *addr)
+void cvm_oct_common_set_mac_address(struct ifnet *ifp, const void *addr)
{
cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc;
cvmx_gmxx_prtx_cfg_t gmx_cfg;
@@ -153,7 +152,7 @@ static int cvm_oct_common_set_mac_addres
if ((interface < 2) && (cvmx_helper_interface_get_mode(interface) != CVMX_HELPER_INTERFACE_MODE_SPI)) {
int i;
- uint8_t *ptr = addr;
+ const uint8_t *ptr = addr;
uint64_t mac = 0;
for (i = 0; i < 6; i++)
mac = (mac<<8) | (uint64_t)(ptr[i]);
@@ -171,7 +170,6 @@ static int cvm_oct_common_set_mac_addres
cvm_oct_common_set_multicast_list(ifp);
cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
}
- return 0;
}
@@ -245,18 +243,10 @@ int cvm_oct_common_init(struct ifnet *if
ifp->if_mtu = ETHERMTU;
-#if 0
- if (priv->queue != -1) {
- if (USE_HW_TCPUDP_CHECKSUM)
- ifp->features |= NETIF_F_IP_CSUM;
- }
-#endif
count++;
#if 0
ifp->get_stats = cvm_oct_common_get_stats;
- ifp->set_mac_address = cvm_oct_common_set_mac_address;
- ifp->features |= NETIF_F_LLTX; /* We do our own locking, Linux doesn't need to */
#ifdef CONFIG_NET_POLL_CONTROLLER
ifp->poll_controller = cvm_oct_poll_controller;
#endif
Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Thu Jun 24 08:08:43 2010 (r209500)
+++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.h Thu Jun 24 08:35:02 2010 (r209501)
@@ -32,6 +32,7 @@ void cvm_oct_common_uninit(struct ifnet
int cvm_oct_common_change_mtu(struct ifnet *ifp, int new_mtu);
void cvm_oct_common_set_multicast_list(struct ifnet *ifp);
+void cvm_oct_common_set_mac_address(struct ifnet *ifp, const void *);
int cvm_oct_init_module(device_t);
void cvm_oct_cleanup_module(void);
Modified: user/jmallett/octeon/sys/mips/cavium/octe/octe.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/octe.c Thu Jun 24 08:08:43 2010 (r209500)
+++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c Thu Jun 24 08:35:02 2010 (r209501)
@@ -53,8 +53,10 @@
#include <net/bpf.h>
#include <net/ethernet.h>
#include <net/if.h>
+#include <net/if_dl.h>
#include <net/if_media.h>
#include <net/if_types.h>
+#include <net/if_var.h>
#include <net/if_vlan_var.h>
#ifdef INET
@@ -167,7 +169,13 @@ octe_attach(device_t dev)
ifmedia_set(&priv->media, IFM_ETHER | IFM_AUTO);
}
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
+ /*
+ * XXX
+ * We don't support programming the multicast filter right now, although it
+ * ought to be easy enough. (Presumably it's just a matter of putting
+ * multicast addresses in the CAM?)
+ */
+ ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALLMULTI;
ifp->if_init = octe_init;
ifp->if_ioctl = octe_ioctl;
ifp->if_start = octe_start;
@@ -252,6 +260,11 @@ octe_init(void *arg)
if (priv->open != NULL)
priv->open(ifp);
+ if (((ifp->if_flags ^ priv->if_flags) & (IFF_ALLMULTI | IFF_MULTICAST | IFF_PROMISC)) != 0)
+ cvm_oct_common_set_multicast_list(ifp);
+
+ cvm_oct_common_set_mac_address(ifp, IF_LLADDR(ifp));
+
if (priv->miibus != NULL)
mii_mediachg(device_get_softc(priv->miibus));
@@ -450,6 +463,8 @@ octe_ioctl(struct ifnet *ifp, u_long cmd
return (0);
case SIOCSIFFLAGS:
+ if (ifp->if_flags == priv->if_flags)
+ return (0);
if ((ifp->if_flags & IFF_UP) != 0) {
if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
octe_init(priv);
More information about the svn-src-user
mailing list