Deleted Added
full compact
if_lem.c (248292) if_lem.c (250458)
1/******************************************************************************
2
3 Copyright (c) 2001-2012, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8

--- 16 unchanged lines hidden (view full) ---

25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
1/******************************************************************************
2
3 Copyright (c) 2001-2012, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8

--- 16 unchanged lines hidden (view full) ---

25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: stable/9/sys/dev/e1000/if_lem.c 248292 2013-03-14 22:55:59Z jfv $*/
33/*$FreeBSD: stable/9/sys/dev/e1000/if_lem.c 250458 2013-05-10 16:16:33Z luigi $*/
34
35#ifdef HAVE_KERNEL_OPTION_HEADERS
36#include "opt_device_polling.h"
37#include "opt_inet.h"
38#include "opt_inet6.h"
39#endif
40
41#include <sys/param.h>

--- 234 unchanged lines hidden (view full) ---

276
277/*********************************************************************
278 * Tunable default values.
279 *********************************************************************/
280
281#define EM_TICKS_TO_USECS(ticks) ((1024 * (ticks) + 500) / 1000)
282#define EM_USECS_TO_TICKS(usecs) ((1000 * (usecs) + 512) / 1024)
283
34
35#ifdef HAVE_KERNEL_OPTION_HEADERS
36#include "opt_device_polling.h"
37#include "opt_inet.h"
38#include "opt_inet6.h"
39#endif
40
41#include <sys/param.h>

--- 234 unchanged lines hidden (view full) ---

276
277/*********************************************************************
278 * Tunable default values.
279 *********************************************************************/
280
281#define EM_TICKS_TO_USECS(ticks) ((1024 * (ticks) + 500) / 1000)
282#define EM_USECS_TO_TICKS(usecs) ((1000 * (usecs) + 512) / 1024)
283
284#define MAX_INTS_PER_SEC 8000
285#define DEFAULT_ITR (1000000000/(MAX_INTS_PER_SEC * 256))
286
284static int lem_tx_int_delay_dflt = EM_TICKS_TO_USECS(EM_TIDV);
285static int lem_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR);
286static int lem_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
287static int lem_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
288static int lem_rxd = EM_DEFAULT_RXD;
289static int lem_txd = EM_DEFAULT_TXD;
290static int lem_smart_pwr_down = FALSE;
291

--- 145 unchanged lines hidden (view full) ---

437 &adapter->rx_abs_int_delay,
438 E1000_REGISTER(&adapter->hw, E1000_RADV),
439 lem_rx_abs_int_delay_dflt);
440 lem_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
441 "transmit interrupt delay limit in usecs",
442 &adapter->tx_abs_int_delay,
443 E1000_REGISTER(&adapter->hw, E1000_TADV),
444 lem_tx_abs_int_delay_dflt);
287static int lem_tx_int_delay_dflt = EM_TICKS_TO_USECS(EM_TIDV);
288static int lem_rx_int_delay_dflt = EM_TICKS_TO_USECS(EM_RDTR);
289static int lem_tx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_TADV);
290static int lem_rx_abs_int_delay_dflt = EM_TICKS_TO_USECS(EM_RADV);
291static int lem_rxd = EM_DEFAULT_RXD;
292static int lem_txd = EM_DEFAULT_TXD;
293static int lem_smart_pwr_down = FALSE;
294

--- 145 unchanged lines hidden (view full) ---

440 &adapter->rx_abs_int_delay,
441 E1000_REGISTER(&adapter->hw, E1000_RADV),
442 lem_rx_abs_int_delay_dflt);
443 lem_add_int_delay_sysctl(adapter, "tx_abs_int_delay",
444 "transmit interrupt delay limit in usecs",
445 &adapter->tx_abs_int_delay,
446 E1000_REGISTER(&adapter->hw, E1000_TADV),
447 lem_tx_abs_int_delay_dflt);
448 lem_add_int_delay_sysctl(adapter, "itr",
449 "interrupt delay limit in usecs/4",
450 &adapter->tx_itr,
451 E1000_REGISTER(&adapter->hw, E1000_ITR),
452 DEFAULT_ITR);
445 }
446
447 /* Sysctls for limiting the amount of work done in the taskqueue */
448 lem_add_rx_process_limit(adapter, "rx_processing_limit",
449 "max number of rx packets to process", &adapter->rx_process_limit,
450 lem_rx_process_limit);
451
452 /* Sysctl for setting the interface flow control */

--- 879 unchanged lines hidden (view full) ---

1332static void
1333lem_handle_rxtx(void *context, int pending)
1334{
1335 struct adapter *adapter = context;
1336 struct ifnet *ifp = adapter->ifp;
1337
1338
1339 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
453 }
454
455 /* Sysctls for limiting the amount of work done in the taskqueue */
456 lem_add_rx_process_limit(adapter, "rx_processing_limit",
457 "max number of rx packets to process", &adapter->rx_process_limit,
458 lem_rx_process_limit);
459
460 /* Sysctl for setting the interface flow control */

--- 879 unchanged lines hidden (view full) ---

1340static void
1341lem_handle_rxtx(void *context, int pending)
1342{
1343 struct adapter *adapter = context;
1344 struct ifnet *ifp = adapter->ifp;
1345
1346
1347 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1340 lem_rxeof(adapter, adapter->rx_process_limit, NULL);
1348 bool more = lem_rxeof(adapter, adapter->rx_process_limit, NULL);
1341 EM_TX_LOCK(adapter);
1342 lem_txeof(adapter);
1343 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1344 lem_start_locked(ifp);
1345 EM_TX_UNLOCK(adapter);
1349 EM_TX_LOCK(adapter);
1350 lem_txeof(adapter);
1351 if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
1352 lem_start_locked(ifp);
1353 EM_TX_UNLOCK(adapter);
1354 if (more) {
1355 taskqueue_enqueue(adapter->tq, &adapter->rxtx_task);
1356 return;
1357 }
1346 }
1347
1348 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1349 lem_enable_intr(adapter);
1350}
1351
1352/*********************************************************************
1353 *

--- 1596 unchanged lines hidden (view full) ---

2950 int first, last, done, num_avail;
2951 struct em_buffer *tx_buffer;
2952 struct e1000_tx_desc *tx_desc, *eop_desc;
2953 struct ifnet *ifp = adapter->ifp;
2954
2955 EM_TX_LOCK_ASSERT(adapter);
2956
2957#ifdef DEV_NETMAP
1358 }
1359
1360 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1361 lem_enable_intr(adapter);
1362}
1363
1364/*********************************************************************
1365 *

--- 1596 unchanged lines hidden (view full) ---

2962 int first, last, done, num_avail;
2963 struct em_buffer *tx_buffer;
2964 struct e1000_tx_desc *tx_desc, *eop_desc;
2965 struct ifnet *ifp = adapter->ifp;
2966
2967 EM_TX_LOCK_ASSERT(adapter);
2968
2969#ifdef DEV_NETMAP
2958 if (ifp->if_capenable & IFCAP_NETMAP) {
2959 selwakeuppri(&NA(ifp)->tx_rings[0].si, PI_NET);
2970 if (netmap_tx_irq(ifp, 0 | (NETMAP_LOCKED_ENTER|NETMAP_LOCKED_EXIT)))
2960 return;
2971 return;
2961 }
2962#endif /* DEV_NETMAP */
2963 if (adapter->num_tx_desc_avail == adapter->num_tx_desc)
2964 return;
2965
2966 num_avail = adapter->num_tx_desc_avail;
2967 first = adapter->next_tx_to_clean;
2968 tx_desc = &adapter->tx_desc_base[first];
2969 tx_buffer = &adapter->tx_buffer_area[first];

--- 271 unchanged lines hidden (view full) ---

3241 return (0);
3242}
3243
3244/*********************************************************************
3245 *
3246 * Enable receive unit.
3247 *
3248 **********************************************************************/
2972#endif /* DEV_NETMAP */
2973 if (adapter->num_tx_desc_avail == adapter->num_tx_desc)
2974 return;
2975
2976 num_avail = adapter->num_tx_desc_avail;
2977 first = adapter->next_tx_to_clean;
2978 tx_desc = &adapter->tx_desc_base[first];
2979 tx_buffer = &adapter->tx_buffer_area[first];

--- 271 unchanged lines hidden (view full) ---

3251 return (0);
3252}
3253
3254/*********************************************************************
3255 *
3256 * Enable receive unit.
3257 *
3258 **********************************************************************/
3249#define MAX_INTS_PER_SEC 8000
3250#define DEFAULT_ITR 1000000000/(MAX_INTS_PER_SEC * 256)
3251
3252static void
3253lem_initialize_receive_unit(struct adapter *adapter)
3254{
3255 struct ifnet *ifp = adapter->ifp;
3256 u64 bus_addr;
3257 u32 rctl, rxcsum;
3258

--- 74 unchanged lines hidden (view full) ---

3333 /* Enable Receives */
3334 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl);
3335
3336 /*
3337 * Setup the HW Rx Head and
3338 * Tail Descriptor Pointers
3339 */
3340 E1000_WRITE_REG(&adapter->hw, E1000_RDH(0), 0);
3259
3260static void
3261lem_initialize_receive_unit(struct adapter *adapter)
3262{
3263 struct ifnet *ifp = adapter->ifp;
3264 u64 bus_addr;
3265 u32 rctl, rxcsum;
3266

--- 74 unchanged lines hidden (view full) ---

3341 /* Enable Receives */
3342 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl);
3343
3344 /*
3345 * Setup the HW Rx Head and
3346 * Tail Descriptor Pointers
3347 */
3348 E1000_WRITE_REG(&adapter->hw, E1000_RDH(0), 0);
3349 rctl = adapter->num_rx_desc - 1; /* default RDT value */
3341#ifdef DEV_NETMAP
3342 /* preserve buffers already made available to clients */
3350#ifdef DEV_NETMAP
3351 /* preserve buffers already made available to clients */
3343 if (ifp->if_capenable & IFCAP_NETMAP) {
3344 struct netmap_adapter *na = NA(adapter->ifp);
3345 struct netmap_kring *kring = &na->rx_rings[0];
3346 int t = na->num_rx_desc - 1 - kring->nr_hwavail;
3347
3348 if (t >= na->num_rx_desc)
3349 t -= na->num_rx_desc;
3350 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), t);
3351 } else
3352 if (ifp->if_capenable & IFCAP_NETMAP)
3353 rctl -= NA(adapter->ifp)->rx_rings[0].nr_hwavail;
3352#endif /* DEV_NETMAP */
3354#endif /* DEV_NETMAP */
3353 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), adapter->num_rx_desc - 1);
3355 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), rctl);
3354
3355 return;
3356}
3357
3358/*********************************************************************
3359 *
3360 * Free receive related data structures.
3361 *

--- 67 unchanged lines hidden (view full) ---

3429
3430 EM_RX_LOCK(adapter);
3431 i = adapter->next_rx_desc_to_check;
3432 current_desc = &adapter->rx_desc_base[i];
3433 bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
3434 BUS_DMASYNC_POSTREAD);
3435
3436#ifdef DEV_NETMAP
3356
3357 return;
3358}
3359
3360/*********************************************************************
3361 *
3362 * Free receive related data structures.
3363 *

--- 67 unchanged lines hidden (view full) ---

3431
3432 EM_RX_LOCK(adapter);
3433 i = adapter->next_rx_desc_to_check;
3434 current_desc = &adapter->rx_desc_base[i];
3435 bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map,
3436 BUS_DMASYNC_POSTREAD);
3437
3438#ifdef DEV_NETMAP
3437 if (ifp->if_capenable & IFCAP_NETMAP) {
3438 struct netmap_adapter *na = NA(ifp);
3439 na->rx_rings[0].nr_kflags |= NKR_PENDINTR;
3440 selwakeuppri(&na->rx_rings[0].si, PI_NET);
3441 EM_RX_UNLOCK(adapter);
3442 return (0);
3443 }
3439 if (netmap_rx_irq(ifp, 0 | NETMAP_LOCKED_ENTER, &rx_sent))
3440 return (FALSE);
3444#endif /* DEV_NETMAP */
3445
3446 if (!((current_desc->status) & E1000_RXD_STAT_DD)) {
3447 if (done != NULL)
3448 *done = rx_sent;
3449 EM_RX_UNLOCK(adapter);
3450 return (FALSE);
3451 }

--- 1127 unchanged lines hidden (view full) ---

4579 usecs = info->value;
4580 error = sysctl_handle_int(oidp, &usecs, 0, req);
4581 if (error != 0 || req->newptr == NULL)
4582 return (error);
4583 if (usecs < 0 || usecs > EM_TICKS_TO_USECS(65535))
4584 return (EINVAL);
4585 info->value = usecs;
4586 ticks = EM_USECS_TO_TICKS(usecs);
3441#endif /* DEV_NETMAP */
3442
3443 if (!((current_desc->status) & E1000_RXD_STAT_DD)) {
3444 if (done != NULL)
3445 *done = rx_sent;
3446 EM_RX_UNLOCK(adapter);
3447 return (FALSE);
3448 }

--- 1127 unchanged lines hidden (view full) ---

4576 usecs = info->value;
4577 error = sysctl_handle_int(oidp, &usecs, 0, req);
4578 if (error != 0 || req->newptr == NULL)
4579 return (error);
4580 if (usecs < 0 || usecs > EM_TICKS_TO_USECS(65535))
4581 return (EINVAL);
4582 info->value = usecs;
4583 ticks = EM_USECS_TO_TICKS(usecs);
4584 if (info->offset == E1000_ITR) /* units are 256ns here */
4585 ticks *= 4;
4587
4588 adapter = info->adapter;
4589
4590 EM_CORE_LOCK(adapter);
4591 regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
4592 regval = (regval & ~0xffff) | (ticks & 0xffff);
4593 /* Handle a few special cases. */
4594 switch (info->offset) {

--- 49 unchanged lines hidden ---
4586
4587 adapter = info->adapter;
4588
4589 EM_CORE_LOCK(adapter);
4590 regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
4591 regval = (regval & ~0xffff) | (ticks & 0xffff);
4592 /* Handle a few special cases. */
4593 switch (info->offset) {

--- 49 unchanged lines hidden ---