From owner-freebsd-net@FreeBSD.ORG Wed Jan 23 07:13:47 2013 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id 1A1C4949; Wed, 23 Jan 2013 07:13:47 +0000 (UTC) (envelope-from neelnatu@gmail.com) Received: from mail-ie0-f180.google.com (mail-ie0-f180.google.com [209.85.223.180]) by mx1.freebsd.org (Postfix) with ESMTP id E02CEDC5; Wed, 23 Jan 2013 07:13:46 +0000 (UTC) Received: by mail-ie0-f180.google.com with SMTP id c10so12907276ieb.39 for ; Tue, 22 Jan 2013 23:13:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:date:message-id:subject:from:to:cc :content-type; bh=6e4oof9oSCeLO6+QqPSB8by6IUF2ZEaUxDxvhNNxtS8=; b=judkUsR1FeqwcO2WhJHimbSD5OpuAwHqZzRs/x3v0xasOg7dR4SMAjvMHNUJk6IJHF tD5gSvcGed7RwXT060GDe68EgCk/RimF1Po3I7wF4fa5W9c62Iwy0PFkf2i8pOX3g+Qq RypK5+Vw7qQN7APKOQlVcSvEVIUbe0ohRaUopj6mIuVExouXAl3GfBGORTifBZjpJ2bM N6O0qy14icSrIaTFMeokEHSZK5Sq+ube0HMwoIk6px82kN9Ap9w8/Ob0ZEIoes4mGC+Y 71Tr1nUKwYNCdqPQjifVJh1qsGxRpG17vG1mDEmXt6m9A6aE4ed95+DKYG0GOVgV/2ho B1Rw== MIME-Version: 1.0 X-Received: by 10.42.21.84 with SMTP id j20mr238376icb.19.1358925226398; Tue, 22 Jan 2013 23:13:46 -0800 (PST) Received: by 10.43.112.194 with HTTP; Tue, 22 Jan 2013 23:13:46 -0800 (PST) Date: Tue, 22 Jan 2013 23:13:46 -0800 Message-ID: Subject: e1000 serdes link flap From: Neel Natu To: freebsd-net@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Cc: jfv@freebsd.org X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Jan 2013 07:13:47 -0000 Hi, I am running into a problem in head with the e1000 link state detection logic attached to a 82571EB serdes controller. The symptom is that the link state keeps flapping between "up" and "down". After I enabled the debug output in 'e1000_check_for_serdes_link_82571()' this is what I see: e1000_check_for_serdes_link_82571 ctrl = 0x4c0241, status = 0x803a7, rxcw = 0x44000000 FORCED_UP -> AN_PROG em6: link state changed to DOWN e1000_check_for_serdes_link_82571 ctrl = 0x4c0201, status = 0x803a4, rxcw = 0x44000000 AN_PROG -> FORCED_UP em6: link state changed to UP e1000_check_for_serdes_link_82571 ctrl = 0x4c0241, status = 0x803a7, rxcw = 0x44000000 FORCED_UP -> AN_PROG em6: link state changed to DOWN The problem goes away if I apply the following patch to bring the link state detection logic in line with the e1000e driver in Linux: Index: e1000_82571.c =================================================================== --- e1000_82571.c (revision 245766) +++ e1000_82571.c (working copy) @@ -1712,10 +1712,8 @@ * auto-negotiation in the TXCW register and disable * forced link in the Device Control register in an * attempt to auto-negotiate with our link partner. - * If the partner code word is null, stop forcing - * and restart auto negotiation. */ - if ((rxcw & E1000_RXCW_C) || !(rxcw & E1000_RXCW_CW)) { + if ((rxcw & E1000_RXCW_C) != 0) { /* Enable autoneg, and unforce link up */ E1000_WRITE_REG(hw, E1000_TXCW, mac->txcw); E1000_WRITE_REG(hw, E1000_CTRL, I am not sure why the !(rxcw & E1000_RXCW_CW) check was added and the e1000 SDM does not have any more information. Jack, can you take a look at the patch and commit if it looks alright? best Neel