em driver, 82574L chip, and possibly ASPM

Hooman Fazaeli fazaeli at sepehrs.com
Tue Jul 12 19:31:13 UTC 2011


I have similar problems on a couple of 7.3 boxes with latest driver form -CURRENT.
I just wanted to know if your 7 boxes work fine so I look for cause else where.

On 2/7/2011 3:23 AM, Mike Tancsa wrote:
> So far so good.  I would often get a hang on the level zero dumps to my
> backup server Sunday AM, and it made it through!  So a good sign, but
> not a definitive sign.
>
> I have a PCIe em card that has this chipset as well and was showing the
> same sort of problem in a customer's RELENG_7 box.  I will see if I can
> get the customer to try the card in their box with the patch for
> RELENG_7 as it would show this issue at least once a day until I pulled
> the card for an older version
>
> 	---Mike
>
>
> On 2/4/2011 1:12 PM, Jack Vogel wrote:
>> Was curious too, but being more patient than you :)
>>
>> Jack
>>
>>
>> On Fri, Feb 4, 2011 at 10:09 AM, Sean Bruno<seanbru at yahoo-inc.com>  wrote:
>>
>>> Any more data on this problem or do we have to wait a while?
>>>
>>> Sean
>>>
>>>
>>> On Wed, 2011-02-02 at 10:28 -0800, Mike Tancsa wrote:
>>>> 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/
>>>> _______________________________________________
>>>> freebsd-net at freebsd.org mailing list
>>>> http://lists.freebsd.org/mailman/listinfo/freebsd-net
>>>> To unsubscribe, send any mail to "freebsd-net-unsubscribe at freebsd.org"
>>>
>>>
>


More information about the freebsd-hardware mailing list