em driver, 82574L chip, and possibly ASPM
Mike Tancsa
mike at sentex.net
Wed Feb 2 18:29:10 UTC 2011
On 2/2/2011 12:37 PM, Jack Vogel wrote:
> So has everyone that wanted to get something testing been able to do so?
I have been testing in the back and will deploy to my production box
this afternoon. As I am not able to reproduce it easily, it will be a
bit before I can say the issue is gone. Jan however, was able to
trigger it with greater ease ?
---Mike
>
> Jack
>
>
> On Tue, Feb 1, 2011 at 7:03 PM, Mike Tancsa <mike at sentex.net> wrote:
>
>> On 2/1/2011 5:03 PM, Sean Bruno wrote:
>>> On Tue, 2011-02-01 at 13:43 -0800, Jack Vogel wrote:
>>>> To those who are going to test, here is the if_em.c, based on head,
>>>> with my
>>>> changes, I have to leave for the afternoon, and have not had a chance
>>>> to build
>>>> this, but it should work. I will check back in the later evening.
>>>>
>>>> Any blatant problems Sean, feel free to fix them :)
>>>>
>>>> Jack
>>>>
>>>
>>>
>>> I suspect that line 1490 should be:
>>> if (more_rx || (ifp->if_drv_flags & IFF_DRV_OACTIVE)) {
>>>
>>
>>
>> I have hacked up a RELENG_8 version which I think is correct including
>> the above change
>>
>> http://www.tancsa.com/if_em-8.c
>>
>>
>>
>> --- if_em.c.orig 2011-02-01 21:47:14.000000000 -0500
>> +++ if_em.c 2011-02-01 21:47:19.000000000 -0500
>> @@ -30,7 +30,7 @@
>> POSSIBILITY OF SUCH DAMAGE.
>>
>>
>> ******************************************************************************/
>> -/*$FreeBSD: src/sys/dev/e1000/if_em.c,v 1.21.2.20 2011/01/22 01:37:53
>> jfv Exp $*/
>> +/*$FreeBSD$*/
>>
>> #ifdef HAVE_KERNEL_OPTION_HEADERS
>> #include "opt_device_polling.h"
>> @@ -93,7 +93,7 @@
>> /*********************************************************************
>> * Driver version:
>> *********************************************************************/
>> -char em_driver_version[] = "7.1.9";
>> +char em_driver_version[] = "7.1.9-test";
>>
>> /*********************************************************************
>> * PCI Device ID Table
>> @@ -927,11 +927,10 @@
>> if (!adapter->link_active)
>> return;
>>
>> - /* Call cleanup if number of TX descriptors low */
>> - if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD)
>> - em_txeof(txr);
>> -
>> while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
>> + /* First cleanup if TX descriptors low */
>> + if (txr->tx_avail <= EM_TX_CLEANUP_THRESHOLD)
>> + em_txeof(txr);
>> if (txr->tx_avail < EM_MAX_SCATTER) {
>> ifp->if_drv_flags |= IFF_DRV_OACTIVE;
>> break;
>> @@ -1411,8 +1410,7 @@
>> if (!drbr_empty(ifp, txr->br))
>> em_mq_start_locked(ifp, txr, NULL);
>> #else
>> - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>> - em_start_locked(ifp, txr);
>> + em_start_locked(ifp, txr);
>> #endif
>> EM_TX_UNLOCK(txr);
>>
>> @@ -1475,11 +1473,10 @@
>> struct ifnet *ifp = adapter->ifp;
>> struct tx_ring *txr = adapter->tx_rings;
>> struct rx_ring *rxr = adapter->rx_rings;
>> - bool more;
>> -
>>
>> if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
>> - more = em_rxeof(rxr, adapter->rx_process_limit, NULL);
>> + bool more_rx;
>> + more_rx = em_rxeof(rxr, adapter->rx_process_limit, NULL);
>>
>> EM_TX_LOCK(txr);
>> em_txeof(txr);
>> @@ -1487,12 +1484,10 @@
>> if (!drbr_empty(ifp, txr->br))
>> em_mq_start_locked(ifp, txr, NULL);
>> #else
>> - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>> - em_start_locked(ifp, txr);
>> + em_start_locked(ifp, txr);
>> #endif
>> - em_txeof(txr);
>> EM_TX_UNLOCK(txr);
>> - if (more) {
>> + if (more_rx || (ifp->if_drv_flags & IFF_DRV_OACTIVE)) {
>> taskqueue_enqueue(adapter->tq, &adapter->que_task);
>> return;
>> }
>> @@ -1604,7 +1599,6 @@
>> if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
>> em_start_locked(ifp, txr);
>> #endif
>> - em_txeof(txr);
>> E1000_WRITE_REG(&adapter->hw, E1000_IMS, txr->ims);
>> EM_TX_UNLOCK(txr);
>> }
>> @@ -3730,17 +3724,17 @@
>> txr->queue_status = EM_QUEUE_HUNG;
>>
>> /*
>> - * If we have enough room, clear IFF_DRV_OACTIVE
>> + * If we have a minimum free, clear IFF_DRV_OACTIVE
>> * to tell the stack that it is OK to send packets.
>> */
>> - if (txr->tx_avail > EM_TX_CLEANUP_THRESHOLD) {
>> + if (txr->tx_avail > EM_MAX_SCATTER)
>> ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
>> - /* Disable watchdog if all clean */
>> - if (txr->tx_avail == adapter->num_tx_desc) {
>> - txr->queue_status = EM_QUEUE_IDLE;
>> - return (FALSE);
>> - }
>> - }
>> +
>> + /* Disable watchdog if all clean */
>> + if (txr->tx_avail == adapter->num_tx_desc) {
>> + txr->queue_status = EM_QUEUE_IDLE;
>> + return (FALSE);
>> + }
>>
>> return (TRUE);
>> }
>> @@ -5064,8 +5058,8 @@
>> char namebuf[QUEUE_NAME_LEN];
>>
>> /* Driver Statistics */
>> - SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "link_irq",
>> - CTLFLAG_RD, &adapter->link_irq, 0,
>> + SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "link_irq",
>> + CTLFLAG_RD, &adapter->link_irq,0,
>> "Link MSIX IRQ Handled");
>> SYSCTL_ADD_ULONG(ctx, child, OID_AUTO, "mbuf_alloc_fail",
>> CTLFLAG_RD, &adapter->mbuf_alloc_failed,
>> @@ -5108,11 +5102,13 @@
>> queue_list = SYSCTL_CHILDREN(queue_node);
>>
>> SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_head",
>> - CTLFLAG_RD, adapter, E1000_TDH(txr->me),
>> + CTLFLAG_RD, adapter,
>> + E1000_TDH(txr->me),
>> em_sysctl_reg_handler, "IU",
>> "Transmit Descriptor Head");
>> SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "txd_tail",
>> - CTLFLAG_RD, adapter, E1000_TDT(txr->me),
>> + CTLFLAG_RD, adapter,
>> + E1000_TDT(txr->me),
>> em_sysctl_reg_handler, "IU",
>> "Transmit Descriptor Tail");
>> SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "tx_irq",
>> @@ -5123,11 +5119,13 @@
>> "Queue No Descriptor Available");
>>
>> SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_head",
>> - CTLFLAG_RD, adapter, E1000_RDH(rxr->me),
>> + CTLFLAG_RD, adapter,
>> + E1000_RDH(rxr->me),
>> em_sysctl_reg_handler, "IU",
>> "Receive Descriptor Head");
>> SYSCTL_ADD_PROC(ctx, queue_list, OID_AUTO, "rxd_tail",
>> - CTLFLAG_RD, adapter, E1000_RDT(rxr->me),
>> + CTLFLAG_RD, adapter,
>> + E1000_RDT(rxr->me),
>> em_sysctl_reg_handler, "IU",
>> "Receive Descriptor Tail");
>> SYSCTL_ADD_ULONG(ctx, queue_list, OID_AUTO, "rx_irq",
>> @@ -5141,19 +5139,19 @@
>> CTLFLAG_RD, NULL, "Statistics");
>> stat_list = SYSCTL_CHILDREN(stat_node);
>>
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "excess_coll",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "excess_coll",
>> CTLFLAG_RD, &stats->ecol,
>> "Excessive collisions");
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "single_coll",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "single_coll",
>> CTLFLAG_RD, &stats->scc,
>> "Single collisions");
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "multiple_coll",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "multiple_coll",
>> CTLFLAG_RD, &stats->mcc,
>> "Multiple collisions");
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "late_coll",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "late_coll",
>> CTLFLAG_RD, &stats->latecol,
>> "Late collisions");
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "collision_count",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "collision_count",
>> CTLFLAG_RD, &stats->colc,
>> "Collision Count");
>> SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "symbol_errors",
>> @@ -5240,12 +5238,12 @@
>> SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "rx_frames_1024_1522",
>> CTLFLAG_RD, &adapter->stats.prc1522,
>> "1023-1522 byte frames received");
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "good_octets_recvd",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "good_octets_recvd",
>> CTLFLAG_RD, &adapter->stats.gorc,
>> "Good Octets Received");
>>
>> /* Packet Transmission Stats */
>> - SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
>> + SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "good_octets_txd",
>> CTLFLAG_RD, &adapter->stats.gotc,
>> "Good Octets Transmitted");
>> SYSCTL_ADD_QUAD(ctx, stat_list, OID_AUTO, "total_pkts_txd",
>>
>> --
>> -------------------
>> Mike Tancsa, tel +1 519 651 3400
>> Sentex Communications, mike at sentex.net
>> Providing Internet services since 1994 www.sentex.net
>> Cambridge, Ontario Canada http://www.tancsa.com/
>>
>
--
-------------------
Mike Tancsa, tel +1 519 651 3400
Sentex Communications, mike at sentex.net
Providing Internet services since 1994 www.sentex.net
Cambridge, Ontario Canada http://www.tancsa.com/
More information about the freebsd-net
mailing list