Applied: [Precise][PATCH 1/1] tg3: Fix TSO CAP for 5704 devs w / ASF enabled
Brad Figg
brad.figg at canonical.com
Thu Jun 7 20:01:54 UTC 2012
On 06/06/2012 09:22 AM, joseph.salisbury at canonical.com wrote:
> From: Matt Carlson <mcarlson at broadcom.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1005699
>
> On the earliest TSO capable devices, TSO was accomplished through
> firmware. The TSO cannot coexist with ASF management firmware though.
> The tg3 driver determines whether or not ASF is enabled by calling
> tg3_get_eeprom_hw_cfg(), which checks a particular bit of NIC memory.
> Commit dabc5c670d3f86d15ee4f42ab38ec5bd2682487d, entitled "tg3: Move
> TSO_CAPABLE assignment", accidentally moved the code that determines
> TSO capabilities earlier than the call to tg3_get_eeprom_hw_cfg(). As a
> consequence, the driver was attempting to determine TSO capabilities
> before it had all the data it needed to make the decision.
>
> This patch fixes the problem by revisiting and reevaluating the decision
> after tg3_get_eeprom_hw_cfg() is called.
>
> Signed-off-by: Matt Carlson <mcarlson at broadcom.com>
> Signed-off-by: Michael Chan <mchan at broadcom.com>
> Signed-off-by: David S. Miller <davem at davemloft.net>
> (cherry picked from commit cf9ecf4b631f649a964fa611f1a5e8874f2a76db)
>
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
> drivers/net/ethernet/broadcom/tg3.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
> index 7efa8de..0341e5f 100644
> --- a/drivers/net/ethernet/broadcom/tg3.c
> +++ b/drivers/net/ethernet/broadcom/tg3.c
> @@ -14013,9 +14013,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
> if (tg3_flag(tp, HW_TSO_1) ||
> tg3_flag(tp, HW_TSO_2) ||
> tg3_flag(tp, HW_TSO_3) ||
> - (tp->fw_needed && !tg3_flag(tp, ENABLE_ASF)))
> + tp->fw_needed) {
> + /* For firmware TSO, assume ASF is disabled.
> + * We'll disable TSO later if we discover ASF
> + * is enabled in tg3_get_eeprom_hw_cfg().
> + */
> tg3_flag_set(tp, TSO_CAPABLE);
> - else {
> + } else {
> tg3_flag_clear(tp, TSO_CAPABLE);
> tg3_flag_clear(tp, TSO_BUG);
> tp->fw_needed = NULL;
> @@ -14289,6 +14293,12 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
> */
> tg3_get_eeprom_hw_cfg(tp);
>
> + if (tp->fw_needed && tg3_flag(tp, ENABLE_ASF)) {
> + tg3_flag_clear(tp, TSO_CAPABLE);
> + tg3_flag_clear(tp, TSO_BUG);
> + tp->fw_needed = NULL;
> + }
> +
> if (tg3_flag(tp, ENABLE_APE)) {
> /* Allow reads and writes to the
> * APE register and memory space.
--
Brad Figg brad.figg at canonical.com http://www.canonical.com
More information about the kernel-team
mailing list