diff options
Diffstat (limited to 'drivers/net/ethernet/sfc/efx.c')
-rw-r--r-- | drivers/net/ethernet/sfc/efx.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c index 34788fbb4c66..5b66c5ecf6a1 100644 --- a/drivers/net/ethernet/sfc/efx.c +++ b/drivers/net/ethernet/sfc/efx.c | |||
@@ -2075,7 +2075,7 @@ static int efx_set_features(struct net_device *net_dev, netdev_features_t data) | |||
2075 | return 0; | 2075 | return 0; |
2076 | } | 2076 | } |
2077 | 2077 | ||
2078 | static const struct net_device_ops efx_netdev_ops = { | 2078 | static const struct net_device_ops efx_farch_netdev_ops = { |
2079 | .ndo_open = efx_net_open, | 2079 | .ndo_open = efx_net_open, |
2080 | .ndo_stop = efx_net_stop, | 2080 | .ndo_stop = efx_net_stop, |
2081 | .ndo_get_stats64 = efx_net_stats, | 2081 | .ndo_get_stats64 = efx_net_stats, |
@@ -2102,6 +2102,26 @@ static const struct net_device_ops efx_netdev_ops = { | |||
2102 | #endif | 2102 | #endif |
2103 | }; | 2103 | }; |
2104 | 2104 | ||
2105 | static const struct net_device_ops efx_ef10_netdev_ops = { | ||
2106 | .ndo_open = efx_net_open, | ||
2107 | .ndo_stop = efx_net_stop, | ||
2108 | .ndo_get_stats64 = efx_net_stats, | ||
2109 | .ndo_tx_timeout = efx_watchdog, | ||
2110 | .ndo_start_xmit = efx_hard_start_xmit, | ||
2111 | .ndo_validate_addr = eth_validate_addr, | ||
2112 | .ndo_do_ioctl = efx_ioctl, | ||
2113 | .ndo_change_mtu = efx_change_mtu, | ||
2114 | .ndo_set_mac_address = efx_set_mac_address, | ||
2115 | .ndo_set_rx_mode = efx_set_rx_mode, | ||
2116 | .ndo_set_features = efx_set_features, | ||
2117 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
2118 | .ndo_poll_controller = efx_netpoll, | ||
2119 | #endif | ||
2120 | #ifdef CONFIG_RFS_ACCEL | ||
2121 | .ndo_rx_flow_steer = efx_filter_rfs, | ||
2122 | #endif | ||
2123 | }; | ||
2124 | |||
2105 | static void efx_update_name(struct efx_nic *efx) | 2125 | static void efx_update_name(struct efx_nic *efx) |
2106 | { | 2126 | { |
2107 | strcpy(efx->name, efx->net_dev->name); | 2127 | strcpy(efx->name, efx->net_dev->name); |
@@ -2114,7 +2134,8 @@ static int efx_netdev_event(struct notifier_block *this, | |||
2114 | { | 2134 | { |
2115 | struct net_device *net_dev = netdev_notifier_info_to_dev(ptr); | 2135 | struct net_device *net_dev = netdev_notifier_info_to_dev(ptr); |
2116 | 2136 | ||
2117 | if (net_dev->netdev_ops == &efx_netdev_ops && | 2137 | if ((net_dev->netdev_ops == &efx_farch_netdev_ops || |
2138 | net_dev->netdev_ops == &efx_ef10_netdev_ops) && | ||
2118 | event == NETDEV_CHANGENAME) | 2139 | event == NETDEV_CHANGENAME) |
2119 | efx_update_name(netdev_priv(net_dev)); | 2140 | efx_update_name(netdev_priv(net_dev)); |
2120 | 2141 | ||
@@ -2141,7 +2162,12 @@ static int efx_register_netdev(struct efx_nic *efx) | |||
2141 | 2162 | ||
2142 | net_dev->watchdog_timeo = 5 * HZ; | 2163 | net_dev->watchdog_timeo = 5 * HZ; |
2143 | net_dev->irq = efx->pci_dev->irq; | 2164 | net_dev->irq = efx->pci_dev->irq; |
2144 | net_dev->netdev_ops = &efx_netdev_ops; | 2165 | if (efx_nic_rev(efx) >= EFX_REV_HUNT_A0) { |
2166 | net_dev->netdev_ops = &efx_ef10_netdev_ops; | ||
2167 | net_dev->priv_flags |= IFF_UNICAST_FLT; | ||
2168 | } else { | ||
2169 | net_dev->netdev_ops = &efx_farch_netdev_ops; | ||
2170 | } | ||
2145 | SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); | 2171 | SET_ETHTOOL_OPS(net_dev, &efx_ethtool_ops); |
2146 | net_dev->gso_max_segs = EFX_TSO_MAX_SEGS; | 2172 | net_dev->gso_max_segs = EFX_TSO_MAX_SEGS; |
2147 | 2173 | ||
@@ -2463,6 +2489,8 @@ static DEFINE_PCI_DEVICE_TABLE(efx_pci_table) = { | |||
2463 | .driver_data = (unsigned long) &siena_a0_nic_type}, | 2489 | .driver_data = (unsigned long) &siena_a0_nic_type}, |
2464 | {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0813), /* SFL9021 */ | 2490 | {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0813), /* SFL9021 */ |
2465 | .driver_data = (unsigned long) &siena_a0_nic_type}, | 2491 | .driver_data = (unsigned long) &siena_a0_nic_type}, |
2492 | {PCI_DEVICE(PCI_VENDOR_ID_SOLARFLARE, 0x0903), /* SFC9120 PF */ | ||
2493 | .driver_data = (unsigned long) &efx_hunt_a0_nic_type}, | ||
2466 | {0} /* end of list */ | 2494 | {0} /* end of list */ |
2467 | }; | 2495 | }; |
2468 | 2496 | ||